about summary refs log tree commit diff stats
path: root/src/emu
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-03-23 12:34:37 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-03-23 13:35:21 +0100
commit2accb00adc4a6d0c87737d7ca0c3b3fb9f661825 (patch)
treebd08b0bb846b4735a78f5cf0040a0573a7714d14 /src/emu
parent65c672fa1c70e62562a219cc2e0e53bba67ba627 (diff)
downloadbox64-2accb00adc4a6d0c87737d7ca0c3b3fb9f661825.tar.gz
box64-2accb00adc4a6d0c87737d7ca0c3b3fb9f661825.zip
Added/Fixed 66 0F 3A 14/15/16 opcodes ([ARM64_DYNAREC] too)
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/x64run660f.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c
index 8bed5cbf..e06c3fb5 100644
--- a/src/emu/x64run660f.c
+++ b/src/emu/x64run660f.c
@@ -767,14 +767,26 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr)
                 }

                 break;

 

-            case 0x14:      // PEXTRB EB, GX, u8

+            case 0x14:      // PEXTRB ED, GX, u8

                 nextop = F8;

-                GETEB(1);

+                GETED(1);

                 GETGX;

                 tmp8u = F8;

-                EB->byte[0] = GX->ub[tmp8u&0x0f];

+                if(MODREG)

+                    ED->q[0] = GX->ub[tmp8u&0x0f];

+                else

+                    ED->byte[0] = GX->ub[tmp8u&0x0f];

+                break;

+            case 0x15:      // PEXTRW Ew,Gx,Ib

+                nextop = F8;

+                GETED(1);

+                GETGX;

+                tmp8u = F8;

+                if(MODREG)

+                    ED->q[0] = GX->uw[tmp8u&7];  // 16bits extract, 0 extended

+                else

+                    ED->word[0] = GX->uw[tmp8u&7];

                 break;

-

             case 0x16:      // PEXTRD/Q ED, GX, u8

                 nextop = F8;

                 GETED(1);

@@ -783,7 +795,10 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr)
                 if(rex.w) {

                     ED->q[0] = GX->q[tmp8u&1];

                 } else {

-                    ED->q[0] = GX->ud[tmp8u&3];

+                    if(MODREG)

+                        ED->q[0] = GX->ud[tmp8u&3];

+                    else

+                        ED->dword[0] = GX->ud[tmp8u&3];

                 }

                 break;

             case 0x17:      // EXTRACTPS ED, GX, u8