ec/curve25519.c: avoid 2^51 radix on SPARC.
[openssl.git] / crypto / aes / asm / aes-s390x.pl
index 71d5b55077fab3a930e79a75e97610be54564981..0ef1f6b50ab447716c0a92747e88e01c455a0e12 100644 (file)
@@ -1,7 +1,14 @@
-#!/usr/bin/env perl
+#! /usr/bin/env perl
+# Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved.
+#
+# Licensed under the OpenSSL license (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@fy.chalmers.se> for the OpenSSL
+# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
 # project. The module is, however, dual licensed under OpenSSL and
 # CRYPTOGAMS licenses depending on where you obtain it. For further
 # details see http://www.openssl.org/~appro/cryptogams/.
@@ -37,7 +44,7 @@
 # minimize/avoid Address Generation Interlock hazard and to favour
 # dual-issue z10 pipeline. This gave ~25% improvement on z10 and
 # almost 50% on z9. The gain is smaller on z10, because being dual-
-# issue z10 makes it improssible to eliminate the interlock condition:
+# issue z10 makes it impossible to eliminate the interlock condition:
 # critial path is not long enough. Yet it spends ~24 cycles per byte
 # processed with 128-bit key.
 #
@@ -92,7 +99,7 @@ if ($flavour =~ /3[12]/) {
        $g="g";
 }
 
-while (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {}
+while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
 open STDOUT,">$output";
 
 $softonly=0;   # allow hardware support
@@ -122,6 +129,8 @@ sub _data_word()
 }
 
 $code=<<___;
+#include "s390x_arch.h"
+
 .text
 
 .type  AES_Te,\@object
@@ -397,7 +406,7 @@ _s390x_AES_encrypt:
        or      $s1,$t1
        or      $t2,$i2
        or      $t3,$i3
-       
+
        srlg    $i1,$s2,`8-3`   # i0
        srlg    $i2,$s2,`16-3`  # i1
        nr      $i1,$mask
@@ -450,7 +459,7 @@ _s390x_AES_encrypt:
        x       $s2,24($key)
        x       $s3,28($key)
 
-       br      $ra     
+       br      $ra
 .size  _s390x_AES_encrypt,.-_s390x_AES_encrypt
 ___
 
@@ -772,7 +781,7 @@ _s390x_AES_decrypt:
        x       $s2,24($key)
        x       $s3,28($key)
 
-       br      $ra     
+       br      $ra
 .size  _s390x_AES_decrypt,.-_s390x_AES_decrypt
 ___
 
@@ -806,7 +815,7 @@ _s390x_AES_set_encrypt_key:
 .Lproceed:
 ___
 $code.=<<___ if (!$softonly);
-       # convert bits to km code, [128,192,256]->[18,19,20]
+       # convert bits to km(c) code, [128,192,256]->[18,19,20]
        lhi     %r5,-128
        lhi     %r0,18
        ar      %r5,$bits
@@ -814,17 +823,10 @@ $code.=<<___ if (!$softonly);
        ar      %r5,%r0
 
        larl    %r1,OPENSSL_s390xcap_P
-       lg      %r0,0(%r1)
-       tmhl    %r0,0x4000      # check for message-security assist
-       jz      .Lekey_internal
-
-       lghi    %r0,0           # query capability vector
-       la      %r1,16($sp)
-       .long   0xb92f0042      # kmc %r4,%r2
-
-       llihh   %r1,0x8000
-       srlg    %r1,%r1,0(%r5)
-       ng      %r1,16($sp)
+       llihh   %r0,0x8000
+       srlg    %r0,%r0,0(%r5)
+       ng      %r0,S390X_KM(%r1)  # check availability of both km...
+       ng      %r0,S390X_KMC(%r1) # ...and kmc support for given key length
        jz      .Lekey_internal
 
        lmg     %r0,%r1,0($inp) # just copy 128 bits...
@@ -839,7 +841,7 @@ $code.=<<___ if (!$softonly);
        stg     %r1,24($key)
 1:     st      $bits,236($key) # save bits [for debugging purposes]
        lgr     $t0,%r5
-       st      %r5,240($key)   # save km code
+       st      %r5,240($key)   # save km(c) code
        lghi    %r2,0
        br      %r14
 ___
@@ -1294,7 +1296,7 @@ $code.=<<___;
 .Lcbc_enc_done:
        l${g}   $ivp,6*$SIZE_T($sp)
        st      $s0,0($ivp)
-       st      $s1,4($ivp)     
+       st      $s1,4($ivp)
        st      $s2,8($ivp)
        st      $s3,12($ivp)
 
@@ -1436,21 +1438,13 @@ $code.=<<___ if (!$softonly);
 
 .Lctr32_hw_switch:
 ___
-$code.=<<___ if (0);   ######### kmctr code was measured to be ~12% slower
-       larl    $s0,OPENSSL_s390xcap_P
-       lg      $s0,8($s0)
-       tmhh    $s0,0x0004      # check for message_security-assist-4
-       jz      .Lctr32_km_loop
-
+$code.=<<___ if (!$softonly && 0);# kmctr code was measured to be ~12% slower
        llgfr   $s0,%r0
        lgr     $s1,%r1
-       lghi    %r0,0
-       la      %r1,16($sp)
-       .long   0xb92d2042      # kmctr %r4,%r2,%r2
-
+       larl    %r1,OPENSSL_s390xcap_P
        llihh   %r0,0x8000      # check if kmctr supports the function code
        srlg    %r0,%r0,0($s0)
-       ng      %r0,16($sp)
+       ng      %r0,S390X_KMCTR(%r1)    # check kmctr capability vector
        lgr     %r0,$s0
        lgr     %r1,$s1
        jz      .Lctr32_km_loop
@@ -1488,7 +1482,7 @@ $code.=<<___ if (0);      ######### kmctr code was measured to be ~12% slower
        br      $ra
 .align 16
 ___
-$code.=<<___;
+$code.=<<___ if (!$softonly);
 .Lctr32_km_loop:
        la      $s2,16($sp)
        lgr     $s3,$fp
@@ -1575,8 +1569,8 @@ ___
 }
 
 ########################################################################
-# void AES_xts_encrypt(const char *inp,char *out,size_t len,
-#      const AES_KEY *key1, const AES_KEY *key2,
+# void AES_xts_encrypt(const unsigned char *inp, unsigned char *out,
+#      size_t len, const AES_KEY *key1, const AES_KEY *key2,
 #      const unsigned char iv[16]);
 #
 {
@@ -1597,12 +1591,10 @@ $code.=<<___ if(1);
        llgfr   $s0,%r0                 # put aside the function code
        lghi    $s1,0x7f
        nr      $s1,%r0
-       lghi    %r0,0                   # query capability vector
-       la      %r1,$tweak-16($sp)
-       .long   0xb92e0042              # km %r4,%r2
-       llihh   %r1,0x8000
-       srlg    %r1,%r1,32($s1)         # check for 32+function code
-       ng      %r1,$tweak-16($sp)
+       larl    %r1,OPENSSL_s390xcap_P
+       llihh   %r0,0x8000
+       srlg    %r0,%r0,32($s1)         # check for 32+function code
+       ng      %r0,S390X_KM(%r1)       # check km capability vector
        lgr     %r0,$s0                 # restore the function code
        la      %r1,0($key1)            # restore $key1
        jz      .Lxts_km_vanilla
@@ -1637,7 +1629,7 @@ $code.=<<___ if(1);
        llgc    $len,2*$SIZE_T-1($sp)
        nill    $len,0x0f               # $len%=16
        br      $ra
-       
+
 .align 16
 .Lxts_km_vanilla:
 ___
@@ -1864,7 +1856,7 @@ $code.=<<___;
        xgr     $s1,%r1
        lrvgr   $s1,$s1                 # flip byte order
        lrvgr   $s3,$s3
-       srlg    $s0,$s1,32              # smash the tweak to 4x32-bits 
+       srlg    $s0,$s1,32              # smash the tweak to 4x32-bits
        stg     $s1,$tweak+0($sp)       # save the tweak
        llgfr   $s1,$s1
        srlg    $s2,$s3,32
@@ -1915,7 +1907,7 @@ $code.=<<___;
        xgr     $s1,%r1
        lrvgr   $s1,$s1                 # flip byte order
        lrvgr   $s3,$s3
-       srlg    $s0,$s1,32              # smash the tweak to 4x32-bits 
+       srlg    $s0,$s1,32              # smash the tweak to 4x32-bits
        stg     $s1,$tweak+0($sp)       # save the tweak
        llgfr   $s1,$s1
        srlg    $s2,$s3,32
@@ -1946,8 +1938,8 @@ $code.=<<___;
        br      $ra
 .size  AES_xts_encrypt,.-AES_xts_encrypt
 ___
-# void AES_xts_decrypt(const char *inp,char *out,size_t len,
-#      const AES_KEY *key1, const AES_KEY *key2,
+# void AES_xts_decrypt(const unsigned char *inp, unsigned char *out,
+#      size_t len, const AES_KEY *key1, const AES_KEY *key2,
 #      const unsigned char iv[16]);
 #
 $code.=<<___;
@@ -2107,7 +2099,7 @@ $code.=<<___;
        xgr     $s1,%r1
        lrvgr   $s1,$s1                 # flip byte order
        lrvgr   $s3,$s3
-       srlg    $s0,$s1,32              # smash the tweak to 4x32-bits 
+       srlg    $s0,$s1,32              # smash the tweak to 4x32-bits
        stg     $s1,$tweak+0($sp)       # save the tweak
        llgfr   $s1,$s1
        srlg    $s2,$s3,32
@@ -2229,7 +2221,6 @@ ___
 }
 $code.=<<___;
 .string        "AES for s390x, CRYPTOGAMS by <appro\@openssl.org>"
-.comm  OPENSSL_s390xcap_P,16,8
 ___
 
 $code =~ s/\`([^\`]*)\`/eval $1/gem;