mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-30 15:39:02 -05:00 
			
		
		
		
	Implemented CSETP
This commit is contained in:
		| @@ -580,6 +580,15 @@ union Instruction { | ||||
|         BitField<45, 2, PredOperation> op; | ||||
|     } pset; | ||||
|  | ||||
|     union { | ||||
|         BitField<0, 3, u64> pred0; | ||||
|         BitField<3, 3, u64> pred3; | ||||
|         BitField<8, 5, ControlCode> cc; // flag in cc | ||||
|         BitField<39, 3, u64> pred39; | ||||
|         BitField<42, 1, u64> neg_pred39; | ||||
|         BitField<45, 4, PredOperation> op; // op with pred39 | ||||
|     } csetp; | ||||
|  | ||||
|     union { | ||||
|         BitField<39, 3, u64> pred39; | ||||
|         BitField<42, 1, u64> neg_pred; | ||||
| @@ -895,6 +904,7 @@ public: | ||||
|         ISET_IMM, | ||||
|         PSETP, | ||||
|         PSET, | ||||
|         CSETP, | ||||
|         XMAD_IMM, | ||||
|         XMAD_CR, | ||||
|         XMAD_RC, | ||||
| @@ -1131,6 +1141,7 @@ private: | ||||
|             INST("0011011-0101----", Id::ISET_IMM, Type::IntegerSet, "ISET_IMM"), | ||||
|             INST("0101000010001---", Id::PSET, Type::PredicateSetRegister, "PSET"), | ||||
|             INST("0101000010010---", Id::PSETP, Type::PredicateSetPredicate, "PSETP"), | ||||
|             INST("010100001010----", Id::PSETP, Type::PredicateSetPredicate, "CSETP"), | ||||
|             INST("0011011-00------", Id::XMAD_IMM, Type::Xmad, "XMAD_IMM"), | ||||
|             INST("0100111---------", Id::XMAD_CR, Type::Xmad, "XMAD_CR"), | ||||
|             INST("010100010-------", Id::XMAD_RC, Type::Xmad, "XMAD_RC"), | ||||
|   | ||||
| @@ -2267,13 +2267,15 @@ private: | ||||
|             break; | ||||
|         } | ||||
|         case OpCode::Type::PredicateSetPredicate: { | ||||
|             const std::string op_a = | ||||
|                 GetPredicateCondition(instr.psetp.pred12, instr.psetp.neg_pred12 != 0); | ||||
|             const std::string op_b = | ||||
|                 GetPredicateCondition(instr.psetp.pred29, instr.psetp.neg_pred29 != 0); | ||||
|             switch (opcode->GetId()) { | ||||
|             case OpCode::Id::PSETP: { | ||||
|                 const std::string op_a = | ||||
|                     GetPredicateCondition(instr.psetp.pred12, instr.psetp.neg_pred12 != 0); | ||||
|                 const std::string op_b = | ||||
|                     GetPredicateCondition(instr.psetp.pred29, instr.psetp.neg_pred29 != 0); | ||||
|  | ||||
|             // We can't use the constant predicate as destination. | ||||
|             ASSERT(instr.psetp.pred3 != static_cast<u64>(Pred::UnusedIndex)); | ||||
|                 // We can't use the constant predicate as destination. | ||||
|                 ASSERT(instr.psetp.pred3 != static_cast<u64>(Pred::UnusedIndex)); | ||||
|  | ||||
|             const std::string second_pred = | ||||
|                 GetPredicateCondition(instr.psetp.pred39, instr.psetp.neg_pred39 != 0); | ||||
| @@ -2283,15 +2285,37 @@ private: | ||||
|             const std::string predicate = | ||||
|                 '(' + op_a + ") " + GetPredicateCombiner(instr.psetp.cond) + " (" + op_b + ')'; | ||||
|  | ||||
|             // Set the primary predicate to the result of Predicate OP SecondPredicate | ||||
|             SetPredicate(instr.psetp.pred3, | ||||
|                          '(' + predicate + ") " + combiner + " (" + second_pred + ')'); | ||||
|                 // Set the primary predicate to the result of Predicate OP SecondPredicate | ||||
|                 SetPredicate(instr.psetp.pred3, | ||||
|                              '(' + predicate + ") " + combiner + " (" + second_pred + ')'); | ||||
|  | ||||
|             if (instr.psetp.pred0 != static_cast<u64>(Pred::UnusedIndex)) { | ||||
|                 // Set the secondary predicate to the result of !Predicate OP SecondPredicate, | ||||
|                 // if enabled | ||||
|                 SetPredicate(instr.psetp.pred0, | ||||
|                              "!(" + predicate + ") " + combiner + " (" + second_pred + ')'); | ||||
|                 if (instr.psetp.pred0 != static_cast<u64>(Pred::UnusedIndex)) { | ||||
|                     // Set the secondary predicate to the result of !Predicate OP SecondPredicate, | ||||
|                     // if enabled | ||||
|                     SetPredicate(instr.psetp.pred0, | ||||
|                                  "!(" + predicate + ") " + combiner + " (" + second_pred + ')'); | ||||
|                 } | ||||
|                 break; | ||||
|             } | ||||
|             case OpCode::Id::CSETP: { | ||||
|                 std::string pred = | ||||
|                     GetPredicateCondition(instr.csetp.pred39, instr.csetp.neg_pred39 != 0); | ||||
|                 std::string combiner = GetPredicateCombiner(instr.csetp.op); | ||||
|                 std::string controlCode = regs.GetControlCode(instr.csetp.cc); | ||||
|                 if (instr.csetp.pred3 != static_cast<u64>(Pred::UnusedIndex)) { | ||||
|                     SetPredicate(instr.csetp.pred3, | ||||
|                                  '(' + controlCode + ") " + combiner + " (" + pred + ')'); | ||||
|                 } | ||||
|                 if (instr.csetp.pred0 != static_cast<u64>(Pred::UnusedIndex)) { | ||||
|                     SetPredicate(instr.csetp.pred0, | ||||
|                                  "!(" + controlCode + ") " + combiner + " (" + pred + ')'); | ||||
|                 } | ||||
|                 break; | ||||
|             } | ||||
|             default: { | ||||
|                 LOG_CRITICAL(HW_GPU, "Unhandled predicate instruction: {}", opcode->GetName()); | ||||
|                 UNREACHABLE(); | ||||
|             } | ||||
|             } | ||||
|             break; | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 FernandoS27
					FernandoS27