1/* chacha_asm 2 * 3 * Copyright (C) 2006-2021 wolfSSL Inc. 4 * 5 * This file is part of wolfSSL. 6 * 7 * wolfSSL is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * wolfSSL is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA 20 */ 21 22#ifndef HAVE_INTEL_AVX1 23#define HAVE_INTEL_AVX1 24#endif /* HAVE_INTEL_AVX1 */ 25#ifndef NO_AVX2_SUPPORT 26#define HAVE_INTEL_AVX2 27#endif /* NO_AVX2_SUPPORT */ 28 29#ifndef __APPLE__ 30.text 31.globl chacha_encrypt_x64 32.type chacha_encrypt_x64,@function 33.align 16 34chacha_encrypt_x64: 35#else 36.section __TEXT,__text 37.globl _chacha_encrypt_x64 38.p2align 4 39_chacha_encrypt_x64: 40#endif /* __APPLE__ */ 41 pushq %rbx 42 pushq %rbp 43 pushq %r12 44 pushq %r13 45 pushq %r14 46 pushq %r15 47 subq $0x40, %rsp 48 cmpl $0x40, %ecx 49 jl L_chacha_x64_small 50L_chacha_x64_start: 51 subq $48, %rsp 52 movq %rdx, 24(%rsp) 53 movq %rsi, 32(%rsp) 54 movq %rcx, 40(%rsp) 55 movq 32(%rdi), %rax 56 movq 40(%rdi), %rbx 57 movq %rax, 8(%rsp) 58 movq %rbx, 16(%rsp) 59 movl (%rdi), %eax 60 movl 4(%rdi), %ebx 61 movl 8(%rdi), %ecx 62 movl 12(%rdi), %edx 63 movl 16(%rdi), %r8d 64 movl 20(%rdi), %r9d 65 movl 24(%rdi), %r10d 66 movl 28(%rdi), %r11d 67 movl 48(%rdi), %r12d 68 movl 52(%rdi), %r13d 69 movl 56(%rdi), %r14d 70 movl 60(%rdi), %r15d 71 movb $10, (%rsp) 72 movl 8(%rsp), %esi 73 movl 12(%rsp), %ebp 74L_chacha_x64_block_crypt_start: 75 addl %r8d, %eax 76 addl %r9d, %ebx 77 xorl %eax, %r12d 78 xorl %ebx, %r13d 79 roll $16, %r12d 80 roll $16, %r13d 81 addl %r12d, %esi 82 addl %r13d, %ebp 83 xorl %esi, %r8d 84 xorl %ebp, %r9d 85 roll $12, %r8d 86 roll $12, %r9d 87 addl %r8d, %eax 88 addl %r9d, %ebx 89 xorl %eax, %r12d 90 xorl %ebx, %r13d 91 roll $8, %r12d 92 roll $8, %r13d 93 addl %r12d, %esi 94 addl %r13d, %ebp 95 xorl %esi, %r8d 96 xorl %ebp, %r9d 97 roll $7, %r8d 98 roll $7, %r9d 99 movl %esi, 8(%rsp) 100 movl %ebp, 12(%rsp) 101 movl 16(%rsp), %esi 102 movl 20(%rsp), %ebp 103 addl %r10d, %ecx 104 addl %r11d, %edx 105 xorl %ecx, %r14d 106 xorl %edx, %r15d 107 roll $16, %r14d 108 roll $16, %r15d 109 addl %r14d, %esi 110 addl %r15d, %ebp 111 xorl %esi, %r10d 112 xorl %ebp, %r11d 113 roll $12, %r10d 114 roll $12, %r11d 115 addl %r10d, %ecx 116 addl %r11d, %edx 117 xorl %ecx, %r14d 118 xorl %edx, %r15d 119 roll $8, %r14d 120 roll $8, %r15d 121 addl %r14d, %esi 122 addl %r15d, %ebp 123 xorl %esi, %r10d 124 xorl %ebp, %r11d 125 roll $7, %r10d 126 roll $7, %r11d 127 addl %r9d, %eax 128 addl %r10d, %ebx 129 xorl %eax, %r15d 130 xorl %ebx, %r12d 131 roll $16, %r15d 132 roll $16, %r12d 133 addl %r15d, %esi 134 addl %r12d, %ebp 135 xorl %esi, %r9d 136 xorl %ebp, %r10d 137 roll $12, %r9d 138 roll $12, %r10d 139 addl %r9d, %eax 140 addl %r10d, %ebx 141 xorl %eax, %r15d 142 xorl %ebx, %r12d 143 roll $8, %r15d 144 roll $8, %r12d 145 addl %r15d, %esi 146 addl %r12d, %ebp 147 xorl %esi, %r9d 148 xorl %ebp, %r10d 149 roll $7, %r9d 150 roll $7, %r10d 151 movl %esi, 16(%rsp) 152 movl %ebp, 20(%rsp) 153 movl 8(%rsp), %esi 154 movl 12(%rsp), %ebp 155 addl %r11d, %ecx 156 addl %r8d, %edx 157 xorl %ecx, %r13d 158 xorl %edx, %r14d 159 roll $16, %r13d 160 roll $16, %r14d 161 addl %r13d, %esi 162 addl %r14d, %ebp 163 xorl %esi, %r11d 164 xorl %ebp, %r8d 165 roll $12, %r11d 166 roll $12, %r8d 167 addl %r11d, %ecx 168 addl %r8d, %edx 169 xorl %ecx, %r13d 170 xorl %edx, %r14d 171 roll $8, %r13d 172 roll $8, %r14d 173 addl %r13d, %esi 174 addl %r14d, %ebp 175 xorl %esi, %r11d 176 xorl %ebp, %r8d 177 roll $7, %r11d 178 roll $7, %r8d 179 decb (%rsp) 180 jnz L_chacha_x64_block_crypt_start 181 movl %esi, 8(%rsp) 182 movl %ebp, 12(%rsp) 183 movq 32(%rsp), %rsi 184 movq 24(%rsp), %rbp 185 addl (%rdi), %eax 186 addl 4(%rdi), %ebx 187 addl 8(%rdi), %ecx 188 addl 12(%rdi), %edx 189 addl 16(%rdi), %r8d 190 addl 20(%rdi), %r9d 191 addl 24(%rdi), %r10d 192 addl 28(%rdi), %r11d 193 addl 48(%rdi), %r12d 194 addl 52(%rdi), %r13d 195 addl 56(%rdi), %r14d 196 addl 60(%rdi), %r15d 197 xorl (%rsi), %eax 198 xorl 4(%rsi), %ebx 199 xorl 8(%rsi), %ecx 200 xorl 12(%rsi), %edx 201 xorl 16(%rsi), %r8d 202 xorl 20(%rsi), %r9d 203 xorl 24(%rsi), %r10d 204 xorl 28(%rsi), %r11d 205 xorl 48(%rsi), %r12d 206 xorl 52(%rsi), %r13d 207 xorl 56(%rsi), %r14d 208 xorl 60(%rsi), %r15d 209 movl %eax, (%rbp) 210 movl %ebx, 4(%rbp) 211 movl %ecx, 8(%rbp) 212 movl %edx, 12(%rbp) 213 movl %r8d, 16(%rbp) 214 movl %r9d, 20(%rbp) 215 movl %r10d, 24(%rbp) 216 movl %r11d, 28(%rbp) 217 movl %r12d, 48(%rbp) 218 movl %r13d, 52(%rbp) 219 movl %r14d, 56(%rbp) 220 movl %r15d, 60(%rbp) 221 movl 8(%rsp), %eax 222 movl 12(%rsp), %ebx 223 movl 16(%rsp), %ecx 224 movl 20(%rsp), %edx 225 addl 32(%rdi), %eax 226 addl 36(%rdi), %ebx 227 addl 40(%rdi), %ecx 228 addl 44(%rdi), %edx 229 xorl 32(%rsi), %eax 230 xorl 36(%rsi), %ebx 231 xorl 40(%rsi), %ecx 232 xorl 44(%rsi), %edx 233 movl %eax, 32(%rbp) 234 movl %ebx, 36(%rbp) 235 movl %ecx, 40(%rbp) 236 movl %edx, 44(%rbp) 237 movq 24(%rsp), %rdx 238 movq 40(%rsp), %rcx 239 addl $0x01, 48(%rdi) 240 addq $48, %rsp 241 subl $0x40, %ecx 242 addq $0x40, %rsi 243 addq $0x40, %rdx 244 cmpl $0x40, %ecx 245 jge L_chacha_x64_start 246L_chacha_x64_small: 247 cmpl $0x00, %ecx 248 je L_chacha_x64_done 249 subq $48, %rsp 250 movq %rdx, 24(%rsp) 251 movq %rsi, 32(%rsp) 252 movq %rcx, 40(%rsp) 253 movq 32(%rdi), %rax 254 movq 40(%rdi), %rbx 255 movq %rax, 8(%rsp) 256 movq %rbx, 16(%rsp) 257 movl (%rdi), %eax 258 movl 4(%rdi), %ebx 259 movl 8(%rdi), %ecx 260 movl 12(%rdi), %edx 261 movl 16(%rdi), %r8d 262 movl 20(%rdi), %r9d 263 movl 24(%rdi), %r10d 264 movl 28(%rdi), %r11d 265 movl 48(%rdi), %r12d 266 movl 52(%rdi), %r13d 267 movl 56(%rdi), %r14d 268 movl 60(%rdi), %r15d 269 movb $10, (%rsp) 270 movl 8(%rsp), %esi 271 movl 12(%rsp), %ebp 272L_chacha_x64_partial_crypt_start: 273 addl %r8d, %eax 274 addl %r9d, %ebx 275 xorl %eax, %r12d 276 xorl %ebx, %r13d 277 roll $16, %r12d 278 roll $16, %r13d 279 addl %r12d, %esi 280 addl %r13d, %ebp 281 xorl %esi, %r8d 282 xorl %ebp, %r9d 283 roll $12, %r8d 284 roll $12, %r9d 285 addl %r8d, %eax 286 addl %r9d, %ebx 287 xorl %eax, %r12d 288 xorl %ebx, %r13d 289 roll $8, %r12d 290 roll $8, %r13d 291 addl %r12d, %esi 292 addl %r13d, %ebp 293 xorl %esi, %r8d 294 xorl %ebp, %r9d 295 roll $7, %r8d 296 roll $7, %r9d 297 movl %esi, 8(%rsp) 298 movl %ebp, 12(%rsp) 299 movl 16(%rsp), %esi 300 movl 20(%rsp), %ebp 301 addl %r10d, %ecx 302 addl %r11d, %edx 303 xorl %ecx, %r14d 304 xorl %edx, %r15d 305 roll $16, %r14d 306 roll $16, %r15d 307 addl %r14d, %esi 308 addl %r15d, %ebp 309 xorl %esi, %r10d 310 xorl %ebp, %r11d 311 roll $12, %r10d 312 roll $12, %r11d 313 addl %r10d, %ecx 314 addl %r11d, %edx 315 xorl %ecx, %r14d 316 xorl %edx, %r15d 317 roll $8, %r14d 318 roll $8, %r15d 319 addl %r14d, %esi 320 addl %r15d, %ebp 321 xorl %esi, %r10d 322 xorl %ebp, %r11d 323 roll $7, %r10d 324 roll $7, %r11d 325 addl %r9d, %eax 326 addl %r10d, %ebx 327 xorl %eax, %r15d 328 xorl %ebx, %r12d 329 roll $16, %r15d 330 roll $16, %r12d 331 addl %r15d, %esi 332 addl %r12d, %ebp 333 xorl %esi, %r9d 334 xorl %ebp, %r10d 335 roll $12, %r9d 336 roll $12, %r10d 337 addl %r9d, %eax 338 addl %r10d, %ebx 339 xorl %eax, %r15d 340 xorl %ebx, %r12d 341 roll $8, %r15d 342 roll $8, %r12d 343 addl %r15d, %esi 344 addl %r12d, %ebp 345 xorl %esi, %r9d 346 xorl %ebp, %r10d 347 roll $7, %r9d 348 roll $7, %r10d 349 movl %esi, 16(%rsp) 350 movl %ebp, 20(%rsp) 351 movl 8(%rsp), %esi 352 movl 12(%rsp), %ebp 353 addl %r11d, %ecx 354 addl %r8d, %edx 355 xorl %ecx, %r13d 356 xorl %edx, %r14d 357 roll $16, %r13d 358 roll $16, %r14d 359 addl %r13d, %esi 360 addl %r14d, %ebp 361 xorl %esi, %r11d 362 xorl %ebp, %r8d 363 roll $12, %r11d 364 roll $12, %r8d 365 addl %r11d, %ecx 366 addl %r8d, %edx 367 xorl %ecx, %r13d 368 xorl %edx, %r14d 369 roll $8, %r13d 370 roll $8, %r14d 371 addl %r13d, %esi 372 addl %r14d, %ebp 373 xorl %esi, %r11d 374 xorl %ebp, %r8d 375 roll $7, %r11d 376 roll $7, %r8d 377 decb (%rsp) 378 jnz L_chacha_x64_partial_crypt_start 379 movl %esi, 8(%rsp) 380 movl %ebp, 12(%rsp) 381 movq 32(%rsp), %rsi 382 addl (%rdi), %eax 383 addl 4(%rdi), %ebx 384 addl 8(%rdi), %ecx 385 addl 12(%rdi), %edx 386 addl 16(%rdi), %r8d 387 addl 20(%rdi), %r9d 388 addl 24(%rdi), %r10d 389 addl 28(%rdi), %r11d 390 addl 48(%rdi), %r12d 391 addl 52(%rdi), %r13d 392 addl 56(%rdi), %r14d 393 addl 60(%rdi), %r15d 394 leaq 80(%rdi), %rbp 395 movl %eax, (%rbp) 396 movl %ebx, 4(%rbp) 397 movl %ecx, 8(%rbp) 398 movl %edx, 12(%rbp) 399 movl %r8d, 16(%rbp) 400 movl %r9d, 20(%rbp) 401 movl %r10d, 24(%rbp) 402 movl %r11d, 28(%rbp) 403 movl %r12d, 48(%rbp) 404 movl %r13d, 52(%rbp) 405 movl %r14d, 56(%rbp) 406 movl %r15d, 60(%rbp) 407 movl 8(%rsp), %eax 408 movl 12(%rsp), %ebx 409 movl 16(%rsp), %ecx 410 movl 20(%rsp), %edx 411 addl 32(%rdi), %eax 412 addl 36(%rdi), %ebx 413 addl 40(%rdi), %ecx 414 addl 44(%rdi), %edx 415 movl %eax, 32(%rbp) 416 movl %ebx, 36(%rbp) 417 movl %ecx, 40(%rbp) 418 movl %edx, 44(%rbp) 419 movq 24(%rsp), %rdx 420 movq 40(%rsp), %rcx 421 addl $0x01, 48(%rdi) 422 addq $48, %rsp 423 movl %ecx, %r8d 424 xorq %rbx, %rbx 425 andl $7, %r8d 426 jz L_chacha_x64_partial_start64 427L_chacha_x64_partial_start8: 428 movzbl (%rbp,%rbx,1), %eax 429 xorb (%rsi,%rbx,1), %al 430 movb %al, (%rdx,%rbx,1) 431 incl %ebx 432 cmpl %r8d, %ebx 433 jne L_chacha_x64_partial_start8 434 je L_chacha_x64_partial_end64 435L_chacha_x64_partial_start64: 436 movq (%rbp,%rbx,1), %rax 437 xorq (%rsi,%rbx,1), %rax 438 movq %rax, (%rdx,%rbx,1) 439 addl $8, %ebx 440L_chacha_x64_partial_end64: 441 cmpl %ecx, %ebx 442 jne L_chacha_x64_partial_start64 443 movl $0x40, %ecx 444 subl %ebx, %ecx 445 movl %ecx, 76(%rdi) 446L_chacha_x64_done: 447 addq $0x40, %rsp 448 popq %r15 449 popq %r14 450 popq %r13 451 popq %r12 452 popq %rbp 453 popq %rbx 454 repz retq 455#ifndef __APPLE__ 456.size chacha_encrypt_x64,.-chacha_encrypt_x64 457#endif /* __APPLE__ */ 458#ifdef HAVE_INTEL_AVX1 459#ifndef __APPLE__ 460.data 461#else 462.section __DATA,__data 463#endif /* __APPLE__ */ 464#ifndef __APPLE__ 465.align 16 466#else 467.p2align 4 468#endif /* __APPLE__ */ 469L_chacha20_avx1_rotl8: 470.quad 0x605040702010003, 0xe0d0c0f0a09080b 471#ifndef __APPLE__ 472.data 473#else 474.section __DATA,__data 475#endif /* __APPLE__ */ 476#ifndef __APPLE__ 477.align 16 478#else 479.p2align 4 480#endif /* __APPLE__ */ 481L_chacha20_avx1_rotl16: 482.quad 0x504070601000302, 0xd0c0f0e09080b0a 483#ifndef __APPLE__ 484.data 485#else 486.section __DATA,__data 487#endif /* __APPLE__ */ 488#ifndef __APPLE__ 489.align 16 490#else 491.p2align 4 492#endif /* __APPLE__ */ 493L_chacha20_avx1_add: 494.quad 0x100000000, 0x300000002 495#ifndef __APPLE__ 496.data 497#else 498.section __DATA,__data 499#endif /* __APPLE__ */ 500#ifndef __APPLE__ 501.align 16 502#else 503.p2align 4 504#endif /* __APPLE__ */ 505L_chacha20_avx1_four: 506.quad 0x400000004, 0x400000004 507#ifndef __APPLE__ 508.text 509.globl chacha_encrypt_avx1 510.type chacha_encrypt_avx1,@function 511.align 16 512chacha_encrypt_avx1: 513#else 514.section __TEXT,__text 515.globl _chacha_encrypt_avx1 516.p2align 4 517_chacha_encrypt_avx1: 518#endif /* __APPLE__ */ 519 subq $0x190, %rsp 520 movq %rsp, %r9 521 leaq 256(%rsp), %r10 522 andq $-16, %r9 523 andq $-16, %r10 524 movl %ecx, %eax 525 shrl $8, %eax 526 jz L_chacha20_avx1_end128 527 vpshufd $0x00, (%rdi), %xmm0 528 vpshufd $0x00, 4(%rdi), %xmm1 529 vpshufd $0x00, 8(%rdi), %xmm2 530 vpshufd $0x00, 12(%rdi), %xmm3 531 vpshufd $0x00, 16(%rdi), %xmm4 532 vpshufd $0x00, 20(%rdi), %xmm5 533 vpshufd $0x00, 24(%rdi), %xmm6 534 vpshufd $0x00, 28(%rdi), %xmm7 535 vpshufd $0x00, 32(%rdi), %xmm8 536 vpshufd $0x00, 36(%rdi), %xmm9 537 vpshufd $0x00, 40(%rdi), %xmm10 538 vpshufd $0x00, 44(%rdi), %xmm11 539 vpshufd $0x00, 48(%rdi), %xmm12 540 vpshufd $0x00, 52(%rdi), %xmm13 541 vpshufd $0x00, 56(%rdi), %xmm14 542 vpshufd $0x00, 60(%rdi), %xmm15 543 vpaddd L_chacha20_avx1_add(%rip), %xmm12, %xmm12 544 vmovdqa %xmm0, (%r9) 545 vmovdqa %xmm1, 16(%r9) 546 vmovdqa %xmm2, 32(%r9) 547 vmovdqa %xmm3, 48(%r9) 548 vmovdqa %xmm4, 64(%r9) 549 vmovdqa %xmm5, 80(%r9) 550 vmovdqa %xmm6, 96(%r9) 551 vmovdqa %xmm7, 112(%r9) 552 vmovdqa %xmm8, 128(%r9) 553 vmovdqa %xmm9, 144(%r9) 554 vmovdqa %xmm10, 160(%r9) 555 vmovdqa %xmm11, 176(%r9) 556 vmovdqa %xmm12, 192(%r9) 557 vmovdqa %xmm13, 208(%r9) 558 vmovdqa %xmm14, 224(%r9) 559 vmovdqa %xmm15, 240(%r9) 560L_chacha20_avx1_start128: 561 vmovdqa %xmm11, 48(%r10) 562 movb $10, %r8b 563L_chacha20_avx1_loop128: 564 vpaddd %xmm4, %xmm0, %xmm0 565 vpxor %xmm0, %xmm12, %xmm12 566 vmovdqa 48(%r10), %xmm11 567 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm12, %xmm12 568 vpaddd %xmm12, %xmm8, %xmm8 569 vpxor %xmm8, %xmm4, %xmm4 570 vpaddd %xmm5, %xmm1, %xmm1 571 vpxor %xmm1, %xmm13, %xmm13 572 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm13, %xmm13 573 vpaddd %xmm13, %xmm9, %xmm9 574 vpxor %xmm9, %xmm5, %xmm5 575 vpaddd %xmm6, %xmm2, %xmm2 576 vpxor %xmm2, %xmm14, %xmm14 577 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm14, %xmm14 578 vpaddd %xmm14, %xmm10, %xmm10 579 vpxor %xmm10, %xmm6, %xmm6 580 vpaddd %xmm7, %xmm3, %xmm3 581 vpxor %xmm3, %xmm15, %xmm15 582 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm15, %xmm15 583 vpaddd %xmm15, %xmm11, %xmm11 584 vpxor %xmm11, %xmm7, %xmm7 585 vmovdqa %xmm11, 48(%r10) 586 vpsrld $20, %xmm4, %xmm11 587 vpslld $12, %xmm4, %xmm4 588 vpxor %xmm11, %xmm4, %xmm4 589 vpsrld $20, %xmm5, %xmm11 590 vpslld $12, %xmm5, %xmm5 591 vpxor %xmm11, %xmm5, %xmm5 592 vpsrld $20, %xmm6, %xmm11 593 vpslld $12, %xmm6, %xmm6 594 vpxor %xmm11, %xmm6, %xmm6 595 vpsrld $20, %xmm7, %xmm11 596 vpslld $12, %xmm7, %xmm7 597 vpxor %xmm11, %xmm7, %xmm7 598 vpaddd %xmm4, %xmm0, %xmm0 599 vpxor %xmm0, %xmm12, %xmm12 600 vmovdqa 48(%r10), %xmm11 601 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm12, %xmm12 602 vpaddd %xmm12, %xmm8, %xmm8 603 vpxor %xmm8, %xmm4, %xmm4 604 vpaddd %xmm5, %xmm1, %xmm1 605 vpxor %xmm1, %xmm13, %xmm13 606 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm13, %xmm13 607 vpaddd %xmm13, %xmm9, %xmm9 608 vpxor %xmm9, %xmm5, %xmm5 609 vpaddd %xmm6, %xmm2, %xmm2 610 vpxor %xmm2, %xmm14, %xmm14 611 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm14, %xmm14 612 vpaddd %xmm14, %xmm10, %xmm10 613 vpxor %xmm10, %xmm6, %xmm6 614 vpaddd %xmm7, %xmm3, %xmm3 615 vpxor %xmm3, %xmm15, %xmm15 616 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm15, %xmm15 617 vpaddd %xmm15, %xmm11, %xmm11 618 vpxor %xmm11, %xmm7, %xmm7 619 vmovdqa %xmm11, 48(%r10) 620 vpsrld $25, %xmm4, %xmm11 621 vpslld $7, %xmm4, %xmm4 622 vpxor %xmm11, %xmm4, %xmm4 623 vpsrld $25, %xmm5, %xmm11 624 vpslld $7, %xmm5, %xmm5 625 vpxor %xmm11, %xmm5, %xmm5 626 vpsrld $25, %xmm6, %xmm11 627 vpslld $7, %xmm6, %xmm6 628 vpxor %xmm11, %xmm6, %xmm6 629 vpsrld $25, %xmm7, %xmm11 630 vpslld $7, %xmm7, %xmm7 631 vpxor %xmm11, %xmm7, %xmm7 632 vpaddd %xmm5, %xmm0, %xmm0 633 vpxor %xmm0, %xmm15, %xmm15 634 vmovdqa 48(%r10), %xmm11 635 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm15, %xmm15 636 vpaddd %xmm15, %xmm10, %xmm10 637 vpxor %xmm10, %xmm5, %xmm5 638 vpaddd %xmm6, %xmm1, %xmm1 639 vpxor %xmm1, %xmm12, %xmm12 640 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm12, %xmm12 641 vpaddd %xmm12, %xmm11, %xmm11 642 vpxor %xmm11, %xmm6, %xmm6 643 vpaddd %xmm7, %xmm2, %xmm2 644 vpxor %xmm2, %xmm13, %xmm13 645 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm13, %xmm13 646 vpaddd %xmm13, %xmm8, %xmm8 647 vpxor %xmm8, %xmm7, %xmm7 648 vpaddd %xmm4, %xmm3, %xmm3 649 vpxor %xmm3, %xmm14, %xmm14 650 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm14, %xmm14 651 vpaddd %xmm14, %xmm9, %xmm9 652 vpxor %xmm9, %xmm4, %xmm4 653 vmovdqa %xmm11, 48(%r10) 654 vpsrld $20, %xmm5, %xmm11 655 vpslld $12, %xmm5, %xmm5 656 vpxor %xmm11, %xmm5, %xmm5 657 vpsrld $20, %xmm6, %xmm11 658 vpslld $12, %xmm6, %xmm6 659 vpxor %xmm11, %xmm6, %xmm6 660 vpsrld $20, %xmm7, %xmm11 661 vpslld $12, %xmm7, %xmm7 662 vpxor %xmm11, %xmm7, %xmm7 663 vpsrld $20, %xmm4, %xmm11 664 vpslld $12, %xmm4, %xmm4 665 vpxor %xmm11, %xmm4, %xmm4 666 vpaddd %xmm5, %xmm0, %xmm0 667 vpxor %xmm0, %xmm15, %xmm15 668 vmovdqa 48(%r10), %xmm11 669 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm15, %xmm15 670 vpaddd %xmm15, %xmm10, %xmm10 671 vpxor %xmm10, %xmm5, %xmm5 672 vpaddd %xmm6, %xmm1, %xmm1 673 vpxor %xmm1, %xmm12, %xmm12 674 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm12, %xmm12 675 vpaddd %xmm12, %xmm11, %xmm11 676 vpxor %xmm11, %xmm6, %xmm6 677 vpaddd %xmm7, %xmm2, %xmm2 678 vpxor %xmm2, %xmm13, %xmm13 679 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm13, %xmm13 680 vpaddd %xmm13, %xmm8, %xmm8 681 vpxor %xmm8, %xmm7, %xmm7 682 vpaddd %xmm4, %xmm3, %xmm3 683 vpxor %xmm3, %xmm14, %xmm14 684 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm14, %xmm14 685 vpaddd %xmm14, %xmm9, %xmm9 686 vpxor %xmm9, %xmm4, %xmm4 687 vmovdqa %xmm11, 48(%r10) 688 vpsrld $25, %xmm5, %xmm11 689 vpslld $7, %xmm5, %xmm5 690 vpxor %xmm11, %xmm5, %xmm5 691 vpsrld $25, %xmm6, %xmm11 692 vpslld $7, %xmm6, %xmm6 693 vpxor %xmm11, %xmm6, %xmm6 694 vpsrld $25, %xmm7, %xmm11 695 vpslld $7, %xmm7, %xmm7 696 vpxor %xmm11, %xmm7, %xmm7 697 vpsrld $25, %xmm4, %xmm11 698 vpslld $7, %xmm4, %xmm4 699 vpxor %xmm11, %xmm4, %xmm4 700 decb %r8b 701 jnz L_chacha20_avx1_loop128 702 vmovdqa 48(%r10), %xmm11 703 vpaddd (%r9), %xmm0, %xmm0 704 vpaddd 16(%r9), %xmm1, %xmm1 705 vpaddd 32(%r9), %xmm2, %xmm2 706 vpaddd 48(%r9), %xmm3, %xmm3 707 vpaddd 64(%r9), %xmm4, %xmm4 708 vpaddd 80(%r9), %xmm5, %xmm5 709 vpaddd 96(%r9), %xmm6, %xmm6 710 vpaddd 112(%r9), %xmm7, %xmm7 711 vpaddd 128(%r9), %xmm8, %xmm8 712 vpaddd 144(%r9), %xmm9, %xmm9 713 vpaddd 160(%r9), %xmm10, %xmm10 714 vpaddd 176(%r9), %xmm11, %xmm11 715 vpaddd 192(%r9), %xmm12, %xmm12 716 vpaddd 208(%r9), %xmm13, %xmm13 717 vpaddd 224(%r9), %xmm14, %xmm14 718 vpaddd 240(%r9), %xmm15, %xmm15 719 vmovdqa %xmm8, (%r10) 720 vmovdqa %xmm9, 16(%r10) 721 vmovdqa %xmm10, 32(%r10) 722 vmovdqa %xmm11, 48(%r10) 723 vmovdqa %xmm12, 64(%r10) 724 vmovdqa %xmm13, 80(%r10) 725 vmovdqa %xmm14, 96(%r10) 726 vmovdqa %xmm15, 112(%r10) 727 vpunpckldq %xmm1, %xmm0, %xmm8 728 vpunpckldq %xmm3, %xmm2, %xmm9 729 vpunpckhdq %xmm1, %xmm0, %xmm12 730 vpunpckhdq %xmm3, %xmm2, %xmm13 731 vpunpckldq %xmm5, %xmm4, %xmm10 732 vpunpckldq %xmm7, %xmm6, %xmm11 733 vpunpckhdq %xmm5, %xmm4, %xmm14 734 vpunpckhdq %xmm7, %xmm6, %xmm15 735 vpunpcklqdq %xmm9, %xmm8, %xmm0 736 vpunpcklqdq %xmm11, %xmm10, %xmm1 737 vpunpckhqdq %xmm9, %xmm8, %xmm2 738 vpunpckhqdq %xmm11, %xmm10, %xmm3 739 vpunpcklqdq %xmm13, %xmm12, %xmm4 740 vpunpcklqdq %xmm15, %xmm14, %xmm5 741 vpunpckhqdq %xmm13, %xmm12, %xmm6 742 vpunpckhqdq %xmm15, %xmm14, %xmm7 743 vmovdqu (%rsi), %xmm8 744 vmovdqu 16(%rsi), %xmm9 745 vmovdqu 64(%rsi), %xmm10 746 vmovdqu 80(%rsi), %xmm11 747 vmovdqu 128(%rsi), %xmm12 748 vmovdqu 144(%rsi), %xmm13 749 vmovdqu 192(%rsi), %xmm14 750 vmovdqu 208(%rsi), %xmm15 751 vpxor %xmm8, %xmm0, %xmm0 752 vpxor %xmm9, %xmm1, %xmm1 753 vpxor %xmm10, %xmm2, %xmm2 754 vpxor %xmm11, %xmm3, %xmm3 755 vpxor %xmm12, %xmm4, %xmm4 756 vpxor %xmm13, %xmm5, %xmm5 757 vpxor %xmm14, %xmm6, %xmm6 758 vpxor %xmm15, %xmm7, %xmm7 759 vmovdqu %xmm0, (%rdx) 760 vmovdqu %xmm1, 16(%rdx) 761 vmovdqu %xmm2, 64(%rdx) 762 vmovdqu %xmm3, 80(%rdx) 763 vmovdqu %xmm4, 128(%rdx) 764 vmovdqu %xmm5, 144(%rdx) 765 vmovdqu %xmm6, 192(%rdx) 766 vmovdqu %xmm7, 208(%rdx) 767 vmovdqa (%r10), %xmm0 768 vmovdqa 16(%r10), %xmm1 769 vmovdqa 32(%r10), %xmm2 770 vmovdqa 48(%r10), %xmm3 771 vmovdqa 64(%r10), %xmm4 772 vmovdqa 80(%r10), %xmm5 773 vmovdqa 96(%r10), %xmm6 774 vmovdqa 112(%r10), %xmm7 775 vpunpckldq %xmm1, %xmm0, %xmm8 776 vpunpckldq %xmm3, %xmm2, %xmm9 777 vpunpckhdq %xmm1, %xmm0, %xmm12 778 vpunpckhdq %xmm3, %xmm2, %xmm13 779 vpunpckldq %xmm5, %xmm4, %xmm10 780 vpunpckldq %xmm7, %xmm6, %xmm11 781 vpunpckhdq %xmm5, %xmm4, %xmm14 782 vpunpckhdq %xmm7, %xmm6, %xmm15 783 vpunpcklqdq %xmm9, %xmm8, %xmm0 784 vpunpcklqdq %xmm11, %xmm10, %xmm1 785 vpunpckhqdq %xmm9, %xmm8, %xmm2 786 vpunpckhqdq %xmm11, %xmm10, %xmm3 787 vpunpcklqdq %xmm13, %xmm12, %xmm4 788 vpunpcklqdq %xmm15, %xmm14, %xmm5 789 vpunpckhqdq %xmm13, %xmm12, %xmm6 790 vpunpckhqdq %xmm15, %xmm14, %xmm7 791 vmovdqu 32(%rsi), %xmm8 792 vmovdqu 48(%rsi), %xmm9 793 vmovdqu 96(%rsi), %xmm10 794 vmovdqu 112(%rsi), %xmm11 795 vmovdqu 160(%rsi), %xmm12 796 vmovdqu 176(%rsi), %xmm13 797 vmovdqu 224(%rsi), %xmm14 798 vmovdqu 240(%rsi), %xmm15 799 vpxor %xmm8, %xmm0, %xmm0 800 vpxor %xmm9, %xmm1, %xmm1 801 vpxor %xmm10, %xmm2, %xmm2 802 vpxor %xmm11, %xmm3, %xmm3 803 vpxor %xmm12, %xmm4, %xmm4 804 vpxor %xmm13, %xmm5, %xmm5 805 vpxor %xmm14, %xmm6, %xmm6 806 vpxor %xmm15, %xmm7, %xmm7 807 vmovdqu %xmm0, 32(%rdx) 808 vmovdqu %xmm1, 48(%rdx) 809 vmovdqu %xmm2, 96(%rdx) 810 vmovdqu %xmm3, 112(%rdx) 811 vmovdqu %xmm4, 160(%rdx) 812 vmovdqu %xmm5, 176(%rdx) 813 vmovdqu %xmm6, 224(%rdx) 814 vmovdqu %xmm7, 240(%rdx) 815 vmovdqa 192(%r9), %xmm12 816 addq $0x100, %rsi 817 addq $0x100, %rdx 818 vpaddd L_chacha20_avx1_four(%rip), %xmm12, %xmm12 819 subl $0x100, %ecx 820 vmovdqa %xmm12, 192(%r9) 821 cmpl $0x100, %ecx 822 jl L_chacha20_avx1_done128 823 vmovdqa (%r9), %xmm0 824 vmovdqa 16(%r9), %xmm1 825 vmovdqa 32(%r9), %xmm2 826 vmovdqa 48(%r9), %xmm3 827 vmovdqa 64(%r9), %xmm4 828 vmovdqa 80(%r9), %xmm5 829 vmovdqa 96(%r9), %xmm6 830 vmovdqa 112(%r9), %xmm7 831 vmovdqa 128(%r9), %xmm8 832 vmovdqa 144(%r9), %xmm9 833 vmovdqa 160(%r9), %xmm10 834 vmovdqa 176(%r9), %xmm11 835 vmovdqa 192(%r9), %xmm12 836 vmovdqa 208(%r9), %xmm13 837 vmovdqa 224(%r9), %xmm14 838 vmovdqa 240(%r9), %xmm15 839 jmp L_chacha20_avx1_start128 840L_chacha20_avx1_done128: 841 shl $2, %eax 842 addl %eax, 48(%rdi) 843L_chacha20_avx1_end128: 844 cmpl $0x40, %ecx 845 jl L_chacha20_avx1_block_done 846L_chacha20_avx1_block_start: 847 vmovdqu (%rdi), %xmm0 848 vmovdqu 16(%rdi), %xmm1 849 vmovdqu 32(%rdi), %xmm2 850 vmovdqu 48(%rdi), %xmm3 851 vmovdqa %xmm0, %xmm5 852 vmovdqa %xmm1, %xmm6 853 vmovdqa %xmm2, %xmm7 854 vmovdqa %xmm3, %xmm8 855 movb $10, %al 856L_chacha20_avx1_block_crypt_start: 857 vpaddd %xmm1, %xmm0, %xmm0 858 vpxor %xmm0, %xmm3, %xmm3 859 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3 860 vpaddd %xmm3, %xmm2, %xmm2 861 vpxor %xmm2, %xmm1, %xmm1 862 vpsrld $20, %xmm1, %xmm4 863 vpslld $12, %xmm1, %xmm1 864 vpxor %xmm4, %xmm1, %xmm1 865 vpaddd %xmm1, %xmm0, %xmm0 866 vpxor %xmm0, %xmm3, %xmm3 867 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3 868 vpaddd %xmm3, %xmm2, %xmm2 869 vpxor %xmm2, %xmm1, %xmm1 870 vpsrld $25, %xmm1, %xmm4 871 vpslld $7, %xmm1, %xmm1 872 vpxor %xmm4, %xmm1, %xmm1 873 vpshufd $57, %xmm1, %xmm1 874 vpshufd $0x4e, %xmm2, %xmm2 875 vpshufd $0x93, %xmm3, %xmm3 876 vpaddd %xmm1, %xmm0, %xmm0 877 vpxor %xmm0, %xmm3, %xmm3 878 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3 879 vpaddd %xmm3, %xmm2, %xmm2 880 vpxor %xmm2, %xmm1, %xmm1 881 vpsrld $20, %xmm1, %xmm4 882 vpslld $12, %xmm1, %xmm1 883 vpxor %xmm4, %xmm1, %xmm1 884 vpaddd %xmm1, %xmm0, %xmm0 885 vpxor %xmm0, %xmm3, %xmm3 886 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3 887 vpaddd %xmm3, %xmm2, %xmm2 888 vpxor %xmm2, %xmm1, %xmm1 889 vpsrld $25, %xmm1, %xmm4 890 vpslld $7, %xmm1, %xmm1 891 vpxor %xmm4, %xmm1, %xmm1 892 vpshufd $0x93, %xmm1, %xmm1 893 vpshufd $0x4e, %xmm2, %xmm2 894 vpshufd $57, %xmm3, %xmm3 895 decb %al 896 jnz L_chacha20_avx1_block_crypt_start 897 vpaddd %xmm5, %xmm0, %xmm0 898 vpaddd %xmm6, %xmm1, %xmm1 899 vpaddd %xmm7, %xmm2, %xmm2 900 vpaddd %xmm8, %xmm3, %xmm3 901 vmovdqu (%rsi), %xmm5 902 vmovdqu 16(%rsi), %xmm6 903 vmovdqu 32(%rsi), %xmm7 904 vmovdqu 48(%rsi), %xmm8 905 vpxor %xmm5, %xmm0, %xmm0 906 vpxor %xmm6, %xmm1, %xmm1 907 vpxor %xmm7, %xmm2, %xmm2 908 vpxor %xmm8, %xmm3, %xmm3 909 vmovdqu %xmm0, (%rdx) 910 vmovdqu %xmm1, 16(%rdx) 911 vmovdqu %xmm2, 32(%rdx) 912 vmovdqu %xmm3, 48(%rdx) 913 addl $0x01, 48(%rdi) 914 subl $0x40, %ecx 915 addq $0x40, %rsi 916 addq $0x40, %rdx 917 cmpl $0x40, %ecx 918 jge L_chacha20_avx1_block_start 919L_chacha20_avx1_block_done: 920 cmpl $0x00, %ecx 921 je L_chacha20_avx1_partial_done 922 leaq 80(%rdi), %r10 923 vmovdqu (%rdi), %xmm0 924 vmovdqu 16(%rdi), %xmm1 925 vmovdqu 32(%rdi), %xmm2 926 vmovdqu 48(%rdi), %xmm3 927 vmovdqa %xmm0, %xmm5 928 vmovdqa %xmm1, %xmm6 929 vmovdqa %xmm2, %xmm7 930 vmovdqa %xmm3, %xmm8 931 movb $10, %al 932L_chacha20_avx1_partial_crypt_start: 933 vpaddd %xmm1, %xmm0, %xmm0 934 vpxor %xmm0, %xmm3, %xmm3 935 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3 936 vpaddd %xmm3, %xmm2, %xmm2 937 vpxor %xmm2, %xmm1, %xmm1 938 vpsrld $20, %xmm1, %xmm4 939 vpslld $12, %xmm1, %xmm1 940 vpxor %xmm4, %xmm1, %xmm1 941 vpaddd %xmm1, %xmm0, %xmm0 942 vpxor %xmm0, %xmm3, %xmm3 943 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3 944 vpaddd %xmm3, %xmm2, %xmm2 945 vpxor %xmm2, %xmm1, %xmm1 946 vpsrld $25, %xmm1, %xmm4 947 vpslld $7, %xmm1, %xmm1 948 vpxor %xmm4, %xmm1, %xmm1 949 vpshufd $57, %xmm1, %xmm1 950 vpshufd $0x4e, %xmm2, %xmm2 951 vpshufd $0x93, %xmm3, %xmm3 952 vpaddd %xmm1, %xmm0, %xmm0 953 vpxor %xmm0, %xmm3, %xmm3 954 vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3 955 vpaddd %xmm3, %xmm2, %xmm2 956 vpxor %xmm2, %xmm1, %xmm1 957 vpsrld $20, %xmm1, %xmm4 958 vpslld $12, %xmm1, %xmm1 959 vpxor %xmm4, %xmm1, %xmm1 960 vpaddd %xmm1, %xmm0, %xmm0 961 vpxor %xmm0, %xmm3, %xmm3 962 vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3 963 vpaddd %xmm3, %xmm2, %xmm2 964 vpxor %xmm2, %xmm1, %xmm1 965 vpsrld $25, %xmm1, %xmm4 966 vpslld $7, %xmm1, %xmm1 967 vpxor %xmm4, %xmm1, %xmm1 968 vpshufd $0x93, %xmm1, %xmm1 969 vpshufd $0x4e, %xmm2, %xmm2 970 vpshufd $57, %xmm3, %xmm3 971 decb %al 972 jnz L_chacha20_avx1_partial_crypt_start 973 vpaddd %xmm5, %xmm0, %xmm0 974 vpaddd %xmm6, %xmm1, %xmm1 975 vpaddd %xmm7, %xmm2, %xmm2 976 vpaddd %xmm8, %xmm3, %xmm3 977 vmovdqu %xmm0, (%r10) 978 vmovdqu %xmm1, 16(%r10) 979 vmovdqu %xmm2, 32(%r10) 980 vmovdqu %xmm3, 48(%r10) 981 addl $0x01, 48(%rdi) 982 movl %ecx, %r8d 983 xorq %r11, %r11 984 andl $7, %r8d 985 jz L_chacha20_avx1_partial_start64 986L_chacha20_avx1_partial_start8: 987 movzbl (%r10,%r11,1), %eax 988 xorb (%rsi,%r11,1), %al 989 movb %al, (%rdx,%r11,1) 990 incl %r11d 991 cmpl %r8d, %r11d 992 jne L_chacha20_avx1_partial_start8 993 je L_chacha20_avx1_partial_end64 994L_chacha20_avx1_partial_start64: 995 movq (%r10,%r11,1), %rax 996 xorq (%rsi,%r11,1), %rax 997 movq %rax, (%rdx,%r11,1) 998 addl $8, %r11d 999L_chacha20_avx1_partial_end64: 1000 cmpl %ecx, %r11d 1001 jne L_chacha20_avx1_partial_start64 1002 movl $0x40, %r8d 1003 subl %r11d, %r8d 1004 movl %r8d, 76(%rdi) 1005L_chacha20_avx1_partial_done: 1006 addq $0x190, %rsp 1007 repz retq 1008#ifndef __APPLE__ 1009.size chacha_encrypt_avx1,.-chacha_encrypt_avx1 1010#endif /* __APPLE__ */ 1011#endif /* HAVE_INTEL_AVX1 */ 1012#ifdef HAVE_INTEL_AVX2 1013#ifndef __APPLE__ 1014.data 1015#else 1016.section __DATA,__data 1017#endif /* __APPLE__ */ 1018#ifndef __APPLE__ 1019.align 32 1020#else 1021.p2align 5 1022#endif /* __APPLE__ */ 1023L_chacha20_avx2_rotl8: 1024.quad 0x605040702010003, 0xe0d0c0f0a09080b 1025.quad 0x605040702010003, 0xe0d0c0f0a09080b 1026#ifndef __APPLE__ 1027.data 1028#else 1029.section __DATA,__data 1030#endif /* __APPLE__ */ 1031#ifndef __APPLE__ 1032.align 32 1033#else 1034.p2align 5 1035#endif /* __APPLE__ */ 1036L_chacha20_avx2_rotl16: 1037.quad 0x504070601000302, 0xd0c0f0e09080b0a 1038.quad 0x504070601000302, 0xd0c0f0e09080b0a 1039#ifndef __APPLE__ 1040.data 1041#else 1042.section __DATA,__data 1043#endif /* __APPLE__ */ 1044#ifndef __APPLE__ 1045.align 32 1046#else 1047.p2align 5 1048#endif /* __APPLE__ */ 1049L_chacha20_avx2_add: 1050.quad 0x100000000, 0x300000002 1051.quad 0x500000004, 0x700000006 1052#ifndef __APPLE__ 1053.data 1054#else 1055.section __DATA,__data 1056#endif /* __APPLE__ */ 1057#ifndef __APPLE__ 1058.align 32 1059#else 1060.p2align 5 1061#endif /* __APPLE__ */ 1062L_chacha20_avx2_eight: 1063.quad 0x800000008, 0x800000008 1064.quad 0x800000008, 0x800000008 1065#ifndef __APPLE__ 1066.text 1067.globl chacha_encrypt_avx2 1068.type chacha_encrypt_avx2,@function 1069.align 16 1070chacha_encrypt_avx2: 1071#else 1072.section __TEXT,__text 1073.globl _chacha_encrypt_avx2 1074.p2align 4 1075_chacha_encrypt_avx2: 1076#endif /* __APPLE__ */ 1077 subq $0x310, %rsp 1078 movq %rsp, %r9 1079 leaq 512(%rsp), %r10 1080 andq $-32, %r9 1081 andq $-32, %r10 1082 movl %ecx, %eax 1083 shrl $9, %eax 1084 jz L_chacha20_avx2_end256 1085 vpbroadcastd (%rdi), %ymm0 1086 vpbroadcastd 4(%rdi), %ymm1 1087 vpbroadcastd 8(%rdi), %ymm2 1088 vpbroadcastd 12(%rdi), %ymm3 1089 vpbroadcastd 16(%rdi), %ymm4 1090 vpbroadcastd 20(%rdi), %ymm5 1091 vpbroadcastd 24(%rdi), %ymm6 1092 vpbroadcastd 28(%rdi), %ymm7 1093 vpbroadcastd 32(%rdi), %ymm8 1094 vpbroadcastd 36(%rdi), %ymm9 1095 vpbroadcastd 40(%rdi), %ymm10 1096 vpbroadcastd 44(%rdi), %ymm11 1097 vpbroadcastd 48(%rdi), %ymm12 1098 vpbroadcastd 52(%rdi), %ymm13 1099 vpbroadcastd 56(%rdi), %ymm14 1100 vpbroadcastd 60(%rdi), %ymm15 1101 vpaddd L_chacha20_avx2_add(%rip), %ymm12, %ymm12 1102 vmovdqa %ymm0, (%r9) 1103 vmovdqa %ymm1, 32(%r9) 1104 vmovdqa %ymm2, 64(%r9) 1105 vmovdqa %ymm3, 96(%r9) 1106 vmovdqa %ymm4, 128(%r9) 1107 vmovdqa %ymm5, 160(%r9) 1108 vmovdqa %ymm6, 192(%r9) 1109 vmovdqa %ymm7, 224(%r9) 1110 vmovdqa %ymm8, 256(%r9) 1111 vmovdqa %ymm9, 288(%r9) 1112 vmovdqa %ymm10, 320(%r9) 1113 vmovdqa %ymm11, 352(%r9) 1114 vmovdqa %ymm12, 384(%r9) 1115 vmovdqa %ymm13, 416(%r9) 1116 vmovdqa %ymm14, 448(%r9) 1117 vmovdqa %ymm15, 480(%r9) 1118L_chacha20_avx2_start256: 1119 movb $10, %r8b 1120 vmovdqa %ymm11, 96(%r10) 1121L_chacha20_avx2_loop256: 1122 vpaddd %ymm4, %ymm0, %ymm0 1123 vpxor %ymm0, %ymm12, %ymm12 1124 vmovdqa 96(%r10), %ymm11 1125 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm12, %ymm12 1126 vpaddd %ymm12, %ymm8, %ymm8 1127 vpxor %ymm8, %ymm4, %ymm4 1128 vpaddd %ymm5, %ymm1, %ymm1 1129 vpxor %ymm1, %ymm13, %ymm13 1130 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm13, %ymm13 1131 vpaddd %ymm13, %ymm9, %ymm9 1132 vpxor %ymm9, %ymm5, %ymm5 1133 vpaddd %ymm6, %ymm2, %ymm2 1134 vpxor %ymm2, %ymm14, %ymm14 1135 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm14, %ymm14 1136 vpaddd %ymm14, %ymm10, %ymm10 1137 vpxor %ymm10, %ymm6, %ymm6 1138 vpaddd %ymm7, %ymm3, %ymm3 1139 vpxor %ymm3, %ymm15, %ymm15 1140 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm15, %ymm15 1141 vpaddd %ymm15, %ymm11, %ymm11 1142 vpxor %ymm11, %ymm7, %ymm7 1143 vmovdqa %ymm11, 96(%r10) 1144 vpsrld $20, %ymm4, %ymm11 1145 vpslld $12, %ymm4, %ymm4 1146 vpxor %ymm11, %ymm4, %ymm4 1147 vpsrld $20, %ymm5, %ymm11 1148 vpslld $12, %ymm5, %ymm5 1149 vpxor %ymm11, %ymm5, %ymm5 1150 vpsrld $20, %ymm6, %ymm11 1151 vpslld $12, %ymm6, %ymm6 1152 vpxor %ymm11, %ymm6, %ymm6 1153 vpsrld $20, %ymm7, %ymm11 1154 vpslld $12, %ymm7, %ymm7 1155 vpxor %ymm11, %ymm7, %ymm7 1156 vpaddd %ymm4, %ymm0, %ymm0 1157 vpxor %ymm0, %ymm12, %ymm12 1158 vmovdqa 96(%r10), %ymm11 1159 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm12, %ymm12 1160 vpaddd %ymm12, %ymm8, %ymm8 1161 vpxor %ymm8, %ymm4, %ymm4 1162 vpaddd %ymm5, %ymm1, %ymm1 1163 vpxor %ymm1, %ymm13, %ymm13 1164 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm13, %ymm13 1165 vpaddd %ymm13, %ymm9, %ymm9 1166 vpxor %ymm9, %ymm5, %ymm5 1167 vpaddd %ymm6, %ymm2, %ymm2 1168 vpxor %ymm2, %ymm14, %ymm14 1169 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm14, %ymm14 1170 vpaddd %ymm14, %ymm10, %ymm10 1171 vpxor %ymm10, %ymm6, %ymm6 1172 vpaddd %ymm7, %ymm3, %ymm3 1173 vpxor %ymm3, %ymm15, %ymm15 1174 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm15, %ymm15 1175 vpaddd %ymm15, %ymm11, %ymm11 1176 vpxor %ymm11, %ymm7, %ymm7 1177 vmovdqa %ymm11, 96(%r10) 1178 vpsrld $25, %ymm4, %ymm11 1179 vpslld $7, %ymm4, %ymm4 1180 vpxor %ymm11, %ymm4, %ymm4 1181 vpsrld $25, %ymm5, %ymm11 1182 vpslld $7, %ymm5, %ymm5 1183 vpxor %ymm11, %ymm5, %ymm5 1184 vpsrld $25, %ymm6, %ymm11 1185 vpslld $7, %ymm6, %ymm6 1186 vpxor %ymm11, %ymm6, %ymm6 1187 vpsrld $25, %ymm7, %ymm11 1188 vpslld $7, %ymm7, %ymm7 1189 vpxor %ymm11, %ymm7, %ymm7 1190 vpaddd %ymm5, %ymm0, %ymm0 1191 vpxor %ymm0, %ymm15, %ymm15 1192 vmovdqa 96(%r10), %ymm11 1193 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm15, %ymm15 1194 vpaddd %ymm15, %ymm10, %ymm10 1195 vpxor %ymm10, %ymm5, %ymm5 1196 vpaddd %ymm6, %ymm1, %ymm1 1197 vpxor %ymm1, %ymm12, %ymm12 1198 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm12, %ymm12 1199 vpaddd %ymm12, %ymm11, %ymm11 1200 vpxor %ymm11, %ymm6, %ymm6 1201 vpaddd %ymm7, %ymm2, %ymm2 1202 vpxor %ymm2, %ymm13, %ymm13 1203 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm13, %ymm13 1204 vpaddd %ymm13, %ymm8, %ymm8 1205 vpxor %ymm8, %ymm7, %ymm7 1206 vpaddd %ymm4, %ymm3, %ymm3 1207 vpxor %ymm3, %ymm14, %ymm14 1208 vpshufb L_chacha20_avx2_rotl16(%rip), %ymm14, %ymm14 1209 vpaddd %ymm14, %ymm9, %ymm9 1210 vpxor %ymm9, %ymm4, %ymm4 1211 vmovdqa %ymm11, 96(%r10) 1212 vpsrld $20, %ymm5, %ymm11 1213 vpslld $12, %ymm5, %ymm5 1214 vpxor %ymm11, %ymm5, %ymm5 1215 vpsrld $20, %ymm6, %ymm11 1216 vpslld $12, %ymm6, %ymm6 1217 vpxor %ymm11, %ymm6, %ymm6 1218 vpsrld $20, %ymm7, %ymm11 1219 vpslld $12, %ymm7, %ymm7 1220 vpxor %ymm11, %ymm7, %ymm7 1221 vpsrld $20, %ymm4, %ymm11 1222 vpslld $12, %ymm4, %ymm4 1223 vpxor %ymm11, %ymm4, %ymm4 1224 vpaddd %ymm5, %ymm0, %ymm0 1225 vpxor %ymm0, %ymm15, %ymm15 1226 vmovdqa 96(%r10), %ymm11 1227 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm15, %ymm15 1228 vpaddd %ymm15, %ymm10, %ymm10 1229 vpxor %ymm10, %ymm5, %ymm5 1230 vpaddd %ymm6, %ymm1, %ymm1 1231 vpxor %ymm1, %ymm12, %ymm12 1232 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm12, %ymm12 1233 vpaddd %ymm12, %ymm11, %ymm11 1234 vpxor %ymm11, %ymm6, %ymm6 1235 vpaddd %ymm7, %ymm2, %ymm2 1236 vpxor %ymm2, %ymm13, %ymm13 1237 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm13, %ymm13 1238 vpaddd %ymm13, %ymm8, %ymm8 1239 vpxor %ymm8, %ymm7, %ymm7 1240 vpaddd %ymm4, %ymm3, %ymm3 1241 vpxor %ymm3, %ymm14, %ymm14 1242 vpshufb L_chacha20_avx2_rotl8(%rip), %ymm14, %ymm14 1243 vpaddd %ymm14, %ymm9, %ymm9 1244 vpxor %ymm9, %ymm4, %ymm4 1245 vmovdqa %ymm11, 96(%r10) 1246 vpsrld $25, %ymm5, %ymm11 1247 vpslld $7, %ymm5, %ymm5 1248 vpxor %ymm11, %ymm5, %ymm5 1249 vpsrld $25, %ymm6, %ymm11 1250 vpslld $7, %ymm6, %ymm6 1251 vpxor %ymm11, %ymm6, %ymm6 1252 vpsrld $25, %ymm7, %ymm11 1253 vpslld $7, %ymm7, %ymm7 1254 vpxor %ymm11, %ymm7, %ymm7 1255 vpsrld $25, %ymm4, %ymm11 1256 vpslld $7, %ymm4, %ymm4 1257 vpxor %ymm11, %ymm4, %ymm4 1258 decb %r8b 1259 jnz L_chacha20_avx2_loop256 1260 vmovdqa 96(%r10), %ymm11 1261 vpaddd (%r9), %ymm0, %ymm0 1262 vpaddd 32(%r9), %ymm1, %ymm1 1263 vpaddd 64(%r9), %ymm2, %ymm2 1264 vpaddd 96(%r9), %ymm3, %ymm3 1265 vpaddd 128(%r9), %ymm4, %ymm4 1266 vpaddd 160(%r9), %ymm5, %ymm5 1267 vpaddd 192(%r9), %ymm6, %ymm6 1268 vpaddd 224(%r9), %ymm7, %ymm7 1269 vpaddd 256(%r9), %ymm8, %ymm8 1270 vpaddd 288(%r9), %ymm9, %ymm9 1271 vpaddd 320(%r9), %ymm10, %ymm10 1272 vpaddd 352(%r9), %ymm11, %ymm11 1273 vpaddd 384(%r9), %ymm12, %ymm12 1274 vpaddd 416(%r9), %ymm13, %ymm13 1275 vpaddd 448(%r9), %ymm14, %ymm14 1276 vpaddd 480(%r9), %ymm15, %ymm15 1277 vmovdqa %ymm8, (%r10) 1278 vmovdqa %ymm9, 32(%r10) 1279 vmovdqa %ymm10, 64(%r10) 1280 vmovdqa %ymm11, 96(%r10) 1281 vmovdqa %ymm12, 128(%r10) 1282 vmovdqa %ymm13, 160(%r10) 1283 vmovdqa %ymm14, 192(%r10) 1284 vmovdqa %ymm15, 224(%r10) 1285 vpunpckldq %ymm1, %ymm0, %ymm8 1286 vpunpckldq %ymm3, %ymm2, %ymm9 1287 vpunpckhdq %ymm1, %ymm0, %ymm12 1288 vpunpckhdq %ymm3, %ymm2, %ymm13 1289 vpunpckldq %ymm5, %ymm4, %ymm10 1290 vpunpckldq %ymm7, %ymm6, %ymm11 1291 vpunpckhdq %ymm5, %ymm4, %ymm14 1292 vpunpckhdq %ymm7, %ymm6, %ymm15 1293 vpunpcklqdq %ymm9, %ymm8, %ymm0 1294 vpunpcklqdq %ymm11, %ymm10, %ymm1 1295 vpunpckhqdq %ymm9, %ymm8, %ymm2 1296 vpunpckhqdq %ymm11, %ymm10, %ymm3 1297 vpunpcklqdq %ymm13, %ymm12, %ymm4 1298 vpunpcklqdq %ymm15, %ymm14, %ymm5 1299 vpunpckhqdq %ymm13, %ymm12, %ymm6 1300 vpunpckhqdq %ymm15, %ymm14, %ymm7 1301 vperm2i128 $32, %ymm1, %ymm0, %ymm8 1302 vperm2i128 $32, %ymm3, %ymm2, %ymm9 1303 vperm2i128 $49, %ymm1, %ymm0, %ymm12 1304 vperm2i128 $49, %ymm3, %ymm2, %ymm13 1305 vperm2i128 $32, %ymm5, %ymm4, %ymm10 1306 vperm2i128 $32, %ymm7, %ymm6, %ymm11 1307 vperm2i128 $49, %ymm5, %ymm4, %ymm14 1308 vperm2i128 $49, %ymm7, %ymm6, %ymm15 1309 vmovdqu (%rsi), %ymm0 1310 vmovdqu 64(%rsi), %ymm1 1311 vmovdqu 128(%rsi), %ymm2 1312 vmovdqu 192(%rsi), %ymm3 1313 vmovdqu 256(%rsi), %ymm4 1314 vmovdqu 320(%rsi), %ymm5 1315 vmovdqu 384(%rsi), %ymm6 1316 vmovdqu 448(%rsi), %ymm7 1317 vpxor %ymm0, %ymm8, %ymm8 1318 vpxor %ymm1, %ymm9, %ymm9 1319 vpxor %ymm2, %ymm10, %ymm10 1320 vpxor %ymm3, %ymm11, %ymm11 1321 vpxor %ymm4, %ymm12, %ymm12 1322 vpxor %ymm5, %ymm13, %ymm13 1323 vpxor %ymm6, %ymm14, %ymm14 1324 vpxor %ymm7, %ymm15, %ymm15 1325 vmovdqu %ymm8, (%rdx) 1326 vmovdqu %ymm9, 64(%rdx) 1327 vmovdqu %ymm10, 128(%rdx) 1328 vmovdqu %ymm11, 192(%rdx) 1329 vmovdqu %ymm12, 256(%rdx) 1330 vmovdqu %ymm13, 320(%rdx) 1331 vmovdqu %ymm14, 384(%rdx) 1332 vmovdqu %ymm15, 448(%rdx) 1333 vmovdqa (%r10), %ymm0 1334 vmovdqa 32(%r10), %ymm1 1335 vmovdqa 64(%r10), %ymm2 1336 vmovdqa 96(%r10), %ymm3 1337 vmovdqa 128(%r10), %ymm4 1338 vmovdqa 160(%r10), %ymm5 1339 vmovdqa 192(%r10), %ymm6 1340 vmovdqa 224(%r10), %ymm7 1341 vpunpckldq %ymm1, %ymm0, %ymm8 1342 vpunpckldq %ymm3, %ymm2, %ymm9 1343 vpunpckhdq %ymm1, %ymm0, %ymm12 1344 vpunpckhdq %ymm3, %ymm2, %ymm13 1345 vpunpckldq %ymm5, %ymm4, %ymm10 1346 vpunpckldq %ymm7, %ymm6, %ymm11 1347 vpunpckhdq %ymm5, %ymm4, %ymm14 1348 vpunpckhdq %ymm7, %ymm6, %ymm15 1349 vpunpcklqdq %ymm9, %ymm8, %ymm0 1350 vpunpcklqdq %ymm11, %ymm10, %ymm1 1351 vpunpckhqdq %ymm9, %ymm8, %ymm2 1352 vpunpckhqdq %ymm11, %ymm10, %ymm3 1353 vpunpcklqdq %ymm13, %ymm12, %ymm4 1354 vpunpcklqdq %ymm15, %ymm14, %ymm5 1355 vpunpckhqdq %ymm13, %ymm12, %ymm6 1356 vpunpckhqdq %ymm15, %ymm14, %ymm7 1357 vperm2i128 $32, %ymm1, %ymm0, %ymm8 1358 vperm2i128 $32, %ymm3, %ymm2, %ymm9 1359 vperm2i128 $49, %ymm1, %ymm0, %ymm12 1360 vperm2i128 $49, %ymm3, %ymm2, %ymm13 1361 vperm2i128 $32, %ymm5, %ymm4, %ymm10 1362 vperm2i128 $32, %ymm7, %ymm6, %ymm11 1363 vperm2i128 $49, %ymm5, %ymm4, %ymm14 1364 vperm2i128 $49, %ymm7, %ymm6, %ymm15 1365 vmovdqu 32(%rsi), %ymm0 1366 vmovdqu 96(%rsi), %ymm1 1367 vmovdqu 160(%rsi), %ymm2 1368 vmovdqu 224(%rsi), %ymm3 1369 vmovdqu 288(%rsi), %ymm4 1370 vmovdqu 352(%rsi), %ymm5 1371 vmovdqu 416(%rsi), %ymm6 1372 vmovdqu 480(%rsi), %ymm7 1373 vpxor %ymm0, %ymm8, %ymm8 1374 vpxor %ymm1, %ymm9, %ymm9 1375 vpxor %ymm2, %ymm10, %ymm10 1376 vpxor %ymm3, %ymm11, %ymm11 1377 vpxor %ymm4, %ymm12, %ymm12 1378 vpxor %ymm5, %ymm13, %ymm13 1379 vpxor %ymm6, %ymm14, %ymm14 1380 vpxor %ymm7, %ymm15, %ymm15 1381 vmovdqu %ymm8, 32(%rdx) 1382 vmovdqu %ymm9, 96(%rdx) 1383 vmovdqu %ymm10, 160(%rdx) 1384 vmovdqu %ymm11, 224(%rdx) 1385 vmovdqu %ymm12, 288(%rdx) 1386 vmovdqu %ymm13, 352(%rdx) 1387 vmovdqu %ymm14, 416(%rdx) 1388 vmovdqu %ymm15, 480(%rdx) 1389 vmovdqa 384(%r9), %ymm12 1390 addq $0x200, %rsi 1391 addq $0x200, %rdx 1392 vpaddd L_chacha20_avx2_eight(%rip), %ymm12, %ymm12 1393 subl $0x200, %ecx 1394 vmovdqa %ymm12, 384(%r9) 1395 cmpl $0x200, %ecx 1396 jl L_chacha20_avx2_done256 1397 vmovdqa (%r9), %ymm0 1398 vmovdqa 32(%r9), %ymm1 1399 vmovdqa 64(%r9), %ymm2 1400 vmovdqa 96(%r9), %ymm3 1401 vmovdqa 128(%r9), %ymm4 1402 vmovdqa 160(%r9), %ymm5 1403 vmovdqa 192(%r9), %ymm6 1404 vmovdqa 224(%r9), %ymm7 1405 vmovdqa 256(%r9), %ymm8 1406 vmovdqa 288(%r9), %ymm9 1407 vmovdqa 320(%r9), %ymm10 1408 vmovdqa 352(%r9), %ymm11 1409 vmovdqa 384(%r9), %ymm12 1410 vmovdqa 416(%r9), %ymm13 1411 vmovdqa 448(%r9), %ymm14 1412 vmovdqa 480(%r9), %ymm15 1413 jmp L_chacha20_avx2_start256 1414L_chacha20_avx2_done256: 1415 shl $3, %eax 1416 addl %eax, 48(%rdi) 1417L_chacha20_avx2_end256: 1418#ifndef __APPLE__ 1419 callq chacha_encrypt_avx1@plt 1420#else 1421 callq _chacha_encrypt_avx1 1422#endif /* __APPLE__ */ 1423 addq $0x310, %rsp 1424 repz retq 1425#ifndef __APPLE__ 1426.size chacha_encrypt_avx2,.-chacha_encrypt_avx2 1427#endif /* __APPLE__ */ 1428#endif /* HAVE_INTEL_AVX2 */ 1429 1430#if defined(__linux__) && defined(__ELF__) 1431.section .note.GNU-stack,"",%progbits 1432#endif 1433