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

📄 mips64_amd64_trans.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
📖 第 1 页 / 共 5 页
字号:
   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 + -