📄 ppc32_amd64_trans.c
字号:
ppc32_op_emit_store_gpr(cpu,rd,hreg_rd); /* store the carry flag */ amd64_set_reg(iop->ob_ptr,X86_CC_C,hreg_t0,FALSE); amd64_alu_reg_imm(iop->ob_ptr,X86_AND,hreg_t0,0x1); amd64_mov_membase_reg(iop->ob_ptr,AMD64_R15,OFFSET(cpu_ppc_t,xer_ca), hreg_t0,4); if (insn & 1) { amd64_test_reg_reg_size(iop->ob_ptr,hreg_rd,hreg_rd,4); 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 */ amd64_alu_reg_reg(iop->ob_ptr,X86_XOR,hreg_t1,hreg_t1); amd64_mov_reg_reg(iop->ob_ptr,hreg_t0,hreg_ra,4); amd64_alu_reg_membase_size(iop->ob_ptr,X86_ADD,hreg_t0, AMD64_R15,OFFSET(cpu_ppc_t,xer_ca),4); amd64_set_reg(iop->ob_ptr,X86_CC_C,hreg_t1,FALSE); amd64_mov_membase_reg(iop->ob_ptr,AMD64_R15,OFFSET(cpu_ppc_t,xer_ca), hreg_t1,4); /* $t0 += $rb */ amd64_alu_reg_reg_size(iop->ob_ptr,X86_ADD,hreg_t0,hreg_rb,4); amd64_set_reg(iop->ob_ptr,X86_CC_C,hreg_t1,FALSE); amd64_alu_membase_reg_size(iop->ob_ptr,X86_OR, AMD64_R15,OFFSET(cpu_ppc_t,xer_ca), hreg_t1,4); /* update cr0 */ if (insn & 1) amd64_test_reg_reg_size(iop->ob_ptr,hreg_t0,hreg_t0,4); amd64_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) amd64_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4); amd64_alu_reg_imm_size(iop->ob_ptr,X86_ADD,hreg_rd,tmp,4); } 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) amd64_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4); amd64_alu_reg_imm_size(iop->ob_ptr,X86_ADD,hreg_rd,tmp,4); ppc32_op_emit_store_gpr(cpu,rd,hreg_rd); amd64_set_membase(iop->ob_ptr,X86_CC_C, AMD64_R15,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) amd64_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4); amd64_alu_reg_imm_size(iop->ob_ptr,X86_ADD,hreg_rd,tmp,4); ppc32_op_emit_store_gpr(cpu,rd,hreg_rd); amd64_set_membase(iop->ob_ptr,X86_CC_C, AMD64_R15,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) amd64_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4); amd64_alu_reg_imm_size(iop->ob_ptr,X86_ADD,hreg_rd,tmp,4); } else { iop = ppc32_op_emit_insn_output(cpu,1,"addis"); amd64_mov_reg_imm(iop->ob_ptr,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"); amd64_alu_reg_reg(iop->ob_ptr,X86_XOR,hreg_t0,hreg_t0); if (rd != ra) amd64_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4); amd64_alu_reg_membase_size(iop->ob_ptr,X86_ADD,hreg_rd, AMD64_R15,OFFSET(cpu_ppc_t,xer_ca),4); amd64_set_reg(iop->ob_ptr,X86_CC_C,hreg_t0,FALSE); amd64_mov_membase_reg(iop->ob_ptr,AMD64_R15,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) amd64_alu_reg_reg_size(iop->ob_ptr,X86_AND,hreg_ra,hreg_rb,4); else if (ra == rb) amd64_alu_reg_reg_size(iop->ob_ptr,X86_AND,hreg_ra,hreg_rs,4); else { amd64_mov_reg_reg(iop->ob_ptr,hreg_ra,hreg_rs,4); amd64_alu_reg_reg_size(iop->ob_ptr,X86_AND,hreg_ra,hreg_rb,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);}/* 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); amd64_mov_reg_reg(iop->ob_ptr,hreg_t0,hreg_rb,4); amd64_not_reg(iop->ob_ptr,hreg_t0); /* $ra = $rs & $t0 */ if (ra == rs) amd64_alu_reg_reg_size(iop->ob_ptr,X86_AND,hreg_ra,hreg_t0,4); else { amd64_alu_reg_reg_size(iop->ob_ptr,X86_AND,hreg_t0,hreg_rs,4); amd64_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) amd64_mov_reg_reg(iop->ob_ptr,hreg_ra,hreg_rs,4); amd64_alu_reg_imm_size(iop->ob_ptr,X86_AND,hreg_ra,tmp,4); 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; /* $ra = $rs & imm */ ppc32_jit_start_hreg_seq(cpu,"andis"); 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,"andis"); if (ra != rs) amd64_mov_reg_reg(iop->ob_ptr,hreg_ra,hreg_rs,4); amd64_alu_reg_imm_size(iop->ob_ptr,X86_AND,hreg_ra,tmp,4); 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);}/* B - Branch */DECLARE_INSN(B){ m_uint32_t offset = bits(insn,2,25); m_uint32_t new_ia; jit_op_t *iop; iop = ppc32_op_emit_insn_output(cpu,4,"b"); /* compute the new ia */ new_ia = b->start_ia + (b->ppc_trans_pos << 2); new_ia += sign_extend(offset << 2,26); ppc32_set_jump(cpu,b,iop,new_ia,TRUE); ppc32_op_emit_basic_opcode(cpu,JIT_OP_EOB); ppc32_op_emit_branch_target(cpu,b,new_ia); ppc32_op_emit_branch_target(cpu,b,b->start_ia+((b->ppc_trans_pos+1) << 2)); return(0);}/* BA - Branch Absolute */DECLARE_INSN(BA){ m_uint32_t offset = bits(insn,2,25); m_uint32_t new_ia; jit_op_t *iop; iop = ppc32_op_emit_insn_output(cpu,4,"ba"); /* compute the new ia */ new_ia = sign_extend(offset << 2,26); ppc32_set_jump(cpu,b,iop,new_ia,TRUE); ppc32_op_emit_basic_opcode(cpu,JIT_OP_EOB); ppc32_op_emit_branch_target(cpu,b,new_ia); ppc32_op_emit_branch_target(cpu,b,b->start_ia+((b->ppc_trans_pos+1) << 2)); return(0);}/* BL - Branch and Link */DECLARE_INSN(BL){ m_uint32_t offset = bits(insn,2,25); m_uint32_t new_ia; jit_op_t *iop;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -