@@ -426,15 +426,28 @@ void tcg_gen_discard_i32(TCGv_i32 arg)
426426 tcg_gen_op1_i32 (INDEX_op_discard , arg );
427427}
428428
429- void tcg_gen_mov_i32 (TCGv_i32 ret , TCGv_i32 arg )
429+ static void tcg_gen_mov_i32_internal (TCGv_i32 ret , TCGv_i32 arg , bool concrete )
430430{
431431 if (ret != arg ) {
432- tcg_gen_op2_i64 (INDEX_op_mov_i64 , tcgv_i32_expr_num (ret ),
433- tcgv_i32_expr_num (arg ));
432+ if (!concrete ) {
433+ tcg_gen_op2_i64 (INDEX_op_mov_i64 , tcgv_i32_expr_num (ret ),
434+ tcgv_i32_expr_num (arg ));
435+ }
436+
434437 tcg_gen_op2_i32 (INDEX_op_mov_i32 , ret , arg );
435438 }
436439}
437440
441+ void tcg_gen_mov_i32 (TCGv_i32 ret , TCGv_i32 arg )
442+ {
443+ tcg_gen_mov_i32_internal (ret , arg , false);
444+ }
445+
446+ void tcg_gen_mov_i32_concrete (TCGv_i32 ret , TCGv_i32 arg )
447+ {
448+ tcg_gen_mov_i32_internal (ret , arg , true);
449+ }
450+
438451void tcg_gen_movi_i32 (TCGv_i32 ret , int32_t arg )
439452{
440453 /* 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)
35043517 } else {*/
35053518 gen_helper_sym_trunc_i64_i32 (tcgv_i32_expr (ret ), tcgv_i64_expr (arg ));
35063519 /* We don't want symbolic handling of this mov. */
3507- if (ret != (TCGv_i32 )arg )
3508- tcg_gen_op2_i32 (INDEX_op_mov_i32 , ret , (TCGv_i32 )arg );
3520+ tcg_gen_mov_i32_concrete (ret , (TCGv_i32 )arg );
35093521 /* } */
35103522}
35113523
@@ -3521,7 +3533,7 @@ void tcg_gen_extrh_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
35213533 tcg_gen_shri_i64 (t , arg , 32 );
35223534 gen_helper_sym_trunc_i64_i32 (tcgv_i32_expr (ret ), tcgv_i64_expr (t ));
35233535 /* We don't want symbolic handling of this mov. */
3524- tcg_gen_op2_i32 ( INDEX_op_mov_i32 , ret , (TCGv_i32 )t );
3536+ tcg_gen_mov_i32_concrete ( ret , (TCGv_i32 )t );
35253537 tcg_temp_free_i64 (t );
35263538 /*}*/
35273539}
0 commit comments