sparcv9cap.c: add Fujitsu SPARC64 X AES capability detection.
[openssl.git] / crypto / ppccpuid.pl
1 #!/usr/bin/env perl
2
3 $flavour = shift;
4
5 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
6 ( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
7 ( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or
8 die "can't locate ppc-xlate.pl";
9
10 open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!";
11
12 if ($flavour=~/64/) {
13     $CMPLI="cmpldi";
14     $SHRLI="srdi";
15     $SIGNX="extsw";
16 } else {
17     $CMPLI="cmplwi";
18     $SHRLI="srwi";
19     $SIGNX="mr";
20 }
21
22 $code=<<___;
23 .machine        "any"
24 .text
25
26 .globl  .OPENSSL_fpu_probe
27 .align  4
28 .OPENSSL_fpu_probe:
29         fmr     f0,f0
30         blr
31         .long   0
32         .byte   0,12,0x14,0,0,0,0,0
33 .size   .OPENSSL_fpu_probe,.-.OPENSSL_fpu_probe
34 .globl  .OPENSSL_ppc64_probe
35 .align  4
36 .OPENSSL_ppc64_probe:
37         fcfid   f1,f1
38         extrdi  r0,r0,32,0
39         blr
40         .long   0
41         .byte   0,12,0x14,0,0,0,0,0
42 .size   .OPENSSL_ppc64_probe,.-.OPENSSL_ppc64_probe
43
44 .globl  .OPENSSL_altivec_probe
45 .align  4
46 .OPENSSL_altivec_probe:
47         .long   0x10000484      # vor   v0,v0,v0
48         blr
49         .long   0
50         .byte   0,12,0x14,0,0,0,0,0
51 .size   .OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe
52
53 .globl  .OPENSSL_crypto207_probe
54 .align  4
55 .OPENSSL_crypto207_probe:
56         lvx_u   v0,0,r1
57         vcipher v0,v0,v0
58         blr
59         .long   0
60         .byte   0,12,0x14,0,0,0,0,0
61 .size   .OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe
62
63 .globl  .OPENSSL_madd300_probe
64 .align  4
65 .OPENSSL_madd300_probe:
66         xor     r0,r0,r0
67         maddld  r3,r0,r0,r0
68         maddhdu r3,r0,r0,r0
69         blr
70         .long   0
71         .byte   0,12,0x14,0,0,0,0,0
72
73 .globl  .OPENSSL_wipe_cpu
74 .align  4
75 .OPENSSL_wipe_cpu:
76         xor     r0,r0,r0
77         fmr     f0,f31
78         fmr     f1,f31
79         fmr     f2,f31
80         mr      r3,r1
81         fmr     f3,f31
82         xor     r4,r4,r4
83         fmr     f4,f31
84         xor     r5,r5,r5
85         fmr     f5,f31
86         xor     r6,r6,r6
87         fmr     f6,f31
88         xor     r7,r7,r7
89         fmr     f7,f31
90         xor     r8,r8,r8
91         fmr     f8,f31
92         xor     r9,r9,r9
93         fmr     f9,f31
94         xor     r10,r10,r10
95         fmr     f10,f31
96         xor     r11,r11,r11
97         fmr     f11,f31
98         xor     r12,r12,r12
99         fmr     f12,f31
100         fmr     f13,f31
101         blr
102         .long   0
103         .byte   0,12,0x14,0,0,0,0,0
104 .size   .OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu
105
106 .globl  .OPENSSL_atomic_add
107 .align  4
108 .OPENSSL_atomic_add:
109 Ladd:   lwarx   r5,0,r3
110         add     r0,r4,r5
111         stwcx.  r0,0,r3
112         bne-    Ladd
113         $SIGNX  r3,r0
114         blr
115         .long   0
116         .byte   0,12,0x14,0,0,0,2,0
117         .long   0
118 .size   .OPENSSL_atomic_add,.-.OPENSSL_atomic_add
119
120 .globl  .OPENSSL_rdtsc
121 .align  4
122 .OPENSSL_rdtsc:
123 ___
124 $code.=<<___    if ($flavour =~ /64/);
125         mftb    r3
126 ___
127 $code.=<<___    if ($flavour !~ /64/);
128 Loop_rdtsc:
129         mftbu   r5
130         mftb    r3
131         mftbu   r4
132         cmplw   r4,r5
133         bne     Loop_rdtsc
134 ___
135 $code.=<<___;
136         blr
137         .long   0
138         .byte   0,12,0x14,0,0,0,0,0
139 .size   .OPENSSL_rdtsc,.-.OPENSSL_rdtsc
140
141 .globl  .OPENSSL_cleanse
142 .align  4
143 .OPENSSL_cleanse:
144         $CMPLI  r4,7
145         li      r0,0
146         bge     Lot
147         $CMPLI  r4,0
148         beqlr-
149 Little: mtctr   r4
150         stb     r0,0(r3)
151         addi    r3,r3,1
152         bdnz    \$-8
153         blr
154 Lot:    andi.   r5,r3,3
155         beq     Laligned
156         stb     r0,0(r3)
157         subi    r4,r4,1
158         addi    r3,r3,1
159         b       Lot
160 Laligned:
161         $SHRLI  r5,r4,2
162         mtctr   r5
163         stw     r0,0(r3)
164         addi    r3,r3,4
165         bdnz    \$-8
166         andi.   r4,r4,3
167         bne     Little
168         blr
169         .long   0
170         .byte   0,12,0x14,0,0,0,2,0
171         .long   0
172 .size   .OPENSSL_cleanse,.-.OPENSSL_cleanse
173 ___
174 {
175 my ($out,$cnt,$max)=("r3","r4","r5");
176 my ($tick,$lasttick)=("r6","r7");
177 my ($diff,$lastdiff)=("r8","r9");
178
179 $code.=<<___;
180 .globl  .OPENSSL_instrument_bus
181 .align  4
182 .OPENSSL_instrument_bus:
183         mtctr   $cnt
184
185         mftb    $lasttick               # collect 1st tick
186         li      $diff,0
187
188         dcbf    0,$out                  # flush cache line
189         lwarx   $tick,0,$out            # load and lock
190         add     $tick,$tick,$diff
191         stwcx.  $tick,0,$out
192         stwx    $tick,0,$out
193
194 Loop:   mftb    $tick
195         sub     $diff,$tick,$lasttick
196         mr      $lasttick,$tick
197         dcbf    0,$out                  # flush cache line
198         lwarx   $tick,0,$out            # load and lock
199         add     $tick,$tick,$diff
200         stwcx.  $tick,0,$out
201         stwx    $tick,0,$out
202         addi    $out,$out,4             # ++$out
203         bdnz    Loop
204
205         mr      r3,$cnt
206         blr
207         .long   0
208         .byte   0,12,0x14,0,0,0,2,0
209         .long   0
210 .size   .OPENSSL_instrument_bus,.-.OPENSSL_instrument_bus
211
212 .globl  .OPENSSL_instrument_bus2
213 .align  4
214 .OPENSSL_instrument_bus2:
215         mr      r0,$cnt
216         slwi    $cnt,$cnt,2
217
218         mftb    $lasttick               # collect 1st tick
219         li      $diff,0
220
221         dcbf    0,$out                  # flush cache line
222         lwarx   $tick,0,$out            # load and lock
223         add     $tick,$tick,$diff
224         stwcx.  $tick,0,$out
225         stwx    $tick,0,$out
226
227         mftb    $tick                   # collect 1st diff
228         sub     $diff,$tick,$lasttick
229         mr      $lasttick,$tick
230         mr      $lastdiff,$diff
231 Loop2:
232         dcbf    0,$out                  # flush cache line
233         lwarx   $tick,0,$out            # load and lock
234         add     $tick,$tick,$diff
235         stwcx.  $tick,0,$out
236         stwx    $tick,0,$out
237
238         addic.  $max,$max,-1
239         beq     Ldone2
240
241         mftb    $tick
242         sub     $diff,$tick,$lasttick
243         mr      $lasttick,$tick
244         cmplw   7,$diff,$lastdiff
245         mr      $lastdiff,$diff
246
247         mfcr    $tick                   # pull cr
248         not     $tick,$tick             # flip bits
249         rlwinm  $tick,$tick,1,29,29     # isolate flipped eq bit and scale
250
251         sub.    $cnt,$cnt,$tick         # conditional --$cnt
252         add     $out,$out,$tick         # conditional ++$out
253         bne     Loop2
254
255 Ldone2:
256         srwi    $cnt,$cnt,2
257         sub     r3,r0,$cnt
258         blr
259         .long   0
260         .byte   0,12,0x14,0,0,0,3,0
261         .long   0
262 .size   .OPENSSL_instrument_bus2,.-.OPENSSL_instrument_bus2
263 ___
264 }
265
266 $code =~ s/\`([^\`]*)\`/eval $1/gem;
267 print $code;
268 close STDOUT;