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