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	.align	32
862306a36Sopenharmony_ciENTRY(des_sparc64_key_expand)
962306a36Sopenharmony_ci	/* %o0=input_key, %o1=output_key */
1062306a36Sopenharmony_ci	VISEntryHalf
1162306a36Sopenharmony_ci	ld	[%o0 + 0x00], %f0
1262306a36Sopenharmony_ci	ld	[%o0 + 0x04], %f1
1362306a36Sopenharmony_ci	DES_KEXPAND(0, 0, 0)
1462306a36Sopenharmony_ci	DES_KEXPAND(0, 1, 2)
1562306a36Sopenharmony_ci	DES_KEXPAND(2, 3, 6)
1662306a36Sopenharmony_ci	DES_KEXPAND(2, 2, 4)
1762306a36Sopenharmony_ci	DES_KEXPAND(6, 3, 10)
1862306a36Sopenharmony_ci	DES_KEXPAND(6, 2, 8)
1962306a36Sopenharmony_ci	DES_KEXPAND(10, 3, 14)
2062306a36Sopenharmony_ci	DES_KEXPAND(10, 2, 12)
2162306a36Sopenharmony_ci	DES_KEXPAND(14, 1, 16)
2262306a36Sopenharmony_ci	DES_KEXPAND(16, 3, 20)
2362306a36Sopenharmony_ci	DES_KEXPAND(16, 2, 18)
2462306a36Sopenharmony_ci	DES_KEXPAND(20, 3, 24)
2562306a36Sopenharmony_ci	DES_KEXPAND(20, 2, 22)
2662306a36Sopenharmony_ci	DES_KEXPAND(24, 3, 28)
2762306a36Sopenharmony_ci	DES_KEXPAND(24, 2, 26)
2862306a36Sopenharmony_ci	DES_KEXPAND(28, 1, 30)
2962306a36Sopenharmony_ci	std	%f0, [%o1 + 0x00]
3062306a36Sopenharmony_ci	std	%f2, [%o1 + 0x08]
3162306a36Sopenharmony_ci	std	%f4, [%o1 + 0x10]
3262306a36Sopenharmony_ci	std	%f6, [%o1 + 0x18]
3362306a36Sopenharmony_ci	std	%f8, [%o1 + 0x20]
3462306a36Sopenharmony_ci	std	%f10, [%o1 + 0x28]
3562306a36Sopenharmony_ci	std	%f12, [%o1 + 0x30]
3662306a36Sopenharmony_ci	std	%f14, [%o1 + 0x38]
3762306a36Sopenharmony_ci	std	%f16, [%o1 + 0x40]
3862306a36Sopenharmony_ci	std	%f18, [%o1 + 0x48]
3962306a36Sopenharmony_ci	std	%f20, [%o1 + 0x50]
4062306a36Sopenharmony_ci	std	%f22, [%o1 + 0x58]
4162306a36Sopenharmony_ci	std	%f24, [%o1 + 0x60]
4262306a36Sopenharmony_ci	std	%f26, [%o1 + 0x68]
4362306a36Sopenharmony_ci	std	%f28, [%o1 + 0x70]
4462306a36Sopenharmony_ci	std	%f30, [%o1 + 0x78]
4562306a36Sopenharmony_ci	retl
4662306a36Sopenharmony_ci	 VISExitHalf
4762306a36Sopenharmony_ciENDPROC(des_sparc64_key_expand)
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	.align	32
5062306a36Sopenharmony_ciENTRY(des_sparc64_crypt)
5162306a36Sopenharmony_ci	/* %o0=key, %o1=input, %o2=output */
5262306a36Sopenharmony_ci	VISEntry
5362306a36Sopenharmony_ci	ldd	[%o1 + 0x00], %f32
5462306a36Sopenharmony_ci	ldd	[%o0 + 0x00], %f0
5562306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f2
5662306a36Sopenharmony_ci	ldd	[%o0 + 0x10], %f4
5762306a36Sopenharmony_ci	ldd	[%o0 + 0x18], %f6
5862306a36Sopenharmony_ci	ldd	[%o0 + 0x20], %f8
5962306a36Sopenharmony_ci	ldd	[%o0 + 0x28], %f10
6062306a36Sopenharmony_ci	ldd	[%o0 + 0x30], %f12
6162306a36Sopenharmony_ci	ldd	[%o0 + 0x38], %f14
6262306a36Sopenharmony_ci	ldd	[%o0 + 0x40], %f16
6362306a36Sopenharmony_ci	ldd	[%o0 + 0x48], %f18
6462306a36Sopenharmony_ci	ldd	[%o0 + 0x50], %f20
6562306a36Sopenharmony_ci	ldd	[%o0 + 0x58], %f22
6662306a36Sopenharmony_ci	ldd	[%o0 + 0x60], %f24
6762306a36Sopenharmony_ci	ldd	[%o0 + 0x68], %f26
6862306a36Sopenharmony_ci	ldd	[%o0 + 0x70], %f28
6962306a36Sopenharmony_ci	ldd	[%o0 + 0x78], %f30
7062306a36Sopenharmony_ci	DES_IP(32, 32)
7162306a36Sopenharmony_ci	DES_ROUND(0, 2, 32, 32)
7262306a36Sopenharmony_ci	DES_ROUND(4, 6, 32, 32)
7362306a36Sopenharmony_ci	DES_ROUND(8, 10, 32, 32)
7462306a36Sopenharmony_ci	DES_ROUND(12, 14, 32, 32)
7562306a36Sopenharmony_ci	DES_ROUND(16, 18, 32, 32)
7662306a36Sopenharmony_ci	DES_ROUND(20, 22, 32, 32)
7762306a36Sopenharmony_ci	DES_ROUND(24, 26, 32, 32)
7862306a36Sopenharmony_ci	DES_ROUND(28, 30, 32, 32)
7962306a36Sopenharmony_ci	DES_IIP(32, 32)
8062306a36Sopenharmony_ci	std	%f32, [%o2 + 0x00]
8162306a36Sopenharmony_ci	retl
8262306a36Sopenharmony_ci	 VISExit
8362306a36Sopenharmony_ciENDPROC(des_sparc64_crypt)
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	.align	32
8662306a36Sopenharmony_ciENTRY(des_sparc64_load_keys)
8762306a36Sopenharmony_ci	/* %o0=key */
8862306a36Sopenharmony_ci	VISEntry
8962306a36Sopenharmony_ci	ldd	[%o0 + 0x00], %f0
9062306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f2
9162306a36Sopenharmony_ci	ldd	[%o0 + 0x10], %f4
9262306a36Sopenharmony_ci	ldd	[%o0 + 0x18], %f6
9362306a36Sopenharmony_ci	ldd	[%o0 + 0x20], %f8
9462306a36Sopenharmony_ci	ldd	[%o0 + 0x28], %f10
9562306a36Sopenharmony_ci	ldd	[%o0 + 0x30], %f12
9662306a36Sopenharmony_ci	ldd	[%o0 + 0x38], %f14
9762306a36Sopenharmony_ci	ldd	[%o0 + 0x40], %f16
9862306a36Sopenharmony_ci	ldd	[%o0 + 0x48], %f18
9962306a36Sopenharmony_ci	ldd	[%o0 + 0x50], %f20
10062306a36Sopenharmony_ci	ldd	[%o0 + 0x58], %f22
10162306a36Sopenharmony_ci	ldd	[%o0 + 0x60], %f24
10262306a36Sopenharmony_ci	ldd	[%o0 + 0x68], %f26
10362306a36Sopenharmony_ci	ldd	[%o0 + 0x70], %f28
10462306a36Sopenharmony_ci	retl
10562306a36Sopenharmony_ci	 ldd	[%o0 + 0x78], %f30
10662306a36Sopenharmony_ciENDPROC(des_sparc64_load_keys)
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci	.align	32
10962306a36Sopenharmony_ciENTRY(des_sparc64_ecb_crypt)
11062306a36Sopenharmony_ci	/* %o0=input, %o1=output, %o2=len */
11162306a36Sopenharmony_ci1:	ldd	[%o0 + 0x00], %f32
11262306a36Sopenharmony_ci	add	%o0, 0x08, %o0
11362306a36Sopenharmony_ci	DES_IP(32, 32)
11462306a36Sopenharmony_ci	DES_ROUND(0, 2, 32, 32)
11562306a36Sopenharmony_ci	DES_ROUND(4, 6, 32, 32)
11662306a36Sopenharmony_ci	DES_ROUND(8, 10, 32, 32)
11762306a36Sopenharmony_ci	DES_ROUND(12, 14, 32, 32)
11862306a36Sopenharmony_ci	DES_ROUND(16, 18, 32, 32)
11962306a36Sopenharmony_ci	DES_ROUND(20, 22, 32, 32)
12062306a36Sopenharmony_ci	DES_ROUND(24, 26, 32, 32)
12162306a36Sopenharmony_ci	DES_ROUND(28, 30, 32, 32)
12262306a36Sopenharmony_ci	DES_IIP(32, 32)
12362306a36Sopenharmony_ci	std	%f32, [%o1 + 0x00]
12462306a36Sopenharmony_ci	subcc	%o2, 0x08, %o2
12562306a36Sopenharmony_ci	bne,pt	%icc, 1b
12662306a36Sopenharmony_ci	 add	%o1, 0x08, %o1
12762306a36Sopenharmony_ci	retl
12862306a36Sopenharmony_ci	 nop
12962306a36Sopenharmony_ciENDPROC(des_sparc64_ecb_crypt)
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	.align	32
13262306a36Sopenharmony_ciENTRY(des_sparc64_cbc_encrypt)
13362306a36Sopenharmony_ci	/* %o0=input, %o1=output, %o2=len, %o3=IV */
13462306a36Sopenharmony_ci	ldd	[%o3 + 0x00], %f32
13562306a36Sopenharmony_ci1:	ldd	[%o0 + 0x00], %f34
13662306a36Sopenharmony_ci	fxor	%f32, %f34, %f32
13762306a36Sopenharmony_ci	DES_IP(32, 32)
13862306a36Sopenharmony_ci	DES_ROUND(0, 2, 32, 32)
13962306a36Sopenharmony_ci	DES_ROUND(4, 6, 32, 32)
14062306a36Sopenharmony_ci	DES_ROUND(8, 10, 32, 32)
14162306a36Sopenharmony_ci	DES_ROUND(12, 14, 32, 32)
14262306a36Sopenharmony_ci	DES_ROUND(16, 18, 32, 32)
14362306a36Sopenharmony_ci	DES_ROUND(20, 22, 32, 32)
14462306a36Sopenharmony_ci	DES_ROUND(24, 26, 32, 32)
14562306a36Sopenharmony_ci	DES_ROUND(28, 30, 32, 32)
14662306a36Sopenharmony_ci	DES_IIP(32, 32)
14762306a36Sopenharmony_ci	std	%f32, [%o1 + 0x00]
14862306a36Sopenharmony_ci	add	%o0, 0x08, %o0
14962306a36Sopenharmony_ci	subcc	%o2, 0x08, %o2
15062306a36Sopenharmony_ci	bne,pt	%icc, 1b
15162306a36Sopenharmony_ci	 add	%o1, 0x08, %o1
15262306a36Sopenharmony_ci	retl
15362306a36Sopenharmony_ci	 std	%f32, [%o3 + 0x00]
15462306a36Sopenharmony_ciENDPROC(des_sparc64_cbc_encrypt)
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci	.align	32
15762306a36Sopenharmony_ciENTRY(des_sparc64_cbc_decrypt)
15862306a36Sopenharmony_ci	/* %o0=input, %o1=output, %o2=len, %o3=IV */
15962306a36Sopenharmony_ci	ldd	[%o3 + 0x00], %f34
16062306a36Sopenharmony_ci1:	ldd	[%o0 + 0x00], %f36
16162306a36Sopenharmony_ci	DES_IP(36, 32)
16262306a36Sopenharmony_ci	DES_ROUND(0, 2, 32, 32)
16362306a36Sopenharmony_ci	DES_ROUND(4, 6, 32, 32)
16462306a36Sopenharmony_ci	DES_ROUND(8, 10, 32, 32)
16562306a36Sopenharmony_ci	DES_ROUND(12, 14, 32, 32)
16662306a36Sopenharmony_ci	DES_ROUND(16, 18, 32, 32)
16762306a36Sopenharmony_ci	DES_ROUND(20, 22, 32, 32)
16862306a36Sopenharmony_ci	DES_ROUND(24, 26, 32, 32)
16962306a36Sopenharmony_ci	DES_ROUND(28, 30, 32, 32)
17062306a36Sopenharmony_ci	DES_IIP(32, 32)
17162306a36Sopenharmony_ci	fxor	%f32, %f34, %f32
17262306a36Sopenharmony_ci	fsrc2	%f36, %f34
17362306a36Sopenharmony_ci	std	%f32, [%o1 + 0x00]
17462306a36Sopenharmony_ci	add	%o0, 0x08, %o0
17562306a36Sopenharmony_ci	subcc	%o2, 0x08, %o2
17662306a36Sopenharmony_ci	bne,pt	%icc, 1b
17762306a36Sopenharmony_ci	 add	%o1, 0x08, %o1
17862306a36Sopenharmony_ci	retl
17962306a36Sopenharmony_ci	 std	%f36, [%o3 + 0x00]
18062306a36Sopenharmony_ciENDPROC(des_sparc64_cbc_decrypt)
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	.align	32
18362306a36Sopenharmony_ciENTRY(des3_ede_sparc64_crypt)
18462306a36Sopenharmony_ci	/* %o0=key, %o1=input, %o2=output */
18562306a36Sopenharmony_ci	VISEntry
18662306a36Sopenharmony_ci	ldd	[%o1 + 0x00], %f32
18762306a36Sopenharmony_ci	ldd	[%o0 + 0x00], %f0
18862306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f2
18962306a36Sopenharmony_ci	ldd	[%o0 + 0x10], %f4
19062306a36Sopenharmony_ci	ldd	[%o0 + 0x18], %f6
19162306a36Sopenharmony_ci	ldd	[%o0 + 0x20], %f8
19262306a36Sopenharmony_ci	ldd	[%o0 + 0x28], %f10
19362306a36Sopenharmony_ci	ldd	[%o0 + 0x30], %f12
19462306a36Sopenharmony_ci	ldd	[%o0 + 0x38], %f14
19562306a36Sopenharmony_ci	ldd	[%o0 + 0x40], %f16
19662306a36Sopenharmony_ci	ldd	[%o0 + 0x48], %f18
19762306a36Sopenharmony_ci	ldd	[%o0 + 0x50], %f20
19862306a36Sopenharmony_ci	ldd	[%o0 + 0x58], %f22
19962306a36Sopenharmony_ci	ldd	[%o0 + 0x60], %f24
20062306a36Sopenharmony_ci	ldd	[%o0 + 0x68], %f26
20162306a36Sopenharmony_ci	ldd	[%o0 + 0x70], %f28
20262306a36Sopenharmony_ci	ldd	[%o0 + 0x78], %f30
20362306a36Sopenharmony_ci	DES_IP(32, 32)
20462306a36Sopenharmony_ci	DES_ROUND(0, 2, 32, 32)
20562306a36Sopenharmony_ci	ldd	[%o0 + 0x80], %f0
20662306a36Sopenharmony_ci	ldd	[%o0 + 0x88], %f2
20762306a36Sopenharmony_ci	DES_ROUND(4, 6, 32, 32)
20862306a36Sopenharmony_ci	ldd	[%o0 + 0x90], %f4
20962306a36Sopenharmony_ci	ldd	[%o0 + 0x98], %f6
21062306a36Sopenharmony_ci	DES_ROUND(8, 10, 32, 32)
21162306a36Sopenharmony_ci	ldd	[%o0 + 0xa0], %f8
21262306a36Sopenharmony_ci	ldd	[%o0 + 0xa8], %f10
21362306a36Sopenharmony_ci	DES_ROUND(12, 14, 32, 32)
21462306a36Sopenharmony_ci	ldd	[%o0 + 0xb0], %f12
21562306a36Sopenharmony_ci	ldd	[%o0 + 0xb8], %f14
21662306a36Sopenharmony_ci	DES_ROUND(16, 18, 32, 32)
21762306a36Sopenharmony_ci	ldd	[%o0 + 0xc0], %f16
21862306a36Sopenharmony_ci	ldd	[%o0 + 0xc8], %f18
21962306a36Sopenharmony_ci	DES_ROUND(20, 22, 32, 32)
22062306a36Sopenharmony_ci	ldd	[%o0 + 0xd0], %f20
22162306a36Sopenharmony_ci	ldd	[%o0 + 0xd8], %f22
22262306a36Sopenharmony_ci	DES_ROUND(24, 26, 32, 32)
22362306a36Sopenharmony_ci	ldd	[%o0 + 0xe0], %f24
22462306a36Sopenharmony_ci	ldd	[%o0 + 0xe8], %f26
22562306a36Sopenharmony_ci	DES_ROUND(28, 30, 32, 32)
22662306a36Sopenharmony_ci	ldd	[%o0 + 0xf0], %f28
22762306a36Sopenharmony_ci	ldd	[%o0 + 0xf8], %f30
22862306a36Sopenharmony_ci	DES_IIP(32, 32)
22962306a36Sopenharmony_ci	DES_IP(32, 32)
23062306a36Sopenharmony_ci	DES_ROUND(0, 2, 32, 32)
23162306a36Sopenharmony_ci	ldd	[%o0 + 0x100], %f0
23262306a36Sopenharmony_ci	ldd	[%o0 + 0x108], %f2
23362306a36Sopenharmony_ci	DES_ROUND(4, 6, 32, 32)
23462306a36Sopenharmony_ci	ldd	[%o0 + 0x110], %f4
23562306a36Sopenharmony_ci	ldd	[%o0 + 0x118], %f6
23662306a36Sopenharmony_ci	DES_ROUND(8, 10, 32, 32)
23762306a36Sopenharmony_ci	ldd	[%o0 + 0x120], %f8
23862306a36Sopenharmony_ci	ldd	[%o0 + 0x128], %f10
23962306a36Sopenharmony_ci	DES_ROUND(12, 14, 32, 32)
24062306a36Sopenharmony_ci	ldd	[%o0 + 0x130], %f12
24162306a36Sopenharmony_ci	ldd	[%o0 + 0x138], %f14
24262306a36Sopenharmony_ci	DES_ROUND(16, 18, 32, 32)
24362306a36Sopenharmony_ci	ldd	[%o0 + 0x140], %f16
24462306a36Sopenharmony_ci	ldd	[%o0 + 0x148], %f18
24562306a36Sopenharmony_ci	DES_ROUND(20, 22, 32, 32)
24662306a36Sopenharmony_ci	ldd	[%o0 + 0x150], %f20
24762306a36Sopenharmony_ci	ldd	[%o0 + 0x158], %f22
24862306a36Sopenharmony_ci	DES_ROUND(24, 26, 32, 32)
24962306a36Sopenharmony_ci	ldd	[%o0 + 0x160], %f24
25062306a36Sopenharmony_ci	ldd	[%o0 + 0x168], %f26
25162306a36Sopenharmony_ci	DES_ROUND(28, 30, 32, 32)
25262306a36Sopenharmony_ci	ldd	[%o0 + 0x170], %f28
25362306a36Sopenharmony_ci	ldd	[%o0 + 0x178], %f30
25462306a36Sopenharmony_ci	DES_IIP(32, 32)
25562306a36Sopenharmony_ci	DES_IP(32, 32)
25662306a36Sopenharmony_ci	DES_ROUND(0, 2, 32, 32)
25762306a36Sopenharmony_ci	DES_ROUND(4, 6, 32, 32)
25862306a36Sopenharmony_ci	DES_ROUND(8, 10, 32, 32)
25962306a36Sopenharmony_ci	DES_ROUND(12, 14, 32, 32)
26062306a36Sopenharmony_ci	DES_ROUND(16, 18, 32, 32)
26162306a36Sopenharmony_ci	DES_ROUND(20, 22, 32, 32)
26262306a36Sopenharmony_ci	DES_ROUND(24, 26, 32, 32)
26362306a36Sopenharmony_ci	DES_ROUND(28, 30, 32, 32)
26462306a36Sopenharmony_ci	DES_IIP(32, 32)
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci	std	%f32, [%o2 + 0x00]
26762306a36Sopenharmony_ci	retl
26862306a36Sopenharmony_ci	 VISExit
26962306a36Sopenharmony_ciENDPROC(des3_ede_sparc64_crypt)
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci	.align	32
27262306a36Sopenharmony_ciENTRY(des3_ede_sparc64_load_keys)
27362306a36Sopenharmony_ci	/* %o0=key */
27462306a36Sopenharmony_ci	VISEntry
27562306a36Sopenharmony_ci	ldd	[%o0 + 0x00], %f0
27662306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f2
27762306a36Sopenharmony_ci	ldd	[%o0 + 0x10], %f4
27862306a36Sopenharmony_ci	ldd	[%o0 + 0x18], %f6
27962306a36Sopenharmony_ci	ldd	[%o0 + 0x20], %f8
28062306a36Sopenharmony_ci	ldd	[%o0 + 0x28], %f10
28162306a36Sopenharmony_ci	ldd	[%o0 + 0x30], %f12
28262306a36Sopenharmony_ci	ldd	[%o0 + 0x38], %f14
28362306a36Sopenharmony_ci	ldd	[%o0 + 0x40], %f16
28462306a36Sopenharmony_ci	ldd	[%o0 + 0x48], %f18
28562306a36Sopenharmony_ci	ldd	[%o0 + 0x50], %f20
28662306a36Sopenharmony_ci	ldd	[%o0 + 0x58], %f22
28762306a36Sopenharmony_ci	ldd	[%o0 + 0x60], %f24
28862306a36Sopenharmony_ci	ldd	[%o0 + 0x68], %f26
28962306a36Sopenharmony_ci	ldd	[%o0 + 0x70], %f28
29062306a36Sopenharmony_ci	ldd	[%o0 + 0x78], %f30
29162306a36Sopenharmony_ci	ldd	[%o0 + 0x80], %f32
29262306a36Sopenharmony_ci	ldd	[%o0 + 0x88], %f34
29362306a36Sopenharmony_ci	ldd	[%o0 + 0x90], %f36
29462306a36Sopenharmony_ci	ldd	[%o0 + 0x98], %f38
29562306a36Sopenharmony_ci	ldd	[%o0 + 0xa0], %f40
29662306a36Sopenharmony_ci	ldd	[%o0 + 0xa8], %f42
29762306a36Sopenharmony_ci	ldd	[%o0 + 0xb0], %f44
29862306a36Sopenharmony_ci	ldd	[%o0 + 0xb8], %f46
29962306a36Sopenharmony_ci	ldd	[%o0 + 0xc0], %f48
30062306a36Sopenharmony_ci	ldd	[%o0 + 0xc8], %f50
30162306a36Sopenharmony_ci	ldd	[%o0 + 0xd0], %f52
30262306a36Sopenharmony_ci	ldd	[%o0 + 0xd8], %f54
30362306a36Sopenharmony_ci	ldd	[%o0 + 0xe0], %f56
30462306a36Sopenharmony_ci	retl
30562306a36Sopenharmony_ci	 ldd	[%o0 + 0xe8], %f58
30662306a36Sopenharmony_ciENDPROC(des3_ede_sparc64_load_keys)
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci#define DES3_LOOP_BODY(X) \
30962306a36Sopenharmony_ci	DES_IP(X, X) \
31062306a36Sopenharmony_ci	DES_ROUND(0, 2, X, X) \
31162306a36Sopenharmony_ci	DES_ROUND(4, 6, X, X) \
31262306a36Sopenharmony_ci	DES_ROUND(8, 10, X, X) \
31362306a36Sopenharmony_ci	DES_ROUND(12, 14, X, X) \
31462306a36Sopenharmony_ci	DES_ROUND(16, 18, X, X) \
31562306a36Sopenharmony_ci	ldd	[%o0 + 0xf0], %f16; \
31662306a36Sopenharmony_ci	ldd	[%o0 + 0xf8], %f18; \
31762306a36Sopenharmony_ci	DES_ROUND(20, 22, X, X) \
31862306a36Sopenharmony_ci	ldd	[%o0 + 0x100], %f20; \
31962306a36Sopenharmony_ci	ldd	[%o0 + 0x108], %f22; \
32062306a36Sopenharmony_ci	DES_ROUND(24, 26, X, X) \
32162306a36Sopenharmony_ci	ldd	[%o0 + 0x110], %f24; \
32262306a36Sopenharmony_ci	ldd	[%o0 + 0x118], %f26; \
32362306a36Sopenharmony_ci	DES_ROUND(28, 30, X, X) \
32462306a36Sopenharmony_ci	ldd	[%o0 + 0x120], %f28; \
32562306a36Sopenharmony_ci	ldd	[%o0 + 0x128], %f30; \
32662306a36Sopenharmony_ci	DES_IIP(X, X) \
32762306a36Sopenharmony_ci	DES_IP(X, X) \
32862306a36Sopenharmony_ci	DES_ROUND(32, 34, X, X) \
32962306a36Sopenharmony_ci	ldd	[%o0 + 0x130], %f0; \
33062306a36Sopenharmony_ci	ldd	[%o0 + 0x138], %f2; \
33162306a36Sopenharmony_ci	DES_ROUND(36, 38, X, X) \
33262306a36Sopenharmony_ci	ldd	[%o0 + 0x140], %f4; \
33362306a36Sopenharmony_ci	ldd	[%o0 + 0x148], %f6; \
33462306a36Sopenharmony_ci	DES_ROUND(40, 42, X, X) \
33562306a36Sopenharmony_ci	ldd	[%o0 + 0x150], %f8; \
33662306a36Sopenharmony_ci	ldd	[%o0 + 0x158], %f10; \
33762306a36Sopenharmony_ci	DES_ROUND(44, 46, X, X) \
33862306a36Sopenharmony_ci	ldd	[%o0 + 0x160], %f12; \
33962306a36Sopenharmony_ci	ldd	[%o0 + 0x168], %f14; \
34062306a36Sopenharmony_ci	DES_ROUND(48, 50, X, X) \
34162306a36Sopenharmony_ci	DES_ROUND(52, 54, X, X) \
34262306a36Sopenharmony_ci	DES_ROUND(56, 58, X, X) \
34362306a36Sopenharmony_ci	DES_ROUND(16, 18, X, X) \
34462306a36Sopenharmony_ci	ldd	[%o0 + 0x170], %f16; \
34562306a36Sopenharmony_ci	ldd	[%o0 + 0x178], %f18; \
34662306a36Sopenharmony_ci	DES_IIP(X, X) \
34762306a36Sopenharmony_ci	DES_IP(X, X) \
34862306a36Sopenharmony_ci	DES_ROUND(20, 22, X, X) \
34962306a36Sopenharmony_ci	ldd	[%o0 + 0x50], %f20; \
35062306a36Sopenharmony_ci	ldd	[%o0 + 0x58], %f22; \
35162306a36Sopenharmony_ci	DES_ROUND(24, 26, X, X) \
35262306a36Sopenharmony_ci	ldd	[%o0 + 0x60], %f24; \
35362306a36Sopenharmony_ci	ldd	[%o0 + 0x68], %f26; \
35462306a36Sopenharmony_ci	DES_ROUND(28, 30, X, X) \
35562306a36Sopenharmony_ci	ldd	[%o0 + 0x70], %f28; \
35662306a36Sopenharmony_ci	ldd	[%o0 + 0x78], %f30; \
35762306a36Sopenharmony_ci	DES_ROUND(0, 2, X, X) \
35862306a36Sopenharmony_ci	ldd	[%o0 + 0x00], %f0; \
35962306a36Sopenharmony_ci	ldd	[%o0 + 0x08], %f2; \
36062306a36Sopenharmony_ci	DES_ROUND(4, 6, X, X) \
36162306a36Sopenharmony_ci	ldd	[%o0 + 0x10], %f4; \
36262306a36Sopenharmony_ci	ldd	[%o0 + 0x18], %f6; \
36362306a36Sopenharmony_ci	DES_ROUND(8, 10, X, X) \
36462306a36Sopenharmony_ci	ldd	[%o0 + 0x20], %f8; \
36562306a36Sopenharmony_ci	ldd	[%o0 + 0x28], %f10; \
36662306a36Sopenharmony_ci	DES_ROUND(12, 14, X, X) \
36762306a36Sopenharmony_ci	ldd	[%o0 + 0x30], %f12; \
36862306a36Sopenharmony_ci	ldd	[%o0 + 0x38], %f14; \
36962306a36Sopenharmony_ci	DES_ROUND(16, 18, X, X) \
37062306a36Sopenharmony_ci	ldd	[%o0 + 0x40], %f16; \
37162306a36Sopenharmony_ci	ldd	[%o0 + 0x48], %f18; \
37262306a36Sopenharmony_ci	DES_IIP(X, X)
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci	.align	32
37562306a36Sopenharmony_ciENTRY(des3_ede_sparc64_ecb_crypt)
37662306a36Sopenharmony_ci	/* %o0=key, %o1=input, %o2=output, %o3=len */
37762306a36Sopenharmony_ci1:	ldd	[%o1 + 0x00], %f60
37862306a36Sopenharmony_ci	DES3_LOOP_BODY(60)
37962306a36Sopenharmony_ci	std	%f60, [%o2 + 0x00]
38062306a36Sopenharmony_ci	add	%o1, 0x08, %o1
38162306a36Sopenharmony_ci	subcc	%o3, 0x08, %o3
38262306a36Sopenharmony_ci	bne,pt	%icc, 1b
38362306a36Sopenharmony_ci	 add	%o2, 0x08, %o2
38462306a36Sopenharmony_ci	retl
38562306a36Sopenharmony_ci	 nop
38662306a36Sopenharmony_ciENDPROC(des3_ede_sparc64_ecb_crypt)
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci	.align	32
38962306a36Sopenharmony_ciENTRY(des3_ede_sparc64_cbc_encrypt)
39062306a36Sopenharmony_ci	/* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
39162306a36Sopenharmony_ci	ldd	[%o4 + 0x00], %f60
39262306a36Sopenharmony_ci1:	ldd	[%o1 + 0x00], %f62
39362306a36Sopenharmony_ci	fxor	%f60, %f62, %f60
39462306a36Sopenharmony_ci	DES3_LOOP_BODY(60)
39562306a36Sopenharmony_ci	std	%f60, [%o2 + 0x00]
39662306a36Sopenharmony_ci	add	%o1, 0x08, %o1
39762306a36Sopenharmony_ci	subcc	%o3, 0x08, %o3
39862306a36Sopenharmony_ci	bne,pt	%icc, 1b
39962306a36Sopenharmony_ci	 add	%o2, 0x08, %o2
40062306a36Sopenharmony_ci	retl
40162306a36Sopenharmony_ci	 std	%f60, [%o4 + 0x00]
40262306a36Sopenharmony_ciENDPROC(des3_ede_sparc64_cbc_encrypt)
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci	.align	32
40562306a36Sopenharmony_ciENTRY(des3_ede_sparc64_cbc_decrypt)
40662306a36Sopenharmony_ci	/* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
40762306a36Sopenharmony_ci	ldd	[%o4 + 0x00], %f62
40862306a36Sopenharmony_ci1:	ldx	[%o1 + 0x00], %g1
40962306a36Sopenharmony_ci	MOVXTOD_G1_F60
41062306a36Sopenharmony_ci	DES3_LOOP_BODY(60)
41162306a36Sopenharmony_ci	fxor	%f62, %f60, %f60
41262306a36Sopenharmony_ci	MOVXTOD_G1_F62
41362306a36Sopenharmony_ci	std	%f60, [%o2 + 0x00]
41462306a36Sopenharmony_ci	add	%o1, 0x08, %o1
41562306a36Sopenharmony_ci	subcc	%o3, 0x08, %o3
41662306a36Sopenharmony_ci	bne,pt	%icc, 1b
41762306a36Sopenharmony_ci	 add	%o2, 0x08, %o2
41862306a36Sopenharmony_ci	retl
41962306a36Sopenharmony_ci	 stx	%g1, [%o4 + 0x00]
42062306a36Sopenharmony_ciENDPROC(des3_ede_sparc64_cbc_decrypt)
421