@samitouri / QOSamiQemu / commits / 8b416699c8

target/mips: Expand octeon reflections inline

Use tcg_gen_revbit64_i64 instead of out-of-line helpers. Reviewed-by: Anton Johansson <anjo@rev.ng> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

Richard Henderson committed Jul 30, 2026 at 12:04 UTC 8b416699c88f78c56eb668b18d40876034857542
3 files changed +43 -48
target/mips/helper.h
-7
@@ -27,10 +27,6 @@ DEF_HELPER_FLAGS_4(rotx, TCG_CALL_NO_RWG_SE, tl, tl, i32, i32, i32)
27
28 /* Octeon COP2 selector operation helpers. */
29 DEF_HELPER_1(octeon_cp2_mf_crc_iv_reflect, i64, env)
30 -DEF_HELPER_1(octeon_cp2_mf_gfm_mul_reflect0, i64, env)
31 -DEF_HELPER_1(octeon_cp2_mf_gfm_mul_reflect1, i64, env)
32 -DEF_HELPER_1(octeon_cp2_mf_gfm_resinp_reflect0, i64, env)
33 -DEF_HELPER_1(octeon_cp2_mf_gfm_resinp_reflect1, i64, env)
30 DEF_HELPER_2(octeon_cp2_mt_crc_write_iv_reflect, void, env, i64)
31 DEF_HELPER_2(octeon_cp2_mt_crc_write_polynomial_reflect, void, env, i64)
32 DEF_HELPER_2(octeon_cp2_mt_crc_write_byte, void, env, i64)
@@ -43,9 +39,6 @@ DEF_HELPER_2(octeon_cp2_mt_crc_write_dword, void, env, i64)
39 DEF_HELPER_2(octeon_cp2_mt_crc_write_var, void, env, i64)
40 DEF_HELPER_2(octeon_cp2_mt_crc_write_dword_reflect, void, env, i64)
41 DEF_HELPER_2(octeon_cp2_mt_crc_write_var_reflect, void, env, i64)
46 -DEF_HELPER_2(octeon_cp2_mt_gfm_mul_reflect0, void, env, i64)
47 -DEF_HELPER_2(octeon_cp2_mt_gfm_mul_reflect1, void, env, i64)
48 -DEF_HELPER_2(octeon_cp2_mt_gfm_xor0_reflect, void, env, i64)
42 DEF_HELPER_2(octeon_cp2_mt_gfm_xormul1_reflect, void, env, i64)
43 DEF_HELPER_2(octeon_cp2_mt_gfm_xormul1, void, env, i64)
44 DEF_HELPER_1(octeon_cp2_mt_sha3_startop, void, env)
target/mips/tcg/octeon_crypto.c
-35
@@ -2127,41 +2127,6 @@ uint64_t helper_octeon_cp2_mf_crc_iv_reflect(CPUMIPSState *env)
2127 return octeon_crc_reflect32_by_byte(env->octeon_crypto.crc_iv);
2128 }
2129
2130 -uint64_t helper_octeon_cp2_mf_gfm_mul_reflect0(CPUMIPSState *env)
2131 -{
2132 - return revbit64(env->octeon_crypto.gfm_mul[0]);
2133 -}
2134 -
2135 -uint64_t helper_octeon_cp2_mf_gfm_mul_reflect1(CPUMIPSState *env)
2136 -{
2137 - return revbit64(env->octeon_crypto.gfm_mul[1]);
2138 -}
2139 -
2140 -uint64_t helper_octeon_cp2_mf_gfm_resinp_reflect0(CPUMIPSState *env)
2141 -{
2142 - return revbit64(env->octeon_crypto.gfm_resinp[0]);
2143 -}
2144 -
2145 -uint64_t helper_octeon_cp2_mf_gfm_resinp_reflect1(CPUMIPSState *env)
2146 -{
2147 - return revbit64(env->octeon_crypto.gfm_resinp[1]);
2148 -}
2149 -
2150 -void helper_octeon_cp2_mt_gfm_mul_reflect0(CPUMIPSState *env, uint64_t value)
2151 -{
2152 - env->octeon_crypto.gfm_mul[0] = revbit64(value);
2153 -}
2154 -
2155 -void helper_octeon_cp2_mt_gfm_mul_reflect1(CPUMIPSState *env, uint64_t value)
2156 -{
2157 - env->octeon_crypto.gfm_mul[1] = revbit64(value);
2158 -}
2159 -
2160 -void helper_octeon_cp2_mt_gfm_xor0_reflect(CPUMIPSState *env, uint64_t value)
2161 -{
2162 - env->octeon_crypto.gfm_resinp[0] ^= revbit64(value);
2163 -}
2164 -
2130 static void octeon_gfm_xormul1_common(MIPSOcteonCryptoState *crypto,
2131 uint64_t value)
2132 {
target/mips/tcg/octeon_translate.c
+43 -6
@@ -28,6 +28,8 @@
28 TRANS(NAME, trans_octeon_cp2_mf_hsh_pair, \
29 OCTEON_CRYPTO_OFFSET(FIELD[2 * (INDEX)]), \
30 OCTEON_CRYPTO_OFFSET(FIELD[2 * (INDEX) + 1]))
31 +#define CP2_MF_REFLECT(NAME, FIELD) \
32 + TRANS(NAME, trans_octeon_cp2_mf_reflect, OCTEON_CRYPTO_OFFSET(FIELD))
33 #define CP2_MF_HELPER(NAME, SUFFIX) \
34 TRANS(NAME, trans_octeon_cp2_mf_helper, \
35 gen_helper_octeon_cp2_mf_ ## SUFFIX)
@@ -44,6 +46,8 @@
46 TRANS(NAME, trans_octeon_cp2_mt_hsh_pair, \
47 OCTEON_CRYPTO_OFFSET(FIELD[2 * (INDEX)]), \
48 OCTEON_CRYPTO_OFFSET(FIELD[2 * (INDEX) + 1]))
49 +#define CP2_MT_REFLECT(NAME, FIELD) \
50 + TRANS(NAME, trans_octeon_cp2_mt_reflect, OCTEON_CRYPTO_OFFSET(FIELD))
51 #define CP2_MT_HELPER(NAME, SUFFIX) \
52 TRANS(NAME, trans_octeon_cp2_mt_helper, \
53 gen_helper_octeon_cp2_mt_ ## SUFFIX)
@@ -110,6 +114,17 @@ static bool trans_octeon_cp2_mf_hsh_pair(DisasContext *ctx, arg_cp2 *a,
114 return true;
115 }
116
117 +static bool trans_octeon_cp2_mf_reflect(DisasContext *ctx, arg_cp2 *a,
118 + int offset)
119 +{
120 + TCGv_i64 value = tcg_temp_new_i64();
121 +
122 + tcg_gen_ld_i64(value, tcg_env, offset);
123 + tcg_gen_revbit64_i64(value, value);
124 + gen_store_gpr(value, a->rt);
125 + return true;
126 +}
127 +
128 static bool trans_octeon_cp2_mf_helper(DisasContext *ctx, arg_cp2 *a,
129 void (*gen_helper)(TCGv_i64, TCGv_env))
130 {
@@ -183,6 +198,17 @@ static bool trans_octeon_cp2_mt_xor_i64(DisasContext *ctx, arg_cp2 *a,
198 return true;
199 }
200
201 +static bool trans_octeon_cp2_mt_reflect(DisasContext *ctx, arg_cp2 *a,
202 + int offset)
203 +{
204 + TCGv_i64 value = tcg_temp_new_i64();
205 +
206 + gen_load_gpr(value, a->rt);
207 + tcg_gen_revbit64_i64(value, value);
208 + tcg_gen_st_i64(value, tcg_env, offset);
209 + return true;
210 +}
211 +
212 static bool trans_octeon_cp2_mt_helper(DisasContext *ctx, arg_cp2 *a,
213 void (*gen_helper)(TCGv_env, TCGv_i64))
214 {
@@ -200,6 +226,17 @@ static bool trans_octeon_cp2_mt_helper_env(DisasContext *ctx, arg_cp2 *a,
226 return true;
227 }
228
229 +static void gen_helper_octeon_cp2_mt_gfm_xor0_reflect(TCGv_env t_env,
230 + TCGv_i64 value)
231 +{
232 + TCGv_i64 resinp = tcg_temp_new_i64();
233 +
234 + tcg_gen_revbit64_i64(value, value);
235 + tcg_gen_ld_i64(resinp, t_env, OCTEON_CRYPTO_OFFSET(gfm_resinp[0]));
236 + tcg_gen_xor_i64(resinp, resinp, value);
237 + tcg_gen_st_i64(resinp, t_env, OCTEON_CRYPTO_OFFSET(gfm_resinp[0]));
238 +}
239 +
240 CP2_MF_HSH_PAIR(CVM_MF_HSH_DAT0, hsh_dat, 0);
241 CP2_MF_HSH_PAIR(CVM_MF_HSH_DAT1, hsh_dat, 1);
242 CP2_MF_HSH_PAIR(CVM_MF_HSH_DAT2, hsh_dat, 2);
@@ -241,10 +278,10 @@ CP2_MF_I64(CVM_MF_LLM_DATA1, llm_data[1]);
278
279 CP2_MF_HELPER(CVM_MF_CRC_IV_REFLECT, crc_iv_reflect);
280 CP2_MF_I64(CVM_MF_SHA3_DAT24, sha3_dat24);
244 -CP2_MF_HELPER(CVM_MF_GFM_MUL_REFLECT0, gfm_mul_reflect0);
245 -CP2_MF_HELPER(CVM_MF_GFM_MUL_REFLECT1, gfm_mul_reflect1);
246 -CP2_MF_HELPER(CVM_MF_GFM_RESINP_REFLECT0, gfm_resinp_reflect0);
247 -CP2_MF_HELPER(CVM_MF_GFM_RESINP_REFLECT1, gfm_resinp_reflect1);
281 +CP2_MF_REFLECT(CVM_MF_GFM_MUL_REFLECT0, gfm_mul[0])
282 +CP2_MF_REFLECT(CVM_MF_GFM_MUL_REFLECT1, gfm_mul[1])
283 +CP2_MF_REFLECT(CVM_MF_GFM_RESINP_REFLECT0, gfm_resinp[0])
284 +CP2_MF_REFLECT(CVM_MF_GFM_RESINP_REFLECT1, gfm_resinp[1])
285 CP2_MF_I64(CVM_MF_HSH_DATW0, hsh_dat[0]);
286 CP2_MF_I64(CVM_MF_HSH_DATW1, hsh_dat[1]);
287 CP2_MF_I64(CVM_MF_HSH_DATW2, hsh_dat[2]);
@@ -281,8 +318,8 @@ CP2_MT_HSH_PAIR(CVM_MT_HSH_IV0, hsh_iv, 0);
318 CP2_MT_HSH_PAIR(CVM_MT_HSH_IV1, hsh_iv, 1);
319 CP2_MT_HSH_PAIR(CVM_MT_HSH_IV2, hsh_iv, 2);
320 CP2_MT_HSH_PAIR(CVM_MT_HSH_IV3, hsh_iv, 3);
284 -CP2_MT_HELPER(CVM_MT_GFM_MUL_REFLECT0, gfm_mul_reflect0);
285 -CP2_MT_HELPER(CVM_MT_GFM_MUL_REFLECT1, gfm_mul_reflect1);
321 +CP2_MT_REFLECT(CVM_MT_GFM_MUL_REFLECT0, gfm_mul[0]);
322 +CP2_MT_REFLECT(CVM_MT_GFM_MUL_REFLECT1, gfm_mul[1]);
323 CP2_MT_HELPER(CVM_MT_GFM_XOR0_REFLECT, gfm_xor0_reflect);
324 CP2_MT_I64(CVM_MT_3DES_KEY0, des3_key[0]);
325 CP2_MT_I64(CVM_MT_3DES_KEY1, des3_key[1]);