Add ghash-s390x.pl.
authorAndy Polyakov <appro@openssl.org>
Fri, 10 Sep 2010 14:50:17 +0000 (14:50 +0000)
committerAndy Polyakov <appro@openssl.org>
Fri, 10 Sep 2010 14:50:17 +0000 (14:50 +0000)
Configure
TABLE
crypto/modes/asm/ghash-s390x.pl [new file with mode: 0644]

index 9203ad2..53a9ba8 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -133,7 +133,7 @@ my $sparcv9_asm="sparcv9cap.o sparccpuid.o:bn-sparcv9.o sparcv9-mont.o sparcv9a-
 my $sparcv8_asm=":sparcv8.o:des_enc-sparc.o fcrypt_b.o::::::::::::void";
 my $alpha_asm="alphacpuid.o:bn_asm.o alpha-mont.o:::::sha1-alpha.o:::::::ghash-alpha.o:void";
 my $mips3_asm=":bn-mips3.o:::::::::::::void";
-my $s390x_asm="s390xcap.o s390xcpuid.o:bn-s390x.o s390x-mont.o::aes_ctr.o aes-s390x.o:::sha1-s390x.o sha256-s390x.o sha512-s390x.o::rc4-s390x.o::::::void";
+my $s390x_asm="s390xcap.o s390xcpuid.o:bn-s390x.o s390x-mont.o::aes_ctr.o aes-s390x.o:::sha1-s390x.o sha256-s390x.o sha512-s390x.o::rc4-s390x.o:::::ghash-s390x.o:void";
 my $armv4_asm=":bn_asm.o armv4-mont.o::aes_cbc.o aes-armv4.o:::sha1-armv4-large.o sha256-armv4.o sha512-armv4.o:::::::ghash-armv4.o:void";
 my $parisc11_asm="pariscid.o:bn_asm.o parisc-mont.o::aes_core.o aes_cbc.o aes-parisc.o:::sha1-parisc.o sha256-parisc.o sha512-parisc.o::rc4-parisc.o:::::ghash-parisc.o:32";
 my $parisc20_asm="pariscid.o:pa-risc2W.o parisc-mont.o::aes_core.o aes_cbc.o aes-parisc.o:::sha1-parisc.o sha256-parisc.o sha512-parisc.o::rc4-parisc.o:::::ghash-parisc.o:64";
diff --git a/TABLE b/TABLE
index 4d2ae56..c9c3997 100644 (file)
--- a/TABLE
+++ b/TABLE
@@ -1506,7 +1506,7 @@ $multilib     =
 
 *** debug-ben-debug
 $cc           = gcc
-$cflags       = -Wall -pedantic -DPEDANTIC -Wno-long-long -Wsign-compare -Wmissing-prototypes -Wshadow -Wformat -Werror -DCRYPTO_MDEBUG_ALL -DCRYPTO_MDEBUG_ABORT -DREF_CHECK -DOPENSSL_NO_DEPRECATED -DBN_DEBUG -DCONF_DEBUG -DBN_CTX_DEBUG -DDEBUG_SAFESTACK -g3 -O2 -pipe
+$cflags       = -Wall -pedantic -DPEDANTIC -Wno-long-long -Wsign-compare -Wmissing-prototypes -Wshadow -Wformat -Werror -DCRYPTO_MDEBUG_ALL -DCRYPTO_MDEBUG_ABORT -DREF_CHECK -DOPENSSL_NO_DEPRECATED -DBN_DEBUG -DCONF_DEBUG -DDEBUG_SAFESTACK -g3 -O2 -pipe
 $unistd       = 
 $thread_cflag = (unknown)
 $sys_id       = 
@@ -3893,7 +3893,7 @@ $rmd160_obj   =
 $rc5_obj      = 
 $wp_obj       = 
 $cmll_obj     = 
-$modes_obj    = 
+$modes_obj    = ghash-s390x.o
 $perlasm_scheme = void
 $dso_scheme   = dlfcn
 $shared_target= linux-shared
diff --git a/crypto/modes/asm/ghash-s390x.pl b/crypto/modes/asm/ghash-s390x.pl
new file mode 100644 (file)
index 0000000..18135dd
--- /dev/null
@@ -0,0 +1,171 @@
+#!/usr/bin/env perl
+
+# ====================================================================
+# 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/.
+# ====================================================================
+
+# September 2010.
+
+while (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {}
+open STDOUT,">$output";
+
+$Zhi="%r0";
+$Zlo="%r1";
+
+$Xi="%r2";     # argument block
+$Htbl="%r3";
+$inp="%r4";
+$len="%r5";
+
+$rem0="%r6";   # variables
+$rem1="%r7";
+$nlo="%r8";
+$nhi="%r9";
+$xi="%r10";
+$cnt="%r11";
+$tmp="%r12";
+$x78="%r13";
+$rem_4bit="%r14";
+
+$sp="%r15";
+
+$code.=<<___;
+.text
+
+.globl gcm_gmult_4bit
+.align 32
+gcm_gmult_4bit:
+       stmg    %r6,%r14,48($sp)
+
+       aghi    $Xi,-1
+       lghi    $len,1
+       lghi    $x78,`0xf<<3`
+       larl    $rem_4bit,rem_4bit
+
+       lg      $Zlo,8+1($Xi)           # Xi
+       j       .Lgmult_shortcut
+.type  gcm_gmult_4bit,\@function
+.size  gcm_gmult_4bit,(.-gcm_gmult_4bit)
+
+.globl gcm_ghash_4bit
+.align 32
+gcm_ghash_4bit:
+       stmg    %r6,%r14,48($sp)
+
+       aghi    $Xi,-1
+       srlg    $len,$len,4
+       lghi    $x78,`0xf<<3`
+       larl    $rem_4bit,rem_4bit
+
+       lg      $Zlo,8+1($Xi)           # Xi
+       lg      $Zhi,0+1($Xi)
+.Louter:
+       xg      $Zlo,8($inp)            # Xi ^= inp 
+       xg      $Zhi,0($inp)
+       stg     $Zlo,8+1($Xi)
+       stg     $Zhi,0+1($Xi)
+
+.Lgmult_shortcut:
+       lghi    $tmp,0xff
+       srlg    $xi,$Zlo,8              # extract first two bytes
+       lgr     $nhi,$Zlo
+       ngr     $xi,$tmp
+       ngr     $nhi,$tmp
+
+       sllg    $nlo,$nhi,4
+       nill    $nhi,0xf0
+       nill    $nlo,0xf0
+       lghi    $cnt,14
+
+       lg      $Zlo,8($nlo,$Htbl)
+       lg      $Zhi,0($nlo,$Htbl)
+
+       sllg    $nlo,$xi,4
+       nill    $xi,0xf0
+       sllg    $rem0,$Zlo,3
+       nill    $nlo,0xf0
+
+       srlg    $Zlo,$Zlo,4
+       ngr     $rem0,$x78
+       sllg    $tmp,$Zhi,60
+       xg      $Zlo,8($nhi,$Htbl)
+       srlg    $Zhi,$Zhi,4
+       xgr     $Zlo,$tmp
+       xg      $Zhi,0($nhi,$Htbl)
+       lgr     $nhi,$xi
+       sllg    $rem1,$Zlo,3
+
+.Lghash_inner:
+       srlg    $Zlo,$Zlo,4
+       ngr     $rem1,$x78
+       xg      $Zlo,8($nlo,$Htbl)
+       sllg    $tmp,$Zhi,60
+       xg      $Zhi,0($rem0,$rem_4bit)
+       xgr     $Zlo,$tmp
+       srlg    $Zhi,$Zhi,4
+       llgc    $xi,0($cnt,$Xi)
+       sllg    $rem0,$Zlo,3
+       xg      $Zhi,0($nlo,$Htbl)
+       sllg    $nlo,$xi,4
+       nill    $xi,0xf0
+       nill    $nlo,0xf0
+
+       srlg    $Zlo,$Zlo,4
+       ngr     $rem0,$x78
+       xg      $Zlo,8($nhi,$Htbl)
+       sllg    $tmp,$Zhi,60
+       xg      $Zhi,0($rem1,$rem_4bit)
+       xgr     $Zlo,$tmp
+       srlg    $Zhi,$Zhi,4
+       sllg    $rem1,$Zlo,3
+       xg      $Zhi,0($nhi,$Htbl)
+       lgr     $nhi,$xi
+       brct    $cnt,.Lghash_inner
+
+       srlg    $Zlo,$Zlo,4
+       ngr     $rem1,$x78
+       xg      $Zlo,8($nlo,$Htbl)
+       sllg    $tmp,$Zhi,60
+       xg      $Zhi,0($rem0,$rem_4bit)
+       xgr     $Zlo,$tmp
+       srlg    $Zhi,$Zhi,4
+       sllg    $rem0,$Zlo,3
+       xg      $Zhi,0($nlo,$Htbl)
+
+       srlg    $Zlo,$Zlo,4
+       ngr     $rem0,$x78
+       xg      $Zhi,0($rem1,$rem_4bit)
+       sllg    $tmp,$Zhi,60
+       xg      $Zlo,8($nhi,$Htbl)
+       srlg    $Zhi,$Zhi,4
+       xgr     $Zlo,$tmp
+       xg      $Zhi,0($nhi,$Htbl)
+
+       la      $inp,16($inp)
+       xg      $Zhi,0($rem0,$rem_4bit)
+       brctg   $len,.Louter
+
+       stg     $Zlo,8+1($Xi)
+       stg     $Zhi,0+1($Xi)
+       lmg     %r6,%r14,48($sp)
+       br      %r14
+.type  gcm_ghash_4bit,\@function
+.size  gcm_ghash_4bit,(.-gcm_ghash_4bit)
+
+.align 64
+rem_4bit:
+       .long   `0x0000<<16`,0,`0x1C20<<16`,0,`0x3840<<16`,0,`0x2460<<16`,0
+       .long   `0x7080<<16`,0,`0x6CA0<<16`,0,`0x48C0<<16`,0,`0x54E0<<16`,0
+       .long   `0xE100<<16`,0,`0xFD20<<16`,0,`0xD940<<16`,0,`0xC560<<16`,0
+       .long   `0x9180<<16`,0,`0x8DA0<<16`,0,`0xA9C0<<16`,0,`0xB5E0<<16`,0
+.type  rem_4bit,\@object
+.size  rem_4bit,(.-rem_4bit)
+.string        "GHASH for s390x, CRYPTOGAMS by <appro\@openssl.org>"
+___
+
+$code =~ s/\`([^\`]*)\`/eval $1/gem;
+print $code;
+close STDOUT;