diff options
Diffstat (limited to 'deps/openssl/config/archs/VC-WIN32/asm/crypto/x86cpuid.asm')
-rw-r--r-- | deps/openssl/config/archs/VC-WIN32/asm/crypto/x86cpuid.asm | 555 |
1 files changed, 555 insertions, 0 deletions
diff --git a/deps/openssl/config/archs/VC-WIN32/asm/crypto/x86cpuid.asm b/deps/openssl/config/archs/VC-WIN32/asm/crypto/x86cpuid.asm new file mode 100644 index 0000000000..be679e47b3 --- /dev/null +++ b/deps/openssl/config/archs/VC-WIN32/asm/crypto/x86cpuid.asm @@ -0,0 +1,555 @@ +%ifidn __OUTPUT_FORMAT__,obj +section code use32 class=code align=64 +%elifidn __OUTPUT_FORMAT__,win32 +$@feat.00 equ 1 +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 + mov esi,DWORD [20+esp] + mov DWORD [8+esi],eax + bt ecx,21 + jnc NEAR L$000nocpuid + 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,4 + mov esi,-1 + jb NEAR L$003nocacheinfo + mov eax,4 + mov ecx,0 + cpuid + mov esi,eax + shr esi,14 + and esi,4095 +L$003nocacheinfo: + mov eax,1 + xor ecx,ecx + cpuid + and edx,3220176895 + cmp ebp,0 + jne NEAR L$004notintel + or edx,1073741824 + and ah,15 + cmp ah,15 + jne NEAR L$004notintel + or edx,1048576 +L$004notintel: + bt edx,28 + jnc NEAR L$002generic + and edx,4026531839 + cmp esi,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 + cmp edi,7 + mov edi,DWORD [20+esp] + jb NEAR L$005no_extended_info + mov eax,7 + xor ecx,ecx + cpuid + mov DWORD [8+edi],ebx +L$005no_extended_info: + bt ebp,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 + 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_cleanse +align 16 +_OPENSSL_cleanse: +L$_OPENSSL_cleanse_begin: + mov edx,DWORD [4+esp] + mov ecx,DWORD [8+esp] + xor eax,eax + cmp ecx,7 + jae NEAR L$016lot + cmp ecx,0 + je NEAR L$017ret +L$018little: + mov BYTE [edx],al + sub ecx,1 + lea edx,[1+edx] + jnz NEAR L$018little +L$017ret: + ret +align 16 +L$016lot: + test edx,3 + jz NEAR L$019aligned + mov BYTE [edx],al + lea ecx,[ecx-1] + lea edx,[1+edx] + jmp NEAR L$016lot +L$019aligned: + mov DWORD [edx],eax + lea ecx,[ecx-4] + test ecx,-4 + lea edx,[4+edx] + jnz NEAR L$019aligned + cmp ecx,0 + jne NEAR L$018little + ret +global _CRYPTO_memcmp +align 16 +_CRYPTO_memcmp: +L$_CRYPTO_memcmp_begin: + push esi + push edi + mov esi,DWORD [12+esp] + mov edi,DWORD [16+esp] + mov ecx,DWORD [20+esp] + xor eax,eax + xor edx,edx + cmp ecx,0 + je NEAR L$020no_data +L$021loop: + mov dl,BYTE [esi] + lea esi,[1+esi] + xor dl,BYTE [edi] + lea edi,[1+edi] + or al,dl + dec ecx + jnz NEAR L$021loop + neg eax + shr eax,31 +L$020no_data: + pop edi + pop esi + ret +global _OPENSSL_instrument_bus +align 16 +_OPENSSL_instrument_bus: +L$_OPENSSL_instrument_bus_begin: + push ebp + push ebx + push esi + push edi + mov eax,0 + lea edx,[_OPENSSL_ia32cap_P] + bt DWORD [edx],4 + jnc NEAR L$022nogo + bt DWORD [edx],19 + jnc NEAR L$022nogo + mov edi,DWORD [20+esp] + mov ecx,DWORD [24+esp] + rdtsc + mov esi,eax + mov ebx,0 + clflush [edi] +db 240 + add DWORD [edi],ebx + jmp NEAR L$023loop +align 16 +L$023loop: + rdtsc + mov edx,eax + sub eax,esi + mov esi,edx + mov ebx,eax + clflush [edi] +db 240 + add DWORD [edi],eax + lea edi,[4+edi] + sub ecx,1 + jnz NEAR L$023loop + mov eax,DWORD [24+esp] +L$022nogo: + pop edi + pop esi + pop ebx + pop ebp + ret +global _OPENSSL_instrument_bus2 +align 16 +_OPENSSL_instrument_bus2: +L$_OPENSSL_instrument_bus2_begin: + push ebp + push ebx + push esi + push edi + mov eax,0 + lea edx,[_OPENSSL_ia32cap_P] + bt DWORD [edx],4 + jnc NEAR L$024nogo + bt DWORD [edx],19 + jnc NEAR L$024nogo + mov edi,DWORD [20+esp] + mov ecx,DWORD [24+esp] + mov ebp,DWORD [28+esp] + rdtsc + mov esi,eax + mov ebx,0 + clflush [edi] +db 240 + add DWORD [edi],ebx + rdtsc + mov edx,eax + sub eax,esi + mov esi,edx + mov ebx,eax + jmp NEAR L$025loop2 +align 16 +L$025loop2: + clflush [edi] +db 240 + add DWORD [edi],eax + sub ebp,1 + jz NEAR L$026done2 + rdtsc + mov edx,eax + sub eax,esi + mov esi,edx + cmp eax,ebx + mov ebx,eax + mov edx,0 + setne dl + sub ecx,edx + lea edi,[edx*4+edi] + jnz NEAR L$025loop2 +L$026done2: + mov eax,DWORD [24+esp] + sub eax,ecx +L$024nogo: + pop edi + pop esi + pop ebx + pop ebp + ret +global _OPENSSL_ia32_rdrand +align 16 +_OPENSSL_ia32_rdrand: +L$_OPENSSL_ia32_rdrand_begin: + mov ecx,8 +L$027loop: +db 15,199,240 + jc NEAR L$028break + loop L$027loop +L$028break: + cmp eax,0 + cmove eax,ecx + ret +global _OPENSSL_ia32_rdrand_bytes +align 16 +_OPENSSL_ia32_rdrand_bytes: +L$_OPENSSL_ia32_rdrand_bytes_begin: + push edi + push ebx + xor eax,eax + mov edi,DWORD [12+esp] + mov ebx,DWORD [16+esp] + cmp ebx,0 + je NEAR L$029done + mov ecx,8 +L$030loop: +db 15,199,242 + jc NEAR L$031break + loop L$030loop + jmp NEAR L$029done +align 16 +L$031break: + cmp ebx,4 + jb NEAR L$032tail + mov DWORD [edi],edx + lea edi,[4+edi] + add eax,4 + sub ebx,4 + jz NEAR L$029done + mov ecx,8 + jmp NEAR L$030loop +align 16 +L$032tail: + mov BYTE [edi],dl + lea edi,[1+edi] + inc eax + shr edx,8 + dec ebx + jnz NEAR L$032tail +L$029done: + pop ebx + pop edi + ret +global _OPENSSL_ia32_rdseed +align 16 +_OPENSSL_ia32_rdseed: +L$_OPENSSL_ia32_rdseed_begin: + mov ecx,8 +L$033loop: +db 15,199,248 + jc NEAR L$034break + loop L$033loop +L$034break: + cmp eax,0 + cmove eax,ecx + ret +global _OPENSSL_ia32_rdseed_bytes +align 16 +_OPENSSL_ia32_rdseed_bytes: +L$_OPENSSL_ia32_rdseed_bytes_begin: + push edi + push ebx + xor eax,eax + mov edi,DWORD [12+esp] + mov ebx,DWORD [16+esp] + cmp ebx,0 + je NEAR L$035done + mov ecx,8 +L$036loop: +db 15,199,250 + jc NEAR L$037break + loop L$036loop + jmp NEAR L$035done +align 16 +L$037break: + cmp ebx,4 + jb NEAR L$038tail + mov DWORD [edi],edx + lea edi,[4+edi] + add eax,4 + sub ebx,4 + jz NEAR L$035done + mov ecx,8 + jmp NEAR L$036loop +align 16 +L$038tail: + mov BYTE [edi],dl + lea edi,[1+edi] + inc eax + shr edx,8 + dec ebx + jnz NEAR L$038tail +L$035done: + pop ebx + pop edi + ret +segment .bss +common _OPENSSL_ia32cap_P 16 +segment .CRT$XCU data align=4 +extern _OPENSSL_cpuid_setup +dd _OPENSSL_cpuid_setup |