From a328bf8552bce75819b0c450b2e281cec0f54b38 Mon Sep 17 00:00:00 2001 From: Romain Malmain Date: Thu, 17 Oct 2024 15:12:03 +0200 Subject: [PATCH] fix a bug in extrh_i64_i32 operation. --- tcg/tcg-op.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c index 7a167e5ccf..6e1668332d 100644 --- a/tcg/tcg-op.c +++ b/tcg/tcg-op.c @@ -426,15 +426,28 @@ void tcg_gen_discard_i32(TCGv_i32 arg) tcg_gen_op1_i32(INDEX_op_discard, arg); } -void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg) +static void tcg_gen_mov_i32_internal(TCGv_i32 ret, TCGv_i32 arg, bool concrete) { if (ret != arg) { - tcg_gen_op2_i64(INDEX_op_mov_i64, tcgv_i32_expr_num(ret), - tcgv_i32_expr_num(arg)); + if (!concrete) { + tcg_gen_op2_i64(INDEX_op_mov_i64, tcgv_i32_expr_num(ret), + tcgv_i32_expr_num(arg)); + } + tcg_gen_op2_i32(INDEX_op_mov_i32, ret, arg); } } +void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg) +{ + tcg_gen_mov_i32_internal(ret, arg, false); +} + +void tcg_gen_mov_i32_concrete(TCGv_i32 ret, TCGv_i32 arg) +{ + tcg_gen_mov_i32_internal(ret, arg, true); +} + void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg) { /* TODO : Make movi rely on the inline mov_i32 */ @@ -3504,8 +3517,7 @@ void tcg_gen_extrl_i64_i32(TCGv_i32 ret, TCGv_i64 arg) } else {*/ gen_helper_sym_trunc_i64_i32(tcgv_i32_expr(ret), tcgv_i64_expr(arg)); /* We don't want symbolic handling of this mov. */ - if (ret != (TCGv_i32)arg) - tcg_gen_op2_i32(INDEX_op_mov_i32, ret, (TCGv_i32)arg); + tcg_gen_mov_i32_concrete(ret, (TCGv_i32)arg); /* } */ } @@ -3521,7 +3533,7 @@ void tcg_gen_extrh_i64_i32(TCGv_i32 ret, TCGv_i64 arg) tcg_gen_shri_i64(t, arg, 32); gen_helper_sym_trunc_i64_i32(tcgv_i32_expr(ret), tcgv_i64_expr(t)); /* We don't want symbolic handling of this mov. */ - tcg_gen_op2_i32(INDEX_op_mov_i32, ret, (TCGv_i32)t); + tcg_gen_mov_i32_concrete(ret, (TCGv_i32)t); tcg_temp_free_i64(t); /*}*/ }