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