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