diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-07-02 15:41:10 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-07-02 15:41:10 +0200 |
| commit | a6f132f6dab7965d9e19db78ed20b3e0ca045521 (patch) | |
| tree | c25dbc7b4bd7785eaef0cdfded6e22e693128ad8 /src | |
| parent | cb75b670b6353724982212d74a894f014c927667 (diff) | |
| download | box64-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.c | 33 | ||||
| -rw-r--r-- | src/emu/x64run64.c | 10 |
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; } |