From 7dbb7572e2b5b96a9cc7767c7cbf550180ec78cd Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Sun, 7 Jun 2020 09:52:00 +1000 Subject: [PATCH] nvir: add constant folding for OP_PERMT Important for SM70 INSBF/EXTBF lowering, as these can can often be eliminated completely. v2: - skip CF when subOp is set Signed-off-by: Ben Skeggs Reviewed-by: Karol Herbst Part-of: --- src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp index 669bfbcf548..2d32067729d 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp @@ -801,6 +801,15 @@ ConstantFolding::expr(Instruction *i, res.data.u32 |= !!(i->subOp & (1 << lut)) << n; } break; + case OP_PERMT: + if (!i->subOp) { + uint64_t input = (uint64_t)c->data.u32 << 32 | a->data.u32; + uint16_t permt = b->data.u32; + for (int n = 0 ; n < 4; n++, permt >>= 4) + res.data.u32 |= ((input >> ((permt & 0xf) * 8)) & 0xff) << n * 8; + } else + return; + break; case OP_INSBF: { int offset = b->data.u32 & 0xff; int width = (b->data.u32 >> 8) & 0xff; -- 2.30.2