From: Paolo Bonzini <[email protected]> Create a function to test whether the second operand of a binary operation allows a given immediate.
Signed-off-by: Paolo Bonzini <[email protected]> [rth: Split out from a larger patch; keep the declaration internal.] Signed-off-by: Richard Henderson <[email protected]> --- tcg/tcg-internal.h | 5 +++++ tcg/tcg.c | 21 +++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/tcg/tcg-internal.h b/tcg/tcg-internal.h index 2cbfb5d5ca..c1ce50998e 100644 --- a/tcg/tcg-internal.h +++ b/tcg/tcg-internal.h @@ -94,4 +94,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 */ diff --git a/tcg/tcg.c b/tcg/tcg.c index e7bf4dad4e..778268f5cd 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -3391,11 +3391,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; @@ -3422,6 +3420,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]); -- 2.43.0
