mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-31 07:59:02 -05:00 
			
		
		
		
	Merge pull request #625 from Subv/imnmx
GPU: Implemented the IMNMX shader instruction.
This commit is contained in:
		| @@ -194,6 +194,13 @@ enum class UniformType : u64 { | ||||
|     Double = 5, | ||||
| }; | ||||
|  | ||||
| enum class IMinMaxExchange : u64 { | ||||
|     None = 0, | ||||
|     XLo = 1, | ||||
|     XMed = 2, | ||||
|     XHi = 3, | ||||
| }; | ||||
|  | ||||
| union Instruction { | ||||
|     Instruction& operator=(const Instruction& instr) { | ||||
|         value = instr.value; | ||||
| @@ -278,6 +285,13 @@ union Instruction { | ||||
|         BitField<49, 1, u64> negate_a; | ||||
|     } alu_integer; | ||||
|  | ||||
|     union { | ||||
|         BitField<39, 3, u64> pred; | ||||
|         BitField<42, 1, u64> negate_pred; | ||||
|         BitField<43, 2, IMinMaxExchange> exchange; | ||||
|         BitField<48, 1, u64> is_signed; | ||||
|     } imnmx; | ||||
|  | ||||
|     union { | ||||
|         BitField<54, 1, u64> saturate; | ||||
|         BitField<56, 1, u64> negate_a; | ||||
| @@ -700,9 +714,9 @@ private: | ||||
|             INST("0100110001100---", Id::FMNMX_C, Type::Arithmetic, "FMNMX_C"), | ||||
|             INST("0101110001100---", Id::FMNMX_R, Type::Arithmetic, "FMNMX_R"), | ||||
|             INST("0011100-01100---", Id::FMNMX_IMM, Type::Arithmetic, "FMNMX_IMM"), | ||||
|             INST("0100110000100---", Id::IMNMX_C, Type::Arithmetic, "FMNMX_IMM"), | ||||
|             INST("0101110000100---", Id::IMNMX_R, Type::Arithmetic, "FMNMX_IMM"), | ||||
|             INST("0011100-00100---", Id::IMNMX_IMM, Type::Arithmetic, "FMNMX_IMM"), | ||||
|             INST("0100110000100---", Id::IMNMX_C, Type::ArithmeticInteger, "IMNMX_C"), | ||||
|             INST("0101110000100---", Id::IMNMX_R, Type::ArithmeticInteger, "IMNMX_R"), | ||||
|             INST("0011100-00100---", Id::IMNMX_IMM, Type::ArithmeticInteger, "IMNMX_IMM"), | ||||
|             INST("0100110000000---", Id::BFE_C, Type::Bfe, "BFE_C"), | ||||
|             INST("0101110000000---", Id::BFE_R, Type::Bfe, "BFE_R"), | ||||
|             INST("0011100-00000---", Id::BFE_IMM, Type::Bfe, "BFE_IMM"), | ||||
|   | ||||
| @@ -1127,6 +1127,20 @@ private: | ||||
|                 WriteLogicOperation(instr.gpr0, instr.alu.lop.operation, op_a, op_b); | ||||
|                 break; | ||||
|             } | ||||
|             case OpCode::Id::IMNMX_C: | ||||
|             case OpCode::Id::IMNMX_R: | ||||
|             case OpCode::Id::IMNMX_IMM: { | ||||
|                 ASSERT_MSG(instr.imnmx.exchange == Tegra::Shader::IMinMaxExchange::None, | ||||
|                            "Unimplemented"); | ||||
|                 std::string condition = | ||||
|                     GetPredicateCondition(instr.imnmx.pred, instr.imnmx.negate_pred != 0); | ||||
|                 std::string parameters = op_a + ',' + op_b; | ||||
|                 regs.SetRegisterToInteger(instr.gpr0, instr.imnmx.is_signed, 0, | ||||
|                                           '(' + condition + ") ? min(" + parameters + ") : max(" + | ||||
|                                               parameters + ')', | ||||
|                                           1, 1); | ||||
|                 break; | ||||
|             } | ||||
|             default: { | ||||
|                 LOG_CRITICAL(HW_GPU, "Unhandled ArithmeticInteger instruction: {}", | ||||
|                              opcode->GetName()); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei