📄 ppc32_x86_trans.c
字号:
x86_mov_membase_reg(iop->ob_ptr,X86_EDI,OFFSET(cpu_ppc_t,tb),hreg_rd,4); x86_mov_membase_reg(iop->ob_ptr,X86_EDI,OFFSET(cpu_ppc_t,tb)+4,hreg_t0,4); ppc32_op_emit_store_gpr(cpu,rd,hreg_rd); ppc32_jit_close_hreg_seq(cpu); return(0);}/* ADD */DECLARE_INSN(ADD){ int rd = bits(insn,21,25); int ra = bits(insn,16,20); int rb = bits(insn,11,15); int hreg_rd,hreg_ra,hreg_rb; jit_op_t *iop; /* $rd = $ra + $rb */ ppc32_jit_start_hreg_seq(cpu,"add"); hreg_rd = ppc32_jit_alloc_hreg(cpu,rd); hreg_ra = ppc32_jit_alloc_hreg(cpu,ra); hreg_rb = ppc32_jit_alloc_hreg(cpu,rb); ppc32_op_emit_load_gpr(cpu,hreg_ra,ra); ppc32_op_emit_load_gpr(cpu,hreg_rb,rb); iop = ppc32_op_emit_insn_output(cpu,2,"add"); if (rd == ra) x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_rd,hreg_rb); else if (rd == rb) x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_rd,hreg_ra); else { x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4); x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_rd,hreg_rb); } ppc32_op_emit_store_gpr(cpu,rd,hreg_rd); if (insn & 1) ppc32_op_emit_update_flags(cpu,0,TRUE); ppc32_jit_close_hreg_seq(cpu); return(0);}/* ADDC */DECLARE_INSN(ADDC){ int rd = bits(insn,21,25); int ra = bits(insn,16,20); int rb = bits(insn,11,15); int hreg_rd,hreg_ra,hreg_rb,hreg_t0; jit_op_t *iop; /* $rd = $ra + $rb */ ppc32_jit_start_hreg_seq(cpu,"addc"); hreg_rd = ppc32_jit_alloc_hreg(cpu,rd); hreg_ra = ppc32_jit_alloc_hreg(cpu,ra); hreg_rb = ppc32_jit_alloc_hreg(cpu,rb); /* store the carry flag */ hreg_t0 = ppc32_jit_get_tmp_hreg(cpu); ppc32_op_emit_load_gpr(cpu,hreg_ra,ra); ppc32_op_emit_load_gpr(cpu,hreg_rb,rb); iop = ppc32_op_emit_insn_output(cpu,2,"addc"); if (rd == ra) x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_rd,hreg_rb); else if (rd == rb) x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_rd,hreg_ra); else { x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4); x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_rd,hreg_rb); } ppc32_op_emit_store_gpr(cpu,rd,hreg_rd); x86_set_reg(iop->ob_ptr,X86_CC_C,hreg_t0,FALSE); x86_alu_reg_imm(iop->ob_ptr,X86_AND,hreg_t0,0x1); x86_mov_membase_reg(iop->ob_ptr,X86_EDI,OFFSET(cpu_ppc_t,xer_ca), hreg_t0,4); if (insn & 1) { x86_test_reg_reg(iop->ob_ptr,hreg_rd,hreg_rd); ppc32_op_emit_update_flags(cpu,0,TRUE); } ppc32_jit_close_hreg_seq(cpu); return(0);}/* ADDE - Add Extended */DECLARE_INSN(ADDE){ int rd = bits(insn,21,25); int ra = bits(insn,16,20); int rb = bits(insn,11,15); int hreg_ra,hreg_rb,hreg_rd,hreg_t0,hreg_t1; jit_op_t *iop; ppc32_jit_start_hreg_seq(cpu,"adde"); hreg_ra = ppc32_jit_alloc_hreg(cpu,ra); hreg_rb = ppc32_jit_alloc_hreg(cpu,rb); hreg_rd = ppc32_jit_alloc_hreg(cpu,rd); hreg_t0 = ppc32_jit_alloc_hreg(cpu,-1); hreg_t1 = ppc32_jit_get_tmp_hreg(cpu); ppc32_op_emit_alter_host_reg(cpu,hreg_t0); ppc32_op_emit_load_gpr(cpu,hreg_ra,ra); ppc32_op_emit_load_gpr(cpu,hreg_rb,rb); iop = ppc32_op_emit_insn_output(cpu,3,"adde"); /* $t0 = $ra + carry */ x86_alu_reg_reg(iop->ob_ptr,X86_XOR,hreg_t1,hreg_t1); x86_mov_reg_reg(iop->ob_ptr,hreg_t0,hreg_ra,4); x86_alu_reg_membase(iop->ob_ptr,X86_ADD,hreg_t0, X86_EDI,OFFSET(cpu_ppc_t,xer_ca)); x86_set_reg(iop->ob_ptr,X86_CC_C,hreg_t1,FALSE); x86_mov_membase_reg(iop->ob_ptr,X86_EDI,OFFSET(cpu_ppc_t,xer_ca),hreg_t1,4); /* $t0 += $rb */ x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_t0,hreg_rb); x86_set_reg(iop->ob_ptr,X86_CC_C,hreg_t1,FALSE); x86_alu_membase_reg(iop->ob_ptr,X86_OR,X86_EDI,OFFSET(cpu_ppc_t,xer_ca), hreg_t1); /* update cr0 */ if (insn & 1) x86_test_reg_reg(iop->ob_ptr,hreg_t0,hreg_t0); x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_t0,4); ppc32_op_emit_store_gpr(cpu,rd,hreg_rd); if (insn & 1) ppc32_op_emit_update_flags(cpu,0,TRUE); ppc32_jit_close_hreg_seq(cpu); return(0);}/* ADDI - ADD Immediate */DECLARE_INSN(ADDI){ int rd = bits(insn,21,25); int ra = bits(insn,16,20); int imm = bits(insn,0,15); m_uint32_t tmp = sign_extend_32(imm,16); int hreg_rd,hreg_ra; jit_op_t *iop; /* $rd = $ra + imm */ ppc32_jit_start_hreg_seq(cpu,"addi"); hreg_rd = ppc32_jit_alloc_hreg(cpu,rd); if (ra != 0) { hreg_ra = ppc32_jit_alloc_hreg(cpu,ra); ppc32_op_emit_load_gpr(cpu,hreg_ra,ra); iop = ppc32_op_emit_insn_output(cpu,2,"addi"); if (rd != ra) x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4); x86_alu_reg_imm(iop->ob_ptr,X86_ADD,hreg_rd,tmp); } else { iop = ppc32_op_emit_insn_output(cpu,1,"addi"); ppc32_load_imm(&iop->ob_ptr,hreg_rd,tmp); } ppc32_op_emit_store_gpr(cpu,rd,hreg_rd); ppc32_jit_close_hreg_seq(cpu); return(0);}/* ADDIC - ADD Immediate with Carry */DECLARE_INSN(ADDIC){ int rd = bits(insn,21,25); int ra = bits(insn,16,20); int imm = bits(insn,0,15); m_uint32_t tmp = sign_extend_32(imm,16); int hreg_rd,hreg_ra; jit_op_t *iop; /* $rd = $ra + imm */ ppc32_jit_start_hreg_seq(cpu,"addic"); hreg_rd = ppc32_jit_alloc_hreg(cpu,rd); hreg_ra = ppc32_jit_alloc_hreg(cpu,ra); ppc32_op_emit_load_gpr(cpu,hreg_ra,ra); iop = ppc32_op_emit_insn_output(cpu,1,"addic"); if (rd != ra) x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4); x86_alu_reg_imm(iop->ob_ptr,X86_ADD,hreg_rd,tmp); ppc32_op_emit_store_gpr(cpu,rd,hreg_rd); x86_set_membase(iop->ob_ptr,X86_CC_C, X86_EDI,OFFSET(cpu_ppc_t,xer_ca),FALSE); ppc32_jit_close_hreg_seq(cpu); return(0);}/* ADDIC. */DECLARE_INSN(ADDIC_dot){ int rd = bits(insn,21,25); int ra = bits(insn,16,20); int imm = bits(insn,0,15); m_uint32_t tmp = sign_extend_32(imm,16); int hreg_rd,hreg_ra; jit_op_t *iop; /* $rd = $ra + imm */ ppc32_jit_start_hreg_seq(cpu,"addic."); hreg_rd = ppc32_jit_alloc_hreg(cpu,rd); hreg_ra = ppc32_jit_alloc_hreg(cpu,ra); ppc32_op_emit_load_gpr(cpu,hreg_ra,ra); iop = ppc32_op_emit_insn_output(cpu,1,"addic."); if (rd != ra) x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4); x86_alu_reg_imm(iop->ob_ptr,X86_ADD,hreg_rd,tmp); ppc32_op_emit_store_gpr(cpu,rd,hreg_rd); x86_set_membase(iop->ob_ptr,X86_CC_C, X86_EDI,OFFSET(cpu_ppc_t,xer_ca),FALSE); ppc32_op_emit_update_flags(cpu,0,TRUE); ppc32_jit_close_hreg_seq(cpu); return(0);}/* ADDIS - ADD Immediate Shifted */DECLARE_INSN(ADDIS){ int rd = bits(insn,21,25); int ra = bits(insn,16,20); m_uint32_t imm = bits(insn,0,15); m_uint32_t tmp = imm << 16; int hreg_rd,hreg_ra; jit_op_t *iop; /* $rd = $ra + (imm << 16) */ ppc32_jit_start_hreg_seq(cpu,"addis"); hreg_rd = ppc32_jit_alloc_hreg(cpu,rd); if (ra != 0) { hreg_ra = ppc32_jit_alloc_hreg(cpu,ra); ppc32_op_emit_load_gpr(cpu,hreg_ra,ra); iop = ppc32_op_emit_insn_output(cpu,1,"addis"); if (rd != ra) x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4); x86_alu_reg_imm(iop->ob_ptr,X86_ADD,hreg_rd,tmp); } else { //iop = ppc32_op_emit_insn_output(cpu,1,"addis"); //x86_mov_reg_imm(iop->ob_ptr,hreg_rd,tmp); ppc32_op_emit_set_host_reg_imm32(cpu,hreg_rd,tmp); } ppc32_op_emit_store_gpr(cpu,rd,hreg_rd); ppc32_jit_close_hreg_seq(cpu); return(0);}/* ADDZE */DECLARE_INSN(ADDZE){ int rd = bits(insn,21,25); int ra = bits(insn,16,20); int hreg_rd,hreg_ra,hreg_t0; jit_op_t *iop; /* $rd = $ra + xer_ca + set_carry */ ppc32_jit_start_hreg_seq(cpu,"addze"); hreg_rd = ppc32_jit_alloc_hreg(cpu,rd); hreg_ra = ppc32_jit_alloc_hreg(cpu,ra); hreg_t0 = ppc32_jit_get_tmp_hreg(cpu); ppc32_op_emit_load_gpr(cpu,hreg_ra,ra); iop = ppc32_op_emit_insn_output(cpu,2,"addze"); x86_alu_reg_reg(iop->ob_ptr,X86_XOR,hreg_t0,hreg_t0); if (rd != ra) x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4); x86_alu_reg_membase(iop->ob_ptr,X86_ADD,hreg_rd, X86_EDI,OFFSET(cpu_ppc_t,xer_ca)); x86_set_reg(iop->ob_ptr,X86_CC_C,hreg_t0,FALSE); x86_mov_membase_reg(iop->ob_ptr,X86_EDI,OFFSET(cpu_ppc_t,xer_ca),hreg_t0,4); ppc32_op_emit_store_gpr(cpu,rd,hreg_rd); if (insn & 1) ppc32_op_emit_update_flags(cpu,0,TRUE); ppc32_jit_close_hreg_seq(cpu); return(0);}/* AND */DECLARE_INSN(AND){ int rs = bits(insn,21,25); int ra = bits(insn,16,20); int rb = bits(insn,11,15); int hreg_rs,hreg_ra,hreg_rb; jit_op_t *iop; /* $ra = $rs & $rb */ ppc32_jit_start_hreg_seq(cpu,"and"); hreg_rs = ppc32_jit_alloc_hreg(cpu,rs); hreg_ra = ppc32_jit_alloc_hreg(cpu,ra); hreg_rb = ppc32_jit_alloc_hreg(cpu,rb); ppc32_op_emit_load_gpr(cpu,hreg_rs,rs); ppc32_op_emit_load_gpr(cpu,hreg_rb,rb); iop = ppc32_op_emit_insn_output(cpu,1,"and"); if (ra == rs) x86_alu_reg_reg(iop->ob_ptr,X86_AND,hreg_ra,hreg_rb); else if (ra == rb) x86_alu_reg_reg(iop->ob_ptr,X86_AND,hreg_ra,hreg_rs); else { x86_mov_reg_reg(iop->ob_ptr,hreg_ra,hreg_rs,4); x86_alu_reg_reg(iop->ob_ptr,X86_AND,hreg_ra,hreg_rb); } ppc32_op_emit_store_gpr(cpu,ra,hreg_ra); if (insn & 1) ppc32_op_emit_update_flags(cpu,0,TRUE); ppc32_jit_close_hreg_seq(cpu); return(0);}/* ANDC */DECLARE_INSN(ANDC){ int rs = bits(insn,21,25); int ra = bits(insn,16,20); int rb = bits(insn,11,15); int hreg_rs,hreg_ra,hreg_rb,hreg_t0; jit_op_t *iop; /* $ra = $rs & ~$rb */ ppc32_jit_start_hreg_seq(cpu,"andc"); hreg_rs = ppc32_jit_alloc_hreg(cpu,rs); hreg_ra = ppc32_jit_alloc_hreg(cpu,ra); hreg_rb = ppc32_jit_alloc_hreg(cpu,rb); ppc32_op_emit_load_gpr(cpu,hreg_rs,rs); ppc32_op_emit_load_gpr(cpu,hreg_rb,rb); iop = ppc32_op_emit_insn_output(cpu,1,"andc"); /* $t0 = ~$rb */ hreg_t0 = ppc32_jit_get_tmp_hreg(cpu); x86_mov_reg_reg(iop->ob_ptr,hreg_t0,hreg_rb,4); x86_not_reg(iop->ob_ptr,hreg_t0); /* $ra = $rs & $t0 */ if (ra == rs) x86_alu_reg_reg(iop->ob_ptr,X86_AND,hreg_ra,hreg_t0); else { x86_alu_reg_reg(iop->ob_ptr,X86_AND,hreg_t0,hreg_rs); x86_mov_reg_reg(iop->ob_ptr,hreg_ra,hreg_t0,4); } ppc32_op_emit_store_gpr(cpu,ra,hreg_ra); if (insn & 1) ppc32_op_emit_update_flags(cpu,0,TRUE); ppc32_jit_close_hreg_seq(cpu); return(0);}/* AND Immediate */DECLARE_INSN(ANDI){ int rs = bits(insn,21,25); int ra = bits(insn,16,20); m_uint16_t imm = bits(insn,0,15); m_uint32_t tmp = imm; int hreg_rs,hreg_ra; jit_op_t *iop; /* $ra = $rs & imm */ ppc32_jit_start_hreg_seq(cpu,"andi"); hreg_rs = ppc32_jit_alloc_hreg(cpu,rs); hreg_ra = ppc32_jit_alloc_hreg(cpu,ra); ppc32_op_emit_load_gpr(cpu,hreg_rs,rs); iop = ppc32_op_emit_insn_output(cpu,2,"andi"); if (ra != rs) x86_mov_reg_reg(iop->ob_ptr,hreg_ra,hreg_rs,4); x86_alu_reg_imm(iop->ob_ptr,X86_AND,hreg_ra,tmp); ppc32_op_emit_store_gpr(cpu,ra,hreg_ra); ppc32_op_emit_update_flags(cpu,0,TRUE); ppc32_jit_close_hreg_seq(cpu); return(0);}/* AND Immediate Shifted */DECLARE_INSN(ANDIS){ int rs = bits(insn,21,25); int ra = bits(insn,16,20); m_uint32_t imm = bits(insn,0,15); m_uint32_t tmp = imm << 16; int hreg_rs,hreg_ra; jit_op_t *iop;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -