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