1 1.2 christos #ifndef __ASSEMBLER__ 2 1.2 christos # define __ASSEMBLER__ 1 3 1.2 christos #endif 4 1.2 christos #include "crypto/sparc_arch.h" 5 1.1 spz 6 1.1 spz #ifdef __arch64__ 7 1.1 spz .register %g2,#scratch 8 1.1 spz .register %g3,#scratch 9 1.1 spz #endif 10 1.1 spz 11 1.1 spz #ifdef __PIC__ 12 1.1 spz SPARC_PIC_THUNK(%g1) 13 1.1 spz #endif 14 1.1 spz 15 1.1 spz .globl bn_GF2m_mul_2x2 16 1.1 spz .align 16 17 1.1 spz bn_GF2m_mul_2x2: 18 1.1 spz SPARC_LOAD_ADDRESS_LEAF(OPENSSL_sparcv9cap_P,%g1,%g5) 19 1.1 spz ld [%g1+0],%g1 ! OPENSSL_sparcv9cap_P[0] 20 1.1 spz 21 1.1 spz andcc %g1, SPARCV9_VIS3, %g0 22 1.1 spz bz,pn %icc,.Lsoftware 23 1.1 spz nop 24 1.1 spz 25 1.1 spz sllx %o1, 32, %o1 26 1.1 spz sllx %o3, 32, %o3 27 1.1 spz or %o2, %o1, %o1 28 1.1 spz or %o4, %o3, %o3 29 1.1 spz .word 0x95b262ab ! xmulx %o1, %o3, %o2 30 1.1 spz .word 0x99b262cb ! xmulxhi %o1, %o3, %o4 31 1.1 spz srlx %o2, 32, %o1 ! 13 cycles later 32 1.1 spz st %o2, [%o0+0] 33 1.1 spz st %o1, [%o0+4] 34 1.1 spz srlx %o4, 32, %o3 35 1.1 spz st %o4, [%o0+8] 36 1.1 spz retl 37 1.1 spz st %o3, [%o0+12] 38 1.1 spz 39 1.1 spz .align 16 40 1.1 spz .Lsoftware: 41 1.1 spz save %sp,-STACK_FRAME-128,%sp 42 1.1 spz 43 1.1 spz sllx %i1,32,%g1 44 1.1 spz mov -1,%o4 45 1.1 spz sllx %i3,32,%o7 46 1.1 spz or %i2,%g1,%g1 47 1.1 spz srlx %o4,1,%o5 ! 0x7fff... 48 1.1 spz or %i4,%o7,%o7 49 1.1 spz srlx %o4,2,%o4 ! 0x3fff... 50 1.1 spz add %sp,STACK_BIAS+STACK_FRAME,%l0 51 1.1 spz 52 1.1 spz sllx %g1,2,%o2 53 1.1 spz mov %g1,%o0 54 1.1 spz sllx %g1,1,%o1 55 1.1 spz 56 1.1 spz srax %o2,63,%g5 ! broadcast 61st bit 57 1.1 spz and %o5,%o2,%o2 ! (a<<2)&0x7fff... 58 1.1 spz srlx %o5,2,%o5 59 1.1 spz srax %o1,63,%g4 ! broadcast 62nd bit 60 1.1 spz and %o4,%o1,%o1 ! (a<<1)&0x3fff... 61 1.1 spz srax %o0,63,%g1 ! broadcast 63rd bit 62 1.1 spz and %o5,%o0,%o0 ! (a<<0)&0x1fff... 63 1.1 spz 64 1.1 spz sllx %o0,3,%o3 65 1.1 spz and %o7,%g1,%g1 66 1.1 spz and %o7,%g4,%g4 67 1.1 spz and %o7,%g5,%g5 68 1.1 spz 69 1.1 spz stx %g0,[%l0+0*8] ! tab[0]=0 70 1.1 spz xor %o0,%o1,%o4 71 1.1 spz stx %o0,[%l0+1*8] ! tab[1]=a1 72 1.1 spz stx %o1,[%l0+2*8] ! tab[2]=a2 73 1.1 spz xor %o2,%o3,%o5 74 1.1 spz stx %o4,[%l0+3*8] ! tab[3]=a1^a2 75 1.1 spz xor %o2,%o0,%o0 76 1.1 spz 77 1.1 spz stx %o2,[%l0+4*8] ! tab[4]=a4 78 1.1 spz xor %o2,%o1,%o1 79 1.1 spz stx %o0,[%l0+5*8] ! tab[5]=a1^a4 80 1.1 spz xor %o2,%o4,%o4 81 1.1 spz stx %o1,[%l0+6*8] ! tab[6]=a2^a4 82 1.1 spz xor %o5,%o0,%o0 83 1.1 spz stx %o4,[%l0+7*8] ! tab[7]=a1^a2^a4 84 1.1 spz xor %o5,%o1,%o1 85 1.1 spz 86 1.1 spz stx %o3,[%l0+8*8] ! tab[8]=a8 87 1.1 spz xor %o5,%o4,%o4 88 1.1 spz stx %o0,[%l0+9*8] ! tab[9]=a1^a8 89 1.1 spz xor %o2,%o0,%o0 90 1.1 spz stx %o1,[%l0+10*8] ! tab[10]=a2^a8 91 1.1 spz xor %o2,%o1,%o1 92 1.1 spz stx %o4,[%l0+11*8] ! tab[11]=a1^a2^a8 93 1.1 spz 94 1.1 spz xor %o2,%o4,%o4 95 1.1 spz stx %o5,[%l0+12*8] ! tab[12]=a4^a8 96 1.1 spz srlx %g1,1,%o3 97 1.1 spz stx %o0,[%l0+13*8] ! tab[13]=a1^a4^a8 98 1.1 spz sllx %g1,63,%g1 99 1.1 spz stx %o1,[%l0+14*8] ! tab[14]=a2^a4^a8 100 1.1 spz srlx %g4,2,%g2 101 1.1 spz stx %o4,[%l0+15*8] ! tab[15]=a1^a2^a4^a8 102 1.1 spz 103 1.1 spz sllx %g4,62,%o0 104 1.1 spz sllx %o7,3,%g4 105 1.1 spz srlx %g5,3,%g3 106 1.1 spz and %g4,120,%g4 107 1.1 spz sllx %g5,61,%o1 108 1.1 spz ldx [%l0+%g4],%g4 109 1.1 spz srlx %o7,4-3,%g5 110 1.1 spz xor %g2,%o3,%o3 111 1.1 spz and %g5,120,%g5 112 1.1 spz xor %o0,%g1,%g1 113 1.1 spz ldx [%l0+%g5],%g5 114 1.1 spz xor %g3,%o3,%o3 115 1.1 spz 116 1.1 spz xor %g4,%g1,%g1 117 1.1 spz srlx %o7,8-3,%g4 118 1.1 spz xor %o1,%g1,%g1 119 1.1 spz and %g4,120,%g4 120 1.1 spz sllx %g5,4,%g2 121 1.1 spz ldx [%l0+%g4],%g4 122 1.1 spz srlx %g5,60,%g3 123 1.1 spz xor %g2,%g1,%g1 124 1.1 spz srlx %o7,12-3,%g5 125 1.1 spz xor %g3,%o3,%o3 126 1.1 spz and %g5,120,%g5 127 1.1 spz sllx %g4,8,%g3 128 1.1 spz ldx [%l0+%g5],%g5 129 1.1 spz srlx %g4,56,%g2 130 1.1 spz xor %g3,%g1,%g1 131 1.1 spz srlx %o7,16-3,%g4 132 1.1 spz xor %g2,%o3,%o3 133 1.1 spz and %g4,120,%g4 134 1.1 spz sllx %g5,12,%g2 135 1.1 spz ldx [%l0+%g4],%g4 136 1.1 spz srlx %g5,52,%g3 137 1.1 spz xor %g2,%g1,%g1 138 1.1 spz srlx %o7,20-3,%g5 139 1.1 spz xor %g3,%o3,%o3 140 1.1 spz and %g5,120,%g5 141 1.1 spz sllx %g4,16,%g3 142 1.1 spz ldx [%l0+%g5],%g5 143 1.1 spz srlx %g4,48,%g2 144 1.1 spz xor %g3,%g1,%g1 145 1.1 spz srlx %o7,24-3,%g4 146 1.1 spz xor %g2,%o3,%o3 147 1.1 spz and %g4,120,%g4 148 1.1 spz sllx %g5,20,%g2 149 1.1 spz ldx [%l0+%g4],%g4 150 1.1 spz srlx %g5,44,%g3 151 1.1 spz xor %g2,%g1,%g1 152 1.1 spz srlx %o7,28-3,%g5 153 1.1 spz xor %g3,%o3,%o3 154 1.1 spz and %g5,120,%g5 155 1.1 spz sllx %g4,24,%g3 156 1.1 spz ldx [%l0+%g5],%g5 157 1.1 spz srlx %g4,40,%g2 158 1.1 spz xor %g3,%g1,%g1 159 1.1 spz srlx %o7,32-3,%g4 160 1.1 spz xor %g2,%o3,%o3 161 1.1 spz and %g4,120,%g4 162 1.1 spz sllx %g5,28,%g2 163 1.1 spz ldx [%l0+%g4],%g4 164 1.1 spz srlx %g5,36,%g3 165 1.1 spz xor %g2,%g1,%g1 166 1.1 spz srlx %o7,36-3,%g5 167 1.1 spz xor %g3,%o3,%o3 168 1.1 spz and %g5,120,%g5 169 1.1 spz sllx %g4,32,%g3 170 1.1 spz ldx [%l0+%g5],%g5 171 1.1 spz srlx %g4,32,%g2 172 1.1 spz xor %g3,%g1,%g1 173 1.1 spz srlx %o7,40-3,%g4 174 1.1 spz xor %g2,%o3,%o3 175 1.1 spz and %g4,120,%g4 176 1.1 spz sllx %g5,36,%g2 177 1.1 spz ldx [%l0+%g4],%g4 178 1.1 spz srlx %g5,28,%g3 179 1.1 spz xor %g2,%g1,%g1 180 1.1 spz srlx %o7,44-3,%g5 181 1.1 spz xor %g3,%o3,%o3 182 1.1 spz and %g5,120,%g5 183 1.1 spz sllx %g4,40,%g3 184 1.1 spz ldx [%l0+%g5],%g5 185 1.1 spz srlx %g4,24,%g2 186 1.1 spz xor %g3,%g1,%g1 187 1.1 spz srlx %o7,48-3,%g4 188 1.1 spz xor %g2,%o3,%o3 189 1.1 spz and %g4,120,%g4 190 1.1 spz sllx %g5,44,%g2 191 1.1 spz ldx [%l0+%g4],%g4 192 1.1 spz srlx %g5,20,%g3 193 1.1 spz xor %g2,%g1,%g1 194 1.1 spz srlx %o7,52-3,%g5 195 1.1 spz xor %g3,%o3,%o3 196 1.1 spz and %g5,120,%g5 197 1.1 spz sllx %g4,48,%g3 198 1.1 spz ldx [%l0+%g5],%g5 199 1.1 spz srlx %g4,16,%g2 200 1.1 spz xor %g3,%g1,%g1 201 1.1 spz srlx %o7,56-3,%g4 202 1.1 spz xor %g2,%o3,%o3 203 1.1 spz and %g4,120,%g4 204 1.1 spz sllx %g5,52,%g2 205 1.1 spz ldx [%l0+%g4],%g4 206 1.1 spz srlx %g5,12,%g3 207 1.1 spz xor %g2,%g1,%g1 208 1.1 spz srlx %o7,60-3,%g5 209 1.1 spz xor %g3,%o3,%o3 210 1.1 spz and %g5,120,%g5 211 1.1 spz sllx %g4,56,%g3 212 1.1 spz ldx [%l0+%g5],%g5 213 1.1 spz srlx %g4,8,%g2 214 1.1 spz xor %g3,%g1,%g1 215 1.1 spz 216 1.1 spz sllx %g5,60,%g3 217 1.1 spz xor %g2,%o3,%o3 218 1.1 spz srlx %g5,4,%g2 219 1.1 spz xor %g3,%g1,%g1 220 1.1 spz xor %g2,%o3,%o3 221 1.1 spz 222 1.1 spz srlx %g1,32,%i1 223 1.1 spz st %g1,[%i0+0] 224 1.1 spz st %i1,[%i0+4] 225 1.1 spz srlx %o3,32,%i2 226 1.1 spz st %o3,[%i0+8] 227 1.1 spz st %i2,[%i0+12] 228 1.1 spz 229 1.1 spz ret 230 1.1 spz restore 231 1.1 spz .type bn_GF2m_mul_2x2,#function 232 1.1 spz .size bn_GF2m_mul_2x2,.-bn_GF2m_mul_2x2 233 1.1 spz .asciz "GF(2^m) Multiplication for SPARCv9, CRYPTOGAMS by <appro (at) openssl.org>" 234 1.1 spz .align 4 235