Skip to content

Commit

Permalink
samplerjit: Fix some Linux register issues.
Browse files Browse the repository at this point in the history
  • Loading branch information
unknownbrackets committed Jan 22, 2022
1 parent 85d868a commit 212e730
Showing 1 changed file with 15 additions and 3 deletions.
18 changes: 15 additions & 3 deletions GPU/Software/SamplerX86.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ FetchFunc SamplerJitCache::CompileFetch(const SamplerID &id) {
RegCache::GEN_ARG_ID,
});
regCache_.ChangeReg(RAX, RegCache::GEN_RESULT);
regCache_.ForceRetain(RegCache::GEN_RESULT);
regCache_.ChangeReg(XMM0, RegCache::VEC_RESULT);

BeginWrite();
Expand Down Expand Up @@ -81,11 +82,17 @@ FetchFunc SamplerJitCache::CompileFetch(const SamplerID &id) {
return nullptr;
}

if (regCache_.Has(RegCache::GEN_ARG_LEVEL))
regCache_.ForceRelease(RegCache::GEN_ARG_LEVEL);
if (regCache_.Has(RegCache::GEN_ARG_ID))
regCache_.ForceRelease(RegCache::GEN_ARG_ID);

X64Reg vecResultReg = regCache_.Find(RegCache::VEC_RESULT);

X64Reg resultReg = regCache_.Find(RegCache::GEN_RESULT);
MOVD_xmm(vecResultReg, R(resultReg));
regCache_.Release(resultReg, RegCache::GEN_RESULT);
regCache_.Unlock(resultReg, RegCache::GEN_RESULT);
regCache_.ForceRelease(RegCache::GEN_RESULT);

if (cpu_info.bSSE4_1) {
PMOVZXBD(vecResultReg, R(vecResultReg));
Expand Down Expand Up @@ -441,12 +448,12 @@ LinearFunc SamplerJitCache::CompileLinear(const SamplerID &id) {
RegCache::GEN_ARG_LEVEL,
// Avoid clobber.
RegCache::GEN_ARG_LEVELFRAC,
});
regCache_.ChangeReg(RAX, RegCache::GEN_RESULT);
});
auto lockReg = [&](X64Reg r, RegCache::Purpose p) {
regCache_.ChangeReg(r, p);
regCache_.ForceRetain(p);
};
lockReg(RAX, RegCache::GEN_RESULT);
lockReg(XMM0, RegCache::VEC_ARG_U);
lockReg(XMM1, RegCache::VEC_ARG_V);
lockReg(XMM5, RegCache::VEC_RESULT);
Expand Down Expand Up @@ -474,6 +481,7 @@ LinearFunc SamplerJitCache::CompileLinear(const SamplerID &id) {
Describe("Init");
RET();

regCache_.ForceRelease(RegCache::GEN_RESULT);
regCache_.ForceRelease(RegCache::VEC_ARG_U);
regCache_.ForceRelease(RegCache::VEC_ARG_V);
regCache_.ForceRelease(RegCache::VEC_RESULT);
Expand Down Expand Up @@ -1758,6 +1766,10 @@ bool SamplerJitCache::Jit_GetDXT1Color(const SamplerID &id, int blockSize, int a
regCache_.Release(srcBaseReg, RegCache::GEN_TEMP0);
regCache_.Release(srcOffsetReg, RegCache::GEN_TEMP1);

// Make sure we don't grab this as colorIndexReg.
if (uReg != ECX)
regCache_.ChangeReg(RCX, RegCache::GEN_SHIFTVAL);

// The colorIndex is simply the 2 bits at blockPos + (v & 3), shifted right by (u & 3) twice.
X64Reg colorIndexReg = regCache_.Alloc(RegCache::GEN_TEMP0);
MOVZX(32, 8, colorIndexReg, MRegSum(srcReg, vReg));
Expand Down

0 comments on commit 212e730

Please sign in to comment.