about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-07-02 15:41:10 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-07-02 15:41:10 +0200
commita6f132f6dab7965d9e19db78ed20b3e0ca045521 (patch)
treec25dbc7b4bd7785eaef0cdfded6e22e693128ad8 /src
parentcb75b670b6353724982212d74a894f014c927667 (diff)
downloadbox64-a6f132f6dab7965d9e19db78ed20b3e0ca045521.tar.gz
box64-a6f132f6dab7965d9e19db78ed20b3e0ca045521.zip
Added 64 0F AF opcode ([DYNAREC] Too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/dynarec_arm64_64.c33
-rw-r--r--src/emu/x64run64.c10
2 files changed, 43 insertions, 0 deletions
diff --git a/src/dynarec/dynarec_arm64_64.c b/src/dynarec/dynarec_arm64_64.c
index 2fab3ee3..e735784d 100644
--- a/src/dynarec/dynarec_arm64_64.c
+++ b/src/dynarec/dynarec_arm64_64.c
@@ -151,6 +151,39 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                     }
                     break;
 
+                case 0xAF:
+                    INST_NAME("IMUL Gd, Ed");
+                    SETFLAGS(X_ALL, SF_PENDING);
+                    nextop = F8;
+                    grab_segdata(dyn, addr, ninst, x4, seg);
+                    GETGD;
+                    GETEDO(x4, 0);
+                    if(rex.w) {
+                        // 64bits imul
+                        UFLAG_IF {
+                            SMULH(x3, gd, ed);
+                            MULx(gd, gd, ed);
+                            UFLAG_OP1(x3);
+                            UFLAG_RES(gd);
+                            UFLAG_DF(x3, d_imul64);
+                        } else {
+                            MULxw(gd, gd, ed);
+                        }
+                    } else {
+                        // 32bits imul
+                        UFLAG_IF {
+                            SMULL(gd, gd, ed);
+                            UFLAG_RES(gd);
+                            LSRx(x3, gd, 32);
+                            UFLAG_OP1(x3);
+                            UFLAG_DF(x3, d_imul32);
+                            MOVw_REG(gd, gd);
+                        } else {
+                            MULxw(gd, gd, ed);
+                        }
+                    }
+                    break;
+
                 default:
                     DEFAULT;
             }
diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c
index c7f2fbec..63b95199 100644
--- a/src/emu/x64run64.c
+++ b/src/emu/x64run64.c
@@ -181,6 +181,16 @@ int Run64(x64emu_t *emu, rex_t rex, int seg)
                     }

                     break;

 

+                case 0xAF:                      /* IMUL Gd,Ed */

+                    nextop = F8;

+                    GETED_OFFS(0, tlsdata);

+                    GETGD;

+                    if(rex.w)

+                        GD->q[0] = imul64(emu, GD->q[0], ED->q[0]);

+                    else

+                        GD->q[0] = imul32(emu, GD->dword[0], ED->dword[0]);

+                    break;

+

                 default:

                     return 1;

             }