diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/arm64_emitter.h | 4 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_0f.c | 8 | ||||
| -rw-r--r-- | src/emu/x64run0f.c | 7 |
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); |