Allow ILP32 compilation in AArch64 assembly pack.
[openssl.git] / crypto / sha / asm / sha512-armv8.pl
index ca0ee4e745fb610cdb255f0e3bfeec9e203dd4ea..7d69f0f4958dad08329eb4bc603986fcd24acf10 100644 (file)
 #
 #              SHA256-hw       SHA256(*)       SHA512
 # Apple A7     1.97            10.5 (+33%)     6.73 (-1%(**))
-# Cortex-A5x   n/a             n/a             n/a
+# Cortex-A53   2.38            15.5 (+115%)    10.0 (+150%(***))
+# Cortex-A57   2.31            11.6 (+86%)     7.51 (+260%(***))
+# Denver       2.01            10.5 (+26%)     6.70 (+8%)
+# X-Gene                       20.0 (+100%)    12.8 (+300%(***))
 # 
 # (*)  Software SHA256 results are of lesser relevance, presented
 #      mostly for informational purposes.
 # (**) The result is a trade-off: it's possible to improve it by
-#      10%, but at the cost of 20% loss on Cortex-A5x.
+#      10% (or by 1 cycle per round), but at the cost of 20% loss
+#      on Cortex-A53 (or by 4 cycles per round).
+# (***)        Super-impressive coefficients over gcc-generated code are
+#      indication of some compiler "pathology", most notably code
+#      generated with -mgeneral-regs-only is significanty faster
+#      and the gap is only 40-90%.
 
 $flavour=shift;
 $output=shift;
-open STDOUT,">$output";
+
+$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
+( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
+( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
+die "can't locate arm-xlate.pl";
+
+open OUT,"| \"$^X\" $xlate $flavour $output";
+*STDOUT=*OUT;
 
 if ($output =~ /512/) {
        $BITS=512;
@@ -147,13 +162,18 @@ $code.=<<___;
 
 .text
 
+.extern        OPENSSL_armcap_P
 .globl $func
 .type  $func,%function
 .align 6
 $func:
 ___
 $code.=<<___   if ($SZ==4);
+#ifdef __ILP32__
+       ldrsw   x16,.LOPENSSL_armcap_P
+#else
        ldr     x16,.LOPENSSL_armcap_P
+#endif
        adr     x17,.LOPENSSL_armcap_P
        add     x16,x16,x17
        ldr     w16,[x16]
@@ -176,7 +196,7 @@ $code.=<<___;
        ldp     $E,$F,[$ctx,#4*$SZ]
        add     $num,$inp,$num,lsl#`log(16*$SZ)/log(2)` // end of input
        ldp     $G,$H,[$ctx,#6*$SZ]
-       adr     $Ktbl,K$BITS
+       adr     $Ktbl,.LK$BITS
        stp     $ctx,$num,[x29,#96]
 
 .Loop:
@@ -226,8 +246,8 @@ $code.=<<___;
 .size  $func,.-$func
 
 .align 6
-.type  K$BITS,%object
-K$BITS:
+.type  .LK$BITS,%object
+.LK$BITS:
 ___
 $code.=<<___ if ($SZ==8);
        .quad   0x428a2f98d728ae22,0x7137449123ef65cd
@@ -292,10 +312,14 @@ $code.=<<___ if ($SZ==4);
        .long   0       //terminator
 ___
 $code.=<<___;
-.size  K$BITS,.-K$BITS
+.size  .LK$BITS,.-.LK$BITS
 .align 3
 .LOPENSSL_armcap_P:
+#ifdef __ILP32__
+       .long   OPENSSL_armcap_P-.
+#else
        .quad   OPENSSL_armcap_P-.
+#endif
 .asciz "SHA$BITS block transform for ARMv8, CRYPTOGAMS by <appro\@openssl.org>"
 .align 2
 ___
@@ -317,7 +341,7 @@ sha256_block_armv8:
        add             x29,sp,#0
 
        ld1.32          {$ABCD,$EFGH},[$ctx]
-       adr             $Ktbl,K256
+       adr             $Ktbl,.LK256
 
 .Loop_hw:
        ld1             {@MSG[0]-@MSG[3]},[$inp],#64
@@ -393,7 +417,7 @@ ___
 
        $arg =~ m/[qv]([0-9]+)[^,]*,\s*[qv]([0-9]+)[^,]*(?:,\s*[qv]([0-9]+))?/o
        &&
-       sprintf ".long\t0x%08x\t//%s %s",
+       sprintf ".inst\t0x%08x\t//%s %s",
                        $opcode{$mnemonic}|$1|($2<<5)|($3<<16),
                        $mnemonic,$arg;
     }