Skip to content

Commit ea677dd

Browse files
committed
ARM32 inline ASM: make all vars input when not assigning regs
Compiler doesn't keep parameters in the same registers as passed if they are output registers.
1 parent cfab666 commit ea677dd

8 files changed

Lines changed: 409 additions & 0 deletions

wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,10 +420,17 @@ void AES_invert_key(unsigned char* ks, word32 rounds)
420420
"str r8, [%[ks]], #4\n\t"
421421
"subs r11, r11, #1\n\t"
422422
"bne L_AES_invert_key_mix_loop_%=\n\t"
423+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
423424
: [ks] "+r" (ks), [rounds] "+r" (rounds),
424425
[L_AES_ARM32_te] "+r" (L_AES_ARM32_te_c),
425426
[L_AES_ARM32_td] "+r" (L_AES_ARM32_td_c)
426427
:
428+
#else
429+
:
430+
: [ks] "r" (ks), [rounds] "r" (rounds),
431+
[L_AES_ARM32_te] "r" (L_AES_ARM32_te_c),
432+
[L_AES_ARM32_td] "r" (L_AES_ARM32_td_c)
433+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
427434
: "memory", "cc", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9",
428435
"r10", "r11"
429436
);
@@ -956,10 +963,17 @@ void AES_set_encrypt_key(const unsigned char* key, word32 len,
956963
"bne L_AES_set_encrypt_key_loop_128_%=\n\t"
957964
"\n"
958965
"L_AES_set_encrypt_key_end_%=: \n\t"
966+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
959967
: [key] "+r" (key), [len] "+r" (len), [ks] "+r" (ks),
960968
[L_AES_ARM32_te] "+r" (L_AES_ARM32_te_c),
961969
[L_AES_ARM32_rcon] "+r" (L_AES_ARM32_rcon_c)
962970
:
971+
#else
972+
:
973+
: [key] "r" (key), [len] "r" (len), [ks] "r" (ks),
974+
[L_AES_ARM32_te] "r" (L_AES_ARM32_te_c),
975+
[L_AES_ARM32_rcon] "r" (L_AES_ARM32_rcon_c)
976+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
963977
: "memory", "cc", "r12", "lr", "r5", "r6", "r7", "r8"
964978
);
965979
}
@@ -1617,8 +1631,13 @@ void AES_encrypt_block(const word32* te, int nr, int len, const word32* ks)
16171631
"eor r5, r5, r9\n\t"
16181632
"eor r6, r6, r10\n\t"
16191633
"eor r7, r7, r11\n\t"
1634+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
16201635
: [te] "+r" (te), [nr] "+r" (nr), [len] "+r" (len), [ks] "+r" (ks)
16211636
:
1637+
#else
1638+
:
1639+
: [te] "r" (te), [nr] "r" (nr), [len] "r" (len), [ks] "r" (ks)
1640+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
16221641
: "memory", "cc", "lr"
16231642
);
16241643
}
@@ -1884,9 +1903,15 @@ void AES_ECB_encrypt(const unsigned char* in, unsigned char* out,
18841903
"\n"
18851904
"L_AES_ECB_encrypt_end_%=: \n\t"
18861905
"pop {%[ks]}\n\t"
1906+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
18871907
: [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks),
18881908
[nr] "+r" (nr), [L_AES_ARM32_te_ecb] "+r" (L_AES_ARM32_te_ecb_c)
18891909
:
1910+
#else
1911+
:
1912+
: [in] "r" (in), [out] "r" (out), [len] "r" (len), [ks] "r" (ks),
1913+
[nr] "r" (nr), [L_AES_ARM32_te_ecb] "r" (L_AES_ARM32_te_ecb_c)
1914+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
18901915
: "memory", "cc", "r12", "lr", "r6", "r7", "r8", "r9", "r10", "r11"
18911916
);
18921917
}
@@ -2175,10 +2200,17 @@ void AES_CBC_encrypt(const unsigned char* in, unsigned char* out,
21752200
"L_AES_CBC_encrypt_end_%=: \n\t"
21762201
"pop {%[ks], r9}\n\t"
21772202
"stm r9, {r4, r5, r6, r7}\n\t"
2203+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
21782204
: [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks),
21792205
[nr] "+r" (nr), [iv] "+r" (iv),
21802206
[L_AES_ARM32_te_cbc] "+r" (L_AES_ARM32_te_cbc_c)
21812207
:
2208+
#else
2209+
:
2210+
: [in] "r" (in), [out] "r" (out), [len] "r" (len), [ks] "r" (ks),
2211+
[nr] "r" (nr), [iv] "r" (iv),
2212+
[L_AES_ARM32_te_cbc] "r" (L_AES_ARM32_te_cbc_c)
2213+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
21822214
: "memory", "cc", "r12", "lr", "r7", "r8", "r9", "r10", "r11"
21832215
);
21842216
}
@@ -2468,10 +2500,17 @@ void AES_CTR_encrypt(const unsigned char* in, unsigned char* out,
24682500
"rev r7, r7\n\t"
24692501
#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */
24702502
"stm r8, {r4, r5, r6, r7}\n\t"
2503+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
24712504
: [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks),
24722505
[nr] "+r" (nr), [ctr] "+r" (ctr),
24732506
[L_AES_ARM32_te_ctr] "+r" (L_AES_ARM32_te_ctr_c)
24742507
:
2508+
#else
2509+
:
2510+
: [in] "r" (in), [out] "r" (out), [len] "r" (len), [ks] "r" (ks),
2511+
[nr] "r" (nr), [ctr] "r" (ctr),
2512+
[L_AES_ARM32_te_ctr] "r" (L_AES_ARM32_te_ctr_c)
2513+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
24752514
: "memory", "cc", "r12", "lr", "r7", "r8", "r9", "r10", "r11"
24762515
);
24772516
}
@@ -3130,8 +3169,13 @@ void AES_decrypt_block(const word32* td, int nr, const byte* td4)
31303169
"eor r5, r5, r9\n\t"
31313170
"eor r6, r6, r10\n\t"
31323171
"eor r7, r7, r11\n\t"
3172+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
31333173
: [td] "+r" (td), [nr] "+r" (nr), [td4] "+r" (td4)
31343174
:
3175+
#else
3176+
:
3177+
: [td] "r" (td), [nr] "r" (nr), [td4] "r" (td4)
3178+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
31353179
: "memory", "cc", "lr"
31363180
);
31373181
}
@@ -3431,10 +3475,17 @@ void AES_ECB_decrypt(const unsigned char* in, unsigned char* out,
34313475
"bne L_AES_ECB_decrypt_loop_block_128_%=\n\t"
34323476
"\n"
34333477
"L_AES_ECB_decrypt_end_%=: \n\t"
3478+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
34343479
: [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks),
34353480
[nr] "+r" (nr), [L_AES_ARM32_td_ecb] "+r" (L_AES_ARM32_td_ecb_c),
34363481
[L_AES_ARM32_td4] "+r" (L_AES_ARM32_td4_c)
34373482
:
3483+
#else
3484+
:
3485+
: [in] "r" (in), [out] "r" (out), [len] "r" (len), [ks] "r" (ks),
3486+
[nr] "r" (nr), [L_AES_ARM32_td_ecb] "r" (L_AES_ARM32_td_ecb_c),
3487+
[L_AES_ARM32_td4] "r" (L_AES_ARM32_td4_c)
3488+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
34383489
: "memory", "cc", "r12", "lr", "r7", "r8", "r9", "r10", "r11"
34393490
);
34403491
}
@@ -4086,11 +4137,19 @@ void AES_CBC_decrypt(const unsigned char* in, unsigned char* out,
40864137
"\n"
40874138
"L_AES_CBC_decrypt_end_%=: \n\t"
40884139
"pop {%[ks]-r4}\n\t"
4140+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
40894141
: [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks),
40904142
[nr] "+r" (nr), [iv] "+r" (iv),
40914143
[L_AES_ARM32_td_ecb] "+r" (L_AES_ARM32_td_ecb_c),
40924144
[L_AES_ARM32_td4] "+r" (L_AES_ARM32_td4_c)
40934145
:
4146+
#else
4147+
:
4148+
: [in] "r" (in), [out] "r" (out), [len] "r" (len), [ks] "r" (ks),
4149+
[nr] "r" (nr), [iv] "r" (iv),
4150+
[L_AES_ARM32_td_ecb] "r" (L_AES_ARM32_td_ecb_c),
4151+
[L_AES_ARM32_td4] "r" (L_AES_ARM32_td4_c)
4152+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
40944153
: "memory", "cc", "r12", "lr", "r8", "r9", "r10", "r11"
40954154
);
40964155
}
@@ -4701,9 +4760,15 @@ void GCM_gmult_len(unsigned char* x, const unsigned char** m,
47014760
"subs %[len], %[len], #16\n\t"
47024761
"add %[data], %[data], #16\n\t"
47034762
"bne L_GCM_gmult_len_start_block_%=\n\t"
4763+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
47044764
: [x] "+r" (x), [m] "+r" (m), [data] "+r" (data), [len] "+r" (len),
47054765
[L_GCM_gmult_len_r] "+r" (L_GCM_gmult_len_r_c)
47064766
:
4767+
#else
4768+
:
4769+
: [x] "r" (x), [m] "r" (m), [data] "r" (data), [len] "r" (len),
4770+
[L_GCM_gmult_len_r] "r" (L_GCM_gmult_len_r_c)
4771+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
47074772
: "memory", "cc", "r12", "lr", "r5", "r6", "r7", "r8", "r9", "r10",
47084773
"r11"
47094774
);
@@ -4983,10 +5048,17 @@ void AES_GCM_encrypt(const unsigned char* in, unsigned char* out,
49835048
"rev r7, r7\n\t"
49845049
#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */
49855050
"stm r8, {r4, r5, r6, r7}\n\t"
5051+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
49865052
: [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks),
49875053
[nr] "+r" (nr), [ctr] "+r" (ctr),
49885054
[L_AES_ARM32_te_gcm] "+r" (L_AES_ARM32_te_gcm_c)
49895055
:
5056+
#else
5057+
:
5058+
: [in] "r" (in), [out] "r" (out), [len] "r" (len), [ks] "r" (ks),
5059+
[nr] "r" (nr), [ctr] "r" (ctr),
5060+
[L_AES_ARM32_te_gcm] "r" (L_AES_ARM32_te_gcm_c)
5061+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
49905062
: "memory", "cc", "r12", "lr", "r7", "r8", "r9", "r10", "r11"
49915063
);
49925064
}

wolfcrypt/src/port/arm/armv8-32-chacha-asm_c.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,13 @@ void wc_chacha_setiv(word32* x, const byte* iv, word32 counter)
8080
"rev lr, lr\n\t"
8181
#endif /* BIG_ENDIAN_ORDER */
8282
"stm r3, {r4, r12, lr}\n\t"
83+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
8384
: [x] "+r" (x), [iv] "+r" (iv), [counter] "+r" (counter)
8485
:
86+
#else
87+
:
88+
: [x] "r" (x), [iv] "r" (iv), [counter] "r" (counter)
89+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
8590
: "memory", "cc", "r3", "r12", "lr", "r4"
8691
);
8792
}
@@ -139,9 +144,15 @@ void wc_chacha_setkey(word32* x, const byte* key, word32 keySz)
139144
"\n"
140145
"L_chacha_arm32_setkey_same_keyb_ytes_%=: \n\t"
141146
"stm %[x], {r4, r5, r12, lr}\n\t"
147+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
142148
: [x] "+r" (x), [key] "+r" (key), [keySz] "+r" (keySz),
143149
[L_chacha_arm32_constants] "+r" (L_chacha_arm32_constants_c)
144150
:
151+
#else
152+
:
153+
: [x] "r" (x), [key] "r" (key), [keySz] "r" (keySz),
154+
[L_chacha_arm32_constants] "r" (L_chacha_arm32_constants_c)
155+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
145156
: "memory", "cc", "r12", "lr", "r4", "r5"
146157
);
147158
}
@@ -510,8 +521,13 @@ void wc_chacha_crypt_bytes(ChaCha* ctx, byte* c, const byte* m, word32 len)
510521
"\n"
511522
"L_chacha_arm32_crypt_done_%=: \n\t"
512523
"add sp, sp, #52\n\t"
524+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
513525
: [ctx] "+r" (ctx), [c] "+r" (c), [m] "+r" (m), [len] "+r" (len)
514526
:
527+
#else
528+
:
529+
: [ctx] "r" (ctx), [c] "r" (c), [m] "r" (m), [len] "r" (len)
530+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
515531
: "memory", "cc", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9",
516532
"r10", "r11"
517533
);
@@ -589,9 +605,15 @@ void wc_chacha_use_over(byte* over, byte* output, const byte* input, word32 len)
589605
"b L_chacha_arm32_over_byte_loop_%=\n\t"
590606
"\n"
591607
"L_chacha_arm32_over_done_%=: \n\t"
608+
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
592609
: [over] "+r" (over), [output] "+r" (output), [input] "+r" (input),
593610
[len] "+r" (len)
594611
:
612+
#else
613+
:
614+
: [over] "r" (over), [output] "r" (output), [input] "r" (input),
615+
[len] "r" (len)
616+
#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */
595617
: "memory", "cc", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9"
596618
);
597619
}

0 commit comments

Comments
 (0)