translate.c
来自「xen虚拟机源代码安装包」· C语言 代码 · 共 2,200 行 · 第 1/5 页
C
2,200 行
tcg_gen_mov_tl(cpu_cc_src, src1); tcg_gen_mov_tl(cpu_cc_src2, src2); tcg_gen_add_tl(dst, src1, src2); tcg_gen_mov_tl(cpu_cc_dst, dst); gen_cc_clear_icc(); gen_cc_NZ_icc(cpu_cc_dst); gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src); gen_cc_V_add_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);#ifdef TARGET_SPARC64 gen_cc_clear_xcc(); gen_cc_NZ_xcc(cpu_cc_dst); gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src); gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);#endif}static inline void gen_op_addx_cc(TCGv dst, TCGv src1, TCGv src2){ tcg_gen_mov_tl(cpu_cc_src, src1); tcg_gen_mov_tl(cpu_cc_src2, src2); gen_mov_reg_C(cpu_tmp0, cpu_psr); tcg_gen_add_tl(dst, src1, cpu_tmp0); gen_cc_clear_icc(); gen_cc_C_add_icc(dst, cpu_cc_src);#ifdef TARGET_SPARC64 gen_cc_clear_xcc(); gen_cc_C_add_xcc(dst, cpu_cc_src);#endif tcg_gen_add_tl(dst, dst, cpu_cc_src2); tcg_gen_mov_tl(cpu_cc_dst, dst); gen_cc_NZ_icc(cpu_cc_dst); gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src); gen_cc_V_add_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);#ifdef TARGET_SPARC64 gen_cc_NZ_xcc(cpu_cc_dst); gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src); gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);#endif}static inline void gen_op_tadd_cc(TCGv dst, TCGv src1, TCGv src2){ tcg_gen_mov_tl(cpu_cc_src, src1); tcg_gen_mov_tl(cpu_cc_src2, src2); tcg_gen_add_tl(dst, src1, src2); tcg_gen_mov_tl(cpu_cc_dst, dst); gen_cc_clear_icc(); gen_cc_NZ_icc(cpu_cc_dst); gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src); gen_cc_V_add_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); gen_cc_V_tag(cpu_cc_src, cpu_cc_src2);#ifdef TARGET_SPARC64 gen_cc_clear_xcc(); gen_cc_NZ_xcc(cpu_cc_dst); gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src); gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);#endif}static inline void gen_op_tadd_ccTV(TCGv dst, TCGv src1, TCGv src2){ tcg_gen_mov_tl(cpu_cc_src, src1); tcg_gen_mov_tl(cpu_cc_src2, src2); gen_tag_tv(cpu_cc_src, cpu_cc_src2); tcg_gen_add_tl(dst, src1, src2); tcg_gen_mov_tl(cpu_cc_dst, dst); gen_add_tv(dst, cpu_cc_src, cpu_cc_src2); gen_cc_clear_icc(); gen_cc_NZ_icc(cpu_cc_dst); gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src);#ifdef TARGET_SPARC64 gen_cc_clear_xcc(); gen_cc_NZ_xcc(cpu_cc_dst); gen_cc_C_add_xcc(cpu_cc_dst, cpu_cc_src); gen_cc_V_add_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);#endif}/* old op: if (src1 < T1) env->psr |= PSR_CARRY;*/static inline void gen_cc_C_sub_icc(TCGv src1, TCGv src2){ TCGv r_temp1, r_temp2; int l1; l1 = gen_new_label(); r_temp1 = tcg_temp_new(TCG_TYPE_TL); r_temp2 = tcg_temp_new(TCG_TYPE_TL); tcg_gen_andi_tl(r_temp1, src1, 0xffffffffULL); tcg_gen_andi_tl(r_temp2, src2, 0xffffffffULL); tcg_gen_brcond_tl(TCG_COND_GEU, r_temp1, r_temp2, l1); tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_CARRY); gen_set_label(l1);}#ifdef TARGET_SPARC64static inline void gen_cc_C_sub_xcc(TCGv src1, TCGv src2){ int l1; l1 = gen_new_label(); tcg_gen_brcond_tl(TCG_COND_GEU, src1, src2, l1); tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_CARRY); gen_set_label(l1);}#endif/* old op: if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) env->psr |= PSR_OVF;*/static inline void gen_cc_V_sub_icc(TCGv dst, TCGv src1, TCGv src2){ TCGv r_temp; r_temp = tcg_temp_new(TCG_TYPE_TL); tcg_gen_xor_tl(r_temp, src1, src2); tcg_gen_xor_tl(cpu_tmp0, src1, dst); tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); tcg_gen_andi_tl(r_temp, r_temp, (1 << 31)); tcg_gen_shri_tl(r_temp, r_temp, 31 - PSR_OVF_SHIFT); tcg_gen_trunc_tl_i32(cpu_tmp32, r_temp); tcg_gen_or_i32(cpu_psr, cpu_psr, cpu_tmp32);}#ifdef TARGET_SPARC64static inline void gen_cc_V_sub_xcc(TCGv dst, TCGv src1, TCGv src2){ TCGv r_temp; r_temp = tcg_temp_new(TCG_TYPE_TL); tcg_gen_xor_tl(r_temp, src1, src2); tcg_gen_xor_tl(cpu_tmp0, src1, dst); tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 63)); tcg_gen_shri_tl(r_temp, r_temp, 63 - PSR_OVF_SHIFT); tcg_gen_trunc_tl_i32(cpu_tmp32, r_temp); tcg_gen_or_i32(cpu_xcc, cpu_xcc, cpu_tmp32);}#endifstatic inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2){ TCGv r_temp; int l1; l1 = gen_new_label(); r_temp = tcg_temp_new(TCG_TYPE_TL); tcg_gen_xor_tl(r_temp, src1, src2); tcg_gen_xor_tl(cpu_tmp0, src1, dst); tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0); tcg_gen_andi_tl(r_temp, r_temp, (1 << 31)); tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, tcg_const_tl(0), l1); tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_TOVF)); gen_set_label(l1);}static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2){ tcg_gen_mov_tl(cpu_cc_src, src1); tcg_gen_mov_tl(cpu_cc_src2, src2); tcg_gen_sub_tl(dst, src1, src2); tcg_gen_mov_tl(cpu_cc_dst, dst); gen_cc_clear_icc(); gen_cc_NZ_icc(cpu_cc_dst); gen_cc_C_sub_icc(cpu_cc_src, cpu_cc_src2); gen_cc_V_sub_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);#ifdef TARGET_SPARC64 gen_cc_clear_xcc(); gen_cc_NZ_xcc(cpu_cc_dst); gen_cc_C_sub_xcc(cpu_cc_src, cpu_cc_src2); gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);#endif}static inline void gen_op_subx_cc(TCGv dst, TCGv src1, TCGv src2){ tcg_gen_mov_tl(cpu_cc_src, src1); tcg_gen_mov_tl(cpu_cc_src2, src2); gen_mov_reg_C(cpu_tmp0, cpu_psr); tcg_gen_sub_tl(dst, src1, cpu_tmp0); gen_cc_clear_icc(); gen_cc_C_sub_icc(dst, cpu_cc_src);#ifdef TARGET_SPARC64 gen_cc_clear_xcc(); gen_cc_C_sub_xcc(dst, cpu_cc_src);#endif tcg_gen_sub_tl(dst, dst, cpu_cc_src2); tcg_gen_mov_tl(cpu_cc_dst, dst); gen_cc_NZ_icc(cpu_cc_dst); gen_cc_C_sub_icc(cpu_cc_dst, cpu_cc_src); gen_cc_V_sub_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);#ifdef TARGET_SPARC64 gen_cc_NZ_xcc(cpu_cc_dst); gen_cc_C_sub_xcc(cpu_cc_dst, cpu_cc_src); gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);#endif}static inline void gen_op_tsub_cc(TCGv dst, TCGv src1, TCGv src2){ tcg_gen_mov_tl(cpu_cc_src, src1); tcg_gen_mov_tl(cpu_cc_src2, src2); tcg_gen_sub_tl(dst, src1, src2); tcg_gen_mov_tl(cpu_cc_dst, dst); gen_cc_clear_icc(); gen_cc_NZ_icc(cpu_cc_dst); gen_cc_C_sub_icc(cpu_cc_src, cpu_cc_src2); gen_cc_V_sub_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); gen_cc_V_tag(cpu_cc_src, cpu_cc_src2);#ifdef TARGET_SPARC64 gen_cc_clear_xcc(); gen_cc_NZ_xcc(cpu_cc_dst); gen_cc_C_sub_xcc(cpu_cc_src, cpu_cc_src2); gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);#endif}static inline void gen_op_tsub_ccTV(TCGv dst, TCGv src1, TCGv src2){ tcg_gen_mov_tl(cpu_cc_src, src1); tcg_gen_mov_tl(cpu_cc_src2, src2); gen_tag_tv(cpu_cc_src, cpu_cc_src2); tcg_gen_sub_tl(dst, src1, src2); tcg_gen_mov_tl(cpu_cc_dst, dst); gen_sub_tv(dst, cpu_cc_src, cpu_cc_src2); gen_cc_clear_icc(); gen_cc_NZ_icc(cpu_cc_dst); gen_cc_C_sub_icc(cpu_cc_src, cpu_cc_src2);#ifdef TARGET_SPARC64 gen_cc_clear_xcc(); gen_cc_NZ_xcc(cpu_cc_dst); gen_cc_C_sub_xcc(cpu_cc_src, cpu_cc_src2); gen_cc_V_sub_xcc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);#endif}static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2){ TCGv r_temp, r_temp2; int l1; l1 = gen_new_label(); r_temp = tcg_temp_new(TCG_TYPE_TL); r_temp2 = tcg_temp_new(TCG_TYPE_I32); /* old op: if (!(env->y & 1)) T1 = 0; */ tcg_gen_mov_tl(cpu_cc_src, src1); tcg_gen_ld32u_tl(r_temp, cpu_env, offsetof(CPUSPARCState, y)); tcg_gen_trunc_tl_i32(r_temp2, r_temp); tcg_gen_andi_i32(r_temp2, r_temp2, 0x1); tcg_gen_mov_tl(cpu_cc_src2, src2); tcg_gen_brcond_i32(TCG_COND_NE, r_temp2, tcg_const_i32(0), l1); tcg_gen_movi_tl(cpu_cc_src2, 0); gen_set_label(l1); // b2 = T0 & 1; // env->y = (b2 << 31) | (env->y >> 1); tcg_gen_trunc_tl_i32(r_temp2, cpu_cc_src); tcg_gen_andi_i32(r_temp2, r_temp2, 0x1); tcg_gen_shli_i32(r_temp2, r_temp2, 31); tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, y)); tcg_gen_shri_i32(cpu_tmp32, cpu_tmp32, 1); tcg_gen_or_i32(cpu_tmp32, cpu_tmp32, r_temp2); tcg_gen_st_i32(cpu_tmp32, cpu_env, offsetof(CPUSPARCState, y)); // b1 = N ^ V; gen_mov_reg_N(cpu_tmp0, cpu_psr); gen_mov_reg_V(r_temp, cpu_psr); tcg_gen_xor_tl(cpu_tmp0, cpu_tmp0, r_temp); // T0 = (b1 << 31) | (T0 >> 1); // src1 = T0; tcg_gen_shli_tl(cpu_tmp0, cpu_tmp0, 31); tcg_gen_shri_tl(cpu_cc_src, cpu_cc_src, 1); tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, cpu_tmp0); /* do addition and update flags */ tcg_gen_add_tl(dst, cpu_cc_src, cpu_cc_src2); tcg_gen_mov_tl(cpu_cc_dst, dst); gen_cc_clear_icc(); gen_cc_NZ_icc(cpu_cc_dst); gen_cc_V_add_icc(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); gen_cc_C_add_icc(cpu_cc_dst, cpu_cc_src);}static inline void gen_op_umul(TCGv dst, TCGv src1, TCGv src2){ TCGv r_temp, r_temp2; r_temp = tcg_temp_new(TCG_TYPE_I64); r_temp2 = tcg_temp_new(TCG_TYPE_I64); tcg_gen_extu_tl_i64(r_temp, src2); tcg_gen_extu_tl_i64(r_temp2, src1); tcg_gen_mul_i64(r_temp2, r_temp, r_temp2); tcg_gen_shri_i64(r_temp, r_temp2, 32); tcg_gen_trunc_i64_i32(r_temp, r_temp); tcg_gen_st_i32(r_temp, cpu_env, offsetof(CPUSPARCState, y));#ifdef TARGET_SPARC64 tcg_gen_mov_i64(dst, r_temp2);#else tcg_gen_trunc_i64_tl(dst, r_temp2);#endif}static inline void gen_op_smul(TCGv dst, TCGv src1, TCGv src2){ TCGv r_temp, r_temp2; r_temp = tcg_temp_new(TCG_TYPE_I64); r_temp2 = tcg_temp_new(TCG_TYPE_I64); tcg_gen_ext_tl_i64(r_temp, src2); tcg_gen_ext_tl_i64(r_temp2, src1); tcg_gen_mul_i64(r_temp2, r_temp, r_temp2); tcg_gen_shri_i64(r_temp, r_temp2, 32); tcg_gen_trunc_i64_i32(r_temp, r_temp); tcg_gen_st_i32(r_temp, cpu_env, offsetof(CPUSPARCState, y));#ifdef TARGET_SPARC64 tcg_gen_mov_i64(dst, r_temp2);#else tcg_gen_trunc_i64_tl(dst, r_temp2);#endif}#ifdef TARGET_SPARC64static inline void gen_trap_ifdivzero_tl(TCGv divisor){ int l1; l1 = gen_new_label(); tcg_gen_brcond_tl(TCG_COND_NE, divisor, tcg_const_tl(0), l1); tcg_gen_helper_0_1(raise_exception, tcg_const_i32(TT_DIV_ZERO)); gen_set_label(l1);}static inline void gen_op_sdivx(TCGv dst, TCGv src1, TCGv src2){ int l1, l2; l1 = gen_new_label(); l2 = gen_new_label(); tcg_gen_mov_tl(cpu_cc_src, src1); tcg_gen_mov_tl(cpu_cc_src2, src2); gen_trap_ifdivzero_tl(src2); tcg_gen_brcond_tl(TCG_COND_NE, cpu_cc_src, tcg_const_tl(INT64_MIN), l1); tcg_gen_brcond_tl(TCG_COND_NE, cpu_cc_src2, tcg_const_tl(-1), l1); tcg_gen_movi_i64(dst, INT64_MIN); tcg_gen_br(l2); gen_set_label(l1); tcg_gen_div_i64(dst, cpu_cc_src, cpu_cc_src2); gen_set_label(l2);}#endifstatic inline void gen_op_div_cc(TCGv dst){ int l1; tcg_gen_mov_tl(cpu_cc_dst, dst); gen_cc_clear_icc(); gen_cc_NZ_icc(cpu_cc_dst); l1 = gen_new_label(); tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, cc_src2)); tcg_gen_brcond_tl(TCG_COND_EQ, cpu_tmp0, tcg_const_tl(0), l1); tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF); gen_set_label(l1);}static inline void gen_op_logic_cc(TCGv dst){ tcg_gen_mov_tl(cpu_cc_dst, dst); gen_cc_clear_icc(); gen_cc_NZ_icc(cpu_cc_dst);#ifdef TARGET_SPARC64 gen_cc_clear_xcc(); gen_cc_NZ_xcc(cpu_cc_dst);#endif}// 1static inline void gen_op_eval_ba(TCGv dst){ tcg_gen_movi_tl(dst, 1);}// Zstatic inline void gen_op_eval_be(TCGv dst, TCGv src){ gen_mov_reg_Z(dst, src);}// Z | (N ^ V)static inline void gen_op_eval_ble(TCGv dst, TCGv src){ gen_mov_reg_N(cpu_tmp0, src); gen_mov_reg_V(dst, src); tcg_gen_xor_tl(dst, dst, cpu_tmp0); gen_mov_reg_Z(cpu_tmp0, src); tcg_gen_or_tl(dst, dst, cpu_tmp0);}// N ^ Vstatic inline void gen_op_eval_bl(TCGv dst, TCGv src){ gen_mov_reg_V(cpu_tmp0, src); gen_mov_reg_N(dst, src); tcg_gen_xor_tl(dst, dst, cpu_tmp0);}// C | Zstatic inline void gen_op_eval_bleu(TCGv dst, TCGv src){ gen_mov_reg_Z(cpu_tmp0, src); gen_mov_reg_C(dst, src); tcg_gen_or_tl(dst, dst, cpu_tmp0);}// Cstatic inline void gen_op_eval_bcs(TCGv dst, TCGv src){ gen_mov_reg_C(dst, src);}// Vstatic inline void gen_op_eval_bvs(TCGv dst, TCGv src){ gen_mov_reg_V(dst, src);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?