mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	Merge pull request #2811 from ReinUsesLisp/fsetp-fix
float_set_predicate: Add missing negation bit for the second operand
This commit is contained in:
		@@ -886,6 +886,7 @@ union Instruction {
 | 
			
		||||
    union {
 | 
			
		||||
        BitField<0, 3, u64> pred0;
 | 
			
		||||
        BitField<3, 3, u64> pred3;
 | 
			
		||||
        BitField<6, 1, u64> neg_b;
 | 
			
		||||
        BitField<7, 1, u64> abs_a;
 | 
			
		||||
        BitField<39, 3, u64> pred39;
 | 
			
		||||
        BitField<42, 1, u64> neg_pred;
 | 
			
		||||
 
 | 
			
		||||
@@ -17,8 +17,8 @@ using Tegra::Shader::Pred;
 | 
			
		||||
u32 ShaderIR::DecodeFloatSetPredicate(NodeBlock& bb, u32 pc) {
 | 
			
		||||
    const Instruction instr = {program_code[pc]};
 | 
			
		||||
 | 
			
		||||
    const Node op_a = GetOperandAbsNegFloat(GetRegister(instr.gpr8), instr.fsetp.abs_a != 0,
 | 
			
		||||
                                            instr.fsetp.neg_a != 0);
 | 
			
		||||
    Node op_a = GetOperandAbsNegFloat(GetRegister(instr.gpr8), instr.fsetp.abs_a != 0,
 | 
			
		||||
                                      instr.fsetp.neg_a != 0);
 | 
			
		||||
    Node op_b = [&]() {
 | 
			
		||||
        if (instr.is_b_imm) {
 | 
			
		||||
            return GetImmediate19(instr);
 | 
			
		||||
@@ -28,12 +28,13 @@ u32 ShaderIR::DecodeFloatSetPredicate(NodeBlock& bb, u32 pc) {
 | 
			
		||||
            return GetConstBuffer(instr.cbuf34.index, instr.cbuf34.GetOffset());
 | 
			
		||||
        }
 | 
			
		||||
    }();
 | 
			
		||||
    op_b = GetOperandAbsNegFloat(op_b, instr.fsetp.abs_b, false);
 | 
			
		||||
    op_b = GetOperandAbsNegFloat(std::move(op_b), instr.fsetp.abs_b, instr.fsetp.neg_b);
 | 
			
		||||
 | 
			
		||||
    // We can't use the constant predicate as destination.
 | 
			
		||||
    ASSERT(instr.fsetp.pred3 != static_cast<u64>(Pred::UnusedIndex));
 | 
			
		||||
 | 
			
		||||
    const Node predicate = GetPredicateComparisonFloat(instr.fsetp.cond, op_a, op_b);
 | 
			
		||||
    const Node predicate =
 | 
			
		||||
        GetPredicateComparisonFloat(instr.fsetp.cond, std::move(op_a), std::move(op_b));
 | 
			
		||||
    const Node second_pred = GetPredicate(instr.fsetp.pred39, instr.fsetp.neg_pred != 0);
 | 
			
		||||
 | 
			
		||||
    const OperationCode combiner = GetPredicateCombiner(instr.fsetp.op);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user