1 /* rijndael-arm.S - ARM assembly implementation of AES cipher
3 * Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
5 * This file is part of Libgcrypt.
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.
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.
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/>.
23 #if defined(__ARMEL__)
24 #ifdef HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS
32 # define GET_DATA_POINTER(reg, name, rtmp) \
36 1: .word _GLOBAL_OFFSET_TABLE_-(3f+8); \
38 3: add reg, pc, reg; \
41 # define GET_DATA_POINTER(reg, name, rtmp) ldr reg, =name
64 #define ldr_unaligned_le(rout, rsrc, offs, rtmp) \
65 ldrb rout, [rsrc, #((offs) + 0)]; \
66 ldrb rtmp, [rsrc, #((offs) + 1)]; \
67 orr rout, rout, rtmp, lsl #8; \
68 ldrb rtmp, [rsrc, #((offs) + 2)]; \
69 orr rout, rout, rtmp, lsl #16; \
70 ldrb rtmp, [rsrc, #((offs) + 3)]; \
71 orr rout, rout, rtmp, lsl #24;
73 #define str_unaligned_le(rin, rdst, offs, rtmp0, rtmp1) \
74 mov rtmp0, rin, lsr #8; \
75 strb rin, [rdst, #((offs) + 0)]; \
76 mov rtmp1, rin, lsr #16; \
77 strb rtmp0, [rdst, #((offs) + 1)]; \
78 mov rtmp0, rin, lsr #24; \
79 strb rtmp1, [rdst, #((offs) + 2)]; \
80 strb rtmp0, [rdst, #((offs) + 3)];
82 /***********************************************************************
83 * ARM assembly implementation of the AES cipher
84 ***********************************************************************/
85 #define preload_first_key(round, ra) \
86 ldr ra, [CTX, #(((round) * 16) + 0 * 4)];
88 #define dummy(round, ra) /* nothing */
90 #define addroundkey(ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_key) \
91 ldm CTX, {rna, rnb, rnc, rnd}; \
95 preload_key(1, rna); \
98 #define do_encround(next_r, ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_key) \
99 ldr rnb, [CTX, #(((next_r) * 16) + 1 * 4)]; \
101 and RT0, RMASK, ra, lsl#3; \
102 ldr rnc, [CTX, #(((next_r) * 16) + 2 * 4)]; \
103 and RT1, RMASK, ra, lsr#(8 - 3); \
104 ldr rnd, [CTX, #(((next_r) * 16) + 3 * 4)]; \
105 and RT2, RMASK, ra, lsr#(16 - 3); \
106 ldr RT0, [RTAB, RT0]; \
107 and ra, RMASK, ra, lsr#(24 - 3); \
109 ldr RT1, [RTAB, RT1]; \
111 ldr RT2, [RTAB, RT2]; \
112 and RT0, RMASK, rd, lsl#3; \
113 ldr ra, [RTAB, ra]; \
115 eor rnd, rnd, RT1, ror #24; \
116 and RT1, RMASK, rd, lsr#(8 - 3); \
117 eor rnc, rnc, RT2, ror #16; \
118 and RT2, RMASK, rd, lsr#(16 - 3); \
119 eor rnb, rnb, ra, ror #8; \
120 ldr RT0, [RTAB, RT0]; \
121 and rd, RMASK, rd, lsr#(24 - 3); \
123 ldr RT1, [RTAB, RT1]; \
125 ldr RT2, [RTAB, RT2]; \
126 and RT0, RMASK, rc, lsl#3; \
127 ldr rd, [RTAB, rd]; \
129 eor rnc, rnc, RT1, ror #24; \
130 and RT1, RMASK, rc, lsr#(8 - 3); \
131 eor rnb, rnb, RT2, ror #16; \
132 and RT2, RMASK, rc, lsr#(16 - 3); \
133 eor rna, rna, rd, ror #8; \
134 ldr RT0, [RTAB, RT0]; \
135 and rc, RMASK, rc, lsr#(24 - 3); \
137 ldr RT1, [RTAB, RT1]; \
139 ldr RT2, [RTAB, RT2]; \
140 and RT0, RMASK, rb, lsl#3; \
141 ldr rc, [RTAB, rc]; \
143 eor rnb, rnb, RT1, ror #24; \
144 and RT1, RMASK, rb, lsr#(8 - 3); \
145 eor rna, rna, RT2, ror #16; \
146 and RT2, RMASK, rb, lsr#(16 - 3); \
147 eor rnd, rnd, rc, ror #8; \
148 ldr RT0, [RTAB, RT0]; \
149 and rb, RMASK, rb, lsr#(24 - 3); \
151 ldr RT1, [RTAB, RT1]; \
153 ldr RT2, [RTAB, RT2]; \
154 eor rna, rna, RT1, ror #24; \
155 ldr rb, [RTAB, rb]; \
157 eor rnd, rnd, RT2, ror #16; \
158 preload_key((next_r) + 1, ra); \
159 eor rnc, rnc, rb, ror #8;
161 #define do_lastencround(ra, rb, rc, rd, rna, rnb, rnc, rnd) \
162 and RT0, RMASK, ra, lsl#3; \
163 and RT1, RMASK, ra, lsr#(8 - 3); \
164 and RT2, RMASK, ra, lsr#(16 - 3); \
165 ldr rna, [RTAB, RT0]; \
166 and ra, RMASK, ra, lsr#(24 - 3); \
167 ldr rnd, [RTAB, RT1]; \
168 and RT0, RMASK, rd, lsl#3; \
169 ldr rnc, [RTAB, RT2]; \
170 mov rnd, rnd, ror #24; \
171 ldr rnb, [RTAB, ra]; \
172 and RT1, RMASK, rd, lsr#(8 - 3); \
173 mov rnc, rnc, ror #16; \
174 and RT2, RMASK, rd, lsr#(16 - 3); \
175 mov rnb, rnb, ror #8; \
176 ldr RT0, [RTAB, RT0]; \
177 and rd, RMASK, rd, lsr#(24 - 3); \
178 ldr RT1, [RTAB, RT1]; \
181 ldr RT2, [RTAB, RT2]; \
182 and RT0, RMASK, rc, lsl#3; \
183 ldr rd, [RTAB, rd]; \
184 orr rnc, rnc, RT1, ror #24; \
185 and RT1, RMASK, rc, lsr#(8 - 3); \
186 orr rnb, rnb, RT2, ror #16; \
187 and RT2, RMASK, rc, lsr#(16 - 3); \
188 orr rna, rna, rd, ror #8; \
189 ldr RT0, [RTAB, RT0]; \
190 and rc, RMASK, rc, lsr#(24 - 3); \
191 ldr RT1, [RTAB, RT1]; \
194 ldr RT2, [RTAB, RT2]; \
195 and RT0, RMASK, rb, lsl#3; \
196 ldr rc, [RTAB, rc]; \
197 orr rnb, rnb, RT1, ror #24; \
198 and RT1, RMASK, rb, lsr#(8 - 3); \
199 orr rna, rna, RT2, ror #16; \
200 ldr RT0, [RTAB, RT0]; \
201 and RT2, RMASK, rb, lsr#(16 - 3); \
202 ldr RT1, [RTAB, RT1]; \
203 orr rnd, rnd, rc, ror #8; \
204 ldr RT2, [RTAB, RT2]; \
205 and rb, RMASK, rb, lsr#(24 - 3); \
206 ldr rb, [RTAB, rb]; \
209 orr rna, rna, RT1, ror #24; \
210 orr rnd, rnd, RT2, ror #16; \
211 orr rnc, rnc, rb, ror #8;
213 #define firstencround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd) \
214 addroundkey(ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_first_key); \
215 do_encround((round) + 1, ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_first_key);
217 #define encround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_key) \
218 do_encround((round) + 1, ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_key);
220 #define lastencround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd) \
221 add CTX, #(((round) + 1) * 16); \
223 do_lastencround(ra, rb, rc, rd, rna, rnb, rnc, rnd); \
224 addroundkey(rna, rnb, rnc, rnd, ra, rb, rc, rd, dummy);
227 .globl _gcry_aes_arm_encrypt_block
228 .type _gcry_aes_arm_encrypt_block,%function;
230 _gcry_aes_arm_encrypt_block:
235 * %r3: number of rounds.. 10, 12 or 14
237 push {%r4-%r11, %ip, %lr};
239 /* read input block */
240 #ifndef __ARM_FEATURE_UNALIGNED
241 /* test if src is unaligned */
246 ldr_unaligned_le(RA, %r2, 0, RNA);
247 ldr_unaligned_le(RB, %r2, 4, RNB);
248 ldr_unaligned_le(RC, %r2, 8, RNA);
249 ldr_unaligned_le(RD, %r2, 12, RNB);
255 ldm %r2, {RA, RB, RC, RD};
265 GET_DATA_POINTER(RTAB, .LtableE0, RMASK);
267 str %r1, [%sp, #4]; /* dst */
269 str %r3, [%sp, #8]; /* nrounds */
270 mov RMASK, RMASK, lsl#3; /* byte mask */
272 firstencround(0, RA, RB, RC, RD, RNA, RNB, RNC, RND);
273 encround(1, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
274 encround(2, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
275 encround(3, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
276 encround(4, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
277 encround(5, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
278 encround(6, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
279 encround(7, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
281 ldr RT0, [%sp, #8]; /* nrounds */
285 encround(8, RA, RB, RC, RD, RNA, RNB, RNC, RND, dummy);
286 lastencround(9, RNA, RNB, RNC, RND, RA, RB, RC, RD);
289 ldr RT0, [%sp, #4]; /* dst */
292 /* store output block */
293 #ifndef __ARM_FEATURE_UNALIGNED
294 /* test if dst is unaligned */
298 /* unaligned store */
299 str_unaligned_le(RA, RT0, 0, RNA, RNB);
300 str_unaligned_le(RB, RT0, 4, RNA, RNB);
301 str_unaligned_le(RC, RT0, 8, RNA, RNB);
302 str_unaligned_le(RD, RT0, 12, RNA, RNB);
314 /* write output block */
315 stm RT0, {RA, RB, RC, RD};
317 pop {%r4-%r11, %ip, %pc};
323 encround(8, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
324 encround(9, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
325 encround(10, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
326 encround(11, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
327 encround(12, RA, RB, RC, RD, RNA, RNB, RNC, RND, dummy);
328 lastencround(13, RNA, RNB, RNC, RND, RA, RB, RC, RD);
334 encround(8, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
335 encround(9, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
336 encround(10, RA, RB, RC, RD, RNA, RNB, RNC, RND, dummy);
337 lastencround(11, RNA, RNB, RNC, RND, RA, RB, RC, RD);
340 .size _gcry_aes_arm_encrypt_block,.-_gcry_aes_arm_encrypt_block;
342 #define addroundkey_dec(round, ra, rb, rc, rd, rna, rnb, rnc, rnd) \
343 ldr rna, [CTX, #(((round) * 16) + 0 * 4)]; \
344 ldr rnb, [CTX, #(((round) * 16) + 1 * 4)]; \
346 ldr rnc, [CTX, #(((round) * 16) + 2 * 4)]; \
348 ldr rnd, [CTX, #(((round) * 16) + 3 * 4)]; \
350 preload_first_key((round) - 1, rna); \
353 #define do_decround(next_r, ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_key) \
354 ldr rnb, [CTX, #(((next_r) * 16) + 1 * 4)]; \
356 and RT0, RMASK, ra, lsl#3; \
357 ldr rnc, [CTX, #(((next_r) * 16) + 2 * 4)]; \
358 and RT1, RMASK, ra, lsr#(8 - 3); \
359 ldr rnd, [CTX, #(((next_r) * 16) + 3 * 4)]; \
360 and RT2, RMASK, ra, lsr#(16 - 3); \
361 ldr RT0, [RTAB, RT0]; \
362 and ra, RMASK, ra, lsr#(24 - 3); \
364 ldr RT1, [RTAB, RT1]; \
366 ldr RT2, [RTAB, RT2]; \
367 and RT0, RMASK, rb, lsl#3; \
368 ldr ra, [RTAB, ra]; \
370 eor rnb, rnb, RT1, ror #24; \
371 and RT1, RMASK, rb, lsr#(8 - 3); \
372 eor rnc, rnc, RT2, ror #16; \
373 and RT2, RMASK, rb, lsr#(16 - 3); \
374 eor rnd, rnd, ra, ror #8; \
375 ldr RT0, [RTAB, RT0]; \
376 and rb, RMASK, rb, lsr#(24 - 3); \
378 ldr RT1, [RTAB, RT1]; \
380 ldr RT2, [RTAB, RT2]; \
381 and RT0, RMASK, rc, lsl#3; \
382 ldr rb, [RTAB, rb]; \
384 eor rnc, rnc, RT1, ror #24; \
385 and RT1, RMASK, rc, lsr#(8 - 3); \
386 eor rnd, rnd, RT2, ror #16; \
387 and RT2, RMASK, rc, lsr#(16 - 3); \
388 eor rna, rna, rb, ror #8; \
389 ldr RT0, [RTAB, RT0]; \
390 and rc, RMASK, rc, lsr#(24 - 3); \
392 ldr RT1, [RTAB, RT1]; \
394 ldr RT2, [RTAB, RT2]; \
395 and RT0, RMASK, rd, lsl#3; \
396 ldr rc, [RTAB, rc]; \
398 eor rnd, rnd, RT1, ror #24; \
399 and RT1, RMASK, rd, lsr#(8 - 3); \
400 eor rna, rna, RT2, ror #16; \
401 and RT2, RMASK, rd, lsr#(16 - 3); \
402 eor rnb, rnb, rc, ror #8; \
403 ldr RT0, [RTAB, RT0]; \
404 and rd, RMASK, rd, lsr#(24 - 3); \
406 ldr RT1, [RTAB, RT1]; \
408 ldr RT2, [RTAB, RT2]; \
409 eor rna, rna, RT1, ror #24; \
410 ldr rd, [RTAB, rd]; \
412 eor rnb, rnb, RT2, ror #16; \
413 preload_key((next_r) - 1, ra); \
414 eor rnc, rnc, rd, ror #8;
416 #define do_lastdecround(ra, rb, rc, rd, rna, rnb, rnc, rnd) \
417 and RT0, RMASK, ra, lsl#3; \
418 and RT1, RMASK, ra, lsr#(8 - 3); \
419 and RT2, RMASK, ra, lsr#(16 - 3); \
420 ldr rna, [RTAB, RT0]; \
421 and ra, RMASK, ra, lsr#(24 - 3); \
422 ldr rnb, [RTAB, RT1]; \
423 and RT0, RMASK, rb, lsl#3; \
424 ldr rnc, [RTAB, RT2]; \
425 mov rnb, rnb, ror #24; \
426 ldr rnd, [RTAB, ra]; \
427 and RT1, RMASK, rb, lsr#(8 - 3); \
428 mov rnc, rnc, ror #16; \
429 and RT2, RMASK, rb, lsr#(16 - 3); \
430 mov rnd, rnd, ror #8; \
431 ldr RT0, [RTAB, RT0]; \
432 and rb, RMASK, rb, lsr#(24 - 3); \
433 ldr RT1, [RTAB, RT1]; \
436 ldr RT2, [RTAB, RT2]; \
437 and RT0, RMASK, rc, lsl#3; \
438 ldr rb, [RTAB, rb]; \
439 orr rnc, rnc, RT1, ror #24; \
440 and RT1, RMASK, rc, lsr#(8 - 3); \
441 orr rnd, rnd, RT2, ror #16; \
442 and RT2, RMASK, rc, lsr#(16 - 3); \
443 orr rna, rna, rb, ror #8; \
444 ldr RT0, [RTAB, RT0]; \
445 and rc, RMASK, rc, lsr#(24 - 3); \
446 ldr RT1, [RTAB, RT1]; \
449 ldr RT2, [RTAB, RT2]; \
450 and RT0, RMASK, rd, lsl#3; \
451 ldr rc, [RTAB, rc]; \
452 orr rnd, rnd, RT1, ror #24; \
453 and RT1, RMASK, rd, lsr#(8 - 3); \
454 orr rna, rna, RT2, ror #16; \
455 ldr RT0, [RTAB, RT0]; \
456 and RT2, RMASK, rd, lsr#(16 - 3); \
457 ldr RT1, [RTAB, RT1]; \
458 orr rnb, rnb, rc, ror #8; \
459 ldr RT2, [RTAB, RT2]; \
460 and rd, RMASK, rd, lsr#(24 - 3); \
461 ldr rd, [RTAB, rd]; \
464 orr rna, rna, RT1, ror #24; \
465 orr rnb, rnb, RT2, ror #16; \
466 orr rnc, rnc, rd, ror #8;
468 #define firstdecround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd) \
469 addroundkey_dec(((round) + 1), ra, rb, rc, rd, rna, rnb, rnc, rnd); \
470 do_decround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_first_key);
472 #define decround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_key) \
473 do_decround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_key);
475 #define lastdecround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd) \
477 do_lastdecround(ra, rb, rc, rd, rna, rnb, rnc, rnd); \
478 addroundkey(rna, rnb, rnc, rnd, ra, rb, rc, rd, dummy);
481 .globl _gcry_aes_arm_decrypt_block
482 .type _gcry_aes_arm_decrypt_block,%function;
484 _gcry_aes_arm_decrypt_block:
489 * %r3: number of rounds.. 10, 12 or 14
491 push {%r4-%r11, %ip, %lr};
493 /* read input block */
494 #ifndef __ARM_FEATURE_UNALIGNED
495 /* test if src is unaligned */
500 ldr_unaligned_le(RA, %r2, 0, RNA);
501 ldr_unaligned_le(RB, %r2, 4, RNB);
502 ldr_unaligned_le(RC, %r2, 8, RNA);
503 ldr_unaligned_le(RD, %r2, 12, RNB);
509 ldm %r2, {RA, RB, RC, RD};
519 GET_DATA_POINTER(RTAB, .LtableD0, RMASK);
522 str %r1, [%sp, #4]; /* dst */
523 mov RMASK, RMASK, lsl#3; /* byte mask */
528 firstdecround(9, RA, RB, RC, RD, RNA, RNB, RNC, RND);
530 decround(8, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
531 decround(7, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
532 decround(6, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
533 decround(5, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
534 decround(4, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
535 decround(3, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
536 decround(2, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
537 decround(1, RA, RB, RC, RD, RNA, RNB, RNC, RND, dummy);
538 lastdecround(0, RNA, RNB, RNC, RND, RA, RB, RC, RD);
540 ldr RT0, [%sp, #4]; /* dst */
543 /* store output block */
544 #ifndef __ARM_FEATURE_UNALIGNED
545 /* test if dst is unaligned */
549 /* unaligned store */
550 str_unaligned_le(RA, RT0, 0, RNA, RNB);
551 str_unaligned_le(RB, RT0, 4, RNA, RNB);
552 str_unaligned_le(RC, RT0, 8, RNA, RNB);
553 str_unaligned_le(RD, RT0, 12, RNA, RNB);
565 /* write output block */
566 stm RT0, {RA, RB, RC, RD};
568 pop {%r4-%r11, %ip, %pc};
574 firstdecround(13, RA, RB, RC, RD, RNA, RNB, RNC, RND);
575 decround(12, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
576 decround(11, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
577 decround(10, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
578 decround(9, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
584 firstdecround(11, RA, RB, RC, RD, RNA, RNB, RNC, RND);
585 decround(10, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
586 decround(9, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
589 .size _gcry_aes_arm_encrypt_block,.-_gcry_aes_arm_encrypt_block;
593 /* Encryption tables */
595 .type .LtableE0, %object
596 .type .LtableEs0, %object
600 .long 0x00000063, 0x847c7cf8, 0x0000007c
601 .long 0x997777ee, 0x00000077, 0x8d7b7bf6, 0x0000007b
602 .long 0x0df2f2ff, 0x000000f2, 0xbd6b6bd6, 0x0000006b
603 .long 0xb16f6fde, 0x0000006f, 0x54c5c591, 0x000000c5
604 .long 0x50303060, 0x00000030, 0x03010102, 0x00000001
605 .long 0xa96767ce, 0x00000067, 0x7d2b2b56, 0x0000002b
606 .long 0x19fefee7, 0x000000fe, 0x62d7d7b5, 0x000000d7
607 .long 0xe6abab4d, 0x000000ab, 0x9a7676ec, 0x00000076
608 .long 0x45caca8f, 0x000000ca, 0x9d82821f, 0x00000082
609 .long 0x40c9c989, 0x000000c9, 0x877d7dfa, 0x0000007d
610 .long 0x15fafaef, 0x000000fa, 0xeb5959b2, 0x00000059
611 .long 0xc947478e, 0x00000047, 0x0bf0f0fb, 0x000000f0
612 .long 0xecadad41, 0x000000ad, 0x67d4d4b3, 0x000000d4
613 .long 0xfda2a25f, 0x000000a2, 0xeaafaf45, 0x000000af
614 .long 0xbf9c9c23, 0x0000009c, 0xf7a4a453, 0x000000a4
615 .long 0x967272e4, 0x00000072, 0x5bc0c09b, 0x000000c0
616 .long 0xc2b7b775, 0x000000b7, 0x1cfdfde1, 0x000000fd
617 .long 0xae93933d, 0x00000093, 0x6a26264c, 0x00000026
618 .long 0x5a36366c, 0x00000036, 0x413f3f7e, 0x0000003f
619 .long 0x02f7f7f5, 0x000000f7, 0x4fcccc83, 0x000000cc
620 .long 0x5c343468, 0x00000034, 0xf4a5a551, 0x000000a5
621 .long 0x34e5e5d1, 0x000000e5, 0x08f1f1f9, 0x000000f1
622 .long 0x937171e2, 0x00000071, 0x73d8d8ab, 0x000000d8
623 .long 0x53313162, 0x00000031, 0x3f15152a, 0x00000015
624 .long 0x0c040408, 0x00000004, 0x52c7c795, 0x000000c7
625 .long 0x65232346, 0x00000023, 0x5ec3c39d, 0x000000c3
626 .long 0x28181830, 0x00000018, 0xa1969637, 0x00000096
627 .long 0x0f05050a, 0x00000005, 0xb59a9a2f, 0x0000009a
628 .long 0x0907070e, 0x00000007, 0x36121224, 0x00000012
629 .long 0x9b80801b, 0x00000080, 0x3de2e2df, 0x000000e2
630 .long 0x26ebebcd, 0x000000eb, 0x6927274e, 0x00000027
631 .long 0xcdb2b27f, 0x000000b2, 0x9f7575ea, 0x00000075
632 .long 0x1b090912, 0x00000009, 0x9e83831d, 0x00000083
633 .long 0x742c2c58, 0x0000002c, 0x2e1a1a34, 0x0000001a
634 .long 0x2d1b1b36, 0x0000001b, 0xb26e6edc, 0x0000006e
635 .long 0xee5a5ab4, 0x0000005a, 0xfba0a05b, 0x000000a0
636 .long 0xf65252a4, 0x00000052, 0x4d3b3b76, 0x0000003b
637 .long 0x61d6d6b7, 0x000000d6, 0xceb3b37d, 0x000000b3
638 .long 0x7b292952, 0x00000029, 0x3ee3e3dd, 0x000000e3
639 .long 0x712f2f5e, 0x0000002f, 0x97848413, 0x00000084
640 .long 0xf55353a6, 0x00000053, 0x68d1d1b9, 0x000000d1
641 .long 0x00000000, 0x00000000, 0x2cededc1, 0x000000ed
642 .long 0x60202040, 0x00000020, 0x1ffcfce3, 0x000000fc
643 .long 0xc8b1b179, 0x000000b1, 0xed5b5bb6, 0x0000005b
644 .long 0xbe6a6ad4, 0x0000006a, 0x46cbcb8d, 0x000000cb
645 .long 0xd9bebe67, 0x000000be, 0x4b393972, 0x00000039
646 .long 0xde4a4a94, 0x0000004a, 0xd44c4c98, 0x0000004c
647 .long 0xe85858b0, 0x00000058, 0x4acfcf85, 0x000000cf
648 .long 0x6bd0d0bb, 0x000000d0, 0x2aefefc5, 0x000000ef
649 .long 0xe5aaaa4f, 0x000000aa, 0x16fbfbed, 0x000000fb
650 .long 0xc5434386, 0x00000043, 0xd74d4d9a, 0x0000004d
651 .long 0x55333366, 0x00000033, 0x94858511, 0x00000085
652 .long 0xcf45458a, 0x00000045, 0x10f9f9e9, 0x000000f9
653 .long 0x06020204, 0x00000002, 0x817f7ffe, 0x0000007f
654 .long 0xf05050a0, 0x00000050, 0x443c3c78, 0x0000003c
655 .long 0xba9f9f25, 0x0000009f, 0xe3a8a84b, 0x000000a8
656 .long 0xf35151a2, 0x00000051, 0xfea3a35d, 0x000000a3
657 .long 0xc0404080, 0x00000040, 0x8a8f8f05, 0x0000008f
658 .long 0xad92923f, 0x00000092, 0xbc9d9d21, 0x0000009d
659 .long 0x48383870, 0x00000038, 0x04f5f5f1, 0x000000f5
660 .long 0xdfbcbc63, 0x000000bc, 0xc1b6b677, 0x000000b6
661 .long 0x75dadaaf, 0x000000da, 0x63212142, 0x00000021
662 .long 0x30101020, 0x00000010, 0x1affffe5, 0x000000ff
663 .long 0x0ef3f3fd, 0x000000f3, 0x6dd2d2bf, 0x000000d2
664 .long 0x4ccdcd81, 0x000000cd, 0x140c0c18, 0x0000000c
665 .long 0x35131326, 0x00000013, 0x2fececc3, 0x000000ec
666 .long 0xe15f5fbe, 0x0000005f, 0xa2979735, 0x00000097
667 .long 0xcc444488, 0x00000044, 0x3917172e, 0x00000017
668 .long 0x57c4c493, 0x000000c4, 0xf2a7a755, 0x000000a7
669 .long 0x827e7efc, 0x0000007e, 0x473d3d7a, 0x0000003d
670 .long 0xac6464c8, 0x00000064, 0xe75d5dba, 0x0000005d
671 .long 0x2b191932, 0x00000019, 0x957373e6, 0x00000073
672 .long 0xa06060c0, 0x00000060, 0x98818119, 0x00000081
673 .long 0xd14f4f9e, 0x0000004f, 0x7fdcdca3, 0x000000dc
674 .long 0x66222244, 0x00000022, 0x7e2a2a54, 0x0000002a
675 .long 0xab90903b, 0x00000090, 0x8388880b, 0x00000088
676 .long 0xca46468c, 0x00000046, 0x29eeeec7, 0x000000ee
677 .long 0xd3b8b86b, 0x000000b8, 0x3c141428, 0x00000014
678 .long 0x79dedea7, 0x000000de, 0xe25e5ebc, 0x0000005e
679 .long 0x1d0b0b16, 0x0000000b, 0x76dbdbad, 0x000000db
680 .long 0x3be0e0db, 0x000000e0, 0x56323264, 0x00000032
681 .long 0x4e3a3a74, 0x0000003a, 0x1e0a0a14, 0x0000000a
682 .long 0xdb494992, 0x00000049, 0x0a06060c, 0x00000006
683 .long 0x6c242448, 0x00000024, 0xe45c5cb8, 0x0000005c
684 .long 0x5dc2c29f, 0x000000c2, 0x6ed3d3bd, 0x000000d3
685 .long 0xefacac43, 0x000000ac, 0xa66262c4, 0x00000062
686 .long 0xa8919139, 0x00000091, 0xa4959531, 0x00000095
687 .long 0x37e4e4d3, 0x000000e4, 0x8b7979f2, 0x00000079
688 .long 0x32e7e7d5, 0x000000e7, 0x43c8c88b, 0x000000c8
689 .long 0x5937376e, 0x00000037, 0xb76d6dda, 0x0000006d
690 .long 0x8c8d8d01, 0x0000008d, 0x64d5d5b1, 0x000000d5
691 .long 0xd24e4e9c, 0x0000004e, 0xe0a9a949, 0x000000a9
692 .long 0xb46c6cd8, 0x0000006c, 0xfa5656ac, 0x00000056
693 .long 0x07f4f4f3, 0x000000f4, 0x25eaeacf, 0x000000ea
694 .long 0xaf6565ca, 0x00000065, 0x8e7a7af4, 0x0000007a
695 .long 0xe9aeae47, 0x000000ae, 0x18080810, 0x00000008
696 .long 0xd5baba6f, 0x000000ba, 0x887878f0, 0x00000078
697 .long 0x6f25254a, 0x00000025, 0x722e2e5c, 0x0000002e
698 .long 0x241c1c38, 0x0000001c, 0xf1a6a657, 0x000000a6
699 .long 0xc7b4b473, 0x000000b4, 0x51c6c697, 0x000000c6
700 .long 0x23e8e8cb, 0x000000e8, 0x7cdddda1, 0x000000dd
701 .long 0x9c7474e8, 0x00000074, 0x211f1f3e, 0x0000001f
702 .long 0xdd4b4b96, 0x0000004b, 0xdcbdbd61, 0x000000bd
703 .long 0x868b8b0d, 0x0000008b, 0x858a8a0f, 0x0000008a
704 .long 0x907070e0, 0x00000070, 0x423e3e7c, 0x0000003e
705 .long 0xc4b5b571, 0x000000b5, 0xaa6666cc, 0x00000066
706 .long 0xd8484890, 0x00000048, 0x05030306, 0x00000003
707 .long 0x01f6f6f7, 0x000000f6, 0x120e0e1c, 0x0000000e
708 .long 0xa36161c2, 0x00000061, 0x5f35356a, 0x00000035
709 .long 0xf95757ae, 0x00000057, 0xd0b9b969, 0x000000b9
710 .long 0x91868617, 0x00000086, 0x58c1c199, 0x000000c1
711 .long 0x271d1d3a, 0x0000001d, 0xb99e9e27, 0x0000009e
712 .long 0x38e1e1d9, 0x000000e1, 0x13f8f8eb, 0x000000f8
713 .long 0xb398982b, 0x00000098, 0x33111122, 0x00000011
714 .long 0xbb6969d2, 0x00000069, 0x70d9d9a9, 0x000000d9
715 .long 0x898e8e07, 0x0000008e, 0xa7949433, 0x00000094
716 .long 0xb69b9b2d, 0x0000009b, 0x221e1e3c, 0x0000001e
717 .long 0x92878715, 0x00000087, 0x20e9e9c9, 0x000000e9
718 .long 0x49cece87, 0x000000ce, 0xff5555aa, 0x00000055
719 .long 0x78282850, 0x00000028, 0x7adfdfa5, 0x000000df
720 .long 0x8f8c8c03, 0x0000008c, 0xf8a1a159, 0x000000a1
721 .long 0x80898909, 0x00000089, 0x170d0d1a, 0x0000000d
722 .long 0xdabfbf65, 0x000000bf, 0x31e6e6d7, 0x000000e6
723 .long 0xc6424284, 0x00000042, 0xb86868d0, 0x00000068
724 .long 0xc3414182, 0x00000041, 0xb0999929, 0x00000099
725 .long 0x772d2d5a, 0x0000002d, 0x110f0f1e, 0x0000000f
726 .long 0xcbb0b07b, 0x000000b0, 0xfc5454a8, 0x00000054
727 .long 0xd6bbbb6d, 0x000000bb, 0x3a16162c, 0x00000016
729 /* Decryption tables */
731 .type .LtableD0, %object
732 .type .LtableDs0, %object
736 .long 0x00000052, 0x5365417e, 0x00000009
737 .long 0xc3a4171a, 0x0000006a, 0x965e273a, 0x000000d5
738 .long 0xcb6bab3b, 0x00000030, 0xf1459d1f, 0x00000036
739 .long 0xab58faac, 0x000000a5, 0x9303e34b, 0x00000038
740 .long 0x55fa3020, 0x000000bf, 0xf66d76ad, 0x00000040
741 .long 0x9176cc88, 0x000000a3, 0x254c02f5, 0x0000009e
742 .long 0xfcd7e54f, 0x00000081, 0xd7cb2ac5, 0x000000f3
743 .long 0x80443526, 0x000000d7, 0x8fa362b5, 0x000000fb
744 .long 0x495ab1de, 0x0000007c, 0x671bba25, 0x000000e3
745 .long 0x980eea45, 0x00000039, 0xe1c0fe5d, 0x00000082
746 .long 0x02752fc3, 0x0000009b, 0x12f04c81, 0x0000002f
747 .long 0xa397468d, 0x000000ff, 0xc6f9d36b, 0x00000087
748 .long 0xe75f8f03, 0x00000034, 0x959c9215, 0x0000008e
749 .long 0xeb7a6dbf, 0x00000043, 0xda595295, 0x00000044
750 .long 0x2d83bed4, 0x000000c4, 0xd3217458, 0x000000de
751 .long 0x2969e049, 0x000000e9, 0x44c8c98e, 0x000000cb
752 .long 0x6a89c275, 0x00000054, 0x78798ef4, 0x0000007b
753 .long 0x6b3e5899, 0x00000094, 0xdd71b927, 0x00000032
754 .long 0xb64fe1be, 0x000000a6, 0x17ad88f0, 0x000000c2
755 .long 0x66ac20c9, 0x00000023, 0xb43ace7d, 0x0000003d
756 .long 0x184adf63, 0x000000ee, 0x82311ae5, 0x0000004c
757 .long 0x60335197, 0x00000095, 0x457f5362, 0x0000000b
758 .long 0xe07764b1, 0x00000042, 0x84ae6bbb, 0x000000fa
759 .long 0x1ca081fe, 0x000000c3, 0x942b08f9, 0x0000004e
760 .long 0x58684870, 0x00000008, 0x19fd458f, 0x0000002e
761 .long 0x876cde94, 0x000000a1, 0xb7f87b52, 0x00000066
762 .long 0x23d373ab, 0x00000028, 0xe2024b72, 0x000000d9
763 .long 0x578f1fe3, 0x00000024, 0x2aab5566, 0x000000b2
764 .long 0x0728ebb2, 0x00000076, 0x03c2b52f, 0x0000005b
765 .long 0x9a7bc586, 0x000000a2, 0xa50837d3, 0x00000049
766 .long 0xf2872830, 0x0000006d, 0xb2a5bf23, 0x0000008b
767 .long 0xba6a0302, 0x000000d1, 0x5c8216ed, 0x00000025
768 .long 0x2b1ccf8a, 0x00000072, 0x92b479a7, 0x000000f8
769 .long 0xf0f207f3, 0x000000f6, 0xa1e2694e, 0x00000064
770 .long 0xcdf4da65, 0x00000086, 0xd5be0506, 0x00000068
771 .long 0x1f6234d1, 0x00000098, 0x8afea6c4, 0x00000016
772 .long 0x9d532e34, 0x000000d4, 0xa055f3a2, 0x000000a4
773 .long 0x32e18a05, 0x0000005c, 0x75ebf6a4, 0x000000cc
774 .long 0x39ec830b, 0x0000005d, 0xaaef6040, 0x00000065
775 .long 0x069f715e, 0x000000b6, 0x51106ebd, 0x00000092
776 .long 0xf98a213e, 0x0000006c, 0x3d06dd96, 0x00000070
777 .long 0xae053edd, 0x00000048, 0x46bde64d, 0x00000050
778 .long 0xb58d5491, 0x000000fd, 0x055dc471, 0x000000ed
779 .long 0x6fd40604, 0x000000b9, 0xff155060, 0x000000da
780 .long 0x24fb9819, 0x0000005e, 0x97e9bdd6, 0x00000015
781 .long 0xcc434089, 0x00000046, 0x779ed967, 0x00000057
782 .long 0xbd42e8b0, 0x000000a7, 0x888b8907, 0x0000008d
783 .long 0x385b19e7, 0x0000009d, 0xdbeec879, 0x00000084
784 .long 0x470a7ca1, 0x00000090, 0xe90f427c, 0x000000d8
785 .long 0xc91e84f8, 0x000000ab, 0x00000000, 0x00000000
786 .long 0x83868009, 0x0000008c, 0x48ed2b32, 0x000000bc
787 .long 0xac70111e, 0x000000d3, 0x4e725a6c, 0x0000000a
788 .long 0xfbff0efd, 0x000000f7, 0x5638850f, 0x000000e4
789 .long 0x1ed5ae3d, 0x00000058, 0x27392d36, 0x00000005
790 .long 0x64d90f0a, 0x000000b8, 0x21a65c68, 0x000000b3
791 .long 0xd1545b9b, 0x00000045, 0x3a2e3624, 0x00000006
792 .long 0xb1670a0c, 0x000000d0, 0x0fe75793, 0x0000002c
793 .long 0xd296eeb4, 0x0000001e, 0x9e919b1b, 0x0000008f
794 .long 0x4fc5c080, 0x000000ca, 0xa220dc61, 0x0000003f
795 .long 0x694b775a, 0x0000000f, 0x161a121c, 0x00000002
796 .long 0x0aba93e2, 0x000000c1, 0xe52aa0c0, 0x000000af
797 .long 0x43e0223c, 0x000000bd, 0x1d171b12, 0x00000003
798 .long 0x0b0d090e, 0x00000001, 0xadc78bf2, 0x00000013
799 .long 0xb9a8b62d, 0x0000008a, 0xc8a91e14, 0x0000006b
800 .long 0x8519f157, 0x0000003a, 0x4c0775af, 0x00000091
801 .long 0xbbdd99ee, 0x00000011, 0xfd607fa3, 0x00000041
802 .long 0x9f2601f7, 0x0000004f, 0xbcf5725c, 0x00000067
803 .long 0xc53b6644, 0x000000dc, 0x347efb5b, 0x000000ea
804 .long 0x7629438b, 0x00000097, 0xdcc623cb, 0x000000f2
805 .long 0x68fcedb6, 0x000000cf, 0x63f1e4b8, 0x000000ce
806 .long 0xcadc31d7, 0x000000f0, 0x10856342, 0x000000b4
807 .long 0x40229713, 0x000000e6, 0x2011c684, 0x00000073
808 .long 0x7d244a85, 0x00000096, 0xf83dbbd2, 0x000000ac
809 .long 0x1132f9ae, 0x00000074, 0x6da129c7, 0x00000022
810 .long 0x4b2f9e1d, 0x000000e7, 0xf330b2dc, 0x000000ad
811 .long 0xec52860d, 0x00000035, 0xd0e3c177, 0x00000085
812 .long 0x6c16b32b, 0x000000e2, 0x99b970a9, 0x000000f9
813 .long 0xfa489411, 0x00000037, 0x2264e947, 0x000000e8
814 .long 0xc48cfca8, 0x0000001c, 0x1a3ff0a0, 0x00000075
815 .long 0xd82c7d56, 0x000000df, 0xef903322, 0x0000006e
816 .long 0xc74e4987, 0x00000047, 0xc1d138d9, 0x000000f1
817 .long 0xfea2ca8c, 0x0000001a, 0x360bd498, 0x00000071
818 .long 0xcf81f5a6, 0x0000001d, 0x28de7aa5, 0x00000029
819 .long 0x268eb7da, 0x000000c5, 0xa4bfad3f, 0x00000089
820 .long 0xe49d3a2c, 0x0000006f, 0x0d927850, 0x000000b7
821 .long 0x9bcc5f6a, 0x00000062, 0x62467e54, 0x0000000e
822 .long 0xc2138df6, 0x000000aa, 0xe8b8d890, 0x00000018
823 .long 0x5ef7392e, 0x000000be, 0xf5afc382, 0x0000001b
824 .long 0xbe805d9f, 0x000000fc, 0x7c93d069, 0x00000056
825 .long 0xa92dd56f, 0x0000003e, 0xb31225cf, 0x0000004b
826 .long 0x3b99acc8, 0x000000c6, 0xa77d1810, 0x000000d2
827 .long 0x6e639ce8, 0x00000079, 0x7bbb3bdb, 0x00000020
828 .long 0x097826cd, 0x0000009a, 0xf418596e, 0x000000db
829 .long 0x01b79aec, 0x000000c0, 0xa89a4f83, 0x000000fe
830 .long 0x656e95e6, 0x00000078, 0x7ee6ffaa, 0x000000cd
831 .long 0x08cfbc21, 0x0000005a, 0xe6e815ef, 0x000000f4
832 .long 0xd99be7ba, 0x0000001f, 0xce366f4a, 0x000000dd
833 .long 0xd4099fea, 0x000000a8, 0xd67cb029, 0x00000033
834 .long 0xafb2a431, 0x00000088, 0x31233f2a, 0x00000007
835 .long 0x3094a5c6, 0x000000c7, 0xc066a235, 0x00000031
836 .long 0x37bc4e74, 0x000000b1, 0xa6ca82fc, 0x00000012
837 .long 0xb0d090e0, 0x00000010, 0x15d8a733, 0x00000059
838 .long 0x4a9804f1, 0x00000027, 0xf7daec41, 0x00000080
839 .long 0x0e50cd7f, 0x000000ec, 0x2ff69117, 0x0000005f
840 .long 0x8dd64d76, 0x00000060, 0x4db0ef43, 0x00000051
841 .long 0x544daacc, 0x0000007f, 0xdf0496e4, 0x000000a9
842 .long 0xe3b5d19e, 0x00000019, 0x1b886a4c, 0x000000b5
843 .long 0xb81f2cc1, 0x0000004a, 0x7f516546, 0x0000000d
844 .long 0x04ea5e9d, 0x0000002d, 0x5d358c01, 0x000000e5
845 .long 0x737487fa, 0x0000007a, 0x2e410bfb, 0x0000009f
846 .long 0x5a1d67b3, 0x00000093, 0x52d2db92, 0x000000c9
847 .long 0x335610e9, 0x0000009c, 0x1347d66d, 0x000000ef
848 .long 0x8c61d79a, 0x000000a0, 0x7a0ca137, 0x000000e0
849 .long 0x8e14f859, 0x0000003b, 0x893c13eb, 0x0000004d
850 .long 0xee27a9ce, 0x000000ae, 0x35c961b7, 0x0000002a
851 .long 0xede51ce1, 0x000000f5, 0x3cb1477a, 0x000000b0
852 .long 0x59dfd29c, 0x000000c8, 0x3f73f255, 0x000000eb
853 .long 0x79ce1418, 0x000000bb, 0xbf37c773, 0x0000003c
854 .long 0xeacdf753, 0x00000083, 0x5baafd5f, 0x00000053
855 .long 0x146f3ddf, 0x00000099, 0x86db4478, 0x00000061
856 .long 0x81f3afca, 0x00000017, 0x3ec468b9, 0x0000002b
857 .long 0x2c342438, 0x00000004, 0x5f40a3c2, 0x0000007e
858 .long 0x72c31d16, 0x000000ba, 0x0c25e2bc, 0x00000077
859 .long 0x8b493c28, 0x000000d6, 0x41950dff, 0x00000026
860 .long 0x7101a839, 0x000000e1, 0xdeb30c08, 0x00000069
861 .long 0x9ce4b4d8, 0x00000014, 0x90c15664, 0x00000063
862 .long 0x6184cb7b, 0x00000055, 0x70b632d5, 0x00000021
863 .long 0x745c6c48, 0x0000000c, 0x4257b8d0, 0x0000007d
865 #endif /*HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS*/
866 #endif /*__ARMEL__ */