mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
tcg: Merge INDEX_op_{neg}setcond_{i32,i64}`
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
5a7b38c8ca
commit
a363e1e179
9 changed files with 39 additions and 66 deletions
|
@ -499,13 +499,13 @@ Conditional moves
|
|||
|
||||
.. list-table::
|
||||
|
||||
* - setcond_i32/i64 *dest*, *t1*, *t2*, *cond*
|
||||
* - setcond *dest*, *t1*, *t2*, *cond*
|
||||
|
||||
- | *dest* = (*t1* *cond* *t2*)
|
||||
|
|
||||
| Set *dest* to 1 if (*t1* *cond* *t2*) is true, otherwise set to 0.
|
||||
|
||||
* - negsetcond_i32/i64 *dest*, *t1*, *t2*, *cond*
|
||||
* - negsetcond *dest*, *t1*, *t2*, *cond*
|
||||
|
||||
- | *dest* = -(*t1* *cond* *t2*)
|
||||
|
|
||||
|
|
|
@ -57,6 +57,7 @@ DEF(mulu2, 2, 2, 0, TCG_OPF_INT)
|
|||
DEF(muluh, 1, 2, 0, TCG_OPF_INT)
|
||||
DEF(nand, 1, 2, 0, TCG_OPF_INT)
|
||||
DEF(neg, 1, 1, 0, TCG_OPF_INT)
|
||||
DEF(negsetcond, 1, 2, 1, TCG_OPF_INT)
|
||||
DEF(nor, 1, 2, 0, TCG_OPF_INT)
|
||||
DEF(not, 1, 1, 0, TCG_OPF_INT)
|
||||
DEF(or, 1, 2, 0, TCG_OPF_INT)
|
||||
|
@ -66,13 +67,12 @@ DEF(remu, 1, 2, 0, TCG_OPF_INT)
|
|||
DEF(rotl, 1, 2, 0, TCG_OPF_INT)
|
||||
DEF(rotr, 1, 2, 0, TCG_OPF_INT)
|
||||
DEF(sar, 1, 2, 0, TCG_OPF_INT)
|
||||
DEF(setcond, 1, 2, 1, TCG_OPF_INT)
|
||||
DEF(shl, 1, 2, 0, TCG_OPF_INT)
|
||||
DEF(shr, 1, 2, 0, TCG_OPF_INT)
|
||||
DEF(sub, 1, 2, 0, TCG_OPF_INT)
|
||||
DEF(xor, 1, 2, 0, TCG_OPF_INT)
|
||||
|
||||
DEF(setcond_i32, 1, 2, 1, 0)
|
||||
DEF(negsetcond_i32, 1, 2, 1, 0)
|
||||
DEF(movcond_i32, 1, 4, 1, 0)
|
||||
/* load/store */
|
||||
DEF(ld8u_i32, 1, 1, 1, 0)
|
||||
|
@ -99,8 +99,6 @@ DEF(setcond2_i32, 1, 4, 1, 0)
|
|||
DEF(bswap16_i32, 1, 1, 1, 0)
|
||||
DEF(bswap32_i32, 1, 1, 1, 0)
|
||||
|
||||
DEF(setcond_i64, 1, 2, 1, 0)
|
||||
DEF(negsetcond_i64, 1, 2, 1, 0)
|
||||
DEF(movcond_i64, 1, 4, 1, 0)
|
||||
/* load/store */
|
||||
DEF(ld8u_i64, 1, 1, 1, 0)
|
||||
|
|
|
@ -1995,7 +1995,7 @@ static void decode_gusa(DisasContext *ctx, CPUSH4State *env)
|
|||
if ((ld_dst == B11_8) + (ld_dst == B7_4) != 1 || mv_src >= 0) {
|
||||
goto fail;
|
||||
}
|
||||
op_opc = INDEX_op_setcond_i32; /* placeholder */
|
||||
op_opc = INDEX_op_setcond; /* placeholder */
|
||||
op_src = (ld_dst == B11_8 ? B7_4 : B11_8);
|
||||
op_arg = REG(op_src);
|
||||
|
||||
|
@ -2030,7 +2030,7 @@ static void decode_gusa(DisasContext *ctx, CPUSH4State *env)
|
|||
if (ld_dst != B11_8 || ld_dst != B7_4 || mv_src >= 0) {
|
||||
goto fail;
|
||||
}
|
||||
op_opc = INDEX_op_setcond_i32;
|
||||
op_opc = INDEX_op_setcond;
|
||||
op_arg = tcg_constant_i32(0);
|
||||
|
||||
NEXT_INSN;
|
||||
|
@ -2147,7 +2147,7 @@ static void decode_gusa(DisasContext *ctx, CPUSH4State *env)
|
|||
}
|
||||
break;
|
||||
|
||||
case INDEX_op_setcond_i32:
|
||||
case INDEX_op_setcond:
|
||||
if (st_src == ld_dst) {
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
@ -1996,35 +1996,19 @@ static bool fold_movcond(OptContext *ctx, TCGOp *op)
|
|||
if (ti_is_const(tt) && ti_is_const(ft)) {
|
||||
uint64_t tv = ti_const_val(tt);
|
||||
uint64_t fv = ti_const_val(ft);
|
||||
TCGOpcode opc, negopc;
|
||||
TCGCond cond = op->args[5];
|
||||
|
||||
switch (ctx->type) {
|
||||
case TCG_TYPE_I32:
|
||||
opc = INDEX_op_setcond_i32;
|
||||
negopc = INDEX_op_negsetcond_i32;
|
||||
tv = (int32_t)tv;
|
||||
fv = (int32_t)fv;
|
||||
break;
|
||||
case TCG_TYPE_I64:
|
||||
opc = INDEX_op_setcond_i64;
|
||||
negopc = INDEX_op_negsetcond_i64;
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
if (tv == 1 && fv == 0) {
|
||||
op->opc = opc;
|
||||
op->opc = INDEX_op_setcond;
|
||||
op->args[3] = cond;
|
||||
} else if (fv == 1 && tv == 0) {
|
||||
op->opc = opc;
|
||||
op->opc = INDEX_op_setcond;
|
||||
op->args[3] = tcg_invert_cond(cond);
|
||||
} else if (tv == -1 && fv == 0) {
|
||||
op->opc = negopc;
|
||||
op->opc = INDEX_op_negsetcond;
|
||||
op->args[3] = cond;
|
||||
} else if (fv == -1 && tv == 0) {
|
||||
op->opc = negopc;
|
||||
op->opc = INDEX_op_negsetcond;
|
||||
op->args[3] = tcg_invert_cond(cond);
|
||||
}
|
||||
}
|
||||
|
@ -2526,14 +2510,14 @@ static bool fold_setcond2(OptContext *ctx, TCGOp *op)
|
|||
do_setcond_low:
|
||||
op->args[2] = op->args[3];
|
||||
op->args[3] = cond;
|
||||
op->opc = INDEX_op_setcond_i32;
|
||||
op->opc = INDEX_op_setcond;
|
||||
return fold_setcond(ctx, op);
|
||||
|
||||
do_setcond_high:
|
||||
op->args[1] = op->args[2];
|
||||
op->args[2] = op->args[4];
|
||||
op->args[3] = cond;
|
||||
op->opc = INDEX_op_setcond_i32;
|
||||
op->opc = INDEX_op_setcond;
|
||||
return fold_setcond(ctx, op);
|
||||
}
|
||||
|
||||
|
@ -3025,10 +3009,10 @@ void tcg_optimize(TCGContext *s)
|
|||
case INDEX_op_shr:
|
||||
done = fold_shift(&ctx, op);
|
||||
break;
|
||||
CASE_OP_32_64(setcond):
|
||||
case INDEX_op_setcond:
|
||||
done = fold_setcond(&ctx, op);
|
||||
break;
|
||||
CASE_OP_32_64(negsetcond):
|
||||
case INDEX_op_negsetcond:
|
||||
done = fold_negsetcond(&ctx, op);
|
||||
break;
|
||||
case INDEX_op_setcond2_i32:
|
||||
|
|
|
@ -552,7 +552,7 @@ void tcg_gen_setcond_i32(TCGCond cond, TCGv_i32 ret,
|
|||
} else if (cond == TCG_COND_NEVER) {
|
||||
tcg_gen_movi_i32(ret, 0);
|
||||
} else {
|
||||
tcg_gen_op4i_i32(INDEX_op_setcond_i32, ret, arg1, arg2, cond);
|
||||
tcg_gen_op4i_i32(INDEX_op_setcond, ret, arg1, arg2, cond);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -570,7 +570,7 @@ void tcg_gen_negsetcond_i32(TCGCond cond, TCGv_i32 ret,
|
|||
} else if (cond == TCG_COND_NEVER) {
|
||||
tcg_gen_movi_i32(ret, 0);
|
||||
} else {
|
||||
tcg_gen_op4i_i32(INDEX_op_negsetcond_i32, ret, arg1, arg2, cond);
|
||||
tcg_gen_op4i_i32(INDEX_op_negsetcond, ret, arg1, arg2, cond);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1911,7 +1911,7 @@ void tcg_gen_setcond_i64(TCGCond cond, TCGv_i64 ret,
|
|||
TCGV_LOW(arg2), TCGV_HIGH(arg2), cond);
|
||||
tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
|
||||
} else {
|
||||
tcg_gen_op4i_i64(INDEX_op_setcond_i64, ret, arg1, arg2, cond);
|
||||
tcg_gen_op4i_i64(INDEX_op_setcond, ret, arg1, arg2, cond);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1948,7 +1948,7 @@ void tcg_gen_negsetcond_i64(TCGCond cond, TCGv_i64 ret,
|
|||
} else if (cond == TCG_COND_NEVER) {
|
||||
tcg_gen_movi_i64(ret, 0);
|
||||
} else if (TCG_TARGET_REG_BITS == 64) {
|
||||
tcg_gen_op4i_i64(INDEX_op_negsetcond_i64, ret, arg1, arg2, cond);
|
||||
tcg_gen_op4i_i64(INDEX_op_negsetcond, ret, arg1, arg2, cond);
|
||||
} else {
|
||||
tcg_gen_op6i_i32(INDEX_op_setcond2_i32, TCGV_LOW(ret),
|
||||
TCGV_LOW(arg1), TCGV_HIGH(arg1),
|
||||
|
|
30
tcg/tcg.c
30
tcg/tcg.c
|
@ -1055,8 +1055,7 @@ static const TCGOutOp * const all_outop[NB_OPS] = {
|
|||
OUTOP(INDEX_op_muluh, TCGOutOpBinary, outop_muluh),
|
||||
OUTOP(INDEX_op_nand, TCGOutOpBinary, outop_nand),
|
||||
OUTOP(INDEX_op_neg, TCGOutOpUnary, outop_neg),
|
||||
OUTOP(INDEX_op_negsetcond_i32, TCGOutOpSetcond, outop_negsetcond),
|
||||
OUTOP(INDEX_op_negsetcond_i64, TCGOutOpSetcond, outop_negsetcond),
|
||||
OUTOP(INDEX_op_negsetcond, TCGOutOpSetcond, outop_negsetcond),
|
||||
OUTOP(INDEX_op_nor, TCGOutOpBinary, outop_nor),
|
||||
OUTOP(INDEX_op_not, TCGOutOpUnary, outop_not),
|
||||
OUTOP(INDEX_op_or, TCGOutOpBinary, outop_or),
|
||||
|
@ -1066,8 +1065,7 @@ static const TCGOutOp * const all_outop[NB_OPS] = {
|
|||
OUTOP(INDEX_op_rotl, TCGOutOpBinary, outop_rotl),
|
||||
OUTOP(INDEX_op_rotr, TCGOutOpBinary, outop_rotr),
|
||||
OUTOP(INDEX_op_sar, TCGOutOpBinary, outop_sar),
|
||||
OUTOP(INDEX_op_setcond_i32, TCGOutOpSetcond, outop_setcond),
|
||||
OUTOP(INDEX_op_setcond_i64, TCGOutOpSetcond, outop_setcond),
|
||||
OUTOP(INDEX_op_setcond, TCGOutOpSetcond, outop_setcond),
|
||||
OUTOP(INDEX_op_shl, TCGOutOpBinary, outop_shl),
|
||||
OUTOP(INDEX_op_shr, TCGOutOpBinary, outop_shr),
|
||||
OUTOP(INDEX_op_sub, TCGOutOpSubtract, outop_sub),
|
||||
|
@ -2275,12 +2273,12 @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
|
|||
case INDEX_op_add:
|
||||
case INDEX_op_and:
|
||||
case INDEX_op_mov:
|
||||
case INDEX_op_negsetcond:
|
||||
case INDEX_op_or:
|
||||
case INDEX_op_setcond:
|
||||
case INDEX_op_xor:
|
||||
return has_type;
|
||||
|
||||
case INDEX_op_setcond_i32:
|
||||
case INDEX_op_negsetcond_i32:
|
||||
case INDEX_op_brcond_i32:
|
||||
case INDEX_op_movcond_i32:
|
||||
case INDEX_op_ld8u_i32:
|
||||
|
@ -2311,8 +2309,6 @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
|
|||
case INDEX_op_setcond2_i32:
|
||||
return TCG_TARGET_REG_BITS == 32;
|
||||
|
||||
case INDEX_op_setcond_i64:
|
||||
case INDEX_op_negsetcond_i64:
|
||||
case INDEX_op_brcond_i64:
|
||||
case INDEX_op_movcond_i64:
|
||||
case INDEX_op_ld8u_i64:
|
||||
|
@ -2864,14 +2860,12 @@ void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs)
|
|||
}
|
||||
switch (c) {
|
||||
case INDEX_op_brcond_i32:
|
||||
case INDEX_op_setcond_i32:
|
||||
case INDEX_op_negsetcond_i32:
|
||||
case INDEX_op_setcond:
|
||||
case INDEX_op_negsetcond:
|
||||
case INDEX_op_movcond_i32:
|
||||
case INDEX_op_brcond2_i32:
|
||||
case INDEX_op_setcond2_i32:
|
||||
case INDEX_op_brcond_i64:
|
||||
case INDEX_op_setcond_i64:
|
||||
case INDEX_op_negsetcond_i64:
|
||||
case INDEX_op_movcond_i64:
|
||||
case INDEX_op_cmp_vec:
|
||||
case INDEX_op_cmpsel_vec:
|
||||
|
@ -5068,10 +5062,8 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
|
|||
case INDEX_op_brcond_i64:
|
||||
op_cond = op->args[2];
|
||||
break;
|
||||
case INDEX_op_setcond_i32:
|
||||
case INDEX_op_setcond_i64:
|
||||
case INDEX_op_negsetcond_i32:
|
||||
case INDEX_op_negsetcond_i64:
|
||||
case INDEX_op_setcond:
|
||||
case INDEX_op_negsetcond:
|
||||
case INDEX_op_cmp_vec:
|
||||
op_cond = op->args[3];
|
||||
break;
|
||||
|
@ -5494,10 +5486,8 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
|
|||
}
|
||||
break;
|
||||
|
||||
case INDEX_op_setcond_i32:
|
||||
case INDEX_op_setcond_i64:
|
||||
case INDEX_op_negsetcond_i32:
|
||||
case INDEX_op_negsetcond_i64:
|
||||
case INDEX_op_setcond:
|
||||
case INDEX_op_negsetcond:
|
||||
{
|
||||
const TCGOutOpSetcond *out =
|
||||
container_of(all_outop[op->opc], TCGOutOpSetcond, base);
|
||||
|
|
14
tcg/tci.c
14
tcg/tci.c
|
@ -438,10 +438,6 @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
|
|||
tci_args_l(insn, tb_ptr, &ptr);
|
||||
tb_ptr = ptr;
|
||||
continue;
|
||||
case INDEX_op_setcond_i32:
|
||||
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);
|
||||
|
@ -455,7 +451,7 @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
|
|||
regs[r0] = tci_compare64(T1, T2, condition);
|
||||
break;
|
||||
#elif TCG_TARGET_REG_BITS == 64
|
||||
case INDEX_op_setcond_i64:
|
||||
case INDEX_op_setcond:
|
||||
tci_args_rrrc(insn, &r0, &r1, &r2, &condition);
|
||||
regs[r0] = tci_compare64(regs[r1], regs[r2], condition);
|
||||
break;
|
||||
|
@ -628,6 +624,10 @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
|
|||
tmp32 = regs[r1];
|
||||
regs[r0] = tmp32 ? ctz32(tmp32) : regs[r2];
|
||||
break;
|
||||
case INDEX_op_tci_setcond32:
|
||||
tci_args_rrrc(insn, &r0, &r1, &r2, &condition);
|
||||
regs[r0] = tci_compare32(regs[r1], regs[r2], condition);
|
||||
break;
|
||||
|
||||
/* Shift/rotate operations. */
|
||||
|
||||
|
@ -971,8 +971,8 @@ int print_insn_tci(bfd_vma addr, disassemble_info *info)
|
|||
op_name, str_r(r0), ptr);
|
||||
break;
|
||||
|
||||
case INDEX_op_setcond_i32:
|
||||
case INDEX_op_setcond_i64:
|
||||
case INDEX_op_setcond:
|
||||
case INDEX_op_tci_setcond32:
|
||||
tci_args_rrrc(insn, &r0, &r1, &r2, &c);
|
||||
info->fprintf_func(info->stream, "%-12s %s, %s, %s, %s",
|
||||
op_name, str_r(r0), str_r(r1), str_r(r2), str_c(c));
|
||||
|
|
|
@ -10,3 +10,4 @@ DEF(tci_rems32, 1, 2, 0, TCG_OPF_NOT_PRESENT)
|
|||
DEF(tci_remu32, 1, 2, 0, TCG_OPF_NOT_PRESENT)
|
||||
DEF(tci_rotl32, 1, 2, 0, TCG_OPF_NOT_PRESENT)
|
||||
DEF(tci_rotr32, 1, 2, 0, TCG_OPF_NOT_PRESENT)
|
||||
DEF(tci_setcond32, 1, 2, 1, TCG_OPF_NOT_PRESENT)
|
||||
|
|
|
@ -942,8 +942,8 @@ static void tgen_setcond(TCGContext *s, TCGType type, TCGCond cond,
|
|||
TCGReg dest, TCGReg arg1, TCGReg arg2)
|
||||
{
|
||||
TCGOpcode opc = (type == TCG_TYPE_I32
|
||||
? INDEX_op_setcond_i32
|
||||
: INDEX_op_setcond_i64);
|
||||
? INDEX_op_tci_setcond32
|
||||
: INDEX_op_setcond);
|
||||
tcg_out_op_rrrc(s, opc, dest, arg1, arg2, cond);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue