Unify all assembler file generators
[openssl.git] / crypto / aes / asm / aes-armv4.pl
index a620a7cddb4ece1aadaf66a80ec2b323fe0b3a6a..9367f1f33b8442780926fb829d25d8c7676327b7 100644 (file)
@@ -1,4 +1,11 @@
-#!/usr/bin/env perl
+#! /usr/bin/env perl
+# Copyright 2007-2018 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
 # Profiler-assisted and platform-specific optimization resulted in 16%
 # improvement on Cortex A8 core and ~21.5 cycles per byte.
 
-while (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {}
-open STDOUT,">$output";
+# $output is the last argument if it looks like a file (it has an extension)
+# $flavour is the first argument if it doesn't look like a file
+$output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
+$flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
+
+if ($flavour && $flavour ne "void") {
+    $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 STDOUT,"| \"$^X\" $xlate $flavour \"$output\""
+        or die "can't call $xlate: $!";
+} else {
+    $output and open STDOUT,">$output";
+}
 
 $s0="r0";
 $s1="r1";
@@ -57,18 +78,16 @@ $code=<<___;
 # define __ARM_ARCH__ __LINUX_ARM_ARCH__
 #endif
 
-.text
-#if __ARM_ARCH__<7
-.code  32
-#else
+#if defined(__thumb2__) && !defined(__APPLE__)
 .syntax        unified
-# ifdef __thumb2__
 .thumb
-# else
+#else
 .code  32
-# endif
+#undef __thumb2__
 #endif
 
+.text
+
 .type  AES_Te,%object
 .align 5
 AES_Te:
@@ -181,15 +200,19 @@ AES_Te:
 .type   AES_encrypt,%function
 .align 5
 AES_encrypt:
-#if __ARM_ARCH__<7
+#ifndef        __thumb2__
        sub     r3,pc,#8                @ AES_encrypt
 #else
-       adr     r3,AES_encrypt
+       adr     r3,.
 #endif
        stmdb   sp!,{r1,r4-r12,lr}
+#if defined(__thumb2__) || defined(__APPLE__)
+       adr     $tbl,AES_Te
+#else
+       sub     $tbl,r3,#AES_encrypt-AES_Te     @ Te
+#endif
        mov     $rounds,r0              @ inp
        mov     $key,r2
-       sub     $tbl,r3,#AES_encrypt-AES_Te     @ Te
 #if __ARM_ARCH__<7
        ldrb    $s0,[$rounds,#3]        @ load input data in endian-neutral
        ldrb    $t1,[$rounds,#2]        @ manner...
@@ -427,19 +450,19 @@ _armv4_AES_encrypt:
 .align 5
 AES_set_encrypt_key:
 _armv4_AES_set_encrypt_key:
-#if __ARM_ARCH__<7
+#ifndef        __thumb2__
        sub     r3,pc,#8                @ AES_set_encrypt_key
 #else
-       adr     r3,AES_set_encrypt_key
+       adr     r3,.
 #endif
        teq     r0,#0
-#if __ARM_ARCH__>=7
+#ifdef __thumb2__
        itt     eq                      @ Thumb2 thing, sanity check in ARM
 #endif
        moveq   r0,#-1
        beq     .Labrt
        teq     r2,#0
-#if __ARM_ARCH__>=7
+#ifdef __thumb2__
        itt     eq                      @ Thumb2 thing, sanity check in ARM
 #endif
        moveq   r0,#-1
@@ -450,19 +473,23 @@ _armv4_AES_set_encrypt_key:
        teq     r1,#192
        beq     .Lok
        teq     r1,#256
-#if __ARM_ARCH__>=7
+#ifdef __thumb2__
        itt     ne                      @ Thumb2 thing, sanity check in ARM
 #endif
        movne   r0,#-1
        bne     .Labrt
 
 .Lok:  stmdb   sp!,{r4-r12,lr}
-       sub     $tbl,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024 @ Te4
-
        mov     $rounds,r0              @ inp
        mov     lr,r1                   @ bits
        mov     $key,r2                 @ key
 
+#if defined(__thumb2__) || defined(__APPLE__)
+       adr     $tbl,AES_Te+1024                                @ Te4
+#else
+       sub     $tbl,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024 @ Te4
+#endif
+
 #if __ARM_ARCH__<7
        ldrb    $s0,[$rounds,#3]        @ load input data in endian-neutral
        ldrb    $t1,[$rounds,#2]        @ manner...
@@ -607,7 +634,7 @@ _armv4_AES_set_encrypt_key:
        str     $s2,[$key,#-16]
        subs    $rounds,$rounds,#1
        str     $s3,[$key,#-12]
-#if __ARM_ARCH__>=7
+#ifdef __thumb2__
        itt     eq                              @ Thumb2 thing, sanity check in ARM
 #endif
        subeq   r2,$key,#216
@@ -679,7 +706,7 @@ _armv4_AES_set_encrypt_key:
        str     $s2,[$key,#-24]
        subs    $rounds,$rounds,#1
        str     $s3,[$key,#-20]
-#if __ARM_ARCH__>=7
+#ifdef __thumb2__
        itt     eq                              @ Thumb2 thing, sanity check in ARM
 #endif
        subeq   r2,$key,#256
@@ -750,7 +777,7 @@ _armv4_AES_set_enc2dec_key:
        ldr     $rounds,[r0,#240]
        mov     $i1,r0                  @ input
        add     $i2,r0,$rounds,lsl#4
-       mov     $key,r1                 @ ouput
+       mov     $key,r1                 @ output
        add     $tbl,r1,$rounds,lsl#4
        str     $rounds,[r1,#240]
 
@@ -949,15 +976,19 @@ AES_Td:
 .type   AES_decrypt,%function
 .align 5
 AES_decrypt:
-#if __ARM_ARCH__<7
+#ifndef        __thumb2__
        sub     r3,pc,#8                @ AES_decrypt
 #else
-       adr     r3,AES_decrypt
+       adr     r3,.
 #endif
        stmdb   sp!,{r1,r4-r12,lr}
+#if defined(__thumb2__) || defined(__APPLE__)
+       adr     $tbl,AES_Td
+#else
+       sub     $tbl,r3,#AES_decrypt-AES_Td     @ Td
+#endif
        mov     $rounds,r0              @ inp
        mov     $key,r2
-       sub     $tbl,r3,#AES_decrypt-AES_Td             @ Td
 #if __ARM_ARCH__<7
        ldrb    $s0,[$rounds,#3]        @ load input data in endian-neutral
        ldrb    $t1,[$rounds,#2]        @ manner...