1*4724848cSchristos#include <machine/asm.h> 2*4724848cSchristos.text 3*4724848cSchristos.globl ChaCha20_ctr32 4*4724848cSchristos.type ChaCha20_ctr32,@function 5*4724848cSchristos.align 16 6*4724848cSchristosChaCha20_ctr32: 7*4724848cSchristos.L_ChaCha20_ctr32_begin: 8*4724848cSchristos pushl %ebp 9*4724848cSchristos pushl %ebx 10*4724848cSchristos pushl %esi 11*4724848cSchristos pushl %edi 12*4724848cSchristos xorl %eax,%eax 13*4724848cSchristos cmpl 28(%esp),%eax 14*4724848cSchristos je .L000no_data 15*4724848cSchristos call .Lpic_point 16*4724848cSchristos.Lpic_point: 17*4724848cSchristos popl %eax 18*4724848cSchristos leal OPENSSL_ia32cap_P-.Lpic_point(%eax),%ebp 19*4724848cSchristos testl $16777216,(%ebp) 20*4724848cSchristos jz .L001x86 21*4724848cSchristos testl $512,4(%ebp) 22*4724848cSchristos jz .L001x86 23*4724848cSchristos jmp .Lssse3_shortcut 24*4724848cSchristos.L001x86: 25*4724848cSchristos movl 32(%esp),%esi 26*4724848cSchristos movl 36(%esp),%edi 27*4724848cSchristos subl $132,%esp 28*4724848cSchristos movl (%esi),%eax 29*4724848cSchristos movl 4(%esi),%ebx 30*4724848cSchristos movl 8(%esi),%ecx 31*4724848cSchristos movl 12(%esi),%edx 32*4724848cSchristos movl %eax,80(%esp) 33*4724848cSchristos movl %ebx,84(%esp) 34*4724848cSchristos movl %ecx,88(%esp) 35*4724848cSchristos movl %edx,92(%esp) 36*4724848cSchristos movl 16(%esi),%eax 37*4724848cSchristos movl 20(%esi),%ebx 38*4724848cSchristos movl 24(%esi),%ecx 39*4724848cSchristos movl 28(%esi),%edx 40*4724848cSchristos movl %eax,96(%esp) 41*4724848cSchristos movl %ebx,100(%esp) 42*4724848cSchristos movl %ecx,104(%esp) 43*4724848cSchristos movl %edx,108(%esp) 44*4724848cSchristos movl (%edi),%eax 45*4724848cSchristos movl 4(%edi),%ebx 46*4724848cSchristos movl 8(%edi),%ecx 47*4724848cSchristos movl 12(%edi),%edx 48*4724848cSchristos subl $1,%eax 49*4724848cSchristos movl %eax,112(%esp) 50*4724848cSchristos movl %ebx,116(%esp) 51*4724848cSchristos movl %ecx,120(%esp) 52*4724848cSchristos movl %edx,124(%esp) 53*4724848cSchristos jmp .L002entry 54*4724848cSchristos.align 16 55*4724848cSchristos.L003outer_loop: 56*4724848cSchristos movl %ebx,156(%esp) 57*4724848cSchristos movl %eax,152(%esp) 58*4724848cSchristos movl %ecx,160(%esp) 59*4724848cSchristos.L002entry: 60*4724848cSchristos movl $1634760805,%eax 61*4724848cSchristos movl $857760878,4(%esp) 62*4724848cSchristos movl $2036477234,8(%esp) 63*4724848cSchristos movl $1797285236,12(%esp) 64*4724848cSchristos movl 84(%esp),%ebx 65*4724848cSchristos movl 88(%esp),%ebp 66*4724848cSchristos movl 104(%esp),%ecx 67*4724848cSchristos movl 108(%esp),%esi 68*4724848cSchristos movl 116(%esp),%edx 69*4724848cSchristos movl 120(%esp),%edi 70*4724848cSchristos movl %ebx,20(%esp) 71*4724848cSchristos movl %ebp,24(%esp) 72*4724848cSchristos movl %ecx,40(%esp) 73*4724848cSchristos movl %esi,44(%esp) 74*4724848cSchristos movl %edx,52(%esp) 75*4724848cSchristos movl %edi,56(%esp) 76*4724848cSchristos movl 92(%esp),%ebx 77*4724848cSchristos movl 124(%esp),%edi 78*4724848cSchristos movl 112(%esp),%edx 79*4724848cSchristos movl 80(%esp),%ebp 80*4724848cSchristos movl 96(%esp),%ecx 81*4724848cSchristos movl 100(%esp),%esi 82*4724848cSchristos addl $1,%edx 83*4724848cSchristos movl %ebx,28(%esp) 84*4724848cSchristos movl %edi,60(%esp) 85*4724848cSchristos movl %edx,112(%esp) 86*4724848cSchristos movl $10,%ebx 87*4724848cSchristos jmp .L004loop 88*4724848cSchristos.align 16 89*4724848cSchristos.L004loop: 90*4724848cSchristos addl %ebp,%eax 91*4724848cSchristos movl %ebx,128(%esp) 92*4724848cSchristos movl %ebp,%ebx 93*4724848cSchristos xorl %eax,%edx 94*4724848cSchristos roll $16,%edx 95*4724848cSchristos addl %edx,%ecx 96*4724848cSchristos xorl %ecx,%ebx 97*4724848cSchristos movl 52(%esp),%edi 98*4724848cSchristos roll $12,%ebx 99*4724848cSchristos movl 20(%esp),%ebp 100*4724848cSchristos addl %ebx,%eax 101*4724848cSchristos xorl %eax,%edx 102*4724848cSchristos movl %eax,(%esp) 103*4724848cSchristos roll $8,%edx 104*4724848cSchristos movl 4(%esp),%eax 105*4724848cSchristos addl %edx,%ecx 106*4724848cSchristos movl %edx,48(%esp) 107*4724848cSchristos xorl %ecx,%ebx 108*4724848cSchristos addl %ebp,%eax 109*4724848cSchristos roll $7,%ebx 110*4724848cSchristos xorl %eax,%edi 111*4724848cSchristos movl %ecx,32(%esp) 112*4724848cSchristos roll $16,%edi 113*4724848cSchristos movl %ebx,16(%esp) 114*4724848cSchristos addl %edi,%esi 115*4724848cSchristos movl 40(%esp),%ecx 116*4724848cSchristos xorl %esi,%ebp 117*4724848cSchristos movl 56(%esp),%edx 118*4724848cSchristos roll $12,%ebp 119*4724848cSchristos movl 24(%esp),%ebx 120*4724848cSchristos addl %ebp,%eax 121*4724848cSchristos xorl %eax,%edi 122*4724848cSchristos movl %eax,4(%esp) 123*4724848cSchristos roll $8,%edi 124*4724848cSchristos movl 8(%esp),%eax 125*4724848cSchristos addl %edi,%esi 126*4724848cSchristos movl %edi,52(%esp) 127*4724848cSchristos xorl %esi,%ebp 128*4724848cSchristos addl %ebx,%eax 129*4724848cSchristos roll $7,%ebp 130*4724848cSchristos xorl %eax,%edx 131*4724848cSchristos movl %esi,36(%esp) 132*4724848cSchristos roll $16,%edx 133*4724848cSchristos movl %ebp,20(%esp) 134*4724848cSchristos addl %edx,%ecx 135*4724848cSchristos movl 44(%esp),%esi 136*4724848cSchristos xorl %ecx,%ebx 137*4724848cSchristos movl 60(%esp),%edi 138*4724848cSchristos roll $12,%ebx 139*4724848cSchristos movl 28(%esp),%ebp 140*4724848cSchristos addl %ebx,%eax 141*4724848cSchristos xorl %eax,%edx 142*4724848cSchristos movl %eax,8(%esp) 143*4724848cSchristos roll $8,%edx 144*4724848cSchristos movl 12(%esp),%eax 145*4724848cSchristos addl %edx,%ecx 146*4724848cSchristos movl %edx,56(%esp) 147*4724848cSchristos xorl %ecx,%ebx 148*4724848cSchristos addl %ebp,%eax 149*4724848cSchristos roll $7,%ebx 150*4724848cSchristos xorl %eax,%edi 151*4724848cSchristos roll $16,%edi 152*4724848cSchristos movl %ebx,24(%esp) 153*4724848cSchristos addl %edi,%esi 154*4724848cSchristos xorl %esi,%ebp 155*4724848cSchristos roll $12,%ebp 156*4724848cSchristos movl 20(%esp),%ebx 157*4724848cSchristos addl %ebp,%eax 158*4724848cSchristos xorl %eax,%edi 159*4724848cSchristos movl %eax,12(%esp) 160*4724848cSchristos roll $8,%edi 161*4724848cSchristos movl (%esp),%eax 162*4724848cSchristos addl %edi,%esi 163*4724848cSchristos movl %edi,%edx 164*4724848cSchristos xorl %esi,%ebp 165*4724848cSchristos addl %ebx,%eax 166*4724848cSchristos roll $7,%ebp 167*4724848cSchristos xorl %eax,%edx 168*4724848cSchristos roll $16,%edx 169*4724848cSchristos movl %ebp,28(%esp) 170*4724848cSchristos addl %edx,%ecx 171*4724848cSchristos xorl %ecx,%ebx 172*4724848cSchristos movl 48(%esp),%edi 173*4724848cSchristos roll $12,%ebx 174*4724848cSchristos movl 24(%esp),%ebp 175*4724848cSchristos addl %ebx,%eax 176*4724848cSchristos xorl %eax,%edx 177*4724848cSchristos movl %eax,(%esp) 178*4724848cSchristos roll $8,%edx 179*4724848cSchristos movl 4(%esp),%eax 180*4724848cSchristos addl %edx,%ecx 181*4724848cSchristos movl %edx,60(%esp) 182*4724848cSchristos xorl %ecx,%ebx 183*4724848cSchristos addl %ebp,%eax 184*4724848cSchristos roll $7,%ebx 185*4724848cSchristos xorl %eax,%edi 186*4724848cSchristos movl %ecx,40(%esp) 187*4724848cSchristos roll $16,%edi 188*4724848cSchristos movl %ebx,20(%esp) 189*4724848cSchristos addl %edi,%esi 190*4724848cSchristos movl 32(%esp),%ecx 191*4724848cSchristos xorl %esi,%ebp 192*4724848cSchristos movl 52(%esp),%edx 193*4724848cSchristos roll $12,%ebp 194*4724848cSchristos movl 28(%esp),%ebx 195*4724848cSchristos addl %ebp,%eax 196*4724848cSchristos xorl %eax,%edi 197*4724848cSchristos movl %eax,4(%esp) 198*4724848cSchristos roll $8,%edi 199*4724848cSchristos movl 8(%esp),%eax 200*4724848cSchristos addl %edi,%esi 201*4724848cSchristos movl %edi,48(%esp) 202*4724848cSchristos xorl %esi,%ebp 203*4724848cSchristos addl %ebx,%eax 204*4724848cSchristos roll $7,%ebp 205*4724848cSchristos xorl %eax,%edx 206*4724848cSchristos movl %esi,44(%esp) 207*4724848cSchristos roll $16,%edx 208*4724848cSchristos movl %ebp,24(%esp) 209*4724848cSchristos addl %edx,%ecx 210*4724848cSchristos movl 36(%esp),%esi 211*4724848cSchristos xorl %ecx,%ebx 212*4724848cSchristos movl 56(%esp),%edi 213*4724848cSchristos roll $12,%ebx 214*4724848cSchristos movl 16(%esp),%ebp 215*4724848cSchristos addl %ebx,%eax 216*4724848cSchristos xorl %eax,%edx 217*4724848cSchristos movl %eax,8(%esp) 218*4724848cSchristos roll $8,%edx 219*4724848cSchristos movl 12(%esp),%eax 220*4724848cSchristos addl %edx,%ecx 221*4724848cSchristos movl %edx,52(%esp) 222*4724848cSchristos xorl %ecx,%ebx 223*4724848cSchristos addl %ebp,%eax 224*4724848cSchristos roll $7,%ebx 225*4724848cSchristos xorl %eax,%edi 226*4724848cSchristos roll $16,%edi 227*4724848cSchristos movl %ebx,28(%esp) 228*4724848cSchristos addl %edi,%esi 229*4724848cSchristos xorl %esi,%ebp 230*4724848cSchristos movl 48(%esp),%edx 231*4724848cSchristos roll $12,%ebp 232*4724848cSchristos movl 128(%esp),%ebx 233*4724848cSchristos addl %ebp,%eax 234*4724848cSchristos xorl %eax,%edi 235*4724848cSchristos movl %eax,12(%esp) 236*4724848cSchristos roll $8,%edi 237*4724848cSchristos movl (%esp),%eax 238*4724848cSchristos addl %edi,%esi 239*4724848cSchristos movl %edi,56(%esp) 240*4724848cSchristos xorl %esi,%ebp 241*4724848cSchristos roll $7,%ebp 242*4724848cSchristos decl %ebx 243*4724848cSchristos jnz .L004loop 244*4724848cSchristos movl 160(%esp),%ebx 245*4724848cSchristos addl $1634760805,%eax 246*4724848cSchristos addl 80(%esp),%ebp 247*4724848cSchristos addl 96(%esp),%ecx 248*4724848cSchristos addl 100(%esp),%esi 249*4724848cSchristos cmpl $64,%ebx 250*4724848cSchristos jb .L005tail 251*4724848cSchristos movl 156(%esp),%ebx 252*4724848cSchristos addl 112(%esp),%edx 253*4724848cSchristos addl 120(%esp),%edi 254*4724848cSchristos xorl (%ebx),%eax 255*4724848cSchristos xorl 16(%ebx),%ebp 256*4724848cSchristos movl %eax,(%esp) 257*4724848cSchristos movl 152(%esp),%eax 258*4724848cSchristos xorl 32(%ebx),%ecx 259*4724848cSchristos xorl 36(%ebx),%esi 260*4724848cSchristos xorl 48(%ebx),%edx 261*4724848cSchristos xorl 56(%ebx),%edi 262*4724848cSchristos movl %ebp,16(%eax) 263*4724848cSchristos movl %ecx,32(%eax) 264*4724848cSchristos movl %esi,36(%eax) 265*4724848cSchristos movl %edx,48(%eax) 266*4724848cSchristos movl %edi,56(%eax) 267*4724848cSchristos movl 4(%esp),%ebp 268*4724848cSchristos movl 8(%esp),%ecx 269*4724848cSchristos movl 12(%esp),%esi 270*4724848cSchristos movl 20(%esp),%edx 271*4724848cSchristos movl 24(%esp),%edi 272*4724848cSchristos addl $857760878,%ebp 273*4724848cSchristos addl $2036477234,%ecx 274*4724848cSchristos addl $1797285236,%esi 275*4724848cSchristos addl 84(%esp),%edx 276*4724848cSchristos addl 88(%esp),%edi 277*4724848cSchristos xorl 4(%ebx),%ebp 278*4724848cSchristos xorl 8(%ebx),%ecx 279*4724848cSchristos xorl 12(%ebx),%esi 280*4724848cSchristos xorl 20(%ebx),%edx 281*4724848cSchristos xorl 24(%ebx),%edi 282*4724848cSchristos movl %ebp,4(%eax) 283*4724848cSchristos movl %ecx,8(%eax) 284*4724848cSchristos movl %esi,12(%eax) 285*4724848cSchristos movl %edx,20(%eax) 286*4724848cSchristos movl %edi,24(%eax) 287*4724848cSchristos movl 28(%esp),%ebp 288*4724848cSchristos movl 40(%esp),%ecx 289*4724848cSchristos movl 44(%esp),%esi 290*4724848cSchristos movl 52(%esp),%edx 291*4724848cSchristos movl 60(%esp),%edi 292*4724848cSchristos addl 92(%esp),%ebp 293*4724848cSchristos addl 104(%esp),%ecx 294*4724848cSchristos addl 108(%esp),%esi 295*4724848cSchristos addl 116(%esp),%edx 296*4724848cSchristos addl 124(%esp),%edi 297*4724848cSchristos xorl 28(%ebx),%ebp 298*4724848cSchristos xorl 40(%ebx),%ecx 299*4724848cSchristos xorl 44(%ebx),%esi 300*4724848cSchristos xorl 52(%ebx),%edx 301*4724848cSchristos xorl 60(%ebx),%edi 302*4724848cSchristos leal 64(%ebx),%ebx 303*4724848cSchristos movl %ebp,28(%eax) 304*4724848cSchristos movl (%esp),%ebp 305*4724848cSchristos movl %ecx,40(%eax) 306*4724848cSchristos movl 160(%esp),%ecx 307*4724848cSchristos movl %esi,44(%eax) 308*4724848cSchristos movl %edx,52(%eax) 309*4724848cSchristos movl %edi,60(%eax) 310*4724848cSchristos movl %ebp,(%eax) 311*4724848cSchristos leal 64(%eax),%eax 312*4724848cSchristos subl $64,%ecx 313*4724848cSchristos jnz .L003outer_loop 314*4724848cSchristos jmp .L006done 315*4724848cSchristos.L005tail: 316*4724848cSchristos addl 112(%esp),%edx 317*4724848cSchristos addl 120(%esp),%edi 318*4724848cSchristos movl %eax,(%esp) 319*4724848cSchristos movl %ebp,16(%esp) 320*4724848cSchristos movl %ecx,32(%esp) 321*4724848cSchristos movl %esi,36(%esp) 322*4724848cSchristos movl %edx,48(%esp) 323*4724848cSchristos movl %edi,56(%esp) 324*4724848cSchristos movl 4(%esp),%ebp 325*4724848cSchristos movl 8(%esp),%ecx 326*4724848cSchristos movl 12(%esp),%esi 327*4724848cSchristos movl 20(%esp),%edx 328*4724848cSchristos movl 24(%esp),%edi 329*4724848cSchristos addl $857760878,%ebp 330*4724848cSchristos addl $2036477234,%ecx 331*4724848cSchristos addl $1797285236,%esi 332*4724848cSchristos addl 84(%esp),%edx 333*4724848cSchristos addl 88(%esp),%edi 334*4724848cSchristos movl %ebp,4(%esp) 335*4724848cSchristos movl %ecx,8(%esp) 336*4724848cSchristos movl %esi,12(%esp) 337*4724848cSchristos movl %edx,20(%esp) 338*4724848cSchristos movl %edi,24(%esp) 339*4724848cSchristos movl 28(%esp),%ebp 340*4724848cSchristos movl 40(%esp),%ecx 341*4724848cSchristos movl 44(%esp),%esi 342*4724848cSchristos movl 52(%esp),%edx 343*4724848cSchristos movl 60(%esp),%edi 344*4724848cSchristos addl 92(%esp),%ebp 345*4724848cSchristos addl 104(%esp),%ecx 346*4724848cSchristos addl 108(%esp),%esi 347*4724848cSchristos addl 116(%esp),%edx 348*4724848cSchristos addl 124(%esp),%edi 349*4724848cSchristos movl %ebp,28(%esp) 350*4724848cSchristos movl 156(%esp),%ebp 351*4724848cSchristos movl %ecx,40(%esp) 352*4724848cSchristos movl 152(%esp),%ecx 353*4724848cSchristos movl %esi,44(%esp) 354*4724848cSchristos xorl %esi,%esi 355*4724848cSchristos movl %edx,52(%esp) 356*4724848cSchristos movl %edi,60(%esp) 357*4724848cSchristos xorl %eax,%eax 358*4724848cSchristos xorl %edx,%edx 359*4724848cSchristos.L007tail_loop: 360*4724848cSchristos movb (%esi,%ebp,1),%al 361*4724848cSchristos movb (%esp,%esi,1),%dl 362*4724848cSchristos leal 1(%esi),%esi 363*4724848cSchristos xorb %dl,%al 364*4724848cSchristos movb %al,-1(%ecx,%esi,1) 365*4724848cSchristos decl %ebx 366*4724848cSchristos jnz .L007tail_loop 367*4724848cSchristos.L006done: 368*4724848cSchristos addl $132,%esp 369*4724848cSchristos.L000no_data: 370*4724848cSchristos popl %edi 371*4724848cSchristos popl %esi 372*4724848cSchristos popl %ebx 373*4724848cSchristos popl %ebp 374*4724848cSchristos ret 375*4724848cSchristos.size ChaCha20_ctr32,.-.L_ChaCha20_ctr32_begin 376*4724848cSchristos.globl ChaCha20_ssse3 377*4724848cSchristos.type ChaCha20_ssse3,@function 378*4724848cSchristos.align 16 379*4724848cSchristosChaCha20_ssse3: 380*4724848cSchristos.L_ChaCha20_ssse3_begin: 381*4724848cSchristos pushl %ebp 382*4724848cSchristos pushl %ebx 383*4724848cSchristos pushl %esi 384*4724848cSchristos pushl %edi 385*4724848cSchristos.Lssse3_shortcut: 386*4724848cSchristos movl 20(%esp),%edi 387*4724848cSchristos movl 24(%esp),%esi 388*4724848cSchristos movl 28(%esp),%ecx 389*4724848cSchristos movl 32(%esp),%edx 390*4724848cSchristos movl 36(%esp),%ebx 391*4724848cSchristos movl %esp,%ebp 392*4724848cSchristos subl $524,%esp 393*4724848cSchristos andl $-64,%esp 394*4724848cSchristos movl %ebp,512(%esp) 395*4724848cSchristos leal .Lssse3_data-.Lpic_point(%eax),%eax 396*4724848cSchristos movdqu (%ebx),%xmm3 397*4724848cSchristos.L0081x: 398*4724848cSchristos movdqa 32(%eax),%xmm0 399*4724848cSchristos movdqu (%edx),%xmm1 400*4724848cSchristos movdqu 16(%edx),%xmm2 401*4724848cSchristos movdqa (%eax),%xmm6 402*4724848cSchristos movdqa 16(%eax),%xmm7 403*4724848cSchristos movl %ebp,48(%esp) 404*4724848cSchristos movdqa %xmm0,(%esp) 405*4724848cSchristos movdqa %xmm1,16(%esp) 406*4724848cSchristos movdqa %xmm2,32(%esp) 407*4724848cSchristos movdqa %xmm3,48(%esp) 408*4724848cSchristos movl $10,%edx 409*4724848cSchristos jmp .L009loop1x 410*4724848cSchristos.align 16 411*4724848cSchristos.L010outer1x: 412*4724848cSchristos movdqa 80(%eax),%xmm3 413*4724848cSchristos movdqa (%esp),%xmm0 414*4724848cSchristos movdqa 16(%esp),%xmm1 415*4724848cSchristos movdqa 32(%esp),%xmm2 416*4724848cSchristos paddd 48(%esp),%xmm3 417*4724848cSchristos movl $10,%edx 418*4724848cSchristos movdqa %xmm3,48(%esp) 419*4724848cSchristos jmp .L009loop1x 420*4724848cSchristos.align 16 421*4724848cSchristos.L009loop1x: 422*4724848cSchristos paddd %xmm1,%xmm0 423*4724848cSchristos pxor %xmm0,%xmm3 424*4724848cSchristos.byte 102,15,56,0,222 425*4724848cSchristos paddd %xmm3,%xmm2 426*4724848cSchristos pxor %xmm2,%xmm1 427*4724848cSchristos movdqa %xmm1,%xmm4 428*4724848cSchristos psrld $20,%xmm1 429*4724848cSchristos pslld $12,%xmm4 430*4724848cSchristos por %xmm4,%xmm1 431*4724848cSchristos paddd %xmm1,%xmm0 432*4724848cSchristos pxor %xmm0,%xmm3 433*4724848cSchristos.byte 102,15,56,0,223 434*4724848cSchristos paddd %xmm3,%xmm2 435*4724848cSchristos pxor %xmm2,%xmm1 436*4724848cSchristos movdqa %xmm1,%xmm4 437*4724848cSchristos psrld $25,%xmm1 438*4724848cSchristos pslld $7,%xmm4 439*4724848cSchristos por %xmm4,%xmm1 440*4724848cSchristos pshufd $78,%xmm2,%xmm2 441*4724848cSchristos pshufd $57,%xmm1,%xmm1 442*4724848cSchristos pshufd $147,%xmm3,%xmm3 443*4724848cSchristos nop 444*4724848cSchristos paddd %xmm1,%xmm0 445*4724848cSchristos pxor %xmm0,%xmm3 446*4724848cSchristos.byte 102,15,56,0,222 447*4724848cSchristos paddd %xmm3,%xmm2 448*4724848cSchristos pxor %xmm2,%xmm1 449*4724848cSchristos movdqa %xmm1,%xmm4 450*4724848cSchristos psrld $20,%xmm1 451*4724848cSchristos pslld $12,%xmm4 452*4724848cSchristos por %xmm4,%xmm1 453*4724848cSchristos paddd %xmm1,%xmm0 454*4724848cSchristos pxor %xmm0,%xmm3 455*4724848cSchristos.byte 102,15,56,0,223 456*4724848cSchristos paddd %xmm3,%xmm2 457*4724848cSchristos pxor %xmm2,%xmm1 458*4724848cSchristos movdqa %xmm1,%xmm4 459*4724848cSchristos psrld $25,%xmm1 460*4724848cSchristos pslld $7,%xmm4 461*4724848cSchristos por %xmm4,%xmm1 462*4724848cSchristos pshufd $78,%xmm2,%xmm2 463*4724848cSchristos pshufd $147,%xmm1,%xmm1 464*4724848cSchristos pshufd $57,%xmm3,%xmm3 465*4724848cSchristos decl %edx 466*4724848cSchristos jnz .L009loop1x 467*4724848cSchristos paddd (%esp),%xmm0 468*4724848cSchristos paddd 16(%esp),%xmm1 469*4724848cSchristos paddd 32(%esp),%xmm2 470*4724848cSchristos paddd 48(%esp),%xmm3 471*4724848cSchristos cmpl $64,%ecx 472*4724848cSchristos jb .L011tail 473*4724848cSchristos movdqu (%esi),%xmm4 474*4724848cSchristos movdqu 16(%esi),%xmm5 475*4724848cSchristos pxor %xmm4,%xmm0 476*4724848cSchristos movdqu 32(%esi),%xmm4 477*4724848cSchristos pxor %xmm5,%xmm1 478*4724848cSchristos movdqu 48(%esi),%xmm5 479*4724848cSchristos pxor %xmm4,%xmm2 480*4724848cSchristos pxor %xmm5,%xmm3 481*4724848cSchristos leal 64(%esi),%esi 482*4724848cSchristos movdqu %xmm0,(%edi) 483*4724848cSchristos movdqu %xmm1,16(%edi) 484*4724848cSchristos movdqu %xmm2,32(%edi) 485*4724848cSchristos movdqu %xmm3,48(%edi) 486*4724848cSchristos leal 64(%edi),%edi 487*4724848cSchristos subl $64,%ecx 488*4724848cSchristos jnz .L010outer1x 489*4724848cSchristos jmp .L012done 490*4724848cSchristos.L011tail: 491*4724848cSchristos movdqa %xmm0,(%esp) 492*4724848cSchristos movdqa %xmm1,16(%esp) 493*4724848cSchristos movdqa %xmm2,32(%esp) 494*4724848cSchristos movdqa %xmm3,48(%esp) 495*4724848cSchristos xorl %eax,%eax 496*4724848cSchristos xorl %edx,%edx 497*4724848cSchristos xorl %ebp,%ebp 498*4724848cSchristos.L013tail_loop: 499*4724848cSchristos movb (%esp,%ebp,1),%al 500*4724848cSchristos movb (%esi,%ebp,1),%dl 501*4724848cSchristos leal 1(%ebp),%ebp 502*4724848cSchristos xorb %dl,%al 503*4724848cSchristos movb %al,-1(%edi,%ebp,1) 504*4724848cSchristos decl %ecx 505*4724848cSchristos jnz .L013tail_loop 506*4724848cSchristos.L012done: 507*4724848cSchristos movl 512(%esp),%esp 508*4724848cSchristos popl %edi 509*4724848cSchristos popl %esi 510*4724848cSchristos popl %ebx 511*4724848cSchristos popl %ebp 512*4724848cSchristos ret 513*4724848cSchristos.size ChaCha20_ssse3,.-.L_ChaCha20_ssse3_begin 514*4724848cSchristos.align 64 515*4724848cSchristos.Lssse3_data: 516*4724848cSchristos.byte 2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13 517*4724848cSchristos.byte 3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14 518*4724848cSchristos.long 1634760805,857760878,2036477234,1797285236 519*4724848cSchristos.long 0,1,2,3 520*4724848cSchristos.long 4,4,4,4 521*4724848cSchristos.long 1,0,0,0 522*4724848cSchristos.long 4,0,0,0 523*4724848cSchristos.long 0,-1,-1,-1 524*4724848cSchristos.align 64 525*4724848cSchristos.byte 67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54 526*4724848cSchristos.byte 44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32 527*4724848cSchristos.byte 60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111 528*4724848cSchristos.byte 114,103,62,0 529*4724848cSchristos.comm OPENSSL_ia32cap_P,16,4 530