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