Previous 199869 Revisions Next

r33179 Monday 3rd November, 2014 at 20:18:52 UTC by Ryan Holtz
rsp: Add VNOP, VNULL, and VRSQ instructions. [MooglyGuy]
[src/emu/cpu/rsp]rsp.h rspdrc.c

trunk/src/emu/cpu/rsp/rsp.h
r241690r241691
325325   void ccfunc_mtc2_scalar();
326326   void ccfunc_ctc2_scalar();
327327#endif
328   void ccfunc_rsp_vrsq_scalar();
328329#if USE_SIMD && SIMUL_SIMD
329330   void ccfunc_backup_regs();
330331   void ccfunc_restore_regs();
trunk/src/emu/cpu/rsp/rspdrc.c
r241690r241691
65926592}
65936593#endif
65946594
6595// VRSQ
6596//
6597// 31       25  24     20      15      10      5        0
6598// ------------------------------------------------------
6599// | 010010 | 1 | EEEE | SSSSS | ?FFFF | DDDDD | 110100 |
6600// ------------------------------------------------------
6601//
6602// Calculates reciprocal square-root
6603
6604inline void rsp_device::ccfunc_rsp_vrsq_scalar()
6605{
6606   int op = m_rsp_state->arg0;
6607
6608   INT32 shifter = 0;
6609   INT32 rec = (INT16)VREG_S(VS2REG, EL & 7);
6610   INT32 datainput = (rec < 0) ? (-rec) : (rec);
6611
6612   if (rec < 0)
6613   {
6614      if (rec < -32768)
6615      {
6616         datainput = ~datainput;
6617      }
6618      else
6619      {
6620         datainput = -datainput;
6621      }
6622   }
6623
6624   if (datainput)
6625   {
6626      for (int i = 0; i < 32; i++)
6627      {
6628         if (datainput & (1 << ((~i) & 0x1f)))
6629         {
6630            shifter = i;
6631            break;
6632         }
6633      }
6634   }
6635   else
6636   {
6637      shifter = 0;
6638   }
6639
6640   INT32 address = ((datainput << shifter) & 0x7fc00000) >> 22;
6641   address = ((address | 0x200) & 0x3fe) | (shifter & 1);
6642
6643   INT32 fetchval = rsp_divtable[address];
6644   INT32 temp = (0x40000000 | (fetchval << 14)) >> (((~shifter) & 0x1f) >> 1);
6645   if (rec < 0)
6646   {
6647      temp = ~temp;
6648   }
6649   if (!rec)
6650   {
6651      temp = 0x7fffffff;
6652   }
6653   else if (rec == 0xffff8000)
6654   {
6655      temp = 0xffff0000;
6656   }
6657   rec = temp;
6658
6659   if (rec < 0)
6660   {
6661      if (m_dp_allowed)
6662      {
6663         if (rec < -32768)
6664         {
6665            datainput = ~datainput;
6666         }
6667         else
6668         {
6669            datainput = -datainput;
6670         }
6671      }
6672      else
6673      {
6674         datainput = -datainput;
6675      }
6676   }
6677
6678   if (datainput)
6679   {
6680      for (int i = 0; i < 32; i++)
6681      {
6682         if (datainput & (1 << ((~i) & 0x1f)))
6683         {
6684            shifter = i;
6685            break;
6686         }
6687      }
6688   }
6689   else
6690   {
6691      shifter = 0;
6692   }
6693
6694   address = ((datainput << shifter) & 0x7fc00000) >> 22;
6695   address = ((address | 0x200) & 0x3fe) | (shifter & 1);
6696
6697   fetchval = rsp_divtable[address];
6698   temp = (0x40000000 | (fetchval << 14)) >> (((~shifter) & 0x1f) >> 1);
6699   if (rec < 0)
6700   {
6701      temp = ~temp;
6702   }
6703   if (!rec)
6704   {
6705      temp = 0x7fff;
6706   }
6707   else if (rec == 0xffff8000)
6708   {
6709      temp = 0x0000;
6710   }
6711   rec = temp;
6712
6713   W_VREG_S(VDREG, VS1REG & 7) = (UINT16)rec;
6714   for (int i = 0; i < 8; i++)
6715   {
6716      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
6717   }
6718}
6719
6720static void cfunc_rsp_vrsq_scalar(void *param)
6721{
6722   ((rsp_device *)param)->ccfunc_rsp_vrsq_scalar();
6723}
6724
65956725#if USE_SIMD
65966726// VRSQL
65976727//
r241690r241691
78357965#endif
78367966         return TRUE;
78377967
7968      case 0x34:      /* VRSQ */
7969         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);         // mov     [arg0],desc->opptr.l
7970         UML_CALLC_block, cfunc_rsp_vrsq_scalar, this);
7971         return TRUE;
7972
78387973      case 0x35:      /* VRSQL */
78397974         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
78407975         UML_CALLC(block, cfunc_rsp_vrsql_simd, this);
r241690r241691
78577992#endif
78587993         return TRUE;
78597994
7995      case 0x37:      /* VNOP */
7996      case 0x3F:      /* VNULL */
7997         return TRUE;
7998
78607999      default:
78618000         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
78628001         UML_CALLC(block, cfunc_unimplemented_opcode, this);
r241690r241691
80578196         UML_CALLC(block, cfunc_rsp_vmov_scalar, this);
80588197         return TRUE;
80598198
8199      case 0x34:      /* VRSQ */
8200         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);         // mov     [arg0],desc->opptr.l
8201         UML_CALLC(block, cfunc_rsp_vrsq_scalar, this);
8202         return TRUE;
8203
80608204      case 0x35:      /* VRSQL */
80618205         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
80628206         UML_CALLC(block, cfunc_rsp_vrsql_scalar, this);
r241690r241691
80678211         UML_CALLC(block, cfunc_rsp_vrsqh_scalar, this);
80688212         return TRUE;
80698213
8214      case 0x37:      /* VNOP */
8215      case 0x3F:      /* VNULL */
8216         return TRUE;
8217
80708218      default:
80718219         UML_MOV(block, mem(&m_rsp_state->arg0), desc->opptr.l[0]);        // mov     [arg0],desc->opptr.l
80728220         UML_CALLC(block, cfunc_unimplemented_opcode, this);


Previous 199869 Revisions Next


© 1997-2024 The MAME Team