Add ghash-s390x.pl.
[openssl.git] / crypto / modes / asm / ghash-s390x.pl
1 #!/usr/bin/env perl
2
3 # ====================================================================
4 # Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
5 # project. The module is, however, dual licensed under OpenSSL and
6 # CRYPTOGAMS licenses depending on where you obtain it. For further
7 # details see http://www.openssl.org/~appro/cryptogams/.
8 # ====================================================================
9
10 # September 2010.
11
12 while (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {}
13 open STDOUT,">$output";
14
15 $Zhi="%r0";
16 $Zlo="%r1";
17
18 $Xi="%r2";      # argument block
19 $Htbl="%r3";
20 $inp="%r4";
21 $len="%r5";
22
23 $rem0="%r6";    # variables
24 $rem1="%r7";
25 $nlo="%r8";
26 $nhi="%r9";
27 $xi="%r10";
28 $cnt="%r11";
29 $tmp="%r12";
30 $x78="%r13";
31 $rem_4bit="%r14";
32
33 $sp="%r15";
34
35 $code.=<<___;
36 .text
37
38 .globl  gcm_gmult_4bit
39 .align  32
40 gcm_gmult_4bit:
41         stmg    %r6,%r14,48($sp)
42
43         aghi    $Xi,-1
44         lghi    $len,1
45         lghi    $x78,`0xf<<3`
46         larl    $rem_4bit,rem_4bit
47
48         lg      $Zlo,8+1($Xi)           # Xi
49         j       .Lgmult_shortcut
50 .type   gcm_gmult_4bit,\@function
51 .size   gcm_gmult_4bit,(.-gcm_gmult_4bit)
52
53 .globl  gcm_ghash_4bit
54 .align  32
55 gcm_ghash_4bit:
56         stmg    %r6,%r14,48($sp)
57
58         aghi    $Xi,-1
59         srlg    $len,$len,4
60         lghi    $x78,`0xf<<3`
61         larl    $rem_4bit,rem_4bit
62
63         lg      $Zlo,8+1($Xi)           # Xi
64         lg      $Zhi,0+1($Xi)
65 .Louter:
66         xg      $Zlo,8($inp)            # Xi ^= inp 
67         xg      $Zhi,0($inp)
68         stg     $Zlo,8+1($Xi)
69         stg     $Zhi,0+1($Xi)
70
71 .Lgmult_shortcut:
72         lghi    $tmp,0xff
73         srlg    $xi,$Zlo,8              # extract first two bytes
74         lgr     $nhi,$Zlo
75         ngr     $xi,$tmp
76         ngr     $nhi,$tmp
77
78         sllg    $nlo,$nhi,4
79         nill    $nhi,0xf0
80         nill    $nlo,0xf0
81         lghi    $cnt,14
82
83         lg      $Zlo,8($nlo,$Htbl)
84         lg      $Zhi,0($nlo,$Htbl)
85
86         sllg    $nlo,$xi,4
87         nill    $xi,0xf0
88         sllg    $rem0,$Zlo,3
89         nill    $nlo,0xf0
90
91         srlg    $Zlo,$Zlo,4
92         ngr     $rem0,$x78
93         sllg    $tmp,$Zhi,60
94         xg      $Zlo,8($nhi,$Htbl)
95         srlg    $Zhi,$Zhi,4
96         xgr     $Zlo,$tmp
97         xg      $Zhi,0($nhi,$Htbl)
98         lgr     $nhi,$xi
99         sllg    $rem1,$Zlo,3
100
101 .Lghash_inner:
102         srlg    $Zlo,$Zlo,4
103         ngr     $rem1,$x78
104         xg      $Zlo,8($nlo,$Htbl)
105         sllg    $tmp,$Zhi,60
106         xg      $Zhi,0($rem0,$rem_4bit)
107         xgr     $Zlo,$tmp
108         srlg    $Zhi,$Zhi,4
109         llgc    $xi,0($cnt,$Xi)
110         sllg    $rem0,$Zlo,3
111         xg      $Zhi,0($nlo,$Htbl)
112         sllg    $nlo,$xi,4
113         nill    $xi,0xf0
114         nill    $nlo,0xf0
115
116         srlg    $Zlo,$Zlo,4
117         ngr     $rem0,$x78
118         xg      $Zlo,8($nhi,$Htbl)
119         sllg    $tmp,$Zhi,60
120         xg      $Zhi,0($rem1,$rem_4bit)
121         xgr     $Zlo,$tmp
122         srlg    $Zhi,$Zhi,4
123         sllg    $rem1,$Zlo,3
124         xg      $Zhi,0($nhi,$Htbl)
125         lgr     $nhi,$xi
126         brct    $cnt,.Lghash_inner
127
128         srlg    $Zlo,$Zlo,4
129         ngr     $rem1,$x78
130         xg      $Zlo,8($nlo,$Htbl)
131         sllg    $tmp,$Zhi,60
132         xg      $Zhi,0($rem0,$rem_4bit)
133         xgr     $Zlo,$tmp
134         srlg    $Zhi,$Zhi,4
135         sllg    $rem0,$Zlo,3
136         xg      $Zhi,0($nlo,$Htbl)
137
138         srlg    $Zlo,$Zlo,4
139         ngr     $rem0,$x78
140         xg      $Zhi,0($rem1,$rem_4bit)
141         sllg    $tmp,$Zhi,60
142         xg      $Zlo,8($nhi,$Htbl)
143         srlg    $Zhi,$Zhi,4
144         xgr     $Zlo,$tmp
145         xg      $Zhi,0($nhi,$Htbl)
146
147         la      $inp,16($inp)
148         xg      $Zhi,0($rem0,$rem_4bit)
149         brctg   $len,.Louter
150
151         stg     $Zlo,8+1($Xi)
152         stg     $Zhi,0+1($Xi)
153         lmg     %r6,%r14,48($sp)
154         br      %r14
155 .type   gcm_ghash_4bit,\@function
156 .size   gcm_ghash_4bit,(.-gcm_ghash_4bit)
157
158 .align  64
159 rem_4bit:
160         .long   `0x0000<<16`,0,`0x1C20<<16`,0,`0x3840<<16`,0,`0x2460<<16`,0
161         .long   `0x7080<<16`,0,`0x6CA0<<16`,0,`0x48C0<<16`,0,`0x54E0<<16`,0
162         .long   `0xE100<<16`,0,`0xFD20<<16`,0,`0xD940<<16`,0,`0xC560<<16`,0
163         .long   `0x9180<<16`,0,`0x8DA0<<16`,0,`0xA9C0<<16`,0,`0xB5E0<<16`,0
164 .type   rem_4bit,\@object
165 .size   rem_4bit,(.-rem_4bit)
166 .string "GHASH for s390x, CRYPTOGAMS by <appro\@openssl.org>"
167 ___
168
169 $code =~ s/\`([^\`]*)\`/eval $1/gem;
170 print $code;
171 close STDOUT;