18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * des3_ede-asm_64.S  -  x86-64 assembly implementation of 3DES cipher
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright © 2014 Jussi Kivilinna <jussi.kivilinna@iki.fi>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/linkage.h>
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci.file "des3_ede-asm_64.S"
118c2ecf20Sopenharmony_ci.text
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#define s1 .L_s1
148c2ecf20Sopenharmony_ci#define s2 ((s1) + (64*8))
158c2ecf20Sopenharmony_ci#define s3 ((s2) + (64*8))
168c2ecf20Sopenharmony_ci#define s4 ((s3) + (64*8))
178c2ecf20Sopenharmony_ci#define s5 ((s4) + (64*8))
188c2ecf20Sopenharmony_ci#define s6 ((s5) + (64*8))
198c2ecf20Sopenharmony_ci#define s7 ((s6) + (64*8))
208c2ecf20Sopenharmony_ci#define s8 ((s7) + (64*8))
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci/* register macros */
238c2ecf20Sopenharmony_ci#define CTX %rdi
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci#define RL0 %r8
268c2ecf20Sopenharmony_ci#define RL1 %r9
278c2ecf20Sopenharmony_ci#define RL2 %r10
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci#define RL0d %r8d
308c2ecf20Sopenharmony_ci#define RL1d %r9d
318c2ecf20Sopenharmony_ci#define RL2d %r10d
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci#define RR0 %r11
348c2ecf20Sopenharmony_ci#define RR1 %r12
358c2ecf20Sopenharmony_ci#define RR2 %r13
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci#define RR0d %r11d
388c2ecf20Sopenharmony_ci#define RR1d %r12d
398c2ecf20Sopenharmony_ci#define RR2d %r13d
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci#define RW0 %rax
428c2ecf20Sopenharmony_ci#define RW1 %rbx
438c2ecf20Sopenharmony_ci#define RW2 %rcx
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci#define RW0d %eax
468c2ecf20Sopenharmony_ci#define RW1d %ebx
478c2ecf20Sopenharmony_ci#define RW2d %ecx
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci#define RW0bl %al
508c2ecf20Sopenharmony_ci#define RW1bl %bl
518c2ecf20Sopenharmony_ci#define RW2bl %cl
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci#define RW0bh %ah
548c2ecf20Sopenharmony_ci#define RW1bh %bh
558c2ecf20Sopenharmony_ci#define RW2bh %ch
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci#define RT0 %r15
588c2ecf20Sopenharmony_ci#define RT1 %rsi
598c2ecf20Sopenharmony_ci#define RT2 %r14
608c2ecf20Sopenharmony_ci#define RT3 %rdx
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci#define RT0d %r15d
638c2ecf20Sopenharmony_ci#define RT1d %esi
648c2ecf20Sopenharmony_ci#define RT2d %r14d
658c2ecf20Sopenharmony_ci#define RT3d %edx
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci/***********************************************************************
688c2ecf20Sopenharmony_ci * 1-way 3DES
698c2ecf20Sopenharmony_ci ***********************************************************************/
708c2ecf20Sopenharmony_ci#define do_permutation(a, b, offset, mask) \
718c2ecf20Sopenharmony_ci	movl a, RT0d; \
728c2ecf20Sopenharmony_ci	shrl $(offset), RT0d; \
738c2ecf20Sopenharmony_ci	xorl b, RT0d; \
748c2ecf20Sopenharmony_ci	andl $(mask), RT0d; \
758c2ecf20Sopenharmony_ci	xorl RT0d, b; \
768c2ecf20Sopenharmony_ci	shll $(offset), RT0d; \
778c2ecf20Sopenharmony_ci	xorl RT0d, a;
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci#define expand_to_64bits(val, mask) \
808c2ecf20Sopenharmony_ci	movl val##d, RT0d; \
818c2ecf20Sopenharmony_ci	rorl $4, RT0d; \
828c2ecf20Sopenharmony_ci	shlq $32, RT0; \
838c2ecf20Sopenharmony_ci	orq RT0, val; \
848c2ecf20Sopenharmony_ci	andq mask, val;
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci#define compress_to_64bits(val) \
878c2ecf20Sopenharmony_ci	movq val, RT0; \
888c2ecf20Sopenharmony_ci	shrq $32, RT0; \
898c2ecf20Sopenharmony_ci	roll $4, RT0d; \
908c2ecf20Sopenharmony_ci	orl RT0d, val##d;
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci#define initial_permutation(left, right) \
938c2ecf20Sopenharmony_ci	do_permutation(left##d, right##d,  4, 0x0f0f0f0f); \
948c2ecf20Sopenharmony_ci	do_permutation(left##d, right##d, 16, 0x0000ffff); \
958c2ecf20Sopenharmony_ci	do_permutation(right##d, left##d,  2, 0x33333333); \
968c2ecf20Sopenharmony_ci	do_permutation(right##d, left##d,  8, 0x00ff00ff); \
978c2ecf20Sopenharmony_ci	movabs $0x3f3f3f3f3f3f3f3f, RT3; \
988c2ecf20Sopenharmony_ci	movl left##d, RW0d; \
998c2ecf20Sopenharmony_ci	roll $1, right##d; \
1008c2ecf20Sopenharmony_ci	xorl right##d, RW0d; \
1018c2ecf20Sopenharmony_ci	andl $0xaaaaaaaa, RW0d; \
1028c2ecf20Sopenharmony_ci	xorl RW0d, left##d; \
1038c2ecf20Sopenharmony_ci	xorl RW0d, right##d; \
1048c2ecf20Sopenharmony_ci	roll $1, left##d; \
1058c2ecf20Sopenharmony_ci	expand_to_64bits(right, RT3); \
1068c2ecf20Sopenharmony_ci	expand_to_64bits(left, RT3);
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci#define final_permutation(left, right) \
1098c2ecf20Sopenharmony_ci	compress_to_64bits(right); \
1108c2ecf20Sopenharmony_ci	compress_to_64bits(left); \
1118c2ecf20Sopenharmony_ci	movl right##d, RW0d; \
1128c2ecf20Sopenharmony_ci	rorl $1, left##d; \
1138c2ecf20Sopenharmony_ci	xorl left##d, RW0d; \
1148c2ecf20Sopenharmony_ci	andl $0xaaaaaaaa, RW0d; \
1158c2ecf20Sopenharmony_ci	xorl RW0d, right##d; \
1168c2ecf20Sopenharmony_ci	xorl RW0d, left##d; \
1178c2ecf20Sopenharmony_ci	rorl $1, right##d; \
1188c2ecf20Sopenharmony_ci	do_permutation(right##d, left##d,  8, 0x00ff00ff); \
1198c2ecf20Sopenharmony_ci	do_permutation(right##d, left##d,  2, 0x33333333); \
1208c2ecf20Sopenharmony_ci	do_permutation(left##d, right##d, 16, 0x0000ffff); \
1218c2ecf20Sopenharmony_ci	do_permutation(left##d, right##d,  4, 0x0f0f0f0f);
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci#define round1(n, from, to, load_next_key) \
1248c2ecf20Sopenharmony_ci	xorq from, RW0; \
1258c2ecf20Sopenharmony_ci	\
1268c2ecf20Sopenharmony_ci	movzbl RW0bl, RT0d; \
1278c2ecf20Sopenharmony_ci	movzbl RW0bh, RT1d; \
1288c2ecf20Sopenharmony_ci	shrq $16, RW0; \
1298c2ecf20Sopenharmony_ci	movzbl RW0bl, RT2d; \
1308c2ecf20Sopenharmony_ci	movzbl RW0bh, RT3d; \
1318c2ecf20Sopenharmony_ci	shrq $16, RW0; \
1328c2ecf20Sopenharmony_ci	movq s8(, RT0, 8), RT0; \
1338c2ecf20Sopenharmony_ci	xorq s6(, RT1, 8), to; \
1348c2ecf20Sopenharmony_ci	movzbl RW0bl, RL1d; \
1358c2ecf20Sopenharmony_ci	movzbl RW0bh, RT1d; \
1368c2ecf20Sopenharmony_ci	shrl $16, RW0d; \
1378c2ecf20Sopenharmony_ci	xorq s4(, RT2, 8), RT0; \
1388c2ecf20Sopenharmony_ci	xorq s2(, RT3, 8), to; \
1398c2ecf20Sopenharmony_ci	movzbl RW0bl, RT2d; \
1408c2ecf20Sopenharmony_ci	movzbl RW0bh, RT3d; \
1418c2ecf20Sopenharmony_ci	xorq s7(, RL1, 8), RT0; \
1428c2ecf20Sopenharmony_ci	xorq s5(, RT1, 8), to; \
1438c2ecf20Sopenharmony_ci	xorq s3(, RT2, 8), RT0; \
1448c2ecf20Sopenharmony_ci	load_next_key(n, RW0); \
1458c2ecf20Sopenharmony_ci	xorq RT0, to; \
1468c2ecf20Sopenharmony_ci	xorq s1(, RT3, 8), to; \
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_ci#define load_next_key(n, RWx) \
1498c2ecf20Sopenharmony_ci	movq (((n) + 1) * 8)(CTX), RWx;
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci#define dummy2(a, b) /*_*/
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci#define read_block(io, left, right) \
1548c2ecf20Sopenharmony_ci	movl    (io), left##d; \
1558c2ecf20Sopenharmony_ci	movl   4(io), right##d; \
1568c2ecf20Sopenharmony_ci	bswapl left##d; \
1578c2ecf20Sopenharmony_ci	bswapl right##d;
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci#define write_block(io, left, right) \
1608c2ecf20Sopenharmony_ci	bswapl left##d; \
1618c2ecf20Sopenharmony_ci	bswapl right##d; \
1628c2ecf20Sopenharmony_ci	movl   left##d,   (io); \
1638c2ecf20Sopenharmony_ci	movl   right##d, 4(io);
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ciSYM_FUNC_START(des3_ede_x86_64_crypt_blk)
1668c2ecf20Sopenharmony_ci	/* input:
1678c2ecf20Sopenharmony_ci	 *	%rdi: round keys, CTX
1688c2ecf20Sopenharmony_ci	 *	%rsi: dst
1698c2ecf20Sopenharmony_ci	 *	%rdx: src
1708c2ecf20Sopenharmony_ci	 */
1718c2ecf20Sopenharmony_ci	pushq %rbx;
1728c2ecf20Sopenharmony_ci	pushq %r12;
1738c2ecf20Sopenharmony_ci	pushq %r13;
1748c2ecf20Sopenharmony_ci	pushq %r14;
1758c2ecf20Sopenharmony_ci	pushq %r15;
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_ci	pushq %rsi; /* dst */
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_ci	read_block(%rdx, RL0, RR0);
1808c2ecf20Sopenharmony_ci	initial_permutation(RL0, RR0);
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci	movq (CTX), RW0;
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ci	round1(0, RR0, RL0, load_next_key);
1858c2ecf20Sopenharmony_ci	round1(1, RL0, RR0, load_next_key);
1868c2ecf20Sopenharmony_ci	round1(2, RR0, RL0, load_next_key);
1878c2ecf20Sopenharmony_ci	round1(3, RL0, RR0, load_next_key);
1888c2ecf20Sopenharmony_ci	round1(4, RR0, RL0, load_next_key);
1898c2ecf20Sopenharmony_ci	round1(5, RL0, RR0, load_next_key);
1908c2ecf20Sopenharmony_ci	round1(6, RR0, RL0, load_next_key);
1918c2ecf20Sopenharmony_ci	round1(7, RL0, RR0, load_next_key);
1928c2ecf20Sopenharmony_ci	round1(8, RR0, RL0, load_next_key);
1938c2ecf20Sopenharmony_ci	round1(9, RL0, RR0, load_next_key);
1948c2ecf20Sopenharmony_ci	round1(10, RR0, RL0, load_next_key);
1958c2ecf20Sopenharmony_ci	round1(11, RL0, RR0, load_next_key);
1968c2ecf20Sopenharmony_ci	round1(12, RR0, RL0, load_next_key);
1978c2ecf20Sopenharmony_ci	round1(13, RL0, RR0, load_next_key);
1988c2ecf20Sopenharmony_ci	round1(14, RR0, RL0, load_next_key);
1998c2ecf20Sopenharmony_ci	round1(15, RL0, RR0, load_next_key);
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_ci	round1(16+0, RL0, RR0, load_next_key);
2028c2ecf20Sopenharmony_ci	round1(16+1, RR0, RL0, load_next_key);
2038c2ecf20Sopenharmony_ci	round1(16+2, RL0, RR0, load_next_key);
2048c2ecf20Sopenharmony_ci	round1(16+3, RR0, RL0, load_next_key);
2058c2ecf20Sopenharmony_ci	round1(16+4, RL0, RR0, load_next_key);
2068c2ecf20Sopenharmony_ci	round1(16+5, RR0, RL0, load_next_key);
2078c2ecf20Sopenharmony_ci	round1(16+6, RL0, RR0, load_next_key);
2088c2ecf20Sopenharmony_ci	round1(16+7, RR0, RL0, load_next_key);
2098c2ecf20Sopenharmony_ci	round1(16+8, RL0, RR0, load_next_key);
2108c2ecf20Sopenharmony_ci	round1(16+9, RR0, RL0, load_next_key);
2118c2ecf20Sopenharmony_ci	round1(16+10, RL0, RR0, load_next_key);
2128c2ecf20Sopenharmony_ci	round1(16+11, RR0, RL0, load_next_key);
2138c2ecf20Sopenharmony_ci	round1(16+12, RL0, RR0, load_next_key);
2148c2ecf20Sopenharmony_ci	round1(16+13, RR0, RL0, load_next_key);
2158c2ecf20Sopenharmony_ci	round1(16+14, RL0, RR0, load_next_key);
2168c2ecf20Sopenharmony_ci	round1(16+15, RR0, RL0, load_next_key);
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci	round1(32+0, RR0, RL0, load_next_key);
2198c2ecf20Sopenharmony_ci	round1(32+1, RL0, RR0, load_next_key);
2208c2ecf20Sopenharmony_ci	round1(32+2, RR0, RL0, load_next_key);
2218c2ecf20Sopenharmony_ci	round1(32+3, RL0, RR0, load_next_key);
2228c2ecf20Sopenharmony_ci	round1(32+4, RR0, RL0, load_next_key);
2238c2ecf20Sopenharmony_ci	round1(32+5, RL0, RR0, load_next_key);
2248c2ecf20Sopenharmony_ci	round1(32+6, RR0, RL0, load_next_key);
2258c2ecf20Sopenharmony_ci	round1(32+7, RL0, RR0, load_next_key);
2268c2ecf20Sopenharmony_ci	round1(32+8, RR0, RL0, load_next_key);
2278c2ecf20Sopenharmony_ci	round1(32+9, RL0, RR0, load_next_key);
2288c2ecf20Sopenharmony_ci	round1(32+10, RR0, RL0, load_next_key);
2298c2ecf20Sopenharmony_ci	round1(32+11, RL0, RR0, load_next_key);
2308c2ecf20Sopenharmony_ci	round1(32+12, RR0, RL0, load_next_key);
2318c2ecf20Sopenharmony_ci	round1(32+13, RL0, RR0, load_next_key);
2328c2ecf20Sopenharmony_ci	round1(32+14, RR0, RL0, load_next_key);
2338c2ecf20Sopenharmony_ci	round1(32+15, RL0, RR0, dummy2);
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci	final_permutation(RR0, RL0);
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci	popq %rsi /* dst */
2388c2ecf20Sopenharmony_ci	write_block(%rsi, RR0, RL0);
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_ci	popq %r15;
2418c2ecf20Sopenharmony_ci	popq %r14;
2428c2ecf20Sopenharmony_ci	popq %r13;
2438c2ecf20Sopenharmony_ci	popq %r12;
2448c2ecf20Sopenharmony_ci	popq %rbx;
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci	RET;
2478c2ecf20Sopenharmony_ciSYM_FUNC_END(des3_ede_x86_64_crypt_blk)
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_ci/***********************************************************************
2508c2ecf20Sopenharmony_ci * 3-way 3DES
2518c2ecf20Sopenharmony_ci ***********************************************************************/
2528c2ecf20Sopenharmony_ci#define expand_to_64bits(val, mask) \
2538c2ecf20Sopenharmony_ci	movl val##d, RT0d; \
2548c2ecf20Sopenharmony_ci	rorl $4, RT0d; \
2558c2ecf20Sopenharmony_ci	shlq $32, RT0; \
2568c2ecf20Sopenharmony_ci	orq RT0, val; \
2578c2ecf20Sopenharmony_ci	andq mask, val;
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ci#define compress_to_64bits(val) \
2608c2ecf20Sopenharmony_ci	movq val, RT0; \
2618c2ecf20Sopenharmony_ci	shrq $32, RT0; \
2628c2ecf20Sopenharmony_ci	roll $4, RT0d; \
2638c2ecf20Sopenharmony_ci	orl RT0d, val##d;
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_ci#define initial_permutation3(left, right) \
2668c2ecf20Sopenharmony_ci	do_permutation(left##0d, right##0d,  4, 0x0f0f0f0f); \
2678c2ecf20Sopenharmony_ci	do_permutation(left##0d, right##0d, 16, 0x0000ffff); \
2688c2ecf20Sopenharmony_ci	  do_permutation(left##1d, right##1d,  4, 0x0f0f0f0f); \
2698c2ecf20Sopenharmony_ci	  do_permutation(left##1d, right##1d, 16, 0x0000ffff); \
2708c2ecf20Sopenharmony_ci	    do_permutation(left##2d, right##2d,  4, 0x0f0f0f0f); \
2718c2ecf20Sopenharmony_ci	    do_permutation(left##2d, right##2d, 16, 0x0000ffff); \
2728c2ecf20Sopenharmony_ci	    \
2738c2ecf20Sopenharmony_ci	do_permutation(right##0d, left##0d,  2, 0x33333333); \
2748c2ecf20Sopenharmony_ci	do_permutation(right##0d, left##0d,  8, 0x00ff00ff); \
2758c2ecf20Sopenharmony_ci	  do_permutation(right##1d, left##1d,  2, 0x33333333); \
2768c2ecf20Sopenharmony_ci	  do_permutation(right##1d, left##1d,  8, 0x00ff00ff); \
2778c2ecf20Sopenharmony_ci	    do_permutation(right##2d, left##2d,  2, 0x33333333); \
2788c2ecf20Sopenharmony_ci	    do_permutation(right##2d, left##2d,  8, 0x00ff00ff); \
2798c2ecf20Sopenharmony_ci	    \
2808c2ecf20Sopenharmony_ci	movabs $0x3f3f3f3f3f3f3f3f, RT3; \
2818c2ecf20Sopenharmony_ci	    \
2828c2ecf20Sopenharmony_ci	movl left##0d, RW0d; \
2838c2ecf20Sopenharmony_ci	roll $1, right##0d; \
2848c2ecf20Sopenharmony_ci	xorl right##0d, RW0d; \
2858c2ecf20Sopenharmony_ci	andl $0xaaaaaaaa, RW0d; \
2868c2ecf20Sopenharmony_ci	xorl RW0d, left##0d; \
2878c2ecf20Sopenharmony_ci	xorl RW0d, right##0d; \
2888c2ecf20Sopenharmony_ci	roll $1, left##0d; \
2898c2ecf20Sopenharmony_ci	expand_to_64bits(right##0, RT3); \
2908c2ecf20Sopenharmony_ci	expand_to_64bits(left##0, RT3); \
2918c2ecf20Sopenharmony_ci	  movl left##1d, RW1d; \
2928c2ecf20Sopenharmony_ci	  roll $1, right##1d; \
2938c2ecf20Sopenharmony_ci	  xorl right##1d, RW1d; \
2948c2ecf20Sopenharmony_ci	  andl $0xaaaaaaaa, RW1d; \
2958c2ecf20Sopenharmony_ci	  xorl RW1d, left##1d; \
2968c2ecf20Sopenharmony_ci	  xorl RW1d, right##1d; \
2978c2ecf20Sopenharmony_ci	  roll $1, left##1d; \
2988c2ecf20Sopenharmony_ci	  expand_to_64bits(right##1, RT3); \
2998c2ecf20Sopenharmony_ci	  expand_to_64bits(left##1, RT3); \
3008c2ecf20Sopenharmony_ci	    movl left##2d, RW2d; \
3018c2ecf20Sopenharmony_ci	    roll $1, right##2d; \
3028c2ecf20Sopenharmony_ci	    xorl right##2d, RW2d; \
3038c2ecf20Sopenharmony_ci	    andl $0xaaaaaaaa, RW2d; \
3048c2ecf20Sopenharmony_ci	    xorl RW2d, left##2d; \
3058c2ecf20Sopenharmony_ci	    xorl RW2d, right##2d; \
3068c2ecf20Sopenharmony_ci	    roll $1, left##2d; \
3078c2ecf20Sopenharmony_ci	    expand_to_64bits(right##2, RT3); \
3088c2ecf20Sopenharmony_ci	    expand_to_64bits(left##2, RT3);
3098c2ecf20Sopenharmony_ci
3108c2ecf20Sopenharmony_ci#define final_permutation3(left, right) \
3118c2ecf20Sopenharmony_ci	compress_to_64bits(right##0); \
3128c2ecf20Sopenharmony_ci	compress_to_64bits(left##0); \
3138c2ecf20Sopenharmony_ci	movl right##0d, RW0d; \
3148c2ecf20Sopenharmony_ci	rorl $1, left##0d; \
3158c2ecf20Sopenharmony_ci	xorl left##0d, RW0d; \
3168c2ecf20Sopenharmony_ci	andl $0xaaaaaaaa, RW0d; \
3178c2ecf20Sopenharmony_ci	xorl RW0d, right##0d; \
3188c2ecf20Sopenharmony_ci	xorl RW0d, left##0d; \
3198c2ecf20Sopenharmony_ci	rorl $1, right##0d; \
3208c2ecf20Sopenharmony_ci	  compress_to_64bits(right##1); \
3218c2ecf20Sopenharmony_ci	  compress_to_64bits(left##1); \
3228c2ecf20Sopenharmony_ci	  movl right##1d, RW1d; \
3238c2ecf20Sopenharmony_ci	  rorl $1, left##1d; \
3248c2ecf20Sopenharmony_ci	  xorl left##1d, RW1d; \
3258c2ecf20Sopenharmony_ci	  andl $0xaaaaaaaa, RW1d; \
3268c2ecf20Sopenharmony_ci	  xorl RW1d, right##1d; \
3278c2ecf20Sopenharmony_ci	  xorl RW1d, left##1d; \
3288c2ecf20Sopenharmony_ci	  rorl $1, right##1d; \
3298c2ecf20Sopenharmony_ci	    compress_to_64bits(right##2); \
3308c2ecf20Sopenharmony_ci	    compress_to_64bits(left##2); \
3318c2ecf20Sopenharmony_ci	    movl right##2d, RW2d; \
3328c2ecf20Sopenharmony_ci	    rorl $1, left##2d; \
3338c2ecf20Sopenharmony_ci	    xorl left##2d, RW2d; \
3348c2ecf20Sopenharmony_ci	    andl $0xaaaaaaaa, RW2d; \
3358c2ecf20Sopenharmony_ci	    xorl RW2d, right##2d; \
3368c2ecf20Sopenharmony_ci	    xorl RW2d, left##2d; \
3378c2ecf20Sopenharmony_ci	    rorl $1, right##2d; \
3388c2ecf20Sopenharmony_ci	    \
3398c2ecf20Sopenharmony_ci	do_permutation(right##0d, left##0d,  8, 0x00ff00ff); \
3408c2ecf20Sopenharmony_ci	do_permutation(right##0d, left##0d,  2, 0x33333333); \
3418c2ecf20Sopenharmony_ci	  do_permutation(right##1d, left##1d,  8, 0x00ff00ff); \
3428c2ecf20Sopenharmony_ci	  do_permutation(right##1d, left##1d,  2, 0x33333333); \
3438c2ecf20Sopenharmony_ci	    do_permutation(right##2d, left##2d,  8, 0x00ff00ff); \
3448c2ecf20Sopenharmony_ci	    do_permutation(right##2d, left##2d,  2, 0x33333333); \
3458c2ecf20Sopenharmony_ci	    \
3468c2ecf20Sopenharmony_ci	do_permutation(left##0d, right##0d, 16, 0x0000ffff); \
3478c2ecf20Sopenharmony_ci	do_permutation(left##0d, right##0d,  4, 0x0f0f0f0f); \
3488c2ecf20Sopenharmony_ci	  do_permutation(left##1d, right##1d, 16, 0x0000ffff); \
3498c2ecf20Sopenharmony_ci	  do_permutation(left##1d, right##1d,  4, 0x0f0f0f0f); \
3508c2ecf20Sopenharmony_ci	    do_permutation(left##2d, right##2d, 16, 0x0000ffff); \
3518c2ecf20Sopenharmony_ci	    do_permutation(left##2d, right##2d,  4, 0x0f0f0f0f);
3528c2ecf20Sopenharmony_ci
3538c2ecf20Sopenharmony_ci#define round3(n, from, to, load_next_key, do_movq) \
3548c2ecf20Sopenharmony_ci	xorq from##0, RW0; \
3558c2ecf20Sopenharmony_ci	movzbl RW0bl, RT3d; \
3568c2ecf20Sopenharmony_ci	movzbl RW0bh, RT1d; \
3578c2ecf20Sopenharmony_ci	shrq $16, RW0; \
3588c2ecf20Sopenharmony_ci	xorq s8(, RT3, 8), to##0; \
3598c2ecf20Sopenharmony_ci	xorq s6(, RT1, 8), to##0; \
3608c2ecf20Sopenharmony_ci	movzbl RW0bl, RT3d; \
3618c2ecf20Sopenharmony_ci	movzbl RW0bh, RT1d; \
3628c2ecf20Sopenharmony_ci	shrq $16, RW0; \
3638c2ecf20Sopenharmony_ci	xorq s4(, RT3, 8), to##0; \
3648c2ecf20Sopenharmony_ci	xorq s2(, RT1, 8), to##0; \
3658c2ecf20Sopenharmony_ci	movzbl RW0bl, RT3d; \
3668c2ecf20Sopenharmony_ci	movzbl RW0bh, RT1d; \
3678c2ecf20Sopenharmony_ci	shrl $16, RW0d; \
3688c2ecf20Sopenharmony_ci	xorq s7(, RT3, 8), to##0; \
3698c2ecf20Sopenharmony_ci	xorq s5(, RT1, 8), to##0; \
3708c2ecf20Sopenharmony_ci	movzbl RW0bl, RT3d; \
3718c2ecf20Sopenharmony_ci	movzbl RW0bh, RT1d; \
3728c2ecf20Sopenharmony_ci	load_next_key(n, RW0); \
3738c2ecf20Sopenharmony_ci	xorq s3(, RT3, 8), to##0; \
3748c2ecf20Sopenharmony_ci	xorq s1(, RT1, 8), to##0; \
3758c2ecf20Sopenharmony_ci		xorq from##1, RW1; \
3768c2ecf20Sopenharmony_ci		movzbl RW1bl, RT3d; \
3778c2ecf20Sopenharmony_ci		movzbl RW1bh, RT1d; \
3788c2ecf20Sopenharmony_ci		shrq $16, RW1; \
3798c2ecf20Sopenharmony_ci		xorq s8(, RT3, 8), to##1; \
3808c2ecf20Sopenharmony_ci		xorq s6(, RT1, 8), to##1; \
3818c2ecf20Sopenharmony_ci		movzbl RW1bl, RT3d; \
3828c2ecf20Sopenharmony_ci		movzbl RW1bh, RT1d; \
3838c2ecf20Sopenharmony_ci		shrq $16, RW1; \
3848c2ecf20Sopenharmony_ci		xorq s4(, RT3, 8), to##1; \
3858c2ecf20Sopenharmony_ci		xorq s2(, RT1, 8), to##1; \
3868c2ecf20Sopenharmony_ci		movzbl RW1bl, RT3d; \
3878c2ecf20Sopenharmony_ci		movzbl RW1bh, RT1d; \
3888c2ecf20Sopenharmony_ci		shrl $16, RW1d; \
3898c2ecf20Sopenharmony_ci		xorq s7(, RT3, 8), to##1; \
3908c2ecf20Sopenharmony_ci		xorq s5(, RT1, 8), to##1; \
3918c2ecf20Sopenharmony_ci		movzbl RW1bl, RT3d; \
3928c2ecf20Sopenharmony_ci		movzbl RW1bh, RT1d; \
3938c2ecf20Sopenharmony_ci		do_movq(RW0, RW1); \
3948c2ecf20Sopenharmony_ci		xorq s3(, RT3, 8), to##1; \
3958c2ecf20Sopenharmony_ci		xorq s1(, RT1, 8), to##1; \
3968c2ecf20Sopenharmony_ci			xorq from##2, RW2; \
3978c2ecf20Sopenharmony_ci			movzbl RW2bl, RT3d; \
3988c2ecf20Sopenharmony_ci			movzbl RW2bh, RT1d; \
3998c2ecf20Sopenharmony_ci			shrq $16, RW2; \
4008c2ecf20Sopenharmony_ci			xorq s8(, RT3, 8), to##2; \
4018c2ecf20Sopenharmony_ci			xorq s6(, RT1, 8), to##2; \
4028c2ecf20Sopenharmony_ci			movzbl RW2bl, RT3d; \
4038c2ecf20Sopenharmony_ci			movzbl RW2bh, RT1d; \
4048c2ecf20Sopenharmony_ci			shrq $16, RW2; \
4058c2ecf20Sopenharmony_ci			xorq s4(, RT3, 8), to##2; \
4068c2ecf20Sopenharmony_ci			xorq s2(, RT1, 8), to##2; \
4078c2ecf20Sopenharmony_ci			movzbl RW2bl, RT3d; \
4088c2ecf20Sopenharmony_ci			movzbl RW2bh, RT1d; \
4098c2ecf20Sopenharmony_ci			shrl $16, RW2d; \
4108c2ecf20Sopenharmony_ci			xorq s7(, RT3, 8), to##2; \
4118c2ecf20Sopenharmony_ci			xorq s5(, RT1, 8), to##2; \
4128c2ecf20Sopenharmony_ci			movzbl RW2bl, RT3d; \
4138c2ecf20Sopenharmony_ci			movzbl RW2bh, RT1d; \
4148c2ecf20Sopenharmony_ci			do_movq(RW0, RW2); \
4158c2ecf20Sopenharmony_ci			xorq s3(, RT3, 8), to##2; \
4168c2ecf20Sopenharmony_ci			xorq s1(, RT1, 8), to##2;
4178c2ecf20Sopenharmony_ci
4188c2ecf20Sopenharmony_ci#define __movq(src, dst) \
4198c2ecf20Sopenharmony_ci	movq src, dst;
4208c2ecf20Sopenharmony_ci
4218c2ecf20Sopenharmony_ciSYM_FUNC_START(des3_ede_x86_64_crypt_blk_3way)
4228c2ecf20Sopenharmony_ci	/* input:
4238c2ecf20Sopenharmony_ci	 *	%rdi: ctx, round keys
4248c2ecf20Sopenharmony_ci	 *	%rsi: dst (3 blocks)
4258c2ecf20Sopenharmony_ci	 *	%rdx: src (3 blocks)
4268c2ecf20Sopenharmony_ci	 */
4278c2ecf20Sopenharmony_ci
4288c2ecf20Sopenharmony_ci	pushq %rbx;
4298c2ecf20Sopenharmony_ci	pushq %r12;
4308c2ecf20Sopenharmony_ci	pushq %r13;
4318c2ecf20Sopenharmony_ci	pushq %r14;
4328c2ecf20Sopenharmony_ci	pushq %r15;
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ci	pushq %rsi /* dst */
4358c2ecf20Sopenharmony_ci
4368c2ecf20Sopenharmony_ci	/* load input */
4378c2ecf20Sopenharmony_ci	movl 0 * 4(%rdx), RL0d;
4388c2ecf20Sopenharmony_ci	movl 1 * 4(%rdx), RR0d;
4398c2ecf20Sopenharmony_ci	movl 2 * 4(%rdx), RL1d;
4408c2ecf20Sopenharmony_ci	movl 3 * 4(%rdx), RR1d;
4418c2ecf20Sopenharmony_ci	movl 4 * 4(%rdx), RL2d;
4428c2ecf20Sopenharmony_ci	movl 5 * 4(%rdx), RR2d;
4438c2ecf20Sopenharmony_ci
4448c2ecf20Sopenharmony_ci	bswapl RL0d;
4458c2ecf20Sopenharmony_ci	bswapl RR0d;
4468c2ecf20Sopenharmony_ci	bswapl RL1d;
4478c2ecf20Sopenharmony_ci	bswapl RR1d;
4488c2ecf20Sopenharmony_ci	bswapl RL2d;
4498c2ecf20Sopenharmony_ci	bswapl RR2d;
4508c2ecf20Sopenharmony_ci
4518c2ecf20Sopenharmony_ci	initial_permutation3(RL, RR);
4528c2ecf20Sopenharmony_ci
4538c2ecf20Sopenharmony_ci	movq 0(CTX), RW0;
4548c2ecf20Sopenharmony_ci	movq RW0, RW1;
4558c2ecf20Sopenharmony_ci	movq RW0, RW2;
4568c2ecf20Sopenharmony_ci
4578c2ecf20Sopenharmony_ci	round3(0, RR, RL, load_next_key, __movq);
4588c2ecf20Sopenharmony_ci	round3(1, RL, RR, load_next_key, __movq);
4598c2ecf20Sopenharmony_ci	round3(2, RR, RL, load_next_key, __movq);
4608c2ecf20Sopenharmony_ci	round3(3, RL, RR, load_next_key, __movq);
4618c2ecf20Sopenharmony_ci	round3(4, RR, RL, load_next_key, __movq);
4628c2ecf20Sopenharmony_ci	round3(5, RL, RR, load_next_key, __movq);
4638c2ecf20Sopenharmony_ci	round3(6, RR, RL, load_next_key, __movq);
4648c2ecf20Sopenharmony_ci	round3(7, RL, RR, load_next_key, __movq);
4658c2ecf20Sopenharmony_ci	round3(8, RR, RL, load_next_key, __movq);
4668c2ecf20Sopenharmony_ci	round3(9, RL, RR, load_next_key, __movq);
4678c2ecf20Sopenharmony_ci	round3(10, RR, RL, load_next_key, __movq);
4688c2ecf20Sopenharmony_ci	round3(11, RL, RR, load_next_key, __movq);
4698c2ecf20Sopenharmony_ci	round3(12, RR, RL, load_next_key, __movq);
4708c2ecf20Sopenharmony_ci	round3(13, RL, RR, load_next_key, __movq);
4718c2ecf20Sopenharmony_ci	round3(14, RR, RL, load_next_key, __movq);
4728c2ecf20Sopenharmony_ci	round3(15, RL, RR, load_next_key, __movq);
4738c2ecf20Sopenharmony_ci
4748c2ecf20Sopenharmony_ci	round3(16+0, RL, RR, load_next_key, __movq);
4758c2ecf20Sopenharmony_ci	round3(16+1, RR, RL, load_next_key, __movq);
4768c2ecf20Sopenharmony_ci	round3(16+2, RL, RR, load_next_key, __movq);
4778c2ecf20Sopenharmony_ci	round3(16+3, RR, RL, load_next_key, __movq);
4788c2ecf20Sopenharmony_ci	round3(16+4, RL, RR, load_next_key, __movq);
4798c2ecf20Sopenharmony_ci	round3(16+5, RR, RL, load_next_key, __movq);
4808c2ecf20Sopenharmony_ci	round3(16+6, RL, RR, load_next_key, __movq);
4818c2ecf20Sopenharmony_ci	round3(16+7, RR, RL, load_next_key, __movq);
4828c2ecf20Sopenharmony_ci	round3(16+8, RL, RR, load_next_key, __movq);
4838c2ecf20Sopenharmony_ci	round3(16+9, RR, RL, load_next_key, __movq);
4848c2ecf20Sopenharmony_ci	round3(16+10, RL, RR, load_next_key, __movq);
4858c2ecf20Sopenharmony_ci	round3(16+11, RR, RL, load_next_key, __movq);
4868c2ecf20Sopenharmony_ci	round3(16+12, RL, RR, load_next_key, __movq);
4878c2ecf20Sopenharmony_ci	round3(16+13, RR, RL, load_next_key, __movq);
4888c2ecf20Sopenharmony_ci	round3(16+14, RL, RR, load_next_key, __movq);
4898c2ecf20Sopenharmony_ci	round3(16+15, RR, RL, load_next_key, __movq);
4908c2ecf20Sopenharmony_ci
4918c2ecf20Sopenharmony_ci	round3(32+0, RR, RL, load_next_key, __movq);
4928c2ecf20Sopenharmony_ci	round3(32+1, RL, RR, load_next_key, __movq);
4938c2ecf20Sopenharmony_ci	round3(32+2, RR, RL, load_next_key, __movq);
4948c2ecf20Sopenharmony_ci	round3(32+3, RL, RR, load_next_key, __movq);
4958c2ecf20Sopenharmony_ci	round3(32+4, RR, RL, load_next_key, __movq);
4968c2ecf20Sopenharmony_ci	round3(32+5, RL, RR, load_next_key, __movq);
4978c2ecf20Sopenharmony_ci	round3(32+6, RR, RL, load_next_key, __movq);
4988c2ecf20Sopenharmony_ci	round3(32+7, RL, RR, load_next_key, __movq);
4998c2ecf20Sopenharmony_ci	round3(32+8, RR, RL, load_next_key, __movq);
5008c2ecf20Sopenharmony_ci	round3(32+9, RL, RR, load_next_key, __movq);
5018c2ecf20Sopenharmony_ci	round3(32+10, RR, RL, load_next_key, __movq);
5028c2ecf20Sopenharmony_ci	round3(32+11, RL, RR, load_next_key, __movq);
5038c2ecf20Sopenharmony_ci	round3(32+12, RR, RL, load_next_key, __movq);
5048c2ecf20Sopenharmony_ci	round3(32+13, RL, RR, load_next_key, __movq);
5058c2ecf20Sopenharmony_ci	round3(32+14, RR, RL, load_next_key, __movq);
5068c2ecf20Sopenharmony_ci	round3(32+15, RL, RR, dummy2, dummy2);
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_ci	final_permutation3(RR, RL);
5098c2ecf20Sopenharmony_ci
5108c2ecf20Sopenharmony_ci	bswapl RR0d;
5118c2ecf20Sopenharmony_ci	bswapl RL0d;
5128c2ecf20Sopenharmony_ci	bswapl RR1d;
5138c2ecf20Sopenharmony_ci	bswapl RL1d;
5148c2ecf20Sopenharmony_ci	bswapl RR2d;
5158c2ecf20Sopenharmony_ci	bswapl RL2d;
5168c2ecf20Sopenharmony_ci
5178c2ecf20Sopenharmony_ci	popq %rsi /* dst */
5188c2ecf20Sopenharmony_ci	movl RR0d, 0 * 4(%rsi);
5198c2ecf20Sopenharmony_ci	movl RL0d, 1 * 4(%rsi);
5208c2ecf20Sopenharmony_ci	movl RR1d, 2 * 4(%rsi);
5218c2ecf20Sopenharmony_ci	movl RL1d, 3 * 4(%rsi);
5228c2ecf20Sopenharmony_ci	movl RR2d, 4 * 4(%rsi);
5238c2ecf20Sopenharmony_ci	movl RL2d, 5 * 4(%rsi);
5248c2ecf20Sopenharmony_ci
5258c2ecf20Sopenharmony_ci	popq %r15;
5268c2ecf20Sopenharmony_ci	popq %r14;
5278c2ecf20Sopenharmony_ci	popq %r13;
5288c2ecf20Sopenharmony_ci	popq %r12;
5298c2ecf20Sopenharmony_ci	popq %rbx;
5308c2ecf20Sopenharmony_ci
5318c2ecf20Sopenharmony_ci	RET;
5328c2ecf20Sopenharmony_ciSYM_FUNC_END(des3_ede_x86_64_crypt_blk_3way)
5338c2ecf20Sopenharmony_ci
5348c2ecf20Sopenharmony_ci.section	.rodata, "a", @progbits
5358c2ecf20Sopenharmony_ci.align 16
5368c2ecf20Sopenharmony_ci.L_s1:
5378c2ecf20Sopenharmony_ci	.quad 0x0010100001010400, 0x0000000000000000
5388c2ecf20Sopenharmony_ci	.quad 0x0000100000010000, 0x0010100001010404
5398c2ecf20Sopenharmony_ci	.quad 0x0010100001010004, 0x0000100000010404
5408c2ecf20Sopenharmony_ci	.quad 0x0000000000000004, 0x0000100000010000
5418c2ecf20Sopenharmony_ci	.quad 0x0000000000000400, 0x0010100001010400
5428c2ecf20Sopenharmony_ci	.quad 0x0010100001010404, 0x0000000000000400
5438c2ecf20Sopenharmony_ci	.quad 0x0010000001000404, 0x0010100001010004
5448c2ecf20Sopenharmony_ci	.quad 0x0010000001000000, 0x0000000000000004
5458c2ecf20Sopenharmony_ci	.quad 0x0000000000000404, 0x0010000001000400
5468c2ecf20Sopenharmony_ci	.quad 0x0010000001000400, 0x0000100000010400
5478c2ecf20Sopenharmony_ci	.quad 0x0000100000010400, 0x0010100001010000
5488c2ecf20Sopenharmony_ci	.quad 0x0010100001010000, 0x0010000001000404
5498c2ecf20Sopenharmony_ci	.quad 0x0000100000010004, 0x0010000001000004
5508c2ecf20Sopenharmony_ci	.quad 0x0010000001000004, 0x0000100000010004
5518c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0000000000000404
5528c2ecf20Sopenharmony_ci	.quad 0x0000100000010404, 0x0010000001000000
5538c2ecf20Sopenharmony_ci	.quad 0x0000100000010000, 0x0010100001010404
5548c2ecf20Sopenharmony_ci	.quad 0x0000000000000004, 0x0010100001010000
5558c2ecf20Sopenharmony_ci	.quad 0x0010100001010400, 0x0010000001000000
5568c2ecf20Sopenharmony_ci	.quad 0x0010000001000000, 0x0000000000000400
5578c2ecf20Sopenharmony_ci	.quad 0x0010100001010004, 0x0000100000010000
5588c2ecf20Sopenharmony_ci	.quad 0x0000100000010400, 0x0010000001000004
5598c2ecf20Sopenharmony_ci	.quad 0x0000000000000400, 0x0000000000000004
5608c2ecf20Sopenharmony_ci	.quad 0x0010000001000404, 0x0000100000010404
5618c2ecf20Sopenharmony_ci	.quad 0x0010100001010404, 0x0000100000010004
5628c2ecf20Sopenharmony_ci	.quad 0x0010100001010000, 0x0010000001000404
5638c2ecf20Sopenharmony_ci	.quad 0x0010000001000004, 0x0000000000000404
5648c2ecf20Sopenharmony_ci	.quad 0x0000100000010404, 0x0010100001010400
5658c2ecf20Sopenharmony_ci	.quad 0x0000000000000404, 0x0010000001000400
5668c2ecf20Sopenharmony_ci	.quad 0x0010000001000400, 0x0000000000000000
5678c2ecf20Sopenharmony_ci	.quad 0x0000100000010004, 0x0000100000010400
5688c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0010100001010004
5698c2ecf20Sopenharmony_ci.L_s2:
5708c2ecf20Sopenharmony_ci	.quad 0x0801080200100020, 0x0800080000000000
5718c2ecf20Sopenharmony_ci	.quad 0x0000080000000000, 0x0001080200100020
5728c2ecf20Sopenharmony_ci	.quad 0x0001000000100000, 0x0000000200000020
5738c2ecf20Sopenharmony_ci	.quad 0x0801000200100020, 0x0800080200000020
5748c2ecf20Sopenharmony_ci	.quad 0x0800000200000020, 0x0801080200100020
5758c2ecf20Sopenharmony_ci	.quad 0x0801080000100000, 0x0800000000000000
5768c2ecf20Sopenharmony_ci	.quad 0x0800080000000000, 0x0001000000100000
5778c2ecf20Sopenharmony_ci	.quad 0x0000000200000020, 0x0801000200100020
5788c2ecf20Sopenharmony_ci	.quad 0x0001080000100000, 0x0001000200100020
5798c2ecf20Sopenharmony_ci	.quad 0x0800080200000020, 0x0000000000000000
5808c2ecf20Sopenharmony_ci	.quad 0x0800000000000000, 0x0000080000000000
5818c2ecf20Sopenharmony_ci	.quad 0x0001080200100020, 0x0801000000100000
5828c2ecf20Sopenharmony_ci	.quad 0x0001000200100020, 0x0800000200000020
5838c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0001080000100000
5848c2ecf20Sopenharmony_ci	.quad 0x0000080200000020, 0x0801080000100000
5858c2ecf20Sopenharmony_ci	.quad 0x0801000000100000, 0x0000080200000020
5868c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0001080200100020
5878c2ecf20Sopenharmony_ci	.quad 0x0801000200100020, 0x0001000000100000
5888c2ecf20Sopenharmony_ci	.quad 0x0800080200000020, 0x0801000000100000
5898c2ecf20Sopenharmony_ci	.quad 0x0801080000100000, 0x0000080000000000
5908c2ecf20Sopenharmony_ci	.quad 0x0801000000100000, 0x0800080000000000
5918c2ecf20Sopenharmony_ci	.quad 0x0000000200000020, 0x0801080200100020
5928c2ecf20Sopenharmony_ci	.quad 0x0001080200100020, 0x0000000200000020
5938c2ecf20Sopenharmony_ci	.quad 0x0000080000000000, 0x0800000000000000
5948c2ecf20Sopenharmony_ci	.quad 0x0000080200000020, 0x0801080000100000
5958c2ecf20Sopenharmony_ci	.quad 0x0001000000100000, 0x0800000200000020
5968c2ecf20Sopenharmony_ci	.quad 0x0001000200100020, 0x0800080200000020
5978c2ecf20Sopenharmony_ci	.quad 0x0800000200000020, 0x0001000200100020
5988c2ecf20Sopenharmony_ci	.quad 0x0001080000100000, 0x0000000000000000
5998c2ecf20Sopenharmony_ci	.quad 0x0800080000000000, 0x0000080200000020
6008c2ecf20Sopenharmony_ci	.quad 0x0800000000000000, 0x0801000200100020
6018c2ecf20Sopenharmony_ci	.quad 0x0801080200100020, 0x0001080000100000
6028c2ecf20Sopenharmony_ci.L_s3:
6038c2ecf20Sopenharmony_ci	.quad 0x0000002000000208, 0x0000202008020200
6048c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0000200008020008
6058c2ecf20Sopenharmony_ci	.quad 0x0000002008000200, 0x0000000000000000
6068c2ecf20Sopenharmony_ci	.quad 0x0000202000020208, 0x0000002008000200
6078c2ecf20Sopenharmony_ci	.quad 0x0000200000020008, 0x0000000008000008
6088c2ecf20Sopenharmony_ci	.quad 0x0000000008000008, 0x0000200000020000
6098c2ecf20Sopenharmony_ci	.quad 0x0000202008020208, 0x0000200000020008
6108c2ecf20Sopenharmony_ci	.quad 0x0000200008020000, 0x0000002000000208
6118c2ecf20Sopenharmony_ci	.quad 0x0000000008000000, 0x0000000000000008
6128c2ecf20Sopenharmony_ci	.quad 0x0000202008020200, 0x0000002000000200
6138c2ecf20Sopenharmony_ci	.quad 0x0000202000020200, 0x0000200008020000
6148c2ecf20Sopenharmony_ci	.quad 0x0000200008020008, 0x0000202000020208
6158c2ecf20Sopenharmony_ci	.quad 0x0000002008000208, 0x0000202000020200
6168c2ecf20Sopenharmony_ci	.quad 0x0000200000020000, 0x0000002008000208
6178c2ecf20Sopenharmony_ci	.quad 0x0000000000000008, 0x0000202008020208
6188c2ecf20Sopenharmony_ci	.quad 0x0000002000000200, 0x0000000008000000
6198c2ecf20Sopenharmony_ci	.quad 0x0000202008020200, 0x0000000008000000
6208c2ecf20Sopenharmony_ci	.quad 0x0000200000020008, 0x0000002000000208
6218c2ecf20Sopenharmony_ci	.quad 0x0000200000020000, 0x0000202008020200
6228c2ecf20Sopenharmony_ci	.quad 0x0000002008000200, 0x0000000000000000
6238c2ecf20Sopenharmony_ci	.quad 0x0000002000000200, 0x0000200000020008
6248c2ecf20Sopenharmony_ci	.quad 0x0000202008020208, 0x0000002008000200
6258c2ecf20Sopenharmony_ci	.quad 0x0000000008000008, 0x0000002000000200
6268c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0000200008020008
6278c2ecf20Sopenharmony_ci	.quad 0x0000002008000208, 0x0000200000020000
6288c2ecf20Sopenharmony_ci	.quad 0x0000000008000000, 0x0000202008020208
6298c2ecf20Sopenharmony_ci	.quad 0x0000000000000008, 0x0000202000020208
6308c2ecf20Sopenharmony_ci	.quad 0x0000202000020200, 0x0000000008000008
6318c2ecf20Sopenharmony_ci	.quad 0x0000200008020000, 0x0000002008000208
6328c2ecf20Sopenharmony_ci	.quad 0x0000002000000208, 0x0000200008020000
6338c2ecf20Sopenharmony_ci	.quad 0x0000202000020208, 0x0000000000000008
6348c2ecf20Sopenharmony_ci	.quad 0x0000200008020008, 0x0000202000020200
6358c2ecf20Sopenharmony_ci.L_s4:
6368c2ecf20Sopenharmony_ci	.quad 0x1008020000002001, 0x1000020800002001
6378c2ecf20Sopenharmony_ci	.quad 0x1000020800002001, 0x0000000800000000
6388c2ecf20Sopenharmony_ci	.quad 0x0008020800002000, 0x1008000800000001
6398c2ecf20Sopenharmony_ci	.quad 0x1008000000000001, 0x1000020000002001
6408c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0008020000002000
6418c2ecf20Sopenharmony_ci	.quad 0x0008020000002000, 0x1008020800002001
6428c2ecf20Sopenharmony_ci	.quad 0x1000000800000001, 0x0000000000000000
6438c2ecf20Sopenharmony_ci	.quad 0x0008000800000000, 0x1008000000000001
6448c2ecf20Sopenharmony_ci	.quad 0x1000000000000001, 0x0000020000002000
6458c2ecf20Sopenharmony_ci	.quad 0x0008000000000000, 0x1008020000002001
6468c2ecf20Sopenharmony_ci	.quad 0x0000000800000000, 0x0008000000000000
6478c2ecf20Sopenharmony_ci	.quad 0x1000020000002001, 0x0000020800002000
6488c2ecf20Sopenharmony_ci	.quad 0x1008000800000001, 0x1000000000000001
6498c2ecf20Sopenharmony_ci	.quad 0x0000020800002000, 0x0008000800000000
6508c2ecf20Sopenharmony_ci	.quad 0x0000020000002000, 0x0008020800002000
6518c2ecf20Sopenharmony_ci	.quad 0x1008020800002001, 0x1000000800000001
6528c2ecf20Sopenharmony_ci	.quad 0x0008000800000000, 0x1008000000000001
6538c2ecf20Sopenharmony_ci	.quad 0x0008020000002000, 0x1008020800002001
6548c2ecf20Sopenharmony_ci	.quad 0x1000000800000001, 0x0000000000000000
6558c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0008020000002000
6568c2ecf20Sopenharmony_ci	.quad 0x0000020800002000, 0x0008000800000000
6578c2ecf20Sopenharmony_ci	.quad 0x1008000800000001, 0x1000000000000001
6588c2ecf20Sopenharmony_ci	.quad 0x1008020000002001, 0x1000020800002001
6598c2ecf20Sopenharmony_ci	.quad 0x1000020800002001, 0x0000000800000000
6608c2ecf20Sopenharmony_ci	.quad 0x1008020800002001, 0x1000000800000001
6618c2ecf20Sopenharmony_ci	.quad 0x1000000000000001, 0x0000020000002000
6628c2ecf20Sopenharmony_ci	.quad 0x1008000000000001, 0x1000020000002001
6638c2ecf20Sopenharmony_ci	.quad 0x0008020800002000, 0x1008000800000001
6648c2ecf20Sopenharmony_ci	.quad 0x1000020000002001, 0x0000020800002000
6658c2ecf20Sopenharmony_ci	.quad 0x0008000000000000, 0x1008020000002001
6668c2ecf20Sopenharmony_ci	.quad 0x0000000800000000, 0x0008000000000000
6678c2ecf20Sopenharmony_ci	.quad 0x0000020000002000, 0x0008020800002000
6688c2ecf20Sopenharmony_ci.L_s5:
6698c2ecf20Sopenharmony_ci	.quad 0x0000001000000100, 0x0020001002080100
6708c2ecf20Sopenharmony_ci	.quad 0x0020000002080000, 0x0420001002000100
6718c2ecf20Sopenharmony_ci	.quad 0x0000000000080000, 0x0000001000000100
6728c2ecf20Sopenharmony_ci	.quad 0x0400000000000000, 0x0020000002080000
6738c2ecf20Sopenharmony_ci	.quad 0x0400001000080100, 0x0000000000080000
6748c2ecf20Sopenharmony_ci	.quad 0x0020001002000100, 0x0400001000080100
6758c2ecf20Sopenharmony_ci	.quad 0x0420001002000100, 0x0420000002080000
6768c2ecf20Sopenharmony_ci	.quad 0x0000001000080100, 0x0400000000000000
6778c2ecf20Sopenharmony_ci	.quad 0x0020000002000000, 0x0400000000080000
6788c2ecf20Sopenharmony_ci	.quad 0x0400000000080000, 0x0000000000000000
6798c2ecf20Sopenharmony_ci	.quad 0x0400001000000100, 0x0420001002080100
6808c2ecf20Sopenharmony_ci	.quad 0x0420001002080100, 0x0020001002000100
6818c2ecf20Sopenharmony_ci	.quad 0x0420000002080000, 0x0400001000000100
6828c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0420000002000000
6838c2ecf20Sopenharmony_ci	.quad 0x0020001002080100, 0x0020000002000000
6848c2ecf20Sopenharmony_ci	.quad 0x0420000002000000, 0x0000001000080100
6858c2ecf20Sopenharmony_ci	.quad 0x0000000000080000, 0x0420001002000100
6868c2ecf20Sopenharmony_ci	.quad 0x0000001000000100, 0x0020000002000000
6878c2ecf20Sopenharmony_ci	.quad 0x0400000000000000, 0x0020000002080000
6888c2ecf20Sopenharmony_ci	.quad 0x0420001002000100, 0x0400001000080100
6898c2ecf20Sopenharmony_ci	.quad 0x0020001002000100, 0x0400000000000000
6908c2ecf20Sopenharmony_ci	.quad 0x0420000002080000, 0x0020001002080100
6918c2ecf20Sopenharmony_ci	.quad 0x0400001000080100, 0x0000001000000100
6928c2ecf20Sopenharmony_ci	.quad 0x0020000002000000, 0x0420000002080000
6938c2ecf20Sopenharmony_ci	.quad 0x0420001002080100, 0x0000001000080100
6948c2ecf20Sopenharmony_ci	.quad 0x0420000002000000, 0x0420001002080100
6958c2ecf20Sopenharmony_ci	.quad 0x0020000002080000, 0x0000000000000000
6968c2ecf20Sopenharmony_ci	.quad 0x0400000000080000, 0x0420000002000000
6978c2ecf20Sopenharmony_ci	.quad 0x0000001000080100, 0x0020001002000100
6988c2ecf20Sopenharmony_ci	.quad 0x0400001000000100, 0x0000000000080000
6998c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0400000000080000
7008c2ecf20Sopenharmony_ci	.quad 0x0020001002080100, 0x0400001000000100
7018c2ecf20Sopenharmony_ci.L_s6:
7028c2ecf20Sopenharmony_ci	.quad 0x0200000120000010, 0x0204000020000000
7038c2ecf20Sopenharmony_ci	.quad 0x0000040000000000, 0x0204040120000010
7048c2ecf20Sopenharmony_ci	.quad 0x0204000020000000, 0x0000000100000010
7058c2ecf20Sopenharmony_ci	.quad 0x0204040120000010, 0x0004000000000000
7068c2ecf20Sopenharmony_ci	.quad 0x0200040020000000, 0x0004040100000010
7078c2ecf20Sopenharmony_ci	.quad 0x0004000000000000, 0x0200000120000010
7088c2ecf20Sopenharmony_ci	.quad 0x0004000100000010, 0x0200040020000000
7098c2ecf20Sopenharmony_ci	.quad 0x0200000020000000, 0x0000040100000010
7108c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0004000100000010
7118c2ecf20Sopenharmony_ci	.quad 0x0200040120000010, 0x0000040000000000
7128c2ecf20Sopenharmony_ci	.quad 0x0004040000000000, 0x0200040120000010
7138c2ecf20Sopenharmony_ci	.quad 0x0000000100000010, 0x0204000120000010
7148c2ecf20Sopenharmony_ci	.quad 0x0204000120000010, 0x0000000000000000
7158c2ecf20Sopenharmony_ci	.quad 0x0004040100000010, 0x0204040020000000
7168c2ecf20Sopenharmony_ci	.quad 0x0000040100000010, 0x0004040000000000
7178c2ecf20Sopenharmony_ci	.quad 0x0204040020000000, 0x0200000020000000
7188c2ecf20Sopenharmony_ci	.quad 0x0200040020000000, 0x0000000100000010
7198c2ecf20Sopenharmony_ci	.quad 0x0204000120000010, 0x0004040000000000
7208c2ecf20Sopenharmony_ci	.quad 0x0204040120000010, 0x0004000000000000
7218c2ecf20Sopenharmony_ci	.quad 0x0000040100000010, 0x0200000120000010
7228c2ecf20Sopenharmony_ci	.quad 0x0004000000000000, 0x0200040020000000
7238c2ecf20Sopenharmony_ci	.quad 0x0200000020000000, 0x0000040100000010
7248c2ecf20Sopenharmony_ci	.quad 0x0200000120000010, 0x0204040120000010
7258c2ecf20Sopenharmony_ci	.quad 0x0004040000000000, 0x0204000020000000
7268c2ecf20Sopenharmony_ci	.quad 0x0004040100000010, 0x0204040020000000
7278c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0204000120000010
7288c2ecf20Sopenharmony_ci	.quad 0x0000000100000010, 0x0000040000000000
7298c2ecf20Sopenharmony_ci	.quad 0x0204000020000000, 0x0004040100000010
7308c2ecf20Sopenharmony_ci	.quad 0x0000040000000000, 0x0004000100000010
7318c2ecf20Sopenharmony_ci	.quad 0x0200040120000010, 0x0000000000000000
7328c2ecf20Sopenharmony_ci	.quad 0x0204040020000000, 0x0200000020000000
7338c2ecf20Sopenharmony_ci	.quad 0x0004000100000010, 0x0200040120000010
7348c2ecf20Sopenharmony_ci.L_s7:
7358c2ecf20Sopenharmony_ci	.quad 0x0002000000200000, 0x2002000004200002
7368c2ecf20Sopenharmony_ci	.quad 0x2000000004000802, 0x0000000000000000
7378c2ecf20Sopenharmony_ci	.quad 0x0000000000000800, 0x2000000004000802
7388c2ecf20Sopenharmony_ci	.quad 0x2002000000200802, 0x0002000004200800
7398c2ecf20Sopenharmony_ci	.quad 0x2002000004200802, 0x0002000000200000
7408c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x2000000004000002
7418c2ecf20Sopenharmony_ci	.quad 0x2000000000000002, 0x0000000004000000
7428c2ecf20Sopenharmony_ci	.quad 0x2002000004200002, 0x2000000000000802
7438c2ecf20Sopenharmony_ci	.quad 0x0000000004000800, 0x2002000000200802
7448c2ecf20Sopenharmony_ci	.quad 0x2002000000200002, 0x0000000004000800
7458c2ecf20Sopenharmony_ci	.quad 0x2000000004000002, 0x0002000004200000
7468c2ecf20Sopenharmony_ci	.quad 0x0002000004200800, 0x2002000000200002
7478c2ecf20Sopenharmony_ci	.quad 0x0002000004200000, 0x0000000000000800
7488c2ecf20Sopenharmony_ci	.quad 0x2000000000000802, 0x2002000004200802
7498c2ecf20Sopenharmony_ci	.quad 0x0002000000200800, 0x2000000000000002
7508c2ecf20Sopenharmony_ci	.quad 0x0000000004000000, 0x0002000000200800
7518c2ecf20Sopenharmony_ci	.quad 0x0000000004000000, 0x0002000000200800
7528c2ecf20Sopenharmony_ci	.quad 0x0002000000200000, 0x2000000004000802
7538c2ecf20Sopenharmony_ci	.quad 0x2000000004000802, 0x2002000004200002
7548c2ecf20Sopenharmony_ci	.quad 0x2002000004200002, 0x2000000000000002
7558c2ecf20Sopenharmony_ci	.quad 0x2002000000200002, 0x0000000004000000
7568c2ecf20Sopenharmony_ci	.quad 0x0000000004000800, 0x0002000000200000
7578c2ecf20Sopenharmony_ci	.quad 0x0002000004200800, 0x2000000000000802
7588c2ecf20Sopenharmony_ci	.quad 0x2002000000200802, 0x0002000004200800
7598c2ecf20Sopenharmony_ci	.quad 0x2000000000000802, 0x2000000004000002
7608c2ecf20Sopenharmony_ci	.quad 0x2002000004200802, 0x0002000004200000
7618c2ecf20Sopenharmony_ci	.quad 0x0002000000200800, 0x0000000000000000
7628c2ecf20Sopenharmony_ci	.quad 0x2000000000000002, 0x2002000004200802
7638c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x2002000000200802
7648c2ecf20Sopenharmony_ci	.quad 0x0002000004200000, 0x0000000000000800
7658c2ecf20Sopenharmony_ci	.quad 0x2000000004000002, 0x0000000004000800
7668c2ecf20Sopenharmony_ci	.quad 0x0000000000000800, 0x2002000000200002
7678c2ecf20Sopenharmony_ci.L_s8:
7688c2ecf20Sopenharmony_ci	.quad 0x0100010410001000, 0x0000010000001000
7698c2ecf20Sopenharmony_ci	.quad 0x0000000000040000, 0x0100010410041000
7708c2ecf20Sopenharmony_ci	.quad 0x0100000010000000, 0x0100010410001000
7718c2ecf20Sopenharmony_ci	.quad 0x0000000400000000, 0x0100000010000000
7728c2ecf20Sopenharmony_ci	.quad 0x0000000400040000, 0x0100000010040000
7738c2ecf20Sopenharmony_ci	.quad 0x0100010410041000, 0x0000010000041000
7748c2ecf20Sopenharmony_ci	.quad 0x0100010010041000, 0x0000010400041000
7758c2ecf20Sopenharmony_ci	.quad 0x0000010000001000, 0x0000000400000000
7768c2ecf20Sopenharmony_ci	.quad 0x0100000010040000, 0x0100000410000000
7778c2ecf20Sopenharmony_ci	.quad 0x0100010010001000, 0x0000010400001000
7788c2ecf20Sopenharmony_ci	.quad 0x0000010000041000, 0x0000000400040000
7798c2ecf20Sopenharmony_ci	.quad 0x0100000410040000, 0x0100010010041000
7808c2ecf20Sopenharmony_ci	.quad 0x0000010400001000, 0x0000000000000000
7818c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0100000410040000
7828c2ecf20Sopenharmony_ci	.quad 0x0100000410000000, 0x0100010010001000
7838c2ecf20Sopenharmony_ci	.quad 0x0000010400041000, 0x0000000000040000
7848c2ecf20Sopenharmony_ci	.quad 0x0000010400041000, 0x0000000000040000
7858c2ecf20Sopenharmony_ci	.quad 0x0100010010041000, 0x0000010000001000
7868c2ecf20Sopenharmony_ci	.quad 0x0000000400000000, 0x0100000410040000
7878c2ecf20Sopenharmony_ci	.quad 0x0000010000001000, 0x0000010400041000
7888c2ecf20Sopenharmony_ci	.quad 0x0100010010001000, 0x0000000400000000
7898c2ecf20Sopenharmony_ci	.quad 0x0100000410000000, 0x0100000010040000
7908c2ecf20Sopenharmony_ci	.quad 0x0100000410040000, 0x0100000010000000
7918c2ecf20Sopenharmony_ci	.quad 0x0000000000040000, 0x0100010410001000
7928c2ecf20Sopenharmony_ci	.quad 0x0000000000000000, 0x0100010410041000
7938c2ecf20Sopenharmony_ci	.quad 0x0000000400040000, 0x0100000410000000
7948c2ecf20Sopenharmony_ci	.quad 0x0100000010040000, 0x0100010010001000
7958c2ecf20Sopenharmony_ci	.quad 0x0100010410001000, 0x0000000000000000
7968c2ecf20Sopenharmony_ci	.quad 0x0100010410041000, 0x0000010000041000
7978c2ecf20Sopenharmony_ci	.quad 0x0000010000041000, 0x0000010400001000
7988c2ecf20Sopenharmony_ci	.quad 0x0000010400001000, 0x0000000400040000
7998c2ecf20Sopenharmony_ci	.quad 0x0100000010000000, 0x0100010010041000
800