Re: [Qemu-devel] [PATCH for-4.1 v2 02/13] tcg: Return bool success from tcg_out_mov
On 3/17/19 8:03 PM, Aleksandar Markovic wrote: > This patch merely changes the interface, aborting on all failures, > of which there are currently none. > > > Why is this necessary? See patch 6, in which tcg/ppc tcg_out_mov returns false for moves between integer and vector registers. r~
Re: [Qemu-devel] [PATCH for-4.1 v2 02/13] tcg: Return bool success from tcg_out_mov
On Sunday, March 17, 2019, Richard Henderson wrote: > This patch merely changes the interface, aborting on all failures, > of which there are currently none. > > Why is this necessary? Aleksandar > Signed-off-by: Richard Henderson > --- > tcg/aarch64/tcg-target.inc.c | 5 +++-- > tcg/arm/tcg-target.inc.c | 7 +-- > tcg/i386/tcg-target.inc.c| 5 +++-- > tcg/mips/tcg-target.inc.c| 3 ++- > tcg/ppc/tcg-target.inc.c | 3 ++- > tcg/riscv/tcg-target.inc.c | 5 +++-- > tcg/s390/tcg-target.inc.c| 3 ++- > tcg/sparc/tcg-target.inc.c | 3 ++- > tcg/tcg.c| 14 ++ > tcg/tci/tcg-target.inc.c | 3 ++- > 10 files changed, 34 insertions(+), 17 deletions(-) > > diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c > index d57f9e500f..6ba9050d9a 100644 > --- a/tcg/aarch64/tcg-target.inc.c > +++ b/tcg/aarch64/tcg-target.inc.c > @@ -938,10 +938,10 @@ static void tcg_out_ldst(TCGContext *s, AArch64Insn > insn, TCGReg rd, > tcg_out_ldst_r(s, insn, rd, rn, TCG_TYPE_I64, TCG_REG_TMP); > } > > -static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg > arg) > +static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg > arg) > { > if (ret == arg) { > -return; > +return true; > } > switch (type) { > case TCG_TYPE_I32: > @@ -970,6 +970,7 @@ static void tcg_out_mov(TCGContext *s, TCGType type, > TCGReg ret, TCGReg arg) > default: > g_assert_not_reached(); > } > +return true; > } > > static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, > diff --git a/tcg/arm/tcg-target.inc.c b/tcg/arm/tcg-target.inc.c > index 2245a8aeb9..b303befa50 100644 > --- a/tcg/arm/tcg-target.inc.c > +++ b/tcg/arm/tcg-target.inc.c > @@ -2250,10 +2250,13 @@ static inline bool tcg_out_sti(TCGContext *s, > TCGType type, TCGArg val, > return false; > } > > -static inline void tcg_out_mov(TCGContext *s, TCGType type, > +static inline bool tcg_out_mov(TCGContext *s, TCGType type, > TCGReg ret, TCGReg arg) > { > -tcg_out_dat_reg(s, COND_AL, ARITH_MOV, ret, 0, arg, SHIFT_IMM_LSL(0)); > +if (ret != arg) { > +tcg_out_dat_reg(s, COND_AL, ARITH_MOV, ret, 0, arg, > SHIFT_IMM_LSL(0)); > +} > +return true; > } > > static inline void tcg_out_movi(TCGContext *s, TCGType type, > diff --git a/tcg/i386/tcg-target.inc.c b/tcg/i386/tcg-target.inc.c > index e0670e5098..7100cf7ac3 100644 > --- a/tcg/i386/tcg-target.inc.c > +++ b/tcg/i386/tcg-target.inc.c > @@ -808,12 +808,12 @@ static inline void tgen_arithr(TCGContext *s, int > subop, int dest, int src) > tcg_out_modrm(s, OPC_ARITH_GvEv + (subop << 3) + ext, dest, src); > } > > -static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg > arg) > +static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg > arg) > { > int rexw = 0; > > if (arg == ret) { > -return; > +return true; > } > switch (type) { > case TCG_TYPE_I64: > @@ -851,6 +851,7 @@ static void tcg_out_mov(TCGContext *s, TCGType type, > TCGReg ret, TCGReg arg) > default: > g_assert_not_reached(); > } > +return true; > } > > static void tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece, > diff --git a/tcg/mips/tcg-target.inc.c b/tcg/mips/tcg-target.inc.c > index 8a92e916dd..f31ebb43bf 100644 > --- a/tcg/mips/tcg-target.inc.c > +++ b/tcg/mips/tcg-target.inc.c > @@ -558,13 +558,14 @@ static inline void tcg_out_dsra(TCGContext *s, > TCGReg rd, TCGReg rt, TCGArg sa) > tcg_out_opc_sa64(s, OPC_DSRA, OPC_DSRA32, rd, rt, sa); > } > > -static inline void tcg_out_mov(TCGContext *s, TCGType type, > +static inline bool tcg_out_mov(TCGContext *s, TCGType type, > TCGReg ret, TCGReg arg) > { > /* Simple reg-reg move, optimising out the 'do nothing' case */ > if (ret != arg) { > tcg_out_opc_reg(s, OPC_OR, ret, arg, TCG_REG_ZERO); > } > +return true; > } > > static void tcg_out_movi(TCGContext *s, TCGType type, > diff --git a/tcg/ppc/tcg-target.inc.c b/tcg/ppc/tcg-target.inc.c > index 773690f1d9..ec8e336be8 100644 > --- a/tcg/ppc/tcg-target.inc.c > +++ b/tcg/ppc/tcg-target.inc.c > @@ -566,12 +566,13 @@ static bool patch_reloc(tcg_insn_unit *code_ptr, int > type, > static void tcg_out_mem_long(TCGContext *s, int opi, int opx, TCGReg rt, > TCGReg base, tcg_target_long offset); > > -static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg > arg) > +static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg > arg) > { > tcg_debug_assert(TCG_TARGET_REG_BITS == 64 || type == TCG_TYPE_I32); > if (ret != arg) { > tcg_out32(s, OR | SAB(arg, ret, arg)); > } > +return true; > } > > static inline void tcg_out_rld(TCGContext *s, int op, TCGReg ra, TCGReg > rs, > diff --git
Re: [Qemu-devel] [PATCH for-4.1 v2 02/13] tcg: Return bool success from tcg_out_mov
On Sun, Mar 17, 2019 at 02:08:23AM -0700, Richard Henderson wrote: > This patch merely changes the interface, aborting on all failures, > of which there are currently none. > > Signed-off-by: Richard Henderson Reviewed-by: David Gibson > --- > tcg/aarch64/tcg-target.inc.c | 5 +++-- > tcg/arm/tcg-target.inc.c | 7 +-- > tcg/i386/tcg-target.inc.c| 5 +++-- > tcg/mips/tcg-target.inc.c| 3 ++- > tcg/ppc/tcg-target.inc.c | 3 ++- > tcg/riscv/tcg-target.inc.c | 5 +++-- > tcg/s390/tcg-target.inc.c| 3 ++- > tcg/sparc/tcg-target.inc.c | 3 ++- > tcg/tcg.c| 14 ++ > tcg/tci/tcg-target.inc.c | 3 ++- > 10 files changed, 34 insertions(+), 17 deletions(-) > > diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c > index d57f9e500f..6ba9050d9a 100644 > --- a/tcg/aarch64/tcg-target.inc.c > +++ b/tcg/aarch64/tcg-target.inc.c > @@ -938,10 +938,10 @@ static void tcg_out_ldst(TCGContext *s, AArch64Insn > insn, TCGReg rd, > tcg_out_ldst_r(s, insn, rd, rn, TCG_TYPE_I64, TCG_REG_TMP); > } > > -static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) > +static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) > { > if (ret == arg) { > -return; > +return true; > } > switch (type) { > case TCG_TYPE_I32: > @@ -970,6 +970,7 @@ static void tcg_out_mov(TCGContext *s, TCGType type, > TCGReg ret, TCGReg arg) > default: > g_assert_not_reached(); > } > +return true; > } > > static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, > diff --git a/tcg/arm/tcg-target.inc.c b/tcg/arm/tcg-target.inc.c > index 2245a8aeb9..b303befa50 100644 > --- a/tcg/arm/tcg-target.inc.c > +++ b/tcg/arm/tcg-target.inc.c > @@ -2250,10 +2250,13 @@ static inline bool tcg_out_sti(TCGContext *s, TCGType > type, TCGArg val, > return false; > } > > -static inline void tcg_out_mov(TCGContext *s, TCGType type, > +static inline bool tcg_out_mov(TCGContext *s, TCGType type, > TCGReg ret, TCGReg arg) > { > -tcg_out_dat_reg(s, COND_AL, ARITH_MOV, ret, 0, arg, SHIFT_IMM_LSL(0)); > +if (ret != arg) { > +tcg_out_dat_reg(s, COND_AL, ARITH_MOV, ret, 0, arg, > SHIFT_IMM_LSL(0)); > +} > +return true; > } > > static inline void tcg_out_movi(TCGContext *s, TCGType type, > diff --git a/tcg/i386/tcg-target.inc.c b/tcg/i386/tcg-target.inc.c > index e0670e5098..7100cf7ac3 100644 > --- a/tcg/i386/tcg-target.inc.c > +++ b/tcg/i386/tcg-target.inc.c > @@ -808,12 +808,12 @@ static inline void tgen_arithr(TCGContext *s, int > subop, int dest, int src) > tcg_out_modrm(s, OPC_ARITH_GvEv + (subop << 3) + ext, dest, src); > } > > -static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) > +static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) > { > int rexw = 0; > > if (arg == ret) { > -return; > +return true; > } > switch (type) { > case TCG_TYPE_I64: > @@ -851,6 +851,7 @@ static void tcg_out_mov(TCGContext *s, TCGType type, > TCGReg ret, TCGReg arg) > default: > g_assert_not_reached(); > } > +return true; > } > > static void tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece, > diff --git a/tcg/mips/tcg-target.inc.c b/tcg/mips/tcg-target.inc.c > index 8a92e916dd..f31ebb43bf 100644 > --- a/tcg/mips/tcg-target.inc.c > +++ b/tcg/mips/tcg-target.inc.c > @@ -558,13 +558,14 @@ static inline void tcg_out_dsra(TCGContext *s, TCGReg > rd, TCGReg rt, TCGArg sa) > tcg_out_opc_sa64(s, OPC_DSRA, OPC_DSRA32, rd, rt, sa); > } > > -static inline void tcg_out_mov(TCGContext *s, TCGType type, > +static inline bool tcg_out_mov(TCGContext *s, TCGType type, > TCGReg ret, TCGReg arg) > { > /* Simple reg-reg move, optimising out the 'do nothing' case */ > if (ret != arg) { > tcg_out_opc_reg(s, OPC_OR, ret, arg, TCG_REG_ZERO); > } > +return true; > } > > static void tcg_out_movi(TCGContext *s, TCGType type, > diff --git a/tcg/ppc/tcg-target.inc.c b/tcg/ppc/tcg-target.inc.c > index 773690f1d9..ec8e336be8 100644 > --- a/tcg/ppc/tcg-target.inc.c > +++ b/tcg/ppc/tcg-target.inc.c > @@ -566,12 +566,13 @@ static bool patch_reloc(tcg_insn_unit *code_ptr, int > type, > static void tcg_out_mem_long(TCGContext *s, int opi, int opx, TCGReg rt, > TCGReg base, tcg_target_long offset); > > -static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) > +static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) > { > tcg_debug_assert(TCG_TARGET_REG_BITS == 64 || type == TCG_TYPE_I32); > if (ret != arg) { > tcg_out32(s, OR | SAB(arg, ret, arg)); > } > +return true; > } > > static inline void tcg_out_rld(TCGContext *s, int op, TCGReg ra, TCGReg
[Qemu-devel] [PATCH for-4.1 v2 02/13] tcg: Return bool success from tcg_out_mov
This patch merely changes the interface, aborting on all failures, of which there are currently none. Signed-off-by: Richard Henderson --- tcg/aarch64/tcg-target.inc.c | 5 +++-- tcg/arm/tcg-target.inc.c | 7 +-- tcg/i386/tcg-target.inc.c| 5 +++-- tcg/mips/tcg-target.inc.c| 3 ++- tcg/ppc/tcg-target.inc.c | 3 ++- tcg/riscv/tcg-target.inc.c | 5 +++-- tcg/s390/tcg-target.inc.c| 3 ++- tcg/sparc/tcg-target.inc.c | 3 ++- tcg/tcg.c| 14 ++ tcg/tci/tcg-target.inc.c | 3 ++- 10 files changed, 34 insertions(+), 17 deletions(-) diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c index d57f9e500f..6ba9050d9a 100644 --- a/tcg/aarch64/tcg-target.inc.c +++ b/tcg/aarch64/tcg-target.inc.c @@ -938,10 +938,10 @@ static void tcg_out_ldst(TCGContext *s, AArch64Insn insn, TCGReg rd, tcg_out_ldst_r(s, insn, rd, rn, TCG_TYPE_I64, TCG_REG_TMP); } -static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) +static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) { if (ret == arg) { -return; +return true; } switch (type) { case TCG_TYPE_I32: @@ -970,6 +970,7 @@ static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) default: g_assert_not_reached(); } +return true; } static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, diff --git a/tcg/arm/tcg-target.inc.c b/tcg/arm/tcg-target.inc.c index 2245a8aeb9..b303befa50 100644 --- a/tcg/arm/tcg-target.inc.c +++ b/tcg/arm/tcg-target.inc.c @@ -2250,10 +2250,13 @@ static inline bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val, return false; } -static inline void tcg_out_mov(TCGContext *s, TCGType type, +static inline bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) { -tcg_out_dat_reg(s, COND_AL, ARITH_MOV, ret, 0, arg, SHIFT_IMM_LSL(0)); +if (ret != arg) { +tcg_out_dat_reg(s, COND_AL, ARITH_MOV, ret, 0, arg, SHIFT_IMM_LSL(0)); +} +return true; } static inline void tcg_out_movi(TCGContext *s, TCGType type, diff --git a/tcg/i386/tcg-target.inc.c b/tcg/i386/tcg-target.inc.c index e0670e5098..7100cf7ac3 100644 --- a/tcg/i386/tcg-target.inc.c +++ b/tcg/i386/tcg-target.inc.c @@ -808,12 +808,12 @@ static inline void tgen_arithr(TCGContext *s, int subop, int dest, int src) tcg_out_modrm(s, OPC_ARITH_GvEv + (subop << 3) + ext, dest, src); } -static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) +static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) { int rexw = 0; if (arg == ret) { -return; +return true; } switch (type) { case TCG_TYPE_I64: @@ -851,6 +851,7 @@ static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) default: g_assert_not_reached(); } +return true; } static void tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece, diff --git a/tcg/mips/tcg-target.inc.c b/tcg/mips/tcg-target.inc.c index 8a92e916dd..f31ebb43bf 100644 --- a/tcg/mips/tcg-target.inc.c +++ b/tcg/mips/tcg-target.inc.c @@ -558,13 +558,14 @@ static inline void tcg_out_dsra(TCGContext *s, TCGReg rd, TCGReg rt, TCGArg sa) tcg_out_opc_sa64(s, OPC_DSRA, OPC_DSRA32, rd, rt, sa); } -static inline void tcg_out_mov(TCGContext *s, TCGType type, +static inline bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) { /* Simple reg-reg move, optimising out the 'do nothing' case */ if (ret != arg) { tcg_out_opc_reg(s, OPC_OR, ret, arg, TCG_REG_ZERO); } +return true; } static void tcg_out_movi(TCGContext *s, TCGType type, diff --git a/tcg/ppc/tcg-target.inc.c b/tcg/ppc/tcg-target.inc.c index 773690f1d9..ec8e336be8 100644 --- a/tcg/ppc/tcg-target.inc.c +++ b/tcg/ppc/tcg-target.inc.c @@ -566,12 +566,13 @@ static bool patch_reloc(tcg_insn_unit *code_ptr, int type, static void tcg_out_mem_long(TCGContext *s, int opi, int opx, TCGReg rt, TCGReg base, tcg_target_long offset); -static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) +static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) { tcg_debug_assert(TCG_TARGET_REG_BITS == 64 || type == TCG_TYPE_I32); if (ret != arg) { tcg_out32(s, OR | SAB(arg, ret, arg)); } +return true; } static inline void tcg_out_rld(TCGContext *s, int op, TCGReg ra, TCGReg rs, diff --git a/tcg/riscv/tcg-target.inc.c b/tcg/riscv/tcg-target.inc.c index b785f4acb7..e2bf1c2c6e 100644 --- a/tcg/riscv/tcg-target.inc.c +++ b/tcg/riscv/tcg-target.inc.c @@ -515,10 +515,10 @@ static bool patch_reloc(tcg_insn_unit *code_ptr, int type, * TCG intrinsics */ -static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) +static