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