[Nouveau] [PATCH] nv50/ir: constant fold OP_SPLIT

Tobias Klausmann tobias.johannes.klausmann at mni.thm.de
Tue Sep 27 23:25:49 UTC 2016


Split the source immediate value into two new values and create OP_MOV
instructions the two newly created values.

Signed-off-by: Tobias Klausmann <tobias.johannes.klausmann at mni.thm.de>
---
 .../drivers/nouveau/codegen/nv50_ir_peephole.cpp   | 23 ++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
index 74a5a85..fdddd71 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
@@ -920,6 +920,29 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s)
    Instruction *newi = i;
 
    switch (i->op) {
+   case OP_SPLIT: {
+      uint16_t shift = 0;
+      DataType type = TYPE_NONE;
+      bld.setPosition(i, false);
+      if (i->sType == TYPE_U64 || i->sType == TYPE_S64) {
+         shift = 32;
+         type = (i->sType == TYPE_U64) ? TYPE_U32 : TYPE_S32;
+      }
+      if (i->sType == TYPE_U32 || i->sType == TYPE_S32) {
+         shift = 16;
+         type = (i->sType == TYPE_U32) ? TYPE_U16 : TYPE_S16;
+      }
+      if (i->sType == TYPE_U16 || i->sType == TYPE_S16) {
+         shift = 8;
+         type = (i->sType == TYPE_U16) ? TYPE_U8 : TYPE_S8;
+      }
+      if (type != TYPE_NONE) {
+         bld.mkMov(i->getDef(0), bld.mkImm(imm0.reg.data.u64 >> shift), type);
+         bld.mkMov(i->getDef(1), bld.mkImm(imm0.reg.data.u64), type);
+         delete_Instruction(prog, i);
+      }
+   }
+   break;
    case OP_MUL:
       if (i->dType == TYPE_F32)
          tryCollapseChainedMULs(i, s, imm0);
-- 
2.10.0



More information about the Nouveau mailing list