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