Text file
src/math/big/arith_386.s
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
View as plain text