x86_64cpuid.pl revision 2139:6243c3338933
1#!/usr/bin/env perl 2 3$output=shift; 4$win64a=1 if ($output =~ /win64a\.[s|asm]/); 5open STDOUT,">$output" || die "can't open $output: $!"; 6 7print<<___ if(defined($win64a)); 8_TEXT SEGMENT 9PUBLIC OPENSSL_rdtsc 10ALIGN 16 11OPENSSL_rdtsc PROC 12 rdtsc 13 shl rdx,32 14 or rax,rdx 15 ret 16OPENSSL_rdtsc ENDP 17 18PUBLIC OPENSSL_atomic_add 19ALIGN 16 20OPENSSL_atomic_add PROC 21 mov eax,DWORD PTR[rcx] 22\$Lspin: lea r8,DWORD PTR[rdx+rax] 23lock cmpxchg DWORD PTR[rcx],r8d 24 jne \$Lspin 25 mov eax,r8d 26 cdqe 27 ret 28OPENSSL_atomic_add ENDP 29 30PUBLIC OPENSSL_wipe_cpu 31ALIGN 16 32OPENSSL_wipe_cpu PROC 33 pxor xmm0,xmm0 34 pxor xmm1,xmm1 35 pxor xmm2,xmm2 36 pxor xmm3,xmm3 37 pxor xmm4,xmm4 38 pxor xmm5,xmm5 39 xor rcx,rcx 40 xor rdx,rdx 41 xor r8,r8 42 xor r9,r9 43 xor r10,r10 44 xor r11,r11 45 lea rax,QWORD PTR[rsp+8] 46 ret 47OPENSSL_wipe_cpu ENDP 48 49OPENSSL_ia32_cpuid PROC 50 mov r8,rbx 51 mov eax,1 52 cpuid 53 shl rcx,32 54 mov eax,edx 55 mov rbx,r8 56 or rax,rcx 57 ret 58OPENSSL_ia32_cpuid ENDP 59_TEXT ENDS 60 61CRT\$XIU SEGMENT 62EXTRN OPENSSL_cpuid_setup:PROC 63DQ OPENSSL_cpuid_setup 64CRT\$XIU ENDS 65END 66___ 67print<<___ if(!defined($win64a)); 68.text 69.globl OPENSSL_rdtsc 70.align 16 71OPENSSL_rdtsc: 72 rdtsc 73 shlq \$32,%rdx 74 orq %rdx,%rax 75 ret 76.size OPENSSL_rdtsc,.-OPENSSL_rdtsc 77 78.globl OPENSSL_atomic_add 79.type OPENSSL_atomic_add,\@function 80.align 16 81OPENSSL_atomic_add: 82 movl (%rdi),%eax 83.Lspin: leaq (%rsi,%rax),%r8 84lock; cmpxchgl %r8d,(%rdi) 85 jne .Lspin 86 movl %r8d,%eax 87 .byte 0x48,0x98 88 ret 89.size OPENSSL_atomic_add,.-OPENSSL_atomic_add 90 91.globl OPENSSL_wipe_cpu 92.type OPENSSL_wipe_cpu,\@function 93.align 16 94OPENSSL_wipe_cpu: 95 pxor %xmm0,%xmm0 96 pxor %xmm1,%xmm1 97 pxor %xmm2,%xmm2 98 pxor %xmm3,%xmm3 99 pxor %xmm4,%xmm4 100 pxor %xmm5,%xmm5 101 pxor %xmm6,%xmm6 102 pxor %xmm7,%xmm7 103 pxor %xmm8,%xmm8 104 pxor %xmm9,%xmm9 105 pxor %xmm10,%xmm10 106 pxor %xmm11,%xmm11 107 pxor %xmm12,%xmm12 108 pxor %xmm13,%xmm13 109 pxor %xmm14,%xmm14 110 pxor %xmm15,%xmm15 111 xorq %rcx,%rcx 112 xorq %rdx,%rdx 113 xorq %rsi,%rsi 114 xorq %rdi,%rdi 115 xorq %r8,%r8 116 xorq %r9,%r9 117 xorq %r10,%r10 118 xorq %r11,%r11 119 leaq 8(%rsp),%rax 120 ret 121.size OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu 122 123.globl OPENSSL_ia32_cpuid 124.align 16 125OPENSSL_ia32_cpuid: 126 movq %rbx,%r8 127 movl \$1,%eax 128 cpuid 129 shlq \$32,%rcx 130 movl %edx,%eax 131 movq %r8,%rbx 132 orq %rcx,%rax 133 ret 134.size OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid 135 136.section .init 137 call OPENSSL_cpuid_setup 138___ 139