about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-30 21:27:17 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-03-30 21:27:17 +0200
commit0c4eed79daf33006f61b6fb223ae32728375f018 (patch)
treee1f756e0c39ed8027cf8c9cd3443002a999dc9b5 /src
parent8bbd9abd27947d9dfcf7abdd24470b611ca93148 (diff)
downloadbox64-0c4eed79daf33006f61b6fb223ae32728375f018.tar.gz
box64-0c4eed79daf33006f61b6fb223ae32728375f018.zip
Added 0F 71/72/73 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64run0f.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index 048e1a40..41672c6b 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -475,6 +475,80 @@ int Run0F(x64emu_t *emu, rex_t rex)
             GM->q = EM->q;

             break;

 

+        case 0x71:  /* GRP */

+            nextop = F8;

+            GETEM(1);

+            switch((nextop>>3)&7) {

+                case 2:                 /* PSRLW Em, Ib */

+                    tmp8u = F8;

+                    if(tmp8u>15)

+                        {EM->q = 0;}

+                    else

+                        for (int i=0; i<4; ++i) EM->uw[i] >>= tmp8u;

+                    break;

+                case 4:                 /* PSRAW Em, Ib */

+                    tmp8u = F8;

+                    for (int i=0; i<4; ++i) EM->sw[i] >>= tmp8u;

+                    break;

+                case 6:                 /* PSLLW Em, Ib */

+                    tmp8u = F8;

+                    if(tmp8u>15)

+                        {EM->q = 0;}

+                    else

+                        for (int i=0; i<4; ++i) EM->uw[i] <<= tmp8u;

+                    break;

+                default:

+                    return 1;

+            }

+            break;

+        case 0x72:  /* GRP */

+            nextop = F8;

+            GETEM(1);

+            switch((nextop>>3)&7) {

+                case 2:                 /* PSRLD Em, Ib */

+                    tmp8u = F8;

+                    if(tmp8u>31)

+                        {EM->q = 0;}

+                    else

+                        for (int i=0; i<2; ++i) EM->ud[i] >>= tmp8u;

+                    break;

+                case 4:                 /* PSRAD Em, Ib */

+                    tmp8u = F8;

+                    for (int i=0; i<2; ++i) EM->sd[i] >>= tmp8u;

+                    break;

+                case 6:                 /* PSLLD Em, Ib */

+                    tmp8u = F8;

+                    if(tmp8u>31)

+                        {EM->q = 0;}

+                    else

+                        for (int i=0; i<2; ++i) EM->ud[i] <<= tmp8u;

+                    break;

+                default:

+                    return 1;

+            }

+            break;

+        case 0x73:  /* GRP */

+            nextop = F8;

+            GETEM(1);

+            switch((nextop>>3)&7) {

+                case 2:                 /* PSRLQ Em, Ib */

+                    tmp8u = F8;

+                    if(tmp8u>63)

+                        {EM->q = 0;}

+                    else

+                        {EM->q >>= tmp8u;}

+                    break;

+                case 6:                 /* PSLLQ Em, Ib */

+                    tmp8u = F8;

+                    if(tmp8u>63)

+                        {EM->q = 0;}

+                    else

+                        {EM->q <<= tmp8u;}

+                    break;

+                default:

+                    return 1;

+            }

+            break;

         case 0x74:                       /* PCMPEQB Gm,Em */

             nextop = F8;

             GETEM(0);