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