nouveau: fix regression since float comparison instructions (v2)
authorDave Airlie <airlied@gmail.com>
Tue, 10 Sep 2013 02:02:30 +0000 (12:02 +1000)
committerDave Airlie <airlied@gmail.com>
Sun, 15 Sep 2013 22:32:42 +0000 (08:32 +1000)
Fix the return type and allow src and dst types for comparison
to be separate, this at least fixes the two test cases I've written.

v2: drop the u32->s32 change

Acked-by: Christoph Bumiller <christoph.bumiller@speed.at>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.h
src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nv50.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp

index 70e5e226bed39e3f3c06cffd46bec8b4fcde9e86..6d9c830ddc89a043c8070f51fed4532a8a43c96f 100644 (file)
@@ -219,13 +219,13 @@ BuildUtil::mkCvt(operation op,
 }
 
 CmpInstruction *
-BuildUtil::mkCmp(operation op, CondCode cc, DataType ty, Value *dst,
-                 Value *src0, Value *src1, Value *src2)
+BuildUtil::mkCmp(operation op, CondCode cc, DataType dstTy, Value *dst,
+                 DataType srcTy, Value *src0, Value *src1, Value *src2)
 {
    CmpInstruction *insn = new_CmpInstruction(func, op);
 
    insn->setType((dst->reg.file == FILE_PREDICATE ||
-                  dst->reg.file == FILE_FLAGS) ? TYPE_U8 : ty, ty);
+                  dst->reg.file == FILE_FLAGS) ? TYPE_U8 : dstTy, srcTy);
    insn->setCondition(cc);
    insn->setDef(0, dst);
    insn->setSrc(0, src0);
index 2305a275d0de5fad0384a13e94a1bbf3bc3ed521..a610c773f55803b4cc0d9d7ac48f828a22719a42 100644 (file)
@@ -74,7 +74,7 @@ public:
    Instruction *mkCvt(operation, DataType, Value *, DataType, Value *);
    CmpInstruction *mkCmp(operation, CondCode, DataType,
                         Value *,
-                        Value *, Value *, Value * = NULL);
+                        DataType, Value *, Value *, Value * = NULL);
    TexInstruction *mkTex(operation, TexTarget,
                          uint16_t tic, uint16_t tsc,
                          const std::vector<Value *> &def,
index 3193ea668a3251abe28db47e1e3c4a12179f939a..49a45f8394bba15a186678b72a55cb8b56c153b7 100644 (file)
@@ -1776,7 +1776,7 @@ Converter::handleLIT(Value *dst0[4])
       mkOp2(OP_MIN, TYPE_F32, val3, val3, pos128);
       mkOp2(OP_POW, TYPE_F32, val3, val1, val3);
 
-      mkCmp(OP_SLCT, CC_GT, TYPE_F32, dst0[2], val3, zero, val0);
+      mkCmp(OP_SLCT, CC_GT, TYPE_F32, dst0[2], TYPE_F32, val3, zero, val0);
    }
 }
 
@@ -2315,8 +2315,8 @@ Converter::handleInstruction(const struct tgsi_full_instruction *insn)
          src0 = fetchSrc(0, c);
          val0 = getScratch();
          val1 = getScratch();
-         mkCmp(OP_SET, CC_GT, srcTy, val0, src0, zero);
-         mkCmp(OP_SET, CC_LT, srcTy, val1, src0, zero);
+         mkCmp(OP_SET, CC_GT, srcTy, val0, srcTy, src0, zero);
+         mkCmp(OP_SET, CC_LT, srcTy, val1, srcTy, src0, zero);
          if (srcTy == TYPE_F32)
             mkOp2(OP_SUB, TYPE_F32, dst0[c], val0, val1);
          else
@@ -2333,7 +2333,7 @@ Converter::handleInstruction(const struct tgsi_full_instruction *insn)
             mkMov(dst0[c], src1);
          else
             mkCmp(OP_SLCT, (srcTy == TYPE_F32) ? CC_LT : CC_NE,
-                  srcTy, dst0[c], src1, src2, src0);
+                  srcTy, dst0[c], srcTy, src1, src2, src0);
       }
       break;
    case TGSI_OPCODE_FRC:
@@ -2380,13 +2380,13 @@ Converter::handleInstruction(const struct tgsi_full_instruction *insn)
       FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) {
          src0 = fetchSrc(0, c);
          src1 = fetchSrc(1, c);
-         mkCmp(op, tgsi.getSetCond(), dstTy, dst0[c], src0, src1);
+         mkCmp(op, tgsi.getSetCond(), dstTy, dst0[c], srcTy, src0, src1);
       }
       break;
    case TGSI_OPCODE_KILL_IF:
       val0 = new_LValue(func, FILE_PREDICATE);
       for (c = 0; c < 4; ++c) {
-         mkCmp(OP_SET, CC_LT, TYPE_F32, val0, fetchSrc(0, c), zero);
+         mkCmp(OP_SET, CC_LT, TYPE_F32, val0, TYPE_F32, fetchSrc(0, c), zero);
          mkOp(OP_DISCARD, TYPE_NONE, NULL)->setPredicate(CC_P, val0);
       }
       break;
index 56eaad3bbf9092872b31f9d13eef697d4b69c4a8..caaf09f6787a565251524ab00fdcc7525fe2acc6 100644 (file)
@@ -423,7 +423,7 @@ NV50LegalizeSSA::handleDIV(Instruction *div)
    expandIntegerMUL(&bld,
       bld.mkOp2(OP_MUL, TYPE_U32, (t = bld.getSSA()), q, b));
    bld.mkOp2(OP_SUB, TYPE_U32, (m = bld.getSSA()), a, t);
-   bld.mkCmp(OP_SET, CC_GE, TYPE_U32, (s = bld.getSSA()), m, b);
+   bld.mkCmp(OP_SET, CC_GE, TYPE_U32, (s = bld.getSSA()), TYPE_U32, m, b);
    if (!isSignedType(ty)) {
       div->op = OP_SUB;
       div->setSrc(0, q);
@@ -1011,7 +1011,7 @@ NV50LoweringPreSSA::checkPredicate(Instruction *insn)
       return;
    cdst = bld.getSSA(1, FILE_FLAGS);
 
-   bld.mkCmp(OP_SET, CC_NEU, insn->dType, cdst, bld.loadImm(NULL, 0), pred);
+   bld.mkCmp(OP_SET, CC_NEU, insn->dType, cdst, insn->dType, bld.loadImm(NULL, 0), pred);
 
    insn->setPredicate(insn->cc, cdst);
 }
index 8d94dd1ce5d5df56292ab0629964b9afb6237e0f..a83800449140fed4725b15948c8a65f8e7f6763b 100644 (file)
@@ -1493,7 +1493,7 @@ NVC0LoweringPass::checkPredicate(Instruction *insn)
    // CAUTION: don't use pdst->getInsn, the definition might not be unique,
    //  delay turning PSET(FSET(x,y),0) into PSET(x,y) to a later pass
 
-   bld.mkCmp(OP_SET, CC_NEU, insn->dType, pdst, bld.mkImm(0), pred);
+   bld.mkCmp(OP_SET, CC_NEU, insn->dType, pdst, insn->dType, bld.mkImm(0), pred);
 
    insn->setPredicate(insn->cc, pdst);
 }
index 99bd2bf1a4df8fa1907f3ebcf0ee40b2daeb5579..fb82c72f6bc9bec6df4dfe2e9039ec7273cccaec 100644 (file)
@@ -751,7 +751,7 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s)
          else
             tB = tA;
          tA = bld.getSSA();
-         bld.mkCmp(OP_SET, CC_LT, TYPE_S32, tA, i->getSrc(0), bld.mkImm(0));
+         bld.mkCmp(OP_SET, CC_LT, TYPE_S32, tA, TYPE_S32, i->getSrc(0), bld.mkImm(0));
          tD = (d < 0) ? bld.getSSA() : i->getDef(0)->asLValue();
          bld.mkOp2(OP_SUB, TYPE_U32, tD, tB, tA);
          if (d < 0)