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