162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#include <linux/linkage.h>
362306a36Sopenharmony_ci#include <asm/visasm.h>
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include "opcodes.h"
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#define CAMELLIA_6ROUNDS(KEY_BASE, I0, I1) \
862306a36Sopenharmony_ci	CAMELLIA_F(KEY_BASE +  0, I1, I0, I1) \
962306a36Sopenharmony_ci	CAMELLIA_F(KEY_BASE +  2, I0, I1, I0) \
1062306a36Sopenharmony_ci	CAMELLIA_F(KEY_BASE +  4, I1, I0, I1) \
1162306a36Sopenharmony_ci	CAMELLIA_F(KEY_BASE +  6, I0, I1, I0) \
1262306a36Sopenharmony_ci	CAMELLIA_F(KEY_BASE +  8, I1, I0, I1) \
1362306a36Sopenharmony_ci	CAMELLIA_F(KEY_BASE + 10, I0, I1, I0)
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define CAMELLIA_6ROUNDS_FL_FLI(KEY_BASE, I0, I1) \
1662306a36Sopenharmony_ci	CAMELLIA_6ROUNDS(KEY_BASE, I0, I1) \
1762306a36Sopenharmony_ci	CAMELLIA_FL(KEY_BASE + 12, I0, I0) \
1862306a36Sopenharmony_ci	CAMELLIA_FLI(KEY_BASE + 14, I1, I1)
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	.data
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	.align	8
2362306a36Sopenharmony_ciSIGMA:	.xword	0xA09E667F3BCC908B
2462306a36Sopenharmony_ci	.xword	0xB67AE8584CAA73B2
2562306a36Sopenharmony_ci	.xword	0xC6EF372FE94F82BE
2662306a36Sopenharmony_ci	.xword	0x54FF53A5F1D36F1C
2762306a36Sopenharmony_ci	.xword	0x10E527FADE682D1D
2862306a36Sopenharmony_ci	.xword	0xB05688C2B3E6C1FD
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	.text
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	.align	32
3362306a36Sopenharmony_ciENTRY(camellia_sparc64_key_expand)
3462306a36Sopenharmony_ci	/* %o0=in_key, %o1=encrypt_key, %o2=key_len, %o3=decrypt_key */
3562306a36Sopenharmony_ci	VISEntry
3662306a36Sopenharmony_ci	ld	[%o0 + 0x00], %f0	! i0, k[0]
3762306a36Sopenharmony_ci	ld	[%o0 + 0x04], %f1	! i1, k[1]
3862306a36Sopenharmony_ci	ld	[%o0 + 0x08], %f2	! i2, k[2]
3962306a36Sopenharmony_ci	ld	[%o0 + 0x0c], %f3	! i3, k[3]
4062306a36Sopenharmony_ci	std	%f0, [%o1 + 0x00]	! k[0, 1]
4162306a36Sopenharmony_ci	fsrc2	%f0, %f28
4262306a36Sopenharmony_ci	std	%f2, [%o1 + 0x08]	! k[2, 3]
4362306a36Sopenharmony_ci	cmp	%o2, 16
4462306a36Sopenharmony_ci	be	10f
4562306a36Sopenharmony_ci	 fsrc2	%f2, %f30
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	ld	[%o0 + 0x10], %f0
4862306a36Sopenharmony_ci	ld	[%o0 + 0x14], %f1
4962306a36Sopenharmony_ci	std	%f0, [%o1 + 0x20]	! k[8, 9]
5062306a36Sopenharmony_ci	cmp	%o2, 24
5162306a36Sopenharmony_ci	fone	%f10
5262306a36Sopenharmony_ci	be,a	1f
5362306a36Sopenharmony_ci	 fxor	%f10, %f0, %f2
5462306a36Sopenharmony_ci	ld	[%o0 + 0x18], %f2
5562306a36Sopenharmony_ci	ld	[%o0 + 0x1c], %f3
5662306a36Sopenharmony_ci1:
5762306a36Sopenharmony_ci	std	%f2, [%o1 + 0x28]	! k[10, 11]
5862306a36Sopenharmony_ci	fxor	%f28, %f0, %f0
5962306a36Sopenharmony_ci	fxor	%f30, %f2, %f2
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci10:
6262306a36Sopenharmony_ci	sethi	%hi(SIGMA), %g3
6362306a36Sopenharmony_ci	or	%g3, %lo(SIGMA), %g3
6462306a36Sopenharmony_ci	ldd	[%g3 + 0x00], %f16
6562306a36Sopenharmony_ci	ldd	[%g3 + 0x08], %f18
6662306a36Sopenharmony_ci	ldd	[%g3 + 0x10], %f20
6762306a36Sopenharmony_ci	ldd	[%g3 + 0x18], %f22
6862306a36Sopenharmony_ci	ldd	[%g3 + 0x20], %f24
6962306a36Sopenharmony_ci	ldd	[%g3 + 0x28], %f26
7062306a36Sopenharmony_ci	CAMELLIA_F(16, 2, 0, 2)
7162306a36Sopenharmony_ci	CAMELLIA_F(18, 0, 2, 0)
7262306a36Sopenharmony_ci	fxor	%f28, %f0, %f0
7362306a36Sopenharmony_ci	fxor	%f30, %f2, %f2
7462306a36Sopenharmony_ci	CAMELLIA_F(20, 2, 0, 2)
7562306a36Sopenharmony_ci	CAMELLIA_F(22, 0, 2, 0)
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#define ROTL128(S01, S23, TMP1, TMP2, N)	\
7862306a36Sopenharmony_ci	srlx	S01, (64 - N), TMP1;		\
7962306a36Sopenharmony_ci	sllx	S01, N, S01;			\
8062306a36Sopenharmony_ci	srlx	S23, (64 - N), TMP2;		\
8162306a36Sopenharmony_ci	sllx	S23, N, S23;			\
8262306a36Sopenharmony_ci	or	S01, TMP2, S01;			\
8362306a36Sopenharmony_ci	or	S23, TMP1, S23
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	cmp	%o2, 16
8662306a36Sopenharmony_ci	bne	1f
8762306a36Sopenharmony_ci	 nop
8862306a36Sopenharmony_ci	/* 128-bit key */
8962306a36Sopenharmony_ci	std	%f0, [%o1 + 0x10]	! k[ 4,  5]
9062306a36Sopenharmony_ci	std	%f2, [%o1 + 0x18]	! k[ 6,  7]
9162306a36Sopenharmony_ci	MOVDTOX_F0_O4
9262306a36Sopenharmony_ci	MOVDTOX_F2_O5
9362306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 15)
9462306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x30]	! k[12, 13]
9562306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x38]	! k[14, 15]
9662306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 15)
9762306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x40]	! k[16, 17]
9862306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x48]	! k[18, 19]
9962306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 15)
10062306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x60]	! k[24, 25]
10162306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 15)
10262306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x70]	! k[28, 29]
10362306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x78]	! k[30, 31]
10462306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 34)
10562306a36Sopenharmony_ci	stx	%o4, [%o1 + 0xa0]	! k[40, 41]
10662306a36Sopenharmony_ci	stx	%o5, [%o1 + 0xa8]	! k[42, 43]
10762306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 17)
10862306a36Sopenharmony_ci	stx	%o4, [%o1 + 0xc0]	! k[48, 49]
10962306a36Sopenharmony_ci	stx	%o5, [%o1 + 0xc8]	! k[50, 51]
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	ldx	[%o1 + 0x00], %o4	! k[ 0,  1]
11262306a36Sopenharmony_ci	ldx	[%o1 + 0x08], %o5	! k[ 2,  3]
11362306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 15)
11462306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x20]	! k[ 8,  9]
11562306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x28]	! k[10, 11]
11662306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 30)
11762306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x50]	! k[20, 21]
11862306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x58]	! k[22, 23]
11962306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 15)
12062306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x68]	! k[26, 27]
12162306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 17)
12262306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x80]	! k[32, 33]
12362306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x88]	! k[34, 35]
12462306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 17)
12562306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x90]	! k[36, 37]
12662306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x98]	! k[38, 39]
12762306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 17)
12862306a36Sopenharmony_ci	stx	%o4, [%o1 + 0xb0]	! k[44, 45]
12962306a36Sopenharmony_ci	stx	%o5, [%o1 + 0xb8]	! k[46, 47]
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	ba,pt	%xcc, 2f
13262306a36Sopenharmony_ci	 mov	(3 * 16 * 4), %o0
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci1:
13562306a36Sopenharmony_ci	/* 192-bit or 256-bit key */
13662306a36Sopenharmony_ci	std	%f0, [%o1 + 0x30]	! k[12, 13]
13762306a36Sopenharmony_ci	std	%f2, [%o1 + 0x38]	! k[14, 15]
13862306a36Sopenharmony_ci	ldd	[%o1 + 0x20], %f4	! k[ 8,  9]
13962306a36Sopenharmony_ci	ldd	[%o1 + 0x28], %f6	! k[10, 11]
14062306a36Sopenharmony_ci	fxor	%f0, %f4, %f0
14162306a36Sopenharmony_ci	fxor	%f2, %f6, %f2
14262306a36Sopenharmony_ci	CAMELLIA_F(24, 2, 0, 2)
14362306a36Sopenharmony_ci	CAMELLIA_F(26, 0, 2, 0)
14462306a36Sopenharmony_ci	std	%f0, [%o1 + 0x10]	! k[ 4,  5]
14562306a36Sopenharmony_ci	std	%f2, [%o1 + 0x18]	! k[ 6,  7]
14662306a36Sopenharmony_ci	MOVDTOX_F0_O4
14762306a36Sopenharmony_ci	MOVDTOX_F2_O5
14862306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 30)
14962306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x50]	! k[20, 21]
15062306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x58]	! k[22, 23]
15162306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 30)
15262306a36Sopenharmony_ci	stx	%o4, [%o1 + 0xa0]	! k[40, 41]
15362306a36Sopenharmony_ci	stx	%o5, [%o1 + 0xa8]	! k[42, 43]
15462306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 51)
15562306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x100]	! k[64, 65]
15662306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x108]	! k[66, 67]
15762306a36Sopenharmony_ci	ldx	[%o1 + 0x20], %o4	! k[ 8,  9]
15862306a36Sopenharmony_ci	ldx	[%o1 + 0x28], %o5	! k[10, 11]
15962306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 15)
16062306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x20]	! k[ 8,  9]
16162306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x28]	! k[10, 11]
16262306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 15)
16362306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x40]	! k[16, 17]
16462306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x48]	! k[18, 19]
16562306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 30)
16662306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x90]	! k[36, 37]
16762306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x98]	! k[38, 39]
16862306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 34)
16962306a36Sopenharmony_ci	stx	%o4, [%o1 + 0xd0]	! k[52, 53]
17062306a36Sopenharmony_ci	stx	%o5, [%o1 + 0xd8]	! k[54, 55]
17162306a36Sopenharmony_ci	ldx	[%o1 + 0x30], %o4	! k[12, 13]
17262306a36Sopenharmony_ci	ldx	[%o1 + 0x38], %o5	! k[14, 15]
17362306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 15)
17462306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x30]	! k[12, 13]
17562306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x38]	! k[14, 15]
17662306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 30)
17762306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x70]	! k[28, 29]
17862306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x78]	! k[30, 31]
17962306a36Sopenharmony_ci	srlx	%o4, 32, %g2
18062306a36Sopenharmony_ci	srlx	%o5, 32, %g3
18162306a36Sopenharmony_ci	stw	%o4, [%o1 + 0xc0]	! k[48]
18262306a36Sopenharmony_ci	stw	%g3, [%o1 + 0xc4]	! k[49]
18362306a36Sopenharmony_ci	stw	%o5, [%o1 + 0xc8]	! k[50]
18462306a36Sopenharmony_ci	stw	%g2, [%o1 + 0xcc]	! k[51]
18562306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 49)
18662306a36Sopenharmony_ci	stx	%o4, [%o1 + 0xe0]	! k[56, 57]
18762306a36Sopenharmony_ci	stx	%o5, [%o1 + 0xe8]	! k[58, 59]
18862306a36Sopenharmony_ci	ldx	[%o1 + 0x00], %o4	! k[ 0,  1]
18962306a36Sopenharmony_ci	ldx	[%o1 + 0x08], %o5	! k[ 2,  3]
19062306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 45)
19162306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x60]	! k[24, 25]
19262306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x68]	! k[26, 27]
19362306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 15)
19462306a36Sopenharmony_ci	stx	%o4, [%o1 + 0x80]	! k[32, 33]
19562306a36Sopenharmony_ci	stx	%o5, [%o1 + 0x88]	! k[34, 35]
19662306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 17)
19762306a36Sopenharmony_ci	stx	%o4, [%o1 + 0xb0]	! k[44, 45]
19862306a36Sopenharmony_ci	stx	%o5, [%o1 + 0xb8]	! k[46, 47]
19962306a36Sopenharmony_ci	ROTL128(%o4, %o5, %g2, %g3, 34)
20062306a36Sopenharmony_ci	stx	%o4, [%o1 + 0xf0]	! k[60, 61]
20162306a36Sopenharmony_ci	stx	%o5, [%o1 + 0xf8]	! k[62, 63]
20262306a36Sopenharmony_ci	mov	(4 * 16 * 4), %o0
20362306a36Sopenharmony_ci2:
20462306a36Sopenharmony_ci	add	%o1, %o0, %o1
20562306a36Sopenharmony_ci	ldd	[%o1 + 0x00], %f0
20662306a36Sopenharmony_ci	ldd	[%o1 + 0x08], %f2
20762306a36Sopenharmony_ci	std	%f0, [%o3 + 0x00]
20862306a36Sopenharmony_ci	std	%f2, [%o3 + 0x08]
20962306a36Sopenharmony_ci	add	%o3, 0x10, %o3
21062306a36Sopenharmony_ci1:
21162306a36Sopenharmony_ci	sub	%o1, (16 * 4), %o1
21262306a36Sopenharmony_ci	ldd	[%o1 + 0x38], %f0
21362306a36Sopenharmony_ci	ldd	[%o1 + 0x30], %f2
21462306a36Sopenharmony_ci	ldd	[%o1 + 0x28], %f4
21562306a36Sopenharmony_ci	ldd	[%o1 + 0x20], %f6
21662306a36Sopenharmony_ci	ldd	[%o1 + 0x18], %f8
21762306a36Sopenharmony_ci	ldd	[%o1 + 0x10], %f10
21862306a36Sopenharmony_ci	std	%f0, [%o3 + 0x00]
21962306a36Sopenharmony_ci	std	%f2, [%o3 + 0x08]
22062306a36Sopenharmony_ci	std	%f4, [%o3 + 0x10]
22162306a36Sopenharmony_ci	std	%f6, [%o3 + 0x18]
22262306a36Sopenharmony_ci	std	%f8, [%o3 + 0x20]
22362306a36Sopenharmony_ci	std	%f10, [%o3 + 0x28]
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci	ldd	[%o1 + 0x08], %f0
22662306a36Sopenharmony_ci	ldd	[%o1 + 0x00], %f2
22762306a36Sopenharmony_ci	std	%f0, [%o3 + 0x30]
22862306a36Sopenharmony_ci	std	%f2, [%o3 + 0x38]
22962306a36Sopenharmony_ci	subcc	%o0, (16 * 4), %o0
23062306a36Sopenharmony_ci	bne,pt	%icc, 1b
23162306a36Sopenharmony_ci	 add	%o3, (16 * 4), %o3
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci	std	%f2, [%o3 - 0x10]
23462306a36Sopenharmony_ci	std	%f0, [%o3 - 0x08]
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci	retl
23762306a36Sopenharmony_ci	 VISExit
23862306a36Sopenharmony_ciENDPROC(camellia_sparc64_key_expand)
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci	.align	32
24162306a36Sopenharmony_ciENTRY(camellia_sparc64_crypt)
24262306a36Sopenharmony_ci	/* %o0=key, %o1=input, %o2=output, %o3=key_len */
24362306a36Sopenharmony_ci	VISEntry
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	ld	[%o1 + 0x00], %f0
24662306a36Sopenharmony_ci	ld	[%o1 + 0x04], %f1
24762306a36Sopenharmony_ci	ld	[%o1 + 0x08], %f2
24862306a36Sopenharmony_ci	ld	[%o1 + 0x0c], %f3
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	ldd	[%o0 + 0x00], %f4
25162306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f6
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci	cmp	%o3, 16
25462306a36Sopenharmony_ci	fxor	%f4, %f0, %f0
25562306a36Sopenharmony_ci	be	1f
25662306a36Sopenharmony_ci	 fxor	%f6, %f2, %f2
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci	ldd	[%o0 + 0x10], %f8
25962306a36Sopenharmony_ci	ldd	[%o0 + 0x18], %f10
26062306a36Sopenharmony_ci	ldd	[%o0 + 0x20], %f12
26162306a36Sopenharmony_ci	ldd	[%o0 + 0x28], %f14
26262306a36Sopenharmony_ci	ldd	[%o0 + 0x30], %f16
26362306a36Sopenharmony_ci	ldd	[%o0 + 0x38], %f18
26462306a36Sopenharmony_ci	ldd	[%o0 + 0x40], %f20
26562306a36Sopenharmony_ci	ldd	[%o0 + 0x48], %f22
26662306a36Sopenharmony_ci	add	%o0, 0x40, %o0
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci1:
27162306a36Sopenharmony_ci	ldd	[%o0 + 0x10], %f8
27262306a36Sopenharmony_ci	ldd	[%o0 + 0x18], %f10
27362306a36Sopenharmony_ci	ldd	[%o0 + 0x20], %f12
27462306a36Sopenharmony_ci	ldd	[%o0 + 0x28], %f14
27562306a36Sopenharmony_ci	ldd	[%o0 + 0x30], %f16
27662306a36Sopenharmony_ci	ldd	[%o0 + 0x38], %f18
27762306a36Sopenharmony_ci	ldd	[%o0 + 0x40], %f20
27862306a36Sopenharmony_ci	ldd	[%o0 + 0x48], %f22
27962306a36Sopenharmony_ci	ldd	[%o0 + 0x50], %f24
28062306a36Sopenharmony_ci	ldd	[%o0 + 0x58], %f26
28162306a36Sopenharmony_ci	ldd	[%o0 + 0x60], %f28
28262306a36Sopenharmony_ci	ldd	[%o0 + 0x68], %f30
28362306a36Sopenharmony_ci	ldd	[%o0 + 0x70], %f32
28462306a36Sopenharmony_ci	ldd	[%o0 + 0x78], %f34
28562306a36Sopenharmony_ci	ldd	[%o0 + 0x80], %f36
28662306a36Sopenharmony_ci	ldd	[%o0 + 0x88], %f38
28762306a36Sopenharmony_ci	ldd	[%o0 + 0x90], %f40
28862306a36Sopenharmony_ci	ldd	[%o0 + 0x98], %f42
28962306a36Sopenharmony_ci	ldd	[%o0 + 0xa0], %f44
29062306a36Sopenharmony_ci	ldd	[%o0 + 0xa8], %f46
29162306a36Sopenharmony_ci	ldd	[%o0 + 0xb0], %f48
29262306a36Sopenharmony_ci	ldd	[%o0 + 0xb8], %f50
29362306a36Sopenharmony_ci	ldd	[%o0 + 0xc0], %f52
29462306a36Sopenharmony_ci	ldd	[%o0 + 0xc8], %f54
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
29762306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
29862306a36Sopenharmony_ci	CAMELLIA_6ROUNDS(40, 0, 2)
29962306a36Sopenharmony_ci	fxor	%f52, %f2, %f2
30062306a36Sopenharmony_ci	fxor	%f54, %f0, %f0
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	st	%f2, [%o2 + 0x00]
30362306a36Sopenharmony_ci	st	%f3, [%o2 + 0x04]
30462306a36Sopenharmony_ci	st	%f0, [%o2 + 0x08]
30562306a36Sopenharmony_ci	st	%f1, [%o2 + 0x0c]
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	retl
30862306a36Sopenharmony_ci	 VISExit
30962306a36Sopenharmony_ciENDPROC(camellia_sparc64_crypt)
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	.align	32
31262306a36Sopenharmony_ciENTRY(camellia_sparc64_load_keys)
31362306a36Sopenharmony_ci	/* %o0=key, %o1=key_len */
31462306a36Sopenharmony_ci	VISEntry
31562306a36Sopenharmony_ci	ldd	[%o0 + 0x00], %f4
31662306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f6
31762306a36Sopenharmony_ci	ldd	[%o0 + 0x10], %f8
31862306a36Sopenharmony_ci	ldd	[%o0 + 0x18], %f10
31962306a36Sopenharmony_ci	ldd	[%o0 + 0x20], %f12
32062306a36Sopenharmony_ci	ldd	[%o0 + 0x28], %f14
32162306a36Sopenharmony_ci	ldd	[%o0 + 0x30], %f16
32262306a36Sopenharmony_ci	ldd	[%o0 + 0x38], %f18
32362306a36Sopenharmony_ci	ldd	[%o0 + 0x40], %f20
32462306a36Sopenharmony_ci	ldd	[%o0 + 0x48], %f22
32562306a36Sopenharmony_ci	ldd	[%o0 + 0x50], %f24
32662306a36Sopenharmony_ci	ldd	[%o0 + 0x58], %f26
32762306a36Sopenharmony_ci	ldd	[%o0 + 0x60], %f28
32862306a36Sopenharmony_ci	ldd	[%o0 + 0x68], %f30
32962306a36Sopenharmony_ci	ldd	[%o0 + 0x70], %f32
33062306a36Sopenharmony_ci	ldd	[%o0 + 0x78], %f34
33162306a36Sopenharmony_ci	ldd	[%o0 + 0x80], %f36
33262306a36Sopenharmony_ci	ldd	[%o0 + 0x88], %f38
33362306a36Sopenharmony_ci	ldd	[%o0 + 0x90], %f40
33462306a36Sopenharmony_ci	ldd	[%o0 + 0x98], %f42
33562306a36Sopenharmony_ci	ldd	[%o0 + 0xa0], %f44
33662306a36Sopenharmony_ci	ldd	[%o0 + 0xa8], %f46
33762306a36Sopenharmony_ci	ldd	[%o0 + 0xb0], %f48
33862306a36Sopenharmony_ci	ldd	[%o0 + 0xb8], %f50
33962306a36Sopenharmony_ci	ldd	[%o0 + 0xc0], %f52
34062306a36Sopenharmony_ci	retl
34162306a36Sopenharmony_ci	 ldd	[%o0 + 0xc8], %f54
34262306a36Sopenharmony_ciENDPROC(camellia_sparc64_load_keys)
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	.align	32
34562306a36Sopenharmony_ciENTRY(camellia_sparc64_ecb_crypt_3_grand_rounds)
34662306a36Sopenharmony_ci	/* %o0=input, %o1=output, %o2=len, %o3=key */
34762306a36Sopenharmony_ci1:	ldd	[%o0 + 0x00], %f0
34862306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f2
34962306a36Sopenharmony_ci	add	%o0, 0x10, %o0
35062306a36Sopenharmony_ci	fxor	%f4, %f0, %f0
35162306a36Sopenharmony_ci	fxor	%f6, %f2, %f2
35262306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
35362306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
35462306a36Sopenharmony_ci	CAMELLIA_6ROUNDS(40, 0, 2)
35562306a36Sopenharmony_ci	fxor	%f52, %f2, %f2
35662306a36Sopenharmony_ci	fxor	%f54, %f0, %f0
35762306a36Sopenharmony_ci	std	%f2, [%o1 + 0x00]
35862306a36Sopenharmony_ci	std	%f0, [%o1 + 0x08]
35962306a36Sopenharmony_ci	subcc	%o2, 0x10, %o2
36062306a36Sopenharmony_ci	bne,pt	%icc, 1b
36162306a36Sopenharmony_ci	 add	%o1, 0x10, %o1
36262306a36Sopenharmony_ci	retl
36362306a36Sopenharmony_ci	 nop
36462306a36Sopenharmony_ciENDPROC(camellia_sparc64_ecb_crypt_3_grand_rounds)
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci	.align	32
36762306a36Sopenharmony_ciENTRY(camellia_sparc64_ecb_crypt_4_grand_rounds)
36862306a36Sopenharmony_ci	/* %o0=input, %o1=output, %o2=len, %o3=key */
36962306a36Sopenharmony_ci1:	ldd	[%o0 + 0x00], %f0
37062306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f2
37162306a36Sopenharmony_ci	add	%o0, 0x10, %o0
37262306a36Sopenharmony_ci	fxor	%f4, %f0, %f0
37362306a36Sopenharmony_ci	fxor	%f6, %f2, %f2
37462306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
37562306a36Sopenharmony_ci	ldd	[%o3 + 0xd0], %f8
37662306a36Sopenharmony_ci	ldd	[%o3 + 0xd8], %f10
37762306a36Sopenharmony_ci	ldd	[%o3 + 0xe0], %f12
37862306a36Sopenharmony_ci	ldd	[%o3 + 0xe8], %f14
37962306a36Sopenharmony_ci	ldd	[%o3 + 0xf0], %f16
38062306a36Sopenharmony_ci	ldd	[%o3 + 0xf8], %f18
38162306a36Sopenharmony_ci	ldd	[%o3 + 0x100], %f20
38262306a36Sopenharmony_ci	ldd	[%o3 + 0x108], %f22
38362306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
38462306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2)
38562306a36Sopenharmony_ci	CAMELLIA_F(8, 2, 0, 2)
38662306a36Sopenharmony_ci	CAMELLIA_F(10, 0, 2, 0)
38762306a36Sopenharmony_ci	ldd	[%o3 + 0x10], %f8
38862306a36Sopenharmony_ci	ldd	[%o3 + 0x18], %f10
38962306a36Sopenharmony_ci	CAMELLIA_F(12, 2, 0, 2)
39062306a36Sopenharmony_ci	CAMELLIA_F(14, 0, 2, 0)
39162306a36Sopenharmony_ci	ldd	[%o3 + 0x20], %f12
39262306a36Sopenharmony_ci	ldd	[%o3 + 0x28], %f14
39362306a36Sopenharmony_ci	CAMELLIA_F(16, 2, 0, 2)
39462306a36Sopenharmony_ci	CAMELLIA_F(18, 0, 2, 0)
39562306a36Sopenharmony_ci	ldd	[%o3 + 0x30], %f16
39662306a36Sopenharmony_ci	ldd	[%o3 + 0x38], %f18
39762306a36Sopenharmony_ci	fxor	%f20, %f2, %f2
39862306a36Sopenharmony_ci	fxor	%f22, %f0, %f0
39962306a36Sopenharmony_ci	ldd	[%o3 + 0x40], %f20
40062306a36Sopenharmony_ci	ldd	[%o3 + 0x48], %f22
40162306a36Sopenharmony_ci	std	%f2, [%o1 + 0x00]
40262306a36Sopenharmony_ci	std	%f0, [%o1 + 0x08]
40362306a36Sopenharmony_ci	subcc	%o2, 0x10, %o2
40462306a36Sopenharmony_ci	bne,pt	%icc, 1b
40562306a36Sopenharmony_ci	 add	%o1, 0x10, %o1
40662306a36Sopenharmony_ci	retl
40762306a36Sopenharmony_ci	 nop
40862306a36Sopenharmony_ciENDPROC(camellia_sparc64_ecb_crypt_4_grand_rounds)
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci	.align	32
41162306a36Sopenharmony_ciENTRY(camellia_sparc64_cbc_encrypt_3_grand_rounds)
41262306a36Sopenharmony_ci	/* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */
41362306a36Sopenharmony_ci	ldd	[%o4 + 0x00], %f60
41462306a36Sopenharmony_ci	ldd	[%o4 + 0x08], %f62
41562306a36Sopenharmony_ci1:	ldd	[%o0 + 0x00], %f0
41662306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f2
41762306a36Sopenharmony_ci	add	%o0, 0x10, %o0
41862306a36Sopenharmony_ci	fxor	%f60, %f0, %f0
41962306a36Sopenharmony_ci	fxor	%f62, %f2, %f2
42062306a36Sopenharmony_ci	fxor	%f4, %f0, %f0
42162306a36Sopenharmony_ci	fxor	%f6, %f2, %f2
42262306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
42362306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
42462306a36Sopenharmony_ci	CAMELLIA_6ROUNDS(40, 0, 2)
42562306a36Sopenharmony_ci	fxor	%f52, %f2, %f60
42662306a36Sopenharmony_ci	fxor	%f54, %f0, %f62
42762306a36Sopenharmony_ci	std	%f60, [%o1 + 0x00]
42862306a36Sopenharmony_ci	std	%f62, [%o1 + 0x08]
42962306a36Sopenharmony_ci	subcc	%o2, 0x10, %o2
43062306a36Sopenharmony_ci	bne,pt	%icc, 1b
43162306a36Sopenharmony_ci	 add	%o1, 0x10, %o1
43262306a36Sopenharmony_ci	std	%f60, [%o4 + 0x00]
43362306a36Sopenharmony_ci	retl
43462306a36Sopenharmony_ci	 std	%f62, [%o4 + 0x08]
43562306a36Sopenharmony_ciENDPROC(camellia_sparc64_cbc_encrypt_3_grand_rounds)
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci	.align	32
43862306a36Sopenharmony_ciENTRY(camellia_sparc64_cbc_encrypt_4_grand_rounds)
43962306a36Sopenharmony_ci	/* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */
44062306a36Sopenharmony_ci	ldd	[%o4 + 0x00], %f60
44162306a36Sopenharmony_ci	ldd	[%o4 + 0x08], %f62
44262306a36Sopenharmony_ci1:	ldd	[%o0 + 0x00], %f0
44362306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f2
44462306a36Sopenharmony_ci	add	%o0, 0x10, %o0
44562306a36Sopenharmony_ci	fxor	%f60, %f0, %f0
44662306a36Sopenharmony_ci	fxor	%f62, %f2, %f2
44762306a36Sopenharmony_ci	fxor	%f4, %f0, %f0
44862306a36Sopenharmony_ci	fxor	%f6, %f2, %f2
44962306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
45062306a36Sopenharmony_ci	ldd	[%o3 + 0xd0], %f8
45162306a36Sopenharmony_ci	ldd	[%o3 + 0xd8], %f10
45262306a36Sopenharmony_ci	ldd	[%o3 + 0xe0], %f12
45362306a36Sopenharmony_ci	ldd	[%o3 + 0xe8], %f14
45462306a36Sopenharmony_ci	ldd	[%o3 + 0xf0], %f16
45562306a36Sopenharmony_ci	ldd	[%o3 + 0xf8], %f18
45662306a36Sopenharmony_ci	ldd	[%o3 + 0x100], %f20
45762306a36Sopenharmony_ci	ldd	[%o3 + 0x108], %f22
45862306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
45962306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2)
46062306a36Sopenharmony_ci	CAMELLIA_F(8, 2, 0, 2)
46162306a36Sopenharmony_ci	CAMELLIA_F(10, 0, 2, 0)
46262306a36Sopenharmony_ci	ldd	[%o3 + 0x10], %f8
46362306a36Sopenharmony_ci	ldd	[%o3 + 0x18], %f10
46462306a36Sopenharmony_ci	CAMELLIA_F(12, 2, 0, 2)
46562306a36Sopenharmony_ci	CAMELLIA_F(14, 0, 2, 0)
46662306a36Sopenharmony_ci	ldd	[%o3 + 0x20], %f12
46762306a36Sopenharmony_ci	ldd	[%o3 + 0x28], %f14
46862306a36Sopenharmony_ci	CAMELLIA_F(16, 2, 0, 2)
46962306a36Sopenharmony_ci	CAMELLIA_F(18, 0, 2, 0)
47062306a36Sopenharmony_ci	ldd	[%o3 + 0x30], %f16
47162306a36Sopenharmony_ci	ldd	[%o3 + 0x38], %f18
47262306a36Sopenharmony_ci	fxor	%f20, %f2, %f60
47362306a36Sopenharmony_ci	fxor	%f22, %f0, %f62
47462306a36Sopenharmony_ci	ldd	[%o3 + 0x40], %f20
47562306a36Sopenharmony_ci	ldd	[%o3 + 0x48], %f22
47662306a36Sopenharmony_ci	std	%f60, [%o1 + 0x00]
47762306a36Sopenharmony_ci	std	%f62, [%o1 + 0x08]
47862306a36Sopenharmony_ci	subcc	%o2, 0x10, %o2
47962306a36Sopenharmony_ci	bne,pt	%icc, 1b
48062306a36Sopenharmony_ci	 add	%o1, 0x10, %o1
48162306a36Sopenharmony_ci	std	%f60, [%o4 + 0x00]
48262306a36Sopenharmony_ci	retl
48362306a36Sopenharmony_ci	 std	%f62, [%o4 + 0x08]
48462306a36Sopenharmony_ciENDPROC(camellia_sparc64_cbc_encrypt_4_grand_rounds)
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci	.align	32
48762306a36Sopenharmony_ciENTRY(camellia_sparc64_cbc_decrypt_3_grand_rounds)
48862306a36Sopenharmony_ci	/* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */
48962306a36Sopenharmony_ci	ldd	[%o4 + 0x00], %f60
49062306a36Sopenharmony_ci	ldd	[%o4 + 0x08], %f62
49162306a36Sopenharmony_ci1:	ldd	[%o0 + 0x00], %f56
49262306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f58
49362306a36Sopenharmony_ci	add	%o0, 0x10, %o0
49462306a36Sopenharmony_ci	fxor	%f4, %f56, %f0
49562306a36Sopenharmony_ci	fxor	%f6, %f58, %f2
49662306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
49762306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
49862306a36Sopenharmony_ci	CAMELLIA_6ROUNDS(40, 0, 2)
49962306a36Sopenharmony_ci	fxor	%f52, %f2, %f2
50062306a36Sopenharmony_ci	fxor	%f54, %f0, %f0
50162306a36Sopenharmony_ci	fxor	%f60, %f2, %f2
50262306a36Sopenharmony_ci	fxor	%f62, %f0, %f0
50362306a36Sopenharmony_ci	fsrc2	%f56, %f60
50462306a36Sopenharmony_ci	fsrc2	%f58, %f62
50562306a36Sopenharmony_ci	std	%f2, [%o1 + 0x00]
50662306a36Sopenharmony_ci	std	%f0, [%o1 + 0x08]
50762306a36Sopenharmony_ci	subcc	%o2, 0x10, %o2
50862306a36Sopenharmony_ci	bne,pt	%icc, 1b
50962306a36Sopenharmony_ci	 add	%o1, 0x10, %o1
51062306a36Sopenharmony_ci	std	%f60, [%o4 + 0x00]
51162306a36Sopenharmony_ci	retl
51262306a36Sopenharmony_ci	 std	%f62, [%o4 + 0x08]
51362306a36Sopenharmony_ciENDPROC(camellia_sparc64_cbc_decrypt_3_grand_rounds)
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_ci	.align	32
51662306a36Sopenharmony_ciENTRY(camellia_sparc64_cbc_decrypt_4_grand_rounds)
51762306a36Sopenharmony_ci	/* %o0=input, %o1=output, %o2=len, %o3=key, %o4=IV */
51862306a36Sopenharmony_ci	ldd	[%o4 + 0x00], %f60
51962306a36Sopenharmony_ci	ldd	[%o4 + 0x08], %f62
52062306a36Sopenharmony_ci1:	ldd	[%o0 + 0x00], %f56
52162306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f58
52262306a36Sopenharmony_ci	add	%o0, 0x10, %o0
52362306a36Sopenharmony_ci	fxor	%f4, %f56, %f0
52462306a36Sopenharmony_ci	fxor	%f6, %f58, %f2
52562306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI( 8, 0, 2)
52662306a36Sopenharmony_ci	ldd	[%o3 + 0xd0], %f8
52762306a36Sopenharmony_ci	ldd	[%o3 + 0xd8], %f10
52862306a36Sopenharmony_ci	ldd	[%o3 + 0xe0], %f12
52962306a36Sopenharmony_ci	ldd	[%o3 + 0xe8], %f14
53062306a36Sopenharmony_ci	ldd	[%o3 + 0xf0], %f16
53162306a36Sopenharmony_ci	ldd	[%o3 + 0xf8], %f18
53262306a36Sopenharmony_ci	ldd	[%o3 + 0x100], %f20
53362306a36Sopenharmony_ci	ldd	[%o3 + 0x108], %f22
53462306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI(24, 0, 2)
53562306a36Sopenharmony_ci	CAMELLIA_6ROUNDS_FL_FLI(40, 0, 2)
53662306a36Sopenharmony_ci	CAMELLIA_F(8, 2, 0, 2)
53762306a36Sopenharmony_ci	CAMELLIA_F(10, 0, 2, 0)
53862306a36Sopenharmony_ci	ldd	[%o3 + 0x10], %f8
53962306a36Sopenharmony_ci	ldd	[%o3 + 0x18], %f10
54062306a36Sopenharmony_ci	CAMELLIA_F(12, 2, 0, 2)
54162306a36Sopenharmony_ci	CAMELLIA_F(14, 0, 2, 0)
54262306a36Sopenharmony_ci	ldd	[%o3 + 0x20], %f12
54362306a36Sopenharmony_ci	ldd	[%o3 + 0x28], %f14
54462306a36Sopenharmony_ci	CAMELLIA_F(16, 2, 0, 2)
54562306a36Sopenharmony_ci	CAMELLIA_F(18, 0, 2, 0)
54662306a36Sopenharmony_ci	ldd	[%o3 + 0x30], %f16
54762306a36Sopenharmony_ci	ldd	[%o3 + 0x38], %f18
54862306a36Sopenharmony_ci	fxor	%f20, %f2, %f2
54962306a36Sopenharmony_ci	fxor	%f22, %f0, %f0
55062306a36Sopenharmony_ci	ldd	[%o3 + 0x40], %f20
55162306a36Sopenharmony_ci	ldd	[%o3 + 0x48], %f22
55262306a36Sopenharmony_ci	fxor	%f60, %f2, %f2
55362306a36Sopenharmony_ci	fxor	%f62, %f0, %f0
55462306a36Sopenharmony_ci	fsrc2	%f56, %f60
55562306a36Sopenharmony_ci	fsrc2	%f58, %f62
55662306a36Sopenharmony_ci	std	%f2, [%o1 + 0x00]
55762306a36Sopenharmony_ci	std	%f0, [%o1 + 0x08]
55862306a36Sopenharmony_ci	subcc	%o2, 0x10, %o2
55962306a36Sopenharmony_ci	bne,pt	%icc, 1b
56062306a36Sopenharmony_ci	 add	%o1, 0x10, %o1
56162306a36Sopenharmony_ci	std	%f60, [%o4 + 0x00]
56262306a36Sopenharmony_ci	retl
56362306a36Sopenharmony_ci	 std	%f62, [%o4 + 0x08]
56462306a36Sopenharmony_ciENDPROC(camellia_sparc64_cbc_decrypt_4_grand_rounds)
565