mpi/ec: fix when 'unsigned long' is 32-bit but limb size is 64-bit
[libgcrypt.git] / cipher / rijndael-arm.S
index 2a747bf..e680c81 100644 (file)
@@ -1,6 +1,6 @@
 /* rijndael-arm.S  -  ARM assembly implementation of AES cipher
  *
- * Copyright © 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
+ * Copyright (C) 2013 Jussi Kivilinna <jussi.kivilinna@iki.fi>
  *
  * This file is part of Libgcrypt.
  *
 #define do_encround(next_r, ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_key) \
        ldr rnb, [CTX, #(((next_r) * 16) + 1 * 4)]; \
        \
-       and RT0, RMASK, ra, lsl#3; \
+       and RT0, RMASK, ra, lsl#2; \
        ldr rnc, [CTX, #(((next_r) * 16) + 2 * 4)]; \
-       and RT1, RMASK, ra, lsr#(8 - 3); \
+       and RT1, RMASK, ra, lsr#(8 - 2); \
        ldr rnd, [CTX, #(((next_r) * 16) + 3 * 4)]; \
-       and RT2, RMASK, ra, lsr#(16 - 3); \
+       and RT2, RMASK, ra, lsr#(16 - 2); \
        ldr RT0, [RTAB, RT0]; \
-       and ra,  RMASK, ra, lsr#(24 - 3); \
+       and ra,  RMASK, ra, lsr#(24 - 2); \
        \
        ldr RT1, [RTAB, RT1]; \
        eor rna, rna, RT0; \
        ldr RT2, [RTAB, RT2]; \
-       and RT0, RMASK, rd, lsl#3; \
+       and RT0, RMASK, rd, lsl#2; \
        ldr ra,  [RTAB, ra]; \
        \
        eor rnd, rnd, RT1, ror #24; \
-       and RT1, RMASK, rd, lsr#(8 - 3); \
+       and RT1, RMASK, rd, lsr#(8 - 2); \
        eor rnc, rnc, RT2, ror #16; \
-       and RT2, RMASK, rd, lsr#(16 - 3); \
+       and RT2, RMASK, rd, lsr#(16 - 2); \
        eor rnb, rnb, ra, ror #8; \
        ldr RT0, [RTAB, RT0]; \
-       and rd,  RMASK, rd, lsr#(24 - 3); \
+       and rd,  RMASK, rd, lsr#(24 - 2); \
        \
        ldr RT1, [RTAB, RT1]; \
        eor rnd, rnd, RT0; \
        ldr RT2, [RTAB, RT2]; \
-       and RT0, RMASK, rc, lsl#3; \
+       and RT0, RMASK, rc, lsl#2; \
        ldr rd,  [RTAB, rd]; \
        \
        eor rnc, rnc, RT1, ror #24; \
-       and RT1, RMASK, rc, lsr#(8 - 3); \
+       and RT1, RMASK, rc, lsr#(8 - 2); \
        eor rnb, rnb, RT2, ror #16; \
-       and RT2, RMASK, rc, lsr#(16 - 3); \
+       and RT2, RMASK, rc, lsr#(16 - 2); \
        eor rna, rna, rd, ror #8; \
        ldr RT0, [RTAB, RT0]; \
-       and rc,  RMASK, rc, lsr#(24 - 3); \
+       and rc,  RMASK, rc, lsr#(24 - 2); \
        \
        ldr RT1, [RTAB, RT1]; \
        eor rnc, rnc, RT0; \
        ldr RT2, [RTAB, RT2]; \
-       and RT0, RMASK, rb, lsl#3; \
+       and RT0, RMASK, rb, lsl#2; \
        ldr rc,  [RTAB, rc]; \
        \
        eor rnb, rnb, RT1, ror #24; \
-       and RT1, RMASK, rb, lsr#(8 - 3); \
+       and RT1, RMASK, rb, lsr#(8 - 2); \
        eor rna, rna, RT2, ror #16; \
-       and RT2, RMASK, rb, lsr#(16 - 3); \
+       and RT2, RMASK, rb, lsr#(16 - 2); \
        eor rnd, rnd, rc, ror #8; \
        ldr RT0, [RTAB, RT0]; \
-       and rb,  RMASK, rb, lsr#(24 - 3); \
+       and rb,  RMASK, rb, lsr#(24 - 2); \
        \
        ldr RT1, [RTAB, RT1]; \
        eor rnb, rnb, RT0; \
        eor rnc, rnc, rb, ror #8;
 
 #define do_lastencround(ra, rb, rc, rd, rna, rnb, rnc, rnd) \
-       and RT0, RMASK, ra, lsl#3; \
-       and RT1, RMASK, ra, lsr#(8 - 3); \
-       and RT2, RMASK, ra, lsr#(16 - 3); \
-       ldr rna, [RTAB, RT0]; \
-       and ra,  RMASK, ra, lsr#(24 - 3); \
-       ldr rnd, [RTAB, RT1]; \
-       and RT0, RMASK, rd, lsl#3; \
-       ldr rnc, [RTAB, RT2]; \
+       and RT0, RMASK, ra, lsl#2; \
+       and RT1, RMASK, ra, lsr#(8 - 2); \
+       and RT2, RMASK, ra, lsr#(16 - 2); \
+       ldrb rna, [RTAB, RT0]; \
+       and ra,  RMASK, ra, lsr#(24 - 2); \
+       ldrb rnd, [RTAB, RT1]; \
+       and RT0, RMASK, rd, lsl#2; \
+       ldrb rnc, [RTAB, RT2]; \
        mov rnd, rnd, ror #24; \
-       ldr rnb, [RTAB, ra]; \
-       and RT1, RMASK, rd, lsr#(8 - 3); \
+       ldrb rnb, [RTAB, ra]; \
+       and RT1, RMASK, rd, lsr#(8 - 2); \
        mov rnc, rnc, ror #16; \
-       and RT2, RMASK, rd, lsr#(16 - 3); \
+       and RT2, RMASK, rd, lsr#(16 - 2); \
        mov rnb, rnb, ror #8; \
-       ldr RT0, [RTAB, RT0]; \
-       and rd,  RMASK, rd, lsr#(24 - 3); \
-       ldr RT1, [RTAB, RT1]; \
+       ldrb RT0, [RTAB, RT0]; \
+       and rd,  RMASK, rd, lsr#(24 - 2); \
+       ldrb RT1, [RTAB, RT1]; \
        \
        orr rnd, rnd, RT0; \
-       ldr RT2, [RTAB, RT2]; \
-       and RT0, RMASK, rc, lsl#3; \
-       ldr rd,  [RTAB, rd]; \
+       ldrb RT2, [RTAB, RT2]; \
+       and RT0, RMASK, rc, lsl#2; \
+       ldrb rd,  [RTAB, rd]; \
        orr rnc, rnc, RT1, ror #24; \
-       and RT1, RMASK, rc, lsr#(8 - 3); \
+       and RT1, RMASK, rc, lsr#(8 - 2); \
        orr rnb, rnb, RT2, ror #16; \
-       and RT2, RMASK, rc, lsr#(16 - 3); \
+       and RT2, RMASK, rc, lsr#(16 - 2); \
        orr rna, rna, rd, ror #8; \
-       ldr RT0, [RTAB, RT0]; \
-       and rc,  RMASK, rc, lsr#(24 - 3); \
-       ldr RT1, [RTAB, RT1]; \
+       ldrb RT0, [RTAB, RT0]; \
+       and rc,  RMASK, rc, lsr#(24 - 2); \
+       ldrb RT1, [RTAB, RT1]; \
        \
        orr rnc, rnc, RT0; \
-       ldr RT2, [RTAB, RT2]; \
-       and RT0, RMASK, rb, lsl#3; \
-       ldr rc,  [RTAB, rc]; \
+       ldrb RT2, [RTAB, RT2]; \
+       and RT0, RMASK, rb, lsl#2; \
+       ldrb rc,  [RTAB, rc]; \
        orr rnb, rnb, RT1, ror #24; \
-       and RT1, RMASK, rb, lsr#(8 - 3); \
+       and RT1, RMASK, rb, lsr#(8 - 2); \
        orr rna, rna, RT2, ror #16; \
-       ldr RT0, [RTAB, RT0]; \
-       and RT2, RMASK, rb, lsr#(16 - 3); \
-       ldr RT1, [RTAB, RT1]; \
+       ldrb RT0, [RTAB, RT0]; \
+       and RT2, RMASK, rb, lsr#(16 - 2); \
+       ldrb RT1, [RTAB, RT1]; \
        orr rnd, rnd, rc, ror #8; \
-       ldr RT2, [RTAB, RT2]; \
-       and rb,  RMASK, rb, lsr#(24 - 3); \
-       ldr rb,  [RTAB, rb]; \
+       ldrb RT2, [RTAB, RT2]; \
+       and rb,  RMASK, rb, lsr#(24 - 2); \
+       ldrb rb,  [RTAB, rb]; \
        \
        orr rnb, rnb, RT0; \
        orr rna, rna, RT1, ror #24; \
 
 #define lastencround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd) \
        add CTX, #(((round) + 1) * 16); \
-       add RTAB, #4; \
+       add RTAB, #1; \
        do_lastencround(ra, rb, rc, rd, rna, rnb, rnc, rnd); \
        addroundkey(rna, rnb, rnc, rnd, ra, rb, rc, rd, dummy);
 
 .align 3
-.global _gcry_aes_arm_encrypt_block
+.globl _gcry_aes_arm_encrypt_block
 .type   _gcry_aes_arm_encrypt_block,%function;
 
 _gcry_aes_arm_encrypt_block:
@@ -220,11 +220,12 @@ _gcry_aes_arm_encrypt_block:
         *      %r1: dst
         *      %r2: src
         *      %r3: number of rounds.. 10, 12 or 14
+        *      %st+0: encryption table
         */
        push {%r4-%r11, %ip, %lr};
 
        /* read input block */
-#ifndef __ARM_FEATURE_UNALIGNED
+
        /* test if src is unaligned */
        tst     %r2, #3;
        beq     1f;
@@ -237,7 +238,6 @@ _gcry_aes_arm_encrypt_block:
        b       2f;
 .ltorg
 1:
-#endif
        /* aligned load */
        ldm     %r2, {RA, RB, RC, RD};
 #ifndef __ARMEL__
@@ -247,14 +247,13 @@ _gcry_aes_arm_encrypt_block:
        rev     RD, RD;
 #endif
 2:
+       ldr     RTAB, [%sp, #40];
        sub     %sp, #16;
 
-       ldr     RTAB, =.LtableE0;
-
        str     %r1, [%sp, #4];         /* dst */
        mov     RMASK, #0xff;
        str     %r3, [%sp, #8];         /* nrounds */
-       mov     RMASK, RMASK, lsl#3;    /* byte mask */
+       mov     RMASK, RMASK, lsl#2;    /* byte mask */
 
        firstencround(0, RA, RB, RC, RD, RNA, RNB, RNC, RND);
        encround(1, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
@@ -277,7 +276,7 @@ _gcry_aes_arm_encrypt_block:
        add     %sp, #16;
 
        /* store output block */
-#ifndef __ARM_FEATURE_UNALIGNED
+
        /* test if dst is unaligned */
        tst     RT0, #3;
        beq     1f;
@@ -290,7 +289,6 @@ _gcry_aes_arm_encrypt_block:
        b       2f;
 .ltorg
 1:
-#endif
        /* aligned store */
 #ifndef __ARMEL__
        rev     RA, RA;
@@ -301,6 +299,8 @@ _gcry_aes_arm_encrypt_block:
        /* write output block */
        stm     RT0, {RA, RB, RC, RD};
 2:
+
+       mov     r0, #(10 * 4);
        pop {%r4-%r11, %ip, %pc};
 
 .ltorg
@@ -340,55 +340,55 @@ _gcry_aes_arm_encrypt_block:
 #define do_decround(next_r, ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_key) \
        ldr rnb, [CTX, #(((next_r) * 16) + 1 * 4)]; \
        \
-       and RT0, RMASK, ra, lsl#3; \
+       and RT0, RMASK, ra, lsl#2; \
        ldr rnc, [CTX, #(((next_r) * 16) + 2 * 4)]; \
-       and RT1, RMASK, ra, lsr#(8 - 3); \
+       and RT1, RMASK, ra, lsr#(8 - 2); \
        ldr rnd, [CTX, #(((next_r) * 16) + 3 * 4)]; \
-       and RT2, RMASK, ra, lsr#(16 - 3); \
+       and RT2, RMASK, ra, lsr#(16 - 2); \
        ldr RT0, [RTAB, RT0]; \
-       and ra,  RMASK, ra, lsr#(24 - 3); \
+       and ra,  RMASK, ra, lsr#(24 - 2); \
        \
        ldr RT1, [RTAB, RT1]; \
        eor rna, rna, RT0; \
        ldr RT2, [RTAB, RT2]; \
-       and RT0, RMASK, rb, lsl#3; \
+       and RT0, RMASK, rb, lsl#2; \
        ldr ra,  [RTAB, ra]; \
        \
        eor rnb, rnb, RT1, ror #24; \
-       and RT1, RMASK, rb, lsr#(8 - 3); \
+       and RT1, RMASK, rb, lsr#(8 - 2); \
        eor rnc, rnc, RT2, ror #16; \
-       and RT2, RMASK, rb, lsr#(16 - 3); \
+       and RT2, RMASK, rb, lsr#(16 - 2); \
        eor rnd, rnd, ra, ror #8; \
        ldr RT0, [RTAB, RT0]; \
-       and rb,  RMASK, rb, lsr#(24 - 3); \
+       and rb,  RMASK, rb, lsr#(24 - 2); \
        \
        ldr RT1, [RTAB, RT1]; \
        eor rnb, rnb, RT0; \
        ldr RT2, [RTAB, RT2]; \
-       and RT0, RMASK, rc, lsl#3; \
+       and RT0, RMASK, rc, lsl#2; \
        ldr rb,  [RTAB, rb]; \
        \
        eor rnc, rnc, RT1, ror #24; \
-       and RT1, RMASK, rc, lsr#(8 - 3); \
+       and RT1, RMASK, rc, lsr#(8 - 2); \
        eor rnd, rnd, RT2, ror #16; \
-       and RT2, RMASK, rc, lsr#(16 - 3); \
+       and RT2, RMASK, rc, lsr#(16 - 2); \
        eor rna, rna, rb, ror #8; \
        ldr RT0, [RTAB, RT0]; \
-       and rc,  RMASK, rc, lsr#(24 - 3); \
+       and rc,  RMASK, rc, lsr#(24 - 2); \
        \
        ldr RT1, [RTAB, RT1]; \
        eor rnc, rnc, RT0; \
        ldr RT2, [RTAB, RT2]; \
-       and RT0, RMASK, rd, lsl#3; \
+       and RT0, RMASK, rd, lsl#2; \
        ldr rc,  [RTAB, rc]; \
        \
        eor rnd, rnd, RT1, ror #24; \
-       and RT1, RMASK, rd, lsr#(8 - 3); \
+       and RT1, RMASK, rd, lsr#(8 - 2); \
        eor rna, rna, RT2, ror #16; \
-       and RT2, RMASK, rd, lsr#(16 - 3); \
+       and RT2, RMASK, rd, lsr#(16 - 2); \
        eor rnb, rnb, rc, ror #8; \
        ldr RT0, [RTAB, RT0]; \
-       and rd,  RMASK, rd, lsr#(24 - 3); \
+       and rd,  RMASK, rd, lsr#(24 - 2); \
        \
        ldr RT1, [RTAB, RT1]; \
        eor rnd, rnd, RT0; \
@@ -401,51 +401,51 @@ _gcry_aes_arm_encrypt_block:
        eor rnc, rnc, rd, ror #8;
 
 #define do_lastdecround(ra, rb, rc, rd, rna, rnb, rnc, rnd) \
-       and RT0, RMASK, ra, lsl#3; \
-       and RT1, RMASK, ra, lsr#(8 - 3); \
-       and RT2, RMASK, ra, lsr#(16 - 3); \
-       ldr rna, [RTAB, RT0]; \
-       and ra,  RMASK, ra, lsr#(24 - 3); \
-       ldr rnb, [RTAB, RT1]; \
-       and RT0, RMASK, rb, lsl#3; \
-       ldr rnc, [RTAB, RT2]; \
+       and RT0, RMASK, ra; \
+       and RT1, RMASK, ra, lsr#8; \
+       and RT2, RMASK, ra, lsr#16; \
+       ldrb rna, [RTAB, RT0]; \
+       mov ra,  ra, lsr#24; \
+       ldrb rnb, [RTAB, RT1]; \
+       and RT0, RMASK, rb; \
+       ldrb rnc, [RTAB, RT2]; \
        mov rnb, rnb, ror #24; \
-       ldr rnd, [RTAB, ra]; \
-       and RT1, RMASK, rb, lsr#(8 - 3); \
+       ldrb rnd, [RTAB, ra]; \
+       and RT1, RMASK, rb, lsr#8; \
        mov rnc, rnc, ror #16; \
-       and RT2, RMASK, rb, lsr#(16 - 3); \
+       and RT2, RMASK, rb, lsr#16; \
        mov rnd, rnd, ror #8; \
-       ldr RT0, [RTAB, RT0]; \
-       and rb,  RMASK, rb, lsr#(24 - 3); \
-       ldr RT1, [RTAB, RT1]; \
+       ldrb RT0, [RTAB, RT0]; \
+       mov rb,  rb, lsr#24; \
+       ldrb RT1, [RTAB, RT1]; \
        \
        orr rnb, rnb, RT0; \
-       ldr RT2, [RTAB, RT2]; \
-       and RT0, RMASK, rc, lsl#3; \
-       ldr rb,  [RTAB, rb]; \
+       ldrb RT2, [RTAB, RT2]; \
+       and RT0, RMASK, rc; \
+       ldrb rb,  [RTAB, rb]; \
        orr rnc, rnc, RT1, ror #24; \
-       and RT1, RMASK, rc, lsr#(8 - 3); \
+       and RT1, RMASK, rc, lsr#8; \
        orr rnd, rnd, RT2, ror #16; \
-       and RT2, RMASK, rc, lsr#(16 - 3); \
+       and RT2, RMASK, rc, lsr#16; \
        orr rna, rna, rb, ror #8; \
-       ldr RT0, [RTAB, RT0]; \
-       and rc,  RMASK, rc, lsr#(24 - 3); \
-       ldr RT1, [RTAB, RT1]; \
+       ldrb RT0, [RTAB, RT0]; \
+       mov rc,  rc, lsr#24; \
+       ldrb RT1, [RTAB, RT1]; \
        \
        orr rnc, rnc, RT0; \
-       ldr RT2, [RTAB, RT2]; \
-       and RT0, RMASK, rd, lsl#3; \
-       ldr rc,  [RTAB, rc]; \
+       ldrb RT2, [RTAB, RT2]; \
+       and RT0, RMASK, rd; \
+       ldrb rc,  [RTAB, rc]; \
        orr rnd, rnd, RT1, ror #24; \
-       and RT1, RMASK, rd, lsr#(8 - 3); \
+       and RT1, RMASK, rd, lsr#8; \
        orr rna, rna, RT2, ror #16; \
-       ldr RT0, [RTAB, RT0]; \
-       and RT2, RMASK, rd, lsr#(16 - 3); \
-       ldr RT1, [RTAB, RT1]; \
+       ldrb RT0, [RTAB, RT0]; \
+       and RT2, RMASK, rd, lsr#16; \
+       ldrb RT1, [RTAB, RT1]; \
        orr rnb, rnb, rc, ror #8; \
-       ldr RT2, [RTAB, RT2]; \
-       and rd,  RMASK, rd, lsr#(24 - 3); \
-       ldr rd,  [RTAB, rd]; \
+       ldrb RT2, [RTAB, RT2]; \
+       mov rd,  rd, lsr#24; \
+       ldrb rd,  [RTAB, rd]; \
        \
        orr rnd, rnd, RT0; \
        orr rna, rna, RT1, ror #24; \
@@ -459,13 +459,16 @@ _gcry_aes_arm_encrypt_block:
 #define decround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_key) \
        do_decround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd, preload_key);
 
+#define set_last_round_rmask(_, __) \
+       mov RMASK, #0xff;
+
 #define lastdecround(round, ra, rb, rc, rd, rna, rnb, rnc, rnd) \
-       add RTAB, #4; \
+       add RTAB, #(4 * 256); \
        do_lastdecround(ra, rb, rc, rd, rna, rnb, rnc, rnd); \
        addroundkey(rna, rnb, rnc, rnd, ra, rb, rc, rd, dummy);
 
 .align 3
-.global _gcry_aes_arm_decrypt_block
+.globl _gcry_aes_arm_decrypt_block
 .type   _gcry_aes_arm_decrypt_block,%function;
 
 _gcry_aes_arm_decrypt_block:
@@ -474,11 +477,12 @@ _gcry_aes_arm_decrypt_block:
         *      %r1: dst
         *      %r2: src
         *      %r3: number of rounds.. 10, 12 or 14
+        *      %st+0: decryption table
         */
        push {%r4-%r11, %ip, %lr};
 
        /* read input block */
-#ifndef __ARM_FEATURE_UNALIGNED
+
        /* test if src is unaligned */
        tst     %r2, #3;
        beq     1f;
@@ -491,7 +495,6 @@ _gcry_aes_arm_decrypt_block:
        b       2f;
 .ltorg
 1:
-#endif
        /* aligned load */
        ldm     %r2, {RA, RB, RC, RD};
 #ifndef __ARMEL__
@@ -501,13 +504,12 @@ _gcry_aes_arm_decrypt_block:
        rev     RD, RD;
 #endif
 2:
+       ldr     RTAB, [%sp, #40];
        sub     %sp, #16;
 
-       ldr     RTAB, =.LtableD0;
-
        mov     RMASK, #0xff;
        str     %r1, [%sp, #4];         /* dst */
-       mov     RMASK, RMASK, lsl#3;    /* byte mask */
+       mov     RMASK, RMASK, lsl#2;    /* byte mask */
 
        cmp     %r3, #12;
        bge     .Ldec_256;
@@ -521,14 +523,14 @@ _gcry_aes_arm_decrypt_block:
        decround(4, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
        decround(3, RA, RB, RC, RD, RNA, RNB, RNC, RND, preload_first_key);
        decround(2, RNA, RNB, RNC, RND, RA, RB, RC, RD, preload_first_key);
-       decround(1, RA, RB, RC, RD, RNA, RNB, RNC, RND, dummy);
+       decround(1, RA, RB, RC, RD, RNA, RNB, RNC, RND, set_last_round_rmask);
        lastdecround(0, RNA, RNB, RNC, RND, RA, RB, RC, RD);
 
        ldr     RT0, [%sp, #4];         /* dst */
        add     %sp, #16;
 
        /* store output block */
-#ifndef __ARM_FEATURE_UNALIGNED
+
        /* test if dst is unaligned */
        tst     RT0, #3;
        beq     1f;
@@ -541,7 +543,6 @@ _gcry_aes_arm_decrypt_block:
        b       2f;
 .ltorg
 1:
-#endif
        /* aligned store */
 #ifndef __ARMEL__
        rev     RA, RA;
@@ -552,6 +553,7 @@ _gcry_aes_arm_decrypt_block:
        /* write output block */
        stm     RT0, {RA, RB, RC, RD};
 2:
+       mov     r0, #(10 * 4);
        pop {%r4-%r11, %ip, %pc};
 
 .ltorg
@@ -575,279 +577,5 @@ _gcry_aes_arm_decrypt_block:
        b .Ldec_tail;
 .size _gcry_aes_arm_encrypt_block,.-_gcry_aes_arm_encrypt_block;
 
-.data
-
-/* Encryption tables */
-.align 5
-.type .LtableE0, %object
-.type .LtableEs0, %object
-.LtableE0:
-.long 0xa56363c6
-.LtableEs0:
-.long             0x00000063, 0x847c7cf8, 0x0000007c
-.long 0x997777ee, 0x00000077, 0x8d7b7bf6, 0x0000007b
-.long 0x0df2f2ff, 0x000000f2, 0xbd6b6bd6, 0x0000006b
-.long 0xb16f6fde, 0x0000006f, 0x54c5c591, 0x000000c5
-.long 0x50303060, 0x00000030, 0x03010102, 0x00000001
-.long 0xa96767ce, 0x00000067, 0x7d2b2b56, 0x0000002b
-.long 0x19fefee7, 0x000000fe, 0x62d7d7b5, 0x000000d7
-.long 0xe6abab4d, 0x000000ab, 0x9a7676ec, 0x00000076
-.long 0x45caca8f, 0x000000ca, 0x9d82821f, 0x00000082
-.long 0x40c9c989, 0x000000c9, 0x877d7dfa, 0x0000007d
-.long 0x15fafaef, 0x000000fa, 0xeb5959b2, 0x00000059
-.long 0xc947478e, 0x00000047, 0x0bf0f0fb, 0x000000f0
-.long 0xecadad41, 0x000000ad, 0x67d4d4b3, 0x000000d4
-.long 0xfda2a25f, 0x000000a2, 0xeaafaf45, 0x000000af
-.long 0xbf9c9c23, 0x0000009c, 0xf7a4a453, 0x000000a4
-.long 0x967272e4, 0x00000072, 0x5bc0c09b, 0x000000c0
-.long 0xc2b7b775, 0x000000b7, 0x1cfdfde1, 0x000000fd
-.long 0xae93933d, 0x00000093, 0x6a26264c, 0x00000026
-.long 0x5a36366c, 0x00000036, 0x413f3f7e, 0x0000003f
-.long 0x02f7f7f5, 0x000000f7, 0x4fcccc83, 0x000000cc
-.long 0x5c343468, 0x00000034, 0xf4a5a551, 0x000000a5
-.long 0x34e5e5d1, 0x000000e5, 0x08f1f1f9, 0x000000f1
-.long 0x937171e2, 0x00000071, 0x73d8d8ab, 0x000000d8
-.long 0x53313162, 0x00000031, 0x3f15152a, 0x00000015
-.long 0x0c040408, 0x00000004, 0x52c7c795, 0x000000c7
-.long 0x65232346, 0x00000023, 0x5ec3c39d, 0x000000c3
-.long 0x28181830, 0x00000018, 0xa1969637, 0x00000096
-.long 0x0f05050a, 0x00000005, 0xb59a9a2f, 0x0000009a
-.long 0x0907070e, 0x00000007, 0x36121224, 0x00000012
-.long 0x9b80801b, 0x00000080, 0x3de2e2df, 0x000000e2
-.long 0x26ebebcd, 0x000000eb, 0x6927274e, 0x00000027
-.long 0xcdb2b27f, 0x000000b2, 0x9f7575ea, 0x00000075
-.long 0x1b090912, 0x00000009, 0x9e83831d, 0x00000083
-.long 0x742c2c58, 0x0000002c, 0x2e1a1a34, 0x0000001a
-.long 0x2d1b1b36, 0x0000001b, 0xb26e6edc, 0x0000006e
-.long 0xee5a5ab4, 0x0000005a, 0xfba0a05b, 0x000000a0
-.long 0xf65252a4, 0x00000052, 0x4d3b3b76, 0x0000003b
-.long 0x61d6d6b7, 0x000000d6, 0xceb3b37d, 0x000000b3
-.long 0x7b292952, 0x00000029, 0x3ee3e3dd, 0x000000e3
-.long 0x712f2f5e, 0x0000002f, 0x97848413, 0x00000084
-.long 0xf55353a6, 0x00000053, 0x68d1d1b9, 0x000000d1
-.long 0x00000000, 0x00000000, 0x2cededc1, 0x000000ed
-.long 0x60202040, 0x00000020, 0x1ffcfce3, 0x000000fc
-.long 0xc8b1b179, 0x000000b1, 0xed5b5bb6, 0x0000005b
-.long 0xbe6a6ad4, 0x0000006a, 0x46cbcb8d, 0x000000cb
-.long 0xd9bebe67, 0x000000be, 0x4b393972, 0x00000039
-.long 0xde4a4a94, 0x0000004a, 0xd44c4c98, 0x0000004c
-.long 0xe85858b0, 0x00000058, 0x4acfcf85, 0x000000cf
-.long 0x6bd0d0bb, 0x000000d0, 0x2aefefc5, 0x000000ef
-.long 0xe5aaaa4f, 0x000000aa, 0x16fbfbed, 0x000000fb
-.long 0xc5434386, 0x00000043, 0xd74d4d9a, 0x0000004d
-.long 0x55333366, 0x00000033, 0x94858511, 0x00000085
-.long 0xcf45458a, 0x00000045, 0x10f9f9e9, 0x000000f9
-.long 0x06020204, 0x00000002, 0x817f7ffe, 0x0000007f
-.long 0xf05050a0, 0x00000050, 0x443c3c78, 0x0000003c
-.long 0xba9f9f25, 0x0000009f, 0xe3a8a84b, 0x000000a8
-.long 0xf35151a2, 0x00000051, 0xfea3a35d, 0x000000a3
-.long 0xc0404080, 0x00000040, 0x8a8f8f05, 0x0000008f
-.long 0xad92923f, 0x00000092, 0xbc9d9d21, 0x0000009d
-.long 0x48383870, 0x00000038, 0x04f5f5f1, 0x000000f5
-.long 0xdfbcbc63, 0x000000bc, 0xc1b6b677, 0x000000b6
-.long 0x75dadaaf, 0x000000da, 0x63212142, 0x00000021
-.long 0x30101020, 0x00000010, 0x1affffe5, 0x000000ff
-.long 0x0ef3f3fd, 0x000000f3, 0x6dd2d2bf, 0x000000d2
-.long 0x4ccdcd81, 0x000000cd, 0x140c0c18, 0x0000000c
-.long 0x35131326, 0x00000013, 0x2fececc3, 0x000000ec
-.long 0xe15f5fbe, 0x0000005f, 0xa2979735, 0x00000097
-.long 0xcc444488, 0x00000044, 0x3917172e, 0x00000017
-.long 0x57c4c493, 0x000000c4, 0xf2a7a755, 0x000000a7
-.long 0x827e7efc, 0x0000007e, 0x473d3d7a, 0x0000003d
-.long 0xac6464c8, 0x00000064, 0xe75d5dba, 0x0000005d
-.long 0x2b191932, 0x00000019, 0x957373e6, 0x00000073
-.long 0xa06060c0, 0x00000060, 0x98818119, 0x00000081
-.long 0xd14f4f9e, 0x0000004f, 0x7fdcdca3, 0x000000dc
-.long 0x66222244, 0x00000022, 0x7e2a2a54, 0x0000002a
-.long 0xab90903b, 0x00000090, 0x8388880b, 0x00000088
-.long 0xca46468c, 0x00000046, 0x29eeeec7, 0x000000ee
-.long 0xd3b8b86b, 0x000000b8, 0x3c141428, 0x00000014
-.long 0x79dedea7, 0x000000de, 0xe25e5ebc, 0x0000005e
-.long 0x1d0b0b16, 0x0000000b, 0x76dbdbad, 0x000000db
-.long 0x3be0e0db, 0x000000e0, 0x56323264, 0x00000032
-.long 0x4e3a3a74, 0x0000003a, 0x1e0a0a14, 0x0000000a
-.long 0xdb494992, 0x00000049, 0x0a06060c, 0x00000006
-.long 0x6c242448, 0x00000024, 0xe45c5cb8, 0x0000005c
-.long 0x5dc2c29f, 0x000000c2, 0x6ed3d3bd, 0x000000d3
-.long 0xefacac43, 0x000000ac, 0xa66262c4, 0x00000062
-.long 0xa8919139, 0x00000091, 0xa4959531, 0x00000095
-.long 0x37e4e4d3, 0x000000e4, 0x8b7979f2, 0x00000079
-.long 0x32e7e7d5, 0x000000e7, 0x43c8c88b, 0x000000c8
-.long 0x5937376e, 0x00000037, 0xb76d6dda, 0x0000006d
-.long 0x8c8d8d01, 0x0000008d, 0x64d5d5b1, 0x000000d5
-.long 0xd24e4e9c, 0x0000004e, 0xe0a9a949, 0x000000a9
-.long 0xb46c6cd8, 0x0000006c, 0xfa5656ac, 0x00000056
-.long 0x07f4f4f3, 0x000000f4, 0x25eaeacf, 0x000000ea
-.long 0xaf6565ca, 0x00000065, 0x8e7a7af4, 0x0000007a
-.long 0xe9aeae47, 0x000000ae, 0x18080810, 0x00000008
-.long 0xd5baba6f, 0x000000ba, 0x887878f0, 0x00000078
-.long 0x6f25254a, 0x00000025, 0x722e2e5c, 0x0000002e
-.long 0x241c1c38, 0x0000001c, 0xf1a6a657, 0x000000a6
-.long 0xc7b4b473, 0x000000b4, 0x51c6c697, 0x000000c6
-.long 0x23e8e8cb, 0x000000e8, 0x7cdddda1, 0x000000dd
-.long 0x9c7474e8, 0x00000074, 0x211f1f3e, 0x0000001f
-.long 0xdd4b4b96, 0x0000004b, 0xdcbdbd61, 0x000000bd
-.long 0x868b8b0d, 0x0000008b, 0x858a8a0f, 0x0000008a
-.long 0x907070e0, 0x00000070, 0x423e3e7c, 0x0000003e
-.long 0xc4b5b571, 0x000000b5, 0xaa6666cc, 0x00000066
-.long 0xd8484890, 0x00000048, 0x05030306, 0x00000003
-.long 0x01f6f6f7, 0x000000f6, 0x120e0e1c, 0x0000000e
-.long 0xa36161c2, 0x00000061, 0x5f35356a, 0x00000035
-.long 0xf95757ae, 0x00000057, 0xd0b9b969, 0x000000b9
-.long 0x91868617, 0x00000086, 0x58c1c199, 0x000000c1
-.long 0x271d1d3a, 0x0000001d, 0xb99e9e27, 0x0000009e
-.long 0x38e1e1d9, 0x000000e1, 0x13f8f8eb, 0x000000f8
-.long 0xb398982b, 0x00000098, 0x33111122, 0x00000011
-.long 0xbb6969d2, 0x00000069, 0x70d9d9a9, 0x000000d9
-.long 0x898e8e07, 0x0000008e, 0xa7949433, 0x00000094
-.long 0xb69b9b2d, 0x0000009b, 0x221e1e3c, 0x0000001e
-.long 0x92878715, 0x00000087, 0x20e9e9c9, 0x000000e9
-.long 0x49cece87, 0x000000ce, 0xff5555aa, 0x00000055
-.long 0x78282850, 0x00000028, 0x7adfdfa5, 0x000000df
-.long 0x8f8c8c03, 0x0000008c, 0xf8a1a159, 0x000000a1
-.long 0x80898909, 0x00000089, 0x170d0d1a, 0x0000000d
-.long 0xdabfbf65, 0x000000bf, 0x31e6e6d7, 0x000000e6
-.long 0xc6424284, 0x00000042, 0xb86868d0, 0x00000068
-.long 0xc3414182, 0x00000041, 0xb0999929, 0x00000099
-.long 0x772d2d5a, 0x0000002d, 0x110f0f1e, 0x0000000f
-.long 0xcbb0b07b, 0x000000b0, 0xfc5454a8, 0x00000054
-.long 0xd6bbbb6d, 0x000000bb, 0x3a16162c, 0x00000016
-
-/* Decryption tables */
-.align 5
-.type .LtableD0, %object
-.type .LtableDs0, %object
-.LtableD0:
-.long 0x50a7f451
-.LtableDs0:
-.long             0x00000052, 0x5365417e, 0x00000009
-.long 0xc3a4171a, 0x0000006a, 0x965e273a, 0x000000d5
-.long 0xcb6bab3b, 0x00000030, 0xf1459d1f, 0x00000036
-.long 0xab58faac, 0x000000a5, 0x9303e34b, 0x00000038
-.long 0x55fa3020, 0x000000bf, 0xf66d76ad, 0x00000040
-.long 0x9176cc88, 0x000000a3, 0x254c02f5, 0x0000009e
-.long 0xfcd7e54f, 0x00000081, 0xd7cb2ac5, 0x000000f3
-.long 0x80443526, 0x000000d7, 0x8fa362b5, 0x000000fb
-.long 0x495ab1de, 0x0000007c, 0x671bba25, 0x000000e3
-.long 0x980eea45, 0x00000039, 0xe1c0fe5d, 0x00000082
-.long 0x02752fc3, 0x0000009b, 0x12f04c81, 0x0000002f
-.long 0xa397468d, 0x000000ff, 0xc6f9d36b, 0x00000087
-.long 0xe75f8f03, 0x00000034, 0x959c9215, 0x0000008e
-.long 0xeb7a6dbf, 0x00000043, 0xda595295, 0x00000044
-.long 0x2d83bed4, 0x000000c4, 0xd3217458, 0x000000de
-.long 0x2969e049, 0x000000e9, 0x44c8c98e, 0x000000cb
-.long 0x6a89c275, 0x00000054, 0x78798ef4, 0x0000007b
-.long 0x6b3e5899, 0x00000094, 0xdd71b927, 0x00000032
-.long 0xb64fe1be, 0x000000a6, 0x17ad88f0, 0x000000c2
-.long 0x66ac20c9, 0x00000023, 0xb43ace7d, 0x0000003d
-.long 0x184adf63, 0x000000ee, 0x82311ae5, 0x0000004c
-.long 0x60335197, 0x00000095, 0x457f5362, 0x0000000b
-.long 0xe07764b1, 0x00000042, 0x84ae6bbb, 0x000000fa
-.long 0x1ca081fe, 0x000000c3, 0x942b08f9, 0x0000004e
-.long 0x58684870, 0x00000008, 0x19fd458f, 0x0000002e
-.long 0x876cde94, 0x000000a1, 0xb7f87b52, 0x00000066
-.long 0x23d373ab, 0x00000028, 0xe2024b72, 0x000000d9
-.long 0x578f1fe3, 0x00000024, 0x2aab5566, 0x000000b2
-.long 0x0728ebb2, 0x00000076, 0x03c2b52f, 0x0000005b
-.long 0x9a7bc586, 0x000000a2, 0xa50837d3, 0x00000049
-.long 0xf2872830, 0x0000006d, 0xb2a5bf23, 0x0000008b
-.long 0xba6a0302, 0x000000d1, 0x5c8216ed, 0x00000025
-.long 0x2b1ccf8a, 0x00000072, 0x92b479a7, 0x000000f8
-.long 0xf0f207f3, 0x000000f6, 0xa1e2694e, 0x00000064
-.long 0xcdf4da65, 0x00000086, 0xd5be0506, 0x00000068
-.long 0x1f6234d1, 0x00000098, 0x8afea6c4, 0x00000016
-.long 0x9d532e34, 0x000000d4, 0xa055f3a2, 0x000000a4
-.long 0x32e18a05, 0x0000005c, 0x75ebf6a4, 0x000000cc
-.long 0x39ec830b, 0x0000005d, 0xaaef6040, 0x00000065
-.long 0x069f715e, 0x000000b6, 0x51106ebd, 0x00000092
-.long 0xf98a213e, 0x0000006c, 0x3d06dd96, 0x00000070
-.long 0xae053edd, 0x00000048, 0x46bde64d, 0x00000050
-.long 0xb58d5491, 0x000000fd, 0x055dc471, 0x000000ed
-.long 0x6fd40604, 0x000000b9, 0xff155060, 0x000000da
-.long 0x24fb9819, 0x0000005e, 0x97e9bdd6, 0x00000015
-.long 0xcc434089, 0x00000046, 0x779ed967, 0x00000057
-.long 0xbd42e8b0, 0x000000a7, 0x888b8907, 0x0000008d
-.long 0x385b19e7, 0x0000009d, 0xdbeec879, 0x00000084
-.long 0x470a7ca1, 0x00000090, 0xe90f427c, 0x000000d8
-.long 0xc91e84f8, 0x000000ab, 0x00000000, 0x00000000
-.long 0x83868009, 0x0000008c, 0x48ed2b32, 0x000000bc
-.long 0xac70111e, 0x000000d3, 0x4e725a6c, 0x0000000a
-.long 0xfbff0efd, 0x000000f7, 0x5638850f, 0x000000e4
-.long 0x1ed5ae3d, 0x00000058, 0x27392d36, 0x00000005
-.long 0x64d90f0a, 0x000000b8, 0x21a65c68, 0x000000b3
-.long 0xd1545b9b, 0x00000045, 0x3a2e3624, 0x00000006
-.long 0xb1670a0c, 0x000000d0, 0x0fe75793, 0x0000002c
-.long 0xd296eeb4, 0x0000001e, 0x9e919b1b, 0x0000008f
-.long 0x4fc5c080, 0x000000ca, 0xa220dc61, 0x0000003f
-.long 0x694b775a, 0x0000000f, 0x161a121c, 0x00000002
-.long 0x0aba93e2, 0x000000c1, 0xe52aa0c0, 0x000000af
-.long 0x43e0223c, 0x000000bd, 0x1d171b12, 0x00000003
-.long 0x0b0d090e, 0x00000001, 0xadc78bf2, 0x00000013
-.long 0xb9a8b62d, 0x0000008a, 0xc8a91e14, 0x0000006b
-.long 0x8519f157, 0x0000003a, 0x4c0775af, 0x00000091
-.long 0xbbdd99ee, 0x00000011, 0xfd607fa3, 0x00000041
-.long 0x9f2601f7, 0x0000004f, 0xbcf5725c, 0x00000067
-.long 0xc53b6644, 0x000000dc, 0x347efb5b, 0x000000ea
-.long 0x7629438b, 0x00000097, 0xdcc623cb, 0x000000f2
-.long 0x68fcedb6, 0x000000cf, 0x63f1e4b8, 0x000000ce
-.long 0xcadc31d7, 0x000000f0, 0x10856342, 0x000000b4
-.long 0x40229713, 0x000000e6, 0x2011c684, 0x00000073
-.long 0x7d244a85, 0x00000096, 0xf83dbbd2, 0x000000ac
-.long 0x1132f9ae, 0x00000074, 0x6da129c7, 0x00000022
-.long 0x4b2f9e1d, 0x000000e7, 0xf330b2dc, 0x000000ad
-.long 0xec52860d, 0x00000035, 0xd0e3c177, 0x00000085
-.long 0x6c16b32b, 0x000000e2, 0x99b970a9, 0x000000f9
-.long 0xfa489411, 0x00000037, 0x2264e947, 0x000000e8
-.long 0xc48cfca8, 0x0000001c, 0x1a3ff0a0, 0x00000075
-.long 0xd82c7d56, 0x000000df, 0xef903322, 0x0000006e
-.long 0xc74e4987, 0x00000047, 0xc1d138d9, 0x000000f1
-.long 0xfea2ca8c, 0x0000001a, 0x360bd498, 0x00000071
-.long 0xcf81f5a6, 0x0000001d, 0x28de7aa5, 0x00000029
-.long 0x268eb7da, 0x000000c5, 0xa4bfad3f, 0x00000089
-.long 0xe49d3a2c, 0x0000006f, 0x0d927850, 0x000000b7
-.long 0x9bcc5f6a, 0x00000062, 0x62467e54, 0x0000000e
-.long 0xc2138df6, 0x000000aa, 0xe8b8d890, 0x00000018
-.long 0x5ef7392e, 0x000000be, 0xf5afc382, 0x0000001b
-.long 0xbe805d9f, 0x000000fc, 0x7c93d069, 0x00000056
-.long 0xa92dd56f, 0x0000003e, 0xb31225cf, 0x0000004b
-.long 0x3b99acc8, 0x000000c6, 0xa77d1810, 0x000000d2
-.long 0x6e639ce8, 0x00000079, 0x7bbb3bdb, 0x00000020
-.long 0x097826cd, 0x0000009a, 0xf418596e, 0x000000db
-.long 0x01b79aec, 0x000000c0, 0xa89a4f83, 0x000000fe
-.long 0x656e95e6, 0x00000078, 0x7ee6ffaa, 0x000000cd
-.long 0x08cfbc21, 0x0000005a, 0xe6e815ef, 0x000000f4
-.long 0xd99be7ba, 0x0000001f, 0xce366f4a, 0x000000dd
-.long 0xd4099fea, 0x000000a8, 0xd67cb029, 0x00000033
-.long 0xafb2a431, 0x00000088, 0x31233f2a, 0x00000007
-.long 0x3094a5c6, 0x000000c7, 0xc066a235, 0x00000031
-.long 0x37bc4e74, 0x000000b1, 0xa6ca82fc, 0x00000012
-.long 0xb0d090e0, 0x00000010, 0x15d8a733, 0x00000059
-.long 0x4a9804f1, 0x00000027, 0xf7daec41, 0x00000080
-.long 0x0e50cd7f, 0x000000ec, 0x2ff69117, 0x0000005f
-.long 0x8dd64d76, 0x00000060, 0x4db0ef43, 0x00000051
-.long 0x544daacc, 0x0000007f, 0xdf0496e4, 0x000000a9
-.long 0xe3b5d19e, 0x00000019, 0x1b886a4c, 0x000000b5
-.long 0xb81f2cc1, 0x0000004a, 0x7f516546, 0x0000000d
-.long 0x04ea5e9d, 0x0000002d, 0x5d358c01, 0x000000e5
-.long 0x737487fa, 0x0000007a, 0x2e410bfb, 0x0000009f
-.long 0x5a1d67b3, 0x00000093, 0x52d2db92, 0x000000c9
-.long 0x335610e9, 0x0000009c, 0x1347d66d, 0x000000ef
-.long 0x8c61d79a, 0x000000a0, 0x7a0ca137, 0x000000e0
-.long 0x8e14f859, 0x0000003b, 0x893c13eb, 0x0000004d
-.long 0xee27a9ce, 0x000000ae, 0x35c961b7, 0x0000002a
-.long 0xede51ce1, 0x000000f5, 0x3cb1477a, 0x000000b0
-.long 0x59dfd29c, 0x000000c8, 0x3f73f255, 0x000000eb
-.long 0x79ce1418, 0x000000bb, 0xbf37c773, 0x0000003c
-.long 0xeacdf753, 0x00000083, 0x5baafd5f, 0x00000053
-.long 0x146f3ddf, 0x00000099, 0x86db4478, 0x00000061
-.long 0x81f3afca, 0x00000017, 0x3ec468b9, 0x0000002b
-.long 0x2c342438, 0x00000004, 0x5f40a3c2, 0x0000007e
-.long 0x72c31d16, 0x000000ba, 0x0c25e2bc, 0x00000077
-.long 0x8b493c28, 0x000000d6, 0x41950dff, 0x00000026
-.long 0x7101a839, 0x000000e1, 0xdeb30c08, 0x00000069
-.long 0x9ce4b4d8, 0x00000014, 0x90c15664, 0x00000063
-.long 0x6184cb7b, 0x00000055, 0x70b632d5, 0x00000021
-.long 0x745c6c48, 0x0000000c, 0x4257b8d0, 0x0000007d
-
-#endif /*HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS*/
+#endif /*HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS*/
 #endif /*__ARMEL__ */