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