tcg: Simplify logic using TCG_OPF_NOT_PRESENT
Expand the definition of "not present" to include "should not be present". This means we can simplify the logic surrounding the generic tcg opcodes for which the host backend ought not be providing definitions. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
4ef76952bd
commit
c1a61f6c85
@ -27,17 +27,21 @@
|
||||
*/
|
||||
|
||||
/* predefined ops */
|
||||
DEF(end, 0, 0, 0, 0) /* must be kept first */
|
||||
DEF(nop, 0, 0, 0, 0)
|
||||
DEF(nop1, 0, 0, 1, 0)
|
||||
DEF(nop2, 0, 0, 2, 0)
|
||||
DEF(nop3, 0, 0, 3, 0)
|
||||
DEF(nopn, 0, 0, 1, 0) /* variable number of parameters */
|
||||
DEF(end, 0, 0, 0, TCG_OPF_NOT_PRESENT) /* must be kept first */
|
||||
DEF(nop, 0, 0, 0, TCG_OPF_NOT_PRESENT)
|
||||
DEF(nop1, 0, 0, 1, TCG_OPF_NOT_PRESENT)
|
||||
DEF(nop2, 0, 0, 2, TCG_OPF_NOT_PRESENT)
|
||||
DEF(nop3, 0, 0, 3, TCG_OPF_NOT_PRESENT)
|
||||
|
||||
DEF(discard, 1, 0, 0, 0)
|
||||
/* variable number of parameters */
|
||||
DEF(nopn, 0, 0, 1, TCG_OPF_NOT_PRESENT)
|
||||
|
||||
DEF(discard, 1, 0, 0, TCG_OPF_NOT_PRESENT)
|
||||
DEF(set_label, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
|
||||
|
||||
/* variable number of parameters */
|
||||
DEF(call, 0, 1, 2, TCG_OPF_CALL_CLOBBER)
|
||||
|
||||
DEF(set_label, 0, 0, 1, TCG_OPF_BB_END)
|
||||
DEF(call, 0, 1, 2, TCG_OPF_CALL_CLOBBER) /* variable number of parameters */
|
||||
DEF(br, 0, 0, 1, TCG_OPF_BB_END)
|
||||
|
||||
#define IMPL(X) (__builtin_constant_p(X) && !(X) ? TCG_OPF_NOT_PRESENT : 0)
|
||||
@ -166,9 +170,9 @@ DEF(muls2_i64, 2, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_muls2_i64))
|
||||
|
||||
/* QEMU specific */
|
||||
#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
|
||||
DEF(debug_insn_start, 0, 0, 2, 0)
|
||||
DEF(debug_insn_start, 0, 0, 2, TCG_OPF_NOT_PRESENT)
|
||||
#else
|
||||
DEF(debug_insn_start, 0, 0, 1, 0)
|
||||
DEF(debug_insn_start, 0, 0, 1, TCG_OPF_NOT_PRESENT)
|
||||
#endif
|
||||
DEF(exit_tb, 0, 0, 1, TCG_OPF_BB_END)
|
||||
DEF(goto_tb, 0, 0, 1, TCG_OPF_BB_END)
|
||||
|
@ -1160,9 +1160,7 @@ void tcg_add_target_add_op_defs(const TCGTargetOpDef *tdefs)
|
||||
i = 0;
|
||||
for (op = 0; op < ARRAY_SIZE(tcg_op_defs); op++) {
|
||||
const TCGOpDef *def = &tcg_op_defs[op];
|
||||
if (op < INDEX_op_call
|
||||
|| op == INDEX_op_debug_insn_start
|
||||
|| (def->flags & TCG_OPF_NOT_PRESENT)) {
|
||||
if (def->flags & TCG_OPF_NOT_PRESENT) {
|
||||
/* Wrong entry in op definitions? */
|
||||
if (def->used) {
|
||||
fprintf(stderr, "Invalid op definition for %s\n", def->name);
|
||||
|
@ -596,7 +596,8 @@ enum {
|
||||
TCG_OPF_SIDE_EFFECTS = 0x04,
|
||||
/* Instruction operands are 64-bits (otherwise 32-bits). */
|
||||
TCG_OPF_64BIT = 0x08,
|
||||
/* Instruction is optional and not implemented by the host. */
|
||||
/* Instruction is optional and not implemented by the host, or insn
|
||||
is generic and should not be implemened by the host. */
|
||||
TCG_OPF_NOT_PRESENT = 0x10,
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user