Module Name: src
Committed By: riastradh
Date: Tue Sep 8 23:57:13 UTC 2020
Modified Files:
src/sys/crypto/aes/arch/arm: aes_armv8_64.S
Log Message:
aesarmv8: Adapt aes_armv8_64.S to big-endian.
Patch mainly from (and tested by) jakllsch@ with minor tweaks by me.
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/crypto/aes/arch/arm/aes_armv8_64.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/crypto/aes/arch/arm/aes_armv8_64.S
diff -u src/sys/crypto/aes/arch/arm/aes_armv8_64.S:1.12 src/sys/crypto/aes/arch/arm/aes_armv8_64.S:1.13
--- src/sys/crypto/aes/arch/arm/aes_armv8_64.S:1.12 Sat Aug 8 14:47:01 2020
+++ src/sys/crypto/aes/arch/arm/aes_armv8_64.S Tue Sep 8 23:57:13 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: aes_armv8_64.S,v 1.12 2020/08/08 14:47:01 riastradh Exp $ */
+/* $NetBSD: aes_armv8_64.S,v 1.13 2020/09/08 23:57:13 riastradh Exp $ */
/*-
* Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -28,7 +28,7 @@
#include <aarch64/asm.h>
-RCSID("$NetBSD: aes_armv8_64.S,v 1.12 2020/08/08 14:47:01 riastradh Exp $")
+RCSID("$NetBSD: aes_armv8_64.S,v 1.13 2020/09/08 23:57:13 riastradh Exp $")
.arch_extension aes
@@ -114,11 +114,11 @@ END(unshiftrows_rotword_3)
* Standard ABI calling convention.
*/
ENTRY(aesarmv8_setenckey128)
- ldr q1, [x1] /* q1 := master key */
+ ld1 {v1.16b}, [x1] /* q1 := master key */
adrl x4, unshiftrows_rotword_3
eor v0.16b, v0.16b, v0.16b /* q0 := 0 */
- ldr q16, [x4] /* q16 := unshiftrows_rotword_3 table */
+ ld1 {v16.16b}, [x4] /* q16 := unshiftrows_rotword_3 table */
str q1, [x0], #0x10 /* store master key as first round key */
mov x2, #10 /* round count */
@@ -171,14 +171,14 @@ END(aesarmv8_setenckey128)
* Standard ABI calling convention.
*/
ENTRY(aesarmv8_setenckey192)
- ldr q1, [x1], #0x10 /* q1 := master key[0:128) */
- ldr d2, [x1] /* d2 := master key[128:192) */
+ ld1 {v1.16b}, [x1], #0x10 /* q1 := master key[0:128) */
+ ld1 {v2.8b}, [x1] /* d2 := master key[128:192) */
adrl x4, unshiftrows_rotword_1
adrl x5, unshiftrows_rotword_3
eor v0.16b, v0.16b, v0.16b /* q0 := 0 */
- ldr q16, [x4] /* q16 := unshiftrows_rotword_1 */
- ldr q17, [x5] /* q17 := unshiftrows_rotword_3 */
+ ld1 {v16.16b}, [x4] /* q16 := unshiftrows_rotword_1 */
+ ld1 {v17.16b}, [x5] /* q17 := unshiftrows_rotword_3 */
str q1, [x0], #0x10 /* store master key[0:128) as round key */
mov x2, #12 /* round count */
@@ -351,13 +351,13 @@ END(aesarmv8_setenckey192)
*/
ENTRY(aesarmv8_setenckey256)
/* q1 := key[0:128), q2 := key[128:256) */
- ldp q1, q2, [x1], #0x20
+ ld1 {v1.16b-v2.16b}, [x1], #0x20
adrl x4, unshiftrows_rotword_3
adrl x5, unshiftrows_3
eor v0.16b, v0.16b, v0.16b /* q0 := 0 */
- ldr q16, [x4] /* q16 := unshiftrows_rotword_3 */
- ldr q17, [x5] /* q17 := unshiftrows_3 */
+ ld1 {v16.16b}, [x4] /* q16 := unshiftrows_rotword_3 */
+ ld1 {v17.16b}, [x5] /* q17 := unshiftrows_3 */
/* store master key as first two round keys */
stp q1, q2, [x0], #0x20
@@ -461,9 +461,9 @@ END(aesarmv8_enctodec)
ENTRY(aesarmv8_enc)
stp fp, lr, [sp, #-16]! /* push stack frame */
mov fp, sp
- ldr q0, [x1] /* q0 := ptxt */
+ ld1 {v0.16b}, [x1] /* q0 := ptxt */
bl aesarmv8_enc1 /* q0 := ctxt; trash x0/x3/q16 */
- str q0, [x2] /* store ctxt */
+ st1 {v0.16b}, [x2] /* store ctxt */
ldp fp, lr, [sp], #16 /* pop stack frame */
ret
END(aesarmv8_enc)
@@ -479,9 +479,9 @@ END(aesarmv8_enc)
ENTRY(aesarmv8_dec)
stp fp, lr, [sp, #-16]! /* push stack frame */
mov fp, sp
- ldr q0, [x1] /* q0 := ctxt */
+ ld1 {v0.16b}, [x1] /* q0 := ctxt */
bl aesarmv8_dec1 /* q0 := ptxt; trash x0/x3/q16 */
- str q0, [x2] /* store ptxt */
+ st1 {v0.16b}, [x2] /* store ptxt */
ldp fp, lr, [sp], #16 /* pop stack frame */
ret
END(aesarmv8_dec)
@@ -503,17 +503,17 @@ ENTRY(aesarmv8_cbc_enc)
mov fp, sp
mov x9, x0 /* x9 := enckey */
mov x10, x3 /* x10 := nbytes */
- ldr q0, [x4] /* q0 := chaining value */
+ ld1 {v0.16b}, [x4] /* q0 := chaining value */
_ALIGN_TEXT
-1: ldr q1, [x1], #0x10 /* q1 := plaintext block */
+1: ld1 {v1.16b}, [x1], #0x10 /* q1 := plaintext block */
eor v0.16b, v0.16b, v1.16b /* q0 := cv ^ ptxt */
mov x0, x9 /* x0 := enckey */
mov x3, x5 /* x3 := nrounds */
bl aesarmv8_enc1 /* q0 := ctxt; trash x0/x3/q16 */
subs x10, x10, #0x10 /* count down nbytes */
- str q0, [x2], #0x10 /* store ciphertext block */
+ st1 {v0.16b}, [x2], #0x10 /* store ciphertext block */
b.ne 1b /* repeat if x10 is nonzero */
- str q0, [x4] /* store chaining value */
+ st1 {v0.16b}, [x4] /* store chaining value */
ldp fp, lr, [sp], #16 /* pop stack frame */
2: ret
END(aesarmv8_cbc_enc)
@@ -533,18 +533,21 @@ END(aesarmv8_cbc_enc)
ENTRY(aesarmv8_cbc_dec1)
stp fp, lr, [sp, #-16]! /* push stack frame */
mov fp, sp
- ldr q24, [x4] /* q24 := iv */
+ ld1 {v24.16b}, [x4] /* q24 := iv */
mov x9, x0 /* x9 := enckey */
mov x10, x3 /* x10 := nbytes */
add x1, x1, x3 /* x1 := pointer past end of in */
add x2, x2, x3 /* x2 := pointer past end of out */
- ldr q0, [x1, #-0x10]! /* q0 := last ciphertext block */
- str q0, [x4] /* update iv */
+ sub x1, x1, #0x10
+ ld1 {v0.16b}, [x1] /* q0 := last ciphertext block */
+ st1 {v0.16b}, [x4] /* update iv */
b 2f
_ALIGN_TEXT
-1: ldr q31, [x1, #-0x10]! /* q31 := chaining value */
+1: sub x1, x1, #0x10
+ ld1 {v31.16b}, [x1] /* q31 := chaining value */
+ sub x2, x2, #0x10
eor v0.16b, v0.16b, v31.16b /* q0 := plaintext block */
- str q0, [x2, #-0x10]! /* store plaintext block */
+ st1 {v0.16b}, [x2] /* store plaintext block */
mov v0.16b, v31.16b /* move cv = ciphertext block */
2: mov x0, x9 /* x0 := enckey */
mov x3, x5 /* x3 := nrounds */
@@ -552,7 +555,8 @@ ENTRY(aesarmv8_cbc_dec1)
subs x10, x10, #0x10 /* count down nbytes */
b.ne 1b /* repeat if more blocks */
eor v0.16b, v0.16b, v24.16b /* q0 := first plaintext block */
- str q0, [x2, #-0x10]! /* store first plaintext block */
+ sub x2, x2, #0x10 /* store first plaintext block */
+ st1 {v0.16b}, [x2]
ldp fp, lr, [sp], #16 /* pop stack frame */
ret
END(aesarmv8_cbc_dec1)
@@ -571,21 +575,26 @@ END(aesarmv8_cbc_dec1)
ENTRY(aesarmv8_cbc_dec8)
stp fp, lr, [sp, #-16]! /* push stack frame */
mov fp, sp
- ldr q24, [x4] /* q24 := iv */
+ ld1 {v24.16b}, [x4] /* q24 := iv */
mov x9, x0 /* x9 := enckey */
mov x10, x3 /* x10 := nbytes */
add x1, x1, x3 /* x1 := pointer past end of in */
add x2, x2, x3 /* x2 := pointer past end of out */
- ldp q6, q7, [x1, #-0x20]! /* q6, q7 := last ciphertext blocks */
- str q7, [x4] /* update iv */
+ sub x1, x1, #0x20
+ ld1 {v6.16b, v7.16b}, [x1] /* q6, q7 := last ciphertext blocks */
+ st1 {v7.16b}, [x4] /* update iv */
b 2f
_ALIGN_TEXT
-1: ldp q6, q7, [x1, #-0x20]!
+1: sub x1, x1, #0x20
+ ld1 {v6.16b, v7.16b}, [x1]
eor v0.16b, v0.16b, v7.16b /* q0 := pt0 */
- stp q0, q1, [x2, #-0x20]!
-2: ldp q4, q5, [x1, #-0x20]!
- ldp q2, q3, [x1, #-0x20]!
- ldp q0, q1, [x1, #-0x20]!
+ sub x2, x2, #0x20
+ st1 {v0.16b, v1.16b}, [x2]
+2: sub x1, x1, #0x20
+ ld1 {v4.16b-v5.16b}, [x1]
+ sub x1, x1, #0x40
+ ld1 {v0.16b-v3.16b}, [x1]
+
mov v31.16b, v6.16b /* q[24+i] := cv[i], 0<i<8 */
mov v30.16b, v5.16b
mov v29.16b, v4.16b
@@ -605,12 +614,14 @@ ENTRY(aesarmv8_cbc_dec8)
eor v2.16b, v2.16b, v26.16b
eor v1.16b, v1.16b, v25.16b
subs x10, x10, #0x80 /* count down nbytes */
- stp q6, q7, [x2, #-0x20]! /* store plaintext blocks */
- stp q4, q5, [x2, #-0x20]!
- stp q2, q3, [x2, #-0x20]!
+ sub x2, x2, #0x20 /* store plaintext blocks */
+ st1 {v6.16b-v7.16b}, [x2]
+ sub x2, x2, #0x40
+ st1 {v2.16b-v5.16b}, [x2]
b.ne 1b /* repeat if there's more */
eor v0.16b, v0.16b, v24.16b /* q0 := pt0 */
- stp q0, q1, [x2, #-0x20]! /* store first two plaintext blocks */
+ sub x2, x2, #0x20
+ st1 {v0.16b, v1.16b}, [x2] /* store first two plaintext blocks */
ldp fp, lr, [sp], #16 /* pop stack frame */
ret
END(aesarmv8_cbc_dec8)
@@ -632,19 +643,19 @@ ENTRY(aesarmv8_xts_enc1)
mov fp, sp
mov x9, x0 /* x9 := enckey */
mov x10, x3 /* x10 := nbytes */
- ldr q31, [x4] /* q31 := tweak */
+ ld1 {v31.16b}, [x4] /* q31 := tweak */
_ALIGN_TEXT
-1: ldr q0, [x1], #0x10 /* q0 := ptxt */
+1: ld1 {v0.16b}, [x1], #0x10 /* q0 := ptxt */
mov x0, x9 /* x0 := enckey */
mov x3, x5 /* x3 := nrounds */
eor v0.16b, v0.16b, v31.16b /* q0 := ptxt ^ tweak */
bl aesarmv8_enc1 /* q0 := AES(...); trash x0/x3/q16 */
eor v0.16b, v0.16b, v31.16b /* q0 := AES(ptxt ^ tweak) ^ tweak */
- str q0, [x2], #0x10 /* store ciphertext block */
+ st1 {v0.16b}, [x2], #0x10 /* store ciphertext block */
bl aesarmv8_xts_mulx /* q31 *= x; trash x0/q0/q1 */
subs x10, x10, #0x10 /* count down nbytes */
b.ne 1b /* repeat if more blocks */
- str q31, [x4] /* update tweak */
+ st1 {v31.16b}, [x4] /* update tweak */
ldp fp, lr, [sp], #16 /* pop stack frame */
ret
END(aesarmv8_xts_enc1)
@@ -665,7 +676,7 @@ ENTRY(aesarmv8_xts_enc8)
mov fp, sp
mov x9, x0 /* x9 := enckey */
mov x10, x3 /* x10 := nbytes */
- ldr q31, [x4] /* q31 := tweak */
+ ld1 {v31.16b}, [x4] /* q31 := tweak */
_ALIGN_TEXT
1: mov v24.16b, v31.16b /* q24 := tweak[0] */
bl aesarmv8_xts_mulx /* q31 *= x; trash x0/q0/q1 */
@@ -682,10 +693,10 @@ ENTRY(aesarmv8_xts_enc8)
mov v30.16b, v31.16b /* q30 := tweak[6] */
bl aesarmv8_xts_mulx /* q31 *= x; trash x0/q0/q1 */
/* q31 := tweak[7] */
- ldp q0, q1, [x1], #0x20 /* q[i] := ptxt[i] */
- ldp q2, q3, [x1], #0x20
- ldp q4, q5, [x1], #0x20
- ldp q6, q7, [x1], #0x20
+ ld1 {v0.16b,v1.16b}, [x1], #0x20 /* q[i] := ptxt[i] */
+ ld1 {v2.16b,v3.16b}, [x1], #0x20
+ ld1 {v4.16b,v5.16b}, [x1], #0x20
+ ld1 {v6.16b,v7.16b}, [x1], #0x20
eor v0.16b, v0.16b, v24.16b /* q[i] := ptxt[i] ^ tweak[i] */
eor v1.16b, v1.16b, v25.16b
eor v2.16b, v2.16b, v26.16b
@@ -705,14 +716,14 @@ ENTRY(aesarmv8_xts_enc8)
eor v5.16b, v5.16b, v29.16b
eor v6.16b, v6.16b, v30.16b
eor v7.16b, v7.16b, v31.16b
- stp q0, q1, [x2], #0x20 /* store ciphertext blocks */
- stp q2, q3, [x2], #0x20
- stp q4, q5, [x2], #0x20
- stp q6, q7, [x2], #0x20
+ st1 {v0.16b,v1.16b}, [x2], #0x20 /* store ciphertext blocks */
+ st1 {v2.16b,v3.16b}, [x2], #0x20
+ st1 {v4.16b,v5.16b}, [x2], #0x20
+ st1 {v6.16b,v7.16b}, [x2], #0x20
bl aesarmv8_xts_mulx /* q31 *= x; trash x0/q0/q1 */
subs x10, x10, #0x80 /* count down nbytes */
b.ne 1b /* repeat if more block groups */
- str q31, [x4] /* update tweak */
+ st1 {v31.16b}, [x4] /* update tweak */
ldp fp, lr, [sp], #16 /* pop stack frame */
ret
END(aesarmv8_xts_enc8)
@@ -734,19 +745,19 @@ ENTRY(aesarmv8_xts_dec1)
mov fp, sp
mov x9, x0 /* x9 := deckey */
mov x10, x3 /* x10 := nbytes */
- ldr q31, [x4] /* q31 := tweak */
+ ld1 {v31.16b}, [x4] /* q31 := tweak */
_ALIGN_TEXT
-1: ldr q0, [x1], #0x10 /* q0 := ctxt */
+1: ld1 {v0.16b}, [x1], #0x10 /* q0 := ctxt */
mov x0, x9 /* x0 := deckey */
mov x3, x5 /* x3 := nrounds */
eor v0.16b, v0.16b, v31.16b /* q0 := ctxt ^ tweak */
bl aesarmv8_dec1 /* q0 := AES(...); trash x0/x3/q16 */
eor v0.16b, v0.16b, v31.16b /* q0 := AES(ctxt ^ tweak) ^ tweak */
- str q0, [x2], #0x10 /* store plaintext block */
+ st1 {v0.16b}, [x2], #0x10 /* store plaintext block */
bl aesarmv8_xts_mulx /* q31 *= x; trash x0/q0/q1 */
subs x10, x10, #0x10 /* count down nbytes */
b.ne 1b /* repeat if more blocks */
- str q31, [x4] /* update tweak */
+ st1 {v31.16b}, [x4] /* update tweak */
ldp fp, lr, [sp], #16 /* pop stack frame */
ret
END(aesarmv8_xts_dec1)
@@ -767,7 +778,7 @@ ENTRY(aesarmv8_xts_dec8)
mov fp, sp
mov x9, x0 /* x9 := deckey */
mov x10, x3 /* x10 := nbytes */
- ldr q31, [x4] /* q31 := tweak */
+ ld1 {v31.16b}, [x4] /* q31 := tweak */
_ALIGN_TEXT
1: mov v24.16b, v31.16b /* q24 := tweak[0] */
bl aesarmv8_xts_mulx /* q31 *= x; trash x0/q0/q1 */
@@ -784,10 +795,8 @@ ENTRY(aesarmv8_xts_dec8)
mov v30.16b, v31.16b /* q30 := tweak[6] */
bl aesarmv8_xts_mulx /* q31 *= x; trash x0/q0/q1 */
/* q31 := tweak[7] */
- ldp q0, q1, [x1], #0x20 /* q[i] := ctxt[i] */
- ldp q2, q3, [x1], #0x20
- ldp q4, q5, [x1], #0x20
- ldp q6, q7, [x1], #0x20
+ ld1 {v0.16b-v3.16b}, [x1], #0x40 /* q[i] := ctxt[i] */
+ ld1 {v4.16b-v7.16b}, [x1], #0x40
eor v0.16b, v0.16b, v24.16b /* q[i] := ctxt[i] ^ tweak[i] */
eor v1.16b, v1.16b, v25.16b
eor v2.16b, v2.16b, v26.16b
@@ -807,14 +816,12 @@ ENTRY(aesarmv8_xts_dec8)
eor v5.16b, v5.16b, v29.16b
eor v6.16b, v6.16b, v30.16b
eor v7.16b, v7.16b, v31.16b
- stp q0, q1, [x2], #0x20 /* store plaintext blocks */
- stp q2, q3, [x2], #0x20
- stp q4, q5, [x2], #0x20
- stp q6, q7, [x2], #0x20
+ st1 {v0.16b-v3.16b}, [x2], #0x40 /* store plaintext blocks */
+ st1 {v4.16b-v7.16b}, [x2], #0x40
bl aesarmv8_xts_mulx /* q31 *= x; trash x0/q0/q1 */
subs x10, x10, #0x80 /* count down nbytes */
b.ne 1b /* repeat if more block groups */
- str q31, [x4] /* update tweak */
+ st1 {v31.16b}, [x4] /* update tweak */
ldp fp, lr, [sp], #16 /* pop stack frame */
ret
END(aesarmv8_xts_dec8)
@@ -838,7 +845,7 @@ aesarmv8_xts_mulx:
*/
adrl x0, xtscarry
cmlt v1.2d, v31.2d, #0 /* v1.2d[i] := -1 if v31.2d[i] < 0, else 0 */
- ldr q0, [x0] /* q0 := xtscarry */
+ ld1 {v0.16b}, [x0] /* q0 := xtscarry */
ext v1.16b, v1.16b, v1.16b, #8 /* swap halves of q1 */
shl v31.2d, v31.2d, #1 /* shift */
and v0.16b, v0.16b, v1.16b /* copy xtscarry according to mask */
@@ -863,9 +870,9 @@ END(xtscarry)
ENTRY(aesarmv8_xts_update)
stp fp, lr, [sp, #-16]! /* push stack frame */
mov fp, sp
- ldr q31, [x0] /* load tweak */
+ ld1 {v31.16b}, [x0] /* load tweak */
bl aesarmv8_xts_mulx /* q31 *= x; trash x0/q0/q1 */
- str q31, [x1] /* store tweak */
+ st1 {v31.16b}, [x1] /* store tweak */
ldp fp, lr, [sp], #16 /* pop stack frame */
ret
END(aesarmv8_xts_update)
@@ -884,18 +891,18 @@ END(aesarmv8_xts_update)
ENTRY(aesarmv8_cbcmac_update1)
stp fp, lr, [sp, #-16]! /* push stack frame */
mov fp, sp
- ldr q0, [x3] /* q0 := initial authenticator */
+ ld1 {v0.16b}, [x3] /* q0 := initial authenticator */
mov x9, x0 /* x9 := enckey */
mov x5, x3 /* x5 := &auth (enc1 trashes x3) */
_ALIGN_TEXT
-1: ldr q1, [x1], #0x10 /* q1 := plaintext block */
+1: ld1 {v1.16b}, [x1], #0x10 /* q1 := plaintext block */
mov x0, x9 /* x0 := enckey */
mov x3, x4 /* x3 := nrounds */
eor v0.16b, v0.16b, v1.16b /* q0 := auth ^ ptxt */
bl aesarmv8_enc1 /* q0 := auth'; trash x0/x3/q16 */
subs x2, x2, #0x10 /* count down nbytes */
b.ne 1b /* repeat if x10 is nonzero */
- str q0, [x5] /* store updated authenticator */
+ st1 {v0.16b}, [x5] /* store updated authenticator */
ldp fp, lr, [sp], #16 /* pop stack frame */
ret
END(aesarmv8_cbcmac_update1)
@@ -914,14 +921,15 @@ END(aesarmv8_cbcmac_update1)
ENTRY(aesarmv8_ccm_enc1)
stp fp, lr, [sp, #-16]! /* push stack frame */
mov fp, sp
- ldp q0, q2, [x4] /* q0 := auth, q2 := ctr (be) */
+ ld1 {v0.16b, v1.16b}, [x4] /* q0 := auth, q2 := ctr (be) */
+ mov v2.16b, v1.16b
adrl x11, ctr32_inc /* x11 := &ctr32_inc */
ld1 {v5.4s}, [x11] /* q5 := (0,0,0,1) (host-endian) */
mov x9, x0 /* x9 := enckey */
mov x10, x3 /* x10 := nbytes */
rev32 v2.16b, v2.16b /* q2 := ctr (host-endian) */
_ALIGN_TEXT
-1: ldr q3, [x1], #0x10 /* q3 := plaintext block */
+1: ld1 {v3.16b}, [x1], #0x10 /* q3 := plaintext block */
add v2.4s, v2.4s, v5.4s /* increment ctr (32-bit) */
mov x0, x9 /* x0 := enckey */
mov x3, x5 /* x3 := nrounds */
@@ -931,10 +939,11 @@ ENTRY(aesarmv8_ccm_enc1)
* trash x0/x3/q16 */
eor v3.16b, v1.16b, v3.16b /* q3 := ciphertext block */
subs x10, x10, #0x10 /* count down bytes */
- str q3, [x2], #0x10 /* store ciphertext block */
+ st1 {v3.16b}, [x2], #0x10 /* store ciphertext block */
b.ne 1b /* repeat if more blocks */
rev32 v2.16b, v2.16b /* q2 := ctr (big-endian) */
- stp q0, q2, [x4] /* store updated auth/ctr */
+ mov v1.16b, v2.16b /* store updated auth/ctr */
+ st1 {v0.16b-v1.16b}, [x4]
ldp fp, lr, [sp], #16 /* pop stack frame */
ret
END(aesarmv8_ccm_enc1)
@@ -953,7 +962,7 @@ END(aesarmv8_ccm_enc1)
ENTRY(aesarmv8_ccm_dec1)
stp fp, lr, [sp, #-16]! /* push stack frame */
mov fp, sp
- ldp q1, q2, [x4] /* q1 := auth, q2 := ctr (be) */
+ ld1 {v1.16b, v2.16b}, [x4] /* q1 := auth, q2 := ctr (be) */
adrl x11, ctr32_inc /* x11 := &ctr32_inc */
ld1 {v5.4s}, [x11] /* q5 := (0,0,0,1) (host-endian) */
mov x9, x0 /* x9 := enckey */
@@ -964,7 +973,7 @@ ENTRY(aesarmv8_ccm_dec1)
add v2.4s, v2.4s, v5.4s /* increment ctr (32-bit) */
mov x3, x5 /* x3 := nrounds */
rev32 v0.16b, v2.16b /* q0 := ctr (big-endian) */
- ldr q3, [x1], #0x10 /* q3 := ctxt */
+ ld1 {v3.16b}, [x1], #0x10 /* q3 := ctxt */
bl aesarmv8_enc1 /* q0 := pad; trash x0/x3/q16 */
b 2f
@@ -980,12 +989,12 @@ ENTRY(aesarmv8_ccm_dec1)
mov x0, x9 /* x0 := enckey */
mov x3, x5 /* x3 := nrounds */
rev32 v0.16b, v2.16b /* q0 := ctr (big-endian) */
- ldr q3, [x1], #0x10 /* q3 := ctxt */
+ ld1 {v3.16b}, [x1], #0x10 /* q3 := ctxt */
bl aesarmv8_enc2 /* q0 := pad, q1 := auth';
* trash x0/x3/q16 */
2: eor v3.16b, v0.16b, v3.16b /* q3 := plaintext block */
subs x10, x10, #0x10
- str q3, [x2], #0x10 /* store plaintext */
+ st1 {v3.16b}, [x2], #0x10 /* store plaintext */
eor v1.16b, v1.16b, v3.16b /* q1 := auth ^ ptxt */
b.ne 1b
@@ -997,7 +1006,8 @@ ENTRY(aesarmv8_ccm_dec1)
mov v0.16b, v1.16b /* q0 := auth ^ ptxt */
bl aesarmv8_enc1 /* q0 := auth'; trash x0/x3/q16 */
- stp q0, q2, [x4] /* store updated auth/ctr */
+ mov v1.16b, v2.16b /* store updated auth/ctr */
+ st1 {v0.16b-v1.16b}, [x4]
ldp fp, lr, [sp], #16 /* pop stack frame */
ret
END(aesarmv8_ccm_dec1)