1 1.1 christos #include "mips_arch.h" 2 1.1 christos 3 1.1 christos #ifdef MIPSEB 4 1.1 christos # define MSB 0 5 1.1 christos # define LSB 7 6 1.1 christos #else 7 1.1 christos # define MSB 7 8 1.1 christos # define LSB 0 9 1.1 christos #endif 10 1.1 christos 11 1.1 christos .text 12 1.1 christos .set noat 13 1.1 christos .set noreorder 14 1.1 christos 15 1.1 christos .align 5 16 1.1 christos .globl poly1305_init 17 1.1 christos .ent poly1305_init 18 1.1 christos poly1305_init: 19 1.1 christos .frame $29,0,$31 20 1.1 christos .set reorder 21 1.1 christos 22 1.1 christos sd $0,0($4) 23 1.1 christos sd $0,8($4) 24 1.1 christos sd $0,16($4) 25 1.1 christos 26 1.1 christos beqz $5,.Lno_key 27 1.1 christos 28 1.1 christos #if defined(_MIPS_ARCH_MIPS64R6) 29 1.1 christos ld $8,0($5) 30 1.1 christos ld $9,8($5) 31 1.1 christos #else 32 1.1 christos ldl $8,0+MSB($5) 33 1.1 christos ldl $9,8+MSB($5) 34 1.1 christos ldr $8,0+LSB($5) 35 1.1 christos ldr $9,8+LSB($5) 36 1.1 christos #endif 37 1.1 christos #ifdef MIPSEB 38 1.1 christos # if defined(_MIPS_ARCH_MIPS64R2) 39 1.1 christos dsbh $8,$8 # byte swap 40 1.1 christos dsbh $9,$9 41 1.1 christos dshd $8,$8 42 1.1 christos dshd $9,$9 43 1.1 christos # else 44 1.1 christos ori $10,$0,0xFF 45 1.1 christos dsll $1,$10,32 46 1.1 christos or $10,$1 # 0x000000FF000000FF 47 1.1 christos 48 1.1 christos and $11,$8,$10 # byte swap 49 1.1 christos and $2,$9,$10 50 1.1 christos dsrl $1,$8,24 51 1.1 christos dsrl $24,$9,24 52 1.1 christos dsll $11,24 53 1.1 christos dsll $2,24 54 1.1 christos and $1,$10 55 1.1 christos and $24,$10 56 1.1 christos dsll $10,8 # 0x0000FF000000FF00 57 1.1 christos or $11,$1 58 1.1 christos or $2,$24 59 1.1 christos and $1,$8,$10 60 1.1 christos and $24,$9,$10 61 1.1 christos dsrl $8,8 62 1.1 christos dsrl $9,8 63 1.1 christos dsll $1,8 64 1.1 christos dsll $24,8 65 1.1 christos and $8,$10 66 1.1 christos and $9,$10 67 1.1 christos or $11,$1 68 1.1 christos or $2,$24 69 1.1 christos or $8,$11 70 1.1 christos or $9,$2 71 1.1 christos dsrl $11,$8,32 72 1.1 christos dsrl $2,$9,32 73 1.1 christos dsll $8,32 74 1.1 christos dsll $9,32 75 1.1 christos or $8,$11 76 1.1 christos or $9,$2 77 1.1 christos # endif 78 1.1 christos #endif 79 1.1 christos li $10,1 80 1.1 christos dsll $10,32 81 1.1 christos daddiu $10,-63 82 1.1 christos dsll $10,28 83 1.1 christos daddiu $10,-1 # 0ffffffc0fffffff 84 1.1 christos 85 1.1 christos and $8,$10 86 1.1 christos daddiu $10,-3 # 0ffffffc0ffffffc 87 1.1 christos and $9,$10 88 1.1 christos 89 1.1 christos sd $8,24($4) 90 1.1 christos dsrl $10,$9,2 91 1.1 christos sd $9,32($4) 92 1.1 christos daddu $10,$9 # s1 = r1 + (r1 >> 2) 93 1.1 christos sd $10,40($4) 94 1.1 christos 95 1.1 christos .Lno_key: 96 1.1 christos li $2,0 # return 0 97 1.1 christos jr $31 98 1.1 christos .end poly1305_init 99 1.1 christos .align 5 100 1.1 christos .globl poly1305_blocks 101 1.1 christos .ent poly1305_blocks 102 1.1 christos poly1305_blocks: 103 1.1 christos .set noreorder 104 1.1 christos dsrl $6,4 # number of complete blocks 105 1.1 christos bnez $6,poly1305_blocks_internal 106 1.1 christos nop 107 1.1 christos jr $31 108 1.1 christos nop 109 1.1 christos .end poly1305_blocks 110 1.1 christos 111 1.1 christos .align 5 112 1.1 christos .ent poly1305_blocks_internal 113 1.1 christos poly1305_blocks_internal: 114 1.1 christos .frame $29,6*8,$31 115 1.1 christos .mask 0x00030000,-8 116 1.1 christos .set noreorder 117 1.1 christos dsubu $29,6*8 118 1.1 christos sd $17,40($29) 119 1.1 christos sd $16,32($29) 120 1.1 christos .set reorder 121 1.1 christos 122 1.1 christos ld $12,0($4) # load hash value 123 1.1 christos ld $13,8($4) 124 1.1 christos ld $14,16($4) 125 1.1 christos 126 1.1 christos ld $15,24($4) # load key 127 1.1 christos ld $16,32($4) 128 1.1 christos ld $17,40($4) 129 1.1 christos 130 1.1 christos .Loop: 131 1.1 christos #if defined(_MIPS_ARCH_MIPS64R6) 132 1.1 christos ld $8,0($5) # load input 133 1.1 christos ld $9,8($5) 134 1.1 christos #else 135 1.1 christos ldl $8,0+MSB($5) # load input 136 1.1 christos ldl $9,8+MSB($5) 137 1.1 christos ldr $8,0+LSB($5) 138 1.1 christos ldr $9,8+LSB($5) 139 1.1 christos #endif 140 1.1 christos daddiu $6,-1 141 1.1 christos daddiu $5,16 142 1.1 christos #ifdef MIPSEB 143 1.1 christos # if defined(_MIPS_ARCH_MIPS64R2) 144 1.1 christos dsbh $8,$8 # byte swap 145 1.1 christos dsbh $9,$9 146 1.1 christos dshd $8,$8 147 1.1 christos dshd $9,$9 148 1.1 christos # else 149 1.1 christos ori $10,$0,0xFF 150 1.1 christos dsll $1,$10,32 151 1.1 christos or $10,$1 # 0x000000FF000000FF 152 1.1 christos 153 1.1 christos and $11,$8,$10 # byte swap 154 1.1 christos and $2,$9,$10 155 1.1 christos dsrl $1,$8,24 156 1.1 christos dsrl $24,$9,24 157 1.1 christos dsll $11,24 158 1.1 christos dsll $2,24 159 1.1 christos and $1,$10 160 1.1 christos and $24,$10 161 1.1 christos dsll $10,8 # 0x0000FF000000FF00 162 1.1 christos or $11,$1 163 1.1 christos or $2,$24 164 1.1 christos and $1,$8,$10 165 1.1 christos and $24,$9,$10 166 1.1 christos dsrl $8,8 167 1.1 christos dsrl $9,8 168 1.1 christos dsll $1,8 169 1.1 christos dsll $24,8 170 1.1 christos and $8,$10 171 1.1 christos and $9,$10 172 1.1 christos or $11,$1 173 1.1 christos or $2,$24 174 1.1 christos or $8,$11 175 1.1 christos or $9,$2 176 1.1 christos dsrl $11,$8,32 177 1.1 christos dsrl $2,$9,32 178 1.1 christos dsll $8,32 179 1.1 christos dsll $9,32 180 1.1 christos or $8,$11 181 1.1 christos or $9,$2 182 1.1 christos # endif 183 1.1 christos #endif 184 1.1 christos daddu $12,$8 # accumulate input 185 1.1 christos daddu $13,$9 186 1.1 christos sltu $10,$12,$8 187 1.1 christos sltu $11,$13,$9 188 1.1 christos daddu $13,$10 189 1.1 christos 190 1.1 christos dmultu ($15,$12) # h0*r0 191 1.1 christos daddu $14,$7 192 1.1 christos sltu $10,$13,$10 193 1.1 christos mflo ($8,$15,$12) 194 1.1 christos mfhi ($9,$15,$12) 195 1.1 christos 196 1.1 christos dmultu ($17,$13) # h1*5*r1 197 1.1 christos daddu $10,$11 198 1.1 christos daddu $14,$10 199 1.1 christos mflo ($10,$17,$13) 200 1.1 christos mfhi ($11,$17,$13) 201 1.1 christos 202 1.1 christos dmultu ($16,$12) # h0*r1 203 1.1 christos daddu $8,$10 204 1.1 christos daddu $9,$11 205 1.1 christos mflo ($1,$16,$12) 206 1.1 christos mfhi ($25,$16,$12) 207 1.1 christos sltu $10,$8,$10 208 1.1 christos daddu $9,$10 209 1.1 christos 210 1.1 christos dmultu ($15,$13) # h1*r0 211 1.1 christos daddu $9,$1 212 1.1 christos sltu $1,$9,$1 213 1.1 christos mflo ($10,$15,$13) 214 1.1 christos mfhi ($11,$15,$13) 215 1.1 christos daddu $25,$1 216 1.1 christos 217 1.1 christos dmultu ($17,$14) # h2*5*r1 218 1.1 christos daddu $9,$10 219 1.1 christos daddu $25,$11 220 1.1 christos mflo ($1,$17,$14) 221 1.1 christos 222 1.1 christos dmultu ($15,$14) # h2*r0 223 1.1 christos sltu $10,$9,$10 224 1.1 christos daddu $25,$10 225 1.1 christos mflo ($2,$15,$14) 226 1.1 christos 227 1.1 christos daddu $9,$1 228 1.1 christos daddu $25,$2 229 1.1 christos sltu $1,$9,$1 230 1.1 christos daddu $25,$1 231 1.1 christos 232 1.1 christos li $10,-4 # final reduction 233 1.1 christos and $10,$25 234 1.1 christos dsrl $11,$25,2 235 1.1 christos andi $14,$25,3 236 1.1 christos daddu $10,$11 237 1.1 christos daddu $12,$8,$10 238 1.1 christos sltu $10,$12,$10 239 1.1 christos daddu $13,$9,$10 240 1.1 christos sltu $10,$13,$10 241 1.1 christos daddu $14,$14,$10 242 1.1 christos 243 1.1 christos bnez $6,.Loop 244 1.1 christos 245 1.1 christos sd $12,0($4) # store hash value 246 1.1 christos sd $13,8($4) 247 1.1 christos sd $14,16($4) 248 1.1 christos 249 1.1 christos .set noreorder 250 1.1 christos ld $17,40($29) # epilogue 251 1.1 christos ld $16,32($29) 252 1.1 christos jr $31 253 1.1 christos daddu $29,6*8 254 1.1 christos .end poly1305_blocks_internal 255 1.1 christos .align 5 256 1.1 christos .globl poly1305_emit 257 1.1 christos .ent poly1305_emit 258 1.1 christos poly1305_emit: 259 1.1 christos .frame $29,0,$31 260 1.1 christos .set reorder 261 1.1 christos 262 1.1 christos ld $10,0($4) 263 1.1 christos ld $11,8($4) 264 1.1 christos ld $1,16($4) 265 1.1 christos 266 1.1 christos daddiu $8,$10,5 # compare to modulus 267 1.1 christos sltiu $2,$8,5 268 1.1 christos daddu $9,$11,$2 269 1.1 christos sltu $2,$9,$2 270 1.1 christos daddu $1,$1,$2 271 1.1 christos 272 1.1 christos dsrl $1,2 # see if it carried/borrowed 273 1.1 christos dsubu $1,$0,$1 274 1.1 christos nor $2,$0,$1 275 1.1 christos 276 1.1 christos and $8,$1 277 1.1 christos and $10,$2 278 1.1 christos and $9,$1 279 1.1 christos and $11,$2 280 1.1 christos or $8,$10 281 1.1 christos or $9,$11 282 1.1 christos 283 1.1 christos lwu $10,0($6) # load nonce 284 1.1 christos lwu $11,4($6) 285 1.1 christos lwu $1,8($6) 286 1.1 christos lwu $2,12($6) 287 1.1 christos dsll $11,32 288 1.1 christos dsll $2,32 289 1.1 christos or $10,$11 290 1.1 christos or $1,$2 291 1.1 christos 292 1.1 christos daddu $8,$10 # accumulate nonce 293 1.1 christos daddu $9,$1 294 1.1 christos sltu $10,$8,$10 295 1.1 christos daddu $9,$10 296 1.1 christos 297 1.1 christos dsrl $10,$8,8 # write mac value 298 1.1 christos dsrl $11,$8,16 299 1.1 christos dsrl $1,$8,24 300 1.1 christos sb $8,0($5) 301 1.1 christos dsrl $2,$8,32 302 1.1 christos sb $10,1($5) 303 1.1 christos dsrl $10,$8,40 304 1.1 christos sb $11,2($5) 305 1.1 christos dsrl $11,$8,48 306 1.1 christos sb $1,3($5) 307 1.1 christos dsrl $1,$8,56 308 1.1 christos sb $2,4($5) 309 1.1 christos dsrl $2,$9,8 310 1.1 christos sb $10,5($5) 311 1.1 christos dsrl $10,$9,16 312 1.1 christos sb $11,6($5) 313 1.1 christos dsrl $11,$9,24 314 1.1 christos sb $1,7($5) 315 1.1 christos 316 1.1 christos sb $9,8($5) 317 1.1 christos dsrl $1,$9,32 318 1.1 christos sb $2,9($5) 319 1.1 christos dsrl $2,$9,40 320 1.1 christos sb $10,10($5) 321 1.1 christos dsrl $10,$9,48 322 1.1 christos sb $11,11($5) 323 1.1 christos dsrl $11,$9,56 324 1.1 christos sb $1,12($5) 325 1.1 christos sb $2,13($5) 326 1.1 christos sb $10,14($5) 327 1.1 christos sb $11,15($5) 328 1.1 christos 329 1.1 christos jr $31 330 1.1 christos .end poly1305_emit 331 1.1 christos .rdata 332 1.1 christos .asciiz "Poly1305 for MIPS64, CRYPTOGAMS by <appro (at) openssl.org>" 333 1.1 christos .align 2 334