⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mips64_amd64_trans.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
📖 第 1 页 / 共 5 页
字号:
   amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RAX,8);   return(0);}/* DSLLV */DECLARE_INSN(DSLLV){   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 */DECLARE_INSN(DSRA){   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 */DECLARE_INSN(DSRA32){   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 */DECLARE_INSN(DSRAV){   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 */DECLARE_INSN(DSRL){   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 */DECLARE_INSN(DSRL32){   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 */DECLARE_INSN(DSRLV){   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 */DECLARE_INSN(DSUBU){   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 */DECLARE_INSN(ERET){   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);   mips64_jit_tcb_push_epilog(b);   return(0);}/* J (Jump) */DECLARE_INSN(J){   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 */   mips64_jit_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) */DECLARE_INSN(JAL){   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 */   mips64_jit_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) */DECLARE_INSN(JALR){   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 */   mips64_jit_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 */   mips64_jit_tcb_push_epilog(b);   return(0);}/* JR (Jump Register) */DECLARE_INSN(JR){   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 */   mips64_jit_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 */   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);   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) */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;#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) */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);   amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,                         AMD64_R15,OFFSET(cpu_mips_t,hi),8);   amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RDX,8);   return(0);}/* MFLO */DECLARE_INSN(MFLO){   int rd = bits(insn,11,15);   if (!rd) return(0);   amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,                         AMD64_R15,OFFSET(cpu_mips_t,lo),8);   amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RDX,8);   return(0);}/* MOVE (virtual instruction, real: ADDU) */DECLARE_INSN(MOVE){	   int rs = bits(insn,21,25);   int rd = bits(insn,11,15);   amd64_mov_reg_membase(b->jit_ptr,AMD64_RDX,AMD64_R15,REG_OFFSET(rs),4);   amd64_movsxd_reg_reg(b->jit_ptr,AMD64_RDX,X86_EDX);   amd64_mov_membase_reg(b->jit_ptr,AMD64_R15,REG_OFFSET(rd),AMD64_RDX,8);   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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -