Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/dynarec/arm64/dynarec_arm64_660f.c
Original file line number Diff line number Diff line change
Expand Up @@ -1324,6 +1324,8 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
ed = (nextop&7)+(rex.b<<3);
if(ed>7)
sse_reflect_reg(dyn, ninst, ed);
else
sse_mark_used(dyn, ninst, ed);
ADDx_U12(x1, xEmu, offsetof(x64emu_t, xmm[ed]));
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1);
Expand Down Expand Up @@ -1496,11 +1498,15 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
SETFLAGS(X_ALL, SF_SET_DF);
if(gd>7) // no need to reflect cache as xmm0-xmm7 will be saved before the function call anyway
sse_reflect_reg(dyn, ninst, gd);
else
sse_mark_used(dyn, ninst, gd);
ADDx_U12(x3, xEmu, offsetof(x64emu_t, xmm[gd]));
if(MODREG) {
ed = (nextop&7)+(rex.b<<3);
if(ed>7)
sse_reflect_reg(dyn, ninst, ed);
else
sse_mark_used(dyn, ninst, ed);
ADDx_U12(x1, xEmu, offsetof(x64emu_t, xmm[ed]));
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1);
Expand Down Expand Up @@ -1540,6 +1546,8 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
ed = (nextop&7)+(rex.b<<3);
if(ed>7)
sse_reflect_reg(dyn, ninst, ed);
else
sse_mark_used(dyn, ninst, ed);
ADDx_U12(x1, xEmu, offsetof(x64emu_t, xmm[ed]));
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1);
Expand Down Expand Up @@ -1589,11 +1597,15 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
GETG;
if(gd>7)
sse_reflect_reg(dyn, ninst, gd);
else
sse_mark_used(dyn, ninst, gd);
ADDx_U12(x2, xEmu, offsetof(x64emu_t, xmm[gd]));
if(MODREG) {
ed = (nextop&7)+(rex.b<<3);
if(ed>7)
sse_reflect_reg(dyn, ninst, ed);
else
sse_mark_used(dyn, ninst, ed);
ADDx_U12(x1, xEmu, offsetof(x64emu_t, xmm[ed]));
} else {
addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1);
Expand Down
5 changes: 5 additions & 0 deletions src/dynarec/arm64/dynarec_arm64_functions.c
Original file line number Diff line number Diff line change
Expand Up @@ -1514,6 +1514,11 @@ void updateYmm0s(dynarec_arm_t* dyn, int ninst, int max_ninst_reached)
}


void sse_mark_used(dynarec_arm_t* dyn, int ninst, int a)
{
dyn->n.xmm_used |= 1<<a;
}

// AVX helpers
void avx_mark_zero(dynarec_arm_t* dyn, int ninst, int reg)
{
Expand Down
3 changes: 3 additions & 0 deletions src/dynarec/arm64/dynarec_arm64_functions.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,9 @@ void updateYmm0s(dynarec_arm_t* dyn, int ninst, int max_ninst_reached);
// add a preload of SSE/AVX register preload before i2, for a jump in ninst. Might not do it if there is jump in between that goes outside this ninst-i2 interval
void addSSEPreload(dynarec_arm_t* dyn, int ninst, int i2, uint32_t preload);

// mark a SSE reg as read by the current opcode, without touching its cache entry
void sse_mark_used(dynarec_arm_t* dyn, int ninst, int a);

// AVX helpers
void avx_mark_zero(dynarec_arm_t* dyn, int ninst, int reg);
int is_avx_zero(dynarec_arm_t* dyn, int ninst, int reg);
Expand Down
Loading