root/lib/crypto/arm64/aes-ce-core.S
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) 2013 - 2017 Linaro Ltd <ard.biesheuvel@linaro.org>
 */

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

        .arch           armv8-a+crypto

SYM_FUNC_START(__aes_ce_encrypt)
        sub             w3, w3, #2
        ld1             {v0.16b}, [x2]
        ld1             {v1.4s}, [x0], #16
        cmp             w3, #10
        bmi             0f
        bne             3f
        mov             v3.16b, v1.16b
        b               2f
0:      mov             v2.16b, v1.16b
        ld1             {v3.4s}, [x0], #16
1:      aese            v0.16b, v2.16b
        aesmc           v0.16b, v0.16b
2:      ld1             {v1.4s}, [x0], #16
        aese            v0.16b, v3.16b
        aesmc           v0.16b, v0.16b
3:      ld1             {v2.4s}, [x0], #16
        subs            w3, w3, #3
        aese            v0.16b, v1.16b
        aesmc           v0.16b, v0.16b
        ld1             {v3.4s}, [x0], #16
        bpl             1b
        aese            v0.16b, v2.16b
        eor             v0.16b, v0.16b, v3.16b
        st1             {v0.16b}, [x1]
        ret
SYM_FUNC_END(__aes_ce_encrypt)

SYM_FUNC_START(__aes_ce_decrypt)
        sub             w3, w3, #2
        ld1             {v0.16b}, [x2]
        ld1             {v1.4s}, [x0], #16
        cmp             w3, #10
        bmi             0f
        bne             3f
        mov             v3.16b, v1.16b
        b               2f
0:      mov             v2.16b, v1.16b
        ld1             {v3.4s}, [x0], #16
1:      aesd            v0.16b, v2.16b
        aesimc          v0.16b, v0.16b
2:      ld1             {v1.4s}, [x0], #16
        aesd            v0.16b, v3.16b
        aesimc          v0.16b, v0.16b
3:      ld1             {v2.4s}, [x0], #16
        subs            w3, w3, #3
        aesd            v0.16b, v1.16b
        aesimc          v0.16b, v0.16b
        ld1             {v3.4s}, [x0], #16
        bpl             1b
        aesd            v0.16b, v2.16b
        eor             v0.16b, v0.16b, v3.16b
        st1             {v0.16b}, [x1]
        ret
SYM_FUNC_END(__aes_ce_decrypt)

/*
 * __aes_ce_sub() - use the aese instruction to perform the AES sbox
 *                  substitution on each byte in 'input'
 */
SYM_FUNC_START(__aes_ce_sub)
        dup             v1.4s, w0
        movi            v0.16b, #0
        aese            v0.16b, v1.16b
        umov            w0, v0.s[0]
        ret
SYM_FUNC_END(__aes_ce_sub)

SYM_FUNC_START(__aes_ce_invert)
        ld1             {v0.4s}, [x1]
        aesimc          v1.16b, v0.16b
        st1             {v1.4s}, [x0]
        ret
SYM_FUNC_END(__aes_ce_invert)