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