summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2016-01-27 09:19:28 -0500
committerGravatar bunnei2016-01-27 09:19:28 -0500
commita43f8d2fb764be18bd8a6e0a3c1501c52a604226 (patch)
treee3b497457e371bfdff8116288cba447fa4f006e8 /src
parentMerge pull request #1369 from yuriks/jmpu-inverted (diff)
parentShader JIT: Fix off-by-one error when compiling JMPs (diff)
downloadyuzu-a43f8d2fb764be18bd8a6e0a3c1501c52a604226.tar.gz
yuzu-a43f8d2fb764be18bd8a6e0a3c1501c52a604226.tar.xz
yuzu-a43f8d2fb764be18bd8a6e0a3c1501c52a604226.zip
Merge pull request #1367 from yuriks/jit-jmp
Shader JIT: Fix off-by-one error when compiling JMPs
Diffstat (limited to 'src')
-rw-r--r--src/video_core/shader/shader_jit_x64.cpp10
-rw-r--r--src/video_core/shader/shader_jit_x64.h2
2 files changed, 6 insertions, 6 deletions
diff --git a/src/video_core/shader/shader_jit_x64.cpp b/src/video_core/shader/shader_jit_x64.cpp
index 6554830b2..4249675a5 100644
--- a/src/video_core/shader/shader_jit_x64.cpp
+++ b/src/video_core/shader/shader_jit_x64.cpp
@@ -653,7 +653,7 @@ void JitCompiler::Compile_IF(Instruction instr) {
653 FixupBranch b = J_CC(CC_Z, true); 653 FixupBranch b = J_CC(CC_Z, true);
654 654
655 // Compile the code that corresponds to the condition evaluating as true 655 // Compile the code that corresponds to the condition evaluating as true
656 Compile_Block(instr.flow_control.dest_offset - 1); 656 Compile_Block(instr.flow_control.dest_offset);
657 657
658 // If there isn't an "ELSE" condition, we are done here 658 // If there isn't an "ELSE" condition, we are done here
659 if (instr.flow_control.num_instructions == 0) { 659 if (instr.flow_control.num_instructions == 0) {
@@ -667,7 +667,7 @@ void JitCompiler::Compile_IF(Instruction instr) {
667 667
668 // This code corresponds to the "ELSE" condition 668 // This code corresponds to the "ELSE" condition
669 // Comple the code that corresponds to the condition evaluating as false 669 // Comple the code that corresponds to the condition evaluating as false
670 Compile_Block(instr.flow_control.dest_offset + instr.flow_control.num_instructions - 1); 670 Compile_Block(instr.flow_control.dest_offset + instr.flow_control.num_instructions);
671 671
672 SetJumpTarget(b2); 672 SetJumpTarget(b2);
673} 673}
@@ -691,7 +691,7 @@ void JitCompiler::Compile_LOOP(Instruction instr) {
691 691
692 auto loop_start = GetCodePtr(); 692 auto loop_start = GetCodePtr();
693 693
694 Compile_Block(instr.flow_control.dest_offset); 694 Compile_Block(instr.flow_control.dest_offset + 1);
695 695
696 ADD(32, R(LOOPCOUNT_REG), R(LOOPINC)); // Increment LOOPCOUNT_REG by Z-component 696 ADD(32, R(LOOPCOUNT_REG), R(LOOPINC)); // Increment LOOPCOUNT_REG by Z-component
697 SUB(32, R(LOOPCOUNT), Imm8(1)); // Increment loop count by 1 697 SUB(32, R(LOOPCOUNT), Imm8(1)); // Increment loop count by 1
@@ -719,12 +719,12 @@ void JitCompiler::Compile_JMP(Instruction instr) {
719 SetJumpTarget(b); 719 SetJumpTarget(b);
720} 720}
721 721
722void JitCompiler::Compile_Block(unsigned stop) { 722void JitCompiler::Compile_Block(unsigned end) {
723 // Save current offset pointer 723 // Save current offset pointer
724 unsigned* prev_offset_ptr = offset_ptr; 724 unsigned* prev_offset_ptr = offset_ptr;
725 unsigned offset = *prev_offset_ptr; 725 unsigned offset = *prev_offset_ptr;
726 726
727 while (offset <= stop) 727 while (offset < end)
728 Compile_NextInstr(&offset); 728 Compile_NextInstr(&offset);
729 729
730 // Restore current offset pointer 730 // Restore current offset pointer
diff --git a/src/video_core/shader/shader_jit_x64.h b/src/video_core/shader/shader_jit_x64.h
index 3afbceccf..5ad2d9606 100644
--- a/src/video_core/shader/shader_jit_x64.h
+++ b/src/video_core/shader/shader_jit_x64.h
@@ -61,7 +61,7 @@ public:
61 void Compile_MAD(Instruction instr); 61 void Compile_MAD(Instruction instr);
62 62
63private: 63private:
64 void Compile_Block(unsigned stop); 64 void Compile_Block(unsigned end);
65 void Compile_NextInstr(unsigned* offset); 65 void Compile_NextInstr(unsigned* offset);
66 66
67 void Compile_SwizzleSrc(Instruction instr, unsigned src_num, SourceRegister src_reg, Gen::X64Reg dest); 67 void Compile_SwizzleSrc(Instruction instr, unsigned src_num, SourceRegister src_reg, Gen::X64Reg dest);