1238405Sjkim # $FreeBSD$ 2238405Sjkim.text 3238405Sjkim 4238405Sjkim 5238405Sjkim.globl RC4 6238405Sjkim.type RC4,@function 7238405Sjkim.align 16 8238405SjkimRC4: orq %rsi,%rsi 9238405Sjkim jne .Lentry 10238405Sjkim .byte 0xf3,0xc3 11238405Sjkim.Lentry: 12238405Sjkim pushq %rbx 13238405Sjkim pushq %r12 14238405Sjkim pushq %r13 15238405Sjkim.Lprologue: 16238405Sjkim movq %rsi,%r11 17238405Sjkim movq %rdx,%r12 18238405Sjkim movq %rcx,%r13 19238405Sjkim xorq %r10,%r10 20238405Sjkim xorq %rcx,%rcx 21238405Sjkim 22238405Sjkim leaq 8(%rdi),%rdi 23238405Sjkim movb -8(%rdi),%r10b 24238405Sjkim movb -4(%rdi),%cl 25238405Sjkim cmpl $-1,256(%rdi) 26238405Sjkim je .LRC4_CHAR 27238405Sjkim movl OPENSSL_ia32cap_P(%rip),%r8d 28238405Sjkim xorq %rbx,%rbx 29238405Sjkim incb %r10b 30238405Sjkim subq %r10,%rbx 31238405Sjkim subq %r12,%r13 32238405Sjkim movl (%rdi,%r10,4),%eax 33238405Sjkim testq $-16,%r11 34238405Sjkim jz .Lloop1 35238405Sjkim btl $30,%r8d 36238405Sjkim jc .Lintel 37238405Sjkim andq $7,%rbx 38238405Sjkim leaq 1(%r10),%rsi 39238405Sjkim jz .Loop8 40238405Sjkim subq %rbx,%r11 41238405Sjkim.Loop8_warmup: 42238405Sjkim addb %al,%cl 43238405Sjkim movl (%rdi,%rcx,4),%edx 44238405Sjkim movl %eax,(%rdi,%rcx,4) 45238405Sjkim movl %edx,(%rdi,%r10,4) 46238405Sjkim addb %dl,%al 47238405Sjkim incb %r10b 48238405Sjkim movl (%rdi,%rax,4),%edx 49238405Sjkim movl (%rdi,%r10,4),%eax 50238405Sjkim xorb (%r12),%dl 51238405Sjkim movb %dl,(%r13,%r12,1) 52238405Sjkim leaq 1(%r12),%r12 53238405Sjkim decq %rbx 54238405Sjkim jnz .Loop8_warmup 55238405Sjkim 56238405Sjkim leaq 1(%r10),%rsi 57238405Sjkim jmp .Loop8 58238405Sjkim.align 16 59238405Sjkim.Loop8: 60238405Sjkim addb %al,%cl 61238405Sjkim movl (%rdi,%rcx,4),%edx 62238405Sjkim movl %eax,(%rdi,%rcx,4) 63238405Sjkim movl 0(%rdi,%rsi,4),%ebx 64238405Sjkim rorq $8,%r8 65238405Sjkim movl %edx,0(%rdi,%r10,4) 66238405Sjkim addb %al,%dl 67238405Sjkim movb (%rdi,%rdx,4),%r8b 68238405Sjkim addb %bl,%cl 69238405Sjkim movl (%rdi,%rcx,4),%edx 70238405Sjkim movl %ebx,(%rdi,%rcx,4) 71238405Sjkim movl 4(%rdi,%rsi,4),%eax 72238405Sjkim rorq $8,%r8 73238405Sjkim movl %edx,4(%rdi,%r10,4) 74238405Sjkim addb %bl,%dl 75238405Sjkim movb (%rdi,%rdx,4),%r8b 76238405Sjkim addb %al,%cl 77238405Sjkim movl (%rdi,%rcx,4),%edx 78238405Sjkim movl %eax,(%rdi,%rcx,4) 79238405Sjkim movl 8(%rdi,%rsi,4),%ebx 80238405Sjkim rorq $8,%r8 81238405Sjkim movl %edx,8(%rdi,%r10,4) 82238405Sjkim addb %al,%dl 83238405Sjkim movb (%rdi,%rdx,4),%r8b 84238405Sjkim addb %bl,%cl 85238405Sjkim movl (%rdi,%rcx,4),%edx 86238405Sjkim movl %ebx,(%rdi,%rcx,4) 87238405Sjkim movl 12(%rdi,%rsi,4),%eax 88238405Sjkim rorq $8,%r8 89238405Sjkim movl %edx,12(%rdi,%r10,4) 90238405Sjkim addb %bl,%dl 91238405Sjkim movb (%rdi,%rdx,4),%r8b 92238405Sjkim addb %al,%cl 93238405Sjkim movl (%rdi,%rcx,4),%edx 94238405Sjkim movl %eax,(%rdi,%rcx,4) 95238405Sjkim movl 16(%rdi,%rsi,4),%ebx 96238405Sjkim rorq $8,%r8 97238405Sjkim movl %edx,16(%rdi,%r10,4) 98238405Sjkim addb %al,%dl 99238405Sjkim movb (%rdi,%rdx,4),%r8b 100238405Sjkim addb %bl,%cl 101238405Sjkim movl (%rdi,%rcx,4),%edx 102238405Sjkim movl %ebx,(%rdi,%rcx,4) 103238405Sjkim movl 20(%rdi,%rsi,4),%eax 104238405Sjkim rorq $8,%r8 105238405Sjkim movl %edx,20(%rdi,%r10,4) 106238405Sjkim addb %bl,%dl 107238405Sjkim movb (%rdi,%rdx,4),%r8b 108238405Sjkim addb %al,%cl 109238405Sjkim movl (%rdi,%rcx,4),%edx 110238405Sjkim movl %eax,(%rdi,%rcx,4) 111238405Sjkim movl 24(%rdi,%rsi,4),%ebx 112238405Sjkim rorq $8,%r8 113238405Sjkim movl %edx,24(%rdi,%r10,4) 114238405Sjkim addb %al,%dl 115238405Sjkim movb (%rdi,%rdx,4),%r8b 116238405Sjkim addb $8,%sil 117238405Sjkim addb %bl,%cl 118238405Sjkim movl (%rdi,%rcx,4),%edx 119238405Sjkim movl %ebx,(%rdi,%rcx,4) 120238405Sjkim movl -4(%rdi,%rsi,4),%eax 121238405Sjkim rorq $8,%r8 122238405Sjkim movl %edx,28(%rdi,%r10,4) 123238405Sjkim addb %bl,%dl 124238405Sjkim movb (%rdi,%rdx,4),%r8b 125238405Sjkim addb $8,%r10b 126238405Sjkim rorq $8,%r8 127238405Sjkim subq $8,%r11 128238405Sjkim 129238405Sjkim xorq (%r12),%r8 130238405Sjkim movq %r8,(%r13,%r12,1) 131238405Sjkim leaq 8(%r12),%r12 132238405Sjkim 133238405Sjkim testq $-8,%r11 134238405Sjkim jnz .Loop8 135238405Sjkim cmpq $0,%r11 136238405Sjkim jne .Lloop1 137238405Sjkim jmp .Lexit 138238405Sjkim 139238405Sjkim.align 16 140238405Sjkim.Lintel: 141238405Sjkim testq $-32,%r11 142238405Sjkim jz .Lloop1 143238405Sjkim andq $15,%rbx 144238405Sjkim jz .Loop16_is_hot 145238405Sjkim subq %rbx,%r11 146238405Sjkim.Loop16_warmup: 147238405Sjkim addb %al,%cl 148238405Sjkim movl (%rdi,%rcx,4),%edx 149238405Sjkim movl %eax,(%rdi,%rcx,4) 150238405Sjkim movl %edx,(%rdi,%r10,4) 151238405Sjkim addb %dl,%al 152238405Sjkim incb %r10b 153238405Sjkim movl (%rdi,%rax,4),%edx 154238405Sjkim movl (%rdi,%r10,4),%eax 155238405Sjkim xorb (%r12),%dl 156238405Sjkim movb %dl,(%r13,%r12,1) 157238405Sjkim leaq 1(%r12),%r12 158238405Sjkim decq %rbx 159238405Sjkim jnz .Loop16_warmup 160238405Sjkim 161238405Sjkim movq %rcx,%rbx 162238405Sjkim xorq %rcx,%rcx 163238405Sjkim movb %bl,%cl 164238405Sjkim 165238405Sjkim.Loop16_is_hot: 166238405Sjkim leaq (%rdi,%r10,4),%rsi 167238405Sjkim addb %al,%cl 168238405Sjkim movl (%rdi,%rcx,4),%edx 169238405Sjkim pxor %xmm0,%xmm0 170238405Sjkim movl %eax,(%rdi,%rcx,4) 171238405Sjkim addb %dl,%al 172238405Sjkim movl 4(%rsi),%ebx 173238405Sjkim movzbl %al,%eax 174238405Sjkim movl %edx,0(%rsi) 175238405Sjkim addb %bl,%cl 176238405Sjkim pinsrw $0,(%rdi,%rax,4),%xmm0 177238405Sjkim jmp .Loop16_enter 178238405Sjkim.align 16 179238405Sjkim.Loop16: 180238405Sjkim addb %al,%cl 181238405Sjkim movl (%rdi,%rcx,4),%edx 182238405Sjkim pxor %xmm0,%xmm2 183238405Sjkim psllq $8,%xmm1 184238405Sjkim pxor %xmm0,%xmm0 185238405Sjkim movl %eax,(%rdi,%rcx,4) 186238405Sjkim addb %dl,%al 187238405Sjkim movl 4(%rsi),%ebx 188238405Sjkim movzbl %al,%eax 189238405Sjkim movl %edx,0(%rsi) 190238405Sjkim pxor %xmm1,%xmm2 191238405Sjkim addb %bl,%cl 192238405Sjkim pinsrw $0,(%rdi,%rax,4),%xmm0 193238405Sjkim movdqu %xmm2,(%r13,%r12,1) 194238405Sjkim leaq 16(%r12),%r12 195238405Sjkim.Loop16_enter: 196238405Sjkim movl (%rdi,%rcx,4),%edx 197238405Sjkim pxor %xmm1,%xmm1 198238405Sjkim movl %ebx,(%rdi,%rcx,4) 199238405Sjkim addb %dl,%bl 200238405Sjkim movl 8(%rsi),%eax 201238405Sjkim movzbl %bl,%ebx 202238405Sjkim movl %edx,4(%rsi) 203238405Sjkim addb %al,%cl 204238405Sjkim pinsrw $0,(%rdi,%rbx,4),%xmm1 205238405Sjkim movl (%rdi,%rcx,4),%edx 206238405Sjkim movl %eax,(%rdi,%rcx,4) 207238405Sjkim addb %dl,%al 208238405Sjkim movl 12(%rsi),%ebx 209238405Sjkim movzbl %al,%eax 210238405Sjkim movl %edx,8(%rsi) 211238405Sjkim addb %bl,%cl 212238405Sjkim pinsrw $1,(%rdi,%rax,4),%xmm0 213238405Sjkim movl (%rdi,%rcx,4),%edx 214238405Sjkim movl %ebx,(%rdi,%rcx,4) 215238405Sjkim addb %dl,%bl 216238405Sjkim movl 16(%rsi),%eax 217238405Sjkim movzbl %bl,%ebx 218238405Sjkim movl %edx,12(%rsi) 219238405Sjkim addb %al,%cl 220238405Sjkim pinsrw $1,(%rdi,%rbx,4),%xmm1 221238405Sjkim movl (%rdi,%rcx,4),%edx 222238405Sjkim movl %eax,(%rdi,%rcx,4) 223238405Sjkim addb %dl,%al 224238405Sjkim movl 20(%rsi),%ebx 225238405Sjkim movzbl %al,%eax 226238405Sjkim movl %edx,16(%rsi) 227238405Sjkim addb %bl,%cl 228238405Sjkim pinsrw $2,(%rdi,%rax,4),%xmm0 229238405Sjkim movl (%rdi,%rcx,4),%edx 230238405Sjkim movl %ebx,(%rdi,%rcx,4) 231238405Sjkim addb %dl,%bl 232238405Sjkim movl 24(%rsi),%eax 233238405Sjkim movzbl %bl,%ebx 234238405Sjkim movl %edx,20(%rsi) 235238405Sjkim addb %al,%cl 236238405Sjkim pinsrw $2,(%rdi,%rbx,4),%xmm1 237238405Sjkim movl (%rdi,%rcx,4),%edx 238238405Sjkim movl %eax,(%rdi,%rcx,4) 239238405Sjkim addb %dl,%al 240238405Sjkim movl 28(%rsi),%ebx 241238405Sjkim movzbl %al,%eax 242238405Sjkim movl %edx,24(%rsi) 243238405Sjkim addb %bl,%cl 244238405Sjkim pinsrw $3,(%rdi,%rax,4),%xmm0 245238405Sjkim movl (%rdi,%rcx,4),%edx 246238405Sjkim movl %ebx,(%rdi,%rcx,4) 247238405Sjkim addb %dl,%bl 248238405Sjkim movl 32(%rsi),%eax 249238405Sjkim movzbl %bl,%ebx 250238405Sjkim movl %edx,28(%rsi) 251238405Sjkim addb %al,%cl 252238405Sjkim pinsrw $3,(%rdi,%rbx,4),%xmm1 253238405Sjkim movl (%rdi,%rcx,4),%edx 254238405Sjkim movl %eax,(%rdi,%rcx,4) 255238405Sjkim addb %dl,%al 256238405Sjkim movl 36(%rsi),%ebx 257238405Sjkim movzbl %al,%eax 258238405Sjkim movl %edx,32(%rsi) 259238405Sjkim addb %bl,%cl 260238405Sjkim pinsrw $4,(%rdi,%rax,4),%xmm0 261238405Sjkim movl (%rdi,%rcx,4),%edx 262238405Sjkim movl %ebx,(%rdi,%rcx,4) 263238405Sjkim addb %dl,%bl 264238405Sjkim movl 40(%rsi),%eax 265238405Sjkim movzbl %bl,%ebx 266238405Sjkim movl %edx,36(%rsi) 267238405Sjkim addb %al,%cl 268238405Sjkim pinsrw $4,(%rdi,%rbx,4),%xmm1 269238405Sjkim movl (%rdi,%rcx,4),%edx 270238405Sjkim movl %eax,(%rdi,%rcx,4) 271238405Sjkim addb %dl,%al 272238405Sjkim movl 44(%rsi),%ebx 273238405Sjkim movzbl %al,%eax 274238405Sjkim movl %edx,40(%rsi) 275238405Sjkim addb %bl,%cl 276238405Sjkim pinsrw $5,(%rdi,%rax,4),%xmm0 277238405Sjkim movl (%rdi,%rcx,4),%edx 278238405Sjkim movl %ebx,(%rdi,%rcx,4) 279238405Sjkim addb %dl,%bl 280238405Sjkim movl 48(%rsi),%eax 281238405Sjkim movzbl %bl,%ebx 282238405Sjkim movl %edx,44(%rsi) 283238405Sjkim addb %al,%cl 284238405Sjkim pinsrw $5,(%rdi,%rbx,4),%xmm1 285238405Sjkim movl (%rdi,%rcx,4),%edx 286238405Sjkim movl %eax,(%rdi,%rcx,4) 287238405Sjkim addb %dl,%al 288238405Sjkim movl 52(%rsi),%ebx 289238405Sjkim movzbl %al,%eax 290238405Sjkim movl %edx,48(%rsi) 291238405Sjkim addb %bl,%cl 292238405Sjkim pinsrw $6,(%rdi,%rax,4),%xmm0 293238405Sjkim movl (%rdi,%rcx,4),%edx 294238405Sjkim movl %ebx,(%rdi,%rcx,4) 295238405Sjkim addb %dl,%bl 296238405Sjkim movl 56(%rsi),%eax 297238405Sjkim movzbl %bl,%ebx 298238405Sjkim movl %edx,52(%rsi) 299238405Sjkim addb %al,%cl 300238405Sjkim pinsrw $6,(%rdi,%rbx,4),%xmm1 301238405Sjkim movl (%rdi,%rcx,4),%edx 302238405Sjkim movl %eax,(%rdi,%rcx,4) 303238405Sjkim addb %dl,%al 304238405Sjkim movl 60(%rsi),%ebx 305238405Sjkim movzbl %al,%eax 306238405Sjkim movl %edx,56(%rsi) 307238405Sjkim addb %bl,%cl 308238405Sjkim pinsrw $7,(%rdi,%rax,4),%xmm0 309238405Sjkim addb $16,%r10b 310238405Sjkim movdqu (%r12),%xmm2 311238405Sjkim movl (%rdi,%rcx,4),%edx 312238405Sjkim movl %ebx,(%rdi,%rcx,4) 313238405Sjkim addb %dl,%bl 314238405Sjkim movzbl %bl,%ebx 315238405Sjkim movl %edx,60(%rsi) 316238405Sjkim leaq (%rdi,%r10,4),%rsi 317238405Sjkim pinsrw $7,(%rdi,%rbx,4),%xmm1 318238405Sjkim movl (%rsi),%eax 319238405Sjkim movq %rcx,%rbx 320238405Sjkim xorq %rcx,%rcx 321238405Sjkim subq $16,%r11 322238405Sjkim movb %bl,%cl 323238405Sjkim testq $-16,%r11 324238405Sjkim jnz .Loop16 325238405Sjkim 326238405Sjkim psllq $8,%xmm1 327238405Sjkim pxor %xmm0,%xmm2 328238405Sjkim pxor %xmm1,%xmm2 329238405Sjkim movdqu %xmm2,(%r13,%r12,1) 330238405Sjkim leaq 16(%r12),%r12 331238405Sjkim 332238405Sjkim cmpq $0,%r11 333238405Sjkim jne .Lloop1 334238405Sjkim jmp .Lexit 335238405Sjkim 336238405Sjkim.align 16 337238405Sjkim.Lloop1: 338238405Sjkim addb %al,%cl 339238405Sjkim movl (%rdi,%rcx,4),%edx 340238405Sjkim movl %eax,(%rdi,%rcx,4) 341238405Sjkim movl %edx,(%rdi,%r10,4) 342238405Sjkim addb %dl,%al 343238405Sjkim incb %r10b 344238405Sjkim movl (%rdi,%rax,4),%edx 345238405Sjkim movl (%rdi,%r10,4),%eax 346238405Sjkim xorb (%r12),%dl 347238405Sjkim movb %dl,(%r13,%r12,1) 348238405Sjkim leaq 1(%r12),%r12 349238405Sjkim decq %r11 350238405Sjkim jnz .Lloop1 351238405Sjkim jmp .Lexit 352238405Sjkim 353238405Sjkim.align 16 354238405Sjkim.LRC4_CHAR: 355238405Sjkim addb $1,%r10b 356238405Sjkim movzbl (%rdi,%r10,1),%eax 357238405Sjkim testq $-8,%r11 358238405Sjkim jz .Lcloop1 359238405Sjkim jmp .Lcloop8 360238405Sjkim.align 16 361238405Sjkim.Lcloop8: 362238405Sjkim movl (%r12),%r8d 363238405Sjkim movl 4(%r12),%r9d 364238405Sjkim addb %al,%cl 365238405Sjkim leaq 1(%r10),%rsi 366238405Sjkim movzbl (%rdi,%rcx,1),%edx 367238405Sjkim movzbl %sil,%esi 368238405Sjkim movzbl (%rdi,%rsi,1),%ebx 369238405Sjkim movb %al,(%rdi,%rcx,1) 370238405Sjkim cmpq %rsi,%rcx 371238405Sjkim movb %dl,(%rdi,%r10,1) 372238405Sjkim jne .Lcmov0 373238405Sjkim movq %rax,%rbx 374238405Sjkim.Lcmov0: 375238405Sjkim addb %al,%dl 376238405Sjkim xorb (%rdi,%rdx,1),%r8b 377238405Sjkim rorl $8,%r8d 378238405Sjkim addb %bl,%cl 379238405Sjkim leaq 1(%rsi),%r10 380238405Sjkim movzbl (%rdi,%rcx,1),%edx 381238405Sjkim movzbl %r10b,%r10d 382238405Sjkim movzbl (%rdi,%r10,1),%eax 383238405Sjkim movb %bl,(%rdi,%rcx,1) 384238405Sjkim cmpq %r10,%rcx 385238405Sjkim movb %dl,(%rdi,%rsi,1) 386238405Sjkim jne .Lcmov1 387238405Sjkim movq %rbx,%rax 388238405Sjkim.Lcmov1: 389238405Sjkim addb %bl,%dl 390238405Sjkim xorb (%rdi,%rdx,1),%r8b 391238405Sjkim rorl $8,%r8d 392238405Sjkim addb %al,%cl 393238405Sjkim leaq 1(%r10),%rsi 394238405Sjkim movzbl (%rdi,%rcx,1),%edx 395238405Sjkim movzbl %sil,%esi 396238405Sjkim movzbl (%rdi,%rsi,1),%ebx 397238405Sjkim movb %al,(%rdi,%rcx,1) 398238405Sjkim cmpq %rsi,%rcx 399238405Sjkim movb %dl,(%rdi,%r10,1) 400238405Sjkim jne .Lcmov2 401238405Sjkim movq %rax,%rbx 402238405Sjkim.Lcmov2: 403238405Sjkim addb %al,%dl 404238405Sjkim xorb (%rdi,%rdx,1),%r8b 405238405Sjkim rorl $8,%r8d 406238405Sjkim addb %bl,%cl 407238405Sjkim leaq 1(%rsi),%r10 408238405Sjkim movzbl (%rdi,%rcx,1),%edx 409238405Sjkim movzbl %r10b,%r10d 410238405Sjkim movzbl (%rdi,%r10,1),%eax 411238405Sjkim movb %bl,(%rdi,%rcx,1) 412238405Sjkim cmpq %r10,%rcx 413238405Sjkim movb %dl,(%rdi,%rsi,1) 414238405Sjkim jne .Lcmov3 415238405Sjkim movq %rbx,%rax 416238405Sjkim.Lcmov3: 417238405Sjkim addb %bl,%dl 418238405Sjkim xorb (%rdi,%rdx,1),%r8b 419238405Sjkim rorl $8,%r8d 420238405Sjkim addb %al,%cl 421238405Sjkim leaq 1(%r10),%rsi 422238405Sjkim movzbl (%rdi,%rcx,1),%edx 423238405Sjkim movzbl %sil,%esi 424238405Sjkim movzbl (%rdi,%rsi,1),%ebx 425238405Sjkim movb %al,(%rdi,%rcx,1) 426238405Sjkim cmpq %rsi,%rcx 427238405Sjkim movb %dl,(%rdi,%r10,1) 428238405Sjkim jne .Lcmov4 429238405Sjkim movq %rax,%rbx 430238405Sjkim.Lcmov4: 431238405Sjkim addb %al,%dl 432238405Sjkim xorb (%rdi,%rdx,1),%r9b 433238405Sjkim rorl $8,%r9d 434238405Sjkim addb %bl,%cl 435238405Sjkim leaq 1(%rsi),%r10 436238405Sjkim movzbl (%rdi,%rcx,1),%edx 437238405Sjkim movzbl %r10b,%r10d 438238405Sjkim movzbl (%rdi,%r10,1),%eax 439238405Sjkim movb %bl,(%rdi,%rcx,1) 440238405Sjkim cmpq %r10,%rcx 441238405Sjkim movb %dl,(%rdi,%rsi,1) 442238405Sjkim jne .Lcmov5 443238405Sjkim movq %rbx,%rax 444238405Sjkim.Lcmov5: 445238405Sjkim addb %bl,%dl 446238405Sjkim xorb (%rdi,%rdx,1),%r9b 447238405Sjkim rorl $8,%r9d 448238405Sjkim addb %al,%cl 449238405Sjkim leaq 1(%r10),%rsi 450238405Sjkim movzbl (%rdi,%rcx,1),%edx 451238405Sjkim movzbl %sil,%esi 452238405Sjkim movzbl (%rdi,%rsi,1),%ebx 453238405Sjkim movb %al,(%rdi,%rcx,1) 454238405Sjkim cmpq %rsi,%rcx 455238405Sjkim movb %dl,(%rdi,%r10,1) 456238405Sjkim jne .Lcmov6 457238405Sjkim movq %rax,%rbx 458238405Sjkim.Lcmov6: 459238405Sjkim addb %al,%dl 460238405Sjkim xorb (%rdi,%rdx,1),%r9b 461238405Sjkim rorl $8,%r9d 462238405Sjkim addb %bl,%cl 463238405Sjkim leaq 1(%rsi),%r10 464238405Sjkim movzbl (%rdi,%rcx,1),%edx 465238405Sjkim movzbl %r10b,%r10d 466238405Sjkim movzbl (%rdi,%r10,1),%eax 467238405Sjkim movb %bl,(%rdi,%rcx,1) 468238405Sjkim cmpq %r10,%rcx 469238405Sjkim movb %dl,(%rdi,%rsi,1) 470238405Sjkim jne .Lcmov7 471238405Sjkim movq %rbx,%rax 472238405Sjkim.Lcmov7: 473238405Sjkim addb %bl,%dl 474238405Sjkim xorb (%rdi,%rdx,1),%r9b 475238405Sjkim rorl $8,%r9d 476238405Sjkim leaq -8(%r11),%r11 477238405Sjkim movl %r8d,(%r13) 478238405Sjkim leaq 8(%r12),%r12 479238405Sjkim movl %r9d,4(%r13) 480238405Sjkim leaq 8(%r13),%r13 481238405Sjkim 482238405Sjkim testq $-8,%r11 483238405Sjkim jnz .Lcloop8 484238405Sjkim cmpq $0,%r11 485238405Sjkim jne .Lcloop1 486238405Sjkim jmp .Lexit 487238405Sjkim.align 16 488238405Sjkim.Lcloop1: 489238405Sjkim addb %al,%cl 490238405Sjkim movzbl %cl,%ecx 491238405Sjkim movzbl (%rdi,%rcx,1),%edx 492238405Sjkim movb %al,(%rdi,%rcx,1) 493238405Sjkim movb %dl,(%rdi,%r10,1) 494238405Sjkim addb %al,%dl 495238405Sjkim addb $1,%r10b 496238405Sjkim movzbl %dl,%edx 497238405Sjkim movzbl %r10b,%r10d 498238405Sjkim movzbl (%rdi,%rdx,1),%edx 499238405Sjkim movzbl (%rdi,%r10,1),%eax 500238405Sjkim xorb (%r12),%dl 501238405Sjkim leaq 1(%r12),%r12 502238405Sjkim movb %dl,(%r13) 503238405Sjkim leaq 1(%r13),%r13 504238405Sjkim subq $1,%r11 505238405Sjkim jnz .Lcloop1 506238405Sjkim jmp .Lexit 507238405Sjkim 508238405Sjkim.align 16 509238405Sjkim.Lexit: 510238405Sjkim subb $1,%r10b 511238405Sjkim movl %r10d,-8(%rdi) 512238405Sjkim movl %ecx,-4(%rdi) 513238405Sjkim 514238405Sjkim movq (%rsp),%r13 515238405Sjkim movq 8(%rsp),%r12 516238405Sjkim movq 16(%rsp),%rbx 517238405Sjkim addq $24,%rsp 518238405Sjkim.Lepilogue: 519238405Sjkim .byte 0xf3,0xc3 520238405Sjkim.size RC4,.-RC4 521238405Sjkim.globl private_RC4_set_key 522238405Sjkim.type private_RC4_set_key,@function 523238405Sjkim.align 16 524238405Sjkimprivate_RC4_set_key: 525238405Sjkim leaq 8(%rdi),%rdi 526238405Sjkim leaq (%rdx,%rsi,1),%rdx 527238405Sjkim negq %rsi 528238405Sjkim movq %rsi,%rcx 529238405Sjkim xorl %eax,%eax 530238405Sjkim xorq %r9,%r9 531238405Sjkim xorq %r10,%r10 532238405Sjkim xorq %r11,%r11 533238405Sjkim 534238405Sjkim movl OPENSSL_ia32cap_P(%rip),%r8d 535238405Sjkim btl $20,%r8d 536238405Sjkim jc .Lc1stloop 537238405Sjkim jmp .Lw1stloop 538238405Sjkim 539238405Sjkim.align 16 540238405Sjkim.Lw1stloop: 541238405Sjkim movl %eax,(%rdi,%rax,4) 542238405Sjkim addb $1,%al 543238405Sjkim jnc .Lw1stloop 544238405Sjkim 545238405Sjkim xorq %r9,%r9 546238405Sjkim xorq %r8,%r8 547238405Sjkim.align 16 548238405Sjkim.Lw2ndloop: 549238405Sjkim movl (%rdi,%r9,4),%r10d 550238405Sjkim addb (%rdx,%rsi,1),%r8b 551238405Sjkim addb %r10b,%r8b 552238405Sjkim addq $1,%rsi 553238405Sjkim movl (%rdi,%r8,4),%r11d 554238405Sjkim cmovzq %rcx,%rsi 555238405Sjkim movl %r10d,(%rdi,%r8,4) 556238405Sjkim movl %r11d,(%rdi,%r9,4) 557238405Sjkim addb $1,%r9b 558238405Sjkim jnc .Lw2ndloop 559238405Sjkim jmp .Lexit_key 560238405Sjkim 561238405Sjkim.align 16 562238405Sjkim.Lc1stloop: 563238405Sjkim movb %al,(%rdi,%rax,1) 564238405Sjkim addb $1,%al 565238405Sjkim jnc .Lc1stloop 566238405Sjkim 567238405Sjkim xorq %r9,%r9 568238405Sjkim xorq %r8,%r8 569238405Sjkim.align 16 570238405Sjkim.Lc2ndloop: 571238405Sjkim movb (%rdi,%r9,1),%r10b 572238405Sjkim addb (%rdx,%rsi,1),%r8b 573238405Sjkim addb %r10b,%r8b 574238405Sjkim addq $1,%rsi 575238405Sjkim movb (%rdi,%r8,1),%r11b 576238405Sjkim jnz .Lcnowrap 577238405Sjkim movq %rcx,%rsi 578238405Sjkim.Lcnowrap: 579238405Sjkim movb %r10b,(%rdi,%r8,1) 580238405Sjkim movb %r11b,(%rdi,%r9,1) 581238405Sjkim addb $1,%r9b 582238405Sjkim jnc .Lc2ndloop 583238405Sjkim movl $-1,256(%rdi) 584238405Sjkim 585238405Sjkim.align 16 586238405Sjkim.Lexit_key: 587238405Sjkim xorl %eax,%eax 588238405Sjkim movl %eax,-8(%rdi) 589238405Sjkim movl %eax,-4(%rdi) 590238405Sjkim .byte 0xf3,0xc3 591238405Sjkim.size private_RC4_set_key,.-private_RC4_set_key 592238405Sjkim 593238405Sjkim.globl RC4_options 594238405Sjkim.type RC4_options,@function 595238405Sjkim.align 16 596238405SjkimRC4_options: 597238405Sjkim leaq .Lopts(%rip),%rax 598238405Sjkim movl OPENSSL_ia32cap_P(%rip),%edx 599238405Sjkim btl $20,%edx 600238405Sjkim jc .L8xchar 601238405Sjkim btl $30,%edx 602238405Sjkim jnc .Ldone 603238405Sjkim addq $25,%rax 604238405Sjkim .byte 0xf3,0xc3 605238405Sjkim.L8xchar: 606238405Sjkim addq $12,%rax 607238405Sjkim.Ldone: 608238405Sjkim .byte 0xf3,0xc3 609238405Sjkim.align 64 610238405Sjkim.Lopts: 611238405Sjkim.byte 114,99,52,40,56,120,44,105,110,116,41,0 612238405Sjkim.byte 114,99,52,40,56,120,44,99,104,97,114,41,0 613238405Sjkim.byte 114,99,52,40,49,54,120,44,105,110,116,41,0 614238405Sjkim.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 615238405Sjkim.align 64 616238405Sjkim.size RC4_options,.-RC4_options 617