1 #if defined(__x86_64__) 2 .text 3 4 5 .globl asm_RC4 6 .hidden asm_RC4 7 .type asm_RC4,@function 8 .align 16 9 asm_RC4: 10 orq %rsi,%rsi 11 jne .Lentry 12 .byte 0xf3,0xc3 13 .Lentry: 14 pushq %rbx 15 pushq %r12 16 pushq %r13 17 .Lprologue: 18 movq %rsi,%r11 19 movq %rdx,%r12 20 movq %rcx,%r13 21 xorq %r10,%r10 22 xorq %rcx,%rcx 23 24 leaq 8(%rdi),%rdi 25 movb -8(%rdi),%r10b 26 movb -4(%rdi),%cl 27 cmpl $-1,256(%rdi) 28 je .LRC4_CHAR 29 movq OPENSSL_ia32cap_P@GOTPCREL(%rip),%r8 30 movl (%r8),%r8d 31 xorq %rbx,%rbx 32 incb %r10b 33 subq %r10,%rbx 34 subq %r12,%r13 35 movl (%rdi,%r10,4),%eax 36 testq $-16,%r11 37 jz .Lloop1 38 btl $30,%r8d 39 jc .Lintel 40 andq $7,%rbx 41 leaq 1(%r10),%rsi 42 jz .Loop8 43 subq %rbx,%r11 44 .Loop8_warmup: 45 addb %al,%cl 46 movl (%rdi,%rcx,4),%edx 47 movl %eax,(%rdi,%rcx,4) 48 movl %edx,(%rdi,%r10,4) 49 addb %dl,%al 50 incb %r10b 51 movl (%rdi,%rax,4),%edx 52 movl (%rdi,%r10,4),%eax 53 xorb (%r12),%dl 54 movb %dl,(%r12,%r13,1) 55 leaq 1(%r12),%r12 56 decq %rbx 57 jnz .Loop8_warmup 58 59 leaq 1(%r10),%rsi 60 jmp .Loop8 61 .align 16 62 .Loop8: 63 addb %al,%cl 64 movl (%rdi,%rcx,4),%edx 65 movl %eax,(%rdi,%rcx,4) 66 movl 0(%rdi,%rsi,4),%ebx 67 rorq $8,%r8 68 movl %edx,0(%rdi,%r10,4) 69 addb %al,%dl 70 movb (%rdi,%rdx,4),%r8b 71 addb %bl,%cl 72 movl (%rdi,%rcx,4),%edx 73 movl %ebx,(%rdi,%rcx,4) 74 movl 4(%rdi,%rsi,4),%eax 75 rorq $8,%r8 76 movl %edx,4(%rdi,%r10,4) 77 addb %bl,%dl 78 movb (%rdi,%rdx,4),%r8b 79 addb %al,%cl 80 movl (%rdi,%rcx,4),%edx 81 movl %eax,(%rdi,%rcx,4) 82 movl 8(%rdi,%rsi,4),%ebx 83 rorq $8,%r8 84 movl %edx,8(%rdi,%r10,4) 85 addb %al,%dl 86 movb (%rdi,%rdx,4),%r8b 87 addb %bl,%cl 88 movl (%rdi,%rcx,4),%edx 89 movl %ebx,(%rdi,%rcx,4) 90 movl 12(%rdi,%rsi,4),%eax 91 rorq $8,%r8 92 movl %edx,12(%rdi,%r10,4) 93 addb %bl,%dl 94 movb (%rdi,%rdx,4),%r8b 95 addb %al,%cl 96 movl (%rdi,%rcx,4),%edx 97 movl %eax,(%rdi,%rcx,4) 98 movl 16(%rdi,%rsi,4),%ebx 99 rorq $8,%r8 100 movl %edx,16(%rdi,%r10,4) 101 addb %al,%dl 102 movb (%rdi,%rdx,4),%r8b 103 addb %bl,%cl 104 movl (%rdi,%rcx,4),%edx 105 movl %ebx,(%rdi,%rcx,4) 106 movl 20(%rdi,%rsi,4),%eax 107 rorq $8,%r8 108 movl %edx,20(%rdi,%r10,4) 109 addb %bl,%dl 110 movb (%rdi,%rdx,4),%r8b 111 addb %al,%cl 112 movl (%rdi,%rcx,4),%edx 113 movl %eax,(%rdi,%rcx,4) 114 movl 24(%rdi,%rsi,4),%ebx 115 rorq $8,%r8 116 movl %edx,24(%rdi,%r10,4) 117 addb %al,%dl 118 movb (%rdi,%rdx,4),%r8b 119 addb $8,%sil 120 addb %bl,%cl 121 movl (%rdi,%rcx,4),%edx 122 movl %ebx,(%rdi,%rcx,4) 123 movl -4(%rdi,%rsi,4),%eax 124 rorq $8,%r8 125 movl %edx,28(%rdi,%r10,4) 126 addb %bl,%dl 127 movb (%rdi,%rdx,4),%r8b 128 addb $8,%r10b 129 rorq $8,%r8 130 subq $8,%r11 131 132 xorq (%r12),%r8 133 movq %r8,(%r12,%r13,1) 134 leaq 8(%r12),%r12 135 136 testq $-8,%r11 137 jnz .Loop8 138 cmpq $0,%r11 139 jne .Lloop1 140 jmp .Lexit 141 142 .align 16 143 .Lintel: 144 testq $-32,%r11 145 jz .Lloop1 146 andq $15,%rbx 147 jz .Loop16_is_hot 148 subq %rbx,%r11 149 .Loop16_warmup: 150 addb %al,%cl 151 movl (%rdi,%rcx,4),%edx 152 movl %eax,(%rdi,%rcx,4) 153 movl %edx,(%rdi,%r10,4) 154 addb %dl,%al 155 incb %r10b 156 movl (%rdi,%rax,4),%edx 157 movl (%rdi,%r10,4),%eax 158 xorb (%r12),%dl 159 movb %dl,(%r12,%r13,1) 160 leaq 1(%r12),%r12 161 decq %rbx 162 jnz .Loop16_warmup 163 164 movq %rcx,%rbx 165 xorq %rcx,%rcx 166 movb %bl,%cl 167 168 .Loop16_is_hot: 169 leaq (%rdi,%r10,4),%rsi 170 addb %al,%cl 171 movl (%rdi,%rcx,4),%edx 172 pxor %xmm0,%xmm0 173 movl %eax,(%rdi,%rcx,4) 174 addb %dl,%al 175 movl 4(%rsi),%ebx 176 movzbl %al,%eax 177 movl %edx,0(%rsi) 178 addb %bl,%cl 179 pinsrw $0,(%rdi,%rax,4),%xmm0 180 jmp .Loop16_enter 181 .align 16 182 .Loop16: 183 addb %al,%cl 184 movl (%rdi,%rcx,4),%edx 185 pxor %xmm0,%xmm2 186 psllq $8,%xmm1 187 pxor %xmm0,%xmm0 188 movl %eax,(%rdi,%rcx,4) 189 addb %dl,%al 190 movl 4(%rsi),%ebx 191 movzbl %al,%eax 192 movl %edx,0(%rsi) 193 pxor %xmm1,%xmm2 194 addb %bl,%cl 195 pinsrw $0,(%rdi,%rax,4),%xmm0 196 movdqu %xmm2,(%r12,%r13,1) 197 leaq 16(%r12),%r12 198 .Loop16_enter: 199 movl (%rdi,%rcx,4),%edx 200 pxor %xmm1,%xmm1 201 movl %ebx,(%rdi,%rcx,4) 202 addb %dl,%bl 203 movl 8(%rsi),%eax 204 movzbl %bl,%ebx 205 movl %edx,4(%rsi) 206 addb %al,%cl 207 pinsrw $0,(%rdi,%rbx,4),%xmm1 208 movl (%rdi,%rcx,4),%edx 209 movl %eax,(%rdi,%rcx,4) 210 addb %dl,%al 211 movl 12(%rsi),%ebx 212 movzbl %al,%eax 213 movl %edx,8(%rsi) 214 addb %bl,%cl 215 pinsrw $1,(%rdi,%rax,4),%xmm0 216 movl (%rdi,%rcx,4),%edx 217 movl %ebx,(%rdi,%rcx,4) 218 addb %dl,%bl 219 movl 16(%rsi),%eax 220 movzbl %bl,%ebx 221 movl %edx,12(%rsi) 222 addb %al,%cl 223 pinsrw $1,(%rdi,%rbx,4),%xmm1 224 movl (%rdi,%rcx,4),%edx 225 movl %eax,(%rdi,%rcx,4) 226 addb %dl,%al 227 movl 20(%rsi),%ebx 228 movzbl %al,%eax 229 movl %edx,16(%rsi) 230 addb %bl,%cl 231 pinsrw $2,(%rdi,%rax,4),%xmm0 232 movl (%rdi,%rcx,4),%edx 233 movl %ebx,(%rdi,%rcx,4) 234 addb %dl,%bl 235 movl 24(%rsi),%eax 236 movzbl %bl,%ebx 237 movl %edx,20(%rsi) 238 addb %al,%cl 239 pinsrw $2,(%rdi,%rbx,4),%xmm1 240 movl (%rdi,%rcx,4),%edx 241 movl %eax,(%rdi,%rcx,4) 242 addb %dl,%al 243 movl 28(%rsi),%ebx 244 movzbl %al,%eax 245 movl %edx,24(%rsi) 246 addb %bl,%cl 247 pinsrw $3,(%rdi,%rax,4),%xmm0 248 movl (%rdi,%rcx,4),%edx 249 movl %ebx,(%rdi,%rcx,4) 250 addb %dl,%bl 251 movl 32(%rsi),%eax 252 movzbl %bl,%ebx 253 movl %edx,28(%rsi) 254 addb %al,%cl 255 pinsrw $3,(%rdi,%rbx,4),%xmm1 256 movl (%rdi,%rcx,4),%edx 257 movl %eax,(%rdi,%rcx,4) 258 addb %dl,%al 259 movl 36(%rsi),%ebx 260 movzbl %al,%eax 261 movl %edx,32(%rsi) 262 addb %bl,%cl 263 pinsrw $4,(%rdi,%rax,4),%xmm0 264 movl (%rdi,%rcx,4),%edx 265 movl %ebx,(%rdi,%rcx,4) 266 addb %dl,%bl 267 movl 40(%rsi),%eax 268 movzbl %bl,%ebx 269 movl %edx,36(%rsi) 270 addb %al,%cl 271 pinsrw $4,(%rdi,%rbx,4),%xmm1 272 movl (%rdi,%rcx,4),%edx 273 movl %eax,(%rdi,%rcx,4) 274 addb %dl,%al 275 movl 44(%rsi),%ebx 276 movzbl %al,%eax 277 movl %edx,40(%rsi) 278 addb %bl,%cl 279 pinsrw $5,(%rdi,%rax,4),%xmm0 280 movl (%rdi,%rcx,4),%edx 281 movl %ebx,(%rdi,%rcx,4) 282 addb %dl,%bl 283 movl 48(%rsi),%eax 284 movzbl %bl,%ebx 285 movl %edx,44(%rsi) 286 addb %al,%cl 287 pinsrw $5,(%rdi,%rbx,4),%xmm1 288 movl (%rdi,%rcx,4),%edx 289 movl %eax,(%rdi,%rcx,4) 290 addb %dl,%al 291 movl 52(%rsi),%ebx 292 movzbl %al,%eax 293 movl %edx,48(%rsi) 294 addb %bl,%cl 295 pinsrw $6,(%rdi,%rax,4),%xmm0 296 movl (%rdi,%rcx,4),%edx 297 movl %ebx,(%rdi,%rcx,4) 298 addb %dl,%bl 299 movl 56(%rsi),%eax 300 movzbl %bl,%ebx 301 movl %edx,52(%rsi) 302 addb %al,%cl 303 pinsrw $6,(%rdi,%rbx,4),%xmm1 304 movl (%rdi,%rcx,4),%edx 305 movl %eax,(%rdi,%rcx,4) 306 addb %dl,%al 307 movl 60(%rsi),%ebx 308 movzbl %al,%eax 309 movl %edx,56(%rsi) 310 addb %bl,%cl 311 pinsrw $7,(%rdi,%rax,4),%xmm0 312 addb $16,%r10b 313 movdqu (%r12),%xmm2 314 movl (%rdi,%rcx,4),%edx 315 movl %ebx,(%rdi,%rcx,4) 316 addb %dl,%bl 317 movzbl %bl,%ebx 318 movl %edx,60(%rsi) 319 leaq (%rdi,%r10,4),%rsi 320 pinsrw $7,(%rdi,%rbx,4),%xmm1 321 movl (%rsi),%eax 322 movq %rcx,%rbx 323 xorq %rcx,%rcx 324 subq $16,%r11 325 movb %bl,%cl 326 testq $-16,%r11 327 jnz .Loop16 328 329 psllq $8,%xmm1 330 pxor %xmm0,%xmm2 331 pxor %xmm1,%xmm2 332 movdqu %xmm2,(%r12,%r13,1) 333 leaq 16(%r12),%r12 334 335 cmpq $0,%r11 336 jne .Lloop1 337 jmp .Lexit 338 339 .align 16 340 .Lloop1: 341 addb %al,%cl 342 movl (%rdi,%rcx,4),%edx 343 movl %eax,(%rdi,%rcx,4) 344 movl %edx,(%rdi,%r10,4) 345 addb %dl,%al 346 incb %r10b 347 movl (%rdi,%rax,4),%edx 348 movl (%rdi,%r10,4),%eax 349 xorb (%r12),%dl 350 movb %dl,(%r12,%r13,1) 351 leaq 1(%r12),%r12 352 decq %r11 353 jnz .Lloop1 354 jmp .Lexit 355 356 .align 16 357 .LRC4_CHAR: 358 addb $1,%r10b 359 movzbl (%rdi,%r10,1),%eax 360 testq $-8,%r11 361 jz .Lcloop1 362 jmp .Lcloop8 363 .align 16 364 .Lcloop8: 365 movl (%r12),%r8d 366 movl 4(%r12),%r9d 367 addb %al,%cl 368 leaq 1(%r10),%rsi 369 movzbl (%rdi,%rcx,1),%edx 370 movzbl %sil,%esi 371 movzbl (%rdi,%rsi,1),%ebx 372 movb %al,(%rdi,%rcx,1) 373 cmpq %rsi,%rcx 374 movb %dl,(%rdi,%r10,1) 375 jne .Lcmov0 376 movq %rax,%rbx 377 .Lcmov0: 378 addb %al,%dl 379 xorb (%rdi,%rdx,1),%r8b 380 rorl $8,%r8d 381 addb %bl,%cl 382 leaq 1(%rsi),%r10 383 movzbl (%rdi,%rcx,1),%edx 384 movzbl %r10b,%r10d 385 movzbl (%rdi,%r10,1),%eax 386 movb %bl,(%rdi,%rcx,1) 387 cmpq %r10,%rcx 388 movb %dl,(%rdi,%rsi,1) 389 jne .Lcmov1 390 movq %rbx,%rax 391 .Lcmov1: 392 addb %bl,%dl 393 xorb (%rdi,%rdx,1),%r8b 394 rorl $8,%r8d 395 addb %al,%cl 396 leaq 1(%r10),%rsi 397 movzbl (%rdi,%rcx,1),%edx 398 movzbl %sil,%esi 399 movzbl (%rdi,%rsi,1),%ebx 400 movb %al,(%rdi,%rcx,1) 401 cmpq %rsi,%rcx 402 movb %dl,(%rdi,%r10,1) 403 jne .Lcmov2 404 movq %rax,%rbx 405 .Lcmov2: 406 addb %al,%dl 407 xorb (%rdi,%rdx,1),%r8b 408 rorl $8,%r8d 409 addb %bl,%cl 410 leaq 1(%rsi),%r10 411 movzbl (%rdi,%rcx,1),%edx 412 movzbl %r10b,%r10d 413 movzbl (%rdi,%r10,1),%eax 414 movb %bl,(%rdi,%rcx,1) 415 cmpq %r10,%rcx 416 movb %dl,(%rdi,%rsi,1) 417 jne .Lcmov3 418 movq %rbx,%rax 419 .Lcmov3: 420 addb %bl,%dl 421 xorb (%rdi,%rdx,1),%r8b 422 rorl $8,%r8d 423 addb %al,%cl 424 leaq 1(%r10),%rsi 425 movzbl (%rdi,%rcx,1),%edx 426 movzbl %sil,%esi 427 movzbl (%rdi,%rsi,1),%ebx 428 movb %al,(%rdi,%rcx,1) 429 cmpq %rsi,%rcx 430 movb %dl,(%rdi,%r10,1) 431 jne .Lcmov4 432 movq %rax,%rbx 433 .Lcmov4: 434 addb %al,%dl 435 xorb (%rdi,%rdx,1),%r9b 436 rorl $8,%r9d 437 addb %bl,%cl 438 leaq 1(%rsi),%r10 439 movzbl (%rdi,%rcx,1),%edx 440 movzbl %r10b,%r10d 441 movzbl (%rdi,%r10,1),%eax 442 movb %bl,(%rdi,%rcx,1) 443 cmpq %r10,%rcx 444 movb %dl,(%rdi,%rsi,1) 445 jne .Lcmov5 446 movq %rbx,%rax 447 .Lcmov5: 448 addb %bl,%dl 449 xorb (%rdi,%rdx,1),%r9b 450 rorl $8,%r9d 451 addb %al,%cl 452 leaq 1(%r10),%rsi 453 movzbl (%rdi,%rcx,1),%edx 454 movzbl %sil,%esi 455 movzbl (%rdi,%rsi,1),%ebx 456 movb %al,(%rdi,%rcx,1) 457 cmpq %rsi,%rcx 458 movb %dl,(%rdi,%r10,1) 459 jne .Lcmov6 460 movq %rax,%rbx 461 .Lcmov6: 462 addb %al,%dl 463 xorb (%rdi,%rdx,1),%r9b 464 rorl $8,%r9d 465 addb %bl,%cl 466 leaq 1(%rsi),%r10 467 movzbl (%rdi,%rcx,1),%edx 468 movzbl %r10b,%r10d 469 movzbl (%rdi,%r10,1),%eax 470 movb %bl,(%rdi,%rcx,1) 471 cmpq %r10,%rcx 472 movb %dl,(%rdi,%rsi,1) 473 jne .Lcmov7 474 movq %rbx,%rax 475 .Lcmov7: 476 addb %bl,%dl 477 xorb (%rdi,%rdx,1),%r9b 478 rorl $8,%r9d 479 leaq -8(%r11),%r11 480 movl %r8d,(%r13) 481 leaq 8(%r12),%r12 482 movl %r9d,4(%r13) 483 leaq 8(%r13),%r13 484 485 testq $-8,%r11 486 jnz .Lcloop8 487 cmpq $0,%r11 488 jne .Lcloop1 489 jmp .Lexit 490 .align 16 491 .Lcloop1: 492 addb %al,%cl 493 movzbl %cl,%ecx 494 movzbl (%rdi,%rcx,1),%edx 495 movb %al,(%rdi,%rcx,1) 496 movb %dl,(%rdi,%r10,1) 497 addb %al,%dl 498 addb $1,%r10b 499 movzbl %dl,%edx 500 movzbl %r10b,%r10d 501 movzbl (%rdi,%rdx,1),%edx 502 movzbl (%rdi,%r10,1),%eax 503 xorb (%r12),%dl 504 leaq 1(%r12),%r12 505 movb %dl,(%r13) 506 leaq 1(%r13),%r13 507 subq $1,%r11 508 jnz .Lcloop1 509 jmp .Lexit 510 511 .align 16 512 .Lexit: 513 subb $1,%r10b 514 movl %r10d,-8(%rdi) 515 movl %ecx,-4(%rdi) 516 517 movq (%rsp),%r13 518 movq 8(%rsp),%r12 519 movq 16(%rsp),%rbx 520 addq $24,%rsp 521 .Lepilogue: 522 .byte 0xf3,0xc3 523 .size asm_RC4,.-asm_RC4 524 .globl asm_RC4_set_key 525 .hidden asm_RC4_set_key 526 .type asm_RC4_set_key,@function 527 .align 16 528 asm_RC4_set_key: 529 leaq 8(%rdi),%rdi 530 leaq (%rdx,%rsi,1),%rdx 531 negq %rsi 532 movq %rsi,%rcx 533 xorl %eax,%eax 534 xorq %r9,%r9 535 xorq %r10,%r10 536 xorq %r11,%r11 537 538 movq OPENSSL_ia32cap_P@GOTPCREL(%rip),%r8 539 movl (%r8),%r8d 540 btl $20,%r8d 541 jc .Lc1stloop 542 jmp .Lw1stloop 543 544 .align 16 545 .Lw1stloop: 546 movl %eax,(%rdi,%rax,4) 547 addb $1,%al 548 jnc .Lw1stloop 549 550 xorq %r9,%r9 551 xorq %r8,%r8 552 .align 16 553 .Lw2ndloop: 554 movl (%rdi,%r9,4),%r10d 555 addb (%rdx,%rsi,1),%r8b 556 addb %r10b,%r8b 557 addq $1,%rsi 558 movl (%rdi,%r8,4),%r11d 559 cmovzq %rcx,%rsi 560 movl %r10d,(%rdi,%r8,4) 561 movl %r11d,(%rdi,%r9,4) 562 addb $1,%r9b 563 jnc .Lw2ndloop 564 jmp .Lexit_key 565 566 .align 16 567 .Lc1stloop: 568 movb %al,(%rdi,%rax,1) 569 addb $1,%al 570 jnc .Lc1stloop 571 572 xorq %r9,%r9 573 xorq %r8,%r8 574 .align 16 575 .Lc2ndloop: 576 movb (%rdi,%r9,1),%r10b 577 addb (%rdx,%rsi,1),%r8b 578 addb %r10b,%r8b 579 addq $1,%rsi 580 movb (%rdi,%r8,1),%r11b 581 jnz .Lcnowrap 582 movq %rcx,%rsi 583 .Lcnowrap: 584 movb %r10b,(%rdi,%r8,1) 585 movb %r11b,(%rdi,%r9,1) 586 addb $1,%r9b 587 jnc .Lc2ndloop 588 movl $-1,256(%rdi) 589 590 .align 16 591 .Lexit_key: 592 xorl %eax,%eax 593 movl %eax,-8(%rdi) 594 movl %eax,-4(%rdi) 595 .byte 0xf3,0xc3 596 .size asm_RC4_set_key,.-asm_RC4_set_key 597 598 .globl RC4_options 599 .hidden RC4_options 600 .type RC4_options,@function 601 .align 16 602 RC4_options: 603 leaq .Lopts(%rip),%rax 604 movq OPENSSL_ia32cap_P(%rip),%rdx 605 movl (%rdx),%edx 606 btl $20,%edx 607 jc .L8xchar 608 btl $30,%edx 609 jnc .Ldone 610 addq $25,%rax 611 .byte 0xf3,0xc3 612 .L8xchar: 613 addq $12,%rax 614 .Ldone: 615 .byte 0xf3,0xc3 616 .align 64 617 .Lopts: 618 .byte 114,99,52,40,56,120,44,105,110,116,41,0 619 .byte 114,99,52,40,56,120,44,99,104,97,114,41,0 620 .byte 114,99,52,40,49,54,120,44,105,110,116,41,0 621 .byte 82,67,52,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 622 .align 64 623 .size RC4_options,.-RC4_options 624 #endif 625