Previous 199869 Revisions Next

r33181 Monday 3rd November, 2014 at 21:10:09 UTC by Ryan Holtz
n64: Fix up how negative values are handled in VRSQL/VRCPL [MooglyGuy]
[src/emu/cpu/rsp]rspdrc.c

trunk/src/emu/cpu/rsp/rspdrc.c
r241692r241693
63186318
63196319   UINT16 urec;
63206320   SIMD_EXTRACT16(m_xv[VS2REG], urec, EL);
6321   INT32 rec = (urec | m_reciprocal_high);
6322
6321   INT32 rec = (INT16)urec;
63236322   INT32 datainput = rec;
63246323
6325   if (rec < 0)
6324   if (m_dp_allowed)
63266325   {
6327      if (m_dp_allowed)
6326      rec = (rec & 0x0000ffff) | m_reciprocal_high;
6327      datainput = rec;
6328
6329      if (rec < 0)
63286330      {
63296331         if (rec < -32768)
63306332         {
r241692r241693
63356337            datainput = -datainput;
63366338         }
63376339      }
6338      else
6339      {
6340         datainput = -datainput;
6341      }
63426340   }
6341   else if (datainput < 0)
6342   {
6343      datainput = -datainput;
63436344
6345      shifter = 0x10;
6346   }
63446347
63456348   if (datainput)
63466349   {
r241692r241693
63536356         }
63546357      }
63556358   }
6356   else
6357   {
6358      if (m_dp_allowed)
6359      {
6360         shifter = 0;
6361      }
6362      else
6363      {
6364         shifter = 0x10;
6365      }
6366   }
63676359
63686360   INT32 address = ((datainput << shifter) & 0x7fc00000) >> 22;
63696361   INT32 fetchval = rsp_divtable[address];
63706362   INT32 temp = (0x40000000 | (fetchval << 14)) >> ((~shifter) & 0x1f);
6371   if (rec < 0)
6372   {
6373      temp = ~temp;
6374   }
6363   temp ^= rec >> 31;
6364
63756365   if (!rec)
63766366   {
63776367      temp = 0x7fffffff;
r241692r241693
64086398   int op = m_rsp_state->arg0;
64096399
64106400   INT32 shifter = 0;
6411   INT32 rec = ((UINT16)(VREG_S(VS2REG, EL & 7)) | m_reciprocal_high);
6401   INT32 rec = (INT16)VREG_S(VS2REG, EL & 7);
64126402   INT32 datainput = rec;
64136403
6414   if (rec < 0)
6404   if (m_dp_allowed)
64156405   {
6416      if (m_dp_allowed)
6406      rec = (rec & 0x0000ffff) | m_reciprocal_high;
6407      datainput = rec;
6408
6409      if (rec < 0)
64176410      {
64186411         if (rec < -32768)
64196412         {
r241692r241693
64246417            datainput = -datainput;
64256418         }
64266419      }
6427      else
6428      {
6429         datainput = -datainput;
6430      }
64316420   }
6421   else if (datainput < 0)
6422   {
6423      datainput = -datainput;
64326424
6425      shifter = 0x10;
6426   }
64336427
64346428   if (datainput)
64356429   {
r241692r241693
64426436         }
64436437      }
64446438   }
6445   else
6446   {
6447      if (m_dp_allowed)
6448      {
6449         shifter = 0;
6450      }
6451      else
6452      {
6453         shifter = 0x10;
6454      }
6455   }
64566439
6457   INT32 address = ((datainput << shifter) & 0x7fc00000) >> 22;
6458   INT32 fetchval = rsp_divtable[address];
6440   UINT32 address = (datainput << shifter) >> 22;
6441   INT32 fetchval = rsp_divtable[address & 0x1ff];
64596442   INT32 temp = (0x40000000 | (fetchval << 14)) >> ((~shifter) & 0x1f);
6460   if (rec < 0)
6461   {
6462      temp = ~temp;
6463   }
6443   temp ^= rec >> 31;
64646444   if (!rec)
64656445   {
64666446      temp = 0x7fffffff;
r241692r241693
67456725   INT32 shifter = 0;
67466726   UINT16 val;
67476727   SIMD_EXTRACT16(m_xv[VS2REG], val, EL);
6748   INT32 rec = m_reciprocal_high | val;
6728   INT32 rec = (INT16)val;
67496729   INT32 datainput = rec;
67506730
6751   if (rec < 0)
6731   if (m_dp_allowed)
67526732   {
6753      if (m_dp_allowed)
6733      rec = (rec & 0x0000ffff) | m_reciprocal_high;
6734      datainput = rec;
6735
6736      if (rec < 0)
67546737      {
67556738         if (rec < -32768)
67566739         {
r241692r241693
67616744            datainput = -datainput;
67626745         }
67636746      }
6764      else
6765      {
6766         datainput = -datainput;
6767      }
67686747   }
6748   else if (datainput < 0)
6749   {
6750      datainput = -datainput;
67696751
6752      shifter = 0x10;
6753   }
6754
67706755   if (datainput)
67716756   {
67726757      for (int i = 0; i < 32; i++)
r241692r241693
67786763         }
67796764      }
67806765   }
6781   else
6782   {
6783      if (m_dp_allowed)
6784      {
6785         shifter = 0;
6786      }
6787      else
6788      {
6789         shifter = 0x10;
6790      }
6791   }
67926766
67936767   INT32 address = ((datainput << shifter) & 0x7fc00000) >> 22;
67946768   address = ((address | 0x200) & 0x3fe) | (shifter & 1);
67956769
67966770   INT32 fetchval = rsp_divtable[address];
67976771   INT32 temp = (0x40000000 | (fetchval << 14)) >> (((~shifter) & 0x1f) >> 1);
6798   if (rec < 0)
6799   {
6800      temp = ~temp;
6801   }
6772   temp ^= rec >> 31;
6773
68026774   if (!rec)
68036775   {
68046776      temp = 0x7fffffff;
r241692r241693
68296801   int op = m_rsp_state->arg0;
68306802
68316803   INT32 shifter = 0;
6832   INT32 rec = m_reciprocal_high | (UINT16)VREG_S(VS2REG, EL & 7);
6804   INT32 rec = (INT16)VREG_S(VS2REG, EL & 7);
68336805   INT32 datainput = rec;
68346806
6835   if (rec < 0)
6807   if (m_dp_allowed)
68366808   {
6837      if (m_dp_allowed)
6809      rec = (rec & 0x0000ffff) | m_reciprocal_high;
6810      datainput = rec;
6811
6812      if (rec < 0)
68386813      {
68396814         if (rec < -32768)
68406815         {
r241692r241693
68456820            datainput = -datainput;
68466821         }
68476822      }
6848      else
6849      {
6850         datainput = -datainput;
6851      }
68526823   }
6824   else if (datainput < 0)
6825   {
6826      datainput = -datainput;
68536827
6828      shifter = 0x10;
6829   }
6830
68546831   if (datainput)
68556832   {
68566833      for (int i = 0; i < 32; i++)
r241692r241693
68626839         }
68636840      }
68646841   }
6865   else
6866   {
6867      if (m_dp_allowed)
6868      {
6869         shifter = 0;
6870      }
6871      else
6872      {
6873         shifter = 0x10;
6874      }
6875   }
68766842
68776843   INT32 address = ((datainput << shifter) & 0x7fc00000) >> 22;
68786844   address = ((address | 0x200) & 0x3fe) | (shifter & 1);
68796845
68806846   INT32 fetchval = rsp_divtable[address];
68816847   INT32 temp = (0x40000000 | (fetchval << 14)) >> (((~shifter) & 0x1f) >> 1);
6882   if (rec < 0)
6883   {
6884      temp = ~temp;
6885   }
6848   temp ^= rec >> 31;
6849
68866850   if (!rec)
68876851   {
68886852      temp = 0x7fffffff;


Previous 199869 Revisions Next


© 1997-2024 The MAME Team