[DYNAREC] Fixed a special case of SHLD/SHRD opcodes (#3047)

This commit is contained in:
Yang Liu
2025-10-10 17:39:02 +08:00
committed by GitHub
parent 6250f03b09
commit f0eab197be
6 changed files with 24 additions and 9 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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