mirror of
https://github.com/oxen-io/session-android.git
synced 2024-12-25 09:17:44 +00:00
d83a3d71bc
Merge in RedPhone // FREEBIE
1559 lines
32 KiB
ArmAsm
1559 lines
32 KiB
ArmAsm
.ident "sparcv8plus.s, Version 1.4"
|
|
.ident "SPARC v9 ISA artwork by Andy Polyakov <appro@fy.chalmers.se>"
|
|
|
|
/*
|
|
* ====================================================================
|
|
* Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
|
|
* project.
|
|
*
|
|
* Rights for redistribution and usage in source and binary forms are
|
|
* granted according to the OpenSSL license. Warranty of any kind is
|
|
* disclaimed.
|
|
* ====================================================================
|
|
*/
|
|
|
|
/*
|
|
* This is my modest contributon to OpenSSL project (see
|
|
* http://www.openssl.org/ for more information about it) and is
|
|
* a drop-in UltraSPARC ISA replacement for crypto/bn/bn_asm.c
|
|
* module. For updates see http://fy.chalmers.se/~appro/hpe/.
|
|
*
|
|
* Questions-n-answers.
|
|
*
|
|
* Q. How to compile?
|
|
* A. With SC4.x/SC5.x:
|
|
*
|
|
* cc -xarch=v8plus -c bn_asm.sparc.v8plus.S -o bn_asm.o
|
|
*
|
|
* and with gcc:
|
|
*
|
|
* gcc -mcpu=ultrasparc -c bn_asm.sparc.v8plus.S -o bn_asm.o
|
|
*
|
|
* or if above fails (it does if you have gas installed):
|
|
*
|
|
* gcc -E bn_asm.sparc.v8plus.S | as -xarch=v8plus /dev/fd/0 -o bn_asm.o
|
|
*
|
|
* Quick-n-dirty way to fuse the module into the library.
|
|
* Provided that the library is already configured and built
|
|
* (in 0.9.2 case with no-asm option):
|
|
*
|
|
* # cd crypto/bn
|
|
* # cp /some/place/bn_asm.sparc.v8plus.S .
|
|
* # cc -xarch=v8plus -c bn_asm.sparc.v8plus.S -o bn_asm.o
|
|
* # make
|
|
* # cd ../..
|
|
* # make; make test
|
|
*
|
|
* Quick-n-dirty way to get rid of it:
|
|
*
|
|
* # cd crypto/bn
|
|
* # touch bn_asm.c
|
|
* # make
|
|
* # cd ../..
|
|
* # make; make test
|
|
*
|
|
* Q. V8plus achitecture? What kind of beast is that?
|
|
* A. Well, it's rather a programming model than an architecture...
|
|
* It's actually v9-compliant, i.e. *any* UltraSPARC, CPU under
|
|
* special conditions, namely when kernel doesn't preserve upper
|
|
* 32 bits of otherwise 64-bit registers during a context switch.
|
|
*
|
|
* Q. Why just UltraSPARC? What about SuperSPARC?
|
|
* A. Original release did target UltraSPARC only. Now SuperSPARC
|
|
* version is provided along. Both version share bn_*comba[48]
|
|
* implementations (see comment later in code for explanation).
|
|
* But what's so special about this UltraSPARC implementation?
|
|
* Why didn't I let compiler do the job? Trouble is that most of
|
|
* available compilers (well, SC5.0 is the only exception) don't
|
|
* attempt to take advantage of UltraSPARC's 64-bitness under
|
|
* 32-bit kernels even though it's perfectly possible (see next
|
|
* question).
|
|
*
|
|
* Q. 64-bit registers under 32-bit kernels? Didn't you just say it
|
|
* doesn't work?
|
|
* A. You can't adress *all* registers as 64-bit wide:-( The catch is
|
|
* that you actually may rely upon %o0-%o5 and %g1-%g4 being fully
|
|
* preserved if you're in a leaf function, i.e. such never calling
|
|
* any other functions. All functions in this module are leaf and
|
|
* 10 registers is a handful. And as a matter of fact none-"comba"
|
|
* routines don't require even that much and I could even afford to
|
|
* not allocate own stack frame for 'em:-)
|
|
*
|
|
* Q. What about 64-bit kernels?
|
|
* A. What about 'em? Just kidding:-) Pure 64-bit version is currently
|
|
* under evaluation and development...
|
|
*
|
|
* Q. What about shared libraries?
|
|
* A. What about 'em? Kidding again:-) Code does *not* contain any
|
|
* code position dependencies and it's safe to include it into
|
|
* shared library as is.
|
|
*
|
|
* Q. How much faster does it go?
|
|
* A. Do you have a good benchmark? In either case below is what I
|
|
* experience with crypto/bn/expspeed.c test program:
|
|
*
|
|
* v8plus module on U10/300MHz against bn_asm.c compiled with:
|
|
*
|
|
* cc-5.0 -xarch=v8plus -xO5 -xdepend +7-12%
|
|
* cc-4.2 -xarch=v8plus -xO5 -xdepend +25-35%
|
|
* egcs-1.1.2 -mcpu=ultrasparc -O3 +35-45%
|
|
*
|
|
* v8 module on SS10/60MHz against bn_asm.c compiled with:
|
|
*
|
|
* cc-5.0 -xarch=v8 -xO5 -xdepend +7-10%
|
|
* cc-4.2 -xarch=v8 -xO5 -xdepend +10%
|
|
* egcs-1.1.2 -mv8 -O3 +35-45%
|
|
*
|
|
* As you can see it's damn hard to beat the new Sun C compiler
|
|
* and it's in first place GNU C users who will appreciate this
|
|
* assembler implementation:-)
|
|
*/
|
|
|
|
/*
|
|
* Revision history.
|
|
*
|
|
* 1.0 - initial release;
|
|
* 1.1 - new loop unrolling model(*);
|
|
* - some more fine tuning;
|
|
* 1.2 - made gas friendly;
|
|
* - updates to documentation concerning v9;
|
|
* - new performance comparison matrix;
|
|
* 1.3 - fixed problem with /usr/ccs/lib/cpp;
|
|
* 1.4 - native V9 bn_*_comba[48] implementation (15% more efficient)
|
|
* resulting in slight overall performance kick;
|
|
* - some retunes;
|
|
* - support for GNU as added;
|
|
*
|
|
* (*) Originally unrolled loop looked like this:
|
|
* for (;;) {
|
|
* op(p+0); if (--n==0) break;
|
|
* op(p+1); if (--n==0) break;
|
|
* op(p+2); if (--n==0) break;
|
|
* op(p+3); if (--n==0) break;
|
|
* p+=4;
|
|
* }
|
|
* I unroll according to following:
|
|
* while (n&~3) {
|
|
* op(p+0); op(p+1); op(p+2); op(p+3);
|
|
* p+=4; n=-4;
|
|
* }
|
|
* if (n) {
|
|
* op(p+0); if (--n==0) return;
|
|
* op(p+2); if (--n==0) return;
|
|
* op(p+3); return;
|
|
* }
|
|
*/
|
|
|
|
#if defined(__SUNPRO_C) && defined(__sparcv9)
|
|
/* They've said -xarch=v9 at command line */
|
|
.register %g2,#scratch
|
|
.register %g3,#scratch
|
|
# define FRAME_SIZE -192
|
|
#elif defined(__GNUC__) && defined(__arch64__)
|
|
/* They've said -m64 at command line */
|
|
.register %g2,#scratch
|
|
.register %g3,#scratch
|
|
# define FRAME_SIZE -192
|
|
#else
|
|
# define FRAME_SIZE -96
|
|
#endif
|
|
/*
|
|
* GNU assembler can't stand stuw:-(
|
|
*/
|
|
#define stuw st
|
|
|
|
.section ".text",#alloc,#execinstr
|
|
.file "bn_asm.sparc.v8plus.S"
|
|
|
|
.align 32
|
|
|
|
.global bn_mul_add_words
|
|
/*
|
|
* BN_ULONG bn_mul_add_words(rp,ap,num,w)
|
|
* BN_ULONG *rp,*ap;
|
|
* int num;
|
|
* BN_ULONG w;
|
|
*/
|
|
bn_mul_add_words:
|
|
sra %o2,%g0,%o2 ! signx %o2
|
|
brgz,a %o2,.L_bn_mul_add_words_proceed
|
|
lduw [%o1],%g2
|
|
retl
|
|
clr %o0
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
.L_bn_mul_add_words_proceed:
|
|
srl %o3,%g0,%o3 ! clruw %o3
|
|
andcc %o2,-4,%g0
|
|
bz,pn %icc,.L_bn_mul_add_words_tail
|
|
clr %o5
|
|
|
|
.L_bn_mul_add_words_loop: ! wow! 32 aligned!
|
|
lduw [%o0],%g1
|
|
lduw [%o1+4],%g3
|
|
mulx %o3,%g2,%g2
|
|
add %g1,%o5,%o4
|
|
nop
|
|
add %o4,%g2,%o4
|
|
stuw %o4,[%o0]
|
|
srlx %o4,32,%o5
|
|
|
|
lduw [%o0+4],%g1
|
|
lduw [%o1+8],%g2
|
|
mulx %o3,%g3,%g3
|
|
add %g1,%o5,%o4
|
|
dec 4,%o2
|
|
add %o4,%g3,%o4
|
|
stuw %o4,[%o0+4]
|
|
srlx %o4,32,%o5
|
|
|
|
lduw [%o0+8],%g1
|
|
lduw [%o1+12],%g3
|
|
mulx %o3,%g2,%g2
|
|
add %g1,%o5,%o4
|
|
inc 16,%o1
|
|
add %o4,%g2,%o4
|
|
stuw %o4,[%o0+8]
|
|
srlx %o4,32,%o5
|
|
|
|
lduw [%o0+12],%g1
|
|
mulx %o3,%g3,%g3
|
|
add %g1,%o5,%o4
|
|
inc 16,%o0
|
|
add %o4,%g3,%o4
|
|
andcc %o2,-4,%g0
|
|
stuw %o4,[%o0-4]
|
|
srlx %o4,32,%o5
|
|
bnz,a,pt %icc,.L_bn_mul_add_words_loop
|
|
lduw [%o1],%g2
|
|
|
|
brnz,a,pn %o2,.L_bn_mul_add_words_tail
|
|
lduw [%o1],%g2
|
|
.L_bn_mul_add_words_return:
|
|
retl
|
|
mov %o5,%o0
|
|
|
|
.L_bn_mul_add_words_tail:
|
|
lduw [%o0],%g1
|
|
mulx %o3,%g2,%g2
|
|
add %g1,%o5,%o4
|
|
dec %o2
|
|
add %o4,%g2,%o4
|
|
srlx %o4,32,%o5
|
|
brz,pt %o2,.L_bn_mul_add_words_return
|
|
stuw %o4,[%o0]
|
|
|
|
lduw [%o1+4],%g2
|
|
lduw [%o0+4],%g1
|
|
mulx %o3,%g2,%g2
|
|
add %g1,%o5,%o4
|
|
dec %o2
|
|
add %o4,%g2,%o4
|
|
srlx %o4,32,%o5
|
|
brz,pt %o2,.L_bn_mul_add_words_return
|
|
stuw %o4,[%o0+4]
|
|
|
|
lduw [%o1+8],%g2
|
|
lduw [%o0+8],%g1
|
|
mulx %o3,%g2,%g2
|
|
add %g1,%o5,%o4
|
|
add %o4,%g2,%o4
|
|
stuw %o4,[%o0+8]
|
|
retl
|
|
srlx %o4,32,%o0
|
|
|
|
.type bn_mul_add_words,#function
|
|
.size bn_mul_add_words,(.-bn_mul_add_words)
|
|
|
|
.align 32
|
|
|
|
.global bn_mul_words
|
|
/*
|
|
* BN_ULONG bn_mul_words(rp,ap,num,w)
|
|
* BN_ULONG *rp,*ap;
|
|
* int num;
|
|
* BN_ULONG w;
|
|
*/
|
|
bn_mul_words:
|
|
sra %o2,%g0,%o2 ! signx %o2
|
|
brgz,a %o2,.L_bn_mul_words_proceeed
|
|
lduw [%o1],%g2
|
|
retl
|
|
clr %o0
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
.L_bn_mul_words_proceeed:
|
|
srl %o3,%g0,%o3 ! clruw %o3
|
|
andcc %o2,-4,%g0
|
|
bz,pn %icc,.L_bn_mul_words_tail
|
|
clr %o5
|
|
|
|
.L_bn_mul_words_loop: ! wow! 32 aligned!
|
|
lduw [%o1+4],%g3
|
|
mulx %o3,%g2,%g2
|
|
add %g2,%o5,%o4
|
|
nop
|
|
stuw %o4,[%o0]
|
|
srlx %o4,32,%o5
|
|
|
|
lduw [%o1+8],%g2
|
|
mulx %o3,%g3,%g3
|
|
add %g3,%o5,%o4
|
|
dec 4,%o2
|
|
stuw %o4,[%o0+4]
|
|
srlx %o4,32,%o5
|
|
|
|
lduw [%o1+12],%g3
|
|
mulx %o3,%g2,%g2
|
|
add %g2,%o5,%o4
|
|
inc 16,%o1
|
|
stuw %o4,[%o0+8]
|
|
srlx %o4,32,%o5
|
|
|
|
mulx %o3,%g3,%g3
|
|
add %g3,%o5,%o4
|
|
inc 16,%o0
|
|
stuw %o4,[%o0-4]
|
|
srlx %o4,32,%o5
|
|
andcc %o2,-4,%g0
|
|
bnz,a,pt %icc,.L_bn_mul_words_loop
|
|
lduw [%o1],%g2
|
|
nop
|
|
nop
|
|
|
|
brnz,a,pn %o2,.L_bn_mul_words_tail
|
|
lduw [%o1],%g2
|
|
.L_bn_mul_words_return:
|
|
retl
|
|
mov %o5,%o0
|
|
|
|
.L_bn_mul_words_tail:
|
|
mulx %o3,%g2,%g2
|
|
add %g2,%o5,%o4
|
|
dec %o2
|
|
srlx %o4,32,%o5
|
|
brz,pt %o2,.L_bn_mul_words_return
|
|
stuw %o4,[%o0]
|
|
|
|
lduw [%o1+4],%g2
|
|
mulx %o3,%g2,%g2
|
|
add %g2,%o5,%o4
|
|
dec %o2
|
|
srlx %o4,32,%o5
|
|
brz,pt %o2,.L_bn_mul_words_return
|
|
stuw %o4,[%o0+4]
|
|
|
|
lduw [%o1+8],%g2
|
|
mulx %o3,%g2,%g2
|
|
add %g2,%o5,%o4
|
|
stuw %o4,[%o0+8]
|
|
retl
|
|
srlx %o4,32,%o0
|
|
|
|
.type bn_mul_words,#function
|
|
.size bn_mul_words,(.-bn_mul_words)
|
|
|
|
.align 32
|
|
.global bn_sqr_words
|
|
/*
|
|
* void bn_sqr_words(r,a,n)
|
|
* BN_ULONG *r,*a;
|
|
* int n;
|
|
*/
|
|
bn_sqr_words:
|
|
sra %o2,%g0,%o2 ! signx %o2
|
|
brgz,a %o2,.L_bn_sqr_words_proceeed
|
|
lduw [%o1],%g2
|
|
retl
|
|
clr %o0
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
.L_bn_sqr_words_proceeed:
|
|
andcc %o2,-4,%g0
|
|
nop
|
|
bz,pn %icc,.L_bn_sqr_words_tail
|
|
nop
|
|
|
|
.L_bn_sqr_words_loop: ! wow! 32 aligned!
|
|
lduw [%o1+4],%g3
|
|
mulx %g2,%g2,%o4
|
|
stuw %o4,[%o0]
|
|
srlx %o4,32,%o5
|
|
stuw %o5,[%o0+4]
|
|
nop
|
|
|
|
lduw [%o1+8],%g2
|
|
mulx %g3,%g3,%o4
|
|
dec 4,%o2
|
|
stuw %o4,[%o0+8]
|
|
srlx %o4,32,%o5
|
|
stuw %o5,[%o0+12]
|
|
|
|
lduw [%o1+12],%g3
|
|
mulx %g2,%g2,%o4
|
|
srlx %o4,32,%o5
|
|
stuw %o4,[%o0+16]
|
|
inc 16,%o1
|
|
stuw %o5,[%o0+20]
|
|
|
|
mulx %g3,%g3,%o4
|
|
inc 32,%o0
|
|
stuw %o4,[%o0-8]
|
|
srlx %o4,32,%o5
|
|
andcc %o2,-4,%g2
|
|
stuw %o5,[%o0-4]
|
|
bnz,a,pt %icc,.L_bn_sqr_words_loop
|
|
lduw [%o1],%g2
|
|
nop
|
|
|
|
brnz,a,pn %o2,.L_bn_sqr_words_tail
|
|
lduw [%o1],%g2
|
|
.L_bn_sqr_words_return:
|
|
retl
|
|
clr %o0
|
|
|
|
.L_bn_sqr_words_tail:
|
|
mulx %g2,%g2,%o4
|
|
dec %o2
|
|
stuw %o4,[%o0]
|
|
srlx %o4,32,%o5
|
|
brz,pt %o2,.L_bn_sqr_words_return
|
|
stuw %o5,[%o0+4]
|
|
|
|
lduw [%o1+4],%g2
|
|
mulx %g2,%g2,%o4
|
|
dec %o2
|
|
stuw %o4,[%o0+8]
|
|
srlx %o4,32,%o5
|
|
brz,pt %o2,.L_bn_sqr_words_return
|
|
stuw %o5,[%o0+12]
|
|
|
|
lduw [%o1+8],%g2
|
|
mulx %g2,%g2,%o4
|
|
srlx %o4,32,%o5
|
|
stuw %o4,[%o0+16]
|
|
stuw %o5,[%o0+20]
|
|
retl
|
|
clr %o0
|
|
|
|
.type bn_sqr_words,#function
|
|
.size bn_sqr_words,(.-bn_sqr_words)
|
|
|
|
.align 32
|
|
.global bn_div_words
|
|
/*
|
|
* BN_ULONG bn_div_words(h,l,d)
|
|
* BN_ULONG h,l,d;
|
|
*/
|
|
bn_div_words:
|
|
sllx %o0,32,%o0
|
|
or %o0,%o1,%o0
|
|
udivx %o0,%o2,%o0
|
|
retl
|
|
srl %o0,%g0,%o0 ! clruw %o0
|
|
|
|
.type bn_div_words,#function
|
|
.size bn_div_words,(.-bn_div_words)
|
|
|
|
.align 32
|
|
|
|
.global bn_add_words
|
|
/*
|
|
* BN_ULONG bn_add_words(rp,ap,bp,n)
|
|
* BN_ULONG *rp,*ap,*bp;
|
|
* int n;
|
|
*/
|
|
bn_add_words:
|
|
sra %o3,%g0,%o3 ! signx %o3
|
|
brgz,a %o3,.L_bn_add_words_proceed
|
|
lduw [%o1],%o4
|
|
retl
|
|
clr %o0
|
|
|
|
.L_bn_add_words_proceed:
|
|
andcc %o3,-4,%g0
|
|
bz,pn %icc,.L_bn_add_words_tail
|
|
addcc %g0,0,%g0 ! clear carry flag
|
|
|
|
.L_bn_add_words_loop: ! wow! 32 aligned!
|
|
dec 4,%o3
|
|
lduw [%o2],%o5
|
|
lduw [%o1+4],%g1
|
|
lduw [%o2+4],%g2
|
|
lduw [%o1+8],%g3
|
|
lduw [%o2+8],%g4
|
|
addccc %o5,%o4,%o5
|
|
stuw %o5,[%o0]
|
|
|
|
lduw [%o1+12],%o4
|
|
lduw [%o2+12],%o5
|
|
inc 16,%o1
|
|
addccc %g1,%g2,%g1
|
|
stuw %g1,[%o0+4]
|
|
|
|
inc 16,%o2
|
|
addccc %g3,%g4,%g3
|
|
stuw %g3,[%o0+8]
|
|
|
|
inc 16,%o0
|
|
addccc %o5,%o4,%o5
|
|
stuw %o5,[%o0-4]
|
|
and %o3,-4,%g1
|
|
brnz,a,pt %g1,.L_bn_add_words_loop
|
|
lduw [%o1],%o4
|
|
|
|
brnz,a,pn %o3,.L_bn_add_words_tail
|
|
lduw [%o1],%o4
|
|
.L_bn_add_words_return:
|
|
clr %o0
|
|
retl
|
|
movcs %icc,1,%o0
|
|
nop
|
|
|
|
.L_bn_add_words_tail:
|
|
lduw [%o2],%o5
|
|
dec %o3
|
|
addccc %o5,%o4,%o5
|
|
brz,pt %o3,.L_bn_add_words_return
|
|
stuw %o5,[%o0]
|
|
|
|
lduw [%o1+4],%o4
|
|
lduw [%o2+4],%o5
|
|
dec %o3
|
|
addccc %o5,%o4,%o5
|
|
brz,pt %o3,.L_bn_add_words_return
|
|
stuw %o5,[%o0+4]
|
|
|
|
lduw [%o1+8],%o4
|
|
lduw [%o2+8],%o5
|
|
addccc %o5,%o4,%o5
|
|
stuw %o5,[%o0+8]
|
|
clr %o0
|
|
retl
|
|
movcs %icc,1,%o0
|
|
|
|
.type bn_add_words,#function
|
|
.size bn_add_words,(.-bn_add_words)
|
|
|
|
.global bn_sub_words
|
|
/*
|
|
* BN_ULONG bn_sub_words(rp,ap,bp,n)
|
|
* BN_ULONG *rp,*ap,*bp;
|
|
* int n;
|
|
*/
|
|
bn_sub_words:
|
|
sra %o3,%g0,%o3 ! signx %o3
|
|
brgz,a %o3,.L_bn_sub_words_proceed
|
|
lduw [%o1],%o4
|
|
retl
|
|
clr %o0
|
|
|
|
.L_bn_sub_words_proceed:
|
|
andcc %o3,-4,%g0
|
|
bz,pn %icc,.L_bn_sub_words_tail
|
|
addcc %g0,0,%g0 ! clear carry flag
|
|
|
|
.L_bn_sub_words_loop: ! wow! 32 aligned!
|
|
dec 4,%o3
|
|
lduw [%o2],%o5
|
|
lduw [%o1+4],%g1
|
|
lduw [%o2+4],%g2
|
|
lduw [%o1+8],%g3
|
|
lduw [%o2+8],%g4
|
|
subccc %o4,%o5,%o5
|
|
stuw %o5,[%o0]
|
|
|
|
lduw [%o1+12],%o4
|
|
lduw [%o2+12],%o5
|
|
inc 16,%o1
|
|
subccc %g1,%g2,%g2
|
|
stuw %g2,[%o0+4]
|
|
|
|
inc 16,%o2
|
|
subccc %g3,%g4,%g4
|
|
stuw %g4,[%o0+8]
|
|
|
|
inc 16,%o0
|
|
subccc %o4,%o5,%o5
|
|
stuw %o5,[%o0-4]
|
|
and %o3,-4,%g1
|
|
brnz,a,pt %g1,.L_bn_sub_words_loop
|
|
lduw [%o1],%o4
|
|
|
|
brnz,a,pn %o3,.L_bn_sub_words_tail
|
|
lduw [%o1],%o4
|
|
.L_bn_sub_words_return:
|
|
clr %o0
|
|
retl
|
|
movcs %icc,1,%o0
|
|
nop
|
|
|
|
.L_bn_sub_words_tail: ! wow! 32 aligned!
|
|
lduw [%o2],%o5
|
|
dec %o3
|
|
subccc %o4,%o5,%o5
|
|
brz,pt %o3,.L_bn_sub_words_return
|
|
stuw %o5,[%o0]
|
|
|
|
lduw [%o1+4],%o4
|
|
lduw [%o2+4],%o5
|
|
dec %o3
|
|
subccc %o4,%o5,%o5
|
|
brz,pt %o3,.L_bn_sub_words_return
|
|
stuw %o5,[%o0+4]
|
|
|
|
lduw [%o1+8],%o4
|
|
lduw [%o2+8],%o5
|
|
subccc %o4,%o5,%o5
|
|
stuw %o5,[%o0+8]
|
|
clr %o0
|
|
retl
|
|
movcs %icc,1,%o0
|
|
|
|
.type bn_sub_words,#function
|
|
.size bn_sub_words,(.-bn_sub_words)
|
|
|
|
/*
|
|
* Code below depends on the fact that upper parts of the %l0-%l7
|
|
* and %i0-%i7 are zeroed by kernel after context switch. In
|
|
* previous versions this comment stated that "the trouble is that
|
|
* it's not feasible to implement the mumbo-jumbo in less V9
|
|
* instructions:-(" which apparently isn't true thanks to
|
|
* 'bcs,a %xcc,.+8; inc %rd' pair. But the performance improvement
|
|
* results not from the shorter code, but from elimination of
|
|
* multicycle none-pairable 'rd %y,%rd' instructions.
|
|
*
|
|
* Andy.
|
|
*/
|
|
|
|
/*
|
|
* Here is register usage map for *all* routines below.
|
|
*/
|
|
#define t_1 %o0
|
|
#define t_2 %o1
|
|
#define c_12 %o2
|
|
#define c_3 %o3
|
|
|
|
#define ap(I) [%i1+4*I]
|
|
#define bp(I) [%i2+4*I]
|
|
#define rp(I) [%i0+4*I]
|
|
|
|
#define a_0 %l0
|
|
#define a_1 %l1
|
|
#define a_2 %l2
|
|
#define a_3 %l3
|
|
#define a_4 %l4
|
|
#define a_5 %l5
|
|
#define a_6 %l6
|
|
#define a_7 %l7
|
|
|
|
#define b_0 %i3
|
|
#define b_1 %i4
|
|
#define b_2 %i5
|
|
#define b_3 %o4
|
|
#define b_4 %o5
|
|
#define b_5 %o7
|
|
#define b_6 %g1
|
|
#define b_7 %g4
|
|
|
|
.align 32
|
|
.global bn_mul_comba8
|
|
/*
|
|
* void bn_mul_comba8(r,a,b)
|
|
* BN_ULONG *r,*a,*b;
|
|
*/
|
|
bn_mul_comba8:
|
|
save %sp,FRAME_SIZE,%sp
|
|
mov 1,t_2
|
|
lduw ap(0),a_0
|
|
sllx t_2,32,t_2
|
|
lduw bp(0),b_0 !=
|
|
lduw bp(1),b_1
|
|
mulx a_0,b_0,t_1 !mul_add_c(a[0],b[0],c1,c2,c3);
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(0) !=!r[0]=c1;
|
|
|
|
lduw ap(1),a_1
|
|
mulx a_0,b_1,t_1 !mul_add_c(a[0],b[1],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3 !=
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw ap(2),a_2
|
|
mulx a_1,b_0,t_1 !=!mul_add_c(a[1],b[0],c2,c3,c1);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12 !=
|
|
stuw t_1,rp(1) !r[1]=c2;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_2,b_0,t_1 !mul_add_c(a[2],b[0],c3,c1,c2);
|
|
addcc c_12,t_1,c_12 !=
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw bp(2),b_2 !=
|
|
mulx a_1,b_1,t_1 !mul_add_c(a[1],b[1],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3 !=
|
|
lduw bp(3),b_3
|
|
mulx a_0,b_2,t_1 !mul_add_c(a[0],b[2],c3,c1,c2);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(2) !r[2]=c3;
|
|
or c_12,c_3,c_12 !=
|
|
|
|
mulx a_0,b_3,t_1 !mul_add_c(a[0],b[3],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_1,b_2,t_1 !=!mul_add_c(a[1],b[2],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
lduw ap(3),a_3
|
|
mulx a_2,b_1,t_1 !mul_add_c(a[2],b[1],c1,c2,c3);
|
|
addcc c_12,t_1,c_12 !=
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw ap(4),a_4
|
|
mulx a_3,b_0,t_1 !=!mul_add_c(a[3],b[0],c1,c2,c3);!=
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12 !=
|
|
stuw t_1,rp(3) !r[3]=c1;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_4,b_0,t_1 !mul_add_c(a[4],b[0],c2,c3,c1);
|
|
addcc c_12,t_1,c_12 !=
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_3,b_1,t_1 !=!mul_add_c(a[3],b[1],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_2,b_2,t_1 !=!mul_add_c(a[2],b[2],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw bp(4),b_4 !=
|
|
mulx a_1,b_3,t_1 !mul_add_c(a[1],b[3],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3 !=
|
|
lduw bp(5),b_5
|
|
mulx a_0,b_4,t_1 !mul_add_c(a[0],b[4],c2,c3,c1);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(4) !r[4]=c2;
|
|
or c_12,c_3,c_12 !=
|
|
|
|
mulx a_0,b_5,t_1 !mul_add_c(a[0],b[5],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_1,b_4,t_1 !mul_add_c(a[1],b[4],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_2,b_3,t_1 !mul_add_c(a[2],b[3],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_3,b_2,t_1 !mul_add_c(a[3],b[2],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
lduw ap(5),a_5
|
|
mulx a_4,b_1,t_1 !mul_add_c(a[4],b[1],c3,c1,c2);
|
|
addcc c_12,t_1,c_12 !=
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw ap(6),a_6
|
|
mulx a_5,b_0,t_1 !=!mul_add_c(a[5],b[0],c3,c1,c2);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12 !=
|
|
stuw t_1,rp(5) !r[5]=c3;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_6,b_0,t_1 !mul_add_c(a[6],b[0],c1,c2,c3);
|
|
addcc c_12,t_1,c_12 !=
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_5,b_1,t_1 !=!mul_add_c(a[5],b[1],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_4,b_2,t_1 !=!mul_add_c(a[4],b[2],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_3,b_3,t_1 !=!mul_add_c(a[3],b[3],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_2,b_4,t_1 !=!mul_add_c(a[2],b[4],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw bp(6),b_6 !=
|
|
mulx a_1,b_5,t_1 !mul_add_c(a[1],b[5],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3 !=
|
|
lduw bp(7),b_7
|
|
mulx a_0,b_6,t_1 !mul_add_c(a[0],b[6],c1,c2,c3);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(6) !r[6]=c1;
|
|
or c_12,c_3,c_12 !=
|
|
|
|
mulx a_0,b_7,t_1 !mul_add_c(a[0],b[7],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_1,b_6,t_1 !mul_add_c(a[1],b[6],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_2,b_5,t_1 !mul_add_c(a[2],b[5],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_3,b_4,t_1 !mul_add_c(a[3],b[4],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_4,b_3,t_1 !mul_add_c(a[4],b[3],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_5,b_2,t_1 !mul_add_c(a[5],b[2],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
lduw ap(7),a_7
|
|
mulx a_6,b_1,t_1 !=!mul_add_c(a[6],b[1],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_7,b_0,t_1 !=!mul_add_c(a[7],b[0],c2,c3,c1);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12 !=
|
|
stuw t_1,rp(7) !r[7]=c2;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_7,b_1,t_1 !=!mul_add_c(a[7],b[1],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3 !=
|
|
mulx a_6,b_2,t_1 !mul_add_c(a[6],b[2],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3 !=
|
|
mulx a_5,b_3,t_1 !mul_add_c(a[5],b[3],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3 !=
|
|
mulx a_4,b_4,t_1 !mul_add_c(a[4],b[4],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3 !=
|
|
mulx a_3,b_5,t_1 !mul_add_c(a[3],b[5],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3 !=
|
|
mulx a_2,b_6,t_1 !mul_add_c(a[2],b[6],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3 !=
|
|
mulx a_1,b_7,t_1 !mul_add_c(a[1],b[7],c3,c1,c2);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3 !=
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(8) !r[8]=c3;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_2,b_7,t_1 !=!mul_add_c(a[2],b[7],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3 !=
|
|
mulx a_3,b_6,t_1 !mul_add_c(a[3],b[6],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_4,b_5,t_1 !mul_add_c(a[4],b[5],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_5,b_4,t_1 !mul_add_c(a[5],b[4],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_6,b_3,t_1 !mul_add_c(a[6],b[3],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_7,b_2,t_1 !mul_add_c(a[7],b[2],c1,c2,c3);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(9) !r[9]=c1;
|
|
or c_12,c_3,c_12 !=
|
|
|
|
mulx a_7,b_3,t_1 !mul_add_c(a[7],b[3],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_6,b_4,t_1 !mul_add_c(a[6],b[4],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_5,b_5,t_1 !mul_add_c(a[5],b[5],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_4,b_6,t_1 !mul_add_c(a[4],b[6],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_3,b_7,t_1 !mul_add_c(a[3],b[7],c2,c3,c1);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(10) !r[10]=c2;
|
|
or c_12,c_3,c_12 !=
|
|
|
|
mulx a_4,b_7,t_1 !mul_add_c(a[4],b[7],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_5,b_6,t_1 !mul_add_c(a[5],b[6],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_6,b_5,t_1 !mul_add_c(a[6],b[5],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_7,b_4,t_1 !mul_add_c(a[7],b[4],c3,c1,c2);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(11) !r[11]=c3;
|
|
or c_12,c_3,c_12 !=
|
|
|
|
mulx a_7,b_5,t_1 !mul_add_c(a[7],b[5],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_6,b_6,t_1 !mul_add_c(a[6],b[6],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_5,b_7,t_1 !mul_add_c(a[5],b[7],c1,c2,c3);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(12) !r[12]=c1;
|
|
or c_12,c_3,c_12 !=
|
|
|
|
mulx a_6,b_7,t_1 !mul_add_c(a[6],b[7],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_7,b_6,t_1 !mul_add_c(a[7],b[6],c2,c3,c1);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
st t_1,rp(13) !r[13]=c2;
|
|
or c_12,c_3,c_12 !=
|
|
|
|
mulx a_7,b_7,t_1 !mul_add_c(a[7],b[7],c3,c1,c2);
|
|
addcc c_12,t_1,t_1
|
|
srlx t_1,32,c_12 !=
|
|
stuw t_1,rp(14) !r[14]=c3;
|
|
stuw c_12,rp(15) !r[15]=c1;
|
|
|
|
ret
|
|
restore %g0,%g0,%o0 !=
|
|
|
|
.type bn_mul_comba8,#function
|
|
.size bn_mul_comba8,(.-bn_mul_comba8)
|
|
|
|
.align 32
|
|
|
|
.global bn_mul_comba4
|
|
/*
|
|
* void bn_mul_comba4(r,a,b)
|
|
* BN_ULONG *r,*a,*b;
|
|
*/
|
|
bn_mul_comba4:
|
|
save %sp,FRAME_SIZE,%sp
|
|
lduw ap(0),a_0
|
|
mov 1,t_2
|
|
lduw bp(0),b_0
|
|
sllx t_2,32,t_2 !=
|
|
lduw bp(1),b_1
|
|
mulx a_0,b_0,t_1 !mul_add_c(a[0],b[0],c1,c2,c3);
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(0) !=!r[0]=c1;
|
|
|
|
lduw ap(1),a_1
|
|
mulx a_0,b_1,t_1 !mul_add_c(a[0],b[1],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3 !=
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw ap(2),a_2
|
|
mulx a_1,b_0,t_1 !=!mul_add_c(a[1],b[0],c2,c3,c1);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12 !=
|
|
stuw t_1,rp(1) !r[1]=c2;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_2,b_0,t_1 !mul_add_c(a[2],b[0],c3,c1,c2);
|
|
addcc c_12,t_1,c_12 !=
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw bp(2),b_2 !=
|
|
mulx a_1,b_1,t_1 !mul_add_c(a[1],b[1],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3 !=
|
|
lduw bp(3),b_3
|
|
mulx a_0,b_2,t_1 !mul_add_c(a[0],b[2],c3,c1,c2);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(2) !r[2]=c3;
|
|
or c_12,c_3,c_12 !=
|
|
|
|
mulx a_0,b_3,t_1 !mul_add_c(a[0],b[3],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
mulx a_1,b_2,t_1 !mul_add_c(a[1],b[2],c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8 !=
|
|
add c_3,t_2,c_3
|
|
lduw ap(3),a_3
|
|
mulx a_2,b_1,t_1 !mul_add_c(a[2],b[1],c1,c2,c3);
|
|
addcc c_12,t_1,c_12 !=
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_3,b_0,t_1 !mul_add_c(a[3],b[0],c1,c2,c3);!=
|
|
addcc c_12,t_1,t_1 !=
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(3) !=!r[3]=c1;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_3,b_1,t_1 !mul_add_c(a[3],b[1],c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3 !=
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_2,b_2,t_1 !mul_add_c(a[2],b[2],c2,c3,c1);
|
|
addcc c_12,t_1,c_12 !=
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_1,b_3,t_1 !mul_add_c(a[1],b[3],c2,c3,c1);
|
|
addcc c_12,t_1,t_1 !=
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(4) !=!r[4]=c2;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_2,b_3,t_1 !mul_add_c(a[2],b[3],c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3 !=
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_3,b_2,t_1 !mul_add_c(a[3],b[2],c3,c1,c2);
|
|
addcc c_12,t_1,t_1 !=
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(5) !=!r[5]=c3;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_3,b_3,t_1 !mul_add_c(a[3],b[3],c1,c2,c3);
|
|
addcc c_12,t_1,t_1
|
|
srlx t_1,32,c_12 !=
|
|
stuw t_1,rp(6) !r[6]=c1;
|
|
stuw c_12,rp(7) !r[7]=c2;
|
|
|
|
ret
|
|
restore %g0,%g0,%o0
|
|
|
|
.type bn_mul_comba4,#function
|
|
.size bn_mul_comba4,(.-bn_mul_comba4)
|
|
|
|
.align 32
|
|
|
|
.global bn_sqr_comba8
|
|
bn_sqr_comba8:
|
|
save %sp,FRAME_SIZE,%sp
|
|
mov 1,t_2
|
|
lduw ap(0),a_0
|
|
sllx t_2,32,t_2
|
|
lduw ap(1),a_1
|
|
mulx a_0,a_0,t_1 !sqr_add_c(a,0,c1,c2,c3);
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(0) !r[0]=c1;
|
|
|
|
lduw ap(2),a_2
|
|
mulx a_0,a_1,t_1 !=!sqr_add_c2(a,1,0,c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(1) !r[1]=c2;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_2,a_0,t_1 !sqr_add_c2(a,2,0,c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw ap(3),a_3
|
|
mulx a_1,a_1,t_1 !sqr_add_c(a,1,c3,c1,c2);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(2) !r[2]=c3;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_0,a_3,t_1 !sqr_add_c2(a,3,0,c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw ap(4),a_4
|
|
mulx a_1,a_2,t_1 !sqr_add_c2(a,2,1,c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
st t_1,rp(3) !r[3]=c1;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_4,a_0,t_1 !sqr_add_c2(a,4,0,c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_3,a_1,t_1 !sqr_add_c2(a,3,1,c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw ap(5),a_5
|
|
mulx a_2,a_2,t_1 !sqr_add_c(a,2,c2,c3,c1);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(4) !r[4]=c2;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_0,a_5,t_1 !sqr_add_c2(a,5,0,c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_1,a_4,t_1 !sqr_add_c2(a,4,1,c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw ap(6),a_6
|
|
mulx a_2,a_3,t_1 !sqr_add_c2(a,3,2,c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(5) !r[5]=c3;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_6,a_0,t_1 !sqr_add_c2(a,6,0,c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_5,a_1,t_1 !sqr_add_c2(a,5,1,c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_4,a_2,t_1 !sqr_add_c2(a,4,2,c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw ap(7),a_7
|
|
mulx a_3,a_3,t_1 !=!sqr_add_c(a,3,c1,c2,c3);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(6) !r[6]=c1;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_0,a_7,t_1 !sqr_add_c2(a,7,0,c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_1,a_6,t_1 !sqr_add_c2(a,6,1,c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_2,a_5,t_1 !sqr_add_c2(a,5,2,c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_3,a_4,t_1 !sqr_add_c2(a,4,3,c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(7) !r[7]=c2;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_7,a_1,t_1 !sqr_add_c2(a,7,1,c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_6,a_2,t_1 !sqr_add_c2(a,6,2,c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_5,a_3,t_1 !sqr_add_c2(a,5,3,c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_4,a_4,t_1 !sqr_add_c(a,4,c3,c1,c2);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(8) !r[8]=c3;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_2,a_7,t_1 !sqr_add_c2(a,7,2,c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_3,a_6,t_1 !sqr_add_c2(a,6,3,c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_4,a_5,t_1 !sqr_add_c2(a,5,4,c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(9) !r[9]=c1;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_7,a_3,t_1 !sqr_add_c2(a,7,3,c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_6,a_4,t_1 !sqr_add_c2(a,6,4,c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_5,a_5,t_1 !sqr_add_c(a,5,c2,c3,c1);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(10) !r[10]=c2;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_4,a_7,t_1 !sqr_add_c2(a,7,4,c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_5,a_6,t_1 !sqr_add_c2(a,6,5,c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(11) !r[11]=c3;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_7,a_5,t_1 !sqr_add_c2(a,7,5,c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_6,a_6,t_1 !sqr_add_c(a,6,c1,c2,c3);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(12) !r[12]=c1;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_6,a_7,t_1 !sqr_add_c2(a,7,6,c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(13) !r[13]=c2;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_7,a_7,t_1 !sqr_add_c(a,7,c3,c1,c2);
|
|
addcc c_12,t_1,t_1
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(14) !r[14]=c3;
|
|
stuw c_12,rp(15) !r[15]=c1;
|
|
|
|
ret
|
|
restore %g0,%g0,%o0
|
|
|
|
.type bn_sqr_comba8,#function
|
|
.size bn_sqr_comba8,(.-bn_sqr_comba8)
|
|
|
|
.align 32
|
|
|
|
.global bn_sqr_comba4
|
|
/*
|
|
* void bn_sqr_comba4(r,a)
|
|
* BN_ULONG *r,*a;
|
|
*/
|
|
bn_sqr_comba4:
|
|
save %sp,FRAME_SIZE,%sp
|
|
mov 1,t_2
|
|
lduw ap(0),a_0
|
|
sllx t_2,32,t_2
|
|
lduw ap(1),a_1
|
|
mulx a_0,a_0,t_1 !sqr_add_c(a,0,c1,c2,c3);
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(0) !r[0]=c1;
|
|
|
|
lduw ap(2),a_2
|
|
mulx a_0,a_1,t_1 !sqr_add_c2(a,1,0,c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(1) !r[1]=c2;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_2,a_0,t_1 !sqr_add_c2(a,2,0,c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
lduw ap(3),a_3
|
|
mulx a_1,a_1,t_1 !sqr_add_c(a,1,c3,c1,c2);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(2) !r[2]=c3;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_0,a_3,t_1 !sqr_add_c2(a,3,0,c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_1,a_2,t_1 !sqr_add_c2(a,2,1,c1,c2,c3);
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(3) !r[3]=c1;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_3,a_1,t_1 !sqr_add_c2(a,3,1,c2,c3,c1);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,c_12
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
mulx a_2,a_2,t_1 !sqr_add_c(a,2,c2,c3,c1);
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(4) !r[4]=c2;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_2,a_3,t_1 !sqr_add_c2(a,3,2,c3,c1,c2);
|
|
addcc c_12,t_1,c_12
|
|
clr c_3
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
addcc c_12,t_1,t_1
|
|
bcs,a %xcc,.+8
|
|
add c_3,t_2,c_3
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(5) !r[5]=c3;
|
|
or c_12,c_3,c_12
|
|
|
|
mulx a_3,a_3,t_1 !sqr_add_c(a,3,c1,c2,c3);
|
|
addcc c_12,t_1,t_1
|
|
srlx t_1,32,c_12
|
|
stuw t_1,rp(6) !r[6]=c1;
|
|
stuw c_12,rp(7) !r[7]=c2;
|
|
|
|
ret
|
|
restore %g0,%g0,%o0
|
|
|
|
.type bn_sqr_comba4,#function
|
|
.size bn_sqr_comba4,(.-bn_sqr_comba4)
|
|
|
|
.align 32
|