📄 mips64_amd64_trans.c
字号:
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); amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,AMD64_R15,REG_OFFSET(rs),8); amd64_mov_membase_reg(b->jit_ptr, AMD64_R15,OFFSET(cpu_mips_t,hi),AMD64_RDX,8); return(0);}/* MTLO */DECLARE_INSN(MTLO){ int rs = bits(insn,21,25); amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,AMD64_R15,REG_OFFSET(rs),8); amd64_mov_membase_reg(b->jit_ptr, AMD64_R15,OFFSET(cpu_mips_t,lo),AMD64_RDX,8); return(0); }/* MUL */DECLARE_INSN(MUL){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int rd = bits(insn,11,15); /* eax = gpr[rs] */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),4); /* ecx = gpr[rt] */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rt),4); amd64_mul_reg_size(b->jit_ptr,AMD64_RCX,1,4); /* store result in gpr[rd] */ amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* MULT */DECLARE_INSN(MULT){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); /* eax = gpr[rs] */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),4); /* ecx = gpr[rt] */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rt),4); amd64_mul_reg_size(b->jit_ptr,AMD64_RCX,1,4); /* store LO */ amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,lo), AMD64_RAX,8); /* store HI */ amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RDX,X86_EDX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,hi), AMD64_RDX,8); return(0);}/* MULTU */DECLARE_INSN(MULTU){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); /* eax = gpr[rs] */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),4); /* ecx = gpr[rt] */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rt),4); amd64_mul_reg_size(b->jit_ptr,AMD64_RCX,0,4); /* store LO */ amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,lo), AMD64_RAX,8); /* store HI */ amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RDX,X86_EDX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,hi), AMD64_RDX,8); return(0);}/* NOP */DECLARE_INSN(NOP){ return(0);}/* NOR */DECLARE_INSN(NOR){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int rd = bits(insn,11,15); amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8); amd64_alu_reg_membase(b->jit_ptr,X86_OR,AMD64_RAX,AMD64_R15, REG_OFFSET(rt)); amd64_not_reg(b->jit_ptr,AMD64_RAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* OR */DECLARE_INSN(OR){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int rd = bits(insn,11,15); amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8); amd64_alu_reg_membase(b->jit_ptr,X86_OR,AMD64_RAX,AMD64_R15, REG_OFFSET(rt)); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* ORI */DECLARE_INSN(ORI){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int imm = bits(insn,0,15); mips64_load_imm(b,AMD64_RAX,imm); amd64_alu_reg_membase(b->jit_ptr,X86_OR,AMD64_RAX, AMD64_R15,REG_OFFSET(rs)); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RAX,8); return(0);}/* PREF */DECLARE_INSN(PREF){ amd64_nop(b->jit_ptr); return(0);}/* PREFI */DECLARE_INSN(PREFI){ amd64_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(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_SB,base,offset,rt,FALSE); return(0);}/* SC (Store Conditional) */DECLARE_INSN(SC){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_SC,base,offset,rt,TRUE); return(0);}/* SD (Store Double-Word) */DECLARE_INSN(SD){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_SD,base,offset,rt,FALSE); return(0);}/* SDL (Store Double-Word Left) */DECLARE_INSN(SDL){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_SDL,base,offset,rt,FALSE); return(0);}/* SDR (Store Double-Word Right) */DECLARE_INSN(SDR){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_SDR,base,offset,rt,FALSE); return(0);}/* SDC1 (Store Double-Word from Coprocessor 1) */DECLARE_INSN(SDC1){ int base = bits(insn,21,25); int ft = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_SDC1,base,offset,ft,FALSE); return(0);}/* SH (Store Half-Word) */DECLARE_INSN(SH){ int base = bits(insn,21,25); int rt = bits(insn,16,20); int offset = bits(insn,0,15); mips64_emit_memop(b,MIPS_MEMOP_SH,base,offset,rt,FALSE); return(0);}/* SLL */DECLARE_INSN(SLL){ int rt = bits(insn,16,20); int rd = bits(insn,11,15); int sa = bits(insn,6,10); amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),4); amd64_shift_reg_imm(b->jit_ptr,X86_SHL,AMD64_RAX,sa); amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* SLLV */DECLARE_INSN(SLLV){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int rd = bits(insn,11,15); amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rs),4); amd64_alu_reg_imm(b->jit_ptr,X86_AND,AMD64_RCX,0x1f); amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),4); amd64_shift_reg(b->jit_ptr,X86_SHL,AMD64_RAX); amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* SLT */DECLARE_INSN(SLT){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int rd = bits(insn,11,15); u_char *test1; /* RDX = gpr[rs] */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,AMD64_R15,REG_OFFSET(rs),8); /* RAX = gpr[rt] */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8); /* we set rd to 1 when gpr[rs] < gpr[rt] */ amd64_clear_reg(b->jit_ptr,AMD64_RCX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RCX,8); amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RDX,AMD64_RAX); test1 = b->jit_ptr; amd64_branch8(b->jit_ptr, X86_CC_GE, 0, 1); amd64_inc_membase(b->jit_ptr,AMD64_R15,REG_OFFSET(rd)); /* end */ amd64_patch(test1,b->jit_ptr); return(0);}/* SLTI */DECLARE_INSN(SLTI){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int imm = bits(insn,0,15); m_uint64_t val = sign_extend(imm,16); u_char *test1; /* RDX = val */ mips64_load_imm(b,AMD64_RDX,val); /* RAX = gpr[rs] */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8); /* we set rt to 1 when gpr[rs] < val */ amd64_clear_reg(b->jit_ptr,AMD64_RCX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RCX,8); amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RAX,AMD64_RDX); test1 = b->jit_ptr; amd64_branch8(b->jit_ptr, X86_CC_GE, 0, 1); amd64_inc_membase(b->jit_ptr,AMD64_R15,REG_OFFSET(rt)); /* end */ amd64_patch(test1,b->jit_ptr); return(0);}/* SLTU */DECLARE_INSN(SLTU){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int rd = bits(insn,11,15); u_char *test1; /* RDX = gpr[rs] */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,AMD64_R15,REG_OFFSET(rs),8); /* RAX = gpr[rt] */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8); /* we set rd to 1 when gpr[rs] < gpr[rt] */ amd64_clear_reg(b->jit_ptr,AMD64_RCX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RCX,8); amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RDX,AMD64_RAX); test1 = b->jit_ptr; amd64_branch8(b->jit_ptr, X86_CC_AE, 0, 0); amd64_inc_membase(b->jit_ptr,AMD64_R15,REG_OFFSET(rd)); /* end */ amd64_patch(test1,b->jit_ptr); return(0);}/* SLTIU */DECLARE_INSN(SLTIU){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int imm = bits(insn,0,15); m_uint64_t val = sign_extend(imm,16); u_char *test1; /* RDX = val */ mips64_load_imm(b,AMD64_RDX,val); /* RAX = gpr[rs] */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8); /* we set rt to 1 when gpr[rs] < val */ amd64_clear_reg(b->jit_ptr,AMD64_RCX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RCX,8); amd64_alu_reg_reg(b->jit_ptr,X86_CMP,AMD64_RAX,AMD64_RDX); test1 = b->jit_ptr; amd64_branch8(b->jit_ptr, X86_CC_AE, 0, 0); amd64_inc_membase(b->jit_ptr,AMD64_R15,REG_OFFSET(rt)); /* end */ amd64_patch(test1,b->jit_ptr); return(0);}/* SRA */DECLARE_INSN(SRA){ int rt = bits(insn,16,20); int rd = bits(insn,11,15); int sa = bits(insn,6,10); amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),4); amd64_shift_reg_imm_size(b->jit_ptr,X86_SAR,AMD64_RAX,sa,4); amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* SRAV */DECLARE_INSN(SRAV){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int rd = bits(insn,11,15); amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rs),4); amd64_alu_reg_imm(b->jit_ptr,X86_AND,AMD64_RCX,0x1f); amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),4); amd64_shift_reg_size(b->jit_ptr,X86_SAR,AMD64_RAX,4); amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* SRL */DECLARE_INSN(SRL){ int rt = bits(insn,16,20); int rd = bits(insn,11,15); int sa = bits(insn,6,10); amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),4); amd64_shift_reg_imm(b->jit_ptr,X86_SHR,AMD64_RAX,sa); amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* SRLV */DECLARE_INSN(SRLV){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int rd = bits(insn,11,15); amd64_mov_reg_membase(b->jit_ptr,AMD64_RCX,AMD64_R15,REG_OFFSET(rs),4); amd64_alu_reg_imm(b->jit_ptr,X86_AND,AMD64_RCX,0x1f); amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),4); amd64_shift_reg(b->jit_ptr,X86_SHR,AMD64_RAX); amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* SUB */DECLARE_INSN(SUB){ int rs = bits(insn,21,25); int rt = bits(insn,16,20); int rd = bits(insn,11,15); /* TODO: Exception handling */ amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rs),8); amd64_alu_reg_membase(b->jit_ptr,X86_SUB,AMD64_RAX,AMD64_R15, REG_OFFSET(rt)); amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RAX,X86_EAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -