f47c85eb1f496a21015886758ee72c65b26b8165
[openssl.git] / crypto / modes / asm / ghash-alpha.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]. Even though
15 # loops are aggressively modulo-scheduled in respect to references to
16 # Htbl and Z.hi updates for 8 cycles per byte, measured performance is
17 # ~12 cycles per processed byte on 21264 CPU. It seems to be a dynamic
18 # scheduling "glitch," because uprofile(1) indicates uniform sample
19 # distribution, as if all instruction bundles execute in 1.5 cycles.
20 # Meaning that it could have been even faster, yet 12 cycles is ~60%
21 # better than gcc-generated code and ~80% than code generated by vendor
22 # compiler.
23
24 $cnt="v0";      # $0
25 $t0="t0";
26 $t1="t1";
27 $t2="t2";
28 $Thi0="t3";     # $4
29 $Tlo0="t4";
30 $Thi1="t5";
31 $Tlo1="t6";
32 $rem="t7";      # $8
33 #################
34 $Xi="a0";       # $16, input argument block
35 $Htbl="a1";
36 $inp="a2";
37 $len="a3";
38 $nlo="a4";      # $20
39 $nhi="a5";
40 $Zhi="t8";
41 $Zlo="t9";
42 $Xhi="t10";     # $24
43 $Xlo="t11";
44 $remp="t12";
45 $rem_4bit="AT"; # $28
46
47 { my $N;
48   sub loop() {
49
50         $N++;
51 $code.=<<___;
52 .align  4
53         extbl   $Xlo,7,$nlo
54         and     $nlo,0xf0,$nhi
55         sll     $nlo,4,$nlo
56         and     $nlo,0xf0,$nlo
57
58         addq    $nlo,$Htbl,$nlo
59         ldq     $Zlo,8($nlo)
60         addq    $nhi,$Htbl,$nhi
61         ldq     $Zhi,0($nlo)
62
63         and     $Zlo,0x0f,$remp
64         sll     $Zhi,60,$t0
65         lda     $cnt,6(zero)
66         extbl   $Xlo,6,$nlo
67
68         ldq     $Tlo1,8($nhi)
69         s8addq  $remp,$rem_4bit,$remp
70         ldq     $Thi1,0($nhi)
71         srl     $Zlo,4,$Zlo
72
73         ldq     $rem,0($remp)
74         srl     $Zhi,4,$Zhi
75         xor     $t0,$Zlo,$Zlo
76         and     $nlo,0xf0,$nhi
77
78         xor     $Tlo1,$Zlo,$Zlo
79         sll     $nlo,4,$nlo
80         xor     $Thi1,$Zhi,$Zhi
81         and     $nlo,0xf0,$nlo
82
83         addq    $nlo,$Htbl,$nlo
84         ldq     $Tlo0,8($nlo)
85         addq    $nhi,$Htbl,$nhi
86         ldq     $Thi0,0($nlo)
87
88 .Looplo$N:
89         and     $Zlo,0x0f,$remp
90         sll     $Zhi,60,$t0
91         subq    $cnt,1,$cnt
92         srl     $Zlo,4,$Zlo
93
94         ldq     $Tlo1,8($nhi)
95         xor     $rem,$Zhi,$Zhi
96         ldq     $Thi1,0($nhi)
97         s8addq  $remp,$rem_4bit,$remp
98
99         ldq     $rem,0($remp)
100         srl     $Zhi,4,$Zhi
101         xor     $t0,$Zlo,$Zlo
102         extbl   $Xlo,$cnt,$nlo
103
104         and     $nlo,0xf0,$nhi
105         xor     $Thi0,$Zhi,$Zhi
106         xor     $Tlo0,$Zlo,$Zlo
107         sll     $nlo,4,$nlo
108
109
110         and     $Zlo,0x0f,$remp
111         sll     $Zhi,60,$t0
112         and     $nlo,0xf0,$nlo
113         srl     $Zlo,4,$Zlo
114
115         s8addq  $remp,$rem_4bit,$remp
116         xor     $rem,$Zhi,$Zhi
117         addq    $nlo,$Htbl,$nlo
118         addq    $nhi,$Htbl,$nhi
119
120         ldq     $rem,0($remp)
121         srl     $Zhi,4,$Zhi
122         ldq     $Tlo0,8($nlo)
123         xor     $t0,$Zlo,$Zlo
124
125         xor     $Tlo1,$Zlo,$Zlo
126         xor     $Thi1,$Zhi,$Zhi
127         ldq     $Thi0,0($nlo)
128         bne     $cnt,.Looplo$N
129
130
131         and     $Zlo,0x0f,$remp
132         sll     $Zhi,60,$t0
133         lda     $cnt,7(zero)
134         srl     $Zlo,4,$Zlo
135
136         ldq     $Tlo1,8($nhi)
137         xor     $rem,$Zhi,$Zhi
138         ldq     $Thi1,0($nhi)
139         s8addq  $remp,$rem_4bit,$remp
140
141         ldq     $rem,0($remp)
142         srl     $Zhi,4,$Zhi
143         xor     $t0,$Zlo,$Zlo
144         extbl   $Xhi,$cnt,$nlo
145
146         and     $nlo,0xf0,$nhi
147         xor     $Thi0,$Zhi,$Zhi
148         xor     $Tlo0,$Zlo,$Zlo
149         sll     $nlo,4,$nlo
150
151         and     $Zlo,0x0f,$remp
152         sll     $Zhi,60,$t0
153         and     $nlo,0xf0,$nlo
154         srl     $Zlo,4,$Zlo
155
156         s8addq  $remp,$rem_4bit,$remp
157         xor     $rem,$Zhi,$Zhi
158         addq    $nlo,$Htbl,$nlo
159         addq    $nhi,$Htbl,$nhi
160
161         ldq     $rem,0($remp)
162         srl     $Zhi,4,$Zhi
163         ldq     $Tlo0,8($nlo)
164         xor     $t0,$Zlo,$Zlo
165
166         xor     $Tlo1,$Zlo,$Zlo
167         xor     $Thi1,$Zhi,$Zhi
168         ldq     $Thi0,0($nlo)
169         unop
170
171
172 .Loophi$N:
173         and     $Zlo,0x0f,$remp
174         sll     $Zhi,60,$t0
175         subq    $cnt,1,$cnt
176         srl     $Zlo,4,$Zlo
177
178         ldq     $Tlo1,8($nhi)
179         xor     $rem,$Zhi,$Zhi
180         ldq     $Thi1,0($nhi)
181         s8addq  $remp,$rem_4bit,$remp
182
183         ldq     $rem,0($remp)
184         srl     $Zhi,4,$Zhi
185         xor     $t0,$Zlo,$Zlo
186         extbl   $Xhi,$cnt,$nlo
187
188         and     $nlo,0xf0,$nhi
189         xor     $Thi0,$Zhi,$Zhi
190         xor     $Tlo0,$Zlo,$Zlo
191         sll     $nlo,4,$nlo
192
193
194         and     $Zlo,0x0f,$remp
195         sll     $Zhi,60,$t0
196         and     $nlo,0xf0,$nlo
197         srl     $Zlo,4,$Zlo
198
199         s8addq  $remp,$rem_4bit,$remp
200         xor     $rem,$Zhi,$Zhi
201         addq    $nlo,$Htbl,$nlo
202         addq    $nhi,$Htbl,$nhi
203
204         ldq     $rem,0($remp)
205         srl     $Zhi,4,$Zhi
206         ldq     $Tlo0,8($nlo)
207         xor     $t0,$Zlo,$Zlo
208
209         xor     $Tlo1,$Zlo,$Zlo
210         xor     $Thi1,$Zhi,$Zhi
211         ldq     $Thi0,0($nlo)
212         bne     $cnt,.Loophi$N
213
214
215         and     $Zlo,0x0f,$remp
216         sll     $Zhi,60,$t0
217         srl     $Zlo,4,$Zlo
218
219         ldq     $Tlo1,8($nhi)
220         xor     $rem,$Zhi,$Zhi
221         ldq     $Thi1,0($nhi)
222         s8addq  $remp,$rem_4bit,$remp
223
224         ldq     $rem,0($remp)
225         srl     $Zhi,4,$Zhi
226         xor     $t0,$Zlo,$Zlo
227
228         xor     $Tlo0,$Zlo,$Zlo
229         xor     $Thi0,$Zhi,$Zhi
230
231         and     $Zlo,0x0f,$remp
232         sll     $Zhi,60,$t0
233         srl     $Zlo,4,$Zlo
234
235         s8addq  $remp,$rem_4bit,$remp
236         xor     $rem,$Zhi,$Zhi
237
238         ldq     $rem,0($remp)
239         srl     $Zhi,4,$Zhi
240         xor     $Tlo1,$Zlo,$Zlo
241         xor     $Thi1,$Zhi,$Zhi
242         xor     $t0,$Zlo,$Zlo
243         xor     $rem,$Zhi,$Zhi
244 ___
245 }}
246
247 $code=<<___;
248 #ifdef __linux__
249 #include <asm/regdef.h>
250 #else
251 #include <asm.h>
252 #include <regdef.h>
253 #endif
254
255 .text
256
257 .align  4
258 rem_4bit:
259         .quad   0x0000<<48, 0x1C20<<48, 0x3840<<48, 0x2460<<48
260         .quad   0x7080<<48, 0x6CA0<<48, 0x48C0<<48, 0x54E0<<48
261         .quad   0xE100<<48, 0xFD20<<48, 0xD940<<48, 0xC560<<48
262         .quad   0x9180<<48, 0x8DA0<<48, 0xA9C0<<48, 0xB5E0<<48
263 .ascii  "GHASH for Alpha, CRYPTOGAMS by <appro\@openssl.org>"
264 .align  4
265
266 .set    noat
267 .set    noreorder
268 .globl  gcm_gmult_4bit
269 .align  4
270 .ent    gcm_gmult_4bit
271 gcm_gmult_4bit:
272         .frame  sp,0,ra
273         .prologue 0
274
275         ldq     $Xlo,8($Xi)
276         ldq     $Xhi,0($Xi)
277
278         br      $rem_4bit,.Lpic1
279 .Lpic1: lda     $rem_4bit,.Lpic1-rem_4bit($rem_4bit)
280 ___
281
282         &loop();
283
284 $code.=<<___;
285         srl     $Zlo,24,$t0     # byte swap
286         srl     $Zlo,8,$t1
287
288         sll     $Zlo,8,$t2
289         sll     $Zlo,24,$Zlo
290         zapnot  $t0,0x11,$t0
291         zapnot  $t1,0x22,$t1
292
293         zapnot  $Zlo,0x88,$Zlo
294         or      $t0,$t1,$t0
295         zapnot  $t2,0x44,$t2
296
297         or      $Zlo,$t0,$Zlo
298         srl     $Zhi,24,$t0
299         srl     $Zhi,8,$t1
300
301         or      $Zlo,$t2,$Zlo
302         sll     $Zhi,8,$t2
303         sll     $Zhi,24,$Zhi
304
305         srl     $Zlo,32,$Xlo
306         sll     $Zlo,32,$Zlo
307
308         zapnot  $t0,0x11,$t0
309         zapnot  $t1,0x22,$t1
310         or      $Zlo,$Xlo,$Xlo
311
312         zapnot  $Zhi,0x88,$Zhi
313         or      $t0,$t1,$t0
314         zapnot  $t2,0x44,$t2
315
316         or      $Zhi,$t0,$Zhi
317         or      $Zhi,$t2,$Zhi
318
319         srl     $Zhi,32,$Xhi
320         sll     $Zhi,32,$Zhi
321
322         or      $Zhi,$Xhi,$Xhi
323         stq     $Xlo,8($Xi)
324         stq     $Xhi,0($Xi)
325
326         ret     (ra)
327 .end    gcm_gmult_4bit
328 ___
329
330 $inhi="s0";
331 $inlo="s1";
332
333 $code.=<<___;
334 .globl  gcm_ghash_4bit
335 .align  4
336 .ent    gcm_ghash_4bit
337 gcm_ghash_4bit:
338         lda     sp,-32(sp)
339         stq     ra,0(sp)
340         stq     s0,8(sp)
341         stq     s1,16(sp)
342         .mask   0x04000600,-32
343         .frame  sp,32,ra
344         .prologue 0
345
346         ldq_u   $inhi,0($inp)
347         ldq_u   $Thi0,7($inp)
348         ldq_u   $inlo,8($inp)
349         ldq_u   $Tlo0,15($inp)
350         ldq     $Xhi,0($Xi)
351         ldq     $Xlo,8($Xi)
352
353         br      $rem_4bit,.Lpic2
354 .Lpic2: lda     $rem_4bit,.Lpic2-rem_4bit($rem_4bit)
355
356 .Louter:
357         extql   $inhi,$inp,$inhi
358         extqh   $Thi0,$inp,$Thi0
359         or      $inhi,$Thi0,$inhi
360         lda     $inp,16($inp)
361
362         extql   $inlo,$inp,$inlo
363         extqh   $Tlo0,$inp,$Tlo0
364         or      $inlo,$Tlo0,$inlo
365         subq    $len,16,$len
366
367         xor     $Xlo,$inlo,$Xlo
368         xor     $Xhi,$inhi,$Xhi
369 ___
370
371         &loop();
372
373 $code.=<<___;
374         srl     $Zlo,24,$t0     # byte swap
375         srl     $Zlo,8,$t1
376
377         sll     $Zlo,8,$t2
378         sll     $Zlo,24,$Zlo
379         zapnot  $t0,0x11,$t0
380         zapnot  $t1,0x22,$t1
381
382         zapnot  $Zlo,0x88,$Zlo
383         or      $t0,$t1,$t0
384         zapnot  $t2,0x44,$t2
385
386         or      $Zlo,$t0,$Zlo
387         srl     $Zhi,24,$t0
388         srl     $Zhi,8,$t1
389
390         or      $Zlo,$t2,$Zlo
391         sll     $Zhi,8,$t2
392         sll     $Zhi,24,$Zhi
393
394         srl     $Zlo,32,$Xlo
395         sll     $Zlo,32,$Zlo
396         beq     $len,.Ldone
397
398         zapnot  $t0,0x11,$t0
399         zapnot  $t1,0x22,$t1
400         or      $Zlo,$Xlo,$Xlo
401         ldq_u   $inhi,0($inp)
402
403         zapnot  $Zhi,0x88,$Zhi
404         or      $t0,$t1,$t0
405         zapnot  $t2,0x44,$t2
406         ldq_u   $Thi0,7($inp)
407
408         or      $Zhi,$t0,$Zhi
409         or      $Zhi,$t2,$Zhi
410         ldq_u   $inlo,8($inp)
411         ldq_u   $Tlo0,15($inp)
412
413         srl     $Zhi,32,$Xhi
414         sll     $Zhi,32,$Zhi
415
416         or      $Zhi,$Xhi,$Xhi
417         br      zero,.Louter
418
419 .Ldone:
420         zapnot  $t0,0x11,$t0
421         zapnot  $t1,0x22,$t1
422         or      $Zlo,$Xlo,$Xlo
423
424         zapnot  $Zhi,0x88,$Zhi
425         or      $t0,$t1,$t0
426         zapnot  $t2,0x44,$t2
427
428         or      $Zhi,$t0,$Zhi
429         or      $Zhi,$t2,$Zhi
430
431         srl     $Zhi,32,$Xhi
432         sll     $Zhi,32,$Zhi
433
434         or      $Zhi,$Xhi,$Xhi
435
436         stq     $Xlo,8($Xi)
437         stq     $Xhi,0($Xi)
438
439         .set    noreorder
440         /*ldq   ra,0(sp)*/
441         ldq     s0,8(sp)
442         ldq     s1,16(sp)
443         lda     sp,32(sp)
444         ret     (ra)
445 .end    gcm_ghash_4bit
446 ___
447 $output=shift and open STDOUT,">$output";
448 print $code;
449 close STDOUT;
450