Enable assembler optimizations on earlier ARM cores
[libgcrypt.git] / cipher / camellia-arm.S
1 /* camellia-arm.S  -  ARM assembly implementation of Camellia cipher
2  *
3  * Copyright © 2013 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 #include <config.h>
22
23 #if defined(__ARMEL__)
24 #ifdef HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS
25
26 .text
27
28 .syntax unified
29 .arm
30
31 #define CAMELLIA_TABLE_BYTE_LEN 272
32
33 /* struct camellia_ctx: */
34 #define key_table 0
35 #define key_length CAMELLIA_TABLE_BYTE_LEN
36
37 /* register macros */
38 #define CTX %r0
39 #define RTAB1 %ip
40 #define RTAB3 %r1
41 #define RMASK %lr
42
43 #define IL %r2
44 #define IR %r3
45
46 #define XL %r4
47 #define XR %r5
48 #define YL %r6
49 #define YR %r7
50
51 #define RT0 %r8
52 #define RT1 %r9
53 #define RT2 %r10
54 #define RT3 %r11
55
56 /* helper macros */
57 #define ldr_unaligned_be(rout, rsrc, offs, rtmp) \
58         ldrb rout, [rsrc, #((offs) + 3)]; \
59         ldrb rtmp, [rsrc, #((offs) + 2)]; \
60         orr rout, rout, rtmp, lsl #8; \
61         ldrb rtmp, [rsrc, #((offs) + 1)]; \
62         orr rout, rout, rtmp, lsl #16; \
63         ldrb rtmp, [rsrc, #((offs) + 0)]; \
64         orr rout, rout, rtmp, lsl #24;
65
66 #define str_unaligned_be(rin, rdst, offs, rtmp0, rtmp1) \
67         mov rtmp0, rin, lsr #8; \
68         strb rin, [rdst, #((offs) + 3)]; \
69         mov rtmp1, rin, lsr #16; \
70         strb rtmp0, [rdst, #((offs) + 2)]; \
71         mov rtmp0, rin, lsr #24; \
72         strb rtmp1, [rdst, #((offs) + 1)]; \
73         strb rtmp0, [rdst, #((offs) + 0)];
74
75 #ifdef __ARMEL__
76 #ifdef HAVE_ARM_ARCH_V6
77         #define host_to_be(reg, rtmp) \
78                 rev reg, reg;
79         #define be_to_host(reg, rtmp) \
80                 rev reg, reg;
81 #else
82         #define host_to_be(reg, rtmp) \
83                 eor     rtmp, reg, reg, ror #16; \
84                 mov     rtmp, rtmp, lsr #8; \
85                 bic     rtmp, rtmp, #65280; \
86                 eor     reg, rtmp, reg, ror #8;
87         #define be_to_host(reg, rtmp) \
88                 eor     rtmp, reg, reg, ror #16; \
89                 mov     rtmp, rtmp, lsr #8; \
90                 bic     rtmp, rtmp, #65280; \
91                 eor     reg, rtmp, reg, ror #8;
92 #endif
93 #else
94         /* nop on big-endian */
95         #define host_to_be(reg, rtmp) /*_*/
96         #define be_to_host(reg, rtmp) /*_*/
97 #endif
98
99 #define ldr_input_aligned_be(rin, a, b, c, d, rtmp) \
100         ldr a, [rin, #0]; \
101         ldr b, [rin, #4]; \
102         be_to_host(a, rtmp); \
103         ldr c, [rin, #8]; \
104         be_to_host(b, rtmp); \
105         ldr d, [rin, #12]; \
106         be_to_host(c, rtmp); \
107         be_to_host(d, rtmp);
108
109 #define str_output_aligned_be(rout, a, b, c, d, rtmp) \
110         be_to_host(a, rtmp); \
111         be_to_host(b, rtmp); \
112         str a, [rout, #0]; \
113         be_to_host(c, rtmp); \
114         str b, [rout, #4]; \
115         be_to_host(d, rtmp); \
116         str c, [rout, #8]; \
117         str d, [rout, #12];
118
119 #ifdef __ARM_FEATURE_UNALIGNED
120         /* unaligned word reads/writes allowed */
121         #define ldr_input_be(rin, ra, rb, rc, rd, rtmp) \
122                 ldr_input_aligned_be(rin, ra, rb, rc, rd, rtmp)
123
124         #define str_output_be(rout, ra, rb, rc, rd, rtmp0, rtmp1) \
125                 str_output_aligned_be(rout, ra, rb, rc, rd, rtmp0)
126 #else
127         /* need to handle unaligned reads/writes by byte reads */
128         #define ldr_input_be(rin, ra, rb, rc, rd, rtmp0) \
129                 tst rin, #3; \
130                 beq 1f; \
131                         ldr_unaligned_be(ra, rin, 0, rtmp0); \
132                         ldr_unaligned_be(rb, rin, 4, rtmp0); \
133                         ldr_unaligned_be(rc, rin, 8, rtmp0); \
134                         ldr_unaligned_be(rd, rin, 12, rtmp0); \
135                         b 2f; \
136                 1:;\
137                         ldr_input_aligned_be(rin, ra, rb, rc, rd, rtmp0); \
138                 2:;
139
140         #define str_output_be(rout, ra, rb, rc, rd, rtmp0, rtmp1) \
141                 tst rout, #3; \
142                 beq 1f; \
143                         str_unaligned_be(ra, rout, 0, rtmp0, rtmp1); \
144                         str_unaligned_be(rb, rout, 4, rtmp0, rtmp1); \
145                         str_unaligned_be(rc, rout, 8, rtmp0, rtmp1); \
146                         str_unaligned_be(rd, rout, 12, rtmp0, rtmp1); \
147                         b 2f; \
148                 1:;\
149                         str_output_aligned_be(rout, ra, rb, rc, rd, rtmp0); \
150                 2:;
151 #endif
152
153 /**********************************************************************
154   1-way camellia
155  **********************************************************************/
156 #define roundsm(xl, xr, kl, kr, yl, yr) \
157         ldr RT2, [CTX, #(key_table + ((kl) * 4))]; \
158         and  IR, RMASK, xr, lsl#(4);      /*sp1110*/ \
159         ldr RT3, [CTX, #(key_table + ((kr) * 4))]; \
160         and  IL, RMASK, xl, lsr#(24 - 4); /*sp1110*/ \
161         and RT0, RMASK, xr, lsr#(16 - 4); /*sp3033*/ \
162         ldr  IR, [RTAB1,  IR]; \
163         and RT1, RMASK, xl, lsr#(8 - 4);  /*sp3033*/ \
164         eor yl, RT2; \
165         ldr  IL, [RTAB1,  IL]; \
166         eor yr, RT3; \
167         \
168         ldr RT0, [RTAB3, RT0]; \
169         add RTAB1, #4; \
170         ldr RT1, [RTAB3, RT1]; \
171         add RTAB3, #4; \
172         \
173         and RT2, RMASK, xr, lsr#(24 - 4); /*sp0222*/ \
174         and RT3, RMASK, xl, lsr#(16 - 4); /*sp0222*/ \
175         \
176         eor IR, RT0; \
177         eor IL, RT1; \
178         \
179         ldr RT2, [RTAB1, RT2]; \
180         and RT0, RMASK, xr, lsr#(8 - 4);  /*sp4404*/ \
181         ldr RT3, [RTAB1, RT3]; \
182         and RT1, RMASK, xl, lsl#(4);      /*sp4404*/ \
183         \
184         ldr RT0, [RTAB3, RT0]; \
185         sub RTAB1, #4; \
186         ldr RT1, [RTAB3, RT1]; \
187         sub RTAB3, #4; \
188         \
189         eor IR, RT2; \
190         eor IL, RT3; \
191         eor IR, RT0; \
192         eor IL, RT1; \
193         \
194         eor IR, IL; \
195         eor yr, yr, IL, ror#8; \
196         eor yl, IR; \
197         eor yr, IR;
198
199 #define enc_rounds(n) \
200         roundsm(XL, XR, ((n) + 2) * 2 + 0, ((n) + 2) * 2 + 1, YL, YR); \
201         roundsm(YL, YR, ((n) + 3) * 2 + 0, ((n) + 3) * 2 + 1, XL, XR); \
202         roundsm(XL, XR, ((n) + 4) * 2 + 0, ((n) + 4) * 2 + 1, YL, YR); \
203         roundsm(YL, YR, ((n) + 5) * 2 + 0, ((n) + 5) * 2 + 1, XL, XR); \
204         roundsm(XL, XR, ((n) + 6) * 2 + 0, ((n) + 6) * 2 + 1, YL, YR); \
205         roundsm(YL, YR, ((n) + 7) * 2 + 0, ((n) + 7) * 2 + 1, XL, XR);
206
207 #define dec_rounds(n) \
208         roundsm(XL, XR, ((n) + 7) * 2 + 0, ((n) + 7) * 2 + 1, YL, YR); \
209         roundsm(YL, YR, ((n) + 6) * 2 + 0, ((n) + 6) * 2 + 1, XL, XR); \
210         roundsm(XL, XR, ((n) + 5) * 2 + 0, ((n) + 5) * 2 + 1, YL, YR); \
211         roundsm(YL, YR, ((n) + 4) * 2 + 0, ((n) + 4) * 2 + 1, XL, XR); \
212         roundsm(XL, XR, ((n) + 3) * 2 + 0, ((n) + 3) * 2 + 1, YL, YR); \
213         roundsm(YL, YR, ((n) + 2) * 2 + 0, ((n) + 2) * 2 + 1, XL, XR);
214
215 /* perform FL and FL⁻¹ */
216 #define fls(ll, lr, rl, rr, kll, klr, krl, krr) \
217         ldr RT0, [CTX, #(key_table + ((kll) * 4))]; \
218         ldr RT2, [CTX, #(key_table + ((krr) * 4))]; \
219         and RT0, ll; \
220         ldr RT3, [CTX, #(key_table + ((krl) * 4))]; \
221         orr RT2, rr; \
222         ldr RT1, [CTX, #(key_table + ((klr) * 4))]; \
223         eor rl, RT2; \
224         eor lr, lr, RT0, ror#31; \
225         and RT3, rl; \
226         orr RT1, lr; \
227         eor ll, RT1; \
228         eor rr, rr, RT3, ror#31;
229
230 #define enc_fls(n) \
231         fls(XL, XR, YL, YR, \
232             (n) * 2 + 0, (n) * 2 + 1, \
233             (n) * 2 + 2, (n) * 2 + 3);
234
235 #define dec_fls(n) \
236         fls(XL, XR, YL, YR, \
237             (n) * 2 + 2, (n) * 2 + 3, \
238             (n) * 2 + 0, (n) * 2 + 1);
239
240 #define inpack(n) \
241         ldr_input_be(%r2, XL, XR, YL, YR, RT0); \
242         ldr RT0, [CTX, #(key_table + ((n) * 8) + 0)]; \
243         ldr RT1, [CTX, #(key_table + ((n) * 8) + 4)]; \
244         eor XL, RT0; \
245         eor XR, RT1;
246
247 #define outunpack(n) \
248         ldr RT0, [CTX, #(key_table + ((n) * 8) + 0)]; \
249         ldr RT1, [CTX, #(key_table + ((n) * 8) + 4)]; \
250         eor YL, RT0; \
251         eor YR, RT1; \
252         str_output_be(%r1, YL, YR, XL, XR, RT0, RT1);
253
254 .align 3
255 .global _gcry_camellia_arm_encrypt_block
256 .type   _gcry_camellia_arm_encrypt_block,%function;
257
258 _gcry_camellia_arm_encrypt_block:
259         /* input:
260          *      %r0: keytable
261          *      %r1: dst
262          *      %r2: src
263          *      %r3: keybitlen
264          */
265         push {%r1, %r4-%r11, %ip, %lr};
266
267         ldr RTAB1, =.Lcamellia_sp1110;
268         mov RMASK, #0xff;
269         add RTAB3, RTAB1, #(2 * 4);
270         push {%r3};
271         mov RMASK, RMASK, lsl#4 /* byte mask */
272
273         inpack(0);
274
275         enc_rounds(0);
276         enc_fls(8);
277         enc_rounds(8);
278         enc_fls(16);
279         enc_rounds(16);
280
281         pop {RT0};
282         cmp RT0, #(16 * 8);
283         bne .Lenc_256;
284
285         pop {%r1};
286         outunpack(24);
287
288         pop {%r4-%r11, %ip, %pc};
289 .ltorg
290
291 .Lenc_256:
292         enc_fls(24);
293         enc_rounds(24);
294
295         pop {%r1};
296         outunpack(32);
297
298         pop {%r4-%r11, %ip, %pc};
299 .ltorg
300 .size _gcry_camellia_arm_encrypt_block,.-_gcry_camellia_arm_encrypt_block;
301
302 .align 3
303 .global _gcry_camellia_arm_decrypt_block
304 .type   _gcry_camellia_arm_decrypt_block,%function;
305
306 _gcry_camellia_arm_decrypt_block:
307         /* input:
308          *      %r0: keytable
309          *      %r1: dst
310          *      %r2: src
311          *      %r3: keybitlen
312          */
313         push {%r1, %r4-%r11, %ip, %lr};
314
315         ldr RTAB1, =.Lcamellia_sp1110;
316         mov RMASK, #0xff;
317         add RTAB3, RTAB1, #(2 * 4);
318         mov RMASK, RMASK, lsl#4 /* byte mask */
319
320         cmp %r3, #(16 * 8);
321         bne .Ldec_256;
322
323         inpack(24);
324
325 .Ldec_128:
326         dec_rounds(16);
327         dec_fls(16);
328         dec_rounds(8);
329         dec_fls(8);
330         dec_rounds(0);
331
332         pop {%r1};
333         outunpack(0);
334
335         pop {%r4-%r11, %ip, %pc};
336 .ltorg
337
338 .Ldec_256:
339         inpack(32);
340         dec_rounds(24);
341         dec_fls(24);
342
343         b .Ldec_128;
344 .ltorg
345 .size _gcry_camellia_arm_decrypt_block,.-_gcry_camellia_arm_decrypt_block;
346
347 .data
348
349 /* Encryption/Decryption tables */
350 .align 5
351 .Lcamellia_sp1110:
352 .long 0x70707000
353 .Lcamellia_sp0222:
354             .long 0x00e0e0e0
355 .Lcamellia_sp3033:
356                         .long 0x38003838
357 .Lcamellia_sp4404:
358                                     .long 0x70700070
359 .long 0x82828200, 0x00050505, 0x41004141, 0x2c2c002c
360 .long 0x2c2c2c00, 0x00585858, 0x16001616, 0xb3b300b3
361 .long 0xececec00, 0x00d9d9d9, 0x76007676, 0xc0c000c0
362 .long 0xb3b3b300, 0x00676767, 0xd900d9d9, 0xe4e400e4
363 .long 0x27272700, 0x004e4e4e, 0x93009393, 0x57570057
364 .long 0xc0c0c000, 0x00818181, 0x60006060, 0xeaea00ea
365 .long 0xe5e5e500, 0x00cbcbcb, 0xf200f2f2, 0xaeae00ae
366 .long 0xe4e4e400, 0x00c9c9c9, 0x72007272, 0x23230023
367 .long 0x85858500, 0x000b0b0b, 0xc200c2c2, 0x6b6b006b
368 .long 0x57575700, 0x00aeaeae, 0xab00abab, 0x45450045
369 .long 0x35353500, 0x006a6a6a, 0x9a009a9a, 0xa5a500a5
370 .long 0xeaeaea00, 0x00d5d5d5, 0x75007575, 0xeded00ed
371 .long 0x0c0c0c00, 0x00181818, 0x06000606, 0x4f4f004f
372 .long 0xaeaeae00, 0x005d5d5d, 0x57005757, 0x1d1d001d
373 .long 0x41414100, 0x00828282, 0xa000a0a0, 0x92920092
374 .long 0x23232300, 0x00464646, 0x91009191, 0x86860086
375 .long 0xefefef00, 0x00dfdfdf, 0xf700f7f7, 0xafaf00af
376 .long 0x6b6b6b00, 0x00d6d6d6, 0xb500b5b5, 0x7c7c007c
377 .long 0x93939300, 0x00272727, 0xc900c9c9, 0x1f1f001f
378 .long 0x45454500, 0x008a8a8a, 0xa200a2a2, 0x3e3e003e
379 .long 0x19191900, 0x00323232, 0x8c008c8c, 0xdcdc00dc
380 .long 0xa5a5a500, 0x004b4b4b, 0xd200d2d2, 0x5e5e005e
381 .long 0x21212100, 0x00424242, 0x90009090, 0x0b0b000b
382 .long 0xededed00, 0x00dbdbdb, 0xf600f6f6, 0xa6a600a6
383 .long 0x0e0e0e00, 0x001c1c1c, 0x07000707, 0x39390039
384 .long 0x4f4f4f00, 0x009e9e9e, 0xa700a7a7, 0xd5d500d5
385 .long 0x4e4e4e00, 0x009c9c9c, 0x27002727, 0x5d5d005d
386 .long 0x1d1d1d00, 0x003a3a3a, 0x8e008e8e, 0xd9d900d9
387 .long 0x65656500, 0x00cacaca, 0xb200b2b2, 0x5a5a005a
388 .long 0x92929200, 0x00252525, 0x49004949, 0x51510051
389 .long 0xbdbdbd00, 0x007b7b7b, 0xde00dede, 0x6c6c006c
390 .long 0x86868600, 0x000d0d0d, 0x43004343, 0x8b8b008b
391 .long 0xb8b8b800, 0x00717171, 0x5c005c5c, 0x9a9a009a
392 .long 0xafafaf00, 0x005f5f5f, 0xd700d7d7, 0xfbfb00fb
393 .long 0x8f8f8f00, 0x001f1f1f, 0xc700c7c7, 0xb0b000b0
394 .long 0x7c7c7c00, 0x00f8f8f8, 0x3e003e3e, 0x74740074
395 .long 0xebebeb00, 0x00d7d7d7, 0xf500f5f5, 0x2b2b002b
396 .long 0x1f1f1f00, 0x003e3e3e, 0x8f008f8f, 0xf0f000f0
397 .long 0xcecece00, 0x009d9d9d, 0x67006767, 0x84840084
398 .long 0x3e3e3e00, 0x007c7c7c, 0x1f001f1f, 0xdfdf00df
399 .long 0x30303000, 0x00606060, 0x18001818, 0xcbcb00cb
400 .long 0xdcdcdc00, 0x00b9b9b9, 0x6e006e6e, 0x34340034
401 .long 0x5f5f5f00, 0x00bebebe, 0xaf00afaf, 0x76760076
402 .long 0x5e5e5e00, 0x00bcbcbc, 0x2f002f2f, 0x6d6d006d
403 .long 0xc5c5c500, 0x008b8b8b, 0xe200e2e2, 0xa9a900a9
404 .long 0x0b0b0b00, 0x00161616, 0x85008585, 0xd1d100d1
405 .long 0x1a1a1a00, 0x00343434, 0x0d000d0d, 0x04040004
406 .long 0xa6a6a600, 0x004d4d4d, 0x53005353, 0x14140014
407 .long 0xe1e1e100, 0x00c3c3c3, 0xf000f0f0, 0x3a3a003a
408 .long 0x39393900, 0x00727272, 0x9c009c9c, 0xdede00de
409 .long 0xcacaca00, 0x00959595, 0x65006565, 0x11110011
410 .long 0xd5d5d500, 0x00ababab, 0xea00eaea, 0x32320032
411 .long 0x47474700, 0x008e8e8e, 0xa300a3a3, 0x9c9c009c
412 .long 0x5d5d5d00, 0x00bababa, 0xae00aeae, 0x53530053
413 .long 0x3d3d3d00, 0x007a7a7a, 0x9e009e9e, 0xf2f200f2
414 .long 0xd9d9d900, 0x00b3b3b3, 0xec00ecec, 0xfefe00fe
415 .long 0x01010100, 0x00020202, 0x80008080, 0xcfcf00cf
416 .long 0x5a5a5a00, 0x00b4b4b4, 0x2d002d2d, 0xc3c300c3
417 .long 0xd6d6d600, 0x00adadad, 0x6b006b6b, 0x7a7a007a
418 .long 0x51515100, 0x00a2a2a2, 0xa800a8a8, 0x24240024
419 .long 0x56565600, 0x00acacac, 0x2b002b2b, 0xe8e800e8
420 .long 0x6c6c6c00, 0x00d8d8d8, 0x36003636, 0x60600060
421 .long 0x4d4d4d00, 0x009a9a9a, 0xa600a6a6, 0x69690069
422 .long 0x8b8b8b00, 0x00171717, 0xc500c5c5, 0xaaaa00aa
423 .long 0x0d0d0d00, 0x001a1a1a, 0x86008686, 0xa0a000a0
424 .long 0x9a9a9a00, 0x00353535, 0x4d004d4d, 0xa1a100a1
425 .long 0x66666600, 0x00cccccc, 0x33003333, 0x62620062
426 .long 0xfbfbfb00, 0x00f7f7f7, 0xfd00fdfd, 0x54540054
427 .long 0xcccccc00, 0x00999999, 0x66006666, 0x1e1e001e
428 .long 0xb0b0b000, 0x00616161, 0x58005858, 0xe0e000e0
429 .long 0x2d2d2d00, 0x005a5a5a, 0x96009696, 0x64640064
430 .long 0x74747400, 0x00e8e8e8, 0x3a003a3a, 0x10100010
431 .long 0x12121200, 0x00242424, 0x09000909, 0x00000000
432 .long 0x2b2b2b00, 0x00565656, 0x95009595, 0xa3a300a3
433 .long 0x20202000, 0x00404040, 0x10001010, 0x75750075
434 .long 0xf0f0f000, 0x00e1e1e1, 0x78007878, 0x8a8a008a
435 .long 0xb1b1b100, 0x00636363, 0xd800d8d8, 0xe6e600e6
436 .long 0x84848400, 0x00090909, 0x42004242, 0x09090009
437 .long 0x99999900, 0x00333333, 0xcc00cccc, 0xdddd00dd
438 .long 0xdfdfdf00, 0x00bfbfbf, 0xef00efef, 0x87870087
439 .long 0x4c4c4c00, 0x00989898, 0x26002626, 0x83830083
440 .long 0xcbcbcb00, 0x00979797, 0xe500e5e5, 0xcdcd00cd
441 .long 0xc2c2c200, 0x00858585, 0x61006161, 0x90900090
442 .long 0x34343400, 0x00686868, 0x1a001a1a, 0x73730073
443 .long 0x7e7e7e00, 0x00fcfcfc, 0x3f003f3f, 0xf6f600f6
444 .long 0x76767600, 0x00ececec, 0x3b003b3b, 0x9d9d009d
445 .long 0x05050500, 0x000a0a0a, 0x82008282, 0xbfbf00bf
446 .long 0x6d6d6d00, 0x00dadada, 0xb600b6b6, 0x52520052
447 .long 0xb7b7b700, 0x006f6f6f, 0xdb00dbdb, 0xd8d800d8
448 .long 0xa9a9a900, 0x00535353, 0xd400d4d4, 0xc8c800c8
449 .long 0x31313100, 0x00626262, 0x98009898, 0xc6c600c6
450 .long 0xd1d1d100, 0x00a3a3a3, 0xe800e8e8, 0x81810081
451 .long 0x17171700, 0x002e2e2e, 0x8b008b8b, 0x6f6f006f
452 .long 0x04040400, 0x00080808, 0x02000202, 0x13130013
453 .long 0xd7d7d700, 0x00afafaf, 0xeb00ebeb, 0x63630063
454 .long 0x14141400, 0x00282828, 0x0a000a0a, 0xe9e900e9
455 .long 0x58585800, 0x00b0b0b0, 0x2c002c2c, 0xa7a700a7
456 .long 0x3a3a3a00, 0x00747474, 0x1d001d1d, 0x9f9f009f
457 .long 0x61616100, 0x00c2c2c2, 0xb000b0b0, 0xbcbc00bc
458 .long 0xdedede00, 0x00bdbdbd, 0x6f006f6f, 0x29290029
459 .long 0x1b1b1b00, 0x00363636, 0x8d008d8d, 0xf9f900f9
460 .long 0x11111100, 0x00222222, 0x88008888, 0x2f2f002f
461 .long 0x1c1c1c00, 0x00383838, 0x0e000e0e, 0xb4b400b4
462 .long 0x32323200, 0x00646464, 0x19001919, 0x78780078
463 .long 0x0f0f0f00, 0x001e1e1e, 0x87008787, 0x06060006
464 .long 0x9c9c9c00, 0x00393939, 0x4e004e4e, 0xe7e700e7
465 .long 0x16161600, 0x002c2c2c, 0x0b000b0b, 0x71710071
466 .long 0x53535300, 0x00a6a6a6, 0xa900a9a9, 0xd4d400d4
467 .long 0x18181800, 0x00303030, 0x0c000c0c, 0xabab00ab
468 .long 0xf2f2f200, 0x00e5e5e5, 0x79007979, 0x88880088
469 .long 0x22222200, 0x00444444, 0x11001111, 0x8d8d008d
470 .long 0xfefefe00, 0x00fdfdfd, 0x7f007f7f, 0x72720072
471 .long 0x44444400, 0x00888888, 0x22002222, 0xb9b900b9
472 .long 0xcfcfcf00, 0x009f9f9f, 0xe700e7e7, 0xf8f800f8
473 .long 0xb2b2b200, 0x00656565, 0x59005959, 0xacac00ac
474 .long 0xc3c3c300, 0x00878787, 0xe100e1e1, 0x36360036
475 .long 0xb5b5b500, 0x006b6b6b, 0xda00dada, 0x2a2a002a
476 .long 0x7a7a7a00, 0x00f4f4f4, 0x3d003d3d, 0x3c3c003c
477 .long 0x91919100, 0x00232323, 0xc800c8c8, 0xf1f100f1
478 .long 0x24242400, 0x00484848, 0x12001212, 0x40400040
479 .long 0x08080800, 0x00101010, 0x04000404, 0xd3d300d3
480 .long 0xe8e8e800, 0x00d1d1d1, 0x74007474, 0xbbbb00bb
481 .long 0xa8a8a800, 0x00515151, 0x54005454, 0x43430043
482 .long 0x60606000, 0x00c0c0c0, 0x30003030, 0x15150015
483 .long 0xfcfcfc00, 0x00f9f9f9, 0x7e007e7e, 0xadad00ad
484 .long 0x69696900, 0x00d2d2d2, 0xb400b4b4, 0x77770077
485 .long 0x50505000, 0x00a0a0a0, 0x28002828, 0x80800080
486 .long 0xaaaaaa00, 0x00555555, 0x55005555, 0x82820082
487 .long 0xd0d0d000, 0x00a1a1a1, 0x68006868, 0xecec00ec
488 .long 0xa0a0a000, 0x00414141, 0x50005050, 0x27270027
489 .long 0x7d7d7d00, 0x00fafafa, 0xbe00bebe, 0xe5e500e5
490 .long 0xa1a1a100, 0x00434343, 0xd000d0d0, 0x85850085
491 .long 0x89898900, 0x00131313, 0xc400c4c4, 0x35350035
492 .long 0x62626200, 0x00c4c4c4, 0x31003131, 0x0c0c000c
493 .long 0x97979700, 0x002f2f2f, 0xcb00cbcb, 0x41410041
494 .long 0x54545400, 0x00a8a8a8, 0x2a002a2a, 0xefef00ef
495 .long 0x5b5b5b00, 0x00b6b6b6, 0xad00adad, 0x93930093
496 .long 0x1e1e1e00, 0x003c3c3c, 0x0f000f0f, 0x19190019
497 .long 0x95959500, 0x002b2b2b, 0xca00caca, 0x21210021
498 .long 0xe0e0e000, 0x00c1c1c1, 0x70007070, 0x0e0e000e
499 .long 0xffffff00, 0x00ffffff, 0xff00ffff, 0x4e4e004e
500 .long 0x64646400, 0x00c8c8c8, 0x32003232, 0x65650065
501 .long 0xd2d2d200, 0x00a5a5a5, 0x69006969, 0xbdbd00bd
502 .long 0x10101000, 0x00202020, 0x08000808, 0xb8b800b8
503 .long 0xc4c4c400, 0x00898989, 0x62006262, 0x8f8f008f
504 .long 0x00000000, 0x00000000, 0x00000000, 0xebeb00eb
505 .long 0x48484800, 0x00909090, 0x24002424, 0xcece00ce
506 .long 0xa3a3a300, 0x00474747, 0xd100d1d1, 0x30300030
507 .long 0xf7f7f700, 0x00efefef, 0xfb00fbfb, 0x5f5f005f
508 .long 0x75757500, 0x00eaeaea, 0xba00baba, 0xc5c500c5
509 .long 0xdbdbdb00, 0x00b7b7b7, 0xed00eded, 0x1a1a001a
510 .long 0x8a8a8a00, 0x00151515, 0x45004545, 0xe1e100e1
511 .long 0x03030300, 0x00060606, 0x81008181, 0xcaca00ca
512 .long 0xe6e6e600, 0x00cdcdcd, 0x73007373, 0x47470047
513 .long 0xdadada00, 0x00b5b5b5, 0x6d006d6d, 0x3d3d003d
514 .long 0x09090900, 0x00121212, 0x84008484, 0x01010001
515 .long 0x3f3f3f00, 0x007e7e7e, 0x9f009f9f, 0xd6d600d6
516 .long 0xdddddd00, 0x00bbbbbb, 0xee00eeee, 0x56560056
517 .long 0x94949400, 0x00292929, 0x4a004a4a, 0x4d4d004d
518 .long 0x87878700, 0x000f0f0f, 0xc300c3c3, 0x0d0d000d
519 .long 0x5c5c5c00, 0x00b8b8b8, 0x2e002e2e, 0x66660066
520 .long 0x83838300, 0x00070707, 0xc100c1c1, 0xcccc00cc
521 .long 0x02020200, 0x00040404, 0x01000101, 0x2d2d002d
522 .long 0xcdcdcd00, 0x009b9b9b, 0xe600e6e6, 0x12120012
523 .long 0x4a4a4a00, 0x00949494, 0x25002525, 0x20200020
524 .long 0x90909000, 0x00212121, 0x48004848, 0xb1b100b1
525 .long 0x33333300, 0x00666666, 0x99009999, 0x99990099
526 .long 0x73737300, 0x00e6e6e6, 0xb900b9b9, 0x4c4c004c
527 .long 0x67676700, 0x00cecece, 0xb300b3b3, 0xc2c200c2
528 .long 0xf6f6f600, 0x00ededed, 0x7b007b7b, 0x7e7e007e
529 .long 0xf3f3f300, 0x00e7e7e7, 0xf900f9f9, 0x05050005
530 .long 0x9d9d9d00, 0x003b3b3b, 0xce00cece, 0xb7b700b7
531 .long 0x7f7f7f00, 0x00fefefe, 0xbf00bfbf, 0x31310031
532 .long 0xbfbfbf00, 0x007f7f7f, 0xdf00dfdf, 0x17170017
533 .long 0xe2e2e200, 0x00c5c5c5, 0x71007171, 0xd7d700d7
534 .long 0x52525200, 0x00a4a4a4, 0x29002929, 0x58580058
535 .long 0x9b9b9b00, 0x00373737, 0xcd00cdcd, 0x61610061
536 .long 0xd8d8d800, 0x00b1b1b1, 0x6c006c6c, 0x1b1b001b
537 .long 0x26262600, 0x004c4c4c, 0x13001313, 0x1c1c001c
538 .long 0xc8c8c800, 0x00919191, 0x64006464, 0x0f0f000f
539 .long 0x37373700, 0x006e6e6e, 0x9b009b9b, 0x16160016
540 .long 0xc6c6c600, 0x008d8d8d, 0x63006363, 0x18180018
541 .long 0x3b3b3b00, 0x00767676, 0x9d009d9d, 0x22220022
542 .long 0x81818100, 0x00030303, 0xc000c0c0, 0x44440044
543 .long 0x96969600, 0x002d2d2d, 0x4b004b4b, 0xb2b200b2
544 .long 0x6f6f6f00, 0x00dedede, 0xb700b7b7, 0xb5b500b5
545 .long 0x4b4b4b00, 0x00969696, 0xa500a5a5, 0x91910091
546 .long 0x13131300, 0x00262626, 0x89008989, 0x08080008
547 .long 0xbebebe00, 0x007d7d7d, 0x5f005f5f, 0xa8a800a8
548 .long 0x63636300, 0x00c6c6c6, 0xb100b1b1, 0xfcfc00fc
549 .long 0x2e2e2e00, 0x005c5c5c, 0x17001717, 0x50500050
550 .long 0xe9e9e900, 0x00d3d3d3, 0xf400f4f4, 0xd0d000d0
551 .long 0x79797900, 0x00f2f2f2, 0xbc00bcbc, 0x7d7d007d
552 .long 0xa7a7a700, 0x004f4f4f, 0xd300d3d3, 0x89890089
553 .long 0x8c8c8c00, 0x00191919, 0x46004646, 0x97970097
554 .long 0x9f9f9f00, 0x003f3f3f, 0xcf00cfcf, 0x5b5b005b
555 .long 0x6e6e6e00, 0x00dcdcdc, 0x37003737, 0x95950095
556 .long 0xbcbcbc00, 0x00797979, 0x5e005e5e, 0xffff00ff
557 .long 0x8e8e8e00, 0x001d1d1d, 0x47004747, 0xd2d200d2
558 .long 0x29292900, 0x00525252, 0x94009494, 0xc4c400c4
559 .long 0xf5f5f500, 0x00ebebeb, 0xfa00fafa, 0x48480048
560 .long 0xf9f9f900, 0x00f3f3f3, 0xfc00fcfc, 0xf7f700f7
561 .long 0xb6b6b600, 0x006d6d6d, 0x5b005b5b, 0xdbdb00db
562 .long 0x2f2f2f00, 0x005e5e5e, 0x97009797, 0x03030003
563 .long 0xfdfdfd00, 0x00fbfbfb, 0xfe00fefe, 0xdada00da
564 .long 0xb4b4b400, 0x00696969, 0x5a005a5a, 0x3f3f003f
565 .long 0x59595900, 0x00b2b2b2, 0xac00acac, 0x94940094
566 .long 0x78787800, 0x00f0f0f0, 0x3c003c3c, 0x5c5c005c
567 .long 0x98989800, 0x00313131, 0x4c004c4c, 0x02020002
568 .long 0x06060600, 0x000c0c0c, 0x03000303, 0x4a4a004a
569 .long 0x6a6a6a00, 0x00d4d4d4, 0x35003535, 0x33330033
570 .long 0xe7e7e700, 0x00cfcfcf, 0xf300f3f3, 0x67670067
571 .long 0x46464600, 0x008c8c8c, 0x23002323, 0xf3f300f3
572 .long 0x71717100, 0x00e2e2e2, 0xb800b8b8, 0x7f7f007f
573 .long 0xbababa00, 0x00757575, 0x5d005d5d, 0xe2e200e2
574 .long 0xd4d4d400, 0x00a9a9a9, 0x6a006a6a, 0x9b9b009b
575 .long 0x25252500, 0x004a4a4a, 0x92009292, 0x26260026
576 .long 0xababab00, 0x00575757, 0xd500d5d5, 0x37370037
577 .long 0x42424200, 0x00848484, 0x21002121, 0x3b3b003b
578 .long 0x88888800, 0x00111111, 0x44004444, 0x96960096
579 .long 0xa2a2a200, 0x00454545, 0x51005151, 0x4b4b004b
580 .long 0x8d8d8d00, 0x001b1b1b, 0xc600c6c6, 0xbebe00be
581 .long 0xfafafa00, 0x00f5f5f5, 0x7d007d7d, 0x2e2e002e
582 .long 0x72727200, 0x00e4e4e4, 0x39003939, 0x79790079
583 .long 0x07070700, 0x000e0e0e, 0x83008383, 0x8c8c008c
584 .long 0xb9b9b900, 0x00737373, 0xdc00dcdc, 0x6e6e006e
585 .long 0x55555500, 0x00aaaaaa, 0xaa00aaaa, 0x8e8e008e
586 .long 0xf8f8f800, 0x00f1f1f1, 0x7c007c7c, 0xf5f500f5
587 .long 0xeeeeee00, 0x00dddddd, 0x77007777, 0xb6b600b6
588 .long 0xacacac00, 0x00595959, 0x56005656, 0xfdfd00fd
589 .long 0x0a0a0a00, 0x00141414, 0x05000505, 0x59590059
590 .long 0x36363600, 0x006c6c6c, 0x1b001b1b, 0x98980098
591 .long 0x49494900, 0x00929292, 0xa400a4a4, 0x6a6a006a
592 .long 0x2a2a2a00, 0x00545454, 0x15001515, 0x46460046
593 .long 0x68686800, 0x00d0d0d0, 0x34003434, 0xbaba00ba
594 .long 0x3c3c3c00, 0x00787878, 0x1e001e1e, 0x25250025
595 .long 0x38383800, 0x00707070, 0x1c001c1c, 0x42420042
596 .long 0xf1f1f100, 0x00e3e3e3, 0xf800f8f8, 0xa2a200a2
597 .long 0xa4a4a400, 0x00494949, 0x52005252, 0xfafa00fa
598 .long 0x40404000, 0x00808080, 0x20002020, 0x07070007
599 .long 0x28282800, 0x00505050, 0x14001414, 0x55550055
600 .long 0xd3d3d300, 0x00a7a7a7, 0xe900e9e9, 0xeeee00ee
601 .long 0x7b7b7b00, 0x00f6f6f6, 0xbd00bdbd, 0x0a0a000a
602 .long 0xbbbbbb00, 0x00777777, 0xdd00dddd, 0x49490049
603 .long 0xc9c9c900, 0x00939393, 0xe400e4e4, 0x68680068
604 .long 0x43434300, 0x00868686, 0xa100a1a1, 0x38380038
605 .long 0xc1c1c100, 0x00838383, 0xe000e0e0, 0xa4a400a4
606 .long 0x15151500, 0x002a2a2a, 0x8a008a8a, 0x28280028
607 .long 0xe3e3e300, 0x00c7c7c7, 0xf100f1f1, 0x7b7b007b
608 .long 0xadadad00, 0x005b5b5b, 0xd600d6d6, 0xc9c900c9
609 .long 0xf4f4f400, 0x00e9e9e9, 0x7a007a7a, 0xc1c100c1
610 .long 0x77777700, 0x00eeeeee, 0xbb00bbbb, 0xe3e300e3
611 .long 0xc7c7c700, 0x008f8f8f, 0xe300e3e3, 0xf4f400f4
612 .long 0x80808000, 0x00010101, 0x40004040, 0xc7c700c7
613 .long 0x9e9e9e00, 0x003d3d3d, 0x4f004f4f, 0x9e9e009e
614
615 #endif /*HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS*/
616 #endif /*__ARM_ARCH >= 6*/