1/* des-amd64.S  -  AMD64 assembly implementation of 3DES cipher
2 *
3 * Copyright (C) 2014 Jussi Kivilinna <jussi.kivilinna@iki.fi>
4 *
5 * This file is part of Libgcrypt.
6 *
7 * Libgcrypt is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as
9 * published by the Free Software Foundation; either version 2.1 of
10 * the License, or (at your option) any later version.
11 *
12 * Libgcrypt is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this program; if not, see <http://www.gnu.org/licenses/>.
19 */
20
21#ifdef __x86_64
22#include <config.h>
23#if defined(USE_DES) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \
24    defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS))
25
26#include "asm-common-amd64.h"
27
28.text
29
30#define s1 0
31#define s2 ((s1) + (64*8))
32#define s3 ((s2) + (64*8))
33#define s4 ((s3) + (64*8))
34#define s5 ((s4) + (64*8))
35#define s6 ((s5) + (64*8))
36#define s7 ((s6) + (64*8))
37#define s8 ((s7) + (64*8))
38
39/* register macros */
40#define CTX %rdi
41#define SBOXES %rbp
42
43#define RL0 %r8
44#define RL1 %r9
45#define RL2 %r10
46
47#define RL0d %r8d
48#define RL1d %r9d
49#define RL2d %r10d
50
51#define RR0 %r11
52#define RR1 %r12
53#define RR2 %r13
54
55#define RR0d %r11d
56#define RR1d %r12d
57#define RR2d %r13d
58
59#define RW0 %rax
60#define RW1 %rbx
61#define RW2 %rcx
62
63#define RW0d %eax
64#define RW1d %ebx
65#define RW2d %ecx
66
67#define RW0bl %al
68#define RW1bl %bl
69#define RW2bl %cl
70
71#define RW0bh %ah
72#define RW1bh %bh
73#define RW2bh %ch
74
75#define RT0 %r15
76#define RT1 %rsi
77#define RT2 %r14
78#define RT3 %rdx
79
80#define RT0d %r15d
81#define RT1d %esi
82#define RT2d %r14d
83#define RT3d %edx
84
85/***********************************************************************
86 * 1-way 3DES
87 ***********************************************************************/
88#define do_permutation(a, b, offset, mask) \
89	movl a, RT0d; \
90	shrl $(offset), RT0d; \
91	xorl b, RT0d; \
92	andl $(mask), RT0d; \
93	xorl RT0d, b; \
94	shll $(offset), RT0d; \
95	xorl RT0d, a;
96
97#define expand_to_64bits(val, mask) \
98	movl val##d, RT0d; \
99	rorl $4, RT0d; \
100	shlq $32, RT0; \
101	orq RT0, val; \
102	andq mask, val;
103
104#define compress_to_64bits(val) \
105	movq val, RT0; \
106	shrq $32, RT0; \
107	roll $4, RT0d; \
108	orl RT0d, val##d;
109
110#define initial_permutation(left, right) \
111	do_permutation(left##d, right##d,  4, 0x0f0f0f0f); \
112	do_permutation(left##d, right##d, 16, 0x0000ffff); \
113	do_permutation(right##d, left##d,  2, 0x33333333); \
114	do_permutation(right##d, left##d,  8, 0x00ff00ff); \
115	movabs $0x3f3f3f3f3f3f3f3f, RT3; \
116	movl left##d, RW0d; \
117	roll $1, right##d; \
118	xorl right##d, RW0d; \
119	andl $0xaaaaaaaa, RW0d; \
120	xorl RW0d, left##d; \
121	xorl RW0d, right##d; \
122	roll $1, left##d; \
123	expand_to_64bits(right, RT3); \
124	expand_to_64bits(left, RT3);
125
126#define final_permutation(left, right) \
127	compress_to_64bits(right); \
128	compress_to_64bits(left); \
129	movl right##d, RW0d; \
130	rorl $1, left##d; \
131	xorl left##d, RW0d; \
132	andl $0xaaaaaaaa, RW0d; \
133	xorl RW0d, right##d; \
134	xorl RW0d, left##d; \
135	rorl $1, right##d; \
136	do_permutation(right##d, left##d,  8, 0x00ff00ff); \
137	do_permutation(right##d, left##d,  2, 0x33333333); \
138	do_permutation(left##d, right##d, 16, 0x0000ffff); \
139	do_permutation(left##d, right##d,  4, 0x0f0f0f0f);
140
141#define round1(n, from, to, load_next_key) \
142	xorq from, RW0; \
143	\
144	movzbl RW0bl, RT0d; \
145	movzbl RW0bh, RT1d; \
146	shrq $16, RW0; \
147	movzbl RW0bl, RT2d; \
148	movzbl RW0bh, RT3d; \
149	shrq $16, RW0; \
150	movq s8(SBOXES, RT0, 8), RT0; \
151	xorq s6(SBOXES, RT1, 8), to; \
152	movzbl RW0bl, RL1d; \
153	movzbl RW0bh, RT1d; \
154	shrl $16, RW0d; \
155	xorq s4(SBOXES, RT2, 8), RT0; \
156	xorq s2(SBOXES, RT3, 8), to; \
157	movzbl RW0bl, RT2d; \
158	movzbl RW0bh, RT3d; \
159	xorq s7(SBOXES, RL1, 8), RT0; \
160	xorq s5(SBOXES, RT1, 8), to; \
161	xorq s3(SBOXES, RT2, 8), RT0; \
162	load_next_key(n, RW0); \
163	xorq RT0, to; \
164	xorq s1(SBOXES, RT3, 8), to; \
165
166#define load_next_key(n, RWx) \
167	movq (((n) + 1) * 8)(CTX), RWx;
168
169#define dummy2(a, b) /*_*/
170
171#define read_block(io, left, right) \
172	movl    (io), left##d; \
173	movl   4(io), right##d; \
174	bswapl left##d; \
175	bswapl right##d;
176
177#define write_block(io, left, right) \
178	bswapl left##d; \
179	bswapl right##d; \
180	movl   left##d,   (io); \
181	movl   right##d, 4(io);
182
183.align 8
184.globl _gcry_3des_amd64_crypt_block
185ELF(.type  _gcry_3des_amd64_crypt_block,@function;)
186
187_gcry_3des_amd64_crypt_block:
188	/* input:
189	 *	%rdi: round keys, CTX
190	 *	%rsi: dst
191	 *	%rdx: src
192	 */
193	CFI_STARTPROC();
194	ENTER_SYSV_FUNC_PARAMS_0_4
195
196	pushq %rbp;
197	CFI_PUSH(%rbp);
198	pushq %rbx;
199	CFI_PUSH(%rbx);
200	pushq %r12;
201	CFI_PUSH(%r12);
202	pushq %r13;
203	CFI_PUSH(%r13);
204	pushq %r14;
205	CFI_PUSH(%r14);
206	pushq %r15;
207	CFI_PUSH(%r15);
208	pushq %rsi; /*dst*/
209	CFI_PUSH(%rsi);
210
211	leaq .L_s1 rRIP, SBOXES;
212
213	read_block(%rdx, RL0, RR0);
214	initial_permutation(RL0, RR0);
215
216	movq (CTX), RW0;
217
218	round1(0, RR0, RL0, load_next_key);
219	round1(1, RL0, RR0, load_next_key);
220	round1(2, RR0, RL0, load_next_key);
221	round1(3, RL0, RR0, load_next_key);
222	round1(4, RR0, RL0, load_next_key);
223	round1(5, RL0, RR0, load_next_key);
224	round1(6, RR0, RL0, load_next_key);
225	round1(7, RL0, RR0, load_next_key);
226	round1(8, RR0, RL0, load_next_key);
227	round1(9, RL0, RR0, load_next_key);
228	round1(10, RR0, RL0, load_next_key);
229	round1(11, RL0, RR0, load_next_key);
230	round1(12, RR0, RL0, load_next_key);
231	round1(13, RL0, RR0, load_next_key);
232	round1(14, RR0, RL0, load_next_key);
233	round1(15, RL0, RR0, load_next_key);
234
235	round1(16+0, RL0, RR0, load_next_key);
236	round1(16+1, RR0, RL0, load_next_key);
237	round1(16+2, RL0, RR0, load_next_key);
238	round1(16+3, RR0, RL0, load_next_key);
239	round1(16+4, RL0, RR0, load_next_key);
240	round1(16+5, RR0, RL0, load_next_key);
241	round1(16+6, RL0, RR0, load_next_key);
242	round1(16+7, RR0, RL0, load_next_key);
243	round1(16+8, RL0, RR0, load_next_key);
244	round1(16+9, RR0, RL0, load_next_key);
245	round1(16+10, RL0, RR0, load_next_key);
246	round1(16+11, RR0, RL0, load_next_key);
247	round1(16+12, RL0, RR0, load_next_key);
248	round1(16+13, RR0, RL0, load_next_key);
249	round1(16+14, RL0, RR0, load_next_key);
250	round1(16+15, RR0, RL0, load_next_key);
251
252	round1(32+0, RR0, RL0, load_next_key);
253	round1(32+1, RL0, RR0, load_next_key);
254	round1(32+2, RR0, RL0, load_next_key);
255	round1(32+3, RL0, RR0, load_next_key);
256	round1(32+4, RR0, RL0, load_next_key);
257	round1(32+5, RL0, RR0, load_next_key);
258	round1(32+6, RR0, RL0, load_next_key);
259	round1(32+7, RL0, RR0, load_next_key);
260	round1(32+8, RR0, RL0, load_next_key);
261	round1(32+9, RL0, RR0, load_next_key);
262	round1(32+10, RR0, RL0, load_next_key);
263	round1(32+11, RL0, RR0, load_next_key);
264	round1(32+12, RR0, RL0, load_next_key);
265	round1(32+13, RL0, RR0, load_next_key);
266	round1(32+14, RR0, RL0, load_next_key);
267	round1(32+15, RL0, RR0, dummy2);
268
269	popq RW2; /*dst*/
270	CFI_POP_TMP_REG();
271	final_permutation(RR0, RL0);
272	write_block(RW2, RR0, RL0);
273
274	popq %r15;
275	CFI_POP(%r15);
276	popq %r14;
277	CFI_POP(%r14);
278	popq %r13;
279	CFI_POP(%r13);
280	popq %r12;
281	CFI_POP(%r12);
282	popq %rbx;
283	CFI_POP(%rbx);
284	popq %rbp;
285	CFI_POP(%rbp);
286
287	EXIT_SYSV_FUNC
288	ret;
289	CFI_ENDPROC();
290ELF(.size _gcry_3des_amd64_crypt_block,.-_gcry_3des_amd64_crypt_block;)
291
292/***********************************************************************
293 * 3-way 3DES
294 ***********************************************************************/
295#define expand_to_64bits(val, mask) \
296	movl val##d, RT0d; \
297	rorl $4, RT0d; \
298	shlq $32, RT0; \
299	orq RT0, val; \
300	andq mask, val;
301
302#define compress_to_64bits(val) \
303	movq val, RT0; \
304	shrq $32, RT0; \
305	roll $4, RT0d; \
306	orl RT0d, val##d;
307
308#define initial_permutation3(left, right) \
309	do_permutation(left##0d, right##0d,  4, 0x0f0f0f0f); \
310	do_permutation(left##0d, right##0d, 16, 0x0000ffff); \
311	  do_permutation(left##1d, right##1d,  4, 0x0f0f0f0f); \
312	  do_permutation(left##1d, right##1d, 16, 0x0000ffff); \
313	    do_permutation(left##2d, right##2d,  4, 0x0f0f0f0f); \
314	    do_permutation(left##2d, right##2d, 16, 0x0000ffff); \
315	    \
316	do_permutation(right##0d, left##0d,  2, 0x33333333); \
317	do_permutation(right##0d, left##0d,  8, 0x00ff00ff); \
318	  do_permutation(right##1d, left##1d,  2, 0x33333333); \
319	  do_permutation(right##1d, left##1d,  8, 0x00ff00ff); \
320	    do_permutation(right##2d, left##2d,  2, 0x33333333); \
321	    do_permutation(right##2d, left##2d,  8, 0x00ff00ff); \
322	    \
323	movabs $0x3f3f3f3f3f3f3f3f, RT3; \
324	    \
325	movl left##0d, RW0d; \
326	roll $1, right##0d; \
327	xorl right##0d, RW0d; \
328	andl $0xaaaaaaaa, RW0d; \
329	xorl RW0d, left##0d; \
330	xorl RW0d, right##0d; \
331	roll $1, left##0d; \
332	expand_to_64bits(right##0, RT3); \
333	expand_to_64bits(left##0, RT3); \
334	  movl left##1d, RW1d; \
335	  roll $1, right##1d; \
336	  xorl right##1d, RW1d; \
337	  andl $0xaaaaaaaa, RW1d; \
338	  xorl RW1d, left##1d; \
339	  xorl RW1d, right##1d; \
340	  roll $1, left##1d; \
341	  expand_to_64bits(right##1, RT3); \
342	  expand_to_64bits(left##1, RT3); \
343	    movl left##2d, RW2d; \
344	    roll $1, right##2d; \
345	    xorl right##2d, RW2d; \
346	    andl $0xaaaaaaaa, RW2d; \
347	    xorl RW2d, left##2d; \
348	    xorl RW2d, right##2d; \
349	    roll $1, left##2d; \
350	    expand_to_64bits(right##2, RT3); \
351	    expand_to_64bits(left##2, RT3);
352
353#define final_permutation3(left, right) \
354	compress_to_64bits(right##0); \
355	compress_to_64bits(left##0); \
356	movl right##0d, RW0d; \
357	rorl $1, left##0d; \
358	xorl left##0d, RW0d; \
359	andl $0xaaaaaaaa, RW0d; \
360	xorl RW0d, right##0d; \
361	xorl RW0d, left##0d; \
362	rorl $1, right##0d; \
363	  compress_to_64bits(right##1); \
364	  compress_to_64bits(left##1); \
365	  movl right##1d, RW1d; \
366	  rorl $1, left##1d; \
367	  xorl left##1d, RW1d; \
368	  andl $0xaaaaaaaa, RW1d; \
369	  xorl RW1d, right##1d; \
370	  xorl RW1d, left##1d; \
371	  rorl $1, right##1d; \
372	    compress_to_64bits(right##2); \
373	    compress_to_64bits(left##2); \
374	    movl right##2d, RW2d; \
375	    rorl $1, left##2d; \
376	    xorl left##2d, RW2d; \
377	    andl $0xaaaaaaaa, RW2d; \
378	    xorl RW2d, right##2d; \
379	    xorl RW2d, left##2d; \
380	    rorl $1, right##2d; \
381	    \
382	do_permutation(right##0d, left##0d,  8, 0x00ff00ff); \
383	do_permutation(right##0d, left##0d,  2, 0x33333333); \
384	  do_permutation(right##1d, left##1d,  8, 0x00ff00ff); \
385	  do_permutation(right##1d, left##1d,  2, 0x33333333); \
386	    do_permutation(right##2d, left##2d,  8, 0x00ff00ff); \
387	    do_permutation(right##2d, left##2d,  2, 0x33333333); \
388	    \
389	do_permutation(left##0d, right##0d, 16, 0x0000ffff); \
390	do_permutation(left##0d, right##0d,  4, 0x0f0f0f0f); \
391	  do_permutation(left##1d, right##1d, 16, 0x0000ffff); \
392	  do_permutation(left##1d, right##1d,  4, 0x0f0f0f0f); \
393	    do_permutation(left##2d, right##2d, 16, 0x0000ffff); \
394	    do_permutation(left##2d, right##2d,  4, 0x0f0f0f0f);
395
396#define round3(n, from, to, load_next_key, do_movq) \
397	xorq from##0, RW0; \
398	movzbl RW0bl, RT3d; \
399	movzbl RW0bh, RT1d; \
400	shrq $16, RW0; \
401	xorq s8(SBOXES, RT3, 8), to##0; \
402	xorq s6(SBOXES, RT1, 8), to##0; \
403	movzbl RW0bl, RT3d; \
404	movzbl RW0bh, RT1d; \
405	shrq $16, RW0; \
406	xorq s4(SBOXES, RT3, 8), to##0; \
407	xorq s2(SBOXES, RT1, 8), to##0; \
408	movzbl RW0bl, RT3d; \
409	movzbl RW0bh, RT1d; \
410	shrl $16, RW0d; \
411	xorq s7(SBOXES, RT3, 8), to##0; \
412	xorq s5(SBOXES, RT1, 8), to##0; \
413	movzbl RW0bl, RT3d; \
414	movzbl RW0bh, RT1d; \
415	load_next_key(n, RW0); \
416	xorq s3(SBOXES, RT3, 8), to##0; \
417	xorq s1(SBOXES, RT1, 8), to##0; \
418		xorq from##1, RW1; \
419		movzbl RW1bl, RT3d; \
420		movzbl RW1bh, RT1d; \
421		shrq $16, RW1; \
422		xorq s8(SBOXES, RT3, 8), to##1; \
423		xorq s6(SBOXES, RT1, 8), to##1; \
424		movzbl RW1bl, RT3d; \
425		movzbl RW1bh, RT1d; \
426		shrq $16, RW1; \
427		xorq s4(SBOXES, RT3, 8), to##1; \
428		xorq s2(SBOXES, RT1, 8), to##1; \
429		movzbl RW1bl, RT3d; \
430		movzbl RW1bh, RT1d; \
431		shrl $16, RW1d; \
432		xorq s7(SBOXES, RT3, 8), to##1; \
433		xorq s5(SBOXES, RT1, 8), to##1; \
434		movzbl RW1bl, RT3d; \
435		movzbl RW1bh, RT1d; \
436		do_movq(RW0, RW1); \
437		xorq s3(SBOXES, RT3, 8), to##1; \
438		xorq s1(SBOXES, RT1, 8), to##1; \
439			xorq from##2, RW2; \
440			movzbl RW2bl, RT3d; \
441			movzbl RW2bh, RT1d; \
442			shrq $16, RW2; \
443			xorq s8(SBOXES, RT3, 8), to##2; \
444			xorq s6(SBOXES, RT1, 8), to##2; \
445			movzbl RW2bl, RT3d; \
446			movzbl RW2bh, RT1d; \
447			shrq $16, RW2; \
448			xorq s4(SBOXES, RT3, 8), to##2; \
449			xorq s2(SBOXES, RT1, 8), to##2; \
450			movzbl RW2bl, RT3d; \
451			movzbl RW2bh, RT1d; \
452			shrl $16, RW2d; \
453			xorq s7(SBOXES, RT3, 8), to##2; \
454			xorq s5(SBOXES, RT1, 8), to##2; \
455			movzbl RW2bl, RT3d; \
456			movzbl RW2bh, RT1d; \
457			do_movq(RW0, RW2); \
458			xorq s3(SBOXES, RT3, 8), to##2; \
459			xorq s1(SBOXES, RT1, 8), to##2;
460
461#define __movq(src, dst) \
462	movq src, dst;
463
464#define read_block(io, left, right) \
465	movl    (io), left##d; \
466	movl   4(io), right##d; \
467	bswapl left##d; \
468	bswapl right##d;
469
470#define write_block(io, left, right) \
471	bswapl left##d; \
472	bswapl right##d; \
473	movl   left##d,   (io); \
474	movl   right##d, 4(io);
475
476.align 8
477ELF(.type  _gcry_3des_amd64_crypt_blk3,@function;)
478_gcry_3des_amd64_crypt_blk3:
479	/* input:
480	 *  %rdi: round keys, CTX
481	 *  RL0d, RR0d, RL1d, RR1d, RL2d, RR2d: 3 input blocks
482	 *  RR0d, RL0d, RR1d, RL1d, RR2d, RL2d: 3 output blocks
483	 */
484	CFI_STARTPROC();
485
486	leaq .L_s1 rRIP, SBOXES;
487
488	initial_permutation3(RL, RR);
489
490	movq 0(CTX), RW0;
491	movq RW0, RW1;
492	movq RW0, RW2;
493
494	round3(0, RR, RL, load_next_key, __movq);
495	round3(1, RL, RR, load_next_key, __movq);
496	round3(2, RR, RL, load_next_key, __movq);
497	round3(3, RL, RR, load_next_key, __movq);
498	round3(4, RR, RL, load_next_key, __movq);
499	round3(5, RL, RR, load_next_key, __movq);
500	round3(6, RR, RL, load_next_key, __movq);
501	round3(7, RL, RR, load_next_key, __movq);
502	round3(8, RR, RL, load_next_key, __movq);
503	round3(9, RL, RR, load_next_key, __movq);
504	round3(10, RR, RL, load_next_key, __movq);
505	round3(11, RL, RR, load_next_key, __movq);
506	round3(12, RR, RL, load_next_key, __movq);
507	round3(13, RL, RR, load_next_key, __movq);
508	round3(14, RR, RL, load_next_key, __movq);
509	round3(15, RL, RR, load_next_key, __movq);
510
511	round3(16+0, RL, RR, load_next_key, __movq);
512	round3(16+1, RR, RL, load_next_key, __movq);
513	round3(16+2, RL, RR, load_next_key, __movq);
514	round3(16+3, RR, RL, load_next_key, __movq);
515	round3(16+4, RL, RR, load_next_key, __movq);
516	round3(16+5, RR, RL, load_next_key, __movq);
517	round3(16+6, RL, RR, load_next_key, __movq);
518	round3(16+7, RR, RL, load_next_key, __movq);
519	round3(16+8, RL, RR, load_next_key, __movq);
520	round3(16+9, RR, RL, load_next_key, __movq);
521	round3(16+10, RL, RR, load_next_key, __movq);
522	round3(16+11, RR, RL, load_next_key, __movq);
523	round3(16+12, RL, RR, load_next_key, __movq);
524	round3(16+13, RR, RL, load_next_key, __movq);
525	round3(16+14, RL, RR, load_next_key, __movq);
526	round3(16+15, RR, RL, load_next_key, __movq);
527
528	round3(32+0, RR, RL, load_next_key, __movq);
529	round3(32+1, RL, RR, load_next_key, __movq);
530	round3(32+2, RR, RL, load_next_key, __movq);
531	round3(32+3, RL, RR, load_next_key, __movq);
532	round3(32+4, RR, RL, load_next_key, __movq);
533	round3(32+5, RL, RR, load_next_key, __movq);
534	round3(32+6, RR, RL, load_next_key, __movq);
535	round3(32+7, RL, RR, load_next_key, __movq);
536	round3(32+8, RR, RL, load_next_key, __movq);
537	round3(32+9, RL, RR, load_next_key, __movq);
538	round3(32+10, RR, RL, load_next_key, __movq);
539	round3(32+11, RL, RR, load_next_key, __movq);
540	round3(32+12, RR, RL, load_next_key, __movq);
541	round3(32+13, RL, RR, load_next_key, __movq);
542	round3(32+14, RR, RL, load_next_key, __movq);
543	round3(32+15, RL, RR, dummy2, dummy2);
544
545	final_permutation3(RR, RL);
546
547	ret;
548	CFI_ENDPROC();
549ELF(.size _gcry_3des_amd64_crypt_blk3,.-_gcry_3des_amd64_crypt_blk3;)
550
551.align 8
552.globl  _gcry_3des_amd64_cbc_dec
553ELF(.type   _gcry_3des_amd64_cbc_dec,@function;)
554_gcry_3des_amd64_cbc_dec:
555	/* input:
556	 *	%rdi: ctx, CTX
557	 *	%rsi: dst (3 blocks)
558	 *	%rdx: src (3 blocks)
559	 *	%rcx: iv (64bit)
560	 */
561	CFI_STARTPROC();
562	ENTER_SYSV_FUNC_PARAMS_0_4
563
564	pushq %rbp;
565	CFI_PUSH(%rbp);
566	pushq %rbx;
567	CFI_PUSH(%rbx);
568	pushq %r12;
569	CFI_PUSH(%r12);
570	pushq %r13;
571	CFI_PUSH(%r13);
572	pushq %r14;
573	CFI_PUSH(%r14);
574	pushq %r15;
575	CFI_PUSH(%r15);
576
577	pushq %rsi; /*dst*/
578	CFI_PUSH(%rsi);
579	pushq %rdx; /*src*/
580	CFI_PUSH(%rdx);
581	pushq %rcx; /*iv*/
582	CFI_PUSH(%rcx);
583
584	/* load input */
585	movl 0 * 4(%rdx), RL0d;
586	movl 1 * 4(%rdx), RR0d;
587	movl 2 * 4(%rdx), RL1d;
588	movl 3 * 4(%rdx), RR1d;
589	movl 4 * 4(%rdx), RL2d;
590	movl 5 * 4(%rdx), RR2d;
591
592	bswapl RL0d;
593	bswapl RR0d;
594	bswapl RL1d;
595	bswapl RR1d;
596	bswapl RL2d;
597	bswapl RR2d;
598
599	call _gcry_3des_amd64_crypt_blk3;
600
601	popq %rcx; /*iv*/
602	CFI_POP_TMP_REG();
603	popq %rdx; /*src*/
604	CFI_POP_TMP_REG();
605	popq %rsi; /*dst*/
606	CFI_POP_TMP_REG();
607
608	bswapl RR0d;
609	bswapl RL0d;
610	bswapl RR1d;
611	bswapl RL1d;
612	bswapl RR2d;
613	bswapl RL2d;
614
615	movq 2 * 8(%rdx), RT0;
616	xorl 0 * 4(%rcx), RR0d;
617	xorl 1 * 4(%rcx), RL0d;
618	xorl 0 * 4(%rdx), RR1d;
619	xorl 1 * 4(%rdx), RL1d;
620	xorl 2 * 4(%rdx), RR2d;
621	xorl 3 * 4(%rdx), RL2d;
622	movq RT0, (%rcx); /* store new IV */
623
624	movl RR0d, 0 * 4(%rsi);
625	movl RL0d, 1 * 4(%rsi);
626	movl RR1d, 2 * 4(%rsi);
627	movl RL1d, 3 * 4(%rsi);
628	movl RR2d, 4 * 4(%rsi);
629	movl RL2d, 5 * 4(%rsi);
630
631	popq %r15;
632	CFI_POP(%r15);
633	popq %r14;
634	CFI_POP(%r14);
635	popq %r13;
636	CFI_POP(%r13);
637	popq %r12;
638	CFI_POP(%r12);
639	popq %rbx;
640	CFI_POP(%rbx);
641	popq %rbp;
642	CFI_POP(%rbp);
643
644	EXIT_SYSV_FUNC
645	ret;
646	CFI_ENDPROC();
647ELF(.size _gcry_3des_amd64_cbc_dec,.-_gcry_3des_amd64_cbc_dec;)
648
649.align 8
650.globl  _gcry_3des_amd64_ctr_enc
651ELF(.type   _gcry_3des_amd64_ctr_enc,@function;)
652_gcry_3des_amd64_ctr_enc:
653	/* input:
654	 *	%rdi: ctx, CTX
655	 *	%rsi: dst (3 blocks)
656	 *	%rdx: src (3 blocks)
657	 *	%rcx: iv (64bit)
658	 */
659	CFI_STARTPROC();
660	ENTER_SYSV_FUNC_PARAMS_0_4
661
662	pushq %rbp;
663	CFI_PUSH(%rbp);
664	pushq %rbx;
665	CFI_PUSH(%rbx);
666	pushq %r12;
667	CFI_PUSH(%r12);
668	pushq %r13;
669	CFI_PUSH(%r13);
670	pushq %r14;
671	CFI_PUSH(%r14);
672	pushq %r15;
673	CFI_PUSH(%r15);
674
675	pushq %rsi; /*dst*/
676	CFI_PUSH(%rsi);
677	pushq %rdx; /*src*/
678	CFI_PUSH(%rdx);
679	movq %rcx, RW2;
680
681	/* load IV and byteswap */
682	movq (RW2), RT0;
683	bswapq RT0;
684	movq RT0, RR0;
685
686	/* construct IVs */
687	leaq 1(RT0), RR1;
688	leaq 2(RT0), RR2;
689	leaq 3(RT0), RT0;
690	movq RR0, RL0;
691	movq RR1, RL1;
692	movq RR2, RL2;
693	bswapq RT0;
694	shrq $32, RL0;
695	shrq $32, RL1;
696	shrq $32, RL2;
697
698	/* store new IV */
699	movq RT0, (RW2);
700
701	call _gcry_3des_amd64_crypt_blk3;
702
703	popq %rdx; /*src*/
704	CFI_POP_TMP_REG();
705	popq %rsi; /*dst*/
706	CFI_POP_TMP_REG();
707
708	bswapl RR0d;
709	bswapl RL0d;
710	bswapl RR1d;
711	bswapl RL1d;
712	bswapl RR2d;
713	bswapl RL2d;
714
715	xorl 0 * 4(%rdx), RR0d;
716	xorl 1 * 4(%rdx), RL0d;
717	xorl 2 * 4(%rdx), RR1d;
718	xorl 3 * 4(%rdx), RL1d;
719	xorl 4 * 4(%rdx), RR2d;
720	xorl 5 * 4(%rdx), RL2d;
721
722	movl RR0d, 0 * 4(%rsi);
723	movl RL0d, 1 * 4(%rsi);
724	movl RR1d, 2 * 4(%rsi);
725	movl RL1d, 3 * 4(%rsi);
726	movl RR2d, 4 * 4(%rsi);
727	movl RL2d, 5 * 4(%rsi);
728
729	popq %r15;
730	CFI_POP(%r15);
731	popq %r14;
732	CFI_POP(%r14);
733	popq %r13;
734	CFI_POP(%r13);
735	popq %r12;
736	CFI_POP(%r12);
737	popq %rbx;
738	CFI_POP(%rbx);
739	popq %rbp;
740	CFI_POP(%rbp);
741
742	EXIT_SYSV_FUNC
743	ret;
744	CFI_ENDPROC();
745ELF(.size _gcry_3des_amd64_cbc_dec,.-_gcry_3des_amd64_cbc_dec;)
746
747.align 8
748.globl  _gcry_3des_amd64_cfb_dec
749ELF(.type   _gcry_3des_amd64_cfb_dec,@function;)
750_gcry_3des_amd64_cfb_dec:
751	/* input:
752	 *	%rdi: ctx, CTX
753	 *	%rsi: dst (3 blocks)
754	 *	%rdx: src (3 blocks)
755	 *	%rcx: iv (64bit)
756	 */
757	CFI_STARTPROC();
758	ENTER_SYSV_FUNC_PARAMS_0_4
759
760	pushq %rbp;
761	CFI_PUSH(%rbp);
762	pushq %rbx;
763	CFI_PUSH(%rbx);
764	pushq %r12;
765	CFI_PUSH(%r12);
766	pushq %r13;
767	CFI_PUSH(%r13);
768	pushq %r14;
769	CFI_PUSH(%r14);
770	pushq %r15;
771	CFI_PUSH(%r15);
772
773	pushq %rsi; /*dst*/
774	CFI_PUSH(%rsi);
775	pushq %rdx; /*src*/
776	CFI_PUSH(%rdx);
777	movq %rcx, RW2;
778
779	/* Load input */
780	movl 0 * 4(RW2), RL0d;
781	movl 1 * 4(RW2), RR0d;
782	movl 0 * 4(%rdx), RL1d;
783	movl 1 * 4(%rdx), RR1d;
784	movl 2 * 4(%rdx), RL2d;
785	movl 3 * 4(%rdx), RR2d;
786
787	bswapl RL0d;
788	bswapl RR0d;
789	bswapl RL1d;
790	bswapl RR1d;
791	bswapl RL2d;
792	bswapl RR2d;
793
794	/* Update IV */
795	movq 4 * 4(%rdx), RW0;
796	movq RW0, (RW2);
797
798	call _gcry_3des_amd64_crypt_blk3;
799
800	popq %rdx; /*src*/
801	CFI_POP_TMP_REG();
802	popq %rsi; /*dst*/
803	CFI_POP_TMP_REG();
804
805	bswapl RR0d;
806	bswapl RL0d;
807	bswapl RR1d;
808	bswapl RL1d;
809	bswapl RR2d;
810	bswapl RL2d;
811
812	xorl 0 * 4(%rdx), RR0d;
813	xorl 1 * 4(%rdx), RL0d;
814	xorl 2 * 4(%rdx), RR1d;
815	xorl 3 * 4(%rdx), RL1d;
816	xorl 4 * 4(%rdx), RR2d;
817	xorl 5 * 4(%rdx), RL2d;
818
819	movl RR0d, 0 * 4(%rsi);
820	movl RL0d, 1 * 4(%rsi);
821	movl RR1d, 2 * 4(%rsi);
822	movl RL1d, 3 * 4(%rsi);
823	movl RR2d, 4 * 4(%rsi);
824	movl RL2d, 5 * 4(%rsi);
825
826	popq %r15;
827	CFI_POP(%r15);
828	popq %r14;
829	CFI_POP(%r14);
830	popq %r13;
831	CFI_POP(%r13);
832	popq %r12;
833	CFI_POP(%r12);
834	popq %rbx;
835	CFI_POP(%rbx);
836	popq %rbp;
837	CFI_POP(%rbp);
838
839	EXIT_SYSV_FUNC
840	ret;
841	CFI_ENDPROC();
842ELF(.size _gcry_3des_amd64_cfb_dec,.-_gcry_3des_amd64_cfb_dec;)
843
844.align 16
845.L_s1:
846	.quad 0x0010100001010400, 0x0000000000000000
847	.quad 0x0000100000010000, 0x0010100001010404
848	.quad 0x0010100001010004, 0x0000100000010404
849	.quad 0x0000000000000004, 0x0000100000010000
850	.quad 0x0000000000000400, 0x0010100001010400
851	.quad 0x0010100001010404, 0x0000000000000400
852	.quad 0x0010000001000404, 0x0010100001010004
853	.quad 0x0010000001000000, 0x0000000000000004
854	.quad 0x0000000000000404, 0x0010000001000400
855	.quad 0x0010000001000400, 0x0000100000010400
856	.quad 0x0000100000010400, 0x0010100001010000
857	.quad 0x0010100001010000, 0x0010000001000404
858	.quad 0x0000100000010004, 0x0010000001000004
859	.quad 0x0010000001000004, 0x0000100000010004
860	.quad 0x0000000000000000, 0x0000000000000404
861	.quad 0x0000100000010404, 0x0010000001000000
862	.quad 0x0000100000010000, 0x0010100001010404
863	.quad 0x0000000000000004, 0x0010100001010000
864	.quad 0x0010100001010400, 0x0010000001000000
865	.quad 0x0010000001000000, 0x0000000000000400
866	.quad 0x0010100001010004, 0x0000100000010000
867	.quad 0x0000100000010400, 0x0010000001000004
868	.quad 0x0000000000000400, 0x0000000000000004
869	.quad 0x0010000001000404, 0x0000100000010404
870	.quad 0x0010100001010404, 0x0000100000010004
871	.quad 0x0010100001010000, 0x0010000001000404
872	.quad 0x0010000001000004, 0x0000000000000404
873	.quad 0x0000100000010404, 0x0010100001010400
874	.quad 0x0000000000000404, 0x0010000001000400
875	.quad 0x0010000001000400, 0x0000000000000000
876	.quad 0x0000100000010004, 0x0000100000010400
877	.quad 0x0000000000000000, 0x0010100001010004
878.L_s2:
879	.quad 0x0801080200100020, 0x0800080000000000
880	.quad 0x0000080000000000, 0x0001080200100020
881	.quad 0x0001000000100000, 0x0000000200000020
882	.quad 0x0801000200100020, 0x0800080200000020
883	.quad 0x0800000200000020, 0x0801080200100020
884	.quad 0x0801080000100000, 0x0800000000000000
885	.quad 0x0800080000000000, 0x0001000000100000
886	.quad 0x0000000200000020, 0x0801000200100020
887	.quad 0x0001080000100000, 0x0001000200100020
888	.quad 0x0800080200000020, 0x0000000000000000
889	.quad 0x0800000000000000, 0x0000080000000000
890	.quad 0x0001080200100020, 0x0801000000100000
891	.quad 0x0001000200100020, 0x0800000200000020
892	.quad 0x0000000000000000, 0x0001080000100000
893	.quad 0x0000080200000020, 0x0801080000100000
894	.quad 0x0801000000100000, 0x0000080200000020
895	.quad 0x0000000000000000, 0x0001080200100020
896	.quad 0x0801000200100020, 0x0001000000100000
897	.quad 0x0800080200000020, 0x0801000000100000
898	.quad 0x0801080000100000, 0x0000080000000000
899	.quad 0x0801000000100000, 0x0800080000000000
900	.quad 0x0000000200000020, 0x0801080200100020
901	.quad 0x0001080200100020, 0x0000000200000020
902	.quad 0x0000080000000000, 0x0800000000000000
903	.quad 0x0000080200000020, 0x0801080000100000
904	.quad 0x0001000000100000, 0x0800000200000020
905	.quad 0x0001000200100020, 0x0800080200000020
906	.quad 0x0800000200000020, 0x0001000200100020
907	.quad 0x0001080000100000, 0x0000000000000000
908	.quad 0x0800080000000000, 0x0000080200000020
909	.quad 0x0800000000000000, 0x0801000200100020
910	.quad 0x0801080200100020, 0x0001080000100000
911.L_s3:
912	.quad 0x0000002000000208, 0x0000202008020200
913	.quad 0x0000000000000000, 0x0000200008020008
914	.quad 0x0000002008000200, 0x0000000000000000
915	.quad 0x0000202000020208, 0x0000002008000200
916	.quad 0x0000200000020008, 0x0000000008000008
917	.quad 0x0000000008000008, 0x0000200000020000
918	.quad 0x0000202008020208, 0x0000200000020008
919	.quad 0x0000200008020000, 0x0000002000000208
920	.quad 0x0000000008000000, 0x0000000000000008
921	.quad 0x0000202008020200, 0x0000002000000200
922	.quad 0x0000202000020200, 0x0000200008020000
923	.quad 0x0000200008020008, 0x0000202000020208
924	.quad 0x0000002008000208, 0x0000202000020200
925	.quad 0x0000200000020000, 0x0000002008000208
926	.quad 0x0000000000000008, 0x0000202008020208
927	.quad 0x0000002000000200, 0x0000000008000000
928	.quad 0x0000202008020200, 0x0000000008000000
929	.quad 0x0000200000020008, 0x0000002000000208
930	.quad 0x0000200000020000, 0x0000202008020200
931	.quad 0x0000002008000200, 0x0000000000000000
932	.quad 0x0000002000000200, 0x0000200000020008
933	.quad 0x0000202008020208, 0x0000002008000200
934	.quad 0x0000000008000008, 0x0000002000000200
935	.quad 0x0000000000000000, 0x0000200008020008
936	.quad 0x0000002008000208, 0x0000200000020000
937	.quad 0x0000000008000000, 0x0000202008020208
938	.quad 0x0000000000000008, 0x0000202000020208
939	.quad 0x0000202000020200, 0x0000000008000008
940	.quad 0x0000200008020000, 0x0000002008000208
941	.quad 0x0000002000000208, 0x0000200008020000
942	.quad 0x0000202000020208, 0x0000000000000008
943	.quad 0x0000200008020008, 0x0000202000020200
944.L_s4:
945	.quad 0x1008020000002001, 0x1000020800002001
946	.quad 0x1000020800002001, 0x0000000800000000
947	.quad 0x0008020800002000, 0x1008000800000001
948	.quad 0x1008000000000001, 0x1000020000002001
949	.quad 0x0000000000000000, 0x0008020000002000
950	.quad 0x0008020000002000, 0x1008020800002001
951	.quad 0x1000000800000001, 0x0000000000000000
952	.quad 0x0008000800000000, 0x1008000000000001
953	.quad 0x1000000000000001, 0x0000020000002000
954	.quad 0x0008000000000000, 0x1008020000002001
955	.quad 0x0000000800000000, 0x0008000000000000
956	.quad 0x1000020000002001, 0x0000020800002000
957	.quad 0x1008000800000001, 0x1000000000000001
958	.quad 0x0000020800002000, 0x0008000800000000
959	.quad 0x0000020000002000, 0x0008020800002000
960	.quad 0x1008020800002001, 0x1000000800000001
961	.quad 0x0008000800000000, 0x1008000000000001
962	.quad 0x0008020000002000, 0x1008020800002001
963	.quad 0x1000000800000001, 0x0000000000000000
964	.quad 0x0000000000000000, 0x0008020000002000
965	.quad 0x0000020800002000, 0x0008000800000000
966	.quad 0x1008000800000001, 0x1000000000000001
967	.quad 0x1008020000002001, 0x1000020800002001
968	.quad 0x1000020800002001, 0x0000000800000000
969	.quad 0x1008020800002001, 0x1000000800000001
970	.quad 0x1000000000000001, 0x0000020000002000
971	.quad 0x1008000000000001, 0x1000020000002001
972	.quad 0x0008020800002000, 0x1008000800000001
973	.quad 0x1000020000002001, 0x0000020800002000
974	.quad 0x0008000000000000, 0x1008020000002001
975	.quad 0x0000000800000000, 0x0008000000000000
976	.quad 0x0000020000002000, 0x0008020800002000
977.L_s5:
978	.quad 0x0000001000000100, 0x0020001002080100
979	.quad 0x0020000002080000, 0x0420001002000100
980	.quad 0x0000000000080000, 0x0000001000000100
981	.quad 0x0400000000000000, 0x0020000002080000
982	.quad 0x0400001000080100, 0x0000000000080000
983	.quad 0x0020001002000100, 0x0400001000080100
984	.quad 0x0420001002000100, 0x0420000002080000
985	.quad 0x0000001000080100, 0x0400000000000000
986	.quad 0x0020000002000000, 0x0400000000080000
987	.quad 0x0400000000080000, 0x0000000000000000
988	.quad 0x0400001000000100, 0x0420001002080100
989	.quad 0x0420001002080100, 0x0020001002000100
990	.quad 0x0420000002080000, 0x0400001000000100
991	.quad 0x0000000000000000, 0x0420000002000000
992	.quad 0x0020001002080100, 0x0020000002000000
993	.quad 0x0420000002000000, 0x0000001000080100
994	.quad 0x0000000000080000, 0x0420001002000100
995	.quad 0x0000001000000100, 0x0020000002000000
996	.quad 0x0400000000000000, 0x0020000002080000
997	.quad 0x0420001002000100, 0x0400001000080100
998	.quad 0x0020001002000100, 0x0400000000000000
999	.quad 0x0420000002080000, 0x0020001002080100
1000	.quad 0x0400001000080100, 0x0000001000000100
1001	.quad 0x0020000002000000, 0x0420000002080000
1002	.quad 0x0420001002080100, 0x0000001000080100
1003	.quad 0x0420000002000000, 0x0420001002080100
1004	.quad 0x0020000002080000, 0x0000000000000000
1005	.quad 0x0400000000080000, 0x0420000002000000
1006	.quad 0x0000001000080100, 0x0020001002000100
1007	.quad 0x0400001000000100, 0x0000000000080000
1008	.quad 0x0000000000000000, 0x0400000000080000
1009	.quad 0x0020001002080100, 0x0400001000000100
1010.L_s6:
1011	.quad 0x0200000120000010, 0x0204000020000000
1012	.quad 0x0000040000000000, 0x0204040120000010
1013	.quad 0x0204000020000000, 0x0000000100000010
1014	.quad 0x0204040120000010, 0x0004000000000000
1015	.quad 0x0200040020000000, 0x0004040100000010
1016	.quad 0x0004000000000000, 0x0200000120000010
1017	.quad 0x0004000100000010, 0x0200040020000000
1018	.quad 0x0200000020000000, 0x0000040100000010
1019	.quad 0x0000000000000000, 0x0004000100000010
1020	.quad 0x0200040120000010, 0x0000040000000000
1021	.quad 0x0004040000000000, 0x0200040120000010
1022	.quad 0x0000000100000010, 0x0204000120000010
1023	.quad 0x0204000120000010, 0x0000000000000000
1024	.quad 0x0004040100000010, 0x0204040020000000
1025	.quad 0x0000040100000010, 0x0004040000000000
1026	.quad 0x0204040020000000, 0x0200000020000000
1027	.quad 0x0200040020000000, 0x0000000100000010
1028	.quad 0x0204000120000010, 0x0004040000000000
1029	.quad 0x0204040120000010, 0x0004000000000000
1030	.quad 0x0000040100000010, 0x0200000120000010
1031	.quad 0x0004000000000000, 0x0200040020000000
1032	.quad 0x0200000020000000, 0x0000040100000010
1033	.quad 0x0200000120000010, 0x0204040120000010
1034	.quad 0x0004040000000000, 0x0204000020000000
1035	.quad 0x0004040100000010, 0x0204040020000000
1036	.quad 0x0000000000000000, 0x0204000120000010
1037	.quad 0x0000000100000010, 0x0000040000000000
1038	.quad 0x0204000020000000, 0x0004040100000010
1039	.quad 0x0000040000000000, 0x0004000100000010
1040	.quad 0x0200040120000010, 0x0000000000000000
1041	.quad 0x0204040020000000, 0x0200000020000000
1042	.quad 0x0004000100000010, 0x0200040120000010
1043.L_s7:
1044	.quad 0x0002000000200000, 0x2002000004200002
1045	.quad 0x2000000004000802, 0x0000000000000000
1046	.quad 0x0000000000000800, 0x2000000004000802
1047	.quad 0x2002000000200802, 0x0002000004200800
1048	.quad 0x2002000004200802, 0x0002000000200000
1049	.quad 0x0000000000000000, 0x2000000004000002
1050	.quad 0x2000000000000002, 0x0000000004000000
1051	.quad 0x2002000004200002, 0x2000000000000802
1052	.quad 0x0000000004000800, 0x2002000000200802
1053	.quad 0x2002000000200002, 0x0000000004000800
1054	.quad 0x2000000004000002, 0x0002000004200000
1055	.quad 0x0002000004200800, 0x2002000000200002
1056	.quad 0x0002000004200000, 0x0000000000000800
1057	.quad 0x2000000000000802, 0x2002000004200802
1058	.quad 0x0002000000200800, 0x2000000000000002
1059	.quad 0x0000000004000000, 0x0002000000200800
1060	.quad 0x0000000004000000, 0x0002000000200800
1061	.quad 0x0002000000200000, 0x2000000004000802
1062	.quad 0x2000000004000802, 0x2002000004200002
1063	.quad 0x2002000004200002, 0x2000000000000002
1064	.quad 0x2002000000200002, 0x0000000004000000
1065	.quad 0x0000000004000800, 0x0002000000200000
1066	.quad 0x0002000004200800, 0x2000000000000802
1067	.quad 0x2002000000200802, 0x0002000004200800
1068	.quad 0x2000000000000802, 0x2000000004000002
1069	.quad 0x2002000004200802, 0x0002000004200000
1070	.quad 0x0002000000200800, 0x0000000000000000
1071	.quad 0x2000000000000002, 0x2002000004200802
1072	.quad 0x0000000000000000, 0x2002000000200802
1073	.quad 0x0002000004200000, 0x0000000000000800
1074	.quad 0x2000000004000002, 0x0000000004000800
1075	.quad 0x0000000000000800, 0x2002000000200002
1076.L_s8:
1077	.quad 0x0100010410001000, 0x0000010000001000
1078	.quad 0x0000000000040000, 0x0100010410041000
1079	.quad 0x0100000010000000, 0x0100010410001000
1080	.quad 0x0000000400000000, 0x0100000010000000
1081	.quad 0x0000000400040000, 0x0100000010040000
1082	.quad 0x0100010410041000, 0x0000010000041000
1083	.quad 0x0100010010041000, 0x0000010400041000
1084	.quad 0x0000010000001000, 0x0000000400000000
1085	.quad 0x0100000010040000, 0x0100000410000000
1086	.quad 0x0100010010001000, 0x0000010400001000
1087	.quad 0x0000010000041000, 0x0000000400040000
1088	.quad 0x0100000410040000, 0x0100010010041000
1089	.quad 0x0000010400001000, 0x0000000000000000
1090	.quad 0x0000000000000000, 0x0100000410040000
1091	.quad 0x0100000410000000, 0x0100010010001000
1092	.quad 0x0000010400041000, 0x0000000000040000
1093	.quad 0x0000010400041000, 0x0000000000040000
1094	.quad 0x0100010010041000, 0x0000010000001000
1095	.quad 0x0000000400000000, 0x0100000410040000
1096	.quad 0x0000010000001000, 0x0000010400041000
1097	.quad 0x0100010010001000, 0x0000000400000000
1098	.quad 0x0100000410000000, 0x0100000010040000
1099	.quad 0x0100000410040000, 0x0100000010000000
1100	.quad 0x0000000000040000, 0x0100010410001000
1101	.quad 0x0000000000000000, 0x0100010410041000
1102	.quad 0x0000000400040000, 0x0100000410000000
1103	.quad 0x0100000010040000, 0x0100010010001000
1104	.quad 0x0100010410001000, 0x0000000000000000
1105	.quad 0x0100010410041000, 0x0000010000041000
1106	.quad 0x0000010000041000, 0x0000010400001000
1107	.quad 0x0000010400001000, 0x0000000400040000
1108	.quad 0x0100000010000000, 0x0100010010041000
1109
1110#endif
1111#endif
1112