tcg/tci: Implement movcond
When this opcode is not available in the backend, tcg middle-end will expand this as a series of 5 opcodes. So implementing this saves bytecode space. Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
6eea04347e
commit
df093c19ef
16
tcg/tci.c
16
tcg/tci.c
@ -173,6 +173,7 @@ static void tci_args_rrrr(uint32_t insn,
|
||||
*r2 = extract32(insn, 16, 4);
|
||||
*r3 = extract32(insn, 20, 4);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void tci_args_rrrrrc(uint32_t insn, TCGReg *r0, TCGReg *r1,
|
||||
TCGReg *r2, TCGReg *r3, TCGReg *r4, TCGCond *c5)
|
||||
@ -185,6 +186,7 @@ static void tci_args_rrrrrc(uint32_t insn, TCGReg *r0, TCGReg *r1,
|
||||
*c5 = extract32(insn, 28, 4);
|
||||
}
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
static void tci_args_rrrrrr(uint32_t insn, TCGReg *r0, TCGReg *r1,
|
||||
TCGReg *r2, TCGReg *r3, TCGReg *r4, TCGReg *r5)
|
||||
{
|
||||
@ -422,6 +424,11 @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
|
||||
tci_args_rrrc(insn, &r0, &r1, &r2, &condition);
|
||||
regs[r0] = tci_compare32(regs[r1], regs[r2], condition);
|
||||
break;
|
||||
case INDEX_op_movcond_i32:
|
||||
tci_args_rrrrrc(insn, &r0, &r1, &r2, &r3, &r4, &condition);
|
||||
tmp32 = tci_compare32(regs[r1], regs[r2], condition);
|
||||
regs[r0] = regs[tmp32 ? r3 : r4];
|
||||
break;
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
case INDEX_op_setcond2_i32:
|
||||
tci_args_rrrrrc(insn, &r0, &r1, &r2, &r3, &r4, &condition);
|
||||
@ -434,6 +441,11 @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
|
||||
tci_args_rrrc(insn, &r0, &r1, &r2, &condition);
|
||||
regs[r0] = tci_compare64(regs[r1], regs[r2], condition);
|
||||
break;
|
||||
case INDEX_op_movcond_i64:
|
||||
tci_args_rrrrrc(insn, &r0, &r1, &r2, &r3, &r4, &condition);
|
||||
tmp32 = tci_compare64(regs[r1], regs[r2], condition);
|
||||
regs[r0] = regs[tmp32 ? r3 : r4];
|
||||
break;
|
||||
#endif
|
||||
CASE_32_64(mov)
|
||||
tci_args_rr(insn, &r0, &r1);
|
||||
@ -1139,7 +1151,8 @@ int print_insn_tci(bfd_vma addr, disassemble_info *info)
|
||||
op_name, str_r(r0), str_r(r1), str_r(r2), pos, len);
|
||||
break;
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
case INDEX_op_movcond_i32:
|
||||
case INDEX_op_movcond_i64:
|
||||
case INDEX_op_setcond2_i32:
|
||||
tci_args_rrrrrc(insn, &r0, &r1, &r2, &r3, &r4, &c);
|
||||
info->fprintf_func(info->stream, "%-12s %s, %s, %s, %s, %s, %s",
|
||||
@ -1147,6 +1160,7 @@ int print_insn_tci(bfd_vma addr, disassemble_info *info)
|
||||
str_r(r3), str_r(r4), str_c(c));
|
||||
break;
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
case INDEX_op_mulu2_i32:
|
||||
tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
|
||||
info->fprintf_func(info->stream, "%-12s %s, %s, %s, %s",
|
||||
|
@ -133,9 +133,12 @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
|
||||
return C_O0_I4(r, r, r, r);
|
||||
case INDEX_op_mulu2_i32:
|
||||
return C_O2_I2(r, r, r, r);
|
||||
#endif
|
||||
|
||||
case INDEX_op_movcond_i32:
|
||||
case INDEX_op_movcond_i64:
|
||||
case INDEX_op_setcond2_i32:
|
||||
return C_O1_I4(r, r, r, r, r);
|
||||
#endif
|
||||
|
||||
case INDEX_op_qemu_ld_i32:
|
||||
return (TARGET_LONG_BITS <= TCG_TARGET_REG_BITS
|
||||
@ -419,6 +422,7 @@ static void tcg_out_op_rrrr(TCGContext *s, TCGOpcode op,
|
||||
insn = deposit32(insn, 20, 4, r3);
|
||||
tcg_out32(s, insn);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void tcg_out_op_rrrrrc(TCGContext *s, TCGOpcode op,
|
||||
TCGReg r0, TCGReg r1, TCGReg r2,
|
||||
@ -436,6 +440,7 @@ static void tcg_out_op_rrrrrc(TCGContext *s, TCGOpcode op,
|
||||
tcg_out32(s, insn);
|
||||
}
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
static void tcg_out_op_rrrrrr(TCGContext *s, TCGOpcode op,
|
||||
TCGReg r0, TCGReg r1, TCGReg r2,
|
||||
TCGReg r3, TCGReg r4, TCGReg r5)
|
||||
@ -589,12 +594,11 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||
tcg_out_op_rrrc(s, opc, args[0], args[1], args[2], args[3]);
|
||||
break;
|
||||
|
||||
#if TCG_TARGET_REG_BITS == 32
|
||||
CASE_32_64(movcond)
|
||||
case INDEX_op_setcond2_i32:
|
||||
tcg_out_op_rrrrrc(s, opc, args[0], args[1], args[2],
|
||||
args[3], args[4], args[5]);
|
||||
break;
|
||||
#endif
|
||||
|
||||
CASE_32_64(ld8u)
|
||||
CASE_32_64(ld8s)
|
||||
|
@ -83,7 +83,7 @@
|
||||
#define TCG_TARGET_HAS_not_i32 1
|
||||
#define TCG_TARGET_HAS_orc_i32 0
|
||||
#define TCG_TARGET_HAS_rot_i32 1
|
||||
#define TCG_TARGET_HAS_movcond_i32 0
|
||||
#define TCG_TARGET_HAS_movcond_i32 1
|
||||
#define TCG_TARGET_HAS_muls2_i32 0
|
||||
#define TCG_TARGET_HAS_muluh_i32 0
|
||||
#define TCG_TARGET_HAS_mulsh_i32 0
|
||||
@ -120,7 +120,7 @@
|
||||
#define TCG_TARGET_HAS_not_i64 1
|
||||
#define TCG_TARGET_HAS_orc_i64 0
|
||||
#define TCG_TARGET_HAS_rot_i64 1
|
||||
#define TCG_TARGET_HAS_movcond_i64 0
|
||||
#define TCG_TARGET_HAS_movcond_i64 1
|
||||
#define TCG_TARGET_HAS_muls2_i64 0
|
||||
#define TCG_TARGET_HAS_add2_i32 0
|
||||
#define TCG_TARGET_HAS_sub2_i32 0
|
||||
|
Loading…
Reference in New Issue
Block a user