ref: 5ebb1a29d8250027e8b7f2287f3bfa3a6f3d13ac
dir: /sys/src/ape/lib/openssl/crypto/x86_64cpuid.pl/
#!/usr/bin/env perl $output=shift; $win64a=1 if ($output =~ /win64a\.[s|asm]/); open STDOUT,">$output" || die "can't open $output: $!"; print<<___ if(defined($win64a)); _TEXT SEGMENT PUBLIC OPENSSL_rdtsc ALIGN 16 OPENSSL_rdtsc PROC rdtsc shl rdx,32 or rax,rdx ret OPENSSL_rdtsc ENDP PUBLIC OPENSSL_atomic_add ALIGN 16 OPENSSL_atomic_add PROC mov eax,DWORD PTR[rcx] \$Lspin: lea r8,DWORD PTR[rdx+rax] lock cmpxchg DWORD PTR[rcx],r8d jne \$Lspin mov eax,r8d cdqe ret OPENSSL_atomic_add ENDP PUBLIC OPENSSL_wipe_cpu ALIGN 16 OPENSSL_wipe_cpu PROC 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[rsp+8] ret OPENSSL_wipe_cpu ENDP OPENSSL_ia32_cpuid PROC mov r8,rbx mov eax,1 cpuid shl rcx,32 mov eax,edx mov rbx,r8 or rax,rcx ret OPENSSL_ia32_cpuid ENDP _TEXT ENDS CRT\$XIU SEGMENT EXTRN OPENSSL_cpuid_setup:PROC DQ OPENSSL_cpuid_setup CRT\$XIU ENDS END ___ print<<___ if(!defined($win64a)); .text .globl OPENSSL_rdtsc .align 16 OPENSSL_rdtsc: rdtsc shlq \$32,%rdx orq %rdx,%rax ret .size OPENSSL_rdtsc,.-OPENSSL_rdtsc .globl OPENSSL_atomic_add .type OPENSSL_atomic_add,\@function .align 16 OPENSSL_atomic_add: movl (%rdi),%eax .Lspin: leaq (%rsi,%rax),%r8 lock; cmpxchgl %r8d,(%rdi) jne .Lspin movl %r8d,%eax .byte 0x48,0x98 ret .size OPENSSL_atomic_add,.-OPENSSL_atomic_add .globl OPENSSL_wipe_cpu .type OPENSSL_wipe_cpu,\@function .align 16 OPENSSL_wipe_cpu: pxor %xmm0,%xmm0 pxor %xmm1,%xmm1 pxor %xmm2,%xmm2 pxor %xmm3,%xmm3 pxor %xmm4,%xmm4 pxor %xmm5,%xmm5 pxor %xmm6,%xmm6 pxor %xmm7,%xmm7 pxor %xmm8,%xmm8 pxor %xmm9,%xmm9 pxor %xmm10,%xmm10 pxor %xmm11,%xmm11 pxor %xmm12,%xmm12 pxor %xmm13,%xmm13 pxor %xmm14,%xmm14 pxor %xmm15,%xmm15 xorq %rcx,%rcx xorq %rdx,%rdx xorq %rsi,%rsi xorq %rdi,%rdi xorq %r8,%r8 xorq %r9,%r9 xorq %r10,%r10 xorq %r11,%r11 leaq 8(%rsp),%rax ret .size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu .globl OPENSSL_ia32_cpuid .align 16 OPENSSL_ia32_cpuid: movq %rbx,%r8 movl \$1,%eax cpuid shlq \$32,%rcx movl %edx,%eax movq %r8,%rbx orq %rcx,%rax ret .size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid .section .init call OPENSSL_cpuid_setup ___