| 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: |
| |