GHASH assembler: new ghash-sparcv9.pl module and saner descriptions.
[openssl.git] / crypto / modes / asm / ghash-sparcv9.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 # March 2010
11 #
12 # The module implements "4-bit" GCM GHASH function and underlying
13 # single multiplication operation in GF(2^128). "4-bit" means that it
14 # uses 256 bytes per-key table [+128 bytes shared table]. Performance
15 # results are for streamed GHASH subroutine on UltraSPARC pre-Tx CPU
16 # and are expressed in cycles per processed byte, less is better:
17 #
18 #               gcc 3.3.x       cc 5.2          this assembler
19 #
20 # 32-bit build  81.0            48.6            11.8    (+586%/+311%)
21 # 64-bit build  27.5            20.3            11.8    (+133%/+72%)
22 #
23 # I don't quite understand why difference between 32-bit and 64-bit
24 # compiler-generated code is so big. Compilers *were* instructed to
25 # generate code for UltraSPARC and should have used 64-bit registers
26 # for Z vector (see C code) even in 32-bit build... Oh well, it only
27 # means more impressive improvement coefficients for this assembler
28 # module;-) Loops are aggressively modulo-scheduled in respect to
29 # references to input data and Z.hi updates to achieve 12 cycles
30 # timing. To anchor to something else, sha1-sparcv9.pl spends 11.6
31 # cycles to process one byte [on UltraSPARC pre-Tx CPU].
32
33 $bits=32;
34 for (@ARGV)     { $bits=64 if (/\-m64/ || /\-xarch\=v9/); }
35 if ($bits==64)  { $bias=2047; $frame=192; }
36 else            { $bias=0;    $frame=112; }
37
38 $output=shift;
39 open STDOUT,">$output";
40
41 $Zhi="%o0";     # 64-bit values
42 $Zlo="%o1";
43 $Thi="%o2";
44 $Tlo="%o3";
45 $rem="%o4";
46 $tmp="%o5";
47
48 $nhi="%l0";     # small values and pointers
49 $nlo="%l1";
50 $xi0="%l2";
51 $xi1="%l3";
52 $rem_4bit="%l4";
53 $remi="%l5";
54 $Htblo="%l6";
55 $cnt="%l7";
56
57 $inp="%i0";     # input arguments for gcm_ghash_4bit
58 $len="%i1";
59 $Xi="%i2";
60 $Htbl="%i3";
61
62 $code.=<<___;
63 .section        ".text",#alloc,#execinstr
64
65 .align  64
66 rem_4bit:
67         .long   `0x0000<<16`,0,`0x1C20<<16`,0,`0x3840<<16`,0,`0x2460<<16`,0
68         .long   `0x7080<<16`,0,`0x6CA0<<16`,0,`0x48C0<<16`,0,`0x54E0<<16`,0
69         .long   `0xE100<<16`,0,`0xFD20<<16`,0,`0xD940<<16`,0,`0xC560<<16`,0
70         .long   `0x9180<<16`,0,`0x8DA0<<16`,0,`0xA9C0<<16`,0,`0xB5E0<<16`,0
71 .type   rem_4bit,#object
72 .size   rem_4bit,(.-rem_4bit)
73
74 .globl  gcm_ghash_4bit
75 .align  32
76 gcm_ghash_4bit:
77         save    %sp,-$frame,%sp
78         ldub    [$inp+15],$nlo
79         ldub    [$Xi+15],$xi0
80         ldub    [$Xi+14],$xi1
81         add     $len,$inp,$len
82         add     $Htbl,8,$Htblo
83
84 1:      call    .+8
85         add     %o7,rem_4bit-1b,$rem_4bit
86
87 .Louter:
88         xor     $xi0,$nlo,$nlo
89         and     $nlo,0xf0,$nhi
90         and     $nlo,0x0f,$nlo
91         sll     $nlo,4,$nlo
92         ldx     [$Htblo+$nlo],$Zlo
93         ldx     [$Htbl+$nlo],$Zhi
94
95         ldub    [$inp+14],$nlo
96
97         ldx     [$Htblo+$nhi],$Tlo
98         and     $Zlo,0xf,$remi
99         ldx     [$Htbl+$nhi],$Thi
100         sll     $remi,3,$remi
101         ldx     [$rem_4bit+$remi],$rem
102         srlx    $Zlo,4,$Zlo
103         mov     13,$cnt
104         sllx    $Zhi,60,$tmp
105         xor     $Tlo,$Zlo,$Zlo
106         srlx    $Zhi,4,$Zhi
107         xor     $Zlo,$tmp,$Zlo
108
109         xor     $xi1,$nlo,$nlo
110         and     $Zlo,0xf,$remi
111         and     $nlo,0xf0,$nhi
112         and     $nlo,0x0f,$nlo
113         ba      .Lghash_inner
114         sll     $nlo,4,$nlo
115 .align  32
116 .Lghash_inner:
117         ldx     [$Htblo+$nlo],$Tlo
118         sll     $remi,3,$remi
119         xor     $Thi,$Zhi,$Zhi
120         ldx     [$Htbl+$nlo],$Thi
121         srlx    $Zlo,4,$Zlo
122         xor     $rem,$Zhi,$Zhi
123         ldx     [$rem_4bit+$remi],$rem
124         sllx    $Zhi,60,$tmp
125         xor     $Tlo,$Zlo,$Zlo
126         ldub    [$inp+$cnt],$nlo
127         srlx    $Zhi,4,$Zhi
128         xor     $Zlo,$tmp,$Zlo
129         ldub    [$Xi+$cnt],$xi1
130         xor     $Thi,$Zhi,$Zhi
131         and     $Zlo,0xf,$remi
132
133         ldx     [$Htblo+$nhi],$Tlo
134         sll     $remi,3,$remi
135         xor     $rem,$Zhi,$Zhi
136         ldx     [$Htbl+$nhi],$Thi
137         srlx    $Zlo,4,$Zlo
138         ldx     [$rem_4bit+$remi],$rem
139         sllx    $Zhi,60,$tmp
140         xor     $xi1,$nlo,$nlo
141         srlx    $Zhi,4,$Zhi
142         and     $nlo,0xf0,$nhi
143         addcc   $cnt,-1,$cnt
144         xor     $Zlo,$tmp,$Zlo
145         and     $nlo,0x0f,$nlo
146         xor     $Tlo,$Zlo,$Zlo
147         sll     $nlo,4,$nlo
148         blu     .Lghash_inner
149         and     $Zlo,0xf,$remi
150
151         ldx     [$Htblo+$nlo],$Tlo
152         sll     $remi,3,$remi
153         xor     $Thi,$Zhi,$Zhi
154         ldx     [$Htbl+$nlo],$Thi
155         srlx    $Zlo,4,$Zlo
156         xor     $rem,$Zhi,$Zhi
157         ldx     [$rem_4bit+$remi],$rem
158         sllx    $Zhi,60,$tmp
159         xor     $Tlo,$Zlo,$Zlo
160         srlx    $Zhi,4,$Zhi
161         xor     $Zlo,$tmp,$Zlo
162         xor     $Thi,$Zhi,$Zhi
163
164         add     $inp,16,$inp
165         cmp     $inp,$len
166         be,pn   `$bits==64?"%xcc":"%icc"`,.Ldone
167         and     $Zlo,0xf,$remi
168
169         ldx     [$Htblo+$nhi],$Tlo
170         sll     $remi,3,$remi
171         xor     $rem,$Zhi,$Zhi
172         ldx     [$Htbl+$nhi],$Thi
173         srlx    $Zlo,4,$Zlo
174         ldx     [$rem_4bit+$remi],$rem
175         sllx    $Zhi,60,$tmp
176         xor     $Tlo,$Zlo,$Zlo
177         ldub    [$inp+15],$nlo
178         srlx    $Zhi,4,$Zhi
179         xor     $Zlo,$tmp,$Zlo
180         xor     $Thi,$Zhi,$Zhi
181         stx     $Zlo,[$Xi+8]
182         xor     $rem,$Zhi,$Zhi
183         stx     $Zhi,[$Xi]
184         srl     $Zlo,8,$xi1
185         and     $Zlo,0xff,$xi0
186         ba      .Louter
187         and     $xi1,0xff,$xi1
188 .align  32
189 .Ldone:
190         ldx     [$Htblo+$nhi],$Tlo
191         sll     $remi,3,$remi
192         xor     $rem,$Zhi,$Zhi
193         ldx     [$Htbl+$nhi],$Thi
194         srlx    $Zlo,4,$Zlo
195         ldx     [$rem_4bit+$remi],$rem
196         sllx    $Zhi,60,$tmp
197         xor     $Tlo,$Zlo,$Zlo
198         srlx    $Zhi,4,$Zhi
199         xor     $Zlo,$tmp,$Zlo
200         xor     $Thi,$Zhi,$Zhi
201         stx     $Zlo,[$Xi+8]
202         xor     $rem,$Zhi,$Zhi
203         stx     $Zhi,[$Xi]
204
205         ret
206         restore
207 .type   gcm_ghash_4bit,#function
208 .size   gcm_ghash_4bit,(.-gcm_ghash_4bit)
209 ___
210
211 $Xi="%i0";      # input arguments for gcm_gmult_4bit
212 $Htbl="%i1";
213 undef $inp;
214 undef $len;
215
216 $code.=<<___;
217 .globl  gcm_gmult_4bit
218 .align  32
219 gcm_gmult_4bit:
220         save    %sp,-$frame,%sp
221         ldub    [$Xi+15],$nlo
222         add     $Htbl,8,$Htblo
223
224 1:      call    .+8
225         add     %o7,rem_4bit-1b,$rem_4bit
226
227         and     $nlo,0xf0,$nhi
228         and     $nlo,0x0f,$nlo
229         sll     $nlo,4,$nlo
230         ldx     [$Htblo+$nlo],$Zlo
231         ldx     [$Htbl+$nlo],$Zhi
232
233         ldub    [$Xi+14],$nlo
234
235         ldx     [$Htblo+$nhi],$Tlo
236         and     $Zlo,0xf,$remi
237         ldx     [$Htbl+$nhi],$Thi
238         sll     $remi,3,$remi
239         ldx     [$rem_4bit+$remi],$rem
240         srlx    $Zlo,4,$Zlo
241         mov     13,$cnt
242         sllx    $Zhi,60,$tmp
243         xor     $Tlo,$Zlo,$Zlo
244         srlx    $Zhi,4,$Zhi
245         xor     $Zlo,$tmp,$Zlo
246
247         and     $Zlo,0xf,$remi
248         and     $nlo,0xf0,$nhi
249         and     $nlo,0x0f,$nlo
250         ba      .Lgmult_inner
251         sll     $nlo,4,$nlo
252 .align  32
253 .Lgmult_inner:
254         ldx     [$Htblo+$nlo],$Tlo
255         sll     $remi,3,$remi
256         xor     $Thi,$Zhi,$Zhi
257         ldx     [$Htbl+$nlo],$Thi
258         srlx    $Zlo,4,$Zlo
259         xor     $rem,$Zhi,$Zhi
260         ldx     [$rem_4bit+$remi],$rem
261         sllx    $Zhi,60,$tmp
262         xor     $Tlo,$Zlo,$Zlo
263         ldub    [$Xi+$cnt],$nlo
264         srlx    $Zhi,4,$Zhi
265         xor     $Zlo,$tmp,$Zlo
266         xor     $Thi,$Zhi,$Zhi
267         and     $Zlo,0xf,$remi
268
269         ldx     [$Htblo+$nhi],$Tlo
270         sll     $remi,3,$remi
271         xor     $rem,$Zhi,$Zhi
272         ldx     [$Htbl+$nhi],$Thi
273         srlx    $Zlo,4,$Zlo
274         ldx     [$rem_4bit+$remi],$rem
275         sllx    $Zhi,60,$tmp
276         srlx    $Zhi,4,$Zhi
277         and     $nlo,0xf0,$nhi
278         addcc   $cnt,-1,$cnt
279         xor     $Zlo,$tmp,$Zlo
280         and     $nlo,0x0f,$nlo
281         xor     $Tlo,$Zlo,$Zlo
282         sll     $nlo,4,$nlo
283         blu     .Lgmult_inner
284         and     $Zlo,0xf,$remi
285
286         ldx     [$Htblo+$nlo],$Tlo
287         sll     $remi,3,$remi
288         xor     $Thi,$Zhi,$Zhi
289         ldx     [$Htbl+$nlo],$Thi
290         srlx    $Zlo,4,$Zlo
291         xor     $rem,$Zhi,$Zhi
292         ldx     [$rem_4bit+$remi],$rem
293         sllx    $Zhi,60,$tmp
294         xor     $Tlo,$Zlo,$Zlo
295         srlx    $Zhi,4,$Zhi
296         xor     $Zlo,$tmp,$Zlo
297         xor     $Thi,$Zhi,$Zhi
298         and     $Zlo,0xf,$remi
299
300         ldx     [$Htblo+$nhi],$Tlo
301         sll     $remi,3,$remi
302         xor     $rem,$Zhi,$Zhi
303         ldx     [$Htbl+$nhi],$Thi
304         srlx    $Zlo,4,$Zlo
305         ldx     [$rem_4bit+$remi],$rem
306         sllx    $Zhi,60,$tmp
307         xor     $Tlo,$Zlo,$Zlo
308         srlx    $Zhi,4,$Zhi
309         xor     $Zlo,$tmp,$Zlo
310         xor     $Thi,$Zhi,$Zhi
311         stx     $Zlo,[$Xi+8]
312         xor     $rem,$Zhi,$Zhi
313         stx     $Zhi,[$Xi]
314
315         ret
316         restore
317 .type   gcm_gmult_4bit,#function
318 .size   gcm_gmult_4bit,(.-gcm_gmult_4bit)
319 .asciz  "GHASH for SPARCv9, CRYPTOGAMS by <appro\@openssl.org>"
320 ___
321
322 $code =~ s/\`([^\`]*)\`/eval $1/gem;
323 print $code;
324 close STDOUT;