Mesa (master): nv50/ir: constant fold OP_SPLIT
Ilia Mirkin
imirkin at kemper.freedesktop.org
Sat Oct 15 03:25:30 UTC 2016
Module: Mesa
Branch: master
Commit: b7d9677de804375827b3c433027ec2dd32cd1da6
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b7d9677de804375827b3c433027ec2dd32cd1da6
Author: Tobias Klausmann <tobias.johannes.klausmann at mni.thm.de>
Date: Fri Sep 30 23:50:15 2016 +0200
nv50/ir: constant fold OP_SPLIT
Split the source immediate value into new values and move them into the
original defs set by the split. Since we can only have up to 64-bit
immediates, this is largely beneficial for F64 (and, in the future, U64)
operations.
Signed-off-by: Tobias Klausmann <tobias.johannes.klausmann at mni.thm.de>
[imirkin: always use U32, set newi for foldCount tracking]
Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
---
.../drivers/nouveau/codegen/nv50_ir_peephole.cpp | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
index 737bda3..0fb1a78 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
@@ -932,6 +932,24 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s)
Instruction *newi = i;
switch (i->op) {
+ case OP_SPLIT: {
+ bld.setPosition(i, false);
+
+ uint8_t size = i->getDef(0)->reg.size;
+ uint32_t mask = (1ULL << size) - 1;
+ assert(size <= 32);
+
+ uint64_t val = imm0.reg.data.u64;
+ for (int8_t d = 0; i->defExists(d); ++d) {
+ Value *def = i->getDef(d);
+ assert(def->reg.size == size);
+
+ newi = bld.mkMov(def, bld.mkImm((uint32_t)(val & mask)), TYPE_U32);
+ val >>= size;
+ }
+ delete_Instruction(prog, i);
+ break;
+ }
case OP_MUL:
if (i->dType == TYPE_F32)
tryCollapseChainedMULs(i, s, imm0);
More information about the mesa-commit
mailing list