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)
12TEXT ·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
22loop1:
23 TESTL CX, CX; JZ loop1done
24loop1cont:
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
35loop1done:
36loop4:
37 TESTL BX, BX; JZ loop4done
38loop4cont:
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
58loop4done:
59 NEGL DX // convert add carry
60 MOVL DX, c+36(FP)
61 RET
62
63// func subVV(z, x, y []Word) (c Word)
64TEXT ·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
74loop1:
75 TESTL CX, CX; JZ loop1done
76loop1cont:
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
87loop1done:
88loop4:
89 TESTL BX, BX; JZ loop4done
90loop4cont:
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
110loop4done:
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)
116TEXT ·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
130loop1:
131 TESTL BX, BX; JZ loop1done
132loop1cont:
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
139loop1done:
140 // store final shifted bits
141 SHLL CX, BP
142 MOVL BP, 0(DI)(BX*4)
143 RET
144ret0:
145 MOVL $0, c+28(FP)
146 RET
147
148// func rshVU(z, x []Word, s uint) (c Word)
149TEXT ·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
166loop1:
167 TESTL BX, BX; JZ loop1done
168loop1cont:
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
175loop1done:
176 // store final shifted bits
177 SHRL CX, BP
178 MOVL BP, -4(DI)(BX*4)
179 RET
180ret0:
181 MOVL $0, c+28(FP)
182 RET
183
184// func mulAddVWW(z, x []Word, m, a Word) (c Word)
185TEXT ·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
195loop1:
196 TESTL DI, DI; JZ loop1done
197loop1cont:
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
207loop1done:
208 MOVL SI, c+32(FP)
209 RET
210
211// func addMulVVWW(z, x, y []Word, m, a Word) (c Word)
212TEXT ·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
223loop1:
224 TESTL SI, SI; JZ loop1done
225loop1cont:
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
238loop1done:
239 MOVL BX, c+44(FP)
240 RET
View as plain text