From: Ben Skeggs Date: Sat, 6 Jun 2020 23:52:00 +0000 (+1000) Subject: nvir: add constant folding for OP_PERMT X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7dbb7572e2b5b96a9cc7767c7cbf550180ec78cd;p=mesa.git 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: --- 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;