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 /src/video_core/shader/shader_jit_x64.cpp | |
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 |
Diffstat (limited to 'src/video_core/shader/shader_jit_x64.cpp')
-rw-r--r-- | src/video_core/shader/shader_jit_x64.cpp | 30 |
1 files changed, 30 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); |