/deps/openssl/asm/x86-win32-masm/x86cpuid.asm
https://gitlab.com/grayhamster/io.js · Assembly · 321 lines · 320 code · 0 blank · 1 comment · 0 complexity · eb0d15791b1927748d7ebf441242163c MD5 · raw file
- TITLE x86cpuid.asm
- IF @Version LT 800
- ECHO MASM version 8.00 or later is strongly recommended.
- ENDIF
- .686
- .MODEL FLAT
- OPTION DOTNAME
- IF @Version LT 800
- .text$ SEGMENT PAGE 'CODE'
- ELSE
- .text$ SEGMENT ALIGN(64) 'CODE'
- ENDIF
- ALIGN 16
- _OPENSSL_ia32_cpuid PROC PUBLIC
- $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 $L000nocpuid
- 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 $L001intel
- 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 $L001intel
- mov eax,2147483648
- cpuid
- cmp eax,2147483649
- jb $L001intel
- mov esi,eax
- mov eax,2147483649
- cpuid
- or ebp,ecx
- and ebp,2049
- cmp esi,2147483656
- jb $L001intel
- mov eax,2147483656
- cpuid
- movzx esi,cl
- inc esi
- mov eax,1
- xor ecx,ecx
- cpuid
- bt edx,28
- jnc $L002generic
- shr ebx,16
- and ebx,255
- cmp ebx,esi
- ja $L002generic
- and edx,4026531839
- jmp $L002generic
- $L001intel:
- cmp edi,4
- mov edi,-1
- jb $L003nocacheinfo
- mov eax,4
- mov ecx,0
- cpuid
- mov edi,eax
- shr edi,14
- and edi,4095
- $L003nocacheinfo:
- mov eax,1
- xor ecx,ecx
- cpuid
- and edx,3220176895
- cmp ebp,0
- jne $L004notintel
- or edx,1073741824
- and ah,15
- cmp ah,15
- jne $L004notintel
- or edx,1048576
- $L004notintel:
- bt edx,28
- jnc $L002generic
- and edx,4026531839
- cmp edi,0
- je $L002generic
- or edx,268435456
- shr ebx,16
- cmp bl,1
- ja $L002generic
- and edx,4026531839
- $L002generic:
- and ebp,2048
- and ecx,4294965247
- mov esi,edx
- or ebp,ecx
- bt ecx,27
- jnc $L005clear_avx
- xor ecx,ecx
- DB 15,1,208
- and eax,6
- cmp eax,6
- je $L006done
- cmp eax,2
- je $L005clear_avx
- $L007clear_xmm:
- and ebp,4261412861
- and esi,4278190079
- $L005clear_avx:
- and ebp,4026525695
- $L006done:
- mov eax,esi
- mov edx,ebp
- $L000nocpuid:
- pop edi
- pop esi
- pop ebx
- pop ebp
- ret
- _OPENSSL_ia32_cpuid ENDP
- ;EXTERN _OPENSSL_ia32cap_P:NEAR
- ALIGN 16
- _OPENSSL_rdtsc PROC PUBLIC
- $L_OPENSSL_rdtsc_begin::
- xor eax,eax
- xor edx,edx
- lea ecx,DWORD PTR _OPENSSL_ia32cap_P
- bt DWORD PTR [ecx],4
- jnc $L008notsc
- rdtsc
- $L008notsc:
- ret
- _OPENSSL_rdtsc ENDP
- ALIGN 16
- _OPENSSL_instrument_halt PROC PUBLIC
- $L_OPENSSL_instrument_halt_begin::
- lea ecx,DWORD PTR _OPENSSL_ia32cap_P
- bt DWORD PTR [ecx],4
- jnc $L009nohalt
- DD 2421723150
- and eax,3
- jnz $L009nohalt
- pushfd
- pop eax
- bt eax,9
- jnc $L009nohalt
- rdtsc
- push edx
- push eax
- hlt
- rdtsc
- sub eax,DWORD PTR [esp]
- sbb edx,DWORD PTR 4[esp]
- add esp,8
- ret
- $L009nohalt:
- xor eax,eax
- xor edx,edx
- ret
- _OPENSSL_instrument_halt ENDP
- ALIGN 16
- _OPENSSL_far_spin PROC PUBLIC
- $L_OPENSSL_far_spin_begin::
- pushfd
- pop eax
- bt eax,9
- jnc $L010nospin
- mov eax,DWORD PTR 4[esp]
- mov ecx,DWORD PTR 8[esp]
- DD 2430111262
- xor eax,eax
- mov edx,DWORD PTR [ecx]
- jmp $L011spin
- ALIGN 16
- $L011spin:
- inc eax
- cmp edx,DWORD PTR [ecx]
- je $L011spin
- DD 529567888
- ret
- $L010nospin:
- xor eax,eax
- xor edx,edx
- ret
- _OPENSSL_far_spin ENDP
- ALIGN 16
- _OPENSSL_wipe_cpu PROC PUBLIC
- $L_OPENSSL_wipe_cpu_begin::
- xor eax,eax
- xor edx,edx
- lea ecx,DWORD PTR _OPENSSL_ia32cap_P
- mov ecx,DWORD PTR [ecx]
- bt DWORD PTR [ecx],1
- jnc $L012no_x87
- DD 4007259865,4007259865,4007259865,4007259865,2430851995
- $L012no_x87:
- lea eax,DWORD PTR 4[esp]
- ret
- _OPENSSL_wipe_cpu ENDP
- ALIGN 16
- _OPENSSL_atomic_add PROC PUBLIC
- $L_OPENSSL_atomic_add_begin::
- mov edx,DWORD PTR 4[esp]
- mov ecx,DWORD PTR 8[esp]
- push ebx
- nop
- mov eax,DWORD PTR [edx]
- $L013spin:
- lea ebx,DWORD PTR [ecx*1+eax]
- nop
- DD 447811568
- jne $L013spin
- mov eax,ebx
- pop ebx
- ret
- _OPENSSL_atomic_add ENDP
- ALIGN 16
- _OPENSSL_indirect_call PROC PUBLIC
- $L_OPENSSL_indirect_call_begin::
- push ebp
- mov ebp,esp
- sub esp,28
- mov ecx,DWORD PTR 12[ebp]
- mov DWORD PTR [esp],ecx
- mov edx,DWORD PTR 16[ebp]
- mov DWORD PTR 4[esp],edx
- mov eax,DWORD PTR 20[ebp]
- mov DWORD PTR 8[esp],eax
- mov eax,DWORD PTR 24[ebp]
- mov DWORD PTR 12[esp],eax
- mov eax,DWORD PTR 28[ebp]
- mov DWORD PTR 16[esp],eax
- mov eax,DWORD PTR 32[ebp]
- mov DWORD PTR 20[esp],eax
- mov eax,DWORD PTR 36[ebp]
- mov DWORD PTR 24[esp],eax
- call DWORD PTR 8[ebp]
- mov esp,ebp
- pop ebp
- ret
- _OPENSSL_indirect_call ENDP
- ALIGN 16
- _OPENSSL_cleanse PROC PUBLIC
- $L_OPENSSL_cleanse_begin::
- mov edx,DWORD PTR 4[esp]
- mov ecx,DWORD PTR 8[esp]
- xor eax,eax
- cmp ecx,7
- jae $L014lot
- cmp ecx,0
- je $L015ret
- $L016little:
- mov BYTE PTR [edx],al
- sub ecx,1
- lea edx,DWORD PTR 1[edx]
- jnz $L016little
- $L015ret:
- ret
- ALIGN 16
- $L014lot:
- test edx,3
- jz $L017aligned
- mov BYTE PTR [edx],al
- lea ecx,DWORD PTR [ecx-1]
- lea edx,DWORD PTR 1[edx]
- jmp $L014lot
- $L017aligned:
- mov DWORD PTR [edx],eax
- lea ecx,DWORD PTR [ecx-4]
- test ecx,-4
- lea edx,DWORD PTR 4[edx]
- jnz $L017aligned
- cmp ecx,0
- jne $L016little
- ret
- _OPENSSL_cleanse ENDP
- ALIGN 16
- _OPENSSL_ia32_rdrand PROC PUBLIC
- $L_OPENSSL_ia32_rdrand_begin::
- mov ecx,8
- $L018loop:
- DB 15,199,240
- jc $L019break
- loop $L018loop
- $L019break:
- cmp eax,0
- cmove eax,ecx
- ret
- _OPENSSL_ia32_rdrand ENDP
- .text$ ENDS
- .bss SEGMENT 'BSS'
- COMM _OPENSSL_ia32cap_P:QWORD
- .bss ENDS
- .CRT$XCU SEGMENT DWORD PUBLIC 'DATA'
- EXTERN _OPENSSL_cpuid_setup:NEAR
- DD _OPENSSL_cpuid_setup
- .CRT$XCU ENDS
- END