Reorganize bn_mul.c (no bugfix yet), remove obsolete files in BN library.
[openssl.git] / crypto / bn / asm / mips1.s
1 /* This assember is for R2000/R3000 machines, or higher ones that do
2  * no want to do any 64 bit arithmatic.
3  * Make sure that the SSLeay bignum library is compiled with 
4  * THIRTY_TWO_BIT set.
5  * This must either be compiled with the system CC, or, if you use GNU gas,
6  * cc -E mips1.s|gas -o mips1.o
7  */
8         .set    reorder
9         .set    noat
10
11 #define R1      $1
12 #define CC      $2
13 #define R2      $3
14 #define R3      $8
15 #define R4      $9
16 #define L1      $10
17 #define L2      $11
18 #define L3      $12
19 #define L4      $13
20 #define H1      $14
21 #define H2      $15
22 #define H3      $24
23 #define H4      $25
24
25 #define P1      $4
26 #define P2      $5
27 #define P3      $6
28 #define P4      $7
29
30         .align  2
31         .ent    bn_mul_add_words
32         .globl  bn_mul_add_words
33 .text
34 bn_mul_add_words:
35         .frame  $sp,0,$31
36         .mask   0x00000000,0
37         .fmask  0x00000000,0
38
39         #blt    P3,4,$lab34
40         
41         subu    R1,P3,4
42         move    CC,$0
43         bltz    R1,$lab34
44 $lab2:  
45         lw      R1,0(P1)
46          lw     L1,0(P2)
47         lw      R2,4(P1)
48          lw     L2,4(P2)
49         lw      R3,8(P1)
50          lw     L3,8(P2)
51         lw      R4,12(P1)
52          lw     L4,12(P2)
53         multu   L1,P4
54          addu   R1,R1,CC
55         mflo    L1
56          sltu   CC,R1,CC
57         addu    R1,R1,L1
58          mfhi   H1
59         sltu    L1,R1,L1
60          sw     R1,0(P1)
61         addu    CC,CC,L1
62          multu  L2,P4
63         addu    CC,H1,CC
64         mflo    L2
65          addu   R2,R2,CC
66         sltu    CC,R2,CC
67          mfhi   H2
68         addu    R2,R2,L2
69          addu   P2,P2,16
70         sltu    L2,R2,L2
71          sw     R2,4(P1)
72         addu    CC,CC,L2
73          multu  L3,P4
74         addu    CC,H2,CC
75         mflo    L3
76          addu   R3,R3,CC
77         sltu    CC,R3,CC
78          mfhi   H3
79         addu    R3,R3,L3
80          addu   P1,P1,16
81         sltu    L3,R3,L3
82          sw     R3,-8(P1)
83         addu    CC,CC,L3
84          multu  L4,P4
85         addu    CC,H3,CC
86         mflo    L4
87          addu   R4,R4,CC
88         sltu    CC,R4,CC
89          mfhi   H4
90         addu    R4,R4,L4
91          subu   P3,P3,4
92         sltu    L4,R4,L4
93         addu    CC,CC,L4
94         addu    CC,H4,CC
95
96         subu    R1,P3,4
97         sw      R4,-4(P1)       # delay slot
98         bgez    R1,$lab2
99
100         bleu    P3,0,$lab3
101         .align  2
102 $lab33: 
103         lw      L1,0(P2)
104          lw     R1,0(P1)
105         multu   L1,P4
106          addu   R1,R1,CC
107         sltu    CC,R1,CC
108          addu   P1,P1,4
109         mflo    L1
110          mfhi   H1
111         addu    R1,R1,L1
112          addu   P2,P2,4
113         sltu    L1,R1,L1
114          subu   P3,P3,1
115         addu    CC,CC,L1
116          sw     R1,-4(P1)
117         addu    CC,H1,CC
118          bgtz   P3,$lab33
119         j       $31
120         .align  2
121 $lab3:
122         j       $31
123         .align  2
124 $lab34:
125         bgt     P3,0,$lab33
126         j       $31
127         .end    bn_mul_add_words
128
129         .align  2
130         # Program Unit: bn_mul_words
131         .ent    bn_mul_words
132         .globl  bn_mul_words
133 .text
134 bn_mul_words:
135         .frame  $sp,0,$31
136         .mask   0x00000000,0
137         .fmask  0x00000000,0
138         
139         subu    P3,P3,4
140         move    CC,$0
141         bltz    P3,$lab45
142 $lab44: 
143         lw      L1,0(P2)
144          lw     L2,4(P2)
145         lw      L3,8(P2)
146          lw     L4,12(P2)
147         multu   L1,P4
148          subu   P3,P3,4
149         mflo    L1
150          mfhi   H1
151         addu    L1,L1,CC
152          multu  L2,P4
153         sltu    CC,L1,CC
154          sw     L1,0(P1)
155         addu    CC,H1,CC
156          mflo   L2
157         mfhi    H2
158          addu   L2,L2,CC
159         multu   L3,P4
160          sltu   CC,L2,CC
161         sw      L2,4(P1)
162          addu   CC,H2,CC
163         mflo    L3
164          mfhi   H3
165         addu    L3,L3,CC
166          multu  L4,P4
167         sltu    CC,L3,CC
168          sw     L3,8(P1)
169         addu    CC,H3,CC
170          mflo   L4
171         mfhi    H4
172          addu   L4,L4,CC
173         addu    P1,P1,16
174          sltu   CC,L4,CC
175         addu    P2,P2,16
176          addu   CC,H4,CC
177         sw      L4,-4(P1)
178
179         bgez    P3,$lab44
180         b       $lab45
181 $lab46:
182         lw      L1,0(P2)
183          addu   P1,P1,4
184         multu   L1,P4
185          addu   P2,P2,4
186         mflo    L1
187          mfhi   H1
188         addu    L1,L1,CC
189          subu   P3,P3,1
190         sltu    CC,L1,CC
191          sw     L1,-4(P1)
192         addu    CC,H1,CC
193          bgtz   P3,$lab46
194         j       $31
195 $lab45:
196         addu    P3,P3,4
197         bgtz    P3,$lab46
198         j       $31
199         .align  2
200         .end    bn_mul_words
201
202         # Program Unit: bn_sqr_words
203         .ent    bn_sqr_words
204         .globl  bn_sqr_words
205 .text
206 bn_sqr_words:
207         .frame  $sp,0,$31
208         .mask   0x00000000,0
209         .fmask  0x00000000,0
210         
211         subu    P3,P3,4
212         bltz    P3,$lab55
213 $lab54:
214         lw      L1,0(P2)
215          lw     L2,4(P2)
216         lw      L3,8(P2)
217          lw     L4,12(P2)
218
219         multu   L1,L1
220          subu   P3,P3,4
221         mflo    L1
222          mfhi   H1
223         sw      L1,0(P1)
224          sw     H1,4(P1)
225
226         multu   L2,L2
227          addu   P1,P1,32
228         mflo    L2
229          mfhi   H2
230         sw      L2,-24(P1)
231          sw     H2,-20(P1)
232
233         multu   L3,L3
234          addu   P2,P2,16
235         mflo    L3
236          mfhi   H3
237         sw      L3,-16(P1)
238          sw     H3,-12(P1)
239
240         multu   L4,L4
241
242         mflo    L4
243          mfhi   H4
244         sw      L4,-8(P1)
245          sw     H4,-4(P1)
246
247         bgtz    P3,$lab54
248         b       $lab55
249 $lab56: 
250         lw      L1,0(P2)
251         addu    P1,P1,8
252         multu   L1,L1
253         addu    P2,P2,4
254         subu    P3,P3,1
255         mflo    L1
256         mfhi    H1
257         sw      L1,-8(P1)
258         sw      H1,-4(P1)
259
260         bgtz    P3,$lab56
261         j       $31
262 $lab55:
263         addu    P3,P3,4
264         bgtz    P3,$lab56
265         j       $31
266         .align  2
267         .end    bn_sqr_words
268
269         # Program Unit: bn_add_words
270         .ent    bn_add_words
271         .globl  bn_add_words
272 .text
273 bn_add_words:    # 0x590
274         .frame  $sp,0,$31
275         .mask   0x00000000,0
276         .fmask  0x00000000,0
277         
278         subu    P4,P4,4
279         move    CC,$0
280         bltz    P4,$lab65
281 $lab64: 
282         lw      L1,0(P2)
283         lw      R1,0(P3)
284         lw      L2,4(P2)
285         lw      R2,4(P3)
286
287         addu    L1,L1,CC
288          lw     L3,8(P2)
289         sltu    CC,L1,CC
290          addu   L1,L1,R1
291         sltu    R1,L1,R1
292          lw     R3,8(P3)
293         addu    CC,CC,R1
294          lw     L4,12(P2)
295
296         addu    L2,L2,CC
297          lw     R4,12(P3)
298         sltu    CC,L2,CC
299          addu   L2,L2,R2
300         sltu    R2,L2,R2
301          sw     L1,0(P1)
302         addu    CC,CC,R2
303          addu   P1,P1,16
304         addu    L3,L3,CC
305          sw     L2,-12(P1)
306  
307         sltu    CC,L3,CC
308          addu   L3,L3,R3
309         sltu    R3,L3,R3
310          addu   P2,P2,16
311         addu    CC,CC,R3
312
313         addu    L4,L4,CC
314          addu   P3,P3,16
315         sltu    CC,L4,CC
316          addu   L4,L4,R4
317         subu    P4,P4,4
318          sltu   R4,L4,R4
319         sw      L3,-8(P1)
320          addu   CC,CC,R4
321         sw      L4,-4(P1)
322
323         bgtz    P4,$lab64
324         b       $lab65
325 $lab66:
326         lw      L1,0(P2)
327          lw     R1,0(P3)
328         addu    L1,L1,CC
329          addu   P1,P1,4
330         sltu    CC,L1,CC
331          addu   P2,P2,4
332         addu    P3,P3,4
333          addu   L1,L1,R1
334         subu    P4,P4,1
335          sltu   R1,L1,R1
336         sw      L1,-4(P1)
337          addu   CC,CC,R1
338
339         bgtz    P4,$lab66
340         j       $31
341 $lab65:
342         addu    P4,P4,4
343         bgtz    P4,$lab66
344         j       $31
345         .end    bn_add_words
346
347         # Program Unit: bn_div64
348         .set    at
349         .set    reorder
350         .text   
351         .align  2
352         .globl  bn_div64
353  # 321          {
354         .ent    bn_div64 2
355 bn_div64:
356         subu    $sp, 64
357         sw      $31, 56($sp)
358         sw      $16, 48($sp)
359         .mask   0x80010000, -56
360         .frame  $sp, 64, $31
361         move    $9, $4
362         move    $12, $5
363         move    $16, $6
364  # 322          BN_ULONG dh,dl,q,ret=0,th,tl,t;
365         move    $31, $0
366  # 323          int i,count=2;
367         li      $13, 2
368  # 324  
369  # 325          if (d == 0) return(BN_MASK2);
370         bne     $16, 0, $80
371         li      $2, -1
372         b       $93
373 $80:
374  # 326  
375  # 327          i=BN_num_bits_word(d);
376         move    $4, $16
377         sw      $31, 16($sp)
378         sw      $9, 24($sp)
379         sw      $12, 32($sp)
380         sw      $13, 40($sp)
381         .livereg        0x800ff0e,0xfff
382         jal     BN_num_bits_word
383         li      $4, 32
384         lw      $31, 16($sp)
385         lw      $9, 24($sp)
386         lw      $12, 32($sp)
387         lw      $13, 40($sp)
388         move    $3, $2
389  # 328          if ((i != BN_BITS2) && (h > (BN_ULONG)1<<i))
390         beq     $2, $4, $81
391         li      $14, 1
392         sll     $15, $14, $2
393         bleu    $9, $15, $81
394  # 329                  {
395  # 330  #if !defined(NO_STDIO) && !defined(WIN16)
396  # 331                  fprintf(stderr,"Division would overflow (%d)\n",i);
397  # 332  #endif
398  # 333                  abort();
399         sw      $3, 8($sp)
400         sw      $9, 24($sp)
401         sw      $12, 32($sp)
402         sw      $13, 40($sp)
403         sw      $31, 26($sp)
404         .livereg        0xff0e,0xfff
405         jal     abort
406         lw      $3, 8($sp)
407         li      $4, 32
408         lw      $9, 24($sp)
409         lw      $12, 32($sp)
410         lw      $13, 40($sp)
411         lw      $31, 26($sp)
412  # 334                  }
413 $81:
414  # 335          i=BN_BITS2-i;
415         subu    $3, $4, $3
416  # 336          if (h >= d) h-=d;
417         bltu    $9, $16, $82
418         subu    $9, $9, $16
419 $82:
420  # 337  
421  # 338          if (i)
422         beq     $3, 0, $83
423  # 339                  {
424  # 340                  d<<=i;
425         sll     $16, $16, $3
426  # 341                  h=(h<<i)|(l>>(BN_BITS2-i));
427         sll     $24, $9, $3
428         subu    $25, $4, $3
429         srl     $14, $12, $25
430         or      $9, $24, $14
431  # 342                  l<<=i;
432         sll     $12, $12, $3
433  # 343                  }
434 $83:
435  # 344          dh=(d&BN_MASK2h)>>BN_BITS4;
436  # 345          dl=(d&BN_MASK2l);
437         and     $8, $16, -65536
438         srl     $8, $8, 16
439         and     $10, $16, 65535
440         li      $6, -65536
441 $84:
442  # 346          for (;;)
443  # 347                  {
444  # 348                  if ((h>>BN_BITS4) == dh)
445         srl     $15, $9, 16
446         bne     $8, $15, $85
447  # 349                          q=BN_MASK2l;
448         li      $5, 65535
449         b       $86
450 $85:
451  # 350                  else
452  # 351                          q=h/dh;
453         divu    $5, $9, $8
454 $86:
455  # 352  
456  # 353                  for (;;)
457  # 354                          {
458  # 355                          t=(h-q*dh);
459         mul     $4, $5, $8
460         subu    $2, $9, $4
461         move    $3, $2
462  # 356                          if ((t&BN_MASK2h) ||
463  # 357                                  ((dl*q) <= (
464  # 358                                          (t<<BN_BITS4)+
465  # 359                                          ((l&BN_MASK2h)>>BN_BITS4))))
466         and     $25, $2, $6
467         bne     $25, $0, $87
468         mul     $24, $10, $5
469         sll     $14, $3, 16
470         and     $15, $12, $6
471         srl     $25, $15, 16
472         addu    $15, $14, $25
473         bgtu    $24, $15, $88
474 $87:
475  # 360                                  break;
476         mul     $3, $10, $5
477         b       $89
478 $88:
479  # 361                          q--;
480         addu    $5, $5, -1
481  # 362                          }
482         b       $86
483 $89:
484  # 363                  th=q*dh;
485  # 364                  tl=q*dl;
486  # 365                  t=(tl>>BN_BITS4);
487  # 366                  tl=(tl<<BN_BITS4)&BN_MASK2h;
488         sll     $14, $3, 16
489         and     $2, $14, $6
490         move    $11, $2
491  # 367                  th+=t;
492         srl     $25, $3, 16
493         addu    $7, $4, $25
494  # 368  
495  # 369                  if (l < tl) th++;
496         bgeu    $12, $2, $90
497         addu    $7, $7, 1
498 $90:
499  # 370                  l-=tl;
500         subu    $12, $12, $11
501  # 371                  if (h < th)
502         bgeu    $9, $7, $91
503  # 372                          {
504  # 373                          h+=d;
505         addu    $9, $9, $16
506  # 374                          q--;
507         addu    $5, $5, -1
508  # 375                          }
509 $91:
510  # 376                  h-=th;
511         subu    $9, $9, $7
512  # 377  
513  # 378                  if (--count == 0) break;
514         addu    $13, $13, -1
515         beq     $13, 0, $92
516  # 379  
517  # 380                  ret=q<<BN_BITS4;
518         sll     $31, $5, 16
519  # 381                  h=((h<<BN_BITS4)|(l>>BN_BITS4))&BN_MASK2;
520         sll     $24, $9, 16
521         srl     $15, $12, 16
522         or      $9, $24, $15
523  # 382                  l=(l&BN_MASK2l)<<BN_BITS4;
524         and     $12, $12, 65535
525         sll     $12, $12, 16
526  # 383                  }
527         b       $84
528 $92:
529  # 384          ret|=q;
530         or      $31, $31, $5
531  # 385          return(ret);
532         move    $2, $31
533 $93:
534         lw      $16, 48($sp)
535         lw      $31, 56($sp)
536         addu    $sp, 64
537         j       $31
538         .end    bn_div64
539