diff options
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
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) |