diff options
Diffstat (limited to 'tcg')
| -rw-r--r-- | tcg/arm/tcg-target.c | 31 | ||||
| -rw-r--r-- | tcg/i386/tcg-target.h | 5 | ||||
| -rw-r--r-- | tcg/tcg-op.h | 6 | ||||
| -rw-r--r-- | tcg/tcg.c | 2 | ||||
| -rw-r--r-- | tcg/tcg.h | 6 | ||||
| -rw-r--r-- | tcg/tci/tcg-target.c | 4 | ||||
| -rw-r--r-- | tcg/tci/tcg-target.h | 4 |
7 files changed, 23 insertions, 35 deletions
diff --git a/tcg/arm/tcg-target.c b/tcg/arm/tcg-target.c index e05a64f75c..1d327984e0 100644 --- a/tcg/arm/tcg-target.c +++ b/tcg/arm/tcg-target.c @@ -842,6 +842,12 @@ static inline void tcg_out_st8(TCGContext *s, int cond, tcg_out_st8_12(s, cond, rd, rn, offset); } +/* The _goto case is normally between TBs within the same code buffer, + * and with the code buffer limited to 16GB we shouldn't need the long + * case. + * + * .... except to the prologue that is in its own buffer. + */ static inline void tcg_out_goto(TCGContext *s, int cond, uint32_t addr) { int32_t val; @@ -855,22 +861,20 @@ static inline void tcg_out_goto(TCGContext *s, int cond, uint32_t addr) if (val - 8 < 0x01fffffd && val - 8 > -0x01fffffd) tcg_out_b(s, cond, val); else { -#if 1 - tcg_abort(); -#else if (cond == COND_AL) { tcg_out_ld32_12(s, COND_AL, TCG_REG_PC, TCG_REG_PC, -4); - tcg_out32(s, addr); /* XXX: This is l->u.value, can we use it? */ + tcg_out32(s, addr); } else { tcg_out_movi32(s, cond, TCG_REG_R8, val - 8); tcg_out_dat_reg(s, cond, ARITH_ADD, TCG_REG_PC, TCG_REG_PC, TCG_REG_R8, SHIFT_IMM_LSL(0)); } -#endif } } +/* The call case is mostly used for helpers - so it's not unreasonable + * for them to be beyond branch range */ static inline void tcg_out_call(TCGContext *s, uint32_t addr) { int32_t val; @@ -887,20 +891,9 @@ static inline void tcg_out_call(TCGContext *s, uint32_t addr) tcg_out_bl(s, COND_AL, val); } } else { -#if 1 - tcg_abort(); -#else - if (cond == COND_AL) { - tcg_out_dat_imm(s, cond, ARITH_ADD, TCG_REG_R14, TCG_REG_PC, 4); - tcg_out_ld32_12(s, COND_AL, TCG_REG_PC, TCG_REG_PC, -4); - tcg_out32(s, addr); /* XXX: This is l->u.value, can we use it? */ - } else { - tcg_out_movi32(s, cond, TCG_REG_R9, addr); - tcg_out_dat_reg(s, cond, ARITH_MOV, TCG_REG_R14, 0, - TCG_REG_PC, SHIFT_IMM_LSL(0)); - tcg_out_bx(s, cond, TCG_REG_R9); - } -#endif + tcg_out_dat_imm(s, COND_AL, ARITH_ADD, TCG_REG_R14, TCG_REG_PC, 4); + tcg_out_ld32_12(s, COND_AL, TCG_REG_PC, TCG_REG_PC, -4); + tcg_out32(s, addr); } } diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h index 7756e7b03c..adbb036905 100644 --- a/tcg/i386/tcg-target.h +++ b/tcg/i386/tcg-target.h @@ -23,11 +23,6 @@ */ #define TCG_TARGET_I386 1 -#if defined(__x86_64__) -# define TCG_TARGET_REG_BITS 64 -#else -# define TCG_TARGET_REG_BITS 32 -#endif //#define TCG_TARGET_WORDS_BIGENDIAN #if TCG_TARGET_REG_BITS == 64 diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h index 82e04e7f30..169d3b2b0d 100644 --- a/tcg/tcg-op.h +++ b/tcg/tcg-op.h @@ -389,7 +389,7 @@ static inline void tcg_gen_helperN(void *func, int flags, int sizemask, TCGArg ret, int nargs, TCGArg *args) { TCGv_ptr fn; - fn = tcg_const_ptr((tcg_target_long)func); + fn = tcg_const_ptr(func); tcg_gen_callN(&tcg_ctx, fn, flags, sizemask, ret, nargs, args); tcg_temp_free_ptr(fn); @@ -405,7 +405,7 @@ static inline void tcg_gen_helper32(void *func, int sizemask, TCGv_i32 ret, { TCGv_ptr fn; TCGArg args[2]; - fn = tcg_const_ptr((tcg_target_long)func); + fn = tcg_const_ptr(func); args[0] = GET_TCGV_I32(a); args[1] = GET_TCGV_I32(b); tcg_gen_callN(&tcg_ctx, fn, TCG_CALL_CONST | TCG_CALL_PURE, sizemask, @@ -418,7 +418,7 @@ static inline void tcg_gen_helper64(void *func, int sizemask, TCGv_i64 ret, { TCGv_ptr fn; TCGArg args[2]; - fn = tcg_const_ptr((tcg_target_long)func); + fn = tcg_const_ptr(func); args[0] = GET_TCGV_I64(a); args[1] = GET_TCGV_I64(b); tcg_gen_callN(&tcg_ctx, fn, TCG_CALL_CONST | TCG_CALL_PURE, sizemask, diff --git a/tcg/tcg.c b/tcg/tcg.c index 77bd6ef74c..d43fa4a9b3 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -1555,7 +1555,7 @@ static void temp_save(TCGContext *s, int temp, TCGRegSet allocated_regs) } } -/* save globals to their cannonical location and assume they can be +/* save globals to their canonical location and assume they can be modified be the following code. 'allocated_regs' is used in case a temporary registers needs to be allocated to store a constant. */ static void save_globals(TCGContext *s, TCGRegSet allocated_regs) diff --git a/tcg/tcg.h b/tcg/tcg.h index 755a8b31cc..5c28239682 100644 --- a/tcg/tcg.h +++ b/tcg/tcg.h @@ -178,7 +178,7 @@ typedef tcg_target_ulong TCGArg; /* Define a type and accessor macros for variables. Using a struct is nice because it gives some level of type safely. Ideally the compiler be able to see through all this. However in practice this is not true, - expecially on targets with braindamaged ABIs (e.g. i386). + especially on targets with braindamaged ABIs (e.g. i386). We use plain int by default to avoid this runtime overhead. Users of tcg_gen_* don't need to know about any of this, and should treat TCGv as an opaque type. @@ -544,7 +544,7 @@ void tcg_add_target_add_op_defs(const TCGTargetOpDef *tdefs); #define TCGV_NAT_TO_PTR(n) MAKE_TCGV_PTR(GET_TCGV_I32(n)) #define TCGV_PTR_TO_NAT(n) MAKE_TCGV_I32(GET_TCGV_PTR(n)) -#define tcg_const_ptr(V) TCGV_NAT_TO_PTR(tcg_const_i32(V)) +#define tcg_const_ptr(V) TCGV_NAT_TO_PTR(tcg_const_i32((tcg_target_long)(V))) #define tcg_global_reg_new_ptr(R, N) \ TCGV_NAT_TO_PTR(tcg_global_reg_new_i32((R), (N))) #define tcg_global_mem_new_ptr(R, O, N) \ @@ -555,7 +555,7 @@ void tcg_add_target_add_op_defs(const TCGTargetOpDef *tdefs); #define TCGV_NAT_TO_PTR(n) MAKE_TCGV_PTR(GET_TCGV_I64(n)) #define TCGV_PTR_TO_NAT(n) MAKE_TCGV_I64(GET_TCGV_PTR(n)) -#define tcg_const_ptr(V) TCGV_NAT_TO_PTR(tcg_const_i64(V)) +#define tcg_const_ptr(V) TCGV_NAT_TO_PTR(tcg_const_i64((tcg_target_long)(V))) #define tcg_global_reg_new_ptr(R, N) \ TCGV_NAT_TO_PTR(tcg_global_reg_new_i64((R), (N))) #define tcg_global_mem_new_ptr(R, O, N) \ diff --git a/tcg/tci/tcg-target.c b/tcg/tci/tcg-target.c index 942910e14b..fc0880cec5 100644 --- a/tcg/tci/tcg-target.c +++ b/tcg/tci/tcg-target.c @@ -373,10 +373,6 @@ static const char *const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { }; #endif -static void flush_icache_range(unsigned long start, unsigned long stop) -{ -} - static void patch_reloc(uint8_t *code_ptr, int type, tcg_target_long value, tcg_target_long addend) { diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h index cb5858c9cb..03e0fd1a7f 100644 --- a/tcg/tci/tcg-target.h +++ b/tcg/tci/tcg-target.h @@ -157,4 +157,8 @@ void tci_disas(uint8_t opc); unsigned long tcg_qemu_tb_exec(CPUState *env, uint8_t *tb_ptr); #define tcg_qemu_tb_exec tcg_qemu_tb_exec +static inline void flush_icache_range(unsigned long start, unsigned long stop) +{ +} + #endif /* TCG_TARGET_H */ |