blob: 542e759ecdc64cd58a2a2501b5648c9609a0be0e [file] [log] [blame]
; WARNING: do not edit!
; Generated from openssl/crypto/x86cpuid.pl
;
; Copyright 2004-2020 The OpenSSL Project Authors. All Rights Reserved.
;
; Licensed under the OpenSSL license (the "License"). You may not use
; this file except in compliance with the License. You can obtain a copy
; in the file LICENSE in the source distribution or at
; https://www.openssl.org/source/license.html
%ifidn __OUTPUT_FORMAT__,obj
section code use32 class=code align=64
%elifidn __OUTPUT_FORMAT__,win32
$@feat.00 equ 1
section .text code align=64
%else
section .text code
%endif
global _OPENSSL_ia32_cpuid
align 16
_OPENSSL_ia32_cpuid:
L$_OPENSSL_ia32_cpuid_begin:
push ebp
push ebx
push esi
push edi
xor edx,edx
pushfd
pop eax
mov ecx,eax
xor eax,2097152
push eax
popfd
pushfd
pop eax
xor ecx,eax
xor eax,eax
mov esi,DWORD [20+esp]
mov DWORD [8+esi],eax
bt ecx,21
jnc NEAR L$000nocpuid
cpuid
mov edi,eax
xor eax,eax
cmp ebx,1970169159
setne al
mov ebp,eax
cmp edx,1231384169
setne al
or ebp,eax
cmp ecx,1818588270
setne al
or ebp,eax
jz NEAR L$001intel
cmp ebx,1752462657
setne al
mov esi,eax
cmp edx,1769238117
setne al
or esi,eax
cmp ecx,1145913699
setne al
or esi,eax
jnz NEAR L$001intel
mov eax,2147483648
cpuid
cmp eax,2147483649
jb NEAR L$001intel
mov esi,eax
mov eax,2147483649
cpuid
or ebp,ecx
and ebp,2049
cmp esi,2147483656
jb NEAR L$001intel
mov eax,2147483656
cpuid
movzx esi,cl
inc esi
mov eax,1
xor ecx,ecx
cpuid
bt edx,28
jnc NEAR L$002generic
shr ebx,16
and ebx,255
cmp ebx,esi
ja NEAR L$002generic
and edx,4026531839
jmp NEAR L$002generic
L$001intel:
cmp edi,4
mov esi,-1
jb NEAR L$003nocacheinfo
mov eax,4
mov ecx,0
cpuid
mov esi,eax
shr esi,14
and esi,4095
L$003nocacheinfo:
mov eax,1
xor ecx,ecx
cpuid
and edx,3220176895
cmp ebp,0
jne NEAR L$004notintel
or edx,1073741824
and ah,15
cmp ah,15
jne NEAR L$004notintel
or edx,1048576
L$004notintel:
bt edx,28
jnc NEAR L$002generic
and edx,4026531839
cmp esi,0
je NEAR L$002generic
or edx,268435456
shr ebx,16
cmp bl,1
ja NEAR L$002generic
and edx,4026531839
L$002generic:
and ebp,2048
and ecx,4294965247
mov esi,edx
or ebp,ecx
cmp edi,7
mov edi,DWORD [20+esp]
jb NEAR L$005no_extended_info
mov eax,7
xor ecx,ecx
cpuid
mov DWORD [8+edi],ebx
L$005no_extended_info:
bt ebp,27
jnc NEAR L$006clear_avx
xor ecx,ecx
db 15,1,208
and eax,6
cmp eax,6
je NEAR L$007done
cmp eax,2
je NEAR L$006clear_avx
L$008clear_xmm:
and ebp,4261412861
and esi,4278190079
L$006clear_avx:
and ebp,4026525695
and DWORD [8+edi],4294967263
L$007done:
mov eax,esi
mov edx,ebp
L$000nocpuid:
pop edi
pop esi
pop ebx
pop ebp
ret
;extern _OPENSSL_ia32cap_P
global _OPENSSL_rdtsc
align 16
_OPENSSL_rdtsc:
L$_OPENSSL_rdtsc_begin:
xor eax,eax
xor edx,edx
lea ecx,[_OPENSSL_ia32cap_P]
bt DWORD [ecx],4
jnc NEAR L$009notsc
rdtsc
L$009notsc:
ret
global _OPENSSL_instrument_halt
align 16
_OPENSSL_instrument_halt:
L$_OPENSSL_instrument_halt_begin:
lea ecx,[_OPENSSL_ia32cap_P]
bt DWORD [ecx],4
jnc NEAR L$010nohalt
dd 2421723150
and eax,3
jnz NEAR L$010nohalt
pushfd
pop eax
bt eax,9
jnc NEAR L$010nohalt
rdtsc
push edx
push eax
hlt
rdtsc
sub eax,DWORD [esp]
sbb edx,DWORD [4+esp]
add esp,8
ret
L$010nohalt:
xor eax,eax
xor edx,edx
ret
global _OPENSSL_far_spin
align 16
_OPENSSL_far_spin:
L$_OPENSSL_far_spin_begin:
pushfd
pop eax
bt eax,9
jnc NEAR L$011nospin
mov eax,DWORD [4+esp]
mov ecx,DWORD [8+esp]
dd 2430111262
xor eax,eax
mov edx,DWORD [ecx]
jmp NEAR L$012spin
align 16
L$012spin:
inc eax
cmp edx,DWORD [ecx]
je NEAR L$012spin
dd 529567888
ret
L$011nospin:
xor eax,eax
xor edx,edx
ret
global _OPENSSL_wipe_cpu
align 16
_OPENSSL_wipe_cpu:
L$_OPENSSL_wipe_cpu_begin:
xor eax,eax
xor edx,edx
lea ecx,[_OPENSSL_ia32cap_P]
mov ecx,DWORD [ecx]
bt DWORD [ecx],1
jnc NEAR L$013no_x87
dd 4007259865,4007259865,4007259865,4007259865,2430851995
L$013no_x87:
lea eax,[4+esp]
ret
global _OPENSSL_atomic_add
align 16
_OPENSSL_atomic_add:
L$_OPENSSL_atomic_add_begin:
mov edx,DWORD [4+esp]
mov ecx,DWORD [8+esp]
push ebx
nop
mov eax,DWORD [edx]
L$014spin:
lea ebx,[ecx*1+eax]
nop
dd 447811568
jne NEAR L$014spin
mov eax,ebx
pop ebx
ret
global _OPENSSL_cleanse
align 16
_OPENSSL_cleanse:
L$_OPENSSL_cleanse_begin:
mov edx,DWORD [4+esp]
mov ecx,DWORD [8+esp]
xor eax,eax
cmp ecx,7
jae NEAR L$015lot
cmp ecx,0
je NEAR L$016ret
L$017little:
mov BYTE [edx],al
sub ecx,1
lea edx,[1+edx]
jnz NEAR L$017little
L$016ret:
ret
align 16
L$015lot:
test edx,3
jz NEAR L$018aligned
mov BYTE [edx],al
lea ecx,[ecx-1]
lea edx,[1+edx]
jmp NEAR L$015lot
L$018aligned:
mov DWORD [edx],eax
lea ecx,[ecx-4]
test ecx,-4
lea edx,[4+edx]
jnz NEAR L$018aligned
cmp ecx,0
jne NEAR L$017little
ret
global _CRYPTO_memcmp
align 16
_CRYPTO_memcmp:
L$_CRYPTO_memcmp_begin:
push esi
push edi
mov esi,DWORD [12+esp]
mov edi,DWORD [16+esp]
mov ecx,DWORD [20+esp]
xor eax,eax
xor edx,edx
cmp ecx,0
je NEAR L$019no_data
L$020loop:
mov dl,BYTE [esi]
lea esi,[1+esi]
xor dl,BYTE [edi]
lea edi,[1+edi]
or al,dl
dec ecx
jnz NEAR L$020loop
neg eax
shr eax,31
L$019no_data:
pop edi
pop esi
ret
global _OPENSSL_instrument_bus
align 16
_OPENSSL_instrument_bus:
L$_OPENSSL_instrument_bus_begin:
push ebp
push ebx
push esi
push edi
mov eax,0
pop edi
pop esi
pop ebx
pop ebp
ret
global _OPENSSL_instrument_bus2
align 16
_OPENSSL_instrument_bus2:
L$_OPENSSL_instrument_bus2_begin:
push ebp
push ebx
push esi
push edi
mov eax,0
pop edi
pop esi
pop ebx
pop ebp
ret
global _OPENSSL_ia32_rdrand_bytes
align 16
_OPENSSL_ia32_rdrand_bytes:
L$_OPENSSL_ia32_rdrand_bytes_begin:
push edi
push ebx
xor eax,eax
mov edi,DWORD [12+esp]
mov ebx,DWORD [16+esp]
cmp ebx,0
je NEAR L$021done
mov ecx,8
L$022loop:
db 15,199,242
jc NEAR L$023break
loop L$022loop
jmp NEAR L$021done
align 16
L$023break:
cmp ebx,4
jb NEAR L$024tail
mov DWORD [edi],edx
lea edi,[4+edi]
add eax,4
sub ebx,4
jz NEAR L$021done
mov ecx,8
jmp NEAR L$022loop
align 16
L$024tail:
mov BYTE [edi],dl
lea edi,[1+edi]
inc eax
shr edx,8
dec ebx
jnz NEAR L$024tail
L$021done:
xor edx,edx
pop ebx
pop edi
ret
global _OPENSSL_ia32_rdseed_bytes
align 16
_OPENSSL_ia32_rdseed_bytes:
L$_OPENSSL_ia32_rdseed_bytes_begin:
push edi
push ebx
xor eax,eax
mov edi,DWORD [12+esp]
mov ebx,DWORD [16+esp]
cmp ebx,0
je NEAR L$025done
mov ecx,8
L$026loop:
db 15,199,250
jc NEAR L$027break
loop L$026loop
jmp NEAR L$025done
align 16
L$027break:
cmp ebx,4
jb NEAR L$028tail
mov DWORD [edi],edx
lea edi,[4+edi]
add eax,4
sub ebx,4
jz NEAR L$025done
mov ecx,8
jmp NEAR L$026loop
align 16
L$028tail:
mov BYTE [edi],dl
lea edi,[1+edi]
inc eax
shr edx,8
dec ebx
jnz NEAR L$028tail
L$025done:
xor edx,edx
pop ebx
pop edi
ret
segment .bss
common _OPENSSL_ia32cap_P 16
segment .CRT$XCU data align=4
extern _OPENSSL_cpuid_setup
dd _OPENSSL_cpuid_setup