Previous 199869 Revisions Next

r33479 Friday 21st November, 2014 at 12:26:54 UTC by Ryan Holtz
rspdrc: Optimized accumulator access in multiply instructions. [MooglyGuy]
[src/emu/cpu/rsp]rsp.c rspcp2d.c

trunk/src/emu/cpu/rsp/rsp.c
r241990r241991
349349
350350/*****************************************************************************/
351351
352#if 0
353static const int vector_elements[16][8] =
354{
355   { 0, 1, 2, 3, 4, 5, 6, 7 },     // none
356   { 0, 1, 2, 3, 4, 5, 6, 7 },     // ???
357   { 0, 0, 2, 2, 4, 4, 6, 6 },     // 0q
358   { 1, 1, 3, 3, 5, 5, 7, 7 },     // 1q
359   { 0, 0, 0, 0, 4, 4, 4, 4 },     // 0h
360   { 1, 1, 1, 1, 5, 5, 5, 5 },     // 1h
361   { 2, 2, 2, 2, 6, 6, 6, 6 },     // 2h
362   { 3, 3, 3, 3, 7, 7, 7, 7 },     // 3h
363   { 0, 0, 0, 0, 0, 0, 0, 0 },     // 0
364   { 1, 1, 1, 1, 1, 1, 1, 1 },     // 1
365   { 2, 2, 2, 2, 2, 2, 2, 2 },     // 2
366   { 3, 3, 3, 3, 3, 3, 3, 3 },     // 3
367   { 4, 4, 4, 4, 4, 4, 4, 4 },     // 4
368   { 5, 5, 5, 5, 5, 5, 5, 5 },     // 5
369   { 6, 6, 6, 6, 6, 6, 6, 6 },     // 6
370   { 7, 7, 7, 7, 7, 7, 7, 7 },     // 7
371};
372#endif
373
374352void rsp_device::resolve_cb()
375353{
376354   m_dp_reg_r_func.resolve();
trunk/src/emu/cpu/rsp/rspcp2d.c
r241990r241991
6060#define ACCUM_M(x)           (UINT16)m_accum[x].w[2]
6161#define ACCUM_L(x)           (UINT16)m_accum[x].w[1]
6262#define ACCUM_LL(x)          (UINT16)m_accum[x].w[0]
63#define ACCUM(x)          m_accum[x].q
6364
6465#define SET_ACCUM_H(v, x)       m_accum[x].w[3] = v;
6566#define SET_ACCUM_M(v, x)       m_accum[x].w[2] = v;
6667#define SET_ACCUM_L(v, x)       m_accum[x].w[1] = v;
6768#define SET_ACCUM_LL(v, x)      m_accum[x].w[0] = v;
69#define SET_ACCUM(v, x)         m_accum[x].q = v;
6870
69#define GET_VS1(out, i)  out = VREG_S(VS1REG, i)
70#define GET_VS2(out, i)  out = VREG_S(VS2REG, VEC_EL_2(EL, i))
71#define GET_VS1(out, i)         out = VREG_S(vs1reg, i)
72#define GET_VS2(out, i)         out = VREG_S(vs2reg, VEC_EL_2(el, i))
7173
7274#define CARRY_FLAG(x)          (m_vflag[CARRY][x & 7] != 0 ? 0xffff : 0)
7375#define COMPARE_FLAG(x)        (m_vflag[COMPARE][x & 7] != 0 ? 0xffff : 0)
r241990r241991
9395#define CLEAR_ZERO_FLAG(x)          { m_vflag[ZERO][x & 7] = 0; }
9496#define CLEAR_CLIP2_FLAG(x)         { m_vflag[CLIP2][x & 7] = 0; }
9597
98#define CACHE_VALUES() \
99   const int op = m_op;   \
100   const int vdreg = VDREG;   \
101   const int vs1reg = VS1REG;   \
102   const int vs2reg = VS2REG;   \
103   const int el = EL;
104
96105#define WRITEBACK_RESULT() { \
97      W_VREG_S(VDREG, 0) = m_vres[0];   \
98      W_VREG_S(VDREG, 1) = m_vres[1];   \
99      W_VREG_S(VDREG, 2) = m_vres[2];   \
100      W_VREG_S(VDREG, 3) = m_vres[3];   \
101      W_VREG_S(VDREG, 4) = m_vres[4];   \
102      W_VREG_S(VDREG, 5) = m_vres[5];   \
103      W_VREG_S(VDREG, 6) = m_vres[6];   \
104      W_VREG_S(VDREG, 7) = m_vres[7];   \
106      W_VREG_S(vdreg, 0) = m_vres[0];   \
107      W_VREG_S(vdreg, 1) = m_vres[1];   \
108      W_VREG_S(vdreg, 2) = m_vres[2];   \
109      W_VREG_S(vdreg, 3) = m_vres[3];   \
110      W_VREG_S(vdreg, 4) = m_vres[4];   \
111      W_VREG_S(vdreg, 5) = m_vres[5];   \
112      W_VREG_S(vdreg, 6) = m_vres[6];   \
113      W_VREG_S(vdreg, 7) = m_vres[7];   \
105114}
106115
107116static const int vector_elements_2[16][8] =
r241990r241991
13461355
13471356void rsp_cop2_drc::vmulf()
13481357{
1349   int op = m_op;
1358   CACHE_VALUES();
13501359
13511360   for (int i = 0; i < 8; i++)
13521361   {
r241990r241991
13591368      if (s1 == -32768 && s2 == -32768)
13601369      {
13611370         // overflow
1362         SET_ACCUM_H(0, i);
1363         SET_ACCUM_M(-32768, i);
1364         SET_ACCUM_L(-32768, i);
1371         ACCUM(i) = 0x0000800080000000L;
13651372         m_vres[i] = 0x7fff;
13661373      }
13671374      else
13681375      {
1369         INT64 r =  s1 * s2 * 2;
1370         r += 0x8000;    // rounding ?
1371         SET_ACCUM_H((r < 0) ? 0xffff : 0, i);
1372         SET_ACCUM_M((INT16)(r >> 16), i);
1373         SET_ACCUM_L((UINT16)(r), i);
1376         ACCUM(i) = (INT64)(s1 * s2 * 2 + 0x8000) << 16; // rounding?
13741377         m_vres[i] = ACCUM_M(i);
13751378      }
13761379   }
r241990r241991
13931396
13941397void rsp_cop2_drc::vmulu()
13951398{
1396   int op = m_op;
1399   CACHE_VALUES();
13971400
13981401   for (int i = 0; i < 8; i++)
13991402   {
r241990r241991
14031406      INT32 s1 = (INT32)(INT16)w1;
14041407      INT32 s2 = (INT32)(INT16)w2;
14051408
1406      INT64 r = s1 * s2 * 2;
1407      r += 0x8000;    // rounding ?
1409      INT64 r = s1 * s2 * 2 + 0x8000; // rounding?
14081410
1409      SET_ACCUM_H((UINT16)(r >> 32), i);
1410      SET_ACCUM_M((UINT16)(r >> 16), i);
1411      SET_ACCUM_L((UINT16)(r), i);
1411      ACCUM(i) = r << 16;
14121412
14131413      if (r < 0)
14141414      {
r241990r241991
14451445
14461446void rsp_cop2_drc::vmudl()
14471447{
1448   int op = m_op;
1448   CACHE_VALUES();
14491449
14501450   for (int i = 0; i < 8; i++)
14511451   {
r241990r241991
14551455      UINT32 s1 = (UINT32)(UINT16)w1;
14561456      UINT32 s2 = (UINT32)(UINT16)w2;
14571457
1458      UINT32 r = s1 * s2;
1458      ACCUM(i) = s1 * s2;
14591459
1460      SET_ACCUM_H(0, i);
1461      SET_ACCUM_M(0, i);
1462      SET_ACCUM_L((UINT16)(r >> 16), i);
1463
14641460      m_vres[i] = ACCUM_L(i);
14651461   }
14661462   WRITEBACK_RESULT();
r241990r241991
14851481
14861482void rsp_cop2_drc::vmudm()
14871483{
1488   int op = m_op;
1484   CACHE_VALUES();
14891485
14901486   for (int i = 0; i < 8; i++)
14911487   {
r241990r241991
14951491      INT32 s1 = (INT32)(INT16)w1;
14961492      INT32 s2 = (UINT16)w2;
14971493
1498      INT32 r = s1 * s2;
1494      ACCUM(i) = (INT64)(s1 * s2) << 16;
14991495
1500      SET_ACCUM_H((r < 0) ? 0xffff : 0, i);      // sign-extend to 48-bit
1501      SET_ACCUM_M((INT16)(r >> 16), i);
1502      SET_ACCUM_L((UINT16)r, i);
1503
15041496      m_vres[i] = ACCUM_M(i);
15051497   }
15061498   WRITEBACK_RESULT();
r241990r241991
15251517
15261518void rsp_cop2_drc::vmudn()
15271519{
1528   int op = m_op;
1520   CACHE_VALUES();
15291521
15301522   for (int i = 0; i < 8; i++)
15311523   {
r241990r241991
15371529
15381530      INT32 r = s1 * s2;
15391531
1540      SET_ACCUM_H((r < 0) ? 0xffff : 0, i);      // sign-extend to 48-bit
1541      SET_ACCUM_M((INT16)(r >> 16), i);
1542      SET_ACCUM_L((UINT16)(r), i);
1532      ACCUM(i) = (INT64)(s1 * s2) << 16;
15431533
15441534      m_vres[i] = (UINT16)(r);
15451535   }
r241990r241991
15651555
15661556void rsp_cop2_drc::vmudh()
15671557{
1568   int op = m_op;
1558   CACHE_VALUES();
15691559
15701560   for (int i = 0; i < 8; i++)
15711561   {
r241990r241991
15771567
15781568      INT32 r = s1 * s2;
15791569
1580      SET_ACCUM_H((INT16)(r >> 16), i);
1581      SET_ACCUM_M((UINT16)(r), i);
1582      SET_ACCUM_L(0, i);
1570      ACCUM(i) = (INT64)r << 32;
15831571
15841572      if (r < -32768) r = -32768;
15851573      if (r >  32767) r = 32767;
r241990r241991
16041592
16051593void rsp_cop2_drc::vmacf()
16061594{
1607   int op = m_op;
1595   CACHE_VALUES();
16081596
16091597   for (int i = 0; i < 8; i++)
16101598   {
r241990r241991
16141602      INT32 s1 = (INT32)(INT16)w1;
16151603      INT32 s2 = (INT32)(INT16)w2;
16161604
1617      INT32 r = s1 * s2;
1605      ACCUM(i) += (INT64)(s1 * s2 * 2) << 16;
16181606
1619      UINT64 q = (UINT64)(UINT16)ACCUM_LL(i);
1620      q |= (((UINT64)(UINT16)ACCUM_L(i)) << 16);
1621      q |= (((UINT64)(UINT16)ACCUM_M(i)) << 32);
1622      q |= (((UINT64)(UINT16)ACCUM_H(i)) << 48);
1623
1624      q += (INT64)(r) << 17;
1625      SET_ACCUM_LL((UINT16)q, i);
1626      SET_ACCUM_L((UINT16)(q >> 16), i);
1627      SET_ACCUM_M((UINT16)(q >> 32), i);
1628      SET_ACCUM_H((UINT16)(q >> 48), i);
1629
16301607      m_vres[i] = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff);
16311608   }
16321609   WRITEBACK_RESULT();
r241990r241991
16481625
16491626void rsp_cop2_drc::vmacu()
16501627{
1651   int op = m_op;
1628   CACHE_VALUES();
16521629
16531630   for (int i = 0; i < 8; i++)
16541631   {
r241990r241991
16581635      INT32 s1 = (INT32)(INT16)w1;
16591636      INT32 s2 = (INT32)(INT16)w2;
16601637
1661      INT32 r1 = s1 * s2;
1662      UINT32 r2 = (UINT16)ACCUM_L(i) + ((UINT16)(r1) * 2);
1663      UINT32 r3 = (UINT16)ACCUM_M(i) + (UINT16)((r1 >> 16) * 2) + (UINT16)(r2 >> 16);
1638      ACCUM(i) += (INT64)(s1 * s2 * 2) << 16;
16641639
1665      SET_ACCUM_L((UINT16)(r2), i);
1666      SET_ACCUM_M((UINT16)(r3), i);
1667      SET_ACCUM_H(ACCUM_H(i) + (UINT16)(r3 >> 16) + (UINT16)(r1 >> 31), i);
1668
16691640      if ((INT16)ACCUM_H(i) < 0)
16701641      {
16711642         m_vres[i] = 0;
r241990r241991
17111682
17121683void rsp_cop2_drc::vmadl()
17131684{
1714   int op = m_op;
1685   CACHE_VALUES();
17151686
17161687   for (int i = 0; i < 8; i++)
17171688   {
r241990r241991
17211692      UINT32 s1 = w1;
17221693      UINT32 s2 = w2;
17231694
1724      UINT32 r1 = s1 * s2;
1725      UINT32 r2 = (UINT16)ACCUM_L(i) + (r1 >> 16);
1726      UINT32 r3 = (UINT16)ACCUM_M(i) + (r2 >> 16);
1695      ACCUM(i) += (s1 * s2) & 0xffff0000;
17271696
1728      SET_ACCUM_L((UINT16)r2, i);
1729      SET_ACCUM_M((UINT16)r3, i);
1730      SET_ACCUM_H(ACCUM_H(i) + (INT16)(r3 >> 16), i);
1731
17321697      m_vres[i] = SATURATE_ACCUM(i, 0, 0x0000, 0xffff);
17331698   }
17341699   WRITEBACK_RESULT();
r241990r241991
17451710
17461711void rsp_cop2_drc::vmadm()
17471712{
1748   int op = m_op;
1713   CACHE_VALUES();
17491714
17501715   for (int i = 0; i < 8; i++)
17511716   {
r241990r241991
17551720      UINT32 s1 = (INT32)(INT16)w1;
17561721      UINT32 s2 = (UINT16)w2;
17571722
1758      UINT32 r1 = s1 * s2;
1759      UINT32 r2 = (UINT16)ACCUM_L(i) + (UINT16)(r1);
1760      UINT32 r3 = (UINT16)ACCUM_M(i) + (r1 >> 16) + (r2 >> 16);
1723      ACCUM(i) += (INT64)(INT32)(s1 * s2) << 16;
17611724
1762      SET_ACCUM_L((UINT16)r2, i);
1763      SET_ACCUM_M((UINT16)r3, i);
1764      SET_ACCUM_H((UINT16)ACCUM_H(i) + (UINT16)(r3 >> 16), i);
1765      if ((INT32)(r1) < 0)
1766      {
1767         SET_ACCUM_H((UINT16)ACCUM_H(i) - 1, i);
1768      }
1769
17701725      m_vres[i] = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff);
17711726   }
17721727   WRITEBACK_RESULT();
r241990r241991
17831738
17841739void rsp_cop2_drc::vmadn()
17851740{
1786   int op = m_op;
1741   CACHE_VALUES();
17871742
17881743   for (int i = 0; i < 8; i++)
17891744   {
r241990r241991
17931748      INT32 s1 = (UINT16)w1;
17941749      INT32 s2 = (INT32)(INT16)w2;
17951750
1796      UINT64 q = (UINT64)ACCUM_LL(i);
1797      q |= (((UINT64)ACCUM_L(i)) << 16);
1798      q |= (((UINT64)ACCUM_M(i)) << 32);
1799      q |= (((UINT64)ACCUM_H(i)) << 48);
1800      q += (INT64)(s1*s2) << 16;
1751      ACCUM(i) += (INT64)(s1 * s2) << 16;
18011752
1802      SET_ACCUM_LL((UINT16)q, i);
1803      SET_ACCUM_L((UINT16)(q >> 16), i);
1804      SET_ACCUM_M((UINT16)(q >> 32), i);
1805      SET_ACCUM_H((UINT16)(q >> 48), i);
1806
18071753      m_vres[i] = SATURATE_ACCUM(i, 0, 0x0000, 0xffff);
18081754   }
18091755   WRITEBACK_RESULT();
r241990r241991
18281774
18291775void rsp_cop2_drc::vmadh()
18301776{
1831   int op = m_op;
1777   CACHE_VALUES();
18321778
18331779   for (int i = 0; i < 8; i++)
18341780   {
r241990r241991
18381784      INT32 s1 = (INT32)(INT16)w1;
18391785      INT32 s2 = (INT32)(INT16)w2;
18401786
1841      INT32 accum = (UINT32)(UINT16)ACCUM_M(i);
1842      accum |= ((UINT32)((UINT16)ACCUM_H(i))) << 16;
1843      accum += s1 * s2;
1787      ACCUM(i) += (INT64)(s1 * s2) << 32;
18441788
1845      SET_ACCUM_H((UINT16)(accum >> 16), i);
1846      SET_ACCUM_M((UINT16)accum, i);
1847
18481789      m_vres[i] = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff);
18491790   }
18501791   WRITEBACK_RESULT();
r241990r241991
18661807
18671808void rsp_cop2_drc::vadd()
18681809{
1869   int op = m_op;
1810   CACHE_VALUES();
18701811
18711812   for (int i = 0; i < 8; i++)
18721813   {
r241990r241991
19061847
19071848void rsp_cop2_drc::vsub()
19081849{
1909   int op = m_op;
1850   CACHE_VALUES();
19101851
19111852   for (int i = 0; i < 8; i++)
19121853   {
r241990r241991
19461887
19471888void rsp_cop2_drc::vabs()
19481889{
1949   int op = m_op;
1890   CACHE_VALUES();
19501891
19511892   for (int i = 0; i < 8; i++)
19521893   {
r241990r241991
19971938
19981939void rsp_cop2_drc::vaddc()
19991940{
2000   int op = m_op;
1941   CACHE_VALUES();
20011942
20021943   CLEAR_ZERO_FLAGS();
20031944   CLEAR_CARRY_FLAGS();
r241990r241991
20401981
20411982void rsp_cop2_drc::vsubc()
20421983{
2043   int op = m_op;
1984   CACHE_VALUES();
20441985
20451986   CLEAR_ZERO_FLAGS();
20461987   CLEAR_CARRY_FLAGS();
r241990r241991
20862027
20872028void rsp_cop2_drc::vaddb()
20882029{
2089   const int op = m_op;
2090   const int round = (EL == 0) ? 0 : (1 << (EL - 1));
2030   CACHE_VALUES();
2031   const int round = (el == 0) ? 0 : (1 << (el - 1));
20912032
20922033   for (int i = 0; i < 8; i++)
20932034   {
r241990r241991
21402081
21412082void rsp_cop2_drc::vsaw()
21422083{
2143   int op = m_op;
2084   const int op = m_op;
2085   const int vdreg = VDREG;
2086   const int el = EL;
21442087
2145   switch (EL)
2088   switch (el)
21462089   {
21472090      case 0x08:      // VSAWH
21482091         for (int i = 0; i < 8; i++)
21492092         {
2150            W_VREG_S(VDREG, i) = ACCUM_H(i);
2093            W_VREG_S(vdreg, i) = ACCUM_H(i);
21512094         }
21522095         break;
21532096      case 0x09:      // VSAWM
21542097         for (int i = 0; i < 8; i++)
21552098         {
2156            W_VREG_S(VDREG, i) = ACCUM_M(i);
2099            W_VREG_S(vdreg, i) = ACCUM_M(i);
21572100         }
21582101         break;
21592102      case 0x0a:      // VSAWL
21602103         for (int i = 0; i < 8; i++)
21612104         {
2162            W_VREG_S(VDREG, i) = ACCUM_L(i);
2105            W_VREG_S(vdreg, i) = ACCUM_L(i);
21632106         }
21642107         break;
21652108      default:      // Unsupported
21662109      {
21672110         for (int i = 0; i < 8; i++)
21682111         {
2169            W_VREG_S(VDREG, i) = 0;
2112            W_VREG_S(vdreg, i) = 0;
21702113         }
21712114      }
21722115   }
r241990r241991
21902133
21912134void rsp_cop2_drc::vlt()
21922135{
2193   int op = m_op;
2136   CACHE_VALUES();
21942137
21952138   CLEAR_COMPARE_FLAGS();
21962139   CLEAR_CLIP2_FLAGS();
r241990r241991
22482191
22492192void rsp_cop2_drc::veq()
22502193{
2251   int op = m_op;
2194   CACHE_VALUES();
22522195
22532196   CLEAR_COMPARE_FLAGS();
22542197   CLEAR_CLIP2_FLAGS();
r241990r241991
22952238
22962239void rsp_cop2_drc::vne()
22972240{
2298   int op = m_op;
2241   CACHE_VALUES();
22992242
23002243   CLEAR_COMPARE_FLAGS();
23012244   CLEAR_CLIP2_FLAGS();
r241990r241991
23422285
23432286void rsp_cop2_drc::vge()
23442287{
2345   int op = m_op;
2288   CACHE_VALUES();
23462289
23472290   CLEAR_COMPARE_FLAGS();
23482291   CLEAR_CLIP2_FLAGS();
r241990r241991
23872330
23882331void rsp_cop2_drc::vcl()
23892332{
2390   int op = m_op;
2333   CACHE_VALUES();
23912334
23922335   for (int i = 0; i < 8; i++)
23932336   {
r241990r241991
24902433
24912434void rsp_cop2_drc::vch()
24922435{
2493   int op = m_op;
2436   CACHE_VALUES();
24942437
24952438   CLEAR_CARRY_FLAGS();
24962439   CLEAR_COMPARE_FLAGS();
r241990r241991
25772520
25782521void rsp_cop2_drc::vcr()
25792522{
2580   int op = m_op;
2523   CACHE_VALUES();
25812524
25822525   CLEAR_CARRY_FLAGS();
25832526   CLEAR_COMPARE_FLAGS();
r241990r241991
26462589
26472590void rsp_cop2_drc::vmrg()
26482591{
2649   int op = m_op;
2592   CACHE_VALUES();
26502593
26512594   for (int i = 0; i < 8; i++)
26522595   {
r241990r241991
26842627
26852628void rsp_cop2_drc::vand()
26862629{
2687   int op = m_op;
2630   CACHE_VALUES();
26882631
26892632   for (int i = 0; i < 8; i++)
26902633   {
r241990r241991
27142657
27152658void rsp_cop2_drc::vnand()
27162659{
2717   int op = m_op;
2660   CACHE_VALUES();
27182661
27192662   for (int i = 0; i < 8; i++)
27202663   {
r241990r241991
27442687
27452688void rsp_cop2_drc::vor()
27462689{
2747   int op = m_op;
2690   CACHE_VALUES();
27482691
27492692   for (int i = 0; i < 8; i++)
27502693   {
r241990r241991
27742717
27752718void rsp_cop2_drc::vnor()
27762719{
2777   int op = m_op;
2720   CACHE_VALUES();
27782721
27792722   for (int i = 0; i < 8; i++)
27802723   {
r241990r241991
28042747
28052748void rsp_cop2_drc::vxor()
28062749{
2807   int op = m_op;
2750   CACHE_VALUES();
28082751
28092752   for (int i = 0; i < 8; i++)
28102753   {
r241990r241991
28342777
28352778void rsp_cop2_drc::vnxor()
28362779{
2837   int op = m_op;
2780   CACHE_VALUES();
28382781
28392782   for (int i = 0; i < 8; i++)
28402783   {
r241990r241991
28642807
28652808void rsp_cop2_drc::vrcp()
28662809{
2867   int op = m_op;
2810   CACHE_VALUES();
28682811
28692812   INT32 shifter = 0;
2870   INT32 rec = (INT16)(VREG_S(VS2REG, EL & 7));
2813   INT32 rec = (INT16)(VREG_S(vs2reg, el & 7));
28712814   INT32 datainput = (rec < 0) ? (-rec) : rec;
28722815   if (datainput)
28732816   {
r241990r241991
29052848   m_reciprocal_res = rec;
29062849   m_dp_allowed = 0;
29072850
2908   W_VREG_S(VDREG, VS1REG & 7) = (UINT16)rec;
2851   W_VREG_S(vdreg, vs1reg & 7) = (UINT16)rec;
29092852   for (int i = 0; i < 8; i++)
29102853   {
2911      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
2854      SET_ACCUM_L(VREG_S(vs2reg, VEC_EL_2(el, i)), i);
29122855   }
29132856}
29142857
r241990r241991
29292872
29302873void rsp_cop2_drc::vrcpl()
29312874{
2932   int op = m_op;
2875   CACHE_VALUES();
29332876
29342877   INT32 shifter = 0;
2935   INT32 rec = (INT16)VREG_S(VS2REG, EL & 7);
2878   INT32 rec = (INT16)VREG_S(vs2reg, el & 7);
29362879   INT32 datainput = rec;
29372880
29382881   if (m_dp_allowed)
r241990r241991
29892932   m_reciprocal_res = rec;
29902933   m_dp_allowed = 0;
29912934
2992   W_VREG_S(VDREG, VS1REG & 7) = (UINT16)rec;
2935   W_VREG_S(vdreg, vs1reg & 7) = (UINT16)rec;
29932936
29942937   for (int i = 0; i < 8; i++)
29952938   {
2996      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
2939      SET_ACCUM_L(VREG_S(vs2reg, VEC_EL_2(el, i)), i);
29972940   }
29982941}
29992942
r241990r241991
30142957
30152958void rsp_cop2_drc::vrcph()
30162959{
3017   int op = m_op;
2960   CACHE_VALUES();
30182961
3019   m_reciprocal_high = (VREG_S(VS2REG, EL & 7)) << 16;
2962   m_reciprocal_high = (VREG_S(vs2reg, el & 7)) << 16;
30202963   m_dp_allowed = 1;
30212964
30222965   for (int i = 0; i < 8; i++)
30232966   {
3024      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
2967      SET_ACCUM_L(VREG_S(vs2reg, VEC_EL_2(el, i)), i);
30252968   }
30262969
3027   W_VREG_S(VDREG, VS1REG & 7) = (INT16)(m_reciprocal_res >> 16);
2970   W_VREG_S(vdreg, vs1reg & 7) = (INT16)(m_reciprocal_res >> 16);
30282971}
30292972
30302973static void cfunc_vrcph(void *param)
r241990r241991
30442987
30452988void rsp_cop2_drc::vmov()
30462989{
3047   int op = m_op;
2990   CACHE_VALUES();
30482991
3049   W_VREG_S(VDREG, VS1REG & 7) = VREG_S(VS2REG, EL & 7);
2992   W_VREG_S(vdreg, vs1reg & 7) = VREG_S(vs2reg, el & 7);
30502993   for (int i = 0; i < 8; i++)
30512994   {
3052      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
2995      SET_ACCUM_L(VREG_S(vs2reg, VEC_EL_2(el, i)), i);
30532996   }
30542997}
30552998
r241990r241991
30703013
30713014void rsp_cop2_drc::vrsq()
30723015{
3073   int op = m_op;
3016   CACHE_VALUES();
30743017
30753018   INT32 shifter = 0;
3076   INT32 rec = (INT16)VREG_S(VS2REG, EL & 7);
3019   INT32 rec = (INT16)VREG_S(vs2reg, el & 7);
30773020   INT32 datainput = (rec < 0) ? (-rec) : (rec);
30783021
30793022   if (rec < 0)
r241990r241991
31773120   }
31783121   rec = temp;
31793122
3180   W_VREG_S(VDREG, VS1REG & 7) = (UINT16)rec;
3123   W_VREG_S(vdreg, vs1reg & 7) = (UINT16)rec;
31813124   for (int i = 0; i < 8; i++)
31823125   {
3183      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
3126      SET_ACCUM_L(VREG_S(vs2reg, VEC_EL_2(el, i)), i);
31843127   }
31853128}
31863129
r241990r241991
32013144
32023145void rsp_cop2_drc::vrsql()
32033146{
3204   int op = m_op;
3147   CACHE_VALUES();
32053148
32063149   INT32 shifter = 0;
3207   INT32 rec = (INT16)VREG_S(VS2REG, EL & 7);
3150   INT32 rec = (INT16)VREG_S(vs2reg, el & 7);
32083151   INT32 datainput = rec;
32093152
32103153   if (m_dp_allowed)
r241990r241991
32633206   m_reciprocal_res = rec;
32643207   m_dp_allowed = 0;
32653208
3266   W_VREG_S(VDREG, VS1REG & 7) = (UINT16)(rec & 0xffff);
3209   W_VREG_S(vdreg, vs1reg & 7) = (UINT16)(rec & 0xffff);
32673210   for (int i = 0; i < 8; i++)
32683211   {
3269      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
3212      SET_ACCUM_L(VREG_S(vs2reg, VEC_EL_2(el, i)), i);
32703213   }
32713214}
32723215
r241990r241991
32873230
32883231void rsp_cop2_drc::vrsqh()
32893232{
3290   int op = m_op;
3233   CACHE_VALUES();
32913234
3292   m_reciprocal_high = (VREG_S(VS2REG, EL & 7)) << 16;
3235   m_reciprocal_high = (VREG_S(vs2reg, el & 7)) << 16;
32933236   m_dp_allowed = 1;
32943237
32953238   for (int i = 0; i < 8; i++)
32963239   {
3297      SET_ACCUM_L(VREG_S(VS2REG, VEC_EL_2(EL, i)), i);
3240      SET_ACCUM_L(VREG_S(vs2reg, VEC_EL_2(el, i)), i);
32983241   }
32993242
3300   W_VREG_S(VDREG, VS1REG & 7) = (INT16)(m_reciprocal_res >> 16);  // store high part
3243   W_VREG_S(vdreg, vs1reg & 7) = (INT16)(m_reciprocal_res >> 16);  // store high part
33013244}
33023245
33033246static void cfunc_vrsqh(void *param)


Previous 199869 Revisions Next


© 1997-2024 The MAME Team