📄 mips64_x86_trans.c
字号:
/* set the new pc */ x86_mov_reg_membase(b->jit_ptr,X86_ECX, X86_EDI,OFFSET(cpu_mips_t,ret_pc),4); x86_mov_reg_membase(b->jit_ptr,X86_EDX, X86_EDI,OFFSET(cpu_mips_t,ret_pc)+4,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,pc),X86_ECX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,pc)+4,X86_EDX,4); /* returns to the caller which will determine the next path */ mips64_jit_tcb_push_epilog(b); return(0);}/* LB (Load Byte) */DECLARE_INSN(LB){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_LB,base,offset,rt,TRUE); return(0);}/* LBU (Load Byte Unsigned) */DECLARE_INSN(LBU){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_LBU,base,offset,rt,TRUE); return(0);}/* LD (Load Double-Word) */DECLARE_INSN(LD){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_LD,base,offset,rt,TRUE); return(0);}/* LDC1 (Load Double-Word to Coprocessor 1) */DECLARE_INSN(LDC1){ int base = bits(insn,21,25); int ft = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_LDC1,base,offset,ft,TRUE); return(0);}/* LDL (Load Double-Word Left) */DECLARE_INSN(LDL){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_LDL,base,offset,rt,TRUE); return(0);}/* LDR (Load Double-Word Right) */DECLARE_INSN(LDR){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_LDR,base,offset,rt,TRUE); return(0);}/* LH (Load Half-Word) */DECLARE_INSN(LH){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_LH,base,offset,rt,TRUE); return(0);}/* LHU (Load Half-Word Unsigned) */DECLARE_INSN(LHU){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_LHU,base,offset,rt,TRUE); return(0);}/* LI (virtual) */DECLARE_INSN(LI){ int rt = bits(insn,16,20); int imm = bits(insn,0,15); m_uint64_t val = sign_extend(imm,16); x86_mov_membase_imm(b->jit_ptr,X86_EDI,REG_OFFSET(rt),val & 0xffffffff,4); x86_mov_membase_imm(b->jit_ptr,X86_EDI,REG_OFFSET(rt)+4,val >> 32,4); return(0);}/* LL (Load Linked) */DECLARE_INSN(LL){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_LL,base,offset,rt,TRUE); return(0);}/* LUI */DECLARE_INSN(LUI){ int rt = bits(insn,16,20); int imm = bits(insn,0,15); m_uint64_t val = sign_extend(imm,16) << 16; mips64_load_imm(b,X86_EBX,X86_EAX,val); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rt),X86_EAX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rt)+4,X86_EBX,4); return(0);}/* LW (Load Word) */DECLARE_INSN(LW){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); if (cpu->fast_memop) { mips64_emit_memop_fast(cpu,b,0,MIPS_MEMOP_LW,base,offset,rt,TRUE, mips64_memop_fast_lw); } else { mips64_emit_memop(b,MIPS_MEMOP_LW,base,offset,rt,TRUE); } return(0);}/* LWL (Load Word Left) */DECLARE_INSN(LWL){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_LWL,base,offset,rt,TRUE); return(0);}/* LWR (Load Word Right) */DECLARE_INSN(LWR){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_LWR,base,offset,rt,TRUE); return(0);}/* LWU (Load Word Unsigned) */DECLARE_INSN(LWU){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_LWU,base,offset,rt,TRUE); return(0);}/* MFC0 */DECLARE_INSN(MFC0){ int rt = bits(insn,16,20); int rd = bits(insn,11,15); mips64_emit_cp_xfr_op(b,rt,rd,mips64_cp0_exec_mfc0); return(0);}/* MFC1 */DECLARE_INSN(MFC1){ int rt = bits(insn,16,20); int rd = bits(insn,11,15); mips64_emit_cp_xfr_op(b,rt,rd,mips64_exec_mfc1); return(0);}/* MFHI */DECLARE_INSN(MFHI){ int rd = bits(insn,11,15); x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,OFFSET(cpu_mips_t,hi),4); x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,OFFSET(cpu_mips_t,hi)+4,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd),X86_EAX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd)+4,X86_EBX,4); return(0);}/* MFLO */DECLARE_INSN(MFLO){ int rd = bits(insn,11,15); if (!rd) return(0); x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,OFFSET(cpu_mips_t,lo),4); x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,OFFSET(cpu_mips_t,lo)+4,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd),X86_EAX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd)+4,X86_EBX,4); return(0);}/* MOVE (virtual instruction, real: ADDU) */DECLARE_INSN(MOVE){ int rs = bits(insn,21,25); int rd = bits(insn,11,15); if (rs != 0) { x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rs),4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd),X86_EAX,4); x86_cdq(b->jit_ptr); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd)+4,X86_EDX,4); } else { x86_alu_reg_reg(b->jit_ptr,X86_XOR,X86_EBX,X86_EBX); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd),X86_EBX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd)+4,X86_EBX,4); } return(0);}/* MTC0 */DECLARE_INSN(MTC0){ int rt = bits(insn,16,20); int rd = bits(insn,11,15); mips64_emit_cp_xfr_op(b,rt,rd,mips64_cp0_exec_mtc0); return(0);}/* MTC1 */DECLARE_INSN(MTC1){ int rt = bits(insn,16,20); int rd = bits(insn,11,15); mips64_emit_cp_xfr_op(b,rt,rd,mips64_exec_mtc1); return(0);}/* MTHI */DECLARE_INSN(MTHI){ int rs = bits(insn,21,25); x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rs),4); x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rs)+4,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,hi),X86_EAX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,hi)+4,X86_EBX,4); return(0);}/* MTLO */DECLARE_INSN(MTLO){ int rs = bits(insn,21,25); x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rs),4); x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rs)+4,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,lo),X86_EAX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,lo)+4,X86_EBX,4); return(0);}/* MUL */DECLARE_INSN(MUL){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int rd = bits(insn,11,15); x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rs),4); x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rt),4); x86_mul_reg(b->jit_ptr,X86_EBX,1); /* store result in gpr[rd] */ x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd),X86_EAX,4); x86_cdq(b->jit_ptr); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd)+4,X86_EDX,4); return(0);}/* MULT */DECLARE_INSN(MULT){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rs),4); x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rt),4); x86_mul_reg(b->jit_ptr,X86_EBX,1); /* store LO */ x86_mov_reg_reg(b->jit_ptr,X86_ECX,X86_EDX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,lo),X86_EAX,4); x86_cdq(b->jit_ptr); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,lo)+4,X86_EDX,4); /* store HI */ x86_mov_reg_reg(b->jit_ptr,X86_EAX,X86_ECX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,hi),X86_EAX,4); x86_cdq(b->jit_ptr); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,hi)+4,X86_EDX,4); return(0);}/* MULTU */DECLARE_INSN(MULTU){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rs),4); x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rt),4); x86_mul_reg(b->jit_ptr,X86_EBX,0); /* store LO */ x86_mov_reg_reg(b->jit_ptr,X86_ECX,X86_EDX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,lo),X86_EAX,4); x86_cdq(b->jit_ptr); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,lo)+4,X86_EDX,4); /* store HI */ x86_mov_reg_reg(b->jit_ptr,X86_EAX,X86_ECX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,hi),X86_EAX,4); x86_cdq(b->jit_ptr); x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,hi)+4,X86_EDX,4); return(0);}/* NOP */DECLARE_INSN(NOP){ //x86_nop(b->jit_ptr); return(0);}/* NOR */DECLARE_INSN(NOR){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int rd = bits(insn,11,15); x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rs),4); x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rs)+4,4); x86_alu_reg_membase(b->jit_ptr,X86_OR,X86_EAX,X86_EDI,REG_OFFSET(rt)); x86_alu_reg_membase(b->jit_ptr,X86_OR,X86_EBX,X86_EDI,REG_OFFSET(rt)+4); x86_not_reg(b->jit_ptr,X86_EAX); x86_not_reg(b->jit_ptr,X86_EBX); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd),X86_EAX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd)+4,X86_EBX,4); return(0);}/* OR */DECLARE_INSN(OR){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int rd = bits(insn,11,15); x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rs),4); x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rs)+4,4); x86_alu_reg_membase(b->jit_ptr,X86_OR,X86_EAX,X86_EDI,REG_OFFSET(rt)); x86_alu_reg_membase(b->jit_ptr,X86_OR,X86_EBX,X86_EDI,REG_OFFSET(rt)+4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd),X86_EAX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd)+4,X86_EBX,4); return(0);}/* ORI */DECLARE_INSN(ORI){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int imm = bits(insn,0,15); m_uint64_t val = imm; x86_mov_reg_imm(b->jit_ptr,X86_EAX,val & 0xffff); x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rs)+4,4); x86_alu_reg_membase(b->jit_ptr,X86_OR,X86_EAX,X86_EDI,REG_OFFSET(rs)); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rt),X86_EAX,4); x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rt)+4,X86_EBX,4); return(0);}/* PREF */DECLARE_INSN(PREF){ x86_nop(b->jit_ptr); return(0);}/* PREFI */DECLARE_INSN(PREFI){ x86_nop(b->jit_ptr); return(0);}/* SB (Store Byte) */DECLARE_INSN(SB){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(ins
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -