forked from eden-emu/eden
		
	GPU: Implemented the PSETP shader instruction.
It's similar to the isetp and fsetp instructions but it works on predicates instead.
This commit is contained in:
		
							parent
							
								
									18115aede8
								
							
						
					
					
						commit
						9ba997d4f0
					
				
					 2 changed files with 43 additions and 0 deletions
				
			
		|  | @ -328,6 +328,19 @@ union Instruction { | ||||||
|         BitField<49, 3, PredCondition> cond; |         BitField<49, 3, PredCondition> cond; | ||||||
|     } isetp; |     } isetp; | ||||||
| 
 | 
 | ||||||
|  |     union { | ||||||
|  |         BitField<0, 3, u64> pred0; | ||||||
|  |         BitField<3, 3, u64> pred3; | ||||||
|  |         BitField<12, 3, u64> pred12; | ||||||
|  |         BitField<15, 1, u64> neg_pred12; | ||||||
|  |         BitField<24, 2, PredOperation> cond; | ||||||
|  |         BitField<29, 3, u64> pred29; | ||||||
|  |         BitField<32, 1, u64> neg_pred29; | ||||||
|  |         BitField<39, 3, u64> pred39; | ||||||
|  |         BitField<42, 1, u64> neg_pred39; | ||||||
|  |         BitField<45, 2, PredOperation> op; | ||||||
|  |     } psetp; | ||||||
|  | 
 | ||||||
|     union { |     union { | ||||||
|         BitField<39, 3, u64> pred39; |         BitField<39, 3, u64> pred39; | ||||||
|         BitField<42, 1, u64> neg_pred; |         BitField<42, 1, u64> neg_pred; | ||||||
|  |  | ||||||
|  | @ -1477,6 +1477,36 @@ private: | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |         case OpCode::Type::PredicateSetPredicate: { | ||||||
|  |             std::string op_a = | ||||||
|  |                 GetPredicateCondition(instr.psetp.pred12, instr.psetp.neg_pred12 != 0); | ||||||
|  |             std::string op_b = | ||||||
|  |                 GetPredicateCondition(instr.psetp.pred29, instr.psetp.neg_pred29 != 0); | ||||||
|  | 
 | ||||||
|  |             using Tegra::Shader::Pred; | ||||||
|  |             // We can't use the constant predicate as destination.
 | ||||||
|  |             ASSERT(instr.psetp.pred3 != static_cast<u64>(Pred::UnusedIndex)); | ||||||
|  | 
 | ||||||
|  |             std::string second_pred = | ||||||
|  |                 GetPredicateCondition(instr.psetp.pred39, instr.psetp.neg_pred39 != 0); | ||||||
|  | 
 | ||||||
|  |             std::string combiner = GetPredicateCombiner(instr.psetp.op); | ||||||
|  | 
 | ||||||
|  |             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 + ')'); | ||||||
|  | 
 | ||||||
|  |             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::Type::FloatSet: { |         case OpCode::Type::FloatSet: { | ||||||
|             std::string op_a = instr.fset.neg_a ? "-" : ""; |             std::string op_a = instr.fset.neg_a ? "-" : ""; | ||||||
|             op_a += regs.GetRegisterAsFloat(instr.gpr8); |             op_a += regs.GetRegisterAsFloat(instr.gpr8); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Subv
						Subv