vis3-mont.S revision 1.5
1#include "sparc_arch.h" 2 3#ifdef __arch64__ 4.register %g2,#scratch 5.register %g3,#scratch 6#endif 7 8.section ".text",#alloc,#execinstr 9.globl bn_mul_mont_vis3 10.align 32 11bn_mul_mont_vis3: 12 add %sp, STACK_BIAS, %g4 ! real top of stack 13 sll %o5, 2, %o5 ! size in bytes 14 add %o5, 63, %g5 15 andn %g5, 63, %g5 ! buffer size rounded up to 64 bytes 16 add %g5, %g5, %g1 17 add %g5, %g1, %g1 ! 3*buffer size 18 sub %g4, %g1, %g1 19 andn %g1, 63, %g1 ! align at 64 byte 20 sub %g1, STACK_FRAME, %g1 ! new top of stack 21 sub %g1, %g4, %g1 22 23 save %sp, %g1, %sp 24 ld [%i4+0], %l0 ! pull n0[0..1] value 25 add %sp, STACK_BIAS+STACK_FRAME, %l5 26 ld [%i4+4], %l1 27 add %l5, %g5, %l7 28 ld [%i2+0], %l2 ! m0=bp[0] 29 sllx %l1, 32, %g1 30 ld [%i2+4], %l3 31 or %l0, %g1, %g1 32 add %i2, 8, %i2 33 34 ld [%i1+0], %l0 ! ap[0] 35 sllx %l3, 32, %g2 36 ld [%i1+4], %l1 37 or %l2, %g2, %g2 38 39 ld [%i1+8], %l2 ! ap[1] 40 sllx %l1, 32, %o2 41 ld [%i1+12], %l3 42 or %l0, %o2, %o2 43 add %i1, 16, %i1 44 stx %o2, [%l7] ! converted ap[0] 45 46 mulx %o2, %g2, %g4 ! ap[0]*bp[0] 47 .word 0x8bb282c2 !umulxhi %o2,%g2,%g5 48 49 ld [%i3+0], %l0 ! np[0] 50 sllx %l3, 32, %o2 51 ld [%i3+4], %l1 52 or %l2, %o2, %o2 53 54 ld [%i3+8], %l2 ! np[1] 55 sllx %l1, 32, %o4 56 ld [%i3+12], %l3 57 or %l0, %o4, %o4 58 add %i3, 16, %i3 59 stx %o4, [%l7+8] ! converted np[0] 60 61 mulx %g4, %g1, %g3 ! "tp[0]"*n0 62 stx %o2, [%l7+16] ! converted ap[1] 63 64 mulx %o2, %g2, %o3 ! ap[1]*bp[0] 65 .word 0x95b282c2 !umulxhi %o2,%g2,%o2 ! ahi=aj 66 67 mulx %o4, %g3, %o0 ! np[0]*m1 68 .word 0x93b302c3 !umulxhi %o4,%g3,%o1 69 70 sllx %l3, 32, %o4 71 or %l2, %o4, %o4 72 stx %o4, [%l7+24] ! converted np[1] 73 add %l7, 32, %l7 74 75 addcc %g4, %o0, %o0 76 .word 0x93b00229 !addxc %g0,%o1,%o1 77 78 mulx %o4, %g3, %o5 ! np[1]*m1 79 .word 0x99b302c3 !umulxhi %o4,%g3,%o4 ! nhi=nj 80 81 ba .L1st 82 sub %i5, 24, %l4 ! cnt=num-3 83 84.align 16 85.L1st: 86 ld [%i1+0], %l0 ! ap[j] 87 addcc %o3, %g5, %g4 88 ld [%i1+4], %l1 89 .word 0x8bb28220 !addxc %o2,%g0,%g5 90 91 sllx %l1, 32, %o2 92 add %i1, 8, %i1 93 or %l0, %o2, %o2 94 stx %o2, [%l7] ! converted ap[j] 95 96 ld [%i3+0], %l2 ! np[j] 97 addcc %o5, %o1, %o0 98 ld [%i3+4], %l3 99 .word 0x93b30220 !addxc %o4,%g0,%o1 ! nhi=nj 100 101 sllx %l3, 32, %o4 102 add %i3, 8, %i3 103 mulx %o2, %g2, %o3 ! ap[j]*bp[0] 104 or %l2, %o4, %o4 105 .word 0x95b282c2 !umulxhi %o2,%g2,%o2 ! ahi=aj 106 stx %o4, [%l7+8] ! converted np[j] 107 add %l7, 16, %l7 ! anp++ 108 109 mulx %o4, %g3, %o5 ! np[j]*m1 110 addcc %g4, %o0, %o0 ! np[j]*m1+ap[j]*bp[0] 111 .word 0x99b302c3 !umulxhi %o4,%g3,%o4 ! nhi=nj 112 .word 0x93b00229 !addxc %g0,%o1,%o1 113 stx %o0, [%l5] ! tp[j-1] 114 add %l5, 8, %l5 ! tp++ 115 116 brnz,pt %l4, .L1st 117 sub %l4, 8, %l4 ! j-- 118!.L1st 119 addcc %o3, %g5, %g4 120 .word 0x8bb28220 !addxc %o2,%g0,%g5 ! ahi=aj 121 122 addcc %o5, %o1, %o0 123 .word 0x93b30220 !addxc %o4,%g0,%o1 124 addcc %g4, %o0, %o0 ! np[j]*m1+ap[j]*bp[0] 125 .word 0x93b00229 !addxc %g0,%o1,%o1 126 stx %o0, [%l5] ! tp[j-1] 127 add %l5, 8, %l5 128 129 addcc %g5, %o1, %o1 130 .word 0xa1b00220 !addxc %g0,%g0,%l0 ! upmost overflow bit 131 stx %o1, [%l5] 132 add %l5, 8, %l5 133 134 ba .Louter 135 sub %i5, 16, %l1 ! i=num-2 136 137.align 16 138.Louter: 139 ld [%i2+0], %l2 ! m0=bp[i] 140 ld [%i2+4], %l3 141 142 sub %l7, %i5, %l7 ! rewind 143 sub %l5, %i5, %l5 144 sub %l7, %i5, %l7 145 146 add %i2, 8, %i2 147 sllx %l3, 32, %g2 148 ldx [%l7+0], %o2 ! ap[0] 149 or %l2, %g2, %g2 150 ldx [%l7+8], %o4 ! np[0] 151 152 mulx %o2, %g2, %g4 ! ap[0]*bp[i] 153 ldx [%l5], %o7 ! tp[0] 154 .word 0x8bb282c2 !umulxhi %o2,%g2,%g5 155 ldx [%l7+16], %o2 ! ap[1] 156 addcc %g4, %o7, %g4 ! ap[0]*bp[i]+tp[0] 157 mulx %o2, %g2, %o3 ! ap[1]*bp[i] 158 .word 0x8bb00225 !addxc %g0,%g5,%g5 159 mulx %g4, %g1, %g3 ! tp[0]*n0 160 .word 0x95b282c2 !umulxhi %o2,%g2,%o2 ! ahi=aj 161 mulx %o4, %g3, %o0 ! np[0]*m1 162 .word 0x93b302c3 !umulxhi %o4,%g3,%o1 163 ldx [%l7+24], %o4 ! np[1] 164 add %l7, 32, %l7 165 addcc %o0, %g4, %o0 166 mulx %o4, %g3, %o5 ! np[1]*m1 167 .word 0x93b00229 !addxc %g0,%o1,%o1 168 .word 0x99b302c3 !umulxhi %o4,%g3,%o4 ! nhi=nj 169 170 ba .Linner 171 sub %i5, 24, %l4 ! cnt=num-3 172.align 16 173.Linner: 174 addcc %o3, %g5, %g4 175 ldx [%l5+8], %o7 ! tp[j] 176 .word 0x8bb28220 !addxc %o2,%g0,%g5 ! ahi=aj 177 ldx [%l7+0], %o2 ! ap[j] 178 addcc %o5, %o1, %o0 179 mulx %o2, %g2, %o3 ! ap[j]*bp[i] 180 .word 0x93b30220 !addxc %o4,%g0,%o1 ! nhi=nj 181 ldx [%l7+8], %o4 ! np[j] 182 add %l7, 16, %l7 183 .word 0x95b282c2 !umulxhi %o2,%g2,%o2 ! ahi=aj 184 addcc %g4, %o7, %g4 ! ap[j]*bp[i]+tp[j] 185 mulx %o4, %g3, %o5 ! np[j]*m1 186 .word 0x8bb00225 !addxc %g0,%g5,%g5 187 .word 0x99b302c3 !umulxhi %o4,%g3,%o4 ! nhi=nj 188 addcc %o0, %g4, %o0 ! np[j]*m1+ap[j]*bp[i]+tp[j] 189 .word 0x93b00229 !addxc %g0,%o1,%o1 190 stx %o0, [%l5] ! tp[j-1] 191 add %l5, 8, %l5 192 brnz,pt %l4, .Linner 193 sub %l4, 8, %l4 194!.Linner 195 ldx [%l5+8], %o7 ! tp[j] 196 addcc %o3, %g5, %g4 197 .word 0x8bb28220 !addxc %o2,%g0,%g5 ! ahi=aj 198 addcc %g4, %o7, %g4 ! ap[j]*bp[i]+tp[j] 199 .word 0x8bb00225 !addxc %g0,%g5,%g5 200 201 addcc %o5, %o1, %o0 202 .word 0x93b30220 !addxc %o4,%g0,%o1 ! nhi=nj 203 addcc %o0, %g4, %o0 ! np[j]*m1+ap[j]*bp[i]+tp[j] 204 .word 0x93b00229 !addxc %g0,%o1,%o1 205 stx %o0, [%l5] ! tp[j-1] 206 207 subcc %g0, %l0, %g0 ! move upmost overflow to CCR.xcc 208 .word 0x93b24265 !addxccc %o1,%g5,%o1 209 .word 0xa1b00220 !addxc %g0,%g0,%l0 210 stx %o1, [%l5+8] 211 add %l5, 16, %l5 212 213 brnz,pt %l1, .Louter 214 sub %l1, 8, %l1 215 216 sub %l7, %i5, %l7 ! rewind 217 sub %l5, %i5, %l5 218 sub %l7, %i5, %l7 219 ba .Lsub 220 subcc %i5, 8, %l4 ! cnt=num-1 and clear CCR.xcc 221 222.align 16 223.Lsub: 224 ldx [%l5], %o7 225 add %l5, 8, %l5 226 ldx [%l7+8], %o4 227 add %l7, 16, %l7 228 subccc %o7, %o4, %l2 ! tp[j]-np[j] 229 srlx %o7, 32, %o7 230 srlx %o4, 32, %o4 231 subccc %o7, %o4, %l3 232 add %i0, 8, %i0 233 st %l2, [%i0-4] ! reverse order 234 st %l3, [%i0-8] 235 brnz,pt %l4, .Lsub 236 sub %l4, 8, %l4 237 238 sub %l7, %i5, %l7 ! rewind 239 sub %l5, %i5, %l5 240 sub %l7, %i5, %l7 241 sub %i0, %i5, %i0 242 243 subccc %l0, %g0, %l0 ! handle upmost overflow bit 244 ba .Lcopy 245 sub %i5, 8, %l4 246 247.align 16 248.Lcopy: ! conditional copy 249 ld [%l5+0], %l0 250 ld [%l5+4], %l1 251 ld [%i0+0], %l2 252 ld [%i0+4], %l3 253 stx %g0, [%l5] ! zap 254 add %l5, 8, %l5 255 stx %g0, [%l7] ! zap 256 stx %g0, [%l7+8] 257 add %l7, 16, %l7 258 movcs %icc, %l0, %l2 259 movcs %icc, %l1, %l3 260 st %l3, [%i0+0] ! flip order 261 st %l2, [%i0+4] 262 add %i0, 8, %i0 263 brnz %l4, .Lcopy 264 sub %l4, 8, %l4 265 266 mov 1, %o0 267 ret 268 restore 269.type bn_mul_mont_vis3, #function 270.size bn_mul_mont_vis3, .-bn_mul_mont_vis3 271.asciz "Montgomery Multiplication for SPARCv9 VIS3, CRYPTOGAMS by <appro@openssl.org>" 272.align 4 273