nv50/ir: handle TGSI_OPCODE_ISSG
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Wed, 11 Jan 2012 19:25:06 +0000 (20:25 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Wed, 11 Jan 2012 19:26:58 +0000 (20:26 +0100)
src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp

index 7f4c7f261ef968950e3318fa6a4ca68c6349573c..a1c8f84d7eda08c85ebae6a87d0d9f7c3ba36565 100644 (file)
@@ -385,6 +385,7 @@ nv50_ir::DataType Instruction::inferSrcType() const
    case TGSI_OPCODE_ISGE:
    case TGSI_OPCODE_ISHR:
    case TGSI_OPCODE_ISLT:
+   case TGSI_OPCODE_ISSG:
    case TGSI_OPCODE_SAD: // not sure about SAD, but no one has a float version
    case TGSI_OPCODE_MOD:
    case TGSI_OPCODE_UARL:
@@ -1892,14 +1893,18 @@ Converter::handleInstruction(const struct tgsi_full_instruction *insn)
          }
       }
       break;
+   case TGSI_OPCODE_ISSG:
    case TGSI_OPCODE_SSG:
       FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) {
          src0 = fetchSrc(0, c);
          val0 = getScratch();
          val1 = getScratch();
-         mkCmp(OP_SET, CC_GT, TYPE_F32, val0, src0, zero);
-         mkCmp(OP_SET, CC_LT, TYPE_F32, val1, src0, zero);
-         mkOp2(OP_SUB, TYPE_F32, dst0[c], val0, val1);
+         mkCmp(OP_SET, CC_GT, srcTy, val0, src0, zero);
+         mkCmp(OP_SET, CC_LT, srcTy, val1, src0, zero);
+         if (srcTy == TYPE_F32)
+            mkOp2(OP_SUB, TYPE_F32, dst0[c], val0, val1);
+         else
+            mkOp2(OP_SUB, TYPE_S32, dst0[c], val1, val0);
       }
       break;
    case TGSI_OPCODE_UCMP: