diff options
author | aroulin <andy.roulin@epfl.ch> | 2015-08-19 01:49:45 +0200 |
---|---|---|
committer | aroulin <andy.roulin@epfl.ch> | 2015-08-19 03:40:07 +0200 |
commit | 2f9eb98f03b99482d3b79c7afb345d8c5014ddf8 (patch) | |
tree | 98f63e0a2ae6d44a85733e12605e1b49d45f1264 | |
parent | Shader: implement EX2 and LG2 in JIT (diff) | |
download | yuzu-2f9eb98f03b99482d3b79c7afb345d8c5014ddf8.tar yuzu-2f9eb98f03b99482d3b79c7afb345d8c5014ddf8.tar.gz yuzu-2f9eb98f03b99482d3b79c7afb345d8c5014ddf8.tar.bz2 yuzu-2f9eb98f03b99482d3b79c7afb345d8c5014ddf8.tar.lz yuzu-2f9eb98f03b99482d3b79c7afb345d8c5014ddf8.tar.xz yuzu-2f9eb98f03b99482d3b79c7afb345d8c5014ddf8.tar.zst yuzu-2f9eb98f03b99482d3b79c7afb345d8c5014ddf8.zip |
-rw-r--r-- | src/video_core/shader/shader_jit_x64.cpp | 30 | ||||
-rw-r--r-- | src/video_core/shader/shader_jit_x64.h | 3 |
2 files changed, 33 insertions, 0 deletions
diff --git a/src/video_core/shader/shader_jit_x64.cpp b/src/video_core/shader/shader_jit_x64.cpp index 93f608584..e4b8295b3 100644 --- a/src/video_core/shader/shader_jit_x64.cpp +++ b/src/video_core/shader/shader_jit_x64.cpp @@ -280,6 +280,22 @@ void JitCompiler::Compile_UniformCondition(Instruction instr) { CMP(sizeof(bool) * 8, MDisp(UNIFORMS, offset), Imm8(0)); } +void JitCompiler::Compile_PushCallerSavedXMM() { +#ifndef _WIN32 + SUB(64, R(RSP), Imm8(2 * 16)); + MOVUPS(MDisp(RSP, 16), ONE); + MOVUPS(MDisp(RSP, 0), NEGBIT); +#endif +} + +void JitCompiler::Compile_PopCallerSavedXMM() { +#ifndef _WIN32 + MOVUPS(NEGBIT, MDisp(RSP, 0)); + MOVUPS(ONE, MDisp(RSP, 16)); + ADD(64, R(RSP), Imm8(2 * 16)); +#endif +} + void JitCompiler::Compile_ADD(Instruction instr) { Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1); Compile_SwizzleSrc(instr, 2, instr.common.src2, SRC2); @@ -334,7 +350,14 @@ void JitCompiler::Compile_DP4(Instruction instr) { void JitCompiler::Compile_EX2(Instruction instr) { Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1); MOVSS(XMM0, R(SRC1)); + + // The following will actually break the stack alignment + ABI_PushAllCallerSavedRegsAndAdjustStack(); + Compile_PushCallerSavedXMM(); ABI_CallFunction(reinterpret_cast<const void*>(exp2f)); + Compile_PopCallerSavedXMM(); + ABI_PopAllCallerSavedRegsAndAdjustStack(); + SHUFPS(XMM0, R(XMM0), _MM_SHUFFLE(0, 0, 0, 0)); MOVAPS(SRC1, R(XMM0)); Compile_DestEnable(instr, SRC1); @@ -343,7 +366,14 @@ void JitCompiler::Compile_EX2(Instruction instr) { void JitCompiler::Compile_LG2(Instruction instr) { Compile_SwizzleSrc(instr, 1, instr.common.src1, SRC1); MOVSS(XMM0, R(SRC1)); + + // The following will actually break the stack alignment + ABI_PushAllCallerSavedRegsAndAdjustStack(); + Compile_PushCallerSavedXMM(); ABI_CallFunction(reinterpret_cast<const void*>(log2f)); + Compile_PopCallerSavedXMM(); + ABI_PopAllCallerSavedRegsAndAdjustStack(); + SHUFPS(XMM0, R(XMM0), _MM_SHUFFLE(0, 0, 0, 0)); MOVAPS(SRC1, R(XMM0)); Compile_DestEnable(instr, SRC1); diff --git a/src/video_core/shader/shader_jit_x64.h b/src/video_core/shader/shader_jit_x64.h index 104f9f466..a6ae7fbf1 100644 --- a/src/video_core/shader/shader_jit_x64.h +++ b/src/video_core/shader/shader_jit_x64.h @@ -69,6 +69,9 @@ private: void Compile_EvaluateCondition(Instruction instr); void Compile_UniformCondition(Instruction instr); + void Compile_PushCallerSavedXMM(); + void Compile_PopCallerSavedXMM(); + /// Pointer to the variable that stores the current Pica code offset. Used to handle nested code blocks. unsigned* offset_ptr = nullptr; |