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..6204dc9b1e7711aa0a4c8f833754bd779de20c3c |
--- /dev/null |
+++ b/third_party/boringssl/win-x86_64/crypto/cpu-x86_64-asm.asm |
@@ -0,0 +1,158 @@ |
+OPTION DOTNAME |
+.text$ SEGMENT ALIGN(64) 'CODE' |
+ |
+PUBLIC OPENSSL_ia32_cpuid |
+ |
+ALIGN 16 |
+OPENSSL_ia32_cpuid PROC PUBLIC |
+ mov QWORD PTR[8+rsp],rdi ;WIN64 prologue |
+ mov QWORD PTR[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 PTR[8+rdi],eax |
+ cpuid |
+ mov r11d,eax |
+ |
+ xor eax,eax |
+ cmp ebx,0756e6547h |
+ setne al |
+ mov r9d,eax |
+ cmp edx,049656e69h |
+ setne al |
+ or r9d,eax |
+ cmp ecx,06c65746eh |
+ setne al |
+ or r9d,eax |
+ jz $L$intel |
+ |
+ cmp ebx,068747541h |
+ setne al |
+ mov r10d,eax |
+ cmp edx,069746E65h |
+ setne al |
+ or r10d,eax |
+ cmp ecx,0444D4163h |
+ setne al |
+ or r10d,eax |
+ jnz $L$intel |
+ |
+ |
+ |
+ |
+ mov eax,080000000h |
+ cpuid |
+ |
+ |
+ cmp eax,080000001h |
+ jb $L$intel |
+ mov r10d,eax |
+ mov eax,080000001h |
+ cpuid |
+ |
+ |
+ or r9d,ecx |
+ and r9d,000000801h |
+ |
+ cmp r10d,080000008h |
+ jb $L$intel |
+ |
+ mov eax,080000008h |
+ cpuid |
+ |
+ movzx r10,cl |
+ inc r10 |
+ |
+ mov eax,1 |
+ cpuid |
+ |
+ bt edx,28 |
+ jnc $L$generic |
+ shr ebx,16 |
+ cmp bl,r10b |
+ ja $L$generic |
+ and edx,0efffffffh |
+ jmp $L$generic |
+ |
+$L$intel:: |
+ cmp r11d,4 |
+ mov r10d,-1 |
+ jb $L$nocacheinfo |
+ |
+ mov eax,4 |
+ mov ecx,0 |
+ cpuid |
+ mov r10d,eax |
+ shr r10d,14 |
+ and r10d,0fffh |
+ |
+ cmp r11d,7 |
+ jb $L$nocacheinfo |
+ |
+ mov eax,7 |
+ xor ecx,ecx |
+ cpuid |
+ mov DWORD PTR[8+rdi],ebx |
+ |
+$L$nocacheinfo:: |
+ mov eax,1 |
+ cpuid |
+ |
+ and edx,0bfefffffh |
+ cmp r9d,0 |
+ jne $L$notintel |
+ or edx,040000000h |
+ and ah,15 |
+ cmp ah,15 |
+ jne $L$notintel |
+ or edx,000100000h |
+$L$notintel:: |
+ bt edx,28 |
+ jnc $L$generic |
+ and edx,0efffffffh |
+ cmp r10d,0 |
+ je $L$generic |
+ |
+ or edx,010000000h |
+ shr ebx,16 |
+ cmp bl,1 |
+ ja $L$generic |
+ and edx,0efffffffh |
+$L$generic:: |
+ and r9d,000000800h |
+ and ecx,0fffff7ffh |
+ or r9d,ecx |
+ |
+ mov r10d,edx |
+ bt r9d,27 |
+ jnc $L$clear_avx |
+ xor ecx,ecx |
+DB 00fh,001h,0d0h |
+ and eax,6 |
+ cmp eax,6 |
+ je $L$done |
+$L$clear_avx:: |
+ mov eax,0efffe7ffh |
+ and r9d,eax |
+ and DWORD PTR[8+rdi],0ffffffdfh |
+$L$done:: |
+ mov DWORD PTR[4+rdi],r9d |
+ mov DWORD PTR[rdi],r10d |
+ mov rbx,r8 |
+ mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue |
+ mov rsi,QWORD PTR[16+rsp] |
+ DB 0F3h,0C3h ;repret |
+$L$SEH_end_OPENSSL_ia32_cpuid:: |
+OPENSSL_ia32_cpuid ENDP |
+ |
+ |
+.text$ ENDS |
+END |