12c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#!/usr/bin/env perl
22c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#
32c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# ====================================================================
42c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
52c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# project. The module is, however, dual licensed under OpenSSL and
62c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# CRYPTOGAMS licenses depending on where you obtain it. For further
72c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# details see http://www.openssl.org/~appro/cryptogams/.
82c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# ====================================================================
92c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#
102c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# March 2010
112c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#
122c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# The module implements "4-bit" GCM GHASH function and underlying
132c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# single multiplication operation in GF(2^128). "4-bit" means that it
142c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# uses 256 bytes per-key table [+128 bytes shared table]. Even though
152c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# loops are aggressively modulo-scheduled in respect to references to
162c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# Htbl and Z.hi updates for 8 cycles per byte, measured performance is
172c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# ~12 cycles per processed byte on 21264 CPU. It seems to be a dynamic
182c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# scheduling "glitch," because uprofile(1) indicates uniform sample
192c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# distribution, as if all instruction bundles execute in 1.5 cycles.
202c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# Meaning that it could have been even faster, yet 12 cycles is ~60%
212c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# better than gcc-generated code and ~80% than code generated by vendor
222c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org# compiler.
232c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
242c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$cnt="v0";	# $0
252c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$t0="t0";
262c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$t1="t1";
272c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$t2="t2";
282c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$Thi0="t3";	# $4
292c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$Tlo0="t4";
302c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$Thi1="t5";
312c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$Tlo1="t6";
322c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$rem="t7";	# $8
332c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#################
342c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$Xi="a0";	# $16, input argument block
352c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$Htbl="a1";
362c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$inp="a2";
372c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$len="a3";
382c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$nlo="a4";	# $20
392c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$nhi="a5";
402c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$Zhi="t8";
412c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$Zlo="t9";
422c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$Xhi="t10";	# $24
432c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$Xlo="t11";
442c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$remp="t12";
452c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$rem_4bit="AT";	# $28
462c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
472c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org{ my $N;
482c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org  sub loop() {
492c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
502c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	$N++;
512c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$code.=<<___;
522c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.align	4
532c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	extbl	$Xlo,7,$nlo
542c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$nlo,0xf0,$nhi
552c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$nlo,4,$nlo
562c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$nlo,0xf0,$nlo
572c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
582c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	addq	$nlo,$Htbl,$nlo
592c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Zlo,8($nlo)
602c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	addq	$nhi,$Htbl,$nhi
612c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Zhi,0($nlo)
622c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
632c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$Zlo,0x0f,$remp
642c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,60,$t0
652c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	lda	$cnt,6(zero)
662c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	extbl	$Xlo,6,$nlo
672c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
682c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Tlo1,8($nhi)
692c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	s8addq	$remp,$rem_4bit,$remp
702c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Thi1,0($nhi)
712c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,4,$Zlo
722c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
732c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$rem,0($remp)
742c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,4,$Zhi
752c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$t0,$Zlo,$Zlo
762c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$nlo,0xf0,$nhi
772c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
782c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Tlo1,$Zlo,$Zlo
792c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$nlo,4,$nlo
802c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Thi1,$Zhi,$Zhi
812c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$nlo,0xf0,$nlo
822c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
832c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	addq	$nlo,$Htbl,$nlo
842c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Tlo0,8($nlo)
852c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	addq	$nhi,$Htbl,$nhi
862c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Thi0,0($nlo)
872c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
882c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.Looplo$N:
892c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$Zlo,0x0f,$remp
902c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,60,$t0
912c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	subq	$cnt,1,$cnt
922c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,4,$Zlo
932c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
942c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Tlo1,8($nhi)
952c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$rem,$Zhi,$Zhi
962c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Thi1,0($nhi)
972c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	s8addq	$remp,$rem_4bit,$remp
982c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
992c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$rem,0($remp)
1002c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,4,$Zhi
1012c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$t0,$Zlo,$Zlo
1022c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	extbl	$Xlo,$cnt,$nlo
1032c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1042c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$nlo,0xf0,$nhi
1052c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Thi0,$Zhi,$Zhi
1062c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Tlo0,$Zlo,$Zlo
1072c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$nlo,4,$nlo
1082c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1092c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1102c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$Zlo,0x0f,$remp
1112c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,60,$t0
1122c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$nlo,0xf0,$nlo
1132c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,4,$Zlo
1142c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1152c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	s8addq	$remp,$rem_4bit,$remp
1162c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$rem,$Zhi,$Zhi
1172c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	addq	$nlo,$Htbl,$nlo
1182c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	addq	$nhi,$Htbl,$nhi
1192c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1202c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$rem,0($remp)
1212c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,4,$Zhi
1222c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Tlo0,8($nlo)
1232c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$t0,$Zlo,$Zlo
1242c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1252c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Tlo1,$Zlo,$Zlo
1262c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Thi1,$Zhi,$Zhi
1272c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Thi0,0($nlo)
1282c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	bne	$cnt,.Looplo$N
1292c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1302c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1312c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$Zlo,0x0f,$remp
1322c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,60,$t0
1332c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	lda	$cnt,7(zero)
1342c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,4,$Zlo
1352c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1362c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Tlo1,8($nhi)
1372c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$rem,$Zhi,$Zhi
1382c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Thi1,0($nhi)
1392c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	s8addq	$remp,$rem_4bit,$remp
1402c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1412c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$rem,0($remp)
1422c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,4,$Zhi
1432c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$t0,$Zlo,$Zlo
1442c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	extbl	$Xhi,$cnt,$nlo
1452c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1462c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$nlo,0xf0,$nhi
1472c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Thi0,$Zhi,$Zhi
1482c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Tlo0,$Zlo,$Zlo
1492c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$nlo,4,$nlo
1502c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1512c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$Zlo,0x0f,$remp
1522c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,60,$t0
1532c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$nlo,0xf0,$nlo
1542c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,4,$Zlo
1552c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1562c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	s8addq	$remp,$rem_4bit,$remp
1572c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$rem,$Zhi,$Zhi
1582c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	addq	$nlo,$Htbl,$nlo
1592c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	addq	$nhi,$Htbl,$nhi
1602c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1612c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$rem,0($remp)
1622c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,4,$Zhi
1632c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Tlo0,8($nlo)
1642c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$t0,$Zlo,$Zlo
1652c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1662c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Tlo1,$Zlo,$Zlo
1672c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Thi1,$Zhi,$Zhi
1682c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Thi0,0($nlo)
1692c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	unop
1702c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1712c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1722c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.Loophi$N:
1732c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$Zlo,0x0f,$remp
1742c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,60,$t0
1752c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	subq	$cnt,1,$cnt
1762c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,4,$Zlo
1772c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1782c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Tlo1,8($nhi)
1792c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$rem,$Zhi,$Zhi
1802c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Thi1,0($nhi)
1812c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	s8addq	$remp,$rem_4bit,$remp
1822c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1832c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$rem,0($remp)
1842c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,4,$Zhi
1852c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$t0,$Zlo,$Zlo
1862c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	extbl	$Xhi,$cnt,$nlo
1872c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1882c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$nlo,0xf0,$nhi
1892c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Thi0,$Zhi,$Zhi
1902c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Tlo0,$Zlo,$Zlo
1912c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$nlo,4,$nlo
1922c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1932c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1942c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$Zlo,0x0f,$remp
1952c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,60,$t0
1962c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$nlo,0xf0,$nlo
1972c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,4,$Zlo
1982c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
1992c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	s8addq	$remp,$rem_4bit,$remp
2002c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$rem,$Zhi,$Zhi
2012c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	addq	$nlo,$Htbl,$nlo
2022c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	addq	$nhi,$Htbl,$nhi
2032c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2042c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$rem,0($remp)
2052c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,4,$Zhi
2062c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Tlo0,8($nlo)
2072c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$t0,$Zlo,$Zlo
2082c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2092c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Tlo1,$Zlo,$Zlo
2102c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Thi1,$Zhi,$Zhi
2112c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Thi0,0($nlo)
2122c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	bne	$cnt,.Loophi$N
2132c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2142c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2152c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$Zlo,0x0f,$remp
2162c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,60,$t0
2172c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,4,$Zlo
2182c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2192c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Tlo1,8($nhi)
2202c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$rem,$Zhi,$Zhi
2212c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Thi1,0($nhi)
2222c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	s8addq	$remp,$rem_4bit,$remp
2232c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2242c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$rem,0($remp)
2252c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,4,$Zhi
2262c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$t0,$Zlo,$Zlo
2272c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2282c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Tlo0,$Zlo,$Zlo
2292c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Thi0,$Zhi,$Zhi
2302c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2312c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	and	$Zlo,0x0f,$remp
2322c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,60,$t0
2332c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,4,$Zlo
2342c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2352c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	s8addq	$remp,$rem_4bit,$remp
2362c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$rem,$Zhi,$Zhi
2372c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2382c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$rem,0($remp)
2392c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,4,$Zhi
2402c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Tlo1,$Zlo,$Zlo
2412c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Thi1,$Zhi,$Zhi
2422c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$t0,$Zlo,$Zlo
2432c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$rem,$Zhi,$Zhi
2442c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org___
2452c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org}}
2462c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2472c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$code=<<___;
2482c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#ifdef __linux__
2492c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#include <asm/regdef.h>
2502c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#else
2512c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#include <asm.h>
2522c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#include <regdef.h>
2532c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org#endif
2542c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2552c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.text
2562c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2572c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.set	noat
2582c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.set	noreorder
2592c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.globl	gcm_gmult_4bit
2602c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.align	4
2612c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.ent	gcm_gmult_4bit
2622c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.orggcm_gmult_4bit:
2632c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	.frame	sp,0,ra
2642c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	.prologue 0
2652c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2662c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Xlo,8($Xi)
2672c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Xhi,0($Xi)
2682c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2692c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	br	$rem_4bit,.Lpic1
2702c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.Lpic1:	lda	$rem_4bit,rem_4bit-.Lpic1($rem_4bit)
2712c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org___
2722c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2732c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	&loop();
2742c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2752c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$code.=<<___;
2762c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,24,$t0	# byte swap
2772c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,8,$t1
2782c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2792c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zlo,8,$t2
2802c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zlo,24,$Zlo
2812c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t0,0x11,$t0
2822c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t1,0x22,$t1
2832c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2842c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$Zlo,0x88,$Zlo
2852c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$t0,$t1,$t0
2862c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t2,0x44,$t2
2872c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2882c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zlo,$t0,$Zlo
2892c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,24,$t0
2902c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,8,$t1
2912c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2922c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zlo,$t2,$Zlo
2932c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,8,$t2
2942c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,24,$Zhi
2952c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2962c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,32,$Xlo
2972c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zlo,32,$Zlo
2982c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
2992c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t0,0x11,$t0
3002c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t1,0x22,$t1
3012c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zlo,$Xlo,$Xlo
3022c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3032c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$Zhi,0x88,$Zhi
3042c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$t0,$t1,$t0
3052c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t2,0x44,$t2
3062c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3072c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zhi,$t0,$Zhi
3082c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zhi,$t2,$Zhi
3092c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3102c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,32,$Xhi
3112c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,32,$Zhi
3122c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3132c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zhi,$Xhi,$Xhi
3142c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	stq	$Xlo,8($Xi)
3152c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	stq	$Xhi,0($Xi)
3162c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3172c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ret	(ra)
3182c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.end	gcm_gmult_4bit
3192c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org___
3202c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3212c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$inhi="s0";
3222c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$inlo="s1";
3232c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3242c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$code.=<<___;
3252c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.globl	gcm_ghash_4bit
3262c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.align	4
3272c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.ent	gcm_ghash_4bit
3282c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.orggcm_ghash_4bit:
3292c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	lda	sp,-32(sp)
3302c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	stq	ra,0(sp)
3312c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	stq	s0,8(sp)
3322c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	stq	s1,16(sp)
3332c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	.mask	0x04000600,-32
3342c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	.frame	sp,32,ra
3352c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	.prologue 0
3362c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3372c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq_u	$inhi,0($inp)
3382c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq_u	$Thi0,7($inp)
3392c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq_u	$inlo,8($inp)
3402c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq_u	$Tlo0,15($inp)
3412c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Xhi,0($Xi)
3422c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	$Xlo,8($Xi)
3432c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3442c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	br	$rem_4bit,.Lpic2
3452c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.Lpic2:	lda	$rem_4bit,rem_4bit-.Lpic2($rem_4bit)
3462c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3472c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.Louter:
3482c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	extql	$inhi,$inp,$inhi
3492c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	extqh	$Thi0,$inp,$Thi0
3502c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$inhi,$Thi0,$inhi
3512c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	lda	$inp,16($inp)
3522c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3532c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	extql	$inlo,$inp,$inlo
3542c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	extqh	$Tlo0,$inp,$Tlo0
3552c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$inlo,$Tlo0,$inlo
3562c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	subq	$len,16,$len
3572c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3582c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Xlo,$inlo,$Xlo
3592c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	xor	$Xhi,$inhi,$Xhi
3602c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org___
3612c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3622c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	&loop();
3632c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3642c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$code.=<<___;
3652c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,24,$t0	# byte swap
3662c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,8,$t1
3672c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3682c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zlo,8,$t2
3692c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zlo,24,$Zlo
3702c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t0,0x11,$t0
3712c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t1,0x22,$t1
3722c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3732c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$Zlo,0x88,$Zlo
3742c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$t0,$t1,$t0
3752c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t2,0x44,$t2
3762c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3772c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zlo,$t0,$Zlo
3782c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,24,$t0
3792c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,8,$t1
3802c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3812c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zlo,$t2,$Zlo
3822c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,8,$t2
3832c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,24,$Zhi
3842c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3852c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zlo,32,$Xlo
3862c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zlo,32,$Zlo
3872c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	beq	$len,.Ldone
3882c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3892c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t0,0x11,$t0
3902c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t1,0x22,$t1
3912c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zlo,$Xlo,$Xlo
3922c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq_u	$inhi,0($inp)
3932c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3942c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$Zhi,0x88,$Zhi
3952c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$t0,$t1,$t0
3962c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t2,0x44,$t2
3972c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq_u	$Thi0,7($inp)
3982c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
3992c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zhi,$t0,$Zhi
4002c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zhi,$t2,$Zhi
4012c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq_u	$inlo,8($inp)
4022c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq_u	$Tlo0,15($inp)
4032c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
4042c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,32,$Xhi
4052c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,32,$Zhi
4062c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
4072c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zhi,$Xhi,$Xhi
4082c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	br	zero,.Louter
4092c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
4102c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.Ldone:
4112c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t0,0x11,$t0
4122c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t1,0x22,$t1
4132c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zlo,$Xlo,$Xlo
4142c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
4152c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$Zhi,0x88,$Zhi
4162c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$t0,$t1,$t0
4172c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	zapnot	$t2,0x44,$t2
4182c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
4192c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zhi,$t0,$Zhi
4202c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zhi,$t2,$Zhi
4212c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
4222c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	srl	$Zhi,32,$Xhi
4232c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	sll	$Zhi,32,$Zhi
4242c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
4252c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	or	$Zhi,$Xhi,$Xhi
4262c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
4272c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	stq	$Xlo,8($Xi)
4282c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	stq	$Xhi,0($Xi)
4292c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
4302c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	.set	noreorder
4312c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	/*ldq	ra,0(sp)*/
4322c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	s0,8(sp)
4332c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ldq	s1,16(sp)
4342c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	lda	sp,32(sp)
4352c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	ret	(ra)
4362c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.end	gcm_ghash_4bit
4372c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
4382c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.align	4
4392c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.orgrem_4bit:
4402c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	.quad	0x0000<<48, 0x1C20<<48, 0x3840<<48, 0x2460<<48
4412c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	.quad	0x7080<<48, 0x6CA0<<48, 0x48C0<<48, 0x54E0<<48
4422c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	.quad	0xE100<<48, 0xFD20<<48, 0xD940<<48, 0xC560<<48
4432c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org	.quad	0x9180<<48, 0x8DA0<<48, 0xA9C0<<48, 0xB5E0<<48
4442c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.ascii	"GHASH for Alpha, CRYPTOGAMS by <appro\@openssl.org>"
4452c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org.align	4
4462c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
4472c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org___
4482c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org$output=shift and open STDOUT,">$output";
4492c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.orgprint $code;
4502c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.orgclose STDOUT;
4512c4508dfe2bc5b6296c01114ed11ddc64b7718c6digit@chromium.org
452