Signed-off-by: Richard Henderson <richard.hender...@linaro.org> --- include/tcg/tcg.h | 1 + tcg/tcg.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+)
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h index d8591d6c9e..a27b8d77e9 100644 --- a/include/tcg/tcg.h +++ b/include/tcg/tcg.h @@ -831,6 +831,7 @@ typedef struct TCGTargetOpDef { } TCGTargetOpDef; bool tcg_op_supported(TCGOpcode op, TCGType type); +bool tcg_op_deposit_valid(TCGType type, unsigned ofs, unsigned len); void tcg_gen_call0(void *func, TCGHelperInfo *, TCGTemp *ret); void tcg_gen_call1(void *func, TCGHelperInfo *, TCGTemp *ret, TCGTemp *); diff --git a/tcg/tcg.c b/tcg/tcg.c index 3a0ad03fd5..657534c6a9 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -2254,6 +2254,28 @@ bool tcg_op_supported(TCGOpcode op, TCGType type) } } +bool tcg_op_deposit_valid(TCGType type, unsigned ofs, unsigned len) +{ + switch (type) { + case TCG_TYPE_I32: + tcg_debug_assert(ofs < 32); + tcg_debug_assert(len > 0); + tcg_debug_assert(len <= 32); + tcg_debug_assert(ofs + len <= 32); + return TCG_TARGET_HAS_deposit_i32 && TCG_TARGET_deposit_i32_valid(ofs, len); + + case TCG_TYPE_I64: + tcg_debug_assert(ofs < 64); + tcg_debug_assert(len > 0); + tcg_debug_assert(len <= 64); + tcg_debug_assert(ofs + len <= 64); + return TCG_TARGET_HAS_deposit_i64 && TCG_TARGET_deposit_i64_valid(ofs, len); + + default: + g_assert_not_reached(); + } +} + static TCGOp *tcg_op_alloc(TCGOpcode opc, TCGType type, unsigned nargs); static void tcg_gen_callN(void *func, TCGHelperInfo *info, -- 2.43.0