Index: third_party/boringssl/win-x86_64/crypto/cpu-x86_64-asm.asm |
diff --git a/third_party/boringssl/win-x86_64/crypto/cpu-x86_64-asm.asm b/third_party/boringssl/win-x86_64/crypto/cpu-x86_64-asm.asm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c92d7bbc1f778c679b9381354e2d8f21e9ec8c06 |
--- /dev/null |
+++ b/third_party/boringssl/win-x86_64/crypto/cpu-x86_64-asm.asm |
@@ -0,0 +1,154 @@ |
+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: |
+ |