tcg/sparc: Introduce tcg_out_mov_delay
This version of tcg_out_mov is emits a nop to fill the delay slot if the move is not required. The only current use, for INDEX_op_goto_ptr, will always require the move but properly documents the delay slot. Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
897fd616fd
commit
220b2da7f3
|
@ -362,6 +362,11 @@ static bool tcg_target_const_match(int64_t val, TCGType type, int ct)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tcg_out_nop(TCGContext *s)
|
||||||
|
{
|
||||||
|
tcg_out32(s, NOP);
|
||||||
|
}
|
||||||
|
|
||||||
static void tcg_out_arith(TCGContext *s, TCGReg rd, TCGReg rs1,
|
static void tcg_out_arith(TCGContext *s, TCGReg rd, TCGReg rs1,
|
||||||
TCGReg rs2, int op)
|
TCGReg rs2, int op)
|
||||||
{
|
{
|
||||||
|
@ -389,6 +394,15 @@ static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tcg_out_mov_delay(TCGContext *s, TCGReg ret, TCGReg arg)
|
||||||
|
{
|
||||||
|
if (ret != arg) {
|
||||||
|
tcg_out_arith(s, ret, arg, TCG_REG_G0, ARITH_OR);
|
||||||
|
} else {
|
||||||
|
tcg_out_nop(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void tcg_out_sethi(TCGContext *s, TCGReg ret, uint32_t arg)
|
static void tcg_out_sethi(TCGContext *s, TCGReg ret, uint32_t arg)
|
||||||
{
|
{
|
||||||
tcg_out32(s, SETHI | INSN_RD(ret) | ((arg & 0xfffffc00) >> 10));
|
tcg_out32(s, SETHI | INSN_RD(ret) | ((arg & 0xfffffc00) >> 10));
|
||||||
|
@ -551,11 +565,6 @@ static void tcg_out_div32(TCGContext *s, TCGReg rd, TCGReg rs1,
|
||||||
uns ? ARITH_UDIV : ARITH_SDIV);
|
uns ? ARITH_UDIV : ARITH_SDIV);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tcg_out_nop(TCGContext *s)
|
|
||||||
{
|
|
||||||
tcg_out32(s, NOP);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const uint8_t tcg_cond_to_bcond[] = {
|
static const uint8_t tcg_cond_to_bcond[] = {
|
||||||
[TCG_COND_EQ] = COND_E,
|
[TCG_COND_EQ] = COND_E,
|
||||||
[TCG_COND_NE] = COND_NE,
|
[TCG_COND_NE] = COND_NE,
|
||||||
|
@ -1349,7 +1358,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
||||||
case INDEX_op_goto_ptr:
|
case INDEX_op_goto_ptr:
|
||||||
tcg_out_arithi(s, TCG_REG_G0, a0, 0, JMPL);
|
tcg_out_arithi(s, TCG_REG_G0, a0, 0, JMPL);
|
||||||
if (USE_REG_TB) {
|
if (USE_REG_TB) {
|
||||||
tcg_out_arith(s, TCG_REG_TB, a0, TCG_REG_G0, ARITH_OR);
|
tcg_out_mov_delay(s, TCG_REG_TB, a0);
|
||||||
} else {
|
} else {
|
||||||
tcg_out_nop(s);
|
tcg_out_nop(s);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue