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