summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bn
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/bn')
-rw-r--r--src/lib/libcrypto/bn/asm/README21
-rw-r--r--src/lib/libcrypto/bn/asm/alpha.s3161
-rw-r--r--src/lib/libcrypto/bn/asm/mips3.s573
-rw-r--r--src/lib/libcrypto/bn/asm/vms.mar697
-rw-r--r--src/lib/libcrypto/bn/bnspeed.c69
-rw-r--r--src/lib/libcrypto/bn/bntest.c1008
-rw-r--r--src/lib/libcrypto/bn/exp.c2
-rw-r--r--src/lib/libcrypto/bn/expspeed.c229
-rw-r--r--src/lib/libcrypto/bn/exptest.c77
-rw-r--r--src/lib/libcrypto/bn/vms-helper.c4
10 files changed, 4545 insertions, 1296 deletions
diff --git a/src/lib/libcrypto/bn/asm/README b/src/lib/libcrypto/bn/asm/README
index d93fbff77f..b0f3a68a06 100644
--- a/src/lib/libcrypto/bn/asm/README
+++ b/src/lib/libcrypto/bn/asm/README
@@ -1,5 +1,7 @@
1<OBSOLETE>
2
1All assember in this directory are just version of the file 3All assember in this directory are just version of the file
2crypto/bn/bn_mulw.c. 4crypto/bn/bn_asm.c.
3 5
4Quite a few of these files are just the assember output from gcc since on 6Quite a few of these files are just the assember output from gcc since on
5quite a few machines they are 2 times faster than the system compiler. 7quite a few machines they are 2 times faster than the system compiler.
@@ -15,16 +17,11 @@ On the 2 alpha C compilers I had access to, it was not possible to do
15were 64 bits). So the hand assember gives access to the 128 bit result and 17were 64 bits). So the hand assember gives access to the 128 bit result and
16a 2 times speedup :-). 18a 2 times speedup :-).
17 19
18The x86xxxx.obj files are the assembled version of x86xxxx.asm files. 20There are 3 versions of assember for the HP PA-RISC.
19I had such a hard time finding a macro assember for Microsoft, I decided to 21
20include the object file to save others the hassle :-). 22pa-risc.s is the origional one which works fine and generated using gcc :-)
21 23
22I have also included uu encoded versions of the .obj incase they get 24pa-risc2W.s and pa-risc2.s are 64 and 32-bit PA-RISC 2.0 implementations
23trashed. 25by Chris Ruemmler from HP (with some help from the HP C compiler).
24 26
25There are 2 versions of assember for the HP PA-RISC. 27</OBSOLETE>
26pa-risc.s is the origional one which works fine.
27pa-risc2.s is a new version that often generates warnings but if the
28tests pass, it gives performance that is over 2 times faster than
29pa-risc.s.
30Both were generated using gcc :-)
diff --git a/src/lib/libcrypto/bn/asm/alpha.s b/src/lib/libcrypto/bn/asm/alpha.s
index 1d17b1d619..555ff0b92d 100644
--- a/src/lib/libcrypto/bn/asm/alpha.s
+++ b/src/lib/libcrypto/bn/asm/alpha.s
@@ -1,8 +1,14 @@
1 # DEC Alpha assember 1 # DEC Alpha assember
2 # The bn_div64 is actually gcc output but the other parts are hand done. 2 # The bn_div_words is actually gcc output but the other parts are hand done.
3 # Thanks to tzeruch@ceddec.com for sending me the gcc output for 3 # Thanks to tzeruch@ceddec.com for sending me the gcc output for
4 # bn_div64. 4 # bn_div_words.
5 .file 1 "bn_mulw.c" 5 # I've gone back and re-done most of routines.
6 # The key thing to remeber for the 164 CPU is that while a
7 # multiply operation takes 8 cycles, another one can only be issued
8 # after 4 cycles have elapsed. I've done modification to help
9 # improve this. Also, normally, a ld instruction will not be available
10 # for about 3 cycles.
11 .file 1 "bn_asm.c"
6 .set noat 12 .set noat
7gcc2_compiled.: 13gcc2_compiled.:
8__gnu_compiled_c: 14__gnu_compiled_c:
@@ -14,65 +20,91 @@ bn_mul_add_words:
14bn_mul_add_words..ng: 20bn_mul_add_words..ng:
15 .frame $30,0,$26,0 21 .frame $30,0,$26,0
16 .prologue 0 22 .prologue 0
17 subq $18,2,$25 # num=-2
18 bis $31,$31,$0
19 blt $25,$42
20 .align 5 23 .align 5
21$142: 24 subq $18,4,$18
22 subq $18,2,$18 # num-=2 25 bis $31,$31,$0
23 subq $25,2,$25 # num-=2 26 blt $18,$43 # if we are -1, -2, -3 or -4 goto tail code
24 27 ldq $20,0($17) # 1 1
25 ldq $1,0($17) # a[0] 28 ldq $1,0($16) # 1 1
26 ldq $2,8($17) # a[1] 29 .align 3
27 30$42:
28 mulq $19,$1,$3 # a[0]*w low part r3 31 mulq $20,$19,$5 # 1 2 1 ######
29 umulh $19,$1,$1 # a[0]*w high part r1 32 ldq $21,8($17) # 2 1
30 mulq $19,$2,$4 # a[1]*w low part r4 33 ldq $2,8($16) # 2 1
31 umulh $19,$2,$2 # a[1]*w high part r2 34 umulh $20,$19,$20 # 1 2 ######
32 35 ldq $27,16($17) # 3 1
33 ldq $22,0($16) # r[0] r22 36 ldq $3,16($16) # 3 1
34 ldq $23,8($16) # r[1] r23 37 mulq $21,$19,$6 # 2 2 1 ######
35 38 ldq $28,24($17) # 4 1
36 addq $3,$22,$3 # a0 low part + r[0] 39 addq $1,$5,$1 # 1 2 2
37 addq $4,$23,$4 # a1 low part + r[1] 40 ldq $4,24($16) # 4 1
38 cmpult $3,$22,$5 # overflow? 41 umulh $21,$19,$21 # 2 2 ######
39 cmpult $4,$23,$6 # overflow? 42 cmpult $1,$5,$22 # 1 2 3 1
40 addq $5,$1,$1 # high part + overflow 43 addq $20,$22,$20 # 1 3 1
41 addq $6,$2,$2 # high part + overflow 44 addq $1,$0,$1 # 1 2 3 1
42 45 mulq $27,$19,$7 # 3 2 1 ######
43 addq $3,$0,$3 # add c 46 cmpult $1,$0,$0 # 1 2 3 2
44 cmpult $3,$0,$5 # overflow? 47 addq $2,$6,$2 # 2 2 2
45 stq $3,0($16) 48 addq $20,$0,$0 # 1 3 2
46 addq $5,$1,$0 # c=high part + overflow 49 cmpult $2,$6,$23 # 2 2 3 1
47 50 addq $21,$23,$21 # 2 3 1
48 addq $4,$0,$4 # add c 51 umulh $27,$19,$27 # 3 2 ######
49 cmpult $4,$0,$5 # overflow? 52 addq $2,$0,$2 # 2 2 3 1
50 stq $4,8($16) 53 cmpult $2,$0,$0 # 2 2 3 2
51 addq $5,$2,$0 # c=high part + overflow 54 subq $18,4,$18
55 mulq $28,$19,$8 # 4 2 1 ######
56 addq $21,$0,$0 # 2 3 2
57 addq $3,$7,$3 # 3 2 2
58 addq $16,32,$16
59 cmpult $3,$7,$24 # 3 2 3 1
60 stq $1,-32($16) # 1 2 4
61 umulh $28,$19,$28 # 4 2 ######
62 addq $27,$24,$27 # 3 3 1
63 addq $3,$0,$3 # 3 2 3 1
64 stq $2,-24($16) # 2 2 4
65 cmpult $3,$0,$0 # 3 2 3 2
66 stq $3,-16($16) # 3 2 4
67 addq $4,$8,$4 # 4 2 2
68 addq $27,$0,$0 # 3 3 2
69 cmpult $4,$8,$25 # 4 2 3 1
70 addq $17,32,$17
71 addq $28,$25,$28 # 4 3 1
72 addq $4,$0,$4 # 4 2 3 1
73 cmpult $4,$0,$0 # 4 2 3 2
74 stq $4,-8($16) # 4 2 4
75 addq $28,$0,$0 # 4 3 2
76 blt $18,$43
52 77
53 ble $18,$43 78 ldq $20,0($17) # 1 1
79 ldq $1,0($16) # 1 1
54 80
55 addq $16,16,$16 81 br $42
56 addq $17,16,$17
57 blt $25,$42
58 82
59 br $31,$142 83 .align 4
60$42: 84$45:
61 ldq $1,0($17) # a[0] 85 ldq $20,0($17) # 4 1
62 umulh $19,$1,$3 # a[0]*w high part 86 ldq $1,0($16) # 4 1
63 mulq $19,$1,$1 # a[0]*w low part 87 mulq $20,$19,$5 # 4 2 1
64 ldq $2,0($16) # r[0] 88 subq $18,1,$18
65 addq $1,$2,$1 # low part + r[0] 89 addq $16,8,$16
66 cmpult $1,$2,$4 # overflow? 90 addq $17,8,$17
67 addq $4,$3,$3 # high part + overflow 91 umulh $20,$19,$20 # 4 2
68 addq $1,$0,$1 # add c 92 addq $1,$5,$1 # 4 2 2
69 cmpult $1,$0,$4 # overflow? 93 cmpult $1,$5,$22 # 4 2 3 1
70 addq $4,$3,$0 # c=high part + overflow 94 addq $20,$22,$20 # 4 3 1
71 stq $1,0($16) 95 addq $1,$0,$1 # 4 2 3 1
96 cmpult $1,$0,$0 # 4 2 3 2
97 addq $20,$0,$0 # 4 3 2
98 stq $1,-8($16) # 4 2 4
99 bgt $18,$45
100 ret $31,($26),1 # else exit
72 101
73 .align 4 102 .align 4
74$43: 103$43:
75 ret $31,($26),1 104 addq $18,4,$18
105 bgt $18,$45 # goto tail code
106 ret $31,($26),1 # else exit
107
76 .end bn_mul_add_words 108 .end bn_mul_add_words
77 .align 3 109 .align 3
78 .globl bn_mul_words 110 .globl bn_mul_words
@@ -81,49 +113,75 @@ bn_mul_words:
81bn_mul_words..ng: 113bn_mul_words..ng:
82 .frame $30,0,$26,0 114 .frame $30,0,$26,0
83 .prologue 0 115 .prologue 0
84 subq $18,2,$25 # num=-2
85 bis $31,$31,$0
86 blt $25,$242
87 .align 5 116 .align 5
88$342: 117 subq $18,4,$18
89 subq $18,2,$18 # num-=2 118 bis $31,$31,$0
90 subq $25,2,$25 # num-=2 119 blt $18,$143 # if we are -1, -2, -3 or -4 goto tail code
91 120 ldq $20,0($17) # 1 1
92 ldq $1,0($17) # a[0] 121 .align 3
93 ldq $2,8($17) # a[1] 122$142:
94 123
95 mulq $19,$1,$3 # a[0]*w low part r3 124 mulq $20,$19,$5 # 1 2 1 #####
96 umulh $19,$1,$1 # a[0]*w high part r1 125 ldq $21,8($17) # 2 1
97 mulq $19,$2,$4 # a[1]*w low part r4 126 ldq $27,16($17) # 3 1
98 umulh $19,$2,$2 # a[1]*w high part r2 127 umulh $20,$19,$20 # 1 2 #####
99 128 ldq $28,24($17) # 4 1
100 addq $3,$0,$3 # add c 129 mulq $21,$19,$6 # 2 2 1 #####
101 cmpult $3,$0,$5 # overflow? 130 addq $5,$0,$5 # 1 2 3 1
102 stq $3,0($16) 131 subq $18,4,$18
103 addq $5,$1,$0 # c=high part + overflow 132 cmpult $5,$0,$0 # 1 2 3 2
104 133 umulh $21,$19,$21 # 2 2 #####
105 addq $4,$0,$4 # add c 134 addq $20,$0,$0 # 1 3 2
106 cmpult $4,$0,$5 # overflow? 135 addq $17,32,$17
107 stq $4,8($16) 136 addq $6,$0,$6 # 2 2 3 1
108 addq $5,$2,$0 # c=high part + overflow 137 mulq $27,$19,$7 # 3 2 1 #####
109 138 cmpult $6,$0,$0 # 2 2 3 2
110 ble $18,$243 139 addq $21,$0,$0 # 2 3 2
111 140 addq $16,32,$16
112 addq $16,16,$16 141 umulh $27,$19,$27 # 3 2 #####
113 addq $17,16,$17 142 stq $5,-32($16) # 1 2 4
114 blt $25,$242 143 mulq $28,$19,$8 # 4 2 1 #####
115 144 addq $7,$0,$7 # 3 2 3 1
116 br $31,$342 145 stq $6,-24($16) # 2 2 4
117$242: 146 cmpult $7,$0,$0 # 3 2 3 2
118 ldq $1,0($17) # a[0] 147 umulh $28,$19,$28 # 4 2 #####
119 umulh $19,$1,$3 # a[0]*w high part 148 addq $27,$0,$0 # 3 3 2
120 mulq $19,$1,$1 # a[0]*w low part 149 stq $7,-16($16) # 3 2 4
121 addq $1,$0,$1 # add c 150 addq $8,$0,$8 # 4 2 3 1
122 cmpult $1,$0,$4 # overflow? 151 cmpult $8,$0,$0 # 4 2 3 2
123 addq $4,$3,$0 # c=high part + overflow 152
124 stq $1,0($16) 153 addq $28,$0,$0 # 4 3 2
125$243: 154
126 ret $31,($26),1 155 stq $8,-8($16) # 4 2 4
156
157 blt $18,$143
158
159 ldq $20,0($17) # 1 1
160
161 br $142
162
163 .align 4
164$145:
165 ldq $20,0($17) # 4 1
166 mulq $20,$19,$5 # 4 2 1
167 subq $18,1,$18
168 umulh $20,$19,$20 # 4 2
169 addq $5,$0,$5 # 4 2 3 1
170 addq $16,8,$16
171 cmpult $5,$0,$0 # 4 2 3 2
172 addq $17,8,$17
173 addq $20,$0,$0 # 4 3 2
174 stq $5,-8($16) # 4 2 4
175
176 bgt $18,$145
177 ret $31,($26),1 # else exit
178
179 .align 4
180$143:
181 addq $18,4,$18
182 bgt $18,$145 # goto tail code
183 ret $31,($26),1 # else exit
184
127 .end bn_mul_words 185 .end bn_mul_words
128 .align 3 186 .align 3
129 .globl bn_sqr_words 187 .globl bn_sqr_words
@@ -132,44 +190,58 @@ bn_sqr_words:
132bn_sqr_words..ng: 190bn_sqr_words..ng:
133 .frame $30,0,$26,0 191 .frame $30,0,$26,0
134 .prologue 0 192 .prologue 0
135
136 subq $18,2,$25 # num=-2
137 blt $25,$442
138 .align 5
139$542:
140 subq $18,2,$18 # num-=2
141 subq $25,2,$25 # num-=2
142 193
143 ldq $1,0($17) # a[0] 194 subq $18,4,$18
144 ldq $4,8($17) # a[1] 195 blt $18,$543 # if we are -1, -2, -3 or -4 goto tail code
145 196 ldq $20,0($17) # 1 1
146 mulq $1,$1,$2 # a[0]*w low part r2 197 .align 3
147 umulh $1,$1,$3 # a[0]*w high part r3 198$542:
148 mulq $4,$4,$5 # a[1]*w low part r5 199 mulq $20,$20,$5 ######
149 umulh $4,$4,$6 # a[1]*w high part r6 200 ldq $21,8($17) # 1 1
150 201 subq $18,4
151 stq $2,0($16) # r[0] 202 umulh $20,$20,$1 ######
152 stq $3,8($16) # r[1] 203 ldq $27,16($17) # 1 1
153 stq $5,16($16) # r[3] 204 mulq $21,$21,$6 ######
154 stq $6,24($16) # r[4] 205 ldq $28,24($17) # 1 1
206 stq $5,0($16) # r[0]
207 umulh $21,$21,$2 ######
208 stq $1,8($16) # r[1]
209 mulq $27,$27,$7 ######
210 stq $6,16($16) # r[0]
211 umulh $27,$27,$3 ######
212 stq $2,24($16) # r[1]
213 mulq $28,$28,$8 ######
214 stq $7,32($16) # r[0]
215 umulh $28,$28,$4 ######
216 stq $3,40($16) # r[1]
155 217
156 ble $18,$443 218 addq $16,64,$16
219 addq $17,32,$17
220 stq $8,-16($16) # r[0]
221 stq $4,-8($16) # r[1]
157 222
158 addq $16,32,$16 223 blt $18,$543
159 addq $17,16,$17 224 ldq $20,0($17) # 1 1
160 blt $25,$442 225 br $542
161 br $31,$542
162 226
163$442: 227$442:
164 ldq $1,0($17) # a[0] 228 ldq $20,0($17) # a[0]
165 mulq $1,$1,$2 # a[0]*w low part r2 229 mulq $20,$20,$5 # a[0]*w low part r2
166 umulh $1,$1,$3 # a[0]*w high part r3 230 addq $16,16,$16
167 stq $2,0($16) # r[0] 231 addq $17,8,$17
168 stq $3,8($16) # r[1] 232 subq $18,1,$18
233 umulh $20,$20,$1 # a[0]*w high part r3
234 stq $5,-16($16) # r[0]
235 stq $1,-8($16) # r[1]
236
237 bgt $18,$442
238 ret $31,($26),1 # else exit
169 239
170 .align 4 240 .align 4
171$443: 241$543:
172 ret $31,($26),1 242 addq $18,4,$18
243 bgt $18,$442 # goto tail code
244 ret $31,($26),1 # else exit
173 .end bn_sqr_words 245 .end bn_sqr_words
174 246
175 .align 3 247 .align 3
@@ -180,31 +252,74 @@ bn_add_words..ng:
180 .frame $30,0,$26,0 252 .frame $30,0,$26,0
181 .prologue 0 253 .prologue 0
182 254
183 bis $31,$31,$8 # carry = 0 255 subq $19,4,$19
184 ble $19,$900 256 bis $31,$31,$0 # carry = 0
257 blt $19,$900
258 ldq $5,0($17) # a[0]
259 ldq $1,0($18) # b[1]
260 .align 3
185$901: 261$901:
186 ldq $0,0($17) # a[0] 262 addq $1,$5,$1 # r=a+b;
187 ldq $1,0($18) # a[1] 263 ldq $6,8($17) # a[1]
264 cmpult $1,$5,$22 # did we overflow?
265 ldq $2,8($18) # b[1]
266 addq $1,$0,$1 # c+= overflow
267 ldq $7,16($17) # a[2]
268 cmpult $1,$0,$0 # overflow?
269 ldq $3,16($18) # b[2]
270 addq $0,$22,$0
271 ldq $8,24($17) # a[3]
272 addq $2,$6,$2 # r=a+b;
273 ldq $4,24($18) # b[3]
274 cmpult $2,$6,$23 # did we overflow?
275 addq $3,$7,$3 # r=a+b;
276 addq $2,$0,$2 # c+= overflow
277 cmpult $3,$7,$24 # did we overflow?
278 cmpult $2,$0,$0 # overflow?
279 addq $4,$8,$4 # r=a+b;
280 addq $0,$23,$0
281 cmpult $4,$8,$25 # did we overflow?
282 addq $3,$0,$3 # c+= overflow
283 stq $1,0($16) # r[0]=c
284 cmpult $3,$0,$0 # overflow?
285 stq $2,8($16) # r[1]=c
286 addq $0,$24,$0
287 stq $3,16($16) # r[2]=c
288 addq $4,$0,$4 # c+= overflow
289 subq $19,4,$19 # loop--
290 cmpult $4,$0,$0 # overflow?
291 addq $17,32,$17 # a++
292 addq $0,$25,$0
293 stq $4,24($16) # r[3]=c
294 addq $18,32,$18 # b++
295 addq $16,32,$16 # r++
188 296
189 addq $0,$1,$3 # c=a+b; 297 blt $19,$900
298 ldq $5,0($17) # a[0]
299 ldq $1,0($18) # b[1]
300 br $901
301 .align 4
302$945:
303 ldq $5,0($17) # a[0]
304 ldq $1,0($18) # b[1]
305 addq $1,$5,$1 # r=a+b;
306 subq $19,1,$19 # loop--
307 addq $1,$0,$1 # c+= overflow
190 addq $17,8,$17 # a++ 308 addq $17,8,$17 # a++
309 cmpult $1,$5,$22 # did we overflow?
310 cmpult $1,$0,$0 # overflow?
311 addq $18,8,$18 # b++
312 stq $1,0($16) # r[0]=c
313 addq $0,$22,$0
314 addq $16,8,$16 # r++
191 315
192 cmpult $3,$1,$7 # did we overflow? 316 bgt $19,$945
193 addq $18,8,$18 # b++ 317 ret $31,($26),1 # else exit
194
195 addq $8,$3,$3 # c+=carry
196
197 cmpult $3,$8,$8 # did we overflow?
198 stq $3,($16) # r[0]=c
199
200 addq $7,$8,$8 # add into overflow
201 subq $19,1,$19 # loop--
202 318
203 addq $16,8,$16 # r++
204 bgt $19,$901
205$900: 319$900:
206 bis $8,$8,$0 # return carry 320 addq $19,4,$19
207 ret $31,($26),1 321 bgt $19,$945 # goto tail code
322 ret $31,($26),1 # else exit
208 .end bn_add_words 323 .end bn_add_words
209 324
210 # 325 #
@@ -213,11 +328,11 @@ $900:
213 # 328 #
214.text 329.text
215 .align 3 330 .align 3
216 .globl bn_div64 331 .globl bn_div_words
217 .ent bn_div64 332 .ent bn_div_words
218bn_div64: 333bn_div_words:
219 ldgp $29,0($27) 334 ldgp $29,0($27)
220bn_div64..ng: 335bn_div_words..ng:
221 lda $30,-48($30) 336 lda $30,-48($30)
222 .frame $30,48,$26,0 337 .frame $30,48,$26,0
223 stq $26,0($30) 338 stq $26,0($30)
@@ -338,7 +453,2747 @@ $136:
338 ldq $13,40($30) 453 ldq $13,40($30)
339 addq $30,48,$30 454 addq $30,48,$30
340 ret $31,($26),1 455 ret $31,($26),1
341 .end bn_div64 456 .end bn_div_words
342 .ident "GCC: (GNU) 2.7.2.1" 457
458 .set noat
459 .text
460 .align 3
461 .globl bn_sub_words
462 .ent bn_sub_words
463bn_sub_words:
464bn_sub_words..ng:
465 .frame $30,0,$26,0
466 .prologue 0
467
468 subq $19, 4, $19
469 bis $31, $31, $0
470 blt $19, $100
471 ldq $1, 0($17)
472 ldq $2, 0($18)
473$101:
474 ldq $3, 8($17)
475 cmpult $1, $2, $4
476 ldq $5, 8($18)
477 subq $1, $2, $1
478 ldq $6, 16($17)
479 cmpult $1, $0, $2
480 ldq $7, 16($18)
481 subq $1, $0, $23
482 ldq $8, 24($17)
483 addq $2, $4, $0
484 cmpult $3, $5, $24
485 subq $3, $5, $3
486 ldq $22, 24($18)
487 cmpult $3, $0, $5
488 subq $3, $0, $25
489 addq $5, $24, $0
490 cmpult $6, $7, $27
491 subq $6, $7, $6
492 stq $23, 0($16)
493 cmpult $6, $0, $7
494 subq $6, $0, $28
495 addq $7, $27, $0
496 cmpult $8, $22, $21
497 subq $8, $22, $8
498 stq $25, 8($16)
499 cmpult $8, $0, $22
500 subq $8, $0, $20
501 addq $22, $21, $0
502 stq $28, 16($16)
503 subq $19, 4, $19
504 stq $20, 24($16)
505 addq $17, 32, $17
506 addq $18, 32, $18
507 addq $16, 32, $16
508 blt $19, $100
509 ldq $1, 0($17)
510 ldq $2, 0($18)
511 br $101
512$102:
513 ldq $1, 0($17)
514 ldq $2, 0($18)
515 cmpult $1, $2, $27
516 subq $1, $2, $1
517 cmpult $1, $0, $2
518 subq $1, $0, $1
519 stq $1, 0($16)
520 addq $2, $27, $0
521 addq $17, 8, $17
522 addq $18, 8, $18
523 addq $16, 8, $16
524 subq $19, 1, $19
525 bgt $19, $102
526 ret $31,($26),1
527$100:
528 addq $19, 4, $19
529 bgt $19, $102
530$103:
531 ret $31,($26),1
532 .end bn_sub_words
533 .text
534 .align 3
535 .globl bn_mul_comba4
536 .ent bn_mul_comba4
537bn_mul_comba4:
538bn_mul_comba4..ng:
539 .frame $30,0,$26,0
540 .prologue 0
343 541
542 ldq $0, 0($17)
543 ldq $1, 0($18)
544 ldq $2, 8($17)
545 ldq $3, 8($18)
546 ldq $4, 16($17)
547 ldq $5, 16($18)
548 ldq $6, 24($17)
549 ldq $7, 24($18)
550 bis $31, $31, $23
551 mulq $0, $1, $8
552 umulh $0, $1, $22
553 stq $8, 0($16)
554 bis $31, $31, $8
555 mulq $0, $3, $24
556 umulh $0, $3, $25
557 addq $22, $24, $22
558 cmpult $22, $24, $27
559 addq $27, $25, $25
560 addq $23, $25, $23
561 cmpult $23, $25, $28
562 addq $8, $28, $8
563 mulq $2, $1, $21
564 umulh $2, $1, $20
565 addq $22, $21, $22
566 cmpult $22, $21, $19
567 addq $19, $20, $20
568 addq $23, $20, $23
569 cmpult $23, $20, $17
570 addq $8, $17, $8
571 stq $22, 8($16)
572 bis $31, $31, $22
573 mulq $2, $3, $18
574 umulh $2, $3, $24
575 addq $23, $18, $23
576 cmpult $23, $18, $27
577 addq $27, $24, $24
578 addq $8, $24, $8
579 cmpult $8, $24, $25
580 addq $22, $25, $22
581 mulq $0, $5, $28
582 umulh $0, $5, $21
583 addq $23, $28, $23
584 cmpult $23, $28, $19
585 addq $19, $21, $21
586 addq $8, $21, $8
587 cmpult $8, $21, $20
588 addq $22, $20, $22
589 mulq $4, $1, $17
590 umulh $4, $1, $18
591 addq $23, $17, $23
592 cmpult $23, $17, $27
593 addq $27, $18, $18
594 addq $8, $18, $8
595 cmpult $8, $18, $24
596 addq $22, $24, $22
597 stq $23, 16($16)
598 bis $31, $31, $23
599 mulq $0, $7, $25
600 umulh $0, $7, $28
601 addq $8, $25, $8
602 cmpult $8, $25, $19
603 addq $19, $28, $28
604 addq $22, $28, $22
605 cmpult $22, $28, $21
606 addq $23, $21, $23
607 mulq $2, $5, $20
608 umulh $2, $5, $17
609 addq $8, $20, $8
610 cmpult $8, $20, $27
611 addq $27, $17, $17
612 addq $22, $17, $22
613 cmpult $22, $17, $18
614 addq $23, $18, $23
615 mulq $4, $3, $24
616 umulh $4, $3, $25
617 addq $8, $24, $8
618 cmpult $8, $24, $19
619 addq $19, $25, $25
620 addq $22, $25, $22
621 cmpult $22, $25, $28
622 addq $23, $28, $23
623 mulq $6, $1, $21
624 umulh $6, $1, $0
625 addq $8, $21, $8
626 cmpult $8, $21, $20
627 addq $20, $0, $0
628 addq $22, $0, $22
629 cmpult $22, $0, $27
630 addq $23, $27, $23
631 stq $8, 24($16)
632 bis $31, $31, $8
633 mulq $2, $7, $17
634 umulh $2, $7, $18
635 addq $22, $17, $22
636 cmpult $22, $17, $24
637 addq $24, $18, $18
638 addq $23, $18, $23
639 cmpult $23, $18, $19
640 addq $8, $19, $8
641 mulq $4, $5, $25
642 umulh $4, $5, $28
643 addq $22, $25, $22
644 cmpult $22, $25, $21
645 addq $21, $28, $28
646 addq $23, $28, $23
647 cmpult $23, $28, $20
648 addq $8, $20, $8
649 mulq $6, $3, $0
650 umulh $6, $3, $27
651 addq $22, $0, $22
652 cmpult $22, $0, $1
653 addq $1, $27, $27
654 addq $23, $27, $23
655 cmpult $23, $27, $17
656 addq $8, $17, $8
657 stq $22, 32($16)
658 bis $31, $31, $22
659 mulq $4, $7, $24
660 umulh $4, $7, $18
661 addq $23, $24, $23
662 cmpult $23, $24, $19
663 addq $19, $18, $18
664 addq $8, $18, $8
665 cmpult $8, $18, $2
666 addq $22, $2, $22
667 mulq $6, $5, $25
668 umulh $6, $5, $21
669 addq $23, $25, $23
670 cmpult $23, $25, $28
671 addq $28, $21, $21
672 addq $8, $21, $8
673 cmpult $8, $21, $20
674 addq $22, $20, $22
675 stq $23, 40($16)
676 bis $31, $31, $23
677 mulq $6, $7, $0
678 umulh $6, $7, $1
679 addq $8, $0, $8
680 cmpult $8, $0, $27
681 addq $27, $1, $1
682 addq $22, $1, $22
683 cmpult $22, $1, $17
684 addq $23, $17, $23
685 stq $8, 48($16)
686 stq $22, 56($16)
687 ret $31,($26),1
688 .end bn_mul_comba4
689 .text
690 .align 3
691 .globl bn_mul_comba8
692 .ent bn_mul_comba8
693bn_mul_comba8:
694bn_mul_comba8..ng:
695 .frame $30,0,$26,0
696 .prologue 0
697 ldq $1, 0($17)
698 ldq $2, 0($18)
699 zapnot $1, 15, $7
700 srl $2, 32, $8
701 mulq $8, $7, $22
702 srl $1, 32, $6
703 zapnot $2, 15, $5
704 mulq $5, $6, $4
705 mulq $7, $5, $24
706 addq $22, $4, $22
707 cmpult $22, $4, $1
708 mulq $6, $8, $3
709 beq $1, $173
710 bis $31, 1, $1
711 sll $1, 32, $1
712 addq $3, $1, $3
713$173:
714 sll $22, 32, $4
715 addq $24, $4, $24
716 stq $24, 0($16)
717 ldq $2, 0($17)
718 ldq $1, 8($18)
719 zapnot $2, 15, $7
720 srl $1, 32, $8
721 mulq $8, $7, $25
722 zapnot $1, 15, $5
723 mulq $7, $5, $0
724 srl $2, 32, $6
725 mulq $5, $6, $23
726 mulq $6, $8, $6
727 srl $22, 32, $1
728 cmpult $24, $4, $2
729 addq $3, $1, $3
730 addq $2, $3, $22
731 addq $25, $23, $25
732 cmpult $25, $23, $1
733 bis $31, 1, $2
734 beq $1, $177
735 sll $2, 32, $1
736 addq $6, $1, $6
737$177:
738 sll $25, 32, $23
739 ldq $1, 0($18)
740 addq $0, $23, $0
741 bis $0, $0, $7
742 ldq $3, 8($17)
743 addq $22, $7, $22
744 srl $1, 32, $8
745 cmpult $22, $7, $4
746 zapnot $3, 15, $7
747 mulq $8, $7, $28
748 zapnot $1, 15, $5
749 mulq $7, $5, $21
750 srl $25, 32, $1
751 cmpult $0, $23, $2
752 addq $6, $1, $6
753 addq $2, $6, $6
754 addq $4, $6, $24
755 srl $3, 32, $6
756 mulq $5, $6, $2
757 mulq $6, $8, $6
758 addq $28, $2, $28
759 cmpult $28, $2, $1
760 bis $31, 1, $2
761 beq $1, $181
762 sll $2, 32, $1
763 addq $6, $1, $6
764$181:
765 sll $28, 32, $2
766 addq $21, $2, $21
767 bis $21, $21, $7
768 addq $22, $7, $22
769 stq $22, 8($16)
770 ldq $3, 16($17)
771 ldq $1, 0($18)
772 cmpult $22, $7, $4
773 zapnot $3, 15, $7
774 srl $1, 32, $8
775 mulq $8, $7, $22
776 zapnot $1, 15, $5
777 mulq $7, $5, $20
778 srl $28, 32, $1
779 cmpult $21, $2, $2
780 addq $6, $1, $6
781 addq $2, $6, $6
782 addq $4, $6, $6
783 addq $24, $6, $24
784 cmpult $24, $6, $23
785 srl $3, 32, $6
786 mulq $5, $6, $2
787 mulq $6, $8, $6
788 addq $22, $2, $22
789 cmpult $22, $2, $1
790 bis $31, 1, $2
791 beq $1, $185
792 sll $2, 32, $1
793 addq $6, $1, $6
794$185:
795 sll $22, 32, $2
796 ldq $1, 8($18)
797 addq $20, $2, $20
798 bis $20, $20, $7
799 ldq $4, 8($17)
800 addq $24, $7, $24
801 srl $1, 32, $8
802 cmpult $24, $7, $3
803 zapnot $4, 15, $7
804 mulq $8, $7, $25
805 zapnot $1, 15, $5
806 mulq $7, $5, $0
807 srl $22, 32, $1
808 cmpult $20, $2, $2
809 addq $6, $1, $6
810 addq $2, $6, $6
811 addq $3, $6, $6
812 addq $23, $6, $23
813 cmpult $23, $6, $22
814 srl $4, 32, $6
815 mulq $5, $6, $5
816 bis $31, 1, $21
817 addq $25, $5, $25
818 cmpult $25, $5, $1
819 mulq $6, $8, $6
820 beq $1, $189
821 sll $21, 32, $1
822 addq $6, $1, $6
823$189:
824 sll $25, 32, $5
825 ldq $2, 16($18)
826 addq $0, $5, $0
827 bis $0, $0, $7
828 ldq $4, 0($17)
829 addq $24, $7, $24
830 srl $2, 32, $8
831 cmpult $24, $7, $3
832 zapnot $4, 15, $7
833 mulq $8, $7, $28
834 srl $25, 32, $1
835 addq $6, $1, $6
836 cmpult $0, $5, $1
837 zapnot $2, 15, $5
838 addq $1, $6, $6
839 addq $3, $6, $6
840 addq $23, $6, $23
841 cmpult $23, $6, $1
842 srl $4, 32, $6
843 mulq $5, $6, $25
844 mulq $7, $5, $2
845 addq $1, $22, $22
846 addq $28, $25, $28
847 cmpult $28, $25, $1
848 mulq $6, $8, $6
849 beq $1, $193
850 sll $21, 32, $1
851 addq $6, $1, $6
852$193:
853 sll $28, 32, $25
854 addq $2, $25, $2
855 bis $2, $2, $7
856 addq $24, $7, $24
857 stq $24, 16($16)
858 ldq $4, 0($17)
859 ldq $5, 24($18)
860 cmpult $24, $7, $3
861 zapnot $4, 15, $7
862 srl $5, 32, $8
863 mulq $8, $7, $0
864 srl $28, 32, $1
865 cmpult $2, $25, $2
866 addq $6, $1, $6
867 addq $2, $6, $6
868 addq $3, $6, $6
869 addq $23, $6, $23
870 cmpult $23, $6, $1
871 srl $4, 32, $6
872 zapnot $5, 15, $5
873 mulq $5, $6, $24
874 mulq $7, $5, $2
875 addq $1, $22, $22
876 addq $0, $24, $0
877 cmpult $0, $24, $1
878 mulq $6, $8, $6
879 beq $1, $197
880 sll $21, 32, $1
881 addq $6, $1, $6
882$197:
883 sll $0, 32, $24
884 ldq $1, 16($18)
885 addq $2, $24, $2
886 bis $2, $2, $7
887 ldq $4, 8($17)
888 addq $23, $7, $23
889 srl $1, 32, $8
890 cmpult $23, $7, $3
891 zapnot $4, 15, $7
892 mulq $8, $7, $25
893 zapnot $1, 15, $5
894 mulq $7, $5, $21
895 srl $0, 32, $1
896 cmpult $2, $24, $2
897 addq $6, $1, $6
898 addq $2, $6, $6
899 addq $3, $6, $6
900 addq $22, $6, $22
901 cmpult $22, $6, $24
902 srl $4, 32, $6
903 mulq $5, $6, $5
904 bis $31, 1, $20
905 addq $25, $5, $25
906 cmpult $25, $5, $1
907 mulq $6, $8, $6
908 beq $1, $201
909 sll $20, 32, $1
910 addq $6, $1, $6
911$201:
912 sll $25, 32, $5
913 ldq $2, 8($18)
914 addq $21, $5, $21
915 bis $21, $21, $7
916 ldq $4, 16($17)
917 addq $23, $7, $23
918 srl $2, 32, $8
919 cmpult $23, $7, $3
920 zapnot $4, 15, $7
921 mulq $8, $7, $28
922 srl $25, 32, $1
923 addq $6, $1, $6
924 cmpult $21, $5, $1
925 zapnot $2, 15, $5
926 addq $1, $6, $6
927 addq $3, $6, $6
928 addq $22, $6, $22
929 cmpult $22, $6, $1
930 srl $4, 32, $6
931 mulq $5, $6, $25
932 mulq $7, $5, $5
933 addq $1, $24, $24
934 addq $28, $25, $28
935 cmpult $28, $25, $1
936 mulq $6, $8, $6
937 beq $1, $205
938 sll $20, 32, $1
939 addq $6, $1, $6
940$205:
941 sll $28, 32, $25
942 ldq $2, 0($18)
943 addq $5, $25, $5
944 bis $5, $5, $7
945 ldq $4, 24($17)
946 addq $23, $7, $23
947 srl $2, 32, $8
948 cmpult $23, $7, $3
949 zapnot $4, 15, $7
950 mulq $8, $7, $0
951 srl $28, 32, $1
952 addq $6, $1, $6
953 cmpult $5, $25, $1
954 zapnot $2, 15, $5
955 addq $1, $6, $6
956 addq $3, $6, $6
957 addq $22, $6, $22
958 cmpult $22, $6, $1
959 srl $4, 32, $6
960 mulq $5, $6, $25
961 mulq $7, $5, $2
962 addq $1, $24, $24
963 addq $0, $25, $0
964 cmpult $0, $25, $1
965 mulq $6, $8, $6
966 beq $1, $209
967 sll $20, 32, $1
968 addq $6, $1, $6
969$209:
970 sll $0, 32, $25
971 addq $2, $25, $2
972 bis $2, $2, $7
973 addq $23, $7, $23
974 stq $23, 24($16)
975 ldq $4, 32($17)
976 ldq $5, 0($18)
977 cmpult $23, $7, $3
978 zapnot $4, 15, $7
979 srl $5, 32, $8
980 mulq $8, $7, $28
981 srl $0, 32, $1
982 cmpult $2, $25, $2
983 addq $6, $1, $6
984 addq $2, $6, $6
985 addq $3, $6, $6
986 addq $22, $6, $22
987 cmpult $22, $6, $1
988 srl $4, 32, $6
989 zapnot $5, 15, $5
990 mulq $5, $6, $23
991 mulq $7, $5, $2
992 addq $1, $24, $24
993 addq $28, $23, $28
994 cmpult $28, $23, $1
995 mulq $6, $8, $6
996 beq $1, $213
997 sll $20, 32, $1
998 addq $6, $1, $6
999$213:
1000 sll $28, 32, $23
1001 ldq $1, 8($18)
1002 addq $2, $23, $2
1003 bis $2, $2, $7
1004 ldq $4, 24($17)
1005 addq $22, $7, $22
1006 srl $1, 32, $8
1007 cmpult $22, $7, $3
1008 zapnot $4, 15, $7
1009 mulq $8, $7, $25
1010 zapnot $1, 15, $5
1011 mulq $7, $5, $0
1012 srl $28, 32, $1
1013 cmpult $2, $23, $2
1014 addq $6, $1, $6
1015 addq $2, $6, $6
1016 addq $3, $6, $6
1017 addq $24, $6, $24
1018 cmpult $24, $6, $23
1019 srl $4, 32, $6
1020 mulq $5, $6, $5
1021 bis $31, 1, $21
1022 addq $25, $5, $25
1023 cmpult $25, $5, $1
1024 mulq $6, $8, $6
1025 beq $1, $217
1026 sll $21, 32, $1
1027 addq $6, $1, $6
1028$217:
1029 sll $25, 32, $5
1030 ldq $2, 16($18)
1031 addq $0, $5, $0
1032 bis $0, $0, $7
1033 ldq $4, 16($17)
1034 addq $22, $7, $22
1035 srl $2, 32, $8
1036 cmpult $22, $7, $3
1037 zapnot $4, 15, $7
1038 mulq $8, $7, $28
1039 srl $25, 32, $1
1040 addq $6, $1, $6
1041 cmpult $0, $5, $1
1042 zapnot $2, 15, $5
1043 addq $1, $6, $6
1044 addq $3, $6, $6
1045 addq $24, $6, $24
1046 cmpult $24, $6, $1
1047 srl $4, 32, $6
1048 mulq $5, $6, $25
1049 mulq $7, $5, $5
1050 addq $1, $23, $23
1051 addq $28, $25, $28
1052 cmpult $28, $25, $1
1053 mulq $6, $8, $6
1054 beq $1, $221
1055 sll $21, 32, $1
1056 addq $6, $1, $6
1057$221:
1058 sll $28, 32, $25
1059 ldq $2, 24($18)
1060 addq $5, $25, $5
1061 bis $5, $5, $7
1062 ldq $4, 8($17)
1063 addq $22, $7, $22
1064 srl $2, 32, $8
1065 cmpult $22, $7, $3
1066 zapnot $4, 15, $7
1067 mulq $8, $7, $0
1068 srl $28, 32, $1
1069 addq $6, $1, $6
1070 cmpult $5, $25, $1
1071 zapnot $2, 15, $5
1072 addq $1, $6, $6
1073 addq $3, $6, $6
1074 addq $24, $6, $24
1075 cmpult $24, $6, $1
1076 srl $4, 32, $6
1077 mulq $5, $6, $25
1078 mulq $7, $5, $5
1079 addq $1, $23, $23
1080 addq $0, $25, $0
1081 cmpult $0, $25, $1
1082 mulq $6, $8, $6
1083 beq $1, $225
1084 sll $21, 32, $1
1085 addq $6, $1, $6
1086$225:
1087 sll $0, 32, $25
1088 ldq $2, 32($18)
1089 addq $5, $25, $5
1090 bis $5, $5, $7
1091 ldq $4, 0($17)
1092 addq $22, $7, $22
1093 srl $2, 32, $8
1094 cmpult $22, $7, $3
1095 zapnot $4, 15, $7
1096 mulq $8, $7, $28
1097 srl $0, 32, $1
1098 addq $6, $1, $6
1099 cmpult $5, $25, $1
1100 zapnot $2, 15, $5
1101 addq $1, $6, $6
1102 addq $3, $6, $6
1103 addq $24, $6, $24
1104 cmpult $24, $6, $1
1105 srl $4, 32, $6
1106 mulq $5, $6, $25
1107 mulq $7, $5, $2
1108 addq $1, $23, $23
1109 addq $28, $25, $28
1110 cmpult $28, $25, $1
1111 mulq $6, $8, $6
1112 beq $1, $229
1113 sll $21, 32, $1
1114 addq $6, $1, $6
1115$229:
1116 sll $28, 32, $25
1117 addq $2, $25, $2
1118 bis $2, $2, $7
1119 addq $22, $7, $22
1120 stq $22, 32($16)
1121 ldq $4, 0($17)
1122 ldq $5, 40($18)
1123 cmpult $22, $7, $3
1124 zapnot $4, 15, $7
1125 srl $5, 32, $8
1126 mulq $8, $7, $0
1127 srl $28, 32, $1
1128 cmpult $2, $25, $2
1129 addq $6, $1, $6
1130 addq $2, $6, $6
1131 addq $3, $6, $6
1132 addq $24, $6, $24
1133 cmpult $24, $6, $1
1134 srl $4, 32, $6
1135 zapnot $5, 15, $5
1136 mulq $5, $6, $22
1137 mulq $7, $5, $2
1138 addq $1, $23, $23
1139 addq $0, $22, $0
1140 cmpult $0, $22, $1
1141 mulq $6, $8, $6
1142 beq $1, $233
1143 sll $21, 32, $1
1144 addq $6, $1, $6
1145$233:
1146 sll $0, 32, $22
1147 ldq $1, 32($18)
1148 addq $2, $22, $2
1149 bis $2, $2, $7
1150 ldq $4, 8($17)
1151 addq $24, $7, $24
1152 srl $1, 32, $8
1153 cmpult $24, $7, $3
1154 zapnot $4, 15, $7
1155 mulq $8, $7, $25
1156 zapnot $1, 15, $5
1157 mulq $7, $5, $21
1158 srl $0, 32, $1
1159 cmpult $2, $22, $2
1160 addq $6, $1, $6
1161 addq $2, $6, $6
1162 addq $3, $6, $6
1163 addq $23, $6, $23
1164 cmpult $23, $6, $22
1165 srl $4, 32, $6
1166 mulq $5, $6, $5
1167 bis $31, 1, $20
1168 addq $25, $5, $25
1169 cmpult $25, $5, $1
1170 mulq $6, $8, $6
1171 beq $1, $237
1172 sll $20, 32, $1
1173 addq $6, $1, $6
1174$237:
1175 sll $25, 32, $5
1176 ldq $2, 24($18)
1177 addq $21, $5, $21
1178 bis $21, $21, $7
1179 ldq $4, 16($17)
1180 addq $24, $7, $24
1181 srl $2, 32, $8
1182 cmpult $24, $7, $3
1183 zapnot $4, 15, $7
1184 mulq $8, $7, $28
1185 srl $25, 32, $1
1186 addq $6, $1, $6
1187 cmpult $21, $5, $1
1188 zapnot $2, 15, $5
1189 addq $1, $6, $6
1190 addq $3, $6, $6
1191 addq $23, $6, $23
1192 cmpult $23, $6, $1
1193 srl $4, 32, $6
1194 mulq $5, $6, $25
1195 mulq $7, $5, $5
1196 addq $1, $22, $22
1197 addq $28, $25, $28
1198 cmpult $28, $25, $1
1199 mulq $6, $8, $6
1200 beq $1, $241
1201 sll $20, 32, $1
1202 addq $6, $1, $6
1203$241:
1204 sll $28, 32, $25
1205 ldq $2, 16($18)
1206 addq $5, $25, $5
1207 bis $5, $5, $7
1208 ldq $4, 24($17)
1209 addq $24, $7, $24
1210 srl $2, 32, $8
1211 cmpult $24, $7, $3
1212 zapnot $4, 15, $7
1213 mulq $8, $7, $0
1214 srl $28, 32, $1
1215 addq $6, $1, $6
1216 cmpult $5, $25, $1
1217 zapnot $2, 15, $5
1218 addq $1, $6, $6
1219 addq $3, $6, $6
1220 addq $23, $6, $23
1221 cmpult $23, $6, $1
1222 srl $4, 32, $6
1223 mulq $5, $6, $25
1224 mulq $7, $5, $5
1225 addq $1, $22, $22
1226 addq $0, $25, $0
1227 cmpult $0, $25, $1
1228 mulq $6, $8, $6
1229 beq $1, $245
1230 sll $20, 32, $1
1231 addq $6, $1, $6
1232$245:
1233 sll $0, 32, $25
1234 ldq $2, 8($18)
1235 addq $5, $25, $5
1236 bis $5, $5, $7
1237 ldq $4, 32($17)
1238 addq $24, $7, $24
1239 srl $2, 32, $8
1240 cmpult $24, $7, $3
1241 zapnot $4, 15, $7
1242 mulq $8, $7, $28
1243 srl $0, 32, $1
1244 addq $6, $1, $6
1245 cmpult $5, $25, $1
1246 zapnot $2, 15, $5
1247 addq $1, $6, $6
1248 addq $3, $6, $6
1249 addq $23, $6, $23
1250 cmpult $23, $6, $1
1251 srl $4, 32, $6
1252 mulq $5, $6, $25
1253 mulq $7, $5, $5
1254 addq $1, $22, $22
1255 addq $28, $25, $28
1256 cmpult $28, $25, $1
1257 mulq $6, $8, $6
1258 beq $1, $249
1259 sll $20, 32, $1
1260 addq $6, $1, $6
1261$249:
1262 sll $28, 32, $25
1263 ldq $2, 0($18)
1264 addq $5, $25, $5
1265 bis $5, $5, $7
1266 ldq $4, 40($17)
1267 addq $24, $7, $24
1268 srl $2, 32, $8
1269 cmpult $24, $7, $3
1270 zapnot $4, 15, $7
1271 mulq $8, $7, $0
1272 srl $28, 32, $1
1273 addq $6, $1, $6
1274 cmpult $5, $25, $1
1275 zapnot $2, 15, $5
1276 addq $1, $6, $6
1277 addq $3, $6, $6
1278 addq $23, $6, $23
1279 cmpult $23, $6, $1
1280 srl $4, 32, $6
1281 mulq $5, $6, $25
1282 mulq $7, $5, $2
1283 addq $1, $22, $22
1284 addq $0, $25, $0
1285 cmpult $0, $25, $1
1286 mulq $6, $8, $6
1287 beq $1, $253
1288 sll $20, 32, $1
1289 addq $6, $1, $6
1290$253:
1291 sll $0, 32, $25
1292 addq $2, $25, $2
1293 bis $2, $2, $7
1294 addq $24, $7, $24
1295 stq $24, 40($16)
1296 ldq $4, 48($17)
1297 ldq $5, 0($18)
1298 cmpult $24, $7, $3
1299 zapnot $4, 15, $7
1300 srl $5, 32, $8
1301 mulq $8, $7, $28
1302 srl $0, 32, $1
1303 cmpult $2, $25, $2
1304 addq $6, $1, $6
1305 addq $2, $6, $6
1306 addq $3, $6, $6
1307 addq $23, $6, $23
1308 cmpult $23, $6, $1
1309 srl $4, 32, $6
1310 zapnot $5, 15, $5
1311 mulq $5, $6, $24
1312 mulq $7, $5, $2
1313 addq $1, $22, $22
1314 addq $28, $24, $28
1315 cmpult $28, $24, $1
1316 mulq $6, $8, $6
1317 beq $1, $257
1318 sll $20, 32, $1
1319 addq $6, $1, $6
1320$257:
1321 sll $28, 32, $24
1322 ldq $1, 8($18)
1323 addq $2, $24, $2
1324 bis $2, $2, $7
1325 ldq $4, 40($17)
1326 addq $23, $7, $23
1327 srl $1, 32, $8
1328 cmpult $23, $7, $3
1329 zapnot $4, 15, $7
1330 mulq $8, $7, $25
1331 zapnot $1, 15, $5
1332 mulq $7, $5, $0
1333 srl $28, 32, $1
1334 cmpult $2, $24, $2
1335 addq $6, $1, $6
1336 addq $2, $6, $6
1337 addq $3, $6, $6
1338 addq $22, $6, $22
1339 cmpult $22, $6, $24
1340 srl $4, 32, $6
1341 mulq $5, $6, $5
1342 bis $31, 1, $21
1343 addq $25, $5, $25
1344 cmpult $25, $5, $1
1345 mulq $6, $8, $6
1346 beq $1, $261
1347 sll $21, 32, $1
1348 addq $6, $1, $6
1349$261:
1350 sll $25, 32, $5
1351 ldq $2, 16($18)
1352 addq $0, $5, $0
1353 bis $0, $0, $7
1354 ldq $4, 32($17)
1355 addq $23, $7, $23
1356 srl $2, 32, $8
1357 cmpult $23, $7, $3
1358 zapnot $4, 15, $7
1359 mulq $8, $7, $28
1360 srl $25, 32, $1
1361 addq $6, $1, $6
1362 cmpult $0, $5, $1
1363 zapnot $2, 15, $5
1364 addq $1, $6, $6
1365 addq $3, $6, $6
1366 addq $22, $6, $22
1367 cmpult $22, $6, $1
1368 srl $4, 32, $6
1369 mulq $5, $6, $25
1370 mulq $7, $5, $5
1371 addq $1, $24, $24
1372 addq $28, $25, $28
1373 cmpult $28, $25, $1
1374 mulq $6, $8, $6
1375 beq $1, $265
1376 sll $21, 32, $1
1377 addq $6, $1, $6
1378$265:
1379 sll $28, 32, $25
1380 ldq $2, 24($18)
1381 addq $5, $25, $5
1382 bis $5, $5, $7
1383 ldq $4, 24($17)
1384 addq $23, $7, $23
1385 srl $2, 32, $8
1386 cmpult $23, $7, $3
1387 zapnot $4, 15, $7
1388 mulq $8, $7, $0
1389 srl $28, 32, $1
1390 addq $6, $1, $6
1391 cmpult $5, $25, $1
1392 zapnot $2, 15, $5
1393 addq $1, $6, $6
1394 addq $3, $6, $6
1395 addq $22, $6, $22
1396 cmpult $22, $6, $1
1397 srl $4, 32, $6
1398 mulq $5, $6, $25
1399 mulq $7, $5, $5
1400 addq $1, $24, $24
1401 addq $0, $25, $0
1402 cmpult $0, $25, $1
1403 mulq $6, $8, $6
1404 beq $1, $269
1405 sll $21, 32, $1
1406 addq $6, $1, $6
1407$269:
1408 sll $0, 32, $25
1409 ldq $2, 32($18)
1410 addq $5, $25, $5
1411 bis $5, $5, $7
1412 ldq $4, 16($17)
1413 addq $23, $7, $23
1414 srl $2, 32, $8
1415 cmpult $23, $7, $3
1416 zapnot $4, 15, $7
1417 mulq $8, $7, $28
1418 srl $0, 32, $1
1419 addq $6, $1, $6
1420 cmpult $5, $25, $1
1421 zapnot $2, 15, $5
1422 addq $1, $6, $6
1423 addq $3, $6, $6
1424 addq $22, $6, $22
1425 cmpult $22, $6, $1
1426 srl $4, 32, $6
1427 mulq $5, $6, $25
1428 mulq $7, $5, $5
1429 addq $1, $24, $24
1430 addq $28, $25, $28
1431 cmpult $28, $25, $1
1432 mulq $6, $8, $6
1433 beq $1, $273
1434 sll $21, 32, $1
1435 addq $6, $1, $6
1436$273:
1437 sll $28, 32, $25
1438 ldq $2, 40($18)
1439 addq $5, $25, $5
1440 bis $5, $5, $7
1441 ldq $4, 8($17)
1442 addq $23, $7, $23
1443 srl $2, 32, $8
1444 cmpult $23, $7, $3
1445 zapnot $4, 15, $7
1446 mulq $8, $7, $0
1447 srl $28, 32, $1
1448 addq $6, $1, $6
1449 cmpult $5, $25, $1
1450 zapnot $2, 15, $5
1451 addq $1, $6, $6
1452 addq $3, $6, $6
1453 addq $22, $6, $22
1454 cmpult $22, $6, $1
1455 srl $4, 32, $6
1456 mulq $5, $6, $25
1457 mulq $7, $5, $5
1458 addq $1, $24, $24
1459 addq $0, $25, $0
1460 cmpult $0, $25, $1
1461 mulq $6, $8, $6
1462 beq $1, $277
1463 sll $21, 32, $1
1464 addq $6, $1, $6
1465$277:
1466 sll $0, 32, $25
1467 ldq $2, 48($18)
1468 addq $5, $25, $5
1469 bis $5, $5, $7
1470 ldq $4, 0($17)
1471 addq $23, $7, $23
1472 srl $2, 32, $8
1473 cmpult $23, $7, $3
1474 zapnot $4, 15, $7
1475 mulq $8, $7, $28
1476 srl $0, 32, $1
1477 addq $6, $1, $6
1478 cmpult $5, $25, $1
1479 zapnot $2, 15, $5
1480 addq $1, $6, $6
1481 addq $3, $6, $6
1482 addq $22, $6, $22
1483 cmpult $22, $6, $1
1484 srl $4, 32, $6
1485 mulq $5, $6, $25
1486 mulq $7, $5, $2
1487 addq $1, $24, $24
1488 addq $28, $25, $28
1489 cmpult $28, $25, $1
1490 mulq $6, $8, $6
1491 beq $1, $281
1492 sll $21, 32, $1
1493 addq $6, $1, $6
1494$281:
1495 sll $28, 32, $25
1496 addq $2, $25, $2
1497 bis $2, $2, $7
1498 addq $23, $7, $23
1499 stq $23, 48($16)
1500 ldq $4, 0($17)
1501 ldq $5, 56($18)
1502 cmpult $23, $7, $3
1503 zapnot $4, 15, $7
1504 srl $5, 32, $8
1505 mulq $8, $7, $0
1506 srl $28, 32, $1
1507 cmpult $2, $25, $2
1508 addq $6, $1, $6
1509 addq $2, $6, $6
1510 addq $3, $6, $6
1511 addq $22, $6, $22
1512 cmpult $22, $6, $1
1513 srl $4, 32, $6
1514 zapnot $5, 15, $5
1515 mulq $5, $6, $23
1516 mulq $7, $5, $2
1517 addq $1, $24, $24
1518 addq $0, $23, $0
1519 cmpult $0, $23, $1
1520 mulq $6, $8, $6
1521 beq $1, $285
1522 sll $21, 32, $1
1523 addq $6, $1, $6
1524$285:
1525 sll $0, 32, $23
1526 ldq $1, 48($18)
1527 addq $2, $23, $2
1528 bis $2, $2, $7
1529 ldq $4, 8($17)
1530 addq $22, $7, $22
1531 srl $1, 32, $8
1532 cmpult $22, $7, $3
1533 zapnot $4, 15, $7
1534 mulq $8, $7, $25
1535 zapnot $1, 15, $5
1536 mulq $7, $5, $21
1537 srl $0, 32, $1
1538 cmpult $2, $23, $2
1539 addq $6, $1, $6
1540 addq $2, $6, $6
1541 addq $3, $6, $6
1542 addq $24, $6, $24
1543 cmpult $24, $6, $23
1544 srl $4, 32, $6
1545 mulq $5, $6, $5
1546 bis $31, 1, $20
1547 addq $25, $5, $25
1548 cmpult $25, $5, $1
1549 mulq $6, $8, $6
1550 beq $1, $289
1551 sll $20, 32, $1
1552 addq $6, $1, $6
1553$289:
1554 sll $25, 32, $5
1555 ldq $2, 40($18)
1556 addq $21, $5, $21
1557 bis $21, $21, $7
1558 ldq $4, 16($17)
1559 addq $22, $7, $22
1560 srl $2, 32, $8
1561 cmpult $22, $7, $3
1562 zapnot $4, 15, $7
1563 mulq $8, $7, $28
1564 srl $25, 32, $1
1565 addq $6, $1, $6
1566 cmpult $21, $5, $1
1567 zapnot $2, 15, $5
1568 addq $1, $6, $6
1569 addq $3, $6, $6
1570 addq $24, $6, $24
1571 cmpult $24, $6, $1
1572 srl $4, 32, $6
1573 mulq $5, $6, $25
1574 mulq $7, $5, $5
1575 addq $1, $23, $23
1576 addq $28, $25, $28
1577 cmpult $28, $25, $1
1578 mulq $6, $8, $6
1579 beq $1, $293
1580 sll $20, 32, $1
1581 addq $6, $1, $6
1582$293:
1583 sll $28, 32, $25
1584 ldq $2, 32($18)
1585 addq $5, $25, $5
1586 bis $5, $5, $7
1587 ldq $4, 24($17)
1588 addq $22, $7, $22
1589 srl $2, 32, $8
1590 cmpult $22, $7, $3
1591 zapnot $4, 15, $7
1592 mulq $8, $7, $0
1593 srl $28, 32, $1
1594 addq $6, $1, $6
1595 cmpult $5, $25, $1
1596 zapnot $2, 15, $5
1597 addq $1, $6, $6
1598 addq $3, $6, $6
1599 addq $24, $6, $24
1600 cmpult $24, $6, $1
1601 srl $4, 32, $6
1602 mulq $5, $6, $25
1603 mulq $7, $5, $5
1604 addq $1, $23, $23
1605 addq $0, $25, $0
1606 cmpult $0, $25, $1
1607 mulq $6, $8, $6
1608 beq $1, $297
1609 sll $20, 32, $1
1610 addq $6, $1, $6
1611$297:
1612 sll $0, 32, $25
1613 ldq $2, 24($18)
1614 addq $5, $25, $5
1615 bis $5, $5, $7
1616 ldq $4, 32($17)
1617 addq $22, $7, $22
1618 srl $2, 32, $8
1619 cmpult $22, $7, $3
1620 zapnot $4, 15, $7
1621 mulq $8, $7, $28
1622 srl $0, 32, $1
1623 addq $6, $1, $6
1624 cmpult $5, $25, $1
1625 zapnot $2, 15, $5
1626 addq $1, $6, $6
1627 addq $3, $6, $6
1628 addq $24, $6, $24
1629 cmpult $24, $6, $1
1630 srl $4, 32, $6
1631 mulq $5, $6, $25
1632 mulq $7, $5, $5
1633 addq $1, $23, $23
1634 addq $28, $25, $28
1635 cmpult $28, $25, $1
1636 mulq $6, $8, $6
1637 beq $1, $301
1638 sll $20, 32, $1
1639 addq $6, $1, $6
1640$301:
1641 sll $28, 32, $25
1642 ldq $2, 16($18)
1643 addq $5, $25, $5
1644 bis $5, $5, $7
1645 ldq $4, 40($17)
1646 addq $22, $7, $22
1647 srl $2, 32, $8
1648 cmpult $22, $7, $3
1649 zapnot $4, 15, $7
1650 mulq $8, $7, $0
1651 srl $28, 32, $1
1652 addq $6, $1, $6
1653 cmpult $5, $25, $1
1654 zapnot $2, 15, $5
1655 addq $1, $6, $6
1656 addq $3, $6, $6
1657 addq $24, $6, $24
1658 cmpult $24, $6, $1
1659 srl $4, 32, $6
1660 mulq $5, $6, $25
1661 mulq $7, $5, $5
1662 addq $1, $23, $23
1663 addq $0, $25, $0
1664 cmpult $0, $25, $1
1665 mulq $6, $8, $6
1666 beq $1, $305
1667 sll $20, 32, $1
1668 addq $6, $1, $6
1669$305:
1670 sll $0, 32, $25
1671 ldq $2, 8($18)
1672 addq $5, $25, $5
1673 bis $5, $5, $7
1674 ldq $4, 48($17)
1675 addq $22, $7, $22
1676 srl $2, 32, $8
1677 cmpult $22, $7, $3
1678 zapnot $4, 15, $7
1679 mulq $8, $7, $28
1680 srl $0, 32, $1
1681 addq $6, $1, $6
1682 cmpult $5, $25, $1
1683 zapnot $2, 15, $5
1684 addq $1, $6, $6
1685 addq $3, $6, $6
1686 addq $24, $6, $24
1687 cmpult $24, $6, $1
1688 srl $4, 32, $6
1689 mulq $5, $6, $25
1690 mulq $7, $5, $5
1691 addq $1, $23, $23
1692 addq $28, $25, $28
1693 cmpult $28, $25, $1
1694 mulq $6, $8, $6
1695 beq $1, $309
1696 sll $20, 32, $1
1697 addq $6, $1, $6
1698$309:
1699 sll $28, 32, $25
1700 ldq $2, 0($18)
1701 addq $5, $25, $5
1702 bis $5, $5, $7
1703 ldq $4, 56($17)
1704 addq $22, $7, $22
1705 srl $2, 32, $8
1706 cmpult $22, $7, $3
1707 zapnot $4, 15, $7
1708 mulq $8, $7, $0
1709 srl $28, 32, $1
1710 addq $6, $1, $6
1711 cmpult $5, $25, $1
1712 zapnot $2, 15, $5
1713 addq $1, $6, $6
1714 addq $3, $6, $6
1715 addq $24, $6, $24
1716 cmpult $24, $6, $1
1717 srl $4, 32, $6
1718 mulq $5, $6, $25
1719 mulq $7, $5, $2
1720 addq $1, $23, $23
1721 addq $0, $25, $0
1722 cmpult $0, $25, $1
1723 mulq $6, $8, $6
1724 beq $1, $313
1725 sll $20, 32, $1
1726 addq $6, $1, $6
1727$313:
1728 sll $0, 32, $25
1729 addq $2, $25, $2
1730 bis $2, $2, $7
1731 addq $22, $7, $22
1732 stq $22, 56($16)
1733 ldq $4, 56($17)
1734 ldq $5, 8($18)
1735 cmpult $22, $7, $3
1736 zapnot $4, 15, $7
1737 srl $5, 32, $8
1738 mulq $8, $7, $28
1739 srl $0, 32, $1
1740 cmpult $2, $25, $2
1741 addq $6, $1, $6
1742 addq $2, $6, $6
1743 addq $3, $6, $6
1744 addq $24, $6, $24
1745 cmpult $24, $6, $1
1746 srl $4, 32, $6
1747 zapnot $5, 15, $5
1748 mulq $5, $6, $22
1749 mulq $7, $5, $2
1750 addq $1, $23, $23
1751 addq $28, $22, $28
1752 cmpult $28, $22, $1
1753 mulq $6, $8, $6
1754 beq $1, $317
1755 sll $20, 32, $1
1756 addq $6, $1, $6
1757$317:
1758 sll $28, 32, $22
1759 ldq $1, 16($18)
1760 addq $2, $22, $2
1761 bis $2, $2, $7
1762 ldq $4, 48($17)
1763 addq $24, $7, $24
1764 srl $1, 32, $8
1765 cmpult $24, $7, $3
1766 zapnot $4, 15, $7
1767 mulq $8, $7, $25
1768 zapnot $1, 15, $5
1769 mulq $7, $5, $0
1770 srl $28, 32, $1
1771 cmpult $2, $22, $2
1772 addq $6, $1, $6
1773 addq $2, $6, $6
1774 addq $3, $6, $6
1775 addq $23, $6, $23
1776 cmpult $23, $6, $22
1777 srl $4, 32, $6
1778 mulq $5, $6, $5
1779 bis $31, 1, $21
1780 addq $25, $5, $25
1781 cmpult $25, $5, $1
1782 mulq $6, $8, $6
1783 beq $1, $321
1784 sll $21, 32, $1
1785 addq $6, $1, $6
1786$321:
1787 sll $25, 32, $5
1788 ldq $2, 24($18)
1789 addq $0, $5, $0
1790 bis $0, $0, $7
1791 ldq $4, 40($17)
1792 addq $24, $7, $24
1793 srl $2, 32, $8
1794 cmpult $24, $7, $3
1795 zapnot $4, 15, $7
1796 mulq $8, $7, $28
1797 srl $25, 32, $1
1798 addq $6, $1, $6
1799 cmpult $0, $5, $1
1800 zapnot $2, 15, $5
1801 addq $1, $6, $6
1802 addq $3, $6, $6
1803 addq $23, $6, $23
1804 cmpult $23, $6, $1
1805 srl $4, 32, $6
1806 mulq $5, $6, $25
1807 mulq $7, $5, $5
1808 addq $1, $22, $22
1809 addq $28, $25, $28
1810 cmpult $28, $25, $1
1811 mulq $6, $8, $6
1812 beq $1, $325
1813 sll $21, 32, $1
1814 addq $6, $1, $6
1815$325:
1816 sll $28, 32, $25
1817 ldq $2, 32($18)
1818 addq $5, $25, $5
1819 bis $5, $5, $7
1820 ldq $4, 32($17)
1821 addq $24, $7, $24
1822 srl $2, 32, $8
1823 cmpult $24, $7, $3
1824 zapnot $4, 15, $7
1825 mulq $8, $7, $0
1826 srl $28, 32, $1
1827 addq $6, $1, $6
1828 cmpult $5, $25, $1
1829 zapnot $2, 15, $5
1830 addq $1, $6, $6
1831 addq $3, $6, $6
1832 addq $23, $6, $23
1833 cmpult $23, $6, $1
1834 srl $4, 32, $6
1835 mulq $5, $6, $25
1836 mulq $7, $5, $5
1837 addq $1, $22, $22
1838 addq $0, $25, $0
1839 cmpult $0, $25, $1
1840 mulq $6, $8, $6
1841 beq $1, $329
1842 sll $21, 32, $1
1843 addq $6, $1, $6
1844$329:
1845 sll $0, 32, $25
1846 ldq $2, 40($18)
1847 addq $5, $25, $5
1848 bis $5, $5, $7
1849 ldq $4, 24($17)
1850 addq $24, $7, $24
1851 srl $2, 32, $8
1852 cmpult $24, $7, $3
1853 zapnot $4, 15, $7
1854 mulq $8, $7, $28
1855 srl $0, 32, $1
1856 addq $6, $1, $6
1857 cmpult $5, $25, $1
1858 zapnot $2, 15, $5
1859 addq $1, $6, $6
1860 addq $3, $6, $6
1861 addq $23, $6, $23
1862 cmpult $23, $6, $1
1863 srl $4, 32, $6
1864 mulq $5, $6, $25
1865 mulq $7, $5, $5
1866 addq $1, $22, $22
1867 addq $28, $25, $28
1868 cmpult $28, $25, $1
1869 mulq $6, $8, $6
1870 beq $1, $333
1871 sll $21, 32, $1
1872 addq $6, $1, $6
1873$333:
1874 sll $28, 32, $25
1875 ldq $2, 48($18)
1876 addq $5, $25, $5
1877 bis $5, $5, $7
1878 ldq $4, 16($17)
1879 addq $24, $7, $24
1880 srl $2, 32, $8
1881 cmpult $24, $7, $3
1882 zapnot $4, 15, $7
1883 mulq $8, $7, $0
1884 srl $28, 32, $1
1885 addq $6, $1, $6
1886 cmpult $5, $25, $1
1887 zapnot $2, 15, $5
1888 addq $1, $6, $6
1889 addq $3, $6, $6
1890 addq $23, $6, $23
1891 cmpult $23, $6, $1
1892 srl $4, 32, $6
1893 mulq $5, $6, $25
1894 mulq $7, $5, $5
1895 addq $1, $22, $22
1896 addq $0, $25, $0
1897 cmpult $0, $25, $1
1898 mulq $6, $8, $6
1899 beq $1, $337
1900 sll $21, 32, $1
1901 addq $6, $1, $6
1902$337:
1903 sll $0, 32, $25
1904 ldq $2, 56($18)
1905 addq $5, $25, $5
1906 bis $5, $5, $7
1907 ldq $4, 8($17)
1908 addq $24, $7, $24
1909 srl $2, 32, $8
1910 cmpult $24, $7, $3
1911 zapnot $4, 15, $7
1912 mulq $8, $7, $28
1913 srl $0, 32, $1
1914 addq $6, $1, $6
1915 cmpult $5, $25, $1
1916 zapnot $2, 15, $5
1917 addq $1, $6, $6
1918 addq $3, $6, $6
1919 addq $23, $6, $23
1920 cmpult $23, $6, $1
1921 srl $4, 32, $6
1922 mulq $5, $6, $25
1923 mulq $7, $5, $2
1924 addq $1, $22, $22
1925 addq $28, $25, $28
1926 cmpult $28, $25, $1
1927 mulq $6, $8, $6
1928 beq $1, $341
1929 sll $21, 32, $1
1930 addq $6, $1, $6
1931$341:
1932 sll $28, 32, $25
1933 addq $2, $25, $2
1934 bis $2, $2, $7
1935 addq $24, $7, $24
1936 stq $24, 64($16)
1937 ldq $4, 16($17)
1938 ldq $5, 56($18)
1939 cmpult $24, $7, $3
1940 zapnot $4, 15, $7
1941 srl $5, 32, $8
1942 mulq $8, $7, $0
1943 srl $28, 32, $1
1944 cmpult $2, $25, $2
1945 addq $6, $1, $6
1946 addq $2, $6, $6
1947 addq $3, $6, $6
1948 addq $23, $6, $23
1949 cmpult $23, $6, $1
1950 srl $4, 32, $6
1951 zapnot $5, 15, $5
1952 mulq $5, $6, $24
1953 mulq $7, $5, $2
1954 addq $1, $22, $22
1955 addq $0, $24, $0
1956 cmpult $0, $24, $1
1957 mulq $6, $8, $6
1958 beq $1, $345
1959 sll $21, 32, $1
1960 addq $6, $1, $6
1961$345:
1962 sll $0, 32, $24
1963 ldq $1, 48($18)
1964 addq $2, $24, $2
1965 bis $2, $2, $7
1966 ldq $4, 24($17)
1967 addq $23, $7, $23
1968 srl $1, 32, $8
1969 cmpult $23, $7, $3
1970 zapnot $4, 15, $7
1971 mulq $8, $7, $25
1972 zapnot $1, 15, $5
1973 mulq $7, $5, $21
1974 srl $0, 32, $1
1975 cmpult $2, $24, $2
1976 addq $6, $1, $6
1977 addq $2, $6, $6
1978 addq $3, $6, $6
1979 addq $22, $6, $22
1980 cmpult $22, $6, $24
1981 srl $4, 32, $6
1982 mulq $5, $6, $5
1983 bis $31, 1, $20
1984 addq $25, $5, $25
1985 cmpult $25, $5, $1
1986 mulq $6, $8, $6
1987 beq $1, $349
1988 sll $20, 32, $1
1989 addq $6, $1, $6
1990$349:
1991 sll $25, 32, $5
1992 ldq $2, 40($18)
1993 addq $21, $5, $21
1994 bis $21, $21, $7
1995 ldq $4, 32($17)
1996 addq $23, $7, $23
1997 srl $2, 32, $8
1998 cmpult $23, $7, $3
1999 zapnot $4, 15, $7
2000 mulq $8, $7, $28
2001 srl $25, 32, $1
2002 addq $6, $1, $6
2003 cmpult $21, $5, $1
2004 zapnot $2, 15, $5
2005 addq $1, $6, $6
2006 addq $3, $6, $6
2007 addq $22, $6, $22
2008 cmpult $22, $6, $1
2009 srl $4, 32, $6
2010 mulq $5, $6, $25
2011 mulq $7, $5, $5
2012 addq $1, $24, $24
2013 addq $28, $25, $28
2014 cmpult $28, $25, $1
2015 mulq $6, $8, $6
2016 beq $1, $353
2017 sll $20, 32, $1
2018 addq $6, $1, $6
2019$353:
2020 sll $28, 32, $25
2021 ldq $2, 32($18)
2022 addq $5, $25, $5
2023 bis $5, $5, $7
2024 ldq $4, 40($17)
2025 addq $23, $7, $23
2026 srl $2, 32, $8
2027 cmpult $23, $7, $3
2028 zapnot $4, 15, $7
2029 mulq $8, $7, $0
2030 srl $28, 32, $1
2031 addq $6, $1, $6
2032 cmpult $5, $25, $1
2033 zapnot $2, 15, $5
2034 addq $1, $6, $6
2035 addq $3, $6, $6
2036 addq $22, $6, $22
2037 cmpult $22, $6, $1
2038 srl $4, 32, $6
2039 mulq $5, $6, $25
2040 mulq $7, $5, $5
2041 addq $1, $24, $24
2042 addq $0, $25, $0
2043 cmpult $0, $25, $1
2044 mulq $6, $8, $6
2045 beq $1, $357
2046 sll $20, 32, $1
2047 addq $6, $1, $6
2048$357:
2049 sll $0, 32, $25
2050 ldq $2, 24($18)
2051 addq $5, $25, $5
2052 bis $5, $5, $7
2053 ldq $4, 48($17)
2054 addq $23, $7, $23
2055 srl $2, 32, $8
2056 cmpult $23, $7, $3
2057 zapnot $4, 15, $7
2058 mulq $8, $7, $28
2059 srl $0, 32, $1
2060 addq $6, $1, $6
2061 cmpult $5, $25, $1
2062 zapnot $2, 15, $5
2063 addq $1, $6, $6
2064 addq $3, $6, $6
2065 addq $22, $6, $22
2066 cmpult $22, $6, $1
2067 srl $4, 32, $6
2068 mulq $5, $6, $25
2069 mulq $7, $5, $5
2070 addq $1, $24, $24
2071 addq $28, $25, $28
2072 cmpult $28, $25, $1
2073 mulq $6, $8, $6
2074 beq $1, $361
2075 sll $20, 32, $1
2076 addq $6, $1, $6
2077$361:
2078 sll $28, 32, $25
2079 ldq $2, 16($18)
2080 addq $5, $25, $5
2081 bis $5, $5, $7
2082 ldq $4, 56($17)
2083 addq $23, $7, $23
2084 srl $2, 32, $8
2085 cmpult $23, $7, $3
2086 zapnot $4, 15, $7
2087 mulq $8, $7, $0
2088 srl $28, 32, $1
2089 addq $6, $1, $6
2090 cmpult $5, $25, $1
2091 zapnot $2, 15, $5
2092 addq $1, $6, $6
2093 addq $3, $6, $6
2094 addq $22, $6, $22
2095 cmpult $22, $6, $1
2096 srl $4, 32, $6
2097 mulq $5, $6, $25
2098 mulq $7, $5, $2
2099 addq $1, $24, $24
2100 addq $0, $25, $0
2101 cmpult $0, $25, $1
2102 mulq $6, $8, $6
2103 beq $1, $365
2104 sll $20, 32, $1
2105 addq $6, $1, $6
2106$365:
2107 sll $0, 32, $25
2108 addq $2, $25, $2
2109 bis $2, $2, $7
2110 addq $23, $7, $23
2111 stq $23, 72($16)
2112 ldq $4, 56($17)
2113 ldq $5, 24($18)
2114 cmpult $23, $7, $3
2115 zapnot $4, 15, $7
2116 srl $5, 32, $8
2117 mulq $8, $7, $28
2118 srl $0, 32, $1
2119 cmpult $2, $25, $2
2120 addq $6, $1, $6
2121 addq $2, $6, $6
2122 addq $3, $6, $6
2123 addq $22, $6, $22
2124 cmpult $22, $6, $1
2125 srl $4, 32, $6
2126 zapnot $5, 15, $5
2127 mulq $5, $6, $23
2128 mulq $7, $5, $2
2129 addq $1, $24, $24
2130 addq $28, $23, $28
2131 cmpult $28, $23, $1
2132 mulq $6, $8, $6
2133 beq $1, $369
2134 sll $20, 32, $1
2135 addq $6, $1, $6
2136$369:
2137 sll $28, 32, $23
2138 ldq $1, 32($18)
2139 addq $2, $23, $2
2140 bis $2, $2, $7
2141 ldq $4, 48($17)
2142 addq $22, $7, $22
2143 srl $1, 32, $8
2144 cmpult $22, $7, $3
2145 zapnot $4, 15, $7
2146 mulq $8, $7, $25
2147 zapnot $1, 15, $5
2148 mulq $7, $5, $0
2149 srl $28, 32, $1
2150 cmpult $2, $23, $2
2151 addq $6, $1, $6
2152 addq $2, $6, $6
2153 addq $3, $6, $6
2154 addq $24, $6, $24
2155 cmpult $24, $6, $23
2156 srl $4, 32, $6
2157 mulq $5, $6, $5
2158 bis $31, 1, $21
2159 addq $25, $5, $25
2160 cmpult $25, $5, $1
2161 mulq $6, $8, $6
2162 beq $1, $373
2163 sll $21, 32, $1
2164 addq $6, $1, $6
2165$373:
2166 sll $25, 32, $5
2167 ldq $2, 40($18)
2168 addq $0, $5, $0
2169 bis $0, $0, $7
2170 ldq $4, 40($17)
2171 addq $22, $7, $22
2172 srl $2, 32, $8
2173 cmpult $22, $7, $3
2174 zapnot $4, 15, $7
2175 mulq $8, $7, $28
2176 srl $25, 32, $1
2177 addq $6, $1, $6
2178 cmpult $0, $5, $1
2179 zapnot $2, 15, $5
2180 addq $1, $6, $6
2181 addq $3, $6, $6
2182 addq $24, $6, $24
2183 cmpult $24, $6, $1
2184 srl $4, 32, $6
2185 mulq $5, $6, $25
2186 mulq $7, $5, $5
2187 addq $1, $23, $23
2188 addq $28, $25, $28
2189 cmpult $28, $25, $1
2190 mulq $6, $8, $6
2191 beq $1, $377
2192 sll $21, 32, $1
2193 addq $6, $1, $6
2194$377:
2195 sll $28, 32, $25
2196 ldq $2, 48($18)
2197 addq $5, $25, $5
2198 bis $5, $5, $7
2199 ldq $4, 32($17)
2200 addq $22, $7, $22
2201 srl $2, 32, $8
2202 cmpult $22, $7, $3
2203 zapnot $4, 15, $7
2204 mulq $8, $7, $0
2205 srl $28, 32, $1
2206 addq $6, $1, $6
2207 cmpult $5, $25, $1
2208 zapnot $2, 15, $5
2209 addq $1, $6, $6
2210 addq $3, $6, $6
2211 addq $24, $6, $24
2212 cmpult $24, $6, $1
2213 srl $4, 32, $6
2214 mulq $5, $6, $25
2215 mulq $7, $5, $5
2216 addq $1, $23, $23
2217 addq $0, $25, $0
2218 cmpult $0, $25, $1
2219 mulq $6, $8, $6
2220 beq $1, $381
2221 sll $21, 32, $1
2222 addq $6, $1, $6
2223$381:
2224 sll $0, 32, $25
2225 ldq $2, 56($18)
2226 addq $5, $25, $5
2227 bis $5, $5, $7
2228 ldq $4, 24($17)
2229 addq $22, $7, $22
2230 srl $2, 32, $8
2231 cmpult $22, $7, $3
2232 zapnot $4, 15, $7
2233 mulq $8, $7, $28
2234 srl $0, 32, $1
2235 addq $6, $1, $6
2236 cmpult $5, $25, $1
2237 zapnot $2, 15, $5
2238 addq $1, $6, $6
2239 addq $3, $6, $6
2240 addq $24, $6, $24
2241 cmpult $24, $6, $1
2242 srl $4, 32, $6
2243 mulq $5, $6, $25
2244 mulq $7, $5, $2
2245 addq $1, $23, $23
2246 addq $28, $25, $28
2247 cmpult $28, $25, $1
2248 mulq $6, $8, $6
2249 beq $1, $385
2250 sll $21, 32, $1
2251 addq $6, $1, $6
2252$385:
2253 sll $28, 32, $25
2254 addq $2, $25, $2
2255 bis $2, $2, $7
2256 addq $22, $7, $22
2257 stq $22, 80($16)
2258 ldq $4, 32($17)
2259 ldq $5, 56($18)
2260 cmpult $22, $7, $3
2261 zapnot $4, 15, $7
2262 srl $5, 32, $8
2263 mulq $8, $7, $0
2264 srl $28, 32, $1
2265 cmpult $2, $25, $2
2266 addq $6, $1, $6
2267 addq $2, $6, $6
2268 addq $3, $6, $6
2269 addq $24, $6, $24
2270 cmpult $24, $6, $1
2271 srl $4, 32, $6
2272 zapnot $5, 15, $5
2273 mulq $5, $6, $22
2274 mulq $7, $5, $2
2275 addq $1, $23, $23
2276 addq $0, $22, $0
2277 cmpult $0, $22, $1
2278 mulq $6, $8, $6
2279 beq $1, $389
2280 sll $21, 32, $1
2281 addq $6, $1, $6
2282$389:
2283 sll $0, 32, $22
2284 ldq $1, 48($18)
2285 addq $2, $22, $2
2286 bis $2, $2, $7
2287 ldq $4, 40($17)
2288 addq $24, $7, $24
2289 srl $1, 32, $8
2290 cmpult $24, $7, $3
2291 zapnot $4, 15, $7
2292 mulq $8, $7, $25
2293 zapnot $1, 15, $5
2294 mulq $7, $5, $21
2295 srl $0, 32, $1
2296 cmpult $2, $22, $2
2297 addq $6, $1, $6
2298 addq $2, $6, $6
2299 addq $3, $6, $6
2300 addq $23, $6, $23
2301 cmpult $23, $6, $22
2302 srl $4, 32, $6
2303 mulq $5, $6, $5
2304 bis $31, 1, $20
2305 addq $25, $5, $25
2306 cmpult $25, $5, $1
2307 mulq $6, $8, $6
2308 beq $1, $393
2309 sll $20, 32, $1
2310 addq $6, $1, $6
2311$393:
2312 sll $25, 32, $5
2313 ldq $2, 40($18)
2314 addq $21, $5, $21
2315 bis $21, $21, $7
2316 ldq $4, 48($17)
2317 addq $24, $7, $24
2318 srl $2, 32, $8
2319 cmpult $24, $7, $3
2320 zapnot $4, 15, $7
2321 mulq $8, $7, $28
2322 srl $25, 32, $1
2323 addq $6, $1, $6
2324 cmpult $21, $5, $1
2325 zapnot $2, 15, $5
2326 addq $1, $6, $6
2327 addq $3, $6, $6
2328 addq $23, $6, $23
2329 cmpult $23, $6, $1
2330 srl $4, 32, $6
2331 mulq $5, $6, $25
2332 mulq $7, $5, $5
2333 addq $1, $22, $22
2334 addq $28, $25, $28
2335 cmpult $28, $25, $1
2336 mulq $6, $8, $6
2337 beq $1, $397
2338 sll $20, 32, $1
2339 addq $6, $1, $6
2340$397:
2341 sll $28, 32, $25
2342 ldq $2, 32($18)
2343 addq $5, $25, $5
2344 bis $5, $5, $7
2345 ldq $4, 56($17)
2346 addq $24, $7, $24
2347 srl $2, 32, $8
2348 cmpult $24, $7, $3
2349 zapnot $4, 15, $7
2350 mulq $8, $7, $21
2351 srl $28, 32, $1
2352 addq $6, $1, $6
2353 cmpult $5, $25, $1
2354 zapnot $2, 15, $5
2355 addq $1, $6, $6
2356 addq $3, $6, $6
2357 addq $23, $6, $23
2358 cmpult $23, $6, $1
2359 srl $4, 32, $6
2360 mulq $5, $6, $25
2361 mulq $7, $5, $2
2362 addq $1, $22, $22
2363 addq $21, $25, $21
2364 cmpult $21, $25, $1
2365 mulq $6, $8, $6
2366 beq $1, $401
2367 sll $20, 32, $1
2368 addq $6, $1, $6
2369$401:
2370 sll $21, 32, $25
2371 addq $2, $25, $2
2372 bis $2, $2, $7
2373 addq $24, $7, $24
2374 stq $24, 88($16)
2375 ldq $4, 56($17)
2376 ldq $5, 40($18)
2377 cmpult $24, $7, $3
2378 zapnot $4, 15, $7
2379 srl $5, 32, $8
2380 mulq $8, $7, $0
2381 srl $21, 32, $1
2382 cmpult $2, $25, $2
2383 addq $6, $1, $6
2384 addq $2, $6, $6
2385 addq $3, $6, $6
2386 addq $23, $6, $23
2387 cmpult $23, $6, $1
2388 srl $4, 32, $6
2389 zapnot $5, 15, $5
2390 mulq $5, $6, $24
2391 mulq $7, $5, $5
2392 addq $1, $22, $22
2393 addq $0, $24, $0
2394 cmpult $0, $24, $1
2395 mulq $6, $8, $6
2396 beq $1, $405
2397 sll $20, 32, $1
2398 addq $6, $1, $6
2399$405:
2400 sll $0, 32, $24
2401 ldq $2, 48($18)
2402 addq $5, $24, $5
2403 bis $5, $5, $7
2404 ldq $4, 48($17)
2405 addq $23, $7, $23
2406 srl $2, 32, $8
2407 cmpult $23, $7, $3
2408 zapnot $4, 15, $7
2409 mulq $8, $7, $28
2410 srl $0, 32, $1
2411 addq $6, $1, $6
2412 cmpult $5, $24, $1
2413 zapnot $2, 15, $5
2414 addq $1, $6, $6
2415 addq $3, $6, $6
2416 addq $22, $6, $22
2417 cmpult $22, $6, $24
2418 srl $4, 32, $6
2419 mulq $5, $6, $25
2420 mulq $7, $5, $5
2421 addq $28, $25, $28
2422 cmpult $28, $25, $1
2423 mulq $6, $8, $6
2424 beq $1, $409
2425 sll $20, 32, $1
2426 addq $6, $1, $6
2427$409:
2428 sll $28, 32, $25
2429 ldq $2, 56($18)
2430 addq $5, $25, $5
2431 bis $5, $5, $7
2432 ldq $4, 40($17)
2433 addq $23, $7, $23
2434 srl $2, 32, $8
2435 cmpult $23, $7, $3
2436 zapnot $4, 15, $7
2437 mulq $8, $7, $0
2438 srl $28, 32, $1
2439 addq $6, $1, $6
2440 cmpult $5, $25, $1
2441 zapnot $2, 15, $5
2442 addq $1, $6, $6
2443 addq $3, $6, $6
2444 addq $22, $6, $22
2445 cmpult $22, $6, $1
2446 srl $4, 32, $6
2447 mulq $5, $6, $25
2448 mulq $7, $5, $2
2449 addq $1, $24, $24
2450 addq $0, $25, $0
2451 cmpult $0, $25, $1
2452 mulq $6, $8, $6
2453 beq $1, $413
2454 sll $20, 32, $1
2455 addq $6, $1, $6
2456$413:
2457 sll $0, 32, $25
2458 addq $2, $25, $2
2459 bis $2, $2, $7
2460 addq $23, $7, $23
2461 stq $23, 96($16)
2462 ldq $4, 48($17)
2463 ldq $5, 56($18)
2464 cmpult $23, $7, $3
2465 zapnot $4, 15, $7
2466 srl $5, 32, $8
2467 mulq $8, $7, $28
2468 srl $0, 32, $1
2469 cmpult $2, $25, $2
2470 addq $6, $1, $6
2471 addq $2, $6, $6
2472 addq $3, $6, $6
2473 addq $22, $6, $22
2474 cmpult $22, $6, $1
2475 srl $4, 32, $6
2476 zapnot $5, 15, $5
2477 mulq $5, $6, $23
2478 mulq $7, $5, $5
2479 addq $1, $24, $24
2480 addq $28, $23, $28
2481 cmpult $28, $23, $1
2482 mulq $6, $8, $6
2483 beq $1, $417
2484 sll $20, 32, $1
2485 addq $6, $1, $6
2486$417:
2487 sll $28, 32, $23
2488 ldq $2, 48($18)
2489 addq $5, $23, $5
2490 bis $5, $5, $7
2491 ldq $4, 56($17)
2492 addq $22, $7, $22
2493 srl $2, 32, $8
2494 cmpult $22, $7, $3
2495 zapnot $4, 15, $7
2496 mulq $8, $7, $0
2497 srl $28, 32, $1
2498 addq $6, $1, $6
2499 cmpult $5, $23, $1
2500 zapnot $2, 15, $5
2501 addq $1, $6, $6
2502 addq $3, $6, $6
2503 addq $24, $6, $24
2504 cmpult $24, $6, $23
2505 srl $4, 32, $6
2506 mulq $5, $6, $25
2507 mulq $7, $5, $2
2508 addq $0, $25, $0
2509 cmpult $0, $25, $1
2510 mulq $6, $8, $6
2511 beq $1, $421
2512 sll $20, 32, $1
2513 addq $6, $1, $6
2514$421:
2515 sll $0, 32, $25
2516 addq $2, $25, $2
2517 bis $2, $2, $7
2518 addq $22, $7, $22
2519 stq $22, 104($16)
2520 ldq $4, 56($17)
2521 ldq $5, 56($18)
2522 cmpult $22, $7, $3
2523 zapnot $4, 15, $7
2524 srl $5, 32, $8
2525 mulq $8, $7, $28
2526 srl $0, 32, $1
2527 cmpult $2, $25, $2
2528 addq $6, $1, $6
2529 addq $2, $6, $6
2530 addq $3, $6, $6
2531 addq $24, $6, $24
2532 cmpult $24, $6, $1
2533 srl $4, 32, $6
2534 zapnot $5, 15, $5
2535 mulq $5, $6, $22
2536 mulq $7, $5, $2
2537 addq $1, $23, $23
2538 addq $28, $22, $28
2539 cmpult $28, $22, $1
2540 mulq $6, $8, $3
2541 beq $1, $425
2542 sll $20, 32, $1
2543 addq $3, $1, $3
2544$425:
2545 sll $28, 32, $22
2546 srl $28, 32, $1
2547 addq $2, $22, $2
2548 addq $3, $1, $3
2549 bis $2, $2, $7
2550 addq $24, $7, $24
2551 cmpult $7, $22, $1
2552 cmpult $24, $7, $2
2553 addq $1, $3, $6
2554 addq $2, $6, $6
2555 stq $24, 112($16)
2556 addq $23, $6, $23
2557 stq $23, 120($16)
2558 ret $31, ($26), 1
2559 .end bn_mul_comba8
2560 .text
2561 .align 3
2562 .globl bn_sqr_comba4
2563 .ent bn_sqr_comba4
2564bn_sqr_comba4:
2565bn_sqr_comba4..ng:
2566 .frame $30,0,$26,0
2567 .prologue 0
2568
2569 ldq $0, 0($17)
2570 ldq $1, 8($17)
2571 ldq $2, 16($17)
2572 ldq $3, 24($17)
2573 bis $31, $31, $6
2574 mulq $0, $0, $4
2575 umulh $0, $0, $5
2576 stq $4, 0($16)
2577 bis $31, $31, $4
2578 mulq $0, $1, $7
2579 umulh $0, $1, $8
2580 cmplt $7, $31, $22
2581 cmplt $8, $31, $23
2582 addq $7, $7, $7
2583 addq $8, $8, $8
2584 addq $8, $22, $8
2585 addq $4, $23, $4
2586 addq $5, $7, $5
2587 addq $6, $8, $6
2588 cmpult $5, $7, $24
2589 cmpult $6, $8, $25
2590 addq $6, $24, $6
2591 addq $4, $25, $4
2592 stq $5, 8($16)
2593 bis $31, $31, $5
2594 mulq $1, $1, $27
2595 umulh $1, $1, $28
2596 addq $6, $27, $6
2597 addq $4, $28, $4
2598 cmpult $6, $27, $21
2599 cmpult $4, $28, $20
2600 addq $4, $21, $4
2601 addq $5, $20, $5
2602 mulq $2, $0, $19
2603 umulh $2, $0, $18
2604 cmplt $19, $31, $17
2605 cmplt $18, $31, $22
2606 addq $19, $19, $19
2607 addq $18, $18, $18
2608 addq $18, $17, $18
2609 addq $5, $22, $5
2610 addq $6, $19, $6
2611 addq $4, $18, $4
2612 cmpult $6, $19, $23
2613 cmpult $4, $18, $7
2614 addq $4, $23, $4
2615 addq $5, $7, $5
2616 stq $6, 16($16)
2617 bis $31, $31, $6
2618 mulq $3, $0, $8
2619 umulh $3, $0, $24
2620 cmplt $8, $31, $25
2621 cmplt $24, $31, $27
2622 addq $8, $8, $8
2623 addq $24, $24, $24
2624 addq $24, $25, $24
2625 addq $6, $27, $6
2626 addq $4, $8, $4
2627 addq $5, $24, $5
2628 cmpult $4, $8, $28
2629 cmpult $5, $24, $21
2630 addq $5, $28, $5
2631 addq $6, $21, $6
2632 mulq $2, $1, $20
2633 umulh $2, $1, $17
2634 cmplt $20, $31, $22
2635 cmplt $17, $31, $19
2636 addq $20, $20, $20
2637 addq $17, $17, $17
2638 addq $17, $22, $17
2639 addq $6, $19, $6
2640 addq $4, $20, $4
2641 addq $5, $17, $5
2642 cmpult $4, $20, $18
2643 cmpult $5, $17, $23
2644 addq $5, $18, $5
2645 addq $6, $23, $6
2646 stq $4, 24($16)
2647 bis $31, $31, $4
2648 mulq $2, $2, $7
2649 umulh $2, $2, $25
2650 addq $5, $7, $5
2651 addq $6, $25, $6
2652 cmpult $5, $7, $27
2653 cmpult $6, $25, $8
2654 addq $6, $27, $6
2655 addq $4, $8, $4
2656 mulq $3, $1, $24
2657 umulh $3, $1, $28
2658 cmplt $24, $31, $21
2659 cmplt $28, $31, $22
2660 addq $24, $24, $24
2661 addq $28, $28, $28
2662 addq $28, $21, $28
2663 addq $4, $22, $4
2664 addq $5, $24, $5
2665 addq $6, $28, $6
2666 cmpult $5, $24, $19
2667 cmpult $6, $28, $20
2668 addq $6, $19, $6
2669 addq $4, $20, $4
2670 stq $5, 32($16)
2671 bis $31, $31, $5
2672 mulq $3, $2, $17
2673 umulh $3, $2, $18
2674 cmplt $17, $31, $23
2675 cmplt $18, $31, $7
2676 addq $17, $17, $17
2677 addq $18, $18, $18
2678 addq $18, $23, $18
2679 addq $5, $7, $5
2680 addq $6, $17, $6
2681 addq $4, $18, $4
2682 cmpult $6, $17, $25
2683 cmpult $4, $18, $27
2684 addq $4, $25, $4
2685 addq $5, $27, $5
2686 stq $6, 40($16)
2687 bis $31, $31, $6
2688 mulq $3, $3, $8
2689 umulh $3, $3, $21
2690 addq $4, $8, $4
2691 addq $5, $21, $5
2692 cmpult $4, $8, $22
2693 cmpult $5, $21, $24
2694 addq $5, $22, $5
2695 addq $6, $24, $6
2696 stq $4, 48($16)
2697 stq $5, 56($16)
2698 ret $31,($26),1
2699 .end bn_sqr_comba4
2700 .text
2701 .align 3
2702 .globl bn_sqr_comba8
2703 .ent bn_sqr_comba8
2704bn_sqr_comba8:
2705bn_sqr_comba8..ng:
2706 .frame $30,0,$26,0
2707 .prologue 0
344 2708
2709 ldq $0, 0($17)
2710 ldq $1, 8($17)
2711 ldq $2, 16($17)
2712 ldq $3, 24($17)
2713 ldq $4, 32($17)
2714 ldq $5, 40($17)
2715 ldq $6, 48($17)
2716 ldq $7, 56($17)
2717 bis $31, $31, $23
2718 mulq $0, $0, $8
2719 umulh $0, $0, $22
2720 stq $8, 0($16)
2721 bis $31, $31, $8
2722 mulq $1, $0, $24
2723 umulh $1, $0, $25
2724 cmplt $24, $31, $27
2725 cmplt $25, $31, $28
2726 addq $24, $24, $24
2727 addq $25, $25, $25
2728 addq $25, $27, $25
2729 addq $8, $28, $8
2730 addq $22, $24, $22
2731 addq $23, $25, $23
2732 cmpult $22, $24, $21
2733 cmpult $23, $25, $20
2734 addq $23, $21, $23
2735 addq $8, $20, $8
2736 stq $22, 8($16)
2737 bis $31, $31, $22
2738 mulq $1, $1, $19
2739 umulh $1, $1, $18
2740 addq $23, $19, $23
2741 addq $8, $18, $8
2742 cmpult $23, $19, $17
2743 cmpult $8, $18, $27
2744 addq $8, $17, $8
2745 addq $22, $27, $22
2746 mulq $2, $0, $28
2747 umulh $2, $0, $24
2748 cmplt $28, $31, $25
2749 cmplt $24, $31, $21
2750 addq $28, $28, $28
2751 addq $24, $24, $24
2752 addq $24, $25, $24
2753 addq $22, $21, $22
2754 addq $23, $28, $23
2755 addq $8, $24, $8
2756 cmpult $23, $28, $20
2757 cmpult $8, $24, $19
2758 addq $8, $20, $8
2759 addq $22, $19, $22
2760 stq $23, 16($16)
2761 bis $31, $31, $23
2762 mulq $2, $1, $18
2763 umulh $2, $1, $17
2764 cmplt $18, $31, $27
2765 cmplt $17, $31, $25
2766 addq $18, $18, $18
2767 addq $17, $17, $17
2768 addq $17, $27, $17
2769 addq $23, $25, $23
2770 addq $8, $18, $8
2771 addq $22, $17, $22
2772 cmpult $8, $18, $21
2773 cmpult $22, $17, $28
2774 addq $22, $21, $22
2775 addq $23, $28, $23
2776 mulq $3, $0, $24
2777 umulh $3, $0, $20
2778 cmplt $24, $31, $19
2779 cmplt $20, $31, $27
2780 addq $24, $24, $24
2781 addq $20, $20, $20
2782 addq $20, $19, $20
2783 addq $23, $27, $23
2784 addq $8, $24, $8
2785 addq $22, $20, $22
2786 cmpult $8, $24, $25
2787 cmpult $22, $20, $18
2788 addq $22, $25, $22
2789 addq $23, $18, $23
2790 stq $8, 24($16)
2791 bis $31, $31, $8
2792 mulq $2, $2, $17
2793 umulh $2, $2, $21
2794 addq $22, $17, $22
2795 addq $23, $21, $23
2796 cmpult $22, $17, $28
2797 cmpult $23, $21, $19
2798 addq $23, $28, $23
2799 addq $8, $19, $8
2800 mulq $3, $1, $27
2801 umulh $3, $1, $24
2802 cmplt $27, $31, $20
2803 cmplt $24, $31, $25
2804 addq $27, $27, $27
2805 addq $24, $24, $24
2806 addq $24, $20, $24
2807 addq $8, $25, $8
2808 addq $22, $27, $22
2809 addq $23, $24, $23
2810 cmpult $22, $27, $18
2811 cmpult $23, $24, $17
2812 addq $23, $18, $23
2813 addq $8, $17, $8
2814 mulq $4, $0, $21
2815 umulh $4, $0, $28
2816 cmplt $21, $31, $19
2817 cmplt $28, $31, $20
2818 addq $21, $21, $21
2819 addq $28, $28, $28
2820 addq $28, $19, $28
2821 addq $8, $20, $8
2822 addq $22, $21, $22
2823 addq $23, $28, $23
2824 cmpult $22, $21, $25
2825 cmpult $23, $28, $27
2826 addq $23, $25, $23
2827 addq $8, $27, $8
2828 stq $22, 32($16)
2829 bis $31, $31, $22
2830 mulq $3, $2, $24
2831 umulh $3, $2, $18
2832 cmplt $24, $31, $17
2833 cmplt $18, $31, $19
2834 addq $24, $24, $24
2835 addq $18, $18, $18
2836 addq $18, $17, $18
2837 addq $22, $19, $22
2838 addq $23, $24, $23
2839 addq $8, $18, $8
2840 cmpult $23, $24, $20
2841 cmpult $8, $18, $21
2842 addq $8, $20, $8
2843 addq $22, $21, $22
2844 mulq $4, $1, $28
2845 umulh $4, $1, $25
2846 cmplt $28, $31, $27
2847 cmplt $25, $31, $17
2848 addq $28, $28, $28
2849 addq $25, $25, $25
2850 addq $25, $27, $25
2851 addq $22, $17, $22
2852 addq $23, $28, $23
2853 addq $8, $25, $8
2854 cmpult $23, $28, $19
2855 cmpult $8, $25, $24
2856 addq $8, $19, $8
2857 addq $22, $24, $22
2858 mulq $5, $0, $18
2859 umulh $5, $0, $20
2860 cmplt $18, $31, $21
2861 cmplt $20, $31, $27
2862 addq $18, $18, $18
2863 addq $20, $20, $20
2864 addq $20, $21, $20
2865 addq $22, $27, $22
2866 addq $23, $18, $23
2867 addq $8, $20, $8
2868 cmpult $23, $18, $17
2869 cmpult $8, $20, $28
2870 addq $8, $17, $8
2871 addq $22, $28, $22
2872 stq $23, 40($16)
2873 bis $31, $31, $23
2874 mulq $3, $3, $25
2875 umulh $3, $3, $19
2876 addq $8, $25, $8
2877 addq $22, $19, $22
2878 cmpult $8, $25, $24
2879 cmpult $22, $19, $21
2880 addq $22, $24, $22
2881 addq $23, $21, $23
2882 mulq $4, $2, $27
2883 umulh $4, $2, $18
2884 cmplt $27, $31, $20
2885 cmplt $18, $31, $17
2886 addq $27, $27, $27
2887 addq $18, $18, $18
2888 addq $18, $20, $18
2889 addq $23, $17, $23
2890 addq $8, $27, $8
2891 addq $22, $18, $22
2892 cmpult $8, $27, $28
2893 cmpult $22, $18, $25
2894 addq $22, $28, $22
2895 addq $23, $25, $23
2896 mulq $5, $1, $19
2897 umulh $5, $1, $24
2898 cmplt $19, $31, $21
2899 cmplt $24, $31, $20
2900 addq $19, $19, $19
2901 addq $24, $24, $24
2902 addq $24, $21, $24
2903 addq $23, $20, $23
2904 addq $8, $19, $8
2905 addq $22, $24, $22
2906 cmpult $8, $19, $17
2907 cmpult $22, $24, $27
2908 addq $22, $17, $22
2909 addq $23, $27, $23
2910 mulq $6, $0, $18
2911 umulh $6, $0, $28
2912 cmplt $18, $31, $25
2913 cmplt $28, $31, $21
2914 addq $18, $18, $18
2915 addq $28, $28, $28
2916 addq $28, $25, $28
2917 addq $23, $21, $23
2918 addq $8, $18, $8
2919 addq $22, $28, $22
2920 cmpult $8, $18, $20
2921 cmpult $22, $28, $19
2922 addq $22, $20, $22
2923 addq $23, $19, $23
2924 stq $8, 48($16)
2925 bis $31, $31, $8
2926 mulq $4, $3, $24
2927 umulh $4, $3, $17
2928 cmplt $24, $31, $27
2929 cmplt $17, $31, $25
2930 addq $24, $24, $24
2931 addq $17, $17, $17
2932 addq $17, $27, $17
2933 addq $8, $25, $8
2934 addq $22, $24, $22
2935 addq $23, $17, $23
2936 cmpult $22, $24, $21
2937 cmpult $23, $17, $18
2938 addq $23, $21, $23
2939 addq $8, $18, $8
2940 mulq $5, $2, $28
2941 umulh $5, $2, $20
2942 cmplt $28, $31, $19
2943 cmplt $20, $31, $27
2944 addq $28, $28, $28
2945 addq $20, $20, $20
2946 addq $20, $19, $20
2947 addq $8, $27, $8
2948 addq $22, $28, $22
2949 addq $23, $20, $23
2950 cmpult $22, $28, $25
2951 cmpult $23, $20, $24
2952 addq $23, $25, $23
2953 addq $8, $24, $8
2954 mulq $6, $1, $17
2955 umulh $6, $1, $21
2956 cmplt $17, $31, $18
2957 cmplt $21, $31, $19
2958 addq $17, $17, $17
2959 addq $21, $21, $21
2960 addq $21, $18, $21
2961 addq $8, $19, $8
2962 addq $22, $17, $22
2963 addq $23, $21, $23
2964 cmpult $22, $17, $27
2965 cmpult $23, $21, $28
2966 addq $23, $27, $23
2967 addq $8, $28, $8
2968 mulq $7, $0, $20
2969 umulh $7, $0, $25
2970 cmplt $20, $31, $24
2971 cmplt $25, $31, $18
2972 addq $20, $20, $20
2973 addq $25, $25, $25
2974 addq $25, $24, $25
2975 addq $8, $18, $8
2976 addq $22, $20, $22
2977 addq $23, $25, $23
2978 cmpult $22, $20, $19
2979 cmpult $23, $25, $17
2980 addq $23, $19, $23
2981 addq $8, $17, $8
2982 stq $22, 56($16)
2983 bis $31, $31, $22
2984 mulq $4, $4, $21
2985 umulh $4, $4, $27
2986 addq $23, $21, $23
2987 addq $8, $27, $8
2988 cmpult $23, $21, $28
2989 cmpult $8, $27, $24
2990 addq $8, $28, $8
2991 addq $22, $24, $22
2992 mulq $5, $3, $18
2993 umulh $5, $3, $20
2994 cmplt $18, $31, $25
2995 cmplt $20, $31, $19
2996 addq $18, $18, $18
2997 addq $20, $20, $20
2998 addq $20, $25, $20
2999 addq $22, $19, $22
3000 addq $23, $18, $23
3001 addq $8, $20, $8
3002 cmpult $23, $18, $17
3003 cmpult $8, $20, $21
3004 addq $8, $17, $8
3005 addq $22, $21, $22
3006 mulq $6, $2, $27
3007 umulh $6, $2, $28
3008 cmplt $27, $31, $24
3009 cmplt $28, $31, $25
3010 addq $27, $27, $27
3011 addq $28, $28, $28
3012 addq $28, $24, $28
3013 addq $22, $25, $22
3014 addq $23, $27, $23
3015 addq $8, $28, $8
3016 cmpult $23, $27, $19
3017 cmpult $8, $28, $18
3018 addq $8, $19, $8
3019 addq $22, $18, $22
3020 mulq $7, $1, $20
3021 umulh $7, $1, $17
3022 cmplt $20, $31, $21
3023 cmplt $17, $31, $24
3024 addq $20, $20, $20
3025 addq $17, $17, $17
3026 addq $17, $21, $17
3027 addq $22, $24, $22
3028 addq $23, $20, $23
3029 addq $8, $17, $8
3030 cmpult $23, $20, $25
3031 cmpult $8, $17, $27
3032 addq $8, $25, $8
3033 addq $22, $27, $22
3034 stq $23, 64($16)
3035 bis $31, $31, $23
3036 mulq $5, $4, $28
3037 umulh $5, $4, $19
3038 cmplt $28, $31, $18
3039 cmplt $19, $31, $21
3040 addq $28, $28, $28
3041 addq $19, $19, $19
3042 addq $19, $18, $19
3043 addq $23, $21, $23
3044 addq $8, $28, $8
3045 addq $22, $19, $22
3046 cmpult $8, $28, $24
3047 cmpult $22, $19, $20
3048 addq $22, $24, $22
3049 addq $23, $20, $23
3050 mulq $6, $3, $17
3051 umulh $6, $3, $25
3052 cmplt $17, $31, $27
3053 cmplt $25, $31, $18
3054 addq $17, $17, $17
3055 addq $25, $25, $25
3056 addq $25, $27, $25
3057 addq $23, $18, $23
3058 addq $8, $17, $8
3059 addq $22, $25, $22
3060 cmpult $8, $17, $21
3061 cmpult $22, $25, $28
3062 addq $22, $21, $22
3063 addq $23, $28, $23
3064 mulq $7, $2, $19
3065 umulh $7, $2, $24
3066 cmplt $19, $31, $20
3067 cmplt $24, $31, $27
3068 addq $19, $19, $19
3069 addq $24, $24, $24
3070 addq $24, $20, $24
3071 addq $23, $27, $23
3072 addq $8, $19, $8
3073 addq $22, $24, $22
3074 cmpult $8, $19, $18
3075 cmpult $22, $24, $17
3076 addq $22, $18, $22
3077 addq $23, $17, $23
3078 stq $8, 72($16)
3079 bis $31, $31, $8
3080 mulq $5, $5, $25
3081 umulh $5, $5, $21
3082 addq $22, $25, $22
3083 addq $23, $21, $23
3084 cmpult $22, $25, $28
3085 cmpult $23, $21, $20
3086 addq $23, $28, $23
3087 addq $8, $20, $8
3088 mulq $6, $4, $27
3089 umulh $6, $4, $19
3090 cmplt $27, $31, $24
3091 cmplt $19, $31, $18
3092 addq $27, $27, $27
3093 addq $19, $19, $19
3094 addq $19, $24, $19
3095 addq $8, $18, $8
3096 addq $22, $27, $22
3097 addq $23, $19, $23
3098 cmpult $22, $27, $17
3099 cmpult $23, $19, $25
3100 addq $23, $17, $23
3101 addq $8, $25, $8
3102 mulq $7, $3, $21
3103 umulh $7, $3, $28
3104 cmplt $21, $31, $20
3105 cmplt $28, $31, $24
3106 addq $21, $21, $21
3107 addq $28, $28, $28
3108 addq $28, $20, $28
3109 addq $8, $24, $8
3110 addq $22, $21, $22
3111 addq $23, $28, $23
3112 cmpult $22, $21, $18
3113 cmpult $23, $28, $27
3114 addq $23, $18, $23
3115 addq $8, $27, $8
3116 stq $22, 80($16)
3117 bis $31, $31, $22
3118 mulq $6, $5, $19
3119 umulh $6, $5, $17
3120 cmplt $19, $31, $25
3121 cmplt $17, $31, $20
3122 addq $19, $19, $19
3123 addq $17, $17, $17
3124 addq $17, $25, $17
3125 addq $22, $20, $22
3126 addq $23, $19, $23
3127 addq $8, $17, $8
3128 cmpult $23, $19, $24
3129 cmpult $8, $17, $21
3130 addq $8, $24, $8
3131 addq $22, $21, $22
3132 mulq $7, $4, $28
3133 umulh $7, $4, $18
3134 cmplt $28, $31, $27
3135 cmplt $18, $31, $25
3136 addq $28, $28, $28
3137 addq $18, $18, $18
3138 addq $18, $27, $18
3139 addq $22, $25, $22
3140 addq $23, $28, $23
3141 addq $8, $18, $8
3142 cmpult $23, $28, $20
3143 cmpult $8, $18, $19
3144 addq $8, $20, $8
3145 addq $22, $19, $22
3146 stq $23, 88($16)
3147 bis $31, $31, $23
3148 mulq $6, $6, $17
3149 umulh $6, $6, $24
3150 addq $8, $17, $8
3151 addq $22, $24, $22
3152 cmpult $8, $17, $21
3153 cmpult $22, $24, $27
3154 addq $22, $21, $22
3155 addq $23, $27, $23
3156 mulq $7, $5, $25
3157 umulh $7, $5, $28
3158 cmplt $25, $31, $18
3159 cmplt $28, $31, $20
3160 addq $25, $25, $25
3161 addq $28, $28, $28
3162 addq $28, $18, $28
3163 addq $23, $20, $23
3164 addq $8, $25, $8
3165 addq $22, $28, $22
3166 cmpult $8, $25, $19
3167 cmpult $22, $28, $17
3168 addq $22, $19, $22
3169 addq $23, $17, $23
3170 stq $8, 96($16)
3171 bis $31, $31, $8
3172 mulq $7, $6, $24
3173 umulh $7, $6, $21
3174 cmplt $24, $31, $27
3175 cmplt $21, $31, $18
3176 addq $24, $24, $24
3177 addq $21, $21, $21
3178 addq $21, $27, $21
3179 addq $8, $18, $8
3180 addq $22, $24, $22
3181 addq $23, $21, $23
3182 cmpult $22, $24, $20
3183 cmpult $23, $21, $25
3184 addq $23, $20, $23
3185 addq $8, $25, $8
3186 stq $22, 104($16)
3187 bis $31, $31, $22
3188 mulq $7, $7, $28
3189 umulh $7, $7, $19
3190 addq $23, $28, $23
3191 addq $8, $19, $8
3192 cmpult $23, $28, $17
3193 cmpult $8, $19, $27
3194 addq $8, $17, $8
3195 addq $22, $27, $22
3196 stq $23, 112($16)
3197 stq $8, 120($16)
3198 ret $31,($26),1
3199 .end bn_sqr_comba8
diff --git a/src/lib/libcrypto/bn/asm/mips3.s b/src/lib/libcrypto/bn/asm/mips3.s
index 191345d920..dca4105c7d 100644
--- a/src/lib/libcrypto/bn/asm/mips3.s
+++ b/src/lib/libcrypto/bn/asm/mips3.s
@@ -1,5 +1,5 @@
1.rdata 1.rdata
2.asciiz "mips3.s, Version 1.0" 2.asciiz "mips3.s, Version 1.1"
3.asciiz "MIPS III/IV ISA artwork by Andy Polyakov <appro@fy.chalmers.se>" 3.asciiz "MIPS III/IV ISA artwork by Andy Polyakov <appro@fy.chalmers.se>"
4 4
5/* 5/*
@@ -395,32 +395,32 @@ LEAF(bn_add_words)
395 395
396.L_bn_add_words_loop: 396.L_bn_add_words_loop:
397 ld ta0,0(a2) 397 ld ta0,0(a2)
398 subu a3,4
398 ld t1,8(a1) 399 ld t1,8(a1)
399 ld ta1,8(a2) 400 and AT,a3,MINUS4
400 ld t2,16(a1) 401 ld t2,16(a1)
401 ld ta2,16(a2) 402 PTR_ADD a2,32
402 ld t3,24(a1) 403 ld t3,24(a1)
403 ld ta3,24(a2) 404 PTR_ADD a0,32
405 ld ta1,-24(a2)
406 PTR_ADD a1,32
407 ld ta2,-16(a2)
408 ld ta3,-8(a2)
404 daddu ta0,t0 409 daddu ta0,t0
405 subu a3,4
406 sltu t8,ta0,t0 410 sltu t8,ta0,t0
407 daddu t0,ta0,v0 411 daddu t0,ta0,v0
408 PTR_ADD a0,32
409 sltu v0,t0,ta0 412 sltu v0,t0,ta0
410 sd t0,-32(a0) 413 sd t0,-32(a0)
411 daddu v0,t8 414 daddu v0,t8
412 415
413 daddu ta1,t1 416 daddu ta1,t1
414 PTR_ADD a1,32
415 sltu t9,ta1,t1 417 sltu t9,ta1,t1
416 daddu t1,ta1,v0 418 daddu t1,ta1,v0
417 PTR_ADD a2,32
418 sltu v0,t1,ta1 419 sltu v0,t1,ta1
419 sd t1,-24(a0) 420 sd t1,-24(a0)
420 daddu v0,t9 421 daddu v0,t9
421 422
422 daddu ta2,t2 423 daddu ta2,t2
423 and AT,a3,MINUS4
424 sltu t8,ta2,t2 424 sltu t8,ta2,t2
425 daddu t2,ta2,v0 425 daddu t2,ta2,v0
426 sltu v0,t2,ta2 426 sltu v0,t2,ta2
@@ -495,25 +495,26 @@ LEAF(bn_sub_words)
495 495
496.L_bn_sub_words_loop: 496.L_bn_sub_words_loop:
497 ld ta0,0(a2) 497 ld ta0,0(a2)
498 subu a3,4
498 ld t1,8(a1) 499 ld t1,8(a1)
499 ld ta1,8(a2) 500 and AT,a3,MINUS4
500 ld t2,16(a1) 501 ld t2,16(a1)
501 ld ta2,16(a2) 502 PTR_ADD a2,32
502 ld t3,24(a1) 503 ld t3,24(a1)
503 ld ta3,24(a2) 504 PTR_ADD a0,32
505 ld ta1,-24(a2)
506 PTR_ADD a1,32
507 ld ta2,-16(a2)
508 ld ta3,-8(a2)
504 sltu t8,t0,ta0 509 sltu t8,t0,ta0
505 dsubu t0,ta0 510 dsubu t0,ta0
506 subu a3,4
507 dsubu ta0,t0,v0 511 dsubu ta0,t0,v0
508 and AT,a3,MINUS4 512 sd ta0,-32(a0)
509 sd ta0,0(a0)
510 MOVNZ (t0,v0,t8) 513 MOVNZ (t0,v0,t8)
511 514
512 sltu t9,t1,ta1 515 sltu t9,t1,ta1
513 dsubu t1,ta1 516 dsubu t1,ta1
514 PTR_ADD a0,32
515 dsubu ta1,t1,v0 517 dsubu ta1,t1,v0
516 PTR_ADD a1,32
517 sd ta1,-24(a0) 518 sd ta1,-24(a0)
518 MOVNZ (t1,v0,t9) 519 MOVNZ (t1,v0,t9)
519 520
@@ -521,7 +522,6 @@ LEAF(bn_sub_words)
521 sltu t8,t2,ta2 522 sltu t8,t2,ta2
522 dsubu t2,ta2 523 dsubu t2,ta2
523 dsubu ta2,t2,v0 524 dsubu ta2,t2,v0
524 PTR_ADD a2,32
525 sd ta2,-16(a0) 525 sd ta2,-16(a0)
526 MOVNZ (t2,v0,t8) 526 MOVNZ (t2,v0,t8)
527 527
@@ -574,6 +574,51 @@ END(bn_sub_words)
574 574
575#undef MINUS4 575#undef MINUS4
576 576
577.align 5
578LEAF(bn_div_3_words)
579 .set reorder
580 move a3,a0 /* we know that bn_div_words doesn't
581 * touch a3, ta2, ta3 and preserves a2
582 * so that we can save two arguments
583 * and return address in registers
584 * instead of stack:-)
585 */
586 ld a0,(a3)
587 move ta2,a1
588 ld a1,-8(a3)
589 bne a0,a2,.L_bn_div_3_words_proceed
590 li v0,-1
591 jr ra
592.L_bn_div_3_words_proceed:
593 move ta3,ra
594 bal bn_div_words
595 move ra,ta3
596 dmultu ta2,v0
597 ld t2,-16(a3)
598 move ta0,zero
599 mfhi t1
600 mflo t0
601 sltu t8,t1,v1
602.L_bn_div_3_words_inner_loop:
603 bnez t8,.L_bn_div_3_words_inner_loop_done
604 sgeu AT,t2,t0
605 seq t9,t1,v1
606 and AT,t9
607 sltu t3,t0,ta2
608 daddu v1,a2
609 dsubu t1,t3
610 dsubu t0,ta2
611 sltu t8,t1,v1
612 sltu ta0,v1,a2
613 or t8,ta0
614 .set noreorder
615 beqzl AT,.L_bn_div_3_words_inner_loop
616 dsubu v0,1
617 .set reorder
618.L_bn_div_3_words_inner_loop_done:
619 jr ra
620END(bn_div_3_words)
621
577.align 5 622.align 5
578LEAF(bn_div_words) 623LEAF(bn_div_words)
579 .set noreorder 624 .set noreorder
@@ -633,16 +678,16 @@ LEAF(bn_div_words)
633 seq t8,HH,t1 678 seq t8,HH,t1
634 sltu AT,HH,t1 679 sltu AT,HH,t1
635 and t2,t8 680 and t2,t8
681 sltu v0,t0,a2
636 or AT,t2 682 or AT,t2
637 .set noreorder 683 .set noreorder
638 beqz AT,.L_bn_div_words_inner_loop1_done 684 beqz AT,.L_bn_div_words_inner_loop1_done
639 sltu t2,t0,a2 685 dsubu t1,v0
640 .set reorder
641 dsubu QT,1
642 dsubu t0,a2 686 dsubu t0,a2
643 dsubu t1,t2
644 b .L_bn_div_words_inner_loop1 687 b .L_bn_div_words_inner_loop1
645.L_bn_div_words_inner_loop1_done: 688 dsubu QT,1
689 .set reorder
690.L_bn_div_words_inner_loop1_done:
646 691
647 dsll a1,32 692 dsll a1,32
648 dsubu a0,t3,t0 693 dsubu a0,t3,t0
@@ -655,6 +700,7 @@ LEAF(bn_div_words)
655 ddivu zero,a0,DH 700 ddivu zero,a0,DH
656 mflo QT 701 mflo QT
657.L_bn_div_words_skip_div2: 702.L_bn_div_words_skip_div2:
703#undef DH
658 dmultu a2,QT 704 dmultu a2,QT
659 dsll t3,a0,32 705 dsll t3,a0,32
660 dsrl AT,a1,32 706 dsrl AT,a1,32
@@ -666,69 +712,26 @@ LEAF(bn_div_words)
666 seq t8,HH,t1 712 seq t8,HH,t1
667 sltu AT,HH,t1 713 sltu AT,HH,t1
668 and t2,t8 714 and t2,t8
715 sltu v1,t0,a2
669 or AT,t2 716 or AT,t2
670 .set noreorder 717 .set noreorder
671 beqz AT,.L_bn_div_words_inner_loop2_done 718 beqz AT,.L_bn_div_words_inner_loop2_done
672 sltu t2,t0,a2 719 dsubu t1,v1
673 .set reorder
674 dsubu QT,1
675 dsubu t0,a2 720 dsubu t0,a2
676 dsubu t1,t2
677 b .L_bn_div_words_inner_loop2 721 b .L_bn_div_words_inner_loop2
722 dsubu QT,1
723 .set reorder
678.L_bn_div_words_inner_loop2_done: 724.L_bn_div_words_inner_loop2_done:
725#undef HH
679 726
680 dsubu a0,t3,t0 727 dsubu a0,t3,t0
681 or v0,QT 728 or v0,QT
682 dsrl v1,a0,t9 /* v1 contains remainder if anybody wants it */ 729 dsrl v1,a0,t9 /* v1 contains remainder if anybody wants it */
683 dsrl a2,t9 /* restore a2 */ 730 dsrl a2,t9 /* restore a2 */
684 jr ra 731 jr ra
685#undef HH
686#undef DH
687#undef QT 732#undef QT
688END(bn_div_words) 733END(bn_div_words)
689 734
690.align 5
691LEAF(bn_div_3_words)
692 .set reorder
693 move a3,a0 /* we know that bn_div_words doesn't
694 * touch a3, ta2, ta3 and preserves a2
695 * so that we can save two arguments
696 * and return address in registers
697 * instead of stack:-)
698 */
699 ld a0,(a3)
700 move ta2,a2
701 move a2,a1
702 ld a1,-8(a3)
703 move ta3,ra
704 move v1,zero
705 li v0,-1
706 beq a0,a2,.L_bn_div_3_words_skip_div
707 jal bn_div_words
708 move ra,ta3
709.L_bn_div_3_words_skip_div:
710 dmultu ta2,v0
711 ld t2,-16(a3)
712 mflo t0
713 mfhi t1
714.L_bn_div_3_words_inner_loop:
715 sgeu AT,t2,t0
716 seq t9,t1,v1
717 sltu t8,t1,v1
718 and AT,t9
719 or AT,t8
720 bnez AT,.L_bn_div_3_words_inner_loop_done
721 daddu v1,a2
722 sltu t3,t0,ta2
723 sltu AT,v1,a2
724 dsubu v0,1
725 dsubu t0,ta2
726 dsubu t1,t3
727 beqz AT,.L_bn_div_3_words_inner_loop
728.L_bn_div_3_words_inner_loop_done:
729 jr ra
730END(bn_div_3_words)
731
732#define a_0 t0 735#define a_0 t0
733#define a_1 t1 736#define a_1 t1
734#define a_2 t2 737#define a_2 t2
@@ -846,6 +849,7 @@ LEAF(bn_mul_comba8)
846 sltu AT,c_1,t_1 849 sltu AT,c_1,t_1
847 daddu t_2,AT 850 daddu t_2,AT
848 daddu c_2,t_2 851 daddu c_2,t_2
852 sltu c_3,c_2,t_2
849 dmultu a_1,b_2 /* mul_add_c(a[1],b[2],c1,c2,c3); */ 853 dmultu a_1,b_2 /* mul_add_c(a[1],b[2],c1,c2,c3); */
850 mflo t_1 854 mflo t_1
851 mfhi t_2 855 mfhi t_2
@@ -853,7 +857,8 @@ LEAF(bn_mul_comba8)
853 sltu AT,c_1,t_1 857 sltu AT,c_1,t_1
854 daddu t_2,AT 858 daddu t_2,AT
855 daddu c_2,t_2 859 daddu c_2,t_2
856 sltu c_3,c_2,t_2 860 sltu AT,c_2,t_2
861 daddu c_3,AT
857 dmultu a_2,b_1 /* mul_add_c(a[2],b[1],c1,c2,c3); */ 862 dmultu a_2,b_1 /* mul_add_c(a[2],b[1],c1,c2,c3); */
858 mflo t_1 863 mflo t_1
859 mfhi t_2 864 mfhi t_2
@@ -881,6 +886,7 @@ LEAF(bn_mul_comba8)
881 sltu AT,c_2,t_1 886 sltu AT,c_2,t_1
882 daddu t_2,AT 887 daddu t_2,AT
883 daddu c_3,t_2 888 daddu c_3,t_2
889 sltu c_1,c_3,t_2
884 dmultu a_3,b_1 /* mul_add_c(a[3],b[1],c2,c3,c1); */ 890 dmultu a_3,b_1 /* mul_add_c(a[3],b[1],c2,c3,c1); */
885 mflo t_1 891 mflo t_1
886 mfhi t_2 892 mfhi t_2
@@ -888,7 +894,8 @@ LEAF(bn_mul_comba8)
888 sltu AT,c_2,t_1 894 sltu AT,c_2,t_1
889 daddu t_2,AT 895 daddu t_2,AT
890 daddu c_3,t_2 896 daddu c_3,t_2
891 sltu c_1,c_3,t_2 897 sltu AT,c_3,t_2
898 daddu c_1,AT
892 dmultu a_2,b_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */ 899 dmultu a_2,b_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */
893 mflo t_1 900 mflo t_1
894 mfhi t_2 901 mfhi t_2
@@ -925,6 +932,7 @@ LEAF(bn_mul_comba8)
925 sltu AT,c_3,t_1 932 sltu AT,c_3,t_1
926 daddu t_2,AT 933 daddu t_2,AT
927 daddu c_1,t_2 934 daddu c_1,t_2
935 sltu c_2,c_1,t_2
928 dmultu a_1,b_4 /* mul_add_c(a[1],b[4],c3,c1,c2); */ 936 dmultu a_1,b_4 /* mul_add_c(a[1],b[4],c3,c1,c2); */
929 mflo t_1 937 mflo t_1
930 mfhi t_2 938 mfhi t_2
@@ -932,7 +940,8 @@ LEAF(bn_mul_comba8)
932 sltu AT,c_3,t_1 940 sltu AT,c_3,t_1
933 daddu t_2,AT 941 daddu t_2,AT
934 daddu c_1,t_2 942 daddu c_1,t_2
935 sltu c_2,c_1,t_2 943 sltu AT,c_1,t_2
944 daddu c_2,AT
936 dmultu a_2,b_3 /* mul_add_c(a[2],b[3],c3,c1,c2); */ 945 dmultu a_2,b_3 /* mul_add_c(a[2],b[3],c3,c1,c2); */
937 mflo t_1 946 mflo t_1
938 mfhi t_2 947 mfhi t_2
@@ -978,6 +987,7 @@ LEAF(bn_mul_comba8)
978 sltu AT,c_1,t_1 987 sltu AT,c_1,t_1
979 daddu t_2,AT 988 daddu t_2,AT
980 daddu c_2,t_2 989 daddu c_2,t_2
990 sltu c_3,c_2,t_2
981 dmultu a_5,b_1 /* mul_add_c(a[5],b[1],c1,c2,c3); */ 991 dmultu a_5,b_1 /* mul_add_c(a[5],b[1],c1,c2,c3); */
982 mflo t_1 992 mflo t_1
983 mfhi t_2 993 mfhi t_2
@@ -985,7 +995,8 @@ LEAF(bn_mul_comba8)
985 sltu AT,c_1,t_1 995 sltu AT,c_1,t_1
986 daddu t_2,AT 996 daddu t_2,AT
987 daddu c_2,t_2 997 daddu c_2,t_2
988 sltu c_3,c_2,t_2 998 sltu AT,c_2,t_2
999 daddu c_3,AT
989 dmultu a_4,b_2 /* mul_add_c(a[4],b[2],c1,c2,c3); */ 1000 dmultu a_4,b_2 /* mul_add_c(a[4],b[2],c1,c2,c3); */
990 mflo t_1 1001 mflo t_1
991 mfhi t_2 1002 mfhi t_2
@@ -1040,6 +1051,7 @@ LEAF(bn_mul_comba8)
1040 sltu AT,c_2,t_1 1051 sltu AT,c_2,t_1
1041 daddu t_2,AT 1052 daddu t_2,AT
1042 daddu c_3,t_2 1053 daddu c_3,t_2
1054 sltu c_1,c_3,t_2
1043 dmultu a_1,b_6 /* mul_add_c(a[1],b[6],c2,c3,c1); */ 1055 dmultu a_1,b_6 /* mul_add_c(a[1],b[6],c2,c3,c1); */
1044 mflo t_1 1056 mflo t_1
1045 mfhi t_2 1057 mfhi t_2
@@ -1047,7 +1059,8 @@ LEAF(bn_mul_comba8)
1047 sltu AT,c_2,t_1 1059 sltu AT,c_2,t_1
1048 daddu t_2,AT 1060 daddu t_2,AT
1049 daddu c_3,t_2 1061 daddu c_3,t_2
1050 sltu c_1,c_3,t_2 1062 sltu AT,c_3,t_2
1063 daddu c_1,AT
1051 dmultu a_2,b_5 /* mul_add_c(a[2],b[5],c2,c3,c1); */ 1064 dmultu a_2,b_5 /* mul_add_c(a[2],b[5],c2,c3,c1); */
1052 mflo t_1 1065 mflo t_1
1053 mfhi t_2 1066 mfhi t_2
@@ -1111,6 +1124,7 @@ LEAF(bn_mul_comba8)
1111 sltu AT,c_3,t_1 1124 sltu AT,c_3,t_1
1112 daddu t_2,AT 1125 daddu t_2,AT
1113 daddu c_1,t_2 1126 daddu c_1,t_2
1127 sltu c_2,c_1,t_2
1114 dmultu a_6,b_2 /* mul_add_c(a[6],b[2],c3,c1,c2); */ 1128 dmultu a_6,b_2 /* mul_add_c(a[6],b[2],c3,c1,c2); */
1115 mflo t_1 1129 mflo t_1
1116 mfhi t_2 1130 mfhi t_2
@@ -1118,7 +1132,8 @@ LEAF(bn_mul_comba8)
1118 sltu AT,c_3,t_1 1132 sltu AT,c_3,t_1
1119 daddu t_2,AT 1133 daddu t_2,AT
1120 daddu c_1,t_2 1134 daddu c_1,t_2
1121 sltu c_2,c_1,t_2 1135 sltu AT,c_1,t_2
1136 daddu c_2,AT
1122 dmultu a_5,b_3 /* mul_add_c(a[5],b[3],c3,c1,c2); */ 1137 dmultu a_5,b_3 /* mul_add_c(a[5],b[3],c3,c1,c2); */
1123 mflo t_1 1138 mflo t_1
1124 mfhi t_2 1139 mfhi t_2
@@ -1173,6 +1188,7 @@ LEAF(bn_mul_comba8)
1173 sltu AT,c_1,t_1 1188 sltu AT,c_1,t_1
1174 daddu t_2,AT 1189 daddu t_2,AT
1175 daddu c_2,t_2 1190 daddu c_2,t_2
1191 sltu c_3,c_2,t_2
1176 dmultu a_3,b_6 /* mul_add_c(a[3],b[6],c1,c2,c3); */ 1192 dmultu a_3,b_6 /* mul_add_c(a[3],b[6],c1,c2,c3); */
1177 mflo t_1 1193 mflo t_1
1178 mfhi t_2 1194 mfhi t_2
@@ -1180,7 +1196,8 @@ LEAF(bn_mul_comba8)
1180 sltu AT,c_1,t_1 1196 sltu AT,c_1,t_1
1181 daddu t_2,AT 1197 daddu t_2,AT
1182 daddu c_2,t_2 1198 daddu c_2,t_2
1183 sltu c_3,c_2,t_2 1199 sltu AT,c_2,t_2
1200 daddu c_3,AT
1184 dmultu a_4,b_5 /* mul_add_c(a[4],b[5],c1,c2,c3); */ 1201 dmultu a_4,b_5 /* mul_add_c(a[4],b[5],c1,c2,c3); */
1185 mflo t_1 1202 mflo t_1
1186 mfhi t_2 1203 mfhi t_2
@@ -1226,6 +1243,7 @@ LEAF(bn_mul_comba8)
1226 sltu AT,c_2,t_1 1243 sltu AT,c_2,t_1
1227 daddu t_2,AT 1244 daddu t_2,AT
1228 daddu c_3,t_2 1245 daddu c_3,t_2
1246 sltu c_1,c_3,t_2
1229 dmultu a_6,b_4 /* mul_add_c(a[6],b[4],c2,c3,c1); */ 1247 dmultu a_6,b_4 /* mul_add_c(a[6],b[4],c2,c3,c1); */
1230 mflo t_1 1248 mflo t_1
1231 mfhi t_2 1249 mfhi t_2
@@ -1233,7 +1251,8 @@ LEAF(bn_mul_comba8)
1233 sltu AT,c_2,t_1 1251 sltu AT,c_2,t_1
1234 daddu t_2,AT 1252 daddu t_2,AT
1235 daddu c_3,t_2 1253 daddu c_3,t_2
1236 sltu c_1,c_3,t_2 1254 sltu AT,c_3,t_2
1255 daddu c_1,AT
1237 dmultu a_5,b_5 /* mul_add_c(a[5],b[5],c2,c3,c1); */ 1256 dmultu a_5,b_5 /* mul_add_c(a[5],b[5],c2,c3,c1); */
1238 mflo t_1 1257 mflo t_1
1239 mfhi t_2 1258 mfhi t_2
@@ -1270,6 +1289,7 @@ LEAF(bn_mul_comba8)
1270 sltu AT,c_3,t_1 1289 sltu AT,c_3,t_1
1271 daddu t_2,AT 1290 daddu t_2,AT
1272 daddu c_1,t_2 1291 daddu c_1,t_2
1292 sltu c_2,c_1,t_2
1273 dmultu a_5,b_6 /* mul_add_c(a[5],b[6],c3,c1,c2); */ 1293 dmultu a_5,b_6 /* mul_add_c(a[5],b[6],c3,c1,c2); */
1274 mflo t_1 1294 mflo t_1
1275 mfhi t_2 1295 mfhi t_2
@@ -1277,7 +1297,8 @@ LEAF(bn_mul_comba8)
1277 sltu AT,c_3,t_1 1297 sltu AT,c_3,t_1
1278 daddu t_2,AT 1298 daddu t_2,AT
1279 daddu c_1,t_2 1299 daddu c_1,t_2
1280 sltu c_2,c_1,t_2 1300 sltu AT,c_1,t_2
1301 daddu c_2,AT
1281 dmultu a_6,b_5 /* mul_add_c(a[6],b[5],c3,c1,c2); */ 1302 dmultu a_6,b_5 /* mul_add_c(a[6],b[5],c3,c1,c2); */
1282 mflo t_1 1303 mflo t_1
1283 mfhi t_2 1304 mfhi t_2
@@ -1305,6 +1326,7 @@ LEAF(bn_mul_comba8)
1305 sltu AT,c_1,t_1 1326 sltu AT,c_1,t_1
1306 daddu t_2,AT 1327 daddu t_2,AT
1307 daddu c_2,t_2 1328 daddu c_2,t_2
1329 sltu c_3,c_2,t_2
1308 dmultu a_6,b_6 /* mul_add_c(a[6],b[6],c1,c2,c3); */ 1330 dmultu a_6,b_6 /* mul_add_c(a[6],b[6],c1,c2,c3); */
1309 mflo t_1 1331 mflo t_1
1310 mfhi t_2 1332 mfhi t_2
@@ -1312,7 +1334,8 @@ LEAF(bn_mul_comba8)
1312 sltu AT,c_1,t_1 1334 sltu AT,c_1,t_1
1313 daddu t_2,AT 1335 daddu t_2,AT
1314 daddu c_2,t_2 1336 daddu c_2,t_2
1315 sltu c_3,c_2,t_2 1337 sltu AT,c_2,t_2
1338 daddu c_3,AT
1316 dmultu a_5,b_7 /* mul_add_c(a[5],b[7],c1,c2,c3); */ 1339 dmultu a_5,b_7 /* mul_add_c(a[5],b[7],c1,c2,c3); */
1317 mflo t_1 1340 mflo t_1
1318 mfhi t_2 1341 mfhi t_2
@@ -1331,6 +1354,7 @@ LEAF(bn_mul_comba8)
1331 sltu AT,c_2,t_1 1354 sltu AT,c_2,t_1
1332 daddu t_2,AT 1355 daddu t_2,AT
1333 daddu c_3,t_2 1356 daddu c_3,t_2
1357 sltu c_1,c_3,t_2
1334 dmultu a_7,b_6 /* mul_add_c(a[7],b[6],c2,c3,c1); */ 1358 dmultu a_7,b_6 /* mul_add_c(a[7],b[6],c2,c3,c1); */
1335 mflo t_1 1359 mflo t_1
1336 mfhi t_2 1360 mfhi t_2
@@ -1338,7 +1362,8 @@ LEAF(bn_mul_comba8)
1338 sltu AT,c_2,t_1 1362 sltu AT,c_2,t_1
1339 daddu t_2,AT 1363 daddu t_2,AT
1340 daddu c_3,t_2 1364 daddu c_3,t_2
1341 sltu c_1,c_3,t_2 1365 sltu AT,c_3,t_2
1366 daddu c_1,AT
1342 sd c_2,104(a0) /* r[13]=c2; */ 1367 sd c_2,104(a0) /* r[13]=c2; */
1343 1368
1344 dmultu a_7,b_7 /* mul_add_c(a[7],b[7],c3,c1,c2); */ 1369 dmultu a_7,b_7 /* mul_add_c(a[7],b[7],c3,c1,c2); */
@@ -1427,6 +1452,7 @@ LEAF(bn_mul_comba4)
1427 sltu AT,c_1,t_1 1452 sltu AT,c_1,t_1
1428 daddu t_2,AT 1453 daddu t_2,AT
1429 daddu c_2,t_2 1454 daddu c_2,t_2
1455 sltu c_3,c_2,t_2
1430 dmultu a_1,b_2 /* mul_add_c(a[1],b[2],c1,c2,c3); */ 1456 dmultu a_1,b_2 /* mul_add_c(a[1],b[2],c1,c2,c3); */
1431 mflo t_1 1457 mflo t_1
1432 mfhi t_2 1458 mfhi t_2
@@ -1434,7 +1460,8 @@ LEAF(bn_mul_comba4)
1434 sltu AT,c_1,t_1 1460 sltu AT,c_1,t_1
1435 daddu t_2,AT 1461 daddu t_2,AT
1436 daddu c_2,t_2 1462 daddu c_2,t_2
1437 sltu c_3,c_2,t_2 1463 sltu AT,c_2,t_2
1464 daddu c_3,AT
1438 dmultu a_2,b_1 /* mul_add_c(a[2],b[1],c1,c2,c3); */ 1465 dmultu a_2,b_1 /* mul_add_c(a[2],b[1],c1,c2,c3); */
1439 mflo t_1 1466 mflo t_1
1440 mfhi t_2 1467 mfhi t_2
@@ -1462,6 +1489,7 @@ LEAF(bn_mul_comba4)
1462 sltu AT,c_2,t_1 1489 sltu AT,c_2,t_1
1463 daddu t_2,AT 1490 daddu t_2,AT
1464 daddu c_3,t_2 1491 daddu c_3,t_2
1492 sltu c_1,c_3,t_2
1465 dmultu a_2,b_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */ 1493 dmultu a_2,b_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */
1466 mflo t_1 1494 mflo t_1
1467 mfhi t_2 1495 mfhi t_2
@@ -1469,7 +1497,8 @@ LEAF(bn_mul_comba4)
1469 sltu AT,c_2,t_1 1497 sltu AT,c_2,t_1
1470 daddu t_2,AT 1498 daddu t_2,AT
1471 daddu c_3,t_2 1499 daddu c_3,t_2
1472 sltu c_1,c_3,t_2 1500 sltu AT,c_3,t_2
1501 daddu c_1,AT
1473 dmultu a_1,b_3 /* mul_add_c(a[1],b[3],c2,c3,c1); */ 1502 dmultu a_1,b_3 /* mul_add_c(a[1],b[3],c2,c3,c1); */
1474 mflo t_1 1503 mflo t_1
1475 mfhi t_2 1504 mfhi t_2
@@ -1488,6 +1517,7 @@ LEAF(bn_mul_comba4)
1488 sltu AT,c_3,t_1 1517 sltu AT,c_3,t_1
1489 daddu t_2,AT 1518 daddu t_2,AT
1490 daddu c_1,t_2 1519 daddu c_1,t_2
1520 sltu c_2,c_1,t_2
1491 dmultu a_3,b_2 /* mul_add_c(a[3],b[2],c3,c1,c2); */ 1521 dmultu a_3,b_2 /* mul_add_c(a[3],b[2],c3,c1,c2); */
1492 mflo t_1 1522 mflo t_1
1493 mfhi t_2 1523 mfhi t_2
@@ -1495,7 +1525,8 @@ LEAF(bn_mul_comba4)
1495 sltu AT,c_3,t_1 1525 sltu AT,c_3,t_1
1496 daddu t_2,AT 1526 daddu t_2,AT
1497 daddu c_1,t_2 1527 daddu c_1,t_2
1498 sltu c_2,c_1,t_2 1528 sltu AT,c_1,t_2
1529 daddu c_2,AT
1499 sd c_3,40(a0) 1530 sd c_3,40(a0)
1500 1531
1501 dmultu a_3,b_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */ 1532 dmultu a_3,b_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */
@@ -1540,28 +1571,30 @@ LEAF(bn_sqr_comba8)
1540 dmultu a_0,a_1 /* mul_add_c2(a[0],b[1],c2,c3,c1); */ 1571 dmultu a_0,a_1 /* mul_add_c2(a[0],b[1],c2,c3,c1); */
1541 mflo t_1 1572 mflo t_1
1542 mfhi t_2 1573 mfhi t_2
1574 slt c_1,t_2,zero
1575 dsll t_2,1
1576 slt a2,t_1,zero
1577 daddu t_2,a2
1578 dsll t_1,1
1543 daddu c_2,t_1 1579 daddu c_2,t_1
1544 sltu AT,c_2,t_1 1580 sltu AT,c_2,t_1
1545 daddu c_3,t_2,AT 1581 daddu c_3,t_2,AT
1546 daddu c_2,t_1
1547 sltu AT,c_2,t_1
1548 daddu t_2,AT
1549 daddu c_3,t_2
1550 sltu c_1,c_3,t_2
1551 sd c_2,8(a0) 1582 sd c_2,8(a0)
1552 1583
1553 dmultu a_2,a_0 /* mul_add_c2(a[2],b[0],c3,c1,c2); */ 1584 dmultu a_2,a_0 /* mul_add_c2(a[2],b[0],c3,c1,c2); */
1554 mflo t_1 1585 mflo t_1
1555 mfhi t_2 1586 mfhi t_2
1556 daddu c_3,t_1 1587 slt c_2,t_2,zero
1557 sltu AT,c_3,t_1 1588 dsll t_2,1
1558 daddu a2,t_2,AT 1589 slt a2,t_1,zero
1559 daddu c_1,a2 1590 daddu t_2,a2
1591 dsll t_1,1
1560 daddu c_3,t_1 1592 daddu c_3,t_1
1561 sltu AT,c_3,t_1 1593 sltu AT,c_3,t_1
1562 daddu t_2,AT 1594 daddu t_2,AT
1563 daddu c_1,t_2 1595 daddu c_1,t_2
1564 sltu c_2,c_1,t_2 1596 sltu AT,c_1,t_2
1597 daddu c_2,AT
1565 dmultu a_1,a_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */ 1598 dmultu a_1,a_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */
1566 mflo t_1 1599 mflo t_1
1567 mfhi t_2 1600 mfhi t_2
@@ -1576,24 +1609,26 @@ LEAF(bn_sqr_comba8)
1576 dmultu a_0,a_3 /* mul_add_c2(a[0],b[3],c1,c2,c3); */ 1609 dmultu a_0,a_3 /* mul_add_c2(a[0],b[3],c1,c2,c3); */
1577 mflo t_1 1610 mflo t_1
1578 mfhi t_2 1611 mfhi t_2
1579 daddu c_1,t_1 1612 slt c_3,t_2,zero
1580 sltu AT,c_1,t_1 1613 dsll t_2,1
1581 daddu a2,t_2,AT 1614 slt a2,t_1,zero
1582 daddu c_2,a2 1615 daddu t_2,a2
1616 dsll t_1,1
1583 daddu c_1,t_1 1617 daddu c_1,t_1
1584 sltu AT,c_1,t_1 1618 sltu AT,c_1,t_1
1585 daddu t_2,AT 1619 daddu t_2,AT
1586 daddu c_2,t_2 1620 daddu c_2,t_2
1587 sltu c_3,c_2,t_2 1621 sltu AT,c_2,t_2
1622 daddu c_3,AT
1588 dmultu a_1,a_2 /* mul_add_c2(a[1],b[2],c1,c2,c3); */ 1623 dmultu a_1,a_2 /* mul_add_c2(a[1],b[2],c1,c2,c3); */
1589 mflo t_1 1624 mflo t_1
1590 mfhi t_2 1625 mfhi t_2
1591 daddu c_1,t_1 1626 slt AT,t_2,zero
1592 sltu AT,c_1,t_1
1593 daddu a2,t_2,AT
1594 daddu c_2,a2
1595 sltu AT,c_2,a2
1596 daddu c_3,AT 1627 daddu c_3,AT
1628 dsll t_2,1
1629 slt a2,t_1,zero
1630 daddu t_2,a2
1631 dsll t_1,1
1597 daddu c_1,t_1 1632 daddu c_1,t_1
1598 sltu AT,c_1,t_1 1633 sltu AT,c_1,t_1
1599 daddu t_2,AT 1634 daddu t_2,AT
@@ -1605,24 +1640,26 @@ LEAF(bn_sqr_comba8)
1605 dmultu a_4,a_0 /* mul_add_c2(a[4],b[0],c2,c3,c1); */ 1640 dmultu a_4,a_0 /* mul_add_c2(a[4],b[0],c2,c3,c1); */
1606 mflo t_1 1641 mflo t_1
1607 mfhi t_2 1642 mfhi t_2
1608 daddu c_2,t_1 1643 slt c_1,t_2,zero
1609 sltu AT,c_2,t_1 1644 dsll t_2,1
1610 daddu a2,t_2,AT 1645 slt a2,t_1,zero
1611 daddu c_3,a2 1646 daddu t_2,a2
1647 dsll t_1,1
1612 daddu c_2,t_1 1648 daddu c_2,t_1
1613 sltu AT,c_2,t_1 1649 sltu AT,c_2,t_1
1614 daddu t_2,AT 1650 daddu t_2,AT
1615 daddu c_3,t_2 1651 daddu c_3,t_2
1616 sltu c_1,c_3,t_2 1652 sltu AT,c_3,t_2
1653 daddu c_1,AT
1617 dmultu a_3,a_1 /* mul_add_c2(a[3],b[1],c2,c3,c1); */ 1654 dmultu a_3,a_1 /* mul_add_c2(a[3],b[1],c2,c3,c1); */
1618 mflo t_1 1655 mflo t_1
1619 mfhi t_2 1656 mfhi t_2
1620 daddu c_2,t_1 1657 slt AT,t_2,zero
1621 sltu AT,c_2,t_1
1622 daddu a2,t_2,AT
1623 daddu c_3,a2
1624 sltu AT,c_3,a2
1625 daddu c_1,AT 1658 daddu c_1,AT
1659 dsll t_2,1
1660 slt a2,t_1,zero
1661 daddu t_2,a2
1662 dsll t_1,1
1626 daddu c_2,t_1 1663 daddu c_2,t_1
1627 sltu AT,c_2,t_1 1664 sltu AT,c_2,t_1
1628 daddu t_2,AT 1665 daddu t_2,AT
@@ -1643,24 +1680,26 @@ LEAF(bn_sqr_comba8)
1643 dmultu a_0,a_5 /* mul_add_c2(a[0],b[5],c3,c1,c2); */ 1680 dmultu a_0,a_5 /* mul_add_c2(a[0],b[5],c3,c1,c2); */
1644 mflo t_1 1681 mflo t_1
1645 mfhi t_2 1682 mfhi t_2
1646 daddu c_3,t_1 1683 slt c_2,t_2,zero
1647 sltu AT,c_3,t_1 1684 dsll t_2,1
1648 daddu a2,t_2,AT 1685 slt a2,t_1,zero
1649 daddu c_1,a2 1686 daddu t_2,a2
1687 dsll t_1,1
1650 daddu c_3,t_1 1688 daddu c_3,t_1
1651 sltu AT,c_3,t_1 1689 sltu AT,c_3,t_1
1652 daddu t_2,AT 1690 daddu t_2,AT
1653 daddu c_1,t_2 1691 daddu c_1,t_2
1654 sltu c_2,c_1,t_2 1692 sltu AT,c_1,t_2
1693 daddu c_2,AT
1655 dmultu a_1,a_4 /* mul_add_c2(a[1],b[4],c3,c1,c2); */ 1694 dmultu a_1,a_4 /* mul_add_c2(a[1],b[4],c3,c1,c2); */
1656 mflo t_1 1695 mflo t_1
1657 mfhi t_2 1696 mfhi t_2
1658 daddu c_3,t_1 1697 slt AT,t_2,zero
1659 sltu AT,c_3,t_1
1660 daddu a2,t_2,AT
1661 daddu c_1,a2
1662 sltu AT,c_1,a2
1663 daddu c_2,AT 1698 daddu c_2,AT
1699 dsll t_2,1
1700 slt a2,t_1,zero
1701 daddu t_2,a2
1702 dsll t_1,1
1664 daddu c_3,t_1 1703 daddu c_3,t_1
1665 sltu AT,c_3,t_1 1704 sltu AT,c_3,t_1
1666 daddu t_2,AT 1705 daddu t_2,AT
@@ -1670,12 +1709,12 @@ LEAF(bn_sqr_comba8)
1670 dmultu a_2,a_3 /* mul_add_c2(a[2],b[3],c3,c1,c2); */ 1709 dmultu a_2,a_3 /* mul_add_c2(a[2],b[3],c3,c1,c2); */
1671 mflo t_1 1710 mflo t_1
1672 mfhi t_2 1711 mfhi t_2
1673 daddu c_3,t_1 1712 slt AT,t_2,zero
1674 sltu AT,c_3,t_1
1675 daddu a2,t_2,AT
1676 daddu c_1,a2
1677 sltu AT,c_1,a2
1678 daddu c_2,AT 1713 daddu c_2,AT
1714 dsll t_2,1
1715 slt a2,t_1,zero
1716 daddu t_2,a2
1717 dsll t_1,1
1679 daddu c_3,t_1 1718 daddu c_3,t_1
1680 sltu AT,c_3,t_1 1719 sltu AT,c_3,t_1
1681 daddu t_2,AT 1720 daddu t_2,AT
@@ -1687,24 +1726,26 @@ LEAF(bn_sqr_comba8)
1687 dmultu a_6,a_0 /* mul_add_c2(a[6],b[0],c1,c2,c3); */ 1726 dmultu a_6,a_0 /* mul_add_c2(a[6],b[0],c1,c2,c3); */
1688 mflo t_1 1727 mflo t_1
1689 mfhi t_2 1728 mfhi t_2
1690 daddu c_1,t_1 1729 slt c_3,t_2,zero
1691 sltu AT,c_1,t_1 1730 dsll t_2,1
1692 daddu a2,t_2,AT 1731 slt a2,t_1,zero
1693 daddu c_2,a2 1732 daddu t_2,a2
1733 dsll t_1,1
1694 daddu c_1,t_1 1734 daddu c_1,t_1
1695 sltu AT,c_1,t_1 1735 sltu AT,c_1,t_1
1696 daddu t_2,AT 1736 daddu t_2,AT
1697 daddu c_2,t_2 1737 daddu c_2,t_2
1698 sltu c_3,c_2,t_2 1738 sltu AT,c_2,t_2
1739 daddu c_3,AT
1699 dmultu a_5,a_1 /* mul_add_c2(a[5],b[1],c1,c2,c3); */ 1740 dmultu a_5,a_1 /* mul_add_c2(a[5],b[1],c1,c2,c3); */
1700 mflo t_1 1741 mflo t_1
1701 mfhi t_2 1742 mfhi t_2
1702 daddu c_1,t_1 1743 slt AT,t_2,zero
1703 sltu AT,c_1,t_1
1704 daddu a2,t_2,AT
1705 daddu c_2,a2
1706 sltu AT,c_2,a2
1707 daddu c_3,AT 1744 daddu c_3,AT
1745 dsll t_2,1
1746 slt a2,t_1,zero
1747 daddu t_2,a2
1748 dsll t_1,1
1708 daddu c_1,t_1 1749 daddu c_1,t_1
1709 sltu AT,c_1,t_1 1750 sltu AT,c_1,t_1
1710 daddu t_2,AT 1751 daddu t_2,AT
@@ -1714,12 +1755,12 @@ LEAF(bn_sqr_comba8)
1714 dmultu a_4,a_2 /* mul_add_c2(a[4],b[2],c1,c2,c3); */ 1755 dmultu a_4,a_2 /* mul_add_c2(a[4],b[2],c1,c2,c3); */
1715 mflo t_1 1756 mflo t_1
1716 mfhi t_2 1757 mfhi t_2
1717 daddu c_1,t_1 1758 slt AT,t_2,zero
1718 sltu AT,c_1,t_1
1719 daddu a2,t_2,AT
1720 daddu c_2,a2
1721 sltu AT,c_2,a2
1722 daddu c_3,AT 1759 daddu c_3,AT
1760 dsll t_2,1
1761 slt a2,t_1,zero
1762 daddu t_2,a2
1763 dsll t_1,1
1723 daddu c_1,t_1 1764 daddu c_1,t_1
1724 sltu AT,c_1,t_1 1765 sltu AT,c_1,t_1
1725 daddu t_2,AT 1766 daddu t_2,AT
@@ -1740,24 +1781,26 @@ LEAF(bn_sqr_comba8)
1740 dmultu a_0,a_7 /* mul_add_c2(a[0],b[7],c2,c3,c1); */ 1781 dmultu a_0,a_7 /* mul_add_c2(a[0],b[7],c2,c3,c1); */
1741 mflo t_1 1782 mflo t_1
1742 mfhi t_2 1783 mfhi t_2
1743 daddu c_2,t_1 1784 slt c_1,t_2,zero
1744 sltu AT,c_2,t_1 1785 dsll t_2,1
1745 daddu a2,t_2,AT 1786 slt a2,t_1,zero
1746 daddu c_3,a2 1787 daddu t_2,a2
1788 dsll t_1,1
1747 daddu c_2,t_1 1789 daddu c_2,t_1
1748 sltu AT,c_2,t_1 1790 sltu AT,c_2,t_1
1749 daddu t_2,AT 1791 daddu t_2,AT
1750 daddu c_3,t_2 1792 daddu c_3,t_2
1751 sltu c_1,c_3,t_2 1793 sltu AT,c_3,t_2
1794 daddu c_1,AT
1752 dmultu a_1,a_6 /* mul_add_c2(a[1],b[6],c2,c3,c1); */ 1795 dmultu a_1,a_6 /* mul_add_c2(a[1],b[6],c2,c3,c1); */
1753 mflo t_1 1796 mflo t_1
1754 mfhi t_2 1797 mfhi t_2
1755 daddu c_2,t_1 1798 slt AT,t_2,zero
1756 sltu AT,c_2,t_1
1757 daddu a2,t_2,AT
1758 daddu c_3,a2
1759 sltu AT,c_3,a2
1760 daddu c_1,AT 1799 daddu c_1,AT
1800 dsll t_2,1
1801 slt a2,t_1,zero
1802 daddu t_2,a2
1803 dsll t_1,1
1761 daddu c_2,t_1 1804 daddu c_2,t_1
1762 sltu AT,c_2,t_1 1805 sltu AT,c_2,t_1
1763 daddu t_2,AT 1806 daddu t_2,AT
@@ -1767,12 +1810,12 @@ LEAF(bn_sqr_comba8)
1767 dmultu a_2,a_5 /* mul_add_c2(a[2],b[5],c2,c3,c1); */ 1810 dmultu a_2,a_5 /* mul_add_c2(a[2],b[5],c2,c3,c1); */
1768 mflo t_1 1811 mflo t_1
1769 mfhi t_2 1812 mfhi t_2
1770 daddu c_2,t_1 1813 slt AT,t_2,zero
1771 sltu AT,c_2,t_1
1772 daddu a2,t_2,AT
1773 daddu c_3,a2
1774 sltu AT,c_3,a2
1775 daddu c_1,AT 1814 daddu c_1,AT
1815 dsll t_2,1
1816 slt a2,t_1,zero
1817 daddu t_2,a2
1818 dsll t_1,1
1776 daddu c_2,t_1 1819 daddu c_2,t_1
1777 sltu AT,c_2,t_1 1820 sltu AT,c_2,t_1
1778 daddu t_2,AT 1821 daddu t_2,AT
@@ -1782,12 +1825,12 @@ LEAF(bn_sqr_comba8)
1782 dmultu a_3,a_4 /* mul_add_c2(a[3],b[4],c2,c3,c1); */ 1825 dmultu a_3,a_4 /* mul_add_c2(a[3],b[4],c2,c3,c1); */
1783 mflo t_1 1826 mflo t_1
1784 mfhi t_2 1827 mfhi t_2
1785 daddu c_2,t_1 1828 slt AT,t_2,zero
1786 sltu AT,c_2,t_1
1787 daddu a2,t_2,AT
1788 daddu c_3,a2
1789 sltu AT,c_3,a2
1790 daddu c_1,AT 1829 daddu c_1,AT
1830 dsll t_2,1
1831 slt a2,t_1,zero
1832 daddu t_2,a2
1833 dsll t_1,1
1791 daddu c_2,t_1 1834 daddu c_2,t_1
1792 sltu AT,c_2,t_1 1835 sltu AT,c_2,t_1
1793 daddu t_2,AT 1836 daddu t_2,AT
@@ -1799,24 +1842,26 @@ LEAF(bn_sqr_comba8)
1799 dmultu a_7,a_1 /* mul_add_c2(a[7],b[1],c3,c1,c2); */ 1842 dmultu a_7,a_1 /* mul_add_c2(a[7],b[1],c3,c1,c2); */
1800 mflo t_1 1843 mflo t_1
1801 mfhi t_2 1844 mfhi t_2
1802 daddu c_3,t_1 1845 slt c_2,t_2,zero
1803 sltu AT,c_3,t_1 1846 dsll t_2,1
1804 daddu a2,t_2,AT 1847 slt a2,t_1,zero
1805 daddu c_1,a2 1848 daddu t_2,a2
1849 dsll t_1,1
1806 daddu c_3,t_1 1850 daddu c_3,t_1
1807 sltu AT,c_3,t_1 1851 sltu AT,c_3,t_1
1808 daddu t_2,AT 1852 daddu t_2,AT
1809 daddu c_1,t_2 1853 daddu c_1,t_2
1810 sltu c_2,c_1,t_2 1854 sltu AT,c_1,t_2
1855 daddu c_2,AT
1811 dmultu a_6,a_2 /* mul_add_c2(a[6],b[2],c3,c1,c2); */ 1856 dmultu a_6,a_2 /* mul_add_c2(a[6],b[2],c3,c1,c2); */
1812 mflo t_1 1857 mflo t_1
1813 mfhi t_2 1858 mfhi t_2
1814 daddu c_3,t_1 1859 slt AT,t_2,zero
1815 sltu AT,c_3,t_1
1816 daddu a2,t_2,AT
1817 daddu c_1,a2
1818 sltu AT,c_1,a2
1819 daddu c_2,AT 1860 daddu c_2,AT
1861 dsll t_2,1
1862 slt a2,t_1,zero
1863 daddu t_2,a2
1864 dsll t_1,1
1820 daddu c_3,t_1 1865 daddu c_3,t_1
1821 sltu AT,c_3,t_1 1866 sltu AT,c_3,t_1
1822 daddu t_2,AT 1867 daddu t_2,AT
@@ -1826,12 +1871,12 @@ LEAF(bn_sqr_comba8)
1826 dmultu a_5,a_3 /* mul_add_c2(a[5],b[3],c3,c1,c2); */ 1871 dmultu a_5,a_3 /* mul_add_c2(a[5],b[3],c3,c1,c2); */
1827 mflo t_1 1872 mflo t_1
1828 mfhi t_2 1873 mfhi t_2
1829 daddu c_3,t_1 1874 slt AT,t_2,zero
1830 sltu AT,c_3,t_1
1831 daddu a2,t_2,AT
1832 daddu c_1,a2
1833 sltu AT,c_1,a2
1834 daddu c_2,AT 1875 daddu c_2,AT
1876 dsll t_2,1
1877 slt a2,t_1,zero
1878 daddu t_2,a2
1879 dsll t_1,1
1835 daddu c_3,t_1 1880 daddu c_3,t_1
1836 sltu AT,c_3,t_1 1881 sltu AT,c_3,t_1
1837 daddu t_2,AT 1882 daddu t_2,AT
@@ -1852,24 +1897,26 @@ LEAF(bn_sqr_comba8)
1852 dmultu a_2,a_7 /* mul_add_c2(a[2],b[7],c1,c2,c3); */ 1897 dmultu a_2,a_7 /* mul_add_c2(a[2],b[7],c1,c2,c3); */
1853 mflo t_1 1898 mflo t_1
1854 mfhi t_2 1899 mfhi t_2
1855 daddu c_1,t_1 1900 slt c_3,t_2,zero
1856 sltu AT,c_1,t_1 1901 dsll t_2,1
1857 daddu a2,t_2,AT 1902 slt a2,t_1,zero
1858 daddu c_2,a2 1903 daddu t_2,a2
1904 dsll t_1,1
1859 daddu c_1,t_1 1905 daddu c_1,t_1
1860 sltu AT,c_1,t_1 1906 sltu AT,c_1,t_1
1861 daddu t_2,AT 1907 daddu t_2,AT
1862 daddu c_2,t_2 1908 daddu c_2,t_2
1863 sltu c_3,c_2,t_2 1909 sltu AT,c_2,t_2
1910 daddu c_3,AT
1864 dmultu a_3,a_6 /* mul_add_c2(a[3],b[6],c1,c2,c3); */ 1911 dmultu a_3,a_6 /* mul_add_c2(a[3],b[6],c1,c2,c3); */
1865 mflo t_1 1912 mflo t_1
1866 mfhi t_2 1913 mfhi t_2
1867 daddu c_1,t_1 1914 slt AT,t_2,zero
1868 sltu AT,c_1,t_1
1869 daddu a2,t_2,AT
1870 daddu c_2,a2
1871 sltu AT,c_2,a2
1872 daddu c_3,AT 1915 daddu c_3,AT
1916 dsll t_2,1
1917 slt a2,t_1,zero
1918 daddu t_2,a2
1919 dsll t_1,1
1873 daddu c_1,t_1 1920 daddu c_1,t_1
1874 sltu AT,c_1,t_1 1921 sltu AT,c_1,t_1
1875 daddu t_2,AT 1922 daddu t_2,AT
@@ -1879,12 +1926,12 @@ LEAF(bn_sqr_comba8)
1879 dmultu a_4,a_5 /* mul_add_c2(a[4],b[5],c1,c2,c3); */ 1926 dmultu a_4,a_5 /* mul_add_c2(a[4],b[5],c1,c2,c3); */
1880 mflo t_1 1927 mflo t_1
1881 mfhi t_2 1928 mfhi t_2
1882 daddu c_1,t_1 1929 slt AT,t_2,zero
1883 sltu AT,c_1,t_1
1884 daddu a2,t_2,AT
1885 daddu c_2,a2
1886 sltu AT,c_2,a2
1887 daddu c_3,AT 1930 daddu c_3,AT
1931 dsll t_2,1
1932 slt a2,t_1,zero
1933 daddu t_2,a2
1934 dsll t_1,1
1888 daddu c_1,t_1 1935 daddu c_1,t_1
1889 sltu AT,c_1,t_1 1936 sltu AT,c_1,t_1
1890 daddu t_2,AT 1937 daddu t_2,AT
@@ -1896,24 +1943,26 @@ LEAF(bn_sqr_comba8)
1896 dmultu a_7,a_3 /* mul_add_c2(a[7],b[3],c2,c3,c1); */ 1943 dmultu a_7,a_3 /* mul_add_c2(a[7],b[3],c2,c3,c1); */
1897 mflo t_1 1944 mflo t_1
1898 mfhi t_2 1945 mfhi t_2
1899 daddu c_2,t_1 1946 slt c_1,t_2,zero
1900 sltu AT,c_2,t_1 1947 dsll t_2,1
1901 daddu a2,t_2,AT 1948 slt a2,t_1,zero
1902 daddu c_3,a2 1949 daddu t_2,a2
1950 dsll t_1,1
1903 daddu c_2,t_1 1951 daddu c_2,t_1
1904 sltu AT,c_2,t_1 1952 sltu AT,c_2,t_1
1905 daddu t_2,AT 1953 daddu t_2,AT
1906 daddu c_3,t_2 1954 daddu c_3,t_2
1907 sltu c_1,c_3,t_2 1955 sltu AT,c_3,t_2
1956 daddu c_1,AT
1908 dmultu a_6,a_4 /* mul_add_c2(a[6],b[4],c2,c3,c1); */ 1957 dmultu a_6,a_4 /* mul_add_c2(a[6],b[4],c2,c3,c1); */
1909 mflo t_1 1958 mflo t_1
1910 mfhi t_2 1959 mfhi t_2
1911 daddu c_2,t_1 1960 slt AT,t_2,zero
1912 sltu AT,c_2,t_1
1913 daddu a2,t_2,AT
1914 daddu c_3,a2
1915 sltu AT,c_3,a2
1916 daddu c_1,AT 1961 daddu c_1,AT
1962 dsll t_2,1
1963 slt a2,t_1,zero
1964 daddu t_2,a2
1965 dsll t_1,1
1917 daddu c_2,t_1 1966 daddu c_2,t_1
1918 sltu AT,c_2,t_1 1967 sltu AT,c_2,t_1
1919 daddu t_2,AT 1968 daddu t_2,AT
@@ -1934,24 +1983,26 @@ LEAF(bn_sqr_comba8)
1934 dmultu a_4,a_7 /* mul_add_c2(a[4],b[7],c3,c1,c2); */ 1983 dmultu a_4,a_7 /* mul_add_c2(a[4],b[7],c3,c1,c2); */
1935 mflo t_1 1984 mflo t_1
1936 mfhi t_2 1985 mfhi t_2
1937 daddu c_3,t_1 1986 slt c_2,t_2,zero
1938 sltu AT,c_3,t_1 1987 dsll t_2,1
1939 daddu a2,t_2,AT 1988 slt a2,t_1,zero
1940 daddu c_1,a2 1989 daddu t_2,a2
1990 dsll t_1,1
1941 daddu c_3,t_1 1991 daddu c_3,t_1
1942 sltu AT,c_3,t_1 1992 sltu AT,c_3,t_1
1943 daddu t_2,AT 1993 daddu t_2,AT
1944 daddu c_1,t_2 1994 daddu c_1,t_2
1945 sltu c_2,c_1,t_2 1995 sltu AT,c_1,t_2
1996 daddu c_2,AT
1946 dmultu a_5,a_6 /* mul_add_c2(a[5],b[6],c3,c1,c2); */ 1997 dmultu a_5,a_6 /* mul_add_c2(a[5],b[6],c3,c1,c2); */
1947 mflo t_1 1998 mflo t_1
1948 mfhi t_2 1999 mfhi t_2
1949 daddu c_3,t_1 2000 slt AT,t_2,zero
1950 sltu AT,c_3,t_1
1951 daddu a2,t_2,AT
1952 daddu c_1,a2
1953 sltu AT,c_1,a2
1954 daddu c_2,AT 2001 daddu c_2,AT
2002 dsll t_2,1
2003 slt a2,t_1,zero
2004 daddu t_2,a2
2005 dsll t_1,1
1955 daddu c_3,t_1 2006 daddu c_3,t_1
1956 sltu AT,c_3,t_1 2007 sltu AT,c_3,t_1
1957 daddu t_2,AT 2008 daddu t_2,AT
@@ -1963,15 +2014,17 @@ LEAF(bn_sqr_comba8)
1963 dmultu a_7,a_5 /* mul_add_c2(a[7],b[5],c1,c2,c3); */ 2014 dmultu a_7,a_5 /* mul_add_c2(a[7],b[5],c1,c2,c3); */
1964 mflo t_1 2015 mflo t_1
1965 mfhi t_2 2016 mfhi t_2
1966 daddu c_1,t_1 2017 slt c_3,t_2,zero
1967 sltu AT,c_1,t_1 2018 dsll t_2,1
1968 daddu a2,t_2,AT 2019 slt a2,t_1,zero
1969 daddu c_2,a2 2020 daddu t_2,a2
2021 dsll t_1,1
1970 daddu c_1,t_1 2022 daddu c_1,t_1
1971 sltu AT,c_1,t_1 2023 sltu AT,c_1,t_1
1972 daddu t_2,AT 2024 daddu t_2,AT
1973 daddu c_2,t_2 2025 daddu c_2,t_2
1974 sltu c_3,c_2,t_2 2026 sltu AT,c_2,t_2
2027 daddu c_3,AT
1975 dmultu a_6,a_6 /* mul_add_c(a[6],b[6],c1,c2,c3); */ 2028 dmultu a_6,a_6 /* mul_add_c(a[6],b[6],c1,c2,c3); */
1976 mflo t_1 2029 mflo t_1
1977 mfhi t_2 2030 mfhi t_2
@@ -1986,15 +2039,17 @@ LEAF(bn_sqr_comba8)
1986 dmultu a_6,a_7 /* mul_add_c2(a[6],b[7],c2,c3,c1); */ 2039 dmultu a_6,a_7 /* mul_add_c2(a[6],b[7],c2,c3,c1); */
1987 mflo t_1 2040 mflo t_1
1988 mfhi t_2 2041 mfhi t_2
1989 daddu c_2,t_1 2042 slt c_1,t_2,zero
1990 sltu AT,c_2,t_1 2043 dsll t_2,1
1991 daddu a2,t_2,AT 2044 slt a2,t_1,zero
1992 daddu c_3,a2 2045 daddu t_2,a2
2046 dsll t_1,1
1993 daddu c_2,t_1 2047 daddu c_2,t_1
1994 sltu AT,c_2,t_1 2048 sltu AT,c_2,t_1
1995 daddu t_2,AT 2049 daddu t_2,AT
1996 daddu c_3,t_2 2050 daddu c_3,t_2
1997 sltu c_1,c_3,t_2 2051 sltu AT,c_3,t_2
2052 daddu c_1,AT
1998 sd c_2,104(a0) 2053 sd c_2,104(a0)
1999 2054
2000 dmultu a_7,a_7 /* mul_add_c(a[7],b[7],c3,c1,c2); */ 2055 dmultu a_7,a_7 /* mul_add_c(a[7],b[7],c3,c1,c2); */
@@ -2025,28 +2080,30 @@ LEAF(bn_sqr_comba4)
2025 dmultu a_0,a_1 /* mul_add_c2(a[0],b[1],c2,c3,c1); */ 2080 dmultu a_0,a_1 /* mul_add_c2(a[0],b[1],c2,c3,c1); */
2026 mflo t_1 2081 mflo t_1
2027 mfhi t_2 2082 mfhi t_2
2083 slt c_1,t_2,zero
2084 dsll t_2,1
2085 slt a2,t_1,zero
2086 daddu t_2,a2
2087 dsll t_1,1
2028 daddu c_2,t_1 2088 daddu c_2,t_1
2029 sltu AT,c_2,t_1 2089 sltu AT,c_2,t_1
2030 daddu c_3,t_2,AT 2090 daddu c_3,t_2,AT
2031 daddu c_2,t_1
2032 sltu AT,c_2,t_1
2033 daddu t_2,AT
2034 daddu c_3,t_2
2035 sltu c_1,c_3,t_2
2036 sd c_2,8(a0) 2091 sd c_2,8(a0)
2037 2092
2038 dmultu a_2,a_0 /* mul_add_c2(a[2],b[0],c3,c1,c2); */ 2093 dmultu a_2,a_0 /* mul_add_c2(a[2],b[0],c3,c1,c2); */
2039 mflo t_1 2094 mflo t_1
2040 mfhi t_2 2095 mfhi t_2
2041 daddu c_3,t_1 2096 slt c_2,t_2,zero
2042 sltu AT,c_3,t_1 2097 dsll t_2,1
2043 daddu a2,t_2,AT 2098 slt a2,t_1,zero
2044 daddu c_1,a2 2099 daddu t_2,a2
2100 dsll t_1,1
2045 daddu c_3,t_1 2101 daddu c_3,t_1
2046 sltu AT,c_3,t_1 2102 sltu AT,c_3,t_1
2047 daddu t_2,AT 2103 daddu t_2,AT
2048 daddu c_1,t_2 2104 daddu c_1,t_2
2049 sltu c_2,c_1,t_2 2105 sltu AT,c_1,t_2
2106 daddu c_2,AT
2050 dmultu a_1,a_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */ 2107 dmultu a_1,a_1 /* mul_add_c(a[1],b[1],c3,c1,c2); */
2051 mflo t_1 2108 mflo t_1
2052 mfhi t_2 2109 mfhi t_2
@@ -2061,24 +2118,26 @@ LEAF(bn_sqr_comba4)
2061 dmultu a_0,a_3 /* mul_add_c2(a[0],b[3],c1,c2,c3); */ 2118 dmultu a_0,a_3 /* mul_add_c2(a[0],b[3],c1,c2,c3); */
2062 mflo t_1 2119 mflo t_1
2063 mfhi t_2 2120 mfhi t_2
2064 daddu c_1,t_1 2121 slt c_3,t_2,zero
2065 sltu AT,c_1,t_1 2122 dsll t_2,1
2066 daddu a2,t_2,AT 2123 slt a2,t_1,zero
2067 daddu c_2,a2 2124 daddu t_2,a2
2125 dsll t_1,1
2068 daddu c_1,t_1 2126 daddu c_1,t_1
2069 sltu AT,c_1,t_1 2127 sltu AT,c_1,t_1
2070 daddu t_2,AT 2128 daddu t_2,AT
2071 daddu c_2,t_2 2129 daddu c_2,t_2
2072 sltu c_3,c_2,t_2 2130 sltu AT,c_2,t_2
2131 daddu c_3,AT
2073 dmultu a_1,a_2 /* mul_add_c(a2[1],b[2],c1,c2,c3); */ 2132 dmultu a_1,a_2 /* mul_add_c(a2[1],b[2],c1,c2,c3); */
2074 mflo t_1 2133 mflo t_1
2075 mfhi t_2 2134 mfhi t_2
2076 daddu c_1,t_1 2135 slt AT,t_2,zero
2077 sltu AT,c_1,t_1
2078 daddu a2,t_2,AT
2079 daddu c_2,a2
2080 sltu AT,c_2,a2
2081 daddu c_3,AT 2136 daddu c_3,AT
2137 dsll t_2,1
2138 slt a2,t_1,zero
2139 daddu t_2,a2
2140 dsll t_1,1
2082 daddu c_1,t_1 2141 daddu c_1,t_1
2083 sltu AT,c_1,t_1 2142 sltu AT,c_1,t_1
2084 daddu t_2,AT 2143 daddu t_2,AT
@@ -2090,15 +2149,17 @@ LEAF(bn_sqr_comba4)
2090 dmultu a_3,a_1 /* mul_add_c2(a[3],b[1],c2,c3,c1); */ 2149 dmultu a_3,a_1 /* mul_add_c2(a[3],b[1],c2,c3,c1); */
2091 mflo t_1 2150 mflo t_1
2092 mfhi t_2 2151 mfhi t_2
2093 daddu c_2,t_1 2152 slt c_1,t_2,zero
2094 sltu AT,c_2,t_1 2153 dsll t_2,1
2095 daddu a2,t_2,AT 2154 slt a2,t_1,zero
2096 daddu c_3,a2 2155 daddu t_2,a2
2156 dsll t_1,1
2097 daddu c_2,t_1 2157 daddu c_2,t_1
2098 sltu AT,c_2,t_1 2158 sltu AT,c_2,t_1
2099 daddu t_2,AT 2159 daddu t_2,AT
2100 daddu c_3,t_2 2160 daddu c_3,t_2
2101 sltu c_1,c_3,t_2 2161 sltu AT,c_3,t_2
2162 daddu c_1,AT
2102 dmultu a_2,a_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */ 2163 dmultu a_2,a_2 /* mul_add_c(a[2],b[2],c2,c3,c1); */
2103 mflo t_1 2164 mflo t_1
2104 mfhi t_2 2165 mfhi t_2
@@ -2113,15 +2174,17 @@ LEAF(bn_sqr_comba4)
2113 dmultu a_2,a_3 /* mul_add_c2(a[2],b[3],c3,c1,c2); */ 2174 dmultu a_2,a_3 /* mul_add_c2(a[2],b[3],c3,c1,c2); */
2114 mflo t_1 2175 mflo t_1
2115 mfhi t_2 2176 mfhi t_2
2116 daddu c_3,t_1 2177 slt c_2,t_2,zero
2117 sltu AT,c_3,t_1 2178 dsll t_2,1
2118 daddu a2,t_2,AT 2179 slt a2,t_1,zero
2119 daddu c_1,a2 2180 daddu t_2,a2
2181 dsll t_1,1
2120 daddu c_3,t_1 2182 daddu c_3,t_1
2121 sltu AT,c_3,t_1 2183 sltu AT,c_3,t_1
2122 daddu t_2,AT 2184 daddu t_2,AT
2123 daddu c_1,t_2 2185 daddu c_1,t_2
2124 sltu c_2,c_1,t_2 2186 sltu AT,c_1,t_2
2187 daddu c_2,AT
2125 sd c_3,40(a0) 2188 sd c_3,40(a0)
2126 2189
2127 dmultu a_3,a_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */ 2190 dmultu a_3,a_3 /* mul_add_c(a[3],b[3],c1,c2,c3); */
diff --git a/src/lib/libcrypto/bn/asm/vms.mar b/src/lib/libcrypto/bn/asm/vms.mar
index ac9d57d7b0..465f2774b6 100644
--- a/src/lib/libcrypto/bn/asm/vms.mar
+++ b/src/lib/libcrypto/bn/asm/vms.mar
@@ -162,442 +162,237 @@ n=12 ;(AP) n by value (input)
162 movl #1,r0 ; return SS$_NORMAL 162 movl #1,r0 ; return SS$_NORMAL
163 ret 163 ret
164 164
165 .title (generated) 165 .title vax_bn_div_words unsigned divide
166 166;
167 .psect code,nowrt 167; Richard Levitte 20-Nov-2000
168 168;
169.entry BN_DIV_WORDS,^m<r2,r3,r4,r5,r6,r7,r8,r9,r10> 169; ULONG bn_div_words(ULONG h, ULONG l, ULONG d)
170 subl2 #4,sp 170; {
171 171; return ((ULONG)((((ULLONG)h)<<32)|l) / (ULLONG)d);
172 clrl r9 172; }
173 movl #2,r8 173;
174 174; Using EDIV would be very easy, if it didn't do signed calculations.
175 tstl 12(ap) 175; Therefore, som extra things have to happen around it. The way to
176 bneq noname.2 176; handle that is to shift all operands right one step (basically dividing
177 mnegl #1,r10 177; them by 2) and handle the different cases depending on what the lowest
178 brw noname.3 178; bit of each operand was.
179 tstl r0 179;
180 nop 180; To start with, let's define the following:
181noname.2: 181;
182 182; a' = l & 1
183 pushl 12(ap) 183; a2 = <h,l> >> 1 # UNSIGNED shift!
184 calls #1,BN_NUM_BITS_WORD 184; b' = d & 1
185 movl r0,r7 185; b2 = d >> 1 # UNSIGNED shift!
186 186;
187 cmpl r7,#32 187; Now, use EDIV to calculate a quotient and a remainder:
188 beql noname.4 188;
189 ashl r7,#1,r2 189; q'' = a2/b2
190 cmpl 4(ap),r2 190; r'' = a2 - q''*b2
191 blequ noname.4 191;
192 192; If b' is 0, the quotient is already correct, we just need to adjust the
193 pushl r7 193; remainder:
194 calls #1,BN_DIV_WORDS_ABORT 194;
195noname.4: 195; if (b' == 0)
196 196; {
197 subl3 r7,#32,r7 197; r = 2*r'' + a'
198 198; q = q''
199 movl 12(ap),r2 199; }
200 cmpl 4(ap),r2 200;
201 blssu noname.5 201; If b' is 1, we need to do other adjustements. The first thought is the
202 subl2 r2,4(ap) 202; following (note that r' will not always have the right value, but an
203noname.5: 203; adjustement follows further down):
204 204;
205 tstl r7 205; if (b' == 1)
206 beql noname.6 206; {
207 207; q' = q''
208 ashl r7,r2,12(ap) 208; r' = a - q'*b
209 209;
210 ashl r7,4(ap),r4 210; However, one can note the folowing relationship:
211 subl3 r7,#32,r3 211;
212 subl3 r3,#32,r2 212; r'' = a2 - q''*b2
213 extzv r3,r2,8(ap),r2 213; => 2*r'' = 2*a2 - 2*q''*b2
214 bisl3 r4,r2,4(ap) 214; = { a = 2*a2 + a', b = 2*b2 + b' = 2*b2 + 1,
215 215; q' = q'' }
216 ashl r7,8(ap),8(ap) 216; = a - a' - q'*(b - 1)
217noname.6: 217; = a - q'*b - a' + q'
218 218; = r' - a' + q'
219 bicl3 #65535,12(ap),r2 219; => r' = 2*r'' - q' + a'
220 extzv #16,#16,r2,r5 220;
221 221; This enables us to use r'' instead of discarding and calculating another
222 bicl3 #-65536,12(ap),r6 222; modulo:
223 223;
224noname.7: 224; if (b' == 1)
225 225; {
226 moval 4(ap),r2 226; q' = q''
227 movzwl 2(r2),r0 227; r' = (r'' << 1) - q' + a'
228 cmpl r0,r5 228;
229 bneq noname.8 229; Now, all we have to do is adjust r', because it might be < 0:
230 230;
231 movzwl #65535,r4 231; while (r' < 0)
232 brb noname.9 232; {
233noname.8: 233; r' = r' + b
234 234; q' = q' - 1
235 clrl r1 235; }
236 movl (r2),r0 236; }
237 movl r5,r2 237;
238 bgeq vcg.1 238; return q'
239 cmpl r2,r0
240 bgtru vcg.2
241 incl r1
242 brb vcg.2
243 nop
244vcg.1:
245 ediv r2,r0,r1,r0
246vcg.2:
247 movl r1,r4
248noname.9:
249
250noname.10:
251
252 mull3 r5,r4,r0
253 subl3 r0,4(ap),r3
254
255 bicl3 #65535,r3,r0
256 bneq noname.13
257 mull3 r6,r4,r2
258 ashl #16,r3,r1
259 bicl3 #65535,8(ap),r0
260 extzv #16,#16,r0,r0
261 addl2 r0,r1
262 cmpl r2,r1
263 bgtru noname.12
264noname.11:
265
266 brb noname.13
267 nop
268noname.12:
269
270 decl r4
271 brb noname.10
272noname.13:
273
274 mull3 r5,r4,r1
275
276 mull3 r6,r4,r0
277
278 extzv #16,#16,r0,r3
279
280 ashl #16,r0,r2
281 bicl3 #65535,r2,r0
282
283 addl2 r3,r1
284
285 moval 8(ap),r3
286 cmpl (r3),r0
287 bgequ noname.15
288 incl r1
289noname.15:
290
291 subl2 r0,(r3)
292
293 cmpl 4(ap),r1
294 bgequ noname.16
295
296 addl2 12(ap),4(ap)
297
298 decl r4
299noname.16:
300
301 subl2 r1,4(ap)
302
303 decl r8
304 beql noname.18
305noname.17:
306
307 ashl #16,r4,r9
308 239
309 ashl #16,4(ap),r2 240h=4 ;(AP) h by value (input)
310 movzwl 2(r3),r0 241l=8 ;(AP) l by value (input)
311 bisl2 r0,r2 242d=12 ;(AP) d by value (input)
312 bicl3 #0,r2,4(ap)
313 243
314 bicl3 #-65536,(r3),r0 244;aprim=r5
315 ashl #16,r0,(r3) 245;a2=r6
316 brw noname.7 246;a20=r6
317 nop 247;a21=r7
318noname.18: 248;bprim=r8
249;b2=r9
250;qprim=r10 ; initially used as q''
251;rprim=r11 ; initially used as r''
319 252
320 bisl2 r4,r9
321 253
322 movl r9,r10 254 .psect code,nowrt
323 255
324noname.3: 256.entry bn_div_words,^m<r2,r3,r4,r5,r6,r7,r8,r9,r10,r11>
257 movl l(ap),r2
258 movl h(ap),r3
259 movl d(ap),r4
260
261 movl #0,r5
262 movl #0,r8
263 movl #0,r0
264; movl #0,r1
265
266 rotl #-1,r2,r6 ; a20 = l >> 1 (almost)
267 rotl #-1,r3,r7 ; a21 = h >> 1 (almost)
268 rotl #-1,r4,r9 ; b2 = d >> 1 (almost)
269
270 tstl r6
271 bgeq 1$
272 xorl2 #^X80000000,r6 ; fixup a20 so highest bit is 0
273 incl r5 ; a' = 1
2741$:
275 tstl r7
276 bgeq 2$
277 xorl2 #^X80000000,r6 ; fixup a20 so highest bit is 1,
278 ; since that's what was lowest in a21
279 xorl2 #^X80000000,r7 ; fixup a21 so highest bit is 1
2802$:
281 tstl r9
282 beql 666$ ; Uh-oh, the divisor is 0...
283 bgtr 3$
284 xorl2 #^X80000000,r9 ; fixup b2 so highest bit is 0
285 incl r8 ; b' = 1
2863$:
287 tstl r9
288 bneq 4$ ; if b2 is 0, we know that b' is 1
289 tstl r3
290 bneq 666$ ; if higher half isn't 0, we overflow
291 movl r2,r10 ; otherwise, we have our result
292 brb 42$ ; This is a success, really.
2934$:
294 ediv r9,r6,r10,r11
295
296 tstl r8
297 bneq 5$ ; If b' != 0, go to the other part
298; addl3 r11,r11,r1
299; addl2 r5,r1
300 brb 42$
3015$:
302 ashl #1,r11,r11
303 subl2 r10,r11
304 addl2 r5,r11
305 bgeq 7$
3066$:
307 decl r10
308 addl2 r4,r11
309 blss 6$
3107$:
311; movl r11,r1
31242$:
325 movl r10,r0 313 movl r10,r0
326 ret 314666$:
327 tstl r0 315 ret
328
329 316
330 .psect code,nowrt 317 .title vax_bn_add_words unsigned add of two arrays
331 318;
332.entry BN_ADD_WORDS,^m<r2,r3,r4,r5,r6,r7> 319; Richard Levitte 20-Nov-2000
333 320;
334 tstl 16(ap) 321; ULONG bn_add_words(ULONG r[], ULONG a[], ULONG b[], int n) {
335 bgtr noname.21 322; ULONG c = 0;
336 clrl r7 323; int i;
337 brw noname.22 324; for (i = 0; i < n; i++) <c,r[i]> = a[i] + b[i] + c;
338noname.21: 325; return(c);
339 326; }
340 clrl r4
341
342 tstl r0
343noname.23:
344
345 movl 8(ap),r6
346 addl3 r4,(r6),r2
347
348 bicl2 #0,r2
349
350 clrl r0
351 cmpl r2,r4
352 bgequ vcg.3
353 incl r0
354vcg.3:
355 movl r0,r4
356
357 movl 12(ap),r5
358 addl3 (r5),r2,r1
359 bicl2 #0,r1
360
361 clrl r0
362 cmpl r1,r2
363 bgequ vcg.4
364 incl r0
365vcg.4:
366 addl2 r0,r4
367
368 movl 4(ap),r3
369 movl r1,(r3)
370
371 decl 16(ap)
372 bgtr gen.1
373 brw noname.25
374gen.1:
375noname.24:
376
377 addl3 r4,4(r6),r2
378
379 bicl2 #0,r2
380
381 clrl r0
382 cmpl r2,r4
383 bgequ vcg.5
384 incl r0
385vcg.5:
386 movl r0,r4
387
388 addl3 4(r5),r2,r1
389 bicl2 #0,r1
390
391 clrl r0
392 cmpl r1,r2
393 bgequ vcg.6
394 incl r0
395vcg.6:
396 addl2 r0,r4
397
398 movl r1,4(r3)
399
400 decl 16(ap)
401 bleq noname.25
402noname.26:
403
404 addl3 r4,8(r6),r2
405
406 bicl2 #0,r2
407
408 clrl r0
409 cmpl r2,r4
410 bgequ vcg.7
411 incl r0
412vcg.7:
413 movl r0,r4
414
415 addl3 8(r5),r2,r1
416 bicl2 #0,r1
417
418 clrl r0
419 cmpl r1,r2
420 bgequ vcg.8
421 incl r0
422vcg.8:
423 addl2 r0,r4
424
425 movl r1,8(r3)
426
427 decl 16(ap)
428 bleq noname.25
429noname.27:
430
431 addl3 r4,12(r6),r2
432
433 bicl2 #0,r2
434
435 clrl r0
436 cmpl r2,r4
437 bgequ vcg.9
438 incl r0
439vcg.9:
440 movl r0,r4
441
442 addl3 12(r5),r2,r1
443 bicl2 #0,r1
444
445 clrl r0
446 cmpl r1,r2
447 bgequ vcg.10
448 incl r0
449vcg.10:
450 addl2 r0,r4
451 327
452 movl r1,12(r3) 328r=4 ;(AP) r by reference (output)
329a=8 ;(AP) a by reference (input)
330b=12 ;(AP) b by reference (input)
331n=16 ;(AP) n by value (input)
453 332
454 decl 16(ap)
455 bleq noname.25
456noname.28:
457 333
458 addl3 #16,r6,8(ap) 334 .psect code,nowrt
459 335
460 addl3 #16,r5,12(ap) 336.entry bn_add_words,^m<r2,r3,r4,r5,r6>
461 337
462 addl3 #16,r3,4(ap) 338 moval @r(ap),r2
463 brw noname.23 339 moval @a(ap),r3
464 tstl r0 340 moval @b(ap),r4
465noname.25: 341 movl n(ap),r5 ; assumed >0 by C code
342 clrl r0 ; c
466 343
467 movl r4,r7 344 tstl r5 ; carry = 0
345 bleq 666$
468 346
469noname.22: 3470$:
470 movl r7,r0 348 movl (r3)+,r6 ; carry untouched
471 ret 349 adwc (r4)+,r6 ; carry used and touched
472 nop 350 movl r6,(r2)+ ; carry untouched
351 sobgtr r5,0$ ; carry untouched
473 352
353 adwc #0,r0
354666$:
355 ret
474 356
357 .title vax_bn_sub_words unsigned add of two arrays
358;
359; Richard Levitte 20-Nov-2000
360;
361; ULONG bn_sub_words(ULONG r[], ULONG a[], ULONG b[], int n) {
362; ULONG c = 0;
363; int i;
364; for (i = 0; i < n; i++) <c,r[i]> = a[i] - b[i] - c;
365; return(c);
366; }
475 367
476;r=4 ;(AP) 368r=4 ;(AP) r by reference (output)
477;a=8 ;(AP) 369a=8 ;(AP) a by reference (input)
478;b=12 ;(AP) 370b=12 ;(AP) b by reference (input)
479;n=16 ;(AP) n by value (input) 371n=16 ;(AP) n by value (input)
480 372
481 .psect code,nowrt
482 373
483.entry BN_SUB_WORDS,^m<r2,r3,r4,r5,r6,r7> 374 .psect code,nowrt
484 375
485 clrl r6 376.entry bn_sub_words,^m<r2,r3,r4,r5,r6>
486 377
487 tstl 16(ap) 378 moval @r(ap),r2
488 bgtr noname.31 379 moval @a(ap),r3
489 clrl r7 380 moval @b(ap),r4
490 brw noname.32 381 movl n(ap),r5 ; assumed >0 by C code
491 tstl r0 382 clrl r0 ; c
492noname.31:
493 383
494noname.33: 384 tstl r5 ; carry = 0
385 bleq 666$
495 386
496 movl 8(ap),r5 3870$:
497 movl (r5),r1 388 movl (r3)+,r6 ; carry untouched
498 movl 12(ap),r4 389 sbwc (r4)+,r6 ; carry used and touched
499 movl (r4),r2 390 movl r6,(r2)+ ; carry untouched
500 391 sobgtr r5,0$ ; carry untouched
501 movl 4(ap),r3
502 subl3 r2,r1,r0
503 subl2 r6,r0
504 bicl3 #0,r0,(r3)
505
506 cmpl r1,r2
507 beql noname.34
508 clrl r0
509 cmpl r1,r2
510 bgequ vcg.11
511 incl r0
512vcg.11:
513 movl r0,r6
514noname.34:
515
516 decl 16(ap)
517 bgtr gen.2
518 brw noname.36
519gen.2:
520noname.35:
521
522 movl 4(r5),r2
523 movl 4(r4),r1
524
525 subl3 r1,r2,r0
526 subl2 r6,r0
527 bicl3 #0,r0,4(r3)
528
529 cmpl r2,r1
530 beql noname.37
531 clrl r0
532 cmpl r2,r1
533 bgequ vcg.12
534 incl r0
535vcg.12:
536 movl r0,r6
537noname.37:
538
539 decl 16(ap)
540 bleq noname.36
541noname.38:
542
543 movl 8(r5),r1
544 movl 8(r4),r2
545
546 subl3 r2,r1,r0
547 subl2 r6,r0
548 bicl3 #0,r0,8(r3)
549
550 cmpl r1,r2
551 beql noname.39
552 clrl r0
553 cmpl r1,r2
554 bgequ vcg.13
555 incl r0
556vcg.13:
557 movl r0,r6
558noname.39:
559
560 decl 16(ap)
561 bleq noname.36
562noname.40:
563
564 movl 12(r5),r1
565 movl 12(r4),r2
566
567 subl3 r2,r1,r0
568 subl2 r6,r0
569 bicl3 #0,r0,12(r3)
570
571 cmpl r1,r2
572 beql noname.41
573 clrl r0
574 cmpl r1,r2
575 bgequ vcg.14
576 incl r0
577vcg.14:
578 movl r0,r6
579noname.41:
580
581 decl 16(ap)
582 bleq noname.36
583noname.42:
584
585 addl3 #16,r5,8(ap)
586
587 addl3 #16,r4,12(ap)
588
589 addl3 #16,r3,4(ap)
590 brw noname.33
591 tstl r0
592noname.36:
593
594 movl r6,r7
595
596noname.32:
597 movl r7,r0
598 ret
599 nop
600 392
393 adwc #0,r0
394666$:
395 ret
601 396
602 397
603;r=4 ;(AP) 398;r=4 ;(AP)
@@ -6615,81 +6410,3 @@ noname.610:
6615 6410
6616; For now, the code below doesn't work, so I end this prematurely. 6411; For now, the code below doesn't work, so I end this prematurely.
6617.end 6412.end
6618
6619 .title vax_bn_div64 division 64/32=>32
6620;
6621; r.l. 16-jan-1998
6622;
6623; unsigned int bn_div64(unsigned long h, unsigned long l, unsigned long d)
6624; return <h,l>/d;
6625;
6626
6627 .psect code,nowrt
6628
6629h=4 ;(AP) by value (input)
6630l=8 ;(AP) by value (input)
6631d=12 ;(AP) by value (input)
6632
6633.entry bn_div64,^m<r2,r3,r4,r5,r6,r7,r8,r9>
6634
6635 movl l(ap),r2 ; l
6636 movl h(ap),r3 ; h
6637 movl d(ap),r4 ; d
6638 clrl r5 ; q
6639 clrl r6 ; r
6640
6641 ; Treat "negative" specially
6642 tstl r3
6643 blss 30$
6644
6645 tstl r4
6646 beql 90$
6647
6648 ediv r4,r2,r5,r6
6649 bvs 666$
6650
6651 movl r5,r0
6652 ret
6653
665430$:
6655 ; The theory here is to do some harmless shifting and a little
6656 ; bit of rounding (brackets are to designate when decimals are
6657 ; cut off):
6658 ;
6659 ; result = 2 * [ ([<h,0>/2] + [d/2]) / d ] + [ l / d ]
6660
6661 movl #0,r7
6662 movl r3,r8 ; copy h
6663 ashq #-1,r7,r7 ; [<h,0>/2] => <r8,r7>
6664 bicl2 #^X80000000,r8 ; Remove "sign"
6665
6666 movl r4,r9 ; copy d
6667 ashl #-1,r9,r9 ; [d/2] => r9
6668 bicl2 #^X80000000,r9 ; Remove "sign"
6669
6670 addl2 r9,r7
6671 adwc #0,r8 ; [<h,0>/2] + [d/2] => <r8,r7>
6672
6673 ediv r4,r7,r5,r6 ; [ ([<h,0>/2] + [d/2]) / d ] => <r5,r6>
6674 bvs 666$
6675
6676 movl #0,r6
6677 ashq #1,r5,r5 ; 2 * [ ([<h,0>/2] + [d/2]) / d ] => r5
6678
6679 movl #0,r3
6680 ediv r4,r2,r8,r9 ; [ l / d ] => <r8,r9>
6681
6682 addl2 r8,r5 ;
6683 bcs 666$
6684
6685 movl r5,r0
6686 ret
6687
668890$:
6689 movl #-1,r0
6690 ret
6691
6692666$:
6693
6694
6695.end
diff --git a/src/lib/libcrypto/bn/bnspeed.c b/src/lib/libcrypto/bn/bnspeed.c
index f7c2790fff..b554ac8cf8 100644
--- a/src/lib/libcrypto/bn/bnspeed.c
+++ b/src/lib/libcrypto/bn/bnspeed.c
@@ -1,3 +1,5 @@
1/* unused */
2
1/* crypto/bn/bnspeed.c */ 3/* crypto/bn/bnspeed.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 4/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 5 * All rights reserved.
@@ -66,14 +68,13 @@
66#include <stdlib.h> 68#include <stdlib.h>
67#include <signal.h> 69#include <signal.h>
68#include <string.h> 70#include <string.h>
69#include "crypto.h" 71#include <openssl/crypto.h>
70#include "err.h" 72#include <openssl/err.h>
71 73
72#ifndef MSDOS 74#if !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC)) && !defined(OPENSSL_SYS_MACOSX)
73#define TIMES 75#define TIMES
74#endif 76#endif
75 77
76#ifndef VMS
77#ifndef _IRIX 78#ifndef _IRIX
78#include <time.h> 79#include <time.h>
79#endif 80#endif
@@ -81,36 +82,33 @@
81#include <sys/types.h> 82#include <sys/types.h>
82#include <sys/times.h> 83#include <sys/times.h>
83#endif 84#endif
84#else /* VMS */ 85
85#include <types.h> 86/* Depending on the VMS version, the tms structure is perhaps defined.
86struct tms { 87 The __TMS macro will show if it was. If it wasn't defined, we should
87 time_t tms_utime; 88 undefine TIMES, since that tells the rest of the program how things
88 time_t tms_stime; 89 should be handled. -- Richard Levitte */
89 time_t tms_uchild; /* I dunno... */ 90#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
90 time_t tms_uchildsys; /* so these names are a guess :-) */ 91#undef TIMES
91 }
92#endif 92#endif
93
93#ifndef TIMES 94#ifndef TIMES
94#include <sys/timeb.h> 95#include <sys/timeb.h>
95#endif 96#endif
96 97
97#ifdef sun 98#if defined(sun) || defined(__ultrix)
99#define _POSIX_SOURCE
98#include <limits.h> 100#include <limits.h>
99#include <sys/param.h> 101#include <sys/param.h>
100#endif 102#endif
101 103
102#include "bn.h" 104#include <openssl/bn.h>
103#include "x509.h" 105#include <openssl/x509.h>
104 106
105/* The following if from times(3) man page. It may need to be changed */ 107/* The following if from times(3) man page. It may need to be changed */
106#ifndef HZ 108#ifndef HZ
107# ifndef CLK_TCK 109# ifndef CLK_TCK
108# ifndef _BSD_CLK_TCK_ /* FreeBSD hack */ 110# ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
109# ifndef VMS 111# define HZ 100.0
110# define HZ 100.0
111# else /* VMS */
112# define HZ 100.0
113# endif
114# else /* _BSD_CLK_TCK_ */ 112# else /* _BSD_CLK_TCK_ */
115# define HZ ((double)_BSD_CLK_TCK_) 113# define HZ ((double)_BSD_CLK_TCK_)
116# endif 114# endif
@@ -123,17 +121,11 @@ struct tms {
123#define BUFSIZE ((long)1024*8) 121#define BUFSIZE ((long)1024*8)
124int run=0; 122int run=0;
125 123
126#ifndef NOPROTO
127static double Time_F(int s); 124static double Time_F(int s);
128#else
129static double Time_F();
130#endif
131
132#define START 0 125#define START 0
133#define STOP 1 126#define STOP 1
134 127
135static double Time_F(s) 128static double Time_F(int s)
136int s;
137 { 129 {
138 double ret; 130 double ret;
139#ifdef TIMES 131#ifdef TIMES
@@ -175,27 +167,20 @@ static int sizes[NUM_SIZES]={128,256,512,1024,2048};
175 167
176void do_mul(BIGNUM *r,BIGNUM *a,BIGNUM *b,BN_CTX *ctx); 168void do_mul(BIGNUM *r,BIGNUM *a,BIGNUM *b,BN_CTX *ctx);
177 169
178int main(argc,argv) 170int main(int argc, char **argv)
179int argc;
180char **argv;
181 { 171 {
182 BN_CTX *ctx; 172 BN_CTX *ctx;
183 BIGNUM *a,*b,*c,*r; 173 BIGNUM a,b,c;
184 174
185 ctx=BN_CTX_new(); 175 ctx=BN_CTX_new();
186 a=BN_new(); 176 BN_init(&a);
187 b=BN_new(); 177 BN_init(&b);
188 c=BN_new(); 178 BN_init(&c);
189 r=BN_new();
190 179
191 do_mul(a,b,c,ctx); 180 do_mul(&a,&b,&c,ctx);
192 } 181 }
193 182
194void do_mul(r,a,b,ctx) 183void do_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b, BN_CTX *ctx)
195BIGNUM *r;
196BIGNUM *a;
197BIGNUM *b;
198BN_CTX *ctx;
199 { 184 {
200 int i,j,k; 185 int i,j,k;
201 double tm; 186 double tm;
@@ -211,7 +196,7 @@ BN_CTX *ctx;
211 BN_rand(b,sizes[j],1,0); 196 BN_rand(b,sizes[j],1,0);
212 Time_F(START); 197 Time_F(START);
213 for (k=0; k<num; k++) 198 for (k=0; k<num; k++)
214 BN_mul(r,b,a); 199 BN_mul(r,b,a,ctx);
215 tm=Time_F(STOP); 200 tm=Time_F(STOP);
216 printf("mul %4d x %4d -> %8.3fms\n",sizes[i],sizes[j],tm*1000.0/num); 201 printf("mul %4d x %4d -> %8.3fms\n",sizes[i],sizes[j],tm*1000.0/num);
217 } 202 }
diff --git a/src/lib/libcrypto/bn/bntest.c b/src/lib/libcrypto/bn/bntest.c
index 9ebd68b429..443cf420e5 100644
--- a/src/lib/libcrypto/bn/bntest.c
+++ b/src/lib/libcrypto/bn/bntest.c
@@ -59,65 +59,70 @@
59#include <stdio.h> 59#include <stdio.h>
60#include <stdlib.h> 60#include <stdlib.h>
61#include <string.h> 61#include <string.h>
62
62#include "e_os.h" 63#include "e_os.h"
63#include "bio.h"
64#include "bn.h"
65#include "rand.h"
66#include "x509.h"
67#include "err.h"
68 64
69#ifdef WINDOWS 65#include <openssl/bio.h>
66#include <openssl/bn.h>
67#include <openssl/rand.h>
68#include <openssl/x509.h>
69#include <openssl/err.h>
70
71#ifdef OPENSSL_SYS_WINDOWS
70#include "../bio/bss_file.c" 72#include "../bio/bss_file.c"
71#endif 73#endif
72 74
73#ifndef NOPROTO 75const int num0 = 100; /* number of tests */
74int test_add (BIO *bp); 76const int num1 = 50; /* additional tests for some functions */
75int test_sub (BIO *bp); 77const int num2 = 5; /* number of tests for slow functions */
76int test_lshift1 (BIO *bp); 78
77int test_lshift (BIO *bp); 79int test_add(BIO *bp);
78int test_rshift1 (BIO *bp); 80int test_sub(BIO *bp);
79int test_rshift (BIO *bp); 81int test_lshift1(BIO *bp);
80int test_div (BIO *bp,BN_CTX *ctx); 82int test_lshift(BIO *bp,BN_CTX *ctx,BIGNUM *a_);
81int test_mul (BIO *bp); 83int test_rshift1(BIO *bp);
82int test_sqr (BIO *bp,BN_CTX *ctx); 84int test_rshift(BIO *bp,BN_CTX *ctx);
83int test_mont (BIO *bp,BN_CTX *ctx); 85int test_div(BIO *bp,BN_CTX *ctx);
84int test_mod (BIO *bp,BN_CTX *ctx); 86int test_div_recp(BIO *bp,BN_CTX *ctx);
85int test_mod_mul (BIO *bp,BN_CTX *ctx); 87int test_mul(BIO *bp);
86int test_mod_exp (BIO *bp,BN_CTX *ctx); 88int test_sqr(BIO *bp,BN_CTX *ctx);
89int test_mont(BIO *bp,BN_CTX *ctx);
90int test_mod(BIO *bp,BN_CTX *ctx);
91int test_mod_mul(BIO *bp,BN_CTX *ctx);
92int test_mod_exp(BIO *bp,BN_CTX *ctx);
93int test_exp(BIO *bp,BN_CTX *ctx);
94int test_kron(BIO *bp,BN_CTX *ctx);
95int test_sqrt(BIO *bp,BN_CTX *ctx);
87int rand_neg(void); 96int rand_neg(void);
88#else
89int test_add ();
90int test_sub ();
91int test_lshift1 ();
92int test_lshift ();
93int test_rshift1 ();
94int test_rshift ();
95int test_div ();
96int test_mul ();
97int test_sqr ();
98int test_mont ();
99int test_mod ();
100int test_mod_mul ();
101int test_mod_exp ();
102int rand_neg();
103#endif
104
105static int results=0; 97static int results=0;
106 98
107#ifdef NO_STDIO 99#ifdef OPENSSL_NO_STDIO
108#define APPS_WIN16 100#define APPS_WIN16
109#include "bss_file.c" 101#include "bss_file.c"
110#endif 102#endif
111 103
112int main(argc,argv) 104static unsigned char lst[]="\xC6\x4F\x43\x04\x2A\xEA\xCA\x6E\x58\x36\x80\x5B\xE8\xC9"
113int argc; 105"\x9B\x04\x5D\x48\x36\xC2\xFD\x16\xC9\x64\xF0";
114char *argv[]; 106
107static const char rnd_seed[] = "string to make the random number generator think it has entropy";
108
109static void message(BIO *out, char *m)
110 {
111 fprintf(stderr, "test %s\n", m);
112 BIO_puts(out, "print \"test ");
113 BIO_puts(out, m);
114 BIO_puts(out, "\\n\"\n");
115 }
116
117int main(int argc, char *argv[])
115 { 118 {
116 BN_CTX *ctx; 119 BN_CTX *ctx;
117 BIO *out; 120 BIO *out;
118 char *outfile=NULL; 121 char *outfile=NULL;
119 122
120 srand((unsigned int)time(NULL)); 123 results = 0;
124
125 RAND_seed(rnd_seed, sizeof rnd_seed); /* or BN_generate_prime may fail */
121 126
122 argc--; 127 argc--;
123 argv++; 128 argv++;
@@ -156,361 +161,516 @@ char *argv[];
156 if (!results) 161 if (!results)
157 BIO_puts(out,"obase=16\nibase=16\n"); 162 BIO_puts(out,"obase=16\nibase=16\n");
158 163
159 fprintf(stderr,"test BN_add\n"); 164 message(out,"BN_add");
160 if (!test_add(out)) goto err; 165 if (!test_add(out)) goto err;
161 fflush(stdout); 166 BIO_flush(out);
162 167
163 fprintf(stderr,"test BN_sub\n"); 168 message(out,"BN_sub");
164 if (!test_sub(out)) goto err; 169 if (!test_sub(out)) goto err;
165 fflush(stdout); 170 BIO_flush(out);
166 171
167 fprintf(stderr,"test BN_lshift1\n"); 172 message(out,"BN_lshift1");
168 if (!test_lshift1(out)) goto err; 173 if (!test_lshift1(out)) goto err;
169 fflush(stdout); 174 BIO_flush(out);
175
176 message(out,"BN_lshift (fixed)");
177 if (!test_lshift(out,ctx,BN_bin2bn(lst,sizeof(lst)-1,NULL)))
178 goto err;
179 BIO_flush(out);
170 180
171 fprintf(stderr,"test BN_lshift\n"); 181 message(out,"BN_lshift");
172 if (!test_lshift(out)) goto err; 182 if (!test_lshift(out,ctx,NULL)) goto err;
173 fflush(stdout); 183 BIO_flush(out);
174 184
175 fprintf(stderr,"test BN_rshift1\n"); 185 message(out,"BN_rshift1");
176 if (!test_rshift1(out)) goto err; 186 if (!test_rshift1(out)) goto err;
177 fflush(stdout); 187 BIO_flush(out);
178 188
179 fprintf(stderr,"test BN_rshift\n"); 189 message(out,"BN_rshift");
180 if (!test_rshift(out)) goto err; 190 if (!test_rshift(out,ctx)) goto err;
181 fflush(stdout); 191 BIO_flush(out);
182 192
183 fprintf(stderr,"test BN_sqr\n"); 193 message(out,"BN_sqr");
184 if (!test_sqr(out,ctx)) goto err; 194 if (!test_sqr(out,ctx)) goto err;
185 fflush(stdout); 195 BIO_flush(out);
186 196
187 fprintf(stderr,"test BN_mul\n"); 197 message(out,"BN_mul");
188 if (!test_mul(out)) goto err; 198 if (!test_mul(out)) goto err;
189 fflush(stdout); 199 BIO_flush(out);
190 200
191 fprintf(stderr,"test BN_div\n"); 201 message(out,"BN_div");
192 if (!test_div(out,ctx)) goto err; 202 if (!test_div(out,ctx)) goto err;
193 fflush(stdout); 203 BIO_flush(out);
194 204
195 fprintf(stderr,"test BN_mod\n"); 205 message(out,"BN_div_recp");
206 if (!test_div_recp(out,ctx)) goto err;
207 BIO_flush(out);
208
209 message(out,"BN_mod");
196 if (!test_mod(out,ctx)) goto err; 210 if (!test_mod(out,ctx)) goto err;
197 fflush(stdout); 211 BIO_flush(out);
198 212
199 fprintf(stderr,"test BN_mod_mul\n"); 213 message(out,"BN_mod_mul");
200 if (!test_mod_mul(out,ctx)) goto err; 214 if (!test_mod_mul(out,ctx)) goto err;
201 fflush(stdout); 215 BIO_flush(out);
202 216
203/* 217 message(out,"BN_mont");
204 fprintf(stderr,"test BN_mont\n");
205 if (!test_mont(out,ctx)) goto err; 218 if (!test_mont(out,ctx)) goto err;
206 fflush(stdout); 219 BIO_flush(out);
207*/ 220
208 fprintf(stderr,"test BN_mod_exp\n"); 221 message(out,"BN_mod_exp");
209 if (!test_mod_exp(out,ctx)) goto err; 222 if (!test_mod_exp(out,ctx)) goto err;
210 fflush(stdout); 223 BIO_flush(out);
224
225 message(out,"BN_exp");
226 if (!test_exp(out,ctx)) goto err;
227 BIO_flush(out);
228
229 message(out,"BN_kronecker");
230 if (!test_kron(out,ctx)) goto err;
231 BIO_flush(out);
232
233 message(out,"BN_mod_sqrt");
234 if (!test_sqrt(out,ctx)) goto err;
235 BIO_flush(out);
236
237 BN_CTX_free(ctx);
238 BIO_free(out);
211 239
212/**/ 240/**/
213 exit(0); 241 exit(0);
214err: 242err:
243 BIO_puts(out,"1\n"); /* make sure the Perl script fed by bc notices
244 * the failure, see test_bn in test/Makefile.ssl*/
245 BIO_flush(out);
215 ERR_load_crypto_strings(); 246 ERR_load_crypto_strings();
216 ERR_print_errors(out); 247 ERR_print_errors_fp(stderr);
217 exit(1); 248 exit(1);
218 return(1); 249 return(1);
219 } 250 }
220 251
221int test_add(bp) 252int test_add(BIO *bp)
222BIO *bp;
223 { 253 {
224 BIGNUM *a,*b,*c; 254 BIGNUM a,b,c;
225 int i; 255 int i;
226 int j;
227 256
228 a=BN_new(); 257 BN_init(&a);
229 b=BN_new(); 258 BN_init(&b);
230 c=BN_new(); 259 BN_init(&c);
231 260
232 BN_rand(a,512,0,0); 261 BN_bntest_rand(&a,512,0,0);
233 for (i=0; i<100; i++) 262 for (i=0; i<num0; i++)
234 { 263 {
235 BN_rand(b,450+i,0,0); 264 BN_bntest_rand(&b,450+i,0,0);
236 a->neg=rand_neg(); 265 a.neg=rand_neg();
237 b->neg=rand_neg(); 266 b.neg=rand_neg();
238 if (bp == NULL) 267 BN_add(&c,&a,&b);
239 for (j=0; j<10000; j++)
240 BN_add(c,a,b);
241 BN_add(c,a,b);
242 if (bp != NULL) 268 if (bp != NULL)
243 { 269 {
244 if (!results) 270 if (!results)
245 { 271 {
246 BN_print(bp,a); 272 BN_print(bp,&a);
247 BIO_puts(bp," + "); 273 BIO_puts(bp," + ");
248 BN_print(bp,b); 274 BN_print(bp,&b);
249 BIO_puts(bp," - "); 275 BIO_puts(bp," - ");
250 } 276 }
251 BN_print(bp,c); 277 BN_print(bp,&c);
252 BIO_puts(bp,"\n"); 278 BIO_puts(bp,"\n");
253 } 279 }
280 a.neg=!a.neg;
281 b.neg=!b.neg;
282 BN_add(&c,&c,&b);
283 BN_add(&c,&c,&a);
284 if(!BN_is_zero(&c))
285 {
286 fprintf(stderr,"Add test failed!\n");
287 return 0;
288 }
254 } 289 }
255 BN_free(a); 290 BN_free(&a);
256 BN_free(b); 291 BN_free(&b);
257 BN_free(c); 292 BN_free(&c);
258 return(1); 293 return(1);
259 } 294 }
260 295
261int test_sub(bp) 296int test_sub(BIO *bp)
262BIO *bp;
263 { 297 {
264 BIGNUM *a,*b,*c; 298 BIGNUM a,b,c;
265 int i; 299 int i;
266 int j;
267 300
268 a=BN_new(); 301 BN_init(&a);
269 b=BN_new(); 302 BN_init(&b);
270 c=BN_new(); 303 BN_init(&c);
271 304
272 BN_rand(a,512,0,0); 305 for (i=0; i<num0+num1; i++)
273 for (i=0; i<100; i++)
274 { 306 {
275 BN_rand(b,400+i,0,0); 307 if (i < num1)
276 a->neg=rand_neg(); 308 {
277 b->neg=rand_neg(); 309 BN_bntest_rand(&a,512,0,0);
278 if (bp == NULL) 310 BN_copy(&b,&a);
279 for (j=0; j<10000; j++) 311 if (BN_set_bit(&a,i)==0) return(0);
280 BN_sub(c,a,b); 312 BN_add_word(&b,i);
281 BN_sub(c,a,b); 313 }
314 else
315 {
316 BN_bntest_rand(&b,400+i-num1,0,0);
317 a.neg=rand_neg();
318 b.neg=rand_neg();
319 }
320 BN_sub(&c,&a,&b);
282 if (bp != NULL) 321 if (bp != NULL)
283 { 322 {
284 if (!results) 323 if (!results)
285 { 324 {
286 BN_print(bp,a); 325 BN_print(bp,&a);
287 BIO_puts(bp," - "); 326 BIO_puts(bp," - ");
288 BN_print(bp,b); 327 BN_print(bp,&b);
289 BIO_puts(bp," - "); 328 BIO_puts(bp," - ");
290 } 329 }
291 BN_print(bp,c); 330 BN_print(bp,&c);
292 BIO_puts(bp,"\n"); 331 BIO_puts(bp,"\n");
293 } 332 }
333 BN_add(&c,&c,&b);
334 BN_sub(&c,&c,&a);
335 if(!BN_is_zero(&c))
336 {
337 fprintf(stderr,"Subtract test failed!\n");
338 return 0;
339 }
294 } 340 }
295 BN_free(a); 341 BN_free(&a);
296 BN_free(b); 342 BN_free(&b);
297 BN_free(c); 343 BN_free(&c);
298 return(1); 344 return(1);
299 } 345 }
300 346
301int test_div(bp,ctx) 347int test_div(BIO *bp, BN_CTX *ctx)
302BIO *bp;
303BN_CTX *ctx;
304 { 348 {
305 BIGNUM *a,*b,*c,*d; 349 BIGNUM a,b,c,d,e;
306 int i; 350 int i;
307 int j;
308 351
309 a=BN_new(); 352 BN_init(&a);
310 b=BN_new(); 353 BN_init(&b);
311 c=BN_new(); 354 BN_init(&c);
312 d=BN_new(); 355 BN_init(&d);
356 BN_init(&e);
313 357
314 BN_rand(a,400,0,0); 358 for (i=0; i<num0+num1; i++)
315 for (i=0; i<100; i++)
316 { 359 {
317 BN_rand(b,50+i,0,0); 360 if (i < num1)
318 a->neg=rand_neg(); 361 {
319 b->neg=rand_neg(); 362 BN_bntest_rand(&a,400,0,0);
320 if (bp == NULL) 363 BN_copy(&b,&a);
321 for (j=0; j<100; j++) 364 BN_lshift(&a,&a,i);
322 BN_div(d,c,a,b,ctx); 365 BN_add_word(&a,i);
323 BN_div(d,c,a,b,ctx); 366 }
367 else
368 BN_bntest_rand(&b,50+3*(i-num1),0,0);
369 a.neg=rand_neg();
370 b.neg=rand_neg();
371 BN_div(&d,&c,&a,&b,ctx);
324 if (bp != NULL) 372 if (bp != NULL)
325 { 373 {
326 if (!results) 374 if (!results)
327 { 375 {
328 BN_print(bp,a); 376 BN_print(bp,&a);
329 BIO_puts(bp," / "); 377 BIO_puts(bp," / ");
330 BN_print(bp,b); 378 BN_print(bp,&b);
331 BIO_puts(bp," - "); 379 BIO_puts(bp," - ");
332 } 380 }
333 BN_print(bp,d); 381 BN_print(bp,&d);
334 BIO_puts(bp,"\n"); 382 BIO_puts(bp,"\n");
335 383
336 if (!results) 384 if (!results)
337 { 385 {
338 BN_print(bp,a); 386 BN_print(bp,&a);
339 BIO_puts(bp," % "); 387 BIO_puts(bp," % ");
340 BN_print(bp,b); 388 BN_print(bp,&b);
341 BIO_puts(bp," - "); 389 BIO_puts(bp," - ");
342 } 390 }
343 BN_print(bp,c); 391 BN_print(bp,&c);
344 BIO_puts(bp,"\n"); 392 BIO_puts(bp,"\n");
345 } 393 }
394 BN_mul(&e,&d,&b,ctx);
395 BN_add(&d,&e,&c);
396 BN_sub(&d,&d,&a);
397 if(!BN_is_zero(&d))
398 {
399 fprintf(stderr,"Division test failed!\n");
400 return 0;
401 }
346 } 402 }
347 BN_free(a); 403 BN_free(&a);
348 BN_free(b); 404 BN_free(&b);
349 BN_free(c); 405 BN_free(&c);
350 BN_free(d); 406 BN_free(&d);
407 BN_free(&e);
351 return(1); 408 return(1);
352 } 409 }
353 410
354int test_mul(bp) 411int test_div_recp(BIO *bp, BN_CTX *ctx)
355BIO *bp;
356 { 412 {
357 BIGNUM *a,*b,*c; 413 BIGNUM a,b,c,d,e;
414 BN_RECP_CTX recp;
358 int i; 415 int i;
359 int j;
360 416
361 a=BN_new(); 417 BN_RECP_CTX_init(&recp);
362 b=BN_new(); 418 BN_init(&a);
363 c=BN_new(); 419 BN_init(&b);
420 BN_init(&c);
421 BN_init(&d);
422 BN_init(&e);
364 423
365 BN_rand(a,200,0,0); 424 for (i=0; i<num0+num1; i++)
366 for (i=0; i<100; i++)
367 { 425 {
368 BN_rand(b,250+i,0,0); 426 if (i < num1)
369 a->neg=rand_neg(); 427 {
370 b->neg=rand_neg(); 428 BN_bntest_rand(&a,400,0,0);
371 if (bp == NULL) 429 BN_copy(&b,&a);
372 for (j=0; j<100; j++) 430 BN_lshift(&a,&a,i);
373 BN_mul(c,a,b); 431 BN_add_word(&a,i);
374 BN_mul(c,a,b); 432 }
433 else
434 BN_bntest_rand(&b,50+3*(i-num1),0,0);
435 a.neg=rand_neg();
436 b.neg=rand_neg();
437 BN_RECP_CTX_set(&recp,&b,ctx);
438 BN_div_recp(&d,&c,&a,&recp,ctx);
375 if (bp != NULL) 439 if (bp != NULL)
376 { 440 {
377 if (!results) 441 if (!results)
378 { 442 {
379 BN_print(bp,a); 443 BN_print(bp,&a);
444 BIO_puts(bp," / ");
445 BN_print(bp,&b);
446 BIO_puts(bp," - ");
447 }
448 BN_print(bp,&d);
449 BIO_puts(bp,"\n");
450
451 if (!results)
452 {
453 BN_print(bp,&a);
454 BIO_puts(bp," % ");
455 BN_print(bp,&b);
456 BIO_puts(bp," - ");
457 }
458 BN_print(bp,&c);
459 BIO_puts(bp,"\n");
460 }
461 BN_mul(&e,&d,&b,ctx);
462 BN_add(&d,&e,&c);
463 BN_sub(&d,&d,&a);
464 if(!BN_is_zero(&d))
465 {
466 fprintf(stderr,"Reciprocal division test failed!\n");
467 fprintf(stderr,"a=");
468 BN_print_fp(stderr,&a);
469 fprintf(stderr,"\nb=");
470 BN_print_fp(stderr,&b);
471 fprintf(stderr,"\n");
472 return 0;
473 }
474 }
475 BN_free(&a);
476 BN_free(&b);
477 BN_free(&c);
478 BN_free(&d);
479 BN_free(&e);
480 BN_RECP_CTX_free(&recp);
481 return(1);
482 }
483
484int test_mul(BIO *bp)
485 {
486 BIGNUM a,b,c,d,e;
487 int i;
488 BN_CTX *ctx;
489
490 ctx = BN_CTX_new();
491 if (ctx == NULL) exit(1);
492
493 BN_init(&a);
494 BN_init(&b);
495 BN_init(&c);
496 BN_init(&d);
497 BN_init(&e);
498
499 for (i=0; i<num0+num1; i++)
500 {
501 if (i <= num1)
502 {
503 BN_bntest_rand(&a,100,0,0);
504 BN_bntest_rand(&b,100,0,0);
505 }
506 else
507 BN_bntest_rand(&b,i-num1,0,0);
508 a.neg=rand_neg();
509 b.neg=rand_neg();
510 BN_mul(&c,&a,&b,ctx);
511 if (bp != NULL)
512 {
513 if (!results)
514 {
515 BN_print(bp,&a);
380 BIO_puts(bp," * "); 516 BIO_puts(bp," * ");
381 BN_print(bp,b); 517 BN_print(bp,&b);
382 BIO_puts(bp," - "); 518 BIO_puts(bp," - ");
383 } 519 }
384 BN_print(bp,c); 520 BN_print(bp,&c);
385 BIO_puts(bp,"\n"); 521 BIO_puts(bp,"\n");
386 } 522 }
523 BN_div(&d,&e,&c,&a,ctx);
524 BN_sub(&d,&d,&b);
525 if(!BN_is_zero(&d) || !BN_is_zero(&e))
526 {
527 fprintf(stderr,"Multiplication test failed!\n");
528 return 0;
529 }
387 } 530 }
388 BN_free(a); 531 BN_free(&a);
389 BN_free(b); 532 BN_free(&b);
390 BN_free(c); 533 BN_free(&c);
534 BN_free(&d);
535 BN_free(&e);
536 BN_CTX_free(ctx);
391 return(1); 537 return(1);
392 } 538 }
393 539
394int test_sqr(bp,ctx) 540int test_sqr(BIO *bp, BN_CTX *ctx)
395BIO *bp;
396BN_CTX *ctx;
397 { 541 {
398 BIGNUM *a,*c; 542 BIGNUM a,c,d,e;
399 int i; 543 int i;
400 int j;
401 544
402 a=BN_new(); 545 BN_init(&a);
403 c=BN_new(); 546 BN_init(&c);
547 BN_init(&d);
548 BN_init(&e);
404 549
405 for (i=0; i<40; i++) 550 for (i=0; i<num0; i++)
406 { 551 {
407 BN_rand(a,40+i*10,0,0); 552 BN_bntest_rand(&a,40+i*10,0,0);
408 a->neg=rand_neg(); 553 a.neg=rand_neg();
409 if (bp == NULL) 554 BN_sqr(&c,&a,ctx);
410 for (j=0; j<100; j++)
411 BN_sqr(c,a,ctx);
412 BN_sqr(c,a,ctx);
413 if (bp != NULL) 555 if (bp != NULL)
414 { 556 {
415 if (!results) 557 if (!results)
416 { 558 {
417 BN_print(bp,a); 559 BN_print(bp,&a);
418 BIO_puts(bp," * "); 560 BIO_puts(bp," * ");
419 BN_print(bp,a); 561 BN_print(bp,&a);
420 BIO_puts(bp," - "); 562 BIO_puts(bp," - ");
421 } 563 }
422 BN_print(bp,c); 564 BN_print(bp,&c);
423 BIO_puts(bp,"\n"); 565 BIO_puts(bp,"\n");
424 } 566 }
567 BN_div(&d,&e,&c,&a,ctx);
568 BN_sub(&d,&d,&a);
569 if(!BN_is_zero(&d) || !BN_is_zero(&e))
570 {
571 fprintf(stderr,"Square test failed!\n");
572 return 0;
573 }
425 } 574 }
426 BN_free(a); 575 BN_free(&a);
427 BN_free(c); 576 BN_free(&c);
577 BN_free(&d);
578 BN_free(&e);
428 return(1); 579 return(1);
429 } 580 }
430 581
431int test_mont(bp,ctx) 582int test_mont(BIO *bp, BN_CTX *ctx)
432BIO *bp;
433BN_CTX *ctx;
434 { 583 {
435 BIGNUM *a,*b,*c,*A,*B; 584 BIGNUM a,b,c,d,A,B;
436 BIGNUM *n; 585 BIGNUM n;
437 int i; 586 int i;
438 int j;
439 BN_MONT_CTX *mont; 587 BN_MONT_CTX *mont;
440 588
441 a=BN_new(); 589 BN_init(&a);
442 b=BN_new(); 590 BN_init(&b);
443 c=BN_new(); 591 BN_init(&c);
444 A=BN_new(); 592 BN_init(&d);
445 B=BN_new(); 593 BN_init(&A);
446 n=BN_new(); 594 BN_init(&B);
595 BN_init(&n);
447 596
448 mont=BN_MONT_CTX_new(); 597 mont=BN_MONT_CTX_new();
449 598
450 BN_rand(a,100,0,0); /**/ 599 BN_bntest_rand(&a,100,0,0); /**/
451 BN_rand(b,100,0,0); /**/ 600 BN_bntest_rand(&b,100,0,0); /**/
452 for (i=0; i<10; i++) 601 for (i=0; i<num2; i++)
453 { 602 {
454 BN_rand(n,(100%BN_BITS2+1)*BN_BITS2*i*BN_BITS2,0,1); /**/ 603 int bits = (200*(i+1))/num2;
455 BN_MONT_CTX_set(mont,n,ctx); 604
605 if (bits == 0)
606 continue;
607 BN_bntest_rand(&n,bits,0,1);
608 BN_MONT_CTX_set(mont,&n,ctx);
456 609
457 BN_to_montgomery(A,a,mont,ctx); 610 BN_nnmod(&a,&a,&n,ctx);
458 BN_to_montgomery(B,b,mont,ctx); 611 BN_nnmod(&b,&b,&n,ctx);
459 612
460 if (bp == NULL) 613 BN_to_montgomery(&A,&a,mont,ctx);
461 for (j=0; j<100; j++) 614 BN_to_montgomery(&B,&b,mont,ctx);
462 BN_mod_mul_montgomery(c,A,B,mont,ctx);/**/ 615
463 BN_mod_mul_montgomery(c,A,B,mont,ctx);/**/ 616 BN_mod_mul_montgomery(&c,&A,&B,mont,ctx);/**/
464 BN_from_montgomery(A,c,mont,ctx);/**/ 617 BN_from_montgomery(&A,&c,mont,ctx);/**/
465 if (bp != NULL) 618 if (bp != NULL)
466 { 619 {
467 if (!results) 620 if (!results)
468 { 621 {
469#ifdef undef 622#ifdef undef
470fprintf(stderr,"%d * %d %% %d\n", 623fprintf(stderr,"%d * %d %% %d\n",
471BN_num_bits(a), 624BN_num_bits(&a),
472BN_num_bits(b), 625BN_num_bits(&b),
473BN_num_bits(mont->N)); 626BN_num_bits(mont->N));
474#endif 627#endif
475 BN_print(bp,a); 628 BN_print(bp,&a);
476 BIO_puts(bp," * "); 629 BIO_puts(bp," * ");
477 BN_print(bp,b); 630 BN_print(bp,&b);
478 BIO_puts(bp," % "); 631 BIO_puts(bp," % ");
479 BN_print(bp,mont->N); 632 BN_print(bp,&(mont->N));
480 BIO_puts(bp," - "); 633 BIO_puts(bp," - ");
481 } 634 }
482 BN_print(bp,A); 635 BN_print(bp,&A);
483 BIO_puts(bp,"\n"); 636 BIO_puts(bp,"\n");
484 } 637 }
638 BN_mod_mul(&d,&a,&b,&n,ctx);
639 BN_sub(&d,&d,&A);
640 if(!BN_is_zero(&d))
641 {
642 fprintf(stderr,"Montgomery multiplication test failed!\n");
643 return 0;
644 }
485 } 645 }
486 BN_MONT_CTX_free(mont); 646 BN_MONT_CTX_free(mont);
487 BN_free(a); 647 BN_free(&a);
488 BN_free(b); 648 BN_free(&b);
489 BN_free(c); 649 BN_free(&c);
650 BN_free(&d);
651 BN_free(&A);
652 BN_free(&B);
653 BN_free(&n);
490 return(1); 654 return(1);
491 } 655 }
492 656
493int test_mod(bp,ctx) 657int test_mod(BIO *bp, BN_CTX *ctx)
494BIO *bp;
495BN_CTX *ctx;
496 { 658 {
497 BIGNUM *a,*b,*c; 659 BIGNUM *a,*b,*c,*d,*e;
498 int i; 660 int i;
499 int j;
500 661
501 a=BN_new(); 662 a=BN_new();
502 b=BN_new(); 663 b=BN_new();
503 c=BN_new(); 664 c=BN_new();
665 d=BN_new();
666 e=BN_new();
504 667
505 BN_rand(a,1024,0,0); /**/ 668 BN_bntest_rand(a,1024,0,0); /**/
506 for (i=0; i<20; i++) 669 for (i=0; i<num0; i++)
507 { 670 {
508 BN_rand(b,450+i*10,0,0); /**/ 671 BN_bntest_rand(b,450+i*10,0,0); /**/
509 a->neg=rand_neg(); 672 a->neg=rand_neg();
510 b->neg=rand_neg(); 673 b->neg=rand_neg();
511 if (bp == NULL)
512 for (j=0; j<100; j++)
513 BN_mod(c,a,b,ctx);/**/
514 BN_mod(c,a,b,ctx);/**/ 674 BN_mod(c,a,b,ctx);/**/
515 if (bp != NULL) 675 if (bp != NULL)
516 { 676 {
@@ -524,19 +684,26 @@ BN_CTX *ctx;
524 BN_print(bp,c); 684 BN_print(bp,c);
525 BIO_puts(bp,"\n"); 685 BIO_puts(bp,"\n");
526 } 686 }
687 BN_div(d,e,a,b,ctx);
688 BN_sub(e,e,c);
689 if(!BN_is_zero(e))
690 {
691 fprintf(stderr,"Modulo test failed!\n");
692 return 0;
693 }
527 } 694 }
528 BN_free(a); 695 BN_free(a);
529 BN_free(b); 696 BN_free(b);
530 BN_free(c); 697 BN_free(c);
698 BN_free(d);
699 BN_free(e);
531 return(1); 700 return(1);
532 } 701 }
533 702
534int test_mod_mul(bp,ctx) 703int test_mod_mul(BIO *bp, BN_CTX *ctx)
535BIO *bp;
536BN_CTX *ctx;
537 { 704 {
538 BIGNUM *a,*b,*c,*d,*e; 705 BIGNUM *a,*b,*c,*d,*e;
539 int i; 706 int i,j;
540 707
541 a=BN_new(); 708 a=BN_new();
542 b=BN_new(); 709 b=BN_new();
@@ -544,17 +711,14 @@ BN_CTX *ctx;
544 d=BN_new(); 711 d=BN_new();
545 e=BN_new(); 712 e=BN_new();
546 713
547 BN_rand(c,1024,0,0); /**/ 714 for (j=0; j<3; j++) {
548 for (i=0; i<10; i++) 715 BN_bntest_rand(c,1024,0,0); /**/
716 for (i=0; i<num0; i++)
549 { 717 {
550 BN_rand(a,475+i*10,0,0); /**/ 718 BN_bntest_rand(a,475+i*10,0,0); /**/
551 BN_rand(b,425+i*10,0,0); /**/ 719 BN_bntest_rand(b,425+i*11,0,0); /**/
552 a->neg=rand_neg(); 720 a->neg=rand_neg();
553 b->neg=rand_neg(); 721 b->neg=rand_neg();
554 /* if (bp == NULL)
555 for (j=0; j<100; j++)
556 BN_mod_mul(d,a,b,c,ctx);*/ /**/
557
558 if (!BN_mod_mul(e,a,b,c,ctx)) 722 if (!BN_mod_mul(e,a,b,c,ctx))
559 { 723 {
560 unsigned long l; 724 unsigned long l;
@@ -573,12 +737,32 @@ BN_CTX *ctx;
573 BN_print(bp,b); 737 BN_print(bp,b);
574 BIO_puts(bp," % "); 738 BIO_puts(bp," % ");
575 BN_print(bp,c); 739 BN_print(bp,c);
740 if ((a->neg ^ b->neg) && !BN_is_zero(e))
741 {
742 /* If (a*b) % c is negative, c must be added
743 * in order to obtain the normalized remainder
744 * (new with OpenSSL 0.9.7, previous versions of
745 * BN_mod_mul could generate negative results)
746 */
747 BIO_puts(bp," + ");
748 BN_print(bp,c);
749 }
576 BIO_puts(bp," - "); 750 BIO_puts(bp," - ");
577 } 751 }
578 BN_print(bp,e); 752 BN_print(bp,e);
579 BIO_puts(bp,"\n"); 753 BIO_puts(bp,"\n");
580 } 754 }
755 BN_mul(d,a,b,ctx);
756 BN_sub(d,d,e);
757 BN_div(a,b,d,c,ctx);
758 if(!BN_is_zero(b))
759 {
760 fprintf(stderr,"Modulo multiply test failed!\n");
761 ERR_print_errors_fp(stderr);
762 return 0;
763 }
581 } 764 }
765 }
582 BN_free(a); 766 BN_free(a);
583 BN_free(b); 767 BN_free(b);
584 BN_free(c); 768 BN_free(c);
@@ -587,9 +771,7 @@ BN_CTX *ctx;
587 return(1); 771 return(1);
588 } 772 }
589 773
590int test_mod_exp(bp,ctx) 774int test_mod_exp(BIO *bp, BN_CTX *ctx)
591BIO *bp;
592BN_CTX *ctx;
593 { 775 {
594 BIGNUM *a,*b,*c,*d,*e; 776 BIGNUM *a,*b,*c,*d,*e;
595 int i; 777 int i;
@@ -600,11 +782,11 @@ BN_CTX *ctx;
600 d=BN_new(); 782 d=BN_new();
601 e=BN_new(); 783 e=BN_new();
602 784
603 BN_rand(c,30,0,1); /* must be odd for montgomery */ 785 BN_bntest_rand(c,30,0,1); /* must be odd for montgomery */
604 for (i=0; i<6; i++) 786 for (i=0; i<num2; i++)
605 { 787 {
606 BN_rand(a,20+i*5,0,0); /**/ 788 BN_bntest_rand(a,20+i*5,0,0); /**/
607 BN_rand(b,2+i,0,0); /**/ 789 BN_bntest_rand(b,2+i,0,0); /**/
608 790
609 if (!BN_mod_exp(d,a,b,c,ctx)) 791 if (!BN_mod_exp(d,a,b,c,ctx))
610 return(00); 792 return(00);
@@ -623,6 +805,14 @@ BN_CTX *ctx;
623 BN_print(bp,d); 805 BN_print(bp,d);
624 BIO_puts(bp,"\n"); 806 BIO_puts(bp,"\n");
625 } 807 }
808 BN_exp(e,a,b,ctx);
809 BN_sub(e,e,d);
810 BN_div(a,b,e,c,ctx);
811 if(!BN_is_zero(b))
812 {
813 fprintf(stderr,"Modulo exponentiation test failed!\n");
814 return 0;
815 }
626 } 816 }
627 BN_free(a); 817 BN_free(a);
628 BN_free(b); 818 BN_free(b);
@@ -632,20 +822,252 @@ BN_CTX *ctx;
632 return(1); 822 return(1);
633 } 823 }
634 824
635int test_lshift(bp) 825int test_exp(BIO *bp, BN_CTX *ctx)
636BIO *bp;
637 { 826 {
638 BIGNUM *a,*b,*c; 827 BIGNUM *a,*b,*d,*e,*one;
639 int i; 828 int i;
640 829
641 a=BN_new(); 830 a=BN_new();
642 b=BN_new(); 831 b=BN_new();
832 d=BN_new();
833 e=BN_new();
834 one=BN_new();
835 BN_one(one);
836
837 for (i=0; i<num2; i++)
838 {
839 BN_bntest_rand(a,20+i*5,0,0); /**/
840 BN_bntest_rand(b,2+i,0,0); /**/
841
842 if (!BN_exp(d,a,b,ctx))
843 return(00);
844
845 if (bp != NULL)
846 {
847 if (!results)
848 {
849 BN_print(bp,a);
850 BIO_puts(bp," ^ ");
851 BN_print(bp,b);
852 BIO_puts(bp," - ");
853 }
854 BN_print(bp,d);
855 BIO_puts(bp,"\n");
856 }
857 BN_one(e);
858 for( ; !BN_is_zero(b) ; BN_sub(b,b,one))
859 BN_mul(e,e,a,ctx);
860 BN_sub(e,e,d);
861 if(!BN_is_zero(e))
862 {
863 fprintf(stderr,"Exponentiation test failed!\n");
864 return 0;
865 }
866 }
867 BN_free(a);
868 BN_free(b);
869 BN_free(d);
870 BN_free(e);
871 BN_free(one);
872 return(1);
873 }
874
875static void genprime_cb(int p, int n, void *arg)
876 {
877 char c='*';
878
879 if (p == 0) c='.';
880 if (p == 1) c='+';
881 if (p == 2) c='*';
882 if (p == 3) c='\n';
883 putc(c, stderr);
884 fflush(stderr);
885 (void)n;
886 (void)arg;
887 }
888
889int test_kron(BIO *bp, BN_CTX *ctx)
890 {
891 BIGNUM *a,*b,*r,*t;
892 int i;
893 int legendre, kronecker;
894 int ret = 0;
895
896 a = BN_new();
897 b = BN_new();
898 r = BN_new();
899 t = BN_new();
900 if (a == NULL || b == NULL || r == NULL || t == NULL) goto err;
901
902 /* We test BN_kronecker(a, b, ctx) just for b odd (Jacobi symbol).
903 * In this case we know that if b is prime, then BN_kronecker(a, b, ctx)
904 * is congruent to $a^{(b-1)/2}$, modulo $b$ (Legendre symbol).
905 * So we generate a random prime b and compare these values
906 * for a number of random a's. (That is, we run the Solovay-Strassen
907 * primality test to confirm that b is prime, except that we
908 * don't want to test whether b is prime but whether BN_kronecker
909 * works.) */
910
911 if (!BN_generate_prime(b, 512, 0, NULL, NULL, genprime_cb, NULL)) goto err;
912 b->neg = rand_neg();
913 putc('\n', stderr);
914
915 for (i = 0; i < num0; i++)
916 {
917 if (!BN_bntest_rand(a, 512, 0, 0)) goto err;
918 a->neg = rand_neg();
919
920 /* t := (|b|-1)/2 (note that b is odd) */
921 if (!BN_copy(t, b)) goto err;
922 t->neg = 0;
923 if (!BN_sub_word(t, 1)) goto err;
924 if (!BN_rshift1(t, t)) goto err;
925 /* r := a^t mod b */
926 b->neg=0;
927
928 if (!BN_mod_exp_recp(r, a, t, b, ctx)) goto err; /* XXX should be BN_mod_exp_recp, but ..._recp triggers a bug that must be fixed */
929 b->neg=1;
930
931 if (BN_is_word(r, 1))
932 legendre = 1;
933 else if (BN_is_zero(r))
934 legendre = 0;
935 else
936 {
937 if (!BN_add_word(r, 1)) goto err;
938 if (0 != BN_ucmp(r, b))
939 {
940 fprintf(stderr, "Legendre symbol computation failed\n");
941 goto err;
942 }
943 legendre = -1;
944 }
945
946 kronecker = BN_kronecker(a, b, ctx);
947 if (kronecker < -1) goto err;
948 /* we actually need BN_kronecker(a, |b|) */
949 if (a->neg && b->neg)
950 kronecker = -kronecker;
951
952 if (legendre != kronecker)
953 {
954 fprintf(stderr, "legendre != kronecker; a = ");
955 BN_print_fp(stderr, a);
956 fprintf(stderr, ", b = ");
957 BN_print_fp(stderr, b);
958 fprintf(stderr, "\n");
959 goto err;
960 }
961
962 putc('.', stderr);
963 fflush(stderr);
964 }
965
966 putc('\n', stderr);
967 fflush(stderr);
968 ret = 1;
969 err:
970 if (a != NULL) BN_free(a);
971 if (b != NULL) BN_free(b);
972 if (r != NULL) BN_free(r);
973 if (t != NULL) BN_free(t);
974 return ret;
975 }
976
977int test_sqrt(BIO *bp, BN_CTX *ctx)
978 {
979 BIGNUM *a,*p,*r;
980 int i, j;
981 int ret = 0;
982
983 a = BN_new();
984 p = BN_new();
985 r = BN_new();
986 if (a == NULL || p == NULL || r == NULL) goto err;
987
988 for (i = 0; i < 16; i++)
989 {
990 if (i < 8)
991 {
992 unsigned primes[8] = { 2, 3, 5, 7, 11, 13, 17, 19 };
993
994 if (!BN_set_word(p, primes[i])) goto err;
995 }
996 else
997 {
998 if (!BN_set_word(a, 32)) goto err;
999 if (!BN_set_word(r, 2*i + 1)) goto err;
1000
1001 if (!BN_generate_prime(p, 256, 0, a, r, genprime_cb, NULL)) goto err;
1002 putc('\n', stderr);
1003 }
1004 p->neg = rand_neg();
1005
1006 for (j = 0; j < num2; j++)
1007 {
1008 /* construct 'a' such that it is a square modulo p,
1009 * but in general not a proper square and not reduced modulo p */
1010 if (!BN_bntest_rand(r, 256, 0, 3)) goto err;
1011 if (!BN_nnmod(r, r, p, ctx)) goto err;
1012 if (!BN_mod_sqr(r, r, p, ctx)) goto err;
1013 if (!BN_bntest_rand(a, 256, 0, 3)) goto err;
1014 if (!BN_nnmod(a, a, p, ctx)) goto err;
1015 if (!BN_mod_sqr(a, a, p, ctx)) goto err;
1016 if (!BN_mul(a, a, r, ctx)) goto err;
1017 if (rand_neg())
1018 if (!BN_sub(a, a, p)) goto err;
1019
1020 if (!BN_mod_sqrt(r, a, p, ctx)) goto err;
1021 if (!BN_mod_sqr(r, r, p, ctx)) goto err;
1022
1023 if (!BN_nnmod(a, a, p, ctx)) goto err;
1024
1025 if (BN_cmp(a, r) != 0)
1026 {
1027 fprintf(stderr, "BN_mod_sqrt failed: a = ");
1028 BN_print_fp(stderr, a);
1029 fprintf(stderr, ", r = ");
1030 BN_print_fp(stderr, r);
1031 fprintf(stderr, ", p = ");
1032 BN_print_fp(stderr, p);
1033 fprintf(stderr, "\n");
1034 goto err;
1035 }
1036
1037 putc('.', stderr);
1038 fflush(stderr);
1039 }
1040
1041 putc('\n', stderr);
1042 fflush(stderr);
1043 }
1044 ret = 1;
1045 err:
1046 if (a != NULL) BN_free(a);
1047 if (p != NULL) BN_free(p);
1048 if (r != NULL) BN_free(r);
1049 return ret;
1050 }
1051
1052int test_lshift(BIO *bp,BN_CTX *ctx,BIGNUM *a_)
1053 {
1054 BIGNUM *a,*b,*c,*d;
1055 int i;
1056
1057 b=BN_new();
643 c=BN_new(); 1058 c=BN_new();
1059 d=BN_new();
644 BN_one(c); 1060 BN_one(c);
645 1061
646 BN_rand(a,200,0,0); /**/ 1062 if(a_)
647 a->neg=rand_neg(); 1063 a=a_;
648 for (i=0; i<70; i++) 1064 else
1065 {
1066 a=BN_new();
1067 BN_bntest_rand(a,200,0,0); /**/
1068 a->neg=rand_neg();
1069 }
1070 for (i=0; i<num0; i++)
649 { 1071 {
650 BN_lshift(b,a,i+1); 1072 BN_lshift(b,a,i+1);
651 BN_add(c,c,c); 1073 BN_add(c,c,c);
@@ -661,25 +1083,42 @@ BIO *bp;
661 BN_print(bp,b); 1083 BN_print(bp,b);
662 BIO_puts(bp,"\n"); 1084 BIO_puts(bp,"\n");
663 } 1085 }
1086 BN_mul(d,a,c,ctx);
1087 BN_sub(d,d,b);
1088 if(!BN_is_zero(d))
1089 {
1090 fprintf(stderr,"Left shift test failed!\n");
1091 fprintf(stderr,"a=");
1092 BN_print_fp(stderr,a);
1093 fprintf(stderr,"\nb=");
1094 BN_print_fp(stderr,b);
1095 fprintf(stderr,"\nc=");
1096 BN_print_fp(stderr,c);
1097 fprintf(stderr,"\nd=");
1098 BN_print_fp(stderr,d);
1099 fprintf(stderr,"\n");
1100 return 0;
1101 }
664 } 1102 }
665 BN_free(a); 1103 BN_free(a);
666 BN_free(b); 1104 BN_free(b);
667 BN_free(c); 1105 BN_free(c);
1106 BN_free(d);
668 return(1); 1107 return(1);
669 } 1108 }
670 1109
671int test_lshift1(bp) 1110int test_lshift1(BIO *bp)
672BIO *bp;
673 { 1111 {
674 BIGNUM *a,*b; 1112 BIGNUM *a,*b,*c;
675 int i; 1113 int i;
676 1114
677 a=BN_new(); 1115 a=BN_new();
678 b=BN_new(); 1116 b=BN_new();
1117 c=BN_new();
679 1118
680 BN_rand(a,200,0,0); /**/ 1119 BN_bntest_rand(a,200,0,0); /**/
681 a->neg=rand_neg(); 1120 a->neg=rand_neg();
682 for (i=0; i<70; i++) 1121 for (i=0; i<num0; i++)
683 { 1122 {
684 BN_lshift1(b,a); 1123 BN_lshift1(b,a);
685 if (bp != NULL) 1124 if (bp != NULL)
@@ -693,27 +1132,37 @@ BIO *bp;
693 BN_print(bp,b); 1132 BN_print(bp,b);
694 BIO_puts(bp,"\n"); 1133 BIO_puts(bp,"\n");
695 } 1134 }
1135 BN_add(c,a,a);
1136 BN_sub(a,b,c);
1137 if(!BN_is_zero(a))
1138 {
1139 fprintf(stderr,"Left shift one test failed!\n");
1140 return 0;
1141 }
1142
696 BN_copy(a,b); 1143 BN_copy(a,b);
697 } 1144 }
698 BN_free(a); 1145 BN_free(a);
699 BN_free(b); 1146 BN_free(b);
1147 BN_free(c);
700 return(1); 1148 return(1);
701 } 1149 }
702 1150
703int test_rshift(bp) 1151int test_rshift(BIO *bp,BN_CTX *ctx)
704BIO *bp;
705 { 1152 {
706 BIGNUM *a,*b,*c; 1153 BIGNUM *a,*b,*c,*d,*e;
707 int i; 1154 int i;
708 1155
709 a=BN_new(); 1156 a=BN_new();
710 b=BN_new(); 1157 b=BN_new();
711 c=BN_new(); 1158 c=BN_new();
1159 d=BN_new();
1160 e=BN_new();
712 BN_one(c); 1161 BN_one(c);
713 1162
714 BN_rand(a,200,0,0); /**/ 1163 BN_bntest_rand(a,200,0,0); /**/
715 a->neg=rand_neg(); 1164 a->neg=rand_neg();
716 for (i=0; i<70; i++) 1165 for (i=0; i<num0; i++)
717 { 1166 {
718 BN_rshift(b,a,i+1); 1167 BN_rshift(b,a,i+1);
719 BN_add(c,c,c); 1168 BN_add(c,c,c);
@@ -729,25 +1178,34 @@ BIO *bp;
729 BN_print(bp,b); 1178 BN_print(bp,b);
730 BIO_puts(bp,"\n"); 1179 BIO_puts(bp,"\n");
731 } 1180 }
1181 BN_div(d,e,a,c,ctx);
1182 BN_sub(d,d,b);
1183 if(!BN_is_zero(d))
1184 {
1185 fprintf(stderr,"Right shift test failed!\n");
1186 return 0;
1187 }
732 } 1188 }
733 BN_free(a); 1189 BN_free(a);
734 BN_free(b); 1190 BN_free(b);
735 BN_free(c); 1191 BN_free(c);
1192 BN_free(d);
1193 BN_free(e);
736 return(1); 1194 return(1);
737 } 1195 }
738 1196
739int test_rshift1(bp) 1197int test_rshift1(BIO *bp)
740BIO *bp;
741 { 1198 {
742 BIGNUM *a,*b; 1199 BIGNUM *a,*b,*c;
743 int i; 1200 int i;
744 1201
745 a=BN_new(); 1202 a=BN_new();
746 b=BN_new(); 1203 b=BN_new();
1204 c=BN_new();
747 1205
748 BN_rand(a,200,0,0); /**/ 1206 BN_bntest_rand(a,200,0,0); /**/
749 a->neg=rand_neg(); 1207 a->neg=rand_neg();
750 for (i=0; i<70; i++) 1208 for (i=0; i<num0; i++)
751 { 1209 {
752 BN_rshift1(b,a); 1210 BN_rshift1(b,a);
753 if (bp != NULL) 1211 if (bp != NULL)
@@ -761,14 +1219,22 @@ BIO *bp;
761 BN_print(bp,b); 1219 BN_print(bp,b);
762 BIO_puts(bp,"\n"); 1220 BIO_puts(bp,"\n");
763 } 1221 }
1222 BN_sub(c,a,b);
1223 BN_sub(c,c,b);
1224 if(!BN_is_zero(c) && !BN_abs_is_word(c, 1))
1225 {
1226 fprintf(stderr,"Right shift one test failed!\n");
1227 return 0;
1228 }
764 BN_copy(a,b); 1229 BN_copy(a,b);
765 } 1230 }
766 BN_free(a); 1231 BN_free(a);
767 BN_free(b); 1232 BN_free(b);
1233 BN_free(c);
768 return(1); 1234 return(1);
769 } 1235 }
770 1236
771int rand_neg() 1237int rand_neg(void)
772 { 1238 {
773 static unsigned int neg=0; 1239 static unsigned int neg=0;
774 static int sign[8]={0,0,0,1,1,0,1,1}; 1240 static int sign[8]={0,0,0,1,1,0,1,1};
diff --git a/src/lib/libcrypto/bn/exp.c b/src/lib/libcrypto/bn/exp.c
index ec443459d8..4865b0ef74 100644
--- a/src/lib/libcrypto/bn/exp.c
+++ b/src/lib/libcrypto/bn/exp.c
@@ -1,3 +1,5 @@
1/* unused */
2
1#include <stdio.h> 3#include <stdio.h>
2#include <openssl/tmdiff.h> 4#include <openssl/tmdiff.h>
3#include "bn_lcl.h" 5#include "bn_lcl.h"
diff --git a/src/lib/libcrypto/bn/expspeed.c b/src/lib/libcrypto/bn/expspeed.c
index 344f883d35..07a1bcf51c 100644
--- a/src/lib/libcrypto/bn/expspeed.c
+++ b/src/lib/libcrypto/bn/expspeed.c
@@ -1,3 +1,5 @@
1/* unused */
2
1/* crypto/bn/expspeed.c */ 3/* crypto/bn/expspeed.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 4/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 5 * All rights reserved.
@@ -59,6 +61,31 @@
59/* most of this code has been pilfered from my libdes speed.c program */ 61/* most of this code has been pilfered from my libdes speed.c program */
60 62
61#define BASENUM 5000 63#define BASENUM 5000
64#define NUM_START 0
65
66
67/* determine timings for modexp, modmul, modsqr, gcd, Kronecker symbol,
68 * modular inverse, or modular square roots */
69#define TEST_EXP
70#undef TEST_MUL
71#undef TEST_SQR
72#undef TEST_GCD
73#undef TEST_KRON
74#undef TEST_INV
75#undef TEST_SQRT
76#define P_MOD_64 9 /* least significant 6 bits for prime to be used for BN_sqrt timings */
77
78#if defined(TEST_EXP) + defined(TEST_MUL) + defined(TEST_SQR) + defined(TEST_GCD) + defined(TEST_KRON) + defined(TEST_INV) +defined(TEST_SQRT) != 1
79# error "choose one test"
80#endif
81
82#if defined(TEST_INV) || defined(TEST_SQRT)
83# define C_PRIME
84static void genprime_cb(int p, int n, void *arg);
85#endif
86
87
88
62#undef PROG 89#undef PROG
63#define PROG bnspeed_main 90#define PROG bnspeed_main
64 91
@@ -66,14 +93,14 @@
66#include <stdlib.h> 93#include <stdlib.h>
67#include <signal.h> 94#include <signal.h>
68#include <string.h> 95#include <string.h>
69#include "crypto.h" 96#include <openssl/crypto.h>
70#include "err.h" 97#include <openssl/err.h>
98#include <openssl/rand.h>
71 99
72#ifndef MSDOS 100#if !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC)) && !defined(OPENSSL_SYS_MACOSX)
73#define TIMES 101#define TIMES
74#endif 102#endif
75 103
76#ifndef VMS
77#ifndef _IRIX 104#ifndef _IRIX
78#include <time.h> 105#include <time.h>
79#endif 106#endif
@@ -81,36 +108,33 @@
81#include <sys/types.h> 108#include <sys/types.h>
82#include <sys/times.h> 109#include <sys/times.h>
83#endif 110#endif
84#else /* VMS */ 111
85#include <types.h> 112/* Depending on the VMS version, the tms structure is perhaps defined.
86struct tms { 113 The __TMS macro will show if it was. If it wasn't defined, we should
87 time_t tms_utime; 114 undefine TIMES, since that tells the rest of the program how things
88 time_t tms_stime; 115 should be handled. -- Richard Levitte */
89 time_t tms_uchild; /* I dunno... */ 116#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
90 time_t tms_uchildsys; /* so these names are a guess :-) */ 117#undef TIMES
91 }
92#endif 118#endif
119
93#ifndef TIMES 120#ifndef TIMES
94#include <sys/timeb.h> 121#include <sys/timeb.h>
95#endif 122#endif
96 123
97#ifdef sun 124#if defined(sun) || defined(__ultrix)
125#define _POSIX_SOURCE
98#include <limits.h> 126#include <limits.h>
99#include <sys/param.h> 127#include <sys/param.h>
100#endif 128#endif
101 129
102#include "bn.h" 130#include <openssl/bn.h>
103#include "x509.h" 131#include <openssl/x509.h>
104 132
105/* The following if from times(3) man page. It may need to be changed */ 133/* The following if from times(3) man page. It may need to be changed */
106#ifndef HZ 134#ifndef HZ
107# ifndef CLK_TCK 135# ifndef CLK_TCK
108# ifndef _BSD_CLK_TCK_ /* FreeBSD hack */ 136# ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
109# ifndef VMS 137# define HZ 100.0
110# define HZ 100.0
111# else /* VMS */
112# define HZ 100.0
113# endif
114# else /* _BSD_CLK_TCK_ */ 138# else /* _BSD_CLK_TCK_ */
115# define HZ ((double)_BSD_CLK_TCK_) 139# define HZ ((double)_BSD_CLK_TCK_)
116# endif 140# endif
@@ -123,17 +147,11 @@ struct tms {
123#define BUFSIZE ((long)1024*8) 147#define BUFSIZE ((long)1024*8)
124int run=0; 148int run=0;
125 149
126#ifndef NOPROTO
127static double Time_F(int s); 150static double Time_F(int s);
128#else
129static double Time_F();
130#endif
131
132#define START 0 151#define START 0
133#define STOP 1 152#define STOP 1
134 153
135static double Time_F(s) 154static double Time_F(int s)
136int s;
137 { 155 {
138 double ret; 156 double ret;
139#ifdef TIMES 157#ifdef TIMES
@@ -169,62 +187,167 @@ int s;
169#endif 187#endif
170 } 188 }
171 189
172#define NUM_SIZES 6 190#define NUM_SIZES 7
173static int sizes[NUM_SIZES]={256,512,1024,2048,4096,8192}; 191#if NUM_START > NUM_SIZES
174static int mul_c[NUM_SIZES]={8*8*8*8*8,8*8*8*8,8*8*8,8*8,8,1}; 192# error "NUM_START > NUM_SIZES"
193#endif
194static int sizes[NUM_SIZES]={128,256,512,1024,2048,4096,8192};
195static int mul_c[NUM_SIZES]={8*8*8*8*8*8,8*8*8*8*8,8*8*8*8,8*8*8,8*8,8,1};
175/*static int sizes[NUM_SIZES]={59,179,299,419,539}; */ 196/*static int sizes[NUM_SIZES]={59,179,299,419,539}; */
176 197
198#define RAND_SEED(string) { const char str[] = string; RAND_seed(string, sizeof str); }
199
177void do_mul_exp(BIGNUM *r,BIGNUM *a,BIGNUM *b,BIGNUM *c,BN_CTX *ctx); 200void do_mul_exp(BIGNUM *r,BIGNUM *a,BIGNUM *b,BIGNUM *c,BN_CTX *ctx);
178 201
179int main(argc,argv) 202int main(int argc, char **argv)
180int argc;
181char **argv;
182 { 203 {
183 BN_CTX *ctx; 204 BN_CTX *ctx;
184 BIGNUM *a,*b,*c,*r; 205 BIGNUM *a,*b,*c,*r;
185 206
207#if 1
208 if (!CRYPTO_set_mem_debug_functions(0,0,0,0,0))
209 abort();
210#endif
211
186 ctx=BN_CTX_new(); 212 ctx=BN_CTX_new();
187 a=BN_new(); 213 a=BN_new();
188 b=BN_new(); 214 b=BN_new();
189 c=BN_new(); 215 c=BN_new();
190 r=BN_new(); 216 r=BN_new();
191 217
218 while (!RAND_status())
219 /* not enough bits */
220 RAND_SEED("I demand a manual recount!");
221
192 do_mul_exp(r,a,b,c,ctx); 222 do_mul_exp(r,a,b,c,ctx);
223 return 0;
193 } 224 }
194 225
195void do_mul_exp(r,a,b,c,ctx) 226void do_mul_exp(BIGNUM *r, BIGNUM *a, BIGNUM *b, BIGNUM *c, BN_CTX *ctx)
196BIGNUM *r;
197BIGNUM *a;
198BIGNUM *b;
199BIGNUM *c;
200BN_CTX *ctx;
201 { 227 {
202 int i,k; 228 int i,k;
203 double tm; 229 double tm;
204 long num; 230 long num;
205 BN_MONT_CTX m;
206
207 memset(&m,0,sizeof(m));
208 231
209 num=BASENUM; 232 num=BASENUM;
210 for (i=0; i<NUM_SIZES; i++) 233 for (i=NUM_START; i<NUM_SIZES; i++)
211 { 234 {
212 BN_rand(a,sizes[i],1,0); 235#ifdef C_PRIME
213 BN_rand(b,sizes[i],1,0); 236# ifdef TEST_SQRT
214 BN_rand(c,sizes[i],1,1); 237 if (!BN_set_word(a, 64)) goto err;
215 BN_mod(a,a,c,ctx); 238 if (!BN_set_word(b, P_MOD_64)) goto err;
216 BN_mod(b,b,c,ctx); 239# define ADD a
217 240# define REM b
218 BN_MONT_CTX_set(&m,c,ctx); 241# else
242# define ADD NULL
243# define REM NULL
244# endif
245 if (!BN_generate_prime(c,sizes[i],0,ADD,REM,genprime_cb,NULL)) goto err;
246 putc('\n', stderr);
247 fflush(stderr);
248#endif
219 249
220 Time_F(START);
221 for (k=0; k<num; k++) 250 for (k=0; k<num; k++)
222 BN_mod_exp_mont(r,a,b,c,ctx,&m); 251 {
252 if (k%50 == 0) /* Average over num/50 different choices of random numbers. */
253 {
254 if (!BN_pseudo_rand(a,sizes[i],1,0)) goto err;
255
256 if (!BN_pseudo_rand(b,sizes[i],1,0)) goto err;
257
258#ifndef C_PRIME
259 if (!BN_pseudo_rand(c,sizes[i],1,1)) goto err;
260#endif
261
262#ifdef TEST_SQRT
263 if (!BN_mod_sqr(a,a,c,ctx)) goto err;
264 if (!BN_mod_sqr(b,b,c,ctx)) goto err;
265#else
266 if (!BN_nnmod(a,a,c,ctx)) goto err;
267 if (!BN_nnmod(b,b,c,ctx)) goto err;
268#endif
269
270 if (k == 0)
271 Time_F(START);
272 }
273
274#if defined(TEST_EXP)
275 if (!BN_mod_exp(r,a,b,c,ctx)) goto err;
276#elif defined(TEST_MUL)
277 {
278 int i = 0;
279 for (i = 0; i < 50; i++)
280 if (!BN_mod_mul(r,a,b,c,ctx)) goto err;
281 }
282#elif defined(TEST_SQR)
283 {
284 int i = 0;
285 for (i = 0; i < 50; i++)
286 {
287 if (!BN_mod_sqr(r,a,c,ctx)) goto err;
288 if (!BN_mod_sqr(r,b,c,ctx)) goto err;
289 }
290 }
291#elif defined(TEST_GCD)
292 if (!BN_gcd(r,a,b,ctx)) goto err;
293 if (!BN_gcd(r,b,c,ctx)) goto err;
294 if (!BN_gcd(r,c,a,ctx)) goto err;
295#elif defined(TEST_KRON)
296 if (-2 == BN_kronecker(a,b,ctx)) goto err;
297 if (-2 == BN_kronecker(b,c,ctx)) goto err;
298 if (-2 == BN_kronecker(c,a,ctx)) goto err;
299#elif defined(TEST_INV)
300 if (!BN_mod_inverse(r,a,c,ctx)) goto err;
301 if (!BN_mod_inverse(r,b,c,ctx)) goto err;
302#else /* TEST_SQRT */
303 if (!BN_mod_sqrt(r,a,c,ctx)) goto err;
304 if (!BN_mod_sqrt(r,b,c,ctx)) goto err;
305#endif
306 }
223 tm=Time_F(STOP); 307 tm=Time_F(STOP);
224 printf("mul %4d ^ %4d %% %d -> %8.3fms %5.1f\n",sizes[i],sizes[i],sizes[i],tm*1000.0/num,tm*mul_c[i]/num); 308 printf(
309#if defined(TEST_EXP)
310 "modexp %4d ^ %4d %% %4d"
311#elif defined(TEST_MUL)
312 "50*modmul %4d %4d %4d"
313#elif defined(TEST_SQR)
314 "100*modsqr %4d %4d %4d"
315#elif defined(TEST_GCD)
316 "3*gcd %4d %4d %4d"
317#elif defined(TEST_KRON)
318 "3*kronecker %4d %4d %4d"
319#elif defined(TEST_INV)
320 "2*inv %4d %4d mod %4d"
321#else /* TEST_SQRT */
322 "2*sqrt [prime == %d (mod 64)] %4d %4d mod %4d"
323#endif
324 " -> %8.3fms %5.1f (%ld)\n",
325#ifdef TEST_SQRT
326 P_MOD_64,
327#endif
328 sizes[i],sizes[i],sizes[i],tm*1000.0/num,tm*mul_c[i]/num, num);
225 num/=7; 329 num/=7;
226 if (num <= 0) num=1; 330 if (num <= 0) num=1;
227 } 331 }
332 return;
228 333
334 err:
335 ERR_print_errors_fp(stderr);
229 } 336 }
230 337
338
339#ifdef C_PRIME
340static void genprime_cb(int p, int n, void *arg)
341 {
342 char c='*';
343
344 if (p == 0) c='.';
345 if (p == 1) c='+';
346 if (p == 2) c='*';
347 if (p == 3) c='\n';
348 putc(c, stderr);
349 fflush(stderr);
350 (void)n;
351 (void)arg;
352 }
353#endif
diff --git a/src/lib/libcrypto/bn/exptest.c b/src/lib/libcrypto/bn/exptest.c
index 67dc95d726..5ca570d1a8 100644
--- a/src/lib/libcrypto/bn/exptest.c
+++ b/src/lib/libcrypto/bn/exptest.c
@@ -59,30 +59,37 @@
59#include <stdio.h> 59#include <stdio.h>
60#include <stdlib.h> 60#include <stdlib.h>
61#include <string.h> 61#include <string.h>
62#include "bio.h" 62#include <openssl/bio.h>
63#include "bn.h" 63#include <openssl/bn.h>
64#include "rand.h" 64#include <openssl/rand.h>
65#include "err.h" 65#include <openssl/err.h>
66#ifdef WINDOWS 66#ifdef OPENSSL_SYS_WINDOWS
67#include "../bio/bss_file.c" 67#include "../bio/bss_file.c"
68#endif 68#endif
69 69
70#define NUM_BITS (BN_BITS*2) 70#define NUM_BITS (BN_BITS*2)
71 71
72int main(argc,argv) 72static const char rnd_seed[] = "string to make the random number generator think it has entropy";
73int argc; 73
74char *argv[]; 74int main(int argc, char *argv[])
75 { 75 {
76 BN_CTX *ctx; 76 BN_CTX *ctx;
77 BIO *out=NULL; 77 BIO *out=NULL;
78 int i,ret; 78 int i,ret;
79 unsigned char c; 79 unsigned char c;
80 BIGNUM *r_mont,*r_recp,*a,*b,*m; 80 BIGNUM *r_mont,*r_recp,*r_simple,*a,*b,*m;
81
82 RAND_seed(rnd_seed, sizeof rnd_seed); /* or BN_rand may fail, and we don't
83 * even check its return value
84 * (which we should) */
85
86 ERR_load_BN_strings();
81 87
82 ctx=BN_CTX_new(); 88 ctx=BN_CTX_new();
83 if (ctx == NULL) exit(1); 89 if (ctx == NULL) exit(1);
84 r_mont=BN_new(); 90 r_mont=BN_new();
85 r_recp=BN_new(); 91 r_recp=BN_new();
92 r_simple=BN_new();
86 a=BN_new(); 93 a=BN_new();
87 b=BN_new(); 94 b=BN_new();
88 m=BN_new(); 95 m=BN_new();
@@ -114,29 +121,61 @@ char *argv[];
114 121
115 ret=BN_mod_exp_mont(r_mont,a,b,m,ctx,NULL); 122 ret=BN_mod_exp_mont(r_mont,a,b,m,ctx,NULL);
116 if (ret <= 0) 123 if (ret <= 0)
117 { printf("BN_mod_exp_mont() problems\n"); exit(1); } 124 {
125 printf("BN_mod_exp_mont() problems\n");
126 ERR_print_errors(out);
127 exit(1);
128 }
118 129
119 ret=BN_mod_exp_recp(r_recp,a,b,m,ctx); 130 ret=BN_mod_exp_recp(r_recp,a,b,m,ctx);
120 if (ret <= 0) 131 if (ret <= 0)
121 { printf("BN_mod_exp_recp() problems\n"); exit(1); }
122
123 if (BN_cmp(r_mont,r_recp) != 0)
124 { 132 {
125 printf("\nmont and recp results differ\n"); 133 printf("BN_mod_exp_recp() problems\n");
134 ERR_print_errors(out);
135 exit(1);
136 }
137
138 ret=BN_mod_exp_simple(r_simple,a,b,m,ctx);
139 if (ret <= 0)
140 {
141 printf("BN_mod_exp_simple() problems\n");
142 ERR_print_errors(out);
143 exit(1);
144 }
145
146 if (BN_cmp(r_simple, r_mont) == 0
147 && BN_cmp(r_simple,r_recp) == 0)
148 {
149 printf(".");
150 fflush(stdout);
151 }
152 else
153 {
154 if (BN_cmp(r_simple,r_mont) != 0)
155 printf("\nsimple and mont results differ\n");
156 if (BN_cmp(r_simple,r_recp) != 0)
157 printf("\nsimple and recp results differ\n");
158
126 printf("a (%3d) = ",BN_num_bits(a)); BN_print(out,a); 159 printf("a (%3d) = ",BN_num_bits(a)); BN_print(out,a);
127 printf("\nb (%3d) = ",BN_num_bits(b)); BN_print(out,b); 160 printf("\nb (%3d) = ",BN_num_bits(b)); BN_print(out,b);
128 printf("\nm (%3d) = ",BN_num_bits(m)); BN_print(out,m); 161 printf("\nm (%3d) = ",BN_num_bits(m)); BN_print(out,m);
162 printf("\nsimple ="); BN_print(out,r_simple);
129 printf("\nrecp ="); BN_print(out,r_recp); 163 printf("\nrecp ="); BN_print(out,r_recp);
130 printf("\nmont ="); BN_print(out,r_mont); 164 printf("\nmont ="); BN_print(out,r_mont);
131 printf("\n"); 165 printf("\n");
132 exit(1); 166 exit(1);
133 } 167 }
134 else
135 {
136 printf(".");
137 fflush(stdout);
138 }
139 } 168 }
169 BN_free(r_mont);
170 BN_free(r_recp);
171 BN_free(r_simple);
172 BN_free(a);
173 BN_free(b);
174 BN_free(m);
175 BN_CTX_free(ctx);
176 ERR_remove_state(0);
177 CRYPTO_mem_leaks(out);
178 BIO_free(out);
140 printf(" done\n"); 179 printf(" done\n");
141 exit(0); 180 exit(0);
142err: 181err:
diff --git a/src/lib/libcrypto/bn/vms-helper.c b/src/lib/libcrypto/bn/vms-helper.c
index 73af337069..4b63149bf3 100644
--- a/src/lib/libcrypto/bn/vms-helper.c
+++ b/src/lib/libcrypto/bn/vms-helper.c
@@ -59,8 +59,10 @@
59 59
60bn_div_words_abort(int i) 60bn_div_words_abort(int i)
61{ 61{
62#if !defined(NO_STDIO) && !defined(WIN16) 62#ifdef BN_DEBUG
63#if !defined(OPENSSL_NO_STDIO) && !defined(OPENSSL_SYS_WIN16)
63 fprintf(stderr,"Division would overflow (%d)\n",i); 64 fprintf(stderr,"Division would overflow (%d)\n",i);
64#endif 65#endif
65 abort(); 66 abort();
67#endif
66} 68}