tcg: Add tcg_op_deposit_valid

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2024-12-24 17:32:06 -08:00
parent 80a3a9423a
commit 0e4c6424d6
2 changed files with 27 additions and 0 deletions

View File

@ -840,6 +840,12 @@ typedef struct TCGTargetOpDef {
* on which we are currently executing.
*/
bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags);
/*
* tcg_op_deposit_valid:
* Query if a deposit into (ofs, len) is supported for @type by
* the host on which we are currently executing.
*/
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 *);

View File

@ -2238,6 +2238,27 @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
}
}
bool tcg_op_deposit_valid(TCGType type, unsigned ofs, unsigned len)
{
tcg_debug_assert(len > 0);
switch (type) {
case TCG_TYPE_I32:
tcg_debug_assert(ofs < 32);
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 <= 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, unsigned nargs);
static void tcg_gen_callN(void *func, TCGHelperInfo *info,