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

📄 vr.igen

📁 gdb-6.0 linux 下的调试工具
💻 IGEN
字号:
// -*- C -*-//// NEC specific instructions//:%s::::MFHI:int hi{  return hi ? "hi" : "";}:%s::::SAT:int s{  return s ? "s" : "";}:%s::::UNS:int u{  return u ? "u" : "";}// Simulate the various kinds of multiply and multiply-accumulate instructions.// Perform an operation of the form:////	LHS (+/-) GPR[RS] * GPR[RT]//// and store it in the 64-bit accumulator.  Optionally copy either LO or// HI into a general purpose register.//// - RD is the destination register of the LO or HI move// - RS are RT are the multiplication source registers// - ACCUMULATE_P is true if LHS should be the value of the 64-bit accumulator,//     false if it should be 0.// - STORE_HI_P is true if HI should be stored in RD, false if LO should be.// - UNSIGNED_P is true if the operation should be unsigned.// - SATURATE_P is true if the result should be saturated to a 32-bit value.// - SUBTRACT_P is true if the right hand side should be subtraced from LHS,//     false if it should be added.// - SHORT_P is true if RS and RT must be 16-bit numbers.// - DOUBLE_P is true if the 64-bit accumulator is in LO, false it is a//     concatenation of the low 32 bits of HI and LO.:function:::void:do_vr_mul_op:int rd, int rs, int rt, int accumulate_p, int store_hi_p, int unsigned_p, int saturate_p, int subtract_p, int short_p, int double_p{  unsigned64 lhs, x, y, xcut, ycut, product, result;  check_mult_hilo (SD_, HIHISTORY, LOHISTORY);  lhs = (!accumulate_p ? 0 : double_p ? LO : U8_4 (HI, LO));  x = GPR[rs];  y = GPR[rt];  /* Work out the canonical form of X and Y from their significant bits.  */  if (!short_p)    {      /* Normal sign-extension rule for 32-bit operands.  */      xcut = EXTEND32 (x);      ycut = EXTEND32 (y);    }  else if (unsigned_p)    {      /* Operands must be zero-extended 16-bit numbers.  */      xcut = x & 0xffff;      ycut = y & 0xffff;    }  else    {      /* Likewise but sign-extended.  */      xcut = EXTEND16 (x);      ycut = EXTEND16 (y);    }  if (x != xcut || y != ycut)    sim_engine_abort (SD, CPU, CIA,		      "invalid multiplication operand at 0x%08lx\n",		      (long) CIA);  TRACE_ALU_INPUT2 (x, y);  product = (unsigned_p	     ? V8_4 (x, 1) * V8_4 (y, 1)	     : EXTEND32 (x) * EXTEND32 (y));  result = (subtract_p ? lhs - product : lhs + product);  if (saturate_p)    {      /* Saturate the result to 32 bits.  An unsigned, unsaturated	 result is zero-extended to 64 bits, but unsigned overflow	 causes all 64 bits to be set.  */      if (!unsigned_p && (unsigned64) EXTEND32 (result) != result)	result = ((signed64) result < 0 ? -0x7fffffff - 1 : 0x7fffffff);      else if (unsigned_p && (result >> 32) != 0)	result = (unsigned64) 0 - 1;    }  TRACE_ALU_RESULT (result);  if (double_p)    LO = result;  else    {      LO = EXTEND32 (result);      HI = EXTEND32 (VH4_8 (result));    }  if (rd != 0)    GPR[rd] = store_hi_p ? HI : LO;}// 32-bit rotate right of X by Y bits.:function:::unsigned64:do_ror:unsigned32 x,unsigned32 y*vr5400:*vr5500:{  unsigned64 result;  y &= 31;  TRACE_ALU_INPUT2 (x, y);  result = EXTEND32 (ROTR32 (x, y));  TRACE_ALU_RESULT (result);  return result;}// Likewise 64-bit:function:::unsigned64:do_dror:unsigned64 x,unsigned64 y*vr5400:*vr5500:{  unsigned64 result;  y &= 63;  TRACE_ALU_INPUT2 (x, y);  result = ROTR64 (x, y);  TRACE_ALU_RESULT (result);  return result;}// VR4100 instructions.000000,5.RS,5.RT,00000,00000,101000::32::MADD16"madd16 r<RS>, r<RT>"*vr4100:{  do_vr_mul_op (SD_, 0, RS, RT,		1 /* accumulate */,		0 /* store in LO */,		0 /* signed arithmetic */,		0 /* don't saturate */,		0 /* don't subtract */,		1 /* short */,		0 /* single */);}000000,5.RS,5.RT,00000,00000,101001::64::DMADD16"dmadd16 r<RS>, r<RT>"*vr4100:{  do_vr_mul_op (SD_, 0, RS, RT,		1 /* accumulate */,		0 /* store in LO */,		0 /* signed arithmetic */,		0 /* don't saturate */,		0 /* don't subtract */,		1 /* short */,		1 /* double */);}// VR4120 and VR4130 instructions.000000,5.RS,5.RT,5.RD,1.SAT,1.MFHI,00,1.UNS,101001::64::DMACC"dmacc%s<MFHI>%s<UNS>%s<SAT> r<RD>, r<RS>, r<RT>"*vr4120:{  do_vr_mul_op (SD_, RD, RS, RT,		1 /* accumulate */,		MFHI, UNS, SAT,		0 /* don't subtract */,		SAT /* short */,		1 /* double */);}000000,5.RS,5.RT,5.RD,1.SAT,1.MFHI,00,1.UNS,101000::32::MACC_4120"macc%s<MFHI>%s<UNS>%s<SAT> r<RD>, r<RS>, r<RT>"*vr4120:{  do_vr_mul_op (SD_, RD, RS, RT,		1 /* accumulate */,		MFHI, UNS, SAT,		0 /* don't subtract */,		SAT /* short */,		0 /* single */);}// VR5400 and VR5500 instructions.000000,5.RS,5.RT,5.RD,0,1.MFHI,001,01100,1.UNS::32::MUL"mul%s<MFHI>%s<UNS> r<RD>, r<RS>, r<RT>"*vr5400:*vr5500:{  do_vr_mul_op (SD_, RD, RS, RT,		0 /* don't accumulate */,		MFHI, UNS,		0 /* don't saturate */,		0 /* don't subtract */,		0 /* not short */,		0 /* single */);}000000,5.RS,5.RT,5.RD,0,1.MFHI,011,01100,1.UNS::32::MULS"muls%s<MFHI>%s<UNS> r<RD>, r<RS>, r<RT>"*vr5400:*vr5500:{  do_vr_mul_op (SD_, RD, RS, RT,		0 /* don't accumulate */,		MFHI, UNS,		0 /* don't saturate */,		1 /* subtract */,		0 /* not short */,		0 /* single */);}000000,5.RS,5.RT,5.RD,0,1.MFHI,101,01100,1.UNS::32::MACC_5xxx"macc%s<MFHI>%s<UNS> r<RD>, r<RS>, r<RT>"*vr5400:*vr5500:{  do_vr_mul_op (SD_, RD, RS, RT,		1 /* accumulate */,		MFHI, UNS,		0 /* don't saturate */,		0 /* don't subtract */,		0 /* not short */,		0 /* single */);}000000,5.RS,5.RT,5.RD,0,1.MFHI,111,01100,1.UNS::32::MSAC"msac%s<MFHI>%s<UNS> r<RD>, r<RS>, r<RT>"*vr5400:*vr5500:{  do_vr_mul_op (SD_, RD, RS, RT,		1 /* accumulate */,		MFHI, UNS,		0 /* don't saturate */,		1 /* subtract */,		0 /* not short */,		0 /* single */);}000000,00001,5.RT,5.RD,5.SHIFT,000010::32::ROR"ror r<RD>, r<RT>, <SHIFT>"*vr5400:*vr5500:{  GPR[RD] = do_ror (SD_, GPR[RT], SHIFT);}000000,5.RS,5.RT,5.RD,00001,000110::32::RORV"rorv r<RD>, r<RT>, r<RS>"*vr5400:*vr5500:{  GPR[RD] = do_ror (SD_, GPR[RT], GPR[RS]);}000000,00001,5.RT,5.RD,5.SHIFT,111010::64::DROR"dror r<RD>, r<RT>, <SHIFT>"*vr5400:*vr5500:{  GPR[RD] = do_dror (SD_, GPR[RT], SHIFT);}000000,00001,5.RT,5.RD,5.SHIFT,111110::64::DROR32"dror32 r<RD>, r<RT>, <SHIFT>"*vr5400:*vr5500:{  GPR[RD] = do_dror (SD_, GPR[RT], SHIFT + 32);}000000,5.RS,5.RT,5.RD,00001,010110::64::DRORV"drorv r<RD>, r<RT>, r<RS>"*vr5400:*vr5500:{  GPR[RD] = do_dror (SD_, GPR[RT], GPR[RS]);}010011,5.BASE,5.INDEX,5.0,5.FD,000101:COP1X:64::LUXC1"luxc1 f<FD>, r<INDEX>(r<BASE>)"*vr5500:{  check_fpu (SD_);  COP_LD (1, FD, do_load (SD_, AccessLength_DOUBLEWORD,			  (GPR[BASE] + GPR[INDEX]) & ~MASK64 (2, 0), 0));}010011,5.BASE,5.INDEX,5.FS,00000,001101:COP1X:64::SUXC1"suxc1 f<FS>, r<INDEX>(r<BASE>)"*vr5500:{  check_fpu (SD_);  do_store (SD_, AccessLength_DOUBLEWORD,	    (GPR[BASE] + GPR[INDEX]) & ~MASK64 (2, 0), 0,	    COP_SD (1, FS));}010000,1,19.*,100000:COP0:32::WAIT"wait"*vr5500:011100,00000,5.RT,5.DR,00000,111101:SPECIAL:64::MFDR"mfdr r<RT>, r<DR>"*vr5400:*vr5500:011100,00100,5.RT,5.DR,00000,111101:SPECIAL:64::MTDR"mtdr r<RT>, r<DR>"*vr5400:*vr5500:011100,00000,00000,00000,00000,111110:SPECIAL:64::DRET"dret"*vr5400:*vr5500:

⌨️ 快捷键说明

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