ARM64 assembly pack: make it Windows-friendly.
[openssl.git] / crypto / sha / asm / sha1-armv8.pl
index deb1238d361e45a148d7c813ab7b9b9534de9e30..7a0cbf539bad1c2631fe548c693d14537134a2c0 100644 (file)
@@ -1,4 +1,11 @@
-#!/usr/bin/env perl
+#! /usr/bin/env perl
+# Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
+#
+# Licensed under the Apache License 2.0 (the "License").  You may not use
+# this file except in compliance with the License.  You can obtain a copy
+# in the file LICENSE in the source distribution or at
+# https://www.openssl.org/source/license.html
+
 #
 # ====================================================================
 # Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
 #
 #              hardware-assisted       software(*)
 # Apple A7     2.31                    4.13 (+14%)
-# Cortex-A53   2.19                    8.73 (+108%)
+# Cortex-A53   2.24                    8.03 (+97%)
 # Cortex-A57   2.35                    7.88 (+74%)
+# Denver       2.13                    3.97 (+0%)(**)
+# X-Gene                               8.80 (+200%)
+# Mongoose     2.05                    6.50 (+160%)
+# Kryo         1.88                    8.00 (+90%)
 #
 # (*)  Software results are presented mostly for reference purposes.
+# (**) Keep in mind that Denver relies on binary translation, which
+#      optimizes compiler output at run-time.
 
 $flavour = shift;
-open STDOUT,">".shift;
+$output  = shift;
+
+$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;
 
 ($ctx,$inp,$num)=("x0","x1","x2");
 @Xw=map("w$_",(3..17,19));
@@ -37,10 +58,10 @@ $code.=<<___ if ($i<15 && !($i&1));
        lsr     @Xx[$i+1],@Xx[$i],#32
 ___
 $code.=<<___ if ($i<14 && !($i&1));
-       ld    @Xx[$i+2],[$inp,#`($i+2)*4-64`]
+       ldur    @Xx[$i+2],[$inp,#`($i+2)*4-64`]
 ___
 $code.=<<___ if ($i<14 && ($i&1));
-#ifdef __ARMEB__
+#ifdef __AARCH64EB__
        ror     @Xx[$i+1],@Xx[$i+1],#32
 #else
        rev32   @Xx[$i+1],@Xx[$i+1]
@@ -150,7 +171,10 @@ ___
 }
 
 $code.=<<___;
-#include "arm_arch.h"
+#ifndef        __KERNEL__
+# include "arm_arch.h"
+.extern OPENSSL_armcap_P
+#endif
 
 .text
 
@@ -158,10 +182,8 @@ $code.=<<___;
 .type  sha1_block_data_order,%function
 .align 6
 sha1_block_data_order:
-       ldr     x16,.LOPENSSL_armcap_P
-       adr     x17,.LOPENSSL_armcap_P
-       add     x16,x16,x17
-       ldr     w16,[x16]
+       adrp    x16,OPENSSL_armcap_P
+       ldr     w16,[x16,#:lo12:OPENSSL_armcap_P]
        tst     w16,#ARMV8_SHA1
        b.ne    .Lv8_entry
 
@@ -182,7 +204,7 @@ sha1_block_data_order:
        movz    $K,#0x7999
        sub     $num,$num,#1
        movk    $K,#0x5a82,lsl#16
-#ifdef __ARMEB__
+#ifdef __AARCH64EB__
        ror     $Xx[0],@Xx[0],#32
 #else
        rev32   @Xx[0],@Xx[0]
@@ -295,11 +317,11 @@ $code.=<<___;
 .long  0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1     //K_20_39
 .long  0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc     //K_40_59
 .long  0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6     //K_60_79
-.LOPENSSL_armcap_P:
-.quad  OPENSSL_armcap_P-.
 .asciz "SHA1 block transform for ARMv8, CRYPTOGAMS by <appro\@openssl.org>"
 .align 2
+#if !defined(__KERNELL__) && !defined(_WIN64)
 .comm  OPENSSL_armcap_P,4,4
+#endif
 ___
 }}}