about summary refs log tree commit diff stats
path: root/src
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
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')
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_660f.c51
-rw-r--r--src/emu/x64run660f.c25
2 files changed, 66 insertions, 10 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c
index 6d6e26e6..73669980 100755
--- a/src/dynarec/arm64/dynarec_arm64_660f.c
+++ b/src/dynarec/arm64/dynarec_arm64_660f.c
@@ -730,16 +730,57 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                     }

                     break;

 

+                case 0x14:

+                    INST_NAME("PEXTRB Ed, Gx, Ib");

+                    nextop = F8;

+                    GETGX(q0, 0);

+                    if(MODREG) {

+                        ed = xRAX+(nextop&7)+(rex.b<<3);

+                        u8 = F8;

+                        VMOVBto(ed, q0, (u8&15));

+                    } else {

+                        addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1);

+                        u8 = F8;

+                        VST1_8(q0, (u8&15), wback);

+                        SMWRITE2();

+                    }

+                    break;

+                case 0x15:

+                    INST_NAME("PEXTRW Ed, Gx, Ib");

+                    nextop = F8;

+                    GETGX(q0, 0);

+                    if(MODREG) {

+                        ed = xRAX+(nextop&7)+(rex.b<<3);

+                        u8 = F8;

+                        VMOVHto(ed, q0, (u8&7));

+                    } else {

+                        addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1);

+                        u8 = F8;

+                        VST1_16(q0, (u8&7), wback);

+                        SMWRITE2();

+                    }

+                    break;

                 case 0x16:

                     if(rex.w) {INST_NAME("PEXTRQ Ed, Gx, Ib");} else {INST_NAME("PEXTRD Ed, Gx, Ib");}

                     nextop = F8;

                     GETGX(q0, 0);

-                    GETED(1);

-                    u8 = F8;

-                    if(rex.w) {

-                        VMOVQDto(ed, q0, (u8&1));

+                    if(MODREG) {

+                        ed = xRAX+(nextop&7)+(rex.b<<3);

+                        u8 = F8;

+                        if(rex.w) {

+                            VMOVQDto(ed, q0, (u8&1));

+                        } else {

+                            VMOVSto(ed, q0, (u8&3));

+                        }

                     } else {

-                        VMOVSto(ed, q0, (u8&3));

+                        addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1);

+                        u8 = F8;

+                        if(rex.w) {

+                            VST1_64(q0, (u8&1), wback);

+                        } else {

+                            VST1_32(q0, (u8&3), wback);

+                        }

+                        SMWRITE2();

                     }

                     break;

 

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