📄 pa-risc2w.s
字号:
FSTD ht_temp,-24(%sp) ; -24(sp) = ht XMPYU flt_0,fw_l,lt_temp ; lt_temp = lt*fw_l FSTD lt_temp,-32(%sp) ; -32(sp) = lt LDD -8(%sp),m_0 LDD -16(%sp),m1_0 ADD,L m_0,m1_0,tmp_0 ; tmp_0 = m + m1; LDD -24(%sp),ht_0 LDD -32(%sp),lt_0 CMPCLR,*>>= tmp_0,m1_0,%r0 ; if (m < m1) ADD,L ht_0,top_overflow,ht_0 ; ht += (1<<32) EXTRD,U tmp_0,31,32,m_0 ; m>>32 DEPD,Z tmp_0,31,32,m1_0 ; m1 = m<<32 ADD,L ht_0,m_0,ht_0 ; ht+= (m>>32) ADD lt_0,m1_0,lt_0 ; lt= lt+m1; ADD,DC ht_0,%r0,ht_0 ; ht++ ADD %ret0,lt_0,lt_0 ; lt = lt + c; ADD,DC ht_0,%r0,ht_0 ; ht++ COPY ht_0,%ret0 ; copy carry STD lt_0,0(r_ptr) ; rp[0] = ltbn_mul_words_exit .EXIT LDD -96(%sp),%r7 ; restore r7 LDD -104(%sp),%r6 ; restore r6 LDD -112(%sp),%r5 ; restore r5 LDD -120(%sp),%r4 ; restore r4 BVE (%rp) LDD,MB -128(%sp),%r3 ; restore r3 .PROCEND ;in=23,24,25,26,29;out=28;;----------------------------------------------------------------------------;;void bn_sqr_words(BN_ULONG *rp, BN_ULONG *ap, int num);; arg0 = rp; arg1 = ap; arg2 = num;bn_sqr_words .proc .callinfo FRAME=128,ENTRY_GR=%r3,ARGS_SAVED,ORDERING_AWARE .EXPORT bn_sqr_words,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN .entry .align 64 STD %r3,0(%sp) ; save r3 STD %r4,8(%sp) ; save r4 NOP STD %r5,16(%sp) ; save r5 CMPIB,>= 0,num,bn_sqr_words_exit LDO 128(%sp),%sp ; bump stack ; ; If only 1, the goto straight to cleanup ; CMPIB,= 1,num,bn_sqr_words_single_top DEPDI,Z -1,32,33,high_mask ; Create Mask 0xffffffff80000000L ; ; This loop is unrolled 2 times (64-byte aligned as well) ;bn_sqr_words_unroll2 FLDD 0(a_ptr),t_float_0 ; a[0] FLDD 8(a_ptr),t_float_1 ; a[1] XMPYU fht_0,flt_0,fm ; m[0] XMPYU fht_1,flt_1,fm_1 ; m[1] FSTD fm,-24(%sp) ; store m[0] FSTD fm_1,-56(%sp) ; store m[1] XMPYU flt_0,flt_0,lt_temp ; lt[0] XMPYU flt_1,flt_1,lt_temp_1 ; lt[1] FSTD lt_temp,-16(%sp) ; store lt[0] FSTD lt_temp_1,-48(%sp) ; store lt[1] XMPYU fht_0,fht_0,ht_temp ; ht[0] XMPYU fht_1,fht_1,ht_temp_1 ; ht[1] FSTD ht_temp,-8(%sp) ; store ht[0] FSTD ht_temp_1,-40(%sp) ; store ht[1] LDD -24(%sp),m_0 LDD -56(%sp),m_1 AND m_0,high_mask,tmp_0 ; m[0] & Mask AND m_1,high_mask,tmp_1 ; m[1] & Mask DEPD,Z m_0,30,31,m_0 ; m[0] << 32+1 DEPD,Z m_1,30,31,m_1 ; m[1] << 32+1 LDD -16(%sp),lt_0 LDD -48(%sp),lt_1 EXTRD,U tmp_0,32,33,tmp_0 ; tmp_0 = m[0]&Mask >> 32-1 EXTRD,U tmp_1,32,33,tmp_1 ; tmp_1 = m[1]&Mask >> 32-1 LDD -8(%sp),ht_0 LDD -40(%sp),ht_1 ADD,L ht_0,tmp_0,ht_0 ; ht[0] += tmp_0 ADD,L ht_1,tmp_1,ht_1 ; ht[1] += tmp_1 ADD lt_0,m_0,lt_0 ; lt = lt+m ADD,DC ht_0,%r0,ht_0 ; ht[0]++ STD lt_0,0(r_ptr) ; rp[0] = lt[0] STD ht_0,8(r_ptr) ; rp[1] = ht[1] ADD lt_1,m_1,lt_1 ; lt = lt+m ADD,DC ht_1,%r0,ht_1 ; ht[1]++ STD lt_1,16(r_ptr) ; rp[2] = lt[1] STD ht_1,24(r_ptr) ; rp[3] = ht[1] LDO -2(num),num ; num = num - 2; LDO 16(a_ptr),a_ptr ; ap += 2 CMPIB,<= 2,num,bn_sqr_words_unroll2 LDO 32(r_ptr),r_ptr ; rp += 4 CMPIB,=,N 0,num,bn_sqr_words_exit ; are we done? ; ; Top of loop aligned on 64-byte boundary ;bn_sqr_words_single_top FLDD 0(a_ptr),t_float_0 ; load up 64-bit value (fr8L) ht(L)/lt(R) XMPYU fht_0,flt_0,fm ; m FSTD fm,-24(%sp) ; store m XMPYU flt_0,flt_0,lt_temp ; lt FSTD lt_temp,-16(%sp) ; store lt XMPYU fht_0,fht_0,ht_temp ; ht FSTD ht_temp,-8(%sp) ; store ht LDD -24(%sp),m_0 ; load m AND m_0,high_mask,tmp_0 ; m & Mask DEPD,Z m_0,30,31,m_0 ; m << 32+1 LDD -16(%sp),lt_0 ; lt LDD -8(%sp),ht_0 ; ht EXTRD,U tmp_0,32,33,tmp_0 ; tmp_0 = m&Mask >> 32-1 ADD m_0,lt_0,lt_0 ; lt = lt+m ADD,L ht_0,tmp_0,ht_0 ; ht += tmp_0 ADD,DC ht_0,%r0,ht_0 ; ht++ STD lt_0,0(r_ptr) ; rp[0] = lt STD ht_0,8(r_ptr) ; rp[1] = htbn_sqr_words_exit .EXIT LDD -112(%sp),%r5 ; restore r5 LDD -120(%sp),%r4 ; restore r4 BVE (%rp) LDD,MB -128(%sp),%r3 .PROCEND ;in=23,24,25,26,29;out=28;;----------------------------------------------------------------------------;;BN_ULONG bn_add_words(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n);; arg0 = rp ; arg1 = ap; arg2 = bp ; arg3 = nt .reg %r22b .reg %r21l .reg %r20bn_add_words .proc .entry .callinfo .EXPORT bn_add_words,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN .align 64 CMPIB,>= 0,n,bn_add_words_exit COPY %r0,%ret0 ; return 0 by default ; ; If 2 or more numbers do the loop ; CMPIB,= 1,n,bn_add_words_single_top NOP ; ; This loop is unrolled 2 times (64-byte aligned as well) ;bn_add_words_unroll2 LDD 0(a_ptr),t LDD 0(b_ptr),b ADD t,%ret0,t ; t = t+c; ADD,DC %r0,%r0,%ret0 ; set c to carry ADD t,b,l ; l = t + b[0] ADD,DC %ret0,%r0,%ret0 ; c+= carry STD l,0(r_ptr) LDD 8(a_ptr),t LDD 8(b_ptr),b ADD t,%ret0,t ; t = t+c; ADD,DC %r0,%r0,%ret0 ; set c to carry ADD t,b,l ; l = t + b[0] ADD,DC %ret0,%r0,%ret0 ; c+= carry STD l,8(r_ptr) LDO -2(n),n LDO 16(a_ptr),a_ptr LDO 16(b_ptr),b_ptr CMPIB,<= 2,n,bn_add_words_unroll2 LDO 16(r_ptr),r_ptr CMPIB,=,N 0,n,bn_add_words_exit ; are we done?bn_add_words_single_top LDD 0(a_ptr),t LDD 0(b_ptr),b ADD t,%ret0,t ; t = t+c; ADD,DC %r0,%r0,%ret0 ; set c to carry (could use CMPCLR??) ADD t,b,l ; l = t + b[0] ADD,DC %ret0,%r0,%ret0 ; c+= carry STD l,0(r_ptr)bn_add_words_exit .EXIT BVE (%rp) NOP .PROCEND ;in=23,24,25,26,29;out=28;;----------------------------------------------------------------------------;;BN_ULONG bn_sub_words(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n);; arg0 = rp ; arg1 = ap; arg2 = bp ; arg3 = nt1 .reg %r22t2 .reg %r21sub_tmp1 .reg %r20sub_tmp2 .reg %r19bn_sub_words .proc .callinfo .EXPORT bn_sub_words,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN .entry .align 64 CMPIB,>= 0,n,bn_sub_words_exit COPY %r0,%ret0 ; return 0 by default ; ; If 2 or more numbers do the loop ; CMPIB,= 1,n,bn_sub_words_single_top NOP ; ; This loop is unrolled 2 times (64-byte aligned as well) ;bn_sub_words_unroll2 LDD 0(a_ptr),t1 LDD 0(b_ptr),t2 SUB t1,t2,sub_tmp1 ; t3 = t1-t2; SUB sub_tmp1,%ret0,sub_tmp1 ; t3 = t3- c; CMPCLR,*>> t1,t2,sub_tmp2 ; clear if t1 > t2 LDO 1(%r0),sub_tmp2 CMPCLR,*= t1,t2,%r0 COPY sub_tmp2,%ret0 STD sub_tmp1,0(r_ptr) LDD 8(a_ptr),t1 LDD 8(b_ptr),t2 SUB t1,t2,sub_tmp1 ; t3 = t1-t2; SUB sub_tmp1,%ret0,sub_tmp1 ; t3 = t3- c; CMPCLR,*>> t1,t2,sub_tmp2 ; clear if t1 > t2 LDO 1(%r0),sub_tmp2 CMPCLR,*= t1,t2,%r0 COPY sub_tmp2,%ret0 STD sub_tmp1,8(r_ptr) LDO -2(n),n LDO 16(a_ptr),a_ptr LDO 16(b_ptr),b_ptr CMPIB,<= 2,n,bn_sub_words_unroll2 LDO 16(r_ptr),r_ptr CMPIB,=,N 0,n,bn_sub_words_exit ; are we done?bn_sub_words_single_top LDD 0(a_ptr),t1 LDD 0(b_ptr),t2 SUB t1,t2,sub_tmp1 ; t3 = t1-t2; SUB sub_tmp1,%ret0,sub_tmp1 ; t3 = t3- c; CMPCLR,*>> t1,t2,sub_tmp2 ; clear if t1 > t2 LDO 1(%r0),sub_tmp2 CMPCLR,*= t1,t2,%r0 COPY sub_tmp2,%ret0 STD sub_tmp1,0(r_ptr)bn_sub_words_exit .EXIT BVE (%rp) NOP .PROCEND ;in=23,24,25,26,29;out=28;;------------------------------------------------------------------------------;; unsigned long bn_div_words(unsigned long h, unsigned long l, unsigned long d);; arg0 = h; arg1 = l; arg2 = d;; This is mainly just modified assembly from the compiler, thus the; lack of variable names.;;------------------------------------------------------------------------------bn_div_words .proc .callinfo CALLER,FRAME=272,ENTRY_GR=%r10,SAVE_RP,ARGS_SAVED,ORDERING_AWARE .EXPORT bn_div_words,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN .IMPORT BN_num_bits_word,CODE,NO_RELOCATION .IMPORT __iob,DATA .IMPORT fprintf,CODE,NO_RELOCATION .IMPORT abort,CODE,NO_RELOCATION .IMPORT $$div2U,MILLICODE .entry STD %r2,-16(%r30) STD,MA %r3,352(%r30) STD %r4,-344(%r30) STD %r5,-336(%r30) STD %r6,-328(%r30) STD %r7,-320(%r30) STD %r8,-312(%r30) STD %r9,-304(%r30) STD %r10,-296(%r30) STD %r27,-288(%r30) ; save gp COPY %r24,%r3 ; save d COPY %r26,%r4 ; save h (high 64-bits) LDO -1(%r0),%ret0 ; return -1 by default CMPB,*= %r0,%arg2,$D3 ; if (d == 0) COPY %r25,%r5 ; save l (low 64-bits) LDO -48(%r30),%r29 ; create ap .CALL ;in=26,29;out=28; B,L BN_num_bits_word,%r2 COPY %r3,%r26 LDD -288(%r30),%r27 ; restore gp LDI 64,%r21 CMPB,= %r21,%ret0,$00000012 ;if (i == 64) (forward) COPY %ret0,%r24 ; i MTSARCM %r24 DEPDI,Z -1,%sar,1,%r29 CMPB,*<<,N %r29,%r4,bn_div_err_case ; if (h > 1<<i) (forward) $00000012 SUBI 64,%r24,%r31 ; i = 64 - i; CMPCLR,*<< %r4,%r3,%r0 ; if (h >= d) SUB %r4,%r3,%r4 ; h -= d CMPB,= %r31,%r0,$0000001A ; if (i) COPY %r0,%r10 ; ret = 0 MTSARCM %r31 ; i to shift DEPD,Z %r3,%sar,64,%r3 ; d <<= i; SUBI 64,%r31,%r19 ; 64 - i; redundent MTSAR %r19 ; (64 -i) to shift SHRPD %r4,%r5,%sar,%r4 ; l>> (64-i) MTSARCM %r31 ; i to shift DEPD,Z %r5,%sar,64,%r5 ; l <<= i;$0000001A DEPDI,Z -1,31,32,%r19 EXTRD,U %r3,31,32,%r6 ; dh=(d&0xfff)>>32 EXTRD,U %r3,63,32,%r8 ; dl = d&0xffffff LDO 2(%r0),%r9 STD %r3,-280(%r30) ; "d" to stack$0000001C DEPDI,Z -1,63,32,%r29 ; EXTRD,U %r4,31,32,%r31 ; h >> 32 CMPB,*=,N %r31,%r6,$D2 ; if ((h>>32) != dh)(forward) div COPY %r4,%r26 EXTRD,U %r4,31,32,%r25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -