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

📄 mips.igen

📁 这个是LINUX下的GDB调度工具的源码
💻 IGEN
📖 第 1 页 / 共 5 页
字号:
  }  TRACE_ALU_RESULT2 (HI, LO);}000000,5.RS,5.RT,0000000000,011010:SPECIAL:32::DIV"div r<RS>, r<RT>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{  do_div (SD_, RS, RT);}:function:::void:do_divu:int rs, int rt{  check_div_hilo (SD_, HIHISTORY, LOHISTORY);  TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);  {    unsigned32 n = GPR[rs];    unsigned32 d = GPR[rt];    if (d == 0)      {	LO = EXTEND32 (0x80000000);	HI = EXTEND32 (0);      }    else      {	LO = EXTEND32 (n / d);	HI = EXTEND32 (n % d);      }  }  TRACE_ALU_RESULT2 (HI, LO);}000000,5.RS,5.RT,0000000000,011011:SPECIAL:32::DIVU"divu r<RS>, r<RT>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{  do_divu (SD_, RS, RT);}:function:::void:do_dmultx:int rs, int rt, int rd, int signed_p{  unsigned64 lo;  unsigned64 hi;  unsigned64 m00;  unsigned64 m01;  unsigned64 m10;  unsigned64 m11;  unsigned64 mid;  int sign;  unsigned64 op1 = GPR[rs];  unsigned64 op2 = GPR[rt];  check_mult_hilo (SD_, HIHISTORY, LOHISTORY);  TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);  /* make signed multiply unsigned */  sign = 0;  if (signed_p)    {      if ((signed64) op1 < 0)	{	  op1 = - op1;	  ++sign;	}      if ((signed64) op2 < 0)	{	  op2 = - op2;	  ++sign;	}    }  /* multiply out the 4 sub products */  m00 = ((unsigned64) VL4_8 (op1) * (unsigned64) VL4_8 (op2));  m10 = ((unsigned64) VH4_8 (op1) * (unsigned64) VL4_8 (op2));  m01 = ((unsigned64) VL4_8 (op1) * (unsigned64) VH4_8 (op2));  m11 = ((unsigned64) VH4_8 (op1) * (unsigned64) VH4_8 (op2));  /* add the products */  mid = ((unsigned64) VH4_8 (m00)	 + (unsigned64) VL4_8 (m10)	 + (unsigned64) VL4_8 (m01));  lo = U8_4 (mid, m00);  hi = (m11	+ (unsigned64) VH4_8 (mid)	+ (unsigned64) VH4_8 (m01)	+ (unsigned64) VH4_8 (m10));  /* fix the sign */  if (sign & 1)    {      lo = -lo;      if (lo == 0)	hi = -hi;      else	hi = -hi - 1;    }  /* save the result HI/LO (and a gpr) */  LO = lo;  HI = hi;  if (rd != 0)    GPR[rd] = lo;  TRACE_ALU_RESULT2 (HI, LO);}:function:::void:do_dmult:int rs, int rt, int rd{  do_dmultx (SD_, rs, rt, rd, 1);}000000,5.RS,5.RT,0000000000,011100:SPECIAL:64::DMULT"dmult r<RS>, r<RT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:{  check_u64 (SD_, instruction_0);  do_dmult (SD_, RS, RT, 0);}000000,5.RS,5.RT,5.RD,00000,011100:SPECIAL:64::DMULT"dmult r<RS>, r<RT>":RD == 0"dmult r<RD>, r<RS>, r<RT>"*vr5000:{  check_u64 (SD_, instruction_0);  do_dmult (SD_, RS, RT, RD);}:function:::void:do_dmultu:int rs, int rt, int rd{  do_dmultx (SD_, rs, rt, rd, 0);}000000,5.RS,5.RT,0000000000,011101:SPECIAL:64::DMULTU"dmultu r<RS>, r<RT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:{  check_u64 (SD_, instruction_0);  do_dmultu (SD_, RS, RT, 0);}000000,5.RS,5.RT,5.RD,00000,011101:SPECIAL:64::DMULTU"dmultu r<RD>, r<RS>, r<RT>":RD == 0"dmultu r<RS>, r<RT>"*vr5000:{  check_u64 (SD_, instruction_0);  do_dmultu (SD_, RS, RT, RD);}:function:::void:do_dsll:int rt, int rd, int shift{  TRACE_ALU_INPUT2 (GPR[rt], shift);  GPR[rd] = GPR[rt] << shift;  TRACE_ALU_RESULT (GPR[rd]);}000000,00000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL"dsll r<RD>, r<RT>, <SHIFT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  check_u64 (SD_, instruction_0);  do_dsll (SD_, RT, RD, SHIFT);}000000,00000,5.RT,5.RD,5.SHIFT,111100:SPECIAL:64::DSLL32"dsll32 r<RD>, r<RT>, <SHIFT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  int s = 32 + SHIFT;  check_u64 (SD_, instruction_0);  TRACE_ALU_INPUT2 (GPR[RT], s);  GPR[RD] = GPR[RT] << s;  TRACE_ALU_RESULT (GPR[RD]);}:function:::void:do_dsllv:int rs, int rt, int rd{  int s = MASKED64 (GPR[rs], 5, 0);  TRACE_ALU_INPUT2 (GPR[rt], s);  GPR[rd] = GPR[rt] << s;  TRACE_ALU_RESULT (GPR[rd]);}000000,5.RS,5.RT,5.RD,00000,010100:SPECIAL:64::DSLLV"dsllv r<RD>, r<RT>, r<RS>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  check_u64 (SD_, instruction_0);  do_dsllv (SD_, RS, RT, RD);}:function:::void:do_dsra:int rt, int rd, int shift{  TRACE_ALU_INPUT2 (GPR[rt], shift);  GPR[rd] = ((signed64) GPR[rt]) >> shift;  TRACE_ALU_RESULT (GPR[rd]);}000000,00000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA"dsra r<RD>, r<RT>, <SHIFT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  check_u64 (SD_, instruction_0);  do_dsra (SD_, RT, RD, SHIFT);}000000,00000,5.RT,5.RD,5.SHIFT,111111:SPECIAL:64::DSRA32"dsra32 r<RD>, r<RT>, <SHIFT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  int s = 32 + SHIFT;  check_u64 (SD_, instruction_0);  TRACE_ALU_INPUT2 (GPR[RT], s);  GPR[RD] = ((signed64) GPR[RT]) >> s;  TRACE_ALU_RESULT (GPR[RD]);}:function:::void:do_dsrav:int rs, int rt, int rd{  int s = MASKED64 (GPR[rs], 5, 0);  TRACE_ALU_INPUT2 (GPR[rt], s);  GPR[rd] = ((signed64) GPR[rt]) >> s;  TRACE_ALU_RESULT (GPR[rd]);}000000,5.RS,5.RT,5.RD,00000,010111:SPECIAL:64::DSRAV"dsrav r<RD>, r<RT>, r<RS>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  check_u64 (SD_, instruction_0);  do_dsrav (SD_, RS, RT, RD);}:function:::void:do_dsrl:int rt, int rd, int shift{  TRACE_ALU_INPUT2 (GPR[rt], shift);  GPR[rd] = (unsigned64) GPR[rt] >> shift;  TRACE_ALU_RESULT (GPR[rd]);}000000,00000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL"dsrl r<RD>, r<RT>, <SHIFT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  check_u64 (SD_, instruction_0);  do_dsrl (SD_, RT, RD, SHIFT);}000000,00000,5.RT,5.RD,5.SHIFT,111110:SPECIAL:64::DSRL32"dsrl32 r<RD>, r<RT>, <SHIFT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  int s = 32 + SHIFT;  check_u64 (SD_, instruction_0);  TRACE_ALU_INPUT2 (GPR[RT], s);  GPR[RD] = (unsigned64) GPR[RT] >> s;  TRACE_ALU_RESULT (GPR[RD]);}:function:::void:do_dsrlv:int rs, int rt, int rd{  int s = MASKED64 (GPR[rs], 5, 0);  TRACE_ALU_INPUT2 (GPR[rt], s);  GPR[rd] = (unsigned64) GPR[rt] >> s;  TRACE_ALU_RESULT (GPR[rd]);}000000,5.RS,5.RT,5.RD,00000,010110:SPECIAL:64::DSRLV"dsrlv r<RD>, r<RT>, r<RS>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  check_u64 (SD_, instruction_0);  do_dsrlv (SD_, RS, RT, RD);}000000,5.RS,5.RT,5.RD,00000,101110:SPECIAL:64::DSUB"dsub r<RD>, r<RS>, r<RT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  check_u64 (SD_, instruction_0);  TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);  {    ALU64_BEGIN (GPR[RS]);    ALU64_SUB (GPR[RT]);    ALU64_END (GPR[RD]);   /* This checks for overflow.  */  }  TRACE_ALU_RESULT (GPR[RD]);}:function:::void:do_dsubu:int rs, int rt, int rd{  TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);  GPR[rd] = GPR[rs] - GPR[rt];  TRACE_ALU_RESULT (GPR[rd]);}000000,5.RS,5.RT,5.RD,00000,101111:SPECIAL:64::DSUBU"dsubu r<RD>, r<RS>, r<RT>"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  check_u64 (SD_, instruction_0);  do_dsubu (SD_, RS, RT, RD);}000010,26.INSTR_INDEX:NORMAL:32::J"j <INSTR_INDEX>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{  /* NOTE: The region used is that of the delay slot NIA and NOT the     current instruction */  address_word region = (NIA & MASK (63, 28));  DELAY_SLOT (region | (INSTR_INDEX << 2));}000011,26.INSTR_INDEX:NORMAL:32::JAL"jal <INSTR_INDEX>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{  /* NOTE: The region used is that of the delay slot and NOT the     current instruction */  address_word region = (NIA & MASK (63, 28));  GPR[31] = CIA + 8;  DELAY_SLOT (region | (INSTR_INDEX << 2));}000000,5.RS,00000,5.RD,00000,001001:SPECIAL:32::JALR"jalr r<RS>":RD == 31"jalr r<RD>, r<RS>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{  address_word temp = GPR[RS];  GPR[RD] = CIA + 8;  DELAY_SLOT (temp);}000000,5.RS,000000000000000,001000:SPECIAL:32::JR"jr r<RS>"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{  DELAY_SLOT (GPR[RS]);}:function:::unsigned_word:do_load:unsigned access, address_word base, address_word offset{  address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);  address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0);  address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0);  unsigned int byte;  address_word paddr;  int uncached;  unsigned64 memval;  address_word vaddr;  vaddr = loadstore_ea (SD_, base, offset);  if ((vaddr & access) != 0)    {      SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map, access+1, vaddr, read_transfer, sim_core_unaligned_signal);    }  AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);  paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));  LoadMemory (&memval, NULL, uncached, access, paddr, vaddr, isDATA, isREAL);  byte = ((vaddr & mask) ^ bigendiancpu);  return (memval >> (8 * byte));}:function:::unsigned_word:do_load_left:unsigned access, address_word base, address_word offset, unsigned_word rt{  address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);  address_word reverseendian = (ReverseEndian ? -1 : 0);  address_word bigendiancpu = (BigEndianCPU ? -1 : 0);  unsigned int byte;  unsigned int word;  address_word paddr;  int uncached;  unsigned64 memval;  address_word vaddr;  int nr_lhs_bits;  int nr_rhs_bits;  unsigned_word lhs_mask;  unsigned_word temp;  vaddr = loadstore_ea (SD_, base, offset);  AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);  paddr = (paddr ^ (reverseendian & mask));  if (BigEndianMem == 0)    paddr = paddr & ~access;  /* compute where within the word/mem we are */  byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */  word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */  nr_lhs_bits = 8 * byte + 8;  nr_rhs_bits = 8 * access - 8 * byte;  /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */  /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n",	   (long) ((unsigned64) vaddr >> 32), (long) vaddr,	   (long) ((unsigned64) paddr >> 32), (long) paddr,	   word, byte, nr_lhs_bits, nr_rhs_bits); */  LoadMemory (&memval, NULL, uncached, byte, paddr, vaddr, isDATA, isREAL);  if (word == 0)    {      /* GPR{31..32-NR_LHS_BITS} = memval{NR_LHS_BITS-1..0} */      temp = (memval << nr_rhs_bits);    }  else    {      /* GPR{31..32-NR_LHS_BITS = memval{32+NR_LHS_BITS..32} */      temp = (memval >> nr_lhs_bits);    }  lhs_mask = LSMASK (nr_lhs_bits + nr_rhs_bits - 1, nr_rhs_bits);  rt = (rt & ~lhs_mask) | (temp & lhs_mask);  /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx & 0x%08lx%08lx -> 0x%08lx%08lx\n",	   (long) ((unsigned64) memval >> 32), (long) memval,	   (long) ((unsigned64) temp >> 32), (long) temp,	   (long) ((unsigned64) lhs_mask >> 32), (long) lhs_mask,	   (long) (rt >> 32), (long) rt); */  return rt;}:function:::unsigned_word:do_load_right:unsigned access, address_word base, address_word offset, unsigned_word rt{  address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);  address_word reverseendian = (ReverseEndian ? -1 : 0);  address_word bigendiancpu = (BigEndianCPU ? -1 : 0);  unsigned int byte;  address_word paddr;  int uncached;  unsigned64 memval;  address_word vaddr;  vaddr = loadstore_ea (SD_, base, offset);  AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);  /* NOTE: SPEC is wrong, has `BigEndianMem == 0' not `BigEndianMem != 0' */  paddr = (paddr ^ (reverseendian & mask));  if (BigEndianMem != 0)    paddr = paddr & ~access;  byte = ((vaddr & mask) ^ (bigendiancpu & mask));  /* NOTE: SPEC is wrong, had `byte' not `access - byte'.  See SW. */  LoadMemory (&memval, NULL, uncached, access - (access & byte), paddr, vaddr, isDATA, isREAL);  /* printf ("lr: 0x%08lx %d@0x%08lx 0x%08lx\n",     (long) paddr, byte, (long) paddr, (long) memval); */  {    unsigned_word screen = LSMASK (8 * (access - (byte & access) + 1) - 1, 0);    rt &= ~screen;    rt |= (memval >> (8 * byte)) & screen;  }  return rt;}100000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LB"lb r<RT>, <OFFSET>(r<BASE>)"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{  GPR[RT] = EXTEND8 (do_load (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET)));}100100,5.BASE,5.RT,16.OFFSET:NORMAL:32::LBU"lbu r<RT>, <OFFSET>(r<BASE>)"*mipsI:*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{  GPR[RT] = do_load (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET));}110111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LD"ld r<RT>, <OFFSET>(r<BASE>)"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  check_u64 (SD_, instruction_0);  GPR[RT] = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));}1101,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDCz"ldc<ZZ> r<RT>, <OFFSET>(r<BASE>)"*mipsII:*mipsIII:*mipsIV:*mipsV:*mips32:*mips64:*vr4100:*vr5000:*r3900:{  COP_LD (ZZ, RT, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));}011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL"ldl r<RT>, <OFFSET>(r<BASE>)"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  check_u64 (SD_, instruction_0);  GPR[RT] = do_load_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);}011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR"ldr r<RT>, <OFFSET>(r<BASE>)"*mipsIII:*mipsIV:*mipsV:*mips64:*vr4100:*vr5000:{  check_u64 (SD_, instruction_0);  GPR[RT] = do_load_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);}100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH

⌨️ 快捷键说明

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