default rel %define XMMWORD %define YMMWORD %define ZMMWORD section .text code align=64 global OPENSSL_ia32_cpuid ALIGN 16 OPENSSL_ia32_cpuid: mov QWORD[8+rsp],rdi ;WIN64 prologue mov QWORD[16+rsp],rsi mov rax,rsp $L$SEH_begin_OPENSSL_ia32_cpuid: mov rdi,rcx mov rdi,rcx mov r8,rbx xor eax,eax mov DWORD[8+rdi],eax cpuid mov r11d,eax xor eax,eax cmp ebx,0x756e6547 setne al mov r9d,eax cmp edx,0x49656e69 setne al or r9d,eax cmp ecx,0x6c65746e setne al or r9d,eax jz NEAR $L$intel cmp ebx,0x68747541 setne al mov r10d,eax cmp edx,0x69746E65 setne al or r10d,eax cmp ecx,0x444D4163 setne al or r10d,eax jnz NEAR $L$intel mov eax,0x80000000 cpuid cmp eax,0x80000001 jb NEAR $L$intel mov r10d,eax mov eax,0x80000001 cpuid or r9d,ecx and r9d,0x00000801 cmp r10d,0x80000008 jb NEAR $L$intel mov eax,0x80000008 cpuid movzx r10,cl inc r10 mov eax,1 cpuid bt edx,28 jnc NEAR $L$generic shr ebx,16 cmp bl,r10b ja NEAR $L$generic and edx,0xefffffff jmp NEAR $L$generic $L$intel: cmp r11d,4 mov r10d,-1 jb NEAR $L$nocacheinfo mov eax,4 mov ecx,0 cpuid mov r10d,eax shr r10d,14 and r10d,0xfff cmp r11d,7 jb NEAR $L$nocacheinfo mov eax,7 xor ecx,ecx cpuid mov DWORD[8+rdi],ebx $L$nocacheinfo: mov eax,1 cpuid and edx,0xbfefffff cmp r9d,0 jne NEAR $L$notintel or edx,0x40000000 $L$notintel: bt edx,28 jnc NEAR $L$generic and edx,0xefffffff cmp r10d,0 je NEAR $L$generic or edx,0x10000000 shr ebx,16 cmp bl,1 ja NEAR $L$generic and edx,0xefffffff $L$generic: and r9d,0x00000800 and ecx,0xfffff7ff or r9d,ecx mov r10d,edx bt r9d,27 jnc NEAR $L$clear_avx xor ecx,ecx DB 0x0f,0x01,0xd0 and eax,6 cmp eax,6 je NEAR $L$done $L$clear_avx: mov eax,0xefffe7ff and r9d,eax and DWORD[8+rdi],0xffffffdf $L$done: mov DWORD[4+rdi],r9d mov DWORD[rdi],r10d mov rbx,r8 mov rdi,QWORD[8+rsp] ;WIN64 epilogue mov rsi,QWORD[16+rsp] DB 0F3h,0C3h ;repret $L$SEH_end_OPENSSL_ia32_cpuid: