root/arch/arm64/crypto/sm4-ce-cipher-core.S
// SPDX-License-Identifier: GPL-2.0

#include <linux/linkage.h>
#include <asm/assembler.h>

        .irp            b, 0, 1, 2, 3, 4, 5, 6, 7, 8
        .set            .Lv\b\().4s, \b
        .endr

        .macro          sm4e, rd, rn
        .inst           0xcec08400 | .L\rd | (.L\rn << 5)
        .endm

        /*
         * void sm4_ce_do_crypt(const u32 *rk, u32 *out, const u32 *in);
         */
        .text
SYM_FUNC_START(sm4_ce_do_crypt)
        ld1             {v8.4s}, [x2]
        ld1             {v0.4s-v3.4s}, [x0], #64
CPU_LE( rev32           v8.16b, v8.16b          )
        ld1             {v4.4s-v7.4s}, [x0]
        sm4e            v8.4s, v0.4s
        sm4e            v8.4s, v1.4s
        sm4e            v8.4s, v2.4s
        sm4e            v8.4s, v3.4s
        sm4e            v8.4s, v4.4s
        sm4e            v8.4s, v5.4s
        sm4e            v8.4s, v6.4s
        sm4e            v8.4s, v7.4s
        rev64           v8.4s, v8.4s
        ext             v8.16b, v8.16b, v8.16b, #8
CPU_LE( rev32           v8.16b, v8.16b          )
        st1             {v8.4s}, [x1]
        ret
SYM_FUNC_END(sm4_ce_do_crypt)