Blame crypto/sha/asm/sha1-alpha.pl

Packit c4476c
#! /usr/bin/env perl
Packit c4476c
# Copyright 2009-2020 The OpenSSL Project Authors. All Rights Reserved.
Packit c4476c
#
Packit c4476c
# Licensed under the OpenSSL license (the "License").  You may not use
Packit c4476c
# this file except in compliance with the License.  You can obtain a copy
Packit c4476c
# in the file LICENSE in the source distribution or at
Packit c4476c
# https://www.openssl.org/source/license.html
Packit c4476c
Packit c4476c
Packit c4476c
# ====================================================================
Packit c4476c
# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
Packit c4476c
# project. The module is, however, dual licensed under OpenSSL and
Packit c4476c
# CRYPTOGAMS licenses depending on where you obtain it. For further
Packit c4476c
# details see http://www.openssl.org/~appro/cryptogams/.
Packit c4476c
# ====================================================================
Packit c4476c
Packit c4476c
# SHA1 block procedure for Alpha.
Packit c4476c
Packit c4476c
# On 21264 performance is 33% better than code generated by vendor
Packit c4476c
# compiler, and 75% better than GCC [3.4], and in absolute terms is
Packit c4476c
# 8.7 cycles per processed byte. Implementation features vectorized
Packit c4476c
# byte swap, but not Xupdate.
Packit c4476c
Packit c4476c
@X=(	"\$0",	"\$1",	"\$2",	"\$3",	"\$4",	"\$5",	"\$6",	"\$7",
Packit c4476c
	"\$8",	"\$9",	"\$10",	"\$11",	"\$12",	"\$13",	"\$14",	"\$15");
Packit c4476c
$ctx="a0";	# $16
Packit c4476c
$inp="a1";
Packit c4476c
$num="a2";
Packit c4476c
$A="a3";
Packit c4476c
$B="a4";	# 20
Packit c4476c
$C="a5";
Packit c4476c
$D="t8";
Packit c4476c
$E="t9";	@V=($A,$B,$C,$D,$E);
Packit c4476c
$t0="t10";	# 24
Packit c4476c
$t1="t11";
Packit c4476c
$t2="ra";
Packit c4476c
$t3="t12";
Packit c4476c
$K="AT";	# 28
Packit c4476c
Packit c4476c
sub BODY_00_19 {
Packit c4476c
my ($i,$a,$b,$c,$d,$e)=@_;
Packit c4476c
my $j=$i+1;
Packit c4476c
$code.=<<___ if ($i==0);
Packit c4476c
	ldq_u	@X[0],0+0($inp)
Packit c4476c
	ldq_u	@X[1],0+7($inp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if (!($i&1) && $i<14);
Packit c4476c
	ldq_u	@X[$i+2],($i+2)*4+0($inp)
Packit c4476c
	ldq_u	@X[$i+3],($i+2)*4+7($inp)
Packit c4476c
___
Packit c4476c
$code.=<<___ if (!($i&1) && $i<15);
Packit c4476c
	extql	@X[$i],$inp,@X[$i]
Packit c4476c
	extqh	@X[$i+1],$inp,@X[$i+1]
Packit c4476c
Packit c4476c
	or	@X[$i+1],@X[$i],@X[$i]	# pair of 32-bit values are fetched
Packit c4476c
Packit c4476c
	srl	@X[$i],24,$t0		# vectorized byte swap
Packit c4476c
	srl	@X[$i],8,$t2
Packit c4476c
Packit c4476c
	sll	@X[$i],8,$t3
Packit c4476c
	sll	@X[$i],24,@X[$i]
Packit c4476c
	zapnot	$t0,0x11,$t0
Packit c4476c
	zapnot	$t2,0x22,$t2
Packit c4476c
Packit c4476c
	zapnot	@X[$i],0x88,@X[$i]
Packit c4476c
	or	$t0,$t2,$t0
Packit c4476c
	zapnot	$t3,0x44,$t3
Packit c4476c
	sll	$a,5,$t1
Packit c4476c
Packit c4476c
	or	@X[$i],$t0,@X[$i]
Packit c4476c
	addl	$K,$e,$e
Packit c4476c
	and	$b,$c,$t2
Packit c4476c
	zapnot	$a,0xf,$a
Packit c4476c
Packit c4476c
	or	@X[$i],$t3,@X[$i]
Packit c4476c
	srl	$a,27,$t0
Packit c4476c
	bic	$d,$b,$t3
Packit c4476c
	sll	$b,30,$b
Packit c4476c
Packit c4476c
	extll	@X[$i],4,@X[$i+1]	# extract upper half
Packit c4476c
	or	$t2,$t3,$t2
Packit c4476c
	addl	@X[$i],$e,$e
Packit c4476c
Packit c4476c
	addl	$t1,$e,$e
Packit c4476c
	srl	$b,32,$t3
Packit c4476c
	zapnot	@X[$i],0xf,@X[$i]
Packit c4476c
Packit c4476c
	addl	$t0,$e,$e
Packit c4476c
	addl	$t2,$e,$e
Packit c4476c
	or	$t3,$b,$b
Packit c4476c
___
Packit c4476c
$code.=<<___ if (($i&1) && $i<15);
Packit c4476c
	sll	$a,5,$t1
Packit c4476c
	addl	$K,$e,$e
Packit c4476c
	and	$b,$c,$t2
Packit c4476c
	zapnot	$a,0xf,$a
Packit c4476c
Packit c4476c
	srl	$a,27,$t0
Packit c4476c
	addl	@X[$i%16],$e,$e
Packit c4476c
	bic	$d,$b,$t3
Packit c4476c
	sll	$b,30,$b
Packit c4476c
Packit c4476c
	or	$t2,$t3,$t2
Packit c4476c
	addl	$t1,$e,$e
Packit c4476c
	srl	$b,32,$t3
Packit c4476c
	zapnot	@X[$i],0xf,@X[$i]
Packit c4476c
Packit c4476c
	addl	$t0,$e,$e
Packit c4476c
	addl	$t2,$e,$e
Packit c4476c
	or	$t3,$b,$b
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($i>=15);	# with forward Xupdate
Packit c4476c
	sll	$a,5,$t1
Packit c4476c
	addl	$K,$e,$e
Packit c4476c
	and	$b,$c,$t2
Packit c4476c
	xor	@X[($j+2)%16],@X[$j%16],@X[$j%16]
Packit c4476c
Packit c4476c
	zapnot	$a,0xf,$a
Packit c4476c
	addl	@X[$i%16],$e,$e
Packit c4476c
	bic	$d,$b,$t3
Packit c4476c
	xor	@X[($j+8)%16],@X[$j%16],@X[$j%16]
Packit c4476c
Packit c4476c
	srl	$a,27,$t0
Packit c4476c
	addl	$t1,$e,$e
Packit c4476c
	or	$t2,$t3,$t2
Packit c4476c
	xor	@X[($j+13)%16],@X[$j%16],@X[$j%16]
Packit c4476c
Packit c4476c
	sll	$b,30,$b
Packit c4476c
	addl	$t0,$e,$e
Packit c4476c
	srl	@X[$j%16],31,$t1
Packit c4476c
Packit c4476c
	addl	$t2,$e,$e
Packit c4476c
	srl	$b,32,$t3
Packit c4476c
	addl	@X[$j%16],@X[$j%16],@X[$j%16]
Packit c4476c
Packit c4476c
	or	$t3,$b,$b
Packit c4476c
	zapnot	@X[$i%16],0xf,@X[$i%16]
Packit c4476c
	or	$t1,@X[$j%16],@X[$j%16]
Packit c4476c
___
Packit c4476c
}
Packit c4476c
Packit c4476c
sub BODY_20_39 {
Packit c4476c
my ($i,$a,$b,$c,$d,$e)=@_;
Packit c4476c
my $j=$i+1;
Packit c4476c
$code.=<<___ if ($i<79);	# with forward Xupdate
Packit c4476c
	sll	$a,5,$t1
Packit c4476c
	addl	$K,$e,$e
Packit c4476c
	zapnot	$a,0xf,$a
Packit c4476c
	xor	@X[($j+2)%16],@X[$j%16],@X[$j%16]
Packit c4476c
Packit c4476c
	sll	$b,30,$t3
Packit c4476c
	addl	$t1,$e,$e
Packit c4476c
	xor	$b,$c,$t2
Packit c4476c
	xor	@X[($j+8)%16],@X[$j%16],@X[$j%16]
Packit c4476c
Packit c4476c
	srl	$b,2,$b
Packit c4476c
	addl	@X[$i%16],$e,$e
Packit c4476c
	xor	$d,$t2,$t2
Packit c4476c
	xor	@X[($j+13)%16],@X[$j%16],@X[$j%16]
Packit c4476c
Packit c4476c
	srl	@X[$j%16],31,$t1
Packit c4476c
	addl	$t2,$e,$e
Packit c4476c
	srl	$a,27,$t0
Packit c4476c
	addl	@X[$j%16],@X[$j%16],@X[$j%16]
Packit c4476c
Packit c4476c
	or	$t3,$b,$b
Packit c4476c
	addl	$t0,$e,$e
Packit c4476c
	or	$t1,@X[$j%16],@X[$j%16]
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($i<77);
Packit c4476c
	zapnot	@X[$i%16],0xf,@X[$i%16]
Packit c4476c
___
Packit c4476c
$code.=<<___ if ($i==79);	# with context fetch
Packit c4476c
	sll	$a,5,$t1
Packit c4476c
	addl	$K,$e,$e
Packit c4476c
	zapnot	$a,0xf,$a
Packit c4476c
	ldl	@X[0],0($ctx)
Packit c4476c
Packit c4476c
	sll	$b,30,$t3
Packit c4476c
	addl	$t1,$e,$e
Packit c4476c
	xor	$b,$c,$t2
Packit c4476c
	ldl	@X[1],4($ctx)
Packit c4476c
Packit c4476c
	srl	$b,2,$b
Packit c4476c
	addl	@X[$i%16],$e,$e
Packit c4476c
	xor	$d,$t2,$t2
Packit c4476c
	ldl	@X[2],8($ctx)
Packit c4476c
Packit c4476c
	srl	$a,27,$t0
Packit c4476c
	addl	$t2,$e,$e
Packit c4476c
	ldl	@X[3],12($ctx)
Packit c4476c
Packit c4476c
	or	$t3,$b,$b
Packit c4476c
	addl	$t0,$e,$e
Packit c4476c
	ldl	@X[4],16($ctx)
Packit c4476c
___
Packit c4476c
}
Packit c4476c
Packit c4476c
sub BODY_40_59 {
Packit c4476c
my ($i,$a,$b,$c,$d,$e)=@_;
Packit c4476c
my $j=$i+1;
Packit c4476c
$code.=<<___;	# with forward Xupdate
Packit c4476c
	sll	$a,5,$t1
Packit c4476c
	addl	$K,$e,$e
Packit c4476c
	zapnot	$a,0xf,$a
Packit c4476c
	xor	@X[($j+2)%16],@X[$j%16],@X[$j%16]
Packit c4476c
Packit c4476c
	srl	$a,27,$t0
Packit c4476c
	and	$b,$c,$t2
Packit c4476c
	and	$b,$d,$t3
Packit c4476c
	xor	@X[($j+8)%16],@X[$j%16],@X[$j%16]
Packit c4476c
Packit c4476c
	sll	$b,30,$b
Packit c4476c
	addl	$t1,$e,$e
Packit c4476c
	xor	@X[($j+13)%16],@X[$j%16],@X[$j%16]
Packit c4476c
Packit c4476c
	srl	@X[$j%16],31,$t1
Packit c4476c
	addl	$t0,$e,$e
Packit c4476c
	or	$t2,$t3,$t2
Packit c4476c
	and	$c,$d,$t3
Packit c4476c
Packit c4476c
	or	$t2,$t3,$t2
Packit c4476c
	srl	$b,32,$t3
Packit c4476c
	addl	@X[$i%16],$e,$e
Packit c4476c
	addl	@X[$j%16],@X[$j%16],@X[$j%16]
Packit c4476c
Packit c4476c
	or	$t3,$b,$b
Packit c4476c
	addl	$t2,$e,$e
Packit c4476c
	or	$t1,@X[$j%16],@X[$j%16]
Packit c4476c
	zapnot	@X[$i%16],0xf,@X[$i%16]
Packit c4476c
___
Packit c4476c
}
Packit c4476c
Packit c4476c
$code=<<___;
Packit c4476c
#ifdef __linux__
Packit c4476c
#include <asm/regdef.h>
Packit c4476c
#else
Packit c4476c
#include <asm.h>
Packit c4476c
#include <regdef.h>
Packit c4476c
#endif
Packit c4476c
Packit c4476c
.text
Packit c4476c
Packit c4476c
.set	noat
Packit c4476c
.set	noreorder
Packit c4476c
.globl	sha1_block_data_order
Packit c4476c
.align	5
Packit c4476c
.ent	sha1_block_data_order
Packit c4476c
sha1_block_data_order:
Packit c4476c
	lda	sp,-64(sp)
Packit c4476c
	stq	ra,0(sp)
Packit c4476c
	stq	s0,8(sp)
Packit c4476c
	stq	s1,16(sp)
Packit c4476c
	stq	s2,24(sp)
Packit c4476c
	stq	s3,32(sp)
Packit c4476c
	stq	s4,40(sp)
Packit c4476c
	stq	s5,48(sp)
Packit c4476c
	stq	fp,56(sp)
Packit c4476c
	.mask	0x0400fe00,-64
Packit c4476c
	.frame	sp,64,ra
Packit c4476c
	.prologue 0
Packit c4476c
Packit c4476c
	ldl	$A,0($ctx)
Packit c4476c
	ldl	$B,4($ctx)
Packit c4476c
	sll	$num,6,$num
Packit c4476c
	ldl	$C,8($ctx)
Packit c4476c
	ldl	$D,12($ctx)
Packit c4476c
	ldl	$E,16($ctx)
Packit c4476c
	addq	$inp,$num,$num
Packit c4476c
Packit c4476c
.Lloop:
Packit c4476c
	.set	noreorder
Packit c4476c
	ldah	$K,23170(zero)
Packit c4476c
	zapnot	$B,0xf,$B
Packit c4476c
	lda	$K,31129($K)	# K_00_19
Packit c4476c
___
Packit c4476c
for ($i=0;$i<20;$i++) { &BODY_00_19($i,@V); unshift(@V,pop(@V)); }
Packit c4476c
Packit c4476c
$code.=<<___;
Packit c4476c
	ldah	$K,28378(zero)
Packit c4476c
	lda	$K,-5215($K)	# K_20_39
Packit c4476c
___
Packit c4476c
for (;$i<40;$i++) { &BODY_20_39($i,@V); unshift(@V,pop(@V)); }
Packit c4476c
Packit c4476c
$code.=<<___;
Packit c4476c
	ldah	$K,-28900(zero)
Packit c4476c
	lda	$K,-17188($K)	# K_40_59
Packit c4476c
___
Packit c4476c
for (;$i<60;$i++) { &BODY_40_59($i,@V); unshift(@V,pop(@V)); }
Packit c4476c
Packit c4476c
$code.=<<___;
Packit c4476c
	ldah	$K,-13725(zero)
Packit c4476c
	lda	$K,-15914($K)	# K_60_79
Packit c4476c
___
Packit c4476c
for (;$i<80;$i++) { &BODY_20_39($i,@V); unshift(@V,pop(@V)); }
Packit c4476c
Packit c4476c
$code.=<<___;
Packit c4476c
	addl	@X[0],$A,$A
Packit c4476c
	addl	@X[1],$B,$B
Packit c4476c
	addl	@X[2],$C,$C
Packit c4476c
	addl	@X[3],$D,$D
Packit c4476c
	addl	@X[4],$E,$E
Packit c4476c
	stl	$A,0($ctx)
Packit c4476c
	stl	$B,4($ctx)
Packit c4476c
	addq	$inp,64,$inp
Packit c4476c
	stl	$C,8($ctx)
Packit c4476c
	stl	$D,12($ctx)
Packit c4476c
	stl	$E,16($ctx)
Packit c4476c
	cmpult	$inp,$num,$t1
Packit c4476c
	bne	$t1,.Lloop
Packit c4476c
Packit c4476c
	.set	noreorder
Packit c4476c
	ldq	ra,0(sp)
Packit c4476c
	ldq	s0,8(sp)
Packit c4476c
	ldq	s1,16(sp)
Packit c4476c
	ldq	s2,24(sp)
Packit c4476c
	ldq	s3,32(sp)
Packit c4476c
	ldq	s4,40(sp)
Packit c4476c
	ldq	s5,48(sp)
Packit c4476c
	ldq	fp,56(sp)
Packit c4476c
	lda	sp,64(sp)
Packit c4476c
	ret	(ra)
Packit c4476c
.end	sha1_block_data_order
Packit c4476c
.ascii	"SHA1 block transform for Alpha, CRYPTOGAMS by <appro\@openssl.org>"
Packit c4476c
.align	2
Packit c4476c
___
Packit c4476c
$output=pop and open STDOUT,">$output";
Packit c4476c
print $code;
Packit c4476c
close STDOUT or die "error closing STDOUT: $!";