1*1dcdf01fSchristos#include "sparc_arch.h"
2*1dcdf01fSchristos
360662d10Schristos.text
460662d10Schristos
560662d10Schristos.globl	cmll_t4_encrypt
660662d10Schristos.align	32
760662d10Schristoscmll_t4_encrypt:
860662d10Schristos	andcc		%o0, 7, %g1		! is input aligned?
960662d10Schristos	andn		%o0, 7, %o0
1060662d10Schristos
1160662d10Schristos	ldx		[%o2 + 0], %g4
1260662d10Schristos	ldx		[%o2 + 8], %g5
1360662d10Schristos
1460662d10Schristos	ldx		[%o0 + 0], %o4
1560662d10Schristos	bz,pt		%icc, 1f
1660662d10Schristos	ldx		[%o0 + 8], %o5
1760662d10Schristos	ldx		[%o0 + 16], %o0
1860662d10Schristos	sll		%g1, 3, %g1
1960662d10Schristos	sub		%g0, %g1, %o3
2060662d10Schristos	sllx		%o4, %g1, %o4
2160662d10Schristos	sllx		%o5, %g1, %g1
2260662d10Schristos	srlx		%o5, %o3, %o5
2360662d10Schristos	srlx		%o0, %o3, %o3
2460662d10Schristos	or		%o5, %o4, %o4
2560662d10Schristos	or		%o3, %g1, %o5
2660662d10Schristos1:
2760662d10Schristos	ld		[%o2 + 272], %o3	! grandRounds, 3 or 4
2860662d10Schristos	ldd		[%o2 + 16], %f12
2960662d10Schristos	ldd		[%o2 + 24], %f14
3060662d10Schristos	xor		%g4, %o4, %o4
3160662d10Schristos	xor		%g5, %o5, %o5
3260662d10Schristos	ldd		[%o2 + 32], %f16
3360662d10Schristos	ldd		[%o2 + 40], %f18
3460662d10Schristos	.word	0x81b0230c !movxtod	%o4,%f0
3560662d10Schristos	.word	0x85b0230d !movxtod	%o5,%f2
3660662d10Schristos	ldd		[%o2 + 48], %f20
3760662d10Schristos	ldd		[%o2 + 56], %f22
3860662d10Schristos	sub		%o3, 1, %o3
3960662d10Schristos	ldd		[%o2 + 64], %f24
4060662d10Schristos	ldd		[%o2 + 72], %f26
4160662d10Schristos	add		%o2, 80, %o2
4260662d10Schristos
4360662d10Schristos.Lenc:
4460662d10Schristos	.word	0x84cb0182 !camellia_f	%f12,%f2,%f0,%f2
4560662d10Schristos	ldd		[%o2 + 0], %f12
4660662d10Schristos	sub		%o3,1,%o3
4760662d10Schristos	.word	0x80cb8580 !camellia_f	%f14,%f0,%f2,%f0
4860662d10Schristos	ldd		[%o2 + 8], %f14
4960662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
5060662d10Schristos	ldd		[%o2 + 16], %f16
5160662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
5260662d10Schristos	ldd		[%o2 + 24], %f18
5360662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
5460662d10Schristos	ldd		[%o2 + 32], %f20
5560662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
5660662d10Schristos	ldd		[%o2 + 40], %f22
5760662d10Schristos	.word	0x81b62780 !camellia_fl	%f24,%f0,%f0
5860662d10Schristos	ldd		[%o2 + 48], %f24
5960662d10Schristos	.word	0x85b6a7a2 !camellia_fli	%f26,%f2,%f2
6060662d10Schristos	ldd		[%o2 + 56], %f26
6160662d10Schristos	brnz,pt		%o3, .Lenc
6260662d10Schristos	add		%o2, 64, %o2
6360662d10Schristos
6460662d10Schristos	andcc		%o1, 7, %o4		! is output aligned?
6560662d10Schristos	.word	0x84cb0182 !camellia_f	%f12,%f2,%f0,%f2
6660662d10Schristos	.word	0x80cb8580 !camellia_f	%f14,%f0,%f2,%f0
6760662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
6860662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
6960662d10Schristos	.word	0x88cd0182 !camellia_f	%f20,%f2,%f0,%f4
7060662d10Schristos	.word	0x84cd8980 !camellia_f	%f22,%f0,%f4,%f2
7160662d10Schristos	.word	0x81b60d84 !fxor	%f24,%f4,%f0
7260662d10Schristos	.word	0x85b68d82 !fxor	%f26,%f2,%f2
7360662d10Schristos
7460662d10Schristos	bnz,pn		%icc, 2f
7560662d10Schristos	nop
7660662d10Schristos
7760662d10Schristos	std		%f0, [%o1 + 0]
7860662d10Schristos	retl
7960662d10Schristos	std		%f2, [%o1 + 8]
8060662d10Schristos
8160662d10Schristos2:	.word	0x93b24340 !alignaddrl	%o1,%g0,%o1
8260662d10Schristos	mov		0xff, %o5
8360662d10Schristos	srl		%o5, %o4, %o5
8460662d10Schristos
8560662d10Schristos	.word	0x89b00900 !faligndata	%f0,%f0,%f4
8660662d10Schristos	.word	0x8db00902 !faligndata	%f0,%f2,%f6
8760662d10Schristos	.word	0x91b08902 !faligndata	%f2,%f2,%f8
8860662d10Schristos
8960662d10Schristos	stda		%f4, [%o1 + %o5]0xc0	! partial store
9060662d10Schristos	std		%f6, [%o1 + 8]
9160662d10Schristos	add		%o1, 16, %o1
9260662d10Schristos	orn		%g0, %o5, %o5
9360662d10Schristos	retl
9460662d10Schristos	stda		%f8, [%o1 + %o5]0xc0	! partial store
9560662d10Schristos.type	cmll_t4_encrypt,#function
9660662d10Schristos.size	cmll_t4_encrypt,.-cmll_t4_encrypt
9760662d10Schristos
9860662d10Schristos.globl	cmll_t4_decrypt
9960662d10Schristos.align	32
10060662d10Schristoscmll_t4_decrypt:
10160662d10Schristos	ld		[%o2 + 272], %o3	! grandRounds, 3 or 4
10260662d10Schristos	andcc		%o0, 7, %g1		! is input aligned?
10360662d10Schristos	andn		%o0, 7, %o0
10460662d10Schristos
10560662d10Schristos	sll		%o3, 6, %o3
10660662d10Schristos	add		%o3, %o2, %o2
10760662d10Schristos
10860662d10Schristos	ldx		[%o0 + 0], %o4
10960662d10Schristos	bz,pt		%icc, 1f
11060662d10Schristos	ldx		[%o0 + 8], %o5
11160662d10Schristos	ldx		[%o0 + 16], %o0
11260662d10Schristos	sll		%g1, 3, %g1
11360662d10Schristos	sub		%g0, %g1, %g4
11460662d10Schristos	sllx		%o4, %g1, %o4
11560662d10Schristos	sllx		%o5, %g1, %g1
11660662d10Schristos	srlx		%o5, %g4, %o5
11760662d10Schristos	srlx		%o0, %g4, %g4
11860662d10Schristos	or		%o5, %o4, %o4
11960662d10Schristos	or		%g4, %g1, %o5
12060662d10Schristos1:
12160662d10Schristos	ldx		[%o2 + 0], %g4
12260662d10Schristos	ldx		[%o2 + 8], %g5
12360662d10Schristos	ldd		[%o2 - 8], %f12
12460662d10Schristos	ldd		[%o2 - 16], %f14
12560662d10Schristos	xor		%g4, %o4, %o4
12660662d10Schristos	xor		%g5, %o5, %o5
12760662d10Schristos	ldd		[%o2 - 24], %f16
12860662d10Schristos	ldd		[%o2 - 32], %f18
12960662d10Schristos	.word	0x81b0230c !movxtod	%o4,%f0
13060662d10Schristos	.word	0x85b0230d !movxtod	%o5,%f2
13160662d10Schristos	ldd		[%o2 - 40], %f20
13260662d10Schristos	ldd		[%o2 - 48], %f22
13360662d10Schristos	sub		%o3, 64, %o3
13460662d10Schristos	ldd		[%o2 - 56], %f24
13560662d10Schristos	ldd		[%o2 - 64], %f26
13660662d10Schristos	sub		%o2, 64, %o2
13760662d10Schristos
13860662d10Schristos.Ldec:
13960662d10Schristos	.word	0x84cb0182 !camellia_f	%f12,%f2,%f0,%f2
14060662d10Schristos	ldd		[%o2 - 8], %f12
14160662d10Schristos	sub		%o3, 64, %o3
14260662d10Schristos	.word	0x80cb8580 !camellia_f	%f14,%f0,%f2,%f0
14360662d10Schristos	ldd		[%o2 - 16], %f14
14460662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
14560662d10Schristos	ldd		[%o2 - 24], %f16
14660662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
14760662d10Schristos	ldd		[%o2 - 32], %f18
14860662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
14960662d10Schristos	ldd		[%o2 - 40], %f20
15060662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
15160662d10Schristos	ldd		[%o2 - 48], %f22
15260662d10Schristos	.word	0x81b62780 !camellia_fl	%f24,%f0,%f0
15360662d10Schristos	ldd		[%o2 - 56], %f24
15460662d10Schristos	.word	0x85b6a7a2 !camellia_fli	%f26,%f2,%f2
15560662d10Schristos	ldd		[%o2 - 64], %f26
15660662d10Schristos	brnz,pt		%o3, .Ldec
15760662d10Schristos	sub		%o2, 64, %o2
15860662d10Schristos
15960662d10Schristos	andcc		%o1, 7, %o4		! is output aligned?
16060662d10Schristos	.word	0x84cb0182 !camellia_f	%f12,%f2,%f0,%f2
16160662d10Schristos	.word	0x80cb8580 !camellia_f	%f14,%f0,%f2,%f0
16260662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
16360662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
16460662d10Schristos	.word	0x88cd0182 !camellia_f	%f20,%f2,%f0,%f4
16560662d10Schristos	.word	0x84cd8980 !camellia_f	%f22,%f0,%f4,%f2
16660662d10Schristos	.word	0x81b68d84 !fxor	%f26,%f4,%f0
16760662d10Schristos	.word	0x85b60d82 !fxor	%f24,%f2,%f2
16860662d10Schristos
16960662d10Schristos	bnz,pn		%icc, 2f
17060662d10Schristos	nop
17160662d10Schristos
17260662d10Schristos	std		%f0, [%o1 + 0]
17360662d10Schristos	retl
17460662d10Schristos	std		%f2, [%o1 + 8]
17560662d10Schristos
17660662d10Schristos2:	.word	0x93b24340 !alignaddrl	%o1,%g0,%o1
17760662d10Schristos	mov		0xff, %o5
17860662d10Schristos	srl		%o5, %o4, %o5
17960662d10Schristos
18060662d10Schristos	.word	0x89b00900 !faligndata	%f0,%f0,%f4
18160662d10Schristos	.word	0x8db00902 !faligndata	%f0,%f2,%f6
18260662d10Schristos	.word	0x91b08902 !faligndata	%f2,%f2,%f8
18360662d10Schristos
18460662d10Schristos	stda		%f4, [%o1 + %o5]0xc0	! partial store
18560662d10Schristos	std		%f6, [%o1 + 8]
18660662d10Schristos	add		%o1, 16, %o1
18760662d10Schristos	orn		%g0, %o5, %o5
18860662d10Schristos	retl
18960662d10Schristos	stda		%f8, [%o1 + %o5]0xc0	! partial store
19060662d10Schristos.type	cmll_t4_decrypt,#function
19160662d10Schristos.size	cmll_t4_decrypt,.-cmll_t4_decrypt
19260662d10Schristos.globl	cmll_t4_set_key
19360662d10Schristos.align	32
19460662d10Schristoscmll_t4_set_key:
19560662d10Schristos	and		%o0, 7, %o3
19660662d10Schristos	.word	0x91b20300 !alignaddr	%o0,%g0,%o0
19760662d10Schristos	cmp		%o1, 192
19860662d10Schristos	ldd		[%o0 + 0], %f0
19960662d10Schristos	bl,pt		%icc,.L128
20060662d10Schristos	ldd		[%o0 + 8], %f2
20160662d10Schristos
20260662d10Schristos	be,pt		%icc,.L192
20360662d10Schristos	ldd		[%o0 + 16], %f4
20460662d10Schristos
20560662d10Schristos	brz,pt		%o3, .L256aligned
20660662d10Schristos	ldd		[%o0 + 24], %f6
20760662d10Schristos
20860662d10Schristos	ldd		[%o0 + 32], %f8
20960662d10Schristos	.word	0x81b00902 !faligndata	%f0,%f2,%f0
21060662d10Schristos	.word	0x85b08904 !faligndata	%f2,%f4,%f2
21160662d10Schristos	.word	0x89b10906 !faligndata	%f4,%f6,%f4
21260662d10Schristos	b		.L256aligned
21360662d10Schristos	.word	0x8db18908 !faligndata	%f6,%f8,%f6
21460662d10Schristos
21560662d10Schristos.align	16
21660662d10Schristos.L192:
21760662d10Schristos	brz,a,pt	%o3, .L256aligned
21860662d10Schristos	.word	0x8db00cc4 !fnot2	%f0,%f4,%f6
21960662d10Schristos
22060662d10Schristos	ldd		[%o0 + 24], %f6
22160662d10Schristos	nop
22260662d10Schristos	.word	0x81b00902 !faligndata	%f0,%f2,%f0
22360662d10Schristos	.word	0x85b08904 !faligndata	%f2,%f4,%f2
22460662d10Schristos	.word	0x89b10906 !faligndata	%f4,%f6,%f4
22560662d10Schristos	.word	0x8db00cc4 !fnot2	%f0,%f4,%f6
22660662d10Schristos
22760662d10Schristos.L256aligned:
22860662d10Schristos	std		%f0, [%o2 + 0]		! k[0, 1]
22960662d10Schristos	.word	0xb9b00f00 !fsrc2	%f0,%f0,%f28
23060662d10Schristos	std		%f2, [%o2 + 8]		! k[2, 3]
23160662d10Schristos	.word	0xbdb00f02 !fsrc2	%f0,%f2,%f30
23260662d10Schristos	.word	0x81b10d80 !fxor	%f4,%f0,%f0
23360662d10Schristos	b		.L128key
23460662d10Schristos	.word	0x85b18d82 !fxor	%f6,%f2,%f2
23560662d10Schristos
23660662d10Schristos.align	16
23760662d10Schristos.L128:
23860662d10Schristos	brz,pt		%o3, .L128aligned
23960662d10Schristos	nop
24060662d10Schristos
24160662d10Schristos	ldd		[%o0 + 16], %f4
24260662d10Schristos	nop
24360662d10Schristos	.word	0x81b00902 !faligndata	%f0,%f2,%f0
24460662d10Schristos	.word	0x85b08904 !faligndata	%f2,%f4,%f2
24560662d10Schristos
24660662d10Schristos.L128aligned:
24760662d10Schristos	std		%f0, [%o2 + 0]		! k[0, 1]
24860662d10Schristos	.word	0xb9b00f00 !fsrc2	%f0,%f0,%f28
24960662d10Schristos	std		%f2, [%o2 + 8]		! k[2, 3]
25060662d10Schristos	.word	0xbdb00f02 !fsrc2	%f0,%f2,%f30
25160662d10Schristos
25260662d10Schristos.L128key:
25360662d10Schristos	mov		%o7, %o5
25460662d10Schristos1:	call		.+8
25560662d10Schristos	add		%o7, SIGMA-1b, %o4
25660662d10Schristos	mov		%o5, %o7
25760662d10Schristos
25860662d10Schristos	ldd		[%o4 + 0], %f16
25960662d10Schristos	ldd		[%o4 + 8], %f18
26060662d10Schristos	ldd		[%o4 + 16], %f20
26160662d10Schristos	ldd		[%o4 + 24], %f22
26260662d10Schristos
26360662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
26460662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
26560662d10Schristos	.word	0x81b70d80 !fxor	%f28,%f0,%f0
26660662d10Schristos	.word	0x85b78d82 !fxor	%f30,%f2,%f2
26760662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
26860662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
26960662d10Schristos
27060662d10Schristos	bge,pn		%icc, .L256key
27160662d10Schristos	nop
27260662d10Schristos	std	%f0, [%o2 + 0x10]	! k[ 4,  5]
27360662d10Schristos	std	%f2, [%o2 + 0x18]	! k[ 6,  7]
27460662d10Schristos
27560662d10Schristos	.word	0x99b02200 !movdtox	%f0,%o4
27660662d10Schristos	.word	0x9bb02202 !movdtox	%f2,%o5
27760662d10Schristos	srlx	%o4, 64-15, %g4
27860662d10Schristos	sllx	%o4, 15, %o4
27960662d10Schristos	srlx	%o5, 64-15, %g5
28060662d10Schristos	sllx	%o5, 15, %o5
28160662d10Schristos	or	%o4, %g5, %o4
28260662d10Schristos	or	%o5, %g4, %o5
28360662d10Schristos	stx	%o4, [%o2 + 0x30]	! k[12, 13]
28460662d10Schristos	stx	%o5, [%o2 + 0x38]	! k[14, 15]
28560662d10Schristos	srlx	%o4, 64-15, %g4
28660662d10Schristos	sllx	%o4, 15, %o4
28760662d10Schristos	srlx	%o5, 64-15, %g5
28860662d10Schristos	sllx	%o5, 15, %o5
28960662d10Schristos	or	%o4, %g5, %o4
29060662d10Schristos	or	%o5, %g4, %o5
29160662d10Schristos	stx	%o4, [%o2 + 0x40]	! k[16, 17]
29260662d10Schristos	stx	%o5, [%o2 + 0x48]	! k[18, 19]
29360662d10Schristos	srlx	%o4, 64-15, %g4
29460662d10Schristos	sllx	%o4, 15, %o4
29560662d10Schristos	srlx	%o5, 64-15, %g5
29660662d10Schristos	sllx	%o5, 15, %o5
29760662d10Schristos	or	%o4, %g5, %o4
29860662d10Schristos	or	%o5, %g4, %o5
29960662d10Schristos	stx	%o4, [%o2 + 0x60]	! k[24, 25]
30060662d10Schristos	srlx	%o4, 64-15, %g4
30160662d10Schristos	sllx	%o4, 15, %o4
30260662d10Schristos	srlx	%o5, 64-15, %g5
30360662d10Schristos	sllx	%o5, 15, %o5
30460662d10Schristos	or	%o4, %g5, %o4
30560662d10Schristos	or	%o5, %g4, %o5
30660662d10Schristos	stx	%o4, [%o2 + 0x70]	! k[28, 29]
30760662d10Schristos	stx	%o5, [%o2 + 0x78]	! k[30, 31]
30860662d10Schristos	srlx	%o4, 64-34, %g4
30960662d10Schristos	sllx	%o4, 34, %o4
31060662d10Schristos	srlx	%o5, 64-34, %g5
31160662d10Schristos	sllx	%o5, 34, %o5
31260662d10Schristos	or	%o4, %g5, %o4
31360662d10Schristos	or	%o5, %g4, %o5
31460662d10Schristos	stx	%o4, [%o2 + 0xa0]	! k[40, 41]
31560662d10Schristos	stx	%o5, [%o2 + 0xa8]	! k[42, 43]
31660662d10Schristos	srlx	%o4, 64-17, %g4
31760662d10Schristos	sllx	%o4, 17, %o4
31860662d10Schristos	srlx	%o5, 64-17, %g5
31960662d10Schristos	sllx	%o5, 17, %o5
32060662d10Schristos	or	%o4, %g5, %o4
32160662d10Schristos	or	%o5, %g4, %o5
32260662d10Schristos	stx	%o4, [%o2 + 0xc0]	! k[48, 49]
32360662d10Schristos	stx	%o5, [%o2 + 0xc8]	! k[50, 51]
32460662d10Schristos
32560662d10Schristos	.word	0x99b0221c !movdtox	%f28,%o4		! k[ 0,  1]
32660662d10Schristos	.word	0x9bb0221e !movdtox	%f30,%o5		! k[ 2,  3]
32760662d10Schristos	srlx	%o4, 64-15, %g4
32860662d10Schristos	sllx	%o4, 15, %o4
32960662d10Schristos	srlx	%o5, 64-15, %g5
33060662d10Schristos	sllx	%o5, 15, %o5
33160662d10Schristos	or	%o4, %g5, %o4
33260662d10Schristos	or	%o5, %g4, %o5
33360662d10Schristos	stx	%o4, [%o2 + 0x20]	! k[ 8,  9]
33460662d10Schristos	stx	%o5, [%o2 + 0x28]	! k[10, 11]
33560662d10Schristos	srlx	%o4, 64-30, %g4
33660662d10Schristos	sllx	%o4, 30, %o4
33760662d10Schristos	srlx	%o5, 64-30, %g5
33860662d10Schristos	sllx	%o5, 30, %o5
33960662d10Schristos	or	%o4, %g5, %o4
34060662d10Schristos	or	%o5, %g4, %o5
34160662d10Schristos	stx	%o4, [%o2 + 0x50]	! k[20, 21]
34260662d10Schristos	stx	%o5, [%o2 + 0x58]	! k[22, 23]
34360662d10Schristos	srlx	%o4, 64-15, %g4
34460662d10Schristos	sllx	%o4, 15, %o4
34560662d10Schristos	srlx	%o5, 64-15, %g5
34660662d10Schristos	sllx	%o5, 15, %o5
34760662d10Schristos	or	%o4, %g5, %o4
34860662d10Schristos	or	%o5, %g4, %o5
34960662d10Schristos	stx	%o5, [%o2 + 0x68]	! k[26, 27]
35060662d10Schristos	srlx	%o4, 64-17, %g4
35160662d10Schristos	sllx	%o4, 17, %o4
35260662d10Schristos	srlx	%o5, 64-17, %g5
35360662d10Schristos	sllx	%o5, 17, %o5
35460662d10Schristos	or	%o4, %g5, %o4
35560662d10Schristos	or	%o5, %g4, %o5
35660662d10Schristos	stx	%o4, [%o2 + 0x80]	! k[32, 33]
35760662d10Schristos	stx	%o5, [%o2 + 0x88]	! k[34, 35]
35860662d10Schristos	srlx	%o4, 64-17, %g4
35960662d10Schristos	sllx	%o4, 17, %o4
36060662d10Schristos	srlx	%o5, 64-17, %g5
36160662d10Schristos	sllx	%o5, 17, %o5
36260662d10Schristos	or	%o4, %g5, %o4
36360662d10Schristos	or	%o5, %g4, %o5
36460662d10Schristos	stx	%o4, [%o2 + 0x90]	! k[36, 37]
36560662d10Schristos	stx	%o5, [%o2 + 0x98]	! k[38, 39]
36660662d10Schristos	srlx	%o4, 64-17, %g4
36760662d10Schristos	sllx	%o4, 17, %o4
36860662d10Schristos	srlx	%o5, 64-17, %g5
36960662d10Schristos	sllx	%o5, 17, %o5
37060662d10Schristos	or	%o4, %g5, %o4
37160662d10Schristos	or	%o5, %g4, %o5
37260662d10Schristos	stx	%o4, [%o2 + 0xb0]	! k[44, 45]
37360662d10Schristos	stx	%o5, [%o2 + 0xb8]	! k[46, 47]
37460662d10Schristos
37560662d10Schristos	mov		3, %o3
37660662d10Schristos	st		%o3, [%o2 + 0x110]
37760662d10Schristos	retl
37860662d10Schristos	xor		%o0, %o0, %o0
37960662d10Schristos
38060662d10Schristos.align	16
38160662d10Schristos.L256key:
38260662d10Schristos	ldd		[%o4 + 32], %f24
38360662d10Schristos	ldd		[%o4 + 40], %f26
38460662d10Schristos
38560662d10Schristos	std		%f0, [%o2 + 0x30]	! k[12, 13]
38660662d10Schristos	std		%f2, [%o2 + 0x38]	! k[14, 15]
38760662d10Schristos
38860662d10Schristos	.word	0x81b10d80 !fxor	%f4,%f0,%f0
38960662d10Schristos	.word	0x85b18d82 !fxor	%f6,%f2,%f2
39060662d10Schristos	.word	0x84ce0182 !camellia_f	%f24,%f2,%f0,%f2
39160662d10Schristos	.word	0x80ce8580 !camellia_f	%f26,%f0,%f2,%f0
39260662d10Schristos
39360662d10Schristos	std	%f0, [%o2 + 0x10]	! k[ 4,  5]
39460662d10Schristos	std	%f2, [%o2 + 0x18]	! k[ 6,  7]
39560662d10Schristos
39660662d10Schristos	.word	0x99b02200 !movdtox	%f0,%o4
39760662d10Schristos	.word	0x9bb02202 !movdtox	%f2,%o5
39860662d10Schristos	srlx	%o4, 64-30, %g4
39960662d10Schristos	sllx	%o4, 30, %o4
40060662d10Schristos	srlx	%o5, 64-30, %g5
40160662d10Schristos	sllx	%o5, 30, %o5
40260662d10Schristos	or	%o4, %g5, %o4
40360662d10Schristos	or	%o5, %g4, %o5
40460662d10Schristos	stx	%o4, [%o2 + 0x50]	! k[20, 21]
40560662d10Schristos	stx	%o5, [%o2 + 0x58]	! k[22, 23]
40660662d10Schristos	srlx	%o4, 64-30, %g4
40760662d10Schristos	sllx	%o4, 30, %o4
40860662d10Schristos	srlx	%o5, 64-30, %g5
40960662d10Schristos	sllx	%o5, 30, %o5
41060662d10Schristos	or	%o4, %g5, %o4
41160662d10Schristos	or	%o5, %g4, %o5
41260662d10Schristos	stx	%o4, [%o2 + 0xa0]	! k[40, 41]
41360662d10Schristos	stx	%o5, [%o2 + 0xa8]	! k[42, 43]
41460662d10Schristos	srlx	%o4, 64-51, %g4
41560662d10Schristos	sllx	%o4, 51, %o4
41660662d10Schristos	srlx	%o5, 64-51, %g5
41760662d10Schristos	sllx	%o5, 51, %o5
41860662d10Schristos	or	%o4, %g5, %o4
41960662d10Schristos	or	%o5, %g4, %o5
42060662d10Schristos	stx	%o4, [%o2 + 0x100]	! k[64, 65]
42160662d10Schristos	stx	%o5, [%o2 + 0x108]	! k[66, 67]
42260662d10Schristos
42360662d10Schristos	.word	0x99b02204 !movdtox	%f4,%o4		! k[ 8,  9]
42460662d10Schristos	.word	0x9bb02206 !movdtox	%f6,%o5		! k[10, 11]
42560662d10Schristos	srlx	%o4, 64-15, %g4
42660662d10Schristos	sllx	%o4, 15, %o4
42760662d10Schristos	srlx	%o5, 64-15, %g5
42860662d10Schristos	sllx	%o5, 15, %o5
42960662d10Schristos	or	%o4, %g5, %o4
43060662d10Schristos	or	%o5, %g4, %o5
43160662d10Schristos	stx	%o4, [%o2 + 0x20]	! k[ 8,  9]
43260662d10Schristos	stx	%o5, [%o2 + 0x28]	! k[10, 11]
43360662d10Schristos	srlx	%o4, 64-15, %g4
43460662d10Schristos	sllx	%o4, 15, %o4
43560662d10Schristos	srlx	%o5, 64-15, %g5
43660662d10Schristos	sllx	%o5, 15, %o5
43760662d10Schristos	or	%o4, %g5, %o4
43860662d10Schristos	or	%o5, %g4, %o5
43960662d10Schristos	stx	%o4, [%o2 + 0x40]	! k[16, 17]
44060662d10Schristos	stx	%o5, [%o2 + 0x48]	! k[18, 19]
44160662d10Schristos	srlx	%o4, 64-30, %g4
44260662d10Schristos	sllx	%o4, 30, %o4
44360662d10Schristos	srlx	%o5, 64-30, %g5
44460662d10Schristos	sllx	%o5, 30, %o5
44560662d10Schristos	or	%o4, %g5, %o4
44660662d10Schristos	or	%o5, %g4, %o5
44760662d10Schristos	stx	%o4, [%o2 + 0x90]	! k[36, 37]
44860662d10Schristos	stx	%o5, [%o2 + 0x98]	! k[38, 39]
44960662d10Schristos	srlx	%o4, 64-34, %g4
45060662d10Schristos	sllx	%o4, 34, %o4
45160662d10Schristos	srlx	%o5, 64-34, %g5
45260662d10Schristos	sllx	%o5, 34, %o5
45360662d10Schristos	or	%o4, %g5, %o4
45460662d10Schristos	or	%o5, %g4, %o5
45560662d10Schristos	stx	%o4, [%o2 + 0xd0]	! k[52, 53]
45660662d10Schristos	stx	%o5, [%o2 + 0xd8]	! k[54, 55]
45760662d10Schristos	ldx	[%o2 + 0x30], %o4	! k[12, 13]
45860662d10Schristos	ldx	[%o2 + 0x38], %o5	! k[14, 15]
45960662d10Schristos	srlx	%o4, 64-15, %g4
46060662d10Schristos	sllx	%o4, 15, %o4
46160662d10Schristos	srlx	%o5, 64-15, %g5
46260662d10Schristos	sllx	%o5, 15, %o5
46360662d10Schristos	or	%o4, %g5, %o4
46460662d10Schristos	or	%o5, %g4, %o5
46560662d10Schristos	stx	%o4, [%o2 + 0x30]	! k[12, 13]
46660662d10Schristos	stx	%o5, [%o2 + 0x38]	! k[14, 15]
46760662d10Schristos	srlx	%o4, 64-30, %g4
46860662d10Schristos	sllx	%o4, 30, %o4
46960662d10Schristos	srlx	%o5, 64-30, %g5
47060662d10Schristos	sllx	%o5, 30, %o5
47160662d10Schristos	or	%o4, %g5, %o4
47260662d10Schristos	or	%o5, %g4, %o5
47360662d10Schristos	stx	%o4, [%o2 + 0x70]	! k[28, 29]
47460662d10Schristos	stx	%o5, [%o2 + 0x78]	! k[30, 31]
47560662d10Schristos	srlx	%o4, 32, %g4
47660662d10Schristos	srlx	%o5, 32, %g5
47760662d10Schristos	st	%o4, [%o2 + 0xc0]	! k[48]
47860662d10Schristos	st	%g5, [%o2 + 0xc4]	! k[49]
47960662d10Schristos	st	%o5, [%o2 + 0xc8]	! k[50]
48060662d10Schristos	st	%g4, [%o2 + 0xcc]	! k[51]
48160662d10Schristos	srlx	%o4, 64-49, %g4
48260662d10Schristos	sllx	%o4, 49, %o4
48360662d10Schristos	srlx	%o5, 64-49, %g5
48460662d10Schristos	sllx	%o5, 49, %o5
48560662d10Schristos	or	%o4, %g5, %o4
48660662d10Schristos	or	%o5, %g4, %o5
48760662d10Schristos	stx	%o4, [%o2 + 0xe0]	! k[56, 57]
48860662d10Schristos	stx	%o5, [%o2 + 0xe8]	! k[58, 59]
48960662d10Schristos
49060662d10Schristos	.word	0x99b0221c !movdtox	%f28,%o4		! k[ 0,  1]
49160662d10Schristos	.word	0x9bb0221e !movdtox	%f30,%o5		! k[ 2,  3]
49260662d10Schristos	srlx	%o4, 64-45, %g4
49360662d10Schristos	sllx	%o4, 45, %o4
49460662d10Schristos	srlx	%o5, 64-45, %g5
49560662d10Schristos	sllx	%o5, 45, %o5
49660662d10Schristos	or	%o4, %g5, %o4
49760662d10Schristos	or	%o5, %g4, %o5
49860662d10Schristos	stx	%o4, [%o2 + 0x60]	! k[24, 25]
49960662d10Schristos	stx	%o5, [%o2 + 0x68]	! k[26, 27]
50060662d10Schristos	srlx	%o4, 64-15, %g4
50160662d10Schristos	sllx	%o4, 15, %o4
50260662d10Schristos	srlx	%o5, 64-15, %g5
50360662d10Schristos	sllx	%o5, 15, %o5
50460662d10Schristos	or	%o4, %g5, %o4
50560662d10Schristos	or	%o5, %g4, %o5
50660662d10Schristos	stx	%o4, [%o2 + 0x80]	! k[32, 33]
50760662d10Schristos	stx	%o5, [%o2 + 0x88]	! k[34, 35]
50860662d10Schristos	srlx	%o4, 64-17, %g4
50960662d10Schristos	sllx	%o4, 17, %o4
51060662d10Schristos	srlx	%o5, 64-17, %g5
51160662d10Schristos	sllx	%o5, 17, %o5
51260662d10Schristos	or	%o4, %g5, %o4
51360662d10Schristos	or	%o5, %g4, %o5
51460662d10Schristos	stx	%o4, [%o2 + 0xb0]	! k[44, 45]
51560662d10Schristos	stx	%o5, [%o2 + 0xb8]	! k[46, 47]
51660662d10Schristos	srlx	%o4, 64-34, %g4
51760662d10Schristos	sllx	%o4, 34, %o4
51860662d10Schristos	srlx	%o5, 64-34, %g5
51960662d10Schristos	sllx	%o5, 34, %o5
52060662d10Schristos	or	%o4, %g5, %o4
52160662d10Schristos	or	%o5, %g4, %o5
52260662d10Schristos	stx	%o4, [%o2 + 0xf0]	! k[60, 61]
52360662d10Schristos	stx	%o5, [%o2 + 0xf8]	! k[62, 63]
52460662d10Schristos
52560662d10Schristos	mov		4, %o3
52660662d10Schristos	st		%o3, [%o2 + 0x110]
52760662d10Schristos	retl
52860662d10Schristos	xor		%o0, %o0, %o0
52960662d10Schristos.type	cmll_t4_set_key,#function
53060662d10Schristos.size	cmll_t4_set_key,.-cmll_t4_set_key
53160662d10Schristos.align	32
53260662d10SchristosSIGMA:
53360662d10Schristos	.long	0xa09e667f, 0x3bcc908b, 0xb67ae858, 0x4caa73b2
53460662d10Schristos	.long	0xc6ef372f, 0xe94f82be, 0x54ff53a5, 0xf1d36f1c
53560662d10Schristos	.long	0x10e527fa, 0xde682d1d, 0xb05688c2, 0xb3e6c1fd
53660662d10Schristos.type	SIGMA,#object
53760662d10Schristos.size	SIGMA,.-SIGMA
53860662d10Schristos.asciz	"Camellia for SPARC T4, David S. Miller, Andy Polyakov"
53960662d10Schristos.align	32
54060662d10Schristos_cmll128_load_enckey:
54160662d10Schristos	ldx		[%i3 + 0], %g4
54260662d10Schristos	ldx		[%i3 + 8], %g5
54360662d10Schristos	ldd		[%i3 + 16], %f16
54460662d10Schristos	ldd		[%i3 + 24], %f18
54560662d10Schristos	ldd		[%i3 + 32], %f20
54660662d10Schristos	ldd		[%i3 + 40], %f22
54760662d10Schristos	ldd		[%i3 + 48], %f24
54860662d10Schristos	ldd		[%i3 + 56], %f26
54960662d10Schristos	ldd		[%i3 + 64], %f28
55060662d10Schristos	ldd		[%i3 + 72], %f30
55160662d10Schristos	ldd		[%i3 + 80], %f32
55260662d10Schristos	ldd		[%i3 + 88], %f34
55360662d10Schristos	ldd		[%i3 + 96], %f36
55460662d10Schristos	ldd		[%i3 + 104], %f38
55560662d10Schristos	ldd		[%i3 + 112], %f40
55660662d10Schristos	ldd		[%i3 + 120], %f42
55760662d10Schristos	ldd		[%i3 + 128], %f44
55860662d10Schristos	ldd		[%i3 + 136], %f46
55960662d10Schristos	ldd		[%i3 + 144], %f48
56060662d10Schristos	ldd		[%i3 + 152], %f50
56160662d10Schristos	ldd		[%i3 + 160], %f52
56260662d10Schristos	ldd		[%i3 + 168], %f54
56360662d10Schristos	ldd		[%i3 + 176], %f56
56460662d10Schristos	ldd		[%i3 + 184], %f58
56560662d10Schristos	ldd		[%i3 + 192], %f60
56660662d10Schristos	ldd		[%i3 + 200], %f62
56760662d10Schristos	retl
56860662d10Schristos	nop
56960662d10Schristos.type	_cmll128_load_enckey,#function
57060662d10Schristos.size	_cmll128_load_enckey,.-_cmll128_load_enckey
57160662d10Schristos_cmll256_load_enckey=_cmll128_load_enckey
57260662d10Schristos
57360662d10Schristos.align	32
57460662d10Schristos_cmll256_load_deckey:
57560662d10Schristos	ldd		[%i3 + 64], %f62
57660662d10Schristos	ldd		[%i3 + 72], %f60
57760662d10Schristos	b		.Load_deckey
57860662d10Schristos	add		%i3, 64, %i3
57960662d10Schristos_cmll128_load_deckey:
58060662d10Schristos	ldd		[%i3 + 0], %f60
58160662d10Schristos	ldd		[%i3 + 8], %f62
58260662d10Schristos.Load_deckey:
58360662d10Schristos	ldd		[%i3 + 16], %f58
58460662d10Schristos	ldd		[%i3 + 24], %f56
58560662d10Schristos	ldd		[%i3 + 32], %f54
58660662d10Schristos	ldd		[%i3 + 40], %f52
58760662d10Schristos	ldd		[%i3 + 48], %f50
58860662d10Schristos	ldd		[%i3 + 56], %f48
58960662d10Schristos	ldd		[%i3 + 64], %f46
59060662d10Schristos	ldd		[%i3 + 72], %f44
59160662d10Schristos	ldd		[%i3 + 80], %f42
59260662d10Schristos	ldd		[%i3 + 88], %f40
59360662d10Schristos	ldd		[%i3 + 96], %f38
59460662d10Schristos	ldd		[%i3 + 104], %f36
59560662d10Schristos	ldd		[%i3 + 112], %f34
59660662d10Schristos	ldd		[%i3 + 120], %f32
59760662d10Schristos	ldd		[%i3 + 128], %f30
59860662d10Schristos	ldd		[%i3 + 136], %f28
59960662d10Schristos	ldd		[%i3 + 144], %f26
60060662d10Schristos	ldd		[%i3 + 152], %f24
60160662d10Schristos	ldd		[%i3 + 160], %f22
60260662d10Schristos	ldd		[%i3 + 168], %f20
60360662d10Schristos	ldd		[%i3 + 176], %f18
60460662d10Schristos	ldd		[%i3 + 184], %f16
60560662d10Schristos	ldx		[%i3 + 192], %g4
60660662d10Schristos	retl
60760662d10Schristos	ldx		[%i3 + 200], %g5
60860662d10Schristos.type	_cmll256_load_deckey,#function
60960662d10Schristos.size	_cmll256_load_deckey,.-_cmll256_load_deckey
61060662d10Schristos
61160662d10Schristos.align	32
61260662d10Schristos_cmll128_encrypt_1x:
61360662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
61460662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
61560662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
61660662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
61760662d10Schristos	.word	0x84ce0182 !camellia_f	%f24,%f2,%f0,%f2
61860662d10Schristos	.word	0x80ce8580 !camellia_f	%f26,%f0,%f2,%f0
61960662d10Schristos	.word	0x81b72780 !camellia_fl	%f28,%f0,%f0
62060662d10Schristos	.word	0x85b7a7a2 !camellia_fli	%f30,%f2,%f2
62160662d10Schristos	.word	0x84c84182 !camellia_f	%f32,%f2,%f0,%f2
62260662d10Schristos	.word	0x80c8c580 !camellia_f	%f34,%f0,%f2,%f0
62360662d10Schristos	.word	0x84c94182 !camellia_f	%f36,%f2,%f0,%f2
62460662d10Schristos	.word	0x80c9c580 !camellia_f	%f38,%f0,%f2,%f0
62560662d10Schristos	.word	0x84ca4182 !camellia_f	%f40,%f2,%f0,%f2
62660662d10Schristos	.word	0x80cac580 !camellia_f	%f42,%f0,%f2,%f0
62760662d10Schristos	.word	0x81b36780 !camellia_fl	%f44,%f0,%f0
62860662d10Schristos	.word	0x85b3e7a2 !camellia_fli	%f46,%f2,%f2
62960662d10Schristos	.word	0x84cc4182 !camellia_f	%f48,%f2,%f0,%f2
63060662d10Schristos	.word	0x80ccc580 !camellia_f	%f50,%f0,%f2,%f0
63160662d10Schristos	.word	0x84cd4182 !camellia_f	%f52,%f2,%f0,%f2
63260662d10Schristos	.word	0x80cdc580 !camellia_f	%f54,%f0,%f2,%f0
63360662d10Schristos	.word	0x88ce4182 !camellia_f	%f56,%f2,%f0,%f4
63460662d10Schristos	.word	0x84cec980 !camellia_f	%f58,%f0,%f4,%f2
63560662d10Schristos	.word	0x81b74d84 !fxor	%f60,%f4,%f0
63660662d10Schristos	retl
63760662d10Schristos	.word	0x85b7cd82 !fxor	%f62,%f2,%f2
63860662d10Schristos.type	_cmll128_encrypt_1x,#function
63960662d10Schristos.size	_cmll128_encrypt_1x,.-_cmll128_encrypt_1x
64060662d10Schristos_cmll128_decrypt_1x=_cmll128_encrypt_1x
64160662d10Schristos
64260662d10Schristos.align	32
64360662d10Schristos_cmll128_encrypt_2x:
64460662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
64560662d10Schristos	.word	0x8ccc0986 !camellia_f	%f16,%f6,%f4,%f6
64660662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
64760662d10Schristos	.word	0x88cc8d84 !camellia_f	%f18,%f4,%f6,%f4
64860662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
64960662d10Schristos	.word	0x8ccd0986 !camellia_f	%f20,%f6,%f4,%f6
65060662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
65160662d10Schristos	.word	0x88cd8d84 !camellia_f	%f22,%f4,%f6,%f4
65260662d10Schristos	.word	0x84ce0182 !camellia_f	%f24,%f2,%f0,%f2
65360662d10Schristos	.word	0x8cce0986 !camellia_f	%f24,%f6,%f4,%f6
65460662d10Schristos	.word	0x80ce8580 !camellia_f	%f26,%f0,%f2,%f0
65560662d10Schristos	.word	0x88ce8d84 !camellia_f	%f26,%f4,%f6,%f4
65660662d10Schristos	.word	0x81b72780 !camellia_fl	%f28,%f0,%f0
65760662d10Schristos	.word	0x89b72784 !camellia_fl	%f28,%f4,%f4
65860662d10Schristos	.word	0x85b7a7a2 !camellia_fli	%f30,%f2,%f2
65960662d10Schristos	.word	0x8db7a7a6 !camellia_fli	%f30,%f6,%f6
66060662d10Schristos	.word	0x84c84182 !camellia_f	%f32,%f2,%f0,%f2
66160662d10Schristos	.word	0x8cc84986 !camellia_f	%f32,%f6,%f4,%f6
66260662d10Schristos	.word	0x80c8c580 !camellia_f	%f34,%f0,%f2,%f0
66360662d10Schristos	.word	0x88c8cd84 !camellia_f	%f34,%f4,%f6,%f4
66460662d10Schristos	.word	0x84c94182 !camellia_f	%f36,%f2,%f0,%f2
66560662d10Schristos	.word	0x8cc94986 !camellia_f	%f36,%f6,%f4,%f6
66660662d10Schristos	.word	0x80c9c580 !camellia_f	%f38,%f0,%f2,%f0
66760662d10Schristos	.word	0x88c9cd84 !camellia_f	%f38,%f4,%f6,%f4
66860662d10Schristos	.word	0x84ca4182 !camellia_f	%f40,%f2,%f0,%f2
66960662d10Schristos	.word	0x8cca4986 !camellia_f	%f40,%f6,%f4,%f6
67060662d10Schristos	.word	0x80cac580 !camellia_f	%f42,%f0,%f2,%f0
67160662d10Schristos	.word	0x88cacd84 !camellia_f	%f42,%f4,%f6,%f4
67260662d10Schristos	.word	0x81b36780 !camellia_fl	%f44,%f0,%f0
67360662d10Schristos	.word	0x89b36784 !camellia_fl	%f44,%f4,%f4
67460662d10Schristos	.word	0x85b3e7a2 !camellia_fli	%f46,%f2,%f2
67560662d10Schristos	.word	0x8db3e7a6 !camellia_fli	%f46,%f6,%f6
67660662d10Schristos	.word	0x84cc4182 !camellia_f	%f48,%f2,%f0,%f2
67760662d10Schristos	.word	0x8ccc4986 !camellia_f	%f48,%f6,%f4,%f6
67860662d10Schristos	.word	0x80ccc580 !camellia_f	%f50,%f0,%f2,%f0
67960662d10Schristos	.word	0x88cccd84 !camellia_f	%f50,%f4,%f6,%f4
68060662d10Schristos	.word	0x84cd4182 !camellia_f	%f52,%f2,%f0,%f2
68160662d10Schristos	.word	0x8ccd4986 !camellia_f	%f52,%f6,%f4,%f6
68260662d10Schristos	.word	0x80cdc580 !camellia_f	%f54,%f0,%f2,%f0
68360662d10Schristos	.word	0x88cdcd84 !camellia_f	%f54,%f4,%f6,%f4
68460662d10Schristos	.word	0x90ce4182 !camellia_f	%f56,%f2,%f0,%f8
68560662d10Schristos	.word	0x94ce4986 !camellia_f	%f56,%f6,%f4,%f10
68660662d10Schristos	.word	0x84ced180 !camellia_f	%f58,%f0,%f8,%f2
68760662d10Schristos	.word	0x8cced584 !camellia_f	%f58,%f4,%f10,%f6
68860662d10Schristos	.word	0x81b74d88 !fxor	%f60,%f8,%f0
68960662d10Schristos	.word	0x89b74d8a !fxor	%f60,%f10,%f4
69060662d10Schristos	.word	0x85b7cd82 !fxor	%f62,%f2,%f2
69160662d10Schristos	retl
69260662d10Schristos	.word	0x8db7cd86 !fxor	%f62,%f6,%f6
69360662d10Schristos.type	_cmll128_encrypt_2x,#function
69460662d10Schristos.size	_cmll128_encrypt_2x,.-_cmll128_encrypt_2x
69560662d10Schristos_cmll128_decrypt_2x=_cmll128_encrypt_2x
69660662d10Schristos
69760662d10Schristos.align	32
69860662d10Schristos_cmll256_encrypt_1x:
69960662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
70060662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
70160662d10Schristos	ldd		[%i3 + 208], %f16
70260662d10Schristos	ldd		[%i3 + 216], %f18
70360662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
70460662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
70560662d10Schristos	ldd		[%i3 + 224], %f20
70660662d10Schristos	ldd		[%i3 + 232], %f22
70760662d10Schristos	.word	0x84ce0182 !camellia_f	%f24,%f2,%f0,%f2
70860662d10Schristos	.word	0x80ce8580 !camellia_f	%f26,%f0,%f2,%f0
70960662d10Schristos	ldd		[%i3 + 240], %f24
71060662d10Schristos	ldd		[%i3 + 248], %f26
71160662d10Schristos	.word	0x81b72780 !camellia_fl	%f28,%f0,%f0
71260662d10Schristos	.word	0x85b7a7a2 !camellia_fli	%f30,%f2,%f2
71360662d10Schristos	ldd		[%i3 + 256], %f28
71460662d10Schristos	ldd		[%i3 + 264], %f30
71560662d10Schristos	.word	0x84c84182 !camellia_f	%f32,%f2,%f0,%f2
71660662d10Schristos	.word	0x80c8c580 !camellia_f	%f34,%f0,%f2,%f0
71760662d10Schristos	.word	0x84c94182 !camellia_f	%f36,%f2,%f0,%f2
71860662d10Schristos	.word	0x80c9c580 !camellia_f	%f38,%f0,%f2,%f0
71960662d10Schristos	.word	0x84ca4182 !camellia_f	%f40,%f2,%f0,%f2
72060662d10Schristos	.word	0x80cac580 !camellia_f	%f42,%f0,%f2,%f0
72160662d10Schristos	.word	0x81b36780 !camellia_fl	%f44,%f0,%f0
72260662d10Schristos	.word	0x85b3e7a2 !camellia_fli	%f46,%f2,%f2
72360662d10Schristos	.word	0x84cc4182 !camellia_f	%f48,%f2,%f0,%f2
72460662d10Schristos	.word	0x80ccc580 !camellia_f	%f50,%f0,%f2,%f0
72560662d10Schristos	.word	0x84cd4182 !camellia_f	%f52,%f2,%f0,%f2
72660662d10Schristos	.word	0x80cdc580 !camellia_f	%f54,%f0,%f2,%f0
72760662d10Schristos	.word	0x84ce4182 !camellia_f	%f56,%f2,%f0,%f2
72860662d10Schristos	.word	0x80cec580 !camellia_f	%f58,%f0,%f2,%f0
72960662d10Schristos	.word	0x81b76780 !camellia_fl	%f60,%f0,%f0
73060662d10Schristos	.word	0x85b7e7a2 !camellia_fli	%f62,%f2,%f2
73160662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
73260662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
73360662d10Schristos	ldd		[%i3 + 16], %f16
73460662d10Schristos	ldd		[%i3 + 24], %f18
73560662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
73660662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
73760662d10Schristos	ldd		[%i3 + 32], %f20
73860662d10Schristos	ldd		[%i3 + 40], %f22
73960662d10Schristos	.word	0x88ce0182 !camellia_f	%f24,%f2,%f0,%f4
74060662d10Schristos	.word	0x84ce8980 !camellia_f	%f26,%f0,%f4,%f2
74160662d10Schristos	ldd		[%i3 + 48], %f24
74260662d10Schristos	ldd		[%i3 + 56], %f26
74360662d10Schristos	.word	0x81b70d84 !fxor	%f28,%f4,%f0
74460662d10Schristos	.word	0x85b78d82 !fxor	%f30,%f2,%f2
74560662d10Schristos	ldd		[%i3 + 64], %f28
74660662d10Schristos	retl
74760662d10Schristos	ldd		[%i3 + 72], %f30
74860662d10Schristos.type	_cmll256_encrypt_1x,#function
74960662d10Schristos.size	_cmll256_encrypt_1x,.-_cmll256_encrypt_1x
75060662d10Schristos
75160662d10Schristos.align	32
75260662d10Schristos_cmll256_encrypt_2x:
75360662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
75460662d10Schristos	.word	0x8ccc0986 !camellia_f	%f16,%f6,%f4,%f6
75560662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
75660662d10Schristos	.word	0x88cc8d84 !camellia_f	%f18,%f4,%f6,%f4
75760662d10Schristos	ldd		[%i3 + 208], %f16
75860662d10Schristos	ldd		[%i3 + 216], %f18
75960662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
76060662d10Schristos	.word	0x8ccd0986 !camellia_f	%f20,%f6,%f4,%f6
76160662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
76260662d10Schristos	.word	0x88cd8d84 !camellia_f	%f22,%f4,%f6,%f4
76360662d10Schristos	ldd		[%i3 + 224], %f20
76460662d10Schristos	ldd		[%i3 + 232], %f22
76560662d10Schristos	.word	0x84ce0182 !camellia_f	%f24,%f2,%f0,%f2
76660662d10Schristos	.word	0x8cce0986 !camellia_f	%f24,%f6,%f4,%f6
76760662d10Schristos	.word	0x80ce8580 !camellia_f	%f26,%f0,%f2,%f0
76860662d10Schristos	.word	0x88ce8d84 !camellia_f	%f26,%f4,%f6,%f4
76960662d10Schristos	ldd		[%i3 + 240], %f24
77060662d10Schristos	ldd		[%i3 + 248], %f26
77160662d10Schristos	.word	0x81b72780 !camellia_fl	%f28,%f0,%f0
77260662d10Schristos	.word	0x89b72784 !camellia_fl	%f28,%f4,%f4
77360662d10Schristos	.word	0x85b7a7a2 !camellia_fli	%f30,%f2,%f2
77460662d10Schristos	.word	0x8db7a7a6 !camellia_fli	%f30,%f6,%f6
77560662d10Schristos	ldd		[%i3 + 256], %f28
77660662d10Schristos	ldd		[%i3 + 264], %f30
77760662d10Schristos	.word	0x84c84182 !camellia_f	%f32,%f2,%f0,%f2
77860662d10Schristos	.word	0x8cc84986 !camellia_f	%f32,%f6,%f4,%f6
77960662d10Schristos	.word	0x80c8c580 !camellia_f	%f34,%f0,%f2,%f0
78060662d10Schristos	.word	0x88c8cd84 !camellia_f	%f34,%f4,%f6,%f4
78160662d10Schristos	.word	0x84c94182 !camellia_f	%f36,%f2,%f0,%f2
78260662d10Schristos	.word	0x8cc94986 !camellia_f	%f36,%f6,%f4,%f6
78360662d10Schristos	.word	0x80c9c580 !camellia_f	%f38,%f0,%f2,%f0
78460662d10Schristos	.word	0x88c9cd84 !camellia_f	%f38,%f4,%f6,%f4
78560662d10Schristos	.word	0x84ca4182 !camellia_f	%f40,%f2,%f0,%f2
78660662d10Schristos	.word	0x8cca4986 !camellia_f	%f40,%f6,%f4,%f6
78760662d10Schristos	.word	0x80cac580 !camellia_f	%f42,%f0,%f2,%f0
78860662d10Schristos	.word	0x88cacd84 !camellia_f	%f42,%f4,%f6,%f4
78960662d10Schristos	.word	0x81b36780 !camellia_fl	%f44,%f0,%f0
79060662d10Schristos	.word	0x89b36784 !camellia_fl	%f44,%f4,%f4
79160662d10Schristos	.word	0x85b3e7a2 !camellia_fli	%f46,%f2,%f2
79260662d10Schristos	.word	0x8db3e7a6 !camellia_fli	%f46,%f6,%f6
79360662d10Schristos	.word	0x84cc4182 !camellia_f	%f48,%f2,%f0,%f2
79460662d10Schristos	.word	0x8ccc4986 !camellia_f	%f48,%f6,%f4,%f6
79560662d10Schristos	.word	0x80ccc580 !camellia_f	%f50,%f0,%f2,%f0
79660662d10Schristos	.word	0x88cccd84 !camellia_f	%f50,%f4,%f6,%f4
79760662d10Schristos	.word	0x84cd4182 !camellia_f	%f52,%f2,%f0,%f2
79860662d10Schristos	.word	0x8ccd4986 !camellia_f	%f52,%f6,%f4,%f6
79960662d10Schristos	.word	0x80cdc580 !camellia_f	%f54,%f0,%f2,%f0
80060662d10Schristos	.word	0x88cdcd84 !camellia_f	%f54,%f4,%f6,%f4
80160662d10Schristos	.word	0x84ce4182 !camellia_f	%f56,%f2,%f0,%f2
80260662d10Schristos	.word	0x8cce4986 !camellia_f	%f56,%f6,%f4,%f6
80360662d10Schristos	.word	0x80cec580 !camellia_f	%f58,%f0,%f2,%f0
80460662d10Schristos	.word	0x88cecd84 !camellia_f	%f58,%f4,%f6,%f4
80560662d10Schristos	.word	0x81b76780 !camellia_fl	%f60,%f0,%f0
80660662d10Schristos	.word	0x89b76784 !camellia_fl	%f60,%f4,%f4
80760662d10Schristos	.word	0x85b7e7a2 !camellia_fli	%f62,%f2,%f2
80860662d10Schristos	.word	0x8db7e7a6 !camellia_fli	%f62,%f6,%f6
80960662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
81060662d10Schristos	.word	0x8ccc0986 !camellia_f	%f16,%f6,%f4,%f6
81160662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
81260662d10Schristos	.word	0x88cc8d84 !camellia_f	%f18,%f4,%f6,%f4
81360662d10Schristos	ldd		[%i3 + 16], %f16
81460662d10Schristos	ldd		[%i3 + 24], %f18
81560662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
81660662d10Schristos	.word	0x8ccd0986 !camellia_f	%f20,%f6,%f4,%f6
81760662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
81860662d10Schristos	.word	0x88cd8d84 !camellia_f	%f22,%f4,%f6,%f4
81960662d10Schristos	ldd		[%i3 + 32], %f20
82060662d10Schristos	ldd		[%i3 + 40], %f22
82160662d10Schristos	.word	0x90ce0182 !camellia_f	%f24,%f2,%f0,%f8
82260662d10Schristos	.word	0x94ce0986 !camellia_f	%f24,%f6,%f4,%f10
82360662d10Schristos	.word	0x84ce9180 !camellia_f	%f26,%f0,%f8,%f2
82460662d10Schristos	.word	0x8cce9584 !camellia_f	%f26,%f4,%f10,%f6
82560662d10Schristos	ldd		[%i3 + 48], %f24
82660662d10Schristos	ldd		[%i3 + 56], %f26
82760662d10Schristos	.word	0x81b70d88 !fxor	%f28,%f8,%f0
82860662d10Schristos	.word	0x89b70d8a !fxor	%f28,%f10,%f4
82960662d10Schristos	.word	0x85b78d82 !fxor	%f30,%f2,%f2
83060662d10Schristos	.word	0x8db78d86 !fxor	%f30,%f6,%f6
83160662d10Schristos	ldd		[%i3 + 64], %f28
83260662d10Schristos	retl
83360662d10Schristos	ldd		[%i3 + 72], %f30
83460662d10Schristos.type	_cmll256_encrypt_2x,#function
83560662d10Schristos.size	_cmll256_encrypt_2x,.-_cmll256_encrypt_2x
83660662d10Schristos
83760662d10Schristos.align	32
83860662d10Schristos_cmll256_decrypt_1x:
83960662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
84060662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
84160662d10Schristos	ldd		[%i3 - 8], %f16
84260662d10Schristos	ldd		[%i3 - 16], %f18
84360662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
84460662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
84560662d10Schristos	ldd		[%i3 - 24], %f20
84660662d10Schristos	ldd		[%i3 - 32], %f22
84760662d10Schristos	.word	0x84ce0182 !camellia_f	%f24,%f2,%f0,%f2
84860662d10Schristos	.word	0x80ce8580 !camellia_f	%f26,%f0,%f2,%f0
84960662d10Schristos	ldd		[%i3 - 40], %f24
85060662d10Schristos	ldd		[%i3 - 48], %f26
85160662d10Schristos	.word	0x81b72780 !camellia_fl	%f28,%f0,%f0
85260662d10Schristos	.word	0x85b7a7a2 !camellia_fli	%f30,%f2,%f2
85360662d10Schristos	ldd		[%i3 - 56], %f28
85460662d10Schristos	ldd		[%i3 - 64], %f30
85560662d10Schristos	.word	0x84c84182 !camellia_f	%f32,%f2,%f0,%f2
85660662d10Schristos	.word	0x80c8c580 !camellia_f	%f34,%f0,%f2,%f0
85760662d10Schristos	.word	0x84c94182 !camellia_f	%f36,%f2,%f0,%f2
85860662d10Schristos	.word	0x80c9c580 !camellia_f	%f38,%f0,%f2,%f0
85960662d10Schristos	.word	0x84ca4182 !camellia_f	%f40,%f2,%f0,%f2
86060662d10Schristos	.word	0x80cac580 !camellia_f	%f42,%f0,%f2,%f0
86160662d10Schristos	.word	0x81b36780 !camellia_fl	%f44,%f0,%f0
86260662d10Schristos	.word	0x85b3e7a2 !camellia_fli	%f46,%f2,%f2
86360662d10Schristos	.word	0x84cc4182 !camellia_f	%f48,%f2,%f0,%f2
86460662d10Schristos	.word	0x80ccc580 !camellia_f	%f50,%f0,%f2,%f0
86560662d10Schristos	.word	0x84cd4182 !camellia_f	%f52,%f2,%f0,%f2
86660662d10Schristos	.word	0x80cdc580 !camellia_f	%f54,%f0,%f2,%f0
86760662d10Schristos	.word	0x84ce4182 !camellia_f	%f56,%f2,%f0,%f2
86860662d10Schristos	.word	0x80cec580 !camellia_f	%f58,%f0,%f2,%f0
86960662d10Schristos	.word	0x81b76780 !camellia_fl	%f60,%f0,%f0
87060662d10Schristos	.word	0x85b7e7a2 !camellia_fli	%f62,%f2,%f2
87160662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
87260662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
87360662d10Schristos	ldd		[%i3 + 184], %f16
87460662d10Schristos	ldd		[%i3 + 176], %f18
87560662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
87660662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
87760662d10Schristos	ldd		[%i3 + 168], %f20
87860662d10Schristos	ldd		[%i3 + 160], %f22
87960662d10Schristos	.word	0x88ce0182 !camellia_f	%f24,%f2,%f0,%f4
88060662d10Schristos	.word	0x84ce8980 !camellia_f	%f26,%f0,%f4,%f2
88160662d10Schristos	ldd		[%i3 + 152], %f24
88260662d10Schristos	ldd		[%i3 + 144], %f26
88360662d10Schristos	.word	0x81b78d84 !fxor	%f30,%f4,%f0
88460662d10Schristos	.word	0x85b70d82 !fxor	%f28,%f2,%f2
88560662d10Schristos	ldd		[%i3 + 136], %f28
88660662d10Schristos	retl
88760662d10Schristos	ldd		[%i3 + 128], %f30
88860662d10Schristos.type	_cmll256_decrypt_1x,#function
88960662d10Schristos.size	_cmll256_decrypt_1x,.-_cmll256_decrypt_1x
89060662d10Schristos
89160662d10Schristos.align	32
89260662d10Schristos_cmll256_decrypt_2x:
89360662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
89460662d10Schristos	.word	0x8ccc0986 !camellia_f	%f16,%f6,%f4,%f6
89560662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
89660662d10Schristos	.word	0x88cc8d84 !camellia_f	%f18,%f4,%f6,%f4
89760662d10Schristos	ldd		[%i3 - 8], %f16
89860662d10Schristos	ldd		[%i3 - 16], %f18
89960662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
90060662d10Schristos	.word	0x8ccd0986 !camellia_f	%f20,%f6,%f4,%f6
90160662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
90260662d10Schristos	.word	0x88cd8d84 !camellia_f	%f22,%f4,%f6,%f4
90360662d10Schristos	ldd		[%i3 - 24], %f20
90460662d10Schristos	ldd		[%i3 - 32], %f22
90560662d10Schristos	.word	0x84ce0182 !camellia_f	%f24,%f2,%f0,%f2
90660662d10Schristos	.word	0x8cce0986 !camellia_f	%f24,%f6,%f4,%f6
90760662d10Schristos	.word	0x80ce8580 !camellia_f	%f26,%f0,%f2,%f0
90860662d10Schristos	.word	0x88ce8d84 !camellia_f	%f26,%f4,%f6,%f4
90960662d10Schristos	ldd		[%i3 - 40], %f24
91060662d10Schristos	ldd		[%i3 - 48], %f26
91160662d10Schristos	.word	0x81b72780 !camellia_fl	%f28,%f0,%f0
91260662d10Schristos	.word	0x89b72784 !camellia_fl	%f28,%f4,%f4
91360662d10Schristos	.word	0x85b7a7a2 !camellia_fli	%f30,%f2,%f2
91460662d10Schristos	.word	0x8db7a7a6 !camellia_fli	%f30,%f6,%f6
91560662d10Schristos	ldd		[%i3 - 56], %f28
91660662d10Schristos	ldd		[%i3 - 64], %f30
91760662d10Schristos	.word	0x84c84182 !camellia_f	%f32,%f2,%f0,%f2
91860662d10Schristos	.word	0x8cc84986 !camellia_f	%f32,%f6,%f4,%f6
91960662d10Schristos	.word	0x80c8c580 !camellia_f	%f34,%f0,%f2,%f0
92060662d10Schristos	.word	0x88c8cd84 !camellia_f	%f34,%f4,%f6,%f4
92160662d10Schristos	.word	0x84c94182 !camellia_f	%f36,%f2,%f0,%f2
92260662d10Schristos	.word	0x8cc94986 !camellia_f	%f36,%f6,%f4,%f6
92360662d10Schristos	.word	0x80c9c580 !camellia_f	%f38,%f0,%f2,%f0
92460662d10Schristos	.word	0x88c9cd84 !camellia_f	%f38,%f4,%f6,%f4
92560662d10Schristos	.word	0x84ca4182 !camellia_f	%f40,%f2,%f0,%f2
92660662d10Schristos	.word	0x8cca4986 !camellia_f	%f40,%f6,%f4,%f6
92760662d10Schristos	.word	0x80cac580 !camellia_f	%f42,%f0,%f2,%f0
92860662d10Schristos	.word	0x88cacd84 !camellia_f	%f42,%f4,%f6,%f4
92960662d10Schristos	.word	0x81b36780 !camellia_fl	%f44,%f0,%f0
93060662d10Schristos	.word	0x89b36784 !camellia_fl	%f44,%f4,%f4
93160662d10Schristos	.word	0x85b3e7a2 !camellia_fli	%f46,%f2,%f2
93260662d10Schristos	.word	0x8db3e7a6 !camellia_fli	%f46,%f6,%f6
93360662d10Schristos	.word	0x84cc4182 !camellia_f	%f48,%f2,%f0,%f2
93460662d10Schristos	.word	0x8ccc4986 !camellia_f	%f48,%f6,%f4,%f6
93560662d10Schristos	.word	0x80ccc580 !camellia_f	%f50,%f0,%f2,%f0
93660662d10Schristos	.word	0x88cccd84 !camellia_f	%f50,%f4,%f6,%f4
93760662d10Schristos	.word	0x84cd4182 !camellia_f	%f52,%f2,%f0,%f2
93860662d10Schristos	.word	0x8ccd4986 !camellia_f	%f52,%f6,%f4,%f6
93960662d10Schristos	.word	0x80cdc580 !camellia_f	%f54,%f0,%f2,%f0
94060662d10Schristos	.word	0x88cdcd84 !camellia_f	%f54,%f4,%f6,%f4
94160662d10Schristos	.word	0x84ce4182 !camellia_f	%f56,%f2,%f0,%f2
94260662d10Schristos	.word	0x8cce4986 !camellia_f	%f56,%f6,%f4,%f6
94360662d10Schristos	.word	0x80cec580 !camellia_f	%f58,%f0,%f2,%f0
94460662d10Schristos	.word	0x88cecd84 !camellia_f	%f58,%f4,%f6,%f4
94560662d10Schristos	.word	0x81b76780 !camellia_fl	%f60,%f0,%f0
94660662d10Schristos	.word	0x89b76784 !camellia_fl	%f60,%f4,%f4
94760662d10Schristos	.word	0x85b7e7a2 !camellia_fli	%f62,%f2,%f2
94860662d10Schristos	.word	0x8db7e7a6 !camellia_fli	%f62,%f6,%f6
94960662d10Schristos	.word	0x84cc0182 !camellia_f	%f16,%f2,%f0,%f2
95060662d10Schristos	.word	0x8ccc0986 !camellia_f	%f16,%f6,%f4,%f6
95160662d10Schristos	.word	0x80cc8580 !camellia_f	%f18,%f0,%f2,%f0
95260662d10Schristos	.word	0x88cc8d84 !camellia_f	%f18,%f4,%f6,%f4
95360662d10Schristos	ldd		[%i3 + 184], %f16
95460662d10Schristos	ldd		[%i3 + 176], %f18
95560662d10Schristos	.word	0x84cd0182 !camellia_f	%f20,%f2,%f0,%f2
95660662d10Schristos	.word	0x8ccd0986 !camellia_f	%f20,%f6,%f4,%f6
95760662d10Schristos	.word	0x80cd8580 !camellia_f	%f22,%f0,%f2,%f0
95860662d10Schristos	.word	0x88cd8d84 !camellia_f	%f22,%f4,%f6,%f4
95960662d10Schristos	ldd		[%i3 + 168], %f20
96060662d10Schristos	ldd		[%i3 + 160], %f22
96160662d10Schristos	.word	0x90ce0182 !camellia_f	%f24,%f2,%f0,%f8
96260662d10Schristos	.word	0x94ce0986 !camellia_f	%f24,%f6,%f4,%f10
96360662d10Schristos	.word	0x84ce9180 !camellia_f	%f26,%f0,%f8,%f2
96460662d10Schristos	.word	0x8cce9584 !camellia_f	%f26,%f4,%f10,%f6
96560662d10Schristos	ldd		[%i3 + 152], %f24
96660662d10Schristos	ldd		[%i3 + 144], %f26
96760662d10Schristos	.word	0x81b78d88 !fxor	%f30,%f8,%f0
96860662d10Schristos	.word	0x89b78d8a !fxor	%f30,%f10,%f4
96960662d10Schristos	.word	0x85b70d82 !fxor	%f28,%f2,%f2
97060662d10Schristos	.word	0x8db70d86 !fxor	%f28,%f6,%f6
97160662d10Schristos	ldd		[%i3 + 136], %f28
97260662d10Schristos	retl
97360662d10Schristos	ldd		[%i3 + 128], %f30
97460662d10Schristos.type	_cmll256_decrypt_2x,#function
97560662d10Schristos.size	_cmll256_decrypt_2x,.-_cmll256_decrypt_2x
97660662d10Schristos.globl	cmll128_t4_cbc_encrypt
97760662d10Schristos.align	32
97860662d10Schristoscmll128_t4_cbc_encrypt:
979*1dcdf01fSchristos	save		%sp, -STACK_FRAME, %sp
98060662d10Schristos	cmp		%i2, 0
981*1dcdf01fSchristos	be,pn		SIZE_T_CC, .L128_cbc_enc_abort
98260662d10Schristos	srln		%i2, 0, %i2		! needed on v8+, "nop" on v9
98360662d10Schristos	sub		%i0, %i1, %l5	! %i0!=%i1
98460662d10Schristos	ld		[%i4 + 0], %f0
98560662d10Schristos	ld		[%i4 + 4], %f1
98660662d10Schristos	ld		[%i4 + 8], %f2
98760662d10Schristos	ld		[%i4 + 12], %f3
98860662d10Schristos	prefetch	[%i0], 20
98960662d10Schristos	prefetch	[%i0 + 63], 20
99060662d10Schristos	call		_cmll128_load_enckey
99160662d10Schristos	and		%i0, 7, %l0
99260662d10Schristos	andn		%i0, 7, %i0
99360662d10Schristos	sll		%l0, 3, %l0
99460662d10Schristos	mov		64, %l1
99560662d10Schristos	mov		0xff, %l3
99660662d10Schristos	sub		%l1, %l0, %l1
99760662d10Schristos	and		%i1, 7, %l2
99860662d10Schristos	cmp		%i2, 127
99960662d10Schristos	movrnz		%l2, 0, %l5		! if (	%i1&7 ||
1000*1dcdf01fSchristos	movleu		SIZE_T_CC, 0, %l5	!	%i2<128 ||
100160662d10Schristos	brnz,pn		%l5, .L128cbc_enc_blk	!	%i0==%i1)
100260662d10Schristos	srl		%l3, %l2, %l3
100360662d10Schristos
100460662d10Schristos	.word	0xb3b64340 !alignaddrl	%i1,%g0,%i1
100560662d10Schristos	srlx		%i2, 4, %i2
100660662d10Schristos	prefetch	[%i1], 22
100760662d10Schristos
100860662d10Schristos.L128_cbc_enc_loop:
100960662d10Schristos	ldx		[%i0 + 0], %o0
101060662d10Schristos	brz,pt		%l0, 4f
101160662d10Schristos	ldx		[%i0 + 8], %o1
101260662d10Schristos
101360662d10Schristos	ldx		[%i0 + 16], %o2
101460662d10Schristos	sllx		%o0, %l0, %o0
101560662d10Schristos	srlx		%o1, %l1, %g1
101660662d10Schristos	sllx		%o1, %l0, %o1
101760662d10Schristos	or		%g1, %o0, %o0
101860662d10Schristos	srlx		%o2, %l1, %o2
101960662d10Schristos	or		%o2, %o1, %o1
102060662d10Schristos4:
102160662d10Schristos	xor		%g4, %o0, %o0		! ^= rk[0]
102260662d10Schristos	xor		%g5, %o1, %o1
102360662d10Schristos	.word	0x99b02308 !movxtod	%o0,%f12
102460662d10Schristos	.word	0x9db02309 !movxtod	%o1,%f14
102560662d10Schristos
102660662d10Schristos	.word	0x81b30d80 !fxor	%f12,%f0,%f0		! ^= ivec
102760662d10Schristos	.word	0x85b38d82 !fxor	%f14,%f2,%f2
102860662d10Schristos	prefetch	[%i1 + 63], 22
102960662d10Schristos	prefetch	[%i0 + 16+63], 20
103060662d10Schristos	call		_cmll128_encrypt_1x
103160662d10Schristos	add		%i0, 16, %i0
103260662d10Schristos
103360662d10Schristos	brnz,pn		%l2, 2f
103460662d10Schristos	sub		%i2, 1, %i2
103560662d10Schristos
103660662d10Schristos	std		%f0, [%i1 + 0]
103760662d10Schristos	std		%f2, [%i1 + 8]
103860662d10Schristos	brnz,pt		%i2, .L128_cbc_enc_loop
103960662d10Schristos	add		%i1, 16, %i1
104060662d10Schristos	st		%f0, [%i4 + 0]
104160662d10Schristos	st		%f1, [%i4 + 4]
104260662d10Schristos	st		%f2, [%i4 + 8]
104360662d10Schristos	st		%f3, [%i4 + 12]
104460662d10Schristos.L128_cbc_enc_abort:
104560662d10Schristos	ret
104660662d10Schristos	restore
104760662d10Schristos
104860662d10Schristos.align	16
104960662d10Schristos2:	ldxa		[%i0]0x82, %o0		! avoid read-after-write hazard
105060662d10Schristos						! and ~3x deterioration
105160662d10Schristos						! in inp==out case
105260662d10Schristos	.word	0x89b00900 !faligndata	%f0,%f0,%f4		! handle unaligned output
105360662d10Schristos	.word	0x8db00902 !faligndata	%f0,%f2,%f6
105460662d10Schristos	.word	0x91b08902 !faligndata	%f2,%f2,%f8
105560662d10Schristos
105660662d10Schristos	stda		%f4, [%i1 + %l3]0xc0	! partial store
105760662d10Schristos	std		%f6, [%i1 + 8]
105860662d10Schristos	add		%i1, 16, %i1
105960662d10Schristos	orn		%g0, %l3, %l3
106060662d10Schristos	stda		%f8, [%i1 + %l3]0xc0	! partial store
106160662d10Schristos
106260662d10Schristos	brnz,pt		%i2, .L128_cbc_enc_loop+4
106360662d10Schristos	orn		%g0, %l3, %l3
106460662d10Schristos	st		%f0, [%i4 + 0]
106560662d10Schristos	st		%f1, [%i4 + 4]
106660662d10Schristos	st		%f2, [%i4 + 8]
106760662d10Schristos	st		%f3, [%i4 + 12]
106860662d10Schristos	ret
106960662d10Schristos	restore
107060662d10Schristos
107160662d10Schristos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
107260662d10Schristos.align	32
107360662d10Schristos.L128cbc_enc_blk:
107460662d10Schristos	add	%i1, %i2, %l5
107560662d10Schristos	and	%l5, 63, %l5	! tail
107660662d10Schristos	sub	%i2, %l5, %i2
107760662d10Schristos	add	%l5, 15, %l5	! round up to 16n
107860662d10Schristos	srlx	%i2, 4, %i2
107960662d10Schristos	srl	%l5, 4, %l5
108060662d10Schristos
108160662d10Schristos.L128_cbc_enc_blk_loop:
108260662d10Schristos	ldx		[%i0 + 0], %o0
108360662d10Schristos	brz,pt		%l0, 5f
108460662d10Schristos	ldx		[%i0 + 8], %o1
108560662d10Schristos
108660662d10Schristos	ldx		[%i0 + 16], %o2
108760662d10Schristos	sllx		%o0, %l0, %o0
108860662d10Schristos	srlx		%o1, %l1, %g1
108960662d10Schristos	sllx		%o1, %l0, %o1
109060662d10Schristos	or		%g1, %o0, %o0
109160662d10Schristos	srlx		%o2, %l1, %o2
109260662d10Schristos	or		%o2, %o1, %o1
109360662d10Schristos5:
109460662d10Schristos	xor		%g4, %o0, %o0		! ^= rk[0]
109560662d10Schristos	xor		%g5, %o1, %o1
109660662d10Schristos	.word	0x99b02308 !movxtod	%o0,%f12
109760662d10Schristos	.word	0x9db02309 !movxtod	%o1,%f14
109860662d10Schristos
109960662d10Schristos	.word	0x81b30d80 !fxor	%f12,%f0,%f0		! ^= ivec
110060662d10Schristos	.word	0x85b38d82 !fxor	%f14,%f2,%f2
110160662d10Schristos	prefetch	[%i0 + 16+63], 20
110260662d10Schristos	call		_cmll128_encrypt_1x
110360662d10Schristos	add		%i0, 16, %i0
110460662d10Schristos	sub		%i2, 1, %i2
110560662d10Schristos
110660662d10Schristos	stda		%f0, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
110760662d10Schristos	add		%i1, 8, %i1
110860662d10Schristos	stda		%f2, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
110960662d10Schristos	brnz,pt		%i2, .L128_cbc_enc_blk_loop
111060662d10Schristos	add		%i1, 8, %i1
111160662d10Schristos
111260662d10Schristos	membar		#StoreLoad|#StoreStore
111360662d10Schristos	brnz,pt		%l5, .L128_cbc_enc_loop
111460662d10Schristos	mov		%l5, %i2
111560662d10Schristos	st		%f0, [%i4 + 0]
111660662d10Schristos	st		%f1, [%i4 + 4]
111760662d10Schristos	st		%f2, [%i4 + 8]
111860662d10Schristos	st		%f3, [%i4 + 12]
111960662d10Schristos	ret
112060662d10Schristos	restore
112160662d10Schristos.type	cmll128_t4_cbc_encrypt,#function
112260662d10Schristos.size	cmll128_t4_cbc_encrypt,.-cmll128_t4_cbc_encrypt
112360662d10Schristos.globl	cmll256_t4_cbc_encrypt
112460662d10Schristos.align	32
112560662d10Schristoscmll256_t4_cbc_encrypt:
1126*1dcdf01fSchristos	save		%sp, -STACK_FRAME, %sp
112760662d10Schristos	cmp		%i2, 0
1128*1dcdf01fSchristos	be,pn		SIZE_T_CC, .L256_cbc_enc_abort
112960662d10Schristos	srln		%i2, 0, %i2		! needed on v8+, "nop" on v9
113060662d10Schristos	sub		%i0, %i1, %l5	! %i0!=%i1
113160662d10Schristos	ld		[%i4 + 0], %f0
113260662d10Schristos	ld		[%i4 + 4], %f1
113360662d10Schristos	ld		[%i4 + 8], %f2
113460662d10Schristos	ld		[%i4 + 12], %f3
113560662d10Schristos	prefetch	[%i0], 20
113660662d10Schristos	prefetch	[%i0 + 63], 20
113760662d10Schristos	call		_cmll256_load_enckey
113860662d10Schristos	and		%i0, 7, %l0
113960662d10Schristos	andn		%i0, 7, %i0
114060662d10Schristos	sll		%l0, 3, %l0
114160662d10Schristos	mov		64, %l1
114260662d10Schristos	mov		0xff, %l3
114360662d10Schristos	sub		%l1, %l0, %l1
114460662d10Schristos	and		%i1, 7, %l2
114560662d10Schristos	cmp		%i2, 127
114660662d10Schristos	movrnz		%l2, 0, %l5		! if (	%i1&7 ||
1147*1dcdf01fSchristos	movleu		SIZE_T_CC, 0, %l5	!	%i2<128 ||
114860662d10Schristos	brnz,pn		%l5, .L256cbc_enc_blk	!	%i0==%i1)
114960662d10Schristos	srl		%l3, %l2, %l3
115060662d10Schristos
115160662d10Schristos	.word	0xb3b64340 !alignaddrl	%i1,%g0,%i1
115260662d10Schristos	srlx		%i2, 4, %i2
115360662d10Schristos	prefetch	[%i1], 22
115460662d10Schristos
115560662d10Schristos.L256_cbc_enc_loop:
115660662d10Schristos	ldx		[%i0 + 0], %o0
115760662d10Schristos	brz,pt		%l0, 4f
115860662d10Schristos	ldx		[%i0 + 8], %o1
115960662d10Schristos
116060662d10Schristos	ldx		[%i0 + 16], %o2
116160662d10Schristos	sllx		%o0, %l0, %o0
116260662d10Schristos	srlx		%o1, %l1, %g1
116360662d10Schristos	sllx		%o1, %l0, %o1
116460662d10Schristos	or		%g1, %o0, %o0
116560662d10Schristos	srlx		%o2, %l1, %o2
116660662d10Schristos	or		%o2, %o1, %o1
116760662d10Schristos4:
116860662d10Schristos	xor		%g4, %o0, %o0		! ^= rk[0]
116960662d10Schristos	xor		%g5, %o1, %o1
117060662d10Schristos	.word	0x99b02308 !movxtod	%o0,%f12
117160662d10Schristos	.word	0x9db02309 !movxtod	%o1,%f14
117260662d10Schristos
117360662d10Schristos	.word	0x81b30d80 !fxor	%f12,%f0,%f0		! ^= ivec
117460662d10Schristos	.word	0x85b38d82 !fxor	%f14,%f2,%f2
117560662d10Schristos	prefetch	[%i1 + 63], 22
117660662d10Schristos	prefetch	[%i0 + 16+63], 20
117760662d10Schristos	call		_cmll256_encrypt_1x
117860662d10Schristos	add		%i0, 16, %i0
117960662d10Schristos
118060662d10Schristos	brnz,pn		%l2, 2f
118160662d10Schristos	sub		%i2, 1, %i2
118260662d10Schristos
118360662d10Schristos	std		%f0, [%i1 + 0]
118460662d10Schristos	std		%f2, [%i1 + 8]
118560662d10Schristos	brnz,pt		%i2, .L256_cbc_enc_loop
118660662d10Schristos	add		%i1, 16, %i1
118760662d10Schristos	st		%f0, [%i4 + 0]
118860662d10Schristos	st		%f1, [%i4 + 4]
118960662d10Schristos	st		%f2, [%i4 + 8]
119060662d10Schristos	st		%f3, [%i4 + 12]
119160662d10Schristos.L256_cbc_enc_abort:
119260662d10Schristos	ret
119360662d10Schristos	restore
119460662d10Schristos
119560662d10Schristos.align	16
119660662d10Schristos2:	ldxa		[%i0]0x82, %o0		! avoid read-after-write hazard
119760662d10Schristos						! and ~3x deterioration
119860662d10Schristos						! in inp==out case
119960662d10Schristos	.word	0x89b00900 !faligndata	%f0,%f0,%f4		! handle unaligned output
120060662d10Schristos	.word	0x8db00902 !faligndata	%f0,%f2,%f6
120160662d10Schristos	.word	0x91b08902 !faligndata	%f2,%f2,%f8
120260662d10Schristos
120360662d10Schristos	stda		%f4, [%i1 + %l3]0xc0	! partial store
120460662d10Schristos	std		%f6, [%i1 + 8]
120560662d10Schristos	add		%i1, 16, %i1
120660662d10Schristos	orn		%g0, %l3, %l3
120760662d10Schristos	stda		%f8, [%i1 + %l3]0xc0	! partial store
120860662d10Schristos
120960662d10Schristos	brnz,pt		%i2, .L256_cbc_enc_loop+4
121060662d10Schristos	orn		%g0, %l3, %l3
121160662d10Schristos	st		%f0, [%i4 + 0]
121260662d10Schristos	st		%f1, [%i4 + 4]
121360662d10Schristos	st		%f2, [%i4 + 8]
121460662d10Schristos	st		%f3, [%i4 + 12]
121560662d10Schristos	ret
121660662d10Schristos	restore
121760662d10Schristos
121860662d10Schristos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
121960662d10Schristos.align	32
122060662d10Schristos.L256cbc_enc_blk:
122160662d10Schristos	add	%i1, %i2, %l5
122260662d10Schristos	and	%l5, 63, %l5	! tail
122360662d10Schristos	sub	%i2, %l5, %i2
122460662d10Schristos	add	%l5, 15, %l5	! round up to 16n
122560662d10Schristos	srlx	%i2, 4, %i2
122660662d10Schristos	srl	%l5, 4, %l5
122760662d10Schristos
122860662d10Schristos.L256_cbc_enc_blk_loop:
122960662d10Schristos	ldx		[%i0 + 0], %o0
123060662d10Schristos	brz,pt		%l0, 5f
123160662d10Schristos	ldx		[%i0 + 8], %o1
123260662d10Schristos
123360662d10Schristos	ldx		[%i0 + 16], %o2
123460662d10Schristos	sllx		%o0, %l0, %o0
123560662d10Schristos	srlx		%o1, %l1, %g1
123660662d10Schristos	sllx		%o1, %l0, %o1
123760662d10Schristos	or		%g1, %o0, %o0
123860662d10Schristos	srlx		%o2, %l1, %o2
123960662d10Schristos	or		%o2, %o1, %o1
124060662d10Schristos5:
124160662d10Schristos	xor		%g4, %o0, %o0		! ^= rk[0]
124260662d10Schristos	xor		%g5, %o1, %o1
124360662d10Schristos	.word	0x99b02308 !movxtod	%o0,%f12
124460662d10Schristos	.word	0x9db02309 !movxtod	%o1,%f14
124560662d10Schristos
124660662d10Schristos	.word	0x81b30d80 !fxor	%f12,%f0,%f0		! ^= ivec
124760662d10Schristos	.word	0x85b38d82 !fxor	%f14,%f2,%f2
124860662d10Schristos	prefetch	[%i0 + 16+63], 20
124960662d10Schristos	call		_cmll256_encrypt_1x
125060662d10Schristos	add		%i0, 16, %i0
125160662d10Schristos	sub		%i2, 1, %i2
125260662d10Schristos
125360662d10Schristos	stda		%f0, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
125460662d10Schristos	add		%i1, 8, %i1
125560662d10Schristos	stda		%f2, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
125660662d10Schristos	brnz,pt		%i2, .L256_cbc_enc_blk_loop
125760662d10Schristos	add		%i1, 8, %i1
125860662d10Schristos
125960662d10Schristos	membar		#StoreLoad|#StoreStore
126060662d10Schristos	brnz,pt		%l5, .L256_cbc_enc_loop
126160662d10Schristos	mov		%l5, %i2
126260662d10Schristos	st		%f0, [%i4 + 0]
126360662d10Schristos	st		%f1, [%i4 + 4]
126460662d10Schristos	st		%f2, [%i4 + 8]
126560662d10Schristos	st		%f3, [%i4 + 12]
126660662d10Schristos	ret
126760662d10Schristos	restore
126860662d10Schristos.type	cmll256_t4_cbc_encrypt,#function
126960662d10Schristos.size	cmll256_t4_cbc_encrypt,.-cmll256_t4_cbc_encrypt
127060662d10Schristos.globl	cmll128_t4_cbc_decrypt
127160662d10Schristos.align	32
127260662d10Schristoscmll128_t4_cbc_decrypt:
1273*1dcdf01fSchristos	save		%sp, -STACK_FRAME, %sp
127460662d10Schristos	cmp		%i2, 0
1275*1dcdf01fSchristos	be,pn		SIZE_T_CC, .L128_cbc_dec_abort
127660662d10Schristos	srln		%i2, 0, %i2		! needed on v8+, "nop" on v9
127760662d10Schristos	sub		%i0, %i1, %l5	! %i0!=%i1
127860662d10Schristos	ld		[%i4 + 0], %f12	! load ivec
127960662d10Schristos	ld		[%i4 + 4], %f13
128060662d10Schristos	ld		[%i4 + 8], %f14
128160662d10Schristos	ld		[%i4 + 12], %f15
128260662d10Schristos	prefetch	[%i0], 20
128360662d10Schristos	prefetch	[%i0 + 63], 20
128460662d10Schristos	call		_cmll128_load_deckey
128560662d10Schristos	and		%i0, 7, %l0
128660662d10Schristos	andn		%i0, 7, %i0
128760662d10Schristos	sll		%l0, 3, %l0
128860662d10Schristos	mov		64, %l1
128960662d10Schristos	mov		0xff, %l3
129060662d10Schristos	sub		%l1, %l0, %l1
129160662d10Schristos	and		%i1, 7, %l2
129260662d10Schristos	cmp		%i2, 255
129360662d10Schristos	movrnz		%l2, 0, %l5		! if (	%i1&7 ||
1294*1dcdf01fSchristos	movleu		SIZE_T_CC, 0, %l5	!	%i2<256 ||
129560662d10Schristos	brnz,pn		%l5, .L128cbc_dec_blk	!	%i0==%i1)
129660662d10Schristos	srl		%l3, %l2, %l3
129760662d10Schristos
129860662d10Schristos	andcc		%i2, 16, %g0		! is number of blocks even?
129960662d10Schristos	srlx		%i2, 4, %i2
130060662d10Schristos	.word	0xb3b64340 !alignaddrl	%i1,%g0,%i1
130160662d10Schristos	bz		%icc, .L128_cbc_dec_loop2x
130260662d10Schristos	prefetch	[%i1], 22
130360662d10Schristos.L128_cbc_dec_loop:
130460662d10Schristos	ldx		[%i0 + 0], %o0
130560662d10Schristos	brz,pt		%l0, 4f
130660662d10Schristos	ldx		[%i0 + 8], %o1
130760662d10Schristos
130860662d10Schristos	ldx		[%i0 + 16], %o2
130960662d10Schristos	sllx		%o0, %l0, %o0
131060662d10Schristos	srlx		%o1, %l1, %g1
131160662d10Schristos	sllx		%o1, %l0, %o1
131260662d10Schristos	or		%g1, %o0, %o0
131360662d10Schristos	srlx		%o2, %l1, %o2
131460662d10Schristos	or		%o2, %o1, %o1
131560662d10Schristos4:
131660662d10Schristos	xor		%g4, %o0, %o2		! ^= rk[0]
131760662d10Schristos	xor		%g5, %o1, %o3
131860662d10Schristos	.word	0x81b0230a !movxtod	%o2,%f0
131960662d10Schristos	.word	0x85b0230b !movxtod	%o3,%f2
132060662d10Schristos
132160662d10Schristos	prefetch	[%i1 + 63], 22
132260662d10Schristos	prefetch	[%i0 + 16+63], 20
132360662d10Schristos	call		_cmll128_decrypt_1x
132460662d10Schristos	add		%i0, 16, %i0
132560662d10Schristos
132660662d10Schristos	.word	0x81b30d80 !fxor	%f12,%f0,%f0		! ^= ivec
132760662d10Schristos	.word	0x85b38d82 !fxor	%f14,%f2,%f2
132860662d10Schristos	.word	0x99b02308 !movxtod	%o0,%f12
132960662d10Schristos	.word	0x9db02309 !movxtod	%o1,%f14
133060662d10Schristos
133160662d10Schristos	brnz,pn		%l2, 2f
133260662d10Schristos	sub		%i2, 1, %i2
133360662d10Schristos
133460662d10Schristos	std		%f0, [%i1 + 0]
133560662d10Schristos	std		%f2, [%i1 + 8]
133660662d10Schristos	brnz,pt		%i2, .L128_cbc_dec_loop2x
133760662d10Schristos	add		%i1, 16, %i1
133860662d10Schristos	st		%f12, [%i4 + 0]
133960662d10Schristos	st		%f13, [%i4 + 4]
134060662d10Schristos	st		%f14, [%i4 + 8]
134160662d10Schristos	st		%f15, [%i4 + 12]
134260662d10Schristos.L128_cbc_dec_abort:
134360662d10Schristos	ret
134460662d10Schristos	restore
134560662d10Schristos
134660662d10Schristos.align	16
134760662d10Schristos2:	ldxa		[%i0]0x82, %o0		! avoid read-after-write hazard
134860662d10Schristos						! and ~3x deterioration
134960662d10Schristos						! in inp==out case
135060662d10Schristos	.word	0x89b00900 !faligndata	%f0,%f0,%f4		! handle unaligned output
135160662d10Schristos	.word	0x8db00902 !faligndata	%f0,%f2,%f6
135260662d10Schristos	.word	0x91b08902 !faligndata	%f2,%f2,%f8
135360662d10Schristos
135460662d10Schristos	stda		%f4, [%i1 + %l3]0xc0	! partial store
135560662d10Schristos	std		%f6, [%i1 + 8]
135660662d10Schristos	add		%i1, 16, %i1
135760662d10Schristos	orn		%g0, %l3, %l3
135860662d10Schristos	stda		%f8, [%i1 + %l3]0xc0	! partial store
135960662d10Schristos
136060662d10Schristos	brnz,pt		%i2, .L128_cbc_dec_loop2x+4
136160662d10Schristos	orn		%g0, %l3, %l3
136260662d10Schristos	st		%f12, [%i4 + 0]
136360662d10Schristos	st		%f13, [%i4 + 4]
136460662d10Schristos	st		%f14, [%i4 + 8]
136560662d10Schristos	st		%f15, [%i4 + 12]
136660662d10Schristos	ret
136760662d10Schristos	restore
136860662d10Schristos
136960662d10Schristos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
137060662d10Schristos.align	32
137160662d10Schristos.L128_cbc_dec_loop2x:
137260662d10Schristos	ldx		[%i0 + 0], %o0
137360662d10Schristos	ldx		[%i0 + 8], %o1
137460662d10Schristos	ldx		[%i0 + 16], %o2
137560662d10Schristos	brz,pt		%l0, 4f
137660662d10Schristos	ldx		[%i0 + 24], %o3
137760662d10Schristos
137860662d10Schristos	ldx		[%i0 + 32], %o4
137960662d10Schristos	sllx		%o0, %l0, %o0
138060662d10Schristos	srlx		%o1, %l1, %g1
138160662d10Schristos	or		%g1, %o0, %o0
138260662d10Schristos	sllx		%o1, %l0, %o1
138360662d10Schristos	srlx		%o2, %l1, %g1
138460662d10Schristos	or		%g1, %o1, %o1
138560662d10Schristos	sllx		%o2, %l0, %o2
138660662d10Schristos	srlx		%o3, %l1, %g1
138760662d10Schristos	or		%g1, %o2, %o2
138860662d10Schristos	sllx		%o3, %l0, %o3
138960662d10Schristos	srlx		%o4, %l1, %o4
139060662d10Schristos	or		%o4, %o3, %o3
139160662d10Schristos4:
139260662d10Schristos	xor		%g4, %o0, %o4		! ^= rk[0]
139360662d10Schristos	xor		%g5, %o1, %o5
139460662d10Schristos	.word	0x81b0230c !movxtod	%o4,%f0
139560662d10Schristos	.word	0x85b0230d !movxtod	%o5,%f2
139660662d10Schristos	xor		%g4, %o2, %o4
139760662d10Schristos	xor		%g5, %o3, %o5
139860662d10Schristos	.word	0x89b0230c !movxtod	%o4,%f4
139960662d10Schristos	.word	0x8db0230d !movxtod	%o5,%f6
140060662d10Schristos
140160662d10Schristos	prefetch	[%i1 + 63], 22
140260662d10Schristos	prefetch	[%i0 + 32+63], 20
140360662d10Schristos	call		_cmll128_decrypt_2x
140460662d10Schristos	add		%i0, 32, %i0
140560662d10Schristos
140660662d10Schristos	.word	0x91b02308 !movxtod	%o0,%f8
140760662d10Schristos	.word	0x95b02309 !movxtod	%o1,%f10
140860662d10Schristos	.word	0x81b30d80 !fxor	%f12,%f0,%f0		! ^= ivec
140960662d10Schristos	.word	0x85b38d82 !fxor	%f14,%f2,%f2
141060662d10Schristos	.word	0x99b0230a !movxtod	%o2,%f12
141160662d10Schristos	.word	0x9db0230b !movxtod	%o3,%f14
141260662d10Schristos	.word	0x89b20d84 !fxor	%f8,%f4,%f4
141360662d10Schristos	.word	0x8db28d86 !fxor	%f10,%f6,%f6
141460662d10Schristos
141560662d10Schristos	brnz,pn		%l2, 2f
141660662d10Schristos	sub		%i2, 2, %i2
141760662d10Schristos
141860662d10Schristos	std		%f0, [%i1 + 0]
141960662d10Schristos	std		%f2, [%i1 + 8]
142060662d10Schristos	std		%f4, [%i1 + 16]
142160662d10Schristos	std		%f6, [%i1 + 24]
142260662d10Schristos	brnz,pt		%i2, .L128_cbc_dec_loop2x
142360662d10Schristos	add		%i1, 32, %i1
142460662d10Schristos	st		%f12, [%i4 + 0]
142560662d10Schristos	st		%f13, [%i4 + 4]
142660662d10Schristos	st		%f14, [%i4 + 8]
142760662d10Schristos	st		%f15, [%i4 + 12]
142860662d10Schristos	ret
142960662d10Schristos	restore
143060662d10Schristos
143160662d10Schristos.align	16
143260662d10Schristos2:	ldxa		[%i0]0x82, %o0		! avoid read-after-write hazard
143360662d10Schristos						! and ~3x deterioration
143460662d10Schristos						! in inp==out case
143560662d10Schristos	.word	0x91b00900 !faligndata	%f0,%f0,%f8		! handle unaligned output
143660662d10Schristos	.word	0x81b00902 !faligndata	%f0,%f2,%f0
143760662d10Schristos	.word	0x85b08904 !faligndata	%f2,%f4,%f2
143860662d10Schristos	.word	0x89b10906 !faligndata	%f4,%f6,%f4
143960662d10Schristos	.word	0x8db18906 !faligndata	%f6,%f6,%f6
144060662d10Schristos	stda		%f8, [%i1 + %l3]0xc0	! partial store
144160662d10Schristos	std		%f0, [%i1 + 8]
144260662d10Schristos	std		%f2, [%i1 + 16]
144360662d10Schristos	std		%f4, [%i1 + 24]
144460662d10Schristos	add		%i1, 32, %i1
144560662d10Schristos	orn		%g0, %l3, %l3
144660662d10Schristos	stda		%f6, [%i1 + %l3]0xc0	! partial store
144760662d10Schristos
144860662d10Schristos	brnz,pt		%i2, .L128_cbc_dec_loop2x+4
144960662d10Schristos	orn		%g0, %l3, %l3
145060662d10Schristos	st		%f12, [%i4 + 0]
145160662d10Schristos	st		%f13, [%i4 + 4]
145260662d10Schristos	st		%f14, [%i4 + 8]
145360662d10Schristos	st		%f15, [%i4 + 12]
145460662d10Schristos	ret
145560662d10Schristos	restore
145660662d10Schristos
145760662d10Schristos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
145860662d10Schristos.align	32
145960662d10Schristos.L128cbc_dec_blk:
146060662d10Schristos	add	%i1, %i2, %l5
146160662d10Schristos	and	%l5, 63, %l5	! tail
146260662d10Schristos	sub	%i2, %l5, %i2
146360662d10Schristos	add	%l5, 15, %l5	! round up to 16n
146460662d10Schristos	srlx	%i2, 4, %i2
146560662d10Schristos	srl	%l5, 4, %l5
146660662d10Schristos	sub	%i2, 1, %i2
146760662d10Schristos	add	%l5, 1, %l5
146860662d10Schristos
146960662d10Schristos.L128_cbc_dec_blk_loop2x:
147060662d10Schristos	ldx		[%i0 + 0], %o0
147160662d10Schristos	ldx		[%i0 + 8], %o1
147260662d10Schristos	ldx		[%i0 + 16], %o2
147360662d10Schristos	brz,pt		%l0, 5f
147460662d10Schristos	ldx		[%i0 + 24], %o3
147560662d10Schristos
147660662d10Schristos	ldx		[%i0 + 32], %o4
147760662d10Schristos	sllx		%o0, %l0, %o0
147860662d10Schristos	srlx		%o1, %l1, %g1
147960662d10Schristos	or		%g1, %o0, %o0
148060662d10Schristos	sllx		%o1, %l0, %o1
148160662d10Schristos	srlx		%o2, %l1, %g1
148260662d10Schristos	or		%g1, %o1, %o1
148360662d10Schristos	sllx		%o2, %l0, %o2
148460662d10Schristos	srlx		%o3, %l1, %g1
148560662d10Schristos	or		%g1, %o2, %o2
148660662d10Schristos	sllx		%o3, %l0, %o3
148760662d10Schristos	srlx		%o4, %l1, %o4
148860662d10Schristos	or		%o4, %o3, %o3
148960662d10Schristos5:
149060662d10Schristos	xor		%g4, %o0, %o4		! ^= rk[0]
149160662d10Schristos	xor		%g5, %o1, %o5
149260662d10Schristos	.word	0x81b0230c !movxtod	%o4,%f0
149360662d10Schristos	.word	0x85b0230d !movxtod	%o5,%f2
149460662d10Schristos	xor		%g4, %o2, %o4
149560662d10Schristos	xor		%g5, %o3, %o5
149660662d10Schristos	.word	0x89b0230c !movxtod	%o4,%f4
149760662d10Schristos	.word	0x8db0230d !movxtod	%o5,%f6
149860662d10Schristos
149960662d10Schristos	prefetch	[%i0 + 32+63], 20
150060662d10Schristos	call		_cmll128_decrypt_2x
150160662d10Schristos	add		%i0, 32, %i0
150260662d10Schristos	subcc		%i2, 2, %i2
150360662d10Schristos
150460662d10Schristos	.word	0x91b02308 !movxtod	%o0,%f8
150560662d10Schristos	.word	0x95b02309 !movxtod	%o1,%f10
150660662d10Schristos	.word	0x81b30d80 !fxor	%f12,%f0,%f0		! ^= ivec
150760662d10Schristos	.word	0x85b38d82 !fxor	%f14,%f2,%f2
150860662d10Schristos	.word	0x99b0230a !movxtod	%o2,%f12
150960662d10Schristos	.word	0x9db0230b !movxtod	%o3,%f14
151060662d10Schristos	.word	0x89b20d84 !fxor	%f8,%f4,%f4
151160662d10Schristos	.word	0x8db28d86 !fxor	%f10,%f6,%f6
151260662d10Schristos
151360662d10Schristos	stda		%f0, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
151460662d10Schristos	add		%i1, 8, %i1
151560662d10Schristos	stda		%f2, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
151660662d10Schristos	add		%i1, 8, %i1
151760662d10Schristos	stda		%f4, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
151860662d10Schristos	add		%i1, 8, %i1
151960662d10Schristos	stda		%f6, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
1520*1dcdf01fSchristos	bgu,pt		SIZE_T_CC, .L128_cbc_dec_blk_loop2x
152160662d10Schristos	add		%i1, 8, %i1
152260662d10Schristos
152360662d10Schristos	add		%l5, %i2, %i2
152460662d10Schristos	andcc		%i2, 1, %g0		! is number of blocks even?
152560662d10Schristos	membar		#StoreLoad|#StoreStore
152660662d10Schristos	bnz,pt		%icc, .L128_cbc_dec_loop
152760662d10Schristos	srl		%i2, 0, %i2
152860662d10Schristos	brnz,pn		%i2, .L128_cbc_dec_loop2x
152960662d10Schristos	nop
153060662d10Schristos	st		%f12, [%i4 + 0]	! write out ivec
153160662d10Schristos	st		%f13, [%i4 + 4]
153260662d10Schristos	st		%f14, [%i4 + 8]
153360662d10Schristos	st		%f15, [%i4 + 12]
153460662d10Schristos	ret
153560662d10Schristos	restore
153660662d10Schristos.type	cmll128_t4_cbc_decrypt,#function
153760662d10Schristos.size	cmll128_t4_cbc_decrypt,.-cmll128_t4_cbc_decrypt
153860662d10Schristos.globl	cmll256_t4_cbc_decrypt
153960662d10Schristos.align	32
154060662d10Schristoscmll256_t4_cbc_decrypt:
1541*1dcdf01fSchristos	save		%sp, -STACK_FRAME, %sp
154260662d10Schristos	cmp		%i2, 0
1543*1dcdf01fSchristos	be,pn		SIZE_T_CC, .L256_cbc_dec_abort
154460662d10Schristos	srln		%i2, 0, %i2		! needed on v8+, "nop" on v9
154560662d10Schristos	sub		%i0, %i1, %l5	! %i0!=%i1
154660662d10Schristos	ld		[%i4 + 0], %f12	! load ivec
154760662d10Schristos	ld		[%i4 + 4], %f13
154860662d10Schristos	ld		[%i4 + 8], %f14
154960662d10Schristos	ld		[%i4 + 12], %f15
155060662d10Schristos	prefetch	[%i0], 20
155160662d10Schristos	prefetch	[%i0 + 63], 20
155260662d10Schristos	call		_cmll256_load_deckey
155360662d10Schristos	and		%i0, 7, %l0
155460662d10Schristos	andn		%i0, 7, %i0
155560662d10Schristos	sll		%l0, 3, %l0
155660662d10Schristos	mov		64, %l1
155760662d10Schristos	mov		0xff, %l3
155860662d10Schristos	sub		%l1, %l0, %l1
155960662d10Schristos	and		%i1, 7, %l2
156060662d10Schristos	cmp		%i2, 255
156160662d10Schristos	movrnz		%l2, 0, %l5		! if (	%i1&7 ||
1562*1dcdf01fSchristos	movleu		SIZE_T_CC, 0, %l5	!	%i2<256 ||
156360662d10Schristos	brnz,pn		%l5, .L256cbc_dec_blk	!	%i0==%i1)
156460662d10Schristos	srl		%l3, %l2, %l3
156560662d10Schristos
156660662d10Schristos	andcc		%i2, 16, %g0		! is number of blocks even?
156760662d10Schristos	srlx		%i2, 4, %i2
156860662d10Schristos	.word	0xb3b64340 !alignaddrl	%i1,%g0,%i1
156960662d10Schristos	bz		%icc, .L256_cbc_dec_loop2x
157060662d10Schristos	prefetch	[%i1], 22
157160662d10Schristos.L256_cbc_dec_loop:
157260662d10Schristos	ldx		[%i0 + 0], %o0
157360662d10Schristos	brz,pt		%l0, 4f
157460662d10Schristos	ldx		[%i0 + 8], %o1
157560662d10Schristos
157660662d10Schristos	ldx		[%i0 + 16], %o2
157760662d10Schristos	sllx		%o0, %l0, %o0
157860662d10Schristos	srlx		%o1, %l1, %g1
157960662d10Schristos	sllx		%o1, %l0, %o1
158060662d10Schristos	or		%g1, %o0, %o0
158160662d10Schristos	srlx		%o2, %l1, %o2
158260662d10Schristos	or		%o2, %o1, %o1
158360662d10Schristos4:
158460662d10Schristos	xor		%g4, %o0, %o2		! ^= rk[0]
158560662d10Schristos	xor		%g5, %o1, %o3
158660662d10Schristos	.word	0x81b0230a !movxtod	%o2,%f0
158760662d10Schristos	.word	0x85b0230b !movxtod	%o3,%f2
158860662d10Schristos
158960662d10Schristos	prefetch	[%i1 + 63], 22
159060662d10Schristos	prefetch	[%i0 + 16+63], 20
159160662d10Schristos	call		_cmll256_decrypt_1x
159260662d10Schristos	add		%i0, 16, %i0
159360662d10Schristos
159460662d10Schristos	.word	0x81b30d80 !fxor	%f12,%f0,%f0		! ^= ivec
159560662d10Schristos	.word	0x85b38d82 !fxor	%f14,%f2,%f2
159660662d10Schristos	.word	0x99b02308 !movxtod	%o0,%f12
159760662d10Schristos	.word	0x9db02309 !movxtod	%o1,%f14
159860662d10Schristos
159960662d10Schristos	brnz,pn		%l2, 2f
160060662d10Schristos	sub		%i2, 1, %i2
160160662d10Schristos
160260662d10Schristos	std		%f0, [%i1 + 0]
160360662d10Schristos	std		%f2, [%i1 + 8]
160460662d10Schristos	brnz,pt		%i2, .L256_cbc_dec_loop2x
160560662d10Schristos	add		%i1, 16, %i1
160660662d10Schristos	st		%f12, [%i4 + 0]
160760662d10Schristos	st		%f13, [%i4 + 4]
160860662d10Schristos	st		%f14, [%i4 + 8]
160960662d10Schristos	st		%f15, [%i4 + 12]
161060662d10Schristos.L256_cbc_dec_abort:
161160662d10Schristos	ret
161260662d10Schristos	restore
161360662d10Schristos
161460662d10Schristos.align	16
161560662d10Schristos2:	ldxa		[%i0]0x82, %o0		! avoid read-after-write hazard
161660662d10Schristos						! and ~3x deterioration
161760662d10Schristos						! in inp==out case
161860662d10Schristos	.word	0x89b00900 !faligndata	%f0,%f0,%f4		! handle unaligned output
161960662d10Schristos	.word	0x8db00902 !faligndata	%f0,%f2,%f6
162060662d10Schristos	.word	0x91b08902 !faligndata	%f2,%f2,%f8
162160662d10Schristos
162260662d10Schristos	stda		%f4, [%i1 + %l3]0xc0	! partial store
162360662d10Schristos	std		%f6, [%i1 + 8]
162460662d10Schristos	add		%i1, 16, %i1
162560662d10Schristos	orn		%g0, %l3, %l3
162660662d10Schristos	stda		%f8, [%i1 + %l3]0xc0	! partial store
162760662d10Schristos
162860662d10Schristos	brnz,pt		%i2, .L256_cbc_dec_loop2x+4
162960662d10Schristos	orn		%g0, %l3, %l3
163060662d10Schristos	st		%f12, [%i4 + 0]
163160662d10Schristos	st		%f13, [%i4 + 4]
163260662d10Schristos	st		%f14, [%i4 + 8]
163360662d10Schristos	st		%f15, [%i4 + 12]
163460662d10Schristos	ret
163560662d10Schristos	restore
163660662d10Schristos
163760662d10Schristos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
163860662d10Schristos.align	32
163960662d10Schristos.L256_cbc_dec_loop2x:
164060662d10Schristos	ldx		[%i0 + 0], %o0
164160662d10Schristos	ldx		[%i0 + 8], %o1
164260662d10Schristos	ldx		[%i0 + 16], %o2
164360662d10Schristos	brz,pt		%l0, 4f
164460662d10Schristos	ldx		[%i0 + 24], %o3
164560662d10Schristos
164660662d10Schristos	ldx		[%i0 + 32], %o4
164760662d10Schristos	sllx		%o0, %l0, %o0
164860662d10Schristos	srlx		%o1, %l1, %g1
164960662d10Schristos	or		%g1, %o0, %o0
165060662d10Schristos	sllx		%o1, %l0, %o1
165160662d10Schristos	srlx		%o2, %l1, %g1
165260662d10Schristos	or		%g1, %o1, %o1
165360662d10Schristos	sllx		%o2, %l0, %o2
165460662d10Schristos	srlx		%o3, %l1, %g1
165560662d10Schristos	or		%g1, %o2, %o2
165660662d10Schristos	sllx		%o3, %l0, %o3
165760662d10Schristos	srlx		%o4, %l1, %o4
165860662d10Schristos	or		%o4, %o3, %o3
165960662d10Schristos4:
166060662d10Schristos	xor		%g4, %o0, %o4		! ^= rk[0]
166160662d10Schristos	xor		%g5, %o1, %o5
166260662d10Schristos	.word	0x81b0230c !movxtod	%o4,%f0
166360662d10Schristos	.word	0x85b0230d !movxtod	%o5,%f2
166460662d10Schristos	xor		%g4, %o2, %o4
166560662d10Schristos	xor		%g5, %o3, %o5
166660662d10Schristos	.word	0x89b0230c !movxtod	%o4,%f4
166760662d10Schristos	.word	0x8db0230d !movxtod	%o5,%f6
166860662d10Schristos
166960662d10Schristos	prefetch	[%i1 + 63], 22
167060662d10Schristos	prefetch	[%i0 + 32+63], 20
167160662d10Schristos	call		_cmll256_decrypt_2x
167260662d10Schristos	add		%i0, 32, %i0
167360662d10Schristos
167460662d10Schristos	.word	0x91b02308 !movxtod	%o0,%f8
167560662d10Schristos	.word	0x95b02309 !movxtod	%o1,%f10
167660662d10Schristos	.word	0x81b30d80 !fxor	%f12,%f0,%f0		! ^= ivec
167760662d10Schristos	.word	0x85b38d82 !fxor	%f14,%f2,%f2
167860662d10Schristos	.word	0x99b0230a !movxtod	%o2,%f12
167960662d10Schristos	.word	0x9db0230b !movxtod	%o3,%f14
168060662d10Schristos	.word	0x89b20d84 !fxor	%f8,%f4,%f4
168160662d10Schristos	.word	0x8db28d86 !fxor	%f10,%f6,%f6
168260662d10Schristos
168360662d10Schristos	brnz,pn		%l2, 2f
168460662d10Schristos	sub		%i2, 2, %i2
168560662d10Schristos
168660662d10Schristos	std		%f0, [%i1 + 0]
168760662d10Schristos	std		%f2, [%i1 + 8]
168860662d10Schristos	std		%f4, [%i1 + 16]
168960662d10Schristos	std		%f6, [%i1 + 24]
169060662d10Schristos	brnz,pt		%i2, .L256_cbc_dec_loop2x
169160662d10Schristos	add		%i1, 32, %i1
169260662d10Schristos	st		%f12, [%i4 + 0]
169360662d10Schristos	st		%f13, [%i4 + 4]
169460662d10Schristos	st		%f14, [%i4 + 8]
169560662d10Schristos	st		%f15, [%i4 + 12]
169660662d10Schristos	ret
169760662d10Schristos	restore
169860662d10Schristos
169960662d10Schristos.align	16
170060662d10Schristos2:	ldxa		[%i0]0x82, %o0		! avoid read-after-write hazard
170160662d10Schristos						! and ~3x deterioration
170260662d10Schristos						! in inp==out case
170360662d10Schristos	.word	0x91b00900 !faligndata	%f0,%f0,%f8		! handle unaligned output
170460662d10Schristos	.word	0x81b00902 !faligndata	%f0,%f2,%f0
170560662d10Schristos	.word	0x85b08904 !faligndata	%f2,%f4,%f2
170660662d10Schristos	.word	0x89b10906 !faligndata	%f4,%f6,%f4
170760662d10Schristos	.word	0x8db18906 !faligndata	%f6,%f6,%f6
170860662d10Schristos	stda		%f8, [%i1 + %l3]0xc0	! partial store
170960662d10Schristos	std		%f0, [%i1 + 8]
171060662d10Schristos	std		%f2, [%i1 + 16]
171160662d10Schristos	std		%f4, [%i1 + 24]
171260662d10Schristos	add		%i1, 32, %i1
171360662d10Schristos	orn		%g0, %l3, %l3
171460662d10Schristos	stda		%f6, [%i1 + %l3]0xc0	! partial store
171560662d10Schristos
171660662d10Schristos	brnz,pt		%i2, .L256_cbc_dec_loop2x+4
171760662d10Schristos	orn		%g0, %l3, %l3
171860662d10Schristos	st		%f12, [%i4 + 0]
171960662d10Schristos	st		%f13, [%i4 + 4]
172060662d10Schristos	st		%f14, [%i4 + 8]
172160662d10Schristos	st		%f15, [%i4 + 12]
172260662d10Schristos	ret
172360662d10Schristos	restore
172460662d10Schristos
172560662d10Schristos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
172660662d10Schristos.align	32
172760662d10Schristos.L256cbc_dec_blk:
172860662d10Schristos	add	%i1, %i2, %l5
172960662d10Schristos	and	%l5, 63, %l5	! tail
173060662d10Schristos	sub	%i2, %l5, %i2
173160662d10Schristos	add	%l5, 15, %l5	! round up to 16n
173260662d10Schristos	srlx	%i2, 4, %i2
173360662d10Schristos	srl	%l5, 4, %l5
173460662d10Schristos	sub	%i2, 1, %i2
173560662d10Schristos	add	%l5, 1, %l5
173660662d10Schristos
173760662d10Schristos.L256_cbc_dec_blk_loop2x:
173860662d10Schristos	ldx		[%i0 + 0], %o0
173960662d10Schristos	ldx		[%i0 + 8], %o1
174060662d10Schristos	ldx		[%i0 + 16], %o2
174160662d10Schristos	brz,pt		%l0, 5f
174260662d10Schristos	ldx		[%i0 + 24], %o3
174360662d10Schristos
174460662d10Schristos	ldx		[%i0 + 32], %o4
174560662d10Schristos	sllx		%o0, %l0, %o0
174660662d10Schristos	srlx		%o1, %l1, %g1
174760662d10Schristos	or		%g1, %o0, %o0
174860662d10Schristos	sllx		%o1, %l0, %o1
174960662d10Schristos	srlx		%o2, %l1, %g1
175060662d10Schristos	or		%g1, %o1, %o1
175160662d10Schristos	sllx		%o2, %l0, %o2
175260662d10Schristos	srlx		%o3, %l1, %g1
175360662d10Schristos	or		%g1, %o2, %o2
175460662d10Schristos	sllx		%o3, %l0, %o3
175560662d10Schristos	srlx		%o4, %l1, %o4
175660662d10Schristos	or		%o4, %o3, %o3
175760662d10Schristos5:
175860662d10Schristos	xor		%g4, %o0, %o4		! ^= rk[0]
175960662d10Schristos	xor		%g5, %o1, %o5
176060662d10Schristos	.word	0x81b0230c !movxtod	%o4,%f0
176160662d10Schristos	.word	0x85b0230d !movxtod	%o5,%f2
176260662d10Schristos	xor		%g4, %o2, %o4
176360662d10Schristos	xor		%g5, %o3, %o5
176460662d10Schristos	.word	0x89b0230c !movxtod	%o4,%f4
176560662d10Schristos	.word	0x8db0230d !movxtod	%o5,%f6
176660662d10Schristos
176760662d10Schristos	prefetch	[%i0 + 32+63], 20
176860662d10Schristos	call		_cmll256_decrypt_2x
176960662d10Schristos	add		%i0, 32, %i0
177060662d10Schristos	subcc		%i2, 2, %i2
177160662d10Schristos
177260662d10Schristos	.word	0x91b02308 !movxtod	%o0,%f8
177360662d10Schristos	.word	0x95b02309 !movxtod	%o1,%f10
177460662d10Schristos	.word	0x81b30d80 !fxor	%f12,%f0,%f0		! ^= ivec
177560662d10Schristos	.word	0x85b38d82 !fxor	%f14,%f2,%f2
177660662d10Schristos	.word	0x99b0230a !movxtod	%o2,%f12
177760662d10Schristos	.word	0x9db0230b !movxtod	%o3,%f14
177860662d10Schristos	.word	0x89b20d84 !fxor	%f8,%f4,%f4
177960662d10Schristos	.word	0x8db28d86 !fxor	%f10,%f6,%f6
178060662d10Schristos
178160662d10Schristos	stda		%f0, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
178260662d10Schristos	add		%i1, 8, %i1
178360662d10Schristos	stda		%f2, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
178460662d10Schristos	add		%i1, 8, %i1
178560662d10Schristos	stda		%f4, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
178660662d10Schristos	add		%i1, 8, %i1
178760662d10Schristos	stda		%f6, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
1788*1dcdf01fSchristos	bgu,pt		SIZE_T_CC, .L256_cbc_dec_blk_loop2x
178960662d10Schristos	add		%i1, 8, %i1
179060662d10Schristos
179160662d10Schristos	add		%l5, %i2, %i2
179260662d10Schristos	andcc		%i2, 1, %g0		! is number of blocks even?
179360662d10Schristos	membar		#StoreLoad|#StoreStore
179460662d10Schristos	bnz,pt		%icc, .L256_cbc_dec_loop
179560662d10Schristos	srl		%i2, 0, %i2
179660662d10Schristos	brnz,pn		%i2, .L256_cbc_dec_loop2x
179760662d10Schristos	nop
179860662d10Schristos	st		%f12, [%i4 + 0]	! write out ivec
179960662d10Schristos	st		%f13, [%i4 + 4]
180060662d10Schristos	st		%f14, [%i4 + 8]
180160662d10Schristos	st		%f15, [%i4 + 12]
180260662d10Schristos	ret
180360662d10Schristos	restore
180460662d10Schristos.type	cmll256_t4_cbc_decrypt,#function
180560662d10Schristos.size	cmll256_t4_cbc_decrypt,.-cmll256_t4_cbc_decrypt
180660662d10Schristos.globl	cmll128_t4_ctr32_encrypt
180760662d10Schristos.align	32
180860662d10Schristoscmll128_t4_ctr32_encrypt:
1809*1dcdf01fSchristos	save		%sp, -STACK_FRAME, %sp
181060662d10Schristos	srln		%i2, 0, %i2		! needed on v8+, "nop" on v9
181160662d10Schristos
181260662d10Schristos	prefetch	[%i0], 20
181360662d10Schristos	prefetch	[%i0 + 63], 20
181460662d10Schristos	call		_cmll128_load_enckey
181560662d10Schristos	sllx		%i2, 4, %i2
181660662d10Schristos
181760662d10Schristos	ld		[%i4 + 0], %l4	! counter
181860662d10Schristos	ld		[%i4 + 4], %l5
181960662d10Schristos	ld		[%i4 + 8], %l6
182060662d10Schristos	ld		[%i4 + 12], %l7
182160662d10Schristos
182260662d10Schristos	sllx		%l4, 32, %o5
182360662d10Schristos	or		%l5, %o5, %o5
182460662d10Schristos	sllx		%l6, 32, %g1
182560662d10Schristos	xor		%o5, %g4, %g4		! ^= rk[0]
182660662d10Schristos	xor		%g1, %g5, %g5
182760662d10Schristos	.word	0x9db02304 !movxtod	%g4,%f14		! most significant 64 bits
182860662d10Schristos
182960662d10Schristos	sub		%i0, %i1, %l5	! %i0!=%i1
183060662d10Schristos	and		%i0, 7, %l0
183160662d10Schristos	andn		%i0, 7, %i0
183260662d10Schristos	sll		%l0, 3, %l0
183360662d10Schristos	mov		64, %l1
183460662d10Schristos	mov		0xff, %l3
183560662d10Schristos	sub		%l1, %l0, %l1
183660662d10Schristos	and		%i1, 7, %l2
183760662d10Schristos	cmp		%i2, 255
183860662d10Schristos	movrnz		%l2, 0, %l5		! if (	%i1&7 ||
1839*1dcdf01fSchristos	movleu		SIZE_T_CC, 0, %l5	!	%i2<256 ||
184060662d10Schristos	brnz,pn		%l5, .L128_ctr32_blk	!	%i0==%i1)
184160662d10Schristos	srl		%l3, %l2, %l3
184260662d10Schristos
184360662d10Schristos	andcc		%i2, 16, %g0		! is number of blocks even?
184460662d10Schristos	.word	0xb3b64340 !alignaddrl	%i1,%g0,%i1
184560662d10Schristos	bz		%icc, .L128_ctr32_loop2x
184660662d10Schristos	srlx		%i2, 4, %i2
184760662d10Schristos.L128_ctr32_loop:
184860662d10Schristos	ldx		[%i0 + 0], %o0
184960662d10Schristos	brz,pt		%l0, 4f
185060662d10Schristos	ldx		[%i0 + 8], %o1
185160662d10Schristos
185260662d10Schristos	ldx		[%i0 + 16], %o2
185360662d10Schristos	sllx		%o0, %l0, %o0
185460662d10Schristos	srlx		%o1, %l1, %g1
185560662d10Schristos	sllx		%o1, %l0, %o1
185660662d10Schristos	or		%g1, %o0, %o0
185760662d10Schristos	srlx		%o2, %l1, %o2
185860662d10Schristos	or		%o2, %o1, %o1
185960662d10Schristos4:
186060662d10Schristos	xor		%g5, %l7, %g1		! ^= rk[0]
186160662d10Schristos	add		%l7, 1, %l7
186260662d10Schristos	.word	0x85b02301 !movxtod	%g1,%f2
186360662d10Schristos	srl		%l7, 0, %l7		! clruw
186460662d10Schristos	prefetch	[%i1 + 63], 22
186560662d10Schristos	prefetch	[%i0 + 16+63], 20
186660662d10Schristos	.word	0x84cc1d82 !camellia_f	%f16,%f2,%f14,%f2
186760662d10Schristos	.word	0x80cc858e !camellia_f	%f18,%f14,%f2,%f0
186860662d10Schristos	call		_cmll128_encrypt_1x+8
186960662d10Schristos	add		%i0, 16, %i0
187060662d10Schristos
187160662d10Schristos	.word	0x95b02308 !movxtod	%o0,%f10
187260662d10Schristos	.word	0x99b02309 !movxtod	%o1,%f12
187360662d10Schristos	.word	0x81b28d80 !fxor	%f10,%f0,%f0		! ^= inp
187460662d10Schristos	.word	0x85b30d82 !fxor	%f12,%f2,%f2
187560662d10Schristos
187660662d10Schristos	brnz,pn		%l2, 2f
187760662d10Schristos	sub		%i2, 1, %i2
187860662d10Schristos
187960662d10Schristos	std		%f0, [%i1 + 0]
188060662d10Schristos	std		%f2, [%i1 + 8]
188160662d10Schristos	brnz,pt		%i2, .L128_ctr32_loop2x
188260662d10Schristos	add		%i1, 16, %i1
188360662d10Schristos
188460662d10Schristos	ret
188560662d10Schristos	restore
188660662d10Schristos
188760662d10Schristos.align	16
188860662d10Schristos2:	ldxa		[%i0]0x82, %o0		! avoid read-after-write hazard
188960662d10Schristos						! and ~3x deterioration
189060662d10Schristos						! in inp==out case
189160662d10Schristos	.word	0x89b00900 !faligndata	%f0,%f0,%f4		! handle unaligned output
189260662d10Schristos	.word	0x8db00902 !faligndata	%f0,%f2,%f6
189360662d10Schristos	.word	0x91b08902 !faligndata	%f2,%f2,%f8
189460662d10Schristos	stda		%f4, [%i1 + %l3]0xc0	! partial store
189560662d10Schristos	std		%f6, [%i1 + 8]
189660662d10Schristos	add		%i1, 16, %i1
189760662d10Schristos	orn		%g0, %l3, %l3
189860662d10Schristos	stda		%f8, [%i1 + %l3]0xc0	! partial store
189960662d10Schristos
190060662d10Schristos	brnz,pt		%i2, .L128_ctr32_loop2x+4
190160662d10Schristos	orn		%g0, %l3, %l3
190260662d10Schristos
190360662d10Schristos	ret
190460662d10Schristos	restore
190560662d10Schristos
190660662d10Schristos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
190760662d10Schristos.align	32
190860662d10Schristos.L128_ctr32_loop2x:
190960662d10Schristos	ldx		[%i0 + 0], %o0
191060662d10Schristos	ldx		[%i0 + 8], %o1
191160662d10Schristos	ldx		[%i0 + 16], %o2
191260662d10Schristos	brz,pt		%l0, 4f
191360662d10Schristos	ldx		[%i0 + 24], %o3
191460662d10Schristos
191560662d10Schristos	ldx		[%i0 + 32], %o4
191660662d10Schristos	sllx		%o0, %l0, %o0
191760662d10Schristos	srlx		%o1, %l1, %g1
191860662d10Schristos	or		%g1, %o0, %o0
191960662d10Schristos	sllx		%o1, %l0, %o1
192060662d10Schristos	srlx		%o2, %l1, %g1
192160662d10Schristos	or		%g1, %o1, %o1
192260662d10Schristos	sllx		%o2, %l0, %o2
192360662d10Schristos	srlx		%o3, %l1, %g1
192460662d10Schristos	or		%g1, %o2, %o2
192560662d10Schristos	sllx		%o3, %l0, %o3
192660662d10Schristos	srlx		%o4, %l1, %o4
192760662d10Schristos	or		%o4, %o3, %o3
192860662d10Schristos4:
192960662d10Schristos	xor		%g5, %l7, %g1		! ^= rk[0]
193060662d10Schristos	add		%l7, 1, %l7
193160662d10Schristos	.word	0x85b02301 !movxtod	%g1,%f2
193260662d10Schristos	srl		%l7, 0, %l7		! clruw
193360662d10Schristos	xor		%g5, %l7, %g1
193460662d10Schristos	add		%l7, 1, %l7
193560662d10Schristos	.word	0x8db02301 !movxtod	%g1,%f6
193660662d10Schristos	srl		%l7, 0, %l7		! clruw
193760662d10Schristos	prefetch	[%i1 + 63], 22
193860662d10Schristos	prefetch	[%i0 + 32+63], 20
193960662d10Schristos	.word	0x84cc1d82 !camellia_f	%f16,%f2,%f14,%f2
194060662d10Schristos	.word	0x8ccc1d86 !camellia_f	%f16,%f6,%f14,%f6
194160662d10Schristos	.word	0x80cc858e !camellia_f	%f18,%f14,%f2,%f0
194260662d10Schristos	.word	0x88cc8d8e !camellia_f	%f18,%f14,%f6,%f4
194360662d10Schristos	call		_cmll128_encrypt_2x+16
194460662d10Schristos	add		%i0, 32, %i0
194560662d10Schristos
194660662d10Schristos	.word	0x91b02308 !movxtod	%o0,%f8
194760662d10Schristos	.word	0x95b02309 !movxtod	%o1,%f10
194860662d10Schristos	.word	0x99b0230a !movxtod	%o2,%f12
194960662d10Schristos	.word	0x81b20d80 !fxor	%f8,%f0,%f0		! ^= inp
195060662d10Schristos	.word	0x91b0230b !movxtod	%o3,%f8
195160662d10Schristos	.word	0x85b28d82 !fxor	%f10,%f2,%f2
195260662d10Schristos	.word	0x89b30d84 !fxor	%f12,%f4,%f4
195360662d10Schristos	.word	0x8db20d86 !fxor	%f8,%f6,%f6
195460662d10Schristos
195560662d10Schristos	brnz,pn		%l2, 2f
195660662d10Schristos	sub		%i2, 2, %i2
195760662d10Schristos
195860662d10Schristos	std		%f0, [%i1 + 0]
195960662d10Schristos	std		%f2, [%i1 + 8]
196060662d10Schristos	std		%f4, [%i1 + 16]
196160662d10Schristos	std		%f6, [%i1 + 24]
196260662d10Schristos	brnz,pt		%i2, .L128_ctr32_loop2x
196360662d10Schristos	add		%i1, 32, %i1
196460662d10Schristos
196560662d10Schristos	ret
196660662d10Schristos	restore
196760662d10Schristos
196860662d10Schristos.align	16
196960662d10Schristos2:	ldxa		[%i0]0x82, %o0		! avoid read-after-write hazard
197060662d10Schristos						! and ~3x deterioration
197160662d10Schristos						! in inp==out case
197260662d10Schristos	.word	0x91b00900 !faligndata	%f0,%f0,%f8		! handle unaligned output
197360662d10Schristos	.word	0x81b00902 !faligndata	%f0,%f2,%f0
197460662d10Schristos	.word	0x85b08904 !faligndata	%f2,%f4,%f2
197560662d10Schristos	.word	0x89b10906 !faligndata	%f4,%f6,%f4
197660662d10Schristos	.word	0x8db18906 !faligndata	%f6,%f6,%f6
197760662d10Schristos
197860662d10Schristos	stda		%f8, [%i1 + %l3]0xc0	! partial store
197960662d10Schristos	std		%f0, [%i1 + 8]
198060662d10Schristos	std		%f2, [%i1 + 16]
198160662d10Schristos	std		%f4, [%i1 + 24]
198260662d10Schristos	add		%i1, 32, %i1
198360662d10Schristos	orn		%g0, %l3, %l3
198460662d10Schristos	stda		%f6, [%i1 + %l3]0xc0	! partial store
198560662d10Schristos
198660662d10Schristos	brnz,pt		%i2, .L128_ctr32_loop2x+4
198760662d10Schristos	orn		%g0, %l3, %l3
198860662d10Schristos
198960662d10Schristos	ret
199060662d10Schristos	restore
199160662d10Schristos
199260662d10Schristos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
199360662d10Schristos.align	32
199460662d10Schristos.L128_ctr32_blk:
199560662d10Schristos	add	%i1, %i2, %l5
199660662d10Schristos	and	%l5, 63, %l5	! tail
199760662d10Schristos	sub	%i2, %l5, %i2
199860662d10Schristos	add	%l5, 15, %l5	! round up to 16n
199960662d10Schristos	srlx	%i2, 4, %i2
200060662d10Schristos	srl	%l5, 4, %l5
200160662d10Schristos	sub	%i2, 1, %i2
200260662d10Schristos	add	%l5, 1, %l5
200360662d10Schristos
200460662d10Schristos.L128_ctr32_blk_loop2x:
200560662d10Schristos	ldx		[%i0 + 0], %o0
200660662d10Schristos	ldx		[%i0 + 8], %o1
200760662d10Schristos	ldx		[%i0 + 16], %o2
200860662d10Schristos	brz,pt		%l0, 5f
200960662d10Schristos	ldx		[%i0 + 24], %o3
201060662d10Schristos
201160662d10Schristos	ldx		[%i0 + 32], %o4
201260662d10Schristos	sllx		%o0, %l0, %o0
201360662d10Schristos	srlx		%o1, %l1, %g1
201460662d10Schristos	or		%g1, %o0, %o0
201560662d10Schristos	sllx		%o1, %l0, %o1
201660662d10Schristos	srlx		%o2, %l1, %g1
201760662d10Schristos	or		%g1, %o1, %o1
201860662d10Schristos	sllx		%o2, %l0, %o2
201960662d10Schristos	srlx		%o3, %l1, %g1
202060662d10Schristos	or		%g1, %o2, %o2
202160662d10Schristos	sllx		%o3, %l0, %o3
202260662d10Schristos	srlx		%o4, %l1, %o4
202360662d10Schristos	or		%o4, %o3, %o3
202460662d10Schristos5:
202560662d10Schristos	xor		%g5, %l7, %g1		! ^= rk[0]
202660662d10Schristos	add		%l7, 1, %l7
202760662d10Schristos	.word	0x85b02301 !movxtod	%g1,%f2
202860662d10Schristos	srl		%l7, 0, %l7		! clruw
202960662d10Schristos	xor		%g5, %l7, %g1
203060662d10Schristos	add		%l7, 1, %l7
203160662d10Schristos	.word	0x8db02301 !movxtod	%g1,%f6
203260662d10Schristos	srl		%l7, 0, %l7		! clruw
203360662d10Schristos	prefetch	[%i0 + 32+63], 20
203460662d10Schristos	.word	0x84cc1d82 !camellia_f	%f16,%f2,%f14,%f2
203560662d10Schristos	.word	0x8ccc1d86 !camellia_f	%f16,%f6,%f14,%f6
203660662d10Schristos	.word	0x80cc858e !camellia_f	%f18,%f14,%f2,%f0
203760662d10Schristos	.word	0x88cc8d8e !camellia_f	%f18,%f14,%f6,%f4
203860662d10Schristos	call		_cmll128_encrypt_2x+16
203960662d10Schristos	add		%i0, 32, %i0
204060662d10Schristos	subcc		%i2, 2, %i2
204160662d10Schristos
204260662d10Schristos	.word	0x91b02308 !movxtod	%o0,%f8
204360662d10Schristos	.word	0x95b02309 !movxtod	%o1,%f10
204460662d10Schristos	.word	0x99b0230a !movxtod	%o2,%f12
204560662d10Schristos	.word	0x81b20d80 !fxor	%f8,%f0,%f0		! ^= inp
204660662d10Schristos	.word	0x91b0230b !movxtod	%o3,%f8
204760662d10Schristos	.word	0x85b28d82 !fxor	%f10,%f2,%f2
204860662d10Schristos	.word	0x89b30d84 !fxor	%f12,%f4,%f4
204960662d10Schristos	.word	0x8db20d86 !fxor	%f8,%f6,%f6
205060662d10Schristos
205160662d10Schristos	stda		%f0, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
205260662d10Schristos	add		%i1, 8, %i1
205360662d10Schristos	stda		%f2, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
205460662d10Schristos	add		%i1, 8, %i1
205560662d10Schristos	stda		%f4, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
205660662d10Schristos	add		%i1, 8, %i1
205760662d10Schristos	stda		%f6, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
2058*1dcdf01fSchristos	bgu,pt		SIZE_T_CC, .L128_ctr32_blk_loop2x
205960662d10Schristos	add		%i1, 8, %i1
206060662d10Schristos
206160662d10Schristos	add		%l5, %i2, %i2
206260662d10Schristos	andcc		%i2, 1, %g0		! is number of blocks even?
206360662d10Schristos	membar		#StoreLoad|#StoreStore
206460662d10Schristos	bnz,pt		%icc, .L128_ctr32_loop
206560662d10Schristos	srl		%i2, 0, %i2
206660662d10Schristos	brnz,pn		%i2, .L128_ctr32_loop2x
206760662d10Schristos	nop
206860662d10Schristos
206960662d10Schristos	ret
207060662d10Schristos	restore
207160662d10Schristos.type	cmll128_t4_ctr32_encrypt,#function
207260662d10Schristos.size	cmll128_t4_ctr32_encrypt,.-cmll128_t4_ctr32_encrypt
207360662d10Schristos.globl	cmll256_t4_ctr32_encrypt
207460662d10Schristos.align	32
207560662d10Schristoscmll256_t4_ctr32_encrypt:
2076*1dcdf01fSchristos	save		%sp, -STACK_FRAME, %sp
207760662d10Schristos	srln		%i2, 0, %i2		! needed on v8+, "nop" on v9
207860662d10Schristos
207960662d10Schristos	prefetch	[%i0], 20
208060662d10Schristos	prefetch	[%i0 + 63], 20
208160662d10Schristos	call		_cmll256_load_enckey
208260662d10Schristos	sllx		%i2, 4, %i2
208360662d10Schristos
208460662d10Schristos	ld		[%i4 + 0], %l4	! counter
208560662d10Schristos	ld		[%i4 + 4], %l5
208660662d10Schristos	ld		[%i4 + 8], %l6
208760662d10Schristos	ld		[%i4 + 12], %l7
208860662d10Schristos
208960662d10Schristos	sllx		%l4, 32, %o5
209060662d10Schristos	or		%l5, %o5, %o5
209160662d10Schristos	sllx		%l6, 32, %g1
209260662d10Schristos	xor		%o5, %g4, %g4		! ^= rk[0]
209360662d10Schristos	xor		%g1, %g5, %g5
209460662d10Schristos	.word	0x9db02304 !movxtod	%g4,%f14		! most significant 64 bits
209560662d10Schristos
209660662d10Schristos	sub		%i0, %i1, %l5	! %i0!=%i1
209760662d10Schristos	and		%i0, 7, %l0
209860662d10Schristos	andn		%i0, 7, %i0
209960662d10Schristos	sll		%l0, 3, %l0
210060662d10Schristos	mov		64, %l1
210160662d10Schristos	mov		0xff, %l3
210260662d10Schristos	sub		%l1, %l0, %l1
210360662d10Schristos	and		%i1, 7, %l2
210460662d10Schristos	cmp		%i2, 255
210560662d10Schristos	movrnz		%l2, 0, %l5		! if (	%i1&7 ||
2106*1dcdf01fSchristos	movleu		SIZE_T_CC, 0, %l5	!	%i2<256 ||
210760662d10Schristos	brnz,pn		%l5, .L256_ctr32_blk	!	%i0==%i1)
210860662d10Schristos	srl		%l3, %l2, %l3
210960662d10Schristos
211060662d10Schristos	andcc		%i2, 16, %g0		! is number of blocks even?
211160662d10Schristos	.word	0xb3b64340 !alignaddrl	%i1,%g0,%i1
211260662d10Schristos	bz		%icc, .L256_ctr32_loop2x
211360662d10Schristos	srlx		%i2, 4, %i2
211460662d10Schristos.L256_ctr32_loop:
211560662d10Schristos	ldx		[%i0 + 0], %o0
211660662d10Schristos	brz,pt		%l0, 4f
211760662d10Schristos	ldx		[%i0 + 8], %o1
211860662d10Schristos
211960662d10Schristos	ldx		[%i0 + 16], %o2
212060662d10Schristos	sllx		%o0, %l0, %o0
212160662d10Schristos	srlx		%o1, %l1, %g1
212260662d10Schristos	sllx		%o1, %l0, %o1
212360662d10Schristos	or		%g1, %o0, %o0
212460662d10Schristos	srlx		%o2, %l1, %o2
212560662d10Schristos	or		%o2, %o1, %o1
212660662d10Schristos4:
212760662d10Schristos	xor		%g5, %l7, %g1		! ^= rk[0]
212860662d10Schristos	add		%l7, 1, %l7
212960662d10Schristos	.word	0x85b02301 !movxtod	%g1,%f2
213060662d10Schristos	srl		%l7, 0, %l7		! clruw
213160662d10Schristos	prefetch	[%i1 + 63], 22
213260662d10Schristos	prefetch	[%i0 + 16+63], 20
213360662d10Schristos	.word	0x84cc1d82 !camellia_f	%f16,%f2,%f14,%f2
213460662d10Schristos	.word	0x80cc858e !camellia_f	%f18,%f14,%f2,%f0
213560662d10Schristos	call		_cmll256_encrypt_1x+8
213660662d10Schristos	add		%i0, 16, %i0
213760662d10Schristos
213860662d10Schristos	.word	0x95b02308 !movxtod	%o0,%f10
213960662d10Schristos	.word	0x99b02309 !movxtod	%o1,%f12
214060662d10Schristos	.word	0x81b28d80 !fxor	%f10,%f0,%f0		! ^= inp
214160662d10Schristos	.word	0x85b30d82 !fxor	%f12,%f2,%f2
214260662d10Schristos
214360662d10Schristos	brnz,pn		%l2, 2f
214460662d10Schristos	sub		%i2, 1, %i2
214560662d10Schristos
214660662d10Schristos	std		%f0, [%i1 + 0]
214760662d10Schristos	std		%f2, [%i1 + 8]
214860662d10Schristos	brnz,pt		%i2, .L256_ctr32_loop2x
214960662d10Schristos	add		%i1, 16, %i1
215060662d10Schristos
215160662d10Schristos	ret
215260662d10Schristos	restore
215360662d10Schristos
215460662d10Schristos.align	16
215560662d10Schristos2:	ldxa		[%i0]0x82, %o0		! avoid read-after-write hazard
215660662d10Schristos						! and ~3x deterioration
215760662d10Schristos						! in inp==out case
215860662d10Schristos	.word	0x89b00900 !faligndata	%f0,%f0,%f4		! handle unaligned output
215960662d10Schristos	.word	0x8db00902 !faligndata	%f0,%f2,%f6
216060662d10Schristos	.word	0x91b08902 !faligndata	%f2,%f2,%f8
216160662d10Schristos	stda		%f4, [%i1 + %l3]0xc0	! partial store
216260662d10Schristos	std		%f6, [%i1 + 8]
216360662d10Schristos	add		%i1, 16, %i1
216460662d10Schristos	orn		%g0, %l3, %l3
216560662d10Schristos	stda		%f8, [%i1 + %l3]0xc0	! partial store
216660662d10Schristos
216760662d10Schristos	brnz,pt		%i2, .L256_ctr32_loop2x+4
216860662d10Schristos	orn		%g0, %l3, %l3
216960662d10Schristos
217060662d10Schristos	ret
217160662d10Schristos	restore
217260662d10Schristos
217360662d10Schristos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
217460662d10Schristos.align	32
217560662d10Schristos.L256_ctr32_loop2x:
217660662d10Schristos	ldx		[%i0 + 0], %o0
217760662d10Schristos	ldx		[%i0 + 8], %o1
217860662d10Schristos	ldx		[%i0 + 16], %o2
217960662d10Schristos	brz,pt		%l0, 4f
218060662d10Schristos	ldx		[%i0 + 24], %o3
218160662d10Schristos
218260662d10Schristos	ldx		[%i0 + 32], %o4
218360662d10Schristos	sllx		%o0, %l0, %o0
218460662d10Schristos	srlx		%o1, %l1, %g1
218560662d10Schristos	or		%g1, %o0, %o0
218660662d10Schristos	sllx		%o1, %l0, %o1
218760662d10Schristos	srlx		%o2, %l1, %g1
218860662d10Schristos	or		%g1, %o1, %o1
218960662d10Schristos	sllx		%o2, %l0, %o2
219060662d10Schristos	srlx		%o3, %l1, %g1
219160662d10Schristos	or		%g1, %o2, %o2
219260662d10Schristos	sllx		%o3, %l0, %o3
219360662d10Schristos	srlx		%o4, %l1, %o4
219460662d10Schristos	or		%o4, %o3, %o3
219560662d10Schristos4:
219660662d10Schristos	xor		%g5, %l7, %g1		! ^= rk[0]
219760662d10Schristos	add		%l7, 1, %l7
219860662d10Schristos	.word	0x85b02301 !movxtod	%g1,%f2
219960662d10Schristos	srl		%l7, 0, %l7		! clruw
220060662d10Schristos	xor		%g5, %l7, %g1
220160662d10Schristos	add		%l7, 1, %l7
220260662d10Schristos	.word	0x8db02301 !movxtod	%g1,%f6
220360662d10Schristos	srl		%l7, 0, %l7		! clruw
220460662d10Schristos	prefetch	[%i1 + 63], 22
220560662d10Schristos	prefetch	[%i0 + 32+63], 20
220660662d10Schristos	.word	0x84cc1d82 !camellia_f	%f16,%f2,%f14,%f2
220760662d10Schristos	.word	0x8ccc1d86 !camellia_f	%f16,%f6,%f14,%f6
220860662d10Schristos	.word	0x80cc858e !camellia_f	%f18,%f14,%f2,%f0
220960662d10Schristos	.word	0x88cc8d8e !camellia_f	%f18,%f14,%f6,%f4
221060662d10Schristos	call		_cmll256_encrypt_2x+16
221160662d10Schristos	add		%i0, 32, %i0
221260662d10Schristos
221360662d10Schristos	.word	0x91b02308 !movxtod	%o0,%f8
221460662d10Schristos	.word	0x95b02309 !movxtod	%o1,%f10
221560662d10Schristos	.word	0x99b0230a !movxtod	%o2,%f12
221660662d10Schristos	.word	0x81b20d80 !fxor	%f8,%f0,%f0		! ^= inp
221760662d10Schristos	.word	0x91b0230b !movxtod	%o3,%f8
221860662d10Schristos	.word	0x85b28d82 !fxor	%f10,%f2,%f2
221960662d10Schristos	.word	0x89b30d84 !fxor	%f12,%f4,%f4
222060662d10Schristos	.word	0x8db20d86 !fxor	%f8,%f6,%f6
222160662d10Schristos
222260662d10Schristos	brnz,pn		%l2, 2f
222360662d10Schristos	sub		%i2, 2, %i2
222460662d10Schristos
222560662d10Schristos	std		%f0, [%i1 + 0]
222660662d10Schristos	std		%f2, [%i1 + 8]
222760662d10Schristos	std		%f4, [%i1 + 16]
222860662d10Schristos	std		%f6, [%i1 + 24]
222960662d10Schristos	brnz,pt		%i2, .L256_ctr32_loop2x
223060662d10Schristos	add		%i1, 32, %i1
223160662d10Schristos
223260662d10Schristos	ret
223360662d10Schristos	restore
223460662d10Schristos
223560662d10Schristos.align	16
223660662d10Schristos2:	ldxa		[%i0]0x82, %o0		! avoid read-after-write hazard
223760662d10Schristos						! and ~3x deterioration
223860662d10Schristos						! in inp==out case
223960662d10Schristos	.word	0x91b00900 !faligndata	%f0,%f0,%f8		! handle unaligned output
224060662d10Schristos	.word	0x81b00902 !faligndata	%f0,%f2,%f0
224160662d10Schristos	.word	0x85b08904 !faligndata	%f2,%f4,%f2
224260662d10Schristos	.word	0x89b10906 !faligndata	%f4,%f6,%f4
224360662d10Schristos	.word	0x8db18906 !faligndata	%f6,%f6,%f6
224460662d10Schristos
224560662d10Schristos	stda		%f8, [%i1 + %l3]0xc0	! partial store
224660662d10Schristos	std		%f0, [%i1 + 8]
224760662d10Schristos	std		%f2, [%i1 + 16]
224860662d10Schristos	std		%f4, [%i1 + 24]
224960662d10Schristos	add		%i1, 32, %i1
225060662d10Schristos	orn		%g0, %l3, %l3
225160662d10Schristos	stda		%f6, [%i1 + %l3]0xc0	! partial store
225260662d10Schristos
225360662d10Schristos	brnz,pt		%i2, .L256_ctr32_loop2x+4
225460662d10Schristos	orn		%g0, %l3, %l3
225560662d10Schristos
225660662d10Schristos	ret
225760662d10Schristos	restore
225860662d10Schristos
225960662d10Schristos!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
226060662d10Schristos.align	32
226160662d10Schristos.L256_ctr32_blk:
226260662d10Schristos	add	%i1, %i2, %l5
226360662d10Schristos	and	%l5, 63, %l5	! tail
226460662d10Schristos	sub	%i2, %l5, %i2
226560662d10Schristos	add	%l5, 15, %l5	! round up to 16n
226660662d10Schristos	srlx	%i2, 4, %i2
226760662d10Schristos	srl	%l5, 4, %l5
226860662d10Schristos	sub	%i2, 1, %i2
226960662d10Schristos	add	%l5, 1, %l5
227060662d10Schristos
227160662d10Schristos.L256_ctr32_blk_loop2x:
227260662d10Schristos	ldx		[%i0 + 0], %o0
227360662d10Schristos	ldx		[%i0 + 8], %o1
227460662d10Schristos	ldx		[%i0 + 16], %o2
227560662d10Schristos	brz,pt		%l0, 5f
227660662d10Schristos	ldx		[%i0 + 24], %o3
227760662d10Schristos
227860662d10Schristos	ldx		[%i0 + 32], %o4
227960662d10Schristos	sllx		%o0, %l0, %o0
228060662d10Schristos	srlx		%o1, %l1, %g1
228160662d10Schristos	or		%g1, %o0, %o0
228260662d10Schristos	sllx		%o1, %l0, %o1
228360662d10Schristos	srlx		%o2, %l1, %g1
228460662d10Schristos	or		%g1, %o1, %o1
228560662d10Schristos	sllx		%o2, %l0, %o2
228660662d10Schristos	srlx		%o3, %l1, %g1
228760662d10Schristos	or		%g1, %o2, %o2
228860662d10Schristos	sllx		%o3, %l0, %o3
228960662d10Schristos	srlx		%o4, %l1, %o4
229060662d10Schristos	or		%o4, %o3, %o3
229160662d10Schristos5:
229260662d10Schristos	xor		%g5, %l7, %g1		! ^= rk[0]
229360662d10Schristos	add		%l7, 1, %l7
229460662d10Schristos	.word	0x85b02301 !movxtod	%g1,%f2
229560662d10Schristos	srl		%l7, 0, %l7		! clruw
229660662d10Schristos	xor		%g5, %l7, %g1
229760662d10Schristos	add		%l7, 1, %l7
229860662d10Schristos	.word	0x8db02301 !movxtod	%g1,%f6
229960662d10Schristos	srl		%l7, 0, %l7		! clruw
230060662d10Schristos	prefetch	[%i0 + 32+63], 20
230160662d10Schristos	.word	0x84cc1d82 !camellia_f	%f16,%f2,%f14,%f2
230260662d10Schristos	.word	0x8ccc1d86 !camellia_f	%f16,%f6,%f14,%f6
230360662d10Schristos	.word	0x80cc858e !camellia_f	%f18,%f14,%f2,%f0
230460662d10Schristos	.word	0x88cc8d8e !camellia_f	%f18,%f14,%f6,%f4
230560662d10Schristos	call		_cmll256_encrypt_2x+16
230660662d10Schristos	add		%i0, 32, %i0
230760662d10Schristos	subcc		%i2, 2, %i2
230860662d10Schristos
230960662d10Schristos	.word	0x91b02308 !movxtod	%o0,%f8
231060662d10Schristos	.word	0x95b02309 !movxtod	%o1,%f10
231160662d10Schristos	.word	0x99b0230a !movxtod	%o2,%f12
231260662d10Schristos	.word	0x81b20d80 !fxor	%f8,%f0,%f0		! ^= inp
231360662d10Schristos	.word	0x91b0230b !movxtod	%o3,%f8
231460662d10Schristos	.word	0x85b28d82 !fxor	%f10,%f2,%f2
231560662d10Schristos	.word	0x89b30d84 !fxor	%f12,%f4,%f4
231660662d10Schristos	.word	0x8db20d86 !fxor	%f8,%f6,%f6
231760662d10Schristos
231860662d10Schristos	stda		%f0, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
231960662d10Schristos	add		%i1, 8, %i1
232060662d10Schristos	stda		%f2, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
232160662d10Schristos	add		%i1, 8, %i1
232260662d10Schristos	stda		%f4, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
232360662d10Schristos	add		%i1, 8, %i1
232460662d10Schristos	stda		%f6, [%i1]0xe2		! ASI_BLK_INIT, T4-specific
2325*1dcdf01fSchristos	bgu,pt		SIZE_T_CC, .L256_ctr32_blk_loop2x
232660662d10Schristos	add		%i1, 8, %i1
232760662d10Schristos
232860662d10Schristos	add		%l5, %i2, %i2
232960662d10Schristos	andcc		%i2, 1, %g0		! is number of blocks even?
233060662d10Schristos	membar		#StoreLoad|#StoreStore
233160662d10Schristos	bnz,pt		%icc, .L256_ctr32_loop
233260662d10Schristos	srl		%i2, 0, %i2
233360662d10Schristos	brnz,pn		%i2, .L256_ctr32_loop2x
233460662d10Schristos	nop
233560662d10Schristos
233660662d10Schristos	ret
233760662d10Schristos	restore
233860662d10Schristos.type	cmll256_t4_ctr32_encrypt,#function
233960662d10Schristos.size	cmll256_t4_ctr32_encrypt,.-cmll256_t4_ctr32_encrypt
2340