Value *pred = bld.getSSA(1, FILE_PREDICATE);
 
    bld.mkCmp(OP_SET, reverseCondCode(i->asCmp()->setCond), TYPE_U8, pred,
-             i->sType, bld.mkImm(0), i->getSrc(2));
+             i->sType, bld.mkImm(0), i->getSrc(2))->ftz = i->ftz;
    bld.mkOp3(OP_SELP, TYPE_U32, i->getDef(0), i->getSrc(0), i->getSrc(1), pred);
    return true;
 }
    xsetp->src(0).mod = i->src(0).mod;
    xsetp->src(1).mod = i->src(1).mod;
    xsetp->setSrc(2, src2);
+   xsetp->ftz = i->ftz;
 
    i = bld.mkOp3(OP_SELP, TYPE_U32, i->getDef(0), bld.mkImm(0), met, pred);
    i->src(2).mod = Modifier(NV50_IR_MOD_NOT);
       bld.mkOp2(OP_ADD, i->dType, i->getDef(0), i->getSrc(0), i->getSrc(1));
    xadd->src(0).mod = i->src(0).mod;
    xadd->src(1).mod = i->src(1).mod ^ Modifier(NV50_IR_MOD_NEG);
+   xadd->ftz = i->ftz;
    return true;
 }
 
    bool lowered = false;
 
    bld.setPosition(i, false);
+   if (i->sType == TYPE_F32 && i->dType != TYPE_F16 &&
+       prog->getType() != Program::TYPE_COMPUTE)
+      handleFTZ(i);
 
    switch (i->op) {
    case OP_AND:
 
    void handleDIV(Instruction *); // integer division, modulus
    void handleRCPRSQLib(Instruction *, Value *[]);
    void handleRCPRSQ(Instruction *); // double precision float recip/rsqrt
-   void handleFTZ(Instruction *);
    void handleSET(CmpInstruction *);
    void handleTEXLOD(TexInstruction *);
    void handleShift(Instruction *);
    void handleBREV(Instruction *);
 
 protected:
+   void handleFTZ(Instruction *);
+
    BuildUtil bld;
 };