ARMv8 : clang 32 bit build

This commit is contained in:
JacobBarthelmeh
2016-11-07 15:48:06 -08:00
parent 668af9b32f
commit 46dee9e792
2 changed files with 43 additions and 62 deletions

View File

@ -85,10 +85,10 @@ static const byte rcon[] = {
#define SBOX(x) \ #define SBOX(x) \
do { \ do { \
__asm__ volatile ( \ __asm__ volatile ( \
"VDUP.32 q1, %r[in] \n" \ "VDUP.32 q1, %[in] \n" \
"VMOV.i32 q0, #0 \n" \ "VMOV.i32 q0, #0 \n" \
"AESE.8 q0, q1 \n" \ "AESE.8 q0, q1 \n" \
"VMOV.32 %r[out], d0[0] \n" \ "VMOV.32 %[out], d0[0] \n" \
: [out] "=r"((x)) \ : [out] "=r"((x)) \
: [in] "r" ((x)) \ : [in] "r" ((x)) \
: "cc", "memory", "q0", "q1"\ : "cc", "memory", "q0", "q1"\
@ -2868,10 +2868,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
word32* keyPt = aes->key; word32* keyPt = aes->key;
__asm__ __volatile__ ( __asm__ __volatile__ (
"VLD1.32 {q0}, [%[CtrIn]] \n" "VLD1.32 {q0}, [%[CtrIn]] \n"
"VLD1.32 {q1}, [%[Key]]! \n" "VLDM %[Key]!, {q1-q4} \n"
"VLD1.32 {q2}, [%[Key]]! \n"
"VLD1.32 {q3}, [%[Key]]! \n"
"VLD1.32 {q4}, [%[Key]]! \n"
"AESE.8 q0, q1\n" "AESE.8 q0, q1\n"
"AESMC.8 q0, q0\n" "AESMC.8 q0, q0\n"
@ -2899,8 +2896,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
"AESMC.8 q0, q0\n" "AESMC.8 q0, q0\n"
"AESE.8 q0, q2\n" "AESE.8 q0, q2\n"
"#subtract rounds done so far and see if should continue\n" "MOV r12, %[R] \n"
"MOV r12, %r[R] \n"
"CMP r12, #10 \n" "CMP r12, #10 \n"
"BEQ 1f \n" "BEQ 1f \n"
"VLD1.32 {q1}, [%[Key]]! \n" "VLD1.32 {q1}, [%[Key]]! \n"
@ -2925,9 +2921,10 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
"VEOR.32 q0, q0, q1\n" "VEOR.32 q0, q0, q1\n"
"VST1.32 {q0}, [%[CtrOut]] \n" "VST1.32 {q0}, [%[CtrOut]] \n"
:[CtrOut] "=r" (outBlock) :[CtrOut] "=r" (outBlock), "=r" (keyPt), "=r" (aes->rounds),
:"0" (outBlock), [Key] "r" (keyPt), [R] "r" (aes->rounds), "=r" (inBlock)
[CtrIn] "r" (inBlock) :"0" (outBlock), [Key] "1" (keyPt), [R] "2" (aes->rounds),
[CtrIn] "3" (inBlock)
: "cc", "memory", "r12", "q0", "q1", "q2", "q3", "q4" : "cc", "memory", "r12", "q0", "q1", "q2", "q3", "q4"
); );
@ -2944,68 +2941,66 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
sub bytes for shifted rows sub bytes for shifted rows
*/ */
word32* keyPt = aes->key;
__asm__ __volatile__ ( __asm__ __volatile__ (
"VLD1.32 {q0}, [%[CtrIn]] \n" "VLD1.32 {q0}, [%[CtrIn]] \n"
"VLD1.32 {q1}, %[Key]! \n" "VLDM %[Key]!, {q1-q4} \n"
"VLD1.32 {q2}, %[Key]! \n"
"VLD1.32 {q3}, %[Key]! \n"
"VLD1.32 {q4}, %[Key]! \n"
"AESD.8 q0, q1\n" "AESD.8 q0, q1\n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"AESD.8 q0, q2\n" "AESD.8 q0, q2\n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"VLD1.32 {q1}, %[Key]! \n" "VLD1.32 {q1}, [%[Key]]! \n"
"AESD.8 q0, q3\n" "AESD.8 q0, q3\n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"VLD1.32 {q2}, %[Key]! \n" "VLD1.32 {q2}, [%[Key]]! \n"
"AESD.8 q0, q4\n" "AESD.8 q0, q4\n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"VLD1.32 {q3}, %[Key]! \n" "VLD1.32 {q3}, [%[Key]]! \n"
"AESD.8 q0, q1\n" "AESD.8 q0, q1\n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"VLD1.32 {q4}, %[Key]! \n" "VLD1.32 {q4}, [%[Key]]! \n"
"AESD.8 q0, q2\n" "AESD.8 q0, q2\n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"AESD.8 q0, q3\n" "AESD.8 q0, q3\n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"VLD1.32 {q1}, %[Key]! \n" "VLD1.32 {q1}, [%[Key]]! \n"
"AESD.8 q0, q4\n" "AESD.8 q0, q4\n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"VLD1.32 {q2}, %[Key]! \n" "VLD1.32 {q2}, [%[Key]]! \n"
"AESD.8 q0, q1\n" "AESD.8 q0, q1\n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"AESD.8 q0, q2\n" "AESD.8 q0, q2\n"
"#subtract rounds done so far and see if should continue\n" "MOV r12, %[R] \n"
"MOV r12, %r[R] \n" "CMP r12, #10 \n"
"CMP r12, #10 \n"
"BEQ 1f \n" "BEQ 1f \n"
"VLD1.32 {q1}, %[Key]! \n" "VLD1.32 {q1}, [%[Key]]! \n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"VLD1.32 {q2}, %[Key]! \n" "VLD1.32 {q2}, [%[Key]]! \n"
"AESD.8 q0, q1\n" "AESD.8 q0, q1\n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"AESD.8 q0, q2\n" "AESD.8 q0, q2\n"
"CMP r12, #12 \n" "CMP r12, #12 \n"
"BEQ 1f \n" "BEQ 1f \n"
"VLD1.32 {q1}, %[Key]! \n" "VLD1.32 {q1}, [%[Key]]! \n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"VLD1.32 {q2}, %[Key]! \n" "VLD1.32 {q2}, [%[Key]]! \n"
"AESD.8 q0, q1\n" "AESD.8 q0, q1\n"
"AESIMC.8 q0, q0\n" "AESIMC.8 q0, q0\n"
"AESD.8 q0, q2\n" "AESD.8 q0, q2\n"
"#Final AddRoundKey then store result \n" "#Final AddRoundKey then store result \n"
"1: \n" "1: \n"
"VLD1.32 {q1}, %[Key]! \n" "VLD1.32 {q1}, [%[Key]]! \n"
"VEOR.32 q0, q0, q1\n" "VEOR.32 q0, q0, q1\n"
"VST1.32 {q0}, [%[CtrOut]] \n" "VST1.32 {q0}, [%[CtrOut]] \n"
:[CtrOut] "=r" (outBlock) :[CtrOut] "=r" (outBlock), "=r" (keyPt), "=r" (aes->rounds),
:[Key] "m" (aes->key), "0" (outBlock), [R] "r" (aes->rounds), "=r" (inBlock)
[CtrIn] "r" (inBlock) :"0" (outBlock), [Key] "1" (keyPt), [R] "2" (aes->rounds),
[CtrIn] "3" (inBlock)
: "cc", "memory", "r12", "q0", "q1", "q2", "q3", "q4" : "cc", "memory", "r12", "q0", "q1", "q2", "q3", "q4"
); );
@ -3038,7 +3033,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
switch(aes->rounds) { switch(aes->rounds) {
case 10: /* AES 128 BLOCK */ case 10: /* AES 128 BLOCK */
__asm__ __volatile__ ( __asm__ __volatile__ (
"MOV r11, %r[blocks] \n" "MOV r11, %[blocks] \n"
"VLD1.32 {q1}, [%[Key]]! \n" "VLD1.32 {q1}, [%[Key]]! \n"
"VLD1.32 {q2}, [%[Key]]! \n" "VLD1.32 {q2}, [%[Key]]! \n"
"VLD1.32 {q3}, [%[Key]]! \n" "VLD1.32 {q3}, [%[Key]]! \n"
@ -3098,7 +3093,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
case 12: /* AES 192 BLOCK */ case 12: /* AES 192 BLOCK */
__asm__ __volatile__ ( __asm__ __volatile__ (
"MOV r11, %r[blocks] \n" "MOV r11, %[blocks] \n"
"VLD1.32 {q1}, [%[Key]]! \n" "VLD1.32 {q1}, [%[Key]]! \n"
"VLD1.32 {q2}, [%[Key]]! \n" "VLD1.32 {q2}, [%[Key]]! \n"
"VLD1.32 {q3}, [%[Key]]! \n" "VLD1.32 {q3}, [%[Key]]! \n"
@ -3164,7 +3159,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
case 14: /* AES 256 BLOCK */ case 14: /* AES 256 BLOCK */
__asm__ __volatile__ ( __asm__ __volatile__ (
"MOV r11, %r[blocks] \n" "MOV r11, %[blocks] \n"
"VLD1.32 {q1}, [%[Key]]! \n" "VLD1.32 {q1}, [%[Key]]! \n"
"VLD1.32 {q2}, [%[Key]]! \n" "VLD1.32 {q2}, [%[Key]]! \n"
"VLD1.32 {q3}, [%[Key]]! \n" "VLD1.32 {q3}, [%[Key]]! \n"
@ -3260,7 +3255,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
switch(aes->rounds) { switch(aes->rounds) {
case 10: /* AES 128 BLOCK */ case 10: /* AES 128 BLOCK */
__asm__ __volatile__ ( __asm__ __volatile__ (
"MOV r11, %r[blocks] \n" "MOV r11, %[blocks] \n"
"VLD1.32 {q1}, [%[Key]]! \n" "VLD1.32 {q1}, [%[Key]]! \n"
"VLD1.32 {q2}, [%[Key]]! \n" "VLD1.32 {q2}, [%[Key]]! \n"
"VLD1.32 {q3}, [%[Key]]! \n" "VLD1.32 {q3}, [%[Key]]! \n"
@ -3322,7 +3317,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
case 12: /* AES 192 BLOCK */ case 12: /* AES 192 BLOCK */
__asm__ __volatile__ ( __asm__ __volatile__ (
"MOV r11, %r[blocks] \n" "MOV r11, %[blocks] \n"
"VLD1.32 {q1}, [%[Key]]! \n" "VLD1.32 {q1}, [%[Key]]! \n"
"VLD1.32 {q2}, [%[Key]]! \n" "VLD1.32 {q2}, [%[Key]]! \n"
"VLD1.32 {q3}, [%[Key]]! \n" "VLD1.32 {q3}, [%[Key]]! \n"
@ -3390,7 +3385,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
case 14: /* AES 256 BLOCK */ case 14: /* AES 256 BLOCK */
__asm__ __volatile__ ( __asm__ __volatile__ (
"MOV r11, %r[blocks] \n" "MOV r11, %[blocks] \n"
"VLD1.32 {q1}, [%[Key]]! \n" "VLD1.32 {q1}, [%[Key]]! \n"
"VLD1.32 {q2}, [%[Key]]! \n" "VLD1.32 {q2}, [%[Key]]! \n"
"VLD1.32 {q3}, [%[Key]]! \n" "VLD1.32 {q3}, [%[Key]]! \n"
@ -3513,7 +3508,7 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
switch(aes->rounds) { switch(aes->rounds) {
case 10: /* AES 128 BLOCK */ case 10: /* AES 128 BLOCK */
__asm__ __volatile__ ( __asm__ __volatile__ (
"MOV r11, %r[blocks] \n" "MOV r11, %[blocks] \n"
"VLDM %[Key]!, {q1-q4} \n" "VLDM %[Key]!, {q1-q4} \n"
"#Create vector with the value 1 \n" "#Create vector with the value 1 \n"
@ -3649,24 +3644,17 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
case 12: /* AES 192 BLOCK */ case 12: /* AES 192 BLOCK */
__asm__ __volatile__ ( __asm__ __volatile__ (
"MOV r11, %r[blocks] \n" "MOV r11, %[blocks] \n"
"VLD1.32 {q1}, [%[Key]]! \n" "VLDM %[Key]!, {q1-q4} \n"
"VLD1.32 {q2}, [%[Key]]! \n"
"VLD1.32 {q3}, [%[Key]]! \n"
"VLD1.32 {q4}, [%[Key]]! \n"
"#Create vector with the value 1 \n" "#Create vector with the value 1 \n"
"VMOV.u32 q15, #1 \n" "VMOV.u32 q15, #1 \n"
"VSHR.u64 q15, q15, #32 \n" "VSHR.u64 q15, q15, #32 \n"
"VLD1.32 {q5}, [%[Key]]! \n" "VLDM %[Key]!, {q5-q8} \n"
"VLD1.32 {q6}, [%[Key]]! \n"
"VLD1.32 {q7}, [%[Key]]! \n"
"VLD1.32 {q8}, [%[Key]]! \n"
"VEOR.32 q14, q14, q14 \n" "VEOR.32 q14, q14, q14 \n"
"VEXT.8 q14, q15, q14, #8\n" "VEXT.8 q14, q15, q14, #8\n"
"VLD1.32 {q9}, [%[Key]]! \n" "VLDM %[Key]!, {q9-q10} \n"
"VLD1.32 {q10}, [%[Key]]!\n"
"VLD1.32 {q13}, [%[reg]]\n" "VLD1.32 {q13}, [%[reg]]\n"
/* double block */ /* double block */
@ -3815,24 +3803,17 @@ int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
case 14: /* AES 256 BLOCK */ case 14: /* AES 256 BLOCK */
__asm__ __volatile__ ( __asm__ __volatile__ (
"MOV r11, %r[blocks] \n" "MOV r11, %[blocks] \n"
"VLD1.32 {q1}, [%[Key]]! \n" "VLDM %[Key]!, {q1-q4} \n"
"VLD1.32 {q2}, [%[Key]]! \n"
"VLD1.32 {q3}, [%[Key]]! \n"
"VLD1.32 {q4}, [%[Key]]! \n"
"#Create vector with the value 1 \n" "#Create vector with the value 1 \n"
"VMOV.u32 q15, #1 \n" "VMOV.u32 q15, #1 \n"
"VSHR.u64 q15, q15, #32 \n" "VSHR.u64 q15, q15, #32 \n"
"VLD1.32 {q5}, [%[Key]]! \n" "VLDM %[Key]!, {q5-q8} \n"
"VLD1.32 {q6}, [%[Key]]! \n"
"VLD1.32 {q7}, [%[Key]]! \n"
"VLD1.32 {q8}, [%[Key]]! \n"
"VEOR.32 q14, q14, q14 \n" "VEOR.32 q14, q14, q14 \n"
"VEXT.8 q14, q15, q14, #8\n" "VEXT.8 q14, q15, q14, #8\n"
"VLD1.32 {q9}, [%[Key]]! \n" "VLDM %[Key]!, {q9-q10} \n"
"VLD1.32 {q10}, [%[Key]]! \n"
"VLD1.32 {q13}, [%[reg]]\n" "VLD1.32 {q13}, [%[reg]]\n"
/* double block */ /* double block */

View File

@ -706,7 +706,7 @@ int wc_Sha256Update(Sha256* sha256, const byte* data, word32 len)
"#load current digest\n" "#load current digest\n"
"VLDM %[digest], {q12-q13} \n" "VLDM %[digest], {q12-q13} \n"
"MOV r8, %r[blocks] \n" "MOV r8, %[blocks] \n"
"VREV32.8 q0, q0 \n" "VREV32.8 q0, q0 \n"
"VREV32.8 q1, q1 \n" "VREV32.8 q1, q1 \n"
"VREV32.8 q2, q2 \n" "VREV32.8 q2, q2 \n"