tcg: Add tcg_op_imm_match

Create a function to test whether the second operand of a
binary operation allows a given immediate.

Reviewed-by: Jim MacArthur <jim.macarthur@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
[rth: Split out from a larger patch; keep the declaration internal.]
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-ID: <20260303010833.1115741-6-richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
Paolo Bonzini
2026-02-03 08:53:53 +01:00
committed by Philippe Mathieu-Daudé
parent 6cced95c28
commit bb5b6bbb10
2 changed files with 22 additions and 4 deletions

View File

@@ -100,4 +100,9 @@ TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *op,
TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op,
TCGOpcode, TCGType, unsigned nargs);
/*
* For a binary opcode OP, return true if the second input operand allows IMM.
*/
bool tcg_op_imm_match(TCGOpcode op, TCGType type, tcg_target_ulong imm);
#endif /* TCG_INTERNAL_H */

View File

@@ -3387,11 +3387,9 @@ static void process_constraint_sets(void)
}
}
static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
static const TCGArgConstraint *op_args_ct(TCGOpcode opc, TCGType type,
unsigned flags)
{
TCGOpcode opc = op->opc;
TCGType type = TCGOP_TYPE(op);
unsigned flags = TCGOP_FLAGS(op);
const TCGOpDef *def = &tcg_op_defs[opc];
const TCGOutOp *outop = all_outop[opc];
TCGConstraintSetIndex con_set;
@@ -3418,6 +3416,21 @@ static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
return all_cts[con_set];
}
static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
{
return op_args_ct(op->opc, TCGOP_TYPE(op), TCGOP_FLAGS(op));
}
bool tcg_op_imm_match(TCGOpcode opc, TCGType type, tcg_target_ulong imm)
{
const TCGArgConstraint *args_ct = op_args_ct(opc, type, 0);
const TCGOpDef *def = &tcg_op_defs[opc];
tcg_debug_assert(def->nb_oargs == 1);
tcg_debug_assert(def->nb_iargs == 2);
return tcg_target_const_match(imm, args_ct[2].ct, type, 0, 0);
}
static void remove_label_use(TCGOp *op, int idx)
{
TCGLabel *label = arg_label(op->args[idx]);