translate.c
来自「xen虚拟机源代码安装包」· C语言 代码 · 共 2,200 行 · 第 1/5 页
C
2,200 行
// 0static inline void gen_op_eval_bn(TCGv dst){ tcg_gen_movi_tl(dst, 0);}// Nstatic inline void gen_op_eval_bneg(TCGv dst, TCGv src){ gen_mov_reg_N(dst, src);}// !Zstatic inline void gen_op_eval_bne(TCGv dst, TCGv src){ gen_mov_reg_Z(dst, src); tcg_gen_xori_tl(dst, dst, 0x1);}// !(Z | (N ^ V))static inline void gen_op_eval_bg(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); tcg_gen_xori_tl(dst, dst, 0x1);}// !(N ^ V)static inline void gen_op_eval_bge(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); tcg_gen_xori_tl(dst, dst, 0x1);}// !(C | Z)static inline void gen_op_eval_bgu(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); tcg_gen_xori_tl(dst, dst, 0x1);}// !Cstatic inline void gen_op_eval_bcc(TCGv dst, TCGv src){ gen_mov_reg_C(dst, src); tcg_gen_xori_tl(dst, dst, 0x1);}// !Nstatic inline void gen_op_eval_bpos(TCGv dst, TCGv src){ gen_mov_reg_N(dst, src); tcg_gen_xori_tl(dst, dst, 0x1);}// !Vstatic inline void gen_op_eval_bvc(TCGv dst, TCGv src){ gen_mov_reg_V(dst, src); tcg_gen_xori_tl(dst, dst, 0x1);}/* FPSR bit field FCC1 | FCC0: 0 = 1 < 2 > 3 unordered*/static inline void gen_mov_reg_FCC0(TCGv reg, TCGv src, unsigned int fcc_offset){ tcg_gen_extu_i32_tl(reg, src); tcg_gen_shri_tl(reg, reg, FSR_FCC0_SHIFT + fcc_offset); tcg_gen_andi_tl(reg, reg, 0x1);}static inline void gen_mov_reg_FCC1(TCGv reg, TCGv src, unsigned int fcc_offset){ tcg_gen_extu_i32_tl(reg, src); tcg_gen_shri_tl(reg, reg, FSR_FCC1_SHIFT + fcc_offset); tcg_gen_andi_tl(reg, reg, 0x1);}// !0: FCC0 | FCC1static inline void gen_op_eval_fbne(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC0(dst, src, fcc_offset); gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); tcg_gen_or_tl(dst, dst, cpu_tmp0);}// 1 or 2: FCC0 ^ FCC1static inline void gen_op_eval_fblg(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC0(dst, src, fcc_offset); gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); tcg_gen_xor_tl(dst, dst, cpu_tmp0);}// 1 or 3: FCC0static inline void gen_op_eval_fbul(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC0(dst, src, fcc_offset);}// 1: FCC0 & !FCC1static inline void gen_op_eval_fbl(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC0(dst, src, fcc_offset); gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); tcg_gen_xori_tl(cpu_tmp0, cpu_tmp0, 0x1); tcg_gen_and_tl(dst, dst, cpu_tmp0);}// 2 or 3: FCC1static inline void gen_op_eval_fbug(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC1(dst, src, fcc_offset);}// 2: !FCC0 & FCC1static inline void gen_op_eval_fbg(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC0(dst, src, fcc_offset); tcg_gen_xori_tl(dst, dst, 0x1); gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); tcg_gen_and_tl(dst, dst, cpu_tmp0);}// 3: FCC0 & FCC1static inline void gen_op_eval_fbu(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC0(dst, src, fcc_offset); gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); tcg_gen_and_tl(dst, dst, cpu_tmp0);}// 0: !(FCC0 | FCC1)static inline void gen_op_eval_fbe(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC0(dst, src, fcc_offset); gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); tcg_gen_or_tl(dst, dst, cpu_tmp0); tcg_gen_xori_tl(dst, dst, 0x1);}// 0 or 3: !(FCC0 ^ FCC1)static inline void gen_op_eval_fbue(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC0(dst, src, fcc_offset); gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); tcg_gen_xor_tl(dst, dst, cpu_tmp0); tcg_gen_xori_tl(dst, dst, 0x1);}// 0 or 2: !FCC0static inline void gen_op_eval_fbge(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC0(dst, src, fcc_offset); tcg_gen_xori_tl(dst, dst, 0x1);}// !1: !(FCC0 & !FCC1)static inline void gen_op_eval_fbuge(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC0(dst, src, fcc_offset); gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); tcg_gen_xori_tl(cpu_tmp0, cpu_tmp0, 0x1); tcg_gen_and_tl(dst, dst, cpu_tmp0); tcg_gen_xori_tl(dst, dst, 0x1);}// 0 or 1: !FCC1static inline void gen_op_eval_fble(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC1(dst, src, fcc_offset); tcg_gen_xori_tl(dst, dst, 0x1);}// !2: !(!FCC0 & FCC1)static inline void gen_op_eval_fbule(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC0(dst, src, fcc_offset); tcg_gen_xori_tl(dst, dst, 0x1); gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); tcg_gen_and_tl(dst, dst, cpu_tmp0); tcg_gen_xori_tl(dst, dst, 0x1);}// !3: !(FCC0 & FCC1)static inline void gen_op_eval_fbo(TCGv dst, TCGv src, unsigned int fcc_offset){ gen_mov_reg_FCC0(dst, src, fcc_offset); gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset); tcg_gen_and_tl(dst, dst, cpu_tmp0); tcg_gen_xori_tl(dst, dst, 0x1);}static inline void gen_branch2(DisasContext *dc, target_ulong pc1, target_ulong pc2, TCGv r_cond){ int l1; l1 = gen_new_label(); tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, tcg_const_tl(0), l1); gen_goto_tb(dc, 0, pc1, pc1 + 4); gen_set_label(l1); gen_goto_tb(dc, 1, pc2, pc2 + 4);}static inline void gen_branch_a(DisasContext *dc, target_ulong pc1, target_ulong pc2, TCGv r_cond){ int l1; l1 = gen_new_label(); tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, tcg_const_tl(0), l1); gen_goto_tb(dc, 0, pc2, pc1); gen_set_label(l1); gen_goto_tb(dc, 1, pc2 + 4, pc2 + 8);}static inline void gen_generic_branch(target_ulong npc1, target_ulong npc2, TCGv r_cond){ int l1, l2; l1 = gen_new_label(); l2 = gen_new_label(); tcg_gen_brcond_tl(TCG_COND_EQ, r_cond, tcg_const_tl(0), l1); tcg_gen_movi_tl(cpu_npc, npc1); tcg_gen_br(l2); gen_set_label(l1); tcg_gen_movi_tl(cpu_npc, npc2); gen_set_label(l2);}/* call this function before using the condition register as it may have been set for a jump */static inline void flush_cond(DisasContext *dc, TCGv cond){ if (dc->npc == JUMP_PC) { gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cond); dc->npc = DYNAMIC_PC; }}static inline void save_npc(DisasContext *dc, TCGv cond){ if (dc->npc == JUMP_PC) { gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cond); dc->npc = DYNAMIC_PC; } else if (dc->npc != DYNAMIC_PC) { tcg_gen_movi_tl(cpu_npc, dc->npc); }}static inline void save_state(DisasContext *dc, TCGv cond){ tcg_gen_movi_tl(cpu_pc, dc->pc); save_npc(dc, cond);}static inline void gen_mov_pc_npc(DisasContext *dc, TCGv cond){ if (dc->npc == JUMP_PC) { gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cond); tcg_gen_mov_tl(cpu_pc, cpu_npc); dc->pc = DYNAMIC_PC; } else if (dc->npc == DYNAMIC_PC) { tcg_gen_mov_tl(cpu_pc, cpu_npc); dc->pc = DYNAMIC_PC; } else { dc->pc = dc->npc; }}static inline void gen_op_next_insn(void){ tcg_gen_mov_tl(cpu_pc, cpu_npc); tcg_gen_addi_tl(cpu_npc, cpu_npc, 4);}static inline void gen_cond(TCGv r_dst, unsigned int cc, unsigned int cond){ TCGv r_src;#ifdef TARGET_SPARC64 if (cc) r_src = cpu_xcc; else r_src = cpu_psr;#else r_src = cpu_psr;#endif switch (cond) { case 0x0: gen_op_eval_bn(r_dst); break; case 0x1: gen_op_eval_be(r_dst, r_src); break; case 0x2: gen_op_eval_ble(r_dst, r_src); break; case 0x3: gen_op_eval_bl(r_dst, r_src); break; case 0x4: gen_op_eval_bleu(r_dst, r_src); break; case 0x5: gen_op_eval_bcs(r_dst, r_src); break; case 0x6: gen_op_eval_bneg(r_dst, r_src); break; case 0x7: gen_op_eval_bvs(r_dst, r_src); break; case 0x8: gen_op_eval_ba(r_dst); break; case 0x9: gen_op_eval_bne(r_dst, r_src); break; case 0xa: gen_op_eval_bg(r_dst, r_src); break; case 0xb: gen_op_eval_bge(r_dst, r_src); break; case 0xc: gen_op_eval_bgu(r_dst, r_src); break; case 0xd: gen_op_eval_bcc(r_dst, r_src); break; case 0xe: gen_op_eval_bpos(r_dst, r_src); break; case 0xf: gen_op_eval_bvc(r_dst, r_src); break; }}static inline void gen_fcond(TCGv r_dst, unsigned int cc, unsigned int cond){ unsigned int offset; switch (cc) { default: case 0x0: offset = 0; break; case 0x1: offset = 32 - 10; break; case 0x2: offset = 34 - 10; break; case 0x3: offset = 36 - 10; break; } switch (cond) { case 0x0: gen_op_eval_bn(r_dst); break; case 0x1: gen_op_eval_fbne(r_dst, cpu_fsr, offset); break; case 0x2: gen_op_eval_fblg(r_dst, cpu_fsr, offset); break; case 0x3: gen_op_eval_fbul(r_dst, cpu_fsr, offset); break; case 0x4: gen_op_eval_fbl(r_dst, cpu_fsr, offset); break; case 0x5: gen_op_eval_fbug(r_dst, cpu_fsr, offset); break; case 0x6: gen_op_eval_fbg(r_dst, cpu_fsr, offset); break; case 0x7: gen_op_eval_fbu(r_dst, cpu_fsr, offset); break; case 0x8: gen_op_eval_ba(r_dst); break; case 0x9: gen_op_eval_fbe(r_dst, cpu_fsr, offset); break; case 0xa: gen_op_eval_fbue(r_dst, cpu_fsr, offset); break; case 0xb: gen_op_eval_fbge(r_dst, cpu_fsr, offset); break; case 0xc: gen_op_eval_fbuge(r_dst, cpu_fsr, offset); break;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?