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 + -
显示快捷键?