xref: /netbsd-src/crypto/external/bsd/openssl/lib/libcrypto/arch/mips/sha512-mips64.S (revision e0ea3921ea68e51b93ffc215f08ae1647c8e1796)
1*e0ea3921Schristos#include "mips_arch.h"
26410c867Schristos
36410c867Schristos.text
46410c867Schristos.set	noat
56410c867Schristos#if !defined(__mips_eabi) && (!defined(__vxworks) || defined(__pic__))
66410c867Schristos.option	pic2
76410c867Schristos#endif
86410c867Schristos
96410c867Schristos.align	5
106410c867Schristos.globl	sha256_block_data_order
116410c867Schristos.ent	sha256_block_data_order
126410c867Schristossha256_block_data_order:
136410c867Schristos	.frame	$29,192,$31
146410c867Schristos	.mask	0xc0ff0000,-8
156410c867Schristos	.set	noreorder
16*e0ea3921Schristos	dsubu $29,192
176410c867Schristos	sd	$31,192-1*8($29)
186410c867Schristos	sd	$30,192-2*8($29)
196410c867Schristos	sd	$23,192-3*8($29)
206410c867Schristos	sd	$22,192-4*8($29)
216410c867Schristos	sd	$21,192-5*8($29)
226410c867Schristos	sd	$20,192-6*8($29)
236410c867Schristos	sd	$19,192-7*8($29)
246410c867Schristos	sd	$18,192-8*8($29)
256410c867Schristos	sd	$17,192-9*8($29)
266410c867Schristos	sd	$16,192-10*8($29)
276410c867Schristos	dsll $23,$6,6
286410c867Schristos	.cplocal	$6
296410c867Schristos	.cpsetup	$25,$0,sha256_block_data_order
306410c867Schristos	.set	reorder
316410c867Schristos	dla	$6,K256		# PIC-ified 'load address'
326410c867Schristos
336410c867Schristos	lw	$1,0*4($4)		# load context
346410c867Schristos	lw	$2,1*4($4)
356410c867Schristos	lw	$3,2*4($4)
366410c867Schristos	lw	$7,3*4($4)
376410c867Schristos	lw	$24,4*4($4)
386410c867Schristos	lw	$25,5*4($4)
396410c867Schristos	lw	$30,6*4($4)
406410c867Schristos	lw	$31,7*4($4)
416410c867Schristos
42*e0ea3921Schristos	daddu $23,$5		# pointer to the end of input
436410c867Schristos	sd	$23,16*4($29)
446410c867Schristos	b	.Loop
456410c867Schristos
466410c867Schristos.align	5
476410c867Schristos.Loop:
48*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
49*e0ea3921Schristos	lw	$8,($5)
50*e0ea3921Schristos#else
516410c867Schristos	lwl	$8,3($5)
526410c867Schristos	lwr	$8,0($5)
53*e0ea3921Schristos#endif
54*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
55*e0ea3921Schristos	lw	$9,4($5)
56*e0ea3921Schristos#else
576410c867Schristos	lwl	$9,7($5)
586410c867Schristos	lwr	$9,4($5)
59*e0ea3921Schristos#endif
606410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
616410c867Schristos	wsbh	$8,$8		# byte swap(0)
626410c867Schristos	rotr	$8,$8,16
636410c867Schristos#else
646410c867Schristos	srl	$13,$8,24		# byte swap(0)
656410c867Schristos	srl	$14,$8,8
666410c867Schristos	andi	$15,$8,0xFF00
676410c867Schristos	sll	$8,$8,24
686410c867Schristos	andi	$14,0xFF00
696410c867Schristos	sll	$15,$15,8
706410c867Schristos	or	$8,$13
716410c867Schristos	or	$14,$15
726410c867Schristos	or	$8,$14
736410c867Schristos#endif
746410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
756410c867Schristos	xor	$15,$25,$30			# 0
766410c867Schristos	rotr	$13,$24,6
776410c867Schristos	addu	$12,$8,$31
786410c867Schristos	rotr	$14,$24,11
796410c867Schristos	and	$15,$24
806410c867Schristos	rotr	$31,$24,25
816410c867Schristos	xor	$13,$14
826410c867Schristos	rotr	$14,$1,2
836410c867Schristos	xor	$15,$30			# Ch(e,f,g)
846410c867Schristos	xor	$13,$31			# Sigma1(e)
856410c867Schristos
866410c867Schristos	rotr	$31,$1,13
876410c867Schristos	addu	$12,$15
886410c867Schristos	lw	$15,0($6)		# K[0]
896410c867Schristos	xor	$31,$14
906410c867Schristos	rotr	$14,$1,22
916410c867Schristos	addu	$12,$13
926410c867Schristos	and	$13,$2,$3
936410c867Schristos	xor	$31,$14			# Sigma0(a)
946410c867Schristos	xor	$14,$2,$3
956410c867Schristos#else
966410c867Schristos	addu	$12,$8,$31			# 0
976410c867Schristos	srl	$31,$24,6
986410c867Schristos	xor	$15,$25,$30
996410c867Schristos	sll	$14,$24,7
1006410c867Schristos	and	$15,$24
1016410c867Schristos	srl	$13,$24,11
1026410c867Schristos	xor	$31,$14
1036410c867Schristos	sll	$14,$24,21
1046410c867Schristos	xor	$31,$13
1056410c867Schristos	srl	$13,$24,25
1066410c867Schristos	xor	$31,$14
1076410c867Schristos	sll	$14,$24,26
1086410c867Schristos	xor	$31,$13
1096410c867Schristos	xor	$15,$30			# Ch(e,f,g)
1106410c867Schristos	xor	$13,$14,$31			# Sigma1(e)
1116410c867Schristos
1126410c867Schristos	srl	$31,$1,2
1136410c867Schristos	addu	$12,$15
1146410c867Schristos	lw	$15,0($6)		# K[0]
1156410c867Schristos	sll	$14,$1,10
1166410c867Schristos	addu	$12,$13
1176410c867Schristos	srl	$13,$1,13
1186410c867Schristos	xor	$31,$14
1196410c867Schristos	sll	$14,$1,19
1206410c867Schristos	xor	$31,$13
1216410c867Schristos	srl	$13,$1,22
1226410c867Schristos	xor	$31,$14
1236410c867Schristos	sll	$14,$1,30
1246410c867Schristos	xor	$31,$13
1256410c867Schristos	and	$13,$2,$3
1266410c867Schristos	xor	$31,$14			# Sigma0(a)
1276410c867Schristos	xor	$14,$2,$3
1286410c867Schristos#endif
1296410c867Schristos	sw	$8,0($29)	# offload to ring buffer
1306410c867Schristos	addu	$31,$13
1316410c867Schristos	and	$14,$1
1326410c867Schristos	addu	$12,$15			# +=K[0]
1336410c867Schristos	addu	$31,$14			# +=Maj(a,b,c)
1346410c867Schristos	addu	$7,$12
1356410c867Schristos	addu	$31,$12
136*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
137*e0ea3921Schristos	lw	$10,8($5)
138*e0ea3921Schristos#else
1396410c867Schristos	lwl	$10,11($5)
1406410c867Schristos	lwr	$10,8($5)
141*e0ea3921Schristos#endif
1426410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
1436410c867Schristos	wsbh	$9,$9		# byte swap(1)
1446410c867Schristos	rotr	$9,$9,16
1456410c867Schristos#else
1466410c867Schristos	srl	$14,$9,24		# byte swap(1)
1476410c867Schristos	srl	$15,$9,8
1486410c867Schristos	andi	$16,$9,0xFF00
1496410c867Schristos	sll	$9,$9,24
1506410c867Schristos	andi	$15,0xFF00
1516410c867Schristos	sll	$16,$16,8
1526410c867Schristos	or	$9,$14
1536410c867Schristos	or	$15,$16
1546410c867Schristos	or	$9,$15
1556410c867Schristos#endif
1566410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
1576410c867Schristos	xor	$16,$24,$25			# 1
1586410c867Schristos	rotr	$14,$7,6
1596410c867Schristos	addu	$13,$9,$30
1606410c867Schristos	rotr	$15,$7,11
1616410c867Schristos	and	$16,$7
1626410c867Schristos	rotr	$30,$7,25
1636410c867Schristos	xor	$14,$15
1646410c867Schristos	rotr	$15,$31,2
1656410c867Schristos	xor	$16,$25			# Ch(e,f,g)
1666410c867Schristos	xor	$14,$30			# Sigma1(e)
1676410c867Schristos
1686410c867Schristos	rotr	$30,$31,13
1696410c867Schristos	addu	$13,$16
1706410c867Schristos	lw	$16,4($6)		# K[1]
1716410c867Schristos	xor	$30,$15
1726410c867Schristos	rotr	$15,$31,22
1736410c867Schristos	addu	$13,$14
1746410c867Schristos	and	$14,$1,$2
1756410c867Schristos	xor	$30,$15			# Sigma0(a)
1766410c867Schristos	xor	$15,$1,$2
1776410c867Schristos#else
1786410c867Schristos	addu	$13,$9,$30			# 1
1796410c867Schristos	srl	$30,$7,6
1806410c867Schristos	xor	$16,$24,$25
1816410c867Schristos	sll	$15,$7,7
1826410c867Schristos	and	$16,$7
1836410c867Schristos	srl	$14,$7,11
1846410c867Schristos	xor	$30,$15
1856410c867Schristos	sll	$15,$7,21
1866410c867Schristos	xor	$30,$14
1876410c867Schristos	srl	$14,$7,25
1886410c867Schristos	xor	$30,$15
1896410c867Schristos	sll	$15,$7,26
1906410c867Schristos	xor	$30,$14
1916410c867Schristos	xor	$16,$25			# Ch(e,f,g)
1926410c867Schristos	xor	$14,$15,$30			# Sigma1(e)
1936410c867Schristos
1946410c867Schristos	srl	$30,$31,2
1956410c867Schristos	addu	$13,$16
1966410c867Schristos	lw	$16,4($6)		# K[1]
1976410c867Schristos	sll	$15,$31,10
1986410c867Schristos	addu	$13,$14
1996410c867Schristos	srl	$14,$31,13
2006410c867Schristos	xor	$30,$15
2016410c867Schristos	sll	$15,$31,19
2026410c867Schristos	xor	$30,$14
2036410c867Schristos	srl	$14,$31,22
2046410c867Schristos	xor	$30,$15
2056410c867Schristos	sll	$15,$31,30
2066410c867Schristos	xor	$30,$14
2076410c867Schristos	and	$14,$1,$2
2086410c867Schristos	xor	$30,$15			# Sigma0(a)
2096410c867Schristos	xor	$15,$1,$2
2106410c867Schristos#endif
2116410c867Schristos	sw	$9,4($29)	# offload to ring buffer
2126410c867Schristos	addu	$30,$14
2136410c867Schristos	and	$15,$31
2146410c867Schristos	addu	$13,$16			# +=K[1]
2156410c867Schristos	addu	$30,$15			# +=Maj(a,b,c)
2166410c867Schristos	addu	$3,$13
2176410c867Schristos	addu	$30,$13
218*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
219*e0ea3921Schristos	lw	$11,12($5)
220*e0ea3921Schristos#else
2216410c867Schristos	lwl	$11,15($5)
2226410c867Schristos	lwr	$11,12($5)
223*e0ea3921Schristos#endif
2246410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
2256410c867Schristos	wsbh	$10,$10		# byte swap(2)
2266410c867Schristos	rotr	$10,$10,16
2276410c867Schristos#else
2286410c867Schristos	srl	$15,$10,24		# byte swap(2)
2296410c867Schristos	srl	$16,$10,8
2306410c867Schristos	andi	$17,$10,0xFF00
2316410c867Schristos	sll	$10,$10,24
2326410c867Schristos	andi	$16,0xFF00
2336410c867Schristos	sll	$17,$17,8
2346410c867Schristos	or	$10,$15
2356410c867Schristos	or	$16,$17
2366410c867Schristos	or	$10,$16
2376410c867Schristos#endif
2386410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
2396410c867Schristos	xor	$17,$7,$24			# 2
2406410c867Schristos	rotr	$15,$3,6
2416410c867Schristos	addu	$14,$10,$25
2426410c867Schristos	rotr	$16,$3,11
2436410c867Schristos	and	$17,$3
2446410c867Schristos	rotr	$25,$3,25
2456410c867Schristos	xor	$15,$16
2466410c867Schristos	rotr	$16,$30,2
2476410c867Schristos	xor	$17,$24			# Ch(e,f,g)
2486410c867Schristos	xor	$15,$25			# Sigma1(e)
2496410c867Schristos
2506410c867Schristos	rotr	$25,$30,13
2516410c867Schristos	addu	$14,$17
2526410c867Schristos	lw	$17,8($6)		# K[2]
2536410c867Schristos	xor	$25,$16
2546410c867Schristos	rotr	$16,$30,22
2556410c867Schristos	addu	$14,$15
2566410c867Schristos	and	$15,$31,$1
2576410c867Schristos	xor	$25,$16			# Sigma0(a)
2586410c867Schristos	xor	$16,$31,$1
2596410c867Schristos#else
2606410c867Schristos	addu	$14,$10,$25			# 2
2616410c867Schristos	srl	$25,$3,6
2626410c867Schristos	xor	$17,$7,$24
2636410c867Schristos	sll	$16,$3,7
2646410c867Schristos	and	$17,$3
2656410c867Schristos	srl	$15,$3,11
2666410c867Schristos	xor	$25,$16
2676410c867Schristos	sll	$16,$3,21
2686410c867Schristos	xor	$25,$15
2696410c867Schristos	srl	$15,$3,25
2706410c867Schristos	xor	$25,$16
2716410c867Schristos	sll	$16,$3,26
2726410c867Schristos	xor	$25,$15
2736410c867Schristos	xor	$17,$24			# Ch(e,f,g)
2746410c867Schristos	xor	$15,$16,$25			# Sigma1(e)
2756410c867Schristos
2766410c867Schristos	srl	$25,$30,2
2776410c867Schristos	addu	$14,$17
2786410c867Schristos	lw	$17,8($6)		# K[2]
2796410c867Schristos	sll	$16,$30,10
2806410c867Schristos	addu	$14,$15
2816410c867Schristos	srl	$15,$30,13
2826410c867Schristos	xor	$25,$16
2836410c867Schristos	sll	$16,$30,19
2846410c867Schristos	xor	$25,$15
2856410c867Schristos	srl	$15,$30,22
2866410c867Schristos	xor	$25,$16
2876410c867Schristos	sll	$16,$30,30
2886410c867Schristos	xor	$25,$15
2896410c867Schristos	and	$15,$31,$1
2906410c867Schristos	xor	$25,$16			# Sigma0(a)
2916410c867Schristos	xor	$16,$31,$1
2926410c867Schristos#endif
2936410c867Schristos	sw	$10,8($29)	# offload to ring buffer
2946410c867Schristos	addu	$25,$15
2956410c867Schristos	and	$16,$30
2966410c867Schristos	addu	$14,$17			# +=K[2]
2976410c867Schristos	addu	$25,$16			# +=Maj(a,b,c)
2986410c867Schristos	addu	$2,$14
2996410c867Schristos	addu	$25,$14
300*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
301*e0ea3921Schristos	lw	$12,16($5)
302*e0ea3921Schristos#else
3036410c867Schristos	lwl	$12,19($5)
3046410c867Schristos	lwr	$12,16($5)
305*e0ea3921Schristos#endif
3066410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
3076410c867Schristos	wsbh	$11,$11		# byte swap(3)
3086410c867Schristos	rotr	$11,$11,16
3096410c867Schristos#else
3106410c867Schristos	srl	$16,$11,24		# byte swap(3)
3116410c867Schristos	srl	$17,$11,8
3126410c867Schristos	andi	$18,$11,0xFF00
3136410c867Schristos	sll	$11,$11,24
3146410c867Schristos	andi	$17,0xFF00
3156410c867Schristos	sll	$18,$18,8
3166410c867Schristos	or	$11,$16
3176410c867Schristos	or	$17,$18
3186410c867Schristos	or	$11,$17
3196410c867Schristos#endif
3206410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
3216410c867Schristos	xor	$18,$3,$7			# 3
3226410c867Schristos	rotr	$16,$2,6
3236410c867Schristos	addu	$15,$11,$24
3246410c867Schristos	rotr	$17,$2,11
3256410c867Schristos	and	$18,$2
3266410c867Schristos	rotr	$24,$2,25
3276410c867Schristos	xor	$16,$17
3286410c867Schristos	rotr	$17,$25,2
3296410c867Schristos	xor	$18,$7			# Ch(e,f,g)
3306410c867Schristos	xor	$16,$24			# Sigma1(e)
3316410c867Schristos
3326410c867Schristos	rotr	$24,$25,13
3336410c867Schristos	addu	$15,$18
3346410c867Schristos	lw	$18,12($6)		# K[3]
3356410c867Schristos	xor	$24,$17
3366410c867Schristos	rotr	$17,$25,22
3376410c867Schristos	addu	$15,$16
3386410c867Schristos	and	$16,$30,$31
3396410c867Schristos	xor	$24,$17			# Sigma0(a)
3406410c867Schristos	xor	$17,$30,$31
3416410c867Schristos#else
3426410c867Schristos	addu	$15,$11,$24			# 3
3436410c867Schristos	srl	$24,$2,6
3446410c867Schristos	xor	$18,$3,$7
3456410c867Schristos	sll	$17,$2,7
3466410c867Schristos	and	$18,$2
3476410c867Schristos	srl	$16,$2,11
3486410c867Schristos	xor	$24,$17
3496410c867Schristos	sll	$17,$2,21
3506410c867Schristos	xor	$24,$16
3516410c867Schristos	srl	$16,$2,25
3526410c867Schristos	xor	$24,$17
3536410c867Schristos	sll	$17,$2,26
3546410c867Schristos	xor	$24,$16
3556410c867Schristos	xor	$18,$7			# Ch(e,f,g)
3566410c867Schristos	xor	$16,$17,$24			# Sigma1(e)
3576410c867Schristos
3586410c867Schristos	srl	$24,$25,2
3596410c867Schristos	addu	$15,$18
3606410c867Schristos	lw	$18,12($6)		# K[3]
3616410c867Schristos	sll	$17,$25,10
3626410c867Schristos	addu	$15,$16
3636410c867Schristos	srl	$16,$25,13
3646410c867Schristos	xor	$24,$17
3656410c867Schristos	sll	$17,$25,19
3666410c867Schristos	xor	$24,$16
3676410c867Schristos	srl	$16,$25,22
3686410c867Schristos	xor	$24,$17
3696410c867Schristos	sll	$17,$25,30
3706410c867Schristos	xor	$24,$16
3716410c867Schristos	and	$16,$30,$31
3726410c867Schristos	xor	$24,$17			# Sigma0(a)
3736410c867Schristos	xor	$17,$30,$31
3746410c867Schristos#endif
3756410c867Schristos	sw	$11,12($29)	# offload to ring buffer
3766410c867Schristos	addu	$24,$16
3776410c867Schristos	and	$17,$25
3786410c867Schristos	addu	$15,$18			# +=K[3]
3796410c867Schristos	addu	$24,$17			# +=Maj(a,b,c)
3806410c867Schristos	addu	$1,$15
3816410c867Schristos	addu	$24,$15
382*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
383*e0ea3921Schristos	lw	$13,20($5)
384*e0ea3921Schristos#else
3856410c867Schristos	lwl	$13,23($5)
3866410c867Schristos	lwr	$13,20($5)
387*e0ea3921Schristos#endif
3886410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
3896410c867Schristos	wsbh	$12,$12		# byte swap(4)
3906410c867Schristos	rotr	$12,$12,16
3916410c867Schristos#else
3926410c867Schristos	srl	$17,$12,24		# byte swap(4)
3936410c867Schristos	srl	$18,$12,8
3946410c867Schristos	andi	$19,$12,0xFF00
3956410c867Schristos	sll	$12,$12,24
3966410c867Schristos	andi	$18,0xFF00
3976410c867Schristos	sll	$19,$19,8
3986410c867Schristos	or	$12,$17
3996410c867Schristos	or	$18,$19
4006410c867Schristos	or	$12,$18
4016410c867Schristos#endif
4026410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
4036410c867Schristos	xor	$19,$2,$3			# 4
4046410c867Schristos	rotr	$17,$1,6
4056410c867Schristos	addu	$16,$12,$7
4066410c867Schristos	rotr	$18,$1,11
4076410c867Schristos	and	$19,$1
4086410c867Schristos	rotr	$7,$1,25
4096410c867Schristos	xor	$17,$18
4106410c867Schristos	rotr	$18,$24,2
4116410c867Schristos	xor	$19,$3			# Ch(e,f,g)
4126410c867Schristos	xor	$17,$7			# Sigma1(e)
4136410c867Schristos
4146410c867Schristos	rotr	$7,$24,13
4156410c867Schristos	addu	$16,$19
4166410c867Schristos	lw	$19,16($6)		# K[4]
4176410c867Schristos	xor	$7,$18
4186410c867Schristos	rotr	$18,$24,22
4196410c867Schristos	addu	$16,$17
4206410c867Schristos	and	$17,$25,$30
4216410c867Schristos	xor	$7,$18			# Sigma0(a)
4226410c867Schristos	xor	$18,$25,$30
4236410c867Schristos#else
4246410c867Schristos	addu	$16,$12,$7			# 4
4256410c867Schristos	srl	$7,$1,6
4266410c867Schristos	xor	$19,$2,$3
4276410c867Schristos	sll	$18,$1,7
4286410c867Schristos	and	$19,$1
4296410c867Schristos	srl	$17,$1,11
4306410c867Schristos	xor	$7,$18
4316410c867Schristos	sll	$18,$1,21
4326410c867Schristos	xor	$7,$17
4336410c867Schristos	srl	$17,$1,25
4346410c867Schristos	xor	$7,$18
4356410c867Schristos	sll	$18,$1,26
4366410c867Schristos	xor	$7,$17
4376410c867Schristos	xor	$19,$3			# Ch(e,f,g)
4386410c867Schristos	xor	$17,$18,$7			# Sigma1(e)
4396410c867Schristos
4406410c867Schristos	srl	$7,$24,2
4416410c867Schristos	addu	$16,$19
4426410c867Schristos	lw	$19,16($6)		# K[4]
4436410c867Schristos	sll	$18,$24,10
4446410c867Schristos	addu	$16,$17
4456410c867Schristos	srl	$17,$24,13
4466410c867Schristos	xor	$7,$18
4476410c867Schristos	sll	$18,$24,19
4486410c867Schristos	xor	$7,$17
4496410c867Schristos	srl	$17,$24,22
4506410c867Schristos	xor	$7,$18
4516410c867Schristos	sll	$18,$24,30
4526410c867Schristos	xor	$7,$17
4536410c867Schristos	and	$17,$25,$30
4546410c867Schristos	xor	$7,$18			# Sigma0(a)
4556410c867Schristos	xor	$18,$25,$30
4566410c867Schristos#endif
4576410c867Schristos	sw	$12,16($29)	# offload to ring buffer
4586410c867Schristos	addu	$7,$17
4596410c867Schristos	and	$18,$24
4606410c867Schristos	addu	$16,$19			# +=K[4]
4616410c867Schristos	addu	$7,$18			# +=Maj(a,b,c)
4626410c867Schristos	addu	$31,$16
4636410c867Schristos	addu	$7,$16
464*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
465*e0ea3921Schristos	lw	$14,24($5)
466*e0ea3921Schristos#else
4676410c867Schristos	lwl	$14,27($5)
4686410c867Schristos	lwr	$14,24($5)
469*e0ea3921Schristos#endif
4706410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
4716410c867Schristos	wsbh	$13,$13		# byte swap(5)
4726410c867Schristos	rotr	$13,$13,16
4736410c867Schristos#else
4746410c867Schristos	srl	$18,$13,24		# byte swap(5)
4756410c867Schristos	srl	$19,$13,8
4766410c867Schristos	andi	$20,$13,0xFF00
4776410c867Schristos	sll	$13,$13,24
4786410c867Schristos	andi	$19,0xFF00
4796410c867Schristos	sll	$20,$20,8
4806410c867Schristos	or	$13,$18
4816410c867Schristos	or	$19,$20
4826410c867Schristos	or	$13,$19
4836410c867Schristos#endif
4846410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
4856410c867Schristos	xor	$20,$1,$2			# 5
4866410c867Schristos	rotr	$18,$31,6
4876410c867Schristos	addu	$17,$13,$3
4886410c867Schristos	rotr	$19,$31,11
4896410c867Schristos	and	$20,$31
4906410c867Schristos	rotr	$3,$31,25
4916410c867Schristos	xor	$18,$19
4926410c867Schristos	rotr	$19,$7,2
4936410c867Schristos	xor	$20,$2			# Ch(e,f,g)
4946410c867Schristos	xor	$18,$3			# Sigma1(e)
4956410c867Schristos
4966410c867Schristos	rotr	$3,$7,13
4976410c867Schristos	addu	$17,$20
4986410c867Schristos	lw	$20,20($6)		# K[5]
4996410c867Schristos	xor	$3,$19
5006410c867Schristos	rotr	$19,$7,22
5016410c867Schristos	addu	$17,$18
5026410c867Schristos	and	$18,$24,$25
5036410c867Schristos	xor	$3,$19			# Sigma0(a)
5046410c867Schristos	xor	$19,$24,$25
5056410c867Schristos#else
5066410c867Schristos	addu	$17,$13,$3			# 5
5076410c867Schristos	srl	$3,$31,6
5086410c867Schristos	xor	$20,$1,$2
5096410c867Schristos	sll	$19,$31,7
5106410c867Schristos	and	$20,$31
5116410c867Schristos	srl	$18,$31,11
5126410c867Schristos	xor	$3,$19
5136410c867Schristos	sll	$19,$31,21
5146410c867Schristos	xor	$3,$18
5156410c867Schristos	srl	$18,$31,25
5166410c867Schristos	xor	$3,$19
5176410c867Schristos	sll	$19,$31,26
5186410c867Schristos	xor	$3,$18
5196410c867Schristos	xor	$20,$2			# Ch(e,f,g)
5206410c867Schristos	xor	$18,$19,$3			# Sigma1(e)
5216410c867Schristos
5226410c867Schristos	srl	$3,$7,2
5236410c867Schristos	addu	$17,$20
5246410c867Schristos	lw	$20,20($6)		# K[5]
5256410c867Schristos	sll	$19,$7,10
5266410c867Schristos	addu	$17,$18
5276410c867Schristos	srl	$18,$7,13
5286410c867Schristos	xor	$3,$19
5296410c867Schristos	sll	$19,$7,19
5306410c867Schristos	xor	$3,$18
5316410c867Schristos	srl	$18,$7,22
5326410c867Schristos	xor	$3,$19
5336410c867Schristos	sll	$19,$7,30
5346410c867Schristos	xor	$3,$18
5356410c867Schristos	and	$18,$24,$25
5366410c867Schristos	xor	$3,$19			# Sigma0(a)
5376410c867Schristos	xor	$19,$24,$25
5386410c867Schristos#endif
5396410c867Schristos	sw	$13,20($29)	# offload to ring buffer
5406410c867Schristos	addu	$3,$18
5416410c867Schristos	and	$19,$7
5426410c867Schristos	addu	$17,$20			# +=K[5]
5436410c867Schristos	addu	$3,$19			# +=Maj(a,b,c)
5446410c867Schristos	addu	$30,$17
5456410c867Schristos	addu	$3,$17
546*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
547*e0ea3921Schristos	lw	$15,28($5)
548*e0ea3921Schristos#else
5496410c867Schristos	lwl	$15,31($5)
5506410c867Schristos	lwr	$15,28($5)
551*e0ea3921Schristos#endif
5526410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
5536410c867Schristos	wsbh	$14,$14		# byte swap(6)
5546410c867Schristos	rotr	$14,$14,16
5556410c867Schristos#else
5566410c867Schristos	srl	$19,$14,24		# byte swap(6)
5576410c867Schristos	srl	$20,$14,8
5586410c867Schristos	andi	$21,$14,0xFF00
5596410c867Schristos	sll	$14,$14,24
5606410c867Schristos	andi	$20,0xFF00
5616410c867Schristos	sll	$21,$21,8
5626410c867Schristos	or	$14,$19
5636410c867Schristos	or	$20,$21
5646410c867Schristos	or	$14,$20
5656410c867Schristos#endif
5666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
5676410c867Schristos	xor	$21,$31,$1			# 6
5686410c867Schristos	rotr	$19,$30,6
5696410c867Schristos	addu	$18,$14,$2
5706410c867Schristos	rotr	$20,$30,11
5716410c867Schristos	and	$21,$30
5726410c867Schristos	rotr	$2,$30,25
5736410c867Schristos	xor	$19,$20
5746410c867Schristos	rotr	$20,$3,2
5756410c867Schristos	xor	$21,$1			# Ch(e,f,g)
5766410c867Schristos	xor	$19,$2			# Sigma1(e)
5776410c867Schristos
5786410c867Schristos	rotr	$2,$3,13
5796410c867Schristos	addu	$18,$21
5806410c867Schristos	lw	$21,24($6)		# K[6]
5816410c867Schristos	xor	$2,$20
5826410c867Schristos	rotr	$20,$3,22
5836410c867Schristos	addu	$18,$19
5846410c867Schristos	and	$19,$7,$24
5856410c867Schristos	xor	$2,$20			# Sigma0(a)
5866410c867Schristos	xor	$20,$7,$24
5876410c867Schristos#else
5886410c867Schristos	addu	$18,$14,$2			# 6
5896410c867Schristos	srl	$2,$30,6
5906410c867Schristos	xor	$21,$31,$1
5916410c867Schristos	sll	$20,$30,7
5926410c867Schristos	and	$21,$30
5936410c867Schristos	srl	$19,$30,11
5946410c867Schristos	xor	$2,$20
5956410c867Schristos	sll	$20,$30,21
5966410c867Schristos	xor	$2,$19
5976410c867Schristos	srl	$19,$30,25
5986410c867Schristos	xor	$2,$20
5996410c867Schristos	sll	$20,$30,26
6006410c867Schristos	xor	$2,$19
6016410c867Schristos	xor	$21,$1			# Ch(e,f,g)
6026410c867Schristos	xor	$19,$20,$2			# Sigma1(e)
6036410c867Schristos
6046410c867Schristos	srl	$2,$3,2
6056410c867Schristos	addu	$18,$21
6066410c867Schristos	lw	$21,24($6)		# K[6]
6076410c867Schristos	sll	$20,$3,10
6086410c867Schristos	addu	$18,$19
6096410c867Schristos	srl	$19,$3,13
6106410c867Schristos	xor	$2,$20
6116410c867Schristos	sll	$20,$3,19
6126410c867Schristos	xor	$2,$19
6136410c867Schristos	srl	$19,$3,22
6146410c867Schristos	xor	$2,$20
6156410c867Schristos	sll	$20,$3,30
6166410c867Schristos	xor	$2,$19
6176410c867Schristos	and	$19,$7,$24
6186410c867Schristos	xor	$2,$20			# Sigma0(a)
6196410c867Schristos	xor	$20,$7,$24
6206410c867Schristos#endif
6216410c867Schristos	sw	$14,24($29)	# offload to ring buffer
6226410c867Schristos	addu	$2,$19
6236410c867Schristos	and	$20,$3
6246410c867Schristos	addu	$18,$21			# +=K[6]
6256410c867Schristos	addu	$2,$20			# +=Maj(a,b,c)
6266410c867Schristos	addu	$25,$18
6276410c867Schristos	addu	$2,$18
628*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
629*e0ea3921Schristos	lw	$16,32($5)
630*e0ea3921Schristos#else
6316410c867Schristos	lwl	$16,35($5)
6326410c867Schristos	lwr	$16,32($5)
633*e0ea3921Schristos#endif
6346410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
6356410c867Schristos	wsbh	$15,$15		# byte swap(7)
6366410c867Schristos	rotr	$15,$15,16
6376410c867Schristos#else
6386410c867Schristos	srl	$20,$15,24		# byte swap(7)
6396410c867Schristos	srl	$21,$15,8
6406410c867Schristos	andi	$22,$15,0xFF00
6416410c867Schristos	sll	$15,$15,24
6426410c867Schristos	andi	$21,0xFF00
6436410c867Schristos	sll	$22,$22,8
6446410c867Schristos	or	$15,$20
6456410c867Schristos	or	$21,$22
6466410c867Schristos	or	$15,$21
6476410c867Schristos#endif
6486410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
6496410c867Schristos	xor	$22,$30,$31			# 7
6506410c867Schristos	rotr	$20,$25,6
6516410c867Schristos	addu	$19,$15,$1
6526410c867Schristos	rotr	$21,$25,11
6536410c867Schristos	and	$22,$25
6546410c867Schristos	rotr	$1,$25,25
6556410c867Schristos	xor	$20,$21
6566410c867Schristos	rotr	$21,$2,2
6576410c867Schristos	xor	$22,$31			# Ch(e,f,g)
6586410c867Schristos	xor	$20,$1			# Sigma1(e)
6596410c867Schristos
6606410c867Schristos	rotr	$1,$2,13
6616410c867Schristos	addu	$19,$22
6626410c867Schristos	lw	$22,28($6)		# K[7]
6636410c867Schristos	xor	$1,$21
6646410c867Schristos	rotr	$21,$2,22
6656410c867Schristos	addu	$19,$20
6666410c867Schristos	and	$20,$3,$7
6676410c867Schristos	xor	$1,$21			# Sigma0(a)
6686410c867Schristos	xor	$21,$3,$7
6696410c867Schristos#else
6706410c867Schristos	addu	$19,$15,$1			# 7
6716410c867Schristos	srl	$1,$25,6
6726410c867Schristos	xor	$22,$30,$31
6736410c867Schristos	sll	$21,$25,7
6746410c867Schristos	and	$22,$25
6756410c867Schristos	srl	$20,$25,11
6766410c867Schristos	xor	$1,$21
6776410c867Schristos	sll	$21,$25,21
6786410c867Schristos	xor	$1,$20
6796410c867Schristos	srl	$20,$25,25
6806410c867Schristos	xor	$1,$21
6816410c867Schristos	sll	$21,$25,26
6826410c867Schristos	xor	$1,$20
6836410c867Schristos	xor	$22,$31			# Ch(e,f,g)
6846410c867Schristos	xor	$20,$21,$1			# Sigma1(e)
6856410c867Schristos
6866410c867Schristos	srl	$1,$2,2
6876410c867Schristos	addu	$19,$22
6886410c867Schristos	lw	$22,28($6)		# K[7]
6896410c867Schristos	sll	$21,$2,10
6906410c867Schristos	addu	$19,$20
6916410c867Schristos	srl	$20,$2,13
6926410c867Schristos	xor	$1,$21
6936410c867Schristos	sll	$21,$2,19
6946410c867Schristos	xor	$1,$20
6956410c867Schristos	srl	$20,$2,22
6966410c867Schristos	xor	$1,$21
6976410c867Schristos	sll	$21,$2,30
6986410c867Schristos	xor	$1,$20
6996410c867Schristos	and	$20,$3,$7
7006410c867Schristos	xor	$1,$21			# Sigma0(a)
7016410c867Schristos	xor	$21,$3,$7
7026410c867Schristos#endif
7036410c867Schristos	sw	$15,28($29)	# offload to ring buffer
7046410c867Schristos	addu	$1,$20
7056410c867Schristos	and	$21,$2
7066410c867Schristos	addu	$19,$22			# +=K[7]
7076410c867Schristos	addu	$1,$21			# +=Maj(a,b,c)
7086410c867Schristos	addu	$24,$19
7096410c867Schristos	addu	$1,$19
710*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
711*e0ea3921Schristos	lw	$17,36($5)
712*e0ea3921Schristos#else
7136410c867Schristos	lwl	$17,39($5)
7146410c867Schristos	lwr	$17,36($5)
715*e0ea3921Schristos#endif
7166410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
7176410c867Schristos	wsbh	$16,$16		# byte swap(8)
7186410c867Schristos	rotr	$16,$16,16
7196410c867Schristos#else
7206410c867Schristos	srl	$21,$16,24		# byte swap(8)
7216410c867Schristos	srl	$22,$16,8
7226410c867Schristos	andi	$23,$16,0xFF00
7236410c867Schristos	sll	$16,$16,24
7246410c867Schristos	andi	$22,0xFF00
7256410c867Schristos	sll	$23,$23,8
7266410c867Schristos	or	$16,$21
7276410c867Schristos	or	$22,$23
7286410c867Schristos	or	$16,$22
7296410c867Schristos#endif
7306410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
7316410c867Schristos	xor	$23,$25,$30			# 8
7326410c867Schristos	rotr	$21,$24,6
7336410c867Schristos	addu	$20,$16,$31
7346410c867Schristos	rotr	$22,$24,11
7356410c867Schristos	and	$23,$24
7366410c867Schristos	rotr	$31,$24,25
7376410c867Schristos	xor	$21,$22
7386410c867Schristos	rotr	$22,$1,2
7396410c867Schristos	xor	$23,$30			# Ch(e,f,g)
7406410c867Schristos	xor	$21,$31			# Sigma1(e)
7416410c867Schristos
7426410c867Schristos	rotr	$31,$1,13
7436410c867Schristos	addu	$20,$23
7446410c867Schristos	lw	$23,32($6)		# K[8]
7456410c867Schristos	xor	$31,$22
7466410c867Schristos	rotr	$22,$1,22
7476410c867Schristos	addu	$20,$21
7486410c867Schristos	and	$21,$2,$3
7496410c867Schristos	xor	$31,$22			# Sigma0(a)
7506410c867Schristos	xor	$22,$2,$3
7516410c867Schristos#else
7526410c867Schristos	addu	$20,$16,$31			# 8
7536410c867Schristos	srl	$31,$24,6
7546410c867Schristos	xor	$23,$25,$30
7556410c867Schristos	sll	$22,$24,7
7566410c867Schristos	and	$23,$24
7576410c867Schristos	srl	$21,$24,11
7586410c867Schristos	xor	$31,$22
7596410c867Schristos	sll	$22,$24,21
7606410c867Schristos	xor	$31,$21
7616410c867Schristos	srl	$21,$24,25
7626410c867Schristos	xor	$31,$22
7636410c867Schristos	sll	$22,$24,26
7646410c867Schristos	xor	$31,$21
7656410c867Schristos	xor	$23,$30			# Ch(e,f,g)
7666410c867Schristos	xor	$21,$22,$31			# Sigma1(e)
7676410c867Schristos
7686410c867Schristos	srl	$31,$1,2
7696410c867Schristos	addu	$20,$23
7706410c867Schristos	lw	$23,32($6)		# K[8]
7716410c867Schristos	sll	$22,$1,10
7726410c867Schristos	addu	$20,$21
7736410c867Schristos	srl	$21,$1,13
7746410c867Schristos	xor	$31,$22
7756410c867Schristos	sll	$22,$1,19
7766410c867Schristos	xor	$31,$21
7776410c867Schristos	srl	$21,$1,22
7786410c867Schristos	xor	$31,$22
7796410c867Schristos	sll	$22,$1,30
7806410c867Schristos	xor	$31,$21
7816410c867Schristos	and	$21,$2,$3
7826410c867Schristos	xor	$31,$22			# Sigma0(a)
7836410c867Schristos	xor	$22,$2,$3
7846410c867Schristos#endif
7856410c867Schristos	sw	$16,32($29)	# offload to ring buffer
7866410c867Schristos	addu	$31,$21
7876410c867Schristos	and	$22,$1
7886410c867Schristos	addu	$20,$23			# +=K[8]
7896410c867Schristos	addu	$31,$22			# +=Maj(a,b,c)
7906410c867Schristos	addu	$7,$20
7916410c867Schristos	addu	$31,$20
792*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
793*e0ea3921Schristos	lw	$18,40($5)
794*e0ea3921Schristos#else
7956410c867Schristos	lwl	$18,43($5)
7966410c867Schristos	lwr	$18,40($5)
797*e0ea3921Schristos#endif
7986410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
7996410c867Schristos	wsbh	$17,$17		# byte swap(9)
8006410c867Schristos	rotr	$17,$17,16
8016410c867Schristos#else
8026410c867Schristos	srl	$22,$17,24		# byte swap(9)
8036410c867Schristos	srl	$23,$17,8
8046410c867Schristos	andi	$8,$17,0xFF00
8056410c867Schristos	sll	$17,$17,24
8066410c867Schristos	andi	$23,0xFF00
8076410c867Schristos	sll	$8,$8,8
8086410c867Schristos	or	$17,$22
8096410c867Schristos	or	$23,$8
8106410c867Schristos	or	$17,$23
8116410c867Schristos#endif
8126410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
8136410c867Schristos	xor	$8,$24,$25			# 9
8146410c867Schristos	rotr	$22,$7,6
8156410c867Schristos	addu	$21,$17,$30
8166410c867Schristos	rotr	$23,$7,11
8176410c867Schristos	and	$8,$7
8186410c867Schristos	rotr	$30,$7,25
8196410c867Schristos	xor	$22,$23
8206410c867Schristos	rotr	$23,$31,2
8216410c867Schristos	xor	$8,$25			# Ch(e,f,g)
8226410c867Schristos	xor	$22,$30			# Sigma1(e)
8236410c867Schristos
8246410c867Schristos	rotr	$30,$31,13
8256410c867Schristos	addu	$21,$8
8266410c867Schristos	lw	$8,36($6)		# K[9]
8276410c867Schristos	xor	$30,$23
8286410c867Schristos	rotr	$23,$31,22
8296410c867Schristos	addu	$21,$22
8306410c867Schristos	and	$22,$1,$2
8316410c867Schristos	xor	$30,$23			# Sigma0(a)
8326410c867Schristos	xor	$23,$1,$2
8336410c867Schristos#else
8346410c867Schristos	addu	$21,$17,$30			# 9
8356410c867Schristos	srl	$30,$7,6
8366410c867Schristos	xor	$8,$24,$25
8376410c867Schristos	sll	$23,$7,7
8386410c867Schristos	and	$8,$7
8396410c867Schristos	srl	$22,$7,11
8406410c867Schristos	xor	$30,$23
8416410c867Schristos	sll	$23,$7,21
8426410c867Schristos	xor	$30,$22
8436410c867Schristos	srl	$22,$7,25
8446410c867Schristos	xor	$30,$23
8456410c867Schristos	sll	$23,$7,26
8466410c867Schristos	xor	$30,$22
8476410c867Schristos	xor	$8,$25			# Ch(e,f,g)
8486410c867Schristos	xor	$22,$23,$30			# Sigma1(e)
8496410c867Schristos
8506410c867Schristos	srl	$30,$31,2
8516410c867Schristos	addu	$21,$8
8526410c867Schristos	lw	$8,36($6)		# K[9]
8536410c867Schristos	sll	$23,$31,10
8546410c867Schristos	addu	$21,$22
8556410c867Schristos	srl	$22,$31,13
8566410c867Schristos	xor	$30,$23
8576410c867Schristos	sll	$23,$31,19
8586410c867Schristos	xor	$30,$22
8596410c867Schristos	srl	$22,$31,22
8606410c867Schristos	xor	$30,$23
8616410c867Schristos	sll	$23,$31,30
8626410c867Schristos	xor	$30,$22
8636410c867Schristos	and	$22,$1,$2
8646410c867Schristos	xor	$30,$23			# Sigma0(a)
8656410c867Schristos	xor	$23,$1,$2
8666410c867Schristos#endif
8676410c867Schristos	sw	$17,36($29)	# offload to ring buffer
8686410c867Schristos	addu	$30,$22
8696410c867Schristos	and	$23,$31
8706410c867Schristos	addu	$21,$8			# +=K[9]
8716410c867Schristos	addu	$30,$23			# +=Maj(a,b,c)
8726410c867Schristos	addu	$3,$21
8736410c867Schristos	addu	$30,$21
874*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
875*e0ea3921Schristos	lw	$19,44($5)
876*e0ea3921Schristos#else
8776410c867Schristos	lwl	$19,47($5)
8786410c867Schristos	lwr	$19,44($5)
879*e0ea3921Schristos#endif
8806410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
8816410c867Schristos	wsbh	$18,$18		# byte swap(10)
8826410c867Schristos	rotr	$18,$18,16
8836410c867Schristos#else
8846410c867Schristos	srl	$23,$18,24		# byte swap(10)
8856410c867Schristos	srl	$8,$18,8
8866410c867Schristos	andi	$9,$18,0xFF00
8876410c867Schristos	sll	$18,$18,24
8886410c867Schristos	andi	$8,0xFF00
8896410c867Schristos	sll	$9,$9,8
8906410c867Schristos	or	$18,$23
8916410c867Schristos	or	$8,$9
8926410c867Schristos	or	$18,$8
8936410c867Schristos#endif
8946410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
8956410c867Schristos	xor	$9,$7,$24			# 10
8966410c867Schristos	rotr	$23,$3,6
8976410c867Schristos	addu	$22,$18,$25
8986410c867Schristos	rotr	$8,$3,11
8996410c867Schristos	and	$9,$3
9006410c867Schristos	rotr	$25,$3,25
9016410c867Schristos	xor	$23,$8
9026410c867Schristos	rotr	$8,$30,2
9036410c867Schristos	xor	$9,$24			# Ch(e,f,g)
9046410c867Schristos	xor	$23,$25			# Sigma1(e)
9056410c867Schristos
9066410c867Schristos	rotr	$25,$30,13
9076410c867Schristos	addu	$22,$9
9086410c867Schristos	lw	$9,40($6)		# K[10]
9096410c867Schristos	xor	$25,$8
9106410c867Schristos	rotr	$8,$30,22
9116410c867Schristos	addu	$22,$23
9126410c867Schristos	and	$23,$31,$1
9136410c867Schristos	xor	$25,$8			# Sigma0(a)
9146410c867Schristos	xor	$8,$31,$1
9156410c867Schristos#else
9166410c867Schristos	addu	$22,$18,$25			# 10
9176410c867Schristos	srl	$25,$3,6
9186410c867Schristos	xor	$9,$7,$24
9196410c867Schristos	sll	$8,$3,7
9206410c867Schristos	and	$9,$3
9216410c867Schristos	srl	$23,$3,11
9226410c867Schristos	xor	$25,$8
9236410c867Schristos	sll	$8,$3,21
9246410c867Schristos	xor	$25,$23
9256410c867Schristos	srl	$23,$3,25
9266410c867Schristos	xor	$25,$8
9276410c867Schristos	sll	$8,$3,26
9286410c867Schristos	xor	$25,$23
9296410c867Schristos	xor	$9,$24			# Ch(e,f,g)
9306410c867Schristos	xor	$23,$8,$25			# Sigma1(e)
9316410c867Schristos
9326410c867Schristos	srl	$25,$30,2
9336410c867Schristos	addu	$22,$9
9346410c867Schristos	lw	$9,40($6)		# K[10]
9356410c867Schristos	sll	$8,$30,10
9366410c867Schristos	addu	$22,$23
9376410c867Schristos	srl	$23,$30,13
9386410c867Schristos	xor	$25,$8
9396410c867Schristos	sll	$8,$30,19
9406410c867Schristos	xor	$25,$23
9416410c867Schristos	srl	$23,$30,22
9426410c867Schristos	xor	$25,$8
9436410c867Schristos	sll	$8,$30,30
9446410c867Schristos	xor	$25,$23
9456410c867Schristos	and	$23,$31,$1
9466410c867Schristos	xor	$25,$8			# Sigma0(a)
9476410c867Schristos	xor	$8,$31,$1
9486410c867Schristos#endif
9496410c867Schristos	sw	$18,40($29)	# offload to ring buffer
9506410c867Schristos	addu	$25,$23
9516410c867Schristos	and	$8,$30
9526410c867Schristos	addu	$22,$9			# +=K[10]
9536410c867Schristos	addu	$25,$8			# +=Maj(a,b,c)
9546410c867Schristos	addu	$2,$22
9556410c867Schristos	addu	$25,$22
956*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
957*e0ea3921Schristos	lw	$20,48($5)
958*e0ea3921Schristos#else
9596410c867Schristos	lwl	$20,51($5)
9606410c867Schristos	lwr	$20,48($5)
961*e0ea3921Schristos#endif
9626410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
9636410c867Schristos	wsbh	$19,$19		# byte swap(11)
9646410c867Schristos	rotr	$19,$19,16
9656410c867Schristos#else
9666410c867Schristos	srl	$8,$19,24		# byte swap(11)
9676410c867Schristos	srl	$9,$19,8
9686410c867Schristos	andi	$10,$19,0xFF00
9696410c867Schristos	sll	$19,$19,24
9706410c867Schristos	andi	$9,0xFF00
9716410c867Schristos	sll	$10,$10,8
9726410c867Schristos	or	$19,$8
9736410c867Schristos	or	$9,$10
9746410c867Schristos	or	$19,$9
9756410c867Schristos#endif
9766410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
9776410c867Schristos	xor	$10,$3,$7			# 11
9786410c867Schristos	rotr	$8,$2,6
9796410c867Schristos	addu	$23,$19,$24
9806410c867Schristos	rotr	$9,$2,11
9816410c867Schristos	and	$10,$2
9826410c867Schristos	rotr	$24,$2,25
9836410c867Schristos	xor	$8,$9
9846410c867Schristos	rotr	$9,$25,2
9856410c867Schristos	xor	$10,$7			# Ch(e,f,g)
9866410c867Schristos	xor	$8,$24			# Sigma1(e)
9876410c867Schristos
9886410c867Schristos	rotr	$24,$25,13
9896410c867Schristos	addu	$23,$10
9906410c867Schristos	lw	$10,44($6)		# K[11]
9916410c867Schristos	xor	$24,$9
9926410c867Schristos	rotr	$9,$25,22
9936410c867Schristos	addu	$23,$8
9946410c867Schristos	and	$8,$30,$31
9956410c867Schristos	xor	$24,$9			# Sigma0(a)
9966410c867Schristos	xor	$9,$30,$31
9976410c867Schristos#else
9986410c867Schristos	addu	$23,$19,$24			# 11
9996410c867Schristos	srl	$24,$2,6
10006410c867Schristos	xor	$10,$3,$7
10016410c867Schristos	sll	$9,$2,7
10026410c867Schristos	and	$10,$2
10036410c867Schristos	srl	$8,$2,11
10046410c867Schristos	xor	$24,$9
10056410c867Schristos	sll	$9,$2,21
10066410c867Schristos	xor	$24,$8
10076410c867Schristos	srl	$8,$2,25
10086410c867Schristos	xor	$24,$9
10096410c867Schristos	sll	$9,$2,26
10106410c867Schristos	xor	$24,$8
10116410c867Schristos	xor	$10,$7			# Ch(e,f,g)
10126410c867Schristos	xor	$8,$9,$24			# Sigma1(e)
10136410c867Schristos
10146410c867Schristos	srl	$24,$25,2
10156410c867Schristos	addu	$23,$10
10166410c867Schristos	lw	$10,44($6)		# K[11]
10176410c867Schristos	sll	$9,$25,10
10186410c867Schristos	addu	$23,$8
10196410c867Schristos	srl	$8,$25,13
10206410c867Schristos	xor	$24,$9
10216410c867Schristos	sll	$9,$25,19
10226410c867Schristos	xor	$24,$8
10236410c867Schristos	srl	$8,$25,22
10246410c867Schristos	xor	$24,$9
10256410c867Schristos	sll	$9,$25,30
10266410c867Schristos	xor	$24,$8
10276410c867Schristos	and	$8,$30,$31
10286410c867Schristos	xor	$24,$9			# Sigma0(a)
10296410c867Schristos	xor	$9,$30,$31
10306410c867Schristos#endif
10316410c867Schristos	sw	$19,44($29)	# offload to ring buffer
10326410c867Schristos	addu	$24,$8
10336410c867Schristos	and	$9,$25
10346410c867Schristos	addu	$23,$10			# +=K[11]
10356410c867Schristos	addu	$24,$9			# +=Maj(a,b,c)
10366410c867Schristos	addu	$1,$23
10376410c867Schristos	addu	$24,$23
1038*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
1039*e0ea3921Schristos	lw	$21,52($5)
1040*e0ea3921Schristos#else
10416410c867Schristos	lwl	$21,55($5)
10426410c867Schristos	lwr	$21,52($5)
1043*e0ea3921Schristos#endif
10446410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
10456410c867Schristos	wsbh	$20,$20		# byte swap(12)
10466410c867Schristos	rotr	$20,$20,16
10476410c867Schristos#else
10486410c867Schristos	srl	$9,$20,24		# byte swap(12)
10496410c867Schristos	srl	$10,$20,8
10506410c867Schristos	andi	$11,$20,0xFF00
10516410c867Schristos	sll	$20,$20,24
10526410c867Schristos	andi	$10,0xFF00
10536410c867Schristos	sll	$11,$11,8
10546410c867Schristos	or	$20,$9
10556410c867Schristos	or	$10,$11
10566410c867Schristos	or	$20,$10
10576410c867Schristos#endif
10586410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
10596410c867Schristos	xor	$11,$2,$3			# 12
10606410c867Schristos	rotr	$9,$1,6
10616410c867Schristos	addu	$8,$20,$7
10626410c867Schristos	rotr	$10,$1,11
10636410c867Schristos	and	$11,$1
10646410c867Schristos	rotr	$7,$1,25
10656410c867Schristos	xor	$9,$10
10666410c867Schristos	rotr	$10,$24,2
10676410c867Schristos	xor	$11,$3			# Ch(e,f,g)
10686410c867Schristos	xor	$9,$7			# Sigma1(e)
10696410c867Schristos
10706410c867Schristos	rotr	$7,$24,13
10716410c867Schristos	addu	$8,$11
10726410c867Schristos	lw	$11,48($6)		# K[12]
10736410c867Schristos	xor	$7,$10
10746410c867Schristos	rotr	$10,$24,22
10756410c867Schristos	addu	$8,$9
10766410c867Schristos	and	$9,$25,$30
10776410c867Schristos	xor	$7,$10			# Sigma0(a)
10786410c867Schristos	xor	$10,$25,$30
10796410c867Schristos#else
10806410c867Schristos	addu	$8,$20,$7			# 12
10816410c867Schristos	srl	$7,$1,6
10826410c867Schristos	xor	$11,$2,$3
10836410c867Schristos	sll	$10,$1,7
10846410c867Schristos	and	$11,$1
10856410c867Schristos	srl	$9,$1,11
10866410c867Schristos	xor	$7,$10
10876410c867Schristos	sll	$10,$1,21
10886410c867Schristos	xor	$7,$9
10896410c867Schristos	srl	$9,$1,25
10906410c867Schristos	xor	$7,$10
10916410c867Schristos	sll	$10,$1,26
10926410c867Schristos	xor	$7,$9
10936410c867Schristos	xor	$11,$3			# Ch(e,f,g)
10946410c867Schristos	xor	$9,$10,$7			# Sigma1(e)
10956410c867Schristos
10966410c867Schristos	srl	$7,$24,2
10976410c867Schristos	addu	$8,$11
10986410c867Schristos	lw	$11,48($6)		# K[12]
10996410c867Schristos	sll	$10,$24,10
11006410c867Schristos	addu	$8,$9
11016410c867Schristos	srl	$9,$24,13
11026410c867Schristos	xor	$7,$10
11036410c867Schristos	sll	$10,$24,19
11046410c867Schristos	xor	$7,$9
11056410c867Schristos	srl	$9,$24,22
11066410c867Schristos	xor	$7,$10
11076410c867Schristos	sll	$10,$24,30
11086410c867Schristos	xor	$7,$9
11096410c867Schristos	and	$9,$25,$30
11106410c867Schristos	xor	$7,$10			# Sigma0(a)
11116410c867Schristos	xor	$10,$25,$30
11126410c867Schristos#endif
11136410c867Schristos	sw	$20,48($29)	# offload to ring buffer
11146410c867Schristos	addu	$7,$9
11156410c867Schristos	and	$10,$24
11166410c867Schristos	addu	$8,$11			# +=K[12]
11176410c867Schristos	addu	$7,$10			# +=Maj(a,b,c)
11186410c867Schristos	addu	$31,$8
11196410c867Schristos	addu	$7,$8
1120*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
1121*e0ea3921Schristos	lw	$22,56($5)
1122*e0ea3921Schristos#else
11236410c867Schristos	lwl	$22,59($5)
11246410c867Schristos	lwr	$22,56($5)
1125*e0ea3921Schristos#endif
11266410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
11276410c867Schristos	wsbh	$21,$21		# byte swap(13)
11286410c867Schristos	rotr	$21,$21,16
11296410c867Schristos#else
11306410c867Schristos	srl	$10,$21,24		# byte swap(13)
11316410c867Schristos	srl	$11,$21,8
11326410c867Schristos	andi	$12,$21,0xFF00
11336410c867Schristos	sll	$21,$21,24
11346410c867Schristos	andi	$11,0xFF00
11356410c867Schristos	sll	$12,$12,8
11366410c867Schristos	or	$21,$10
11376410c867Schristos	or	$11,$12
11386410c867Schristos	or	$21,$11
11396410c867Schristos#endif
11406410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
11416410c867Schristos	xor	$12,$1,$2			# 13
11426410c867Schristos	rotr	$10,$31,6
11436410c867Schristos	addu	$9,$21,$3
11446410c867Schristos	rotr	$11,$31,11
11456410c867Schristos	and	$12,$31
11466410c867Schristos	rotr	$3,$31,25
11476410c867Schristos	xor	$10,$11
11486410c867Schristos	rotr	$11,$7,2
11496410c867Schristos	xor	$12,$2			# Ch(e,f,g)
11506410c867Schristos	xor	$10,$3			# Sigma1(e)
11516410c867Schristos
11526410c867Schristos	rotr	$3,$7,13
11536410c867Schristos	addu	$9,$12
11546410c867Schristos	lw	$12,52($6)		# K[13]
11556410c867Schristos	xor	$3,$11
11566410c867Schristos	rotr	$11,$7,22
11576410c867Schristos	addu	$9,$10
11586410c867Schristos	and	$10,$24,$25
11596410c867Schristos	xor	$3,$11			# Sigma0(a)
11606410c867Schristos	xor	$11,$24,$25
11616410c867Schristos#else
11626410c867Schristos	addu	$9,$21,$3			# 13
11636410c867Schristos	srl	$3,$31,6
11646410c867Schristos	xor	$12,$1,$2
11656410c867Schristos	sll	$11,$31,7
11666410c867Schristos	and	$12,$31
11676410c867Schristos	srl	$10,$31,11
11686410c867Schristos	xor	$3,$11
11696410c867Schristos	sll	$11,$31,21
11706410c867Schristos	xor	$3,$10
11716410c867Schristos	srl	$10,$31,25
11726410c867Schristos	xor	$3,$11
11736410c867Schristos	sll	$11,$31,26
11746410c867Schristos	xor	$3,$10
11756410c867Schristos	xor	$12,$2			# Ch(e,f,g)
11766410c867Schristos	xor	$10,$11,$3			# Sigma1(e)
11776410c867Schristos
11786410c867Schristos	srl	$3,$7,2
11796410c867Schristos	addu	$9,$12
11806410c867Schristos	lw	$12,52($6)		# K[13]
11816410c867Schristos	sll	$11,$7,10
11826410c867Schristos	addu	$9,$10
11836410c867Schristos	srl	$10,$7,13
11846410c867Schristos	xor	$3,$11
11856410c867Schristos	sll	$11,$7,19
11866410c867Schristos	xor	$3,$10
11876410c867Schristos	srl	$10,$7,22
11886410c867Schristos	xor	$3,$11
11896410c867Schristos	sll	$11,$7,30
11906410c867Schristos	xor	$3,$10
11916410c867Schristos	and	$10,$24,$25
11926410c867Schristos	xor	$3,$11			# Sigma0(a)
11936410c867Schristos	xor	$11,$24,$25
11946410c867Schristos#endif
11956410c867Schristos	sw	$21,52($29)	# offload to ring buffer
11966410c867Schristos	addu	$3,$10
11976410c867Schristos	and	$11,$7
11986410c867Schristos	addu	$9,$12			# +=K[13]
11996410c867Schristos	addu	$3,$11			# +=Maj(a,b,c)
12006410c867Schristos	addu	$30,$9
12016410c867Schristos	addu	$3,$9
12026410c867Schristos	lw	$8,0($29)	# prefetch from ring buffer
1203*e0ea3921Schristos#if defined(_MIPS_ARCH_MIPS32R6) || defined(_MIPS_ARCH_MIPS64R6)
1204*e0ea3921Schristos	lw	$23,60($5)
1205*e0ea3921Schristos#else
12066410c867Schristos	lwl	$23,63($5)
12076410c867Schristos	lwr	$23,60($5)
1208*e0ea3921Schristos#endif
12096410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
12106410c867Schristos	wsbh	$22,$22		# byte swap(14)
12116410c867Schristos	rotr	$22,$22,16
12126410c867Schristos#else
12136410c867Schristos	srl	$11,$22,24		# byte swap(14)
12146410c867Schristos	srl	$12,$22,8
12156410c867Schristos	andi	$13,$22,0xFF00
12166410c867Schristos	sll	$22,$22,24
12176410c867Schristos	andi	$12,0xFF00
12186410c867Schristos	sll	$13,$13,8
12196410c867Schristos	or	$22,$11
12206410c867Schristos	or	$12,$13
12216410c867Schristos	or	$22,$12
12226410c867Schristos#endif
12236410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
12246410c867Schristos	xor	$13,$31,$1			# 14
12256410c867Schristos	rotr	$11,$30,6
12266410c867Schristos	addu	$10,$22,$2
12276410c867Schristos	rotr	$12,$30,11
12286410c867Schristos	and	$13,$30
12296410c867Schristos	rotr	$2,$30,25
12306410c867Schristos	xor	$11,$12
12316410c867Schristos	rotr	$12,$3,2
12326410c867Schristos	xor	$13,$1			# Ch(e,f,g)
12336410c867Schristos	xor	$11,$2			# Sigma1(e)
12346410c867Schristos
12356410c867Schristos	rotr	$2,$3,13
12366410c867Schristos	addu	$10,$13
12376410c867Schristos	lw	$13,56($6)		# K[14]
12386410c867Schristos	xor	$2,$12
12396410c867Schristos	rotr	$12,$3,22
12406410c867Schristos	addu	$10,$11
12416410c867Schristos	and	$11,$7,$24
12426410c867Schristos	xor	$2,$12			# Sigma0(a)
12436410c867Schristos	xor	$12,$7,$24
12446410c867Schristos#else
12456410c867Schristos	addu	$10,$22,$2			# 14
12466410c867Schristos	srl	$2,$30,6
12476410c867Schristos	xor	$13,$31,$1
12486410c867Schristos	sll	$12,$30,7
12496410c867Schristos	and	$13,$30
12506410c867Schristos	srl	$11,$30,11
12516410c867Schristos	xor	$2,$12
12526410c867Schristos	sll	$12,$30,21
12536410c867Schristos	xor	$2,$11
12546410c867Schristos	srl	$11,$30,25
12556410c867Schristos	xor	$2,$12
12566410c867Schristos	sll	$12,$30,26
12576410c867Schristos	xor	$2,$11
12586410c867Schristos	xor	$13,$1			# Ch(e,f,g)
12596410c867Schristos	xor	$11,$12,$2			# Sigma1(e)
12606410c867Schristos
12616410c867Schristos	srl	$2,$3,2
12626410c867Schristos	addu	$10,$13
12636410c867Schristos	lw	$13,56($6)		# K[14]
12646410c867Schristos	sll	$12,$3,10
12656410c867Schristos	addu	$10,$11
12666410c867Schristos	srl	$11,$3,13
12676410c867Schristos	xor	$2,$12
12686410c867Schristos	sll	$12,$3,19
12696410c867Schristos	xor	$2,$11
12706410c867Schristos	srl	$11,$3,22
12716410c867Schristos	xor	$2,$12
12726410c867Schristos	sll	$12,$3,30
12736410c867Schristos	xor	$2,$11
12746410c867Schristos	and	$11,$7,$24
12756410c867Schristos	xor	$2,$12			# Sigma0(a)
12766410c867Schristos	xor	$12,$7,$24
12776410c867Schristos#endif
12786410c867Schristos	sw	$22,56($29)	# offload to ring buffer
12796410c867Schristos	addu	$2,$11
12806410c867Schristos	and	$12,$3
12816410c867Schristos	addu	$10,$13			# +=K[14]
12826410c867Schristos	addu	$2,$12			# +=Maj(a,b,c)
12836410c867Schristos	addu	$25,$10
12846410c867Schristos	addu	$2,$10
12856410c867Schristos	lw	$9,4($29)	# prefetch from ring buffer
12866410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
12876410c867Schristos	wsbh	$23,$23		# byte swap(15)
12886410c867Schristos	rotr	$23,$23,16
12896410c867Schristos#else
12906410c867Schristos	srl	$12,$23,24		# byte swap(15)
12916410c867Schristos	srl	$13,$23,8
12926410c867Schristos	andi	$14,$23,0xFF00
12936410c867Schristos	sll	$23,$23,24
12946410c867Schristos	andi	$13,0xFF00
12956410c867Schristos	sll	$14,$14,8
12966410c867Schristos	or	$23,$12
12976410c867Schristos	or	$13,$14
12986410c867Schristos	or	$23,$13
12996410c867Schristos#endif
13006410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
13016410c867Schristos	xor	$14,$30,$31			# 15
13026410c867Schristos	rotr	$12,$25,6
13036410c867Schristos	addu	$11,$23,$1
13046410c867Schristos	rotr	$13,$25,11
13056410c867Schristos	and	$14,$25
13066410c867Schristos	rotr	$1,$25,25
13076410c867Schristos	xor	$12,$13
13086410c867Schristos	rotr	$13,$2,2
13096410c867Schristos	xor	$14,$31			# Ch(e,f,g)
13106410c867Schristos	xor	$12,$1			# Sigma1(e)
13116410c867Schristos
13126410c867Schristos	rotr	$1,$2,13
13136410c867Schristos	addu	$11,$14
13146410c867Schristos	lw	$14,60($6)		# K[15]
13156410c867Schristos	xor	$1,$13
13166410c867Schristos	rotr	$13,$2,22
13176410c867Schristos	addu	$11,$12
13186410c867Schristos	and	$12,$3,$7
13196410c867Schristos	xor	$1,$13			# Sigma0(a)
13206410c867Schristos	xor	$13,$3,$7
13216410c867Schristos#else
13226410c867Schristos	addu	$11,$23,$1			# 15
13236410c867Schristos	srl	$1,$25,6
13246410c867Schristos	xor	$14,$30,$31
13256410c867Schristos	sll	$13,$25,7
13266410c867Schristos	and	$14,$25
13276410c867Schristos	srl	$12,$25,11
13286410c867Schristos	xor	$1,$13
13296410c867Schristos	sll	$13,$25,21
13306410c867Schristos	xor	$1,$12
13316410c867Schristos	srl	$12,$25,25
13326410c867Schristos	xor	$1,$13
13336410c867Schristos	sll	$13,$25,26
13346410c867Schristos	xor	$1,$12
13356410c867Schristos	xor	$14,$31			# Ch(e,f,g)
13366410c867Schristos	xor	$12,$13,$1			# Sigma1(e)
13376410c867Schristos
13386410c867Schristos	srl	$1,$2,2
13396410c867Schristos	addu	$11,$14
13406410c867Schristos	lw	$14,60($6)		# K[15]
13416410c867Schristos	sll	$13,$2,10
13426410c867Schristos	addu	$11,$12
13436410c867Schristos	srl	$12,$2,13
13446410c867Schristos	xor	$1,$13
13456410c867Schristos	sll	$13,$2,19
13466410c867Schristos	xor	$1,$12
13476410c867Schristos	srl	$12,$2,22
13486410c867Schristos	xor	$1,$13
13496410c867Schristos	sll	$13,$2,30
13506410c867Schristos	xor	$1,$12
13516410c867Schristos	and	$12,$3,$7
13526410c867Schristos	xor	$1,$13			# Sigma0(a)
13536410c867Schristos	xor	$13,$3,$7
13546410c867Schristos#endif
13556410c867Schristos	sw	$23,60($29)	# offload to ring buffer
13566410c867Schristos	addu	$1,$12
13576410c867Schristos	and	$13,$2
13586410c867Schristos	addu	$11,$14			# +=K[15]
13596410c867Schristos	addu	$1,$13			# +=Maj(a,b,c)
13606410c867Schristos	addu	$24,$11
13616410c867Schristos	addu	$1,$11
13626410c867Schristos	lw	$10,8($29)	# prefetch from ring buffer
13636410c867Schristos	b	.L16_xx
13646410c867Schristos.align	4
13656410c867Schristos.L16_xx:
13666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
13676410c867Schristos	srl	$14,$9,3		# Xupdate(16)
13686410c867Schristos	rotr	$12,$9,7
13696410c867Schristos	addu	$8,$17			# +=X[i+9]
13706410c867Schristos	xor	$14,$12
13716410c867Schristos	rotr	$12,$9,18
13726410c867Schristos
13736410c867Schristos	srl	$15,$22,10
13746410c867Schristos	rotr	$13,$22,17
13756410c867Schristos	xor	$14,$12			# sigma0(X[i+1])
13766410c867Schristos	rotr	$12,$22,19
13776410c867Schristos	xor	$15,$13
13786410c867Schristos	addu	$8,$14
13796410c867Schristos#else
13806410c867Schristos	srl	$14,$9,3		# Xupdate(16)
13816410c867Schristos	addu	$8,$17			# +=X[i+9]
13826410c867Schristos	sll	$13,$9,14
13836410c867Schristos	srl	$12,$9,7
13846410c867Schristos	xor	$14,$13
13856410c867Schristos	sll	$13,11
13866410c867Schristos	xor	$14,$12
13876410c867Schristos	srl	$12,$9,18
13886410c867Schristos	xor	$14,$13
13896410c867Schristos
13906410c867Schristos	srl	$15,$22,10
13916410c867Schristos	xor	$14,$12			# sigma0(X[i+1])
13926410c867Schristos	sll	$13,$22,13
13936410c867Schristos	addu	$8,$14
13946410c867Schristos	srl	$12,$22,17
13956410c867Schristos	xor	$15,$13
13966410c867Schristos	sll	$13,2
13976410c867Schristos	xor	$15,$12
13986410c867Schristos	srl	$12,$22,19
13996410c867Schristos	xor	$15,$13
14006410c867Schristos#endif
14016410c867Schristos	xor	$15,$12			# sigma1(X[i+14])
14026410c867Schristos	addu	$8,$15
14036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
14046410c867Schristos	xor	$15,$25,$30			# 16
14056410c867Schristos	rotr	$13,$24,6
14066410c867Schristos	addu	$12,$8,$31
14076410c867Schristos	rotr	$14,$24,11
14086410c867Schristos	and	$15,$24
14096410c867Schristos	rotr	$31,$24,25
14106410c867Schristos	xor	$13,$14
14116410c867Schristos	rotr	$14,$1,2
14126410c867Schristos	xor	$15,$30			# Ch(e,f,g)
14136410c867Schristos	xor	$13,$31			# Sigma1(e)
14146410c867Schristos
14156410c867Schristos	rotr	$31,$1,13
14166410c867Schristos	addu	$12,$15
14176410c867Schristos	lw	$15,64($6)		# K[16]
14186410c867Schristos	xor	$31,$14
14196410c867Schristos	rotr	$14,$1,22
14206410c867Schristos	addu	$12,$13
14216410c867Schristos	and	$13,$2,$3
14226410c867Schristos	xor	$31,$14			# Sigma0(a)
14236410c867Schristos	xor	$14,$2,$3
14246410c867Schristos#else
14256410c867Schristos	addu	$12,$8,$31			# 16
14266410c867Schristos	srl	$31,$24,6
14276410c867Schristos	xor	$15,$25,$30
14286410c867Schristos	sll	$14,$24,7
14296410c867Schristos	and	$15,$24
14306410c867Schristos	srl	$13,$24,11
14316410c867Schristos	xor	$31,$14
14326410c867Schristos	sll	$14,$24,21
14336410c867Schristos	xor	$31,$13
14346410c867Schristos	srl	$13,$24,25
14356410c867Schristos	xor	$31,$14
14366410c867Schristos	sll	$14,$24,26
14376410c867Schristos	xor	$31,$13
14386410c867Schristos	xor	$15,$30			# Ch(e,f,g)
14396410c867Schristos	xor	$13,$14,$31			# Sigma1(e)
14406410c867Schristos
14416410c867Schristos	srl	$31,$1,2
14426410c867Schristos	addu	$12,$15
14436410c867Schristos	lw	$15,64($6)		# K[16]
14446410c867Schristos	sll	$14,$1,10
14456410c867Schristos	addu	$12,$13
14466410c867Schristos	srl	$13,$1,13
14476410c867Schristos	xor	$31,$14
14486410c867Schristos	sll	$14,$1,19
14496410c867Schristos	xor	$31,$13
14506410c867Schristos	srl	$13,$1,22
14516410c867Schristos	xor	$31,$14
14526410c867Schristos	sll	$14,$1,30
14536410c867Schristos	xor	$31,$13
14546410c867Schristos	and	$13,$2,$3
14556410c867Schristos	xor	$31,$14			# Sigma0(a)
14566410c867Schristos	xor	$14,$2,$3
14576410c867Schristos#endif
14586410c867Schristos	sw	$8,0($29)	# offload to ring buffer
14596410c867Schristos	addu	$31,$13
14606410c867Schristos	and	$14,$1
14616410c867Schristos	addu	$12,$15			# +=K[16]
14626410c867Schristos	addu	$31,$14			# +=Maj(a,b,c)
14636410c867Schristos	addu	$7,$12
14646410c867Schristos	addu	$31,$12
14656410c867Schristos	lw	$11,12($29)	# prefetch from ring buffer
14666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
14676410c867Schristos	srl	$15,$10,3		# Xupdate(17)
14686410c867Schristos	rotr	$13,$10,7
14696410c867Schristos	addu	$9,$18			# +=X[i+9]
14706410c867Schristos	xor	$15,$13
14716410c867Schristos	rotr	$13,$10,18
14726410c867Schristos
14736410c867Schristos	srl	$16,$23,10
14746410c867Schristos	rotr	$14,$23,17
14756410c867Schristos	xor	$15,$13			# sigma0(X[i+1])
14766410c867Schristos	rotr	$13,$23,19
14776410c867Schristos	xor	$16,$14
14786410c867Schristos	addu	$9,$15
14796410c867Schristos#else
14806410c867Schristos	srl	$15,$10,3		# Xupdate(17)
14816410c867Schristos	addu	$9,$18			# +=X[i+9]
14826410c867Schristos	sll	$14,$10,14
14836410c867Schristos	srl	$13,$10,7
14846410c867Schristos	xor	$15,$14
14856410c867Schristos	sll	$14,11
14866410c867Schristos	xor	$15,$13
14876410c867Schristos	srl	$13,$10,18
14886410c867Schristos	xor	$15,$14
14896410c867Schristos
14906410c867Schristos	srl	$16,$23,10
14916410c867Schristos	xor	$15,$13			# sigma0(X[i+1])
14926410c867Schristos	sll	$14,$23,13
14936410c867Schristos	addu	$9,$15
14946410c867Schristos	srl	$13,$23,17
14956410c867Schristos	xor	$16,$14
14966410c867Schristos	sll	$14,2
14976410c867Schristos	xor	$16,$13
14986410c867Schristos	srl	$13,$23,19
14996410c867Schristos	xor	$16,$14
15006410c867Schristos#endif
15016410c867Schristos	xor	$16,$13			# sigma1(X[i+14])
15026410c867Schristos	addu	$9,$16
15036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
15046410c867Schristos	xor	$16,$24,$25			# 17
15056410c867Schristos	rotr	$14,$7,6
15066410c867Schristos	addu	$13,$9,$30
15076410c867Schristos	rotr	$15,$7,11
15086410c867Schristos	and	$16,$7
15096410c867Schristos	rotr	$30,$7,25
15106410c867Schristos	xor	$14,$15
15116410c867Schristos	rotr	$15,$31,2
15126410c867Schristos	xor	$16,$25			# Ch(e,f,g)
15136410c867Schristos	xor	$14,$30			# Sigma1(e)
15146410c867Schristos
15156410c867Schristos	rotr	$30,$31,13
15166410c867Schristos	addu	$13,$16
15176410c867Schristos	lw	$16,68($6)		# K[17]
15186410c867Schristos	xor	$30,$15
15196410c867Schristos	rotr	$15,$31,22
15206410c867Schristos	addu	$13,$14
15216410c867Schristos	and	$14,$1,$2
15226410c867Schristos	xor	$30,$15			# Sigma0(a)
15236410c867Schristos	xor	$15,$1,$2
15246410c867Schristos#else
15256410c867Schristos	addu	$13,$9,$30			# 17
15266410c867Schristos	srl	$30,$7,6
15276410c867Schristos	xor	$16,$24,$25
15286410c867Schristos	sll	$15,$7,7
15296410c867Schristos	and	$16,$7
15306410c867Schristos	srl	$14,$7,11
15316410c867Schristos	xor	$30,$15
15326410c867Schristos	sll	$15,$7,21
15336410c867Schristos	xor	$30,$14
15346410c867Schristos	srl	$14,$7,25
15356410c867Schristos	xor	$30,$15
15366410c867Schristos	sll	$15,$7,26
15376410c867Schristos	xor	$30,$14
15386410c867Schristos	xor	$16,$25			# Ch(e,f,g)
15396410c867Schristos	xor	$14,$15,$30			# Sigma1(e)
15406410c867Schristos
15416410c867Schristos	srl	$30,$31,2
15426410c867Schristos	addu	$13,$16
15436410c867Schristos	lw	$16,68($6)		# K[17]
15446410c867Schristos	sll	$15,$31,10
15456410c867Schristos	addu	$13,$14
15466410c867Schristos	srl	$14,$31,13
15476410c867Schristos	xor	$30,$15
15486410c867Schristos	sll	$15,$31,19
15496410c867Schristos	xor	$30,$14
15506410c867Schristos	srl	$14,$31,22
15516410c867Schristos	xor	$30,$15
15526410c867Schristos	sll	$15,$31,30
15536410c867Schristos	xor	$30,$14
15546410c867Schristos	and	$14,$1,$2
15556410c867Schristos	xor	$30,$15			# Sigma0(a)
15566410c867Schristos	xor	$15,$1,$2
15576410c867Schristos#endif
15586410c867Schristos	sw	$9,4($29)	# offload to ring buffer
15596410c867Schristos	addu	$30,$14
15606410c867Schristos	and	$15,$31
15616410c867Schristos	addu	$13,$16			# +=K[17]
15626410c867Schristos	addu	$30,$15			# +=Maj(a,b,c)
15636410c867Schristos	addu	$3,$13
15646410c867Schristos	addu	$30,$13
15656410c867Schristos	lw	$12,16($29)	# prefetch from ring buffer
15666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
15676410c867Schristos	srl	$16,$11,3		# Xupdate(18)
15686410c867Schristos	rotr	$14,$11,7
15696410c867Schristos	addu	$10,$19			# +=X[i+9]
15706410c867Schristos	xor	$16,$14
15716410c867Schristos	rotr	$14,$11,18
15726410c867Schristos
15736410c867Schristos	srl	$17,$8,10
15746410c867Schristos	rotr	$15,$8,17
15756410c867Schristos	xor	$16,$14			# sigma0(X[i+1])
15766410c867Schristos	rotr	$14,$8,19
15776410c867Schristos	xor	$17,$15
15786410c867Schristos	addu	$10,$16
15796410c867Schristos#else
15806410c867Schristos	srl	$16,$11,3		# Xupdate(18)
15816410c867Schristos	addu	$10,$19			# +=X[i+9]
15826410c867Schristos	sll	$15,$11,14
15836410c867Schristos	srl	$14,$11,7
15846410c867Schristos	xor	$16,$15
15856410c867Schristos	sll	$15,11
15866410c867Schristos	xor	$16,$14
15876410c867Schristos	srl	$14,$11,18
15886410c867Schristos	xor	$16,$15
15896410c867Schristos
15906410c867Schristos	srl	$17,$8,10
15916410c867Schristos	xor	$16,$14			# sigma0(X[i+1])
15926410c867Schristos	sll	$15,$8,13
15936410c867Schristos	addu	$10,$16
15946410c867Schristos	srl	$14,$8,17
15956410c867Schristos	xor	$17,$15
15966410c867Schristos	sll	$15,2
15976410c867Schristos	xor	$17,$14
15986410c867Schristos	srl	$14,$8,19
15996410c867Schristos	xor	$17,$15
16006410c867Schristos#endif
16016410c867Schristos	xor	$17,$14			# sigma1(X[i+14])
16026410c867Schristos	addu	$10,$17
16036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
16046410c867Schristos	xor	$17,$7,$24			# 18
16056410c867Schristos	rotr	$15,$3,6
16066410c867Schristos	addu	$14,$10,$25
16076410c867Schristos	rotr	$16,$3,11
16086410c867Schristos	and	$17,$3
16096410c867Schristos	rotr	$25,$3,25
16106410c867Schristos	xor	$15,$16
16116410c867Schristos	rotr	$16,$30,2
16126410c867Schristos	xor	$17,$24			# Ch(e,f,g)
16136410c867Schristos	xor	$15,$25			# Sigma1(e)
16146410c867Schristos
16156410c867Schristos	rotr	$25,$30,13
16166410c867Schristos	addu	$14,$17
16176410c867Schristos	lw	$17,72($6)		# K[18]
16186410c867Schristos	xor	$25,$16
16196410c867Schristos	rotr	$16,$30,22
16206410c867Schristos	addu	$14,$15
16216410c867Schristos	and	$15,$31,$1
16226410c867Schristos	xor	$25,$16			# Sigma0(a)
16236410c867Schristos	xor	$16,$31,$1
16246410c867Schristos#else
16256410c867Schristos	addu	$14,$10,$25			# 18
16266410c867Schristos	srl	$25,$3,6
16276410c867Schristos	xor	$17,$7,$24
16286410c867Schristos	sll	$16,$3,7
16296410c867Schristos	and	$17,$3
16306410c867Schristos	srl	$15,$3,11
16316410c867Schristos	xor	$25,$16
16326410c867Schristos	sll	$16,$3,21
16336410c867Schristos	xor	$25,$15
16346410c867Schristos	srl	$15,$3,25
16356410c867Schristos	xor	$25,$16
16366410c867Schristos	sll	$16,$3,26
16376410c867Schristos	xor	$25,$15
16386410c867Schristos	xor	$17,$24			# Ch(e,f,g)
16396410c867Schristos	xor	$15,$16,$25			# Sigma1(e)
16406410c867Schristos
16416410c867Schristos	srl	$25,$30,2
16426410c867Schristos	addu	$14,$17
16436410c867Schristos	lw	$17,72($6)		# K[18]
16446410c867Schristos	sll	$16,$30,10
16456410c867Schristos	addu	$14,$15
16466410c867Schristos	srl	$15,$30,13
16476410c867Schristos	xor	$25,$16
16486410c867Schristos	sll	$16,$30,19
16496410c867Schristos	xor	$25,$15
16506410c867Schristos	srl	$15,$30,22
16516410c867Schristos	xor	$25,$16
16526410c867Schristos	sll	$16,$30,30
16536410c867Schristos	xor	$25,$15
16546410c867Schristos	and	$15,$31,$1
16556410c867Schristos	xor	$25,$16			# Sigma0(a)
16566410c867Schristos	xor	$16,$31,$1
16576410c867Schristos#endif
16586410c867Schristos	sw	$10,8($29)	# offload to ring buffer
16596410c867Schristos	addu	$25,$15
16606410c867Schristos	and	$16,$30
16616410c867Schristos	addu	$14,$17			# +=K[18]
16626410c867Schristos	addu	$25,$16			# +=Maj(a,b,c)
16636410c867Schristos	addu	$2,$14
16646410c867Schristos	addu	$25,$14
16656410c867Schristos	lw	$13,20($29)	# prefetch from ring buffer
16666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
16676410c867Schristos	srl	$17,$12,3		# Xupdate(19)
16686410c867Schristos	rotr	$15,$12,7
16696410c867Schristos	addu	$11,$20			# +=X[i+9]
16706410c867Schristos	xor	$17,$15
16716410c867Schristos	rotr	$15,$12,18
16726410c867Schristos
16736410c867Schristos	srl	$18,$9,10
16746410c867Schristos	rotr	$16,$9,17
16756410c867Schristos	xor	$17,$15			# sigma0(X[i+1])
16766410c867Schristos	rotr	$15,$9,19
16776410c867Schristos	xor	$18,$16
16786410c867Schristos	addu	$11,$17
16796410c867Schristos#else
16806410c867Schristos	srl	$17,$12,3		# Xupdate(19)
16816410c867Schristos	addu	$11,$20			# +=X[i+9]
16826410c867Schristos	sll	$16,$12,14
16836410c867Schristos	srl	$15,$12,7
16846410c867Schristos	xor	$17,$16
16856410c867Schristos	sll	$16,11
16866410c867Schristos	xor	$17,$15
16876410c867Schristos	srl	$15,$12,18
16886410c867Schristos	xor	$17,$16
16896410c867Schristos
16906410c867Schristos	srl	$18,$9,10
16916410c867Schristos	xor	$17,$15			# sigma0(X[i+1])
16926410c867Schristos	sll	$16,$9,13
16936410c867Schristos	addu	$11,$17
16946410c867Schristos	srl	$15,$9,17
16956410c867Schristos	xor	$18,$16
16966410c867Schristos	sll	$16,2
16976410c867Schristos	xor	$18,$15
16986410c867Schristos	srl	$15,$9,19
16996410c867Schristos	xor	$18,$16
17006410c867Schristos#endif
17016410c867Schristos	xor	$18,$15			# sigma1(X[i+14])
17026410c867Schristos	addu	$11,$18
17036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
17046410c867Schristos	xor	$18,$3,$7			# 19
17056410c867Schristos	rotr	$16,$2,6
17066410c867Schristos	addu	$15,$11,$24
17076410c867Schristos	rotr	$17,$2,11
17086410c867Schristos	and	$18,$2
17096410c867Schristos	rotr	$24,$2,25
17106410c867Schristos	xor	$16,$17
17116410c867Schristos	rotr	$17,$25,2
17126410c867Schristos	xor	$18,$7			# Ch(e,f,g)
17136410c867Schristos	xor	$16,$24			# Sigma1(e)
17146410c867Schristos
17156410c867Schristos	rotr	$24,$25,13
17166410c867Schristos	addu	$15,$18
17176410c867Schristos	lw	$18,76($6)		# K[19]
17186410c867Schristos	xor	$24,$17
17196410c867Schristos	rotr	$17,$25,22
17206410c867Schristos	addu	$15,$16
17216410c867Schristos	and	$16,$30,$31
17226410c867Schristos	xor	$24,$17			# Sigma0(a)
17236410c867Schristos	xor	$17,$30,$31
17246410c867Schristos#else
17256410c867Schristos	addu	$15,$11,$24			# 19
17266410c867Schristos	srl	$24,$2,6
17276410c867Schristos	xor	$18,$3,$7
17286410c867Schristos	sll	$17,$2,7
17296410c867Schristos	and	$18,$2
17306410c867Schristos	srl	$16,$2,11
17316410c867Schristos	xor	$24,$17
17326410c867Schristos	sll	$17,$2,21
17336410c867Schristos	xor	$24,$16
17346410c867Schristos	srl	$16,$2,25
17356410c867Schristos	xor	$24,$17
17366410c867Schristos	sll	$17,$2,26
17376410c867Schristos	xor	$24,$16
17386410c867Schristos	xor	$18,$7			# Ch(e,f,g)
17396410c867Schristos	xor	$16,$17,$24			# Sigma1(e)
17406410c867Schristos
17416410c867Schristos	srl	$24,$25,2
17426410c867Schristos	addu	$15,$18
17436410c867Schristos	lw	$18,76($6)		# K[19]
17446410c867Schristos	sll	$17,$25,10
17456410c867Schristos	addu	$15,$16
17466410c867Schristos	srl	$16,$25,13
17476410c867Schristos	xor	$24,$17
17486410c867Schristos	sll	$17,$25,19
17496410c867Schristos	xor	$24,$16
17506410c867Schristos	srl	$16,$25,22
17516410c867Schristos	xor	$24,$17
17526410c867Schristos	sll	$17,$25,30
17536410c867Schristos	xor	$24,$16
17546410c867Schristos	and	$16,$30,$31
17556410c867Schristos	xor	$24,$17			# Sigma0(a)
17566410c867Schristos	xor	$17,$30,$31
17576410c867Schristos#endif
17586410c867Schristos	sw	$11,12($29)	# offload to ring buffer
17596410c867Schristos	addu	$24,$16
17606410c867Schristos	and	$17,$25
17616410c867Schristos	addu	$15,$18			# +=K[19]
17626410c867Schristos	addu	$24,$17			# +=Maj(a,b,c)
17636410c867Schristos	addu	$1,$15
17646410c867Schristos	addu	$24,$15
17656410c867Schristos	lw	$14,24($29)	# prefetch from ring buffer
17666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
17676410c867Schristos	srl	$18,$13,3		# Xupdate(20)
17686410c867Schristos	rotr	$16,$13,7
17696410c867Schristos	addu	$12,$21			# +=X[i+9]
17706410c867Schristos	xor	$18,$16
17716410c867Schristos	rotr	$16,$13,18
17726410c867Schristos
17736410c867Schristos	srl	$19,$10,10
17746410c867Schristos	rotr	$17,$10,17
17756410c867Schristos	xor	$18,$16			# sigma0(X[i+1])
17766410c867Schristos	rotr	$16,$10,19
17776410c867Schristos	xor	$19,$17
17786410c867Schristos	addu	$12,$18
17796410c867Schristos#else
17806410c867Schristos	srl	$18,$13,3		# Xupdate(20)
17816410c867Schristos	addu	$12,$21			# +=X[i+9]
17826410c867Schristos	sll	$17,$13,14
17836410c867Schristos	srl	$16,$13,7
17846410c867Schristos	xor	$18,$17
17856410c867Schristos	sll	$17,11
17866410c867Schristos	xor	$18,$16
17876410c867Schristos	srl	$16,$13,18
17886410c867Schristos	xor	$18,$17
17896410c867Schristos
17906410c867Schristos	srl	$19,$10,10
17916410c867Schristos	xor	$18,$16			# sigma0(X[i+1])
17926410c867Schristos	sll	$17,$10,13
17936410c867Schristos	addu	$12,$18
17946410c867Schristos	srl	$16,$10,17
17956410c867Schristos	xor	$19,$17
17966410c867Schristos	sll	$17,2
17976410c867Schristos	xor	$19,$16
17986410c867Schristos	srl	$16,$10,19
17996410c867Schristos	xor	$19,$17
18006410c867Schristos#endif
18016410c867Schristos	xor	$19,$16			# sigma1(X[i+14])
18026410c867Schristos	addu	$12,$19
18036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
18046410c867Schristos	xor	$19,$2,$3			# 20
18056410c867Schristos	rotr	$17,$1,6
18066410c867Schristos	addu	$16,$12,$7
18076410c867Schristos	rotr	$18,$1,11
18086410c867Schristos	and	$19,$1
18096410c867Schristos	rotr	$7,$1,25
18106410c867Schristos	xor	$17,$18
18116410c867Schristos	rotr	$18,$24,2
18126410c867Schristos	xor	$19,$3			# Ch(e,f,g)
18136410c867Schristos	xor	$17,$7			# Sigma1(e)
18146410c867Schristos
18156410c867Schristos	rotr	$7,$24,13
18166410c867Schristos	addu	$16,$19
18176410c867Schristos	lw	$19,80($6)		# K[20]
18186410c867Schristos	xor	$7,$18
18196410c867Schristos	rotr	$18,$24,22
18206410c867Schristos	addu	$16,$17
18216410c867Schristos	and	$17,$25,$30
18226410c867Schristos	xor	$7,$18			# Sigma0(a)
18236410c867Schristos	xor	$18,$25,$30
18246410c867Schristos#else
18256410c867Schristos	addu	$16,$12,$7			# 20
18266410c867Schristos	srl	$7,$1,6
18276410c867Schristos	xor	$19,$2,$3
18286410c867Schristos	sll	$18,$1,7
18296410c867Schristos	and	$19,$1
18306410c867Schristos	srl	$17,$1,11
18316410c867Schristos	xor	$7,$18
18326410c867Schristos	sll	$18,$1,21
18336410c867Schristos	xor	$7,$17
18346410c867Schristos	srl	$17,$1,25
18356410c867Schristos	xor	$7,$18
18366410c867Schristos	sll	$18,$1,26
18376410c867Schristos	xor	$7,$17
18386410c867Schristos	xor	$19,$3			# Ch(e,f,g)
18396410c867Schristos	xor	$17,$18,$7			# Sigma1(e)
18406410c867Schristos
18416410c867Schristos	srl	$7,$24,2
18426410c867Schristos	addu	$16,$19
18436410c867Schristos	lw	$19,80($6)		# K[20]
18446410c867Schristos	sll	$18,$24,10
18456410c867Schristos	addu	$16,$17
18466410c867Schristos	srl	$17,$24,13
18476410c867Schristos	xor	$7,$18
18486410c867Schristos	sll	$18,$24,19
18496410c867Schristos	xor	$7,$17
18506410c867Schristos	srl	$17,$24,22
18516410c867Schristos	xor	$7,$18
18526410c867Schristos	sll	$18,$24,30
18536410c867Schristos	xor	$7,$17
18546410c867Schristos	and	$17,$25,$30
18556410c867Schristos	xor	$7,$18			# Sigma0(a)
18566410c867Schristos	xor	$18,$25,$30
18576410c867Schristos#endif
18586410c867Schristos	sw	$12,16($29)	# offload to ring buffer
18596410c867Schristos	addu	$7,$17
18606410c867Schristos	and	$18,$24
18616410c867Schristos	addu	$16,$19			# +=K[20]
18626410c867Schristos	addu	$7,$18			# +=Maj(a,b,c)
18636410c867Schristos	addu	$31,$16
18646410c867Schristos	addu	$7,$16
18656410c867Schristos	lw	$15,28($29)	# prefetch from ring buffer
18666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
18676410c867Schristos	srl	$19,$14,3		# Xupdate(21)
18686410c867Schristos	rotr	$17,$14,7
18696410c867Schristos	addu	$13,$22			# +=X[i+9]
18706410c867Schristos	xor	$19,$17
18716410c867Schristos	rotr	$17,$14,18
18726410c867Schristos
18736410c867Schristos	srl	$20,$11,10
18746410c867Schristos	rotr	$18,$11,17
18756410c867Schristos	xor	$19,$17			# sigma0(X[i+1])
18766410c867Schristos	rotr	$17,$11,19
18776410c867Schristos	xor	$20,$18
18786410c867Schristos	addu	$13,$19
18796410c867Schristos#else
18806410c867Schristos	srl	$19,$14,3		# Xupdate(21)
18816410c867Schristos	addu	$13,$22			# +=X[i+9]
18826410c867Schristos	sll	$18,$14,14
18836410c867Schristos	srl	$17,$14,7
18846410c867Schristos	xor	$19,$18
18856410c867Schristos	sll	$18,11
18866410c867Schristos	xor	$19,$17
18876410c867Schristos	srl	$17,$14,18
18886410c867Schristos	xor	$19,$18
18896410c867Schristos
18906410c867Schristos	srl	$20,$11,10
18916410c867Schristos	xor	$19,$17			# sigma0(X[i+1])
18926410c867Schristos	sll	$18,$11,13
18936410c867Schristos	addu	$13,$19
18946410c867Schristos	srl	$17,$11,17
18956410c867Schristos	xor	$20,$18
18966410c867Schristos	sll	$18,2
18976410c867Schristos	xor	$20,$17
18986410c867Schristos	srl	$17,$11,19
18996410c867Schristos	xor	$20,$18
19006410c867Schristos#endif
19016410c867Schristos	xor	$20,$17			# sigma1(X[i+14])
19026410c867Schristos	addu	$13,$20
19036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
19046410c867Schristos	xor	$20,$1,$2			# 21
19056410c867Schristos	rotr	$18,$31,6
19066410c867Schristos	addu	$17,$13,$3
19076410c867Schristos	rotr	$19,$31,11
19086410c867Schristos	and	$20,$31
19096410c867Schristos	rotr	$3,$31,25
19106410c867Schristos	xor	$18,$19
19116410c867Schristos	rotr	$19,$7,2
19126410c867Schristos	xor	$20,$2			# Ch(e,f,g)
19136410c867Schristos	xor	$18,$3			# Sigma1(e)
19146410c867Schristos
19156410c867Schristos	rotr	$3,$7,13
19166410c867Schristos	addu	$17,$20
19176410c867Schristos	lw	$20,84($6)		# K[21]
19186410c867Schristos	xor	$3,$19
19196410c867Schristos	rotr	$19,$7,22
19206410c867Schristos	addu	$17,$18
19216410c867Schristos	and	$18,$24,$25
19226410c867Schristos	xor	$3,$19			# Sigma0(a)
19236410c867Schristos	xor	$19,$24,$25
19246410c867Schristos#else
19256410c867Schristos	addu	$17,$13,$3			# 21
19266410c867Schristos	srl	$3,$31,6
19276410c867Schristos	xor	$20,$1,$2
19286410c867Schristos	sll	$19,$31,7
19296410c867Schristos	and	$20,$31
19306410c867Schristos	srl	$18,$31,11
19316410c867Schristos	xor	$3,$19
19326410c867Schristos	sll	$19,$31,21
19336410c867Schristos	xor	$3,$18
19346410c867Schristos	srl	$18,$31,25
19356410c867Schristos	xor	$3,$19
19366410c867Schristos	sll	$19,$31,26
19376410c867Schristos	xor	$3,$18
19386410c867Schristos	xor	$20,$2			# Ch(e,f,g)
19396410c867Schristos	xor	$18,$19,$3			# Sigma1(e)
19406410c867Schristos
19416410c867Schristos	srl	$3,$7,2
19426410c867Schristos	addu	$17,$20
19436410c867Schristos	lw	$20,84($6)		# K[21]
19446410c867Schristos	sll	$19,$7,10
19456410c867Schristos	addu	$17,$18
19466410c867Schristos	srl	$18,$7,13
19476410c867Schristos	xor	$3,$19
19486410c867Schristos	sll	$19,$7,19
19496410c867Schristos	xor	$3,$18
19506410c867Schristos	srl	$18,$7,22
19516410c867Schristos	xor	$3,$19
19526410c867Schristos	sll	$19,$7,30
19536410c867Schristos	xor	$3,$18
19546410c867Schristos	and	$18,$24,$25
19556410c867Schristos	xor	$3,$19			# Sigma0(a)
19566410c867Schristos	xor	$19,$24,$25
19576410c867Schristos#endif
19586410c867Schristos	sw	$13,20($29)	# offload to ring buffer
19596410c867Schristos	addu	$3,$18
19606410c867Schristos	and	$19,$7
19616410c867Schristos	addu	$17,$20			# +=K[21]
19626410c867Schristos	addu	$3,$19			# +=Maj(a,b,c)
19636410c867Schristos	addu	$30,$17
19646410c867Schristos	addu	$3,$17
19656410c867Schristos	lw	$16,32($29)	# prefetch from ring buffer
19666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
19676410c867Schristos	srl	$20,$15,3		# Xupdate(22)
19686410c867Schristos	rotr	$18,$15,7
19696410c867Schristos	addu	$14,$23			# +=X[i+9]
19706410c867Schristos	xor	$20,$18
19716410c867Schristos	rotr	$18,$15,18
19726410c867Schristos
19736410c867Schristos	srl	$21,$12,10
19746410c867Schristos	rotr	$19,$12,17
19756410c867Schristos	xor	$20,$18			# sigma0(X[i+1])
19766410c867Schristos	rotr	$18,$12,19
19776410c867Schristos	xor	$21,$19
19786410c867Schristos	addu	$14,$20
19796410c867Schristos#else
19806410c867Schristos	srl	$20,$15,3		# Xupdate(22)
19816410c867Schristos	addu	$14,$23			# +=X[i+9]
19826410c867Schristos	sll	$19,$15,14
19836410c867Schristos	srl	$18,$15,7
19846410c867Schristos	xor	$20,$19
19856410c867Schristos	sll	$19,11
19866410c867Schristos	xor	$20,$18
19876410c867Schristos	srl	$18,$15,18
19886410c867Schristos	xor	$20,$19
19896410c867Schristos
19906410c867Schristos	srl	$21,$12,10
19916410c867Schristos	xor	$20,$18			# sigma0(X[i+1])
19926410c867Schristos	sll	$19,$12,13
19936410c867Schristos	addu	$14,$20
19946410c867Schristos	srl	$18,$12,17
19956410c867Schristos	xor	$21,$19
19966410c867Schristos	sll	$19,2
19976410c867Schristos	xor	$21,$18
19986410c867Schristos	srl	$18,$12,19
19996410c867Schristos	xor	$21,$19
20006410c867Schristos#endif
20016410c867Schristos	xor	$21,$18			# sigma1(X[i+14])
20026410c867Schristos	addu	$14,$21
20036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
20046410c867Schristos	xor	$21,$31,$1			# 22
20056410c867Schristos	rotr	$19,$30,6
20066410c867Schristos	addu	$18,$14,$2
20076410c867Schristos	rotr	$20,$30,11
20086410c867Schristos	and	$21,$30
20096410c867Schristos	rotr	$2,$30,25
20106410c867Schristos	xor	$19,$20
20116410c867Schristos	rotr	$20,$3,2
20126410c867Schristos	xor	$21,$1			# Ch(e,f,g)
20136410c867Schristos	xor	$19,$2			# Sigma1(e)
20146410c867Schristos
20156410c867Schristos	rotr	$2,$3,13
20166410c867Schristos	addu	$18,$21
20176410c867Schristos	lw	$21,88($6)		# K[22]
20186410c867Schristos	xor	$2,$20
20196410c867Schristos	rotr	$20,$3,22
20206410c867Schristos	addu	$18,$19
20216410c867Schristos	and	$19,$7,$24
20226410c867Schristos	xor	$2,$20			# Sigma0(a)
20236410c867Schristos	xor	$20,$7,$24
20246410c867Schristos#else
20256410c867Schristos	addu	$18,$14,$2			# 22
20266410c867Schristos	srl	$2,$30,6
20276410c867Schristos	xor	$21,$31,$1
20286410c867Schristos	sll	$20,$30,7
20296410c867Schristos	and	$21,$30
20306410c867Schristos	srl	$19,$30,11
20316410c867Schristos	xor	$2,$20
20326410c867Schristos	sll	$20,$30,21
20336410c867Schristos	xor	$2,$19
20346410c867Schristos	srl	$19,$30,25
20356410c867Schristos	xor	$2,$20
20366410c867Schristos	sll	$20,$30,26
20376410c867Schristos	xor	$2,$19
20386410c867Schristos	xor	$21,$1			# Ch(e,f,g)
20396410c867Schristos	xor	$19,$20,$2			# Sigma1(e)
20406410c867Schristos
20416410c867Schristos	srl	$2,$3,2
20426410c867Schristos	addu	$18,$21
20436410c867Schristos	lw	$21,88($6)		# K[22]
20446410c867Schristos	sll	$20,$3,10
20456410c867Schristos	addu	$18,$19
20466410c867Schristos	srl	$19,$3,13
20476410c867Schristos	xor	$2,$20
20486410c867Schristos	sll	$20,$3,19
20496410c867Schristos	xor	$2,$19
20506410c867Schristos	srl	$19,$3,22
20516410c867Schristos	xor	$2,$20
20526410c867Schristos	sll	$20,$3,30
20536410c867Schristos	xor	$2,$19
20546410c867Schristos	and	$19,$7,$24
20556410c867Schristos	xor	$2,$20			# Sigma0(a)
20566410c867Schristos	xor	$20,$7,$24
20576410c867Schristos#endif
20586410c867Schristos	sw	$14,24($29)	# offload to ring buffer
20596410c867Schristos	addu	$2,$19
20606410c867Schristos	and	$20,$3
20616410c867Schristos	addu	$18,$21			# +=K[22]
20626410c867Schristos	addu	$2,$20			# +=Maj(a,b,c)
20636410c867Schristos	addu	$25,$18
20646410c867Schristos	addu	$2,$18
20656410c867Schristos	lw	$17,36($29)	# prefetch from ring buffer
20666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
20676410c867Schristos	srl	$21,$16,3		# Xupdate(23)
20686410c867Schristos	rotr	$19,$16,7
20696410c867Schristos	addu	$15,$8			# +=X[i+9]
20706410c867Schristos	xor	$21,$19
20716410c867Schristos	rotr	$19,$16,18
20726410c867Schristos
20736410c867Schristos	srl	$22,$13,10
20746410c867Schristos	rotr	$20,$13,17
20756410c867Schristos	xor	$21,$19			# sigma0(X[i+1])
20766410c867Schristos	rotr	$19,$13,19
20776410c867Schristos	xor	$22,$20
20786410c867Schristos	addu	$15,$21
20796410c867Schristos#else
20806410c867Schristos	srl	$21,$16,3		# Xupdate(23)
20816410c867Schristos	addu	$15,$8			# +=X[i+9]
20826410c867Schristos	sll	$20,$16,14
20836410c867Schristos	srl	$19,$16,7
20846410c867Schristos	xor	$21,$20
20856410c867Schristos	sll	$20,11
20866410c867Schristos	xor	$21,$19
20876410c867Schristos	srl	$19,$16,18
20886410c867Schristos	xor	$21,$20
20896410c867Schristos
20906410c867Schristos	srl	$22,$13,10
20916410c867Schristos	xor	$21,$19			# sigma0(X[i+1])
20926410c867Schristos	sll	$20,$13,13
20936410c867Schristos	addu	$15,$21
20946410c867Schristos	srl	$19,$13,17
20956410c867Schristos	xor	$22,$20
20966410c867Schristos	sll	$20,2
20976410c867Schristos	xor	$22,$19
20986410c867Schristos	srl	$19,$13,19
20996410c867Schristos	xor	$22,$20
21006410c867Schristos#endif
21016410c867Schristos	xor	$22,$19			# sigma1(X[i+14])
21026410c867Schristos	addu	$15,$22
21036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
21046410c867Schristos	xor	$22,$30,$31			# 23
21056410c867Schristos	rotr	$20,$25,6
21066410c867Schristos	addu	$19,$15,$1
21076410c867Schristos	rotr	$21,$25,11
21086410c867Schristos	and	$22,$25
21096410c867Schristos	rotr	$1,$25,25
21106410c867Schristos	xor	$20,$21
21116410c867Schristos	rotr	$21,$2,2
21126410c867Schristos	xor	$22,$31			# Ch(e,f,g)
21136410c867Schristos	xor	$20,$1			# Sigma1(e)
21146410c867Schristos
21156410c867Schristos	rotr	$1,$2,13
21166410c867Schristos	addu	$19,$22
21176410c867Schristos	lw	$22,92($6)		# K[23]
21186410c867Schristos	xor	$1,$21
21196410c867Schristos	rotr	$21,$2,22
21206410c867Schristos	addu	$19,$20
21216410c867Schristos	and	$20,$3,$7
21226410c867Schristos	xor	$1,$21			# Sigma0(a)
21236410c867Schristos	xor	$21,$3,$7
21246410c867Schristos#else
21256410c867Schristos	addu	$19,$15,$1			# 23
21266410c867Schristos	srl	$1,$25,6
21276410c867Schristos	xor	$22,$30,$31
21286410c867Schristos	sll	$21,$25,7
21296410c867Schristos	and	$22,$25
21306410c867Schristos	srl	$20,$25,11
21316410c867Schristos	xor	$1,$21
21326410c867Schristos	sll	$21,$25,21
21336410c867Schristos	xor	$1,$20
21346410c867Schristos	srl	$20,$25,25
21356410c867Schristos	xor	$1,$21
21366410c867Schristos	sll	$21,$25,26
21376410c867Schristos	xor	$1,$20
21386410c867Schristos	xor	$22,$31			# Ch(e,f,g)
21396410c867Schristos	xor	$20,$21,$1			# Sigma1(e)
21406410c867Schristos
21416410c867Schristos	srl	$1,$2,2
21426410c867Schristos	addu	$19,$22
21436410c867Schristos	lw	$22,92($6)		# K[23]
21446410c867Schristos	sll	$21,$2,10
21456410c867Schristos	addu	$19,$20
21466410c867Schristos	srl	$20,$2,13
21476410c867Schristos	xor	$1,$21
21486410c867Schristos	sll	$21,$2,19
21496410c867Schristos	xor	$1,$20
21506410c867Schristos	srl	$20,$2,22
21516410c867Schristos	xor	$1,$21
21526410c867Schristos	sll	$21,$2,30
21536410c867Schristos	xor	$1,$20
21546410c867Schristos	and	$20,$3,$7
21556410c867Schristos	xor	$1,$21			# Sigma0(a)
21566410c867Schristos	xor	$21,$3,$7
21576410c867Schristos#endif
21586410c867Schristos	sw	$15,28($29)	# offload to ring buffer
21596410c867Schristos	addu	$1,$20
21606410c867Schristos	and	$21,$2
21616410c867Schristos	addu	$19,$22			# +=K[23]
21626410c867Schristos	addu	$1,$21			# +=Maj(a,b,c)
21636410c867Schristos	addu	$24,$19
21646410c867Schristos	addu	$1,$19
21656410c867Schristos	lw	$18,40($29)	# prefetch from ring buffer
21666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
21676410c867Schristos	srl	$22,$17,3		# Xupdate(24)
21686410c867Schristos	rotr	$20,$17,7
21696410c867Schristos	addu	$16,$9			# +=X[i+9]
21706410c867Schristos	xor	$22,$20
21716410c867Schristos	rotr	$20,$17,18
21726410c867Schristos
21736410c867Schristos	srl	$23,$14,10
21746410c867Schristos	rotr	$21,$14,17
21756410c867Schristos	xor	$22,$20			# sigma0(X[i+1])
21766410c867Schristos	rotr	$20,$14,19
21776410c867Schristos	xor	$23,$21
21786410c867Schristos	addu	$16,$22
21796410c867Schristos#else
21806410c867Schristos	srl	$22,$17,3		# Xupdate(24)
21816410c867Schristos	addu	$16,$9			# +=X[i+9]
21826410c867Schristos	sll	$21,$17,14
21836410c867Schristos	srl	$20,$17,7
21846410c867Schristos	xor	$22,$21
21856410c867Schristos	sll	$21,11
21866410c867Schristos	xor	$22,$20
21876410c867Schristos	srl	$20,$17,18
21886410c867Schristos	xor	$22,$21
21896410c867Schristos
21906410c867Schristos	srl	$23,$14,10
21916410c867Schristos	xor	$22,$20			# sigma0(X[i+1])
21926410c867Schristos	sll	$21,$14,13
21936410c867Schristos	addu	$16,$22
21946410c867Schristos	srl	$20,$14,17
21956410c867Schristos	xor	$23,$21
21966410c867Schristos	sll	$21,2
21976410c867Schristos	xor	$23,$20
21986410c867Schristos	srl	$20,$14,19
21996410c867Schristos	xor	$23,$21
22006410c867Schristos#endif
22016410c867Schristos	xor	$23,$20			# sigma1(X[i+14])
22026410c867Schristos	addu	$16,$23
22036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
22046410c867Schristos	xor	$23,$25,$30			# 24
22056410c867Schristos	rotr	$21,$24,6
22066410c867Schristos	addu	$20,$16,$31
22076410c867Schristos	rotr	$22,$24,11
22086410c867Schristos	and	$23,$24
22096410c867Schristos	rotr	$31,$24,25
22106410c867Schristos	xor	$21,$22
22116410c867Schristos	rotr	$22,$1,2
22126410c867Schristos	xor	$23,$30			# Ch(e,f,g)
22136410c867Schristos	xor	$21,$31			# Sigma1(e)
22146410c867Schristos
22156410c867Schristos	rotr	$31,$1,13
22166410c867Schristos	addu	$20,$23
22176410c867Schristos	lw	$23,96($6)		# K[24]
22186410c867Schristos	xor	$31,$22
22196410c867Schristos	rotr	$22,$1,22
22206410c867Schristos	addu	$20,$21
22216410c867Schristos	and	$21,$2,$3
22226410c867Schristos	xor	$31,$22			# Sigma0(a)
22236410c867Schristos	xor	$22,$2,$3
22246410c867Schristos#else
22256410c867Schristos	addu	$20,$16,$31			# 24
22266410c867Schristos	srl	$31,$24,6
22276410c867Schristos	xor	$23,$25,$30
22286410c867Schristos	sll	$22,$24,7
22296410c867Schristos	and	$23,$24
22306410c867Schristos	srl	$21,$24,11
22316410c867Schristos	xor	$31,$22
22326410c867Schristos	sll	$22,$24,21
22336410c867Schristos	xor	$31,$21
22346410c867Schristos	srl	$21,$24,25
22356410c867Schristos	xor	$31,$22
22366410c867Schristos	sll	$22,$24,26
22376410c867Schristos	xor	$31,$21
22386410c867Schristos	xor	$23,$30			# Ch(e,f,g)
22396410c867Schristos	xor	$21,$22,$31			# Sigma1(e)
22406410c867Schristos
22416410c867Schristos	srl	$31,$1,2
22426410c867Schristos	addu	$20,$23
22436410c867Schristos	lw	$23,96($6)		# K[24]
22446410c867Schristos	sll	$22,$1,10
22456410c867Schristos	addu	$20,$21
22466410c867Schristos	srl	$21,$1,13
22476410c867Schristos	xor	$31,$22
22486410c867Schristos	sll	$22,$1,19
22496410c867Schristos	xor	$31,$21
22506410c867Schristos	srl	$21,$1,22
22516410c867Schristos	xor	$31,$22
22526410c867Schristos	sll	$22,$1,30
22536410c867Schristos	xor	$31,$21
22546410c867Schristos	and	$21,$2,$3
22556410c867Schristos	xor	$31,$22			# Sigma0(a)
22566410c867Schristos	xor	$22,$2,$3
22576410c867Schristos#endif
22586410c867Schristos	sw	$16,32($29)	# offload to ring buffer
22596410c867Schristos	addu	$31,$21
22606410c867Schristos	and	$22,$1
22616410c867Schristos	addu	$20,$23			# +=K[24]
22626410c867Schristos	addu	$31,$22			# +=Maj(a,b,c)
22636410c867Schristos	addu	$7,$20
22646410c867Schristos	addu	$31,$20
22656410c867Schristos	lw	$19,44($29)	# prefetch from ring buffer
22666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
22676410c867Schristos	srl	$23,$18,3		# Xupdate(25)
22686410c867Schristos	rotr	$21,$18,7
22696410c867Schristos	addu	$17,$10			# +=X[i+9]
22706410c867Schristos	xor	$23,$21
22716410c867Schristos	rotr	$21,$18,18
22726410c867Schristos
22736410c867Schristos	srl	$8,$15,10
22746410c867Schristos	rotr	$22,$15,17
22756410c867Schristos	xor	$23,$21			# sigma0(X[i+1])
22766410c867Schristos	rotr	$21,$15,19
22776410c867Schristos	xor	$8,$22
22786410c867Schristos	addu	$17,$23
22796410c867Schristos#else
22806410c867Schristos	srl	$23,$18,3		# Xupdate(25)
22816410c867Schristos	addu	$17,$10			# +=X[i+9]
22826410c867Schristos	sll	$22,$18,14
22836410c867Schristos	srl	$21,$18,7
22846410c867Schristos	xor	$23,$22
22856410c867Schristos	sll	$22,11
22866410c867Schristos	xor	$23,$21
22876410c867Schristos	srl	$21,$18,18
22886410c867Schristos	xor	$23,$22
22896410c867Schristos
22906410c867Schristos	srl	$8,$15,10
22916410c867Schristos	xor	$23,$21			# sigma0(X[i+1])
22926410c867Schristos	sll	$22,$15,13
22936410c867Schristos	addu	$17,$23
22946410c867Schristos	srl	$21,$15,17
22956410c867Schristos	xor	$8,$22
22966410c867Schristos	sll	$22,2
22976410c867Schristos	xor	$8,$21
22986410c867Schristos	srl	$21,$15,19
22996410c867Schristos	xor	$8,$22
23006410c867Schristos#endif
23016410c867Schristos	xor	$8,$21			# sigma1(X[i+14])
23026410c867Schristos	addu	$17,$8
23036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
23046410c867Schristos	xor	$8,$24,$25			# 25
23056410c867Schristos	rotr	$22,$7,6
23066410c867Schristos	addu	$21,$17,$30
23076410c867Schristos	rotr	$23,$7,11
23086410c867Schristos	and	$8,$7
23096410c867Schristos	rotr	$30,$7,25
23106410c867Schristos	xor	$22,$23
23116410c867Schristos	rotr	$23,$31,2
23126410c867Schristos	xor	$8,$25			# Ch(e,f,g)
23136410c867Schristos	xor	$22,$30			# Sigma1(e)
23146410c867Schristos
23156410c867Schristos	rotr	$30,$31,13
23166410c867Schristos	addu	$21,$8
23176410c867Schristos	lw	$8,100($6)		# K[25]
23186410c867Schristos	xor	$30,$23
23196410c867Schristos	rotr	$23,$31,22
23206410c867Schristos	addu	$21,$22
23216410c867Schristos	and	$22,$1,$2
23226410c867Schristos	xor	$30,$23			# Sigma0(a)
23236410c867Schristos	xor	$23,$1,$2
23246410c867Schristos#else
23256410c867Schristos	addu	$21,$17,$30			# 25
23266410c867Schristos	srl	$30,$7,6
23276410c867Schristos	xor	$8,$24,$25
23286410c867Schristos	sll	$23,$7,7
23296410c867Schristos	and	$8,$7
23306410c867Schristos	srl	$22,$7,11
23316410c867Schristos	xor	$30,$23
23326410c867Schristos	sll	$23,$7,21
23336410c867Schristos	xor	$30,$22
23346410c867Schristos	srl	$22,$7,25
23356410c867Schristos	xor	$30,$23
23366410c867Schristos	sll	$23,$7,26
23376410c867Schristos	xor	$30,$22
23386410c867Schristos	xor	$8,$25			# Ch(e,f,g)
23396410c867Schristos	xor	$22,$23,$30			# Sigma1(e)
23406410c867Schristos
23416410c867Schristos	srl	$30,$31,2
23426410c867Schristos	addu	$21,$8
23436410c867Schristos	lw	$8,100($6)		# K[25]
23446410c867Schristos	sll	$23,$31,10
23456410c867Schristos	addu	$21,$22
23466410c867Schristos	srl	$22,$31,13
23476410c867Schristos	xor	$30,$23
23486410c867Schristos	sll	$23,$31,19
23496410c867Schristos	xor	$30,$22
23506410c867Schristos	srl	$22,$31,22
23516410c867Schristos	xor	$30,$23
23526410c867Schristos	sll	$23,$31,30
23536410c867Schristos	xor	$30,$22
23546410c867Schristos	and	$22,$1,$2
23556410c867Schristos	xor	$30,$23			# Sigma0(a)
23566410c867Schristos	xor	$23,$1,$2
23576410c867Schristos#endif
23586410c867Schristos	sw	$17,36($29)	# offload to ring buffer
23596410c867Schristos	addu	$30,$22
23606410c867Schristos	and	$23,$31
23616410c867Schristos	addu	$21,$8			# +=K[25]
23626410c867Schristos	addu	$30,$23			# +=Maj(a,b,c)
23636410c867Schristos	addu	$3,$21
23646410c867Schristos	addu	$30,$21
23656410c867Schristos	lw	$20,48($29)	# prefetch from ring buffer
23666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
23676410c867Schristos	srl	$8,$19,3		# Xupdate(26)
23686410c867Schristos	rotr	$22,$19,7
23696410c867Schristos	addu	$18,$11			# +=X[i+9]
23706410c867Schristos	xor	$8,$22
23716410c867Schristos	rotr	$22,$19,18
23726410c867Schristos
23736410c867Schristos	srl	$9,$16,10
23746410c867Schristos	rotr	$23,$16,17
23756410c867Schristos	xor	$8,$22			# sigma0(X[i+1])
23766410c867Schristos	rotr	$22,$16,19
23776410c867Schristos	xor	$9,$23
23786410c867Schristos	addu	$18,$8
23796410c867Schristos#else
23806410c867Schristos	srl	$8,$19,3		# Xupdate(26)
23816410c867Schristos	addu	$18,$11			# +=X[i+9]
23826410c867Schristos	sll	$23,$19,14
23836410c867Schristos	srl	$22,$19,7
23846410c867Schristos	xor	$8,$23
23856410c867Schristos	sll	$23,11
23866410c867Schristos	xor	$8,$22
23876410c867Schristos	srl	$22,$19,18
23886410c867Schristos	xor	$8,$23
23896410c867Schristos
23906410c867Schristos	srl	$9,$16,10
23916410c867Schristos	xor	$8,$22			# sigma0(X[i+1])
23926410c867Schristos	sll	$23,$16,13
23936410c867Schristos	addu	$18,$8
23946410c867Schristos	srl	$22,$16,17
23956410c867Schristos	xor	$9,$23
23966410c867Schristos	sll	$23,2
23976410c867Schristos	xor	$9,$22
23986410c867Schristos	srl	$22,$16,19
23996410c867Schristos	xor	$9,$23
24006410c867Schristos#endif
24016410c867Schristos	xor	$9,$22			# sigma1(X[i+14])
24026410c867Schristos	addu	$18,$9
24036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
24046410c867Schristos	xor	$9,$7,$24			# 26
24056410c867Schristos	rotr	$23,$3,6
24066410c867Schristos	addu	$22,$18,$25
24076410c867Schristos	rotr	$8,$3,11
24086410c867Schristos	and	$9,$3
24096410c867Schristos	rotr	$25,$3,25
24106410c867Schristos	xor	$23,$8
24116410c867Schristos	rotr	$8,$30,2
24126410c867Schristos	xor	$9,$24			# Ch(e,f,g)
24136410c867Schristos	xor	$23,$25			# Sigma1(e)
24146410c867Schristos
24156410c867Schristos	rotr	$25,$30,13
24166410c867Schristos	addu	$22,$9
24176410c867Schristos	lw	$9,104($6)		# K[26]
24186410c867Schristos	xor	$25,$8
24196410c867Schristos	rotr	$8,$30,22
24206410c867Schristos	addu	$22,$23
24216410c867Schristos	and	$23,$31,$1
24226410c867Schristos	xor	$25,$8			# Sigma0(a)
24236410c867Schristos	xor	$8,$31,$1
24246410c867Schristos#else
24256410c867Schristos	addu	$22,$18,$25			# 26
24266410c867Schristos	srl	$25,$3,6
24276410c867Schristos	xor	$9,$7,$24
24286410c867Schristos	sll	$8,$3,7
24296410c867Schristos	and	$9,$3
24306410c867Schristos	srl	$23,$3,11
24316410c867Schristos	xor	$25,$8
24326410c867Schristos	sll	$8,$3,21
24336410c867Schristos	xor	$25,$23
24346410c867Schristos	srl	$23,$3,25
24356410c867Schristos	xor	$25,$8
24366410c867Schristos	sll	$8,$3,26
24376410c867Schristos	xor	$25,$23
24386410c867Schristos	xor	$9,$24			# Ch(e,f,g)
24396410c867Schristos	xor	$23,$8,$25			# Sigma1(e)
24406410c867Schristos
24416410c867Schristos	srl	$25,$30,2
24426410c867Schristos	addu	$22,$9
24436410c867Schristos	lw	$9,104($6)		# K[26]
24446410c867Schristos	sll	$8,$30,10
24456410c867Schristos	addu	$22,$23
24466410c867Schristos	srl	$23,$30,13
24476410c867Schristos	xor	$25,$8
24486410c867Schristos	sll	$8,$30,19
24496410c867Schristos	xor	$25,$23
24506410c867Schristos	srl	$23,$30,22
24516410c867Schristos	xor	$25,$8
24526410c867Schristos	sll	$8,$30,30
24536410c867Schristos	xor	$25,$23
24546410c867Schristos	and	$23,$31,$1
24556410c867Schristos	xor	$25,$8			# Sigma0(a)
24566410c867Schristos	xor	$8,$31,$1
24576410c867Schristos#endif
24586410c867Schristos	sw	$18,40($29)	# offload to ring buffer
24596410c867Schristos	addu	$25,$23
24606410c867Schristos	and	$8,$30
24616410c867Schristos	addu	$22,$9			# +=K[26]
24626410c867Schristos	addu	$25,$8			# +=Maj(a,b,c)
24636410c867Schristos	addu	$2,$22
24646410c867Schristos	addu	$25,$22
24656410c867Schristos	lw	$21,52($29)	# prefetch from ring buffer
24666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
24676410c867Schristos	srl	$9,$20,3		# Xupdate(27)
24686410c867Schristos	rotr	$23,$20,7
24696410c867Schristos	addu	$19,$12			# +=X[i+9]
24706410c867Schristos	xor	$9,$23
24716410c867Schristos	rotr	$23,$20,18
24726410c867Schristos
24736410c867Schristos	srl	$10,$17,10
24746410c867Schristos	rotr	$8,$17,17
24756410c867Schristos	xor	$9,$23			# sigma0(X[i+1])
24766410c867Schristos	rotr	$23,$17,19
24776410c867Schristos	xor	$10,$8
24786410c867Schristos	addu	$19,$9
24796410c867Schristos#else
24806410c867Schristos	srl	$9,$20,3		# Xupdate(27)
24816410c867Schristos	addu	$19,$12			# +=X[i+9]
24826410c867Schristos	sll	$8,$20,14
24836410c867Schristos	srl	$23,$20,7
24846410c867Schristos	xor	$9,$8
24856410c867Schristos	sll	$8,11
24866410c867Schristos	xor	$9,$23
24876410c867Schristos	srl	$23,$20,18
24886410c867Schristos	xor	$9,$8
24896410c867Schristos
24906410c867Schristos	srl	$10,$17,10
24916410c867Schristos	xor	$9,$23			# sigma0(X[i+1])
24926410c867Schristos	sll	$8,$17,13
24936410c867Schristos	addu	$19,$9
24946410c867Schristos	srl	$23,$17,17
24956410c867Schristos	xor	$10,$8
24966410c867Schristos	sll	$8,2
24976410c867Schristos	xor	$10,$23
24986410c867Schristos	srl	$23,$17,19
24996410c867Schristos	xor	$10,$8
25006410c867Schristos#endif
25016410c867Schristos	xor	$10,$23			# sigma1(X[i+14])
25026410c867Schristos	addu	$19,$10
25036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
25046410c867Schristos	xor	$10,$3,$7			# 27
25056410c867Schristos	rotr	$8,$2,6
25066410c867Schristos	addu	$23,$19,$24
25076410c867Schristos	rotr	$9,$2,11
25086410c867Schristos	and	$10,$2
25096410c867Schristos	rotr	$24,$2,25
25106410c867Schristos	xor	$8,$9
25116410c867Schristos	rotr	$9,$25,2
25126410c867Schristos	xor	$10,$7			# Ch(e,f,g)
25136410c867Schristos	xor	$8,$24			# Sigma1(e)
25146410c867Schristos
25156410c867Schristos	rotr	$24,$25,13
25166410c867Schristos	addu	$23,$10
25176410c867Schristos	lw	$10,108($6)		# K[27]
25186410c867Schristos	xor	$24,$9
25196410c867Schristos	rotr	$9,$25,22
25206410c867Schristos	addu	$23,$8
25216410c867Schristos	and	$8,$30,$31
25226410c867Schristos	xor	$24,$9			# Sigma0(a)
25236410c867Schristos	xor	$9,$30,$31
25246410c867Schristos#else
25256410c867Schristos	addu	$23,$19,$24			# 27
25266410c867Schristos	srl	$24,$2,6
25276410c867Schristos	xor	$10,$3,$7
25286410c867Schristos	sll	$9,$2,7
25296410c867Schristos	and	$10,$2
25306410c867Schristos	srl	$8,$2,11
25316410c867Schristos	xor	$24,$9
25326410c867Schristos	sll	$9,$2,21
25336410c867Schristos	xor	$24,$8
25346410c867Schristos	srl	$8,$2,25
25356410c867Schristos	xor	$24,$9
25366410c867Schristos	sll	$9,$2,26
25376410c867Schristos	xor	$24,$8
25386410c867Schristos	xor	$10,$7			# Ch(e,f,g)
25396410c867Schristos	xor	$8,$9,$24			# Sigma1(e)
25406410c867Schristos
25416410c867Schristos	srl	$24,$25,2
25426410c867Schristos	addu	$23,$10
25436410c867Schristos	lw	$10,108($6)		# K[27]
25446410c867Schristos	sll	$9,$25,10
25456410c867Schristos	addu	$23,$8
25466410c867Schristos	srl	$8,$25,13
25476410c867Schristos	xor	$24,$9
25486410c867Schristos	sll	$9,$25,19
25496410c867Schristos	xor	$24,$8
25506410c867Schristos	srl	$8,$25,22
25516410c867Schristos	xor	$24,$9
25526410c867Schristos	sll	$9,$25,30
25536410c867Schristos	xor	$24,$8
25546410c867Schristos	and	$8,$30,$31
25556410c867Schristos	xor	$24,$9			# Sigma0(a)
25566410c867Schristos	xor	$9,$30,$31
25576410c867Schristos#endif
25586410c867Schristos	sw	$19,44($29)	# offload to ring buffer
25596410c867Schristos	addu	$24,$8
25606410c867Schristos	and	$9,$25
25616410c867Schristos	addu	$23,$10			# +=K[27]
25626410c867Schristos	addu	$24,$9			# +=Maj(a,b,c)
25636410c867Schristos	addu	$1,$23
25646410c867Schristos	addu	$24,$23
25656410c867Schristos	lw	$22,56($29)	# prefetch from ring buffer
25666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
25676410c867Schristos	srl	$10,$21,3		# Xupdate(28)
25686410c867Schristos	rotr	$8,$21,7
25696410c867Schristos	addu	$20,$13			# +=X[i+9]
25706410c867Schristos	xor	$10,$8
25716410c867Schristos	rotr	$8,$21,18
25726410c867Schristos
25736410c867Schristos	srl	$11,$18,10
25746410c867Schristos	rotr	$9,$18,17
25756410c867Schristos	xor	$10,$8			# sigma0(X[i+1])
25766410c867Schristos	rotr	$8,$18,19
25776410c867Schristos	xor	$11,$9
25786410c867Schristos	addu	$20,$10
25796410c867Schristos#else
25806410c867Schristos	srl	$10,$21,3		# Xupdate(28)
25816410c867Schristos	addu	$20,$13			# +=X[i+9]
25826410c867Schristos	sll	$9,$21,14
25836410c867Schristos	srl	$8,$21,7
25846410c867Schristos	xor	$10,$9
25856410c867Schristos	sll	$9,11
25866410c867Schristos	xor	$10,$8
25876410c867Schristos	srl	$8,$21,18
25886410c867Schristos	xor	$10,$9
25896410c867Schristos
25906410c867Schristos	srl	$11,$18,10
25916410c867Schristos	xor	$10,$8			# sigma0(X[i+1])
25926410c867Schristos	sll	$9,$18,13
25936410c867Schristos	addu	$20,$10
25946410c867Schristos	srl	$8,$18,17
25956410c867Schristos	xor	$11,$9
25966410c867Schristos	sll	$9,2
25976410c867Schristos	xor	$11,$8
25986410c867Schristos	srl	$8,$18,19
25996410c867Schristos	xor	$11,$9
26006410c867Schristos#endif
26016410c867Schristos	xor	$11,$8			# sigma1(X[i+14])
26026410c867Schristos	addu	$20,$11
26036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
26046410c867Schristos	xor	$11,$2,$3			# 28
26056410c867Schristos	rotr	$9,$1,6
26066410c867Schristos	addu	$8,$20,$7
26076410c867Schristos	rotr	$10,$1,11
26086410c867Schristos	and	$11,$1
26096410c867Schristos	rotr	$7,$1,25
26106410c867Schristos	xor	$9,$10
26116410c867Schristos	rotr	$10,$24,2
26126410c867Schristos	xor	$11,$3			# Ch(e,f,g)
26136410c867Schristos	xor	$9,$7			# Sigma1(e)
26146410c867Schristos
26156410c867Schristos	rotr	$7,$24,13
26166410c867Schristos	addu	$8,$11
26176410c867Schristos	lw	$11,112($6)		# K[28]
26186410c867Schristos	xor	$7,$10
26196410c867Schristos	rotr	$10,$24,22
26206410c867Schristos	addu	$8,$9
26216410c867Schristos	and	$9,$25,$30
26226410c867Schristos	xor	$7,$10			# Sigma0(a)
26236410c867Schristos	xor	$10,$25,$30
26246410c867Schristos#else
26256410c867Schristos	addu	$8,$20,$7			# 28
26266410c867Schristos	srl	$7,$1,6
26276410c867Schristos	xor	$11,$2,$3
26286410c867Schristos	sll	$10,$1,7
26296410c867Schristos	and	$11,$1
26306410c867Schristos	srl	$9,$1,11
26316410c867Schristos	xor	$7,$10
26326410c867Schristos	sll	$10,$1,21
26336410c867Schristos	xor	$7,$9
26346410c867Schristos	srl	$9,$1,25
26356410c867Schristos	xor	$7,$10
26366410c867Schristos	sll	$10,$1,26
26376410c867Schristos	xor	$7,$9
26386410c867Schristos	xor	$11,$3			# Ch(e,f,g)
26396410c867Schristos	xor	$9,$10,$7			# Sigma1(e)
26406410c867Schristos
26416410c867Schristos	srl	$7,$24,2
26426410c867Schristos	addu	$8,$11
26436410c867Schristos	lw	$11,112($6)		# K[28]
26446410c867Schristos	sll	$10,$24,10
26456410c867Schristos	addu	$8,$9
26466410c867Schristos	srl	$9,$24,13
26476410c867Schristos	xor	$7,$10
26486410c867Schristos	sll	$10,$24,19
26496410c867Schristos	xor	$7,$9
26506410c867Schristos	srl	$9,$24,22
26516410c867Schristos	xor	$7,$10
26526410c867Schristos	sll	$10,$24,30
26536410c867Schristos	xor	$7,$9
26546410c867Schristos	and	$9,$25,$30
26556410c867Schristos	xor	$7,$10			# Sigma0(a)
26566410c867Schristos	xor	$10,$25,$30
26576410c867Schristos#endif
26586410c867Schristos	sw	$20,48($29)	# offload to ring buffer
26596410c867Schristos	addu	$7,$9
26606410c867Schristos	and	$10,$24
26616410c867Schristos	addu	$8,$11			# +=K[28]
26626410c867Schristos	addu	$7,$10			# +=Maj(a,b,c)
26636410c867Schristos	addu	$31,$8
26646410c867Schristos	addu	$7,$8
26656410c867Schristos	lw	$23,60($29)	# prefetch from ring buffer
26666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
26676410c867Schristos	srl	$11,$22,3		# Xupdate(29)
26686410c867Schristos	rotr	$9,$22,7
26696410c867Schristos	addu	$21,$14			# +=X[i+9]
26706410c867Schristos	xor	$11,$9
26716410c867Schristos	rotr	$9,$22,18
26726410c867Schristos
26736410c867Schristos	srl	$12,$19,10
26746410c867Schristos	rotr	$10,$19,17
26756410c867Schristos	xor	$11,$9			# sigma0(X[i+1])
26766410c867Schristos	rotr	$9,$19,19
26776410c867Schristos	xor	$12,$10
26786410c867Schristos	addu	$21,$11
26796410c867Schristos#else
26806410c867Schristos	srl	$11,$22,3		# Xupdate(29)
26816410c867Schristos	addu	$21,$14			# +=X[i+9]
26826410c867Schristos	sll	$10,$22,14
26836410c867Schristos	srl	$9,$22,7
26846410c867Schristos	xor	$11,$10
26856410c867Schristos	sll	$10,11
26866410c867Schristos	xor	$11,$9
26876410c867Schristos	srl	$9,$22,18
26886410c867Schristos	xor	$11,$10
26896410c867Schristos
26906410c867Schristos	srl	$12,$19,10
26916410c867Schristos	xor	$11,$9			# sigma0(X[i+1])
26926410c867Schristos	sll	$10,$19,13
26936410c867Schristos	addu	$21,$11
26946410c867Schristos	srl	$9,$19,17
26956410c867Schristos	xor	$12,$10
26966410c867Schristos	sll	$10,2
26976410c867Schristos	xor	$12,$9
26986410c867Schristos	srl	$9,$19,19
26996410c867Schristos	xor	$12,$10
27006410c867Schristos#endif
27016410c867Schristos	xor	$12,$9			# sigma1(X[i+14])
27026410c867Schristos	addu	$21,$12
27036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
27046410c867Schristos	xor	$12,$1,$2			# 29
27056410c867Schristos	rotr	$10,$31,6
27066410c867Schristos	addu	$9,$21,$3
27076410c867Schristos	rotr	$11,$31,11
27086410c867Schristos	and	$12,$31
27096410c867Schristos	rotr	$3,$31,25
27106410c867Schristos	xor	$10,$11
27116410c867Schristos	rotr	$11,$7,2
27126410c867Schristos	xor	$12,$2			# Ch(e,f,g)
27136410c867Schristos	xor	$10,$3			# Sigma1(e)
27146410c867Schristos
27156410c867Schristos	rotr	$3,$7,13
27166410c867Schristos	addu	$9,$12
27176410c867Schristos	lw	$12,116($6)		# K[29]
27186410c867Schristos	xor	$3,$11
27196410c867Schristos	rotr	$11,$7,22
27206410c867Schristos	addu	$9,$10
27216410c867Schristos	and	$10,$24,$25
27226410c867Schristos	xor	$3,$11			# Sigma0(a)
27236410c867Schristos	xor	$11,$24,$25
27246410c867Schristos#else
27256410c867Schristos	addu	$9,$21,$3			# 29
27266410c867Schristos	srl	$3,$31,6
27276410c867Schristos	xor	$12,$1,$2
27286410c867Schristos	sll	$11,$31,7
27296410c867Schristos	and	$12,$31
27306410c867Schristos	srl	$10,$31,11
27316410c867Schristos	xor	$3,$11
27326410c867Schristos	sll	$11,$31,21
27336410c867Schristos	xor	$3,$10
27346410c867Schristos	srl	$10,$31,25
27356410c867Schristos	xor	$3,$11
27366410c867Schristos	sll	$11,$31,26
27376410c867Schristos	xor	$3,$10
27386410c867Schristos	xor	$12,$2			# Ch(e,f,g)
27396410c867Schristos	xor	$10,$11,$3			# Sigma1(e)
27406410c867Schristos
27416410c867Schristos	srl	$3,$7,2
27426410c867Schristos	addu	$9,$12
27436410c867Schristos	lw	$12,116($6)		# K[29]
27446410c867Schristos	sll	$11,$7,10
27456410c867Schristos	addu	$9,$10
27466410c867Schristos	srl	$10,$7,13
27476410c867Schristos	xor	$3,$11
27486410c867Schristos	sll	$11,$7,19
27496410c867Schristos	xor	$3,$10
27506410c867Schristos	srl	$10,$7,22
27516410c867Schristos	xor	$3,$11
27526410c867Schristos	sll	$11,$7,30
27536410c867Schristos	xor	$3,$10
27546410c867Schristos	and	$10,$24,$25
27556410c867Schristos	xor	$3,$11			# Sigma0(a)
27566410c867Schristos	xor	$11,$24,$25
27576410c867Schristos#endif
27586410c867Schristos	sw	$21,52($29)	# offload to ring buffer
27596410c867Schristos	addu	$3,$10
27606410c867Schristos	and	$11,$7
27616410c867Schristos	addu	$9,$12			# +=K[29]
27626410c867Schristos	addu	$3,$11			# +=Maj(a,b,c)
27636410c867Schristos	addu	$30,$9
27646410c867Schristos	addu	$3,$9
27656410c867Schristos	lw	$8,0($29)	# prefetch from ring buffer
27666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
27676410c867Schristos	srl	$12,$23,3		# Xupdate(30)
27686410c867Schristos	rotr	$10,$23,7
27696410c867Schristos	addu	$22,$15			# +=X[i+9]
27706410c867Schristos	xor	$12,$10
27716410c867Schristos	rotr	$10,$23,18
27726410c867Schristos
27736410c867Schristos	srl	$13,$20,10
27746410c867Schristos	rotr	$11,$20,17
27756410c867Schristos	xor	$12,$10			# sigma0(X[i+1])
27766410c867Schristos	rotr	$10,$20,19
27776410c867Schristos	xor	$13,$11
27786410c867Schristos	addu	$22,$12
27796410c867Schristos#else
27806410c867Schristos	srl	$12,$23,3		# Xupdate(30)
27816410c867Schristos	addu	$22,$15			# +=X[i+9]
27826410c867Schristos	sll	$11,$23,14
27836410c867Schristos	srl	$10,$23,7
27846410c867Schristos	xor	$12,$11
27856410c867Schristos	sll	$11,11
27866410c867Schristos	xor	$12,$10
27876410c867Schristos	srl	$10,$23,18
27886410c867Schristos	xor	$12,$11
27896410c867Schristos
27906410c867Schristos	srl	$13,$20,10
27916410c867Schristos	xor	$12,$10			# sigma0(X[i+1])
27926410c867Schristos	sll	$11,$20,13
27936410c867Schristos	addu	$22,$12
27946410c867Schristos	srl	$10,$20,17
27956410c867Schristos	xor	$13,$11
27966410c867Schristos	sll	$11,2
27976410c867Schristos	xor	$13,$10
27986410c867Schristos	srl	$10,$20,19
27996410c867Schristos	xor	$13,$11
28006410c867Schristos#endif
28016410c867Schristos	xor	$13,$10			# sigma1(X[i+14])
28026410c867Schristos	addu	$22,$13
28036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
28046410c867Schristos	xor	$13,$31,$1			# 30
28056410c867Schristos	rotr	$11,$30,6
28066410c867Schristos	addu	$10,$22,$2
28076410c867Schristos	rotr	$12,$30,11
28086410c867Schristos	and	$13,$30
28096410c867Schristos	rotr	$2,$30,25
28106410c867Schristos	xor	$11,$12
28116410c867Schristos	rotr	$12,$3,2
28126410c867Schristos	xor	$13,$1			# Ch(e,f,g)
28136410c867Schristos	xor	$11,$2			# Sigma1(e)
28146410c867Schristos
28156410c867Schristos	rotr	$2,$3,13
28166410c867Schristos	addu	$10,$13
28176410c867Schristos	lw	$13,120($6)		# K[30]
28186410c867Schristos	xor	$2,$12
28196410c867Schristos	rotr	$12,$3,22
28206410c867Schristos	addu	$10,$11
28216410c867Schristos	and	$11,$7,$24
28226410c867Schristos	xor	$2,$12			# Sigma0(a)
28236410c867Schristos	xor	$12,$7,$24
28246410c867Schristos#else
28256410c867Schristos	addu	$10,$22,$2			# 30
28266410c867Schristos	srl	$2,$30,6
28276410c867Schristos	xor	$13,$31,$1
28286410c867Schristos	sll	$12,$30,7
28296410c867Schristos	and	$13,$30
28306410c867Schristos	srl	$11,$30,11
28316410c867Schristos	xor	$2,$12
28326410c867Schristos	sll	$12,$30,21
28336410c867Schristos	xor	$2,$11
28346410c867Schristos	srl	$11,$30,25
28356410c867Schristos	xor	$2,$12
28366410c867Schristos	sll	$12,$30,26
28376410c867Schristos	xor	$2,$11
28386410c867Schristos	xor	$13,$1			# Ch(e,f,g)
28396410c867Schristos	xor	$11,$12,$2			# Sigma1(e)
28406410c867Schristos
28416410c867Schristos	srl	$2,$3,2
28426410c867Schristos	addu	$10,$13
28436410c867Schristos	lw	$13,120($6)		# K[30]
28446410c867Schristos	sll	$12,$3,10
28456410c867Schristos	addu	$10,$11
28466410c867Schristos	srl	$11,$3,13
28476410c867Schristos	xor	$2,$12
28486410c867Schristos	sll	$12,$3,19
28496410c867Schristos	xor	$2,$11
28506410c867Schristos	srl	$11,$3,22
28516410c867Schristos	xor	$2,$12
28526410c867Schristos	sll	$12,$3,30
28536410c867Schristos	xor	$2,$11
28546410c867Schristos	and	$11,$7,$24
28556410c867Schristos	xor	$2,$12			# Sigma0(a)
28566410c867Schristos	xor	$12,$7,$24
28576410c867Schristos#endif
28586410c867Schristos	sw	$22,56($29)	# offload to ring buffer
28596410c867Schristos	addu	$2,$11
28606410c867Schristos	and	$12,$3
28616410c867Schristos	addu	$10,$13			# +=K[30]
28626410c867Schristos	addu	$2,$12			# +=Maj(a,b,c)
28636410c867Schristos	addu	$25,$10
28646410c867Schristos	addu	$2,$10
28656410c867Schristos	lw	$9,4($29)	# prefetch from ring buffer
28666410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
28676410c867Schristos	srl	$13,$8,3		# Xupdate(31)
28686410c867Schristos	rotr	$11,$8,7
28696410c867Schristos	addu	$23,$16			# +=X[i+9]
28706410c867Schristos	xor	$13,$11
28716410c867Schristos	rotr	$11,$8,18
28726410c867Schristos
28736410c867Schristos	srl	$14,$21,10
28746410c867Schristos	rotr	$12,$21,17
28756410c867Schristos	xor	$13,$11			# sigma0(X[i+1])
28766410c867Schristos	rotr	$11,$21,19
28776410c867Schristos	xor	$14,$12
28786410c867Schristos	addu	$23,$13
28796410c867Schristos#else
28806410c867Schristos	srl	$13,$8,3		# Xupdate(31)
28816410c867Schristos	addu	$23,$16			# +=X[i+9]
28826410c867Schristos	sll	$12,$8,14
28836410c867Schristos	srl	$11,$8,7
28846410c867Schristos	xor	$13,$12
28856410c867Schristos	sll	$12,11
28866410c867Schristos	xor	$13,$11
28876410c867Schristos	srl	$11,$8,18
28886410c867Schristos	xor	$13,$12
28896410c867Schristos
28906410c867Schristos	srl	$14,$21,10
28916410c867Schristos	xor	$13,$11			# sigma0(X[i+1])
28926410c867Schristos	sll	$12,$21,13
28936410c867Schristos	addu	$23,$13
28946410c867Schristos	srl	$11,$21,17
28956410c867Schristos	xor	$14,$12
28966410c867Schristos	sll	$12,2
28976410c867Schristos	xor	$14,$11
28986410c867Schristos	srl	$11,$21,19
28996410c867Schristos	xor	$14,$12
29006410c867Schristos#endif
29016410c867Schristos	xor	$14,$11			# sigma1(X[i+14])
29026410c867Schristos	addu	$23,$14
29036410c867Schristos#if defined(_MIPS_ARCH_MIPS32R2) || defined(_MIPS_ARCH_MIPS64R2)
29046410c867Schristos	xor	$14,$30,$31			# 31
29056410c867Schristos	rotr	$12,$25,6
29066410c867Schristos	addu	$11,$23,$1
29076410c867Schristos	rotr	$13,$25,11
29086410c867Schristos	and	$14,$25
29096410c867Schristos	rotr	$1,$25,25
29106410c867Schristos	xor	$12,$13
29116410c867Schristos	rotr	$13,$2,2
29126410c867Schristos	xor	$14,$31			# Ch(e,f,g)
29136410c867Schristos	xor	$12,$1			# Sigma1(e)
29146410c867Schristos
29156410c867Schristos	rotr	$1,$2,13
29166410c867Schristos	addu	$11,$14
29176410c867Schristos	lw	$14,124($6)		# K[31]
29186410c867Schristos	xor	$1,$13
29196410c867Schristos	rotr	$13,$2,22
29206410c867Schristos	addu	$11,$12
29216410c867Schristos	and	$12,$3,$7
29226410c867Schristos	xor	$1,$13			# Sigma0(a)
29236410c867Schristos	xor	$13,$3,$7
29246410c867Schristos#else
29256410c867Schristos	addu	$11,$23,$1			# 31
29266410c867Schristos	srl	$1,$25,6
29276410c867Schristos	xor	$14,$30,$31
29286410c867Schristos	sll	$13,$25,7
29296410c867Schristos	and	$14,$25
29306410c867Schristos	srl	$12,$25,11
29316410c867Schristos	xor	$1,$13
29326410c867Schristos	sll	$13,$25,21
29336410c867Schristos	xor	$1,$12
29346410c867Schristos	srl	$12,$25,25
29356410c867Schristos	xor	$1,$13
29366410c867Schristos	sll	$13,$25,26
29376410c867Schristos	xor	$1,$12
29386410c867Schristos	xor	$14,$31			# Ch(e,f,g)
29396410c867Schristos	xor	$12,$13,$1			# Sigma1(e)
29406410c867Schristos
29416410c867Schristos	srl	$1,$2,2
29426410c867Schristos	addu	$11,$14
29436410c867Schristos	lw	$14,124($6)		# K[31]
29446410c867Schristos	sll	$13,$2,10
29456410c867Schristos	addu	$11,$12
29466410c867Schristos	srl	$12,$2,13
29476410c867Schristos	xor	$1,$13
29486410c867Schristos	sll	$13,$2,19
29496410c867Schristos	xor	$1,$12
29506410c867Schristos	srl	$12,$2,22
29516410c867Schristos	xor	$1,$13
29526410c867Schristos	sll	$13,$2,30
29536410c867Schristos	xor	$1,$12
29546410c867Schristos	and	$12,$3,$7
29556410c867Schristos	xor	$1,$13			# Sigma0(a)
29566410c867Schristos	xor	$13,$3,$7
29576410c867Schristos#endif
29586410c867Schristos	sw	$23,60($29)	# offload to ring buffer
29596410c867Schristos	addu	$1,$12
29606410c867Schristos	and	$13,$2
29616410c867Schristos	addu	$11,$14			# +=K[31]
29626410c867Schristos	addu	$1,$13			# +=Maj(a,b,c)
29636410c867Schristos	addu	$24,$11
29646410c867Schristos	addu	$1,$11
29656410c867Schristos	lw	$10,8($29)	# prefetch from ring buffer
29666410c867Schristos	and	$14,0xfff
29676410c867Schristos	li	$15,2290
29686410c867Schristos	.set	noreorder
29696410c867Schristos	bne	$14,$15,.L16_xx
2970*e0ea3921Schristos	daddu $6,16*4		# Ktbl+=16
29716410c867Schristos
29726410c867Schristos	ld	$23,16*4($29)	# restore pointer to the end of input
29736410c867Schristos	lw	$8,0*4($4)
29746410c867Schristos	lw	$9,1*4($4)
29756410c867Schristos	lw	$10,2*4($4)
2976*e0ea3921Schristos	daddu $5,16*4
29776410c867Schristos	lw	$11,3*4($4)
29786410c867Schristos	addu	$1,$8
29796410c867Schristos	lw	$12,4*4($4)
29806410c867Schristos	addu	$2,$9
29816410c867Schristos	lw	$13,5*4($4)
29826410c867Schristos	addu	$3,$10
29836410c867Schristos	lw	$14,6*4($4)
29846410c867Schristos	addu	$7,$11
29856410c867Schristos	lw	$15,7*4($4)
29866410c867Schristos	addu	$24,$12
29876410c867Schristos	sw	$1,0*4($4)
29886410c867Schristos	addu	$25,$13
29896410c867Schristos	sw	$2,1*4($4)
29906410c867Schristos	addu	$30,$14
29916410c867Schristos	sw	$3,2*4($4)
29926410c867Schristos	addu	$31,$15
29936410c867Schristos	sw	$7,3*4($4)
29946410c867Schristos	sw	$24,4*4($4)
29956410c867Schristos	sw	$25,5*4($4)
29966410c867Schristos	sw	$30,6*4($4)
29976410c867Schristos	sw	$31,7*4($4)
29986410c867Schristos
29996410c867Schristos	bne	$5,$23,.Loop
3000*e0ea3921Schristos	dsubu $6,192	# rewind $6
30016410c867Schristos
30026410c867Schristos	ld	$31,192-1*8($29)
30036410c867Schristos	ld	$30,192-2*8($29)
30046410c867Schristos	ld	$23,192-3*8($29)
30056410c867Schristos	ld	$22,192-4*8($29)
30066410c867Schristos	ld	$21,192-5*8($29)
30076410c867Schristos	ld	$20,192-6*8($29)
30086410c867Schristos	ld	$19,192-7*8($29)
30096410c867Schristos	ld	$18,192-8*8($29)
30106410c867Schristos	ld	$17,192-9*8($29)
30116410c867Schristos	ld	$16,192-10*8($29)
30126410c867Schristos	jr	$31
3013*e0ea3921Schristos	daddu $29,192
30146410c867Schristos.end	sha256_block_data_order
30156410c867Schristos
30166410c867Schristos.rdata
30176410c867Schristos.align	5
30186410c867SchristosK256:
30196410c867Schristos	.word	0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5
30206410c867Schristos	.word	0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5
30216410c867Schristos	.word	0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3
30226410c867Schristos	.word	0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174
30236410c867Schristos	.word	0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc
30246410c867Schristos	.word	0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da
30256410c867Schristos	.word	0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7
30266410c867Schristos	.word	0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967
30276410c867Schristos	.word	0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13
30286410c867Schristos	.word	0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85
30296410c867Schristos	.word	0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3
30306410c867Schristos	.word	0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070
30316410c867Schristos	.word	0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5
30326410c867Schristos	.word	0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3
30336410c867Schristos	.word	0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208
30346410c867Schristos	.word	0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
30356410c867Schristos.asciiz	"SHA256 for MIPS, CRYPTOGAMS by <appro@openssl.org>"
30366410c867Schristos.align	5
30376410c867Schristos
3038