Fix BSD license name
[platform/upstream/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 #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         pop {%r4-%r11, %ip, %pc};
318
319 .ltorg
320 .Lenc_not_128:
321         beq .Lenc_192
322
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);
329
330         b .Lenc_done;
331
332 .ltorg
333 .Lenc_192:
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);
338
339         b .Lenc_done;
340 .size _gcry_aes_arm_encrypt_block,.-_gcry_aes_arm_encrypt_block;
341
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)]; \
345         eor ra, rna; \
346         ldr rnc, [CTX, #(((round) * 16) + 2 * 4)]; \
347         eor rb, rnb; \
348         ldr rnd, [CTX, #(((round) * 16) + 3 * 4)]; \
349         eor rc, rnc; \
350         preload_first_key((round) - 1, rna); \
351         eor rd, rnd;
352
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)]; \
355         \
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); \
363         \
364         ldr RT1, [RTAB, RT1]; \
365         eor rna, rna, RT0; \
366         ldr RT2, [RTAB, RT2]; \
367         and RT0, RMASK, rb, lsl#3; \
368         ldr ra,  [RTAB, ra]; \
369         \
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); \
377         \
378         ldr RT1, [RTAB, RT1]; \
379         eor rnb, rnb, RT0; \
380         ldr RT2, [RTAB, RT2]; \
381         and RT0, RMASK, rc, lsl#3; \
382         ldr rb,  [RTAB, rb]; \
383         \
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); \
391         \
392         ldr RT1, [RTAB, RT1]; \
393         eor rnc, rnc, RT0; \
394         ldr RT2, [RTAB, RT2]; \
395         and RT0, RMASK, rd, lsl#3; \
396         ldr rc,  [RTAB, rc]; \
397         \
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); \
405         \
406         ldr RT1, [RTAB, RT1]; \
407         eor rnd, rnd, RT0; \
408         ldr RT2, [RTAB, RT2]; \
409         eor rna, rna, RT1, ror #24; \
410         ldr rd,  [RTAB, rd]; \
411         \
412         eor rnb, rnb, RT2, ror #16; \
413         preload_key((next_r) - 1, ra); \
414         eor rnc, rnc, rd, ror #8;
415
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]; \
434         \
435         orr rnb, rnb, RT0; \
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]; \
447         \
448         orr rnc, rnc, RT0; \
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]; \
462         \
463         orr rnd, rnd, RT0; \
464         orr rna, rna, RT1, ror #24; \
465         orr rnb, rnb, RT2, ror #16; \
466         orr rnc, rnc, rd, ror #8;
467
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);
471
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);
474
475 #define lastdecround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd) \
476         add RTAB, #4; \
477         do_lastdecround(ra, rb, rc, rd, rna, rnb, rnc, rnd); \
478         addroundkey(rna, rnb, rnc, rnd, ra, rb, rc, rd, dummy);
479
480 .align 3
481 .globl _gcry_aes_arm_decrypt_block
482 .type   _gcry_aes_arm_decrypt_block,%function;
483
484 _gcry_aes_arm_decrypt_block:
485         /* input:
486          *      %r0: keysched, CTX
487          *      %r1: dst
488          *      %r2: src
489          *      %r3: number of rounds.. 10, 12 or 14
490          */
491         push {%r4-%r11, %ip, %lr};
492
493         /* read input block */
494 #ifndef __ARM_FEATURE_UNALIGNED
495         /* test if src is unaligned */
496         tst     %r2, #3;
497         beq     1f;
498
499         /* unaligned load */
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);
504         b       2f;
505 .ltorg
506 1:
507 #endif
508         /* aligned load */
509         ldm     %r2, {RA, RB, RC, RD};
510 #ifndef __ARMEL__
511         rev     RA, RA;
512         rev     RB, RB;
513         rev     RC, RC;
514         rev     RD, RD;
515 #endif
516 2:
517         sub     %sp, #16;
518
519         GET_DATA_POINTER(RTAB, .LtableD0, RMASK);
520
521         mov     RMASK, #0xff;
522         str     %r1, [%sp, #4];         /* dst */
523         mov     RMASK, RMASK, lsl#3;    /* byte mask */
524
525         cmp     %r3, #12;
526         bge     .Ldec_256;
527
528         firstdecround(9, RA, RB, RC, RD, RNA, RNB, RNC, RND);
529 .Ldec_tail:
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);
539
540         ldr     RT0, [%sp, #4];         /* dst */
541         add     %sp, #16;
542
543         /* store output block */
544 #ifndef __ARM_FEATURE_UNALIGNED
545         /* test if dst is unaligned */
546         tst     RT0, #3;
547         beq     1f;
548
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);
554         b       2f;
555 .ltorg
556 1:
557 #endif
558         /* aligned store */
559 #ifndef __ARMEL__
560         rev     RA, RA;
561         rev     RB, RB;
562         rev     RC, RC;
563         rev     RD, RD;
564 #endif
565         /* write output block */
566         stm     RT0, {RA, RB, RC, RD};
567 2:
568         pop {%r4-%r11, %ip, %pc};
569
570 .ltorg
571 .Ldec_256:
572         beq .Ldec_192;
573
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);
579
580         b .Ldec_tail;
581
582 .ltorg
583 .Ldec_192:
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);
587
588         b .Ldec_tail;
589 .size _gcry_aes_arm_encrypt_block,.-_gcry_aes_arm_encrypt_block;
590
591 .data
592
593 /* Encryption tables */
594 .align 5
595 .type .LtableE0, %object
596 .type .LtableEs0, %object
597 .LtableE0:
598 .long 0xa56363c6
599 .LtableEs0:
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
728
729 /* Decryption tables */
730 .align 5
731 .type .LtableD0, %object
732 .type .LtableDs0, %object
733 .LtableD0:
734 .long 0x50a7f451
735 .LtableDs0:
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
864
865 #endif /*HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS*/
866 #endif /*__ARMEL__ */