Linux中ARM A64 / NEON的AES扩展

时间:2015-09-03 11:11:03

标签: linux assembly arm aes neon

这是Linux中ARM A64 / NEON加密实施的汇编快照。

是否有关于如何在ARM A64 / NEON程序集中实现AES的解释?明确地说,AESEAESMC做了什么?

 __asm__("       ld1     {v0.16b}, %[in]                 ;"
                    "       ld1     {v1.2d}, [%[key]], #16          ;"---> How does this assembly work?
                    "       cmp     %w[rounds], #10                 ;"
                    "       bmi     0f                              ;"
                    "       bne     3f                              ;"
                    "       mov     v3.16b, v1.16b                  ;"
                    "       b       2f                              ;"
                    "0:     mov     v2.16b, v1.16b                  ;"
                    "       ld1     {v3.2d}, [%[key]], #16          ;"
                    "1:     aese    v0.16b, v2.16b                  ;"
                    "       aesmc   v0.16b, v0.16b                  ;" ---> AESMC is for?
                    "2:     ld1     {v1.2d}, [%[key]], #16          ;"
                    "       aese    v0.16b, v3.16b                  ;"
                    "       aesmc   v0.16b, v0.16b                  ;"
                    "3:     ld1     {v2.2d}, [%[key]], #16          ;"
                    "       subs    %w[rounds], %w[rounds], #3      ;"
                    "       aese    v0.16b, v1.16b                  ;"
                    "       aesmc   v0.16b, v0.16b                  ;"
                    "       ld1     {v3.2d}, [%[key]], #16          ;"
                    "       bpl     1b                              ;"
                    "       aese    v0.16b, v2.16b                  ;"
                    "       eor     v0.16b, v0.16b, v3.16b          ;"
                    "       st1     {v0.16b}, %[out]                ;"

            :       [out]           "=Q"(*out),
                    [key]           "=r"(dummy0),
                    [rounds]        "=r"(dummy1)
            :       [in]            "Q"(*in),
                                    "1"(ctx->key_enc),
                                    "2"(num_rounds(ctx) - 2)
            :       "cc");

0 个答案:

没有答案