Re: [PULL 14/24] tcg: Use tcg_constant_{i32,i64} with tcg int expanders
Richard Henderson writes: > Signed-off-by: Richard Henderson Hi Richard, I've just tracked this commit down to breaking the plugin inline support (qemu_plugin_register_vcpu_insn_exec_inline). It wasn't picked up by CI because inline isn't the default (normal callbacks are). I was just adding inline support into check-tcg to workaround the rep issue for x86 and ran into the following: ./qemu-i386 -plugin tests/plugin/libinsn.so,arg=inline -d plugin sha1 Gives: Thread 1 "qemu-i386" received signal SIGSEGV, Segmentation fault. 0x5565bbad in test_bit (addr=, nr=) at /home/alex.bennee/lsrc/qemu.git/include/qemu/bitops.h:135 135 return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1))); (gdb) bt #0 0x5565bbad in test_bit (addr=, nr=) at /home/alex.bennee/lsrc/qemu.git/include/qemu/bitops.h:135 #1 init_ts_info (temps_used=temps_used@entry=0x7fffd9b0, ts=0x74521018 ) at ../../tcg/optimize.c:97 #2 0x5565bde0 in init_arg_info (arg=, temps_used=0x7fffd9b0) at ../../tcg/optimize.c:126 #3 tcg_optimize (s=s@entry=0x55bd48c0 ) at ../../tcg/optimize.c:641 #4 0x5562e729 in tcg_gen_code (s=0x55bd48c0 , tb=tb@entry=0x7fffe840 ) at ../../tcg/tcg.c:4401 #5 0x55691e5b in tb_gen_code (cpu=cpu@entry=0x55c46c00, pc=pc@entry=134519520, cs_base=cs_base@entry=0, flags=flags@entry=4194483, cflags=-16777216, cflags@entry=0) at ../../accel/tcg/translate-all.c:1952 #6 0x5565ed72 in tb_find (cf_mask=0, tb_exit=0, last_tb=0x0, cpu=0x55c46c00) at ../../accel/tcg/cpu-exec.c:454 #7 cpu_exec (cpu=cpu@entry=0x55c46c00) at ../../accel/tcg/cpu-exec.c:810 #8 0x555db848 in cpu_loop (env=0x55c4eef0) at ../../linux-user/i386/cpu_loop.c:207 #9 0x555d28da in main (argc=, argv=, envp=) at ../../linux-user/main.c:859 (gdb) > --- > include/tcg/tcg-op.h | 13 +-- > tcg/tcg-op.c | 227 --- > 2 files changed, 109 insertions(+), 131 deletions(-) > > diff --git a/include/tcg/tcg-op.h b/include/tcg/tcg-op.h > index 901b19f32a..ed8de045e2 100644 > --- a/include/tcg/tcg-op.h > +++ b/include/tcg/tcg-op.h > @@ -271,6 +271,7 @@ void tcg_gen_mb(TCGBar); > > /* 32 bit ops */ > > +void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg); > void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2); > void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2); > void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2); > @@ -349,11 +350,6 @@ static inline void tcg_gen_mov_i32(TCGv_i32 ret, > TCGv_i32 arg) > } > } > > -static inline void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg) > -{ > -tcg_gen_op2i_i32(INDEX_op_movi_i32, ret, arg); > -} > - > static inline void tcg_gen_ld8u_i32(TCGv_i32 ret, TCGv_ptr arg2, > tcg_target_long offset) > { > @@ -467,6 +463,7 @@ static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 > arg) > > /* 64 bit ops */ > > +void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg); > void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2); > void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2); > void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2); > @@ -550,11 +547,6 @@ static inline void tcg_gen_mov_i64(TCGv_i64 ret, > TCGv_i64 arg) > } > } > > -static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg) > -{ > -tcg_gen_op2i_i64(INDEX_op_movi_i64, ret, arg); > -} > - > static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2, > tcg_target_long offset) > { > @@ -698,7 +690,6 @@ static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 > arg1, TCGv_i64 arg2) > > void tcg_gen_discard_i64(TCGv_i64 arg); > void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg); > -void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg); > void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset); > void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset); > void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset); > diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c > index 0374b5d56d..70475773f4 100644 > --- a/tcg/tcg-op.c > +++ b/tcg/tcg-op.c > @@ -104,15 +104,18 @@ void tcg_gen_mb(TCGBar mb_type) > > /* 32 bit ops */ > > +void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg) > +{ > +tcg_gen_mov_i32(ret, tcg_constant_i32(arg)); > +} > + > void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) > { > /* some cases can be optimized here */ > if (arg2 == 0) { > tcg_gen_mov_i32(ret, arg1); > } else { > -TCGv_i32 t0 = tcg_const_i32(arg2); > -tcg_gen_add_i32(ret, arg1, t0); > -tcg_temp_free_i32(t0); > +tcg_gen_add_i32(ret, arg1, tcg_constant_i32(arg2)); > } > } > > @@ -122,9 +125,7 @@ void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, > TCGv_i32 arg2) >
[PULL 14/24] tcg: Use tcg_constant_{i32,i64} with tcg int expanders
Signed-off-by: Richard Henderson --- include/tcg/tcg-op.h | 13 +-- tcg/tcg-op.c | 227 --- 2 files changed, 109 insertions(+), 131 deletions(-) diff --git a/include/tcg/tcg-op.h b/include/tcg/tcg-op.h index 901b19f32a..ed8de045e2 100644 --- a/include/tcg/tcg-op.h +++ b/include/tcg/tcg-op.h @@ -271,6 +271,7 @@ void tcg_gen_mb(TCGBar); /* 32 bit ops */ +void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg); void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2); void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2); void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2); @@ -349,11 +350,6 @@ static inline void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg) } } -static inline void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg) -{ -tcg_gen_op2i_i32(INDEX_op_movi_i32, ret, arg); -} - static inline void tcg_gen_ld8u_i32(TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) { @@ -467,6 +463,7 @@ static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg) /* 64 bit ops */ +void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg); void tcg_gen_addi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2); void tcg_gen_subfi_i64(TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2); void tcg_gen_subi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2); @@ -550,11 +547,6 @@ static inline void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg) } } -static inline void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg) -{ -tcg_gen_op2i_i64(INDEX_op_movi_i64, ret, arg); -} - static inline void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset) { @@ -698,7 +690,6 @@ static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) void tcg_gen_discard_i64(TCGv_i64 arg); void tcg_gen_mov_i64(TCGv_i64 ret, TCGv_i64 arg); -void tcg_gen_movi_i64(TCGv_i64 ret, int64_t arg); void tcg_gen_ld8u_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset); void tcg_gen_ld8s_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset); void tcg_gen_ld16u_i64(TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset); diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c index 0374b5d56d..70475773f4 100644 --- a/tcg/tcg-op.c +++ b/tcg/tcg-op.c @@ -104,15 +104,18 @@ void tcg_gen_mb(TCGBar mb_type) /* 32 bit ops */ +void tcg_gen_movi_i32(TCGv_i32 ret, int32_t arg) +{ +tcg_gen_mov_i32(ret, tcg_constant_i32(arg)); +} + void tcg_gen_addi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) { /* some cases can be optimized here */ if (arg2 == 0) { tcg_gen_mov_i32(ret, arg1); } else { -TCGv_i32 t0 = tcg_const_i32(arg2); -tcg_gen_add_i32(ret, arg1, t0); -tcg_temp_free_i32(t0); +tcg_gen_add_i32(ret, arg1, tcg_constant_i32(arg2)); } } @@ -122,9 +125,7 @@ void tcg_gen_subfi_i32(TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2) /* Don't recurse with tcg_gen_neg_i32. */ tcg_gen_op2_i32(INDEX_op_neg_i32, ret, arg2); } else { -TCGv_i32 t0 = tcg_const_i32(arg1); -tcg_gen_sub_i32(ret, t0, arg2); -tcg_temp_free_i32(t0); +tcg_gen_sub_i32(ret, tcg_constant_i32(arg1), arg2); } } @@ -134,15 +135,12 @@ void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) if (arg2 == 0) { tcg_gen_mov_i32(ret, arg1); } else { -TCGv_i32 t0 = tcg_const_i32(arg2); -tcg_gen_sub_i32(ret, arg1, t0); -tcg_temp_free_i32(t0); +tcg_gen_sub_i32(ret, arg1, tcg_constant_i32(arg2)); } } void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) { -TCGv_i32 t0; /* Some cases can be optimized here. */ switch (arg2) { case 0: @@ -165,9 +163,8 @@ void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) } break; } -t0 = tcg_const_i32(arg2); -tcg_gen_and_i32(ret, arg1, t0); -tcg_temp_free_i32(t0); + +tcg_gen_and_i32(ret, arg1, tcg_constant_i32(arg2)); } void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) @@ -178,9 +175,7 @@ void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) } else if (arg2 == 0) { tcg_gen_mov_i32(ret, arg1); } else { -TCGv_i32 t0 = tcg_const_i32(arg2); -tcg_gen_or_i32(ret, arg1, t0); -tcg_temp_free_i32(t0); +tcg_gen_or_i32(ret, arg1, tcg_constant_i32(arg2)); } } @@ -193,9 +188,7 @@ void tcg_gen_xori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) /* Don't recurse with tcg_gen_not_i32. */ tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg1); } else { -TCGv_i32 t0 = tcg_const_i32(arg2); -tcg_gen_xor_i32(ret, arg1, t0); -tcg_temp_free_i32(t0); +tcg_gen_xor_i32(ret, arg1, tcg_constant_i32(arg2)); } } @@ -205,9 +198,7 @@ void tcg_gen_shli_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) if (arg2 == 0) {