Various tidies/fixes:
[openssl.git] / crypto / x86_64cpuid.pl
1 #!/usr/bin/env perl
2
3 $output=shift;
4 $masm=1 if ($output =~ /\.asm/);
5 open STDOUT,">$output" || die "can't open $output: $!";
6
7 print<<___ if(defined($masm));
8 _TEXT   SEGMENT
9 PUBLIC  OPENSSL_rdtsc
10
11 PUBLIC  OPENSSL_atomic_add
12 ALIGN   16
13 OPENSSL_atomic_add      PROC
14         mov     eax,DWORD PTR[rcx]
15 \$Lspin:        lea     r8,DWORD PTR[rdx+rax]
16 lock    cmpxchg DWORD PTR[rcx],r8d
17         jne     \$Lspin
18         mov     eax,r8d
19         cdqe    
20         ret
21 OPENSSL_atomic_add      ENDP
22
23 PUBLIC  OPENSSL_wipe_cpu
24 ALIGN   16
25 OPENSSL_wipe_cpu        PROC
26         pxor    xmm0,xmm0
27         pxor    xmm1,xmm1
28         pxor    xmm2,xmm2
29         pxor    xmm3,xmm3
30         pxor    xmm4,xmm4
31         pxor    xmm5,xmm5
32         xor     rcx,rcx
33         xor     rdx,rdx
34         xor     r8,r8
35         xor     r9,r9
36         xor     r10,r10
37         xor     r11,r11
38         lea     rax,QWORD PTR[rsp+8]
39         ret
40 OPENSSL_wipe_cpu        ENDP
41 _TEXT   ENDS
42
43 CRT\$XIU        SEGMENT
44 EXTRN   OPENSSL_cpuid_setup:PROC
45 DQ      OPENSSL_cpuid_setup
46 CRT\$XIU        ENDS
47
48 ___
49 print<<___ if(!defined($masm));
50 .text
51
52 .globl  OPENSSL_atomic_add
53 .type   OPENSSL_atomic_add,\@function
54 .align  16
55 OPENSSL_atomic_add:
56         movl    (%rdi),%eax
57 .Lspin: leaq    (%rsi,%rax),%r8
58 lock;   cmpxchgl        %r8d,(%rdi)
59         jne     .Lspin
60         movl    %r8d,%eax
61         .byte   0x48,0x98
62         ret
63 .size   OPENSSL_atomic_add,.-OPENSSL_atomic_add
64
65 .globl  OPENSSL_wipe_cpu
66 .type   OPENSSL_wipe_cpu,\@function
67 .align  16
68 OPENSSL_wipe_cpu:
69         pxor    %xmm0,%xmm0
70         pxor    %xmm1,%xmm1
71         pxor    %xmm2,%xmm2
72         pxor    %xmm3,%xmm3
73         pxor    %xmm4,%xmm4
74         pxor    %xmm5,%xmm5
75         pxor    %xmm6,%xmm6
76         pxor    %xmm7,%xmm7
77         pxor    %xmm8,%xmm8
78         pxor    %xmm9,%xmm9
79         pxor    %xmm10,%xmm10
80         pxor    %xmm11,%xmm11
81         pxor    %xmm12,%xmm12
82         pxor    %xmm13,%xmm13
83         pxor    %xmm14,%xmm14
84         pxor    %xmm15,%xmm15
85         xorq    %rcx,%rcx
86         xorq    %rdx,%rdx
87         xorq    %rsi,%rsi
88         xorq    %rdi,%rdi
89         xorq    %r8,%r8
90         xorq    %r9,%r9
91         xorq    %r10,%r10
92         xorq    %r11,%r11
93         leaq    8(%rsp),%rax
94         ret
95 .size   OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
96
97 .section        .init
98         call    OPENSSL_cpuid_setup
99
100 ___
101
102 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
103 $dir = "." if $dir eq "";
104 open STDOUT,"| $^X $dir/perlasm/x86_64-xlate.pl $output";
105
106 print<<___;
107 .text
108
109 .globl  OPENSSL_rdtsc
110 .type   OPENSSL_rdtsc,\@abi-omnipotent
111 .align  16
112 OPENSSL_rdtsc:
113         rdtsc
114         shl     \$32,%rdx
115         or      %rdx,%rax
116         ret
117 .size   OPENSSL_rdtsc,.-OPENSSL_rdtsc
118
119 .globl  OPENSSL_ia32_cpuid
120 .type   OPENSSL_ia32_cpuid,\@abi-omnipotent
121 .align  16
122 OPENSSL_ia32_cpuid:
123         mov     %rbx,%r8
124
125         xor     %eax,%eax
126         cpuid
127         xor     %eax,%eax
128         cmp     \$0x756e6547,%ebx       # "Genu"
129         setne   %al
130         mov     %eax,%r9d
131         cmp     \$0x49656e69,%edx       # "ineI"
132         setne   %al
133         or      %eax,%r9d
134         cmp     \$0x6c65746e,%ecx       # "ntel"
135         setne   %al
136         or      %eax,%r9d
137
138         mov     \$1,%eax
139         cpuid
140         cmp     \$0,%r9d
141         jne     .Lnotintel
142         or      \$0x00100000,%edx       # use reserved 20th bit to engage RC4_CHAR
143         and     \$15,%ah
144         cmp     \$15,%ah                # examine Family ID
145         je      .Lnotintel
146         or      \$0x40000000,%edx       # use reserved bit to skip unrolled loop
147 .Lnotintel:
148         bt      \$28,%edx               # test hyper-threading bit
149         jnc     .Ldone
150         shr     \$16,%ebx
151         cmp     \$1,%bl                 # see if cache is shared
152         ja      .Ldone
153         and     \$0xefffffff,%edx       # ~(1<<28)
154 .Ldone:
155         shl     \$32,%rcx
156         mov     %edx,%eax
157         mov     %r8,%rbx
158         or      %rcx,%rax
159         ret
160 .size   OPENSSL_ia32_cpuid,.-OPENSSL_ia32_cpuid
161
162 .globl  OPENSSL_cleanse
163 .type   OPENSSL_cleanse,\@function,2
164 .align  16
165 OPENSSL_cleanse:
166         xor     %rax,%rax
167         cmp     \$15,%rsi
168         jae     .Lot
169 .Little:
170         mov     %al,(%rdi)
171         sub     \$1,%rsi
172         lea     1(%rdi),%rdi
173         jnz     .Little
174         ret
175 .align  16
176 .Lot:
177         test    \$7,%rdi
178         jz      .Laligned
179         mov     %al,(%rdi)
180         lea     -1(%rsi),%rsi
181         lea     1(%rdi),%rdi
182         jmp     .Lot
183 .Laligned:
184         mov     %rax,(%rdi)
185         lea     -8(%rsi),%rsi
186         test    \$-8,%rsi
187         lea     8(%rdi),%rdi
188         jnz     .Laligned
189         cmp     \$0,%rsi
190         jne     .Little
191         ret
192 .size   OPENSSL_cleanse,.-OPENSSL_cleanse
193 ___
194 close STDOUT;   # flush