mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
tcg/tci: Implement extract, sextract
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
a81520b92d
commit
0f10d7c5b0
3 changed files with 78 additions and 4 deletions
42
tcg/tci.c
42
tcg/tci.c
|
@ -126,6 +126,15 @@ static void tci_args_rrs(uint32_t insn, TCGReg *r0, TCGReg *r1, int32_t *i2)
|
|||
*i2 = sextract32(insn, 16, 16);
|
||||
}
|
||||
|
||||
static void tci_args_rrbb(uint32_t insn, TCGReg *r0, TCGReg *r1,
|
||||
uint8_t *i2, uint8_t *i3)
|
||||
{
|
||||
*r0 = extract32(insn, 8, 4);
|
||||
*r1 = extract32(insn, 12, 4);
|
||||
*i2 = extract32(insn, 16, 6);
|
||||
*i3 = extract32(insn, 22, 6);
|
||||
}
|
||||
|
||||
static void tci_args_rrrc(uint32_t insn,
|
||||
TCGReg *r0, TCGReg *r1, TCGReg *r2, TCGCond *c3)
|
||||
{
|
||||
|
@ -610,6 +619,18 @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
|
|||
tci_args_rrrbb(insn, &r0, &r1, &r2, &pos, &len);
|
||||
regs[r0] = deposit32(regs[r1], pos, len, regs[r2]);
|
||||
break;
|
||||
#endif
|
||||
#if TCG_TARGET_HAS_extract_i32
|
||||
case INDEX_op_extract_i32:
|
||||
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
|
||||
regs[r0] = extract32(regs[r1], pos, len);
|
||||
break;
|
||||
#endif
|
||||
#if TCG_TARGET_HAS_sextract_i32
|
||||
case INDEX_op_sextract_i32:
|
||||
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
|
||||
regs[r0] = sextract32(regs[r1], pos, len);
|
||||
break;
|
||||
#endif
|
||||
case INDEX_op_brcond_i32:
|
||||
tci_args_rl(insn, tb_ptr, &r0, &ptr);
|
||||
|
@ -750,6 +771,18 @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
|
|||
tci_args_rrrbb(insn, &r0, &r1, &r2, &pos, &len);
|
||||
regs[r0] = deposit64(regs[r1], pos, len, regs[r2]);
|
||||
break;
|
||||
#endif
|
||||
#if TCG_TARGET_HAS_extract_i64
|
||||
case INDEX_op_extract_i64:
|
||||
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
|
||||
regs[r0] = extract64(regs[r1], pos, len);
|
||||
break;
|
||||
#endif
|
||||
#if TCG_TARGET_HAS_sextract_i64
|
||||
case INDEX_op_sextract_i64:
|
||||
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
|
||||
regs[r0] = sextract64(regs[r1], pos, len);
|
||||
break;
|
||||
#endif
|
||||
case INDEX_op_brcond_i64:
|
||||
tci_args_rl(insn, tb_ptr, &r0, &ptr);
|
||||
|
@ -1191,6 +1224,15 @@ int print_insn_tci(bfd_vma addr, disassemble_info *info)
|
|||
op_name, str_r(r0), str_r(r1), str_r(r2), pos, len);
|
||||
break;
|
||||
|
||||
case INDEX_op_extract_i32:
|
||||
case INDEX_op_extract_i64:
|
||||
case INDEX_op_sextract_i32:
|
||||
case INDEX_op_sextract_i64:
|
||||
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
|
||||
info->fprintf_func(info->stream, "%-12s %s,%s,%d,%d",
|
||||
op_name, str_r(r0), str_r(r1), pos, len);
|
||||
break;
|
||||
|
||||
case INDEX_op_movcond_i32:
|
||||
case INDEX_op_movcond_i64:
|
||||
case INDEX_op_setcond2_i32:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue