Message ID | 1493187803-4510-4-git-send-email-cota@braap.org |
---|---|
State | New |
Headers | show |
On 04/26/2017 08:23 AM, Emilio G. Cota wrote: > Instead of exporting goto_ptr directly to TCG frontends, export > tcg_gen_lookup_and_goto_ptr(), which calls goto_ptr with the pointer > returned by the lookup_tb_ptr() helper. This is the only use case > we have for goto_ptr and lookup_tb_ptr, so having this function is > very convenient. Furthermore, it trivially allows us to avoid calling > the lookup helper if goto_ptr is not implemented by the backend. > > Signed-off-by: Emilio G. Cota<cota@braap.org> > --- > tcg/README | 8 ++++++++ > tcg/tcg-op.c | 13 +++++++++++++ > tcg/tcg-op.h | 11 +++++++++++ > 3 files changed, 32 insertions(+) Reviewed-by: Richard Henderson <rth@twiddle.net> r~
Emilio G. Cota <cota@braap.org> writes: > Instead of exporting goto_ptr directly to TCG frontends, export > tcg_gen_lookup_and_goto_ptr(), which calls goto_ptr with the pointer > returned by the lookup_tb_ptr() helper. This is the only use case > we have for goto_ptr and lookup_tb_ptr, so having this function is > very convenient. Furthermore, it trivially allows us to avoid calling > the lookup helper if goto_ptr is not implemented by the backend. > > Signed-off-by: Emilio G. Cota <cota@braap.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> > --- > tcg/README | 8 ++++++++ > tcg/tcg-op.c | 13 +++++++++++++ > tcg/tcg-op.h | 11 +++++++++++ > 3 files changed, 32 insertions(+) > > diff --git a/tcg/README b/tcg/README > index a9858c2..bf49e82 100644 > --- a/tcg/README > +++ b/tcg/README > @@ -477,6 +477,14 @@ current TB was linked to this TB. Otherwise execute the next > instructions. Only indices 0 and 1 are valid and tcg_gen_goto_tb may be issued > at most once with each slot index per TB. > > +* lookup_and_goto_ptr tb_addr > + > +Look up a TB address ('tb_addr') and jump to it if valid. If not valid, > +jump to the TCG epilogue to go back to the exec loop. > + > +This operation is optional. If the TCG backend does not implement the > +goto_ptr opcode, emitting this op is equivalent to emitting exit_tb(0). > + > * qemu_ld_i32/i64 t0, t1, flags, memidx > * qemu_st_i32/i64 t0, t1, flags, memidx > > diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c > index 95a39b7..8ff1eaf 100644 > --- a/tcg/tcg-op.c > +++ b/tcg/tcg-op.c > @@ -2587,6 +2587,19 @@ void tcg_gen_goto_tb(unsigned idx) > tcg_gen_op1i(INDEX_op_goto_tb, idx); > } > > +void tcg_gen_lookup_and_goto_ptr(TCGv addr) > +{ > + if (TCG_TARGET_HAS_goto_ptr) { > + TCGv_ptr ptr = tcg_temp_new_ptr(); > + > + gen_helper_lookup_tb_ptr(ptr, tcg_ctx.tcg_env, addr); > + tcg_gen_op1i(INDEX_op_goto_ptr, GET_TCGV_PTR(ptr)); > + tcg_temp_free_ptr(ptr); > + } else { > + tcg_gen_exit_tb(0); > + } > +} > + > static inline TCGMemOp tcg_canonicalize_memop(TCGMemOp op, bool is64, bool st) > { > /* Trigger the asserts within as early as possible. */ > diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h > index c68e300..5d3278f 100644 > --- a/tcg/tcg-op.h > +++ b/tcg/tcg-op.h > @@ -796,6 +796,17 @@ static inline void tcg_gen_exit_tb(uintptr_t val) > */ > void tcg_gen_goto_tb(unsigned idx); > > +/** > + * tcg_gen_lookup_and_goto_ptr() - look up a TB and jump to it if valid > + * @addr: Guest address of the target TB > + * > + * If the TB is not valid, jump to the epilogue. > + * > + * This operation is optional. If the TCG backend does not implement goto_ptr, > + * this op is equivalent to calling tcg_gen_exit_tb() with 0 as the argument. > + */ > +void tcg_gen_lookup_and_goto_ptr(TCGv addr); > + > #if TARGET_LONG_BITS == 32 > #define tcg_temp_new() tcg_temp_new_i32() > #define tcg_global_reg_new tcg_global_reg_new_i32 -- Alex Bennée
diff --git a/tcg/README b/tcg/README index a9858c2..bf49e82 100644 --- a/tcg/README +++ b/tcg/README @@ -477,6 +477,14 @@ current TB was linked to this TB. Otherwise execute the next instructions. Only indices 0 and 1 are valid and tcg_gen_goto_tb may be issued at most once with each slot index per TB. +* lookup_and_goto_ptr tb_addr + +Look up a TB address ('tb_addr') and jump to it if valid. If not valid, +jump to the TCG epilogue to go back to the exec loop. + +This operation is optional. If the TCG backend does not implement the +goto_ptr opcode, emitting this op is equivalent to emitting exit_tb(0). + * qemu_ld_i32/i64 t0, t1, flags, memidx * qemu_st_i32/i64 t0, t1, flags, memidx diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c index 95a39b7..8ff1eaf 100644 --- a/tcg/tcg-op.c +++ b/tcg/tcg-op.c @@ -2587,6 +2587,19 @@ void tcg_gen_goto_tb(unsigned idx) tcg_gen_op1i(INDEX_op_goto_tb, idx); } +void tcg_gen_lookup_and_goto_ptr(TCGv addr) +{ + if (TCG_TARGET_HAS_goto_ptr) { + TCGv_ptr ptr = tcg_temp_new_ptr(); + + gen_helper_lookup_tb_ptr(ptr, tcg_ctx.tcg_env, addr); + tcg_gen_op1i(INDEX_op_goto_ptr, GET_TCGV_PTR(ptr)); + tcg_temp_free_ptr(ptr); + } else { + tcg_gen_exit_tb(0); + } +} + static inline TCGMemOp tcg_canonicalize_memop(TCGMemOp op, bool is64, bool st) { /* Trigger the asserts within as early as possible. */ diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h index c68e300..5d3278f 100644 --- a/tcg/tcg-op.h +++ b/tcg/tcg-op.h @@ -796,6 +796,17 @@ static inline void tcg_gen_exit_tb(uintptr_t val) */ void tcg_gen_goto_tb(unsigned idx); +/** + * tcg_gen_lookup_and_goto_ptr() - look up a TB and jump to it if valid + * @addr: Guest address of the target TB + * + * If the TB is not valid, jump to the epilogue. + * + * This operation is optional. If the TCG backend does not implement goto_ptr, + * this op is equivalent to calling tcg_gen_exit_tb() with 0 as the argument. + */ +void tcg_gen_lookup_and_goto_ptr(TCGv addr); + #if TARGET_LONG_BITS == 32 #define tcg_temp_new() tcg_temp_new_i32() #define tcg_global_reg_new tcg_global_reg_new_i32
Instead of exporting goto_ptr directly to TCG frontends, export tcg_gen_lookup_and_goto_ptr(), which calls goto_ptr with the pointer returned by the lookup_tb_ptr() helper. This is the only use case we have for goto_ptr and lookup_tb_ptr, so having this function is very convenient. Furthermore, it trivially allows us to avoid calling the lookup helper if goto_ptr is not implemented by the backend. Signed-off-by: Emilio G. Cota <cota@braap.org> --- tcg/README | 8 ++++++++ tcg/tcg-op.c | 13 +++++++++++++ tcg/tcg-op.h | 11 +++++++++++ 3 files changed, 32 insertions(+)