Fix undefined behaviour in shifts.
[openssl.git] / crypto / ppccpuid.pl
index f1c856ff83215e57f5a52d887771dcab41ff6230..4ba736a1d1bd99e5af582c9e518ab5e78f12b34a 100755 (executable)
@@ -1,16 +1,15 @@
 #!/usr/bin/env perl
 
 #!/usr/bin/env perl
 
-$output = shift;
+$flavour = shift;
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
 ( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or
 die "can't locate ppc-xlate.pl";
 
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
 ( $xlate="${dir}perlasm/ppc-xlate.pl" and -f $xlate) or
 die "can't locate ppc-xlate.pl";
 
-( defined shift || open STDOUT,"| $^X $xlate $output" ) ||
-       die "can't call $xlate: $!";
+open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!";
 
 
-if ($output=~/64/) {
+if ($flavour=~/64/) {
     $CMPLI="cmpldi";
     $SHRLI="srdi";
     $SIGNX="extsw";
     $CMPLI="cmpldi";
     $SHRLI="srdi";
     $SIGNX="extsw";
@@ -21,38 +20,70 @@ if ($output=~/64/) {
 }
 
 $code=<<___;
 }
 
 $code=<<___;
+.machine       "any"
 .text
 
 .text
 
-.globl .OPENSSL_cpuid_setup
+.globl .OPENSSL_ppc64_probe
 .align 4
 .align 4
-.OPENSSL_cpuid_setup:
+.OPENSSL_ppc64_probe:
+       fcfid   f1,f1
+       extrdi  r0,r0,32,0
        blr
        blr
+       .long   0
+       .byte   0,12,0x14,0,0,0,0,0
+
+.globl .OPENSSL_altivec_probe
+.align 4
+.OPENSSL_altivec_probe:
+       .long   0x10000484      # vor   v0,v0,v0
+       blr
+       .long   0
+       .byte   0,12,0x14,0,0,0,0,0
 
 .globl .OPENSSL_wipe_cpu
 .align 4
 .OPENSSL_wipe_cpu:
        xor     r0,r0,r0
 
 .globl .OPENSSL_wipe_cpu
 .align 4
 .OPENSSL_wipe_cpu:
        xor     r0,r0,r0
+       fmr     f0,f31
+       fmr     f1,f31
+       fmr     f2,f31
        mr      r3,r1
        mr      r3,r1
+       fmr     f3,f31
        xor     r4,r4,r4
        xor     r4,r4,r4
+       fmr     f4,f31
        xor     r5,r5,r5
        xor     r5,r5,r5
+       fmr     f5,f31
        xor     r6,r6,r6
        xor     r6,r6,r6
+       fmr     f6,f31
        xor     r7,r7,r7
        xor     r7,r7,r7
+       fmr     f7,f31
        xor     r8,r8,r8
        xor     r8,r8,r8
+       fmr     f8,f31
        xor     r9,r9,r9
        xor     r9,r9,r9
+       fmr     f9,f31
        xor     r10,r10,r10
        xor     r10,r10,r10
+       fmr     f10,f31
        xor     r11,r11,r11
        xor     r11,r11,r11
+       fmr     f11,f31
        xor     r12,r12,r12
        xor     r12,r12,r12
+       fmr     f12,f31
+       fmr     f13,f31
        blr
        blr
+       .long   0
+       .byte   0,12,0x14,0,0,0,0,0
 
 .globl .OPENSSL_atomic_add
 .align 4
 .OPENSSL_atomic_add:
 
 .globl .OPENSSL_atomic_add
 .align 4
 .OPENSSL_atomic_add:
-Loop:  lwarx   r5,0,r3
+Ladd:  lwarx   r5,0,r3
        add     r0,r4,r5
        stwcx.  r0,0,r3
        add     r0,r4,r5
        stwcx.  r0,0,r3
-       bne-    Loop
+       bne-    Ladd
        $SIGNX  r3,r0
        blr
        $SIGNX  r3,r0
        blr
+       .long   0
+       .byte   0,12,0x14,0,0,0,2,0
+       .long   0
 
 .globl .OPENSSL_rdtsc
 .align 4
 
 .globl .OPENSSL_rdtsc
 .align 4
@@ -60,6 +91,8 @@ Loop: lwarx   r5,0,r3
        mftb    r3
        mftbu   r4
        blr
        mftb    r3
        mftbu   r4
        blr
+       .long   0
+       .byte   0,12,0x14,0,0,0,0,0
 
 .globl .OPENSSL_cleanse
 .align 4
 
 .globl .OPENSSL_cleanse
 .align 4
@@ -67,10 +100,12 @@ Loop:      lwarx   r5,0,r3
        $CMPLI  r4,7
        li      r0,0
        bge     Lot
        $CMPLI  r4,7
        li      r0,0
        bge     Lot
+       $CMPLI  r4,0
+       beqlr-
 Little:        mtctr   r4
        stb     r0,0(r3)
        addi    r3,r3,1
 Little:        mtctr   r4
        stb     r0,0(r3)
        addi    r3,r3,1
-       bdnz-   \$-8
+       bdnz    \$-8
        blr
 Lot:   andi.   r5,r3,3
        beq     Laligned
        blr
 Lot:   andi.   r5,r3,3
        beq     Laligned
@@ -83,10 +118,13 @@ Laligned:
        mtctr   r5
        stw     r0,0(r3)
        addi    r3,r3,4
        mtctr   r5
        stw     r0,0(r3)
        addi    r3,r3,4
-       bdnz-   \$-8
+       bdnz    \$-8
        andi.   r4,r4,3
        bne     Little
        blr
        andi.   r4,r4,3
        bne     Little
        blr
+       .long   0
+       .byte   0,12,0x14,0,0,0,2,0
+       .long   0
 ___
 
 $code =~ s/\`([^\`]*)\`/eval $1/gem;
 ___
 
 $code =~ s/\`([^\`]*)\`/eval $1/gem;