b136c4d3dc872ac4e178bd3cbe0bf2e803c08061
[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 .text
24
25 .globl  .OPENSSL_cpuid_setup
26 .align  4
27 .OPENSSL_cpuid_setup:
28         blr
29
30 .globl  .OPENSSL_wipe_cpu
31 .align  4
32 .OPENSSL_wipe_cpu:
33         xor     r0,r0,r0
34         mr      r3,r1
35         xor     r4,r4,r4
36         xor     r5,r5,r5
37         xor     r6,r6,r6
38         xor     r7,r7,r7
39         xor     r8,r8,r8
40         xor     r9,r9,r9
41         xor     r10,r10,r10
42         xor     r11,r11,r11
43         xor     r12,r12,r12
44         blr
45
46 .globl  .OPENSSL_atomic_add
47 .align  4
48 .OPENSSL_atomic_add:
49 Loop:   lwarx   r5,0,r3
50         add     r0,r4,r5
51         stwcx.  r0,0,r3
52         bne-    Loop
53         $SIGNX  r3,r0
54         blr
55
56 .globl  .OPENSSL_rdtsc
57 .align  4
58 .OPENSSL_rdtsc:
59         mftb    r3
60         mftbu   r4
61         blr
62
63 .globl  .OPENSSL_cleanse
64 .align  4
65 .OPENSSL_cleanse:
66         $CMPLI  r4,7
67         li      r0,0
68         bge     Lot
69 Little: mtctr   r4
70         stb     r0,0(r3)
71         addi    r3,r3,1
72         bdnz-   \$-8
73         blr
74 Lot:    andi.   r5,r3,3
75         beq     Laligned
76         stb     r0,0(r3)
77         subi    r4,r4,1
78         addi    r3,r3,1
79         b       Lot
80 Laligned:
81         $SHRLI  r5,r4,2
82         mtctr   r5
83         stw     r0,0(r3)
84         addi    r3,r3,4
85         bdnz-   \$-8
86         andi.   r4,r4,3
87         bne     Little
88         blr
89 ___
90
91 $code =~ s/\`([^\`]*)\`/eval $1/gem;
92 print $code;
93 close STDOUT;