mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2026-07-05 13:50:49 +02:00
ARM32 NEON ChaCha20: alignment fix
vldm and vstm assume an 32-bit alignment. Change to use vld1 and vst1.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user