Remove duplicated line in 'openssl list' output
[openssl.git] / crypto / ppccpuid.pl
1 #! /usr/bin/env perl
2 # Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved.
3 #
4 # Licensed under the Apache License 2.0 (the "License").  You may not use
5 # this file except in compliance with the License.  You can obtain a copy
6 # in the file LICENSE in the source distribution or at
7 # https://www.openssl.org/source/license.html
8
9
10 # $output is the last argument if it looks like a file (it has an extension)
11 # $flavour is the first argument if it doesn't look like a file
12 $output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
13 $flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
14
15 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
16 ( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
17 ( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or
18 die "can't locate ppc-xlate.pl";
19
20 open STDOUT,"| $^X $xlate $flavour \"$output\""
21     or die "can't call $xlate: $!";
22
23 if ($flavour=~/64/) {
24     $CMPLI="cmpldi";
25     $SHRLI="srdi";
26     $SIGNX="extsw";
27 } else {
28     $CMPLI="cmplwi";
29     $SHRLI="srwi";
30     $SIGNX="mr";
31 }
32
33 $code=<<___;
34 .machine        "any"
35 .text
36
37 .globl  .OPENSSL_fpu_probe
38 .align  4
39 .OPENSSL_fpu_probe:
40         fmr     f0,f0
41         blr
42         .long   0
43         .byte   0,12,0x14,0,0,0,0,0
44 .size   .OPENSSL_fpu_probe,.-.OPENSSL_fpu_probe
45 .globl  .OPENSSL_ppc64_probe
46 .align  4
47 .OPENSSL_ppc64_probe:
48         fcfid   f1,f1
49         extrdi  r0,r0,32,0
50         blr
51         .long   0
52         .byte   0,12,0x14,0,0,0,0,0
53 .size   .OPENSSL_ppc64_probe,.-.OPENSSL_ppc64_probe
54
55 .globl  .OPENSSL_altivec_probe
56 .align  4
57 .OPENSSL_altivec_probe:
58         .long   0x10000484      # vor   v0,v0,v0
59         blr
60         .long   0
61         .byte   0,12,0x14,0,0,0,0,0
62 .size   .OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe
63
64 .globl  .OPENSSL_crypto207_probe
65 .align  4
66 .OPENSSL_crypto207_probe:
67         lvx_u   v0,0,r1
68         vcipher v0,v0,v0
69         blr
70         .long   0
71         .byte   0,12,0x14,0,0,0,0,0
72 .size   .OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe
73
74 .globl  .OPENSSL_madd300_probe
75 .align  4
76 .OPENSSL_madd300_probe:
77         xor     r0,r0,r0
78         maddld  r3,r0,r0,r0
79         maddhdu r3,r0,r0,r0
80         blr
81         .long   0
82         .byte   0,12,0x14,0,0,0,0,0
83
84 .globl  .OPENSSL_wipe_cpu
85 .align  4
86 .OPENSSL_wipe_cpu:
87         xor     r0,r0,r0
88         fmr     f0,f31
89         fmr     f1,f31
90         fmr     f2,f31
91         mr      r3,r1
92         fmr     f3,f31
93         xor     r4,r4,r4
94         fmr     f4,f31
95         xor     r5,r5,r5
96         fmr     f5,f31
97         xor     r6,r6,r6
98         fmr     f6,f31
99         xor     r7,r7,r7
100         fmr     f7,f31
101         xor     r8,r8,r8
102         fmr     f8,f31
103         xor     r9,r9,r9
104         fmr     f9,f31
105         xor     r10,r10,r10
106         fmr     f10,f31
107         xor     r11,r11,r11
108         fmr     f11,f31
109         xor     r12,r12,r12
110         fmr     f12,f31
111         fmr     f13,f31
112         blr
113         .long   0
114         .byte   0,12,0x14,0,0,0,0,0
115 .size   .OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu
116
117 .globl  .OPENSSL_atomic_add
118 .align  4
119 .OPENSSL_atomic_add:
120 Ladd:   lwarx   r5,0,r3
121         add     r0,r4,r5
122         stwcx.  r0,0,r3
123         bne-    Ladd
124         $SIGNX  r3,r0
125         blr
126         .long   0
127         .byte   0,12,0x14,0,0,0,2,0
128         .long   0
129 .size   .OPENSSL_atomic_add,.-.OPENSSL_atomic_add
130
131 .globl  .OPENSSL_rdtsc_mftb
132 .align  4
133 .OPENSSL_rdtsc_mftb:
134         mftb    r3
135         blr
136         .long   0
137         .byte   0,12,0x14,0,0,0,0,0
138 .size   .OPENSSL_rdtsc_mftb,.-.OPENSSL_rdtsc_mftb
139
140 .globl  .OPENSSL_rdtsc_mfspr268
141 .align  4
142 .OPENSSL_rdtsc_mfspr268:
143         mfspr   r3,268
144         blr
145         .long   0
146         .byte   0,12,0x14,0,0,0,0,0
147 .size   .OPENSSL_rdtsc_mfspr268,.-.OPENSSL_rdtsc_mfspr268
148
149 .globl  .OPENSSL_cleanse
150 .align  4
151 .OPENSSL_cleanse:
152         $CMPLI  r4,7
153         li      r0,0
154         bge     Lot
155         $CMPLI  r4,0
156         beqlr-
157 Little: mtctr   r4
158         stb     r0,0(r3)
159         addi    r3,r3,1
160         bdnz    \$-8
161         blr
162 Lot:    andi.   r5,r3,3
163         beq     Laligned
164         stb     r0,0(r3)
165         subi    r4,r4,1
166         addi    r3,r3,1
167         b       Lot
168 Laligned:
169         $SHRLI  r5,r4,2
170         mtctr   r5
171         stw     r0,0(r3)
172         addi    r3,r3,4
173         bdnz    \$-8
174         andi.   r4,r4,3
175         bne     Little
176         blr
177         .long   0
178         .byte   0,12,0x14,0,0,0,2,0
179         .long   0
180 .size   .OPENSSL_cleanse,.-.OPENSSL_cleanse
181
182 globl   .CRYPTO_memcmp
183 .align  4
184 .CRYPTO_memcmp:
185         $CMPLI  r5,0
186         li      r0,0
187         beq     Lno_data
188         mtctr   r5
189 Loop_cmp:
190         lbz     r6,0(r3)
191         addi    r3,r3,1
192         lbz     r7,0(r4)
193         addi    r4,r4,1
194         xor     r6,r6,r7
195         or      r0,r0,r6
196         bdnz    Loop_cmp
197
198 Lno_data:
199         li      r3,0
200         sub     r3,r3,r0
201         extrwi  r3,r3,1,0
202         blr
203         .long   0
204         .byte   0,12,0x14,0,0,0,3,0
205         .long   0
206 .size   .CRYPTO_memcmp,.-.CRYPTO_memcmp
207 ___
208 {
209 my ($out,$cnt,$max)=("r3","r4","r5");
210 my ($tick,$lasttick)=("r6","r7");
211 my ($diff,$lastdiff)=("r8","r9");
212
213 $code.=<<___;
214 .globl  .OPENSSL_instrument_bus_mftb
215 .align  4
216 .OPENSSL_instrument_bus_mftb:
217         mtctr   $cnt
218
219         mftb    $lasttick               # collect 1st tick
220         li      $diff,0
221
222         dcbf    0,$out                  # flush cache line
223         lwarx   $tick,0,$out            # load and lock
224         add     $tick,$tick,$diff
225         stwcx.  $tick,0,$out
226         stwx    $tick,0,$out
227
228 Loop:   mftb    $tick
229         sub     $diff,$tick,$lasttick
230         mr      $lasttick,$tick
231         dcbf    0,$out                  # flush cache line
232         lwarx   $tick,0,$out            # load and lock
233         add     $tick,$tick,$diff
234         stwcx.  $tick,0,$out
235         stwx    $tick,0,$out
236         addi    $out,$out,4             # ++$out
237         bdnz    Loop
238
239         mr      r3,$cnt
240         blr
241         .long   0
242         .byte   0,12,0x14,0,0,0,2,0
243         .long   0
244 .size   .OPENSSL_instrument_bus_mftb,.-.OPENSSL_instrument_bus_mftb
245
246 .globl  .OPENSSL_instrument_bus2_mftb
247 .align  4
248 .OPENSSL_instrument_bus2_mftb:
249         mr      r0,$cnt
250         slwi    $cnt,$cnt,2
251
252         mftb    $lasttick               # collect 1st tick
253         li      $diff,0
254
255         dcbf    0,$out                  # flush cache line
256         lwarx   $tick,0,$out            # load and lock
257         add     $tick,$tick,$diff
258         stwcx.  $tick,0,$out
259         stwx    $tick,0,$out
260
261         mftb    $tick                   # collect 1st diff
262         sub     $diff,$tick,$lasttick
263         mr      $lasttick,$tick
264         mr      $lastdiff,$diff
265 Loop2:
266         dcbf    0,$out                  # flush cache line
267         lwarx   $tick,0,$out            # load and lock
268         add     $tick,$tick,$diff
269         stwcx.  $tick,0,$out
270         stwx    $tick,0,$out
271
272         addic.  $max,$max,-1
273         beq     Ldone2
274
275         mftb    $tick
276         sub     $diff,$tick,$lasttick
277         mr      $lasttick,$tick
278         cmplw   7,$diff,$lastdiff
279         mr      $lastdiff,$diff
280
281         mfcr    $tick                   # pull cr
282         not     $tick,$tick             # flip bits
283         rlwinm  $tick,$tick,1,29,29     # isolate flipped eq bit and scale
284
285         sub.    $cnt,$cnt,$tick         # conditional --$cnt
286         add     $out,$out,$tick         # conditional ++$out
287         bne     Loop2
288
289 Ldone2:
290         srwi    $cnt,$cnt,2
291         sub     r3,r0,$cnt
292         blr
293         .long   0
294         .byte   0,12,0x14,0,0,0,3,0
295         .long   0
296 .size   .OPENSSL_instrument_bus2_mftb,.-.OPENSSL_instrument_bus2_mftb
297
298 .globl  .OPENSSL_instrument_bus_mfspr268
299 .align  4
300 .OPENSSL_instrument_bus_mfspr268:
301         mtctr   $cnt
302
303         mfspr   $lasttick,268           # collect 1st tick
304         li      $diff,0
305
306         dcbf    0,$out                  # flush cache line
307         lwarx   $tick,0,$out            # load and lock
308         add     $tick,$tick,$diff
309         stwcx.  $tick,0,$out
310         stwx    $tick,0,$out
311
312 Loop3:  mfspr   $tick,268
313         sub     $diff,$tick,$lasttick
314         mr      $lasttick,$tick
315         dcbf    0,$out                  # flush cache line
316         lwarx   $tick,0,$out            # load and lock
317         add     $tick,$tick,$diff
318         stwcx.  $tick,0,$out
319         stwx    $tick,0,$out
320         addi    $out,$out,4             # ++$out
321         bdnz    Loop3
322
323         mr      r3,$cnt
324         blr
325         .long   0
326         .byte   0,12,0x14,0,0,0,2,0
327         .long   0
328 .size   .OPENSSL_instrument_bus_mfspr268,.-.OPENSSL_instrument_bus_mfspr268
329
330 .globl  .OPENSSL_instrument_bus2_mfspr268
331 .align  4
332 .OPENSSL_instrument_bus2_mfspr268:
333         mr      r0,$cnt
334         slwi    $cnt,$cnt,2
335
336         mfspr   $lasttick,268           # collect 1st tick
337         li      $diff,0
338
339         dcbf    0,$out                  # flush cache line
340         lwarx   $tick,0,$out            # load and lock
341         add     $tick,$tick,$diff
342         stwcx.  $tick,0,$out
343         stwx    $tick,0,$out
344
345         mfspr   $tick,268               # collect 1st diff
346         sub     $diff,$tick,$lasttick
347         mr      $lasttick,$tick
348         mr      $lastdiff,$diff
349 Loop4:
350         dcbf    0,$out                  # flush cache line
351         lwarx   $tick,0,$out            # load and lock
352         add     $tick,$tick,$diff
353         stwcx.  $tick,0,$out
354         stwx    $tick,0,$out
355
356         addic.  $max,$max,-1
357         beq     Ldone4
358
359         mfspr   $tick,268
360         sub     $diff,$tick,$lasttick
361         mr      $lasttick,$tick
362         cmplw   7,$diff,$lastdiff
363         mr      $lastdiff,$diff
364
365         mfcr    $tick                   # pull cr
366         not     $tick,$tick             # flip bits
367         rlwinm  $tick,$tick,1,29,29     # isolate flipped eq bit and scale
368
369         sub.    $cnt,$cnt,$tick         # conditional --$cnt
370         add     $out,$out,$tick         # conditional ++$out
371         bne     Loop4
372
373 Ldone4:
374         srwi    $cnt,$cnt,2
375         sub     r3,r0,$cnt
376         blr
377         .long   0
378         .byte   0,12,0x14,0,0,0,3,0
379         .long   0
380 .size   .OPENSSL_instrument_bus2_mfspr268,.-.OPENSSL_instrument_bus2_mfspr268
381 ___
382 }
383
384 $code =~ s/\`([^\`]*)\`/eval $1/gem;
385 print $code;
386 close STDOUT;