Skip to content

Commit 565a061

Browse files
committed
[RV64_DYNAREC] Fixed stale YMM upper in scalar AVX upper access
1 parent a46ad9d commit 565a061

1 file changed

Lines changed: 31 additions & 13 deletions

File tree

‎src/dynarec/rv64/dynarec_rv64_helper.h‎

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -526,18 +526,30 @@
526526
gback = xEmu; \
527527
gdoffset = offsetof(x64emu_t, xmm[gd])
528528

529-
#define GETGY() \
530-
gd = ((nextop & 0x38) >> 3) + (rex.r << 3); \
531-
/* TODO: forget */ \
529+
#define GETGY() \
530+
gd = ((nextop & 0x38) >> 3) + (rex.r << 3); \
531+
if (dyn->e.ssecache[gd].v != -1 && dyn->e.ssecache[gd].vector) \
532+
avx_flush_upper_vector(dyn, ninst, x3, gd, dyn->e.ssecache[gd].reg, 0, 0); \
533+
if (dyn->e.ymm0 & (1 << gd)) { \
534+
SD(xZR, xEmu, offsetof(x64emu_t, ymm[gd]) + 0); \
535+
SD(xZR, xEmu, offsetof(x64emu_t, ymm[gd]) + 8); \
536+
sse_set_pending_zero(dyn, gd, 0); \
537+
} \
532538
gyoffset = offsetof(x64emu_t, ymm[gd])
533539

534540
#define GETVX() \
535541
sse_forget_reg(dyn, ninst, x3, vex.v); \
536542
vback = xEmu; \
537543
vxoffset = offsetof(x64emu_t, xmm[vex.v])
538544

539-
#define GETVY() \
540-
/* TODO: forget */ \
545+
#define GETVY() \
546+
if (dyn->e.ssecache[vex.v].v != -1 && dyn->e.ssecache[vex.v].vector) \
547+
avx_flush_upper_vector(dyn, ninst, x3, vex.v, dyn->e.ssecache[vex.v].reg, 0, 0); \
548+
if (dyn->e.ymm0 & (1 << vex.v)) { \
549+
SD(xZR, xEmu, offsetof(x64emu_t, ymm[vex.v]) + 0); \
550+
SD(xZR, xEmu, offsetof(x64emu_t, ymm[vex.v]) + 8); \
551+
sse_set_pending_zero(dyn, vex.v, 0); \
552+
} \
541553
vyoffset = offsetof(x64emu_t, ymm[vex.v]);
542554

543555
// Get Ex address in general register a, will purge SS or SD if it's reg and is loaded. May use x3. Use wback as load address!
@@ -554,14 +566,20 @@
554566
}
555567

556568

557-
#define GETEY() \
558-
if (MODREG) { \
559-
ed = (nextop & 7) + (rex.b << 3); \
560-
/* TODO: forget */ \
561-
wback = xEmu; \
562-
fixedaddress = offsetof(x64emu_t, ymm[ed]); \
563-
} else { \
564-
fixedaddress += 16; \
569+
#define GETEY() \
570+
if (MODREG) { \
571+
ed = (nextop & 7) + (rex.b << 3); \
572+
if (dyn->e.ssecache[ed].v != -1 && dyn->e.ssecache[ed].vector) \
573+
avx_flush_upper_vector(dyn, ninst, x3, ed, dyn->e.ssecache[ed].reg, 0, 0); \
574+
if (dyn->e.ymm0 & (1 << ed)) { \
575+
SD(xZR, xEmu, offsetof(x64emu_t, ymm[ed]) + 0); \
576+
SD(xZR, xEmu, offsetof(x64emu_t, ymm[ed]) + 8); \
577+
sse_set_pending_zero(dyn, ed, 0); \
578+
} \
579+
wback = xEmu; \
580+
fixedaddress = offsetof(x64emu_t, ymm[ed]); \
581+
} else { \
582+
fixedaddress += 16; \
565583
}
566584

567585

0 commit comments

Comments
 (0)