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