#ifndef __ASSEMBLER__ # define __ASSEMBLER__ 1 #endif #include "crypto/sparc_arch.h" .section ".text",#alloc,#execinstr .global bn_mul_mont_int .align 32 bn_mul_mont_int: cmp %o5,4 ! 128 bits minimum bge,pt %icc,.Lenter sethi %hi(0xffffffff),%g1 retl clr %o0 .align 32 .Lenter: save %sp,-STACK_FRAME,%sp sll %i5,2,%i5 ! num*=4 or %g1,%lo(0xffffffff),%g1 ld [%i4],%i4 cmp %i1,%i2 and %i5,%g1,%i5 ld [%i2],%l2 ! bp[0] nop add %sp,STACK_BIAS,%o7 ! real top of stack ld [%i1],%o0 ! ap[0] ! redundant in squaring context sub %o7,%i5,%o7 ld [%i1+4],%l5 ! ap[1] and %o7,-1024,%o7 ld [%i3],%o1 ! np[0] sub %o7,STACK_BIAS,%sp ! alloca ld [%i3+4],%l6 ! np[1] be,pt SIZE_T_CC,.Lbn_sqr_mont mov 12,%l1 mulx %o0,%l2,%o0 ! ap[0]*bp[0] mulx %l5,%l2,%g4 !prologue! ap[1]*bp[0] and %o0,%g1,%o3 add %sp,STACK_BIAS+STACK_FRAME,%l4 ld [%i1+8],%l5 !prologue! mulx %i4,%o3,%l3 ! "t[0]"*n0 and %l3,%g1,%l3 mulx %o1,%l3,%o1 ! np[0]*"t[0]"*n0 mulx %l6,%l3,%o4 !prologue! np[1]*"t[0]"*n0 srlx %o0,32,%o0 add %o3,%o1,%o1 ld [%i3+8],%l6 !prologue! srlx %o1,32,%o1 mov %g4,%o3 !prologue! .L1st: mulx %l5,%l2,%g4 mulx %l6,%l3,%g5 add %o3,%o0,%o0 ld [%i1+%l1],%l5 ! ap[j] and %o0,%g1,%o3 add %o4,%o1,%o1 ld [%i3+%l1],%l6 ! np[j] srlx %o0,32,%o0 add %o3,%o1,%o1 add %l1,4,%l1 ! j++ mov %g4,%o3 st %o1,[%l4] cmp %l1,%i5 mov %g5,%o4 srlx %o1,32,%o1 bl %icc,.L1st add %l4,4,%l4 ! tp++ !.L1st mulx %l5,%l2,%g4 !epilogue! mulx %l6,%l3,%g5 add %o3,%o0,%o0 and %o0,%g1,%o3 add %o4,%o1,%o1 srlx %o0,32,%o0 add %o3,%o1,%o1 st %o1,[%l4] srlx %o1,32,%o1 add %g4,%o0,%o0 and %o0,%g1,%o3 add %g5,%o1,%o1 srlx %o0,32,%o0 add %o3,%o1,%o1 st %o1,[%l4+4] srlx %o1,32,%o1 add %o0,%o1,%o1 st %o1,[%l4+8] srlx %o1,32,%o2 mov 4,%l0 ! i++ ld [%i2+4],%l2 ! bp[1] .Louter: add %sp,STACK_BIAS+STACK_FRAME,%l4 ld [%i1],%o0 ! ap[0] ld [%i1+4],%l5 ! ap[1] ld [%i3],%o1 ! np[0] ld [%i3+4],%l6 ! np[1] ld [%l4],%g5 ! tp[0] ld [%l4+4],%l7 ! tp[1] mov 12,%l1 mulx %o0,%l2,%o0 mulx %l5,%l2,%g4 !prologue! add %g5,%o0,%o0 ld [%i1+8],%l5 !prologue! and %o0,%g1,%o3 mulx %i4,%o3,%l3 and %l3,%g1,%l3 mulx %o1,%l3,%o1 mulx %l6,%l3,%o4 !prologue! srlx %o0,32,%o0 add %o3,%o1,%o1 ld [%i3+8],%l6 !prologue! srlx %o1,32,%o1 mov %g4,%o3 !prologue! .Linner: mulx %l5,%l2,%g4 mulx %l6,%l3,%g5 add %l7,%o0,%o0 ld [%i1+%l1],%l5 ! ap[j] add %o3,%o0,%o0 add %o4,%o1,%o1 ld [%i3+%l1],%l6 ! np[j] and %o0,%g1,%o3 ld [%l4+8],%l7 ! tp[j] srlx %o0,32,%o0 add %o3,%o1,%o1 add %l1,4,%l1 ! j++ mov %g4,%o3 st %o1,[%l4] ! tp[j-1] srlx %o1,32,%o1 mov %g5,%o4 cmp %l1,%i5 bl %icc,.Linner add %l4,4,%l4 ! tp++ !.Linner mulx %l5,%l2,%g4 !epilogue! mulx %l6,%l3,%g5 add %l7,%o0,%o0 add %o3,%o0,%o0 ld [%l4+8],%l7 ! tp[j] and %o0,%g1,%o3 add %o4,%o1,%o1 srlx %o0,32,%o0 add %o3,%o1,%o1 st %o1,[%l4] ! tp[j-1] srlx %o1,32,%o1 add %l7,%o0,%o0 add %g4,%o0,%o0 and %o0,%g1,%o3 add %g5,%o1,%o1 add %o3,%o1,%o1 st %o1,[%l4+4] ! tp[j-1] srlx %o0,32,%o0 add %l0,4,%l0 ! i++ srlx %o1,32,%o1 add %o0,%o1,%o1 cmp %l0,%i5 add %o2,%o1,%o1 st %o1,[%l4+8] srlx %o1,32,%o2 bl,a %icc,.Louter ld [%i2+%l0],%l2 ! bp[i] !.Louter add %l4,12,%l4 .Ltail: add %i3,%i5,%i3 add %i0,%i5,%i0 sub %g0,%i5,%o7 ! k=-num ba .Lsub subcc %g0,%g0,%g0 ! clear %icc.c .align 16 .Lsub: ld [%l4+%o7],%o0 ld [%i3+%o7],%o1 subccc %o0,%o1,%o1 ! tp[j]-np[j] add %i0,%o7,%l0 add %o7,4,%o7 brnz %o7,.Lsub st %o1,[%l0] subccc %o2,0,%o2 ! handle upmost overflow bit sub %g0,%i5,%o7 .Lcopy: ld [%l4+%o7],%o1 ! conditional copy ld [%i0+%o7],%o0 st %g0,[%l4+%o7] ! zap tp movcs %icc,%o1,%o0 st %o0,[%i0+%o7] add %o7,4,%o7 brnz %o7,.Lcopy nop mov 1,%i0 ret restore .align 32 .Lbn_sqr_mont: mulx %l2,%l2,%o0 ! ap[0]*ap[0] mulx %l5,%l2,%g4 !prologue! and %o0,%g1,%o3 add %sp,STACK_BIAS+STACK_FRAME,%l4 ld [%i1+8],%l5 !prologue! mulx %i4,%o3,%l3 ! "t[0]"*n0 srlx %o0,32,%o0 and %l3,%g1,%l3 mulx %o1,%l3,%o1 ! np[0]*"t[0]"*n0 mulx %l6,%l3,%o4 !prologue! and %o0,1,%o5 ld [%i3+8],%l6 !prologue! srlx %o0,1,%o0 add %o3,%o1,%o1 srlx %o1,32,%o1 mov %g4,%o3 !prologue! .Lsqr_1st: mulx %l5,%l2,%g4 mulx %l6,%l3,%g5 add %o3,%o0,%o0 ! ap[j]*a0+c0 add %o4,%o1,%o1 ld [%i1+%l1],%l5 ! ap[j] and %o0,%g1,%o3 ld [%i3+%l1],%l6 ! np[j] srlx %o0,32,%o0 add %o3,%o3,%o3 or %o5,%o3,%o3 mov %g5,%o4 srlx %o3,32,%o5 add %l1,4,%l1 ! j++ and %o3,%g1,%o3 cmp %l1,%i5 add %o3,%o1,%o1 st %o1,[%l4] mov %g4,%o3 srlx %o1,32,%o1 bl %icc,.Lsqr_1st add %l4,4,%l4 ! tp++ !.Lsqr_1st mulx %l5,%l2,%g4 ! epilogue mulx %l6,%l3,%g5 add %o3,%o0,%o0 ! ap[j]*a0+c0 add %o4,%o1,%o1 and %o0,%g1,%o3 srlx %o0,32,%o0 add %o3,%o3,%o3 or %o5,%o3,%o3 srlx %o3,32,%o5 and %o3,%g1,%o3 add %o3,%o1,%o1 st %o1,[%l4] srlx %o1,32,%o1 add %g4,%o0,%o0 ! ap[j]*a0+c0 add %g5,%o1,%o1 and %o0,%g1,%o3 srlx %o0,32,%o0 add %o3,%o3,%o3 or %o5,%o3,%o3 srlx %o3,32,%o5 and %o3,%g1,%o3 add %o3,%o1,%o1 st %o1,[%l4+4] srlx %o1,32,%o1 add %o0,%o0,%o0 or %o5,%o0,%o0 add %o0,%o1,%o1 st %o1,[%l4+8] srlx %o1,32,%o2 ld [%sp+STACK_BIAS+STACK_FRAME],%g4 ! tp[0] ld [%sp+STACK_BIAS+STACK_FRAME+4],%g5 ! tp[1] ld [%sp+STACK_BIAS+STACK_FRAME+8],%l7 ! tp[2] ld [%i1+4],%l2 ! ap[1] ld [%i1+8],%l5 ! ap[2] ld [%i3],%o1 ! np[0] ld [%i3+4],%l6 ! np[1] mulx %i4,%g4,%l3 mulx %l2,%l2,%o0 and %l3,%g1,%l3 mulx %o1,%l3,%o1 mulx %l6,%l3,%o4 add %g4,%o1,%o1 and %o0,%g1,%o3 ld [%i3+8],%l6 ! np[2] srlx %o1,32,%o1 add %g5,%o1,%o1 srlx %o0,32,%o0 add %o3,%o1,%o1 and %o0,1,%o5 add %o4,%o1,%o1 srlx %o0,1,%o0 mov 12,%l1 st %o1,[%sp+STACK_BIAS+STACK_FRAME] ! tp[0]= srlx %o1,32,%o1 add %sp,STACK_BIAS+STACK_FRAME+4,%l4 .Lsqr_2nd: mulx %l5,%l2,%o3 mulx %l6,%l3,%o4 add %o3,%o0,%o0 add %l7,%o5,%o5 ld [%i1+%l1],%l5 ! ap[j] and %o0,%g1,%o3 ld [%i3+%l1],%l6 ! np[j] srlx %o0,32,%o0 add %o4,%o1,%o1 ld [%l4+8],%l7 ! tp[j] add %o3,%o3,%o3 add %l1,4,%l1 ! j++ add %o5,%o3,%o3 srlx %o3,32,%o5 and %o3,%g1,%o3 cmp %l1,%i5 add %o3,%o1,%o1 st %o1,[%l4] ! tp[j-1] srlx %o1,32,%o1 bl %icc,.Lsqr_2nd add %l4,4,%l4 ! tp++ !.Lsqr_2nd mulx %l5,%l2,%o3 mulx %l6,%l3,%o4 add %o3,%o0,%o0 add %l7,%o5,%o5 and %o0,%g1,%o3 srlx %o0,32,%o0 add %o4,%o1,%o1 add %o3,%o3,%o3 add %o5,%o3,%o3 srlx %o3,32,%o5 and %o3,%g1,%o3 add %o3,%o1,%o1 st %o1,[%l4] ! tp[j-1] srlx %o1,32,%o1 add %o0,%o0,%o0 add %o5,%o0,%o0 add %o0,%o1,%o1 add %o2,%o1,%o1 st %o1,[%l4+4] srlx %o1,32,%o2 ld [%sp+STACK_BIAS+STACK_FRAME],%g5 ! tp[0] ld [%sp+STACK_BIAS+STACK_FRAME+4],%l7 ! tp[1] ld [%i1+8],%l2 ! ap[2] ld [%i3],%o1 ! np[0] ld [%i3+4],%l6 ! np[1] mulx %i4,%g5,%l3 and %l3,%g1,%l3 mov 8,%l0 mulx %l2,%l2,%o0 mulx %o1,%l3,%o1 and %o0,%g1,%o3 add %g5,%o1,%o1 srlx %o0,32,%o0 add %sp,STACK_BIAS+STACK_FRAME,%l4 srlx %o1,32,%o1 and %o0,1,%o5 srlx %o0,1,%o0 mov 4,%l1 .Lsqr_outer: .Lsqr_inner1: mulx %l6,%l3,%o4 add %l7,%o1,%o1 add %l1,4,%l1 ld [%l4+8],%l7 cmp %l1,%l0 add %o4,%o1,%o1 ld [%i3+%l1],%l6 st %o1,[%l4] srlx %o1,32,%o1 bl %icc,.Lsqr_inner1 add %l4,4,%l4 !.Lsqr_inner1 add %l1,4,%l1 ld [%i1+%l1],%l5 ! ap[j] mulx %l6,%l3,%o4 add %l7,%o1,%o1 ld [%i3+%l1],%l6 ! np[j] srlx %o1,32,%g4 and %o1,%g1,%o1 add %g4,%o5,%o5 add %o3,%o1,%o1 ld [%l4+8],%l7 ! tp[j] add %o4,%o1,%o1 st %o1,[%l4] srlx %o1,32,%o1 add %l1,4,%l1 cmp %l1,%i5 be,pn %icc,.Lsqr_no_inner2 add %l4,4,%l4 .Lsqr_inner2: mulx %l5,%l2,%o3 mulx %l6,%l3,%o4 add %l7,%o5,%o5 add %o3,%o0,%o0 ld [%i1+%l1],%l5 ! ap[j] and %o0,%g1,%o3 ld [%i3+%l1],%l6 ! np[j] srlx %o0,32,%o0 add %o3,%o3,%o3 ld [%l4+8],%l7 ! tp[j] add %o5,%o3,%o3 add %l1,4,%l1 ! j++ srlx %o3,32,%o5 and %o3,%g1,%o3 cmp %l1,%i5 add %o3,%o1,%o1 add %o4,%o1,%o1 st %o1,[%l4] ! tp[j-1] srlx %o1,32,%o1 bl %icc,.Lsqr_inner2 add %l4,4,%l4 ! tp++ .Lsqr_no_inner2: mulx %l5,%l2,%o3 mulx %l6,%l3,%o4 add %l7,%o5,%o5 add %o3,%o0,%o0 and %o0,%g1,%o3 srlx %o0,32,%o0 add %o3,%o3,%o3 add %o5,%o3,%o3 srlx %o3,32,%o5 and %o3,%g1,%o3 add %o3,%o1,%o1 add %o4,%o1,%o1 st %o1,[%l4] ! tp[j-1] srlx %o1,32,%o1 add %o0,%o0,%o0 add %o5,%o0,%o0 add %o0,%o1,%o1 add %o2,%o1,%o1 st %o1,[%l4+4] srlx %o1,32,%o2 add %l0,4,%l0 ! i++ ld [%sp+STACK_BIAS+STACK_FRAME],%g5 ! tp[0] ld [%sp+STACK_BIAS+STACK_FRAME+4],%l7 ! tp[1] ld [%i1+%l0],%l2 ! ap[j] ld [%i3],%o1 ! np[0] ld [%i3+4],%l6 ! np[1] mulx %i4,%g5,%l3 and %l3,%g1,%l3 add %l0,4,%g4 mulx %l2,%l2,%o0 mulx %o1,%l3,%o1 and %o0,%g1,%o3 add %g5,%o1,%o1 srlx %o0,32,%o0 add %sp,STACK_BIAS+STACK_FRAME,%l4 srlx %o1,32,%o1 and %o0,1,%o5 srlx %o0,1,%o0 cmp %g4,%i5 ! i" .align 32