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