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

📄 ppc32_amd64_trans.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
📖 第 1 页 / 共 5 页
字号:
   ppc32_op_emit_store_gpr(cpu,rd,hreg_rd);   /* store the carry flag */   amd64_set_reg(iop->ob_ptr,X86_CC_C,hreg_t0,FALSE);   amd64_alu_reg_imm(iop->ob_ptr,X86_AND,hreg_t0,0x1);   amd64_mov_membase_reg(iop->ob_ptr,AMD64_R15,OFFSET(cpu_ppc_t,xer_ca),                         hreg_t0,4);   if (insn & 1) {      amd64_test_reg_reg_size(iop->ob_ptr,hreg_rd,hreg_rd,4);      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 */   amd64_alu_reg_reg(iop->ob_ptr,X86_XOR,hreg_t1,hreg_t1);   amd64_mov_reg_reg(iop->ob_ptr,hreg_t0,hreg_ra,4);   amd64_alu_reg_membase_size(iop->ob_ptr,X86_ADD,hreg_t0,                              AMD64_R15,OFFSET(cpu_ppc_t,xer_ca),4);   amd64_set_reg(iop->ob_ptr,X86_CC_C,hreg_t1,FALSE);   amd64_mov_membase_reg(iop->ob_ptr,AMD64_R15,OFFSET(cpu_ppc_t,xer_ca),                         hreg_t1,4);   /* $t0 += $rb */   amd64_alu_reg_reg_size(iop->ob_ptr,X86_ADD,hreg_t0,hreg_rb,4);   amd64_set_reg(iop->ob_ptr,X86_CC_C,hreg_t1,FALSE);   amd64_alu_membase_reg_size(iop->ob_ptr,X86_OR,                              AMD64_R15,OFFSET(cpu_ppc_t,xer_ca),                              hreg_t1,4);   /* update cr0 */   if (insn & 1)      amd64_test_reg_reg_size(iop->ob_ptr,hreg_t0,hreg_t0,4);   amd64_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)         amd64_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4);      amd64_alu_reg_imm_size(iop->ob_ptr,X86_ADD,hreg_rd,tmp,4);   } 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)      amd64_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4);   amd64_alu_reg_imm_size(iop->ob_ptr,X86_ADD,hreg_rd,tmp,4);   ppc32_op_emit_store_gpr(cpu,rd,hreg_rd);   amd64_set_membase(iop->ob_ptr,X86_CC_C,                     AMD64_R15,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)      amd64_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4);   amd64_alu_reg_imm_size(iop->ob_ptr,X86_ADD,hreg_rd,tmp,4);   ppc32_op_emit_store_gpr(cpu,rd,hreg_rd);   amd64_set_membase(iop->ob_ptr,X86_CC_C,                     AMD64_R15,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)         amd64_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4);      amd64_alu_reg_imm_size(iop->ob_ptr,X86_ADD,hreg_rd,tmp,4);   } else {      iop = ppc32_op_emit_insn_output(cpu,1,"addis");      amd64_mov_reg_imm(iop->ob_ptr,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");   amd64_alu_reg_reg(iop->ob_ptr,X86_XOR,hreg_t0,hreg_t0);   if (rd != ra)      amd64_mov_reg_reg(iop->ob_ptr,hreg_rd,hreg_ra,4);   amd64_alu_reg_membase_size(iop->ob_ptr,X86_ADD,hreg_rd,                              AMD64_R15,OFFSET(cpu_ppc_t,xer_ca),4);   amd64_set_reg(iop->ob_ptr,X86_CC_C,hreg_t0,FALSE);   amd64_mov_membase_reg(iop->ob_ptr,AMD64_R15,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)      amd64_alu_reg_reg_size(iop->ob_ptr,X86_AND,hreg_ra,hreg_rb,4);   else if (ra == rb)      amd64_alu_reg_reg_size(iop->ob_ptr,X86_AND,hreg_ra,hreg_rs,4);   else {      amd64_mov_reg_reg(iop->ob_ptr,hreg_ra,hreg_rs,4);      amd64_alu_reg_reg_size(iop->ob_ptr,X86_AND,hreg_ra,hreg_rb,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);}/* 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);   amd64_mov_reg_reg(iop->ob_ptr,hreg_t0,hreg_rb,4);   amd64_not_reg(iop->ob_ptr,hreg_t0);   /* $ra = $rs & $t0 */   if (ra == rs)       amd64_alu_reg_reg_size(iop->ob_ptr,X86_AND,hreg_ra,hreg_t0,4);   else {      amd64_alu_reg_reg_size(iop->ob_ptr,X86_AND,hreg_t0,hreg_rs,4);      amd64_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)      amd64_mov_reg_reg(iop->ob_ptr,hreg_ra,hreg_rs,4);   amd64_alu_reg_imm_size(iop->ob_ptr,X86_AND,hreg_ra,tmp,4);   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;   /* $ra = $rs & imm */   ppc32_jit_start_hreg_seq(cpu,"andis");   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,"andis");   if (ra != rs)      amd64_mov_reg_reg(iop->ob_ptr,hreg_ra,hreg_rs,4);   amd64_alu_reg_imm_size(iop->ob_ptr,X86_AND,hreg_ra,tmp,4);   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);}/* B - Branch */DECLARE_INSN(B){   m_uint32_t offset = bits(insn,2,25);   m_uint32_t new_ia;   jit_op_t *iop;   iop = ppc32_op_emit_insn_output(cpu,4,"b");   /* compute the new ia */   new_ia = b->start_ia + (b->ppc_trans_pos << 2);   new_ia += sign_extend(offset << 2,26);   ppc32_set_jump(cpu,b,iop,new_ia,TRUE);   ppc32_op_emit_basic_opcode(cpu,JIT_OP_EOB);   ppc32_op_emit_branch_target(cpu,b,new_ia);   ppc32_op_emit_branch_target(cpu,b,b->start_ia+((b->ppc_trans_pos+1) << 2));   return(0);}/* BA - Branch Absolute */DECLARE_INSN(BA){   m_uint32_t offset = bits(insn,2,25);   m_uint32_t new_ia;   jit_op_t *iop;   iop = ppc32_op_emit_insn_output(cpu,4,"ba");   /* compute the new ia */   new_ia = sign_extend(offset << 2,26);   ppc32_set_jump(cpu,b,iop,new_ia,TRUE);   ppc32_op_emit_basic_opcode(cpu,JIT_OP_EOB);   ppc32_op_emit_branch_target(cpu,b,new_ia);   ppc32_op_emit_branch_target(cpu,b,b->start_ia+((b->ppc_trans_pos+1) << 2));   return(0);}/* BL - Branch and Link */DECLARE_INSN(BL){   m_uint32_t offset = bits(insn,2,25);   m_uint32_t new_ia;   jit_op_t *iop;

⌨️ 快捷键说明

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