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

📄 mips64_x86_trans.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
📖 第 1 页 / 共 5 页
字号:
/* CACHE */DECLARE_INSN(CACHE){           int base   = bits(insn,21,25);   int op     = bits(insn,16,20);   int offset = bits(insn,0,15);   mips64_emit_memop(b,MIPS_MEMOP_CACHE,base,offset,op,FALSE);   return(0);}/* CFC0 */DECLARE_INSN(CFC0){	   int rt = bits(insn,16,20);   int rd = bits(insn,11,15);   mips64_emit_cp_xfr_op(b,rt,rd,mips64_cp0_exec_cfc0);   return(0);}/* CTC0 */DECLARE_INSN(CTC0){	   int rt = bits(insn,16,20);   int rd = bits(insn,11,15);   mips64_emit_cp_xfr_op(b,rt,rd,mips64_cp0_exec_ctc0);   return(0);}/* DADDIU */DECLARE_INSN(DADDIU){   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);      mips64_load_imm(b,X86_EBX,X86_EAX,val);   x86_alu_reg_membase(b->jit_ptr,X86_ADD,X86_EAX,X86_EDI,REG_OFFSET(rs));   x86_alu_reg_membase(b->jit_ptr,X86_ADC,X86_EBX,X86_EDI,REG_OFFSET(rs)+4);   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);}/* DADDU: rd = rs + rt */DECLARE_INSN(DADDU){	   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(rs)+4,4);   x86_alu_reg_membase(b->jit_ptr,X86_ADD,X86_EAX,X86_EDI,REG_OFFSET(rt));   x86_alu_reg_membase(b->jit_ptr,X86_ADC,X86_EBX,X86_EDI,REG_OFFSET(rt)+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);}/* DIV */DECLARE_INSN(DIV){   int rs = bits(insn,21,25);   int rt = bits(insn,16,20);   /* eax = gpr[rs] */   x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rs),4);   x86_cdq(b->jit_ptr);   /* ebx = gpr[rt] */   x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rt),4);   /* eax = quotient (LO), edx = remainder (HI) */   x86_div_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);}/* DIVU */DECLARE_INSN(DIVU){   int rs = bits(insn,21,25);   int rt = bits(insn,16,20);   /* eax = gpr[rs] */   x86_clear_reg(b->jit_ptr,X86_EDX);   x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rs),4);   /* ebx = gpr[rt] */   x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rt),4);   /* eax = quotient (LO), edx = remainder (HI) */   x86_div_reg(b->jit_ptr,X86_EBX,0);   /* 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);}/* DMFC0 */DECLARE_INSN(DMFC0){	   int rt = bits(insn,16,20);   int rd = bits(insn,11,15);   mips64_emit_cp_xfr_op(b,rt,rd,mips64_cp0_exec_dmfc0);   return(0);}/* DMFC1 */DECLARE_INSN(DMFC1){	   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 */DECLARE_INSN(DMTC0){	   int rt = bits(insn,16,20);   int rd = bits(insn,11,15);   mips64_emit_cp_xfr_op(b,rt,rd,mips64_cp0_exec_dmtc0);   return(0);}/* DMTC1 */DECLARE_INSN(DMTC1){	   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 */DECLARE_INSN(DSLL){   int rt = bits(insn,16,20);   int rd = bits(insn,11,15);   int sa = bits(insn,6,10);      x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rt),4);   x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rt)+4,4);   x86_shld_reg_imm(b->jit_ptr,X86_EBX,X86_EAX,sa);   x86_shift_reg_imm(b->jit_ptr,X86_SHL,X86_EAX,sa);   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);}/* DSLL32 */DECLARE_INSN(DSLL32){   int rt = bits(insn,16,20);   int rd = bits(insn,11,15);   int sa = bits(insn,6,10);      x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rt),4);   x86_shift_reg_imm(b->jit_ptr,X86_SHL,X86_EAX,sa);   x86_clear_reg(b->jit_ptr,X86_EDX);   x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd),X86_EDX,4);   x86_mov_membase_reg(b->jit_ptr,X86_EDI,REG_OFFSET(rd)+4,X86_EAX,4);   return(0);}/* DSLLV */DECLARE_INSN(DSLLV){   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(rt),4);   x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rt)+4,4);   x86_mov_reg_membase(b->jit_ptr,X86_ECX,X86_EDI,REG_OFFSET(rs),4);   x86_alu_reg_imm(b->jit_ptr,X86_AND,X86_ECX,0x3f);   x86_shld_reg(b->jit_ptr,X86_EBX,X86_EAX);   x86_shift_reg(b->jit_ptr,X86_SHL,X86_EAX);   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);}/* DSRA */DECLARE_INSN(DSRA){   int rt = bits(insn,16,20);   int rd = bits(insn,11,15);   int sa = bits(insn,6,10);      x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rt),4);   x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rt)+4,4);   x86_shrd_reg_imm(b->jit_ptr,X86_EAX,X86_EBX,sa);   x86_shift_reg_imm(b->jit_ptr,X86_SAR,X86_EBX,sa);   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);}/* DSRA32 */DECLARE_INSN(DSRA32){   int rt = bits(insn,16,20);   int rd = bits(insn,11,15);   int sa = bits(insn,6,10);      x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rt)+4,4);   x86_shift_reg_imm(b->jit_ptr,X86_SAR,X86_EAX,sa);   x86_cdq(b->jit_ptr);   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_EDX,4);   return(0);}/* DSRAV */DECLARE_INSN(DSRAV){   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(rt),4);   x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rt)+4,4);   x86_mov_reg_membase(b->jit_ptr,X86_ECX,X86_EDI,REG_OFFSET(rs),4);   x86_alu_reg_imm(b->jit_ptr,X86_AND,X86_ECX,0x3f);   x86_shrd_reg(b->jit_ptr,X86_EAX,X86_EBX);   x86_shift_reg(b->jit_ptr,X86_SAR,X86_EBX);   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);}/* DSRL */DECLARE_INSN(DSRL){   int rt = bits(insn,16,20);   int rd = bits(insn,11,15);   int sa = bits(insn,6,10);      x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rt),4);   x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rt)+4,4);   x86_shrd_reg_imm(b->jit_ptr,X86_EAX,X86_EBX,sa);   x86_shift_reg_imm(b->jit_ptr,X86_SHR,X86_EBX,sa);   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);}/* DSRL32 */DECLARE_INSN(DSRL32){   int rt = bits(insn,16,20);   int rd = bits(insn,11,15);   int sa = bits(insn,6,10);      x86_mov_reg_membase(b->jit_ptr,X86_EAX,X86_EDI,REG_OFFSET(rt)+4,4);   x86_shift_reg_imm(b->jit_ptr,X86_SHR,X86_EAX,sa);   x86_clear_reg(b->jit_ptr,X86_EDX);   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_EDX,4);   return(0);}/* DSRLV */DECLARE_INSN(DSRLV){   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(rt),4);   x86_mov_reg_membase(b->jit_ptr,X86_EBX,X86_EDI,REG_OFFSET(rt)+4,4);   x86_mov_reg_membase(b->jit_ptr,X86_ECX,X86_EDI,REG_OFFSET(rs),4);   x86_alu_reg_imm(b->jit_ptr,X86_AND,X86_ECX,0x3f);   x86_shrd_reg(b->jit_ptr,X86_EAX,X86_EBX);   x86_shift_reg(b->jit_ptr,X86_SHR,X86_EBX);   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);}/* 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);   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_alu_reg_membase(b->jit_ptr,X86_SUB,X86_EAX,X86_EDI,REG_OFFSET(rt));   x86_alu_reg_membase(b->jit_ptr,X86_SBB,X86_EBX,X86_EDI,REG_OFFSET(rt)+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);}/* ERET */DECLARE_INSN(ERET){   mips64_set_pc(b,b->start_pc+((b->mips_trans_pos-1)<<2));   x86_mov_reg_reg(b->jit_ptr,X86_EAX,X86_EDI,4);   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,ret_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) */   ret_pc = b->start_pc + ((b->mips_trans_pos + 1) << 2);   mips64_set_ra(b,ret_pc);   /* 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,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 */   mips64_jit_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 */   mips64_jit_tcb_push_epilog(b);   return(0);}/* JR (Jump Register) */DECLARE_INSN(JR){	   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 */   mips64_jit_fetch_and_emit(cpu,b,1);

⌨️ 快捷键说明

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