summaryrefslogtreecommitdiff
path: root/deps/openssl/asm/x64-win32-masm/x86_64cpuid.asm
diff options
context:
space:
mode:
Diffstat (limited to 'deps/openssl/asm/x64-win32-masm/x86_64cpuid.asm')
-rw-r--r--deps/openssl/asm/x64-win32-masm/x86_64cpuid.asm186
1 files changed, 186 insertions, 0 deletions
diff --git a/deps/openssl/asm/x64-win32-masm/x86_64cpuid.asm b/deps/openssl/asm/x64-win32-masm/x86_64cpuid.asm
new file mode 100644
index 0000000000..db26276770
--- /dev/null
+++ b/deps/openssl/asm/x64-win32-masm/x86_64cpuid.asm
@@ -0,0 +1,186 @@
+OPTION DOTNAME
+EXTERN OPENSSL_cpuid_setup:NEAR
+.CRT$XCU SEGMENT READONLY DWORD
+ DQ OPENSSL_cpuid_setup
+
+.CRT$XCU ENDS
+.text$ SEGMENT ALIGN(64) 'CODE'
+
+PUBLIC OPENSSL_atomic_add
+
+ALIGN 16
+OPENSSL_atomic_add PROC PUBLIC
+ mov eax,DWORD PTR[rcx]
+$L$spin:: lea r8,QWORD PTR[rax*1+rdx]
+DB 0f0h
+
+ cmpxchg DWORD PTR[rcx],r8d
+ jne $L$spin
+ mov eax,r8d
+DB 048h,098h
+
+ DB 0F3h,0C3h ;repret
+OPENSSL_atomic_add ENDP
+
+PUBLIC OPENSSL_rdtsc
+
+ALIGN 16
+OPENSSL_rdtsc PROC PUBLIC
+ rdtsc
+ shl rdx,32
+ or rax,rdx
+ DB 0F3h,0C3h ;repret
+OPENSSL_rdtsc ENDP
+
+PUBLIC OPENSSL_ia32_cpuid
+
+ALIGN 16
+OPENSSL_ia32_cpuid PROC PUBLIC
+ mov r8,rbx
+
+ xor eax,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,080000008h
+ jb $L$intel
+
+ mov eax,080000008h
+ cpuid
+ movzx r10,cl
+ inc r10
+
+ mov eax,1
+ cpuid
+ bt edx,28
+ jnc $L$done
+ shr ebx,16
+ cmp bl,r10b
+ ja $L$done
+ and edx,0efffffffh
+ jmp $L$done
+
+$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
+
+$L$nocacheinfo::
+ mov eax,1
+ cpuid
+ cmp r9d,0
+ jne $L$notintel
+ or edx,000100000h
+ and ah,15
+ cmp ah,15
+ je $L$notintel
+ or edx,040000000h
+$L$notintel::
+ bt edx,28
+ jnc $L$done
+ and edx,0efffffffh
+ cmp r10d,0
+ je $L$done
+
+ or edx,010000000h
+ shr ebx,16
+ cmp bl,1
+ ja $L$done
+ and edx,0efffffffh
+$L$done::
+ shl rcx,32
+ mov eax,edx
+ mov rbx,r8
+ or rax,rcx
+ DB 0F3h,0C3h ;repret
+OPENSSL_ia32_cpuid ENDP
+
+PUBLIC OPENSSL_cleanse
+
+ALIGN 16
+OPENSSL_cleanse PROC PUBLIC
+ xor rax,rax
+ cmp rdx,15
+ jae $L$ot
+ cmp rdx,0
+ je $L$ret
+$L$ittle::
+ mov BYTE PTR[rcx],al
+ sub rdx,1
+ lea rcx,QWORD PTR[1+rcx]
+ jnz $L$ittle
+$L$ret::
+ DB 0F3h,0C3h ;repret
+ALIGN 16
+$L$ot::
+ test rcx,7
+ jz $L$aligned
+ mov BYTE PTR[rcx],al
+ lea rdx,QWORD PTR[((-1))+rdx]
+ lea rcx,QWORD PTR[1+rcx]
+ jmp $L$ot
+$L$aligned::
+ mov QWORD PTR[rcx],rax
+ lea rdx,QWORD PTR[((-8))+rdx]
+ test rdx,-8
+ lea rcx,QWORD PTR[8+rcx]
+ jnz $L$aligned
+ cmp rdx,0
+ jne $L$ittle
+ DB 0F3h,0C3h ;repret
+OPENSSL_cleanse ENDP
+PUBLIC OPENSSL_wipe_cpu
+
+ALIGN 16
+OPENSSL_wipe_cpu PROC PUBLIC
+ pxor xmm0,xmm0
+ pxor xmm1,xmm1
+ pxor xmm2,xmm2
+ pxor xmm3,xmm3
+ pxor xmm4,xmm4
+ pxor xmm5,xmm5
+ xor rcx,rcx
+ xor rdx,rdx
+ xor r8,r8
+ xor r9,r9
+ xor r10,r10
+ xor r11,r11
+ lea rax,QWORD PTR[8+rsp]
+ DB 0F3h,0C3h ;repret
+OPENSSL_wipe_cpu ENDP
+
+.text$ ENDS
+END