~ubuntu-branches/ubuntu/hardy/openssl/hardy-security

« back to all changes in this revision

Viewing changes to crypto/bn/asm/sparcv8.S

  • Committer: Bazaar Package Importer
  • Author(s): Christoph Martin
  • Date: 2004-05-24 17:02:29 UTC
  • Revision ID: james.westby@ubuntu.com-20040524170229-ixlo08bbbly0xied
Tags: upstream-0.9.7d
ImportĀ upstreamĀ versionĀ 0.9.7d

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
.ident  "sparcv8.s, Version 1.4"
 
2
.ident  "SPARC v8 ISA artwork by Andy Polyakov <appro@fy.chalmers.se>"
 
3
 
 
4
/*
 
5
 * ====================================================================
 
6
 * Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
 
7
 * project.
 
8
 *
 
9
 * Rights for redistribution and usage in source and binary forms are
 
10
 * granted according to the OpenSSL license. Warranty of any kind is
 
11
 * disclaimed.
 
12
 * ====================================================================
 
13
 */
 
14
 
 
15
/*
 
16
 * This is my modest contributon to OpenSSL project (see
 
17
 * http://www.openssl.org/ for more information about it) and is
 
18
 * a drop-in SuperSPARC ISA replacement for crypto/bn/bn_asm.c
 
19
 * module. For updates see http://fy.chalmers.se/~appro/hpe/.
 
20
 *
 
21
 * See bn_asm.sparc.v8plus.S for more details.
 
22
 */
 
23
 
 
24
/*
 
25
 * Revision history.
 
26
 *
 
27
 * 1.1  - new loop unrolling model(*);
 
28
 * 1.2  - made gas friendly;
 
29
 * 1.3  - fixed problem with /usr/ccs/lib/cpp;
 
30
 * 1.4  - some retunes;
 
31
 *
 
32
 * (*)  see bn_asm.sparc.v8plus.S for details
 
33
 */
 
34
 
 
35
.section        ".text",#alloc,#execinstr
 
36
.file           "bn_asm.sparc.v8.S"
 
37
 
 
38
.align  32
 
39
 
 
40
.global bn_mul_add_words
 
41
/*
 
42
 * BN_ULONG bn_mul_add_words(rp,ap,num,w)
 
43
 * BN_ULONG *rp,*ap;
 
44
 * int num;
 
45
 * BN_ULONG w;
 
46
 */
 
47
bn_mul_add_words:
 
48
        cmp     %o2,0
 
49
        bg,a    .L_bn_mul_add_words_proceed
 
50
        ld      [%o1],%g2
 
51
        retl
 
52
        clr     %o0
 
53
 
 
54
.L_bn_mul_add_words_proceed:
 
55
        andcc   %o2,-4,%g0
 
56
        bz      .L_bn_mul_add_words_tail
 
57
        clr     %o5
 
58
 
 
59
.L_bn_mul_add_words_loop:
 
60
        ld      [%o0],%o4
 
61
        ld      [%o1+4],%g3
 
62
        umul    %o3,%g2,%g2
 
63
        rd      %y,%g1
 
64
        addcc   %o4,%o5,%o4
 
65
        addx    %g1,0,%g1
 
66
        addcc   %o4,%g2,%o4
 
67
        st      %o4,[%o0]
 
68
        addx    %g1,0,%o5
 
69
 
 
70
        ld      [%o0+4],%o4
 
71
        ld      [%o1+8],%g2
 
72
        umul    %o3,%g3,%g3
 
73
        dec     4,%o2
 
74
        rd      %y,%g1
 
75
        addcc   %o4,%o5,%o4
 
76
        addx    %g1,0,%g1
 
77
        addcc   %o4,%g3,%o4
 
78
        st      %o4,[%o0+4]
 
79
        addx    %g1,0,%o5
 
80
 
 
81
        ld      [%o0+8],%o4
 
82
        ld      [%o1+12],%g3
 
83
        umul    %o3,%g2,%g2
 
84
        inc     16,%o1
 
85
        rd      %y,%g1
 
86
        addcc   %o4,%o5,%o4
 
87
        addx    %g1,0,%g1
 
88
        addcc   %o4,%g2,%o4
 
89
        st      %o4,[%o0+8]
 
90
        addx    %g1,0,%o5
 
91
 
 
92
        ld      [%o0+12],%o4
 
93
        umul    %o3,%g3,%g3
 
94
        inc     16,%o0
 
95
        rd      %y,%g1
 
96
        addcc   %o4,%o5,%o4
 
97
        addx    %g1,0,%g1
 
98
        addcc   %o4,%g3,%o4
 
99
        st      %o4,[%o0-4]
 
100
        addx    %g1,0,%o5
 
101
        andcc   %o2,-4,%g0
 
102
        bnz,a   .L_bn_mul_add_words_loop
 
103
        ld      [%o1],%g2
 
104
 
 
105
        tst     %o2
 
106
        bnz,a   .L_bn_mul_add_words_tail
 
107
        ld      [%o1],%g2
 
108
.L_bn_mul_add_words_return:
 
109
        retl
 
110
        mov     %o5,%o0
 
111
        nop
 
112
 
 
113
.L_bn_mul_add_words_tail:
 
114
        ld      [%o0],%o4
 
115
        umul    %o3,%g2,%g2
 
116
        addcc   %o4,%o5,%o4
 
117
        rd      %y,%g1
 
118
        addx    %g1,0,%g1
 
119
        addcc   %o4,%g2,%o4
 
120
        addx    %g1,0,%o5
 
121
        deccc   %o2
 
122
        bz      .L_bn_mul_add_words_return
 
123
        st      %o4,[%o0]
 
124
 
 
125
        ld      [%o1+4],%g2
 
126
        ld      [%o0+4],%o4
 
127
        umul    %o3,%g2,%g2
 
128
        rd      %y,%g1
 
129
        addcc   %o4,%o5,%o4
 
130
        addx    %g1,0,%g1
 
131
        addcc   %o4,%g2,%o4
 
132
        addx    %g1,0,%o5
 
133
        deccc   %o2
 
134
        bz      .L_bn_mul_add_words_return
 
135
        st      %o4,[%o0+4]
 
136
 
 
137
        ld      [%o1+8],%g2
 
138
        ld      [%o0+8],%o4
 
139
        umul    %o3,%g2,%g2
 
140
        rd      %y,%g1
 
141
        addcc   %o4,%o5,%o4
 
142
        addx    %g1,0,%g1
 
143
        addcc   %o4,%g2,%o4
 
144
        st      %o4,[%o0+8]
 
145
        retl
 
146
        addx    %g1,0,%o0
 
147
 
 
148
.type   bn_mul_add_words,#function
 
149
.size   bn_mul_add_words,(.-bn_mul_add_words)
 
150
 
 
151
.align  32
 
152
 
 
153
.global bn_mul_words
 
154
/*
 
155
 * BN_ULONG bn_mul_words(rp,ap,num,w)
 
156
 * BN_ULONG *rp,*ap;
 
157
 * int num;
 
158
 * BN_ULONG w;
 
159
 */
 
160
bn_mul_words:
 
161
        cmp     %o2,0
 
162
        bg,a    .L_bn_mul_words_proceeed
 
163
        ld      [%o1],%g2
 
164
        retl
 
165
        clr     %o0
 
166
 
 
167
.L_bn_mul_words_proceeed:
 
168
        andcc   %o2,-4,%g0
 
169
        bz      .L_bn_mul_words_tail
 
170
        clr     %o5
 
171
 
 
172
.L_bn_mul_words_loop:
 
173
        ld      [%o1+4],%g3
 
174
        umul    %o3,%g2,%g2
 
175
        addcc   %g2,%o5,%g2
 
176
        rd      %y,%g1
 
177
        addx    %g1,0,%o5
 
178
        st      %g2,[%o0]
 
179
 
 
180
        ld      [%o1+8],%g2
 
181
        umul    %o3,%g3,%g3
 
182
        addcc   %g3,%o5,%g3
 
183
        rd      %y,%g1
 
184
        dec     4,%o2
 
185
        addx    %g1,0,%o5
 
186
        st      %g3,[%o0+4]
 
187
 
 
188
        ld      [%o1+12],%g3
 
189
        umul    %o3,%g2,%g2
 
190
        addcc   %g2,%o5,%g2
 
191
        rd      %y,%g1
 
192
        inc     16,%o1
 
193
        st      %g2,[%o0+8]
 
194
        addx    %g1,0,%o5
 
195
 
 
196
        umul    %o3,%g3,%g3
 
197
        addcc   %g3,%o5,%g3
 
198
        rd      %y,%g1
 
199
        inc     16,%o0
 
200
        addx    %g1,0,%o5
 
201
        st      %g3,[%o0-4]
 
202
        andcc   %o2,-4,%g0
 
203
        nop
 
204
        bnz,a   .L_bn_mul_words_loop
 
205
        ld      [%o1],%g2
 
206
 
 
207
        tst     %o2
 
208
        bnz,a   .L_bn_mul_words_tail
 
209
        ld      [%o1],%g2
 
210
.L_bn_mul_words_return:
 
211
        retl
 
212
        mov     %o5,%o0
 
213
        nop
 
214
 
 
215
.L_bn_mul_words_tail:
 
216
        umul    %o3,%g2,%g2
 
217
        addcc   %g2,%o5,%g2
 
218
        rd      %y,%g1
 
219
        addx    %g1,0,%o5
 
220
        deccc   %o2
 
221
        bz      .L_bn_mul_words_return
 
222
        st      %g2,[%o0]
 
223
        nop
 
224
 
 
225
        ld      [%o1+4],%g2
 
226
        umul    %o3,%g2,%g2
 
227
        addcc   %g2,%o5,%g2
 
228
        rd      %y,%g1
 
229
        addx    %g1,0,%o5
 
230
        deccc   %o2
 
231
        bz      .L_bn_mul_words_return
 
232
        st      %g2,[%o0+4]
 
233
 
 
234
        ld      [%o1+8],%g2
 
235
        umul    %o3,%g2,%g2
 
236
        addcc   %g2,%o5,%g2
 
237
        rd      %y,%g1
 
238
        st      %g2,[%o0+8]
 
239
        retl
 
240
        addx    %g1,0,%o0
 
241
 
 
242
.type   bn_mul_words,#function
 
243
.size   bn_mul_words,(.-bn_mul_words)
 
244
 
 
245
.align  32
 
246
.global bn_sqr_words
 
247
/*
 
248
 * void bn_sqr_words(r,a,n)
 
249
 * BN_ULONG *r,*a;
 
250
 * int n;
 
251
 */
 
252
bn_sqr_words:
 
253
        cmp     %o2,0
 
254
        bg,a    .L_bn_sqr_words_proceeed
 
255
        ld      [%o1],%g2
 
256
        retl
 
257
        clr     %o0
 
258
 
 
259
.L_bn_sqr_words_proceeed:
 
260
        andcc   %o2,-4,%g0
 
261
        bz      .L_bn_sqr_words_tail
 
262
        clr     %o5
 
263
 
 
264
.L_bn_sqr_words_loop:
 
265
        ld      [%o1+4],%g3
 
266
        umul    %g2,%g2,%o4
 
267
        st      %o4,[%o0]
 
268
        rd      %y,%o5
 
269
        st      %o5,[%o0+4]
 
270
 
 
271
        ld      [%o1+8],%g2
 
272
        umul    %g3,%g3,%o4
 
273
        dec     4,%o2
 
274
        st      %o4,[%o0+8]
 
275
        rd      %y,%o5
 
276
        st      %o5,[%o0+12]
 
277
        nop
 
278
 
 
279
        ld      [%o1+12],%g3
 
280
        umul    %g2,%g2,%o4
 
281
        st      %o4,[%o0+16]
 
282
        rd      %y,%o5
 
283
        inc     16,%o1
 
284
        st      %o5,[%o0+20]
 
285
 
 
286
        umul    %g3,%g3,%o4
 
287
        inc     32,%o0
 
288
        st      %o4,[%o0-8]
 
289
        rd      %y,%o5
 
290
        st      %o5,[%o0-4]
 
291
        andcc   %o2,-4,%g2
 
292
        bnz,a   .L_bn_sqr_words_loop
 
293
        ld      [%o1],%g2
 
294
 
 
295
        tst     %o2
 
296
        nop
 
297
        bnz,a   .L_bn_sqr_words_tail
 
298
        ld      [%o1],%g2
 
299
.L_bn_sqr_words_return:
 
300
        retl
 
301
        clr     %o0
 
302
 
 
303
.L_bn_sqr_words_tail:
 
304
        umul    %g2,%g2,%o4
 
305
        st      %o4,[%o0]
 
306
        deccc   %o2
 
307
        rd      %y,%o5
 
308
        bz      .L_bn_sqr_words_return
 
309
        st      %o5,[%o0+4]
 
310
 
 
311
        ld      [%o1+4],%g2
 
312
        umul    %g2,%g2,%o4
 
313
        st      %o4,[%o0+8]
 
314
        deccc   %o2
 
315
        rd      %y,%o5
 
316
        nop
 
317
        bz      .L_bn_sqr_words_return
 
318
        st      %o5,[%o0+12]
 
319
 
 
320
        ld      [%o1+8],%g2
 
321
        umul    %g2,%g2,%o4
 
322
        st      %o4,[%o0+16]
 
323
        rd      %y,%o5
 
324
        st      %o5,[%o0+20]
 
325
        retl
 
326
        clr     %o0
 
327
 
 
328
.type   bn_sqr_words,#function
 
329
.size   bn_sqr_words,(.-bn_sqr_words)
 
330
 
 
331
.align  32
 
332
 
 
333
.global bn_div_words
 
334
/*
 
335
 * BN_ULONG bn_div_words(h,l,d)
 
336
 * BN_ULONG h,l,d;
 
337
 */
 
338
bn_div_words:
 
339
        wr      %o0,%y
 
340
        udiv    %o1,%o2,%o0
 
341
        retl
 
342
        nop
 
343
 
 
344
.type   bn_div_words,#function
 
345
.size   bn_div_words,(.-bn_div_words)
 
346
 
 
347
.align  32
 
348
 
 
349
.global bn_add_words
 
350
/*
 
351
 * BN_ULONG bn_add_words(rp,ap,bp,n)
 
352
 * BN_ULONG *rp,*ap,*bp;
 
353
 * int n;
 
354
 */
 
355
bn_add_words:
 
356
        cmp     %o3,0
 
357
        bg,a    .L_bn_add_words_proceed
 
358
        ld      [%o1],%o4
 
359
        retl
 
360
        clr     %o0
 
361
 
 
362
.L_bn_add_words_proceed:
 
363
        andcc   %o3,-4,%g0
 
364
        bz      .L_bn_add_words_tail
 
365
        clr     %g1
 
366
        ba      .L_bn_add_words_warn_loop
 
367
        addcc   %g0,0,%g0       ! clear carry flag
 
368
 
 
369
.L_bn_add_words_loop:
 
370
        ld      [%o1],%o4
 
371
.L_bn_add_words_warn_loop:
 
372
        ld      [%o2],%o5
 
373
        ld      [%o1+4],%g3
 
374
        ld      [%o2+4],%g4
 
375
        dec     4,%o3
 
376
        addxcc  %o5,%o4,%o5
 
377
        st      %o5,[%o0]
 
378
 
 
379
        ld      [%o1+8],%o4
 
380
        ld      [%o2+8],%o5
 
381
        inc     16,%o1
 
382
        addxcc  %g3,%g4,%g3
 
383
        st      %g3,[%o0+4]
 
384
        
 
385
        ld      [%o1-4],%g3
 
386
        ld      [%o2+12],%g4
 
387
        inc     16,%o2
 
388
        addxcc  %o5,%o4,%o5
 
389
        st      %o5,[%o0+8]
 
390
 
 
391
        inc     16,%o0
 
392
        addxcc  %g3,%g4,%g3
 
393
        st      %g3,[%o0-4]
 
394
        addx    %g0,0,%g1
 
395
        andcc   %o3,-4,%g0
 
396
        bnz,a   .L_bn_add_words_loop
 
397
        addcc   %g1,-1,%g0
 
398
 
 
399
        tst     %o3
 
400
        bnz,a   .L_bn_add_words_tail
 
401
        ld      [%o1],%o4
 
402
.L_bn_add_words_return:
 
403
        retl
 
404
        mov     %g1,%o0
 
405
 
 
406
.L_bn_add_words_tail:
 
407
        addcc   %g1,-1,%g0
 
408
        ld      [%o2],%o5
 
409
        addxcc  %o5,%o4,%o5
 
410
        addx    %g0,0,%g1
 
411
        deccc   %o3
 
412
        bz      .L_bn_add_words_return
 
413
        st      %o5,[%o0]
 
414
 
 
415
        ld      [%o1+4],%o4
 
416
        addcc   %g1,-1,%g0
 
417
        ld      [%o2+4],%o5
 
418
        addxcc  %o5,%o4,%o5
 
419
        addx    %g0,0,%g1
 
420
        deccc   %o3
 
421
        bz      .L_bn_add_words_return
 
422
        st      %o5,[%o0+4]
 
423
 
 
424
        ld      [%o1+8],%o4
 
425
        addcc   %g1,-1,%g0
 
426
        ld      [%o2+8],%o5
 
427
        addxcc  %o5,%o4,%o5
 
428
        st      %o5,[%o0+8]
 
429
        retl
 
430
        addx    %g0,0,%o0
 
431
 
 
432
.type   bn_add_words,#function
 
433
.size   bn_add_words,(.-bn_add_words)
 
434
 
 
435
.align  32
 
436
 
 
437
.global bn_sub_words
 
438
/*
 
439
 * BN_ULONG bn_sub_words(rp,ap,bp,n)
 
440
 * BN_ULONG *rp,*ap,*bp;
 
441
 * int n;
 
442
 */
 
443
bn_sub_words:
 
444
        cmp     %o3,0
 
445
        bg,a    .L_bn_sub_words_proceed
 
446
        ld      [%o1],%o4
 
447
        retl
 
448
        clr     %o0
 
449
 
 
450
.L_bn_sub_words_proceed:
 
451
        andcc   %o3,-4,%g0
 
452
        bz      .L_bn_sub_words_tail
 
453
        clr     %g1
 
454
        ba      .L_bn_sub_words_warm_loop
 
455
        addcc   %g0,0,%g0       ! clear carry flag
 
456
 
 
457
.L_bn_sub_words_loop:
 
458
        ld      [%o1],%o4
 
459
.L_bn_sub_words_warm_loop:
 
460
        ld      [%o2],%o5
 
461
        ld      [%o1+4],%g3
 
462
        ld      [%o2+4],%g4
 
463
        dec     4,%o3
 
464
        subxcc  %o4,%o5,%o5
 
465
        st      %o5,[%o0]
 
466
 
 
467
        ld      [%o1+8],%o4
 
468
        ld      [%o2+8],%o5
 
469
        inc     16,%o1
 
470
        subxcc  %g3,%g4,%g4
 
471
        st      %g4,[%o0+4]
 
472
        
 
473
        ld      [%o1-4],%g3
 
474
        ld      [%o2+12],%g4
 
475
        inc     16,%o2
 
476
        subxcc  %o4,%o5,%o5
 
477
        st      %o5,[%o0+8]
 
478
 
 
479
        inc     16,%o0
 
480
        subxcc  %g3,%g4,%g4
 
481
        st      %g4,[%o0-4]
 
482
        addx    %g0,0,%g1
 
483
        andcc   %o3,-4,%g0
 
484
        bnz,a   .L_bn_sub_words_loop
 
485
        addcc   %g1,-1,%g0
 
486
 
 
487
        tst     %o3
 
488
        nop
 
489
        bnz,a   .L_bn_sub_words_tail
 
490
        ld      [%o1],%o4
 
491
.L_bn_sub_words_return:
 
492
        retl
 
493
        mov     %g1,%o0
 
494
 
 
495
.L_bn_sub_words_tail:
 
496
        addcc   %g1,-1,%g0
 
497
        ld      [%o2],%o5
 
498
        subxcc  %o4,%o5,%o5
 
499
        addx    %g0,0,%g1
 
500
        deccc   %o3
 
501
        bz      .L_bn_sub_words_return
 
502
        st      %o5,[%o0]
 
503
        nop
 
504
 
 
505
        ld      [%o1+4],%o4
 
506
        addcc   %g1,-1,%g0
 
507
        ld      [%o2+4],%o5
 
508
        subxcc  %o4,%o5,%o5
 
509
        addx    %g0,0,%g1
 
510
        deccc   %o3
 
511
        bz      .L_bn_sub_words_return
 
512
        st      %o5,[%o0+4]
 
513
 
 
514
        ld      [%o1+8],%o4
 
515
        addcc   %g1,-1,%g0
 
516
        ld      [%o2+8],%o5
 
517
        subxcc  %o4,%o5,%o5
 
518
        st      %o5,[%o0+8]
 
519
        retl
 
520
        addx    %g0,0,%o0
 
521
 
 
522
.type   bn_sub_words,#function
 
523
.size   bn_sub_words,(.-bn_sub_words)
 
524
 
 
525
#define FRAME_SIZE      -96
 
526
 
 
527
/*
 
528
 * Here is register usage map for *all* routines below.
 
529
 */
 
530
#define t_1     %o0
 
531
#define t_2     %o1
 
532
#define c_1     %o2
 
533
#define c_2     %o3
 
534
#define c_3     %o4
 
535
 
 
536
#define ap(I)   [%i1+4*I]
 
537
#define bp(I)   [%i2+4*I]
 
538
#define rp(I)   [%i0+4*I]
 
539
 
 
540
#define a_0     %l0
 
541
#define a_1     %l1
 
542
#define a_2     %l2
 
543
#define a_3     %l3
 
544
#define a_4     %l4
 
545
#define a_5     %l5
 
546
#define a_6     %l6
 
547
#define a_7     %l7
 
548
 
 
549
#define b_0     %i3
 
550
#define b_1     %i4
 
551
#define b_2     %i5
 
552
#define b_3     %o5
 
553
#define b_4     %g1
 
554
#define b_5     %g2
 
555
#define b_6     %g3
 
556
#define b_7     %g4
 
557
 
 
558
.align  32
 
559
.global bn_mul_comba8
 
560
/*
 
561
 * void bn_mul_comba8(r,a,b)
 
562
 * BN_ULONG *r,*a,*b;
 
563
 */
 
564
bn_mul_comba8:
 
565
        save    %sp,FRAME_SIZE,%sp
 
566
        ld      ap(0),a_0
 
567
        ld      bp(0),b_0
 
568
        umul    a_0,b_0,c_1     !=!mul_add_c(a[0],b[0],c1,c2,c3);
 
569
        ld      bp(1),b_1
 
570
        rd      %y,c_2
 
571
        st      c_1,rp(0)       !r[0]=c1;
 
572
 
 
573
        umul    a_0,b_1,t_1     !=!mul_add_c(a[0],b[1],c2,c3,c1);
 
574
        ld      ap(1),a_1
 
575
        addcc   c_2,t_1,c_2
 
576
        rd      %y,t_2
 
577
        addxcc  %g0,t_2,c_3     !=
 
578
        addx    %g0,%g0,c_1
 
579
        ld      ap(2),a_2
 
580
        umul    a_1,b_0,t_1     !mul_add_c(a[1],b[0],c2,c3,c1);
 
581
        addcc   c_2,t_1,c_2     !=
 
582
        rd      %y,t_2
 
583
        addxcc  c_3,t_2,c_3
 
584
        st      c_2,rp(1)       !r[1]=c2;
 
585
        addx    c_1,%g0,c_1     !=
 
586
 
 
587
        umul    a_2,b_0,t_1     !mul_add_c(a[2],b[0],c3,c1,c2);
 
588
        addcc   c_3,t_1,c_3
 
589
        rd      %y,t_2
 
590
        addxcc  c_1,t_2,c_1     !=
 
591
        addx    %g0,%g0,c_2
 
592
        ld      bp(2),b_2
 
593
        umul    a_1,b_1,t_1     !mul_add_c(a[1],b[1],c3,c1,c2);
 
594
        addcc   c_3,t_1,c_3     !=
 
595
        rd      %y,t_2
 
596
        addxcc  c_1,t_2,c_1
 
597
        ld      bp(3),b_3
 
598
        addx    c_2,%g0,c_2     !=
 
599
        umul    a_0,b_2,t_1     !mul_add_c(a[0],b[2],c3,c1,c2);
 
600
        addcc   c_3,t_1,c_3
 
601
        rd      %y,t_2
 
602
        addxcc  c_1,t_2,c_1     !=
 
603
        addx    c_2,%g0,c_2
 
604
        st      c_3,rp(2)       !r[2]=c3;
 
605
 
 
606
        umul    a_0,b_3,t_1     !mul_add_c(a[0],b[3],c1,c2,c3);
 
607
        addcc   c_1,t_1,c_1     !=
 
608
        rd      %y,t_2
 
609
        addxcc  c_2,t_2,c_2
 
610
        addx    %g0,%g0,c_3
 
611
        umul    a_1,b_2,t_1     !=!mul_add_c(a[1],b[2],c1,c2,c3);
 
612
        addcc   c_1,t_1,c_1
 
613
        rd      %y,t_2
 
614
        addxcc  c_2,t_2,c_2
 
615
        addx    c_3,%g0,c_3     !=
 
616
        ld      ap(3),a_3
 
617
        umul    a_2,b_1,t_1     !mul_add_c(a[2],b[1],c1,c2,c3);
 
618
        addcc   c_1,t_1,c_1
 
619
        rd      %y,t_2          !=
 
620
        addxcc  c_2,t_2,c_2
 
621
        addx    c_3,%g0,c_3
 
622
        ld      ap(4),a_4
 
623
        umul    a_3,b_0,t_1     !mul_add_c(a[3],b[0],c1,c2,c3);!=
 
624
        addcc   c_1,t_1,c_1
 
625
        rd      %y,t_2
 
626
        addxcc  c_2,t_2,c_2
 
627
        addx    c_3,%g0,c_3     !=
 
628
        st      c_1,rp(3)       !r[3]=c1;
 
629
 
 
630
        umul    a_4,b_0,t_1     !mul_add_c(a[4],b[0],c2,c3,c1);
 
631
        addcc   c_2,t_1,c_2
 
632
        rd      %y,t_2          !=
 
633
        addxcc  c_3,t_2,c_3
 
634
        addx    %g0,%g0,c_1
 
635
        umul    a_3,b_1,t_1     !mul_add_c(a[3],b[1],c2,c3,c1);
 
636
        addcc   c_2,t_1,c_2     !=
 
637
        rd      %y,t_2
 
638
        addxcc  c_3,t_2,c_3
 
639
        addx    c_1,%g0,c_1
 
640
        umul    a_2,b_2,t_1     !=!mul_add_c(a[2],b[2],c2,c3,c1);
 
641
        addcc   c_2,t_1,c_2
 
642
        rd      %y,t_2
 
643
        addxcc  c_3,t_2,c_3
 
644
        addx    c_1,%g0,c_1     !=
 
645
        ld      bp(4),b_4
 
646
        umul    a_1,b_3,t_1     !mul_add_c(a[1],b[3],c2,c3,c1);
 
647
        addcc   c_2,t_1,c_2
 
648
        rd      %y,t_2          !=
 
649
        addxcc  c_3,t_2,c_3
 
650
        addx    c_1,%g0,c_1
 
651
        ld      bp(5),b_5
 
652
        umul    a_0,b_4,t_1     !=!mul_add_c(a[0],b[4],c2,c3,c1);
 
653
        addcc   c_2,t_1,c_2
 
654
        rd      %y,t_2
 
655
        addxcc  c_3,t_2,c_3
 
656
        addx    c_1,%g0,c_1     !=
 
657
        st      c_2,rp(4)       !r[4]=c2;
 
658
 
 
659
        umul    a_0,b_5,t_1     !mul_add_c(a[0],b[5],c3,c1,c2);
 
660
        addcc   c_3,t_1,c_3
 
661
        rd      %y,t_2          !=
 
662
        addxcc  c_1,t_2,c_1
 
663
        addx    %g0,%g0,c_2
 
664
        umul    a_1,b_4,t_1     !mul_add_c(a[1],b[4],c3,c1,c2);
 
665
        addcc   c_3,t_1,c_3     !=
 
666
        rd      %y,t_2
 
667
        addxcc  c_1,t_2,c_1
 
668
        addx    c_2,%g0,c_2
 
669
        umul    a_2,b_3,t_1     !=!mul_add_c(a[2],b[3],c3,c1,c2);
 
670
        addcc   c_3,t_1,c_3
 
671
        rd      %y,t_2
 
672
        addxcc  c_1,t_2,c_1
 
673
        addx    c_2,%g0,c_2     !=
 
674
        umul    a_3,b_2,t_1     !mul_add_c(a[3],b[2],c3,c1,c2);
 
675
        addcc   c_3,t_1,c_3
 
676
        rd      %y,t_2
 
677
        addxcc  c_1,t_2,c_1     !=
 
678
        addx    c_2,%g0,c_2
 
679
        ld      ap(5),a_5
 
680
        umul    a_4,b_1,t_1     !mul_add_c(a[4],b[1],c3,c1,c2);
 
681
        addcc   c_3,t_1,c_3     !=
 
682
        rd      %y,t_2
 
683
        addxcc  c_1,t_2,c_1
 
684
        ld      ap(6),a_6
 
685
        addx    c_2,%g0,c_2     !=
 
686
        umul    a_5,b_0,t_1     !mul_add_c(a[5],b[0],c3,c1,c2);
 
687
        addcc   c_3,t_1,c_3
 
688
        rd      %y,t_2
 
689
        addxcc  c_1,t_2,c_1     !=
 
690
        addx    c_2,%g0,c_2
 
691
        st      c_3,rp(5)       !r[5]=c3;
 
692
 
 
693
        umul    a_6,b_0,t_1     !mul_add_c(a[6],b[0],c1,c2,c3);
 
694
        addcc   c_1,t_1,c_1     !=
 
695
        rd      %y,t_2
 
696
        addxcc  c_2,t_2,c_2
 
697
        addx    %g0,%g0,c_3
 
698
        umul    a_5,b_1,t_1     !=!mul_add_c(a[5],b[1],c1,c2,c3);
 
699
        addcc   c_1,t_1,c_1
 
700
        rd      %y,t_2
 
701
        addxcc  c_2,t_2,c_2
 
702
        addx    c_3,%g0,c_3     !=
 
703
        umul    a_4,b_2,t_1     !mul_add_c(a[4],b[2],c1,c2,c3);
 
704
        addcc   c_1,t_1,c_1
 
705
        rd      %y,t_2
 
706
        addxcc  c_2,t_2,c_2     !=
 
707
        addx    c_3,%g0,c_3
 
708
        umul    a_3,b_3,t_1     !mul_add_c(a[3],b[3],c1,c2,c3);
 
709
        addcc   c_1,t_1,c_1
 
710
        rd      %y,t_2          !=
 
711
        addxcc  c_2,t_2,c_2
 
712
        addx    c_3,%g0,c_3
 
713
        umul    a_2,b_4,t_1     !mul_add_c(a[2],b[4],c1,c2,c3);
 
714
        addcc   c_1,t_1,c_1     !=
 
715
        rd      %y,t_2
 
716
        addxcc  c_2,t_2,c_2
 
717
        ld      bp(6),b_6
 
718
        addx    c_3,%g0,c_3     !=
 
719
        umul    a_1,b_5,t_1     !mul_add_c(a[1],b[5],c1,c2,c3);
 
720
        addcc   c_1,t_1,c_1
 
721
        rd      %y,t_2
 
722
        addxcc  c_2,t_2,c_2     !=
 
723
        addx    c_3,%g0,c_3
 
724
        ld      bp(7),b_7
 
725
        umul    a_0,b_6,t_1     !mul_add_c(a[0],b[6],c1,c2,c3);
 
726
        addcc   c_1,t_1,c_1     !=
 
727
        rd      %y,t_2
 
728
        addxcc  c_2,t_2,c_2
 
729
        st      c_1,rp(6)       !r[6]=c1;
 
730
        addx    c_3,%g0,c_3     !=
 
731
 
 
732
        umul    a_0,b_7,t_1     !mul_add_c(a[0],b[7],c2,c3,c1);
 
733
        addcc   c_2,t_1,c_2
 
734
        rd      %y,t_2
 
735
        addxcc  c_3,t_2,c_3     !=
 
736
        addx    %g0,%g0,c_1
 
737
        umul    a_1,b_6,t_1     !mul_add_c(a[1],b[6],c2,c3,c1);
 
738
        addcc   c_2,t_1,c_2
 
739
        rd      %y,t_2          !=
 
740
        addxcc  c_3,t_2,c_3
 
741
        addx    c_1,%g0,c_1
 
742
        umul    a_2,b_5,t_1     !mul_add_c(a[2],b[5],c2,c3,c1);
 
743
        addcc   c_2,t_1,c_2     !=
 
744
        rd      %y,t_2
 
745
        addxcc  c_3,t_2,c_3
 
746
        addx    c_1,%g0,c_1
 
747
        umul    a_3,b_4,t_1     !=!mul_add_c(a[3],b[4],c2,c3,c1);
 
748
        addcc   c_2,t_1,c_2
 
749
        rd      %y,t_2
 
750
        addxcc  c_3,t_2,c_3
 
751
        addx    c_1,%g0,c_1     !=
 
752
        umul    a_4,b_3,t_1     !mul_add_c(a[4],b[3],c2,c3,c1);
 
753
        addcc   c_2,t_1,c_2
 
754
        rd      %y,t_2
 
755
        addxcc  c_3,t_2,c_3     !=
 
756
        addx    c_1,%g0,c_1
 
757
        umul    a_5,b_2,t_1     !mul_add_c(a[5],b[2],c2,c3,c1);
 
758
        addcc   c_2,t_1,c_2
 
759
        rd      %y,t_2          !=
 
760
        addxcc  c_3,t_2,c_3
 
761
        addx    c_1,%g0,c_1
 
762
        ld      ap(7),a_7
 
763
        umul    a_6,b_1,t_1     !=!mul_add_c(a[6],b[1],c2,c3,c1);
 
764
        addcc   c_2,t_1,c_2
 
765
        rd      %y,t_2
 
766
        addxcc  c_3,t_2,c_3
 
767
        addx    c_1,%g0,c_1     !=
 
768
        umul    a_7,b_0,t_1     !mul_add_c(a[7],b[0],c2,c3,c1);
 
769
        addcc   c_2,t_1,c_2
 
770
        rd      %y,t_2
 
771
        addxcc  c_3,t_2,c_3     !=
 
772
        addx    c_1,%g0,c_1
 
773
        st      c_2,rp(7)       !r[7]=c2;
 
774
 
 
775
        umul    a_7,b_1,t_1     !mul_add_c(a[7],b[1],c3,c1,c2);
 
776
        addcc   c_3,t_1,c_3     !=
 
777
        rd      %y,t_2
 
778
        addxcc  c_1,t_2,c_1
 
779
        addx    %g0,%g0,c_2
 
780
        umul    a_6,b_2,t_1     !=!mul_add_c(a[6],b[2],c3,c1,c2);
 
781
        addcc   c_3,t_1,c_3
 
782
        rd      %y,t_2
 
783
        addxcc  c_1,t_2,c_1
 
784
        addx    c_2,%g0,c_2     !=
 
785
        umul    a_5,b_3,t_1     !mul_add_c(a[5],b[3],c3,c1,c2);
 
786
        addcc   c_3,t_1,c_3
 
787
        rd      %y,t_2
 
788
        addxcc  c_1,t_2,c_1     !=
 
789
        addx    c_2,%g0,c_2
 
790
        umul    a_4,b_4,t_1     !mul_add_c(a[4],b[4],c3,c1,c2);
 
791
        addcc   c_3,t_1,c_3
 
792
        rd      %y,t_2          !=
 
793
        addxcc  c_1,t_2,c_1
 
794
        addx    c_2,%g0,c_2
 
795
        umul    a_3,b_5,t_1     !mul_add_c(a[3],b[5],c3,c1,c2);
 
796
        addcc   c_3,t_1,c_3     !=
 
797
        rd      %y,t_2
 
798
        addxcc  c_1,t_2,c_1
 
799
        addx    c_2,%g0,c_2
 
800
        umul    a_2,b_6,t_1     !=!mul_add_c(a[2],b[6],c3,c1,c2);
 
801
        addcc   c_3,t_1,c_3
 
802
        rd      %y,t_2
 
803
        addxcc  c_1,t_2,c_1
 
804
        addx    c_2,%g0,c_2     !=
 
805
        umul    a_1,b_7,t_1     !mul_add_c(a[1],b[7],c3,c1,c2);
 
806
        addcc   c_3,t_1,c_3
 
807
        rd      %y,t_2
 
808
        addxcc  c_1,t_2,c_1     !
 
809
        addx    c_2,%g0,c_2
 
810
        st      c_3,rp(8)       !r[8]=c3;
 
811
 
 
812
        umul    a_2,b_7,t_1     !mul_add_c(a[2],b[7],c1,c2,c3);
 
813
        addcc   c_1,t_1,c_1     !=
 
814
        rd      %y,t_2
 
815
        addxcc  c_2,t_2,c_2
 
816
        addx    %g0,%g0,c_3
 
817
        umul    a_3,b_6,t_1     !=!mul_add_c(a[3],b[6],c1,c2,c3);
 
818
        addcc   c_1,t_1,c_1
 
819
        rd      %y,t_2
 
820
        addxcc  c_2,t_2,c_2
 
821
        addx    c_3,%g0,c_3     !=
 
822
        umul    a_4,b_5,t_1     !mul_add_c(a[4],b[5],c1,c2,c3);
 
823
        addcc   c_1,t_1,c_1
 
824
        rd      %y,t_2
 
825
        addxcc  c_2,t_2,c_2     !=
 
826
        addx    c_3,%g0,c_3
 
827
        umul    a_5,b_4,t_1     !mul_add_c(a[5],b[4],c1,c2,c3);
 
828
        addcc   c_1,t_1,c_1
 
829
        rd      %y,t_2          !=
 
830
        addxcc  c_2,t_2,c_2
 
831
        addx    c_3,%g0,c_3
 
832
        umul    a_6,b_3,t_1     !mul_add_c(a[6],b[3],c1,c2,c3);
 
833
        addcc   c_1,t_1,c_1     !=
 
834
        rd      %y,t_2
 
835
        addxcc  c_2,t_2,c_2
 
836
        addx    c_3,%g0,c_3
 
837
        umul    a_7,b_2,t_1     !=!mul_add_c(a[7],b[2],c1,c2,c3);
 
838
        addcc   c_1,t_1,c_1
 
839
        rd      %y,t_2
 
840
        addxcc  c_2,t_2,c_2
 
841
        addx    c_3,%g0,c_3     !=
 
842
        st      c_1,rp(9)       !r[9]=c1;
 
843
 
 
844
        umul    a_7,b_3,t_1     !mul_add_c(a[7],b[3],c2,c3,c1);
 
845
        addcc   c_2,t_1,c_2
 
846
        rd      %y,t_2          !=
 
847
        addxcc  c_3,t_2,c_3
 
848
        addx    %g0,%g0,c_1
 
849
        umul    a_6,b_4,t_1     !mul_add_c(a[6],b[4],c2,c3,c1);
 
850
        addcc   c_2,t_1,c_2     !=
 
851
        rd      %y,t_2
 
852
        addxcc  c_3,t_2,c_3
 
853
        addx    c_1,%g0,c_1
 
854
        umul    a_5,b_5,t_1     !=!mul_add_c(a[5],b[5],c2,c3,c1);
 
855
        addcc   c_2,t_1,c_2
 
856
        rd      %y,t_2
 
857
        addxcc  c_3,t_2,c_3
 
858
        addx    c_1,%g0,c_1     !=
 
859
        umul    a_4,b_6,t_1     !mul_add_c(a[4],b[6],c2,c3,c1);
 
860
        addcc   c_2,t_1,c_2
 
861
        rd      %y,t_2
 
862
        addxcc  c_3,t_2,c_3     !=
 
863
        addx    c_1,%g0,c_1
 
864
        umul    a_3,b_7,t_1     !mul_add_c(a[3],b[7],c2,c3,c1);
 
865
        addcc   c_2,t_1,c_2
 
866
        rd      %y,t_2          !=
 
867
        addxcc  c_3,t_2,c_3
 
868
        addx    c_1,%g0,c_1
 
869
        st      c_2,rp(10)      !r[10]=c2;
 
870
 
 
871
        umul    a_4,b_7,t_1     !=!mul_add_c(a[4],b[7],c3,c1,c2);
 
872
        addcc   c_3,t_1,c_3
 
873
        rd      %y,t_2
 
874
        addxcc  c_1,t_2,c_1
 
875
        addx    %g0,%g0,c_2     !=
 
876
        umul    a_5,b_6,t_1     !mul_add_c(a[5],b[6],c3,c1,c2);
 
877
        addcc   c_3,t_1,c_3
 
878
        rd      %y,t_2
 
879
        addxcc  c_1,t_2,c_1     !=
 
880
        addx    c_2,%g0,c_2
 
881
        umul    a_6,b_5,t_1     !mul_add_c(a[6],b[5],c3,c1,c2);
 
882
        addcc   c_3,t_1,c_3
 
883
        rd      %y,t_2          !=
 
884
        addxcc  c_1,t_2,c_1
 
885
        addx    c_2,%g0,c_2
 
886
        umul    a_7,b_4,t_1     !mul_add_c(a[7],b[4],c3,c1,c2);
 
887
        addcc   c_3,t_1,c_3     !=
 
888
        rd      %y,t_2
 
889
        addxcc  c_1,t_2,c_1
 
890
        st      c_3,rp(11)      !r[11]=c3;
 
891
        addx    c_2,%g0,c_2     !=
 
892
 
 
893
        umul    a_7,b_5,t_1     !mul_add_c(a[7],b[5],c1,c2,c3);
 
894
        addcc   c_1,t_1,c_1
 
895
        rd      %y,t_2
 
896
        addxcc  c_2,t_2,c_2     !=
 
897
        addx    %g0,%g0,c_3
 
898
        umul    a_6,b_6,t_1     !mul_add_c(a[6],b[6],c1,c2,c3);
 
899
        addcc   c_1,t_1,c_1
 
900
        rd      %y,t_2          !=
 
901
        addxcc  c_2,t_2,c_2
 
902
        addx    c_3,%g0,c_3
 
903
        umul    a_5,b_7,t_1     !mul_add_c(a[5],b[7],c1,c2,c3);
 
904
        addcc   c_1,t_1,c_1     !=
 
905
        rd      %y,t_2
 
906
        addxcc  c_2,t_2,c_2
 
907
        st      c_1,rp(12)      !r[12]=c1;
 
908
        addx    c_3,%g0,c_3     !=
 
909
 
 
910
        umul    a_6,b_7,t_1     !mul_add_c(a[6],b[7],c2,c3,c1);
 
911
        addcc   c_2,t_1,c_2
 
912
        rd      %y,t_2
 
913
        addxcc  c_3,t_2,c_3     !=
 
914
        addx    %g0,%g0,c_1
 
915
        umul    a_7,b_6,t_1     !mul_add_c(a[7],b[6],c2,c3,c1);
 
916
        addcc   c_2,t_1,c_2
 
917
        rd      %y,t_2          !=
 
918
        addxcc  c_3,t_2,c_3
 
919
        addx    c_1,%g0,c_1
 
920
        st      c_2,rp(13)      !r[13]=c2;
 
921
 
 
922
        umul    a_7,b_7,t_1     !=!mul_add_c(a[7],b[7],c3,c1,c2);
 
923
        addcc   c_3,t_1,c_3
 
924
        rd      %y,t_2
 
925
        addxcc  c_1,t_2,c_1
 
926
        nop                     !=
 
927
        st      c_3,rp(14)      !r[14]=c3;
 
928
        st      c_1,rp(15)      !r[15]=c1;
 
929
 
 
930
        ret
 
931
        restore %g0,%g0,%o0
 
932
 
 
933
.type   bn_mul_comba8,#function
 
934
.size   bn_mul_comba8,(.-bn_mul_comba8)
 
935
 
 
936
.align  32
 
937
 
 
938
.global bn_mul_comba4
 
939
/*
 
940
 * void bn_mul_comba4(r,a,b)
 
941
 * BN_ULONG *r,*a,*b;
 
942
 */
 
943
bn_mul_comba4:
 
944
        save    %sp,FRAME_SIZE,%sp
 
945
        ld      ap(0),a_0
 
946
        ld      bp(0),b_0
 
947
        umul    a_0,b_0,c_1     !=!mul_add_c(a[0],b[0],c1,c2,c3);
 
948
        ld      bp(1),b_1
 
949
        rd      %y,c_2
 
950
        st      c_1,rp(0)       !r[0]=c1;
 
951
 
 
952
        umul    a_0,b_1,t_1     !=!mul_add_c(a[0],b[1],c2,c3,c1);
 
953
        ld      ap(1),a_1
 
954
        addcc   c_2,t_1,c_2
 
955
        rd      %y,t_2          !=
 
956
        addxcc  %g0,t_2,c_3
 
957
        addx    %g0,%g0,c_1
 
958
        ld      ap(2),a_2
 
959
        umul    a_1,b_0,t_1     !=!mul_add_c(a[1],b[0],c2,c3,c1);
 
960
        addcc   c_2,t_1,c_2
 
961
        rd      %y,t_2
 
962
        addxcc  c_3,t_2,c_3
 
963
        addx    c_1,%g0,c_1     !=
 
964
        st      c_2,rp(1)       !r[1]=c2;
 
965
 
 
966
        umul    a_2,b_0,t_1     !mul_add_c(a[2],b[0],c3,c1,c2);
 
967
        addcc   c_3,t_1,c_3
 
968
        rd      %y,t_2          !=
 
969
        addxcc  c_1,t_2,c_1
 
970
        addx    %g0,%g0,c_2
 
971
        ld      bp(2),b_2
 
972
        umul    a_1,b_1,t_1     !=!mul_add_c(a[1],b[1],c3,c1,c2);
 
973
        addcc   c_3,t_1,c_3
 
974
        rd      %y,t_2
 
975
        addxcc  c_1,t_2,c_1
 
976
        addx    c_2,%g0,c_2     !=
 
977
        ld      bp(3),b_3
 
978
        umul    a_0,b_2,t_1     !mul_add_c(a[0],b[2],c3,c1,c2);
 
979
        addcc   c_3,t_1,c_3
 
980
        rd      %y,t_2          !=
 
981
        addxcc  c_1,t_2,c_1
 
982
        addx    c_2,%g0,c_2
 
983
        st      c_3,rp(2)       !r[2]=c3;
 
984
 
 
985
        umul    a_0,b_3,t_1     !=!mul_add_c(a[0],b[3],c1,c2,c3);
 
986
        addcc   c_1,t_1,c_1
 
987
        rd      %y,t_2
 
988
        addxcc  c_2,t_2,c_2
 
989
        addx    %g0,%g0,c_3     !=
 
990
        umul    a_1,b_2,t_1     !mul_add_c(a[1],b[2],c1,c2,c3);
 
991
        addcc   c_1,t_1,c_1
 
992
        rd      %y,t_2
 
993
        addxcc  c_2,t_2,c_2     !=
 
994
        addx    c_3,%g0,c_3
 
995
        ld      ap(3),a_3
 
996
        umul    a_2,b_1,t_1     !mul_add_c(a[2],b[1],c1,c2,c3);
 
997
        addcc   c_1,t_1,c_1     !=
 
998
        rd      %y,t_2
 
999
        addxcc  c_2,t_2,c_2
 
1000
        addx    c_3,%g0,c_3
 
1001
        umul    a_3,b_0,t_1     !=!mul_add_c(a[3],b[0],c1,c2,c3);
 
1002
        addcc   c_1,t_1,c_1
 
1003
        rd      %y,t_2
 
1004
        addxcc  c_2,t_2,c_2
 
1005
        addx    c_3,%g0,c_3     !=
 
1006
        st      c_1,rp(3)       !r[3]=c1;
 
1007
 
 
1008
        umul    a_3,b_1,t_1     !mul_add_c(a[3],b[1],c2,c3,c1);
 
1009
        addcc   c_2,t_1,c_2
 
1010
        rd      %y,t_2          !=
 
1011
        addxcc  c_3,t_2,c_3
 
1012
        addx    %g0,%g0,c_1
 
1013
        umul    a_2,b_2,t_1     !mul_add_c(a[2],b[2],c2,c3,c1);
 
1014
        addcc   c_2,t_1,c_2     !=
 
1015
        rd      %y,t_2
 
1016
        addxcc  c_3,t_2,c_3
 
1017
        addx    c_1,%g0,c_1
 
1018
        umul    a_1,b_3,t_1     !=!mul_add_c(a[1],b[3],c2,c3,c1);
 
1019
        addcc   c_2,t_1,c_2
 
1020
        rd      %y,t_2
 
1021
        addxcc  c_3,t_2,c_3
 
1022
        addx    c_1,%g0,c_1     !=
 
1023
        st      c_2,rp(4)       !r[4]=c2;
 
1024
 
 
1025
        umul    a_2,b_3,t_1     !mul_add_c(a[2],b[3],c3,c1,c2);
 
1026
        addcc   c_3,t_1,c_3
 
1027
        rd      %y,t_2          !=
 
1028
        addxcc  c_1,t_2,c_1
 
1029
        addx    %g0,%g0,c_2
 
1030
        umul    a_3,b_2,t_1     !mul_add_c(a[3],b[2],c3,c1,c2);
 
1031
        addcc   c_3,t_1,c_3     !=
 
1032
        rd      %y,t_2
 
1033
        addxcc  c_1,t_2,c_1
 
1034
        st      c_3,rp(5)       !r[5]=c3;
 
1035
        addx    c_2,%g0,c_2     !=
 
1036
 
 
1037
        umul    a_3,b_3,t_1     !mul_add_c(a[3],b[3],c1,c2,c3);
 
1038
        addcc   c_1,t_1,c_1
 
1039
        rd      %y,t_2
 
1040
        addxcc  c_2,t_2,c_2     !=
 
1041
        st      c_1,rp(6)       !r[6]=c1;
 
1042
        st      c_2,rp(7)       !r[7]=c2;
 
1043
        
 
1044
        ret
 
1045
        restore %g0,%g0,%o0
 
1046
 
 
1047
.type   bn_mul_comba4,#function
 
1048
.size   bn_mul_comba4,(.-bn_mul_comba4)
 
1049
 
 
1050
.align  32
 
1051
 
 
1052
.global bn_sqr_comba8
 
1053
bn_sqr_comba8:
 
1054
        save    %sp,FRAME_SIZE,%sp
 
1055
        ld      ap(0),a_0
 
1056
        ld      ap(1),a_1
 
1057
        umul    a_0,a_0,c_1     !=!sqr_add_c(a,0,c1,c2,c3);
 
1058
        rd      %y,c_2
 
1059
        st      c_1,rp(0)       !r[0]=c1;
 
1060
 
 
1061
        ld      ap(2),a_2
 
1062
        umul    a_0,a_1,t_1     !=!sqr_add_c2(a,1,0,c2,c3,c1);
 
1063
        addcc   c_2,t_1,c_2
 
1064
        rd      %y,t_2
 
1065
        addxcc  %g0,t_2,c_3
 
1066
        addx    %g0,%g0,c_1     !=
 
1067
        addcc   c_2,t_1,c_2
 
1068
        addxcc  c_3,t_2,c_3
 
1069
        st      c_2,rp(1)       !r[1]=c2;
 
1070
        addx    c_1,%g0,c_1     !=
 
1071
 
 
1072
        umul    a_2,a_0,t_1     !sqr_add_c2(a,2,0,c3,c1,c2);
 
1073
        addcc   c_3,t_1,c_3
 
1074
        rd      %y,t_2
 
1075
        addxcc  c_1,t_2,c_1     !=
 
1076
        addx    %g0,%g0,c_2
 
1077
        addcc   c_3,t_1,c_3
 
1078
        addxcc  c_1,t_2,c_1
 
1079
        addx    c_2,%g0,c_2     !=
 
1080
        ld      ap(3),a_3
 
1081
        umul    a_1,a_1,t_1     !sqr_add_c(a,1,c3,c1,c2);
 
1082
        addcc   c_3,t_1,c_3
 
1083
        rd      %y,t_2          !=
 
1084
        addxcc  c_1,t_2,c_1
 
1085
        addx    c_2,%g0,c_2
 
1086
        st      c_3,rp(2)       !r[2]=c3;
 
1087
 
 
1088
        umul    a_0,a_3,t_1     !=!sqr_add_c2(a,3,0,c1,c2,c3);
 
1089
        addcc   c_1,t_1,c_1
 
1090
        rd      %y,t_2
 
1091
        addxcc  c_2,t_2,c_2
 
1092
        addx    %g0,%g0,c_3     !=
 
1093
        addcc   c_1,t_1,c_1
 
1094
        addxcc  c_2,t_2,c_2
 
1095
        ld      ap(4),a_4
 
1096
        addx    c_3,%g0,c_3     !=
 
1097
        umul    a_1,a_2,t_1     !sqr_add_c2(a,2,1,c1,c2,c3);
 
1098
        addcc   c_1,t_1,c_1
 
1099
        rd      %y,t_2
 
1100
        addxcc  c_2,t_2,c_2     !=
 
1101
        addx    c_3,%g0,c_3
 
1102
        addcc   c_1,t_1,c_1
 
1103
        addxcc  c_2,t_2,c_2
 
1104
        addx    c_3,%g0,c_3     !=
 
1105
        st      c_1,rp(3)       !r[3]=c1;
 
1106
 
 
1107
        umul    a_4,a_0,t_1     !sqr_add_c2(a,4,0,c2,c3,c1);
 
1108
        addcc   c_2,t_1,c_2
 
1109
        rd      %y,t_2          !=
 
1110
        addxcc  c_3,t_2,c_3
 
1111
        addx    %g0,%g0,c_1
 
1112
        addcc   c_2,t_1,c_2
 
1113
        addxcc  c_3,t_2,c_3     !=
 
1114
        addx    c_1,%g0,c_1
 
1115
        umul    a_3,a_1,t_1     !sqr_add_c2(a,3,1,c2,c3,c1);
 
1116
        addcc   c_2,t_1,c_2
 
1117
        rd      %y,t_2          !=
 
1118
        addxcc  c_3,t_2,c_3
 
1119
        addx    c_1,%g0,c_1
 
1120
        addcc   c_2,t_1,c_2
 
1121
        addxcc  c_3,t_2,c_3     !=
 
1122
        addx    c_1,%g0,c_1
 
1123
        ld      ap(5),a_5
 
1124
        umul    a_2,a_2,t_1     !sqr_add_c(a,2,c2,c3,c1);
 
1125
        addcc   c_2,t_1,c_2     !=
 
1126
        rd      %y,t_2
 
1127
        addxcc  c_3,t_2,c_3
 
1128
        st      c_2,rp(4)       !r[4]=c2;
 
1129
        addx    c_1,%g0,c_1     !=
 
1130
 
 
1131
        umul    a_0,a_5,t_1     !sqr_add_c2(a,5,0,c3,c1,c2);
 
1132
        addcc   c_3,t_1,c_3
 
1133
        rd      %y,t_2
 
1134
        addxcc  c_1,t_2,c_1     !=
 
1135
        addx    %g0,%g0,c_2
 
1136
        addcc   c_3,t_1,c_3
 
1137
        addxcc  c_1,t_2,c_1
 
1138
        addx    c_2,%g0,c_2     !=
 
1139
        umul    a_1,a_4,t_1     !sqr_add_c2(a,4,1,c3,c1,c2);
 
1140
        addcc   c_3,t_1,c_3
 
1141
        rd      %y,t_2
 
1142
        addxcc  c_1,t_2,c_1     !=
 
1143
        addx    c_2,%g0,c_2
 
1144
        addcc   c_3,t_1,c_3
 
1145
        addxcc  c_1,t_2,c_1
 
1146
        addx    c_2,%g0,c_2     !=
 
1147
        ld      ap(6),a_6
 
1148
        umul    a_2,a_3,t_1     !sqr_add_c2(a,3,2,c3,c1,c2);
 
1149
        addcc   c_3,t_1,c_3
 
1150
        rd      %y,t_2          !=
 
1151
        addxcc  c_1,t_2,c_1
 
1152
        addx    c_2,%g0,c_2
 
1153
        addcc   c_3,t_1,c_3
 
1154
        addxcc  c_1,t_2,c_1     !=
 
1155
        addx    c_2,%g0,c_2
 
1156
        st      c_3,rp(5)       !r[5]=c3;
 
1157
 
 
1158
        umul    a_6,a_0,t_1     !sqr_add_c2(a,6,0,c1,c2,c3);
 
1159
        addcc   c_1,t_1,c_1     !=
 
1160
        rd      %y,t_2
 
1161
        addxcc  c_2,t_2,c_2
 
1162
        addx    %g0,%g0,c_3
 
1163
        addcc   c_1,t_1,c_1     !=
 
1164
        addxcc  c_2,t_2,c_2
 
1165
        addx    c_3,%g0,c_3
 
1166
        umul    a_5,a_1,t_1     !sqr_add_c2(a,5,1,c1,c2,c3);
 
1167
        addcc   c_1,t_1,c_1     !=
 
1168
        rd      %y,t_2
 
1169
        addxcc  c_2,t_2,c_2
 
1170
        addx    c_3,%g0,c_3
 
1171
        addcc   c_1,t_1,c_1     !=
 
1172
        addxcc  c_2,t_2,c_2
 
1173
        addx    c_3,%g0,c_3
 
1174
        umul    a_4,a_2,t_1     !sqr_add_c2(a,4,2,c1,c2,c3);
 
1175
        addcc   c_1,t_1,c_1     !=
 
1176
        rd      %y,t_2
 
1177
        addxcc  c_2,t_2,c_2
 
1178
        addx    c_3,%g0,c_3
 
1179
        addcc   c_1,t_1,c_1     !=
 
1180
        addxcc  c_2,t_2,c_2
 
1181
        addx    c_3,%g0,c_3
 
1182
        ld      ap(7),a_7
 
1183
        umul    a_3,a_3,t_1     !=!sqr_add_c(a,3,c1,c2,c3);
 
1184
        addcc   c_1,t_1,c_1
 
1185
        rd      %y,t_2
 
1186
        addxcc  c_2,t_2,c_2
 
1187
        addx    c_3,%g0,c_3     !=
 
1188
        st      c_1,rp(6)       !r[6]=c1;
 
1189
 
 
1190
        umul    a_0,a_7,t_1     !sqr_add_c2(a,7,0,c2,c3,c1);
 
1191
        addcc   c_2,t_1,c_2
 
1192
        rd      %y,t_2          !=
 
1193
        addxcc  c_3,t_2,c_3
 
1194
        addx    %g0,%g0,c_1
 
1195
        addcc   c_2,t_1,c_2
 
1196
        addxcc  c_3,t_2,c_3     !=
 
1197
        addx    c_1,%g0,c_1
 
1198
        umul    a_1,a_6,t_1     !sqr_add_c2(a,6,1,c2,c3,c1);
 
1199
        addcc   c_2,t_1,c_2
 
1200
        rd      %y,t_2          !=
 
1201
        addxcc  c_3,t_2,c_3
 
1202
        addx    c_1,%g0,c_1
 
1203
        addcc   c_2,t_1,c_2
 
1204
        addxcc  c_3,t_2,c_3     !=
 
1205
        addx    c_1,%g0,c_1
 
1206
        umul    a_2,a_5,t_1     !sqr_add_c2(a,5,2,c2,c3,c1);
 
1207
        addcc   c_2,t_1,c_2
 
1208
        rd      %y,t_2          !=
 
1209
        addxcc  c_3,t_2,c_3
 
1210
        addx    c_1,%g0,c_1
 
1211
        addcc   c_2,t_1,c_2
 
1212
        addxcc  c_3,t_2,c_3     !=
 
1213
        addx    c_1,%g0,c_1
 
1214
        umul    a_3,a_4,t_1     !sqr_add_c2(a,4,3,c2,c3,c1);
 
1215
        addcc   c_2,t_1,c_2
 
1216
        rd      %y,t_2          !=
 
1217
        addxcc  c_3,t_2,c_3
 
1218
        addx    c_1,%g0,c_1
 
1219
        addcc   c_2,t_1,c_2
 
1220
        addxcc  c_3,t_2,c_3     !=
 
1221
        addx    c_1,%g0,c_1
 
1222
        st      c_2,rp(7)       !r[7]=c2;
 
1223
 
 
1224
        umul    a_7,a_1,t_1     !sqr_add_c2(a,7,1,c3,c1,c2);
 
1225
        addcc   c_3,t_1,c_3     !=
 
1226
        rd      %y,t_2
 
1227
        addxcc  c_1,t_2,c_1
 
1228
        addx    %g0,%g0,c_2
 
1229
        addcc   c_3,t_1,c_3     !=
 
1230
        addxcc  c_1,t_2,c_1
 
1231
        addx    c_2,%g0,c_2
 
1232
        umul    a_6,a_2,t_1     !sqr_add_c2(a,6,2,c3,c1,c2);
 
1233
        addcc   c_3,t_1,c_3     !=
 
1234
        rd      %y,t_2
 
1235
        addxcc  c_1,t_2,c_1
 
1236
        addx    c_2,%g0,c_2
 
1237
        addcc   c_3,t_1,c_3     !=
 
1238
        addxcc  c_1,t_2,c_1
 
1239
        addx    c_2,%g0,c_2
 
1240
        umul    a_5,a_3,t_1     !sqr_add_c2(a,5,3,c3,c1,c2);
 
1241
        addcc   c_3,t_1,c_3     !=
 
1242
        rd      %y,t_2
 
1243
        addxcc  c_1,t_2,c_1
 
1244
        addx    c_2,%g0,c_2
 
1245
        addcc   c_3,t_1,c_3     !=
 
1246
        addxcc  c_1,t_2,c_1
 
1247
        addx    c_2,%g0,c_2
 
1248
        umul    a_4,a_4,t_1     !sqr_add_c(a,4,c3,c1,c2);
 
1249
        addcc   c_3,t_1,c_3     !=
 
1250
        rd      %y,t_2
 
1251
        addxcc  c_1,t_2,c_1
 
1252
        st      c_3,rp(8)       !r[8]=c3;
 
1253
        addx    c_2,%g0,c_2     !=
 
1254
 
 
1255
        umul    a_2,a_7,t_1     !sqr_add_c2(a,7,2,c1,c2,c3);
 
1256
        addcc   c_1,t_1,c_1
 
1257
        rd      %y,t_2
 
1258
        addxcc  c_2,t_2,c_2     !=
 
1259
        addx    %g0,%g0,c_3
 
1260
        addcc   c_1,t_1,c_1
 
1261
        addxcc  c_2,t_2,c_2
 
1262
        addx    c_3,%g0,c_3     !=
 
1263
        umul    a_3,a_6,t_1     !sqr_add_c2(a,6,3,c1,c2,c3);
 
1264
        addcc   c_1,t_1,c_1
 
1265
        rd      %y,t_2
 
1266
        addxcc  c_2,t_2,c_2     !=
 
1267
        addx    c_3,%g0,c_3
 
1268
        addcc   c_1,t_1,c_1
 
1269
        addxcc  c_2,t_2,c_2
 
1270
        addx    c_3,%g0,c_3     !=
 
1271
        umul    a_4,a_5,t_1     !sqr_add_c2(a,5,4,c1,c2,c3);
 
1272
        addcc   c_1,t_1,c_1
 
1273
        rd      %y,t_2
 
1274
        addxcc  c_2,t_2,c_2     !=
 
1275
        addx    c_3,%g0,c_3
 
1276
        addcc   c_1,t_1,c_1
 
1277
        addxcc  c_2,t_2,c_2
 
1278
        addx    c_3,%g0,c_3     !=
 
1279
        st      c_1,rp(9)       !r[9]=c1;
 
1280
 
 
1281
        umul    a_7,a_3,t_1     !sqr_add_c2(a,7,3,c2,c3,c1);
 
1282
        addcc   c_2,t_1,c_2
 
1283
        rd      %y,t_2          !=
 
1284
        addxcc  c_3,t_2,c_3
 
1285
        addx    %g0,%g0,c_1
 
1286
        addcc   c_2,t_1,c_2
 
1287
        addxcc  c_3,t_2,c_3     !=
 
1288
        addx    c_1,%g0,c_1
 
1289
        umul    a_6,a_4,t_1     !sqr_add_c2(a,6,4,c2,c3,c1);
 
1290
        addcc   c_2,t_1,c_2
 
1291
        rd      %y,t_2          !=
 
1292
        addxcc  c_3,t_2,c_3
 
1293
        addx    c_1,%g0,c_1
 
1294
        addcc   c_2,t_1,c_2
 
1295
        addxcc  c_3,t_2,c_3     !=
 
1296
        addx    c_1,%g0,c_1
 
1297
        umul    a_5,a_5,t_1     !sqr_add_c(a,5,c2,c3,c1);
 
1298
        addcc   c_2,t_1,c_2
 
1299
        rd      %y,t_2          !=
 
1300
        addxcc  c_3,t_2,c_3
 
1301
        addx    c_1,%g0,c_1
 
1302
        st      c_2,rp(10)      !r[10]=c2;
 
1303
 
 
1304
        umul    a_4,a_7,t_1     !=!sqr_add_c2(a,7,4,c3,c1,c2);
 
1305
        addcc   c_3,t_1,c_3
 
1306
        rd      %y,t_2
 
1307
        addxcc  c_1,t_2,c_1
 
1308
        addx    %g0,%g0,c_2     !=
 
1309
        addcc   c_3,t_1,c_3
 
1310
        addxcc  c_1,t_2,c_1
 
1311
        addx    c_2,%g0,c_2
 
1312
        umul    a_5,a_6,t_1     !=!sqr_add_c2(a,6,5,c3,c1,c2);
 
1313
        addcc   c_3,t_1,c_3
 
1314
        rd      %y,t_2
 
1315
        addxcc  c_1,t_2,c_1
 
1316
        addx    c_2,%g0,c_2     !=
 
1317
        addcc   c_3,t_1,c_3
 
1318
        addxcc  c_1,t_2,c_1
 
1319
        st      c_3,rp(11)      !r[11]=c3;
 
1320
        addx    c_2,%g0,c_2     !=
 
1321
 
 
1322
        umul    a_7,a_5,t_1     !sqr_add_c2(a,7,5,c1,c2,c3);
 
1323
        addcc   c_1,t_1,c_1
 
1324
        rd      %y,t_2
 
1325
        addxcc  c_2,t_2,c_2     !=
 
1326
        addx    %g0,%g0,c_3
 
1327
        addcc   c_1,t_1,c_1
 
1328
        addxcc  c_2,t_2,c_2
 
1329
        addx    c_3,%g0,c_3     !=
 
1330
        umul    a_6,a_6,t_1     !sqr_add_c(a,6,c1,c2,c3);
 
1331
        addcc   c_1,t_1,c_1
 
1332
        rd      %y,t_2
 
1333
        addxcc  c_2,t_2,c_2     !=
 
1334
        addx    c_3,%g0,c_3
 
1335
        st      c_1,rp(12)      !r[12]=c1;
 
1336
 
 
1337
        umul    a_6,a_7,t_1     !sqr_add_c2(a,7,6,c2,c3,c1);
 
1338
        addcc   c_2,t_1,c_2     !=
 
1339
        rd      %y,t_2
 
1340
        addxcc  c_3,t_2,c_3
 
1341
        addx    %g0,%g0,c_1
 
1342
        addcc   c_2,t_1,c_2     !=
 
1343
        addxcc  c_3,t_2,c_3
 
1344
        st      c_2,rp(13)      !r[13]=c2;
 
1345
        addx    c_1,%g0,c_1     !=
 
1346
 
 
1347
        umul    a_7,a_7,t_1     !sqr_add_c(a,7,c3,c1,c2);
 
1348
        addcc   c_3,t_1,c_3
 
1349
        rd      %y,t_2
 
1350
        addxcc  c_1,t_2,c_1     !=
 
1351
        st      c_3,rp(14)      !r[14]=c3;
 
1352
        st      c_1,rp(15)      !r[15]=c1;
 
1353
 
 
1354
        ret
 
1355
        restore %g0,%g0,%o0
 
1356
 
 
1357
.type   bn_sqr_comba8,#function
 
1358
.size   bn_sqr_comba8,(.-bn_sqr_comba8)
 
1359
 
 
1360
.align  32
 
1361
 
 
1362
.global bn_sqr_comba4
 
1363
/*
 
1364
 * void bn_sqr_comba4(r,a)
 
1365
 * BN_ULONG *r,*a;
 
1366
 */
 
1367
bn_sqr_comba4:
 
1368
        save    %sp,FRAME_SIZE,%sp
 
1369
        ld      ap(0),a_0
 
1370
        umul    a_0,a_0,c_1     !sqr_add_c(a,0,c1,c2,c3);
 
1371
        ld      ap(1),a_1       !=
 
1372
        rd      %y,c_2
 
1373
        st      c_1,rp(0)       !r[0]=c1;
 
1374
 
 
1375
        ld      ap(2),a_2
 
1376
        umul    a_0,a_1,t_1     !=!sqr_add_c2(a,1,0,c2,c3,c1);
 
1377
        addcc   c_2,t_1,c_2
 
1378
        rd      %y,t_2
 
1379
        addxcc  %g0,t_2,c_3
 
1380
        addx    %g0,%g0,c_1     !=
 
1381
        addcc   c_2,t_1,c_2
 
1382
        addxcc  c_3,t_2,c_3
 
1383
        addx    c_1,%g0,c_1     !=
 
1384
        st      c_2,rp(1)       !r[1]=c2;
 
1385
 
 
1386
        umul    a_2,a_0,t_1     !sqr_add_c2(a,2,0,c3,c1,c2);
 
1387
        addcc   c_3,t_1,c_3
 
1388
        rd      %y,t_2          !=
 
1389
        addxcc  c_1,t_2,c_1
 
1390
        addx    %g0,%g0,c_2
 
1391
        addcc   c_3,t_1,c_3
 
1392
        addxcc  c_1,t_2,c_1     !=
 
1393
        addx    c_2,%g0,c_2
 
1394
        ld      ap(3),a_3
 
1395
        umul    a_1,a_1,t_1     !sqr_add_c(a,1,c3,c1,c2);
 
1396
        addcc   c_3,t_1,c_3     !=
 
1397
        rd      %y,t_2
 
1398
        addxcc  c_1,t_2,c_1
 
1399
        st      c_3,rp(2)       !r[2]=c3;
 
1400
        addx    c_2,%g0,c_2     !=
 
1401
 
 
1402
        umul    a_0,a_3,t_1     !sqr_add_c2(a,3,0,c1,c2,c3);
 
1403
        addcc   c_1,t_1,c_1
 
1404
        rd      %y,t_2
 
1405
        addxcc  c_2,t_2,c_2     !=
 
1406
        addx    %g0,%g0,c_3
 
1407
        addcc   c_1,t_1,c_1
 
1408
        addxcc  c_2,t_2,c_2
 
1409
        addx    c_3,%g0,c_3     !=
 
1410
        umul    a_1,a_2,t_1     !sqr_add_c2(a,2,1,c1,c2,c3);
 
1411
        addcc   c_1,t_1,c_1
 
1412
        rd      %y,t_2
 
1413
        addxcc  c_2,t_2,c_2     !=
 
1414
        addx    c_3,%g0,c_3
 
1415
        addcc   c_1,t_1,c_1
 
1416
        addxcc  c_2,t_2,c_2
 
1417
        addx    c_3,%g0,c_3     !=
 
1418
        st      c_1,rp(3)       !r[3]=c1;
 
1419
 
 
1420
        umul    a_3,a_1,t_1     !sqr_add_c2(a,3,1,c2,c3,c1);
 
1421
        addcc   c_2,t_1,c_2
 
1422
        rd      %y,t_2          !=
 
1423
        addxcc  c_3,t_2,c_3
 
1424
        addx    %g0,%g0,c_1
 
1425
        addcc   c_2,t_1,c_2
 
1426
        addxcc  c_3,t_2,c_3     !=
 
1427
        addx    c_1,%g0,c_1
 
1428
        umul    a_2,a_2,t_1     !sqr_add_c(a,2,c2,c3,c1);
 
1429
        addcc   c_2,t_1,c_2
 
1430
        rd      %y,t_2          !=
 
1431
        addxcc  c_3,t_2,c_3
 
1432
        addx    c_1,%g0,c_1
 
1433
        st      c_2,rp(4)       !r[4]=c2;
 
1434
 
 
1435
        umul    a_2,a_3,t_1     !=!sqr_add_c2(a,3,2,c3,c1,c2);
 
1436
        addcc   c_3,t_1,c_3
 
1437
        rd      %y,t_2
 
1438
        addxcc  c_1,t_2,c_1
 
1439
        addx    %g0,%g0,c_2     !=
 
1440
        addcc   c_3,t_1,c_3
 
1441
        addxcc  c_1,t_2,c_1
 
1442
        st      c_3,rp(5)       !r[5]=c3;
 
1443
        addx    c_2,%g0,c_2     !=
 
1444
 
 
1445
        umul    a_3,a_3,t_1     !sqr_add_c(a,3,c1,c2,c3);
 
1446
        addcc   c_1,t_1,c_1
 
1447
        rd      %y,t_2
 
1448
        addxcc  c_2,t_2,c_2     !=
 
1449
        st      c_1,rp(6)       !r[6]=c1;
 
1450
        st      c_2,rp(7)       !r[7]=c2;
 
1451
        
 
1452
        ret
 
1453
        restore %g0,%g0,%o0
 
1454
 
 
1455
.type   bn_sqr_comba4,#function
 
1456
.size   bn_sqr_comba4,(.-bn_sqr_comba4)
 
1457
 
 
1458
.align  32