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