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