Previous 199869 Revisions Next

r34601 Sunday 25th January, 2015 at 21:07:51 UTC by Samuele Zannoli
i386: sse opcodes improvements [Samuele Zannoli]
- add opcodes MOVHLPS MOVLHPS
- safer implementation of PACKUSWB PACKSSDW SHUFPS UNPCKLPS UNPCKHPS

The safer implementation is needed in cases where the source and destination registers are the same.
[src/emu/cpu/i386]pentops.inc

trunk/src/emu/cpu/i386/pentops.inc
r243112r243113
22492249   MMXPROLOG();
22502250   UINT8 modrm = FETCH();
22512251   if( modrm >= 0xc0 ) {
2252      MMX_REG ds, sd;
22522253      int s,d;
22532254      s=modrm & 0x7;
22542255      d=(modrm >> 3) & 0x7;
2255      MMX(d).b[0]=SaturatedSignedWordToUnsignedByte(MMX(d).s[0]);
2256      MMX(d).b[1]=SaturatedSignedWordToUnsignedByte(MMX(d).s[1]);
2257      MMX(d).b[2]=SaturatedSignedWordToUnsignedByte(MMX(d).s[2]);
2258      MMX(d).b[3]=SaturatedSignedWordToUnsignedByte(MMX(d).s[3]);
2259      MMX(d).b[4]=SaturatedSignedWordToUnsignedByte(MMX(s).s[0]);
2260      MMX(d).b[5]=SaturatedSignedWordToUnsignedByte(MMX(s).s[1]);
2261      MMX(d).b[6]=SaturatedSignedWordToUnsignedByte(MMX(s).s[2]);
2262      MMX(d).b[7]=SaturatedSignedWordToUnsignedByte(MMX(s).s[3]);
2256      ds.q = MMX(d).q;
2257      sd.q = MMX(s).q;
2258      MMX(d).b[0]=SaturatedSignedWordToUnsignedByte(ds.s[0]);
2259      MMX(d).b[1]=SaturatedSignedWordToUnsignedByte(ds.s[1]);
2260      MMX(d).b[2]=SaturatedSignedWordToUnsignedByte(ds.s[2]);
2261      MMX(d).b[3]=SaturatedSignedWordToUnsignedByte(ds.s[3]);
2262      MMX(d).b[4]=SaturatedSignedWordToUnsignedByte(sd.s[0]);
2263      MMX(d).b[5]=SaturatedSignedWordToUnsignedByte(sd.s[1]);
2264      MMX(d).b[6]=SaturatedSignedWordToUnsignedByte(sd.s[2]);
2265      MMX(d).b[7]=SaturatedSignedWordToUnsignedByte(sd.s[3]);
22632266   } else {
2264      MMX_REG s;
2267      MMX_REG s,t;
22652268      int d=(modrm >> 3) & 0x7;
22662269      UINT32 ea = GetEA(modrm, 0);
22672270      READMMX(ea, s);
2268      MMX(d).b[0]=SaturatedSignedWordToUnsignedByte(MMX(d).s[0]);
2269      MMX(d).b[1]=SaturatedSignedWordToUnsignedByte(MMX(d).s[1]);
2270      MMX(d).b[2]=SaturatedSignedWordToUnsignedByte(MMX(d).s[2]);
2271      MMX(d).b[3]=SaturatedSignedWordToUnsignedByte(MMX(d).s[3]);
2271      t.q = MMX(d).q;
2272      MMX(d).b[0]=SaturatedSignedWordToUnsignedByte(t.s[0]);
2273      MMX(d).b[1]=SaturatedSignedWordToUnsignedByte(t.s[1]);
2274      MMX(d).b[2]=SaturatedSignedWordToUnsignedByte(t.s[2]);
2275      MMX(d).b[3]=SaturatedSignedWordToUnsignedByte(t.s[3]);
22722276      MMX(d).b[4]=SaturatedSignedWordToUnsignedByte(s.s[0]);
22732277      MMX(d).b[5]=SaturatedSignedWordToUnsignedByte(s.s[1]);
22742278      MMX(d).b[6]=SaturatedSignedWordToUnsignedByte(s.s[2]);
r243112r243113
23622366   UINT8 modrm = FETCH();
23632367   if( modrm >= 0xc0 ) {
23642368      int s,d;
2369      INT32 t1, t2, t3, t4;
23652370      s=modrm & 0x7;
23662371      d=(modrm >> 3) & 0x7;
2367      MMX(d).s[0]=SaturatedSignedDwordToSignedWord(MMX(d).i[0]);
2368      MMX(d).s[1]=SaturatedSignedDwordToSignedWord(MMX(d).i[1]);
2369      MMX(d).s[2]=SaturatedSignedDwordToSignedWord(MMX(s).i[0]);
2370      MMX(d).s[3]=SaturatedSignedDwordToSignedWord(MMX(s).i[1]);
2371   } else {
2372      t1 = MMX(d).i[0];
2373      t2 = MMX(d).i[1];
2374      t3 = MMX(s).i[0];
2375      t4 = MMX(s).i[1];
2376      MMX(d).s[0] = SaturatedSignedDwordToSignedWord(t1);
2377      MMX(d).s[1] = SaturatedSignedDwordToSignedWord(t2);
2378      MMX(d).s[2] = SaturatedSignedDwordToSignedWord(t3);
2379      MMX(d).s[3] = SaturatedSignedDwordToSignedWord(t4);
2380   }
2381   else {
23722382      MMX_REG s;
2383      INT32 t1, t2;
23732384      int d=(modrm >> 3) & 0x7;
23742385      UINT32 ea = GetEA(modrm, 0);
23752386      READMMX(ea, s);
2376      MMX(d).s[0]=SaturatedSignedDwordToSignedWord(MMX(d).i[0]);
2377      MMX(d).s[1]=SaturatedSignedDwordToSignedWord(MMX(d).i[1]);
2378      MMX(d).s[2]=SaturatedSignedDwordToSignedWord(s.i[0]);
2379      MMX(d).s[3]=SaturatedSignedDwordToSignedWord(s.i[1]);
2387      t1 = MMX(d).i[0];
2388      t2 = MMX(d).i[1];
2389      MMX(d).s[0] = SaturatedSignedDwordToSignedWord(t1);
2390      MMX(d).s[1] = SaturatedSignedDwordToSignedWord(t2);
2391      MMX(d).s[2] = SaturatedSignedDwordToSignedWord(s.i[0]);
2392      MMX(d).s[3] = SaturatedSignedDwordToSignedWord(s.i[1]);
23802393   }
23812394   CYCLES(1);     // TODO: correct cycle count
23822395}
r243112r243113
27112724{
27122725   UINT8 modrm = FETCH();
27132726   if( modrm >= 0xc0 ) {
2714      // unsupported by cpu
2727      // MOVHLPS opcode
2728      XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[1];
27152729      CYCLES(1);     // TODO: correct cycle count
27162730   } else {
2731      // MOVLPS opcode
27172732      UINT32 ea = GetEA(modrm, 0);
27182733      READXMM_LO64(ea, XMM((modrm >> 3) & 0x7));
27192734      CYCLES(1);     // TODO: correct cycle count
r243112r243113
27372752{
27382753   UINT8 modrm = FETCH();
27392754   if( modrm >= 0xc0 ) {
2740      // unsupported by cpu
2755      // MOVLHPS opcode
2756      XMM((modrm >> 3) & 0x7).q[1] = XMM(modrm & 0x7).q[0];
27412757      CYCLES(1);     // TODO: correct cycle count
27422758   } else {
2759      // MOVHPS opcode
27432760      UINT32 ea = GetEA(modrm, 0);
27442761      READXMM_HI64(ea, XMM((modrm >> 3) & 0x7));
27452762      CYCLES(1);     // TODO: correct cycle count
r243112r243113
33673384   CYCLES(1);     // TODO: correct cycle count
33683385}
33693386
3370void i386_device::sse_shufps() // Opcode 0f 67
3387void i386_device::sse_shufps() // Opcode 0f c6
33713388{
33723389   UINT8 modrm = FETCH();
33733390   UINT8 sel = FETCH();
r243112r243113
33803397   s=modrm & 0x7;
33813398   d=(modrm >> 3) & 0x7;
33823399   if( modrm >= 0xc0 ) {
3383      UINT32 t;
3384      t=XMM(d).d[m1];
3385      XMM(d).d[1]=XMM(d).d[m2];
3386      XMM(d).d[0]=t;
3387      XMM(d).d[2]=XMM(s).d[m3];
3388      XMM(d).d[3]=XMM(s).d[m4];
3400      UINT32 t1,t2,t3,t4;
3401      t1=XMM(d).d[m1];
3402      t2=XMM(d).d[m2];
3403      t3=XMM(s).d[m3];
3404      t4=XMM(s).d[m4];
3405      XMM(d).d[0]=t1;
3406      XMM(d).d[1]=t2;
3407      XMM(d).d[2]=t3;
3408      XMM(d).d[3]=t4;
33893409   } else {
3390      UINT32 t;
3410      UINT32 t1,t2;
33913411      XMM_REG src;
33923412      UINT32 ea = GetEA(modrm, 0);
33933413      READXMM(ea, src);
3394      t=XMM(d).d[m1];
3395      XMM(d).d[1]=XMM(d).d[m2];
3396      XMM(d).d[0]=t;
3414      t1=XMM(d).d[m1];
3415      t2=XMM(d).d[m2];
3416      XMM(d).d[0]=t1;
3417      XMM(d).d[1]=t2;
33973418      XMM(d).d[2]=src.d[m3];
33983419      XMM(d).d[3]=src.d[m4];
33993420   }
r243112r243113
34043425{
34053426   UINT8 modrm = FETCH();
34063427   int s,d;
3428   UINT32 t1, t2, t3, t4;
34073429   s=modrm & 0x7;
34083430   d=(modrm >> 3) & 0x7;
34093431   if( modrm >= 0xc0 ) {
3410      XMM(d).d[3]=XMM(s).d[1];
3411      XMM(d).d[2]=XMM(d).d[1];
3412      XMM(d).d[1]=XMM(s).d[0];
3413      //XMM(d).d[0]=XMM(d).d[0];
3432      t1 = XMM(s).d[1];
3433      t2 = XMM(d).d[1];
3434      t3 = XMM(s).d[0];
3435      t4 = XMM(d).d[0];
3436      XMM(d).d[3]=t1;
3437      XMM(d).d[2]=t2;
3438      XMM(d).d[1]=t3;
3439      XMM(d).d[0]=t4;
34143440   } else {
34153441      XMM_REG src;
34163442      UINT32 ea = GetEA(modrm, 0);
34173443      READXMM(ea, src);
3444      t2 = XMM(d).d[1];
34183445      XMM(d).d[3]=src.d[1];
3419      XMM(d).d[2]=XMM(d).d[1];
3446      XMM(d).d[2]=t2;
34203447      XMM(d).d[1]=src.d[0];
34213448   }
34223449   CYCLES(1);     // TODO: correct cycle count
r243112r243113
34263453{
34273454   UINT8 modrm = FETCH();
34283455   int s,d;
3456   UINT32 t1, t2, t3, t4;
34293457   s=modrm & 0x7;
34303458   d=(modrm >> 3) & 0x7;
34313459   if( modrm >= 0xc0 ) {
3432      XMM(d).d[0]=XMM(d).d[2];
3433      XMM(d).d[1]=XMM(s).d[2];
3434      XMM(d).d[2]=XMM(d).d[3];
3435      XMM(d).d[3]=XMM(s).d[3];
3460      t1 = XMM(d).d[2];
3461      t2 = XMM(s).d[2];
3462      t3 = XMM(d).d[3];
3463      t4 = XMM(s).d[3];
3464      XMM(d).d[0]=t1;
3465      XMM(d).d[1]=t2;
3466      XMM(d).d[2]=t3;
3467      XMM(d).d[3]=t4;
34363468   } else {
34373469      XMM_REG src;
34383470      UINT32 ea = GetEA(modrm, 0);
34393471      READXMM(ea, src);
3440      XMM(d).d[0]=XMM(d).d[2];
3472      t1 = XMM(d).d[2];
3473      t3 = XMM(d).d[3];
3474      XMM(d).d[0]=t1;
34413475      XMM(d).d[1]=src.d[2];
3442      XMM(d).d[2]=XMM(d).d[3];
3476      XMM(d).d[2]=t3;
34433477      XMM(d).d[3]=src.d[3];
34443478   }
34453479   CYCLES(1);     // TODO: correct cycle count


Previous 199869 Revisions Next


© 1997-2024 The MAME Team