# qhasm: int64 a # qhasm: int64 arg1 # qhasm: int64 arg2 # qhasm: int64 arg3 # qhasm: int64 arg4 # qhasm: input arg1 # qhasm: input arg2 # qhasm: input arg3 # qhasm: input arg4 # qhasm: int64 k # qhasm: int64 kbits # qhasm: int64 iv # qhasm: int64 i # qhasm: int64 x # qhasm: int64 m # qhasm: int64 out # qhasm: int64 bytes # qhasm: int6464 diag0 # qhasm: int6464 diag1 # qhasm: int6464 diag2 # qhasm: int6464 diag3 # qhasm: int6464 a0 # qhasm: int6464 a1 # qhasm: int6464 a2 # qhasm: int6464 a3 # qhasm: int6464 a4 # qhasm: int6464 a5 # qhasm: int6464 a6 # qhasm: int6464 a7 # qhasm: int6464 b0 # qhasm: int6464 b1 # qhasm: int6464 b2 # qhasm: int6464 b3 # qhasm: int6464 b4 # qhasm: int6464 b5 # qhasm: int6464 b6 # qhasm: int6464 b7 # qhasm: int64 in0 # qhasm: int64 in1 # qhasm: int64 in2 # qhasm: int64 in3 # qhasm: int64 in4 # qhasm: int64 in5 # qhasm: int64 in6 # qhasm: int64 in7 # qhasm: int64 in8 # qhasm: int64 in9 # qhasm: int64 in10 # qhasm: int64 in11 # qhasm: int64 in12 # qhasm: int64 in13 # qhasm: int64 in14 # qhasm: int64 in15 # qhasm: stack512 tmp # qhasm: int64 ctarget # qhasm: stack64 bytes_backup # qhasm: enter ECRYPT_keystream_bytes .text .p2align 5 .globl _ECRYPT_keystream_bytes .globl ECRYPT_keystream_bytes _ECRYPT_keystream_bytes: ECRYPT_keystream_bytes: mov %rsp,%r11 and $31,%r11 add $96,%r11 sub %r11,%rsp # qhasm: x = arg1 # asm 1: mov x=int64#5 # asm 2: mov x=%r8 mov %rdi,%r8 # qhasm: m = arg2 # asm 1: mov m=int64#2 # asm 2: mov m=%rsi mov %rsi,%rsi # qhasm: out = m # asm 1: mov out=int64#1 # asm 2: mov out=%rdi mov %rsi,%rdi # qhasm: bytes = arg3 # asm 1: mov bytes=int64#3 # asm 2: mov bytes=%rdx mov %rdx,%rdx # qhasm: unsigned>? bytes - 0 # asm 1: cmp $0, jbe ._done # qhasm: a = 0 # asm 1: mov $0,>a=int64#7 # asm 2: mov $0,>a=%rax mov $0,%rax # qhasm: i = bytes # asm 1: mov i=int64#4 # asm 2: mov i=%rcx mov %rdx,%rcx # qhasm: while (i) { *out++ = a; --i } rep stosb # qhasm: out -= bytes # asm 1: sub x=int64#5 # asm 2: mov x=%r8 mov %rdi,%r8 # qhasm: m = arg2 # asm 1: mov m=int64#2 # asm 2: mov m=%rsi mov %rsi,%rsi # qhasm: out = arg3 # asm 1: mov out=int64#1 # asm 2: mov out=%rdi mov %rdx,%rdi # qhasm: bytes = arg4 # asm 1: mov bytes=int64#3 # asm 2: mov bytes=%rdx mov %rcx,%rdx # qhasm: unsigned>? bytes - 0 # asm 1: cmp $0, jbe ._done # comment:fp stack unchanged by jump # qhasm: goto start jmp ._start # qhasm: enter ECRYPT_encrypt_bytes .text .p2align 5 .globl _ECRYPT_encrypt_bytes .globl ECRYPT_encrypt_bytes _ECRYPT_encrypt_bytes: ECRYPT_encrypt_bytes: mov %rsp,%r11 and $31,%r11 add $96,%r11 sub %r11,%rsp # qhasm: x = arg1 # asm 1: mov x=int64#5 # asm 2: mov x=%r8 mov %rdi,%r8 # qhasm: m = arg2 # asm 1: mov m=int64#2 # asm 2: mov m=%rsi mov %rsi,%rsi # qhasm: out = arg3 # asm 1: mov out=int64#1 # asm 2: mov out=%rdi mov %rdx,%rdi # qhasm: bytes = arg4 # asm 1: mov bytes=int64#3 # asm 2: mov bytes=%rdx mov %rcx,%rdx # qhasm: unsigned>? bytes - 0 # asm 1: cmp $0, jbe ._done # comment:fp stack unchanged by fallthrough # qhasm: start: ._start: # qhasm: bytesatleast1: ._bytesatleast1: # qhasm: unsignedctarget=int64#6 # asm 2: mov ctarget=%r9 mov %rdi,%r9 # qhasm: out = &tmp # asm 1: leaq out=int64#1 # asm 2: leaq out=%rdi leaq 32(%rsp),%rdi # qhasm: i = bytes # asm 1: mov i=int64#4 # asm 2: mov i=%rcx mov %rdx,%rcx # qhasm: while (i) { *out++ = *m++; --i } rep movsb # qhasm: out = &tmp # asm 1: leaq out=int64#1 # asm 2: leaq out=%rdi leaq 32(%rsp),%rdi # qhasm: m = &tmp # asm 1: leaq m=int64#2 # asm 2: leaq m=%rsi leaq 32(%rsp),%rsi # comment:fp stack unchanged by fallthrough # qhasm: nocopy: ._nocopy: # qhasm: bytes_backup = bytes # asm 1: movq bytes_backup=stack64#1 # asm 2: movq bytes_backup=0(%rsp) movq %rdx,0(%rsp) # qhasm: diag0 = *(int128 *) (x + 0) # asm 1: movdqa 0(diag0=int6464#1 # asm 2: movdqa 0(diag0=%xmm0 movdqa 0(%r8),%xmm0 # qhasm: diag1 = *(int128 *) (x + 16) # asm 1: movdqa 16(diag1=int6464#2 # asm 2: movdqa 16(diag1=%xmm1 movdqa 16(%r8),%xmm1 # qhasm: diag2 = *(int128 *) (x + 32) # asm 1: movdqa 32(diag2=int6464#3 # asm 2: movdqa 32(diag2=%xmm2 movdqa 32(%r8),%xmm2 # qhasm: diag3 = *(int128 *) (x + 48) # asm 1: movdqa 48(diag3=int6464#4 # asm 2: movdqa 48(diag3=%xmm3 movdqa 48(%r8),%xmm3 # qhasm: a0 = diag1 # asm 1: movdqa a0=int6464#5 # asm 2: movdqa a0=%xmm4 movdqa %xmm1,%xmm4 # qhasm: i = 20 # asm 1: mov $20,>i=int64#3 # asm 2: mov $20,>i=%rdx mov $20,%rdx # qhasm: mainloop: ._mainloop: # qhasm: uint32323232 a0 += diag0 # asm 1: paddd a1=int6464#6 # asm 2: movdqa a1=%xmm5 movdqa %xmm0,%xmm5 # qhasm: b0 = a0 # asm 1: movdqa b0=int6464#7 # asm 2: movdqa b0=%xmm6 movdqa %xmm4,%xmm6 # qhasm: uint32323232 a0 <<= 7 # asm 1: pslld $7,>= 25 # asm 1: psrld $25,a2=int6464#5 # asm 2: movdqa a2=%xmm4 movdqa %xmm3,%xmm4 # qhasm: b1 = a1 # asm 1: movdqa b1=int6464#7 # asm 2: movdqa b1=%xmm6 movdqa %xmm5,%xmm6 # qhasm: uint32323232 a1 <<= 9 # asm 1: pslld $9,>= 23 # asm 1: psrld $23,a3=int6464#6 # asm 2: movdqa a3=%xmm5 movdqa %xmm2,%xmm5 # qhasm: b2 = a2 # asm 1: movdqa b2=int6464#7 # asm 2: movdqa b2=%xmm6 movdqa %xmm4,%xmm6 # qhasm: uint32323232 a2 <<= 13 # asm 1: pslld $13,>= 19 # asm 1: psrld $19,a4=int6464#5 # asm 2: movdqa a4=%xmm4 movdqa %xmm3,%xmm4 # qhasm: b3 = a3 # asm 1: movdqa b3=int6464#7 # asm 2: movdqa b3=%xmm6 movdqa %xmm5,%xmm6 # qhasm: uint32323232 a3 <<= 18 # asm 1: pslld $18,>= 14 # asm 1: psrld $14,a5=int6464#6 # asm 2: movdqa a5=%xmm5 movdqa %xmm0,%xmm5 # qhasm: b4 = a4 # asm 1: movdqa b4=int6464#7 # asm 2: movdqa b4=%xmm6 movdqa %xmm4,%xmm6 # qhasm: uint32323232 a4 <<= 7 # asm 1: pslld $7,>= 25 # asm 1: psrld $25,a6=int6464#5 # asm 2: movdqa a6=%xmm4 movdqa %xmm1,%xmm4 # qhasm: b5 = a5 # asm 1: movdqa b5=int6464#7 # asm 2: movdqa b5=%xmm6 movdqa %xmm5,%xmm6 # qhasm: uint32323232 a5 <<= 9 # asm 1: pslld $9,>= 23 # asm 1: psrld $23,a7=int6464#6 # asm 2: movdqa a7=%xmm5 movdqa %xmm2,%xmm5 # qhasm: b6 = a6 # asm 1: movdqa b6=int6464#7 # asm 2: movdqa b6=%xmm6 movdqa %xmm4,%xmm6 # qhasm: uint32323232 a6 <<= 13 # asm 1: pslld $13,>= 19 # asm 1: psrld $19,a0=int6464#5 # asm 2: movdqa a0=%xmm4 movdqa %xmm1,%xmm4 # qhasm: b7 = a7 # asm 1: movdqa b7=int6464#7 # asm 2: movdqa b7=%xmm6 movdqa %xmm5,%xmm6 # qhasm: uint32323232 a7 <<= 18 # asm 1: pslld $18,>= 14 # asm 1: psrld $14,a1=int6464#6 # asm 2: movdqa a1=%xmm5 movdqa %xmm0,%xmm5 # qhasm: b0 = a0 # asm 1: movdqa b0=int6464#7 # asm 2: movdqa b0=%xmm6 movdqa %xmm4,%xmm6 # qhasm: uint32323232 a0 <<= 7 # asm 1: pslld $7,>= 25 # asm 1: psrld $25,a2=int6464#5 # asm 2: movdqa a2=%xmm4 movdqa %xmm3,%xmm4 # qhasm: b1 = a1 # asm 1: movdqa b1=int6464#7 # asm 2: movdqa b1=%xmm6 movdqa %xmm5,%xmm6 # qhasm: uint32323232 a1 <<= 9 # asm 1: pslld $9,>= 23 # asm 1: psrld $23,a3=int6464#6 # asm 2: movdqa a3=%xmm5 movdqa %xmm2,%xmm5 # qhasm: b2 = a2 # asm 1: movdqa b2=int6464#7 # asm 2: movdqa b2=%xmm6 movdqa %xmm4,%xmm6 # qhasm: uint32323232 a2 <<= 13 # asm 1: pslld $13,>= 19 # asm 1: psrld $19,a4=int6464#5 # asm 2: movdqa a4=%xmm4 movdqa %xmm3,%xmm4 # qhasm: b3 = a3 # asm 1: movdqa b3=int6464#7 # asm 2: movdqa b3=%xmm6 movdqa %xmm5,%xmm6 # qhasm: uint32323232 a3 <<= 18 # asm 1: pslld $18,>= 14 # asm 1: psrld $14,a5=int6464#6 # asm 2: movdqa a5=%xmm5 movdqa %xmm0,%xmm5 # qhasm: b4 = a4 # asm 1: movdqa b4=int6464#7 # asm 2: movdqa b4=%xmm6 movdqa %xmm4,%xmm6 # qhasm: uint32323232 a4 <<= 7 # asm 1: pslld $7,>= 25 # asm 1: psrld $25,a6=int6464#5 # asm 2: movdqa a6=%xmm4 movdqa %xmm1,%xmm4 # qhasm: b5 = a5 # asm 1: movdqa b5=int6464#7 # asm 2: movdqa b5=%xmm6 movdqa %xmm5,%xmm6 # qhasm: uint32323232 a5 <<= 9 # asm 1: pslld $9,>= 23 # asm 1: psrld $23,a7=int6464#6 # asm 2: movdqa a7=%xmm5 movdqa %xmm2,%xmm5 # qhasm: b6 = a6 # asm 1: movdqa b6=int6464#7 # asm 2: movdqa b6=%xmm6 movdqa %xmm4,%xmm6 # qhasm: uint32323232 a6 <<= 13 # asm 1: pslld $13,>= 19 # asm 1: psrld $19,? i -= 4 # asm 1: sub $4,a0=int6464#5 # asm 2: movdqa a0=%xmm4 movdqa %xmm1,%xmm4 # qhasm: b7 = a7 # asm 1: movdqa b7=int6464#7 # asm 2: movdqa b7=%xmm6 movdqa %xmm5,%xmm6 # qhasm: uint32323232 a7 <<= 18 # asm 1: pslld $18,>= 14 # asm 1: psrld $14, ja ._mainloop # qhasm: uint32323232 diag0 += *(int128 *) (x + 0) # asm 1: paddd 0(in0=int64#3 # asm 2: movd in0=%rdx movd %xmm0,%rdx # qhasm: in12 = diag1 # asm 1: movd in12=int64#4 # asm 2: movd in12=%rcx movd %xmm1,%rcx # qhasm: in8 = diag2 # asm 1: movd in8=int64#7 # asm 2: movd in8=%rax movd %xmm2,%rax # qhasm: in4 = diag3 # asm 1: movd in4=int64#8 # asm 2: movd in4=%r10 movd %xmm3,%r10 # qhasm: diag0 <<<= 96 # asm 1: pshufd $0x39,in5=int64#3 # asm 2: movd in5=%rdx movd %xmm0,%rdx # qhasm: in1 = diag1 # asm 1: movd in1=int64#4 # asm 2: movd in1=%rcx movd %xmm1,%rcx # qhasm: in13 = diag2 # asm 1: movd in13=int64#7 # asm 2: movd in13=%rax movd %xmm2,%rax # qhasm: in9 = diag3 # asm 1: movd in9=int64#8 # asm 2: movd in9=%r10 movd %xmm3,%r10 # qhasm: diag0 <<<= 96 # asm 1: pshufd $0x39,in10=int64#3 # asm 2: movd in10=%rdx movd %xmm0,%rdx # qhasm: in6 = diag1 # asm 1: movd in6=int64#4 # asm 2: movd in6=%rcx movd %xmm1,%rcx # qhasm: in2 = diag2 # asm 1: movd in2=int64#7 # asm 2: movd in2=%rax movd %xmm2,%rax # qhasm: in14 = diag3 # asm 1: movd in14=int64#8 # asm 2: movd in14=%r10 movd %xmm3,%r10 # qhasm: diag0 <<<= 96 # asm 1: pshufd $0x39,in15=int64#3 # asm 2: movd in15=%rdx movd %xmm0,%rdx # qhasm: in11 = diag1 # asm 1: movd in11=int64#4 # asm 2: movd in11=%rcx movd %xmm1,%rcx # qhasm: in7 = diag2 # asm 1: movd in7=int64#7 # asm 2: movd in7=%rax movd %xmm2,%rax # qhasm: in3 = diag3 # asm 1: movd in3=int64#8 # asm 2: movd in3=%r10 movd %xmm3,%r10 # qhasm: (uint32) in15 ^= *(uint32 *) (m + 60) # asm 1: xorl 60(bytes=int64#3 # asm 2: movq bytes=%rdx movq 0(%rsp),%rdx # qhasm: in8 = *(uint32 *) (x + 32) # asm 1: movl 32(in8=int64#4d # asm 2: movl 32(in8=%ecx movl 32(%r8),%ecx # qhasm: in9 = *(uint32 *) (x + 52) # asm 1: movl 52(in9=int64#7d # asm 2: movl 52(in9=%eax movl 52(%r8),%eax # qhasm: in8 += 1 # asm 1: add $1,>= 32 # asm 1: shr $32,? unsigned ja ._bytesatleast65 # comment:fp stack unchanged by jump # qhasm: goto bytesatleast64 if !unsigned< jae ._bytesatleast64 # qhasm: m = out # asm 1: mov m=int64#2 # asm 2: mov m=%rsi mov %rdi,%rsi # qhasm: out = ctarget # asm 1: mov out=int64#1 # asm 2: mov out=%rdi mov %r9,%rdi # qhasm: i = bytes # asm 1: mov i=int64#4 # asm 2: mov i=%rcx mov %rdx,%rcx # qhasm: while (i) { *out++ = *m++; --i } rep movsb # comment:fp stack unchanged by fallthrough # qhasm: bytesatleast64: ._bytesatleast64: # comment:fp stack unchanged by fallthrough # qhasm: done: ._done: # qhasm: leave add %r11,%rsp mov %rdi,%rax mov %rsi,%rdx ret # qhasm: bytesatleast65: ._bytesatleast65: # qhasm: bytes -= 64 # asm 1: sub $64,k=int64#2 # asm 2: mov k=%rsi mov %rsi,%rsi # qhasm: kbits = arg3 # asm 1: mov kbits=int64#3 # asm 2: mov kbits=%rdx mov %rdx,%rdx # qhasm: x = arg1 # asm 1: mov x=int64#1 # asm 2: mov x=%rdi mov %rdi,%rdi # qhasm: in1 = *(uint32 *) (k + 0) # asm 1: movl 0(in1=int64#5d # asm 2: movl 0(in1=%r8d movl 0(%rsi),%r8d # qhasm: in2 = *(uint32 *) (k + 4) # asm 1: movl 4(in2=int64#6d # asm 2: movl 4(in2=%r9d movl 4(%rsi),%r9d # qhasm: in3 = *(uint32 *) (k + 8) # asm 1: movl 8(in3=int64#7d # asm 2: movl 8(in3=%eax movl 8(%rsi),%eax # qhasm: in4 = *(uint32 *) (k + 12) # asm 1: movl 12(in4=int64#8d # asm 2: movl 12(in4=%r10d movl 12(%rsi),%r10d # qhasm: *(uint32 *) (x + 20) = in1 # asm 1: movl in11=int64#3d # asm 2: movl 16(in11=%edx movl 16(%rsi),%edx # qhasm: in12 = *(uint32 *) (k + 20) # asm 1: movl 20(in12=int64#4d # asm 2: movl 20(in12=%ecx movl 20(%rsi),%ecx # qhasm: in13 = *(uint32 *) (k + 24) # asm 1: movl 24(in13=int64#5d # asm 2: movl 24(in13=%r8d movl 24(%rsi),%r8d # qhasm: in14 = *(uint32 *) (k + 28) # asm 1: movl 28(in14=int64#2d # asm 2: movl 28(in14=%esi movl 28(%rsi),%esi # qhasm: *(uint32 *) (x + 28) = in11 # asm 1: movl in0=int64#2 # asm 2: mov $1634760805,>in0=%rsi mov $1634760805,%rsi # qhasm: in5 = 857760878 # asm 1: mov $857760878,>in5=int64#3 # asm 2: mov $857760878,>in5=%rdx mov $857760878,%rdx # qhasm: in10 = 2036477234 # asm 1: mov $2036477234,>in10=int64#4 # asm 2: mov $2036477234,>in10=%rcx mov $2036477234,%rcx # qhasm: in15 = 1797285236 # asm 1: mov $1797285236,>in15=int64#5 # asm 2: mov $1797285236,>in15=%r8 mov $1797285236,%r8 # qhasm: *(uint32 *) (x + 0) = in0 # asm 1: movl in11=int64#3d # asm 2: movl 0(in11=%edx movl 0(%rsi),%edx # qhasm: in12 = *(uint32 *) (k + 4) # asm 1: movl 4(in12=int64#4d # asm 2: movl 4(in12=%ecx movl 4(%rsi),%ecx # qhasm: in13 = *(uint32 *) (k + 8) # asm 1: movl 8(in13=int64#5d # asm 2: movl 8(in13=%r8d movl 8(%rsi),%r8d # qhasm: in14 = *(uint32 *) (k + 12) # asm 1: movl 12(in14=int64#2d # asm 2: movl 12(in14=%esi movl 12(%rsi),%esi # qhasm: *(uint32 *) (x + 28) = in11 # asm 1: movl in0=int64#2 # asm 2: mov $1634760805,>in0=%rsi mov $1634760805,%rsi # qhasm: in5 = 824206446 # asm 1: mov $824206446,>in5=int64#3 # asm 2: mov $824206446,>in5=%rdx mov $824206446,%rdx # qhasm: in10 = 2036477238 # asm 1: mov $2036477238,>in10=int64#4 # asm 2: mov $2036477238,>in10=%rcx mov $2036477238,%rcx # qhasm: in15 = 1797285236 # asm 1: mov $1797285236,>in15=int64#5 # asm 2: mov $1797285236,>in15=%r8 mov $1797285236,%r8 # qhasm: *(uint32 *) (x + 0) = in0 # asm 1: movl iv=int64#2 # asm 2: mov iv=%rsi mov %rsi,%rsi # qhasm: x = arg1 # asm 1: mov x=int64#1 # asm 2: mov x=%rdi mov %rdi,%rdi # qhasm: in6 = *(uint32 *) (iv + 0) # asm 1: movl 0(in6=int64#5d # asm 2: movl 0(in6=%r8d movl 0(%rsi),%r8d # qhasm: in7 = *(uint32 *) (iv + 4) # asm 1: movl 4(in7=int64#2d # asm 2: movl 4(in7=%esi movl 4(%rsi),%esi # qhasm: in8 = 0 # asm 1: mov $0,>in8=int64#6 # asm 2: mov $0,>in8=%r9 mov $0,%r9 # qhasm: in9 = 0 # asm 1: mov $0,>in9=int64#7 # asm 2: mov $0,>in9=%rax mov $0,%rax # qhasm: *(uint32 *) (x + 24) = in6 # asm 1: movl