%ifidn __OUTPUT_FORMAT__,obj section code use32 class=code align=64 %elifidn __OUTPUT_FORMAT__,win32 %ifdef __YASM_VERSION_ID__ %if __YASM_VERSION_ID__ < 01010000h %error yasm version 1.1.0 or later needed. %endif ; Yasm automatically includes .00 and complains about redefining it. ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html %else $@feat.00 equ 1 %endif 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 bt ecx,21 jnc NEAR L$000nocpuid mov esi,DWORD [20+esp] mov DWORD [8+esi],eax 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,7 jb NEAR L$003cacheinfo mov esi,DWORD [20+esp] mov eax,7 xor ecx,ecx cpuid mov DWORD [8+esi],ebx L$003cacheinfo: cmp edi,4 mov edi,-1 jb NEAR L$004nocacheinfo mov eax,4 mov ecx,0 cpuid mov edi,eax shr edi,14 and edi,4095 L$004nocacheinfo: mov eax,1 xor ecx,ecx cpuid and edx,3220176895 cmp ebp,0 jne NEAR L$005notintel or edx,1073741824 L$005notintel: bt edx,28 jnc NEAR L$002generic and edx,4026531839 cmp edi,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 bt ecx,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 mov edi,DWORD [20+esp] 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 and ecx,83886080 cmp ecx,83886080 jne NEAR L$014no_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 L$014no_sse2: 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$015spin: lea ebx,[ecx*1+eax] nop dd 447811568 jne NEAR L$015spin mov eax,ebx pop ebx ret global _OPENSSL_indirect_call align 16 _OPENSSL_indirect_call: L$_OPENSSL_indirect_call_begin: push ebp mov ebp,esp sub esp,28 mov ecx,DWORD [12+ebp] mov DWORD [esp],ecx mov edx,DWORD [16+ebp] mov DWORD [4+esp],edx mov eax,DWORD [20+ebp] mov DWORD [8+esp],eax mov eax,DWORD [24+ebp] mov DWORD [12+esp],eax mov eax,DWORD [28+ebp] mov DWORD [16+esp],eax mov eax,DWORD [32+ebp] mov DWORD [20+esp],eax mov eax,DWORD [36+ebp] mov DWORD [24+esp],eax call DWORD [8+ebp] mov esp,ebp pop ebp ret global _OPENSSL_ia32_rdrand align 16 _OPENSSL_ia32_rdrand: L$_OPENSSL_ia32_rdrand_begin: mov ecx,8 L$016loop: db 15,199,240 jc NEAR L$017break loop L$016loop L$017break: cmp eax,0 cmove eax,ecx ret segment .bss common _OPENSSL_ia32cap_P 16