nv50/ir: float(s32 & 0xff) = float(u8), not s8
authorIlia Mirkin <imirkin@alum.mit.edu>
Tue, 29 Dec 2015 20:05:34 +0000 (15:05 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Tue, 29 Dec 2015 20:08:20 +0000 (15:08 -0500)
Make sure to make conversion unsigned when we're ANDing the high bits
away. Fixes corruption in dolphin.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: "11.0 11.1" <mesa-stable@lists.freedesktop.org>
src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp

index 022626ccb8fb51063055e19c7c0d41339444f358..c2842c2186f8ce8408f741076460b14953e88a36 100644 (file)
@@ -1889,6 +1889,9 @@ AlgebraicOpt::handleCVT_EXTBF(Instruction *cvt)
          arg = shift->getSrc(0);
          offset = imm.reg.data.u32;
       }
+      // We just AND'd the high bits away, which means this is effectively an
+      // unsigned value.
+      cvt->sType = TYPE_U32;
    } else if (insn->op == OP_SHR &&
               insn->sType == cvt->sType &&
               insn->src(1).getImmediate(imm)) {