Skip to content

Commit 4165d92

Browse files
taylorsimpsonandrom3da
authored andcommitted
Hexagon (target/hexagon) optimize gen_read_greg
gregs 0-3 don't need special handling, so generate a TCG move instead of calling a helper Signed-off-by: Taylor Simpson <[email protected]>
1 parent d1d09d9 commit 4165d92

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

target/hexagon/genptr.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,12 +344,20 @@ static void gen_read_sreg_pair(TCGv_i64 dst, int reg_num)
344344

345345
static void gen_read_greg(TCGv dst, int reg_num)
346346
{
347-
gen_helper_greg_read(dst, tcg_env, tcg_constant_tl(reg_num));
347+
if (reg_num <= HEX_GREG_G3) {
348+
tcg_gen_mov_tl(dst, hex_greg[reg_num]);
349+
} else {
350+
gen_helper_greg_read(dst, tcg_env, tcg_constant_tl(reg_num));
351+
}
348352
}
349353

350354
static void gen_read_greg_pair(TCGv_i64 dst, int reg_num)
351355
{
352-
gen_helper_greg_read_pair(dst, tcg_env, tcg_constant_tl(reg_num));
356+
if (reg_num == HEX_GREG_G0 || reg_num == HEX_GREG_G2) {
357+
tcg_gen_concat_i32_i64(dst, hex_greg[reg_num], hex_greg[reg_num + 1]);
358+
} else {
359+
gen_helper_greg_read_pair(dst, tcg_env, tcg_constant_tl(reg_num));
360+
}
353361
}
354362
#endif
355363

target/hexagon/op_helper.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2412,16 +2412,16 @@ void HELPER(sreg_write_pair)(CPUHexagonState *env, uint32_t reg, uint64_t val)
24122412
uint32_t HELPER(greg_read)(CPUHexagonState *env, uint32_t reg)
24132413

24142414
{
2415+
/* Check should be done before calling this helper */
2416+
g_assert(reg > HEX_GREG_G3);
24152417
return hexagon_greg_read(env, reg);
24162418
}
24172419

24182420
uint64_t HELPER(greg_read_pair)(CPUHexagonState *env, uint32_t reg)
24192421

24202422
{
2421-
if (reg == HEX_GREG_G0 || reg == HEX_GREG_G2) {
2422-
return (uint64_t)(env->greg[reg]) |
2423-
(((uint64_t)(env->greg[reg + 1])) << 32);
2424-
}
2423+
/* Check should be done before calling this helper */
2424+
g_assert(reg > HEX_GREG_G3);
24252425
switch (reg) {
24262426
case HEX_GREG_GPCYCLELO: {
24272427
target_ulong ssr = ARCH_GET_SYSTEM_REG(env, HEX_SREG_SSR);

0 commit comments

Comments
 (0)