From: Ilia Mirkin Date: Wed, 19 Aug 2015 02:53:11 +0000 (-0400) Subject: nvc0/ir: don't require AND when the high byte is being addressed X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9ebe7dc09479d9a8df2733ef96525a2b5e758f6d;p=mesa.git nvc0/ir: don't require AND when the high byte is being addressed unpackUnorm* lowering doesn't AND the high byte/word as it's unnecessary. Detect that situation as well. Signed-off-by: Ilia Mirkin --- diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp index ef286c0ab38..cf83c19056e 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp @@ -1532,6 +1532,7 @@ AlgebraicOpt::handleCVT_NEG(Instruction *cvt) // CVT(EXTBF(x, byte/word)) // CVT(AND(bytemask, x)) // CVT(AND(bytemask, SHR(x, 8/16/24))) +// CVT(SHR(x, 16/24)) void AlgebraicOpt::handleCVT_EXTBF(Instruction *cvt) { @@ -1578,6 +1579,17 @@ AlgebraicOpt::handleCVT_EXTBF(Instruction *cvt) arg = shift->getSrc(0); offset = imm1.reg.data.u32; } + } else if (insn->op == OP_SHR && insn->src(1).getImmediate(imm0)) { + arg = insn->getSrc(0); + if (imm0.reg.data.u32 == 24) { + width = 8; + offset = 24; + } else if (imm0.reg.data.u32 == 16) { + width = 16; + offset = 16; + } else { + return; + } } if (!arg)