bin2bn(): When len==0, just return a zero BIGNUM
[openssl.git] / crypto / ppccpuid.pl
1 #! /usr/bin/env perl
2 # Copyright 2007-2022 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_brd31_probe
85 .align  4
86 .OPENSSL_brd31_probe:
87         xor     r0,r0,r0
88         brd     r3,r0
89         blr
90         .long   0
91         .byte   0,12,0x14,0,0,0,0,0
92 .size   .OPENSSL_brd31_probe,.-.OPENSSL_brd31_probe
93
94
95 .globl  .OPENSSL_wipe_cpu
96 .align  4
97 .OPENSSL_wipe_cpu:
98         xor     r0,r0,r0
99         fmr     f0,f31
100         fmr     f1,f31
101         fmr     f2,f31
102         mr      r3,r1
103         fmr     f3,f31
104         xor     r4,r4,r4
105         fmr     f4,f31
106         xor     r5,r5,r5
107         fmr     f5,f31
108         xor     r6,r6,r6
109         fmr     f6,f31
110         xor     r7,r7,r7
111         fmr     f7,f31
112         xor     r8,r8,r8
113         fmr     f8,f31
114         xor     r9,r9,r9
115         fmr     f9,f31
116         xor     r10,r10,r10
117         fmr     f10,f31
118         xor     r11,r11,r11
119         fmr     f11,f31
120         xor     r12,r12,r12
121         fmr     f12,f31
122         fmr     f13,f31
123         blr
124         .long   0
125         .byte   0,12,0x14,0,0,0,0,0
126 .size   .OPENSSL_wipe_cpu,.-.OPENSSL_wipe_cpu
127
128 .globl  .OPENSSL_atomic_add
129 .align  4
130 .OPENSSL_atomic_add:
131 Ladd:   lwarx   r5,0,r3
132         add     r0,r4,r5
133         stwcx.  r0,0,r3
134         bne-    Ladd
135         $SIGNX  r3,r0
136         blr
137         .long   0
138         .byte   0,12,0x14,0,0,0,2,0
139         .long   0
140 .size   .OPENSSL_atomic_add,.-.OPENSSL_atomic_add
141
142 .globl  .OPENSSL_rdtsc_mftb
143 .align  4
144 .OPENSSL_rdtsc_mftb:
145         mftb    r3
146         blr
147         .long   0
148         .byte   0,12,0x14,0,0,0,0,0
149 .size   .OPENSSL_rdtsc_mftb,.-.OPENSSL_rdtsc_mftb
150
151 .globl  .OPENSSL_rdtsc_mfspr268
152 .align  4
153 .OPENSSL_rdtsc_mfspr268:
154         mfspr   r3,268
155         blr
156         .long   0
157         .byte   0,12,0x14,0,0,0,0,0
158 .size   .OPENSSL_rdtsc_mfspr268,.-.OPENSSL_rdtsc_mfspr268
159
160 .globl  .OPENSSL_cleanse
161 .align  4
162 .OPENSSL_cleanse:
163         $CMPLI  r4,7
164         li      r0,0
165         bge     Lot
166         $CMPLI  r4,0
167         beqlr-
168 Little: mtctr   r4
169         stb     r0,0(r3)
170         addi    r3,r3,1
171         bdnz    \$-8
172         blr
173 Lot:    andi.   r5,r3,3
174         beq     Laligned
175         stb     r0,0(r3)
176         subi    r4,r4,1
177         addi    r3,r3,1
178         b       Lot
179 Laligned:
180         $SHRLI  r5,r4,2
181         mtctr   r5
182         stw     r0,0(r3)
183         addi    r3,r3,4
184         bdnz    \$-8
185         andi.   r4,r4,3
186         bne     Little
187         blr
188         .long   0
189         .byte   0,12,0x14,0,0,0,2,0
190         .long   0
191 .size   .OPENSSL_cleanse,.-.OPENSSL_cleanse
192
193 globl   .CRYPTO_memcmp
194 .align  4
195 .CRYPTO_memcmp:
196         $CMPLI  r5,0
197         li      r0,0
198         beq     Lno_data
199         mtctr   r5
200 Loop_cmp:
201         lbz     r6,0(r3)
202         addi    r3,r3,1
203         lbz     r7,0(r4)
204         addi    r4,r4,1
205         xor     r6,r6,r7
206         or      r0,r0,r6
207         bdnz    Loop_cmp
208
209 Lno_data:
210         li      r3,0
211         sub     r3,r3,r0
212         extrwi  r3,r3,1,0
213         blr
214         .long   0
215         .byte   0,12,0x14,0,0,0,3,0
216         .long   0
217 .size   .CRYPTO_memcmp,.-.CRYPTO_memcmp
218 ___
219 {
220 my ($out,$cnt,$max)=("r3","r4","r5");
221 my ($tick,$lasttick)=("r6","r7");
222 my ($diff,$lastdiff)=("r8","r9");
223
224 $code.=<<___;
225 .globl  .OPENSSL_instrument_bus_mftb
226 .align  4
227 .OPENSSL_instrument_bus_mftb:
228         mtctr   $cnt
229
230         mftb    $lasttick               # collect 1st tick
231         li      $diff,0
232
233         dcbf    0,$out                  # flush cache line
234         lwarx   $tick,0,$out            # load and lock
235         add     $tick,$tick,$diff
236         stwcx.  $tick,0,$out
237         stwx    $tick,0,$out
238
239 Loop:   mftb    $tick
240         sub     $diff,$tick,$lasttick
241         mr      $lasttick,$tick
242         dcbf    0,$out                  # flush cache line
243         lwarx   $tick,0,$out            # load and lock
244         add     $tick,$tick,$diff
245         stwcx.  $tick,0,$out
246         stwx    $tick,0,$out
247         addi    $out,$out,4             # ++$out
248         bdnz    Loop
249
250         mr      r3,$cnt
251         blr
252         .long   0
253         .byte   0,12,0x14,0,0,0,2,0
254         .long   0
255 .size   .OPENSSL_instrument_bus_mftb,.-.OPENSSL_instrument_bus_mftb
256
257 .globl  .OPENSSL_instrument_bus2_mftb
258 .align  4
259 .OPENSSL_instrument_bus2_mftb:
260         mr      r0,$cnt
261         slwi    $cnt,$cnt,2
262
263         mftb    $lasttick               # collect 1st tick
264         li      $diff,0
265
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         mftb    $tick                   # collect 1st diff
273         sub     $diff,$tick,$lasttick
274         mr      $lasttick,$tick
275         mr      $lastdiff,$diff
276 Loop2:
277         dcbf    0,$out                  # flush cache line
278         lwarx   $tick,0,$out            # load and lock
279         add     $tick,$tick,$diff
280         stwcx.  $tick,0,$out
281         stwx    $tick,0,$out
282
283         addic.  $max,$max,-1
284         beq     Ldone2
285
286         mftb    $tick
287         sub     $diff,$tick,$lasttick
288         mr      $lasttick,$tick
289         cmplw   7,$diff,$lastdiff
290         mr      $lastdiff,$diff
291
292         mfcr    $tick                   # pull cr
293         not     $tick,$tick             # flip bits
294         rlwinm  $tick,$tick,1,29,29     # isolate flipped eq bit and scale
295
296         sub.    $cnt,$cnt,$tick         # conditional --$cnt
297         add     $out,$out,$tick         # conditional ++$out
298         bne     Loop2
299
300 Ldone2:
301         srwi    $cnt,$cnt,2
302         sub     r3,r0,$cnt
303         blr
304         .long   0
305         .byte   0,12,0x14,0,0,0,3,0
306         .long   0
307 .size   .OPENSSL_instrument_bus2_mftb,.-.OPENSSL_instrument_bus2_mftb
308
309 .globl  .OPENSSL_instrument_bus_mfspr268
310 .align  4
311 .OPENSSL_instrument_bus_mfspr268:
312         mtctr   $cnt
313
314         mfspr   $lasttick,268           # collect 1st tick
315         li      $diff,0
316
317         dcbf    0,$out                  # flush cache line
318         lwarx   $tick,0,$out            # load and lock
319         add     $tick,$tick,$diff
320         stwcx.  $tick,0,$out
321         stwx    $tick,0,$out
322
323 Loop3:  mfspr   $tick,268
324         sub     $diff,$tick,$lasttick
325         mr      $lasttick,$tick
326         dcbf    0,$out                  # flush cache line
327         lwarx   $tick,0,$out            # load and lock
328         add     $tick,$tick,$diff
329         stwcx.  $tick,0,$out
330         stwx    $tick,0,$out
331         addi    $out,$out,4             # ++$out
332         bdnz    Loop3
333
334         mr      r3,$cnt
335         blr
336         .long   0
337         .byte   0,12,0x14,0,0,0,2,0
338         .long   0
339 .size   .OPENSSL_instrument_bus_mfspr268,.-.OPENSSL_instrument_bus_mfspr268
340
341 .globl  .OPENSSL_instrument_bus2_mfspr268
342 .align  4
343 .OPENSSL_instrument_bus2_mfspr268:
344         mr      r0,$cnt
345         slwi    $cnt,$cnt,2
346
347         mfspr   $lasttick,268           # collect 1st tick
348         li      $diff,0
349
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         mfspr   $tick,268               # collect 1st diff
357         sub     $diff,$tick,$lasttick
358         mr      $lasttick,$tick
359         mr      $lastdiff,$diff
360 Loop4:
361         dcbf    0,$out                  # flush cache line
362         lwarx   $tick,0,$out            # load and lock
363         add     $tick,$tick,$diff
364         stwcx.  $tick,0,$out
365         stwx    $tick,0,$out
366
367         addic.  $max,$max,-1
368         beq     Ldone4
369
370         mfspr   $tick,268
371         sub     $diff,$tick,$lasttick
372         mr      $lasttick,$tick
373         cmplw   7,$diff,$lastdiff
374         mr      $lastdiff,$diff
375
376         mfcr    $tick                   # pull cr
377         not     $tick,$tick             # flip bits
378         rlwinm  $tick,$tick,1,29,29     # isolate flipped eq bit and scale
379
380         sub.    $cnt,$cnt,$tick         # conditional --$cnt
381         add     $out,$out,$tick         # conditional ++$out
382         bne     Loop4
383
384 Ldone4:
385         srwi    $cnt,$cnt,2
386         sub     r3,r0,$cnt
387         blr
388         .long   0
389         .byte   0,12,0x14,0,0,0,3,0
390         .long   0
391 .size   .OPENSSL_instrument_bus2_mfspr268,.-.OPENSSL_instrument_bus2_mfspr268
392 ___
393 }
394
395 $code =~ s/\`([^\`]*)\`/eval $1/gem;
396 print $code;
397 close STDOUT or die "error closing STDOUT: $!";