mirror of
https://github.com/ptitSeb/box64.git
synced 2025-10-14 02:38:54 +08:00
[DYNAREC] Fixed a special case of SHLD/SHRD opcodes (#3047)
This commit is contained in:
@@ -1799,6 +1799,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
|
||||
WBACK;
|
||||
} else {
|
||||
FAKEED;
|
||||
if (!rex.w && !rex.is32bits && MODREG) { MOVw_REG(ed, ed); }
|
||||
F8;
|
||||
}
|
||||
break;
|
||||
@@ -1886,6 +1887,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
|
||||
WBACK;
|
||||
} else {
|
||||
FAKEED;
|
||||
if (!rex.w && !rex.is32bits && MODREG) { MOVw_REG(ed, ed); }
|
||||
F8;
|
||||
}
|
||||
break;
|
||||
|
@@ -219,9 +219,12 @@
|
||||
wb = ed = x1; \
|
||||
}
|
||||
//FAKEELike GETED, but doesn't get anything
|
||||
#define FAKEED \
|
||||
if (!MODREG) { \
|
||||
addr = fakeed(dyn, addr, ninst, nextop); \
|
||||
#define FAKEED \
|
||||
if (MODREG) { \
|
||||
ed = TO_NAT((nextop & 7) + (rex.b << 3)); \
|
||||
wback = 0; \
|
||||
} else { \
|
||||
addr = fakeed(dyn, addr, ninst, nextop); \
|
||||
}
|
||||
|
||||
// GETGW extract x64 register in gd, that is i
|
||||
|
@@ -1413,6 +1413,7 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
|
||||
WBACK;
|
||||
} else {
|
||||
FAKEED;
|
||||
if (!rex.w && !rex.is32bits && MODREG) { ZEROUP(ed); }
|
||||
F8;
|
||||
}
|
||||
break;
|
||||
@@ -1466,6 +1467,7 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
|
||||
WBACK;
|
||||
} else {
|
||||
FAKEED;
|
||||
if (!rex.w && !rex.is32bits && MODREG) { ZEROUP(ed); }
|
||||
F8;
|
||||
}
|
||||
break;
|
||||
|
@@ -168,9 +168,12 @@
|
||||
}
|
||||
|
||||
// FAKEED like GETED, but doesn't get anything
|
||||
#define FAKEED \
|
||||
if (!MODREG) { \
|
||||
addr = fakeed(dyn, addr, ninst, nextop); \
|
||||
#define FAKEED \
|
||||
if (MODREG) { \
|
||||
ed = TO_NAT((nextop & 7) + (rex.b << 3)); \
|
||||
wback = 0; \
|
||||
} else { \
|
||||
addr = fakeed(dyn, addr, ninst, nextop); \
|
||||
}
|
||||
|
||||
// GETGW extract x64 register in gd, that is i, Signed extented
|
||||
|
@@ -1884,6 +1884,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
|
||||
WBACK;
|
||||
} else {
|
||||
FAKEED;
|
||||
if (!rex.w && !rex.is32bits && MODREG) { ZEROUP(ed); }
|
||||
F8;
|
||||
}
|
||||
break;
|
||||
@@ -1946,6 +1947,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
|
||||
WBACK;
|
||||
} else {
|
||||
FAKEED;
|
||||
if (!rex.w && !rex.is32bits && MODREG) { ZEROUP(ed); }
|
||||
F8;
|
||||
}
|
||||
break;
|
||||
|
@@ -210,9 +210,12 @@
|
||||
}
|
||||
|
||||
// FAKEED like GETED, but doesn't get anything
|
||||
#define FAKEED \
|
||||
if (!MODREG) { \
|
||||
addr = fakeed(dyn, addr, ninst, nextop); \
|
||||
#define FAKEED \
|
||||
if (MODREG) { \
|
||||
ed = TO_NAT((nextop & 7) + (rex.b << 3)); \
|
||||
wback = 0; \
|
||||
} else { \
|
||||
addr = fakeed(dyn, addr, ninst, nextop); \
|
||||
}
|
||||
|
||||
// GETGW extract x64 register in gd, that is i, Signed extented
|
||||
|
Reference in New Issue
Block a user