xref: /openbmc/linux/arch/x86/crypto/des3_ede-asm_64.S (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1c942fddfSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */
26574e6c6SJussi Kivilinna/*
36574e6c6SJussi Kivilinna * des3_ede-asm_64.S  -  x86-64 assembly implementation of 3DES cipher
46574e6c6SJussi Kivilinna *
56574e6c6SJussi Kivilinna * Copyright © 2014 Jussi Kivilinna <jussi.kivilinna@iki.fi>
66574e6c6SJussi Kivilinna */
76574e6c6SJussi Kivilinna
86574e6c6SJussi Kivilinna#include <linux/linkage.h>
96574e6c6SJussi Kivilinna
106574e6c6SJussi Kivilinna.file "des3_ede-asm_64.S"
116574e6c6SJussi Kivilinna.text
126574e6c6SJussi Kivilinna
136574e6c6SJussi Kivilinna#define s1 .L_s1
146574e6c6SJussi Kivilinna#define s2 ((s1) + (64*8))
156574e6c6SJussi Kivilinna#define s3 ((s2) + (64*8))
166574e6c6SJussi Kivilinna#define s4 ((s3) + (64*8))
176574e6c6SJussi Kivilinna#define s5 ((s4) + (64*8))
186574e6c6SJussi Kivilinna#define s6 ((s5) + (64*8))
196574e6c6SJussi Kivilinna#define s7 ((s6) + (64*8))
206574e6c6SJussi Kivilinna#define s8 ((s7) + (64*8))
216574e6c6SJussi Kivilinna
226574e6c6SJussi Kivilinna/* register macros */
236574e6c6SJussi Kivilinna#define CTX %rdi
246574e6c6SJussi Kivilinna
256574e6c6SJussi Kivilinna#define RL0 %r8
266574e6c6SJussi Kivilinna#define RL1 %r9
276574e6c6SJussi Kivilinna#define RL2 %r10
286574e6c6SJussi Kivilinna
296574e6c6SJussi Kivilinna#define RL0d %r8d
306574e6c6SJussi Kivilinna#define RL1d %r9d
316574e6c6SJussi Kivilinna#define RL2d %r10d
326574e6c6SJussi Kivilinna
336574e6c6SJussi Kivilinna#define RR0 %r11
346574e6c6SJussi Kivilinna#define RR1 %r12
356574e6c6SJussi Kivilinna#define RR2 %r13
366574e6c6SJussi Kivilinna
376574e6c6SJussi Kivilinna#define RR0d %r11d
386574e6c6SJussi Kivilinna#define RR1d %r12d
396574e6c6SJussi Kivilinna#define RR2d %r13d
406574e6c6SJussi Kivilinna
416574e6c6SJussi Kivilinna#define RW0 %rax
426574e6c6SJussi Kivilinna#define RW1 %rbx
436574e6c6SJussi Kivilinna#define RW2 %rcx
446574e6c6SJussi Kivilinna
456574e6c6SJussi Kivilinna#define RW0d %eax
466574e6c6SJussi Kivilinna#define RW1d %ebx
476574e6c6SJussi Kivilinna#define RW2d %ecx
486574e6c6SJussi Kivilinna
496574e6c6SJussi Kivilinna#define RW0bl %al
506574e6c6SJussi Kivilinna#define RW1bl %bl
516574e6c6SJussi Kivilinna#define RW2bl %cl
526574e6c6SJussi Kivilinna
536574e6c6SJussi Kivilinna#define RW0bh %ah
546574e6c6SJussi Kivilinna#define RW1bh %bh
556574e6c6SJussi Kivilinna#define RW2bh %ch
566574e6c6SJussi Kivilinna
576574e6c6SJussi Kivilinna#define RT0 %r15
583ed7b4d6SJosh Poimboeuf#define RT1 %rsi
596574e6c6SJussi Kivilinna#define RT2 %r14
606574e6c6SJussi Kivilinna#define RT3 %rdx
616574e6c6SJussi Kivilinna
626574e6c6SJussi Kivilinna#define RT0d %r15d
633ed7b4d6SJosh Poimboeuf#define RT1d %esi
646574e6c6SJussi Kivilinna#define RT2d %r14d
656574e6c6SJussi Kivilinna#define RT3d %edx
666574e6c6SJussi Kivilinna
676574e6c6SJussi Kivilinna/***********************************************************************
686574e6c6SJussi Kivilinna * 1-way 3DES
696574e6c6SJussi Kivilinna ***********************************************************************/
706574e6c6SJussi Kivilinna#define do_permutation(a, b, offset, mask) \
716574e6c6SJussi Kivilinna	movl a, RT0d; \
726574e6c6SJussi Kivilinna	shrl $(offset), RT0d; \
736574e6c6SJussi Kivilinna	xorl b, RT0d; \
746574e6c6SJussi Kivilinna	andl $(mask), RT0d; \
756574e6c6SJussi Kivilinna	xorl RT0d, b; \
766574e6c6SJussi Kivilinna	shll $(offset), RT0d; \
776574e6c6SJussi Kivilinna	xorl RT0d, a;
786574e6c6SJussi Kivilinna
796574e6c6SJussi Kivilinna#define expand_to_64bits(val, mask) \
806574e6c6SJussi Kivilinna	movl val##d, RT0d; \
816574e6c6SJussi Kivilinna	rorl $4, RT0d; \
826574e6c6SJussi Kivilinna	shlq $32, RT0; \
836574e6c6SJussi Kivilinna	orq RT0, val; \
846574e6c6SJussi Kivilinna	andq mask, val;
856574e6c6SJussi Kivilinna
866574e6c6SJussi Kivilinna#define compress_to_64bits(val) \
876574e6c6SJussi Kivilinna	movq val, RT0; \
886574e6c6SJussi Kivilinna	shrq $32, RT0; \
896574e6c6SJussi Kivilinna	roll $4, RT0d; \
906574e6c6SJussi Kivilinna	orl RT0d, val##d;
916574e6c6SJussi Kivilinna
926574e6c6SJussi Kivilinna#define initial_permutation(left, right) \
936574e6c6SJussi Kivilinna	do_permutation(left##d, right##d,  4, 0x0f0f0f0f); \
946574e6c6SJussi Kivilinna	do_permutation(left##d, right##d, 16, 0x0000ffff); \
956574e6c6SJussi Kivilinna	do_permutation(right##d, left##d,  2, 0x33333333); \
966574e6c6SJussi Kivilinna	do_permutation(right##d, left##d,  8, 0x00ff00ff); \
976574e6c6SJussi Kivilinna	movabs $0x3f3f3f3f3f3f3f3f, RT3; \
986574e6c6SJussi Kivilinna	movl left##d, RW0d; \
996574e6c6SJussi Kivilinna	roll $1, right##d; \
1006574e6c6SJussi Kivilinna	xorl right##d, RW0d; \
1016574e6c6SJussi Kivilinna	andl $0xaaaaaaaa, RW0d; \
1026574e6c6SJussi Kivilinna	xorl RW0d, left##d; \
1036574e6c6SJussi Kivilinna	xorl RW0d, right##d; \
1046574e6c6SJussi Kivilinna	roll $1, left##d; \
1056574e6c6SJussi Kivilinna	expand_to_64bits(right, RT3); \
1066574e6c6SJussi Kivilinna	expand_to_64bits(left, RT3);
1076574e6c6SJussi Kivilinna
1086574e6c6SJussi Kivilinna#define final_permutation(left, right) \
1096574e6c6SJussi Kivilinna	compress_to_64bits(right); \
1106574e6c6SJussi Kivilinna	compress_to_64bits(left); \
1116574e6c6SJussi Kivilinna	movl right##d, RW0d; \
1126574e6c6SJussi Kivilinna	rorl $1, left##d; \
1136574e6c6SJussi Kivilinna	xorl left##d, RW0d; \
1146574e6c6SJussi Kivilinna	andl $0xaaaaaaaa, RW0d; \
1156574e6c6SJussi Kivilinna	xorl RW0d, right##d; \
1166574e6c6SJussi Kivilinna	xorl RW0d, left##d; \
1176574e6c6SJussi Kivilinna	rorl $1, right##d; \
1186574e6c6SJussi Kivilinna	do_permutation(right##d, left##d,  8, 0x00ff00ff); \
1196574e6c6SJussi Kivilinna	do_permutation(right##d, left##d,  2, 0x33333333); \
1206574e6c6SJussi Kivilinna	do_permutation(left##d, right##d, 16, 0x0000ffff); \
1216574e6c6SJussi Kivilinna	do_permutation(left##d, right##d,  4, 0x0f0f0f0f);
1226574e6c6SJussi Kivilinna
1236574e6c6SJussi Kivilinna#define round1(n, from, to, load_next_key) \
1246574e6c6SJussi Kivilinna	xorq from, RW0; \
1256574e6c6SJussi Kivilinna	\
1266574e6c6SJussi Kivilinna	movzbl RW0bl, RT0d; \
1276574e6c6SJussi Kivilinna	movzbl RW0bh, RT1d; \
1286574e6c6SJussi Kivilinna	shrq $16, RW0; \
1296574e6c6SJussi Kivilinna	movzbl RW0bl, RT2d; \
1306574e6c6SJussi Kivilinna	movzbl RW0bh, RT3d; \
1316574e6c6SJussi Kivilinna	shrq $16, RW0; \
132*36955360SArd Biesheuvel	leaq s8(%rip), RW1; \
133*36955360SArd Biesheuvel	movq (RW1, RT0, 8), RT0; \
134*36955360SArd Biesheuvel	leaq s6(%rip), RW1; \
135*36955360SArd Biesheuvel	xorq (RW1, RT1, 8), to; \
1366574e6c6SJussi Kivilinna	movzbl RW0bl, RL1d; \
1376574e6c6SJussi Kivilinna	movzbl RW0bh, RT1d; \
1386574e6c6SJussi Kivilinna	shrl $16, RW0d; \
139*36955360SArd Biesheuvel	leaq s4(%rip), RW1; \
140*36955360SArd Biesheuvel	xorq (RW1, RT2, 8), RT0; \
141*36955360SArd Biesheuvel	leaq s2(%rip), RW1; \
142*36955360SArd Biesheuvel	xorq (RW1, RT3, 8), to; \
1436574e6c6SJussi Kivilinna	movzbl RW0bl, RT2d; \
1446574e6c6SJussi Kivilinna	movzbl RW0bh, RT3d; \
145*36955360SArd Biesheuvel	leaq s7(%rip), RW1; \
146*36955360SArd Biesheuvel	xorq (RW1, RL1, 8), RT0; \
147*36955360SArd Biesheuvel	leaq s5(%rip), RW1; \
148*36955360SArd Biesheuvel	xorq (RW1, RT1, 8), to; \
149*36955360SArd Biesheuvel	leaq s3(%rip), RW1; \
150*36955360SArd Biesheuvel	xorq (RW1, RT2, 8), RT0; \
1516574e6c6SJussi Kivilinna	load_next_key(n, RW0); \
1526574e6c6SJussi Kivilinna	xorq RT0, to; \
153*36955360SArd Biesheuvel	leaq s1(%rip), RW1; \
154*36955360SArd Biesheuvel	xorq (RW1, RT3, 8), to; \
1556574e6c6SJussi Kivilinna
1566574e6c6SJussi Kivilinna#define load_next_key(n, RWx) \
1576574e6c6SJussi Kivilinna	movq (((n) + 1) * 8)(CTX), RWx;
1586574e6c6SJussi Kivilinna
1596574e6c6SJussi Kivilinna#define dummy2(a, b) /*_*/
1606574e6c6SJussi Kivilinna
1616574e6c6SJussi Kivilinna#define read_block(io, left, right) \
1626574e6c6SJussi Kivilinna	movl    (io), left##d; \
1636574e6c6SJussi Kivilinna	movl   4(io), right##d; \
1646574e6c6SJussi Kivilinna	bswapl left##d; \
1656574e6c6SJussi Kivilinna	bswapl right##d;
1666574e6c6SJussi Kivilinna
1676574e6c6SJussi Kivilinna#define write_block(io, left, right) \
1686574e6c6SJussi Kivilinna	bswapl left##d; \
1696574e6c6SJussi Kivilinna	bswapl right##d; \
1706574e6c6SJussi Kivilinna	movl   left##d,   (io); \
1716574e6c6SJussi Kivilinna	movl   right##d, 4(io);
1726574e6c6SJussi Kivilinna
1736dcc5627SJiri SlabySYM_FUNC_START(des3_ede_x86_64_crypt_blk)
1746574e6c6SJussi Kivilinna	/* input:
1756574e6c6SJussi Kivilinna	 *	%rdi: round keys, CTX
1766574e6c6SJussi Kivilinna	 *	%rsi: dst
1776574e6c6SJussi Kivilinna	 *	%rdx: src
1786574e6c6SJussi Kivilinna	 */
1796574e6c6SJussi Kivilinna	pushq %rbx;
1806574e6c6SJussi Kivilinna	pushq %r12;
1816574e6c6SJussi Kivilinna	pushq %r13;
1826574e6c6SJussi Kivilinna	pushq %r14;
1836574e6c6SJussi Kivilinna	pushq %r15;
1846574e6c6SJussi Kivilinna
1853ed7b4d6SJosh Poimboeuf	pushq %rsi; /* dst */
1863ed7b4d6SJosh Poimboeuf
1876574e6c6SJussi Kivilinna	read_block(%rdx, RL0, RR0);
1886574e6c6SJussi Kivilinna	initial_permutation(RL0, RR0);
1896574e6c6SJussi Kivilinna
1906574e6c6SJussi Kivilinna	movq (CTX), RW0;
1916574e6c6SJussi Kivilinna
1926574e6c6SJussi Kivilinna	round1(0, RR0, RL0, load_next_key);
1936574e6c6SJussi Kivilinna	round1(1, RL0, RR0, load_next_key);
1946574e6c6SJussi Kivilinna	round1(2, RR0, RL0, load_next_key);
1956574e6c6SJussi Kivilinna	round1(3, RL0, RR0, load_next_key);
1966574e6c6SJussi Kivilinna	round1(4, RR0, RL0, load_next_key);
1976574e6c6SJussi Kivilinna	round1(5, RL0, RR0, load_next_key);
1986574e6c6SJussi Kivilinna	round1(6, RR0, RL0, load_next_key);
1996574e6c6SJussi Kivilinna	round1(7, RL0, RR0, load_next_key);
2006574e6c6SJussi Kivilinna	round1(8, RR0, RL0, load_next_key);
2016574e6c6SJussi Kivilinna	round1(9, RL0, RR0, load_next_key);
2026574e6c6SJussi Kivilinna	round1(10, RR0, RL0, load_next_key);
2036574e6c6SJussi Kivilinna	round1(11, RL0, RR0, load_next_key);
2046574e6c6SJussi Kivilinna	round1(12, RR0, RL0, load_next_key);
2056574e6c6SJussi Kivilinna	round1(13, RL0, RR0, load_next_key);
2066574e6c6SJussi Kivilinna	round1(14, RR0, RL0, load_next_key);
2076574e6c6SJussi Kivilinna	round1(15, RL0, RR0, load_next_key);
2086574e6c6SJussi Kivilinna
2096574e6c6SJussi Kivilinna	round1(16+0, RL0, RR0, load_next_key);
2106574e6c6SJussi Kivilinna	round1(16+1, RR0, RL0, load_next_key);
2116574e6c6SJussi Kivilinna	round1(16+2, RL0, RR0, load_next_key);
2126574e6c6SJussi Kivilinna	round1(16+3, RR0, RL0, load_next_key);
2136574e6c6SJussi Kivilinna	round1(16+4, RL0, RR0, load_next_key);
2146574e6c6SJussi Kivilinna	round1(16+5, RR0, RL0, load_next_key);
2156574e6c6SJussi Kivilinna	round1(16+6, RL0, RR0, load_next_key);
2166574e6c6SJussi Kivilinna	round1(16+7, RR0, RL0, load_next_key);
2176574e6c6SJussi Kivilinna	round1(16+8, RL0, RR0, load_next_key);
2186574e6c6SJussi Kivilinna	round1(16+9, RR0, RL0, load_next_key);
2196574e6c6SJussi Kivilinna	round1(16+10, RL0, RR0, load_next_key);
2206574e6c6SJussi Kivilinna	round1(16+11, RR0, RL0, load_next_key);
2216574e6c6SJussi Kivilinna	round1(16+12, RL0, RR0, load_next_key);
2226574e6c6SJussi Kivilinna	round1(16+13, RR0, RL0, load_next_key);
2236574e6c6SJussi Kivilinna	round1(16+14, RL0, RR0, load_next_key);
2246574e6c6SJussi Kivilinna	round1(16+15, RR0, RL0, load_next_key);
2256574e6c6SJussi Kivilinna
2266574e6c6SJussi Kivilinna	round1(32+0, RR0, RL0, load_next_key);
2276574e6c6SJussi Kivilinna	round1(32+1, RL0, RR0, load_next_key);
2286574e6c6SJussi Kivilinna	round1(32+2, RR0, RL0, load_next_key);
2296574e6c6SJussi Kivilinna	round1(32+3, RL0, RR0, load_next_key);
2306574e6c6SJussi Kivilinna	round1(32+4, RR0, RL0, load_next_key);
2316574e6c6SJussi Kivilinna	round1(32+5, RL0, RR0, load_next_key);
2326574e6c6SJussi Kivilinna	round1(32+6, RR0, RL0, load_next_key);
2336574e6c6SJussi Kivilinna	round1(32+7, RL0, RR0, load_next_key);
2346574e6c6SJussi Kivilinna	round1(32+8, RR0, RL0, load_next_key);
2356574e6c6SJussi Kivilinna	round1(32+9, RL0, RR0, load_next_key);
2366574e6c6SJussi Kivilinna	round1(32+10, RR0, RL0, load_next_key);
2376574e6c6SJussi Kivilinna	round1(32+11, RL0, RR0, load_next_key);
2386574e6c6SJussi Kivilinna	round1(32+12, RR0, RL0, load_next_key);
2396574e6c6SJussi Kivilinna	round1(32+13, RL0, RR0, load_next_key);
2406574e6c6SJussi Kivilinna	round1(32+14, RR0, RL0, load_next_key);
2416574e6c6SJussi Kivilinna	round1(32+15, RL0, RR0, dummy2);
2426574e6c6SJussi Kivilinna
2436574e6c6SJussi Kivilinna	final_permutation(RR0, RL0);
2443ed7b4d6SJosh Poimboeuf
2453ed7b4d6SJosh Poimboeuf	popq %rsi /* dst */
2466574e6c6SJussi Kivilinna	write_block(%rsi, RR0, RL0);
2476574e6c6SJussi Kivilinna
2486574e6c6SJussi Kivilinna	popq %r15;
2496574e6c6SJussi Kivilinna	popq %r14;
2506574e6c6SJussi Kivilinna	popq %r13;
2516574e6c6SJussi Kivilinna	popq %r12;
2526574e6c6SJussi Kivilinna	popq %rbx;
2536574e6c6SJussi Kivilinna
254f94909ceSPeter Zijlstra	RET;
2556dcc5627SJiri SlabySYM_FUNC_END(des3_ede_x86_64_crypt_blk)
2566574e6c6SJussi Kivilinna
2576574e6c6SJussi Kivilinna/***********************************************************************
2586574e6c6SJussi Kivilinna * 3-way 3DES
2596574e6c6SJussi Kivilinna ***********************************************************************/
2606574e6c6SJussi Kivilinna#define expand_to_64bits(val, mask) \
2616574e6c6SJussi Kivilinna	movl val##d, RT0d; \
2626574e6c6SJussi Kivilinna	rorl $4, RT0d; \
2636574e6c6SJussi Kivilinna	shlq $32, RT0; \
2646574e6c6SJussi Kivilinna	orq RT0, val; \
2656574e6c6SJussi Kivilinna	andq mask, val;
2666574e6c6SJussi Kivilinna
2676574e6c6SJussi Kivilinna#define compress_to_64bits(val) \
2686574e6c6SJussi Kivilinna	movq val, RT0; \
2696574e6c6SJussi Kivilinna	shrq $32, RT0; \
2706574e6c6SJussi Kivilinna	roll $4, RT0d; \
2716574e6c6SJussi Kivilinna	orl RT0d, val##d;
2726574e6c6SJussi Kivilinna
2736574e6c6SJussi Kivilinna#define initial_permutation3(left, right) \
2746574e6c6SJussi Kivilinna	do_permutation(left##0d, right##0d,  4, 0x0f0f0f0f); \
2756574e6c6SJussi Kivilinna	do_permutation(left##0d, right##0d, 16, 0x0000ffff); \
2766574e6c6SJussi Kivilinna	  do_permutation(left##1d, right##1d,  4, 0x0f0f0f0f); \
2776574e6c6SJussi Kivilinna	  do_permutation(left##1d, right##1d, 16, 0x0000ffff); \
2786574e6c6SJussi Kivilinna	    do_permutation(left##2d, right##2d,  4, 0x0f0f0f0f); \
2796574e6c6SJussi Kivilinna	    do_permutation(left##2d, right##2d, 16, 0x0000ffff); \
2806574e6c6SJussi Kivilinna	    \
2816574e6c6SJussi Kivilinna	do_permutation(right##0d, left##0d,  2, 0x33333333); \
2826574e6c6SJussi Kivilinna	do_permutation(right##0d, left##0d,  8, 0x00ff00ff); \
2836574e6c6SJussi Kivilinna	  do_permutation(right##1d, left##1d,  2, 0x33333333); \
2846574e6c6SJussi Kivilinna	  do_permutation(right##1d, left##1d,  8, 0x00ff00ff); \
2856574e6c6SJussi Kivilinna	    do_permutation(right##2d, left##2d,  2, 0x33333333); \
2866574e6c6SJussi Kivilinna	    do_permutation(right##2d, left##2d,  8, 0x00ff00ff); \
2876574e6c6SJussi Kivilinna	    \
2886574e6c6SJussi Kivilinna	movabs $0x3f3f3f3f3f3f3f3f, RT3; \
2896574e6c6SJussi Kivilinna	    \
2906574e6c6SJussi Kivilinna	movl left##0d, RW0d; \
2916574e6c6SJussi Kivilinna	roll $1, right##0d; \
2926574e6c6SJussi Kivilinna	xorl right##0d, RW0d; \
2936574e6c6SJussi Kivilinna	andl $0xaaaaaaaa, RW0d; \
2946574e6c6SJussi Kivilinna	xorl RW0d, left##0d; \
2956574e6c6SJussi Kivilinna	xorl RW0d, right##0d; \
2966574e6c6SJussi Kivilinna	roll $1, left##0d; \
2976574e6c6SJussi Kivilinna	expand_to_64bits(right##0, RT3); \
2986574e6c6SJussi Kivilinna	expand_to_64bits(left##0, RT3); \
2996574e6c6SJussi Kivilinna	  movl left##1d, RW1d; \
3006574e6c6SJussi Kivilinna	  roll $1, right##1d; \
3016574e6c6SJussi Kivilinna	  xorl right##1d, RW1d; \
3026574e6c6SJussi Kivilinna	  andl $0xaaaaaaaa, RW1d; \
3036574e6c6SJussi Kivilinna	  xorl RW1d, left##1d; \
3046574e6c6SJussi Kivilinna	  xorl RW1d, right##1d; \
3056574e6c6SJussi Kivilinna	  roll $1, left##1d; \
3066574e6c6SJussi Kivilinna	  expand_to_64bits(right##1, RT3); \
3076574e6c6SJussi Kivilinna	  expand_to_64bits(left##1, RT3); \
3086574e6c6SJussi Kivilinna	    movl left##2d, RW2d; \
3096574e6c6SJussi Kivilinna	    roll $1, right##2d; \
3106574e6c6SJussi Kivilinna	    xorl right##2d, RW2d; \
3116574e6c6SJussi Kivilinna	    andl $0xaaaaaaaa, RW2d; \
3126574e6c6SJussi Kivilinna	    xorl RW2d, left##2d; \
3136574e6c6SJussi Kivilinna	    xorl RW2d, right##2d; \
3146574e6c6SJussi Kivilinna	    roll $1, left##2d; \
3156574e6c6SJussi Kivilinna	    expand_to_64bits(right##2, RT3); \
3166574e6c6SJussi Kivilinna	    expand_to_64bits(left##2, RT3);
3176574e6c6SJussi Kivilinna
3186574e6c6SJussi Kivilinna#define final_permutation3(left, right) \
3196574e6c6SJussi Kivilinna	compress_to_64bits(right##0); \
3206574e6c6SJussi Kivilinna	compress_to_64bits(left##0); \
3216574e6c6SJussi Kivilinna	movl right##0d, RW0d; \
3226574e6c6SJussi Kivilinna	rorl $1, left##0d; \
3236574e6c6SJussi Kivilinna	xorl left##0d, RW0d; \
3246574e6c6SJussi Kivilinna	andl $0xaaaaaaaa, RW0d; \
3256574e6c6SJussi Kivilinna	xorl RW0d, right##0d; \
3266574e6c6SJussi Kivilinna	xorl RW0d, left##0d; \
3276574e6c6SJussi Kivilinna	rorl $1, right##0d; \
3286574e6c6SJussi Kivilinna	  compress_to_64bits(right##1); \
3296574e6c6SJussi Kivilinna	  compress_to_64bits(left##1); \
3306574e6c6SJussi Kivilinna	  movl right##1d, RW1d; \
3316574e6c6SJussi Kivilinna	  rorl $1, left##1d; \
3326574e6c6SJussi Kivilinna	  xorl left##1d, RW1d; \
3336574e6c6SJussi Kivilinna	  andl $0xaaaaaaaa, RW1d; \
3346574e6c6SJussi Kivilinna	  xorl RW1d, right##1d; \
3356574e6c6SJussi Kivilinna	  xorl RW1d, left##1d; \
3366574e6c6SJussi Kivilinna	  rorl $1, right##1d; \
3376574e6c6SJussi Kivilinna	    compress_to_64bits(right##2); \
3386574e6c6SJussi Kivilinna	    compress_to_64bits(left##2); \
3396574e6c6SJussi Kivilinna	    movl right##2d, RW2d; \
3406574e6c6SJussi Kivilinna	    rorl $1, left##2d; \
3416574e6c6SJussi Kivilinna	    xorl left##2d, RW2d; \
3426574e6c6SJussi Kivilinna	    andl $0xaaaaaaaa, RW2d; \
3436574e6c6SJussi Kivilinna	    xorl RW2d, right##2d; \
3446574e6c6SJussi Kivilinna	    xorl RW2d, left##2d; \
3456574e6c6SJussi Kivilinna	    rorl $1, right##2d; \
3466574e6c6SJussi Kivilinna	    \
3476574e6c6SJussi Kivilinna	do_permutation(right##0d, left##0d,  8, 0x00ff00ff); \
3486574e6c6SJussi Kivilinna	do_permutation(right##0d, left##0d,  2, 0x33333333); \
3496574e6c6SJussi Kivilinna	  do_permutation(right##1d, left##1d,  8, 0x00ff00ff); \
3506574e6c6SJussi Kivilinna	  do_permutation(right##1d, left##1d,  2, 0x33333333); \
3516574e6c6SJussi Kivilinna	    do_permutation(right##2d, left##2d,  8, 0x00ff00ff); \
3526574e6c6SJussi Kivilinna	    do_permutation(right##2d, left##2d,  2, 0x33333333); \
3536574e6c6SJussi Kivilinna	    \
3546574e6c6SJussi Kivilinna	do_permutation(left##0d, right##0d, 16, 0x0000ffff); \
3556574e6c6SJussi Kivilinna	do_permutation(left##0d, right##0d,  4, 0x0f0f0f0f); \
3566574e6c6SJussi Kivilinna	  do_permutation(left##1d, right##1d, 16, 0x0000ffff); \
3576574e6c6SJussi Kivilinna	  do_permutation(left##1d, right##1d,  4, 0x0f0f0f0f); \
3586574e6c6SJussi Kivilinna	    do_permutation(left##2d, right##2d, 16, 0x0000ffff); \
3596574e6c6SJussi Kivilinna	    do_permutation(left##2d, right##2d,  4, 0x0f0f0f0f);
3606574e6c6SJussi Kivilinna
3616574e6c6SJussi Kivilinna#define round3(n, from, to, load_next_key, do_movq) \
3626574e6c6SJussi Kivilinna	xorq from##0, RW0; \
3636574e6c6SJussi Kivilinna	movzbl RW0bl, RT3d; \
3646574e6c6SJussi Kivilinna	movzbl RW0bh, RT1d; \
3656574e6c6SJussi Kivilinna	shrq $16, RW0; \
366*36955360SArd Biesheuvel	leaq s8(%rip), RT2; \
367*36955360SArd Biesheuvel	xorq (RT2, RT3, 8), to##0; \
368*36955360SArd Biesheuvel	leaq s6(%rip), RT2; \
369*36955360SArd Biesheuvel	xorq (RT2, RT1, 8), to##0; \
3706574e6c6SJussi Kivilinna	movzbl RW0bl, RT3d; \
3716574e6c6SJussi Kivilinna	movzbl RW0bh, RT1d; \
3726574e6c6SJussi Kivilinna	shrq $16, RW0; \
373*36955360SArd Biesheuvel	leaq s4(%rip), RT2; \
374*36955360SArd Biesheuvel	xorq (RT2, RT3, 8), to##0; \
375*36955360SArd Biesheuvel	leaq s2(%rip), RT2; \
376*36955360SArd Biesheuvel	xorq (RT2, RT1, 8), to##0; \
3776574e6c6SJussi Kivilinna	movzbl RW0bl, RT3d; \
3786574e6c6SJussi Kivilinna	movzbl RW0bh, RT1d; \
3796574e6c6SJussi Kivilinna	shrl $16, RW0d; \
380*36955360SArd Biesheuvel	leaq s7(%rip), RT2; \
381*36955360SArd Biesheuvel	xorq (RT2, RT3, 8), to##0; \
382*36955360SArd Biesheuvel	leaq s5(%rip), RT2; \
383*36955360SArd Biesheuvel	xorq (RT2, RT1, 8), to##0; \
3846574e6c6SJussi Kivilinna	movzbl RW0bl, RT3d; \
3856574e6c6SJussi Kivilinna	movzbl RW0bh, RT1d; \
3866574e6c6SJussi Kivilinna	load_next_key(n, RW0); \
387*36955360SArd Biesheuvel	leaq s3(%rip), RT2; \
388*36955360SArd Biesheuvel	xorq (RT2, RT3, 8), to##0; \
389*36955360SArd Biesheuvel	leaq s1(%rip), RT2; \
390*36955360SArd Biesheuvel	xorq (RT2, RT1, 8), to##0; \
3916574e6c6SJussi Kivilinna		xorq from##1, RW1; \
3926574e6c6SJussi Kivilinna		movzbl RW1bl, RT3d; \
3936574e6c6SJussi Kivilinna		movzbl RW1bh, RT1d; \
3946574e6c6SJussi Kivilinna		shrq $16, RW1; \
395*36955360SArd Biesheuvel		leaq s8(%rip), RT2; \
396*36955360SArd Biesheuvel		xorq (RT2, RT3, 8), to##1; \
397*36955360SArd Biesheuvel		leaq s6(%rip), RT2; \
398*36955360SArd Biesheuvel		xorq (RT2, RT1, 8), to##1; \
3996574e6c6SJussi Kivilinna		movzbl RW1bl, RT3d; \
4006574e6c6SJussi Kivilinna		movzbl RW1bh, RT1d; \
4016574e6c6SJussi Kivilinna		shrq $16, RW1; \
402*36955360SArd Biesheuvel		leaq s4(%rip), RT2; \
403*36955360SArd Biesheuvel		xorq (RT2, RT3, 8), to##1; \
404*36955360SArd Biesheuvel		leaq s2(%rip), RT2; \
405*36955360SArd Biesheuvel		xorq (RT2, RT1, 8), to##1; \
4066574e6c6SJussi Kivilinna		movzbl RW1bl, RT3d; \
4076574e6c6SJussi Kivilinna		movzbl RW1bh, RT1d; \
4086574e6c6SJussi Kivilinna		shrl $16, RW1d; \
409*36955360SArd Biesheuvel		leaq s7(%rip), RT2; \
410*36955360SArd Biesheuvel		xorq (RT2, RT3, 8), to##1; \
411*36955360SArd Biesheuvel		leaq s5(%rip), RT2; \
412*36955360SArd Biesheuvel		xorq (RT2, RT1, 8), to##1; \
4136574e6c6SJussi Kivilinna		movzbl RW1bl, RT3d; \
4146574e6c6SJussi Kivilinna		movzbl RW1bh, RT1d; \
4156574e6c6SJussi Kivilinna		do_movq(RW0, RW1); \
416*36955360SArd Biesheuvel		leaq s3(%rip), RT2; \
417*36955360SArd Biesheuvel		xorq (RT2, RT3, 8), to##1; \
418*36955360SArd Biesheuvel		leaq s1(%rip), RT2; \
419*36955360SArd Biesheuvel		xorq (RT2, RT1, 8), to##1; \
4206574e6c6SJussi Kivilinna			xorq from##2, RW2; \
4216574e6c6SJussi Kivilinna			movzbl RW2bl, RT3d; \
4226574e6c6SJussi Kivilinna			movzbl RW2bh, RT1d; \
4236574e6c6SJussi Kivilinna			shrq $16, RW2; \
424*36955360SArd Biesheuvel			leaq s8(%rip), RT2; \
425*36955360SArd Biesheuvel			xorq (RT2, RT3, 8), to##2; \
426*36955360SArd Biesheuvel			leaq s6(%rip), RT2; \
427*36955360SArd Biesheuvel			xorq (RT2, RT1, 8), to##2; \
4286574e6c6SJussi Kivilinna			movzbl RW2bl, RT3d; \
4296574e6c6SJussi Kivilinna			movzbl RW2bh, RT1d; \
4306574e6c6SJussi Kivilinna			shrq $16, RW2; \
431*36955360SArd Biesheuvel			leaq s4(%rip), RT2; \
432*36955360SArd Biesheuvel			xorq (RT2, RT3, 8), to##2; \
433*36955360SArd Biesheuvel			leaq s2(%rip), RT2; \
434*36955360SArd Biesheuvel			xorq (RT2, RT1, 8), to##2; \
4356574e6c6SJussi Kivilinna			movzbl RW2bl, RT3d; \
4366574e6c6SJussi Kivilinna			movzbl RW2bh, RT1d; \
4376574e6c6SJussi Kivilinna			shrl $16, RW2d; \
438*36955360SArd Biesheuvel			leaq s7(%rip), RT2; \
439*36955360SArd Biesheuvel			xorq (RT2, RT3, 8), to##2; \
440*36955360SArd Biesheuvel			leaq s5(%rip), RT2; \
441*36955360SArd Biesheuvel			xorq (RT2, RT1, 8), to##2; \
4426574e6c6SJussi Kivilinna			movzbl RW2bl, RT3d; \
4436574e6c6SJussi Kivilinna			movzbl RW2bh, RT1d; \
4446574e6c6SJussi Kivilinna			do_movq(RW0, RW2); \
445*36955360SArd Biesheuvel			leaq s3(%rip), RT2; \
446*36955360SArd Biesheuvel			xorq (RT2, RT3, 8), to##2; \
447*36955360SArd Biesheuvel			leaq s1(%rip), RT2; \
448*36955360SArd Biesheuvel			xorq (RT2, RT1, 8), to##2;
4496574e6c6SJussi Kivilinna
4506574e6c6SJussi Kivilinna#define __movq(src, dst) \
4516574e6c6SJussi Kivilinna	movq src, dst;
4526574e6c6SJussi Kivilinna
4536dcc5627SJiri SlabySYM_FUNC_START(des3_ede_x86_64_crypt_blk_3way)
4546574e6c6SJussi Kivilinna	/* input:
4556574e6c6SJussi Kivilinna	 *	%rdi: ctx, round keys
4566574e6c6SJussi Kivilinna	 *	%rsi: dst (3 blocks)
4576574e6c6SJussi Kivilinna	 *	%rdx: src (3 blocks)
4586574e6c6SJussi Kivilinna	 */
4596574e6c6SJussi Kivilinna
4606574e6c6SJussi Kivilinna	pushq %rbx;
4616574e6c6SJussi Kivilinna	pushq %r12;
4626574e6c6SJussi Kivilinna	pushq %r13;
4636574e6c6SJussi Kivilinna	pushq %r14;
4646574e6c6SJussi Kivilinna	pushq %r15;
4656574e6c6SJussi Kivilinna
4663ed7b4d6SJosh Poimboeuf	pushq %rsi /* dst */
4673ed7b4d6SJosh Poimboeuf
4686574e6c6SJussi Kivilinna	/* load input */
4696574e6c6SJussi Kivilinna	movl 0 * 4(%rdx), RL0d;
4706574e6c6SJussi Kivilinna	movl 1 * 4(%rdx), RR0d;
4716574e6c6SJussi Kivilinna	movl 2 * 4(%rdx), RL1d;
4726574e6c6SJussi Kivilinna	movl 3 * 4(%rdx), RR1d;
4736574e6c6SJussi Kivilinna	movl 4 * 4(%rdx), RL2d;
4746574e6c6SJussi Kivilinna	movl 5 * 4(%rdx), RR2d;
4756574e6c6SJussi Kivilinna
4766574e6c6SJussi Kivilinna	bswapl RL0d;
4776574e6c6SJussi Kivilinna	bswapl RR0d;
4786574e6c6SJussi Kivilinna	bswapl RL1d;
4796574e6c6SJussi Kivilinna	bswapl RR1d;
4806574e6c6SJussi Kivilinna	bswapl RL2d;
4816574e6c6SJussi Kivilinna	bswapl RR2d;
4826574e6c6SJussi Kivilinna
4836574e6c6SJussi Kivilinna	initial_permutation3(RL, RR);
4846574e6c6SJussi Kivilinna
4856574e6c6SJussi Kivilinna	movq 0(CTX), RW0;
4866574e6c6SJussi Kivilinna	movq RW0, RW1;
4876574e6c6SJussi Kivilinna	movq RW0, RW2;
4886574e6c6SJussi Kivilinna
4896574e6c6SJussi Kivilinna	round3(0, RR, RL, load_next_key, __movq);
4906574e6c6SJussi Kivilinna	round3(1, RL, RR, load_next_key, __movq);
4916574e6c6SJussi Kivilinna	round3(2, RR, RL, load_next_key, __movq);
4926574e6c6SJussi Kivilinna	round3(3, RL, RR, load_next_key, __movq);
4936574e6c6SJussi Kivilinna	round3(4, RR, RL, load_next_key, __movq);
4946574e6c6SJussi Kivilinna	round3(5, RL, RR, load_next_key, __movq);
4956574e6c6SJussi Kivilinna	round3(6, RR, RL, load_next_key, __movq);
4966574e6c6SJussi Kivilinna	round3(7, RL, RR, load_next_key, __movq);
4976574e6c6SJussi Kivilinna	round3(8, RR, RL, load_next_key, __movq);
4986574e6c6SJussi Kivilinna	round3(9, RL, RR, load_next_key, __movq);
4996574e6c6SJussi Kivilinna	round3(10, RR, RL, load_next_key, __movq);
5006574e6c6SJussi Kivilinna	round3(11, RL, RR, load_next_key, __movq);
5016574e6c6SJussi Kivilinna	round3(12, RR, RL, load_next_key, __movq);
5026574e6c6SJussi Kivilinna	round3(13, RL, RR, load_next_key, __movq);
5036574e6c6SJussi Kivilinna	round3(14, RR, RL, load_next_key, __movq);
5046574e6c6SJussi Kivilinna	round3(15, RL, RR, load_next_key, __movq);
5056574e6c6SJussi Kivilinna
5066574e6c6SJussi Kivilinna	round3(16+0, RL, RR, load_next_key, __movq);
5076574e6c6SJussi Kivilinna	round3(16+1, RR, RL, load_next_key, __movq);
5086574e6c6SJussi Kivilinna	round3(16+2, RL, RR, load_next_key, __movq);
5096574e6c6SJussi Kivilinna	round3(16+3, RR, RL, load_next_key, __movq);
5106574e6c6SJussi Kivilinna	round3(16+4, RL, RR, load_next_key, __movq);
5116574e6c6SJussi Kivilinna	round3(16+5, RR, RL, load_next_key, __movq);
5126574e6c6SJussi Kivilinna	round3(16+6, RL, RR, load_next_key, __movq);
5136574e6c6SJussi Kivilinna	round3(16+7, RR, RL, load_next_key, __movq);
5146574e6c6SJussi Kivilinna	round3(16+8, RL, RR, load_next_key, __movq);
5156574e6c6SJussi Kivilinna	round3(16+9, RR, RL, load_next_key, __movq);
5166574e6c6SJussi Kivilinna	round3(16+10, RL, RR, load_next_key, __movq);
5176574e6c6SJussi Kivilinna	round3(16+11, RR, RL, load_next_key, __movq);
5186574e6c6SJussi Kivilinna	round3(16+12, RL, RR, load_next_key, __movq);
5196574e6c6SJussi Kivilinna	round3(16+13, RR, RL, load_next_key, __movq);
5206574e6c6SJussi Kivilinna	round3(16+14, RL, RR, load_next_key, __movq);
5216574e6c6SJussi Kivilinna	round3(16+15, RR, RL, load_next_key, __movq);
5226574e6c6SJussi Kivilinna
5236574e6c6SJussi Kivilinna	round3(32+0, RR, RL, load_next_key, __movq);
5246574e6c6SJussi Kivilinna	round3(32+1, RL, RR, load_next_key, __movq);
5256574e6c6SJussi Kivilinna	round3(32+2, RR, RL, load_next_key, __movq);
5266574e6c6SJussi Kivilinna	round3(32+3, RL, RR, load_next_key, __movq);
5276574e6c6SJussi Kivilinna	round3(32+4, RR, RL, load_next_key, __movq);
5286574e6c6SJussi Kivilinna	round3(32+5, RL, RR, load_next_key, __movq);
5296574e6c6SJussi Kivilinna	round3(32+6, RR, RL, load_next_key, __movq);
5306574e6c6SJussi Kivilinna	round3(32+7, RL, RR, load_next_key, __movq);
5316574e6c6SJussi Kivilinna	round3(32+8, RR, RL, load_next_key, __movq);
5326574e6c6SJussi Kivilinna	round3(32+9, RL, RR, load_next_key, __movq);
5336574e6c6SJussi Kivilinna	round3(32+10, RR, RL, load_next_key, __movq);
5346574e6c6SJussi Kivilinna	round3(32+11, RL, RR, load_next_key, __movq);
5356574e6c6SJussi Kivilinna	round3(32+12, RR, RL, load_next_key, __movq);
5366574e6c6SJussi Kivilinna	round3(32+13, RL, RR, load_next_key, __movq);
5376574e6c6SJussi Kivilinna	round3(32+14, RR, RL, load_next_key, __movq);
5386574e6c6SJussi Kivilinna	round3(32+15, RL, RR, dummy2, dummy2);
5396574e6c6SJussi Kivilinna
5406574e6c6SJussi Kivilinna	final_permutation3(RR, RL);
5416574e6c6SJussi Kivilinna
5426574e6c6SJussi Kivilinna	bswapl RR0d;
5436574e6c6SJussi Kivilinna	bswapl RL0d;
5446574e6c6SJussi Kivilinna	bswapl RR1d;
5456574e6c6SJussi Kivilinna	bswapl RL1d;
5466574e6c6SJussi Kivilinna	bswapl RR2d;
5476574e6c6SJussi Kivilinna	bswapl RL2d;
5486574e6c6SJussi Kivilinna
5493ed7b4d6SJosh Poimboeuf	popq %rsi /* dst */
5506574e6c6SJussi Kivilinna	movl RR0d, 0 * 4(%rsi);
5516574e6c6SJussi Kivilinna	movl RL0d, 1 * 4(%rsi);
5526574e6c6SJussi Kivilinna	movl RR1d, 2 * 4(%rsi);
5536574e6c6SJussi Kivilinna	movl RL1d, 3 * 4(%rsi);
5546574e6c6SJussi Kivilinna	movl RR2d, 4 * 4(%rsi);
5556574e6c6SJussi Kivilinna	movl RL2d, 5 * 4(%rsi);
5566574e6c6SJussi Kivilinna
5576574e6c6SJussi Kivilinna	popq %r15;
5586574e6c6SJussi Kivilinna	popq %r14;
5596574e6c6SJussi Kivilinna	popq %r13;
5606574e6c6SJussi Kivilinna	popq %r12;
5616574e6c6SJussi Kivilinna	popq %rbx;
5626574e6c6SJussi Kivilinna
563f94909ceSPeter Zijlstra	RET;
5646dcc5627SJiri SlabySYM_FUNC_END(des3_ede_x86_64_crypt_blk_3way)
5656574e6c6SJussi Kivilinna
566e183914aSDenys Vlasenko.section	.rodata, "a", @progbits
5676574e6c6SJussi Kivilinna.align 16
5686574e6c6SJussi Kivilinna.L_s1:
5696574e6c6SJussi Kivilinna	.quad 0x0010100001010400, 0x0000000000000000
5706574e6c6SJussi Kivilinna	.quad 0x0000100000010000, 0x0010100001010404
5716574e6c6SJussi Kivilinna	.quad 0x0010100001010004, 0x0000100000010404
5726574e6c6SJussi Kivilinna	.quad 0x0000000000000004, 0x0000100000010000
5736574e6c6SJussi Kivilinna	.quad 0x0000000000000400, 0x0010100001010400
5746574e6c6SJussi Kivilinna	.quad 0x0010100001010404, 0x0000000000000400
5756574e6c6SJussi Kivilinna	.quad 0x0010000001000404, 0x0010100001010004
5766574e6c6SJussi Kivilinna	.quad 0x0010000001000000, 0x0000000000000004
5776574e6c6SJussi Kivilinna	.quad 0x0000000000000404, 0x0010000001000400
5786574e6c6SJussi Kivilinna	.quad 0x0010000001000400, 0x0000100000010400
5796574e6c6SJussi Kivilinna	.quad 0x0000100000010400, 0x0010100001010000
5806574e6c6SJussi Kivilinna	.quad 0x0010100001010000, 0x0010000001000404
5816574e6c6SJussi Kivilinna	.quad 0x0000100000010004, 0x0010000001000004
5826574e6c6SJussi Kivilinna	.quad 0x0010000001000004, 0x0000100000010004
5836574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0000000000000404
5846574e6c6SJussi Kivilinna	.quad 0x0000100000010404, 0x0010000001000000
5856574e6c6SJussi Kivilinna	.quad 0x0000100000010000, 0x0010100001010404
5866574e6c6SJussi Kivilinna	.quad 0x0000000000000004, 0x0010100001010000
5876574e6c6SJussi Kivilinna	.quad 0x0010100001010400, 0x0010000001000000
5886574e6c6SJussi Kivilinna	.quad 0x0010000001000000, 0x0000000000000400
5896574e6c6SJussi Kivilinna	.quad 0x0010100001010004, 0x0000100000010000
5906574e6c6SJussi Kivilinna	.quad 0x0000100000010400, 0x0010000001000004
5916574e6c6SJussi Kivilinna	.quad 0x0000000000000400, 0x0000000000000004
5926574e6c6SJussi Kivilinna	.quad 0x0010000001000404, 0x0000100000010404
5936574e6c6SJussi Kivilinna	.quad 0x0010100001010404, 0x0000100000010004
5946574e6c6SJussi Kivilinna	.quad 0x0010100001010000, 0x0010000001000404
5956574e6c6SJussi Kivilinna	.quad 0x0010000001000004, 0x0000000000000404
5966574e6c6SJussi Kivilinna	.quad 0x0000100000010404, 0x0010100001010400
5976574e6c6SJussi Kivilinna	.quad 0x0000000000000404, 0x0010000001000400
5986574e6c6SJussi Kivilinna	.quad 0x0010000001000400, 0x0000000000000000
5996574e6c6SJussi Kivilinna	.quad 0x0000100000010004, 0x0000100000010400
6006574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0010100001010004
6016574e6c6SJussi Kivilinna.L_s2:
6026574e6c6SJussi Kivilinna	.quad 0x0801080200100020, 0x0800080000000000
6036574e6c6SJussi Kivilinna	.quad 0x0000080000000000, 0x0001080200100020
6046574e6c6SJussi Kivilinna	.quad 0x0001000000100000, 0x0000000200000020
6056574e6c6SJussi Kivilinna	.quad 0x0801000200100020, 0x0800080200000020
6066574e6c6SJussi Kivilinna	.quad 0x0800000200000020, 0x0801080200100020
6076574e6c6SJussi Kivilinna	.quad 0x0801080000100000, 0x0800000000000000
6086574e6c6SJussi Kivilinna	.quad 0x0800080000000000, 0x0001000000100000
6096574e6c6SJussi Kivilinna	.quad 0x0000000200000020, 0x0801000200100020
6106574e6c6SJussi Kivilinna	.quad 0x0001080000100000, 0x0001000200100020
6116574e6c6SJussi Kivilinna	.quad 0x0800080200000020, 0x0000000000000000
6126574e6c6SJussi Kivilinna	.quad 0x0800000000000000, 0x0000080000000000
6136574e6c6SJussi Kivilinna	.quad 0x0001080200100020, 0x0801000000100000
6146574e6c6SJussi Kivilinna	.quad 0x0001000200100020, 0x0800000200000020
6156574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0001080000100000
6166574e6c6SJussi Kivilinna	.quad 0x0000080200000020, 0x0801080000100000
6176574e6c6SJussi Kivilinna	.quad 0x0801000000100000, 0x0000080200000020
6186574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0001080200100020
6196574e6c6SJussi Kivilinna	.quad 0x0801000200100020, 0x0001000000100000
6206574e6c6SJussi Kivilinna	.quad 0x0800080200000020, 0x0801000000100000
6216574e6c6SJussi Kivilinna	.quad 0x0801080000100000, 0x0000080000000000
6226574e6c6SJussi Kivilinna	.quad 0x0801000000100000, 0x0800080000000000
6236574e6c6SJussi Kivilinna	.quad 0x0000000200000020, 0x0801080200100020
6246574e6c6SJussi Kivilinna	.quad 0x0001080200100020, 0x0000000200000020
6256574e6c6SJussi Kivilinna	.quad 0x0000080000000000, 0x0800000000000000
6266574e6c6SJussi Kivilinna	.quad 0x0000080200000020, 0x0801080000100000
6276574e6c6SJussi Kivilinna	.quad 0x0001000000100000, 0x0800000200000020
6286574e6c6SJussi Kivilinna	.quad 0x0001000200100020, 0x0800080200000020
6296574e6c6SJussi Kivilinna	.quad 0x0800000200000020, 0x0001000200100020
6306574e6c6SJussi Kivilinna	.quad 0x0001080000100000, 0x0000000000000000
6316574e6c6SJussi Kivilinna	.quad 0x0800080000000000, 0x0000080200000020
6326574e6c6SJussi Kivilinna	.quad 0x0800000000000000, 0x0801000200100020
6336574e6c6SJussi Kivilinna	.quad 0x0801080200100020, 0x0001080000100000
6346574e6c6SJussi Kivilinna.L_s3:
6356574e6c6SJussi Kivilinna	.quad 0x0000002000000208, 0x0000202008020200
6366574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0000200008020008
6376574e6c6SJussi Kivilinna	.quad 0x0000002008000200, 0x0000000000000000
6386574e6c6SJussi Kivilinna	.quad 0x0000202000020208, 0x0000002008000200
6396574e6c6SJussi Kivilinna	.quad 0x0000200000020008, 0x0000000008000008
6406574e6c6SJussi Kivilinna	.quad 0x0000000008000008, 0x0000200000020000
6416574e6c6SJussi Kivilinna	.quad 0x0000202008020208, 0x0000200000020008
6426574e6c6SJussi Kivilinna	.quad 0x0000200008020000, 0x0000002000000208
6436574e6c6SJussi Kivilinna	.quad 0x0000000008000000, 0x0000000000000008
6446574e6c6SJussi Kivilinna	.quad 0x0000202008020200, 0x0000002000000200
6456574e6c6SJussi Kivilinna	.quad 0x0000202000020200, 0x0000200008020000
6466574e6c6SJussi Kivilinna	.quad 0x0000200008020008, 0x0000202000020208
6476574e6c6SJussi Kivilinna	.quad 0x0000002008000208, 0x0000202000020200
6486574e6c6SJussi Kivilinna	.quad 0x0000200000020000, 0x0000002008000208
6496574e6c6SJussi Kivilinna	.quad 0x0000000000000008, 0x0000202008020208
6506574e6c6SJussi Kivilinna	.quad 0x0000002000000200, 0x0000000008000000
6516574e6c6SJussi Kivilinna	.quad 0x0000202008020200, 0x0000000008000000
6526574e6c6SJussi Kivilinna	.quad 0x0000200000020008, 0x0000002000000208
6536574e6c6SJussi Kivilinna	.quad 0x0000200000020000, 0x0000202008020200
6546574e6c6SJussi Kivilinna	.quad 0x0000002008000200, 0x0000000000000000
6556574e6c6SJussi Kivilinna	.quad 0x0000002000000200, 0x0000200000020008
6566574e6c6SJussi Kivilinna	.quad 0x0000202008020208, 0x0000002008000200
6576574e6c6SJussi Kivilinna	.quad 0x0000000008000008, 0x0000002000000200
6586574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0000200008020008
6596574e6c6SJussi Kivilinna	.quad 0x0000002008000208, 0x0000200000020000
6606574e6c6SJussi Kivilinna	.quad 0x0000000008000000, 0x0000202008020208
6616574e6c6SJussi Kivilinna	.quad 0x0000000000000008, 0x0000202000020208
6626574e6c6SJussi Kivilinna	.quad 0x0000202000020200, 0x0000000008000008
6636574e6c6SJussi Kivilinna	.quad 0x0000200008020000, 0x0000002008000208
6646574e6c6SJussi Kivilinna	.quad 0x0000002000000208, 0x0000200008020000
6656574e6c6SJussi Kivilinna	.quad 0x0000202000020208, 0x0000000000000008
6666574e6c6SJussi Kivilinna	.quad 0x0000200008020008, 0x0000202000020200
6676574e6c6SJussi Kivilinna.L_s4:
6686574e6c6SJussi Kivilinna	.quad 0x1008020000002001, 0x1000020800002001
6696574e6c6SJussi Kivilinna	.quad 0x1000020800002001, 0x0000000800000000
6706574e6c6SJussi Kivilinna	.quad 0x0008020800002000, 0x1008000800000001
6716574e6c6SJussi Kivilinna	.quad 0x1008000000000001, 0x1000020000002001
6726574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0008020000002000
6736574e6c6SJussi Kivilinna	.quad 0x0008020000002000, 0x1008020800002001
6746574e6c6SJussi Kivilinna	.quad 0x1000000800000001, 0x0000000000000000
6756574e6c6SJussi Kivilinna	.quad 0x0008000800000000, 0x1008000000000001
6766574e6c6SJussi Kivilinna	.quad 0x1000000000000001, 0x0000020000002000
6776574e6c6SJussi Kivilinna	.quad 0x0008000000000000, 0x1008020000002001
6786574e6c6SJussi Kivilinna	.quad 0x0000000800000000, 0x0008000000000000
6796574e6c6SJussi Kivilinna	.quad 0x1000020000002001, 0x0000020800002000
6806574e6c6SJussi Kivilinna	.quad 0x1008000800000001, 0x1000000000000001
6816574e6c6SJussi Kivilinna	.quad 0x0000020800002000, 0x0008000800000000
6826574e6c6SJussi Kivilinna	.quad 0x0000020000002000, 0x0008020800002000
6836574e6c6SJussi Kivilinna	.quad 0x1008020800002001, 0x1000000800000001
6846574e6c6SJussi Kivilinna	.quad 0x0008000800000000, 0x1008000000000001
6856574e6c6SJussi Kivilinna	.quad 0x0008020000002000, 0x1008020800002001
6866574e6c6SJussi Kivilinna	.quad 0x1000000800000001, 0x0000000000000000
6876574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0008020000002000
6886574e6c6SJussi Kivilinna	.quad 0x0000020800002000, 0x0008000800000000
6896574e6c6SJussi Kivilinna	.quad 0x1008000800000001, 0x1000000000000001
6906574e6c6SJussi Kivilinna	.quad 0x1008020000002001, 0x1000020800002001
6916574e6c6SJussi Kivilinna	.quad 0x1000020800002001, 0x0000000800000000
6926574e6c6SJussi Kivilinna	.quad 0x1008020800002001, 0x1000000800000001
6936574e6c6SJussi Kivilinna	.quad 0x1000000000000001, 0x0000020000002000
6946574e6c6SJussi Kivilinna	.quad 0x1008000000000001, 0x1000020000002001
6956574e6c6SJussi Kivilinna	.quad 0x0008020800002000, 0x1008000800000001
6966574e6c6SJussi Kivilinna	.quad 0x1000020000002001, 0x0000020800002000
6976574e6c6SJussi Kivilinna	.quad 0x0008000000000000, 0x1008020000002001
6986574e6c6SJussi Kivilinna	.quad 0x0000000800000000, 0x0008000000000000
6996574e6c6SJussi Kivilinna	.quad 0x0000020000002000, 0x0008020800002000
7006574e6c6SJussi Kivilinna.L_s5:
7016574e6c6SJussi Kivilinna	.quad 0x0000001000000100, 0x0020001002080100
7026574e6c6SJussi Kivilinna	.quad 0x0020000002080000, 0x0420001002000100
7036574e6c6SJussi Kivilinna	.quad 0x0000000000080000, 0x0000001000000100
7046574e6c6SJussi Kivilinna	.quad 0x0400000000000000, 0x0020000002080000
7056574e6c6SJussi Kivilinna	.quad 0x0400001000080100, 0x0000000000080000
7066574e6c6SJussi Kivilinna	.quad 0x0020001002000100, 0x0400001000080100
7076574e6c6SJussi Kivilinna	.quad 0x0420001002000100, 0x0420000002080000
7086574e6c6SJussi Kivilinna	.quad 0x0000001000080100, 0x0400000000000000
7096574e6c6SJussi Kivilinna	.quad 0x0020000002000000, 0x0400000000080000
7106574e6c6SJussi Kivilinna	.quad 0x0400000000080000, 0x0000000000000000
7116574e6c6SJussi Kivilinna	.quad 0x0400001000000100, 0x0420001002080100
7126574e6c6SJussi Kivilinna	.quad 0x0420001002080100, 0x0020001002000100
7136574e6c6SJussi Kivilinna	.quad 0x0420000002080000, 0x0400001000000100
7146574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0420000002000000
7156574e6c6SJussi Kivilinna	.quad 0x0020001002080100, 0x0020000002000000
7166574e6c6SJussi Kivilinna	.quad 0x0420000002000000, 0x0000001000080100
7176574e6c6SJussi Kivilinna	.quad 0x0000000000080000, 0x0420001002000100
7186574e6c6SJussi Kivilinna	.quad 0x0000001000000100, 0x0020000002000000
7196574e6c6SJussi Kivilinna	.quad 0x0400000000000000, 0x0020000002080000
7206574e6c6SJussi Kivilinna	.quad 0x0420001002000100, 0x0400001000080100
7216574e6c6SJussi Kivilinna	.quad 0x0020001002000100, 0x0400000000000000
7226574e6c6SJussi Kivilinna	.quad 0x0420000002080000, 0x0020001002080100
7236574e6c6SJussi Kivilinna	.quad 0x0400001000080100, 0x0000001000000100
7246574e6c6SJussi Kivilinna	.quad 0x0020000002000000, 0x0420000002080000
7256574e6c6SJussi Kivilinna	.quad 0x0420001002080100, 0x0000001000080100
7266574e6c6SJussi Kivilinna	.quad 0x0420000002000000, 0x0420001002080100
7276574e6c6SJussi Kivilinna	.quad 0x0020000002080000, 0x0000000000000000
7286574e6c6SJussi Kivilinna	.quad 0x0400000000080000, 0x0420000002000000
7296574e6c6SJussi Kivilinna	.quad 0x0000001000080100, 0x0020001002000100
7306574e6c6SJussi Kivilinna	.quad 0x0400001000000100, 0x0000000000080000
7316574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0400000000080000
7326574e6c6SJussi Kivilinna	.quad 0x0020001002080100, 0x0400001000000100
7336574e6c6SJussi Kivilinna.L_s6:
7346574e6c6SJussi Kivilinna	.quad 0x0200000120000010, 0x0204000020000000
7356574e6c6SJussi Kivilinna	.quad 0x0000040000000000, 0x0204040120000010
7366574e6c6SJussi Kivilinna	.quad 0x0204000020000000, 0x0000000100000010
7376574e6c6SJussi Kivilinna	.quad 0x0204040120000010, 0x0004000000000000
7386574e6c6SJussi Kivilinna	.quad 0x0200040020000000, 0x0004040100000010
7396574e6c6SJussi Kivilinna	.quad 0x0004000000000000, 0x0200000120000010
7406574e6c6SJussi Kivilinna	.quad 0x0004000100000010, 0x0200040020000000
7416574e6c6SJussi Kivilinna	.quad 0x0200000020000000, 0x0000040100000010
7426574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0004000100000010
7436574e6c6SJussi Kivilinna	.quad 0x0200040120000010, 0x0000040000000000
7446574e6c6SJussi Kivilinna	.quad 0x0004040000000000, 0x0200040120000010
7456574e6c6SJussi Kivilinna	.quad 0x0000000100000010, 0x0204000120000010
7466574e6c6SJussi Kivilinna	.quad 0x0204000120000010, 0x0000000000000000
7476574e6c6SJussi Kivilinna	.quad 0x0004040100000010, 0x0204040020000000
7486574e6c6SJussi Kivilinna	.quad 0x0000040100000010, 0x0004040000000000
7496574e6c6SJussi Kivilinna	.quad 0x0204040020000000, 0x0200000020000000
7506574e6c6SJussi Kivilinna	.quad 0x0200040020000000, 0x0000000100000010
7516574e6c6SJussi Kivilinna	.quad 0x0204000120000010, 0x0004040000000000
7526574e6c6SJussi Kivilinna	.quad 0x0204040120000010, 0x0004000000000000
7536574e6c6SJussi Kivilinna	.quad 0x0000040100000010, 0x0200000120000010
7546574e6c6SJussi Kivilinna	.quad 0x0004000000000000, 0x0200040020000000
7556574e6c6SJussi Kivilinna	.quad 0x0200000020000000, 0x0000040100000010
7566574e6c6SJussi Kivilinna	.quad 0x0200000120000010, 0x0204040120000010
7576574e6c6SJussi Kivilinna	.quad 0x0004040000000000, 0x0204000020000000
7586574e6c6SJussi Kivilinna	.quad 0x0004040100000010, 0x0204040020000000
7596574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0204000120000010
7606574e6c6SJussi Kivilinna	.quad 0x0000000100000010, 0x0000040000000000
7616574e6c6SJussi Kivilinna	.quad 0x0204000020000000, 0x0004040100000010
7626574e6c6SJussi Kivilinna	.quad 0x0000040000000000, 0x0004000100000010
7636574e6c6SJussi Kivilinna	.quad 0x0200040120000010, 0x0000000000000000
7646574e6c6SJussi Kivilinna	.quad 0x0204040020000000, 0x0200000020000000
7656574e6c6SJussi Kivilinna	.quad 0x0004000100000010, 0x0200040120000010
7666574e6c6SJussi Kivilinna.L_s7:
7676574e6c6SJussi Kivilinna	.quad 0x0002000000200000, 0x2002000004200002
7686574e6c6SJussi Kivilinna	.quad 0x2000000004000802, 0x0000000000000000
7696574e6c6SJussi Kivilinna	.quad 0x0000000000000800, 0x2000000004000802
7706574e6c6SJussi Kivilinna	.quad 0x2002000000200802, 0x0002000004200800
7716574e6c6SJussi Kivilinna	.quad 0x2002000004200802, 0x0002000000200000
7726574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x2000000004000002
7736574e6c6SJussi Kivilinna	.quad 0x2000000000000002, 0x0000000004000000
7746574e6c6SJussi Kivilinna	.quad 0x2002000004200002, 0x2000000000000802
7756574e6c6SJussi Kivilinna	.quad 0x0000000004000800, 0x2002000000200802
7766574e6c6SJussi Kivilinna	.quad 0x2002000000200002, 0x0000000004000800
7776574e6c6SJussi Kivilinna	.quad 0x2000000004000002, 0x0002000004200000
7786574e6c6SJussi Kivilinna	.quad 0x0002000004200800, 0x2002000000200002
7796574e6c6SJussi Kivilinna	.quad 0x0002000004200000, 0x0000000000000800
7806574e6c6SJussi Kivilinna	.quad 0x2000000000000802, 0x2002000004200802
7816574e6c6SJussi Kivilinna	.quad 0x0002000000200800, 0x2000000000000002
7826574e6c6SJussi Kivilinna	.quad 0x0000000004000000, 0x0002000000200800
7836574e6c6SJussi Kivilinna	.quad 0x0000000004000000, 0x0002000000200800
7846574e6c6SJussi Kivilinna	.quad 0x0002000000200000, 0x2000000004000802
7856574e6c6SJussi Kivilinna	.quad 0x2000000004000802, 0x2002000004200002
7866574e6c6SJussi Kivilinna	.quad 0x2002000004200002, 0x2000000000000002
7876574e6c6SJussi Kivilinna	.quad 0x2002000000200002, 0x0000000004000000
7886574e6c6SJussi Kivilinna	.quad 0x0000000004000800, 0x0002000000200000
7896574e6c6SJussi Kivilinna	.quad 0x0002000004200800, 0x2000000000000802
7906574e6c6SJussi Kivilinna	.quad 0x2002000000200802, 0x0002000004200800
7916574e6c6SJussi Kivilinna	.quad 0x2000000000000802, 0x2000000004000002
7926574e6c6SJussi Kivilinna	.quad 0x2002000004200802, 0x0002000004200000
7936574e6c6SJussi Kivilinna	.quad 0x0002000000200800, 0x0000000000000000
7946574e6c6SJussi Kivilinna	.quad 0x2000000000000002, 0x2002000004200802
7956574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x2002000000200802
7966574e6c6SJussi Kivilinna	.quad 0x0002000004200000, 0x0000000000000800
7976574e6c6SJussi Kivilinna	.quad 0x2000000004000002, 0x0000000004000800
7986574e6c6SJussi Kivilinna	.quad 0x0000000000000800, 0x2002000000200002
7996574e6c6SJussi Kivilinna.L_s8:
8006574e6c6SJussi Kivilinna	.quad 0x0100010410001000, 0x0000010000001000
8016574e6c6SJussi Kivilinna	.quad 0x0000000000040000, 0x0100010410041000
8026574e6c6SJussi Kivilinna	.quad 0x0100000010000000, 0x0100010410001000
8036574e6c6SJussi Kivilinna	.quad 0x0000000400000000, 0x0100000010000000
8046574e6c6SJussi Kivilinna	.quad 0x0000000400040000, 0x0100000010040000
8056574e6c6SJussi Kivilinna	.quad 0x0100010410041000, 0x0000010000041000
8066574e6c6SJussi Kivilinna	.quad 0x0100010010041000, 0x0000010400041000
8076574e6c6SJussi Kivilinna	.quad 0x0000010000001000, 0x0000000400000000
8086574e6c6SJussi Kivilinna	.quad 0x0100000010040000, 0x0100000410000000
8096574e6c6SJussi Kivilinna	.quad 0x0100010010001000, 0x0000010400001000
8106574e6c6SJussi Kivilinna	.quad 0x0000010000041000, 0x0000000400040000
8116574e6c6SJussi Kivilinna	.quad 0x0100000410040000, 0x0100010010041000
8126574e6c6SJussi Kivilinna	.quad 0x0000010400001000, 0x0000000000000000
8136574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0100000410040000
8146574e6c6SJussi Kivilinna	.quad 0x0100000410000000, 0x0100010010001000
8156574e6c6SJussi Kivilinna	.quad 0x0000010400041000, 0x0000000000040000
8166574e6c6SJussi Kivilinna	.quad 0x0000010400041000, 0x0000000000040000
8176574e6c6SJussi Kivilinna	.quad 0x0100010010041000, 0x0000010000001000
8186574e6c6SJussi Kivilinna	.quad 0x0000000400000000, 0x0100000410040000
8196574e6c6SJussi Kivilinna	.quad 0x0000010000001000, 0x0000010400041000
8206574e6c6SJussi Kivilinna	.quad 0x0100010010001000, 0x0000000400000000
8216574e6c6SJussi Kivilinna	.quad 0x0100000410000000, 0x0100000010040000
8226574e6c6SJussi Kivilinna	.quad 0x0100000410040000, 0x0100000010000000
8236574e6c6SJussi Kivilinna	.quad 0x0000000000040000, 0x0100010410001000
8246574e6c6SJussi Kivilinna	.quad 0x0000000000000000, 0x0100010410041000
8256574e6c6SJussi Kivilinna	.quad 0x0000000400040000, 0x0100000410000000
8266574e6c6SJussi Kivilinna	.quad 0x0100000010040000, 0x0100010010001000
8276574e6c6SJussi Kivilinna	.quad 0x0100010410001000, 0x0000000000000000
8286574e6c6SJussi Kivilinna	.quad 0x0100010410041000, 0x0000010000041000
8296574e6c6SJussi Kivilinna	.quad 0x0000010000041000, 0x0000010400001000
8306574e6c6SJussi Kivilinna	.quad 0x0000010400001000, 0x0000000400040000
8316574e6c6SJussi Kivilinna	.quad 0x0100000010000000, 0x0100010010041000
832