tcg: Initialize cpu_env generically
This is identical for each target.  So, move the initialization to
common code.  Move the variable itself out of tcg_ctx and name it
cpu_env to minimize changes within targets.
This also means we can remove tcg_global_reg_new_{ptr,i32,i64},
since there are no longer global-register temps created by targets.
Reviewed-by: Emilio G. Cota <cota@braap.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
			
			
This commit is contained in:
		
							parent
							
								
									3468b59e18
								
							
						
					
					
						commit
						1c2adb958f
					
				| @ -18,7 +18,7 @@ static inline void gen_tb_start(TranslationBlock *tb) | ||||
|         count = tcg_temp_new_i32(); | ||||
|     } | ||||
| 
 | ||||
|     tcg_gen_ld_i32(count, tcg_ctx->tcg_env, | ||||
|     tcg_gen_ld_i32(count, cpu_env, | ||||
|                    -ENV_OFFSET + offsetof(CPUState, icount_decr.u32)); | ||||
| 
 | ||||
|     if (tb_cflags(tb) & CF_USE_ICOUNT) { | ||||
| @ -36,7 +36,7 @@ static inline void gen_tb_start(TranslationBlock *tb) | ||||
|     tcg_gen_brcondi_i32(TCG_COND_LT, count, 0, tcg_ctx->exitreq_label); | ||||
| 
 | ||||
|     if (tb_cflags(tb) & CF_USE_ICOUNT) { | ||||
|         tcg_gen_st16_i32(count, tcg_ctx->tcg_env, | ||||
|         tcg_gen_st16_i32(count, cpu_env, | ||||
|                          -ENV_OFFSET + offsetof(CPUState, icount_decr.u16.low)); | ||||
|     } | ||||
| 
 | ||||
| @ -61,16 +61,14 @@ static inline void gen_tb_end(TranslationBlock *tb, int num_insns) | ||||
| static inline void gen_io_start(void) | ||||
| { | ||||
|     TCGv_i32 tmp = tcg_const_i32(1); | ||||
|     tcg_gen_st_i32(tmp, tcg_ctx->tcg_env, | ||||
|                    -ENV_OFFSET + offsetof(CPUState, can_do_io)); | ||||
|     tcg_gen_st_i32(tmp, cpu_env, -ENV_OFFSET + offsetof(CPUState, can_do_io)); | ||||
|     tcg_temp_free_i32(tmp); | ||||
| } | ||||
| 
 | ||||
| static inline void gen_io_end(void) | ||||
| { | ||||
|     TCGv_i32 tmp = tcg_const_i32(0); | ||||
|     tcg_gen_st_i32(tmp, tcg_ctx->tcg_env, | ||||
|                    -ENV_OFFSET + offsetof(CPUState, can_do_io)); | ||||
|     tcg_gen_st_i32(tmp, cpu_env, -ENV_OFFSET + offsetof(CPUState, can_do_io)); | ||||
|     tcg_temp_free_i32(tmp); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -78,7 +78,6 @@ struct DisasContext { | ||||
| #define DISAS_PC_STALE            DISAS_TARGET_2 | ||||
| 
 | ||||
| /* global register indexes */ | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv cpu_std_ir[31]; | ||||
| static TCGv cpu_fir[31]; | ||||
| static TCGv cpu_pc; | ||||
| @ -126,9 +125,6 @@ void alpha_translate_init(void) | ||||
| 
 | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
| 
 | ||||
|     for (i = 0; i < 31; i++) { | ||||
|         cpu_std_ir[i] = tcg_global_mem_new_i64(cpu_env, | ||||
|                                                offsetof(CPUAlphaState, ir[i]), | ||||
|  | ||||
| @ -58,7 +58,6 @@ | ||||
| #define IS_USER(s) (s->user) | ||||
| #endif | ||||
| 
 | ||||
| TCGv_env cpu_env; | ||||
| /* We reuse the same 64-bit temporaries for efficiency.  */ | ||||
| static TCGv_i64 cpu_V0, cpu_V1, cpu_M0; | ||||
| static TCGv_i32 cpu_R[16]; | ||||
| @ -81,9 +80,6 @@ void arm_translate_init(void) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
| 
 | ||||
|     for (i = 0; i < 16; i++) { | ||||
|         cpu_R[i] = tcg_global_mem_new_i32(cpu_env, | ||||
|                                           offsetof(CPUARMState, regs[i]), | ||||
|  | ||||
| @ -80,7 +80,6 @@ typedef struct DisasCompare { | ||||
| } DisasCompare; | ||||
| 
 | ||||
| /* Share the TCG temporaries common between 32 and 64 bit modes.  */ | ||||
| extern TCGv_env cpu_env; | ||||
| extern TCGv_i32 cpu_NF, cpu_ZF, cpu_CF, cpu_VF; | ||||
| extern TCGv_i64 cpu_exclusive_addr; | ||||
| extern TCGv_i64 cpu_exclusive_val; | ||||
|  | ||||
| @ -66,7 +66,6 @@ | ||||
| #define CC_MASK_NZVC 0xf | ||||
| #define CC_MASK_RNZV 0x10e | ||||
| 
 | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv cpu_R[16]; | ||||
| static TCGv cpu_PR[16]; | ||||
| static TCGv cc_x; | ||||
| @ -3368,8 +3367,6 @@ void cris_initialize_tcg(void) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
|     cc_x = tcg_global_mem_new(cpu_env, | ||||
|                               offsetof(CPUCRISState, cc_x), "cc_x"); | ||||
|     cc_src = tcg_global_mem_new(cpu_env, | ||||
|  | ||||
| @ -1272,8 +1272,6 @@ void cris_initialize_crisv10_tcg(void) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
|     cc_x = tcg_global_mem_new(cpu_env, | ||||
|                               offsetof(CPUCRISState, cc_x), "cc_x"); | ||||
|     cc_src = tcg_global_mem_new(cpu_env, | ||||
|  | ||||
| @ -83,7 +83,6 @@ typedef struct DisasInsn { | ||||
| } DisasInsn; | ||||
| 
 | ||||
| /* global register indexes */ | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv cpu_gr[32]; | ||||
| static TCGv cpu_iaoq_f; | ||||
| static TCGv cpu_iaoq_b; | ||||
| @ -126,9 +125,6 @@ void hppa_translate_init(void) | ||||
| 
 | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
| 
 | ||||
|     TCGV_UNUSED(cpu_gr[0]); | ||||
|     for (i = 1; i < 32; i++) { | ||||
|         cpu_gr[i] = tcg_global_mem_new(cpu_env, | ||||
|  | ||||
| @ -72,7 +72,6 @@ | ||||
| //#define MACRO_TEST   1
 | ||||
| 
 | ||||
| /* global register indexes */ | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv cpu_A0; | ||||
| static TCGv cpu_cc_dst, cpu_cc_src, cpu_cc_src2, cpu_cc_srcT; | ||||
| static TCGv_i32 cpu_cc_op; | ||||
| @ -8367,8 +8366,6 @@ void tcg_x86_init(void) | ||||
|     }; | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
|     cpu_cc_op = tcg_global_mem_new_i32(cpu_env, | ||||
|                                        offsetof(CPUX86State, cc_op), "cc_op"); | ||||
|     cpu_cc_dst = tcg_global_mem_new(cpu_env, offsetof(CPUX86State, cc_dst), | ||||
|  | ||||
| @ -53,7 +53,6 @@ | ||||
| #define DISAS_UPDATE  DISAS_TARGET_1 /* cpu state was modified dynamically */ | ||||
| #define DISAS_TB_JUMP DISAS_TARGET_2 /* only pc was modified statically */ | ||||
| 
 | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv cpu_R[32]; | ||||
| static TCGv cpu_pc; | ||||
| static TCGv cpu_ie; | ||||
| @ -1208,9 +1207,6 @@ void lm32_translate_init(void) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
| 
 | ||||
|     for (i = 0; i < ARRAY_SIZE(cpu_R); i++) { | ||||
|         cpu_R[i] = tcg_global_mem_new(cpu_env, | ||||
|                           offsetof(CPULM32State, regs[i]), | ||||
|  | ||||
| @ -44,8 +44,6 @@ | ||||
| static TCGv_i32 cpu_halted; | ||||
| static TCGv_i32 cpu_exception_index; | ||||
| 
 | ||||
| static TCGv_env cpu_env; | ||||
| 
 | ||||
| static char cpu_reg_names[2 * 8 * 3 + 5 * 4]; | ||||
| static TCGv cpu_dregs[8]; | ||||
| static TCGv cpu_aregs[8]; | ||||
| @ -69,9 +67,6 @@ void m68k_tcg_init(void) | ||||
|     char *p; | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
| 
 | ||||
| #define DEFO32(name, offset) \ | ||||
|     QREG_##name = tcg_global_mem_new_i32(cpu_env, \ | ||||
|         offsetof(CPUM68KState, offset), #name); | ||||
|  | ||||
| @ -53,7 +53,6 @@ | ||||
| #define DISAS_TB_JUMP DISAS_TARGET_2 /* only pc was modified statically */ | ||||
| 
 | ||||
| static TCGv env_debug; | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv cpu_R[32]; | ||||
| static TCGv cpu_SR[18]; | ||||
| static TCGv env_imm; | ||||
| @ -1855,9 +1854,6 @@ void mb_tcg_init(void) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
| 
 | ||||
|     env_debug = tcg_global_mem_new(cpu_env, | ||||
|                     offsetof(CPUMBState, debug), | ||||
|                     "debug0"); | ||||
|  | ||||
| @ -1376,7 +1376,6 @@ enum { | ||||
| }; | ||||
| 
 | ||||
| /* global register indices */ | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv cpu_gpr[32], cpu_PC; | ||||
| static TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC]; | ||||
| static TCGv cpu_dspctrl, btarget, bcond; | ||||
| @ -20454,9 +20453,6 @@ void mips_tcg_init(void) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
| 
 | ||||
|     TCGV_UNUSED(cpu_gpr[0]); | ||||
|     for (i = 1; i < 32; i++) | ||||
|         cpu_gpr[i] = tcg_global_mem_new(cpu_env, | ||||
|  | ||||
| @ -56,7 +56,6 @@ enum { | ||||
| 
 | ||||
| static TCGv cpu_pc; | ||||
| static TCGv cpu_gregs[16]; | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv cc_a, cc_b; | ||||
| 
 | ||||
| #include "exec/gen-icount.h" | ||||
| @ -101,8 +100,6 @@ void moxie_translate_init(void) | ||||
|         "$r10", "$r11", "$r12", "$r13" | ||||
|     }; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
|     cpu_pc = tcg_global_mem_new_i32(cpu_env, | ||||
|                                     offsetof(CPUMoxieState, pc), "$pc"); | ||||
|     for (i = 0; i < 16; i++) | ||||
|  | ||||
| @ -789,7 +789,6 @@ static const char * const regnames[] = { | ||||
|     "rpc" | ||||
| }; | ||||
| 
 | ||||
| static TCGv_ptr cpu_env; | ||||
| static TCGv cpu_R[NUM_CORE_REGS]; | ||||
| 
 | ||||
| #include "exec/gen-icount.h" | ||||
| @ -947,9 +946,6 @@ void nios2_tcg_init(void) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
| 
 | ||||
|     for (i = 0; i < NUM_CORE_REGS; i++) { | ||||
|         cpu_R[i] = tcg_global_mem_new(cpu_env, | ||||
|                                       offsetof(CPUNios2State, regs[i]), | ||||
|  | ||||
| @ -53,7 +53,6 @@ typedef struct DisasContext { | ||||
|     bool singlestep_enabled; | ||||
| } DisasContext; | ||||
| 
 | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv cpu_sr; | ||||
| static TCGv cpu_R[32]; | ||||
| static TCGv cpu_R0; | ||||
| @ -80,8 +79,6 @@ void openrisc_translate_init(void) | ||||
|     }; | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
|     cpu_sr = tcg_global_mem_new(cpu_env, | ||||
|                                 offsetof(CPUOpenRISCState, sr), "sr"); | ||||
|     cpu_dflag = tcg_global_mem_new_i32(cpu_env, | ||||
|  | ||||
| @ -51,7 +51,6 @@ | ||||
| /* Code translation helpers                                                  */ | ||||
| 
 | ||||
| /* global register indexes */ | ||||
| static TCGv_env cpu_env; | ||||
| static char cpu_reg_names[10*3 + 22*4 /* GPR */ | ||||
|     + 10*4 + 22*5 /* SPE GPRh */ | ||||
|     + 10*4 + 22*5 /* FPR */ | ||||
| @ -85,9 +84,6 @@ void ppc_translate_init(void) | ||||
|     char* p; | ||||
|     size_t cpu_reg_names_size; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
| 
 | ||||
|     p = cpu_reg_names; | ||||
|     cpu_reg_names_size = sizeof(cpu_reg_names); | ||||
| 
 | ||||
|  | ||||
| @ -37,10 +37,6 @@ | ||||
| #include "qemu/log.h" | ||||
| #include "qemu/host-utils.h" | ||||
| #include "exec/cpu_ldst.h" | ||||
| 
 | ||||
| /* global register indexes */ | ||||
| static TCGv_env cpu_env; | ||||
| 
 | ||||
| #include "exec/gen-icount.h" | ||||
| #include "exec/helper-proto.h" | ||||
| #include "exec/helper-gen.h" | ||||
| @ -112,8 +108,6 @@ void s390x_translate_init(void) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
|     psw_addr = tcg_global_mem_new_i64(cpu_env, | ||||
|                                       offsetof(CPUS390XState, psw.addr), | ||||
|                                       "psw_addr"); | ||||
|  | ||||
| @ -65,7 +65,6 @@ enum { | ||||
| }; | ||||
| 
 | ||||
| /* global register indexes */ | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv cpu_gregs[32]; | ||||
| static TCGv cpu_sr, cpu_sr_m, cpu_sr_q, cpu_sr_t; | ||||
| static TCGv cpu_pc, cpu_ssr, cpu_spc, cpu_gbr; | ||||
| @ -99,9 +98,6 @@ void sh4_translate_init(void) | ||||
|         "FPR12_BANK1", "FPR13_BANK1", "FPR14_BANK1", "FPR15_BANK1", | ||||
|     }; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
| 
 | ||||
|     for (i = 0; i < 24; i++) { | ||||
|         cpu_gregs[i] = tcg_global_mem_new_i32(cpu_env, | ||||
|                                               offsetof(CPUSH4State, gregs[i]), | ||||
|  | ||||
| @ -41,7 +41,6 @@ | ||||
|                          according to jump_pc[T2] */ | ||||
| 
 | ||||
| /* global register indexes */ | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv_ptr cpu_regwptr; | ||||
| static TCGv cpu_cc_src, cpu_cc_src2, cpu_cc_dst; | ||||
| static TCGv_i32 cpu_cc_op; | ||||
| @ -5911,9 +5910,6 @@ void sparc_tcg_init(void) | ||||
| 
 | ||||
|     unsigned int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
| 
 | ||||
|     cpu_regwptr = tcg_global_mem_new_ptr(cpu_env, | ||||
|                                          offsetof(CPUSPARCState, regwptr), | ||||
|                                          "regwptr"); | ||||
|  | ||||
| @ -33,7 +33,6 @@ | ||||
| 
 | ||||
| #define FMT64X                          "%016" PRIx64 | ||||
| 
 | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv cpu_pc; | ||||
| static TCGv cpu_regs[TILEGX_R_COUNT]; | ||||
| 
 | ||||
| @ -2445,8 +2444,6 @@ void tilegx_tcg_init(void) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
|     cpu_pc = tcg_global_mem_new_i64(cpu_env, offsetof(CPUTLGState, pc), "pc"); | ||||
|     for (i = 0; i < TILEGX_R_COUNT; i++) { | ||||
|         cpu_regs[i] = tcg_global_mem_new_i64(cpu_env, | ||||
|  | ||||
| @ -47,8 +47,6 @@ static TCGv cpu_PSW_V; | ||||
| static TCGv cpu_PSW_SV; | ||||
| static TCGv cpu_PSW_AV; | ||||
| static TCGv cpu_PSW_SAV; | ||||
| /* CPU env */ | ||||
| static TCGv_env cpu_env; | ||||
| 
 | ||||
| #include "exec/gen-icount.h" | ||||
| 
 | ||||
| @ -8881,8 +8879,6 @@ void tricore_tcg_init(void) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
|     /* reg init */ | ||||
|     for (i = 0 ; i < 16 ; i++) { | ||||
|         cpu_gpr_a[i] = tcg_global_mem_new(cpu_env, | ||||
|  | ||||
| @ -54,7 +54,6 @@ typedef struct DisasContext { | ||||
|    conditional executions state has been updated.  */ | ||||
| #define DISAS_SYSCALL DISAS_TARGET_3 | ||||
| 
 | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv_i32 cpu_R[32]; | ||||
| 
 | ||||
| /* FIXME:  These should be removed.  */ | ||||
| @ -74,9 +73,6 @@ void uc32_translate_init(void) | ||||
| { | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
| 
 | ||||
|     for (i = 0; i < 32; i++) { | ||||
|         cpu_R[i] = tcg_global_mem_new_i32(cpu_env, | ||||
|                                 offsetof(CPUUniCore32State, regs[i]), regnames[i]); | ||||
|  | ||||
| @ -77,7 +77,6 @@ typedef struct DisasContext { | ||||
|     unsigned cpenable; | ||||
| } DisasContext; | ||||
| 
 | ||||
| static TCGv_env cpu_env; | ||||
| static TCGv_i32 cpu_pc; | ||||
| static TCGv_i32 cpu_R[16]; | ||||
| static TCGv_i32 cpu_FR[16]; | ||||
| @ -221,8 +220,6 @@ void xtensa_translate_init(void) | ||||
|     }; | ||||
|     int i; | ||||
| 
 | ||||
|     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env"); | ||||
|     tcg_ctx->tcg_env = cpu_env; | ||||
|     cpu_pc = tcg_global_mem_new_i32(cpu_env, | ||||
|             offsetof(CPUXtensaState, pc), "pc"); | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										30
									
								
								tcg/tcg-op.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								tcg/tcg-op.c
									
									
									
									
									
								
							| @ -2562,7 +2562,7 @@ void tcg_gen_lookup_and_goto_ptr(void) | ||||
| { | ||||
|     if (TCG_TARGET_HAS_goto_ptr && !qemu_loglevel_mask(CPU_LOG_TB_NOCHAIN)) { | ||||
|         TCGv_ptr ptr = tcg_temp_new_ptr(); | ||||
|         gen_helper_lookup_tb_ptr(ptr, tcg_ctx->tcg_env); | ||||
|         gen_helper_lookup_tb_ptr(ptr, cpu_env); | ||||
|         tcg_gen_op1i(INDEX_op_goto_ptr, tcgv_ptr_arg(ptr)); | ||||
|         tcg_temp_free_ptr(ptr); | ||||
|     } else { | ||||
| @ -2648,7 +2648,7 @@ void tcg_gen_qemu_ld_i32(TCGv_i32 val, TCGv addr, TCGArg idx, TCGMemOp memop) | ||||
| { | ||||
|     tcg_gen_req_mo(TCG_MO_LD_LD | TCG_MO_ST_LD); | ||||
|     memop = tcg_canonicalize_memop(memop, 0, 0); | ||||
|     trace_guest_mem_before_tcg(tcg_ctx->cpu, tcg_ctx->tcg_env, | ||||
|     trace_guest_mem_before_tcg(tcg_ctx->cpu, cpu_env, | ||||
|                                addr, trace_mem_get_info(memop, 0)); | ||||
|     gen_ldst_i32(INDEX_op_qemu_ld_i32, val, addr, memop, idx); | ||||
| } | ||||
| @ -2657,7 +2657,7 @@ void tcg_gen_qemu_st_i32(TCGv_i32 val, TCGv addr, TCGArg idx, TCGMemOp memop) | ||||
| { | ||||
|     tcg_gen_req_mo(TCG_MO_LD_ST | TCG_MO_ST_ST); | ||||
|     memop = tcg_canonicalize_memop(memop, 0, 1); | ||||
|     trace_guest_mem_before_tcg(tcg_ctx->cpu, tcg_ctx->tcg_env, | ||||
|     trace_guest_mem_before_tcg(tcg_ctx->cpu, cpu_env, | ||||
|                                addr, trace_mem_get_info(memop, 1)); | ||||
|     gen_ldst_i32(INDEX_op_qemu_st_i32, val, addr, memop, idx); | ||||
| } | ||||
| @ -2676,7 +2676,7 @@ void tcg_gen_qemu_ld_i64(TCGv_i64 val, TCGv addr, TCGArg idx, TCGMemOp memop) | ||||
|     } | ||||
| 
 | ||||
|     memop = tcg_canonicalize_memop(memop, 1, 0); | ||||
|     trace_guest_mem_before_tcg(tcg_ctx->cpu, tcg_ctx->tcg_env, | ||||
|     trace_guest_mem_before_tcg(tcg_ctx->cpu, cpu_env, | ||||
|                                addr, trace_mem_get_info(memop, 0)); | ||||
|     gen_ldst_i64(INDEX_op_qemu_ld_i64, val, addr, memop, idx); | ||||
| } | ||||
| @ -2690,7 +2690,7 @@ void tcg_gen_qemu_st_i64(TCGv_i64 val, TCGv addr, TCGArg idx, TCGMemOp memop) | ||||
|     } | ||||
| 
 | ||||
|     memop = tcg_canonicalize_memop(memop, 1, 1); | ||||
|     trace_guest_mem_before_tcg(tcg_ctx->cpu, tcg_ctx->tcg_env, | ||||
|     trace_guest_mem_before_tcg(tcg_ctx->cpu, cpu_env, | ||||
|                                addr, trace_mem_get_info(memop, 1)); | ||||
|     gen_ldst_i64(INDEX_op_qemu_st_i64, val, addr, memop, idx); | ||||
| } | ||||
| @ -2806,11 +2806,11 @@ void tcg_gen_atomic_cmpxchg_i32(TCGv_i32 retv, TCGv addr, TCGv_i32 cmpv, | ||||
| #ifdef CONFIG_SOFTMMU | ||||
|         { | ||||
|             TCGv_i32 oi = tcg_const_i32(make_memop_idx(memop & ~MO_SIGN, idx)); | ||||
|             gen(retv, tcg_ctx->tcg_env, addr, cmpv, newv, oi); | ||||
|             gen(retv, cpu_env, addr, cmpv, newv, oi); | ||||
|             tcg_temp_free_i32(oi); | ||||
|         } | ||||
| #else | ||||
|         gen(retv, tcg_ctx->tcg_env, addr, cmpv, newv); | ||||
|         gen(retv, cpu_env, addr, cmpv, newv); | ||||
| #endif | ||||
| 
 | ||||
|         if (memop & MO_SIGN) { | ||||
| @ -2851,14 +2851,14 @@ void tcg_gen_atomic_cmpxchg_i64(TCGv_i64 retv, TCGv addr, TCGv_i64 cmpv, | ||||
| #ifdef CONFIG_SOFTMMU | ||||
|         { | ||||
|             TCGv_i32 oi = tcg_const_i32(make_memop_idx(memop, idx)); | ||||
|             gen(retv, tcg_ctx->tcg_env, addr, cmpv, newv, oi); | ||||
|             gen(retv, cpu_env, addr, cmpv, newv, oi); | ||||
|             tcg_temp_free_i32(oi); | ||||
|         } | ||||
| #else | ||||
|         gen(retv, tcg_ctx->tcg_env, addr, cmpv, newv); | ||||
|         gen(retv, cpu_env, addr, cmpv, newv); | ||||
| #endif | ||||
| #else | ||||
|         gen_helper_exit_atomic(tcg_ctx->tcg_env); | ||||
|         gen_helper_exit_atomic(cpu_env); | ||||
|         /* Produce a result, so that we have a well-formed opcode stream
 | ||||
|            with respect to uses of the result in the (dead) code following.  */ | ||||
|         tcg_gen_movi_i64(retv, 0); | ||||
| @ -2914,11 +2914,11 @@ static void do_atomic_op_i32(TCGv_i32 ret, TCGv addr, TCGv_i32 val, | ||||
| #ifdef CONFIG_SOFTMMU | ||||
|     { | ||||
|         TCGv_i32 oi = tcg_const_i32(make_memop_idx(memop & ~MO_SIGN, idx)); | ||||
|         gen(ret, tcg_ctx->tcg_env, addr, val, oi); | ||||
|         gen(ret, cpu_env, addr, val, oi); | ||||
|         tcg_temp_free_i32(oi); | ||||
|     } | ||||
| #else | ||||
|     gen(ret, tcg_ctx->tcg_env, addr, val); | ||||
|     gen(ret, cpu_env, addr, val); | ||||
| #endif | ||||
| 
 | ||||
|     if (memop & MO_SIGN) { | ||||
| @ -2959,14 +2959,14 @@ static void do_atomic_op_i64(TCGv_i64 ret, TCGv addr, TCGv_i64 val, | ||||
| #ifdef CONFIG_SOFTMMU | ||||
|         { | ||||
|             TCGv_i32 oi = tcg_const_i32(make_memop_idx(memop & ~MO_SIGN, idx)); | ||||
|             gen(ret, tcg_ctx->tcg_env, addr, val, oi); | ||||
|             gen(ret, cpu_env, addr, val, oi); | ||||
|             tcg_temp_free_i32(oi); | ||||
|         } | ||||
| #else | ||||
|         gen(ret, tcg_ctx->tcg_env, addr, val); | ||||
|         gen(ret, cpu_env, addr, val); | ||||
| #endif | ||||
| #else | ||||
|         gen_helper_exit_atomic(tcg_ctx->tcg_env); | ||||
|         gen_helper_exit_atomic(cpu_env); | ||||
|         /* Produce a result, so that we have a well-formed opcode stream
 | ||||
|            with respect to uses of the result in the (dead) code following.  */ | ||||
|         tcg_gen_movi_i64(ret, 0); | ||||
|  | ||||
							
								
								
									
										32
									
								
								tcg/tcg.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								tcg/tcg.c
									
									
									
									
									
								
							| @ -121,6 +121,7 @@ static bool tcg_out_ldst_finalize(TCGContext *s); | ||||
| 
 | ||||
| static TCGContext **tcg_ctxs; | ||||
| static unsigned int n_tcg_ctxs; | ||||
| TCGv_env cpu_env = 0; | ||||
| 
 | ||||
| /*
 | ||||
|  * We divide code_gen_buffer into equally-sized "regions" that TCG threads | ||||
| @ -657,6 +658,8 @@ static GHashTable *helper_table; | ||||
| 
 | ||||
| static int indirect_reg_alloc_order[ARRAY_SIZE(tcg_target_reg_alloc_order)]; | ||||
| static void process_op_defs(TCGContext *s); | ||||
| static TCGTemp *tcg_global_reg_new_internal(TCGContext *s, TCGType type, | ||||
|                                             TCGReg reg, const char *name); | ||||
| 
 | ||||
| void tcg_context_init(TCGContext *s) | ||||
| { | ||||
| @ -664,6 +667,7 @@ void tcg_context_init(TCGContext *s) | ||||
|     TCGOpDef *def; | ||||
|     TCGArgConstraint *args_ct; | ||||
|     int *sorted_args; | ||||
|     TCGTemp *ts; | ||||
| 
 | ||||
|     memset(s, 0, sizeof(*s)); | ||||
|     s->nb_globals = 0; | ||||
| @ -729,6 +733,10 @@ void tcg_context_init(TCGContext *s) | ||||
| #else | ||||
|     tcg_ctxs = g_new(TCGContext *, max_cpus); | ||||
| #endif | ||||
| 
 | ||||
|     tcg_debug_assert(!tcg_regset_test_reg(s->reserved_regs, TCG_AREG0)); | ||||
|     ts = tcg_global_reg_new_internal(s, TCG_TYPE_PTR, TCG_AREG0, "env"); | ||||
|     cpu_env = temp_tcgv_ptr(ts); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| @ -871,30 +879,6 @@ void tcg_set_frame(TCGContext *s, TCGReg reg, intptr_t start, intptr_t size) | ||||
|         = tcg_global_reg_new_internal(s, TCG_TYPE_PTR, reg, "_frame"); | ||||
| } | ||||
| 
 | ||||
| TCGv_i32 tcg_global_reg_new_i32(TCGReg reg, const char *name) | ||||
| { | ||||
|     TCGContext *s = tcg_ctx; | ||||
|     TCGTemp *t; | ||||
| 
 | ||||
|     if (tcg_regset_test_reg(s->reserved_regs, reg)) { | ||||
|         tcg_abort(); | ||||
|     } | ||||
|     t = tcg_global_reg_new_internal(s, TCG_TYPE_I32, reg, name); | ||||
|     return temp_tcgv_i32(t); | ||||
| } | ||||
| 
 | ||||
| TCGv_i64 tcg_global_reg_new_i64(TCGReg reg, const char *name) | ||||
| { | ||||
|     TCGContext *s = tcg_ctx; | ||||
|     TCGTemp *t; | ||||
| 
 | ||||
|     if (tcg_regset_test_reg(s->reserved_regs, reg)) { | ||||
|         tcg_abort(); | ||||
|     } | ||||
|     t = tcg_global_reg_new_internal(s, TCG_TYPE_I64, reg, name); | ||||
|     return temp_tcgv_i64(t); | ||||
| } | ||||
| 
 | ||||
| TCGTemp *tcg_global_mem_new_internal(TCGType type, TCGv_ptr base, | ||||
|                                      intptr_t offset, const char *name) | ||||
| { | ||||
|  | ||||
| @ -669,7 +669,6 @@ struct TCGContext { | ||||
| 
 | ||||
|     /* Track which vCPU triggers events */ | ||||
|     CPUState *cpu;                      /* *_trans */ | ||||
|     TCGv_env tcg_env;                   /* *_exec  */ | ||||
| 
 | ||||
|     /* These structures are private to tcg-target.inc.c.  */ | ||||
| #ifdef TCG_TARGET_NEED_LDST_LABELS | ||||
| @ -696,6 +695,7 @@ struct TCGContext { | ||||
| 
 | ||||
| extern TCGContext tcg_init_ctx; | ||||
| extern __thread TCGContext *tcg_ctx; | ||||
| extern TCGv_env cpu_env; | ||||
| 
 | ||||
| static inline size_t temp_idx(TCGTemp *ts) | ||||
| { | ||||
| @ -839,9 +839,6 @@ void tcg_set_frame(TCGContext *s, TCGReg reg, intptr_t start, intptr_t size); | ||||
| TCGTemp *tcg_global_mem_new_internal(TCGType, TCGv_ptr, | ||||
|                                      intptr_t, const char *); | ||||
| 
 | ||||
| TCGv_i32 tcg_global_reg_new_i32(TCGReg reg, const char *name); | ||||
| TCGv_i64 tcg_global_reg_new_i64(TCGReg reg, const char *name); | ||||
| 
 | ||||
| TCGv_i32 tcg_temp_new_internal_i32(int temp_local); | ||||
| TCGv_i64 tcg_temp_new_internal_i64(int temp_local); | ||||
| 
 | ||||
| @ -960,8 +957,6 @@ static inline TCGv_ptr TCGV_NAT_TO_PTR(TCGv_i32 n) { return (TCGv_ptr)n; } | ||||
| static inline TCGv_i32 TCGV_PTR_TO_NAT(TCGv_ptr n) { return (TCGv_i32)n; } | ||||
| 
 | ||||
| #define tcg_const_ptr(V) TCGV_NAT_TO_PTR(tcg_const_i32((intptr_t)(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) \ | ||||
|     TCGV_NAT_TO_PTR(tcg_global_mem_new_i32((R), (O), (N))) | ||||
| #define tcg_temp_new_ptr() TCGV_NAT_TO_PTR(tcg_temp_new_i32()) | ||||
| @ -971,8 +966,6 @@ static inline TCGv_ptr TCGV_NAT_TO_PTR(TCGv_i64 n) { return (TCGv_ptr)n; } | ||||
| static inline TCGv_i64 TCGV_PTR_TO_NAT(TCGv_ptr n) { return (TCGv_i64)n; } | ||||
| 
 | ||||
| #define tcg_const_ptr(V) TCGV_NAT_TO_PTR(tcg_const_i64((intptr_t)(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) \ | ||||
|     TCGV_NAT_TO_PTR(tcg_global_mem_new_i64((R), (O), (N))) | ||||
| #define tcg_temp_new_ptr() TCGV_NAT_TO_PTR(tcg_temp_new_i64()) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Richard Henderson
						Richard Henderson