about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64/arm64_emitter.h4
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_0f.c8
-rw-r--r--src/emu/x64run0f.c7
3 files changed, 17 insertions, 2 deletions
diff --git a/src/dynarec/arm64/arm64_emitter.h b/src/dynarec/arm64/arm64_emitter.h
index 3b9b6049..7ebc0208 100755
--- a/src/dynarec/arm64/arm64_emitter.h
+++ b/src/dynarec/arm64/arm64_emitter.h
@@ -953,6 +953,10 @@
 #define VSUB_16(Vd, Vn, Vm)                 EMIT(ADDSUB_vector(0, 1, 0b01, Vm, Vn, Vd))
 #define VSUB_32(Vd, Vn, Vm)                 EMIT(ADDSUB_vector(0, 1, 0b10, Vm, Vn, Vd))
 
+#define ADDSUB_scalar(U, size, Rm, Rn, Rd)  (01<<30 | (U)<<29 | 0b11110<<24 | (size)<<22 | 1<<21 | (Rm)<<16 | 0b10000<<11 | 1<<10 | (Rn)<<5 | (Rd))
+#define ADD_64(Vd, Vn, Vm)                  EMIT(ADDSUB_scalar(0, 0b11, Vm, Vn, Vd))
+#define SUB_64(Vd, Vn, Vm)                  EMIT(ADDSUB_scalar(1, 0b11, Vm, Vn, Vd))
+
 #define NEGABS_vector(Q, U, size, Rn, Rd)   ((Q)<<30 | (U)<<29 | 0b01110<<24 | (size)<<22 | 0b10000<<17 | 0b01011<<12 | 0b10<<10 | (Rn)<<5 | (Rd))
 #define NEG_8(Vd, Vn)                       EMIT(NEGABS_vector(0, 1, 0b00, Vn, Vd))
 #define NEG_16(Vd, Vn)                      EMIT(NEGABS_vector(0, 1, 0b01, Vn, Vd))
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 2ea4161c..19293786 100755
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -1714,7 +1714,13 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             NEG_64(q0, d1);

             USHL_R_64(d0, d0, q0);

             break;

-

+        case 0xD4:

+            INST_NAME("PADDQ Gm,Em");

+            nextop = F8;

+            GETGM(v0);

+            GETEM(q0, 0);

+            ADD_64(v0, v0, q0);

+            break;

         case 0xD5:

             INST_NAME("PMULLW Gm, Em");

             nextop = F8;

diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index b8e51267..ffa4a471 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -1438,7 +1438,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
             GETGM;

             GM->q = (EM->q > 63) ? 0L : (GM->q >> EM->q);

             break;

-

+        case 0xD4:                   /* PADDQ Gm,Em */

+            nextop = F8;

+            GETEM(0);

+            GETGM;

+            GM->sq += EM->sq;

+            break;

         case 0xD5:                   /* PMULLW Gm,Em */

             nextop = F8;

             GETEM(0);