Message ID | 20210311143958.562625-43-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | TCI fixes and cleanups | expand |
"And support mov_i64 on 32-bit host"? On 3/11/21 3:39 PM, Richard Henderson wrote: > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > tcg/tci/tcg-target.c.inc | 50 ++++++++++++++++++++++++++++------------ > 1 file changed, 35 insertions(+), 15 deletions(-) Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> > static void tcg_out_movi(TCGContext *s, TCGType type, > - TCGReg t0, tcg_target_long arg) > + TCGReg ret, tcg_target_long arg) > { > - uint8_t *old_code_ptr = s->code_ptr; > - uint32_t arg32 = arg; > - if (type == TCG_TYPE_I32 || arg == arg32) { > - tcg_out_op_t(s, INDEX_op_tci_movi_i32); > - tcg_out_r(s, t0); > - tcg_out32(s, arg32); > - } else { > - tcg_debug_assert(type == TCG_TYPE_I64); > + switch (type) { > + case TCG_TYPE_I32: > + tcg_out_op_ri(s, INDEX_op_tci_movi_i32, ret, arg); > + break; > #if TCG_TARGET_REG_BITS == 64 > - tcg_out_op_t(s, INDEX_op_tci_movi_i64); > - tcg_out_r(s, t0); > - tcg_out64(s, arg); > -#else > - TODO(); > + case TCG_TYPE_I64: > + tcg_out_op_rI(s, INDEX_op_tci_movi_i64, ret, arg); > + break; > #endif > + default: > + g_assert_not_reached(); > } > - old_code_ptr[1] = s->code_ptr - old_code_ptr; > } > > static void tcg_out_call(TCGContext *s, const tcg_insn_unit *arg) >
On 3/16/21 5:39 PM, Philippe Mathieu-Daudé wrote: > "And support mov_i64 on 32-bit host"? Um, no... >> + case TCG_TYPE_I32: >> + tcg_out_op_ri(s, INDEX_op_tci_movi_i32, ret, arg); >> + break; >> #if TCG_TARGET_REG_BITS == 64 >> + case TCG_TYPE_I64: >> + tcg_out_op_rI(s, INDEX_op_tci_movi_i64, ret, arg); >> + break; >> #endif >> + default: >> + g_assert_not_reached(); ... aborting if it happens. r~
On 3/17/21 4:59 AM, Richard Henderson wrote: > On 3/16/21 5:39 PM, Philippe Mathieu-Daudé wrote: >> "And support mov_i64 on 32-bit host"? > > Um, no... > >>> + case TCG_TYPE_I32: >>> + tcg_out_op_ri(s, INDEX_op_tci_movi_i32, ret, arg); >>> + break; >>> #if TCG_TARGET_REG_BITS == 64 >>> + case TCG_TYPE_I64: >>> + tcg_out_op_rI(s, INDEX_op_tci_movi_i64, ret, arg); >>> + break; >>> #endif >>> + default: >>> + g_assert_not_reached(); > > ... aborting if it happens. Oh indeed. All good then.
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc index e4a5872b2a..c2d2bd24d7 100644 --- a/tcg/tci/tcg-target.c.inc +++ b/tcg/tci/tcg-target.c.inc @@ -324,6 +324,31 @@ static void tcg_out_op_np(TCGContext *s, TCGOpcode op, old_code_ptr[1] = s->code_ptr - old_code_ptr; } +static void tcg_out_op_ri(TCGContext *s, TCGOpcode op, TCGReg r0, int32_t i1) +{ + uint8_t *old_code_ptr = s->code_ptr; + + tcg_out_op_t(s, op); + tcg_out_r(s, r0); + tcg_out32(s, i1); + + old_code_ptr[1] = s->code_ptr - old_code_ptr; +} + +#if TCG_TARGET_REG_BITS == 64 +static void tcg_out_op_rI(TCGContext *s, TCGOpcode op, + TCGReg r0, uint64_t i1) +{ + uint8_t *old_code_ptr = s->code_ptr; + + tcg_out_op_t(s, op); + tcg_out_r(s, r0); + tcg_out64(s, i1); + + old_code_ptr[1] = s->code_ptr - old_code_ptr; +} +#endif + static void tcg_out_op_rr(TCGContext *s, TCGOpcode op, TCGReg r0, TCGReg r1) { uint8_t *old_code_ptr = s->code_ptr; @@ -550,25 +575,20 @@ static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) } static void tcg_out_movi(TCGContext *s, TCGType type, - TCGReg t0, tcg_target_long arg) + TCGReg ret, tcg_target_long arg) { - uint8_t *old_code_ptr = s->code_ptr; - uint32_t arg32 = arg; - if (type == TCG_TYPE_I32 || arg == arg32) { - tcg_out_op_t(s, INDEX_op_tci_movi_i32); - tcg_out_r(s, t0); - tcg_out32(s, arg32); - } else { - tcg_debug_assert(type == TCG_TYPE_I64); + switch (type) { + case TCG_TYPE_I32: + tcg_out_op_ri(s, INDEX_op_tci_movi_i32, ret, arg); + break; #if TCG_TARGET_REG_BITS == 64 - tcg_out_op_t(s, INDEX_op_tci_movi_i64); - tcg_out_r(s, t0); - tcg_out64(s, arg); -#else - TODO(); + case TCG_TYPE_I64: + tcg_out_op_rI(s, INDEX_op_tci_movi_i64, ret, arg); + break; #endif + default: + g_assert_not_reached(); } - old_code_ptr[1] = s->code_ptr - old_code_ptr; } static void tcg_out_call(TCGContext *s, const tcg_insn_unit *arg)
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- tcg/tci/tcg-target.c.inc | 50 ++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 15 deletions(-) -- 2.25.1