cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

des3_ede-asm_64.S (26148B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * des3_ede-asm_64.S  -  x86-64 assembly implementation of 3DES cipher
      4 *
      5 * Copyright © 2014 Jussi Kivilinna <jussi.kivilinna@iki.fi>
      6 */
      7
      8#include <linux/linkage.h>
      9
     10.file "des3_ede-asm_64.S"
     11.text
     12
     13#define s1 .L_s1
     14#define s2 ((s1) + (64*8))
     15#define s3 ((s2) + (64*8))
     16#define s4 ((s3) + (64*8))
     17#define s5 ((s4) + (64*8))
     18#define s6 ((s5) + (64*8))
     19#define s7 ((s6) + (64*8))
     20#define s8 ((s7) + (64*8))
     21
     22/* register macros */
     23#define CTX %rdi
     24
     25#define RL0 %r8
     26#define RL1 %r9
     27#define RL2 %r10
     28
     29#define RL0d %r8d
     30#define RL1d %r9d
     31#define RL2d %r10d
     32
     33#define RR0 %r11
     34#define RR1 %r12
     35#define RR2 %r13
     36
     37#define RR0d %r11d
     38#define RR1d %r12d
     39#define RR2d %r13d
     40
     41#define RW0 %rax
     42#define RW1 %rbx
     43#define RW2 %rcx
     44
     45#define RW0d %eax
     46#define RW1d %ebx
     47#define RW2d %ecx
     48
     49#define RW0bl %al
     50#define RW1bl %bl
     51#define RW2bl %cl
     52
     53#define RW0bh %ah
     54#define RW1bh %bh
     55#define RW2bh %ch
     56
     57#define RT0 %r15
     58#define RT1 %rsi
     59#define RT2 %r14
     60#define RT3 %rdx
     61
     62#define RT0d %r15d
     63#define RT1d %esi
     64#define RT2d %r14d
     65#define RT3d %edx
     66
     67/***********************************************************************
     68 * 1-way 3DES
     69 ***********************************************************************/
     70#define do_permutation(a, b, offset, mask) \
     71	movl a, RT0d; \
     72	shrl $(offset), RT0d; \
     73	xorl b, RT0d; \
     74	andl $(mask), RT0d; \
     75	xorl RT0d, b; \
     76	shll $(offset), RT0d; \
     77	xorl RT0d, a;
     78
     79#define expand_to_64bits(val, mask) \
     80	movl val##d, RT0d; \
     81	rorl $4, RT0d; \
     82	shlq $32, RT0; \
     83	orq RT0, val; \
     84	andq mask, val;
     85
     86#define compress_to_64bits(val) \
     87	movq val, RT0; \
     88	shrq $32, RT0; \
     89	roll $4, RT0d; \
     90	orl RT0d, val##d;
     91
     92#define initial_permutation(left, right) \
     93	do_permutation(left##d, right##d,  4, 0x0f0f0f0f); \
     94	do_permutation(left##d, right##d, 16, 0x0000ffff); \
     95	do_permutation(right##d, left##d,  2, 0x33333333); \
     96	do_permutation(right##d, left##d,  8, 0x00ff00ff); \
     97	movabs $0x3f3f3f3f3f3f3f3f, RT3; \
     98	movl left##d, RW0d; \
     99	roll $1, right##d; \
    100	xorl right##d, RW0d; \
    101	andl $0xaaaaaaaa, RW0d; \
    102	xorl RW0d, left##d; \
    103	xorl RW0d, right##d; \
    104	roll $1, left##d; \
    105	expand_to_64bits(right, RT3); \
    106	expand_to_64bits(left, RT3);
    107
    108#define final_permutation(left, right) \
    109	compress_to_64bits(right); \
    110	compress_to_64bits(left); \
    111	movl right##d, RW0d; \
    112	rorl $1, left##d; \
    113	xorl left##d, RW0d; \
    114	andl $0xaaaaaaaa, RW0d; \
    115	xorl RW0d, right##d; \
    116	xorl RW0d, left##d; \
    117	rorl $1, right##d; \
    118	do_permutation(right##d, left##d,  8, 0x00ff00ff); \
    119	do_permutation(right##d, left##d,  2, 0x33333333); \
    120	do_permutation(left##d, right##d, 16, 0x0000ffff); \
    121	do_permutation(left##d, right##d,  4, 0x0f0f0f0f);
    122
    123#define round1(n, from, to, load_next_key) \
    124	xorq from, RW0; \
    125	\
    126	movzbl RW0bl, RT0d; \
    127	movzbl RW0bh, RT1d; \
    128	shrq $16, RW0; \
    129	movzbl RW0bl, RT2d; \
    130	movzbl RW0bh, RT3d; \
    131	shrq $16, RW0; \
    132	movq s8(, RT0, 8), RT0; \
    133	xorq s6(, RT1, 8), to; \
    134	movzbl RW0bl, RL1d; \
    135	movzbl RW0bh, RT1d; \
    136	shrl $16, RW0d; \
    137	xorq s4(, RT2, 8), RT0; \
    138	xorq s2(, RT3, 8), to; \
    139	movzbl RW0bl, RT2d; \
    140	movzbl RW0bh, RT3d; \
    141	xorq s7(, RL1, 8), RT0; \
    142	xorq s5(, RT1, 8), to; \
    143	xorq s3(, RT2, 8), RT0; \
    144	load_next_key(n, RW0); \
    145	xorq RT0, to; \
    146	xorq s1(, RT3, 8), to; \
    147
    148#define load_next_key(n, RWx) \
    149	movq (((n) + 1) * 8)(CTX), RWx;
    150
    151#define dummy2(a, b) /*_*/
    152
    153#define read_block(io, left, right) \
    154	movl    (io), left##d; \
    155	movl   4(io), right##d; \
    156	bswapl left##d; \
    157	bswapl right##d;
    158
    159#define write_block(io, left, right) \
    160	bswapl left##d; \
    161	bswapl right##d; \
    162	movl   left##d,   (io); \
    163	movl   right##d, 4(io);
    164
    165SYM_FUNC_START(des3_ede_x86_64_crypt_blk)
    166	/* input:
    167	 *	%rdi: round keys, CTX
    168	 *	%rsi: dst
    169	 *	%rdx: src
    170	 */
    171	pushq %rbx;
    172	pushq %r12;
    173	pushq %r13;
    174	pushq %r14;
    175	pushq %r15;
    176
    177	pushq %rsi; /* dst */
    178
    179	read_block(%rdx, RL0, RR0);
    180	initial_permutation(RL0, RR0);
    181
    182	movq (CTX), RW0;
    183
    184	round1(0, RR0, RL0, load_next_key);
    185	round1(1, RL0, RR0, load_next_key);
    186	round1(2, RR0, RL0, load_next_key);
    187	round1(3, RL0, RR0, load_next_key);
    188	round1(4, RR0, RL0, load_next_key);
    189	round1(5, RL0, RR0, load_next_key);
    190	round1(6, RR0, RL0, load_next_key);
    191	round1(7, RL0, RR0, load_next_key);
    192	round1(8, RR0, RL0, load_next_key);
    193	round1(9, RL0, RR0, load_next_key);
    194	round1(10, RR0, RL0, load_next_key);
    195	round1(11, RL0, RR0, load_next_key);
    196	round1(12, RR0, RL0, load_next_key);
    197	round1(13, RL0, RR0, load_next_key);
    198	round1(14, RR0, RL0, load_next_key);
    199	round1(15, RL0, RR0, load_next_key);
    200
    201	round1(16+0, RL0, RR0, load_next_key);
    202	round1(16+1, RR0, RL0, load_next_key);
    203	round1(16+2, RL0, RR0, load_next_key);
    204	round1(16+3, RR0, RL0, load_next_key);
    205	round1(16+4, RL0, RR0, load_next_key);
    206	round1(16+5, RR0, RL0, load_next_key);
    207	round1(16+6, RL0, RR0, load_next_key);
    208	round1(16+7, RR0, RL0, load_next_key);
    209	round1(16+8, RL0, RR0, load_next_key);
    210	round1(16+9, RR0, RL0, load_next_key);
    211	round1(16+10, RL0, RR0, load_next_key);
    212	round1(16+11, RR0, RL0, load_next_key);
    213	round1(16+12, RL0, RR0, load_next_key);
    214	round1(16+13, RR0, RL0, load_next_key);
    215	round1(16+14, RL0, RR0, load_next_key);
    216	round1(16+15, RR0, RL0, load_next_key);
    217
    218	round1(32+0, RR0, RL0, load_next_key);
    219	round1(32+1, RL0, RR0, load_next_key);
    220	round1(32+2, RR0, RL0, load_next_key);
    221	round1(32+3, RL0, RR0, load_next_key);
    222	round1(32+4, RR0, RL0, load_next_key);
    223	round1(32+5, RL0, RR0, load_next_key);
    224	round1(32+6, RR0, RL0, load_next_key);
    225	round1(32+7, RL0, RR0, load_next_key);
    226	round1(32+8, RR0, RL0, load_next_key);
    227	round1(32+9, RL0, RR0, load_next_key);
    228	round1(32+10, RR0, RL0, load_next_key);
    229	round1(32+11, RL0, RR0, load_next_key);
    230	round1(32+12, RR0, RL0, load_next_key);
    231	round1(32+13, RL0, RR0, load_next_key);
    232	round1(32+14, RR0, RL0, load_next_key);
    233	round1(32+15, RL0, RR0, dummy2);
    234
    235	final_permutation(RR0, RL0);
    236
    237	popq %rsi /* dst */
    238	write_block(%rsi, RR0, RL0);
    239
    240	popq %r15;
    241	popq %r14;
    242	popq %r13;
    243	popq %r12;
    244	popq %rbx;
    245
    246	RET;
    247SYM_FUNC_END(des3_ede_x86_64_crypt_blk)
    248
    249/***********************************************************************
    250 * 3-way 3DES
    251 ***********************************************************************/
    252#define expand_to_64bits(val, mask) \
    253	movl val##d, RT0d; \
    254	rorl $4, RT0d; \
    255	shlq $32, RT0; \
    256	orq RT0, val; \
    257	andq mask, val;
    258
    259#define compress_to_64bits(val) \
    260	movq val, RT0; \
    261	shrq $32, RT0; \
    262	roll $4, RT0d; \
    263	orl RT0d, val##d;
    264
    265#define initial_permutation3(left, right) \
    266	do_permutation(left##0d, right##0d,  4, 0x0f0f0f0f); \
    267	do_permutation(left##0d, right##0d, 16, 0x0000ffff); \
    268	  do_permutation(left##1d, right##1d,  4, 0x0f0f0f0f); \
    269	  do_permutation(left##1d, right##1d, 16, 0x0000ffff); \
    270	    do_permutation(left##2d, right##2d,  4, 0x0f0f0f0f); \
    271	    do_permutation(left##2d, right##2d, 16, 0x0000ffff); \
    272	    \
    273	do_permutation(right##0d, left##0d,  2, 0x33333333); \
    274	do_permutation(right##0d, left##0d,  8, 0x00ff00ff); \
    275	  do_permutation(right##1d, left##1d,  2, 0x33333333); \
    276	  do_permutation(right##1d, left##1d,  8, 0x00ff00ff); \
    277	    do_permutation(right##2d, left##2d,  2, 0x33333333); \
    278	    do_permutation(right##2d, left##2d,  8, 0x00ff00ff); \
    279	    \
    280	movabs $0x3f3f3f3f3f3f3f3f, RT3; \
    281	    \
    282	movl left##0d, RW0d; \
    283	roll $1, right##0d; \
    284	xorl right##0d, RW0d; \
    285	andl $0xaaaaaaaa, RW0d; \
    286	xorl RW0d, left##0d; \
    287	xorl RW0d, right##0d; \
    288	roll $1, left##0d; \
    289	expand_to_64bits(right##0, RT3); \
    290	expand_to_64bits(left##0, RT3); \
    291	  movl left##1d, RW1d; \
    292	  roll $1, right##1d; \
    293	  xorl right##1d, RW1d; \
    294	  andl $0xaaaaaaaa, RW1d; \
    295	  xorl RW1d, left##1d; \
    296	  xorl RW1d, right##1d; \
    297	  roll $1, left##1d; \
    298	  expand_to_64bits(right##1, RT3); \
    299	  expand_to_64bits(left##1, RT3); \
    300	    movl left##2d, RW2d; \
    301	    roll $1, right##2d; \
    302	    xorl right##2d, RW2d; \
    303	    andl $0xaaaaaaaa, RW2d; \
    304	    xorl RW2d, left##2d; \
    305	    xorl RW2d, right##2d; \
    306	    roll $1, left##2d; \
    307	    expand_to_64bits(right##2, RT3); \
    308	    expand_to_64bits(left##2, RT3);
    309
    310#define final_permutation3(left, right) \
    311	compress_to_64bits(right##0); \
    312	compress_to_64bits(left##0); \
    313	movl right##0d, RW0d; \
    314	rorl $1, left##0d; \
    315	xorl left##0d, RW0d; \
    316	andl $0xaaaaaaaa, RW0d; \
    317	xorl RW0d, right##0d; \
    318	xorl RW0d, left##0d; \
    319	rorl $1, right##0d; \
    320	  compress_to_64bits(right##1); \
    321	  compress_to_64bits(left##1); \
    322	  movl right##1d, RW1d; \
    323	  rorl $1, left##1d; \
    324	  xorl left##1d, RW1d; \
    325	  andl $0xaaaaaaaa, RW1d; \
    326	  xorl RW1d, right##1d; \
    327	  xorl RW1d, left##1d; \
    328	  rorl $1, right##1d; \
    329	    compress_to_64bits(right##2); \
    330	    compress_to_64bits(left##2); \
    331	    movl right##2d, RW2d; \
    332	    rorl $1, left##2d; \
    333	    xorl left##2d, RW2d; \
    334	    andl $0xaaaaaaaa, RW2d; \
    335	    xorl RW2d, right##2d; \
    336	    xorl RW2d, left##2d; \
    337	    rorl $1, right##2d; \
    338	    \
    339	do_permutation(right##0d, left##0d,  8, 0x00ff00ff); \
    340	do_permutation(right##0d, left##0d,  2, 0x33333333); \
    341	  do_permutation(right##1d, left##1d,  8, 0x00ff00ff); \
    342	  do_permutation(right##1d, left##1d,  2, 0x33333333); \
    343	    do_permutation(right##2d, left##2d,  8, 0x00ff00ff); \
    344	    do_permutation(right##2d, left##2d,  2, 0x33333333); \
    345	    \
    346	do_permutation(left##0d, right##0d, 16, 0x0000ffff); \
    347	do_permutation(left##0d, right##0d,  4, 0x0f0f0f0f); \
    348	  do_permutation(left##1d, right##1d, 16, 0x0000ffff); \
    349	  do_permutation(left##1d, right##1d,  4, 0x0f0f0f0f); \
    350	    do_permutation(left##2d, right##2d, 16, 0x0000ffff); \
    351	    do_permutation(left##2d, right##2d,  4, 0x0f0f0f0f);
    352
    353#define round3(n, from, to, load_next_key, do_movq) \
    354	xorq from##0, RW0; \
    355	movzbl RW0bl, RT3d; \
    356	movzbl RW0bh, RT1d; \
    357	shrq $16, RW0; \
    358	xorq s8(, RT3, 8), to##0; \
    359	xorq s6(, RT1, 8), to##0; \
    360	movzbl RW0bl, RT3d; \
    361	movzbl RW0bh, RT1d; \
    362	shrq $16, RW0; \
    363	xorq s4(, RT3, 8), to##0; \
    364	xorq s2(, RT1, 8), to##0; \
    365	movzbl RW0bl, RT3d; \
    366	movzbl RW0bh, RT1d; \
    367	shrl $16, RW0d; \
    368	xorq s7(, RT3, 8), to##0; \
    369	xorq s5(, RT1, 8), to##0; \
    370	movzbl RW0bl, RT3d; \
    371	movzbl RW0bh, RT1d; \
    372	load_next_key(n, RW0); \
    373	xorq s3(, RT3, 8), to##0; \
    374	xorq s1(, RT1, 8), to##0; \
    375		xorq from##1, RW1; \
    376		movzbl RW1bl, RT3d; \
    377		movzbl RW1bh, RT1d; \
    378		shrq $16, RW1; \
    379		xorq s8(, RT3, 8), to##1; \
    380		xorq s6(, RT1, 8), to##1; \
    381		movzbl RW1bl, RT3d; \
    382		movzbl RW1bh, RT1d; \
    383		shrq $16, RW1; \
    384		xorq s4(, RT3, 8), to##1; \
    385		xorq s2(, RT1, 8), to##1; \
    386		movzbl RW1bl, RT3d; \
    387		movzbl RW1bh, RT1d; \
    388		shrl $16, RW1d; \
    389		xorq s7(, RT3, 8), to##1; \
    390		xorq s5(, RT1, 8), to##1; \
    391		movzbl RW1bl, RT3d; \
    392		movzbl RW1bh, RT1d; \
    393		do_movq(RW0, RW1); \
    394		xorq s3(, RT3, 8), to##1; \
    395		xorq s1(, RT1, 8), to##1; \
    396			xorq from##2, RW2; \
    397			movzbl RW2bl, RT3d; \
    398			movzbl RW2bh, RT1d; \
    399			shrq $16, RW2; \
    400			xorq s8(, RT3, 8), to##2; \
    401			xorq s6(, RT1, 8), to##2; \
    402			movzbl RW2bl, RT3d; \
    403			movzbl RW2bh, RT1d; \
    404			shrq $16, RW2; \
    405			xorq s4(, RT3, 8), to##2; \
    406			xorq s2(, RT1, 8), to##2; \
    407			movzbl RW2bl, RT3d; \
    408			movzbl RW2bh, RT1d; \
    409			shrl $16, RW2d; \
    410			xorq s7(, RT3, 8), to##2; \
    411			xorq s5(, RT1, 8), to##2; \
    412			movzbl RW2bl, RT3d; \
    413			movzbl RW2bh, RT1d; \
    414			do_movq(RW0, RW2); \
    415			xorq s3(, RT3, 8), to##2; \
    416			xorq s1(, RT1, 8), to##2;
    417
    418#define __movq(src, dst) \
    419	movq src, dst;
    420
    421SYM_FUNC_START(des3_ede_x86_64_crypt_blk_3way)
    422	/* input:
    423	 *	%rdi: ctx, round keys
    424	 *	%rsi: dst (3 blocks)
    425	 *	%rdx: src (3 blocks)
    426	 */
    427
    428	pushq %rbx;
    429	pushq %r12;
    430	pushq %r13;
    431	pushq %r14;
    432	pushq %r15;
    433
    434	pushq %rsi /* dst */
    435
    436	/* load input */
    437	movl 0 * 4(%rdx), RL0d;
    438	movl 1 * 4(%rdx), RR0d;
    439	movl 2 * 4(%rdx), RL1d;
    440	movl 3 * 4(%rdx), RR1d;
    441	movl 4 * 4(%rdx), RL2d;
    442	movl 5 * 4(%rdx), RR2d;
    443
    444	bswapl RL0d;
    445	bswapl RR0d;
    446	bswapl RL1d;
    447	bswapl RR1d;
    448	bswapl RL2d;
    449	bswapl RR2d;
    450
    451	initial_permutation3(RL, RR);
    452
    453	movq 0(CTX), RW0;
    454	movq RW0, RW1;
    455	movq RW0, RW2;
    456
    457	round3(0, RR, RL, load_next_key, __movq);
    458	round3(1, RL, RR, load_next_key, __movq);
    459	round3(2, RR, RL, load_next_key, __movq);
    460	round3(3, RL, RR, load_next_key, __movq);
    461	round3(4, RR, RL, load_next_key, __movq);
    462	round3(5, RL, RR, load_next_key, __movq);
    463	round3(6, RR, RL, load_next_key, __movq);
    464	round3(7, RL, RR, load_next_key, __movq);
    465	round3(8, RR, RL, load_next_key, __movq);
    466	round3(9, RL, RR, load_next_key, __movq);
    467	round3(10, RR, RL, load_next_key, __movq);
    468	round3(11, RL, RR, load_next_key, __movq);
    469	round3(12, RR, RL, load_next_key, __movq);
    470	round3(13, RL, RR, load_next_key, __movq);
    471	round3(14, RR, RL, load_next_key, __movq);
    472	round3(15, RL, RR, load_next_key, __movq);
    473
    474	round3(16+0, RL, RR, load_next_key, __movq);
    475	round3(16+1, RR, RL, load_next_key, __movq);
    476	round3(16+2, RL, RR, load_next_key, __movq);
    477	round3(16+3, RR, RL, load_next_key, __movq);
    478	round3(16+4, RL, RR, load_next_key, __movq);
    479	round3(16+5, RR, RL, load_next_key, __movq);
    480	round3(16+6, RL, RR, load_next_key, __movq);
    481	round3(16+7, RR, RL, load_next_key, __movq);
    482	round3(16+8, RL, RR, load_next_key, __movq);
    483	round3(16+9, RR, RL, load_next_key, __movq);
    484	round3(16+10, RL, RR, load_next_key, __movq);
    485	round3(16+11, RR, RL, load_next_key, __movq);
    486	round3(16+12, RL, RR, load_next_key, __movq);
    487	round3(16+13, RR, RL, load_next_key, __movq);
    488	round3(16+14, RL, RR, load_next_key, __movq);
    489	round3(16+15, RR, RL, load_next_key, __movq);
    490
    491	round3(32+0, RR, RL, load_next_key, __movq);
    492	round3(32+1, RL, RR, load_next_key, __movq);
    493	round3(32+2, RR, RL, load_next_key, __movq);
    494	round3(32+3, RL, RR, load_next_key, __movq);
    495	round3(32+4, RR, RL, load_next_key, __movq);
    496	round3(32+5, RL, RR, load_next_key, __movq);
    497	round3(32+6, RR, RL, load_next_key, __movq);
    498	round3(32+7, RL, RR, load_next_key, __movq);
    499	round3(32+8, RR, RL, load_next_key, __movq);
    500	round3(32+9, RL, RR, load_next_key, __movq);
    501	round3(32+10, RR, RL, load_next_key, __movq);
    502	round3(32+11, RL, RR, load_next_key, __movq);
    503	round3(32+12, RR, RL, load_next_key, __movq);
    504	round3(32+13, RL, RR, load_next_key, __movq);
    505	round3(32+14, RR, RL, load_next_key, __movq);
    506	round3(32+15, RL, RR, dummy2, dummy2);
    507
    508	final_permutation3(RR, RL);
    509
    510	bswapl RR0d;
    511	bswapl RL0d;
    512	bswapl RR1d;
    513	bswapl RL1d;
    514	bswapl RR2d;
    515	bswapl RL2d;
    516
    517	popq %rsi /* dst */
    518	movl RR0d, 0 * 4(%rsi);
    519	movl RL0d, 1 * 4(%rsi);
    520	movl RR1d, 2 * 4(%rsi);
    521	movl RL1d, 3 * 4(%rsi);
    522	movl RR2d, 4 * 4(%rsi);
    523	movl RL2d, 5 * 4(%rsi);
    524
    525	popq %r15;
    526	popq %r14;
    527	popq %r13;
    528	popq %r12;
    529	popq %rbx;
    530
    531	RET;
    532SYM_FUNC_END(des3_ede_x86_64_crypt_blk_3way)
    533
    534.section	.rodata, "a", @progbits
    535.align 16
    536.L_s1:
    537	.quad 0x0010100001010400, 0x0000000000000000
    538	.quad 0x0000100000010000, 0x0010100001010404
    539	.quad 0x0010100001010004, 0x0000100000010404
    540	.quad 0x0000000000000004, 0x0000100000010000
    541	.quad 0x0000000000000400, 0x0010100001010400
    542	.quad 0x0010100001010404, 0x0000000000000400
    543	.quad 0x0010000001000404, 0x0010100001010004
    544	.quad 0x0010000001000000, 0x0000000000000004
    545	.quad 0x0000000000000404, 0x0010000001000400
    546	.quad 0x0010000001000400, 0x0000100000010400
    547	.quad 0x0000100000010400, 0x0010100001010000
    548	.quad 0x0010100001010000, 0x0010000001000404
    549	.quad 0x0000100000010004, 0x0010000001000004
    550	.quad 0x0010000001000004, 0x0000100000010004
    551	.quad 0x0000000000000000, 0x0000000000000404
    552	.quad 0x0000100000010404, 0x0010000001000000
    553	.quad 0x0000100000010000, 0x0010100001010404
    554	.quad 0x0000000000000004, 0x0010100001010000
    555	.quad 0x0010100001010400, 0x0010000001000000
    556	.quad 0x0010000001000000, 0x0000000000000400
    557	.quad 0x0010100001010004, 0x0000100000010000
    558	.quad 0x0000100000010400, 0x0010000001000004
    559	.quad 0x0000000000000400, 0x0000000000000004
    560	.quad 0x0010000001000404, 0x0000100000010404
    561	.quad 0x0010100001010404, 0x0000100000010004
    562	.quad 0x0010100001010000, 0x0010000001000404
    563	.quad 0x0010000001000004, 0x0000000000000404
    564	.quad 0x0000100000010404, 0x0010100001010400
    565	.quad 0x0000000000000404, 0x0010000001000400
    566	.quad 0x0010000001000400, 0x0000000000000000
    567	.quad 0x0000100000010004, 0x0000100000010400
    568	.quad 0x0000000000000000, 0x0010100001010004
    569.L_s2:
    570	.quad 0x0801080200100020, 0x0800080000000000
    571	.quad 0x0000080000000000, 0x0001080200100020
    572	.quad 0x0001000000100000, 0x0000000200000020
    573	.quad 0x0801000200100020, 0x0800080200000020
    574	.quad 0x0800000200000020, 0x0801080200100020
    575	.quad 0x0801080000100000, 0x0800000000000000
    576	.quad 0x0800080000000000, 0x0001000000100000
    577	.quad 0x0000000200000020, 0x0801000200100020
    578	.quad 0x0001080000100000, 0x0001000200100020
    579	.quad 0x0800080200000020, 0x0000000000000000
    580	.quad 0x0800000000000000, 0x0000080000000000
    581	.quad 0x0001080200100020, 0x0801000000100000
    582	.quad 0x0001000200100020, 0x0800000200000020
    583	.quad 0x0000000000000000, 0x0001080000100000
    584	.quad 0x0000080200000020, 0x0801080000100000
    585	.quad 0x0801000000100000, 0x0000080200000020
    586	.quad 0x0000000000000000, 0x0001080200100020
    587	.quad 0x0801000200100020, 0x0001000000100000
    588	.quad 0x0800080200000020, 0x0801000000100000
    589	.quad 0x0801080000100000, 0x0000080000000000
    590	.quad 0x0801000000100000, 0x0800080000000000
    591	.quad 0x0000000200000020, 0x0801080200100020
    592	.quad 0x0001080200100020, 0x0000000200000020
    593	.quad 0x0000080000000000, 0x0800000000000000
    594	.quad 0x0000080200000020, 0x0801080000100000
    595	.quad 0x0001000000100000, 0x0800000200000020
    596	.quad 0x0001000200100020, 0x0800080200000020
    597	.quad 0x0800000200000020, 0x0001000200100020
    598	.quad 0x0001080000100000, 0x0000000000000000
    599	.quad 0x0800080000000000, 0x0000080200000020
    600	.quad 0x0800000000000000, 0x0801000200100020
    601	.quad 0x0801080200100020, 0x0001080000100000
    602.L_s3:
    603	.quad 0x0000002000000208, 0x0000202008020200
    604	.quad 0x0000000000000000, 0x0000200008020008
    605	.quad 0x0000002008000200, 0x0000000000000000
    606	.quad 0x0000202000020208, 0x0000002008000200
    607	.quad 0x0000200000020008, 0x0000000008000008
    608	.quad 0x0000000008000008, 0x0000200000020000
    609	.quad 0x0000202008020208, 0x0000200000020008
    610	.quad 0x0000200008020000, 0x0000002000000208
    611	.quad 0x0000000008000000, 0x0000000000000008
    612	.quad 0x0000202008020200, 0x0000002000000200
    613	.quad 0x0000202000020200, 0x0000200008020000
    614	.quad 0x0000200008020008, 0x0000202000020208
    615	.quad 0x0000002008000208, 0x0000202000020200
    616	.quad 0x0000200000020000, 0x0000002008000208
    617	.quad 0x0000000000000008, 0x0000202008020208
    618	.quad 0x0000002000000200, 0x0000000008000000
    619	.quad 0x0000202008020200, 0x0000000008000000
    620	.quad 0x0000200000020008, 0x0000002000000208
    621	.quad 0x0000200000020000, 0x0000202008020200
    622	.quad 0x0000002008000200, 0x0000000000000000
    623	.quad 0x0000002000000200, 0x0000200000020008
    624	.quad 0x0000202008020208, 0x0000002008000200
    625	.quad 0x0000000008000008, 0x0000002000000200
    626	.quad 0x0000000000000000, 0x0000200008020008
    627	.quad 0x0000002008000208, 0x0000200000020000
    628	.quad 0x0000000008000000, 0x0000202008020208
    629	.quad 0x0000000000000008, 0x0000202000020208
    630	.quad 0x0000202000020200, 0x0000000008000008
    631	.quad 0x0000200008020000, 0x0000002008000208
    632	.quad 0x0000002000000208, 0x0000200008020000
    633	.quad 0x0000202000020208, 0x0000000000000008
    634	.quad 0x0000200008020008, 0x0000202000020200
    635.L_s4:
    636	.quad 0x1008020000002001, 0x1000020800002001
    637	.quad 0x1000020800002001, 0x0000000800000000
    638	.quad 0x0008020800002000, 0x1008000800000001
    639	.quad 0x1008000000000001, 0x1000020000002001
    640	.quad 0x0000000000000000, 0x0008020000002000
    641	.quad 0x0008020000002000, 0x1008020800002001
    642	.quad 0x1000000800000001, 0x0000000000000000
    643	.quad 0x0008000800000000, 0x1008000000000001
    644	.quad 0x1000000000000001, 0x0000020000002000
    645	.quad 0x0008000000000000, 0x1008020000002001
    646	.quad 0x0000000800000000, 0x0008000000000000
    647	.quad 0x1000020000002001, 0x0000020800002000
    648	.quad 0x1008000800000001, 0x1000000000000001
    649	.quad 0x0000020800002000, 0x0008000800000000
    650	.quad 0x0000020000002000, 0x0008020800002000
    651	.quad 0x1008020800002001, 0x1000000800000001
    652	.quad 0x0008000800000000, 0x1008000000000001
    653	.quad 0x0008020000002000, 0x1008020800002001
    654	.quad 0x1000000800000001, 0x0000000000000000
    655	.quad 0x0000000000000000, 0x0008020000002000
    656	.quad 0x0000020800002000, 0x0008000800000000
    657	.quad 0x1008000800000001, 0x1000000000000001
    658	.quad 0x1008020000002001, 0x1000020800002001
    659	.quad 0x1000020800002001, 0x0000000800000000
    660	.quad 0x1008020800002001, 0x1000000800000001
    661	.quad 0x1000000000000001, 0x0000020000002000
    662	.quad 0x1008000000000001, 0x1000020000002001
    663	.quad 0x0008020800002000, 0x1008000800000001
    664	.quad 0x1000020000002001, 0x0000020800002000
    665	.quad 0x0008000000000000, 0x1008020000002001
    666	.quad 0x0000000800000000, 0x0008000000000000
    667	.quad 0x0000020000002000, 0x0008020800002000
    668.L_s5:
    669	.quad 0x0000001000000100, 0x0020001002080100
    670	.quad 0x0020000002080000, 0x0420001002000100
    671	.quad 0x0000000000080000, 0x0000001000000100
    672	.quad 0x0400000000000000, 0x0020000002080000
    673	.quad 0x0400001000080100, 0x0000000000080000
    674	.quad 0x0020001002000100, 0x0400001000080100
    675	.quad 0x0420001002000100, 0x0420000002080000
    676	.quad 0x0000001000080100, 0x0400000000000000
    677	.quad 0x0020000002000000, 0x0400000000080000
    678	.quad 0x0400000000080000, 0x0000000000000000
    679	.quad 0x0400001000000100, 0x0420001002080100
    680	.quad 0x0420001002080100, 0x0020001002000100
    681	.quad 0x0420000002080000, 0x0400001000000100
    682	.quad 0x0000000000000000, 0x0420000002000000
    683	.quad 0x0020001002080100, 0x0020000002000000
    684	.quad 0x0420000002000000, 0x0000001000080100
    685	.quad 0x0000000000080000, 0x0420001002000100
    686	.quad 0x0000001000000100, 0x0020000002000000
    687	.quad 0x0400000000000000, 0x0020000002080000
    688	.quad 0x0420001002000100, 0x0400001000080100
    689	.quad 0x0020001002000100, 0x0400000000000000
    690	.quad 0x0420000002080000, 0x0020001002080100
    691	.quad 0x0400001000080100, 0x0000001000000100
    692	.quad 0x0020000002000000, 0x0420000002080000
    693	.quad 0x0420001002080100, 0x0000001000080100
    694	.quad 0x0420000002000000, 0x0420001002080100
    695	.quad 0x0020000002080000, 0x0000000000000000
    696	.quad 0x0400000000080000, 0x0420000002000000
    697	.quad 0x0000001000080100, 0x0020001002000100
    698	.quad 0x0400001000000100, 0x0000000000080000
    699	.quad 0x0000000000000000, 0x0400000000080000
    700	.quad 0x0020001002080100, 0x0400001000000100
    701.L_s6:
    702	.quad 0x0200000120000010, 0x0204000020000000
    703	.quad 0x0000040000000000, 0x0204040120000010
    704	.quad 0x0204000020000000, 0x0000000100000010
    705	.quad 0x0204040120000010, 0x0004000000000000
    706	.quad 0x0200040020000000, 0x0004040100000010
    707	.quad 0x0004000000000000, 0x0200000120000010
    708	.quad 0x0004000100000010, 0x0200040020000000
    709	.quad 0x0200000020000000, 0x0000040100000010
    710	.quad 0x0000000000000000, 0x0004000100000010
    711	.quad 0x0200040120000010, 0x0000040000000000
    712	.quad 0x0004040000000000, 0x0200040120000010
    713	.quad 0x0000000100000010, 0x0204000120000010
    714	.quad 0x0204000120000010, 0x0000000000000000
    715	.quad 0x0004040100000010, 0x0204040020000000
    716	.quad 0x0000040100000010, 0x0004040000000000
    717	.quad 0x0204040020000000, 0x0200000020000000
    718	.quad 0x0200040020000000, 0x0000000100000010
    719	.quad 0x0204000120000010, 0x0004040000000000
    720	.quad 0x0204040120000010, 0x0004000000000000
    721	.quad 0x0000040100000010, 0x0200000120000010
    722	.quad 0x0004000000000000, 0x0200040020000000
    723	.quad 0x0200000020000000, 0x0000040100000010
    724	.quad 0x0200000120000010, 0x0204040120000010
    725	.quad 0x0004040000000000, 0x0204000020000000
    726	.quad 0x0004040100000010, 0x0204040020000000
    727	.quad 0x0000000000000000, 0x0204000120000010
    728	.quad 0x0000000100000010, 0x0000040000000000
    729	.quad 0x0204000020000000, 0x0004040100000010
    730	.quad 0x0000040000000000, 0x0004000100000010
    731	.quad 0x0200040120000010, 0x0000000000000000
    732	.quad 0x0204040020000000, 0x0200000020000000
    733	.quad 0x0004000100000010, 0x0200040120000010
    734.L_s7:
    735	.quad 0x0002000000200000, 0x2002000004200002
    736	.quad 0x2000000004000802, 0x0000000000000000
    737	.quad 0x0000000000000800, 0x2000000004000802
    738	.quad 0x2002000000200802, 0x0002000004200800
    739	.quad 0x2002000004200802, 0x0002000000200000
    740	.quad 0x0000000000000000, 0x2000000004000002
    741	.quad 0x2000000000000002, 0x0000000004000000
    742	.quad 0x2002000004200002, 0x2000000000000802
    743	.quad 0x0000000004000800, 0x2002000000200802
    744	.quad 0x2002000000200002, 0x0000000004000800
    745	.quad 0x2000000004000002, 0x0002000004200000
    746	.quad 0x0002000004200800, 0x2002000000200002
    747	.quad 0x0002000004200000, 0x0000000000000800
    748	.quad 0x2000000000000802, 0x2002000004200802
    749	.quad 0x0002000000200800, 0x2000000000000002
    750	.quad 0x0000000004000000, 0x0002000000200800
    751	.quad 0x0000000004000000, 0x0002000000200800
    752	.quad 0x0002000000200000, 0x2000000004000802
    753	.quad 0x2000000004000802, 0x2002000004200002
    754	.quad 0x2002000004200002, 0x2000000000000002
    755	.quad 0x2002000000200002, 0x0000000004000000
    756	.quad 0x0000000004000800, 0x0002000000200000
    757	.quad 0x0002000004200800, 0x2000000000000802
    758	.quad 0x2002000000200802, 0x0002000004200800
    759	.quad 0x2000000000000802, 0x2000000004000002
    760	.quad 0x2002000004200802, 0x0002000004200000
    761	.quad 0x0002000000200800, 0x0000000000000000
    762	.quad 0x2000000000000002, 0x2002000004200802
    763	.quad 0x0000000000000000, 0x2002000000200802
    764	.quad 0x0002000004200000, 0x0000000000000800
    765	.quad 0x2000000004000002, 0x0000000004000800
    766	.quad 0x0000000000000800, 0x2002000000200002
    767.L_s8:
    768	.quad 0x0100010410001000, 0x0000010000001000
    769	.quad 0x0000000000040000, 0x0100010410041000
    770	.quad 0x0100000010000000, 0x0100010410001000
    771	.quad 0x0000000400000000, 0x0100000010000000
    772	.quad 0x0000000400040000, 0x0100000010040000
    773	.quad 0x0100010410041000, 0x0000010000041000
    774	.quad 0x0100010010041000, 0x0000010400041000
    775	.quad 0x0000010000001000, 0x0000000400000000
    776	.quad 0x0100000010040000, 0x0100000410000000
    777	.quad 0x0100010010001000, 0x0000010400001000
    778	.quad 0x0000010000041000, 0x0000000400040000
    779	.quad 0x0100000410040000, 0x0100010010041000
    780	.quad 0x0000010400001000, 0x0000000000000000
    781	.quad 0x0000000000000000, 0x0100000410040000
    782	.quad 0x0100000410000000, 0x0100010010001000
    783	.quad 0x0000010400041000, 0x0000000000040000
    784	.quad 0x0000010400041000, 0x0000000000040000
    785	.quad 0x0100010010041000, 0x0000010000001000
    786	.quad 0x0000000400000000, 0x0100000410040000
    787	.quad 0x0000010000001000, 0x0000010400041000
    788	.quad 0x0100010010001000, 0x0000000400000000
    789	.quad 0x0100000410000000, 0x0100000010040000
    790	.quad 0x0100000410040000, 0x0100000010000000
    791	.quad 0x0000000000040000, 0x0100010410001000
    792	.quad 0x0000000000000000, 0x0100010410041000
    793	.quad 0x0000000400040000, 0x0100000410000000
    794	.quad 0x0100000010040000, 0x0100010010001000
    795	.quad 0x0100010410001000, 0x0000000000000000
    796	.quad 0x0100010410041000, 0x0000010000041000
    797	.quad 0x0000010000041000, 0x0000010400001000
    798	.quad 0x0000010400001000, 0x0000000400040000
    799	.quad 0x0100000010000000, 0x0100010010041000