SHA1 assembler show off: minor performance updates and new modules for
[openssl.git] / crypto / sha / asm / sha1-alpha.pl
1 #!/usr/bin/env perl
2
3 # ====================================================================
4 # Written by Andy Polyakov <appro@fy.chalmers.se> 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 # SHA1 block procedure for Alpha.
11
12 # On 21264 performance is 33% better than code generated by vendor
13 # compiler, and 75% better than GCC [3.4]. Implementation features
14 # vectorized byte swap, but not Xupdate.
15
16 @X=(    "\$0",  "\$1",  "\$2",  "\$3",  "\$4",  "\$5",  "\$6",  "\$7",
17         "\$8",  "\$9",  "\$10", "\$11", "\$12", "\$13", "\$14", "\$15");
18 $ctx="a0";      # $16
19 $inp="a1";
20 $num="a2";
21 $A="a3";
22 $B="a4";        # 20
23 $C="a5";
24 $D="t8";
25 $E="t9";        @V=($A,$B,$C,$D,$E);
26 $t0="t10";      # 24
27 $t1="t11";
28 $t2="ra";
29 $t3="t12";
30 $K="AT";        # 28
31
32 sub BODY_00_19 {
33 my ($i,$a,$b,$c,$d,$e)=@_;
34 my $j=$i+1;
35 $code.=<<___ if ($i==0);
36         ldq_u   @X[0],0+0($inp)
37         ldq_u   @X[1],0+7($inp)
38 ___
39 $code.=<<___ if (!($i&1) && $i<14);
40         ldq_u   @X[$i+2],($i+2)*4+0($inp)
41         ldq_u   @X[$i+3],($i+2)*4+7($inp)
42 ___
43 $code.=<<___ if (!($i&1) && $i<15);
44         extql   @X[$i],$inp,@X[$i]
45         extqh   @X[$i+1],$inp,@X[$i+1]
46
47         or      @X[$i+1],@X[$i],@X[$i]  # pair of 32-bit values are fetched
48
49         srl     @X[$i],24,$t0           # vectorized byte swap
50         srl     @X[$i],8,$t2
51
52         sll     @X[$i],8,$t3
53         sll     @X[$i],24,@X[$i]
54         zapnot  $t0,0x11,$t0
55         zapnot  $t2,0x22,$t2
56
57         zapnot  @X[$i],0x88,@X[$i]
58         or      $t0,$t2,$t0
59         zapnot  $t3,0x44,$t3
60         sll     $a,5,$t1
61
62         or      @X[$i],$t0,@X[$i]
63         addl    $K,$e,$e
64         and     $b,$c,$t2
65         zapnot  $a,0xf,$a
66
67         or      @X[$i],$t3,@X[$i]
68         srl     $a,27,$t0
69         bic     $d,$b,$t3
70         sll     $b,30,$b
71
72         extll   @X[$i],4,@X[$i+1]       # extract upper half
73         or      $t2,$t3,$t2
74         addl    @X[$i],$e,$e
75
76         addl    $t1,$e,$e
77         srl     $b,32,$t3
78         zapnot  @X[$i],0xf,@X[$i]
79
80         addl    $t0,$e,$e
81         addl    $t2,$e,$e
82         or      $t3,$b,$b
83 ___
84 $code.=<<___ if (($i&1) && $i<15);
85         sll     $a,5,$t1
86         addl    $K,$e,$e
87         and     $b,$c,$t2
88         zapnot  $a,0xf,$a
89
90         srl     $a,27,$t0
91         addl    @X[$i%16],$e,$e
92         bic     $d,$b,$t3
93         sll     $b,30,$b
94
95         or      $t2,$t3,$t2
96         addl    $t1,$e,$e
97         srl     $b,32,$t3
98         zapnot  @X[$i],0xf,@X[$i]
99
100         addl    $t0,$e,$e
101         addl    $t2,$e,$e
102         or      $t3,$b,$b
103 ___
104 $code.=<<___ if ($i>=15);       # with forward Xupdate
105         sll     $a,5,$t1
106         addl    $K,$e,$e
107         and     $b,$c,$t2
108         xor     @X[($j+2)%16],@X[$j%16],@X[$j%16]
109
110         zapnot  $a,0xf,$a
111         addl    @X[$i%16],$e,$e
112         bic     $d,$b,$t3
113         xor     @X[($j+8)%16],@X[$j%16],@X[$j%16]
114
115         srl     $a,27,$t0
116         addl    $t1,$e,$e
117         or      $t2,$t3,$t2
118         xor     @X[($j+13)%16],@X[$j%16],@X[$j%16]
119
120         sll     $b,30,$b
121         addl    $t0,$e,$e
122         srl     @X[$j%16],31,$t1
123
124         addl    $t2,$e,$e
125         srl     $b,32,$t3
126         addl    @X[$j%16],@X[$j%16],@X[$j%16]
127
128         or      $t3,$b,$b
129         zapnot  @X[$i%16],0xf,@X[$i%16]
130         or      $t1,@X[$j%16],@X[$j%16]
131 ___
132 }
133
134 sub BODY_20_39 {
135 my ($i,$a,$b,$c,$d,$e)=@_;
136 my $j=$i+1;
137 $code.=<<___ if ($i<79);        # with forward Xupdate
138         sll     $a,5,$t1
139         addl    $K,$e,$e
140         zapnot  $a,0xf,$a
141         xor     @X[($j+2)%16],@X[$j%16],@X[$j%16]
142
143         sll     $b,30,$t3
144         addl    $t1,$e,$e
145         xor     $b,$c,$t2
146         xor     @X[($j+8)%16],@X[$j%16],@X[$j%16]
147
148         srl     $b,2,$b
149         addl    @X[$i%16],$e,$e
150         xor     $d,$t2,$t2
151         xor     @X[($j+13)%16],@X[$j%16],@X[$j%16]
152
153         srl     @X[$j%16],31,$t1
154         addl    $t2,$e,$e
155         srl     $a,27,$t0
156         addl    @X[$j%16],@X[$j%16],@X[$j%16]
157
158         or      $t3,$b,$b
159         addl    $t0,$e,$e
160         or      $t1,@X[$j%16],@X[$j%16]
161 ___
162 $code.=<<___ if ($i<77);
163         zapnot  @X[$i%16],0xf,@X[$i%16]
164 ___
165 $code.=<<___ if ($i==79);       # with context fetch
166         sll     $a,5,$t1
167         addl    $K,$e,$e
168         zapnot  $a,0xf,$a
169         ldl     @X[0],0($ctx)
170
171         sll     $b,30,$t3
172         addl    $t1,$e,$e
173         xor     $b,$c,$t2
174         ldl     @X[1],4($ctx)
175
176         srl     $b,2,$b
177         addl    @X[$i%16],$e,$e
178         xor     $d,$t2,$t2
179         ldl     @X[2],8($ctx)
180
181         srl     $a,27,$t0
182         addl    $t2,$e,$e
183         ldl     @X[3],12($ctx)
184
185         or      $t3,$b,$b
186         addl    $t0,$e,$e
187         ldl     @X[4],16($ctx)
188 ___
189 }
190
191 sub BODY_40_59 {
192 my ($i,$a,$b,$c,$d,$e)=@_;
193 my $j=$i+1;
194 $code.=<<___;   # with forward Xupdate
195         sll     $a,5,$t1
196         addl    $K,$e,$e
197         zapnot  $a,0xf,$a
198         xor     @X[($j+2)%16],@X[$j%16],@X[$j%16]
199
200         srl     $a,27,$t0
201         and     $b,$c,$t2
202         and     $b,$d,$t3
203         xor     @X[($j+8)%16],@X[$j%16],@X[$j%16]
204
205         sll     $b,30,$b
206         addl    $t1,$e,$e
207         xor     @X[($j+13)%16],@X[$j%16],@X[$j%16]
208
209         srl     @X[$j%16],31,$t1
210         addl    $t0,$e,$e
211         or      $t2,$t3,$t2
212         and     $c,$d,$t3
213
214         or      $t2,$t3,$t2
215         srl     $b,32,$t3
216         addl    @X[$i%16],$e,$e
217         addl    @X[$j%16],@X[$j%16],@X[$j%16]
218
219         or      $t3,$b,$b
220         addl    $t2,$e,$e
221         or      $t1,@X[$j%16],@X[$j%16]
222         zapnot  @X[$i%16],0xf,@X[$i%16]
223 ___
224 }
225
226 $code=<<___;
227 #include <asm.h>
228 #include <regdef.h>
229
230 .text
231
232 .set    noat
233 .set    noreorder
234 .globl  sha1_block_data_order
235 .align  5
236 .ent    sha1_block_data_order
237 sha1_block_data_order:
238         lda     sp,-64(sp)
239         stq     ra,0(sp)
240         stq     s0,8(sp)
241         stq     s1,16(sp)
242         stq     s2,24(sp)
243         stq     s3,32(sp)
244         stq     s4,40(sp)
245         stq     s5,48(sp)
246         stq     fp,56(sp)
247         .mask   0x0400fe00,-64
248         .frame  sp,64,ra
249         .prologue 0
250
251         ldl     $A,0($ctx)
252         ldl     $B,4($ctx)
253         sll     $num,6,$num
254         ldl     $C,8($ctx)
255         ldl     $D,12($ctx)
256         ldl     $E,16($ctx)
257         addq    $inp,$num,$num
258
259 .Lloop:
260         .set    noreorder
261         ldah    $K,23170(zero)
262         zapnot  $B,0xf,$B
263         lda     $K,31129($K)    # K_00_19
264 ___
265 for ($i=0;$i<20;$i++) { &BODY_00_19($i,@V); unshift(@V,pop(@V)); }
266
267 $code.=<<___;
268         ldah    $K,28378(zero)
269         lda     $K,-5215($K)    # K_20_39
270 ___
271 for (;$i<40;$i++) { &BODY_20_39($i,@V); unshift(@V,pop(@V)); }
272
273 $code.=<<___;
274         ldah    $K,-28900(zero)
275         lda     $K,-17188($K)   # K_40_59
276 ___
277 for (;$i<60;$i++) { &BODY_40_59($i,@V); unshift(@V,pop(@V)); }
278
279 $code.=<<___;
280         ldah    $K,-13725(zero)
281         lda     $K,-15914($K)   # K_60_79
282 ___
283 for (;$i<80;$i++) { &BODY_20_39($i,@V); unshift(@V,pop(@V)); }
284
285 $code.=<<___;
286         addl    @X[0],$A,$A
287         addl    @X[1],$B,$B
288         addl    @X[2],$C,$C
289         addl    @X[3],$D,$D
290         addl    @X[4],$E,$E
291         stl     $A,0($ctx)
292         stl     $B,4($ctx)
293         addq    $inp,64,$inp
294         stl     $C,8($ctx)
295         stl     $D,12($ctx)
296         stl     $E,16($ctx)
297         cmpult  $inp,$num,$t1
298         bne     $t1,.Lloop
299
300         .set    noreorder
301         ldq     ra,0(sp)
302         ldq     s0,8(sp)
303         ldq     s1,16(sp)
304         ldq     s2,24(sp)
305         ldq     s3,32(sp)
306         ldq     s4,40(sp)
307         ldq     s5,48(sp)
308         ldq     fp,56(sp)
309         lda     sp,64(sp)
310         ret     (ra)
311 .end    sha1_block_data_order
312 ___
313 print $code;
314 close STDOUT;