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

📄 x86_trans.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器-Cisco router simulator, used to fake a 7200 series can be simulated
💻 C
📖 第 1 页 / 共 5 页
字号:
   /* 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) */   ret_pc = b->start_pc + ((b->mips_trans_pos + 1) << 2);   mips64_set_ra(b,ret_pc);   /* 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,X86_EBX,X86_EAX,ret_pc);   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);   /* get the new pc */   x86_mov_reg_membase(b->jit_ptr,X86_ECX,X86_EDI,REG_OFFSET(rs),4);   x86_mov_reg_membase(b->jit_ptr,X86_EDX,X86_EDI,REG_OFFSET(rs)+4,4);   x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,ret_pc),X86_ECX,4);   x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,ret_pc)+4,                       X86_EDX,4);   /* insert the instruction in the delay slot */   insn_fetch_and_emit(cpu,b,1);   /* 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 */   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 */   x86_mov_reg_membase(b->jit_ptr,X86_ECX,X86_EDI,REG_OFFSET(rs),4);   x86_mov_reg_membase(b->jit_ptr,X86_EDX,X86_EDI,REG_OFFSET(rs)+4,4);   x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,ret_pc),X86_ECX,4);   x86_mov_membase_reg(b->jit_ptr,X86_EDI,OFFSET(cpu_mips_t,ret_pc)+4,                       X86_EDX,4);   /* insert the instruction in the delay slot */   insn_fetch_and_emit(cpu,b,1);   /* 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 */   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);   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) */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;   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) */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);   int offset = bits(insn,0,15);   mips64_emit_memop(b,MIPS_MEMOP_LWL,base,offset,rt,TRUE);   return(0);}/* LWR (Load Word Right) */static int mips64_emit_LWR(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_LWR,base,offset,rt,TRUE);   return(0);}/* LWU (Load Word Unsigned) */static int mips64_emit_LWU(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_LWU,base,offset,rt,TRUE);   return(0);}/* MFC0 */static int mips64_emit_MFC0(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_mfc0);   return(0);}/* MFC1 */static int mips64_emit_MFC1(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_mfc1);   return(0);}/* MFHI */static int mips64_emit_MFHI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){   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 */static int mips64_emit_MFLO(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){   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) */static int mips64_emit_MOVE(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){	   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 */static int mips64_emit_MTC0(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_mtc0);   return(0);}/* MTC1 */static int mips64_emit_MTC1(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_mtc1);   return(0);}/* MTHI */static int mips64_emit_MTHI(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){   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 */static int mips64_emit_MTLO(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){   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 */static int mips64_emit_MUL(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);   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 */static int mips64_emit_MULT(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){   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 */static int mips64_emit_MULTU(cpu_mips_t *cpu,insn_block_t *b,mips_insn_t insn){   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,X8

⌨️ 快捷键说明

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