|
|
@@ -229,7 +229,13 @@
|
|
|
x4 ^= x2; \
|
|
|
})
|
|
|
|
|
|
-static void __serpent_setkey_sbox(u32 r0, u32 r1, u32 r2, u32 r3, u32 r4, u32 *k)
|
|
|
+/*
|
|
|
+ * both gcc and clang have misoptimized this function in the past,
|
|
|
+ * producing horrible object code from spilling temporary variables
|
|
|
+ * on the stack. Forcing this part out of line avoids that.
|
|
|
+ */
|
|
|
+static noinline void __serpent_setkey_sbox(u32 r0, u32 r1, u32 r2,
|
|
|
+ u32 r3, u32 r4, u32 *k)
|
|
|
{
|
|
|
k += 100;
|
|
|
S3(r3, r4, r0, r1, r2); store_and_load_keys(r1, r2, r4, r3, 28, 24);
|