arith_386.s raw

   1  // Copyright 2025 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  // Code generated by 'go generate' (with ./internal/asmgen). DO NOT EDIT.
   6  
   7  //go:build !math_big_pure_go
   8  
   9  #include "textflag.h"
  10  
  11  // func addVV(z, x, y []Word) (c Word)
  12  TEXT ·addVV(SB), NOSPLIT, $0
  13  	MOVL z_len+4(FP), BX
  14  	MOVL x_base+12(FP), SI
  15  	MOVL y_base+24(FP), DI
  16  	MOVL z_base+0(FP), BP
  17  	// compute unrolled loop lengths
  18  	MOVL BX, CX
  19  	ANDL $3, CX
  20  	SHRL $2, BX
  21  	MOVL $0, DX	// clear saved carry
  22  loop1:
  23  	TESTL CX, CX; JZ loop1done
  24  loop1cont:
  25  	// unroll 1X in batches of 1
  26  	ADDL DX, DX	// restore carry
  27  	MOVL 0(SI), DX
  28  	ADCL 0(DI), DX
  29  	MOVL DX, 0(BP)
  30  	SBBL DX, DX	// save carry
  31  	LEAL 4(SI), SI	// ADD $4, SI
  32  	LEAL 4(DI), DI	// ADD $4, DI
  33  	LEAL 4(BP), BP	// ADD $4, BP
  34  	SUBL $1, CX; JNZ loop1cont
  35  loop1done:
  36  loop4:
  37  	TESTL BX, BX; JZ loop4done
  38  loop4cont:
  39  	// unroll 4X in batches of 1
  40  	ADDL DX, DX	// restore carry
  41  	MOVL 0(SI), CX
  42  	ADCL 0(DI), CX
  43  	MOVL CX, 0(BP)
  44  	MOVL 4(SI), CX
  45  	ADCL 4(DI), CX
  46  	MOVL CX, 4(BP)
  47  	MOVL 8(SI), CX
  48  	ADCL 8(DI), CX
  49  	MOVL CX, 8(BP)
  50  	MOVL 12(SI), CX
  51  	ADCL 12(DI), CX
  52  	MOVL CX, 12(BP)
  53  	SBBL DX, DX	// save carry
  54  	LEAL 16(SI), SI	// ADD $16, SI
  55  	LEAL 16(DI), DI	// ADD $16, DI
  56  	LEAL 16(BP), BP	// ADD $16, BP
  57  	SUBL $1, BX; JNZ loop4cont
  58  loop4done:
  59  	NEGL DX	// convert add carry
  60  	MOVL DX, c+36(FP)
  61  	RET
  62  
  63  // func subVV(z, x, y []Word) (c Word)
  64  TEXT ·subVV(SB), NOSPLIT, $0
  65  	MOVL z_len+4(FP), BX
  66  	MOVL x_base+12(FP), SI
  67  	MOVL y_base+24(FP), DI
  68  	MOVL z_base+0(FP), BP
  69  	// compute unrolled loop lengths
  70  	MOVL BX, CX
  71  	ANDL $3, CX
  72  	SHRL $2, BX
  73  	MOVL $0, DX	// clear saved carry
  74  loop1:
  75  	TESTL CX, CX; JZ loop1done
  76  loop1cont:
  77  	// unroll 1X in batches of 1
  78  	ADDL DX, DX	// restore carry
  79  	MOVL 0(SI), DX
  80  	SBBL 0(DI), DX
  81  	MOVL DX, 0(BP)
  82  	SBBL DX, DX	// save carry
  83  	LEAL 4(SI), SI	// ADD $4, SI
  84  	LEAL 4(DI), DI	// ADD $4, DI
  85  	LEAL 4(BP), BP	// ADD $4, BP
  86  	SUBL $1, CX; JNZ loop1cont
  87  loop1done:
  88  loop4:
  89  	TESTL BX, BX; JZ loop4done
  90  loop4cont:
  91  	// unroll 4X in batches of 1
  92  	ADDL DX, DX	// restore carry
  93  	MOVL 0(SI), CX
  94  	SBBL 0(DI), CX
  95  	MOVL CX, 0(BP)
  96  	MOVL 4(SI), CX
  97  	SBBL 4(DI), CX
  98  	MOVL CX, 4(BP)
  99  	MOVL 8(SI), CX
 100  	SBBL 8(DI), CX
 101  	MOVL CX, 8(BP)
 102  	MOVL 12(SI), CX
 103  	SBBL 12(DI), CX
 104  	MOVL CX, 12(BP)
 105  	SBBL DX, DX	// save carry
 106  	LEAL 16(SI), SI	// ADD $16, SI
 107  	LEAL 16(DI), DI	// ADD $16, DI
 108  	LEAL 16(BP), BP	// ADD $16, BP
 109  	SUBL $1, BX; JNZ loop4cont
 110  loop4done:
 111  	NEGL DX	// convert sub carry
 112  	MOVL DX, c+36(FP)
 113  	RET
 114  
 115  // func lshVU(z, x []Word, s uint) (c Word)
 116  TEXT ·lshVU(SB), NOSPLIT, $0
 117  	MOVL z_len+4(FP), BX
 118  	TESTL BX, BX; JZ ret0
 119  	MOVL s+24(FP), CX
 120  	MOVL x_base+12(FP), SI
 121  	MOVL z_base+0(FP), DI
 122  	// run loop backward, using counter as positive index
 123  	// shift first word into carry
 124  	MOVL -4(SI)(BX*4), BP
 125  	MOVL $0, DX
 126  	SHLL CX, BP, DX
 127  	MOVL DX, c+28(FP)
 128  	// shift remaining words
 129  	SUBL $1, BX
 130  loop1:
 131  	TESTL BX, BX; JZ loop1done
 132  loop1cont:
 133  	// unroll 1X in batches of 1
 134  	MOVL -4(SI)(BX*4), DX
 135  	SHLL CX, DX, BP
 136  	MOVL BP, 0(DI)(BX*4)
 137  	MOVL DX, BP
 138  	SUBL $1, BX; JNZ loop1cont
 139  loop1done:
 140  	// store final shifted bits
 141  	SHLL CX, BP
 142  	MOVL BP, 0(DI)(BX*4)
 143  	RET
 144  ret0:
 145  	MOVL $0, c+28(FP)
 146  	RET
 147  
 148  // func rshVU(z, x []Word, s uint) (c Word)
 149  TEXT ·rshVU(SB), NOSPLIT, $0
 150  	MOVL z_len+4(FP), BX
 151  	TESTL BX, BX; JZ ret0
 152  	MOVL s+24(FP), CX
 153  	MOVL x_base+12(FP), SI
 154  	MOVL z_base+0(FP), DI
 155  	// use counter as negative index
 156  	LEAL (SI)(BX*4), SI
 157  	LEAL (DI)(BX*4), DI
 158  	NEGL BX
 159  	// shift first word into carry
 160  	MOVL 0(SI)(BX*4), BP
 161  	MOVL $0, DX
 162  	SHRL CX, BP, DX
 163  	MOVL DX, c+28(FP)
 164  	// shift remaining words
 165  	ADDL $1, BX
 166  loop1:
 167  	TESTL BX, BX; JZ loop1done
 168  loop1cont:
 169  	// unroll 1X in batches of 1
 170  	MOVL 0(SI)(BX*4), DX
 171  	SHRL CX, DX, BP
 172  	MOVL BP, -4(DI)(BX*4)
 173  	MOVL DX, BP
 174  	ADDL $1, BX; JNZ loop1cont
 175  loop1done:
 176  	// store final shifted bits
 177  	SHRL CX, BP
 178  	MOVL BP, -4(DI)(BX*4)
 179  	RET
 180  ret0:
 181  	MOVL $0, c+28(FP)
 182  	RET
 183  
 184  // func mulAddVWW(z, x []Word, m, a Word) (c Word)
 185  TEXT ·mulAddVWW(SB), NOSPLIT, $0
 186  	MOVL m+24(FP), BX
 187  	MOVL a+28(FP), SI
 188  	MOVL z_len+4(FP), DI
 189  	MOVL x_base+12(FP), BP
 190  	MOVL z_base+0(FP), CX
 191  	// use counter as negative index
 192  	LEAL (BP)(DI*4), BP
 193  	LEAL (CX)(DI*4), CX
 194  	NEGL DI
 195  loop1:
 196  	TESTL DI, DI; JZ loop1done
 197  loop1cont:
 198  	// unroll 1X in batches of 1
 199  	MOVL 0(BP)(DI*4), AX
 200  	// multiply
 201  	MULL BX
 202  	ADDL SI, AX
 203  	MOVL DX, SI
 204  	ADCL $0, SI
 205  	MOVL AX, 0(CX)(DI*4)
 206  	ADDL $1, DI; JNZ loop1cont
 207  loop1done:
 208  	MOVL SI, c+32(FP)
 209  	RET
 210  
 211  // func addMulVVWW(z, x, y []Word, m, a Word) (c Word)
 212  TEXT ·addMulVVWW(SB), NOSPLIT, $0
 213  	MOVL a+40(FP), BX
 214  	MOVL z_len+4(FP), SI
 215  	MOVL x_base+12(FP), DI
 216  	MOVL y_base+24(FP), BP
 217  	MOVL z_base+0(FP), CX
 218  	// use counter as negative index
 219  	LEAL (DI)(SI*4), DI
 220  	LEAL (BP)(SI*4), BP
 221  	LEAL (CX)(SI*4), CX
 222  	NEGL SI
 223  loop1:
 224  	TESTL SI, SI; JZ loop1done
 225  loop1cont:
 226  	// unroll 1X in batches of 1
 227  	MOVL 0(BP)(SI*4), AX
 228  	// multiply
 229  	MULL m+36(FP)
 230  	ADDL BX, AX
 231  	MOVL DX, BX
 232  	ADCL $0, BX
 233  	// add
 234  	ADDL 0(DI)(SI*4), AX
 235  	ADCL $0, BX
 236  	MOVL AX, 0(CX)(SI*4)
 237  	ADDL $1, SI; JNZ loop1cont
 238  loop1done:
 239  	MOVL BX, c+44(FP)
 240  	RET
 241