OLD | NEW |
| (Empty) |
1 #!/usr/bin/env perl | |
2 # | |
3 # Implemented as a Perl wrapper as we want to support several different | |
4 # architectures with single file. We pick up the target based on the | |
5 # file name we are asked to generate. | |
6 # | |
7 # It should be noted though that this perl code is nothing like | |
8 # <openssl>/crypto/perlasm/x86*. In this case perl is used pretty much | |
9 # as pre-processor to cover for platform differences in name decoration, | |
10 # linker tables, 32-/64-bit instruction sets... | |
11 # | |
12 # As you might know there're several PowerPC ABI in use. Most notably | |
13 # Linux and AIX use different 32-bit ABIs. Good news are that these ABIs | |
14 # are similar enough to implement leaf(!) functions, which would be ABI | |
15 # neutral. And that's what you find here: ABI neutral leaf functions. | |
16 # In case you wonder what that is... | |
17 # | |
18 # AIX performance | |
19 # | |
20 # MEASUREMENTS WITH cc ON a 200 MhZ PowerPC 604e. | |
21 # | |
22 # The following is the performance of 32-bit compiler | |
23 # generated code: | |
24 # | |
25 # OpenSSL 0.9.6c 21 dec 2001 | |
26 # built on: Tue Jun 11 11:06:51 EDT 2002 | |
27 # options:bn(64,32) ... | |
28 #compiler: cc -DTHREADS -DAIX -DB_ENDIAN -DBN_LLONG -O3 | |
29 # sign verify sign/s verify/s | |
30 #rsa 512 bits 0.0098s 0.0009s 102.0 1170.6 | |
31 #rsa 1024 bits 0.0507s 0.0026s 19.7 387.5 | |
32 #rsa 2048 bits 0.3036s 0.0085s 3.3 117.1 | |
33 #rsa 4096 bits 2.0040s 0.0299s 0.5 33.4 | |
34 #dsa 512 bits 0.0087s 0.0106s 114.3 94.5 | |
35 #dsa 1024 bits 0.0256s 0.0313s 39.0 32.0 | |
36 # | |
37 # Same bechmark with this assembler code: | |
38 # | |
39 #rsa 512 bits 0.0056s 0.0005s 178.6 2049.2 | |
40 #rsa 1024 bits 0.0283s 0.0015s 35.3 674.1 | |
41 #rsa 2048 bits 0.1744s 0.0050s 5.7 201.2 | |
42 #rsa 4096 bits 1.1644s 0.0179s 0.9 55.7 | |
43 #dsa 512 bits 0.0052s 0.0062s 191.6 162.0 | |
44 #dsa 1024 bits 0.0149s 0.0180s 67.0 55.5 | |
45 # | |
46 # Number of operations increases by at almost 75% | |
47 # | |
48 # Here are performance numbers for 64-bit compiler | |
49 # generated code: | |
50 # | |
51 # OpenSSL 0.9.6g [engine] 9 Aug 2002 | |
52 # built on: Fri Apr 18 16:59:20 EDT 2003 | |
53 # options:bn(64,64) ... | |
54 # compiler: cc -DTHREADS -D_REENTRANT -q64 -DB_ENDIAN -O3 | |
55 # sign verify sign/s verify/s | |
56 #rsa 512 bits 0.0028s 0.0003s 357.1 3844.4 | |
57 #rsa 1024 bits 0.0148s 0.0008s 67.5 1239.7 | |
58 #rsa 2048 bits 0.0963s 0.0028s 10.4 353.0 | |
59 #rsa 4096 bits 0.6538s 0.0102s 1.5 98.1 | |
60 #dsa 512 bits 0.0026s 0.0032s 382.5 313.7 | |
61 #dsa 1024 bits 0.0081s 0.0099s 122.8 100.6 | |
62 # | |
63 # Same benchmark with this assembler code: | |
64 # | |
65 #rsa 512 bits 0.0020s 0.0002s 510.4 6273.7 | |
66 #rsa 1024 bits 0.0088s 0.0005s 114.1 2128.3 | |
67 #rsa 2048 bits 0.0540s 0.0016s 18.5 622.5 | |
68 #rsa 4096 bits 0.3700s 0.0058s 2.7 171.0 | |
69 #dsa 512 bits 0.0016s 0.0020s 610.7 507.1 | |
70 #dsa 1024 bits 0.0047s 0.0058s 212.5 173.2 | |
71 # | |
72 # Again, performance increases by at about 75% | |
73 # | |
74 # Mac OS X, Apple G5 1.8GHz (Note this is 32 bit code) | |
75 # OpenSSL 0.9.7c 30 Sep 2003 | |
76 # | |
77 # Original code. | |
78 # | |
79 #rsa 512 bits 0.0011s 0.0001s 906.1 11012.5 | |
80 #rsa 1024 bits 0.0060s 0.0003s 166.6 3363.1 | |
81 #rsa 2048 bits 0.0370s 0.0010s 27.1 982.4 | |
82 #rsa 4096 bits 0.2426s 0.0036s 4.1 280.4 | |
83 #dsa 512 bits 0.0010s 0.0012s 1038.1 841.5 | |
84 #dsa 1024 bits 0.0030s 0.0037s 329.6 269.7 | |
85 #dsa 2048 bits 0.0101s 0.0127s 98.9 78.6 | |
86 # | |
87 # Same benchmark with this assembler code: | |
88 # | |
89 #rsa 512 bits 0.0007s 0.0001s 1416.2 16645.9 | |
90 #rsa 1024 bits 0.0036s 0.0002s 274.4 5380.6 | |
91 #rsa 2048 bits 0.0222s 0.0006s 45.1 1589.5 | |
92 #rsa 4096 bits 0.1469s 0.0022s 6.8 449.6 | |
93 #dsa 512 bits 0.0006s 0.0007s 1664.2 1376.2 | |
94 #dsa 1024 bits 0.0018s 0.0023s 545.0 442.2 | |
95 #dsa 2048 bits 0.0061s 0.0075s 163.5 132.8 | |
96 # | |
97 # Performance increase of ~60% | |
98 # | |
99 # If you have comments or suggestions to improve code send | |
100 # me a note at schari@us.ibm.com | |
101 # | |
102 | |
103 $flavour = shift; | |
104 | |
105 if ($flavour =~ /32/) { | |
106 $BITS= 32; | |
107 $BNSZ= $BITS/8; | |
108 $ISA= "\"ppc\""; | |
109 | |
110 $LD= "lwz"; # load | |
111 $LDU= "lwzu"; # load and update | |
112 $ST= "stw"; # store | |
113 $STU= "stwu"; # store and update | |
114 $UMULL= "mullw"; # unsigned multiply low | |
115 $UMULH= "mulhwu"; # unsigned multiply high | |
116 $UDIV= "divwu"; # unsigned divide | |
117 $UCMPI= "cmplwi"; # unsigned compare with immediate | |
118 $UCMP= "cmplw"; # unsigned compare | |
119 $CNTLZ= "cntlzw"; # count leading zeros | |
120 $SHL= "slw"; # shift left | |
121 $SHR= "srw"; # unsigned shift right | |
122 $SHRI= "srwi"; # unsigned shift right by immediate | |
123 $SHLI= "slwi"; # shift left by immediate | |
124 $CLRU= "clrlwi"; # clear upper bits | |
125 $INSR= "insrwi"; # insert right | |
126 $ROTL= "rotlwi"; # rotate left by immediate | |
127 $TR= "tw"; # conditional trap | |
128 } elsif ($flavour =~ /64/) { | |
129 $BITS= 64; | |
130 $BNSZ= $BITS/8; | |
131 $ISA= "\"ppc64\""; | |
132 | |
133 # same as above, but 64-bit mnemonics... | |
134 $LD= "ld"; # load | |
135 $LDU= "ldu"; # load and update | |
136 $ST= "std"; # store | |
137 $STU= "stdu"; # store and update | |
138 $UMULL= "mulld"; # unsigned multiply low | |
139 $UMULH= "mulhdu"; # unsigned multiply high | |
140 $UDIV= "divdu"; # unsigned divide | |
141 $UCMPI= "cmpldi"; # unsigned compare with immediate | |
142 $UCMP= "cmpld"; # unsigned compare | |
143 $CNTLZ= "cntlzd"; # count leading zeros | |
144 $SHL= "sld"; # shift left | |
145 $SHR= "srd"; # unsigned shift right | |
146 $SHRI= "srdi"; # unsigned shift right by immediate | |
147 $SHLI= "sldi"; # shift left by immediate | |
148 $CLRU= "clrldi"; # clear upper bits | |
149 $INSR= "insrdi"; # insert right | |
150 $ROTL= "rotldi"; # rotate left by immediate | |
151 $TR= "td"; # conditional trap | |
152 } else { die "nonsense $flavour"; } | |
153 | |
154 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; | |
155 ( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or | |
156 ( $xlate="${dir}../../perlasm/ppc-xlate.pl" and -f $xlate) or | |
157 die "can't locate ppc-xlate.pl"; | |
158 | |
159 open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!"; | |
160 | |
161 $data=<<EOF; | |
162 #-------------------------------------------------------------------- | |
163 # | |
164 # | |
165 # | |
166 # | |
167 # File: ppc32.s | |
168 # | |
169 # Created by: Suresh Chari | |
170 # IBM Thomas J. Watson Research Library | |
171 # Hawthorne, NY | |
172 # | |
173 # | |
174 # Description: Optimized assembly routines for OpenSSL crypto | |
175 # on the 32 bitPowerPC platform. | |
176 # | |
177 # | |
178 # Version History | |
179 # | |
180 # 2. Fixed bn_add,bn_sub and bn_div_words, added comments, | |
181 # cleaned up code. Also made a single version which can | |
182 # be used for both the AIX and Linux compilers. See NOTE | |
183 # below. | |
184 # 12/05/03 Suresh Chari | |
185 # (with lots of help from) Andy Polyakov | |
186 ## | |
187 # 1. Initial version 10/20/02 Suresh Chari | |
188 # | |
189 # | |
190 # The following file works for the xlc,cc | |
191 # and gcc compilers. | |
192 # | |
193 # NOTE: To get the file to link correctly with the gcc compiler | |
194 # you have to change the names of the routines and remove | |
195 # the first .(dot) character. This should automatically | |
196 # be done in the build process. | |
197 # | |
198 # Hand optimized assembly code for the following routines | |
199 # | |
200 # bn_sqr_comba4 | |
201 # bn_sqr_comba8 | |
202 # bn_mul_comba4 | |
203 # bn_mul_comba8 | |
204 # bn_sub_words | |
205 # bn_add_words | |
206 # bn_div_words | |
207 # bn_sqr_words | |
208 # bn_mul_words | |
209 # bn_mul_add_words | |
210 # | |
211 # NOTE: It is possible to optimize this code more for | |
212 # specific PowerPC or Power architectures. On the Northstar | |
213 # architecture the optimizations in this file do | |
214 # NOT provide much improvement. | |
215 # | |
216 # If you have comments or suggestions to improve code send | |
217 # me a note at schari\@us.ibm.com | |
218 # | |
219 #-------------------------------------------------------------------------- | |
220 # | |
221 # Defines to be used in the assembly code. | |
222 # | |
223 #.set r0,0 # we use it as storage for value of 0 | |
224 #.set SP,1 # preserved | |
225 #.set RTOC,2 # preserved | |
226 #.set r3,3 # 1st argument/return value | |
227 #.set r4,4 # 2nd argument/volatile register | |
228 #.set r5,5 # 3rd argument/volatile register | |
229 #.set r6,6 # ... | |
230 #.set r7,7 | |
231 #.set r8,8 | |
232 #.set r9,9 | |
233 #.set r10,10 | |
234 #.set r11,11 | |
235 #.set r12,12 | |
236 #.set r13,13 # not used, nor any other "below" it... | |
237 | |
238 # Declare function names to be global | |
239 # NOTE: For gcc these names MUST be changed to remove | |
240 # the first . i.e. for example change ".bn_sqr_comba4" | |
241 # to "bn_sqr_comba4". This should be automatically done | |
242 # in the build. | |
243 | |
244 .globl .bn_sqr_comba4 | |
245 .globl .bn_sqr_comba8 | |
246 .globl .bn_mul_comba4 | |
247 .globl .bn_mul_comba8 | |
248 .globl .bn_sub_words | |
249 .globl .bn_add_words | |
250 .globl .bn_div_words | |
251 .globl .bn_sqr_words | |
252 .globl .bn_mul_words | |
253 .globl .bn_mul_add_words | |
254 | |
255 # .text section | |
256 | |
257 .machine "any" | |
258 | |
259 # | |
260 # NOTE: The following label name should be changed to | |
261 # "bn_sqr_comba4" i.e. remove the first dot | |
262 # for the gcc compiler. This should be automatically | |
263 # done in the build | |
264 # | |
265 | |
266 .align 4 | |
267 .bn_sqr_comba4: | |
268 # | |
269 # Optimized version of bn_sqr_comba4. | |
270 # | |
271 # void bn_sqr_comba4(BN_ULONG *r, BN_ULONG *a) | |
272 # r3 contains r | |
273 # r4 contains a | |
274 # | |
275 # Freely use registers r5,r6,r7,r8,r9,r10,r11 as follows: | |
276 # | |
277 # r5,r6 are the two BN_ULONGs being multiplied. | |
278 # r7,r8 are the results of the 32x32 giving 64 bit multiply. | |
279 # r9,r10, r11 are the equivalents of c1,c2, c3. | |
280 # Here's the assembly | |
281 # | |
282 # | |
283 xor r0,r0,r0 # set r0 = 0. Used in the addze | |
284 # instructions below | |
285 | |
286 #sqr_add_c(a,0,c1,c2,c3) | |
287 $LD r5,`0*$BNSZ`(r4) | |
288 $UMULL r9,r5,r5 | |
289 $UMULH r10,r5,r5 #in first iteration. No need | |
290 #to add since c1=c2=c3=0. | |
291 # Note c3(r11) is NOT set to 0 | |
292 # but will be. | |
293 | |
294 $ST r9,`0*$BNSZ`(r3) # r[0]=c1; | |
295 # sqr_add_c2(a,1,0,c2,c3,c1); | |
296 $LD r6,`1*$BNSZ`(r4) | |
297 $UMULL r7,r5,r6 | |
298 $UMULH r8,r5,r6 | |
299 | |
300 addc r7,r7,r7 # compute (r7,r8)=2*(r7,r8) | |
301 adde r8,r8,r8 | |
302 addze r9,r0 # catch carry if any. | |
303 # r9= r0(=0) and carry | |
304 | |
305 addc r10,r7,r10 # now add to temp result. | |
306 addze r11,r8 # r8 added to r11 which is 0 | |
307 addze r9,r9 | |
308 | |
309 $ST r10,`1*$BNSZ`(r3) #r[1]=c2; | |
310 #sqr_add_c(a,1,c3,c1,c2) | |
311 $UMULL r7,r6,r6 | |
312 $UMULH r8,r6,r6 | |
313 addc r11,r7,r11 | |
314 adde r9,r8,r9 | |
315 addze r10,r0 | |
316 #sqr_add_c2(a,2,0,c3,c1,c2) | |
317 $LD r6,`2*$BNSZ`(r4) | |
318 $UMULL r7,r5,r6 | |
319 $UMULH r8,r5,r6 | |
320 | |
321 addc r7,r7,r7 | |
322 adde r8,r8,r8 | |
323 addze r10,r10 | |
324 | |
325 addc r11,r7,r11 | |
326 adde r9,r8,r9 | |
327 addze r10,r10 | |
328 $ST r11,`2*$BNSZ`(r3) #r[2]=c3 | |
329 #sqr_add_c2(a,3,0,c1,c2,c3); | |
330 $LD r6,`3*$BNSZ`(r4) | |
331 $UMULL r7,r5,r6 | |
332 $UMULH r8,r5,r6 | |
333 addc r7,r7,r7 | |
334 adde r8,r8,r8 | |
335 addze r11,r0 | |
336 | |
337 addc r9,r7,r9 | |
338 adde r10,r8,r10 | |
339 addze r11,r11 | |
340 #sqr_add_c2(a,2,1,c1,c2,c3); | |
341 $LD r5,`1*$BNSZ`(r4) | |
342 $LD r6,`2*$BNSZ`(r4) | |
343 $UMULL r7,r5,r6 | |
344 $UMULH r8,r5,r6 | |
345 | |
346 addc r7,r7,r7 | |
347 adde r8,r8,r8 | |
348 addze r11,r11 | |
349 addc r9,r7,r9 | |
350 adde r10,r8,r10 | |
351 addze r11,r11 | |
352 $ST r9,`3*$BNSZ`(r3) #r[3]=c1 | |
353 #sqr_add_c(a,2,c2,c3,c1); | |
354 $UMULL r7,r6,r6 | |
355 $UMULH r8,r6,r6 | |
356 addc r10,r7,r10 | |
357 adde r11,r8,r11 | |
358 addze r9,r0 | |
359 #sqr_add_c2(a,3,1,c2,c3,c1); | |
360 $LD r6,`3*$BNSZ`(r4) | |
361 $UMULL r7,r5,r6 | |
362 $UMULH r8,r5,r6 | |
363 addc r7,r7,r7 | |
364 adde r8,r8,r8 | |
365 addze r9,r9 | |
366 | |
367 addc r10,r7,r10 | |
368 adde r11,r8,r11 | |
369 addze r9,r9 | |
370 $ST r10,`4*$BNSZ`(r3) #r[4]=c2 | |
371 #sqr_add_c2(a,3,2,c3,c1,c2); | |
372 $LD r5,`2*$BNSZ`(r4) | |
373 $UMULL r7,r5,r6 | |
374 $UMULH r8,r5,r6 | |
375 addc r7,r7,r7 | |
376 adde r8,r8,r8 | |
377 addze r10,r0 | |
378 | |
379 addc r11,r7,r11 | |
380 adde r9,r8,r9 | |
381 addze r10,r10 | |
382 $ST r11,`5*$BNSZ`(r3) #r[5] = c3 | |
383 #sqr_add_c(a,3,c1,c2,c3); | |
384 $UMULL r7,r6,r6 | |
385 $UMULH r8,r6,r6 | |
386 addc r9,r7,r9 | |
387 adde r10,r8,r10 | |
388 | |
389 $ST r9,`6*$BNSZ`(r3) #r[6]=c1 | |
390 $ST r10,`7*$BNSZ`(r3) #r[7]=c2 | |
391 blr | |
392 .long 0 | |
393 .byte 0,12,0x14,0,0,0,2,0 | |
394 .long 0 | |
395 | |
396 # | |
397 # NOTE: The following label name should be changed to | |
398 # "bn_sqr_comba8" i.e. remove the first dot | |
399 # for the gcc compiler. This should be automatically | |
400 # done in the build | |
401 # | |
402 | |
403 .align 4 | |
404 .bn_sqr_comba8: | |
405 # | |
406 # This is an optimized version of the bn_sqr_comba8 routine. | |
407 # Tightly uses the adde instruction | |
408 # | |
409 # | |
410 # void bn_sqr_comba8(BN_ULONG *r, BN_ULONG *a) | |
411 # r3 contains r | |
412 # r4 contains a | |
413 # | |
414 # Freely use registers r5,r6,r7,r8,r9,r10,r11 as follows: | |
415 # | |
416 # r5,r6 are the two BN_ULONGs being multiplied. | |
417 # r7,r8 are the results of the 32x32 giving 64 bit multiply. | |
418 # r9,r10, r11 are the equivalents of c1,c2, c3. | |
419 # | |
420 # Possible optimization of loading all 8 longs of a into registers | |
421 # doesnt provide any speedup | |
422 # | |
423 | |
424 xor r0,r0,r0 #set r0 = 0.Used in addze | |
425 #instructions below. | |
426 | |
427 #sqr_add_c(a,0,c1,c2,c3); | |
428 $LD r5,`0*$BNSZ`(r4) | |
429 $UMULL r9,r5,r5 #1st iteration: no carries. | |
430 $UMULH r10,r5,r5 | |
431 $ST r9,`0*$BNSZ`(r3) # r[0]=c1; | |
432 #sqr_add_c2(a,1,0,c2,c3,c1); | |
433 $LD r6,`1*$BNSZ`(r4) | |
434 $UMULL r7,r5,r6 | |
435 $UMULH r8,r5,r6 | |
436 | |
437 addc r10,r7,r10 #add the two register number | |
438 adde r11,r8,r0 # (r8,r7) to the three register | |
439 addze r9,r0 # number (r9,r11,r10).NOTE:r0=0 | |
440 | |
441 addc r10,r7,r10 #add the two register number | |
442 adde r11,r8,r11 # (r8,r7) to the three register | |
443 addze r9,r9 # number (r9,r11,r10). | |
444 | |
445 $ST r10,`1*$BNSZ`(r3) # r[1]=c2 | |
446 | |
447 #sqr_add_c(a,1,c3,c1,c2); | |
448 $UMULL r7,r6,r6 | |
449 $UMULH r8,r6,r6 | |
450 addc r11,r7,r11 | |
451 adde r9,r8,r9 | |
452 addze r10,r0 | |
453 #sqr_add_c2(a,2,0,c3,c1,c2); | |
454 $LD r6,`2*$BNSZ`(r4) | |
455 $UMULL r7,r5,r6 | |
456 $UMULH r8,r5,r6 | |
457 | |
458 addc r11,r7,r11 | |
459 adde r9,r8,r9 | |
460 addze r10,r10 | |
461 | |
462 addc r11,r7,r11 | |
463 adde r9,r8,r9 | |
464 addze r10,r10 | |
465 | |
466 $ST r11,`2*$BNSZ`(r3) #r[2]=c3 | |
467 #sqr_add_c2(a,3,0,c1,c2,c3); | |
468 $LD r6,`3*$BNSZ`(r4) #r6 = a[3]. r5 is already a[0]. | |
469 $UMULL r7,r5,r6 | |
470 $UMULH r8,r5,r6 | |
471 | |
472 addc r9,r7,r9 | |
473 adde r10,r8,r10 | |
474 addze r11,r0 | |
475 | |
476 addc r9,r7,r9 | |
477 adde r10,r8,r10 | |
478 addze r11,r11 | |
479 #sqr_add_c2(a,2,1,c1,c2,c3); | |
480 $LD r5,`1*$BNSZ`(r4) | |
481 $LD r6,`2*$BNSZ`(r4) | |
482 $UMULL r7,r5,r6 | |
483 $UMULH r8,r5,r6 | |
484 | |
485 addc r9,r7,r9 | |
486 adde r10,r8,r10 | |
487 addze r11,r11 | |
488 | |
489 addc r9,r7,r9 | |
490 adde r10,r8,r10 | |
491 addze r11,r11 | |
492 | |
493 $ST r9,`3*$BNSZ`(r3) #r[3]=c1; | |
494 #sqr_add_c(a,2,c2,c3,c1); | |
495 $UMULL r7,r6,r6 | |
496 $UMULH r8,r6,r6 | |
497 | |
498 addc r10,r7,r10 | |
499 adde r11,r8,r11 | |
500 addze r9,r0 | |
501 #sqr_add_c2(a,3,1,c2,c3,c1); | |
502 $LD r6,`3*$BNSZ`(r4) | |
503 $UMULL r7,r5,r6 | |
504 $UMULH r8,r5,r6 | |
505 | |
506 addc r10,r7,r10 | |
507 adde r11,r8,r11 | |
508 addze r9,r9 | |
509 | |
510 addc r10,r7,r10 | |
511 adde r11,r8,r11 | |
512 addze r9,r9 | |
513 #sqr_add_c2(a,4,0,c2,c3,c1); | |
514 $LD r5,`0*$BNSZ`(r4) | |
515 $LD r6,`4*$BNSZ`(r4) | |
516 $UMULL r7,r5,r6 | |
517 $UMULH r8,r5,r6 | |
518 | |
519 addc r10,r7,r10 | |
520 adde r11,r8,r11 | |
521 addze r9,r9 | |
522 | |
523 addc r10,r7,r10 | |
524 adde r11,r8,r11 | |
525 addze r9,r9 | |
526 $ST r10,`4*$BNSZ`(r3) #r[4]=c2; | |
527 #sqr_add_c2(a,5,0,c3,c1,c2); | |
528 $LD r6,`5*$BNSZ`(r4) | |
529 $UMULL r7,r5,r6 | |
530 $UMULH r8,r5,r6 | |
531 | |
532 addc r11,r7,r11 | |
533 adde r9,r8,r9 | |
534 addze r10,r0 | |
535 | |
536 addc r11,r7,r11 | |
537 adde r9,r8,r9 | |
538 addze r10,r10 | |
539 #sqr_add_c2(a,4,1,c3,c1,c2); | |
540 $LD r5,`1*$BNSZ`(r4) | |
541 $LD r6,`4*$BNSZ`(r4) | |
542 $UMULL r7,r5,r6 | |
543 $UMULH r8,r5,r6 | |
544 | |
545 addc r11,r7,r11 | |
546 adde r9,r8,r9 | |
547 addze r10,r10 | |
548 | |
549 addc r11,r7,r11 | |
550 adde r9,r8,r9 | |
551 addze r10,r10 | |
552 #sqr_add_c2(a,3,2,c3,c1,c2); | |
553 $LD r5,`2*$BNSZ`(r4) | |
554 $LD r6,`3*$BNSZ`(r4) | |
555 $UMULL r7,r5,r6 | |
556 $UMULH r8,r5,r6 | |
557 | |
558 addc r11,r7,r11 | |
559 adde r9,r8,r9 | |
560 addze r10,r10 | |
561 | |
562 addc r11,r7,r11 | |
563 adde r9,r8,r9 | |
564 addze r10,r10 | |
565 $ST r11,`5*$BNSZ`(r3) #r[5]=c3; | |
566 #sqr_add_c(a,3,c1,c2,c3); | |
567 $UMULL r7,r6,r6 | |
568 $UMULH r8,r6,r6 | |
569 addc r9,r7,r9 | |
570 adde r10,r8,r10 | |
571 addze r11,r0 | |
572 #sqr_add_c2(a,4,2,c1,c2,c3); | |
573 $LD r6,`4*$BNSZ`(r4) | |
574 $UMULL r7,r5,r6 | |
575 $UMULH r8,r5,r6 | |
576 | |
577 addc r9,r7,r9 | |
578 adde r10,r8,r10 | |
579 addze r11,r11 | |
580 | |
581 addc r9,r7,r9 | |
582 adde r10,r8,r10 | |
583 addze r11,r11 | |
584 #sqr_add_c2(a,5,1,c1,c2,c3); | |
585 $LD r5,`1*$BNSZ`(r4) | |
586 $LD r6,`5*$BNSZ`(r4) | |
587 $UMULL r7,r5,r6 | |
588 $UMULH r8,r5,r6 | |
589 | |
590 addc r9,r7,r9 | |
591 adde r10,r8,r10 | |
592 addze r11,r11 | |
593 | |
594 addc r9,r7,r9 | |
595 adde r10,r8,r10 | |
596 addze r11,r11 | |
597 #sqr_add_c2(a,6,0,c1,c2,c3); | |
598 $LD r5,`0*$BNSZ`(r4) | |
599 $LD r6,`6*$BNSZ`(r4) | |
600 $UMULL r7,r5,r6 | |
601 $UMULH r8,r5,r6 | |
602 addc r9,r7,r9 | |
603 adde r10,r8,r10 | |
604 addze r11,r11 | |
605 addc r9,r7,r9 | |
606 adde r10,r8,r10 | |
607 addze r11,r11 | |
608 $ST r9,`6*$BNSZ`(r3) #r[6]=c1; | |
609 #sqr_add_c2(a,7,0,c2,c3,c1); | |
610 $LD r6,`7*$BNSZ`(r4) | |
611 $UMULL r7,r5,r6 | |
612 $UMULH r8,r5,r6 | |
613 | |
614 addc r10,r7,r10 | |
615 adde r11,r8,r11 | |
616 addze r9,r0 | |
617 addc r10,r7,r10 | |
618 adde r11,r8,r11 | |
619 addze r9,r9 | |
620 #sqr_add_c2(a,6,1,c2,c3,c1); | |
621 $LD r5,`1*$BNSZ`(r4) | |
622 $LD r6,`6*$BNSZ`(r4) | |
623 $UMULL r7,r5,r6 | |
624 $UMULH r8,r5,r6 | |
625 | |
626 addc r10,r7,r10 | |
627 adde r11,r8,r11 | |
628 addze r9,r9 | |
629 addc r10,r7,r10 | |
630 adde r11,r8,r11 | |
631 addze r9,r9 | |
632 #sqr_add_c2(a,5,2,c2,c3,c1); | |
633 $LD r5,`2*$BNSZ`(r4) | |
634 $LD r6,`5*$BNSZ`(r4) | |
635 $UMULL r7,r5,r6 | |
636 $UMULH r8,r5,r6 | |
637 addc r10,r7,r10 | |
638 adde r11,r8,r11 | |
639 addze r9,r9 | |
640 addc r10,r7,r10 | |
641 adde r11,r8,r11 | |
642 addze r9,r9 | |
643 #sqr_add_c2(a,4,3,c2,c3,c1); | |
644 $LD r5,`3*$BNSZ`(r4) | |
645 $LD r6,`4*$BNSZ`(r4) | |
646 $UMULL r7,r5,r6 | |
647 $UMULH r8,r5,r6 | |
648 | |
649 addc r10,r7,r10 | |
650 adde r11,r8,r11 | |
651 addze r9,r9 | |
652 addc r10,r7,r10 | |
653 adde r11,r8,r11 | |
654 addze r9,r9 | |
655 $ST r10,`7*$BNSZ`(r3) #r[7]=c2; | |
656 #sqr_add_c(a,4,c3,c1,c2); | |
657 $UMULL r7,r6,r6 | |
658 $UMULH r8,r6,r6 | |
659 addc r11,r7,r11 | |
660 adde r9,r8,r9 | |
661 addze r10,r0 | |
662 #sqr_add_c2(a,5,3,c3,c1,c2); | |
663 $LD r6,`5*$BNSZ`(r4) | |
664 $UMULL r7,r5,r6 | |
665 $UMULH r8,r5,r6 | |
666 addc r11,r7,r11 | |
667 adde r9,r8,r9 | |
668 addze r10,r10 | |
669 addc r11,r7,r11 | |
670 adde r9,r8,r9 | |
671 addze r10,r10 | |
672 #sqr_add_c2(a,6,2,c3,c1,c2); | |
673 $LD r5,`2*$BNSZ`(r4) | |
674 $LD r6,`6*$BNSZ`(r4) | |
675 $UMULL r7,r5,r6 | |
676 $UMULH r8,r5,r6 | |
677 addc r11,r7,r11 | |
678 adde r9,r8,r9 | |
679 addze r10,r10 | |
680 | |
681 addc r11,r7,r11 | |
682 adde r9,r8,r9 | |
683 addze r10,r10 | |
684 #sqr_add_c2(a,7,1,c3,c1,c2); | |
685 $LD r5,`1*$BNSZ`(r4) | |
686 $LD r6,`7*$BNSZ`(r4) | |
687 $UMULL r7,r5,r6 | |
688 $UMULH r8,r5,r6 | |
689 addc r11,r7,r11 | |
690 adde r9,r8,r9 | |
691 addze r10,r10 | |
692 addc r11,r7,r11 | |
693 adde r9,r8,r9 | |
694 addze r10,r10 | |
695 $ST r11,`8*$BNSZ`(r3) #r[8]=c3; | |
696 #sqr_add_c2(a,7,2,c1,c2,c3); | |
697 $LD r5,`2*$BNSZ`(r4) | |
698 $UMULL r7,r5,r6 | |
699 $UMULH r8,r5,r6 | |
700 | |
701 addc r9,r7,r9 | |
702 adde r10,r8,r10 | |
703 addze r11,r0 | |
704 addc r9,r7,r9 | |
705 adde r10,r8,r10 | |
706 addze r11,r11 | |
707 #sqr_add_c2(a,6,3,c1,c2,c3); | |
708 $LD r5,`3*$BNSZ`(r4) | |
709 $LD r6,`6*$BNSZ`(r4) | |
710 $UMULL r7,r5,r6 | |
711 $UMULH r8,r5,r6 | |
712 addc r9,r7,r9 | |
713 adde r10,r8,r10 | |
714 addze r11,r11 | |
715 addc r9,r7,r9 | |
716 adde r10,r8,r10 | |
717 addze r11,r11 | |
718 #sqr_add_c2(a,5,4,c1,c2,c3); | |
719 $LD r5,`4*$BNSZ`(r4) | |
720 $LD r6,`5*$BNSZ`(r4) | |
721 $UMULL r7,r5,r6 | |
722 $UMULH r8,r5,r6 | |
723 addc r9,r7,r9 | |
724 adde r10,r8,r10 | |
725 addze r11,r11 | |
726 addc r9,r7,r9 | |
727 adde r10,r8,r10 | |
728 addze r11,r11 | |
729 $ST r9,`9*$BNSZ`(r3) #r[9]=c1; | |
730 #sqr_add_c(a,5,c2,c3,c1); | |
731 $UMULL r7,r6,r6 | |
732 $UMULH r8,r6,r6 | |
733 addc r10,r7,r10 | |
734 adde r11,r8,r11 | |
735 addze r9,r0 | |
736 #sqr_add_c2(a,6,4,c2,c3,c1); | |
737 $LD r6,`6*$BNSZ`(r4) | |
738 $UMULL r7,r5,r6 | |
739 $UMULH r8,r5,r6 | |
740 addc r10,r7,r10 | |
741 adde r11,r8,r11 | |
742 addze r9,r9 | |
743 addc r10,r7,r10 | |
744 adde r11,r8,r11 | |
745 addze r9,r9 | |
746 #sqr_add_c2(a,7,3,c2,c3,c1); | |
747 $LD r5,`3*$BNSZ`(r4) | |
748 $LD r6,`7*$BNSZ`(r4) | |
749 $UMULL r7,r5,r6 | |
750 $UMULH r8,r5,r6 | |
751 addc r10,r7,r10 | |
752 adde r11,r8,r11 | |
753 addze r9,r9 | |
754 addc r10,r7,r10 | |
755 adde r11,r8,r11 | |
756 addze r9,r9 | |
757 $ST r10,`10*$BNSZ`(r3) #r[10]=c2; | |
758 #sqr_add_c2(a,7,4,c3,c1,c2); | |
759 $LD r5,`4*$BNSZ`(r4) | |
760 $UMULL r7,r5,r6 | |
761 $UMULH r8,r5,r6 | |
762 addc r11,r7,r11 | |
763 adde r9,r8,r9 | |
764 addze r10,r0 | |
765 addc r11,r7,r11 | |
766 adde r9,r8,r9 | |
767 addze r10,r10 | |
768 #sqr_add_c2(a,6,5,c3,c1,c2); | |
769 $LD r5,`5*$BNSZ`(r4) | |
770 $LD r6,`6*$BNSZ`(r4) | |
771 $UMULL r7,r5,r6 | |
772 $UMULH r8,r5,r6 | |
773 addc r11,r7,r11 | |
774 adde r9,r8,r9 | |
775 addze r10,r10 | |
776 addc r11,r7,r11 | |
777 adde r9,r8,r9 | |
778 addze r10,r10 | |
779 $ST r11,`11*$BNSZ`(r3) #r[11]=c3; | |
780 #sqr_add_c(a,6,c1,c2,c3); | |
781 $UMULL r7,r6,r6 | |
782 $UMULH r8,r6,r6 | |
783 addc r9,r7,r9 | |
784 adde r10,r8,r10 | |
785 addze r11,r0 | |
786 #sqr_add_c2(a,7,5,c1,c2,c3) | |
787 $LD r6,`7*$BNSZ`(r4) | |
788 $UMULL r7,r5,r6 | |
789 $UMULH r8,r5,r6 | |
790 addc r9,r7,r9 | |
791 adde r10,r8,r10 | |
792 addze r11,r11 | |
793 addc r9,r7,r9 | |
794 adde r10,r8,r10 | |
795 addze r11,r11 | |
796 $ST r9,`12*$BNSZ`(r3) #r[12]=c1; | |
797 | |
798 #sqr_add_c2(a,7,6,c2,c3,c1) | |
799 $LD r5,`6*$BNSZ`(r4) | |
800 $UMULL r7,r5,r6 | |
801 $UMULH r8,r5,r6 | |
802 addc r10,r7,r10 | |
803 adde r11,r8,r11 | |
804 addze r9,r0 | |
805 addc r10,r7,r10 | |
806 adde r11,r8,r11 | |
807 addze r9,r9 | |
808 $ST r10,`13*$BNSZ`(r3) #r[13]=c2; | |
809 #sqr_add_c(a,7,c3,c1,c2); | |
810 $UMULL r7,r6,r6 | |
811 $UMULH r8,r6,r6 | |
812 addc r11,r7,r11 | |
813 adde r9,r8,r9 | |
814 $ST r11,`14*$BNSZ`(r3) #r[14]=c3; | |
815 $ST r9, `15*$BNSZ`(r3) #r[15]=c1; | |
816 | |
817 | |
818 blr | |
819 .long 0 | |
820 .byte 0,12,0x14,0,0,0,2,0 | |
821 .long 0 | |
822 | |
823 # | |
824 # NOTE: The following label name should be changed to | |
825 # "bn_mul_comba4" i.e. remove the first dot | |
826 # for the gcc compiler. This should be automatically | |
827 # done in the build | |
828 # | |
829 | |
830 .align 4 | |
831 .bn_mul_comba4: | |
832 # | |
833 # This is an optimized version of the bn_mul_comba4 routine. | |
834 # | |
835 # void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) | |
836 # r3 contains r | |
837 # r4 contains a | |
838 # r5 contains b | |
839 # r6, r7 are the 2 BN_ULONGs being multiplied. | |
840 # r8, r9 are the results of the 32x32 giving 64 multiply. | |
841 # r10, r11, r12 are the equivalents of c1, c2, and c3. | |
842 # | |
843 xor r0,r0,r0 #r0=0. Used in addze below. | |
844 #mul_add_c(a[0],b[0],c1,c2,c3); | |
845 $LD r6,`0*$BNSZ`(r4) | |
846 $LD r7,`0*$BNSZ`(r5) | |
847 $UMULL r10,r6,r7 | |
848 $UMULH r11,r6,r7 | |
849 $ST r10,`0*$BNSZ`(r3) #r[0]=c1 | |
850 #mul_add_c(a[0],b[1],c2,c3,c1); | |
851 $LD r7,`1*$BNSZ`(r5) | |
852 $UMULL r8,r6,r7 | |
853 $UMULH r9,r6,r7 | |
854 addc r11,r8,r11 | |
855 adde r12,r9,r0 | |
856 addze r10,r0 | |
857 #mul_add_c(a[1],b[0],c2,c3,c1); | |
858 $LD r6, `1*$BNSZ`(r4) | |
859 $LD r7, `0*$BNSZ`(r5) | |
860 $UMULL r8,r6,r7 | |
861 $UMULH r9,r6,r7 | |
862 addc r11,r8,r11 | |
863 adde r12,r9,r12 | |
864 addze r10,r10 | |
865 $ST r11,`1*$BNSZ`(r3) #r[1]=c2 | |
866 #mul_add_c(a[2],b[0],c3,c1,c2); | |
867 $LD r6,`2*$BNSZ`(r4) | |
868 $UMULL r8,r6,r7 | |
869 $UMULH r9,r6,r7 | |
870 addc r12,r8,r12 | |
871 adde r10,r9,r10 | |
872 addze r11,r0 | |
873 #mul_add_c(a[1],b[1],c3,c1,c2); | |
874 $LD r6,`1*$BNSZ`(r4) | |
875 $LD r7,`1*$BNSZ`(r5) | |
876 $UMULL r8,r6,r7 | |
877 $UMULH r9,r6,r7 | |
878 addc r12,r8,r12 | |
879 adde r10,r9,r10 | |
880 addze r11,r11 | |
881 #mul_add_c(a[0],b[2],c3,c1,c2); | |
882 $LD r6,`0*$BNSZ`(r4) | |
883 $LD r7,`2*$BNSZ`(r5) | |
884 $UMULL r8,r6,r7 | |
885 $UMULH r9,r6,r7 | |
886 addc r12,r8,r12 | |
887 adde r10,r9,r10 | |
888 addze r11,r11 | |
889 $ST r12,`2*$BNSZ`(r3) #r[2]=c3 | |
890 #mul_add_c(a[0],b[3],c1,c2,c3); | |
891 $LD r7,`3*$BNSZ`(r5) | |
892 $UMULL r8,r6,r7 | |
893 $UMULH r9,r6,r7 | |
894 addc r10,r8,r10 | |
895 adde r11,r9,r11 | |
896 addze r12,r0 | |
897 #mul_add_c(a[1],b[2],c1,c2,c3); | |
898 $LD r6,`1*$BNSZ`(r4) | |
899 $LD r7,`2*$BNSZ`(r5) | |
900 $UMULL r8,r6,r7 | |
901 $UMULH r9,r6,r7 | |
902 addc r10,r8,r10 | |
903 adde r11,r9,r11 | |
904 addze r12,r12 | |
905 #mul_add_c(a[2],b[1],c1,c2,c3); | |
906 $LD r6,`2*$BNSZ`(r4) | |
907 $LD r7,`1*$BNSZ`(r5) | |
908 $UMULL r8,r6,r7 | |
909 $UMULH r9,r6,r7 | |
910 addc r10,r8,r10 | |
911 adde r11,r9,r11 | |
912 addze r12,r12 | |
913 #mul_add_c(a[3],b[0],c1,c2,c3); | |
914 $LD r6,`3*$BNSZ`(r4) | |
915 $LD r7,`0*$BNSZ`(r5) | |
916 $UMULL r8,r6,r7 | |
917 $UMULH r9,r6,r7 | |
918 addc r10,r8,r10 | |
919 adde r11,r9,r11 | |
920 addze r12,r12 | |
921 $ST r10,`3*$BNSZ`(r3) #r[3]=c1 | |
922 #mul_add_c(a[3],b[1],c2,c3,c1); | |
923 $LD r7,`1*$BNSZ`(r5) | |
924 $UMULL r8,r6,r7 | |
925 $UMULH r9,r6,r7 | |
926 addc r11,r8,r11 | |
927 adde r12,r9,r12 | |
928 addze r10,r0 | |
929 #mul_add_c(a[2],b[2],c2,c3,c1); | |
930 $LD r6,`2*$BNSZ`(r4) | |
931 $LD r7,`2*$BNSZ`(r5) | |
932 $UMULL r8,r6,r7 | |
933 $UMULH r9,r6,r7 | |
934 addc r11,r8,r11 | |
935 adde r12,r9,r12 | |
936 addze r10,r10 | |
937 #mul_add_c(a[1],b[3],c2,c3,c1); | |
938 $LD r6,`1*$BNSZ`(r4) | |
939 $LD r7,`3*$BNSZ`(r5) | |
940 $UMULL r8,r6,r7 | |
941 $UMULH r9,r6,r7 | |
942 addc r11,r8,r11 | |
943 adde r12,r9,r12 | |
944 addze r10,r10 | |
945 $ST r11,`4*$BNSZ`(r3) #r[4]=c2 | |
946 #mul_add_c(a[2],b[3],c3,c1,c2); | |
947 $LD r6,`2*$BNSZ`(r4) | |
948 $UMULL r8,r6,r7 | |
949 $UMULH r9,r6,r7 | |
950 addc r12,r8,r12 | |
951 adde r10,r9,r10 | |
952 addze r11,r0 | |
953 #mul_add_c(a[3],b[2],c3,c1,c2); | |
954 $LD r6,`3*$BNSZ`(r4) | |
955 $LD r7,`2*$BNSZ`(r5) | |
956 $UMULL r8,r6,r7 | |
957 $UMULH r9,r6,r7 | |
958 addc r12,r8,r12 | |
959 adde r10,r9,r10 | |
960 addze r11,r11 | |
961 $ST r12,`5*$BNSZ`(r3) #r[5]=c3 | |
962 #mul_add_c(a[3],b[3],c1,c2,c3); | |
963 $LD r7,`3*$BNSZ`(r5) | |
964 $UMULL r8,r6,r7 | |
965 $UMULH r9,r6,r7 | |
966 addc r10,r8,r10 | |
967 adde r11,r9,r11 | |
968 | |
969 $ST r10,`6*$BNSZ`(r3) #r[6]=c1 | |
970 $ST r11,`7*$BNSZ`(r3) #r[7]=c2 | |
971 blr | |
972 .long 0 | |
973 .byte 0,12,0x14,0,0,0,3,0 | |
974 .long 0 | |
975 | |
976 # | |
977 # NOTE: The following label name should be changed to | |
978 # "bn_mul_comba8" i.e. remove the first dot | |
979 # for the gcc compiler. This should be automatically | |
980 # done in the build | |
981 # | |
982 | |
983 .align 4 | |
984 .bn_mul_comba8: | |
985 # | |
986 # Optimized version of the bn_mul_comba8 routine. | |
987 # | |
988 # void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b) | |
989 # r3 contains r | |
990 # r4 contains a | |
991 # r5 contains b | |
992 # r6, r7 are the 2 BN_ULONGs being multiplied. | |
993 # r8, r9 are the results of the 32x32 giving 64 multiply. | |
994 # r10, r11, r12 are the equivalents of c1, c2, and c3. | |
995 # | |
996 xor r0,r0,r0 #r0=0. Used in addze below. | |
997 | |
998 #mul_add_c(a[0],b[0],c1,c2,c3); | |
999 $LD r6,`0*$BNSZ`(r4) #a[0] | |
1000 $LD r7,`0*$BNSZ`(r5) #b[0] | |
1001 $UMULL r10,r6,r7 | |
1002 $UMULH r11,r6,r7 | |
1003 $ST r10,`0*$BNSZ`(r3) #r[0]=c1; | |
1004 #mul_add_c(a[0],b[1],c2,c3,c1); | |
1005 $LD r7,`1*$BNSZ`(r5) | |
1006 $UMULL r8,r6,r7 | |
1007 $UMULH r9,r6,r7 | |
1008 addc r11,r11,r8 | |
1009 addze r12,r9 # since we didnt set r12 to zero before. | |
1010 addze r10,r0 | |
1011 #mul_add_c(a[1],b[0],c2,c3,c1); | |
1012 $LD r6,`1*$BNSZ`(r4) | |
1013 $LD r7,`0*$BNSZ`(r5) | |
1014 $UMULL r8,r6,r7 | |
1015 $UMULH r9,r6,r7 | |
1016 addc r11,r11,r8 | |
1017 adde r12,r12,r9 | |
1018 addze r10,r10 | |
1019 $ST r11,`1*$BNSZ`(r3) #r[1]=c2; | |
1020 #mul_add_c(a[2],b[0],c3,c1,c2); | |
1021 $LD r6,`2*$BNSZ`(r4) | |
1022 $UMULL r8,r6,r7 | |
1023 $UMULH r9,r6,r7 | |
1024 addc r12,r12,r8 | |
1025 adde r10,r10,r9 | |
1026 addze r11,r0 | |
1027 #mul_add_c(a[1],b[1],c3,c1,c2); | |
1028 $LD r6,`1*$BNSZ`(r4) | |
1029 $LD r7,`1*$BNSZ`(r5) | |
1030 $UMULL r8,r6,r7 | |
1031 $UMULH r9,r6,r7 | |
1032 addc r12,r12,r8 | |
1033 adde r10,r10,r9 | |
1034 addze r11,r11 | |
1035 #mul_add_c(a[0],b[2],c3,c1,c2); | |
1036 $LD r6,`0*$BNSZ`(r4) | |
1037 $LD r7,`2*$BNSZ`(r5) | |
1038 $UMULL r8,r6,r7 | |
1039 $UMULH r9,r6,r7 | |
1040 addc r12,r12,r8 | |
1041 adde r10,r10,r9 | |
1042 addze r11,r11 | |
1043 $ST r12,`2*$BNSZ`(r3) #r[2]=c3; | |
1044 #mul_add_c(a[0],b[3],c1,c2,c3); | |
1045 $LD r7,`3*$BNSZ`(r5) | |
1046 $UMULL r8,r6,r7 | |
1047 $UMULH r9,r6,r7 | |
1048 addc r10,r10,r8 | |
1049 adde r11,r11,r9 | |
1050 addze r12,r0 | |
1051 #mul_add_c(a[1],b[2],c1,c2,c3); | |
1052 $LD r6,`1*$BNSZ`(r4) | |
1053 $LD r7,`2*$BNSZ`(r5) | |
1054 $UMULL r8,r6,r7 | |
1055 $UMULH r9,r6,r7 | |
1056 addc r10,r10,r8 | |
1057 adde r11,r11,r9 | |
1058 addze r12,r12 | |
1059 | |
1060 #mul_add_c(a[2],b[1],c1,c2,c3); | |
1061 $LD r6,`2*$BNSZ`(r4) | |
1062 $LD r7,`1*$BNSZ`(r5) | |
1063 $UMULL r8,r6,r7 | |
1064 $UMULH r9,r6,r7 | |
1065 addc r10,r10,r8 | |
1066 adde r11,r11,r9 | |
1067 addze r12,r12 | |
1068 #mul_add_c(a[3],b[0],c1,c2,c3); | |
1069 $LD r6,`3*$BNSZ`(r4) | |
1070 $LD r7,`0*$BNSZ`(r5) | |
1071 $UMULL r8,r6,r7 | |
1072 $UMULH r9,r6,r7 | |
1073 addc r10,r10,r8 | |
1074 adde r11,r11,r9 | |
1075 addze r12,r12 | |
1076 $ST r10,`3*$BNSZ`(r3) #r[3]=c1; | |
1077 #mul_add_c(a[4],b[0],c2,c3,c1); | |
1078 $LD r6,`4*$BNSZ`(r4) | |
1079 $UMULL r8,r6,r7 | |
1080 $UMULH r9,r6,r7 | |
1081 addc r11,r11,r8 | |
1082 adde r12,r12,r9 | |
1083 addze r10,r0 | |
1084 #mul_add_c(a[3],b[1],c2,c3,c1); | |
1085 $LD r6,`3*$BNSZ`(r4) | |
1086 $LD r7,`1*$BNSZ`(r5) | |
1087 $UMULL r8,r6,r7 | |
1088 $UMULH r9,r6,r7 | |
1089 addc r11,r11,r8 | |
1090 adde r12,r12,r9 | |
1091 addze r10,r10 | |
1092 #mul_add_c(a[2],b[2],c2,c3,c1); | |
1093 $LD r6,`2*$BNSZ`(r4) | |
1094 $LD r7,`2*$BNSZ`(r5) | |
1095 $UMULL r8,r6,r7 | |
1096 $UMULH r9,r6,r7 | |
1097 addc r11,r11,r8 | |
1098 adde r12,r12,r9 | |
1099 addze r10,r10 | |
1100 #mul_add_c(a[1],b[3],c2,c3,c1); | |
1101 $LD r6,`1*$BNSZ`(r4) | |
1102 $LD r7,`3*$BNSZ`(r5) | |
1103 $UMULL r8,r6,r7 | |
1104 $UMULH r9,r6,r7 | |
1105 addc r11,r11,r8 | |
1106 adde r12,r12,r9 | |
1107 addze r10,r10 | |
1108 #mul_add_c(a[0],b[4],c2,c3,c1); | |
1109 $LD r6,`0*$BNSZ`(r4) | |
1110 $LD r7,`4*$BNSZ`(r5) | |
1111 $UMULL r8,r6,r7 | |
1112 $UMULH r9,r6,r7 | |
1113 addc r11,r11,r8 | |
1114 adde r12,r12,r9 | |
1115 addze r10,r10 | |
1116 $ST r11,`4*$BNSZ`(r3) #r[4]=c2; | |
1117 #mul_add_c(a[0],b[5],c3,c1,c2); | |
1118 $LD r7,`5*$BNSZ`(r5) | |
1119 $UMULL r8,r6,r7 | |
1120 $UMULH r9,r6,r7 | |
1121 addc r12,r12,r8 | |
1122 adde r10,r10,r9 | |
1123 addze r11,r0 | |
1124 #mul_add_c(a[1],b[4],c3,c1,c2); | |
1125 $LD r6,`1*$BNSZ`(r4) | |
1126 $LD r7,`4*$BNSZ`(r5) | |
1127 $UMULL r8,r6,r7 | |
1128 $UMULH r9,r6,r7 | |
1129 addc r12,r12,r8 | |
1130 adde r10,r10,r9 | |
1131 addze r11,r11 | |
1132 #mul_add_c(a[2],b[3],c3,c1,c2); | |
1133 $LD r6,`2*$BNSZ`(r4) | |
1134 $LD r7,`3*$BNSZ`(r5) | |
1135 $UMULL r8,r6,r7 | |
1136 $UMULH r9,r6,r7 | |
1137 addc r12,r12,r8 | |
1138 adde r10,r10,r9 | |
1139 addze r11,r11 | |
1140 #mul_add_c(a[3],b[2],c3,c1,c2); | |
1141 $LD r6,`3*$BNSZ`(r4) | |
1142 $LD r7,`2*$BNSZ`(r5) | |
1143 $UMULL r8,r6,r7 | |
1144 $UMULH r9,r6,r7 | |
1145 addc r12,r12,r8 | |
1146 adde r10,r10,r9 | |
1147 addze r11,r11 | |
1148 #mul_add_c(a[4],b[1],c3,c1,c2); | |
1149 $LD r6,`4*$BNSZ`(r4) | |
1150 $LD r7,`1*$BNSZ`(r5) | |
1151 $UMULL r8,r6,r7 | |
1152 $UMULH r9,r6,r7 | |
1153 addc r12,r12,r8 | |
1154 adde r10,r10,r9 | |
1155 addze r11,r11 | |
1156 #mul_add_c(a[5],b[0],c3,c1,c2); | |
1157 $LD r6,`5*$BNSZ`(r4) | |
1158 $LD r7,`0*$BNSZ`(r5) | |
1159 $UMULL r8,r6,r7 | |
1160 $UMULH r9,r6,r7 | |
1161 addc r12,r12,r8 | |
1162 adde r10,r10,r9 | |
1163 addze r11,r11 | |
1164 $ST r12,`5*$BNSZ`(r3) #r[5]=c3; | |
1165 #mul_add_c(a[6],b[0],c1,c2,c3); | |
1166 $LD r6,`6*$BNSZ`(r4) | |
1167 $UMULL r8,r6,r7 | |
1168 $UMULH r9,r6,r7 | |
1169 addc r10,r10,r8 | |
1170 adde r11,r11,r9 | |
1171 addze r12,r0 | |
1172 #mul_add_c(a[5],b[1],c1,c2,c3); | |
1173 $LD r6,`5*$BNSZ`(r4) | |
1174 $LD r7,`1*$BNSZ`(r5) | |
1175 $UMULL r8,r6,r7 | |
1176 $UMULH r9,r6,r7 | |
1177 addc r10,r10,r8 | |
1178 adde r11,r11,r9 | |
1179 addze r12,r12 | |
1180 #mul_add_c(a[4],b[2],c1,c2,c3); | |
1181 $LD r6,`4*$BNSZ`(r4) | |
1182 $LD r7,`2*$BNSZ`(r5) | |
1183 $UMULL r8,r6,r7 | |
1184 $UMULH r9,r6,r7 | |
1185 addc r10,r10,r8 | |
1186 adde r11,r11,r9 | |
1187 addze r12,r12 | |
1188 #mul_add_c(a[3],b[3],c1,c2,c3); | |
1189 $LD r6,`3*$BNSZ`(r4) | |
1190 $LD r7,`3*$BNSZ`(r5) | |
1191 $UMULL r8,r6,r7 | |
1192 $UMULH r9,r6,r7 | |
1193 addc r10,r10,r8 | |
1194 adde r11,r11,r9 | |
1195 addze r12,r12 | |
1196 #mul_add_c(a[2],b[4],c1,c2,c3); | |
1197 $LD r6,`2*$BNSZ`(r4) | |
1198 $LD r7,`4*$BNSZ`(r5) | |
1199 $UMULL r8,r6,r7 | |
1200 $UMULH r9,r6,r7 | |
1201 addc r10,r10,r8 | |
1202 adde r11,r11,r9 | |
1203 addze r12,r12 | |
1204 #mul_add_c(a[1],b[5],c1,c2,c3); | |
1205 $LD r6,`1*$BNSZ`(r4) | |
1206 $LD r7,`5*$BNSZ`(r5) | |
1207 $UMULL r8,r6,r7 | |
1208 $UMULH r9,r6,r7 | |
1209 addc r10,r10,r8 | |
1210 adde r11,r11,r9 | |
1211 addze r12,r12 | |
1212 #mul_add_c(a[0],b[6],c1,c2,c3); | |
1213 $LD r6,`0*$BNSZ`(r4) | |
1214 $LD r7,`6*$BNSZ`(r5) | |
1215 $UMULL r8,r6,r7 | |
1216 $UMULH r9,r6,r7 | |
1217 addc r10,r10,r8 | |
1218 adde r11,r11,r9 | |
1219 addze r12,r12 | |
1220 $ST r10,`6*$BNSZ`(r3) #r[6]=c1; | |
1221 #mul_add_c(a[0],b[7],c2,c3,c1); | |
1222 $LD r7,`7*$BNSZ`(r5) | |
1223 $UMULL r8,r6,r7 | |
1224 $UMULH r9,r6,r7 | |
1225 addc r11,r11,r8 | |
1226 adde r12,r12,r9 | |
1227 addze r10,r0 | |
1228 #mul_add_c(a[1],b[6],c2,c3,c1); | |
1229 $LD r6,`1*$BNSZ`(r4) | |
1230 $LD r7,`6*$BNSZ`(r5) | |
1231 $UMULL r8,r6,r7 | |
1232 $UMULH r9,r6,r7 | |
1233 addc r11,r11,r8 | |
1234 adde r12,r12,r9 | |
1235 addze r10,r10 | |
1236 #mul_add_c(a[2],b[5],c2,c3,c1); | |
1237 $LD r6,`2*$BNSZ`(r4) | |
1238 $LD r7,`5*$BNSZ`(r5) | |
1239 $UMULL r8,r6,r7 | |
1240 $UMULH r9,r6,r7 | |
1241 addc r11,r11,r8 | |
1242 adde r12,r12,r9 | |
1243 addze r10,r10 | |
1244 #mul_add_c(a[3],b[4],c2,c3,c1); | |
1245 $LD r6,`3*$BNSZ`(r4) | |
1246 $LD r7,`4*$BNSZ`(r5) | |
1247 $UMULL r8,r6,r7 | |
1248 $UMULH r9,r6,r7 | |
1249 addc r11,r11,r8 | |
1250 adde r12,r12,r9 | |
1251 addze r10,r10 | |
1252 #mul_add_c(a[4],b[3],c2,c3,c1); | |
1253 $LD r6,`4*$BNSZ`(r4) | |
1254 $LD r7,`3*$BNSZ`(r5) | |
1255 $UMULL r8,r6,r7 | |
1256 $UMULH r9,r6,r7 | |
1257 addc r11,r11,r8 | |
1258 adde r12,r12,r9 | |
1259 addze r10,r10 | |
1260 #mul_add_c(a[5],b[2],c2,c3,c1); | |
1261 $LD r6,`5*$BNSZ`(r4) | |
1262 $LD r7,`2*$BNSZ`(r5) | |
1263 $UMULL r8,r6,r7 | |
1264 $UMULH r9,r6,r7 | |
1265 addc r11,r11,r8 | |
1266 adde r12,r12,r9 | |
1267 addze r10,r10 | |
1268 #mul_add_c(a[6],b[1],c2,c3,c1); | |
1269 $LD r6,`6*$BNSZ`(r4) | |
1270 $LD r7,`1*$BNSZ`(r5) | |
1271 $UMULL r8,r6,r7 | |
1272 $UMULH r9,r6,r7 | |
1273 addc r11,r11,r8 | |
1274 adde r12,r12,r9 | |
1275 addze r10,r10 | |
1276 #mul_add_c(a[7],b[0],c2,c3,c1); | |
1277 $LD r6,`7*$BNSZ`(r4) | |
1278 $LD r7,`0*$BNSZ`(r5) | |
1279 $UMULL r8,r6,r7 | |
1280 $UMULH r9,r6,r7 | |
1281 addc r11,r11,r8 | |
1282 adde r12,r12,r9 | |
1283 addze r10,r10 | |
1284 $ST r11,`7*$BNSZ`(r3) #r[7]=c2; | |
1285 #mul_add_c(a[7],b[1],c3,c1,c2); | |
1286 $LD r7,`1*$BNSZ`(r5) | |
1287 $UMULL r8,r6,r7 | |
1288 $UMULH r9,r6,r7 | |
1289 addc r12,r12,r8 | |
1290 adde r10,r10,r9 | |
1291 addze r11,r0 | |
1292 #mul_add_c(a[6],b[2],c3,c1,c2); | |
1293 $LD r6,`6*$BNSZ`(r4) | |
1294 $LD r7,`2*$BNSZ`(r5) | |
1295 $UMULL r8,r6,r7 | |
1296 $UMULH r9,r6,r7 | |
1297 addc r12,r12,r8 | |
1298 adde r10,r10,r9 | |
1299 addze r11,r11 | |
1300 #mul_add_c(a[5],b[3],c3,c1,c2); | |
1301 $LD r6,`5*$BNSZ`(r4) | |
1302 $LD r7,`3*$BNSZ`(r5) | |
1303 $UMULL r8,r6,r7 | |
1304 $UMULH r9,r6,r7 | |
1305 addc r12,r12,r8 | |
1306 adde r10,r10,r9 | |
1307 addze r11,r11 | |
1308 #mul_add_c(a[4],b[4],c3,c1,c2); | |
1309 $LD r6,`4*$BNSZ`(r4) | |
1310 $LD r7,`4*$BNSZ`(r5) | |
1311 $UMULL r8,r6,r7 | |
1312 $UMULH r9,r6,r7 | |
1313 addc r12,r12,r8 | |
1314 adde r10,r10,r9 | |
1315 addze r11,r11 | |
1316 #mul_add_c(a[3],b[5],c3,c1,c2); | |
1317 $LD r6,`3*$BNSZ`(r4) | |
1318 $LD r7,`5*$BNSZ`(r5) | |
1319 $UMULL r8,r6,r7 | |
1320 $UMULH r9,r6,r7 | |
1321 addc r12,r12,r8 | |
1322 adde r10,r10,r9 | |
1323 addze r11,r11 | |
1324 #mul_add_c(a[2],b[6],c3,c1,c2); | |
1325 $LD r6,`2*$BNSZ`(r4) | |
1326 $LD r7,`6*$BNSZ`(r5) | |
1327 $UMULL r8,r6,r7 | |
1328 $UMULH r9,r6,r7 | |
1329 addc r12,r12,r8 | |
1330 adde r10,r10,r9 | |
1331 addze r11,r11 | |
1332 #mul_add_c(a[1],b[7],c3,c1,c2); | |
1333 $LD r6,`1*$BNSZ`(r4) | |
1334 $LD r7,`7*$BNSZ`(r5) | |
1335 $UMULL r8,r6,r7 | |
1336 $UMULH r9,r6,r7 | |
1337 addc r12,r12,r8 | |
1338 adde r10,r10,r9 | |
1339 addze r11,r11 | |
1340 $ST r12,`8*$BNSZ`(r3) #r[8]=c3; | |
1341 #mul_add_c(a[2],b[7],c1,c2,c3); | |
1342 $LD r6,`2*$BNSZ`(r4) | |
1343 $UMULL r8,r6,r7 | |
1344 $UMULH r9,r6,r7 | |
1345 addc r10,r10,r8 | |
1346 adde r11,r11,r9 | |
1347 addze r12,r0 | |
1348 #mul_add_c(a[3],b[6],c1,c2,c3); | |
1349 $LD r6,`3*$BNSZ`(r4) | |
1350 $LD r7,`6*$BNSZ`(r5) | |
1351 $UMULL r8,r6,r7 | |
1352 $UMULH r9,r6,r7 | |
1353 addc r10,r10,r8 | |
1354 adde r11,r11,r9 | |
1355 addze r12,r12 | |
1356 #mul_add_c(a[4],b[5],c1,c2,c3); | |
1357 $LD r6,`4*$BNSZ`(r4) | |
1358 $LD r7,`5*$BNSZ`(r5) | |
1359 $UMULL r8,r6,r7 | |
1360 $UMULH r9,r6,r7 | |
1361 addc r10,r10,r8 | |
1362 adde r11,r11,r9 | |
1363 addze r12,r12 | |
1364 #mul_add_c(a[5],b[4],c1,c2,c3); | |
1365 $LD r6,`5*$BNSZ`(r4) | |
1366 $LD r7,`4*$BNSZ`(r5) | |
1367 $UMULL r8,r6,r7 | |
1368 $UMULH r9,r6,r7 | |
1369 addc r10,r10,r8 | |
1370 adde r11,r11,r9 | |
1371 addze r12,r12 | |
1372 #mul_add_c(a[6],b[3],c1,c2,c3); | |
1373 $LD r6,`6*$BNSZ`(r4) | |
1374 $LD r7,`3*$BNSZ`(r5) | |
1375 $UMULL r8,r6,r7 | |
1376 $UMULH r9,r6,r7 | |
1377 addc r10,r10,r8 | |
1378 adde r11,r11,r9 | |
1379 addze r12,r12 | |
1380 #mul_add_c(a[7],b[2],c1,c2,c3); | |
1381 $LD r6,`7*$BNSZ`(r4) | |
1382 $LD r7,`2*$BNSZ`(r5) | |
1383 $UMULL r8,r6,r7 | |
1384 $UMULH r9,r6,r7 | |
1385 addc r10,r10,r8 | |
1386 adde r11,r11,r9 | |
1387 addze r12,r12 | |
1388 $ST r10,`9*$BNSZ`(r3) #r[9]=c1; | |
1389 #mul_add_c(a[7],b[3],c2,c3,c1); | |
1390 $LD r7,`3*$BNSZ`(r5) | |
1391 $UMULL r8,r6,r7 | |
1392 $UMULH r9,r6,r7 | |
1393 addc r11,r11,r8 | |
1394 adde r12,r12,r9 | |
1395 addze r10,r0 | |
1396 #mul_add_c(a[6],b[4],c2,c3,c1); | |
1397 $LD r6,`6*$BNSZ`(r4) | |
1398 $LD r7,`4*$BNSZ`(r5) | |
1399 $UMULL r8,r6,r7 | |
1400 $UMULH r9,r6,r7 | |
1401 addc r11,r11,r8 | |
1402 adde r12,r12,r9 | |
1403 addze r10,r10 | |
1404 #mul_add_c(a[5],b[5],c2,c3,c1); | |
1405 $LD r6,`5*$BNSZ`(r4) | |
1406 $LD r7,`5*$BNSZ`(r5) | |
1407 $UMULL r8,r6,r7 | |
1408 $UMULH r9,r6,r7 | |
1409 addc r11,r11,r8 | |
1410 adde r12,r12,r9 | |
1411 addze r10,r10 | |
1412 #mul_add_c(a[4],b[6],c2,c3,c1); | |
1413 $LD r6,`4*$BNSZ`(r4) | |
1414 $LD r7,`6*$BNSZ`(r5) | |
1415 $UMULL r8,r6,r7 | |
1416 $UMULH r9,r6,r7 | |
1417 addc r11,r11,r8 | |
1418 adde r12,r12,r9 | |
1419 addze r10,r10 | |
1420 #mul_add_c(a[3],b[7],c2,c3,c1); | |
1421 $LD r6,`3*$BNSZ`(r4) | |
1422 $LD r7,`7*$BNSZ`(r5) | |
1423 $UMULL r8,r6,r7 | |
1424 $UMULH r9,r6,r7 | |
1425 addc r11,r11,r8 | |
1426 adde r12,r12,r9 | |
1427 addze r10,r10 | |
1428 $ST r11,`10*$BNSZ`(r3) #r[10]=c2; | |
1429 #mul_add_c(a[4],b[7],c3,c1,c2); | |
1430 $LD r6,`4*$BNSZ`(r4) | |
1431 $UMULL r8,r6,r7 | |
1432 $UMULH r9,r6,r7 | |
1433 addc r12,r12,r8 | |
1434 adde r10,r10,r9 | |
1435 addze r11,r0 | |
1436 #mul_add_c(a[5],b[6],c3,c1,c2); | |
1437 $LD r6,`5*$BNSZ`(r4) | |
1438 $LD r7,`6*$BNSZ`(r5) | |
1439 $UMULL r8,r6,r7 | |
1440 $UMULH r9,r6,r7 | |
1441 addc r12,r12,r8 | |
1442 adde r10,r10,r9 | |
1443 addze r11,r11 | |
1444 #mul_add_c(a[6],b[5],c3,c1,c2); | |
1445 $LD r6,`6*$BNSZ`(r4) | |
1446 $LD r7,`5*$BNSZ`(r5) | |
1447 $UMULL r8,r6,r7 | |
1448 $UMULH r9,r6,r7 | |
1449 addc r12,r12,r8 | |
1450 adde r10,r10,r9 | |
1451 addze r11,r11 | |
1452 #mul_add_c(a[7],b[4],c3,c1,c2); | |
1453 $LD r6,`7*$BNSZ`(r4) | |
1454 $LD r7,`4*$BNSZ`(r5) | |
1455 $UMULL r8,r6,r7 | |
1456 $UMULH r9,r6,r7 | |
1457 addc r12,r12,r8 | |
1458 adde r10,r10,r9 | |
1459 addze r11,r11 | |
1460 $ST r12,`11*$BNSZ`(r3) #r[11]=c3; | |
1461 #mul_add_c(a[7],b[5],c1,c2,c3); | |
1462 $LD r7,`5*$BNSZ`(r5) | |
1463 $UMULL r8,r6,r7 | |
1464 $UMULH r9,r6,r7 | |
1465 addc r10,r10,r8 | |
1466 adde r11,r11,r9 | |
1467 addze r12,r0 | |
1468 #mul_add_c(a[6],b[6],c1,c2,c3); | |
1469 $LD r6,`6*$BNSZ`(r4) | |
1470 $LD r7,`6*$BNSZ`(r5) | |
1471 $UMULL r8,r6,r7 | |
1472 $UMULH r9,r6,r7 | |
1473 addc r10,r10,r8 | |
1474 adde r11,r11,r9 | |
1475 addze r12,r12 | |
1476 #mul_add_c(a[5],b[7],c1,c2,c3); | |
1477 $LD r6,`5*$BNSZ`(r4) | |
1478 $LD r7,`7*$BNSZ`(r5) | |
1479 $UMULL r8,r6,r7 | |
1480 $UMULH r9,r6,r7 | |
1481 addc r10,r10,r8 | |
1482 adde r11,r11,r9 | |
1483 addze r12,r12 | |
1484 $ST r10,`12*$BNSZ`(r3) #r[12]=c1; | |
1485 #mul_add_c(a[6],b[7],c2,c3,c1); | |
1486 $LD r6,`6*$BNSZ`(r4) | |
1487 $UMULL r8,r6,r7 | |
1488 $UMULH r9,r6,r7 | |
1489 addc r11,r11,r8 | |
1490 adde r12,r12,r9 | |
1491 addze r10,r0 | |
1492 #mul_add_c(a[7],b[6],c2,c3,c1); | |
1493 $LD r6,`7*$BNSZ`(r4) | |
1494 $LD r7,`6*$BNSZ`(r5) | |
1495 $UMULL r8,r6,r7 | |
1496 $UMULH r9,r6,r7 | |
1497 addc r11,r11,r8 | |
1498 adde r12,r12,r9 | |
1499 addze r10,r10 | |
1500 $ST r11,`13*$BNSZ`(r3) #r[13]=c2; | |
1501 #mul_add_c(a[7],b[7],c3,c1,c2); | |
1502 $LD r7,`7*$BNSZ`(r5) | |
1503 $UMULL r8,r6,r7 | |
1504 $UMULH r9,r6,r7 | |
1505 addc r12,r12,r8 | |
1506 adde r10,r10,r9 | |
1507 $ST r12,`14*$BNSZ`(r3) #r[14]=c3; | |
1508 $ST r10,`15*$BNSZ`(r3) #r[15]=c1; | |
1509 blr | |
1510 .long 0 | |
1511 .byte 0,12,0x14,0,0,0,3,0 | |
1512 .long 0 | |
1513 | |
1514 # | |
1515 # NOTE: The following label name should be changed to | |
1516 # "bn_sub_words" i.e. remove the first dot | |
1517 # for the gcc compiler. This should be automatically | |
1518 # done in the build | |
1519 # | |
1520 # | |
1521 .align 4 | |
1522 .bn_sub_words: | |
1523 # | |
1524 # Handcoded version of bn_sub_words | |
1525 # | |
1526 #BN_ULONG bn_sub_words(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n) | |
1527 # | |
1528 # r3 = r | |
1529 # r4 = a | |
1530 # r5 = b | |
1531 # r6 = n | |
1532 # | |
1533 # Note: No loop unrolling done since this is not a performance | |
1534 # critical loop. | |
1535 | |
1536 xor r0,r0,r0 #set r0 = 0 | |
1537 # | |
1538 # check for r6 = 0 AND set carry bit. | |
1539 # | |
1540 subfc. r7,r0,r6 # If r6 is 0 then result is 0. | |
1541 # if r6 > 0 then result !=0 | |
1542 # In either case carry bit is set. | |
1543 beq Lppcasm_sub_adios | |
1544 addi r4,r4,-$BNSZ | |
1545 addi r3,r3,-$BNSZ | |
1546 addi r5,r5,-$BNSZ | |
1547 mtctr r6 | |
1548 Lppcasm_sub_mainloop: | |
1549 $LDU r7,$BNSZ(r4) | |
1550 $LDU r8,$BNSZ(r5) | |
1551 subfe r6,r8,r7 # r6 = r7+carry bit + onescomplement(r8) | |
1552 # if carry = 1 this is r7-r8. Else it | |
1553 # is r7-r8 -1 as we need. | |
1554 $STU r6,$BNSZ(r3) | |
1555 bdnz- Lppcasm_sub_mainloop | |
1556 Lppcasm_sub_adios: | |
1557 subfze r3,r0 # if carry bit is set then r3 = 0 else -1 | |
1558 andi. r3,r3,1 # keep only last bit. | |
1559 blr | |
1560 .long 0 | |
1561 .byte 0,12,0x14,0,0,0,4,0 | |
1562 .long 0 | |
1563 | |
1564 # | |
1565 # NOTE: The following label name should be changed to | |
1566 # "bn_add_words" i.e. remove the first dot | |
1567 # for the gcc compiler. This should be automatically | |
1568 # done in the build | |
1569 # | |
1570 | |
1571 .align 4 | |
1572 .bn_add_words: | |
1573 # | |
1574 # Handcoded version of bn_add_words | |
1575 # | |
1576 #BN_ULONG bn_add_words(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n) | |
1577 # | |
1578 # r3 = r | |
1579 # r4 = a | |
1580 # r5 = b | |
1581 # r6 = n | |
1582 # | |
1583 # Note: No loop unrolling done since this is not a performance | |
1584 # critical loop. | |
1585 | |
1586 xor r0,r0,r0 | |
1587 # | |
1588 # check for r6 = 0. Is this needed? | |
1589 # | |
1590 addic. r6,r6,0 #test r6 and clear carry bit. | |
1591 beq Lppcasm_add_adios | |
1592 addi r4,r4,-$BNSZ | |
1593 addi r3,r3,-$BNSZ | |
1594 addi r5,r5,-$BNSZ | |
1595 mtctr r6 | |
1596 Lppcasm_add_mainloop: | |
1597 $LDU r7,$BNSZ(r4) | |
1598 $LDU r8,$BNSZ(r5) | |
1599 adde r8,r7,r8 | |
1600 $STU r8,$BNSZ(r3) | |
1601 bdnz- Lppcasm_add_mainloop | |
1602 Lppcasm_add_adios: | |
1603 addze r3,r0 #return carry bit. | |
1604 blr | |
1605 .long 0 | |
1606 .byte 0,12,0x14,0,0,0,4,0 | |
1607 .long 0 | |
1608 | |
1609 # | |
1610 # NOTE: The following label name should be changed to | |
1611 # "bn_div_words" i.e. remove the first dot | |
1612 # for the gcc compiler. This should be automatically | |
1613 # done in the build | |
1614 # | |
1615 | |
1616 .align 4 | |
1617 .bn_div_words: | |
1618 # | |
1619 # This is a cleaned up version of code generated by | |
1620 # the AIX compiler. The only optimization is to use | |
1621 # the PPC instruction to count leading zeros instead | |
1622 # of call to num_bits_word. Since this was compiled | |
1623 # only at level -O2 we can possibly squeeze it more? | |
1624 # | |
1625 # r3 = h | |
1626 # r4 = l | |
1627 # r5 = d | |
1628 | |
1629 $UCMPI 0,r5,0 # compare r5 and 0 | |
1630 bne Lppcasm_div1 # proceed if d!=0 | |
1631 li r3,-1 # d=0 return -1 | |
1632 blr | |
1633 Lppcasm_div1: | |
1634 xor r0,r0,r0 #r0=0 | |
1635 li r8,$BITS | |
1636 $CNTLZ. r7,r5 #r7 = num leading 0s in d. | |
1637 beq Lppcasm_div2 #proceed if no leading zeros | |
1638 subf r8,r7,r8 #r8 = BN_num_bits_word(d) | |
1639 $SHR. r9,r3,r8 #are there any bits above r8'th? | |
1640 $TR 16,r9,r0 #if there're, signal to dump core... | |
1641 Lppcasm_div2: | |
1642 $UCMP 0,r3,r5 #h>=d? | |
1643 blt Lppcasm_div3 #goto Lppcasm_div3 if not | |
1644 subf r3,r5,r3 #h-=d ; | |
1645 Lppcasm_div3: #r7 = BN_BITS2-i. so r7=i | |
1646 cmpi 0,0,r7,0 # is (i == 0)? | |
1647 beq Lppcasm_div4 | |
1648 $SHL r3,r3,r7 # h = (h<< i) | |
1649 $SHR r8,r4,r8 # r8 = (l >> BN_BITS2 -i) | |
1650 $SHL r5,r5,r7 # d<<=i | |
1651 or r3,r3,r8 # h = (h<<i)|(l>>(BN_BITS2-i)) | |
1652 $SHL r4,r4,r7 # l <<=i | |
1653 Lppcasm_div4: | |
1654 $SHRI r9,r5,`$BITS/2` # r9 = dh | |
1655 # dl will be computed when needed | |
1656 # as it saves registers. | |
1657 li r6,2 #r6=2 | |
1658 mtctr r6 #counter will be in count. | |
1659 Lppcasm_divouterloop: | |
1660 $SHRI r8,r3,`$BITS/2` #r8 = (h>>BN_BITS4) | |
1661 $SHRI r11,r4,`$BITS/2` #r11= (l&BN_MASK2h)>>BN_BITS4 | |
1662 # compute here for innerloop. | |
1663 $UCMP 0,r8,r9 # is (h>>BN_BITS4)==dh | |
1664 bne Lppcasm_div5 # goto Lppcasm_div5 if not | |
1665 | |
1666 li r8,-1 | |
1667 $CLRU r8,r8,`$BITS/2` #q = BN_MASK2l | |
1668 b Lppcasm_div6 | |
1669 Lppcasm_div5: | |
1670 $UDIV r8,r3,r9 #q = h/dh | |
1671 Lppcasm_div6: | |
1672 $UMULL r12,r9,r8 #th = q*dh | |
1673 $CLRU r10,r5,`$BITS/2` #r10=dl | |
1674 $UMULL r6,r8,r10 #tl = q*dl | |
1675 | |
1676 Lppcasm_divinnerloop: | |
1677 subf r10,r12,r3 #t = h -th | |
1678 $SHRI r7,r10,`$BITS/2` #r7= (t &BN_MASK2H), sort of... | |
1679 addic. r7,r7,0 #test if r7 == 0. used below. | |
1680 # now want to compute | |
1681 # r7 = (t<<BN_BITS4)|((l&BN_MASK2h)>>BN_
BITS4) | |
1682 # the following 2 instructions do that | |
1683 $SHLI r7,r10,`$BITS/2` # r7 = (t<<BN_BITS4) | |
1684 or r7,r7,r11 # r7|=((l&BN_MASK2h)>>BN_BITS4) | |
1685 $UCMP cr1,r6,r7 # compare (tl <= r7) | |
1686 bne Lppcasm_divinnerexit | |
1687 ble cr1,Lppcasm_divinnerexit | |
1688 addi r8,r8,-1 #q-- | |
1689 subf r12,r9,r12 #th -=dh | |
1690 $CLRU r10,r5,`$BITS/2` #r10=dl. t is no longer needed in loop. | |
1691 subf r6,r10,r6 #tl -=dl | |
1692 b Lppcasm_divinnerloop | |
1693 Lppcasm_divinnerexit: | |
1694 $SHRI r10,r6,`$BITS/2` #t=(tl>>BN_BITS4) | |
1695 $SHLI r11,r6,`$BITS/2` #tl=(tl<<BN_BITS4)&BN_MASK2h; | |
1696 $UCMP cr1,r4,r11 # compare l and tl | |
1697 add r12,r12,r10 # th+=t | |
1698 bge cr1,Lppcasm_div7 # if (l>=tl) goto Lppcasm_div7 | |
1699 addi r12,r12,1 # th++ | |
1700 Lppcasm_div7: | |
1701 subf r11,r11,r4 #r11=l-tl | |
1702 $UCMP cr1,r3,r12 #compare h and th | |
1703 bge cr1,Lppcasm_div8 #if (h>=th) goto Lppcasm_div8 | |
1704 addi r8,r8,-1 # q-- | |
1705 add r3,r5,r3 # h+=d | |
1706 Lppcasm_div8: | |
1707 subf r12,r12,r3 #r12 = h-th | |
1708 $SHLI r4,r11,`$BITS/2` #l=(l&BN_MASK2l)<<BN_BITS4 | |
1709 # want to compute | |
1710 # h = ((h<<BN_BITS4)|(l>>BN_BITS4))&BN_M
ASK2 | |
1711 # the following 2 instructions will do t
his. | |
1712 $INSR r11,r12,`$BITS/2`,`$BITS/2` # r11 is the value we want rotat
ed $BITS/2. | |
1713 $ROTL r3,r11,`$BITS/2` # rotate by $BITS/2 and store in r3 | |
1714 bdz Lppcasm_div9 #if (count==0) break ; | |
1715 $SHLI r0,r8,`$BITS/2` #ret =q<<BN_BITS4 | |
1716 b Lppcasm_divouterloop | |
1717 Lppcasm_div9: | |
1718 or r3,r8,r0 | |
1719 blr | |
1720 .long 0 | |
1721 .byte 0,12,0x14,0,0,0,3,0 | |
1722 .long 0 | |
1723 | |
1724 # | |
1725 # NOTE: The following label name should be changed to | |
1726 # "bn_sqr_words" i.e. remove the first dot | |
1727 # for the gcc compiler. This should be automatically | |
1728 # done in the build | |
1729 # | |
1730 .align 4 | |
1731 .bn_sqr_words: | |
1732 # | |
1733 # Optimized version of bn_sqr_words | |
1734 # | |
1735 # void bn_sqr_words(BN_ULONG *r, BN_ULONG *a, int n) | |
1736 # | |
1737 # r3 = r | |
1738 # r4 = a | |
1739 # r5 = n | |
1740 # | |
1741 # r6 = a[i]. | |
1742 # r7,r8 = product. | |
1743 # | |
1744 # No unrolling done here. Not performance critical. | |
1745 | |
1746 addic. r5,r5,0 #test r5. | |
1747 beq Lppcasm_sqr_adios | |
1748 addi r4,r4,-$BNSZ | |
1749 addi r3,r3,-$BNSZ | |
1750 mtctr r5 | |
1751 Lppcasm_sqr_mainloop: | |
1752 #sqr(r[0],r[1],a[0]); | |
1753 $LDU r6,$BNSZ(r4) | |
1754 $UMULL r7,r6,r6 | |
1755 $UMULH r8,r6,r6 | |
1756 $STU r7,$BNSZ(r3) | |
1757 $STU r8,$BNSZ(r3) | |
1758 bdnz- Lppcasm_sqr_mainloop | |
1759 Lppcasm_sqr_adios: | |
1760 blr | |
1761 .long 0 | |
1762 .byte 0,12,0x14,0,0,0,3,0 | |
1763 .long 0 | |
1764 | |
1765 # | |
1766 # NOTE: The following label name should be changed to | |
1767 # "bn_mul_words" i.e. remove the first dot | |
1768 # for the gcc compiler. This should be automatically | |
1769 # done in the build | |
1770 # | |
1771 | |
1772 .align 4 | |
1773 .bn_mul_words: | |
1774 # | |
1775 # BN_ULONG bn_mul_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w) | |
1776 # | |
1777 # r3 = rp | |
1778 # r4 = ap | |
1779 # r5 = num | |
1780 # r6 = w | |
1781 xor r0,r0,r0 | |
1782 xor r12,r12,r12 # used for carry | |
1783 rlwinm. r7,r5,30,2,31 # num >> 2 | |
1784 beq Lppcasm_mw_REM | |
1785 mtctr r7 | |
1786 Lppcasm_mw_LOOP: | |
1787 #mul(rp[0],ap[0],w,c1); | |
1788 $LD r8,`0*$BNSZ`(r4) | |
1789 $UMULL r9,r6,r8 | |
1790 $UMULH r10,r6,r8 | |
1791 addc r9,r9,r12 | |
1792 #addze r10,r10 #carry is NOT ignored. | |
1793 #will be taken care of | |
1794 #in second spin below | |
1795 #using adde. | |
1796 $ST r9,`0*$BNSZ`(r3) | |
1797 #mul(rp[1],ap[1],w,c1); | |
1798 $LD r8,`1*$BNSZ`(r4) | |
1799 $UMULL r11,r6,r8 | |
1800 $UMULH r12,r6,r8 | |
1801 adde r11,r11,r10 | |
1802 #addze r12,r12 | |
1803 $ST r11,`1*$BNSZ`(r3) | |
1804 #mul(rp[2],ap[2],w,c1); | |
1805 $LD r8,`2*$BNSZ`(r4) | |
1806 $UMULL r9,r6,r8 | |
1807 $UMULH r10,r6,r8 | |
1808 adde r9,r9,r12 | |
1809 #addze r10,r10 | |
1810 $ST r9,`2*$BNSZ`(r3) | |
1811 #mul_add(rp[3],ap[3],w,c1); | |
1812 $LD r8,`3*$BNSZ`(r4) | |
1813 $UMULL r11,r6,r8 | |
1814 $UMULH r12,r6,r8 | |
1815 adde r11,r11,r10 | |
1816 addze r12,r12 #this spin we collect carry into | |
1817 #r12 | |
1818 $ST r11,`3*$BNSZ`(r3) | |
1819 | |
1820 addi r3,r3,`4*$BNSZ` | |
1821 addi r4,r4,`4*$BNSZ` | |
1822 bdnz- Lppcasm_mw_LOOP | |
1823 | |
1824 Lppcasm_mw_REM: | |
1825 andi. r5,r5,0x3 | |
1826 beq Lppcasm_mw_OVER | |
1827 #mul(rp[0],ap[0],w,c1); | |
1828 $LD r8,`0*$BNSZ`(r4) | |
1829 $UMULL r9,r6,r8 | |
1830 $UMULH r10,r6,r8 | |
1831 addc r9,r9,r12 | |
1832 addze r10,r10 | |
1833 $ST r9,`0*$BNSZ`(r3) | |
1834 addi r12,r10,0 | |
1835 | |
1836 addi r5,r5,-1 | |
1837 cmpli 0,0,r5,0 | |
1838 beq Lppcasm_mw_OVER | |
1839 | |
1840 | |
1841 #mul(rp[1],ap[1],w,c1); | |
1842 $LD r8,`1*$BNSZ`(r4) | |
1843 $UMULL r9,r6,r8 | |
1844 $UMULH r10,r6,r8 | |
1845 addc r9,r9,r12 | |
1846 addze r10,r10 | |
1847 $ST r9,`1*$BNSZ`(r3) | |
1848 addi r12,r10,0 | |
1849 | |
1850 addi r5,r5,-1 | |
1851 cmpli 0,0,r5,0 | |
1852 beq Lppcasm_mw_OVER | |
1853 | |
1854 #mul_add(rp[2],ap[2],w,c1); | |
1855 $LD r8,`2*$BNSZ`(r4) | |
1856 $UMULL r9,r6,r8 | |
1857 $UMULH r10,r6,r8 | |
1858 addc r9,r9,r12 | |
1859 addze r10,r10 | |
1860 $ST r9,`2*$BNSZ`(r3) | |
1861 addi r12,r10,0 | |
1862 | |
1863 Lppcasm_mw_OVER: | |
1864 addi r3,r12,0 | |
1865 blr | |
1866 .long 0 | |
1867 .byte 0,12,0x14,0,0,0,4,0 | |
1868 .long 0 | |
1869 | |
1870 # | |
1871 # NOTE: The following label name should be changed to | |
1872 # "bn_mul_add_words" i.e. remove the first dot | |
1873 # for the gcc compiler. This should be automatically | |
1874 # done in the build | |
1875 # | |
1876 | |
1877 .align 4 | |
1878 .bn_mul_add_words: | |
1879 # | |
1880 # BN_ULONG bn_mul_add_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w) | |
1881 # | |
1882 # r3 = rp | |
1883 # r4 = ap | |
1884 # r5 = num | |
1885 # r6 = w | |
1886 # | |
1887 # empirical evidence suggests that unrolled version performs best!! | |
1888 # | |
1889 xor r0,r0,r0 #r0 = 0 | |
1890 xor r12,r12,r12 #r12 = 0 . used for carry | |
1891 rlwinm. r7,r5,30,2,31 # num >> 2 | |
1892 beq Lppcasm_maw_leftover # if (num < 4) go LPPCASM_maw_leftover | |
1893 mtctr r7 | |
1894 Lppcasm_maw_mainloop: | |
1895 #mul_add(rp[0],ap[0],w,c1); | |
1896 $LD r8,`0*$BNSZ`(r4) | |
1897 $LD r11,`0*$BNSZ`(r3) | |
1898 $UMULL r9,r6,r8 | |
1899 $UMULH r10,r6,r8 | |
1900 addc r9,r9,r12 #r12 is carry. | |
1901 addze r10,r10 | |
1902 addc r9,r9,r11 | |
1903 #addze r10,r10 | |
1904 #the above instruction addze | |
1905 #is NOT needed. Carry will NOT | |
1906 #be ignored. It's not affected | |
1907 #by multiply and will be collected | |
1908 #in the next spin | |
1909 $ST r9,`0*$BNSZ`(r3) | |
1910 | |
1911 #mul_add(rp[1],ap[1],w,c1); | |
1912 $LD r8,`1*$BNSZ`(r4) | |
1913 $LD r9,`1*$BNSZ`(r3) | |
1914 $UMULL r11,r6,r8 | |
1915 $UMULH r12,r6,r8 | |
1916 adde r11,r11,r10 #r10 is carry. | |
1917 addze r12,r12 | |
1918 addc r11,r11,r9 | |
1919 #addze r12,r12 | |
1920 $ST r11,`1*$BNSZ`(r3) | |
1921 | |
1922 #mul_add(rp[2],ap[2],w,c1); | |
1923 $LD r8,`2*$BNSZ`(r4) | |
1924 $UMULL r9,r6,r8 | |
1925 $LD r11,`2*$BNSZ`(r3) | |
1926 $UMULH r10,r6,r8 | |
1927 adde r9,r9,r12 | |
1928 addze r10,r10 | |
1929 addc r9,r9,r11 | |
1930 #addze r10,r10 | |
1931 $ST r9,`2*$BNSZ`(r3) | |
1932 | |
1933 #mul_add(rp[3],ap[3],w,c1); | |
1934 $LD r8,`3*$BNSZ`(r4) | |
1935 $UMULL r11,r6,r8 | |
1936 $LD r9,`3*$BNSZ`(r3) | |
1937 $UMULH r12,r6,r8 | |
1938 adde r11,r11,r10 | |
1939 addze r12,r12 | |
1940 addc r11,r11,r9 | |
1941 addze r12,r12 | |
1942 $ST r11,`3*$BNSZ`(r3) | |
1943 addi r3,r3,`4*$BNSZ` | |
1944 addi r4,r4,`4*$BNSZ` | |
1945 bdnz- Lppcasm_maw_mainloop | |
1946 | |
1947 Lppcasm_maw_leftover: | |
1948 andi. r5,r5,0x3 | |
1949 beq Lppcasm_maw_adios | |
1950 addi r3,r3,-$BNSZ | |
1951 addi r4,r4,-$BNSZ | |
1952 #mul_add(rp[0],ap[0],w,c1); | |
1953 mtctr r5 | |
1954 $LDU r8,$BNSZ(r4) | |
1955 $UMULL r9,r6,r8 | |
1956 $UMULH r10,r6,r8 | |
1957 $LDU r11,$BNSZ(r3) | |
1958 addc r9,r9,r11 | |
1959 addze r10,r10 | |
1960 addc r9,r9,r12 | |
1961 addze r12,r10 | |
1962 $ST r9,0(r3) | |
1963 | |
1964 bdz Lppcasm_maw_adios | |
1965 #mul_add(rp[1],ap[1],w,c1); | |
1966 $LDU r8,$BNSZ(r4) | |
1967 $UMULL r9,r6,r8 | |
1968 $UMULH r10,r6,r8 | |
1969 $LDU r11,$BNSZ(r3) | |
1970 addc r9,r9,r11 | |
1971 addze r10,r10 | |
1972 addc r9,r9,r12 | |
1973 addze r12,r10 | |
1974 $ST r9,0(r3) | |
1975 | |
1976 bdz Lppcasm_maw_adios | |
1977 #mul_add(rp[2],ap[2],w,c1); | |
1978 $LDU r8,$BNSZ(r4) | |
1979 $UMULL r9,r6,r8 | |
1980 $UMULH r10,r6,r8 | |
1981 $LDU r11,$BNSZ(r3) | |
1982 addc r9,r9,r11 | |
1983 addze r10,r10 | |
1984 addc r9,r9,r12 | |
1985 addze r12,r10 | |
1986 $ST r9,0(r3) | |
1987 | |
1988 Lppcasm_maw_adios: | |
1989 addi r3,r12,0 | |
1990 blr | |
1991 .long 0 | |
1992 .byte 0,12,0x14,0,0,0,4,0 | |
1993 .long 0 | |
1994 .align 4 | |
1995 EOF | |
1996 $data =~ s/\`([^\`]*)\`/eval $1/gem; | |
1997 print $data; | |
1998 close STDOUT; | |
OLD | NEW |