Add assembly support to ios64-cross.
authorAndy Polyakov <appro@openssl.org>
Mon, 5 Jan 2015 10:25:10 +0000 (11:25 +0100)
committerAndy Polyakov <appro@openssl.org>
Fri, 23 Jan 2015 14:38:41 +0000 (15:38 +0100)
Fix typos in ios64-cross config line.

Reviewed-by: Tim Hudson <tjh@openssl.org>
Configure
TABLE
crypto/Makefile
crypto/aes/asm/aesv8-armx.pl
crypto/arm64cpuid.pl [moved from crypto/arm64cpuid.S with 59% similarity, mode: 0755]
crypto/armcap.c
crypto/modes/asm/ghashv8-armx.pl
crypto/perlasm/arm-xlate.pl [new file with mode: 0755]
crypto/sha/asm/sha1-armv8.pl
crypto/sha/asm/sha512-armv8.pl

index 57e66e3..8d9abe7 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -599,7 +599,7 @@ my %table=(
 # CROSS_SDK=iPhoneOS7.0.sdk
 #
 "iphoneos-cross","cc:-O3 -isysroot \$(CROSS_TOP)/SDKs/\$(CROSS_SDK) -fomit-frame-pointer -fno-common::-D_REENTRANT:iOS:-Wl,-search_paths_first%:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${no_asm}:dlfcn:darwin-shared:-fPIC -fno-common:-dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
-"ios64-cross","cc:-O3 -arch arm64 -mios-version-min=7.0.0 -isysroot \$(CROSS_TOP)/SDKs/\$(CROSS_SDK) -fno-common::-D_REENTRANT:iOS:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHAR -RC4_CHUNK DES_INT DES_UNROLL -BF_PTR:${no_asm}:dlfcn:darwin-shared:-fPIC -fno-common:-dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
+"ios64-cross","cc:-O3 -arch arm64 -mios-version-min=7.0.0 -isysroot \$(CROSS_TOP)/SDKs/\$(CROSS_SDK) -fno-common::-D_REENTRANT:iOS:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${aarch64_asm}:ios64:dlfcn:darwin-shared:-fPIC -fno-common:-dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib",
 
 ##### A/UX
 "aux3-gcc","gcc:-O2 -DTERMIO::(unknown):AUX:-lbsd:RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:::",
diff --git a/TABLE b/TABLE
index 8e04733..d5b5261 100644 (file)
--- a/TABLE
+++ b/TABLE
@@ -3509,24 +3509,24 @@ $unistd       =
 $thread_cflag = -D_REENTRANT
 $sys_id       = iOS
 $lflags       = -Wl,-search_paths_first%
-$bn_ops       = SIXTY_FOUR_BIT_LONG RC4_CHAR -RC4_CHUNK DES_INT DES_UNROLL -BF_PTR
-$cpuid_obj    = 
+$bn_ops       = SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR
+$cpuid_obj    = armcap.o arm64cpuid.o mem_clr.o
 $bn_obj       = 
 $ec_obj       = 
 $des_obj      = 
-$aes_obj      = 
+$aes_obj      = aes_core.o aes_cbc.o aesv8-armx.o
 $bf_obj       = 
 $md5_obj      = 
-$sha1_obj     = 
+$sha1_obj     = sha1-armv8.o sha256-armv8.o sha512-armv8.o
 $cast_obj     = 
 $rc4_obj      = 
 $rmd160_obj   = 
 $rc5_obj      = 
 $wp_obj       = 
 $cmll_obj     = 
-$modes_obj    = 
+$modes_obj    = ghashv8-armx.o
 $engines_obj  = 
-$perlasm_scheme = void
+$perlasm_scheme = ios64
 $dso_scheme   = dlfcn
 $shared_target= darwin-shared
 $shared_cflag = -fPIC -fno-common
index 1078240..6e1c129 100644 (file)
@@ -86,6 +86,7 @@ alphacpuid.s: alphacpuid.pl
        (preproc=$$$$.$@.S; trap "rm $$preproc" INT; \
        $(PERL) alphacpuid.pl > $$preproc && \
        $(CC) -E -P $$preproc > $@ && rm $$preproc)
+arm64cpuid.S:  arm64cpuid.pl;  $(PERL) arm64cpuid.pl $(PERLASM_SCHEME) > $@
 
 subdirs:
        @target=all; $(RECURSIVE_MAKE)
index 1e93f86..0675409 100755 (executable)
 # Cortex-A57   3.64            1.34            1.32
 
 $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;
 
 $prefix="aes_v8";
 
@@ -56,7 +64,7 @@ my ($zero,$rcon,$mask,$in0,$in1,$tmp,$key)=
 
 $code.=<<___;
 .align 5
-rcon:
+.Lrcon:
 .long  0x01,0x01,0x01,0x01
 .long  0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d     // rotate-n-splat
 .long  0x1b,0x1b,0x1b,0x1b
@@ -85,7 +93,7 @@ $code.=<<___;
        tst     $bits,#0x3f
        b.ne    .Lenc_key_abort
 
-       adr     $ptr,rcon
+       adr     $ptr,.Lrcon
        cmp     $bits,#192
 
        veor    $zero,$zero,$zero
old mode 100644 (file)
new mode 100755 (executable)
similarity index 59%
rename from crypto/arm64cpuid.S
rename to crypto/arm64cpuid.pl
index 4778ac1..bfec664
@@ -1,46 +1,68 @@
+#!/usr/bin/env perl
+
+$flavour = 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;
+
+$code.=<<___;
 #include "arm_arch.h"
 
 .text
 .arch  armv8-a+crypto
 
 .align 5
-.global        _armv7_neon_probe
+.globl _armv7_neon_probe
 .type  _armv7_neon_probe,%function
 _armv7_neon_probe:
        orr     v15.16b, v15.16b, v15.16b
        ret
 .size  _armv7_neon_probe,.-_armv7_neon_probe
 
-.global        _armv7_tick
+.globl _armv7_tick
 .type  _armv7_tick,%function
 _armv7_tick:
+#ifdef __APPLE__
+       mrs     x0, CNTPCT_EL0
+#else
        mrs     x0, CNTVCT_EL0
+#endif
        ret
 .size  _armv7_tick,.-_armv7_tick
 
-.global        _armv8_aes_probe
+.globl _armv8_aes_probe
 .type  _armv8_aes_probe,%function
 _armv8_aes_probe:
        aese    v0.16b, v0.16b
        ret
 .size  _armv8_aes_probe,.-_armv8_aes_probe
 
-.global        _armv8_sha1_probe
+.globl _armv8_sha1_probe
 .type  _armv8_sha1_probe,%function
 _armv8_sha1_probe:
        sha1h   s0, s0
        ret
 .size  _armv8_sha1_probe,.-_armv8_sha1_probe
 
-.global        _armv8_sha256_probe
+.globl _armv8_sha256_probe
 .type  _armv8_sha256_probe,%function
 _armv8_sha256_probe:
        sha256su0       v0.4s, v0.4s
        ret
 .size  _armv8_sha256_probe,.-_armv8_sha256_probe
-.global        _armv8_pmull_probe
+.globl _armv8_pmull_probe
 .type  _armv8_pmull_probe,%function
 _armv8_pmull_probe:
        pmull   v0.1q, v0.1d, v0.1d
        ret
 .size  _armv8_pmull_probe,.-_armv8_pmull_probe
+___
+
+print $code;
+close STDOUT;
index 356fa15..3dbe574 100644 (file)
@@ -46,12 +46,14 @@ unsigned long OPENSSL_rdtsc(void)
         return 0;
 }
 
+# if defined(__GNUC__) && __GNUC__>=2
+void OPENSSL_cpuid_setup(void) __attribute__ ((constructor));
+# endif
 /*
  * Use a weak reference to getauxval() so we can use it if it is available but
  * don't break the build if it is not.
  */
-# if defined(__GNUC__) && __GNUC__>=2
-void OPENSSL_cpuid_setup(void) __attribute__ ((constructor));
+# if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__)
 extern unsigned long getauxval(unsigned long type) __attribute__ ((weak));
 # else
 static unsigned long (*getauxval) (unsigned long) = NULL;
index 54a1ac4..7bbe2fc 100644 (file)
 # (*)  presented for reference/comparison purposes;
 
 $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;
 
 $Xi="x0";      # argument block
 $Htbl="x1";
diff --git a/crypto/perlasm/arm-xlate.pl b/crypto/perlasm/arm-xlate.pl
new file mode 100755 (executable)
index 0000000..fd185e9
--- /dev/null
@@ -0,0 +1,140 @@
+#!/usr/bin/env perl
+
+# ARM assembler distiller by <appro>.
+
+my $flavour = shift;
+my $output = shift;
+open STDOUT,">$output" || die "can't open $output: $!";
+
+$flavour = "linux32" if (!$flavour or $flavour eq "void");
+
+my %GLOBALS;
+my $dotinlocallabels=($flavour=~/linux/)?1:0;
+
+################################################################
+# directives which need special treatment on different platforms
+################################################################
+my $arch = sub {
+    if ($flavour =~ /linux/)   { ".arch\t".join(',',@_); }
+    else                       { ""; }
+};
+my $globl = sub {
+    my $name = shift;
+    my $global = \$GLOBALS{$name};
+    my $ret;
+
+    SWITCH: for ($flavour) {
+       /ios/           && do { $name = "_$name";
+                               last;
+                             };
+    }
+
+    $ret = ".globl     $name" if (!$ret);
+    $$global = $name;
+    $ret;
+};
+my $global = $globl;
+my $extern = sub {
+    &$globl(@_);
+    return;    # return nothing
+};
+my $type = sub {
+    if ($flavour =~ /linux/)   { ".type\t".join(',',@_); }
+    else                       { ""; }
+};
+my $size = sub {
+    if ($flavour =~ /linux/)   { ".size\t".join(',',@_); }
+    else                       { ""; }
+};
+my $inst = sub {
+    if ($flavour =~ /linux/)    { ".inst\t".join(',',@_); }
+    else                        { ".long\t".join(',',@_); }
+};
+my $asciz = sub {
+    my $line = join(",",@_);
+    if ($line =~ /^"(.*)"$/)
+    {  ".byte  " . join(",",unpack("C*",$1),0) . "\n.align     2";     }
+    else
+    {  "";     }
+};
+
+sub range {
+  my ($r,$sfx,$start,$end) = @_;
+
+    join(",",map("$r$_$sfx",($start..$end)));
+}
+
+sub parse_args {
+  my $line = shift;
+  my @ret = ();
+
+    pos($line)=0;
+
+    while (1) {
+       if ($line =~ m/\G\[/gc) {
+           $line =~ m/\G([^\]]+\][^,]*)\s*/g;
+           push @ret,"[$1";
+       }
+       elsif ($line =~ m/\G\{/gc) {
+           $line =~ m/\G([^\}]+\}[^,]*)\s*/g;
+           my $arg = $1;
+           $arg =~ s/([rdqv])([0-9]+)([^\-]*)\-\1([0-9]+)\3/range($1,$3,$2,$4)/ge;
+           push @ret,"{$arg";
+       }
+       elsif ($line =~ m/\G([^,]+)\s*/g) {
+           push @ret,$1;
+       }
+
+       last if ($line =~ m/\G$/gc);
+
+       $line =~ m/\G,\s*/g;
+    }
+
+    map {my $s=$_;$s=~s/\b(\w+)/$GLOBALS{$1} or $1/ge;$s} @ret;
+}
+
+while($line=<>) {
+
+    $line =~ s|/\*.*\*/||;     # get rid of C-style comments...
+    $line =~ s|^\s+||;         # ... and skip white spaces in beginning...
+    $line =~ s|\s+$||;         # ... and at the end
+
+    {
+       $line =~ s|[\b\.]L(\w+)|L$1|g;  # common denominator for Locallabel
+       $line =~ s|\bL(\w+)|\.L$1|g     if ($dotinlocallabels);
+    }
+
+    {
+       $line =~ s|(^[\.\w]+)\:\s*||;
+       my $label = $1;
+       if ($label) {
+           printf "%s:",($GLOBALS{$label} or $label);
+       }
+    }
+
+    if ($line !~ m/^#/o) {
+       $line =~ s|^\s*(\.?)(\S+)\s*||o;
+       my $c = $1; $c = "\t" if ($c eq "");
+       my $mnemonic = $2;
+       my $opcode;
+       if ($mnemonic =~ m/([^\.]+)\.([^\.]+)/o) {
+           $opcode = eval("\$$1_$2");
+       } else {
+           $opcode = eval("\$$mnemonic");
+       }
+
+       my @args=parse_args($line);
+
+       if (ref($opcode) eq 'CODE') {
+               $line = &$opcode(@args);
+       } elsif ($mnemonic)         {
+               $line = $c.$mnemonic;
+               $line.= "\t".join(',',@args) if ($#args>=0);
+       }
+    }
+
+    print $line if ($line);
+    print "\n";
+}
+
+close STDOUT;
index deb1238..6be8624 100644 (file)
 # (*)  Software results are presented mostly for reference purposes.
 
 $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));
@@ -154,6 +162,7 @@ $code.=<<___;
 
 .text
 
+.extern        OPENSSL_armcap_P
 .globl sha1_block_data_order
 .type  sha1_block_data_order,%function
 .align 6
index bd7a0a5..45eb719 100644 (file)
 
 $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;
@@ -153,6 +160,7 @@ $code.=<<___;
 
 .text
 
+.extern        OPENSSL_armcap_P
 .globl $func
 .type  $func,%function
 .align 6
@@ -182,7 +190,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:
@@ -232,8 +240,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
@@ -298,7 +306,7 @@ $code.=<<___ if ($SZ==4);
        .long   0       //terminator
 ___
 $code.=<<___;
-.size  K$BITS,.-K$BITS
+.size  .LK$BITS,.-.LK$BITS
 .align 3
 .LOPENSSL_armcap_P:
        .quad   OPENSSL_armcap_P-.
@@ -323,7 +331,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