diff --git a/wolfcrypt/src/port/arm/armv8-32-chacha-asm.S b/wolfcrypt/src/port/arm/armv8-32-chacha-asm.S index a342fad9216..1b47cb6333e 100644 --- a/wolfcrypt/src/port/arm/armv8-32-chacha-asm.S +++ b/wolfcrypt/src/port/arm/armv8-32-chacha-asm.S @@ -812,24 +812,30 @@ L_chacha_crypt_bytes_arm32_round_start_256: # Load and XOR in message ldr lr, [sp, #32] ldr r3, [sp, #36] - vldm lr!, {q8-q11} + vld1.8 {q8-q9}, [lr]! + vld1.8 {q10-q11}, [lr]! veor q12, q12, q8 veor q13, q13, q9 veor q14, q14, q10 veor q15, q15, q11 - vstm r3!, {q12-q15} - vldm lr!, {q8-q11} + vst1.8 {q12-q13}, [r3]! + vst1.8 {q14-q15}, [r3]! + vld1.8 {q8-q9}, [lr]! + vld1.8 {q10-q11}, [lr]! veor q0, q0, q8 veor q1, q1, q9 veor q2, q2, q10 veor q3, q3, q11 - vstm r3!, {q0-q3} - vldm lr!, {q8-q11} + vst1.8 {q0-q1}, [r3]! + vst1.8 {q2-q3}, [r3]! + vld1.8 {q8-q9}, [lr]! + vld1.8 {q10-q11}, [lr]! veor q4, q4, q8 veor q5, q5, q9 veor q6, q6, q10 veor q7, q7, q11 - vstm r3!, {q4-q7} + vst1.8 {q4-q5}, [r3]! + vst1.8 {q6-q7}, [r3]! str r3, [sp, #36] ldr r3, [sp, #24] add r10, r10, #3 @@ -849,7 +855,8 @@ L_chacha_crypt_bytes_arm32_round_start_256: vmov d7, r12, lr ldr r3, [sp, #40] vldm r0, {q12-q15} - vldm r2!, {q4-q7} + vld1.8 {q4-q5}, [r2]! + vld1.8 {q6-q7}, [r2]! vadd.i32 q0, q0, q12 vadd.i32 q1, q1, q13 vadd.i32 q2, q2, q14 @@ -860,7 +867,8 @@ L_chacha_crypt_bytes_arm32_round_start_256: add lr, lr, #4 veor q2, q2, q6 veor q3, q3, q7 - vstm r1!, {q0-q3} + vst1.8 {q0-q1}, [r1]! + vst1.8 {q2-q3}, [r1]! vmov d30[0], lr str lr, [r0, #48] sub r3, r3, #0x100 diff --git a/wolfcrypt/src/port/arm/armv8-32-chacha-asm_c.c b/wolfcrypt/src/port/arm/armv8-32-chacha-asm_c.c index 47e2562e5f1..edc0b08d66d 100644 --- a/wolfcrypt/src/port/arm/armv8-32-chacha-asm_c.c +++ b/wolfcrypt/src/port/arm/armv8-32-chacha-asm_c.c @@ -928,24 +928,30 @@ WC_OMIT_FRAME_POINTER void wc_chacha_crypt_bytes(ChaCha* ctx, byte* c, /* Load and XOR in message */ "ldr lr, [sp, #32]\n\t" "ldr %[len], [sp, #36]\n\t" - "vldm lr!, {q8-q11}\n\t" + "vld1.8 {q8-q9}, [lr]!\n\t" + "vld1.8 {q10-q11}, [lr]!\n\t" "veor q12, q12, q8\n\t" "veor q13, q13, q9\n\t" "veor q14, q14, q10\n\t" "veor q15, q15, q11\n\t" - "vstm %[len]!, {q12-q15}\n\t" - "vldm lr!, {q8-q11}\n\t" + "vst1.8 {q12-q13}, [%[len]]!\n\t" + "vst1.8 {q14-q15}, [%[len]]!\n\t" + "vld1.8 {q8-q9}, [lr]!\n\t" + "vld1.8 {q10-q11}, [lr]!\n\t" "veor q0, q0, q8\n\t" "veor q1, q1, q9\n\t" "veor q2, q2, q10\n\t" "veor q3, q3, q11\n\t" - "vstm %[len]!, {q0-q3}\n\t" - "vldm lr!, {q8-q11}\n\t" + "vst1.8 {q0-q1}, [%[len]]!\n\t" + "vst1.8 {q2-q3}, [%[len]]!\n\t" + "vld1.8 {q8-q9}, [lr]!\n\t" + "vld1.8 {q10-q11}, [lr]!\n\t" "veor q4, q4, q8\n\t" "veor q5, q5, q9\n\t" "veor q6, q6, q10\n\t" "veor q7, q7, q11\n\t" - "vstm %[len]!, {q4-q7}\n\t" + "vst1.8 {q4-q5}, [%[len]]!\n\t" + "vst1.8 {q6-q7}, [%[len]]!\n\t" "str %[len], [sp, #36]\n\t" "ldr %[len], [sp, #24]\n\t" "add r10, r10, #3\n\t" @@ -965,7 +971,8 @@ WC_OMIT_FRAME_POINTER void wc_chacha_crypt_bytes(ChaCha* ctx, byte* c, "vmov d7, r12, lr\n\t" "ldr %[len], [sp, #40]\n\t" "vldm %[ctx], {q12-q15}\n\t" - "vldm %[m]!, {q4-q7}\n\t" + "vld1.8 {q4-q5}, [%[m]]!\n\t" + "vld1.8 {q6-q7}, [%[m]]!\n\t" "vadd.i32 q0, q0, q12\n\t" "vadd.i32 q1, q1, q13\n\t" "vadd.i32 q2, q2, q14\n\t" @@ -976,7 +983,8 @@ WC_OMIT_FRAME_POINTER void wc_chacha_crypt_bytes(ChaCha* ctx, byte* c, "add lr, lr, #4\n\t" "veor q2, q2, q6\n\t" "veor q3, q3, q7\n\t" - "vstm %[c]!, {q0-q3}\n\t" + "vst1.8 {q0-q1}, [%[c]]!\n\t" + "vst1.8 {q2-q3}, [%[c]]!\n\t" "vmov d30[0], lr\n\t" "str lr, [%[ctx], #48]\n\t" "sub %[len], %[len], #0x100\n\t"