blob: 3a3533b0f1d1c07d3f56380d16770232a988c547 [file] [log] [blame]
.text
.globl OPENSSL_ia32_cpuid
.type OPENSSL_ia32_cpuid,@function
.align 16
OPENSSL_ia32_cpuid:
.L_OPENSSL_ia32_cpuid_begin:
#ifdef __CET__
.byte 243,15,30,251
#endif
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
xorl %edx,%edx
pushfl
popl %eax
movl %eax,%ecx
xorl $2097152,%eax
pushl %eax
popfl
pushfl
popl %eax
xorl %eax,%ecx
xorl %eax,%eax
movl 20(%esp),%esi
movl %eax,8(%esi)
btl $21,%ecx
jnc .L000nocpuid
.byte 0x0f,0xa2
movl %eax,%edi
xorl %eax,%eax
cmpl $1970169159,%ebx
setne %al
movl %eax,%ebp
cmpl $1231384169,%edx
setne %al
orl %eax,%ebp
cmpl $1818588270,%ecx
setne %al
orl %eax,%ebp
jz .L001intel
cmpl $1752462657,%ebx
setne %al
movl %eax,%esi
cmpl $1769238117,%edx
setne %al
orl %eax,%esi
cmpl $1145913699,%ecx
setne %al
orl %eax,%esi
jnz .L001intel
movl $2147483648,%eax
.byte 0x0f,0xa2
cmpl $2147483649,%eax
jb .L001intel
movl %eax,%esi
movl $2147483649,%eax
.byte 0x0f,0xa2
orl %ecx,%ebp
andl $2049,%ebp
cmpl $2147483656,%esi
jb .L001intel
movl $2147483656,%eax
.byte 0x0f,0xa2
movzbl %cl,%esi
incl %esi
movl $1,%eax
xorl %ecx,%ecx
.byte 0x0f,0xa2
btl $28,%edx
jnc .L002generic
shrl $16,%ebx
andl $255,%ebx
cmpl %esi,%ebx
ja .L002generic
andl $4026531839,%edx
jmp .L002generic
.L001intel:
cmpl $4,%edi
movl $-1,%esi
jb .L003nocacheinfo
movl $4,%eax
movl $0,%ecx
.byte 0x0f,0xa2
movl %eax,%esi
shrl $14,%esi
andl $4095,%esi
.L003nocacheinfo:
movl $1,%eax
xorl %ecx,%ecx
.byte 0x0f,0xa2
andl $3220176895,%edx
cmpl $0,%ebp
jne .L004notintel
orl $1073741824,%edx
andb $15,%ah
cmpb $15,%ah
jne .L004notintel
orl $1048576,%edx
.L004notintel:
btl $28,%edx
jnc .L002generic
andl $4026531839,%edx
cmpl $0,%esi
je .L002generic
orl $268435456,%edx
shrl $16,%ebx
cmpb $1,%bl
ja .L002generic
andl $4026531839,%edx
.L002generic:
andl $2048,%ebp
andl $4294965247,%ecx
movl %edx,%esi
orl %ecx,%ebp
cmpl $7,%edi
movl 20(%esp),%edi
jb .L005no_extended_info
movl $7,%eax
xorl %ecx,%ecx
.byte 0x0f,0xa2
movl %ebx,8(%edi)
.L005no_extended_info:
btl $27,%ebp
jnc .L006clear_avx
xorl %ecx,%ecx
.byte 15,1,208
andl $6,%eax
cmpl $6,%eax
je .L007done
cmpl $2,%eax
je .L006clear_avx
.L008clear_xmm:
andl $4261412861,%ebp
andl $4278190079,%esi
.L006clear_avx:
andl $4026525695,%ebp
andl $4294967263,8(%edi)
.L007done:
movl %esi,%eax
movl %ebp,%edx
.L000nocpuid:
popl %edi
popl %esi
popl %ebx
popl %ebp
ret
.size OPENSSL_ia32_cpuid,.-.L_OPENSSL_ia32_cpuid_begin
.globl OPENSSL_rdtsc
.type OPENSSL_rdtsc,@function
.align 16
OPENSSL_rdtsc:
.L_OPENSSL_rdtsc_begin:
#ifdef __CET__
.byte 243,15,30,251
#endif
xorl %eax,%eax
xorl %edx,%edx
leal OPENSSL_ia32cap_P,%ecx
btl $4,(%ecx)
jnc .L009notsc
.byte 0x0f,0x31
.L009notsc:
ret
.size OPENSSL_rdtsc,.-.L_OPENSSL_rdtsc_begin
.globl OPENSSL_instrument_halt
.type OPENSSL_instrument_halt,@function
.align 16
OPENSSL_instrument_halt:
.L_OPENSSL_instrument_halt_begin:
#ifdef __CET__
.byte 243,15,30,251
#endif
leal OPENSSL_ia32cap_P,%ecx
btl $4,(%ecx)
jnc .L010nohalt
.long 2421723150
andl $3,%eax
jnz .L010nohalt
pushfl
popl %eax
btl $9,%eax
jnc .L010nohalt
.byte 0x0f,0x31
pushl %edx
pushl %eax
hlt
.byte 0x0f,0x31
subl (%esp),%eax
sbbl 4(%esp),%edx
addl $8,%esp
ret
.L010nohalt:
xorl %eax,%eax
xorl %edx,%edx
ret
.size OPENSSL_instrument_halt,.-.L_OPENSSL_instrument_halt_begin
.globl OPENSSL_far_spin
.type OPENSSL_far_spin,@function
.align 16
OPENSSL_far_spin:
.L_OPENSSL_far_spin_begin:
#ifdef __CET__
.byte 243,15,30,251
#endif
pushfl
popl %eax
btl $9,%eax
jnc .L011nospin
movl 4(%esp),%eax
movl 8(%esp),%ecx
.long 2430111262
xorl %eax,%eax
movl (%ecx),%edx
jmp .L012spin
.align 16
.L012spin:
incl %eax
cmpl (%ecx),%edx
je .L012spin
.long 529567888
ret
.L011nospin:
xorl %eax,%eax
xorl %edx,%edx
ret
.size OPENSSL_far_spin,.-.L_OPENSSL_far_spin_begin
.globl OPENSSL_wipe_cpu
.type OPENSSL_wipe_cpu,@function
.align 16
OPENSSL_wipe_cpu:
.L_OPENSSL_wipe_cpu_begin:
#ifdef __CET__
.byte 243,15,30,251
#endif
xorl %eax,%eax
xorl %edx,%edx
leal OPENSSL_ia32cap_P,%ecx
movl (%ecx),%ecx
btl $1,(%ecx)
jnc .L013no_x87
andl $83886080,%ecx
cmpl $83886080,%ecx
jne .L014no_sse2
pxor %xmm0,%xmm0
pxor %xmm1,%xmm1
pxor %xmm2,%xmm2
pxor %xmm3,%xmm3
pxor %xmm4,%xmm4
pxor %xmm5,%xmm5
pxor %xmm6,%xmm6
pxor %xmm7,%xmm7
.L014no_sse2:
.long 4007259865,4007259865,4007259865,4007259865,2430851995
.L013no_x87:
leal 4(%esp),%eax
ret
.size OPENSSL_wipe_cpu,.-.L_OPENSSL_wipe_cpu_begin
.globl OPENSSL_atomic_add
.type OPENSSL_atomic_add,@function
.align 16
OPENSSL_atomic_add:
.L_OPENSSL_atomic_add_begin:
#ifdef __CET__
.byte 243,15,30,251
#endif
movl 4(%esp),%edx
movl 8(%esp),%ecx
pushl %ebx
nop
movl (%edx),%eax
.L015spin:
leal (%eax,%ecx,1),%ebx
nop
.long 447811568
jne .L015spin
movl %ebx,%eax
popl %ebx
ret
.size OPENSSL_atomic_add,.-.L_OPENSSL_atomic_add_begin
.globl OPENSSL_cleanse
.type OPENSSL_cleanse,@function
.align 16
OPENSSL_cleanse:
.L_OPENSSL_cleanse_begin:
#ifdef __CET__
.byte 243,15,30,251
#endif
movl 4(%esp),%edx
movl 8(%esp),%ecx
xorl %eax,%eax
cmpl $7,%ecx
jae .L016lot
cmpl $0,%ecx
je .L017ret
.L018little:
movb %al,(%edx)
subl $1,%ecx
leal 1(%edx),%edx
jnz .L018little
.L017ret:
ret
.align 16
.L016lot:
testl $3,%edx
jz .L019aligned
movb %al,(%edx)
leal -1(%ecx),%ecx
leal 1(%edx),%edx
jmp .L016lot
.L019aligned:
movl %eax,(%edx)
leal -4(%ecx),%ecx
testl $-4,%ecx
leal 4(%edx),%edx
jnz .L019aligned
cmpl $0,%ecx
jne .L018little
ret
.size OPENSSL_cleanse,.-.L_OPENSSL_cleanse_begin
.globl CRYPTO_memcmp
.type CRYPTO_memcmp,@function
.align 16
CRYPTO_memcmp:
.L_CRYPTO_memcmp_begin:
#ifdef __CET__
.byte 243,15,30,251
#endif
pushl %esi
pushl %edi
movl 12(%esp),%esi
movl 16(%esp),%edi
movl 20(%esp),%ecx
xorl %eax,%eax
xorl %edx,%edx
cmpl $0,%ecx
je .L020no_data
.L021loop:
movb (%esi),%dl
leal 1(%esi),%esi
xorb (%edi),%dl
leal 1(%edi),%edi
orb %dl,%al
decl %ecx
jnz .L021loop
negl %eax
shrl $31,%eax
.L020no_data:
popl %edi
popl %esi
ret
.size CRYPTO_memcmp,.-.L_CRYPTO_memcmp_begin
.globl OPENSSL_instrument_bus
.type OPENSSL_instrument_bus,@function
.align 16
OPENSSL_instrument_bus:
.L_OPENSSL_instrument_bus_begin:
#ifdef __CET__
.byte 243,15,30,251
#endif
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl $0,%eax
leal OPENSSL_ia32cap_P,%edx
btl $4,(%edx)
jnc .L022nogo
btl $19,(%edx)
jnc .L022nogo
movl 20(%esp),%edi
movl 24(%esp),%ecx
.byte 0x0f,0x31
movl %eax,%esi
movl $0,%ebx
clflush (%edi)
.byte 240
addl %ebx,(%edi)
jmp .L023loop
.align 16
.L023loop:
.byte 0x0f,0x31
movl %eax,%edx
subl %esi,%eax
movl %edx,%esi
movl %eax,%ebx
clflush (%edi)
.byte 240
addl %eax,(%edi)
leal 4(%edi),%edi
subl $1,%ecx
jnz .L023loop
movl 24(%esp),%eax
.L022nogo:
popl %edi
popl %esi
popl %ebx
popl %ebp
ret
.size OPENSSL_instrument_bus,.-.L_OPENSSL_instrument_bus_begin
.globl OPENSSL_instrument_bus2
.type OPENSSL_instrument_bus2,@function
.align 16
OPENSSL_instrument_bus2:
.L_OPENSSL_instrument_bus2_begin:
#ifdef __CET__
.byte 243,15,30,251
#endif
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl $0,%eax
leal OPENSSL_ia32cap_P,%edx
btl $4,(%edx)
jnc .L024nogo
btl $19,(%edx)
jnc .L024nogo
movl 20(%esp),%edi
movl 24(%esp),%ecx
movl 28(%esp),%ebp
.byte 0x0f,0x31
movl %eax,%esi
movl $0,%ebx
clflush (%edi)
.byte 240
addl %ebx,(%edi)
.byte 0x0f,0x31
movl %eax,%edx
subl %esi,%eax
movl %edx,%esi
movl %eax,%ebx
jmp .L025loop2
.align 16
.L025loop2:
clflush (%edi)
.byte 240
addl %eax,(%edi)
subl $1,%ebp
jz .L026done2
.byte 0x0f,0x31
movl %eax,%edx
subl %esi,%eax
movl %edx,%esi
cmpl %ebx,%eax
movl %eax,%ebx
movl $0,%edx
setne %dl
subl %edx,%ecx
leal (%edi,%edx,4),%edi
jnz .L025loop2
.L026done2:
movl 24(%esp),%eax
subl %ecx,%eax
.L024nogo:
popl %edi
popl %esi
popl %ebx
popl %ebp
ret
.size OPENSSL_instrument_bus2,.-.L_OPENSSL_instrument_bus2_begin
.globl OPENSSL_ia32_rdrand_bytes
.type OPENSSL_ia32_rdrand_bytes,@function
.align 16
OPENSSL_ia32_rdrand_bytes:
.L_OPENSSL_ia32_rdrand_bytes_begin:
#ifdef __CET__
.byte 243,15,30,251
#endif
pushl %edi
pushl %ebx
xorl %eax,%eax
movl 12(%esp),%edi
movl 16(%esp),%ebx
cmpl $0,%ebx
je .L027done
movl $8,%ecx
.L028loop:
.byte 15,199,242
jc .L029break
loop .L028loop
jmp .L027done
.align 16
.L029break:
cmpl $4,%ebx
jb .L030tail
movl %edx,(%edi)
leal 4(%edi),%edi
addl $4,%eax
subl $4,%ebx
jz .L027done
movl $8,%ecx
jmp .L028loop
.align 16
.L030tail:
movb %dl,(%edi)
leal 1(%edi),%edi
incl %eax
shrl $8,%edx
decl %ebx
jnz .L030tail
.L027done:
xorl %edx,%edx
popl %ebx
popl %edi
ret
.size OPENSSL_ia32_rdrand_bytes,.-.L_OPENSSL_ia32_rdrand_bytes_begin
.globl OPENSSL_ia32_rdseed_bytes
.type OPENSSL_ia32_rdseed_bytes,@function
.align 16
OPENSSL_ia32_rdseed_bytes:
.L_OPENSSL_ia32_rdseed_bytes_begin:
#ifdef __CET__
.byte 243,15,30,251
#endif
pushl %edi
pushl %ebx
xorl %eax,%eax
movl 12(%esp),%edi
movl 16(%esp),%ebx
cmpl $0,%ebx
je .L031done
movl $8,%ecx
.L032loop:
.byte 15,199,250
jc .L033break
loop .L032loop
jmp .L031done
.align 16
.L033break:
cmpl $4,%ebx
jb .L034tail
movl %edx,(%edi)
leal 4(%edi),%edi
addl $4,%eax
subl $4,%ebx
jz .L031done
movl $8,%ecx
jmp .L032loop
.align 16
.L034tail:
movb %dl,(%edi)
leal 1(%edi),%edi
incl %eax
shrl $8,%edx
decl %ebx
jnz .L034tail
.L031done:
xorl %edx,%edx
popl %ebx
popl %edi
ret
.size OPENSSL_ia32_rdseed_bytes,.-.L_OPENSSL_ia32_rdseed_bytes_begin
.hidden OPENSSL_cpuid_setup
.hidden OPENSSL_ia32cap_P
.comm OPENSSL_ia32cap_P,16,4
.section .init
call OPENSSL_cpuid_setup
.section ".note.gnu.property", "a"
.p2align 2
.long 1f - 0f
.long 4f - 1f
.long 5
0:
.asciz "GNU"
1:
.p2align 2
.long 0xc0000002
.long 3f - 2f
2:
.long 3
3:
.p2align 2
4: