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

📄 ppc32_x86_trans.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
📖 第 1 页 / 共 5 页
字号:
   x86_mov_membase_reg(iop->ob_ptr,X86_EDI,OFFSET(cpu_ppc_t,tb),hreg_rd,4);   x86_mov_membase_reg(iop->ob_ptr,X86_EDI,OFFSET(cpu_ppc_t,tb)+4,hreg_t0,4);   ppc32_op_emit_store_gpr(cpu,rd,hreg_rd);   ppc32_jit_close_hreg_seq(cpu);   return(0);}/* ADD */DECLARE_INSN(ADD){   int rd = bits(insn,21,25);   int ra = bits(insn,16,20);   int rb = bits(insn,11,15);   int hreg_rd,hreg_ra,hreg_rb;   jit_op_t *iop;   /* $rd = $ra + $rb */   ppc32_jit_start_hreg_seq(cpu,"add");   hreg_rd = ppc32_jit_alloc_hreg(cpu,rd);   hreg_ra = ppc32_jit_alloc_hreg(cpu,ra);   hreg_rb = ppc32_jit_alloc_hreg(cpu,rb);   ppc32_op_emit_load_gpr(cpu,hreg_ra,ra);   ppc32_op_emit_load_gpr(cpu,hreg_rb,rb);   iop = ppc32_op_emit_insn_output(cpu,2,"add");   if (rd == ra)      x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_rd,hreg_rb);   else if (rd == rb)      x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_rd,hreg_ra);   else {      x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4);      x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_rd,hreg_rb);   }   ppc32_op_emit_store_gpr(cpu,rd,hreg_rd);   if (insn & 1)      ppc32_op_emit_update_flags(cpu,0,TRUE);      ppc32_jit_close_hreg_seq(cpu);   return(0);}/* ADDC */DECLARE_INSN(ADDC){   int rd = bits(insn,21,25);   int ra = bits(insn,16,20);   int rb = bits(insn,11,15);   int hreg_rd,hreg_ra,hreg_rb,hreg_t0;   jit_op_t *iop;   /* $rd = $ra + $rb */   ppc32_jit_start_hreg_seq(cpu,"addc");   hreg_rd = ppc32_jit_alloc_hreg(cpu,rd);   hreg_ra = ppc32_jit_alloc_hreg(cpu,ra);   hreg_rb = ppc32_jit_alloc_hreg(cpu,rb);   /* store the carry flag */   hreg_t0 = ppc32_jit_get_tmp_hreg(cpu);   ppc32_op_emit_load_gpr(cpu,hreg_ra,ra);   ppc32_op_emit_load_gpr(cpu,hreg_rb,rb);   iop = ppc32_op_emit_insn_output(cpu,2,"addc");   if (rd == ra)      x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_rd,hreg_rb);   else if (rd == rb)      x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_rd,hreg_ra);   else {      x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4);      x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_rd,hreg_rb);   }   ppc32_op_emit_store_gpr(cpu,rd,hreg_rd);      x86_set_reg(iop->ob_ptr,X86_CC_C,hreg_t0,FALSE);   x86_alu_reg_imm(iop->ob_ptr,X86_AND,hreg_t0,0x1);   x86_mov_membase_reg(iop->ob_ptr,X86_EDI,OFFSET(cpu_ppc_t,xer_ca),                       hreg_t0,4);   if (insn & 1) {      x86_test_reg_reg(iop->ob_ptr,hreg_rd,hreg_rd);      ppc32_op_emit_update_flags(cpu,0,TRUE);   }   ppc32_jit_close_hreg_seq(cpu);   return(0);}/* ADDE - Add Extended */DECLARE_INSN(ADDE){      int rd = bits(insn,21,25);   int ra = bits(insn,16,20);   int rb = bits(insn,11,15);   int hreg_ra,hreg_rb,hreg_rd,hreg_t0,hreg_t1;   jit_op_t *iop;   ppc32_jit_start_hreg_seq(cpu,"adde");   hreg_ra = ppc32_jit_alloc_hreg(cpu,ra);   hreg_rb = ppc32_jit_alloc_hreg(cpu,rb);   hreg_rd = ppc32_jit_alloc_hreg(cpu,rd);   hreg_t0 = ppc32_jit_alloc_hreg(cpu,-1);   hreg_t1 = ppc32_jit_get_tmp_hreg(cpu);   ppc32_op_emit_alter_host_reg(cpu,hreg_t0);   ppc32_op_emit_load_gpr(cpu,hreg_ra,ra);   ppc32_op_emit_load_gpr(cpu,hreg_rb,rb);   iop = ppc32_op_emit_insn_output(cpu,3,"adde");   /* $t0 = $ra + carry */   x86_alu_reg_reg(iop->ob_ptr,X86_XOR,hreg_t1,hreg_t1);   x86_mov_reg_reg(iop->ob_ptr,hreg_t0,hreg_ra,4);   x86_alu_reg_membase(iop->ob_ptr,X86_ADD,hreg_t0,                       X86_EDI,OFFSET(cpu_ppc_t,xer_ca));   x86_set_reg(iop->ob_ptr,X86_CC_C,hreg_t1,FALSE);   x86_mov_membase_reg(iop->ob_ptr,X86_EDI,OFFSET(cpu_ppc_t,xer_ca),hreg_t1,4);   /* $t0 += $rb */   x86_alu_reg_reg(iop->ob_ptr,X86_ADD,hreg_t0,hreg_rb);   x86_set_reg(iop->ob_ptr,X86_CC_C,hreg_t1,FALSE);   x86_alu_membase_reg(iop->ob_ptr,X86_OR,X86_EDI,OFFSET(cpu_ppc_t,xer_ca),                       hreg_t1);   /* update cr0 */   if (insn & 1)      x86_test_reg_reg(iop->ob_ptr,hreg_t0,hreg_t0);   x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_t0,4);   ppc32_op_emit_store_gpr(cpu,rd,hreg_rd);   if (insn & 1)      ppc32_op_emit_update_flags(cpu,0,TRUE);   ppc32_jit_close_hreg_seq(cpu);   return(0);}/* ADDI - ADD Immediate */DECLARE_INSN(ADDI){   int rd = bits(insn,21,25);   int ra = bits(insn,16,20);   int imm = bits(insn,0,15);   m_uint32_t tmp = sign_extend_32(imm,16);   int hreg_rd,hreg_ra;   jit_op_t *iop;   /* $rd = $ra + imm */   ppc32_jit_start_hreg_seq(cpu,"addi");   hreg_rd = ppc32_jit_alloc_hreg(cpu,rd);   if (ra != 0) {      hreg_ra = ppc32_jit_alloc_hreg(cpu,ra);      ppc32_op_emit_load_gpr(cpu,hreg_ra,ra);      iop = ppc32_op_emit_insn_output(cpu,2,"addi");      if (rd != ra)         x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4);      x86_alu_reg_imm(iop->ob_ptr,X86_ADD,hreg_rd,tmp);   } else {      iop = ppc32_op_emit_insn_output(cpu,1,"addi");      ppc32_load_imm(&iop->ob_ptr,hreg_rd,tmp);   }   ppc32_op_emit_store_gpr(cpu,rd,hreg_rd);   ppc32_jit_close_hreg_seq(cpu);   return(0);}/* ADDIC - ADD Immediate with Carry */DECLARE_INSN(ADDIC){   int rd = bits(insn,21,25);   int ra = bits(insn,16,20);   int imm = bits(insn,0,15);   m_uint32_t tmp = sign_extend_32(imm,16);   int hreg_rd,hreg_ra;   jit_op_t *iop;   /* $rd = $ra + imm */   ppc32_jit_start_hreg_seq(cpu,"addic");   hreg_rd = ppc32_jit_alloc_hreg(cpu,rd);   hreg_ra = ppc32_jit_alloc_hreg(cpu,ra);   ppc32_op_emit_load_gpr(cpu,hreg_ra,ra);   iop = ppc32_op_emit_insn_output(cpu,1,"addic");   if (rd != ra)      x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4);   x86_alu_reg_imm(iop->ob_ptr,X86_ADD,hreg_rd,tmp);   ppc32_op_emit_store_gpr(cpu,rd,hreg_rd);   x86_set_membase(iop->ob_ptr,X86_CC_C,                   X86_EDI,OFFSET(cpu_ppc_t,xer_ca),FALSE);   ppc32_jit_close_hreg_seq(cpu);   return(0);}/* ADDIC. */DECLARE_INSN(ADDIC_dot){   int rd = bits(insn,21,25);   int ra = bits(insn,16,20);   int imm = bits(insn,0,15);   m_uint32_t tmp = sign_extend_32(imm,16);   int hreg_rd,hreg_ra;   jit_op_t *iop;   /* $rd = $ra + imm */   ppc32_jit_start_hreg_seq(cpu,"addic.");   hreg_rd = ppc32_jit_alloc_hreg(cpu,rd);   hreg_ra = ppc32_jit_alloc_hreg(cpu,ra);   ppc32_op_emit_load_gpr(cpu,hreg_ra,ra);   iop = ppc32_op_emit_insn_output(cpu,1,"addic.");   if (rd != ra)      x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4);   x86_alu_reg_imm(iop->ob_ptr,X86_ADD,hreg_rd,tmp);   ppc32_op_emit_store_gpr(cpu,rd,hreg_rd);   x86_set_membase(iop->ob_ptr,X86_CC_C,                   X86_EDI,OFFSET(cpu_ppc_t,xer_ca),FALSE);   ppc32_op_emit_update_flags(cpu,0,TRUE);   ppc32_jit_close_hreg_seq(cpu);   return(0);}/* ADDIS - ADD Immediate Shifted */DECLARE_INSN(ADDIS){   int rd = bits(insn,21,25);   int ra = bits(insn,16,20);   m_uint32_t imm = bits(insn,0,15);   m_uint32_t tmp = imm << 16;   int hreg_rd,hreg_ra;   jit_op_t *iop;   /* $rd = $ra + (imm << 16) */   ppc32_jit_start_hreg_seq(cpu,"addis");   hreg_rd = ppc32_jit_alloc_hreg(cpu,rd);   if (ra != 0) {      hreg_ra = ppc32_jit_alloc_hreg(cpu,ra);      ppc32_op_emit_load_gpr(cpu,hreg_ra,ra);      iop = ppc32_op_emit_insn_output(cpu,1,"addis");      if (rd != ra)         x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4);      x86_alu_reg_imm(iop->ob_ptr,X86_ADD,hreg_rd,tmp);   } else {      //iop = ppc32_op_emit_insn_output(cpu,1,"addis");      //x86_mov_reg_imm(iop->ob_ptr,hreg_rd,tmp);      ppc32_op_emit_set_host_reg_imm32(cpu,hreg_rd,tmp);   }   ppc32_op_emit_store_gpr(cpu,rd,hreg_rd);   ppc32_jit_close_hreg_seq(cpu);   return(0);}/* ADDZE */DECLARE_INSN(ADDZE){   int rd = bits(insn,21,25);   int ra = bits(insn,16,20);   int hreg_rd,hreg_ra,hreg_t0;   jit_op_t *iop;   /* $rd = $ra + xer_ca + set_carry */   ppc32_jit_start_hreg_seq(cpu,"addze");   hreg_rd = ppc32_jit_alloc_hreg(cpu,rd);   hreg_ra = ppc32_jit_alloc_hreg(cpu,ra);   hreg_t0 = ppc32_jit_get_tmp_hreg(cpu);   ppc32_op_emit_load_gpr(cpu,hreg_ra,ra);   iop = ppc32_op_emit_insn_output(cpu,2,"addze");   x86_alu_reg_reg(iop->ob_ptr,X86_XOR,hreg_t0,hreg_t0);   if (rd != ra)      x86_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4);   x86_alu_reg_membase(iop->ob_ptr,X86_ADD,hreg_rd,                       X86_EDI,OFFSET(cpu_ppc_t,xer_ca));   x86_set_reg(iop->ob_ptr,X86_CC_C,hreg_t0,FALSE);   x86_mov_membase_reg(iop->ob_ptr,X86_EDI,OFFSET(cpu_ppc_t,xer_ca),hreg_t0,4);   ppc32_op_emit_store_gpr(cpu,rd,hreg_rd);   if (insn & 1)      ppc32_op_emit_update_flags(cpu,0,TRUE);   ppc32_jit_close_hreg_seq(cpu);   return(0);}/* AND */DECLARE_INSN(AND){   int rs = bits(insn,21,25);   int ra = bits(insn,16,20);   int rb = bits(insn,11,15);   int hreg_rs,hreg_ra,hreg_rb;   jit_op_t *iop;   /* $ra = $rs & $rb */   ppc32_jit_start_hreg_seq(cpu,"and");   hreg_rs = ppc32_jit_alloc_hreg(cpu,rs);   hreg_ra = ppc32_jit_alloc_hreg(cpu,ra);   hreg_rb = ppc32_jit_alloc_hreg(cpu,rb);   ppc32_op_emit_load_gpr(cpu,hreg_rs,rs);   ppc32_op_emit_load_gpr(cpu,hreg_rb,rb);   iop = ppc32_op_emit_insn_output(cpu,1,"and");   if (ra == rs)      x86_alu_reg_reg(iop->ob_ptr,X86_AND,hreg_ra,hreg_rb);   else if (ra == rb)      x86_alu_reg_reg(iop->ob_ptr,X86_AND,hreg_ra,hreg_rs);   else {      x86_mov_reg_reg(iop->ob_ptr,hreg_ra,hreg_rs,4);      x86_alu_reg_reg(iop->ob_ptr,X86_AND,hreg_ra,hreg_rb);   }   ppc32_op_emit_store_gpr(cpu,ra,hreg_ra);   if (insn & 1)      ppc32_op_emit_update_flags(cpu,0,TRUE);   ppc32_jit_close_hreg_seq(cpu);   return(0);}/* ANDC */DECLARE_INSN(ANDC){   int rs = bits(insn,21,25);   int ra = bits(insn,16,20);   int rb = bits(insn,11,15);   int hreg_rs,hreg_ra,hreg_rb,hreg_t0;   jit_op_t *iop;   /* $ra = $rs & ~$rb */   ppc32_jit_start_hreg_seq(cpu,"andc");   hreg_rs = ppc32_jit_alloc_hreg(cpu,rs);   hreg_ra = ppc32_jit_alloc_hreg(cpu,ra);   hreg_rb = ppc32_jit_alloc_hreg(cpu,rb);   ppc32_op_emit_load_gpr(cpu,hreg_rs,rs);   ppc32_op_emit_load_gpr(cpu,hreg_rb,rb);   iop = ppc32_op_emit_insn_output(cpu,1,"andc");   /* $t0 = ~$rb */   hreg_t0 = ppc32_jit_get_tmp_hreg(cpu);   x86_mov_reg_reg(iop->ob_ptr,hreg_t0,hreg_rb,4);   x86_not_reg(iop->ob_ptr,hreg_t0);   /* $ra = $rs & $t0 */   if (ra == rs)       x86_alu_reg_reg(iop->ob_ptr,X86_AND,hreg_ra,hreg_t0);   else {      x86_alu_reg_reg(iop->ob_ptr,X86_AND,hreg_t0,hreg_rs);      x86_mov_reg_reg(iop->ob_ptr,hreg_ra,hreg_t0,4);   }   ppc32_op_emit_store_gpr(cpu,ra,hreg_ra);   if (insn & 1)      ppc32_op_emit_update_flags(cpu,0,TRUE);   ppc32_jit_close_hreg_seq(cpu);   return(0);}/* AND Immediate */DECLARE_INSN(ANDI){   int rs = bits(insn,21,25);   int ra = bits(insn,16,20);   m_uint16_t imm = bits(insn,0,15);   m_uint32_t tmp = imm;   int hreg_rs,hreg_ra;   jit_op_t *iop;   /* $ra = $rs & imm */   ppc32_jit_start_hreg_seq(cpu,"andi");   hreg_rs = ppc32_jit_alloc_hreg(cpu,rs);   hreg_ra = ppc32_jit_alloc_hreg(cpu,ra);   ppc32_op_emit_load_gpr(cpu,hreg_rs,rs);   iop = ppc32_op_emit_insn_output(cpu,2,"andi");   if (ra != rs)      x86_mov_reg_reg(iop->ob_ptr,hreg_ra,hreg_rs,4);   x86_alu_reg_imm(iop->ob_ptr,X86_AND,hreg_ra,tmp);   ppc32_op_emit_store_gpr(cpu,ra,hreg_ra);   ppc32_op_emit_update_flags(cpu,0,TRUE);   ppc32_jit_close_hreg_seq(cpu);   return(0);}/* AND Immediate Shifted */DECLARE_INSN(ANDIS){   int rs = bits(insn,21,25);   int ra = bits(insn,16,20);   m_uint32_t imm = bits(insn,0,15);   m_uint32_t tmp = imm << 16;   int hreg_rs,hreg_ra;   jit_op_t *iop;

⌨️ 快捷键说明

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