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 # ====================================================================
10 # SHA1 block procedure for Alpha.
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.
16 @X=( "\$0", "\$1", "\$2", "\$3", "\$4", "\$5", "\$6", "\$7",
17 "\$8", "\$9", "\$10", "\$11", "\$12", "\$13", "\$14", "\$15");
25 $E="t9"; @V=($A,$B,$C,$D,$E);
33 my ($i,$a,$b,$c,$d,$e)=@_;
35 $code.=<<___ if ($i==0);
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)
43 $code.=<<___ if (!($i&1) && $i<15);
44 extql @X[$i],$inp,@X[$i]
45 extqh @X[$i+1],$inp,@X[$i+1]
47 or @X[$i+1],@X[$i],@X[$i] # pair of 32-bit values are fetched
49 srl @X[$i],24,$t0 # vectorized byte swap
57 zapnot @X[$i],0x88,@X[$i]
72 extll @X[$i],4,@X[$i+1] # extract upper half
78 zapnot @X[$i],0xf,@X[$i]
84 $code.=<<___ if (($i&1) && $i<15);
98 zapnot @X[$i],0xf,@X[$i]
104 $code.=<<___ if ($i>=15); # with forward Xupdate
108 xor @X[($j+2)%16],@X[$j%16],@X[$j%16]
113 xor @X[($j+8)%16],@X[$j%16],@X[$j%16]
118 xor @X[($j+13)%16],@X[$j%16],@X[$j%16]
126 addl @X[$j%16],@X[$j%16],@X[$j%16]
129 zapnot @X[$i%16],0xf,@X[$i%16]
130 or $t1,@X[$j%16],@X[$j%16]
135 my ($i,$a,$b,$c,$d,$e)=@_;
137 $code.=<<___ if ($i<79); # with forward Xupdate
141 xor @X[($j+2)%16],@X[$j%16],@X[$j%16]
146 xor @X[($j+8)%16],@X[$j%16],@X[$j%16]
151 xor @X[($j+13)%16],@X[$j%16],@X[$j%16]
156 addl @X[$j%16],@X[$j%16],@X[$j%16]
160 or $t1,@X[$j%16],@X[$j%16]
162 $code.=<<___ if ($i<77);
163 zapnot @X[$i%16],0xf,@X[$i%16]
165 $code.=<<___ if ($i==79); # with context fetch
192 my ($i,$a,$b,$c,$d,$e)=@_;
194 $code.=<<___; # with forward Xupdate
198 xor @X[($j+2)%16],@X[$j%16],@X[$j%16]
203 xor @X[($j+8)%16],@X[$j%16],@X[$j%16]
207 xor @X[($j+13)%16],@X[$j%16],@X[$j%16]
217 addl @X[$j%16],@X[$j%16],@X[$j%16]
221 or $t1,@X[$j%16],@X[$j%16]
222 zapnot @X[$i%16],0xf,@X[$i%16]
234 .globl sha1_block_data_order
236 .ent sha1_block_data_order
237 sha1_block_data_order:
263 lda $K,31129($K) # K_00_19
265 for ($i=0;$i<20;$i++) { &BODY_00_19($i,@V); unshift(@V,pop(@V)); }
269 lda $K,-5215($K) # K_20_39
271 for (;$i<40;$i++) { &BODY_20_39($i,@V); unshift(@V,pop(@V)); }
275 lda $K,-17188($K) # K_40_59
277 for (;$i<60;$i++) { &BODY_40_59($i,@V); unshift(@V,pop(@V)); }
281 lda $K,-15914($K) # K_60_79
283 for (;$i<80;$i++) { &BODY_20_39($i,@V); unshift(@V,pop(@V)); }
311 .end sha1_block_data_order
313 $output=shift and open STDOUT,">$output";