162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * des3_ede-asm_64.S - x86-64 assembly implementation of 3DES cipher 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright © 2014 Jussi Kivilinna <jussi.kivilinna@iki.fi> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/linkage.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci.file "des3_ede-asm_64.S" 1162306a36Sopenharmony_ci.text 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define s1 .L_s1 1462306a36Sopenharmony_ci#define s2 ((s1) + (64*8)) 1562306a36Sopenharmony_ci#define s3 ((s2) + (64*8)) 1662306a36Sopenharmony_ci#define s4 ((s3) + (64*8)) 1762306a36Sopenharmony_ci#define s5 ((s4) + (64*8)) 1862306a36Sopenharmony_ci#define s6 ((s5) + (64*8)) 1962306a36Sopenharmony_ci#define s7 ((s6) + (64*8)) 2062306a36Sopenharmony_ci#define s8 ((s7) + (64*8)) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* register macros */ 2362306a36Sopenharmony_ci#define CTX %rdi 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define RL0 %r8 2662306a36Sopenharmony_ci#define RL1 %r9 2762306a36Sopenharmony_ci#define RL2 %r10 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define RL0d %r8d 3062306a36Sopenharmony_ci#define RL1d %r9d 3162306a36Sopenharmony_ci#define RL2d %r10d 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define RR0 %r11 3462306a36Sopenharmony_ci#define RR1 %r12 3562306a36Sopenharmony_ci#define RR2 %r13 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define RR0d %r11d 3862306a36Sopenharmony_ci#define RR1d %r12d 3962306a36Sopenharmony_ci#define RR2d %r13d 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define RW0 %rax 4262306a36Sopenharmony_ci#define RW1 %rbx 4362306a36Sopenharmony_ci#define RW2 %rcx 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define RW0d %eax 4662306a36Sopenharmony_ci#define RW1d %ebx 4762306a36Sopenharmony_ci#define RW2d %ecx 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#define RW0bl %al 5062306a36Sopenharmony_ci#define RW1bl %bl 5162306a36Sopenharmony_ci#define RW2bl %cl 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define RW0bh %ah 5462306a36Sopenharmony_ci#define RW1bh %bh 5562306a36Sopenharmony_ci#define RW2bh %ch 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define RT0 %r15 5862306a36Sopenharmony_ci#define RT1 %rsi 5962306a36Sopenharmony_ci#define RT2 %r14 6062306a36Sopenharmony_ci#define RT3 %rdx 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci#define RT0d %r15d 6362306a36Sopenharmony_ci#define RT1d %esi 6462306a36Sopenharmony_ci#define RT2d %r14d 6562306a36Sopenharmony_ci#define RT3d %edx 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/*********************************************************************** 6862306a36Sopenharmony_ci * 1-way 3DES 6962306a36Sopenharmony_ci ***********************************************************************/ 7062306a36Sopenharmony_ci#define do_permutation(a, b, offset, mask) \ 7162306a36Sopenharmony_ci movl a, RT0d; \ 7262306a36Sopenharmony_ci shrl $(offset), RT0d; \ 7362306a36Sopenharmony_ci xorl b, RT0d; \ 7462306a36Sopenharmony_ci andl $(mask), RT0d; \ 7562306a36Sopenharmony_ci xorl RT0d, b; \ 7662306a36Sopenharmony_ci shll $(offset), RT0d; \ 7762306a36Sopenharmony_ci xorl RT0d, a; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#define expand_to_64bits(val, mask) \ 8062306a36Sopenharmony_ci movl val##d, RT0d; \ 8162306a36Sopenharmony_ci rorl $4, RT0d; \ 8262306a36Sopenharmony_ci shlq $32, RT0; \ 8362306a36Sopenharmony_ci orq RT0, val; \ 8462306a36Sopenharmony_ci andq mask, val; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci#define compress_to_64bits(val) \ 8762306a36Sopenharmony_ci movq val, RT0; \ 8862306a36Sopenharmony_ci shrq $32, RT0; \ 8962306a36Sopenharmony_ci roll $4, RT0d; \ 9062306a36Sopenharmony_ci orl RT0d, val##d; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#define initial_permutation(left, right) \ 9362306a36Sopenharmony_ci do_permutation(left##d, right##d, 4, 0x0f0f0f0f); \ 9462306a36Sopenharmony_ci do_permutation(left##d, right##d, 16, 0x0000ffff); \ 9562306a36Sopenharmony_ci do_permutation(right##d, left##d, 2, 0x33333333); \ 9662306a36Sopenharmony_ci do_permutation(right##d, left##d, 8, 0x00ff00ff); \ 9762306a36Sopenharmony_ci movabs $0x3f3f3f3f3f3f3f3f, RT3; \ 9862306a36Sopenharmony_ci movl left##d, RW0d; \ 9962306a36Sopenharmony_ci roll $1, right##d; \ 10062306a36Sopenharmony_ci xorl right##d, RW0d; \ 10162306a36Sopenharmony_ci andl $0xaaaaaaaa, RW0d; \ 10262306a36Sopenharmony_ci xorl RW0d, left##d; \ 10362306a36Sopenharmony_ci xorl RW0d, right##d; \ 10462306a36Sopenharmony_ci roll $1, left##d; \ 10562306a36Sopenharmony_ci expand_to_64bits(right, RT3); \ 10662306a36Sopenharmony_ci expand_to_64bits(left, RT3); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci#define final_permutation(left, right) \ 10962306a36Sopenharmony_ci compress_to_64bits(right); \ 11062306a36Sopenharmony_ci compress_to_64bits(left); \ 11162306a36Sopenharmony_ci movl right##d, RW0d; \ 11262306a36Sopenharmony_ci rorl $1, left##d; \ 11362306a36Sopenharmony_ci xorl left##d, RW0d; \ 11462306a36Sopenharmony_ci andl $0xaaaaaaaa, RW0d; \ 11562306a36Sopenharmony_ci xorl RW0d, right##d; \ 11662306a36Sopenharmony_ci xorl RW0d, left##d; \ 11762306a36Sopenharmony_ci rorl $1, right##d; \ 11862306a36Sopenharmony_ci do_permutation(right##d, left##d, 8, 0x00ff00ff); \ 11962306a36Sopenharmony_ci do_permutation(right##d, left##d, 2, 0x33333333); \ 12062306a36Sopenharmony_ci do_permutation(left##d, right##d, 16, 0x0000ffff); \ 12162306a36Sopenharmony_ci do_permutation(left##d, right##d, 4, 0x0f0f0f0f); 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci#define round1(n, from, to, load_next_key) \ 12462306a36Sopenharmony_ci xorq from, RW0; \ 12562306a36Sopenharmony_ci \ 12662306a36Sopenharmony_ci movzbl RW0bl, RT0d; \ 12762306a36Sopenharmony_ci movzbl RW0bh, RT1d; \ 12862306a36Sopenharmony_ci shrq $16, RW0; \ 12962306a36Sopenharmony_ci movzbl RW0bl, RT2d; \ 13062306a36Sopenharmony_ci movzbl RW0bh, RT3d; \ 13162306a36Sopenharmony_ci shrq $16, RW0; \ 13262306a36Sopenharmony_ci leaq s8(%rip), RW1; \ 13362306a36Sopenharmony_ci movq (RW1, RT0, 8), RT0; \ 13462306a36Sopenharmony_ci leaq s6(%rip), RW1; \ 13562306a36Sopenharmony_ci xorq (RW1, RT1, 8), to; \ 13662306a36Sopenharmony_ci movzbl RW0bl, RL1d; \ 13762306a36Sopenharmony_ci movzbl RW0bh, RT1d; \ 13862306a36Sopenharmony_ci shrl $16, RW0d; \ 13962306a36Sopenharmony_ci leaq s4(%rip), RW1; \ 14062306a36Sopenharmony_ci xorq (RW1, RT2, 8), RT0; \ 14162306a36Sopenharmony_ci leaq s2(%rip), RW1; \ 14262306a36Sopenharmony_ci xorq (RW1, RT3, 8), to; \ 14362306a36Sopenharmony_ci movzbl RW0bl, RT2d; \ 14462306a36Sopenharmony_ci movzbl RW0bh, RT3d; \ 14562306a36Sopenharmony_ci leaq s7(%rip), RW1; \ 14662306a36Sopenharmony_ci xorq (RW1, RL1, 8), RT0; \ 14762306a36Sopenharmony_ci leaq s5(%rip), RW1; \ 14862306a36Sopenharmony_ci xorq (RW1, RT1, 8), to; \ 14962306a36Sopenharmony_ci leaq s3(%rip), RW1; \ 15062306a36Sopenharmony_ci xorq (RW1, RT2, 8), RT0; \ 15162306a36Sopenharmony_ci load_next_key(n, RW0); \ 15262306a36Sopenharmony_ci xorq RT0, to; \ 15362306a36Sopenharmony_ci leaq s1(%rip), RW1; \ 15462306a36Sopenharmony_ci xorq (RW1, RT3, 8), to; \ 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci#define load_next_key(n, RWx) \ 15762306a36Sopenharmony_ci movq (((n) + 1) * 8)(CTX), RWx; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci#define dummy2(a, b) /*_*/ 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci#define read_block(io, left, right) \ 16262306a36Sopenharmony_ci movl (io), left##d; \ 16362306a36Sopenharmony_ci movl 4(io), right##d; \ 16462306a36Sopenharmony_ci bswapl left##d; \ 16562306a36Sopenharmony_ci bswapl right##d; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci#define write_block(io, left, right) \ 16862306a36Sopenharmony_ci bswapl left##d; \ 16962306a36Sopenharmony_ci bswapl right##d; \ 17062306a36Sopenharmony_ci movl left##d, (io); \ 17162306a36Sopenharmony_ci movl right##d, 4(io); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ciSYM_FUNC_START(des3_ede_x86_64_crypt_blk) 17462306a36Sopenharmony_ci /* input: 17562306a36Sopenharmony_ci * %rdi: round keys, CTX 17662306a36Sopenharmony_ci * %rsi: dst 17762306a36Sopenharmony_ci * %rdx: src 17862306a36Sopenharmony_ci */ 17962306a36Sopenharmony_ci pushq %rbx; 18062306a36Sopenharmony_ci pushq %r12; 18162306a36Sopenharmony_ci pushq %r13; 18262306a36Sopenharmony_ci pushq %r14; 18362306a36Sopenharmony_ci pushq %r15; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci pushq %rsi; /* dst */ 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci read_block(%rdx, RL0, RR0); 18862306a36Sopenharmony_ci initial_permutation(RL0, RR0); 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci movq (CTX), RW0; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci round1(0, RR0, RL0, load_next_key); 19362306a36Sopenharmony_ci round1(1, RL0, RR0, load_next_key); 19462306a36Sopenharmony_ci round1(2, RR0, RL0, load_next_key); 19562306a36Sopenharmony_ci round1(3, RL0, RR0, load_next_key); 19662306a36Sopenharmony_ci round1(4, RR0, RL0, load_next_key); 19762306a36Sopenharmony_ci round1(5, RL0, RR0, load_next_key); 19862306a36Sopenharmony_ci round1(6, RR0, RL0, load_next_key); 19962306a36Sopenharmony_ci round1(7, RL0, RR0, load_next_key); 20062306a36Sopenharmony_ci round1(8, RR0, RL0, load_next_key); 20162306a36Sopenharmony_ci round1(9, RL0, RR0, load_next_key); 20262306a36Sopenharmony_ci round1(10, RR0, RL0, load_next_key); 20362306a36Sopenharmony_ci round1(11, RL0, RR0, load_next_key); 20462306a36Sopenharmony_ci round1(12, RR0, RL0, load_next_key); 20562306a36Sopenharmony_ci round1(13, RL0, RR0, load_next_key); 20662306a36Sopenharmony_ci round1(14, RR0, RL0, load_next_key); 20762306a36Sopenharmony_ci round1(15, RL0, RR0, load_next_key); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci round1(16+0, RL0, RR0, load_next_key); 21062306a36Sopenharmony_ci round1(16+1, RR0, RL0, load_next_key); 21162306a36Sopenharmony_ci round1(16+2, RL0, RR0, load_next_key); 21262306a36Sopenharmony_ci round1(16+3, RR0, RL0, load_next_key); 21362306a36Sopenharmony_ci round1(16+4, RL0, RR0, load_next_key); 21462306a36Sopenharmony_ci round1(16+5, RR0, RL0, load_next_key); 21562306a36Sopenharmony_ci round1(16+6, RL0, RR0, load_next_key); 21662306a36Sopenharmony_ci round1(16+7, RR0, RL0, load_next_key); 21762306a36Sopenharmony_ci round1(16+8, RL0, RR0, load_next_key); 21862306a36Sopenharmony_ci round1(16+9, RR0, RL0, load_next_key); 21962306a36Sopenharmony_ci round1(16+10, RL0, RR0, load_next_key); 22062306a36Sopenharmony_ci round1(16+11, RR0, RL0, load_next_key); 22162306a36Sopenharmony_ci round1(16+12, RL0, RR0, load_next_key); 22262306a36Sopenharmony_ci round1(16+13, RR0, RL0, load_next_key); 22362306a36Sopenharmony_ci round1(16+14, RL0, RR0, load_next_key); 22462306a36Sopenharmony_ci round1(16+15, RR0, RL0, load_next_key); 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci round1(32+0, RR0, RL0, load_next_key); 22762306a36Sopenharmony_ci round1(32+1, RL0, RR0, load_next_key); 22862306a36Sopenharmony_ci round1(32+2, RR0, RL0, load_next_key); 22962306a36Sopenharmony_ci round1(32+3, RL0, RR0, load_next_key); 23062306a36Sopenharmony_ci round1(32+4, RR0, RL0, load_next_key); 23162306a36Sopenharmony_ci round1(32+5, RL0, RR0, load_next_key); 23262306a36Sopenharmony_ci round1(32+6, RR0, RL0, load_next_key); 23362306a36Sopenharmony_ci round1(32+7, RL0, RR0, load_next_key); 23462306a36Sopenharmony_ci round1(32+8, RR0, RL0, load_next_key); 23562306a36Sopenharmony_ci round1(32+9, RL0, RR0, load_next_key); 23662306a36Sopenharmony_ci round1(32+10, RR0, RL0, load_next_key); 23762306a36Sopenharmony_ci round1(32+11, RL0, RR0, load_next_key); 23862306a36Sopenharmony_ci round1(32+12, RR0, RL0, load_next_key); 23962306a36Sopenharmony_ci round1(32+13, RL0, RR0, load_next_key); 24062306a36Sopenharmony_ci round1(32+14, RR0, RL0, load_next_key); 24162306a36Sopenharmony_ci round1(32+15, RL0, RR0, dummy2); 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci final_permutation(RR0, RL0); 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci popq %rsi /* dst */ 24662306a36Sopenharmony_ci write_block(%rsi, RR0, RL0); 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci popq %r15; 24962306a36Sopenharmony_ci popq %r14; 25062306a36Sopenharmony_ci popq %r13; 25162306a36Sopenharmony_ci popq %r12; 25262306a36Sopenharmony_ci popq %rbx; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci RET; 25562306a36Sopenharmony_ciSYM_FUNC_END(des3_ede_x86_64_crypt_blk) 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci/*********************************************************************** 25862306a36Sopenharmony_ci * 3-way 3DES 25962306a36Sopenharmony_ci ***********************************************************************/ 26062306a36Sopenharmony_ci#define expand_to_64bits(val, mask) \ 26162306a36Sopenharmony_ci movl val##d, RT0d; \ 26262306a36Sopenharmony_ci rorl $4, RT0d; \ 26362306a36Sopenharmony_ci shlq $32, RT0; \ 26462306a36Sopenharmony_ci orq RT0, val; \ 26562306a36Sopenharmony_ci andq mask, val; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci#define compress_to_64bits(val) \ 26862306a36Sopenharmony_ci movq val, RT0; \ 26962306a36Sopenharmony_ci shrq $32, RT0; \ 27062306a36Sopenharmony_ci roll $4, RT0d; \ 27162306a36Sopenharmony_ci orl RT0d, val##d; 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci#define initial_permutation3(left, right) \ 27462306a36Sopenharmony_ci do_permutation(left##0d, right##0d, 4, 0x0f0f0f0f); \ 27562306a36Sopenharmony_ci do_permutation(left##0d, right##0d, 16, 0x0000ffff); \ 27662306a36Sopenharmony_ci do_permutation(left##1d, right##1d, 4, 0x0f0f0f0f); \ 27762306a36Sopenharmony_ci do_permutation(left##1d, right##1d, 16, 0x0000ffff); \ 27862306a36Sopenharmony_ci do_permutation(left##2d, right##2d, 4, 0x0f0f0f0f); \ 27962306a36Sopenharmony_ci do_permutation(left##2d, right##2d, 16, 0x0000ffff); \ 28062306a36Sopenharmony_ci \ 28162306a36Sopenharmony_ci do_permutation(right##0d, left##0d, 2, 0x33333333); \ 28262306a36Sopenharmony_ci do_permutation(right##0d, left##0d, 8, 0x00ff00ff); \ 28362306a36Sopenharmony_ci do_permutation(right##1d, left##1d, 2, 0x33333333); \ 28462306a36Sopenharmony_ci do_permutation(right##1d, left##1d, 8, 0x00ff00ff); \ 28562306a36Sopenharmony_ci do_permutation(right##2d, left##2d, 2, 0x33333333); \ 28662306a36Sopenharmony_ci do_permutation(right##2d, left##2d, 8, 0x00ff00ff); \ 28762306a36Sopenharmony_ci \ 28862306a36Sopenharmony_ci movabs $0x3f3f3f3f3f3f3f3f, RT3; \ 28962306a36Sopenharmony_ci \ 29062306a36Sopenharmony_ci movl left##0d, RW0d; \ 29162306a36Sopenharmony_ci roll $1, right##0d; \ 29262306a36Sopenharmony_ci xorl right##0d, RW0d; \ 29362306a36Sopenharmony_ci andl $0xaaaaaaaa, RW0d; \ 29462306a36Sopenharmony_ci xorl RW0d, left##0d; \ 29562306a36Sopenharmony_ci xorl RW0d, right##0d; \ 29662306a36Sopenharmony_ci roll $1, left##0d; \ 29762306a36Sopenharmony_ci expand_to_64bits(right##0, RT3); \ 29862306a36Sopenharmony_ci expand_to_64bits(left##0, RT3); \ 29962306a36Sopenharmony_ci movl left##1d, RW1d; \ 30062306a36Sopenharmony_ci roll $1, right##1d; \ 30162306a36Sopenharmony_ci xorl right##1d, RW1d; \ 30262306a36Sopenharmony_ci andl $0xaaaaaaaa, RW1d; \ 30362306a36Sopenharmony_ci xorl RW1d, left##1d; \ 30462306a36Sopenharmony_ci xorl RW1d, right##1d; \ 30562306a36Sopenharmony_ci roll $1, left##1d; \ 30662306a36Sopenharmony_ci expand_to_64bits(right##1, RT3); \ 30762306a36Sopenharmony_ci expand_to_64bits(left##1, RT3); \ 30862306a36Sopenharmony_ci movl left##2d, RW2d; \ 30962306a36Sopenharmony_ci roll $1, right##2d; \ 31062306a36Sopenharmony_ci xorl right##2d, RW2d; \ 31162306a36Sopenharmony_ci andl $0xaaaaaaaa, RW2d; \ 31262306a36Sopenharmony_ci xorl RW2d, left##2d; \ 31362306a36Sopenharmony_ci xorl RW2d, right##2d; \ 31462306a36Sopenharmony_ci roll $1, left##2d; \ 31562306a36Sopenharmony_ci expand_to_64bits(right##2, RT3); \ 31662306a36Sopenharmony_ci expand_to_64bits(left##2, RT3); 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci#define final_permutation3(left, right) \ 31962306a36Sopenharmony_ci compress_to_64bits(right##0); \ 32062306a36Sopenharmony_ci compress_to_64bits(left##0); \ 32162306a36Sopenharmony_ci movl right##0d, RW0d; \ 32262306a36Sopenharmony_ci rorl $1, left##0d; \ 32362306a36Sopenharmony_ci xorl left##0d, RW0d; \ 32462306a36Sopenharmony_ci andl $0xaaaaaaaa, RW0d; \ 32562306a36Sopenharmony_ci xorl RW0d, right##0d; \ 32662306a36Sopenharmony_ci xorl RW0d, left##0d; \ 32762306a36Sopenharmony_ci rorl $1, right##0d; \ 32862306a36Sopenharmony_ci compress_to_64bits(right##1); \ 32962306a36Sopenharmony_ci compress_to_64bits(left##1); \ 33062306a36Sopenharmony_ci movl right##1d, RW1d; \ 33162306a36Sopenharmony_ci rorl $1, left##1d; \ 33262306a36Sopenharmony_ci xorl left##1d, RW1d; \ 33362306a36Sopenharmony_ci andl $0xaaaaaaaa, RW1d; \ 33462306a36Sopenharmony_ci xorl RW1d, right##1d; \ 33562306a36Sopenharmony_ci xorl RW1d, left##1d; \ 33662306a36Sopenharmony_ci rorl $1, right##1d; \ 33762306a36Sopenharmony_ci compress_to_64bits(right##2); \ 33862306a36Sopenharmony_ci compress_to_64bits(left##2); \ 33962306a36Sopenharmony_ci movl right##2d, RW2d; \ 34062306a36Sopenharmony_ci rorl $1, left##2d; \ 34162306a36Sopenharmony_ci xorl left##2d, RW2d; \ 34262306a36Sopenharmony_ci andl $0xaaaaaaaa, RW2d; \ 34362306a36Sopenharmony_ci xorl RW2d, right##2d; \ 34462306a36Sopenharmony_ci xorl RW2d, left##2d; \ 34562306a36Sopenharmony_ci rorl $1, right##2d; \ 34662306a36Sopenharmony_ci \ 34762306a36Sopenharmony_ci do_permutation(right##0d, left##0d, 8, 0x00ff00ff); \ 34862306a36Sopenharmony_ci do_permutation(right##0d, left##0d, 2, 0x33333333); \ 34962306a36Sopenharmony_ci do_permutation(right##1d, left##1d, 8, 0x00ff00ff); \ 35062306a36Sopenharmony_ci do_permutation(right##1d, left##1d, 2, 0x33333333); \ 35162306a36Sopenharmony_ci do_permutation(right##2d, left##2d, 8, 0x00ff00ff); \ 35262306a36Sopenharmony_ci do_permutation(right##2d, left##2d, 2, 0x33333333); \ 35362306a36Sopenharmony_ci \ 35462306a36Sopenharmony_ci do_permutation(left##0d, right##0d, 16, 0x0000ffff); \ 35562306a36Sopenharmony_ci do_permutation(left##0d, right##0d, 4, 0x0f0f0f0f); \ 35662306a36Sopenharmony_ci do_permutation(left##1d, right##1d, 16, 0x0000ffff); \ 35762306a36Sopenharmony_ci do_permutation(left##1d, right##1d, 4, 0x0f0f0f0f); \ 35862306a36Sopenharmony_ci do_permutation(left##2d, right##2d, 16, 0x0000ffff); \ 35962306a36Sopenharmony_ci do_permutation(left##2d, right##2d, 4, 0x0f0f0f0f); 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci#define round3(n, from, to, load_next_key, do_movq) \ 36262306a36Sopenharmony_ci xorq from##0, RW0; \ 36362306a36Sopenharmony_ci movzbl RW0bl, RT3d; \ 36462306a36Sopenharmony_ci movzbl RW0bh, RT1d; \ 36562306a36Sopenharmony_ci shrq $16, RW0; \ 36662306a36Sopenharmony_ci leaq s8(%rip), RT2; \ 36762306a36Sopenharmony_ci xorq (RT2, RT3, 8), to##0; \ 36862306a36Sopenharmony_ci leaq s6(%rip), RT2; \ 36962306a36Sopenharmony_ci xorq (RT2, RT1, 8), to##0; \ 37062306a36Sopenharmony_ci movzbl RW0bl, RT3d; \ 37162306a36Sopenharmony_ci movzbl RW0bh, RT1d; \ 37262306a36Sopenharmony_ci shrq $16, RW0; \ 37362306a36Sopenharmony_ci leaq s4(%rip), RT2; \ 37462306a36Sopenharmony_ci xorq (RT2, RT3, 8), to##0; \ 37562306a36Sopenharmony_ci leaq s2(%rip), RT2; \ 37662306a36Sopenharmony_ci xorq (RT2, RT1, 8), to##0; \ 37762306a36Sopenharmony_ci movzbl RW0bl, RT3d; \ 37862306a36Sopenharmony_ci movzbl RW0bh, RT1d; \ 37962306a36Sopenharmony_ci shrl $16, RW0d; \ 38062306a36Sopenharmony_ci leaq s7(%rip), RT2; \ 38162306a36Sopenharmony_ci xorq (RT2, RT3, 8), to##0; \ 38262306a36Sopenharmony_ci leaq s5(%rip), RT2; \ 38362306a36Sopenharmony_ci xorq (RT2, RT1, 8), to##0; \ 38462306a36Sopenharmony_ci movzbl RW0bl, RT3d; \ 38562306a36Sopenharmony_ci movzbl RW0bh, RT1d; \ 38662306a36Sopenharmony_ci load_next_key(n, RW0); \ 38762306a36Sopenharmony_ci leaq s3(%rip), RT2; \ 38862306a36Sopenharmony_ci xorq (RT2, RT3, 8), to##0; \ 38962306a36Sopenharmony_ci leaq s1(%rip), RT2; \ 39062306a36Sopenharmony_ci xorq (RT2, RT1, 8), to##0; \ 39162306a36Sopenharmony_ci xorq from##1, RW1; \ 39262306a36Sopenharmony_ci movzbl RW1bl, RT3d; \ 39362306a36Sopenharmony_ci movzbl RW1bh, RT1d; \ 39462306a36Sopenharmony_ci shrq $16, RW1; \ 39562306a36Sopenharmony_ci leaq s8(%rip), RT2; \ 39662306a36Sopenharmony_ci xorq (RT2, RT3, 8), to##1; \ 39762306a36Sopenharmony_ci leaq s6(%rip), RT2; \ 39862306a36Sopenharmony_ci xorq (RT2, RT1, 8), to##1; \ 39962306a36Sopenharmony_ci movzbl RW1bl, RT3d; \ 40062306a36Sopenharmony_ci movzbl RW1bh, RT1d; \ 40162306a36Sopenharmony_ci shrq $16, RW1; \ 40262306a36Sopenharmony_ci leaq s4(%rip), RT2; \ 40362306a36Sopenharmony_ci xorq (RT2, RT3, 8), to##1; \ 40462306a36Sopenharmony_ci leaq s2(%rip), RT2; \ 40562306a36Sopenharmony_ci xorq (RT2, RT1, 8), to##1; \ 40662306a36Sopenharmony_ci movzbl RW1bl, RT3d; \ 40762306a36Sopenharmony_ci movzbl RW1bh, RT1d; \ 40862306a36Sopenharmony_ci shrl $16, RW1d; \ 40962306a36Sopenharmony_ci leaq s7(%rip), RT2; \ 41062306a36Sopenharmony_ci xorq (RT2, RT3, 8), to##1; \ 41162306a36Sopenharmony_ci leaq s5(%rip), RT2; \ 41262306a36Sopenharmony_ci xorq (RT2, RT1, 8), to##1; \ 41362306a36Sopenharmony_ci movzbl RW1bl, RT3d; \ 41462306a36Sopenharmony_ci movzbl RW1bh, RT1d; \ 41562306a36Sopenharmony_ci do_movq(RW0, RW1); \ 41662306a36Sopenharmony_ci leaq s3(%rip), RT2; \ 41762306a36Sopenharmony_ci xorq (RT2, RT3, 8), to##1; \ 41862306a36Sopenharmony_ci leaq s1(%rip), RT2; \ 41962306a36Sopenharmony_ci xorq (RT2, RT1, 8), to##1; \ 42062306a36Sopenharmony_ci xorq from##2, RW2; \ 42162306a36Sopenharmony_ci movzbl RW2bl, RT3d; \ 42262306a36Sopenharmony_ci movzbl RW2bh, RT1d; \ 42362306a36Sopenharmony_ci shrq $16, RW2; \ 42462306a36Sopenharmony_ci leaq s8(%rip), RT2; \ 42562306a36Sopenharmony_ci xorq (RT2, RT3, 8), to##2; \ 42662306a36Sopenharmony_ci leaq s6(%rip), RT2; \ 42762306a36Sopenharmony_ci xorq (RT2, RT1, 8), to##2; \ 42862306a36Sopenharmony_ci movzbl RW2bl, RT3d; \ 42962306a36Sopenharmony_ci movzbl RW2bh, RT1d; \ 43062306a36Sopenharmony_ci shrq $16, RW2; \ 43162306a36Sopenharmony_ci leaq s4(%rip), RT2; \ 43262306a36Sopenharmony_ci xorq (RT2, RT3, 8), to##2; \ 43362306a36Sopenharmony_ci leaq s2(%rip), RT2; \ 43462306a36Sopenharmony_ci xorq (RT2, RT1, 8), to##2; \ 43562306a36Sopenharmony_ci movzbl RW2bl, RT3d; \ 43662306a36Sopenharmony_ci movzbl RW2bh, RT1d; \ 43762306a36Sopenharmony_ci shrl $16, RW2d; \ 43862306a36Sopenharmony_ci leaq s7(%rip), RT2; \ 43962306a36Sopenharmony_ci xorq (RT2, RT3, 8), to##2; \ 44062306a36Sopenharmony_ci leaq s5(%rip), RT2; \ 44162306a36Sopenharmony_ci xorq (RT2, RT1, 8), to##2; \ 44262306a36Sopenharmony_ci movzbl RW2bl, RT3d; \ 44362306a36Sopenharmony_ci movzbl RW2bh, RT1d; \ 44462306a36Sopenharmony_ci do_movq(RW0, RW2); \ 44562306a36Sopenharmony_ci leaq s3(%rip), RT2; \ 44662306a36Sopenharmony_ci xorq (RT2, RT3, 8), to##2; \ 44762306a36Sopenharmony_ci leaq s1(%rip), RT2; \ 44862306a36Sopenharmony_ci xorq (RT2, RT1, 8), to##2; 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci#define __movq(src, dst) \ 45162306a36Sopenharmony_ci movq src, dst; 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_ciSYM_FUNC_START(des3_ede_x86_64_crypt_blk_3way) 45462306a36Sopenharmony_ci /* input: 45562306a36Sopenharmony_ci * %rdi: ctx, round keys 45662306a36Sopenharmony_ci * %rsi: dst (3 blocks) 45762306a36Sopenharmony_ci * %rdx: src (3 blocks) 45862306a36Sopenharmony_ci */ 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci pushq %rbx; 46162306a36Sopenharmony_ci pushq %r12; 46262306a36Sopenharmony_ci pushq %r13; 46362306a36Sopenharmony_ci pushq %r14; 46462306a36Sopenharmony_ci pushq %r15; 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci pushq %rsi /* dst */ 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci /* load input */ 46962306a36Sopenharmony_ci movl 0 * 4(%rdx), RL0d; 47062306a36Sopenharmony_ci movl 1 * 4(%rdx), RR0d; 47162306a36Sopenharmony_ci movl 2 * 4(%rdx), RL1d; 47262306a36Sopenharmony_ci movl 3 * 4(%rdx), RR1d; 47362306a36Sopenharmony_ci movl 4 * 4(%rdx), RL2d; 47462306a36Sopenharmony_ci movl 5 * 4(%rdx), RR2d; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci bswapl RL0d; 47762306a36Sopenharmony_ci bswapl RR0d; 47862306a36Sopenharmony_ci bswapl RL1d; 47962306a36Sopenharmony_ci bswapl RR1d; 48062306a36Sopenharmony_ci bswapl RL2d; 48162306a36Sopenharmony_ci bswapl RR2d; 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci initial_permutation3(RL, RR); 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci movq 0(CTX), RW0; 48662306a36Sopenharmony_ci movq RW0, RW1; 48762306a36Sopenharmony_ci movq RW0, RW2; 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci round3(0, RR, RL, load_next_key, __movq); 49062306a36Sopenharmony_ci round3(1, RL, RR, load_next_key, __movq); 49162306a36Sopenharmony_ci round3(2, RR, RL, load_next_key, __movq); 49262306a36Sopenharmony_ci round3(3, RL, RR, load_next_key, __movq); 49362306a36Sopenharmony_ci round3(4, RR, RL, load_next_key, __movq); 49462306a36Sopenharmony_ci round3(5, RL, RR, load_next_key, __movq); 49562306a36Sopenharmony_ci round3(6, RR, RL, load_next_key, __movq); 49662306a36Sopenharmony_ci round3(7, RL, RR, load_next_key, __movq); 49762306a36Sopenharmony_ci round3(8, RR, RL, load_next_key, __movq); 49862306a36Sopenharmony_ci round3(9, RL, RR, load_next_key, __movq); 49962306a36Sopenharmony_ci round3(10, RR, RL, load_next_key, __movq); 50062306a36Sopenharmony_ci round3(11, RL, RR, load_next_key, __movq); 50162306a36Sopenharmony_ci round3(12, RR, RL, load_next_key, __movq); 50262306a36Sopenharmony_ci round3(13, RL, RR, load_next_key, __movq); 50362306a36Sopenharmony_ci round3(14, RR, RL, load_next_key, __movq); 50462306a36Sopenharmony_ci round3(15, RL, RR, load_next_key, __movq); 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci round3(16+0, RL, RR, load_next_key, __movq); 50762306a36Sopenharmony_ci round3(16+1, RR, RL, load_next_key, __movq); 50862306a36Sopenharmony_ci round3(16+2, RL, RR, load_next_key, __movq); 50962306a36Sopenharmony_ci round3(16+3, RR, RL, load_next_key, __movq); 51062306a36Sopenharmony_ci round3(16+4, RL, RR, load_next_key, __movq); 51162306a36Sopenharmony_ci round3(16+5, RR, RL, load_next_key, __movq); 51262306a36Sopenharmony_ci round3(16+6, RL, RR, load_next_key, __movq); 51362306a36Sopenharmony_ci round3(16+7, RR, RL, load_next_key, __movq); 51462306a36Sopenharmony_ci round3(16+8, RL, RR, load_next_key, __movq); 51562306a36Sopenharmony_ci round3(16+9, RR, RL, load_next_key, __movq); 51662306a36Sopenharmony_ci round3(16+10, RL, RR, load_next_key, __movq); 51762306a36Sopenharmony_ci round3(16+11, RR, RL, load_next_key, __movq); 51862306a36Sopenharmony_ci round3(16+12, RL, RR, load_next_key, __movq); 51962306a36Sopenharmony_ci round3(16+13, RR, RL, load_next_key, __movq); 52062306a36Sopenharmony_ci round3(16+14, RL, RR, load_next_key, __movq); 52162306a36Sopenharmony_ci round3(16+15, RR, RL, load_next_key, __movq); 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci round3(32+0, RR, RL, load_next_key, __movq); 52462306a36Sopenharmony_ci round3(32+1, RL, RR, load_next_key, __movq); 52562306a36Sopenharmony_ci round3(32+2, RR, RL, load_next_key, __movq); 52662306a36Sopenharmony_ci round3(32+3, RL, RR, load_next_key, __movq); 52762306a36Sopenharmony_ci round3(32+4, RR, RL, load_next_key, __movq); 52862306a36Sopenharmony_ci round3(32+5, RL, RR, load_next_key, __movq); 52962306a36Sopenharmony_ci round3(32+6, RR, RL, load_next_key, __movq); 53062306a36Sopenharmony_ci round3(32+7, RL, RR, load_next_key, __movq); 53162306a36Sopenharmony_ci round3(32+8, RR, RL, load_next_key, __movq); 53262306a36Sopenharmony_ci round3(32+9, RL, RR, load_next_key, __movq); 53362306a36Sopenharmony_ci round3(32+10, RR, RL, load_next_key, __movq); 53462306a36Sopenharmony_ci round3(32+11, RL, RR, load_next_key, __movq); 53562306a36Sopenharmony_ci round3(32+12, RR, RL, load_next_key, __movq); 53662306a36Sopenharmony_ci round3(32+13, RL, RR, load_next_key, __movq); 53762306a36Sopenharmony_ci round3(32+14, RR, RL, load_next_key, __movq); 53862306a36Sopenharmony_ci round3(32+15, RL, RR, dummy2, dummy2); 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci final_permutation3(RR, RL); 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci bswapl RR0d; 54362306a36Sopenharmony_ci bswapl RL0d; 54462306a36Sopenharmony_ci bswapl RR1d; 54562306a36Sopenharmony_ci bswapl RL1d; 54662306a36Sopenharmony_ci bswapl RR2d; 54762306a36Sopenharmony_ci bswapl RL2d; 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_ci popq %rsi /* dst */ 55062306a36Sopenharmony_ci movl RR0d, 0 * 4(%rsi); 55162306a36Sopenharmony_ci movl RL0d, 1 * 4(%rsi); 55262306a36Sopenharmony_ci movl RR1d, 2 * 4(%rsi); 55362306a36Sopenharmony_ci movl RL1d, 3 * 4(%rsi); 55462306a36Sopenharmony_ci movl RR2d, 4 * 4(%rsi); 55562306a36Sopenharmony_ci movl RL2d, 5 * 4(%rsi); 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ci popq %r15; 55862306a36Sopenharmony_ci popq %r14; 55962306a36Sopenharmony_ci popq %r13; 56062306a36Sopenharmony_ci popq %r12; 56162306a36Sopenharmony_ci popq %rbx; 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci RET; 56462306a36Sopenharmony_ciSYM_FUNC_END(des3_ede_x86_64_crypt_blk_3way) 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_ci.section .rodata, "a", @progbits 56762306a36Sopenharmony_ci.align 16 56862306a36Sopenharmony_ci.L_s1: 56962306a36Sopenharmony_ci .quad 0x0010100001010400, 0x0000000000000000 57062306a36Sopenharmony_ci .quad 0x0000100000010000, 0x0010100001010404 57162306a36Sopenharmony_ci .quad 0x0010100001010004, 0x0000100000010404 57262306a36Sopenharmony_ci .quad 0x0000000000000004, 0x0000100000010000 57362306a36Sopenharmony_ci .quad 0x0000000000000400, 0x0010100001010400 57462306a36Sopenharmony_ci .quad 0x0010100001010404, 0x0000000000000400 57562306a36Sopenharmony_ci .quad 0x0010000001000404, 0x0010100001010004 57662306a36Sopenharmony_ci .quad 0x0010000001000000, 0x0000000000000004 57762306a36Sopenharmony_ci .quad 0x0000000000000404, 0x0010000001000400 57862306a36Sopenharmony_ci .quad 0x0010000001000400, 0x0000100000010400 57962306a36Sopenharmony_ci .quad 0x0000100000010400, 0x0010100001010000 58062306a36Sopenharmony_ci .quad 0x0010100001010000, 0x0010000001000404 58162306a36Sopenharmony_ci .quad 0x0000100000010004, 0x0010000001000004 58262306a36Sopenharmony_ci .quad 0x0010000001000004, 0x0000100000010004 58362306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0000000000000404 58462306a36Sopenharmony_ci .quad 0x0000100000010404, 0x0010000001000000 58562306a36Sopenharmony_ci .quad 0x0000100000010000, 0x0010100001010404 58662306a36Sopenharmony_ci .quad 0x0000000000000004, 0x0010100001010000 58762306a36Sopenharmony_ci .quad 0x0010100001010400, 0x0010000001000000 58862306a36Sopenharmony_ci .quad 0x0010000001000000, 0x0000000000000400 58962306a36Sopenharmony_ci .quad 0x0010100001010004, 0x0000100000010000 59062306a36Sopenharmony_ci .quad 0x0000100000010400, 0x0010000001000004 59162306a36Sopenharmony_ci .quad 0x0000000000000400, 0x0000000000000004 59262306a36Sopenharmony_ci .quad 0x0010000001000404, 0x0000100000010404 59362306a36Sopenharmony_ci .quad 0x0010100001010404, 0x0000100000010004 59462306a36Sopenharmony_ci .quad 0x0010100001010000, 0x0010000001000404 59562306a36Sopenharmony_ci .quad 0x0010000001000004, 0x0000000000000404 59662306a36Sopenharmony_ci .quad 0x0000100000010404, 0x0010100001010400 59762306a36Sopenharmony_ci .quad 0x0000000000000404, 0x0010000001000400 59862306a36Sopenharmony_ci .quad 0x0010000001000400, 0x0000000000000000 59962306a36Sopenharmony_ci .quad 0x0000100000010004, 0x0000100000010400 60062306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0010100001010004 60162306a36Sopenharmony_ci.L_s2: 60262306a36Sopenharmony_ci .quad 0x0801080200100020, 0x0800080000000000 60362306a36Sopenharmony_ci .quad 0x0000080000000000, 0x0001080200100020 60462306a36Sopenharmony_ci .quad 0x0001000000100000, 0x0000000200000020 60562306a36Sopenharmony_ci .quad 0x0801000200100020, 0x0800080200000020 60662306a36Sopenharmony_ci .quad 0x0800000200000020, 0x0801080200100020 60762306a36Sopenharmony_ci .quad 0x0801080000100000, 0x0800000000000000 60862306a36Sopenharmony_ci .quad 0x0800080000000000, 0x0001000000100000 60962306a36Sopenharmony_ci .quad 0x0000000200000020, 0x0801000200100020 61062306a36Sopenharmony_ci .quad 0x0001080000100000, 0x0001000200100020 61162306a36Sopenharmony_ci .quad 0x0800080200000020, 0x0000000000000000 61262306a36Sopenharmony_ci .quad 0x0800000000000000, 0x0000080000000000 61362306a36Sopenharmony_ci .quad 0x0001080200100020, 0x0801000000100000 61462306a36Sopenharmony_ci .quad 0x0001000200100020, 0x0800000200000020 61562306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0001080000100000 61662306a36Sopenharmony_ci .quad 0x0000080200000020, 0x0801080000100000 61762306a36Sopenharmony_ci .quad 0x0801000000100000, 0x0000080200000020 61862306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0001080200100020 61962306a36Sopenharmony_ci .quad 0x0801000200100020, 0x0001000000100000 62062306a36Sopenharmony_ci .quad 0x0800080200000020, 0x0801000000100000 62162306a36Sopenharmony_ci .quad 0x0801080000100000, 0x0000080000000000 62262306a36Sopenharmony_ci .quad 0x0801000000100000, 0x0800080000000000 62362306a36Sopenharmony_ci .quad 0x0000000200000020, 0x0801080200100020 62462306a36Sopenharmony_ci .quad 0x0001080200100020, 0x0000000200000020 62562306a36Sopenharmony_ci .quad 0x0000080000000000, 0x0800000000000000 62662306a36Sopenharmony_ci .quad 0x0000080200000020, 0x0801080000100000 62762306a36Sopenharmony_ci .quad 0x0001000000100000, 0x0800000200000020 62862306a36Sopenharmony_ci .quad 0x0001000200100020, 0x0800080200000020 62962306a36Sopenharmony_ci .quad 0x0800000200000020, 0x0001000200100020 63062306a36Sopenharmony_ci .quad 0x0001080000100000, 0x0000000000000000 63162306a36Sopenharmony_ci .quad 0x0800080000000000, 0x0000080200000020 63262306a36Sopenharmony_ci .quad 0x0800000000000000, 0x0801000200100020 63362306a36Sopenharmony_ci .quad 0x0801080200100020, 0x0001080000100000 63462306a36Sopenharmony_ci.L_s3: 63562306a36Sopenharmony_ci .quad 0x0000002000000208, 0x0000202008020200 63662306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0000200008020008 63762306a36Sopenharmony_ci .quad 0x0000002008000200, 0x0000000000000000 63862306a36Sopenharmony_ci .quad 0x0000202000020208, 0x0000002008000200 63962306a36Sopenharmony_ci .quad 0x0000200000020008, 0x0000000008000008 64062306a36Sopenharmony_ci .quad 0x0000000008000008, 0x0000200000020000 64162306a36Sopenharmony_ci .quad 0x0000202008020208, 0x0000200000020008 64262306a36Sopenharmony_ci .quad 0x0000200008020000, 0x0000002000000208 64362306a36Sopenharmony_ci .quad 0x0000000008000000, 0x0000000000000008 64462306a36Sopenharmony_ci .quad 0x0000202008020200, 0x0000002000000200 64562306a36Sopenharmony_ci .quad 0x0000202000020200, 0x0000200008020000 64662306a36Sopenharmony_ci .quad 0x0000200008020008, 0x0000202000020208 64762306a36Sopenharmony_ci .quad 0x0000002008000208, 0x0000202000020200 64862306a36Sopenharmony_ci .quad 0x0000200000020000, 0x0000002008000208 64962306a36Sopenharmony_ci .quad 0x0000000000000008, 0x0000202008020208 65062306a36Sopenharmony_ci .quad 0x0000002000000200, 0x0000000008000000 65162306a36Sopenharmony_ci .quad 0x0000202008020200, 0x0000000008000000 65262306a36Sopenharmony_ci .quad 0x0000200000020008, 0x0000002000000208 65362306a36Sopenharmony_ci .quad 0x0000200000020000, 0x0000202008020200 65462306a36Sopenharmony_ci .quad 0x0000002008000200, 0x0000000000000000 65562306a36Sopenharmony_ci .quad 0x0000002000000200, 0x0000200000020008 65662306a36Sopenharmony_ci .quad 0x0000202008020208, 0x0000002008000200 65762306a36Sopenharmony_ci .quad 0x0000000008000008, 0x0000002000000200 65862306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0000200008020008 65962306a36Sopenharmony_ci .quad 0x0000002008000208, 0x0000200000020000 66062306a36Sopenharmony_ci .quad 0x0000000008000000, 0x0000202008020208 66162306a36Sopenharmony_ci .quad 0x0000000000000008, 0x0000202000020208 66262306a36Sopenharmony_ci .quad 0x0000202000020200, 0x0000000008000008 66362306a36Sopenharmony_ci .quad 0x0000200008020000, 0x0000002008000208 66462306a36Sopenharmony_ci .quad 0x0000002000000208, 0x0000200008020000 66562306a36Sopenharmony_ci .quad 0x0000202000020208, 0x0000000000000008 66662306a36Sopenharmony_ci .quad 0x0000200008020008, 0x0000202000020200 66762306a36Sopenharmony_ci.L_s4: 66862306a36Sopenharmony_ci .quad 0x1008020000002001, 0x1000020800002001 66962306a36Sopenharmony_ci .quad 0x1000020800002001, 0x0000000800000000 67062306a36Sopenharmony_ci .quad 0x0008020800002000, 0x1008000800000001 67162306a36Sopenharmony_ci .quad 0x1008000000000001, 0x1000020000002001 67262306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0008020000002000 67362306a36Sopenharmony_ci .quad 0x0008020000002000, 0x1008020800002001 67462306a36Sopenharmony_ci .quad 0x1000000800000001, 0x0000000000000000 67562306a36Sopenharmony_ci .quad 0x0008000800000000, 0x1008000000000001 67662306a36Sopenharmony_ci .quad 0x1000000000000001, 0x0000020000002000 67762306a36Sopenharmony_ci .quad 0x0008000000000000, 0x1008020000002001 67862306a36Sopenharmony_ci .quad 0x0000000800000000, 0x0008000000000000 67962306a36Sopenharmony_ci .quad 0x1000020000002001, 0x0000020800002000 68062306a36Sopenharmony_ci .quad 0x1008000800000001, 0x1000000000000001 68162306a36Sopenharmony_ci .quad 0x0000020800002000, 0x0008000800000000 68262306a36Sopenharmony_ci .quad 0x0000020000002000, 0x0008020800002000 68362306a36Sopenharmony_ci .quad 0x1008020800002001, 0x1000000800000001 68462306a36Sopenharmony_ci .quad 0x0008000800000000, 0x1008000000000001 68562306a36Sopenharmony_ci .quad 0x0008020000002000, 0x1008020800002001 68662306a36Sopenharmony_ci .quad 0x1000000800000001, 0x0000000000000000 68762306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0008020000002000 68862306a36Sopenharmony_ci .quad 0x0000020800002000, 0x0008000800000000 68962306a36Sopenharmony_ci .quad 0x1008000800000001, 0x1000000000000001 69062306a36Sopenharmony_ci .quad 0x1008020000002001, 0x1000020800002001 69162306a36Sopenharmony_ci .quad 0x1000020800002001, 0x0000000800000000 69262306a36Sopenharmony_ci .quad 0x1008020800002001, 0x1000000800000001 69362306a36Sopenharmony_ci .quad 0x1000000000000001, 0x0000020000002000 69462306a36Sopenharmony_ci .quad 0x1008000000000001, 0x1000020000002001 69562306a36Sopenharmony_ci .quad 0x0008020800002000, 0x1008000800000001 69662306a36Sopenharmony_ci .quad 0x1000020000002001, 0x0000020800002000 69762306a36Sopenharmony_ci .quad 0x0008000000000000, 0x1008020000002001 69862306a36Sopenharmony_ci .quad 0x0000000800000000, 0x0008000000000000 69962306a36Sopenharmony_ci .quad 0x0000020000002000, 0x0008020800002000 70062306a36Sopenharmony_ci.L_s5: 70162306a36Sopenharmony_ci .quad 0x0000001000000100, 0x0020001002080100 70262306a36Sopenharmony_ci .quad 0x0020000002080000, 0x0420001002000100 70362306a36Sopenharmony_ci .quad 0x0000000000080000, 0x0000001000000100 70462306a36Sopenharmony_ci .quad 0x0400000000000000, 0x0020000002080000 70562306a36Sopenharmony_ci .quad 0x0400001000080100, 0x0000000000080000 70662306a36Sopenharmony_ci .quad 0x0020001002000100, 0x0400001000080100 70762306a36Sopenharmony_ci .quad 0x0420001002000100, 0x0420000002080000 70862306a36Sopenharmony_ci .quad 0x0000001000080100, 0x0400000000000000 70962306a36Sopenharmony_ci .quad 0x0020000002000000, 0x0400000000080000 71062306a36Sopenharmony_ci .quad 0x0400000000080000, 0x0000000000000000 71162306a36Sopenharmony_ci .quad 0x0400001000000100, 0x0420001002080100 71262306a36Sopenharmony_ci .quad 0x0420001002080100, 0x0020001002000100 71362306a36Sopenharmony_ci .quad 0x0420000002080000, 0x0400001000000100 71462306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0420000002000000 71562306a36Sopenharmony_ci .quad 0x0020001002080100, 0x0020000002000000 71662306a36Sopenharmony_ci .quad 0x0420000002000000, 0x0000001000080100 71762306a36Sopenharmony_ci .quad 0x0000000000080000, 0x0420001002000100 71862306a36Sopenharmony_ci .quad 0x0000001000000100, 0x0020000002000000 71962306a36Sopenharmony_ci .quad 0x0400000000000000, 0x0020000002080000 72062306a36Sopenharmony_ci .quad 0x0420001002000100, 0x0400001000080100 72162306a36Sopenharmony_ci .quad 0x0020001002000100, 0x0400000000000000 72262306a36Sopenharmony_ci .quad 0x0420000002080000, 0x0020001002080100 72362306a36Sopenharmony_ci .quad 0x0400001000080100, 0x0000001000000100 72462306a36Sopenharmony_ci .quad 0x0020000002000000, 0x0420000002080000 72562306a36Sopenharmony_ci .quad 0x0420001002080100, 0x0000001000080100 72662306a36Sopenharmony_ci .quad 0x0420000002000000, 0x0420001002080100 72762306a36Sopenharmony_ci .quad 0x0020000002080000, 0x0000000000000000 72862306a36Sopenharmony_ci .quad 0x0400000000080000, 0x0420000002000000 72962306a36Sopenharmony_ci .quad 0x0000001000080100, 0x0020001002000100 73062306a36Sopenharmony_ci .quad 0x0400001000000100, 0x0000000000080000 73162306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0400000000080000 73262306a36Sopenharmony_ci .quad 0x0020001002080100, 0x0400001000000100 73362306a36Sopenharmony_ci.L_s6: 73462306a36Sopenharmony_ci .quad 0x0200000120000010, 0x0204000020000000 73562306a36Sopenharmony_ci .quad 0x0000040000000000, 0x0204040120000010 73662306a36Sopenharmony_ci .quad 0x0204000020000000, 0x0000000100000010 73762306a36Sopenharmony_ci .quad 0x0204040120000010, 0x0004000000000000 73862306a36Sopenharmony_ci .quad 0x0200040020000000, 0x0004040100000010 73962306a36Sopenharmony_ci .quad 0x0004000000000000, 0x0200000120000010 74062306a36Sopenharmony_ci .quad 0x0004000100000010, 0x0200040020000000 74162306a36Sopenharmony_ci .quad 0x0200000020000000, 0x0000040100000010 74262306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0004000100000010 74362306a36Sopenharmony_ci .quad 0x0200040120000010, 0x0000040000000000 74462306a36Sopenharmony_ci .quad 0x0004040000000000, 0x0200040120000010 74562306a36Sopenharmony_ci .quad 0x0000000100000010, 0x0204000120000010 74662306a36Sopenharmony_ci .quad 0x0204000120000010, 0x0000000000000000 74762306a36Sopenharmony_ci .quad 0x0004040100000010, 0x0204040020000000 74862306a36Sopenharmony_ci .quad 0x0000040100000010, 0x0004040000000000 74962306a36Sopenharmony_ci .quad 0x0204040020000000, 0x0200000020000000 75062306a36Sopenharmony_ci .quad 0x0200040020000000, 0x0000000100000010 75162306a36Sopenharmony_ci .quad 0x0204000120000010, 0x0004040000000000 75262306a36Sopenharmony_ci .quad 0x0204040120000010, 0x0004000000000000 75362306a36Sopenharmony_ci .quad 0x0000040100000010, 0x0200000120000010 75462306a36Sopenharmony_ci .quad 0x0004000000000000, 0x0200040020000000 75562306a36Sopenharmony_ci .quad 0x0200000020000000, 0x0000040100000010 75662306a36Sopenharmony_ci .quad 0x0200000120000010, 0x0204040120000010 75762306a36Sopenharmony_ci .quad 0x0004040000000000, 0x0204000020000000 75862306a36Sopenharmony_ci .quad 0x0004040100000010, 0x0204040020000000 75962306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0204000120000010 76062306a36Sopenharmony_ci .quad 0x0000000100000010, 0x0000040000000000 76162306a36Sopenharmony_ci .quad 0x0204000020000000, 0x0004040100000010 76262306a36Sopenharmony_ci .quad 0x0000040000000000, 0x0004000100000010 76362306a36Sopenharmony_ci .quad 0x0200040120000010, 0x0000000000000000 76462306a36Sopenharmony_ci .quad 0x0204040020000000, 0x0200000020000000 76562306a36Sopenharmony_ci .quad 0x0004000100000010, 0x0200040120000010 76662306a36Sopenharmony_ci.L_s7: 76762306a36Sopenharmony_ci .quad 0x0002000000200000, 0x2002000004200002 76862306a36Sopenharmony_ci .quad 0x2000000004000802, 0x0000000000000000 76962306a36Sopenharmony_ci .quad 0x0000000000000800, 0x2000000004000802 77062306a36Sopenharmony_ci .quad 0x2002000000200802, 0x0002000004200800 77162306a36Sopenharmony_ci .quad 0x2002000004200802, 0x0002000000200000 77262306a36Sopenharmony_ci .quad 0x0000000000000000, 0x2000000004000002 77362306a36Sopenharmony_ci .quad 0x2000000000000002, 0x0000000004000000 77462306a36Sopenharmony_ci .quad 0x2002000004200002, 0x2000000000000802 77562306a36Sopenharmony_ci .quad 0x0000000004000800, 0x2002000000200802 77662306a36Sopenharmony_ci .quad 0x2002000000200002, 0x0000000004000800 77762306a36Sopenharmony_ci .quad 0x2000000004000002, 0x0002000004200000 77862306a36Sopenharmony_ci .quad 0x0002000004200800, 0x2002000000200002 77962306a36Sopenharmony_ci .quad 0x0002000004200000, 0x0000000000000800 78062306a36Sopenharmony_ci .quad 0x2000000000000802, 0x2002000004200802 78162306a36Sopenharmony_ci .quad 0x0002000000200800, 0x2000000000000002 78262306a36Sopenharmony_ci .quad 0x0000000004000000, 0x0002000000200800 78362306a36Sopenharmony_ci .quad 0x0000000004000000, 0x0002000000200800 78462306a36Sopenharmony_ci .quad 0x0002000000200000, 0x2000000004000802 78562306a36Sopenharmony_ci .quad 0x2000000004000802, 0x2002000004200002 78662306a36Sopenharmony_ci .quad 0x2002000004200002, 0x2000000000000002 78762306a36Sopenharmony_ci .quad 0x2002000000200002, 0x0000000004000000 78862306a36Sopenharmony_ci .quad 0x0000000004000800, 0x0002000000200000 78962306a36Sopenharmony_ci .quad 0x0002000004200800, 0x2000000000000802 79062306a36Sopenharmony_ci .quad 0x2002000000200802, 0x0002000004200800 79162306a36Sopenharmony_ci .quad 0x2000000000000802, 0x2000000004000002 79262306a36Sopenharmony_ci .quad 0x2002000004200802, 0x0002000004200000 79362306a36Sopenharmony_ci .quad 0x0002000000200800, 0x0000000000000000 79462306a36Sopenharmony_ci .quad 0x2000000000000002, 0x2002000004200802 79562306a36Sopenharmony_ci .quad 0x0000000000000000, 0x2002000000200802 79662306a36Sopenharmony_ci .quad 0x0002000004200000, 0x0000000000000800 79762306a36Sopenharmony_ci .quad 0x2000000004000002, 0x0000000004000800 79862306a36Sopenharmony_ci .quad 0x0000000000000800, 0x2002000000200002 79962306a36Sopenharmony_ci.L_s8: 80062306a36Sopenharmony_ci .quad 0x0100010410001000, 0x0000010000001000 80162306a36Sopenharmony_ci .quad 0x0000000000040000, 0x0100010410041000 80262306a36Sopenharmony_ci .quad 0x0100000010000000, 0x0100010410001000 80362306a36Sopenharmony_ci .quad 0x0000000400000000, 0x0100000010000000 80462306a36Sopenharmony_ci .quad 0x0000000400040000, 0x0100000010040000 80562306a36Sopenharmony_ci .quad 0x0100010410041000, 0x0000010000041000 80662306a36Sopenharmony_ci .quad 0x0100010010041000, 0x0000010400041000 80762306a36Sopenharmony_ci .quad 0x0000010000001000, 0x0000000400000000 80862306a36Sopenharmony_ci .quad 0x0100000010040000, 0x0100000410000000 80962306a36Sopenharmony_ci .quad 0x0100010010001000, 0x0000010400001000 81062306a36Sopenharmony_ci .quad 0x0000010000041000, 0x0000000400040000 81162306a36Sopenharmony_ci .quad 0x0100000410040000, 0x0100010010041000 81262306a36Sopenharmony_ci .quad 0x0000010400001000, 0x0000000000000000 81362306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0100000410040000 81462306a36Sopenharmony_ci .quad 0x0100000410000000, 0x0100010010001000 81562306a36Sopenharmony_ci .quad 0x0000010400041000, 0x0000000000040000 81662306a36Sopenharmony_ci .quad 0x0000010400041000, 0x0000000000040000 81762306a36Sopenharmony_ci .quad 0x0100010010041000, 0x0000010000001000 81862306a36Sopenharmony_ci .quad 0x0000000400000000, 0x0100000410040000 81962306a36Sopenharmony_ci .quad 0x0000010000001000, 0x0000010400041000 82062306a36Sopenharmony_ci .quad 0x0100010010001000, 0x0000000400000000 82162306a36Sopenharmony_ci .quad 0x0100000410000000, 0x0100000010040000 82262306a36Sopenharmony_ci .quad 0x0100000410040000, 0x0100000010000000 82362306a36Sopenharmony_ci .quad 0x0000000000040000, 0x0100010410001000 82462306a36Sopenharmony_ci .quad 0x0000000000000000, 0x0100010410041000 82562306a36Sopenharmony_ci .quad 0x0000000400040000, 0x0100000410000000 82662306a36Sopenharmony_ci .quad 0x0100000010040000, 0x0100010010001000 82762306a36Sopenharmony_ci .quad 0x0100010410001000, 0x0000000000000000 82862306a36Sopenharmony_ci .quad 0x0100010410041000, 0x0000010000041000 82962306a36Sopenharmony_ci .quad 0x0000010000041000, 0x0000010400001000 83062306a36Sopenharmony_ci .quad 0x0000010400001000, 0x0000000400040000 83162306a36Sopenharmony_ci .quad 0x0100000010000000, 0x0100010010041000 832