nv50/ir/opt: don't lose saturation in tryCollapseChainedMULs
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 5 May 2012 14:35:49 +0000 (16:35 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sun, 6 May 2012 20:03:06 +0000 (22:03 +0200)
src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp

index db5195c..10382d9 100644 (file)
@@ -564,7 +564,7 @@ ConstantFolding::tryCollapseChainedMULs(Instruction *mul2,
       insn = mul2->getSrc(t)->getInsn();
       if (!mul2->src(t).mod && insn->op == OP_MUL && insn->dType == TYPE_F32)
          mul1 = insn;
-      if (mul1) {
+      if (mul1 && !mul1->saturate) {
          int s1;
 
          if (mul1->src(s1 = 0).getImmediate(imm1) ||
@@ -584,10 +584,11 @@ ConstantFolding::tryCollapseChainedMULs(Instruction *mul2,
             if (f < 0)
                mul1->src(0).mod *= Modifier(NV50_IR_MOD_NEG);
          }
+         mul1->saturate = mul2->saturate;
          return;
       }
    }
-   if (mul2->getDef(0)->refCount() == 1) {
+   if (mul2->getDef(0)->refCount() == 1 && !mul2->saturate) {
       // b = mul a, imm
       // d = mul b, c   -> d = mul_x_imm a, c
       int s2, t2;