summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar bunnei2018-11-25 23:04:57 -0500
committerGravatar GitHub2018-11-25 23:04:57 -0500
commitf9a211220c59b332a94450a85d3baa1934d6d07e (patch)
tree2ee3bc6f40087b718c18e8dedd95b2c4fd58fda7
parentMerge pull request #1793 from lioncash/ref (diff)
parentgl_shader_decompiler: Implement BFI_IMM_R (diff)
downloadyuzu-f9a211220c59b332a94450a85d3baa1934d6d07e.tar.gz
yuzu-f9a211220c59b332a94450a85d3baa1934d6d07e.tar.xz
yuzu-f9a211220c59b332a94450a85d3baa1934d6d07e.zip
Merge pull request #1763 from ReinUsesLisp/bfi
gl_shader_decompiler: Implement BFI_IMM_R
-rw-r--r--src/video_core/engines/shader_bytecode.h3
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp20
2 files changed, 23 insertions, 0 deletions
diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h
index 52d03aee8..b9faaf8e0 100644
--- a/src/video_core/engines/shader_bytecode.h
+++ b/src/video_core/engines/shader_bytecode.h
@@ -1269,6 +1269,7 @@ public:
1269 BFE_C, 1269 BFE_C,
1270 BFE_R, 1270 BFE_R,
1271 BFE_IMM, 1271 BFE_IMM,
1272 BFI_IMM_R,
1272 BRA, 1273 BRA,
1273 PBK, 1274 PBK,
1274 LD_A, 1275 LD_A,
@@ -1410,6 +1411,7 @@ public:
1410 ArithmeticHalf, 1411 ArithmeticHalf,
1411 ArithmeticHalfImmediate, 1412 ArithmeticHalfImmediate,
1412 Bfe, 1413 Bfe,
1414 Bfi,
1413 Shift, 1415 Shift,
1414 Ffma, 1416 Ffma,
1415 Hfma2, 1417 Hfma2,
@@ -1628,6 +1630,7 @@ private:
1628 INST("0100110000000---", Id::BFE_C, Type::Bfe, "BFE_C"), 1630 INST("0100110000000---", Id::BFE_C, Type::Bfe, "BFE_C"),
1629 INST("0101110000000---", Id::BFE_R, Type::Bfe, "BFE_R"), 1631 INST("0101110000000---", Id::BFE_R, Type::Bfe, "BFE_R"),
1630 INST("0011100-00000---", Id::BFE_IMM, Type::Bfe, "BFE_IMM"), 1632 INST("0011100-00000---", Id::BFE_IMM, Type::Bfe, "BFE_IMM"),
1633 INST("0011011-11110---", Id::BFI_IMM_R, Type::Bfi, "BFI_IMM_R"),
1631 INST("0100110001000---", Id::LOP_C, Type::ArithmeticInteger, "LOP_C"), 1634 INST("0100110001000---", Id::LOP_C, Type::ArithmeticInteger, "LOP_C"),
1632 INST("0101110001000---", Id::LOP_R, Type::ArithmeticInteger, "LOP_R"), 1635 INST("0101110001000---", Id::LOP_R, Type::ArithmeticInteger, "LOP_R"),
1633 INST("0011100001000---", Id::LOP_IMM, Type::ArithmeticInteger, "LOP_IMM"), 1636 INST("0011100001000---", Id::LOP_IMM, Type::ArithmeticInteger, "LOP_IMM"),
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index 3a75f9d16..05fe2d370 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -1721,6 +1721,26 @@ private:
1721 1721
1722 break; 1722 break;
1723 } 1723 }
1724 case OpCode::Type::Bfi: {
1725 UNIMPLEMENTED_IF(instr.generates_cc);
1726
1727 const auto [base, packed_shift] = [&]() -> std::tuple<std::string, std::string> {
1728 switch (opcode->get().GetId()) {
1729 case OpCode::Id::BFI_IMM_R:
1730 return {regs.GetRegisterAsInteger(instr.gpr39, 0, false),
1731 std::to_string(instr.alu.GetSignedImm20_20())};
1732 default:
1733 UNREACHABLE();
1734 }
1735 }();
1736 const std::string offset = '(' + packed_shift + " & 0xff)";
1737 const std::string bits = "((" + packed_shift + " >> 8) & 0xff)";
1738 const std::string insert = regs.GetRegisterAsInteger(instr.gpr8, 0, false);
1739 regs.SetRegisterToInteger(
1740 instr.gpr0, false, 0,
1741 "bitfieldInsert(" + base + ", " + insert + ", " + offset + ", " + bits + ')', 1, 1);
1742 break;
1743 }
1724 case OpCode::Type::Shift: { 1744 case OpCode::Type::Shift: {
1725 std::string op_a = regs.GetRegisterAsInteger(instr.gpr8, 0, true); 1745 std::string op_a = regs.GetRegisterAsInteger(instr.gpr8, 0, true);
1726 std::string op_b; 1746 std::string op_b;