summaryrefslogtreecommitdiff
path: root/src/video_core/shader/decode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/shader/decode.cpp')
-rw-r--r--src/video_core/shader/decode.cpp65
1 files changed, 33 insertions, 32 deletions
diff --git a/src/video_core/shader/decode.cpp b/src/video_core/shader/decode.cpp
index 3265de869..6fdcac784 100644
--- a/src/video_core/shader/decode.cpp
+++ b/src/video_core/shader/decode.cpp
@@ -151,38 +151,39 @@ u32 ShaderIR::DecodeInstr(BasicBlock& bb, u32 pc) {
151 UNIMPLEMENTED_IF_MSG(instr.pred.full_pred == Pred::NeverExecute, 151 UNIMPLEMENTED_IF_MSG(instr.pred.full_pred == Pred::NeverExecute,
152 "NeverExecute predicate not implemented"); 152 "NeverExecute predicate not implemented");
153 153
154 static const std::map<OpCode::Type, u32 (ShaderIR::*)(BasicBlock & code, u32 pc)> decoders = { 154 static const std::map<OpCode::Type, u32 (ShaderIR::*)(BasicBlock&, const BasicBlock&, u32)>
155 {OpCode::Type::Arithmetic, &ShaderIR::DecodeArithmetic}, 155 decoders = {
156 {OpCode::Type::ArithmeticImmediate, &ShaderIR::DecodeArithmeticImmediate}, 156 {OpCode::Type::Arithmetic, &ShaderIR::DecodeArithmetic},
157 {OpCode::Type::Bfe, &ShaderIR::DecodeBfe}, 157 {OpCode::Type::ArithmeticImmediate, &ShaderIR::DecodeArithmeticImmediate},
158 {OpCode::Type::Bfi, &ShaderIR::DecodeBfi}, 158 {OpCode::Type::Bfe, &ShaderIR::DecodeBfe},
159 {OpCode::Type::Shift, &ShaderIR::DecodeShift}, 159 {OpCode::Type::Bfi, &ShaderIR::DecodeBfi},
160 {OpCode::Type::ArithmeticInteger, &ShaderIR::DecodeArithmeticInteger}, 160 {OpCode::Type::Shift, &ShaderIR::DecodeShift},
161 {OpCode::Type::ArithmeticIntegerImmediate, &ShaderIR::DecodeArithmeticIntegerImmediate}, 161 {OpCode::Type::ArithmeticInteger, &ShaderIR::DecodeArithmeticInteger},
162 {OpCode::Type::ArithmeticHalf, &ShaderIR::DecodeArithmeticHalf}, 162 {OpCode::Type::ArithmeticIntegerImmediate, &ShaderIR::DecodeArithmeticIntegerImmediate},
163 {OpCode::Type::ArithmeticHalfImmediate, &ShaderIR::DecodeArithmeticHalfImmediate}, 163 {OpCode::Type::ArithmeticHalf, &ShaderIR::DecodeArithmeticHalf},
164 {OpCode::Type::Ffma, &ShaderIR::DecodeFfma}, 164 {OpCode::Type::ArithmeticHalfImmediate, &ShaderIR::DecodeArithmeticHalfImmediate},
165 {OpCode::Type::Hfma2, &ShaderIR::DecodeHfma2}, 165 {OpCode::Type::Ffma, &ShaderIR::DecodeFfma},
166 {OpCode::Type::Conversion, &ShaderIR::DecodeConversion}, 166 {OpCode::Type::Hfma2, &ShaderIR::DecodeHfma2},
167 {OpCode::Type::Memory, &ShaderIR::DecodeMemory}, 167 {OpCode::Type::Conversion, &ShaderIR::DecodeConversion},
168 {OpCode::Type::FloatSetPredicate, &ShaderIR::DecodeFloatSetPredicate}, 168 {OpCode::Type::Memory, &ShaderIR::DecodeMemory},
169 {OpCode::Type::IntegerSetPredicate, &ShaderIR::DecodeIntegerSetPredicate}, 169 {OpCode::Type::FloatSetPredicate, &ShaderIR::DecodeFloatSetPredicate},
170 {OpCode::Type::HalfSetPredicate, &ShaderIR::DecodeHalfSetPredicate}, 170 {OpCode::Type::IntegerSetPredicate, &ShaderIR::DecodeIntegerSetPredicate},
171 {OpCode::Type::PredicateSetRegister, &ShaderIR::DecodePredicateSetRegister}, 171 {OpCode::Type::HalfSetPredicate, &ShaderIR::DecodeHalfSetPredicate},
172 {OpCode::Type::PredicateSetPredicate, &ShaderIR::DecodePredicateSetPredicate}, 172 {OpCode::Type::PredicateSetRegister, &ShaderIR::DecodePredicateSetRegister},
173 {OpCode::Type::RegisterSetPredicate, &ShaderIR::DecodeRegisterSetPredicate}, 173 {OpCode::Type::PredicateSetPredicate, &ShaderIR::DecodePredicateSetPredicate},
174 {OpCode::Type::FloatSet, &ShaderIR::DecodeFloatSet}, 174 {OpCode::Type::RegisterSetPredicate, &ShaderIR::DecodeRegisterSetPredicate},
175 {OpCode::Type::IntegerSet, &ShaderIR::DecodeIntegerSet}, 175 {OpCode::Type::FloatSet, &ShaderIR::DecodeFloatSet},
176 {OpCode::Type::HalfSet, &ShaderIR::DecodeHalfSet}, 176 {OpCode::Type::IntegerSet, &ShaderIR::DecodeIntegerSet},
177 {OpCode::Type::Video, &ShaderIR::DecodeVideo}, 177 {OpCode::Type::HalfSet, &ShaderIR::DecodeHalfSet},
178 {OpCode::Type::Xmad, &ShaderIR::DecodeXmad}, 178 {OpCode::Type::Video, &ShaderIR::DecodeVideo},
179 }; 179 {OpCode::Type::Xmad, &ShaderIR::DecodeXmad},
180 180 };
181 std::vector<Node> code; 181
182 std::vector<Node> tmp_block;
182 if (const auto decoder = decoders.find(opcode->get().GetType()); decoder != decoders.end()) { 183 if (const auto decoder = decoders.find(opcode->get().GetType()); decoder != decoders.end()) {
183 pc = (this->*decoder->second)(code, pc); 184 pc = (this->*decoder->second)(tmp_block, bb, pc);
184 } else { 185 } else {
185 pc = DecodeOther(code, pc); 186 pc = DecodeOther(tmp_block, bb, pc);
186 } 187 }
187 188
188 // Some instructions (like SSY) don't have a predicate field, they are always unconditionally 189 // Some instructions (like SSY) don't have a predicate field, they are always unconditionally
@@ -192,9 +193,9 @@ u32 ShaderIR::DecodeInstr(BasicBlock& bb, u32 pc) {
192 193
193 if (can_be_predicated && pred_index != static_cast<u32>(Pred::UnusedIndex)) { 194 if (can_be_predicated && pred_index != static_cast<u32>(Pred::UnusedIndex)) {
194 bb.push_back( 195 bb.push_back(
195 Conditional(GetPredicate(pred_index, instr.negate_pred != 0), std::move(code))); 196 Conditional(GetPredicate(pred_index, instr.negate_pred != 0), std::move(tmp_block)));
196 } else { 197 } else {
197 for (auto& node : code) { 198 for (auto& node : tmp_block) {
198 bb.push_back(std::move(node)); 199 bb.push_back(std::move(node));
199 } 200 }
200 } 201 }