📄 amd64_trans.c
字号:
mips64_emit_cp_xfr_op(b,rt,rd,cp0_exec_dmfc0); return(0);}/* DMFC1 */static int mips64_emit_DMFC1(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ int rt = bits(insn,16,20); int rd = bits(insn,11,15); mips64_emit_cp_xfr_op(b,rt,rd,mips64_exec_dmfc1); return(0);}/* DMTC0 */static int mips64_emit_DMTC0(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ int rt = bits(insn,16,20); int rd = bits(insn,11,15); mips64_emit_cp_xfr_op(b,rt,rd,cp0_exec_dmtc0); return(0);}/* DMTC1 */static int mips64_emit_DMTC1(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ int rt = bits(insn,16,20); int rd = bits(insn,11,15); mips64_emit_cp_xfr_op(b,rt,rd,mips64_exec_dmtc1); return(0);}/* DSLL */static int mips64_emit_DSLL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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),8); amd64_shift_reg_imm(b->jit_ptr,X86_SHL,AMD64_RAX,sa); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* DSLL32 */static int mips64_emit_DSLL32(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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),8); amd64_shift_reg_imm(b->jit_ptr,X86_SHL,AMD64_RAX,sa+32); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* DSLLV */static int mips64_emit_DSLLV(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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,0x3f); amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8); amd64_shift_reg(b->jit_ptr,X86_SHL,AMD64_RAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* DSRA */static int mips64_emit_DSRA(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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),8); amd64_shift_reg_imm(b->jit_ptr,X86_SAR,AMD64_RAX,sa); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* DSRA32 */static int mips64_emit_DSRA32(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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),8); amd64_shift_reg_imm(b->jit_ptr,X86_SAR,AMD64_RAX,sa+32); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* DSRAV */static int mips64_emit_DSRAV(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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,0x3f); amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8); amd64_shift_reg(b->jit_ptr,X86_SAR,AMD64_RAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* DSRL */static int mips64_emit_DSRL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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),8); amd64_shift_reg_imm(b->jit_ptr,X86_SHR,AMD64_RAX,sa); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* DSRL32 */static int mips64_emit_DSRL32(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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),8); amd64_shift_reg_imm(b->jit_ptr,X86_SHR,AMD64_RAX,sa+32); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* DSRLV */static int mips64_emit_DSRLV(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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,0x3f); amd64_mov_reg_membase(b->jit_ptr,AMD64_RAX,AMD64_R15,REG_OFFSET(rt),8); amd64_shift_reg(b->jit_ptr,X86_SHR,AMD64_RAX); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* DSUBU: rd = rs - rt */static int mips64_emit_DSUBU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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_SUB,AMD64_RAX, AMD64_R15,REG_OFFSET(rt)); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); return(0);}/* ERET */static int mips64_emit_ERET(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2)); amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8); mips64_emit_basic_c_call(b,mips64_exec_eret); insn_block_push_epilog(b); return(0);}/* J (Jump) */static int mips64_emit_J(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ u_int instr_index = bits(insn,0,25); m_uint64_t new_pc; /* compute the new pc */ new_pc = b->start_pc + (b->mips_trans_pos << 2); new_pc &= ~((1 << 28) - 1); new_pc |= instr_index << 2; /* insert the instruction in the delay slot */ insn_fetch_and_emit(cpu,b,1); /* set the new pc in cpu structure */ mips64_set_jump(cpu,b,new_pc,1); return(0);}/* JAL (Jump And Link) */static int mips64_emit_JAL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ u_int instr_index = bits(insn,0,25); m_uint64_t new_pc; /* compute the new pc */ new_pc = b->start_pc + (b->mips_trans_pos << 2); new_pc &= ~((1 << 28) - 1); new_pc |= instr_index << 2; /* set the return address (instruction after the delay slot) */ mips64_set_ra(b,b->start_pc + ((b->mips_trans_pos + 1) << 2)); /* insert the instruction in the delay slot */ insn_fetch_and_emit(cpu,b,1); /* set the new pc in cpu structure */ mips64_set_jump(cpu,b,new_pc,0); return(0);}/* JALR (Jump and Link Register) */static int mips64_emit_JALR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ int rs = bits(insn,21,25); int rd = bits(insn,11,15); m_uint64_t ret_pc; /* set the return pc (instruction after the delay slot) in GPR[rd] */ ret_pc = b->start_pc + ((b->mips_trans_pos + 1) << 2); mips64_load_imm(b,AMD64_RAX,ret_pc); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8); /* get the new pc */ amd64_mov_reg_membase(b->jit_ptr,AMD64_R14,AMD64_R15,REG_OFFSET(rs),8);#if DEBUG_JR0 { u_char *test1; amd64_test_reg_reg(b->jit_ptr,AMD64_R14,AMD64_R14); test1 = b->jit_ptr; amd64_branch8(b->jit_ptr, X86_CC_NZ, 0, 1); amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8); mips64_emit_c_call(b,mips64_debug_jr0); amd64_patch(test1,b->jit_ptr); }#endif /* insert the instruction in the delay slot */ insn_fetch_and_emit(cpu,b,1); /* set the new pc */ amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,OFFSET(cpu_mips_t,pc), AMD64_R14,8); /* returns to the caller which will determine the next path */ insn_block_push_epilog(b); return(0);}/* JR (Jump Register) */static int mips64_emit_JR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ int rs = bits(insn,21,25); /* get the new pc */ amd64_mov_reg_membase(b->jit_ptr,AMD64_R14,AMD64_R15,REG_OFFSET(rs),8); #if DEBUG_JR0 { u_char *test1; amd64_test_reg_reg(b->jit_ptr,AMD64_RCX,AMD64_RCX); test1 = b->jit_ptr; amd64_branch8(b->jit_ptr, X86_CC_NZ, 0, 1); amd64_mov_reg_reg(b->jit_ptr,AMD64_RDI,AMD64_R15,8); mips64_emit_c_call(b,mips64_debug_jr0); amd64_patch(test1,b->jit_ptr); }#endif /* insert the instruction in the delay slot */ insn_fetch_and_emit(cpu,b,1); /* set the new pc */ amd64_mov_membase_reg(b->jit_ptr, AMD64_R15,OFFSET(cpu_mips_t,pc), AMD64_R14,8); /* returns to the caller which will determine the next path */ insn_block_push_epilog(b); return(0);}/* LB (Load Byte) */static int mips64_emit_LB(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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) */static int mips64_emit_LBU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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) */static int mips64_emit_LD(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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) */static int mips64_emit_LDC1(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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) */static int mips64_emit_LDL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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) */static int mips64_emit_LDR(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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) */static int mips64_emit_LH(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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) */static int mips64_emit_LHU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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) */static int mips64_emit_LI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ int rt = bits(insn,16,20); int imm = bits(insn,0,15); m_uint64_t val = sign_extend(imm,16); mips64_load_imm(b,AMD64_RCX,val); amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RCX,8); return(0);}/* LL (Load Linked) */static int mips64_emit_LL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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 */static int mips64_emit_LUI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ int rt = bits(insn,16,20); int imm = bits(insn,0,15); m_uint64_t val = sign_extend(imm,16) << 16;#if 1 mips64_load_imm(b,AMD64_RCX,val);#else amd64_mov_reg_imm(b->jit_ptr,AMD64_RCX,imm); amd64_shift_reg_imm(b->jit_ptr,X86_SHL,AMD64_RCX,48); amd64_shift_reg_imm(b->jit_ptr,X86_SAR,AMD64_RCX,32);#endif amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rt),AMD64_RCX,8); return(0);}/* LW (Load Word) */static int mips64_emit_LW(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ 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,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) */static int mips64_emit_LWL(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){ int base = bits(insn,21,25); int rt = bits(insn,16,20);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -