[Mesa-dev] [PATCH 3/3] nv50/ir: convert slct with boolean result to set
Karol Herbst
kherbst at redhat.com
Fri Dec 14 23:12:39 UTC 2018
From: Karol Herbst <karolherbst at gmail.com>
helps mainly feral ported games
changes in shader-db:
total instructions in shared programs : 7565661 -> 7545812 (-0.26%)
total gprs used in shared programs : 797213 -> 797088 (-0.02%)
total shared used in shared programs : 639636 -> 639636 (0.00%)
total local used in shared programs : 24648 -> 24648 (0.00%)
total bytes used in shared programs : 80806160 -> 80594056 (-0.26%)
local shared gpr inst bytes
helped 0 0 103 5049 5049
hurt 0 0 29 0 0
Signed-off-by: Karol Herbst <kherbst at redhat.com>
---
.../nouveau/codegen/nv50_ir_peephole.cpp | 50 +++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
index 37e9edc49f4..b62dee675ce 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
@@ -372,6 +372,8 @@ private:
void expr(Instruction *, ImmediateValue&, ImmediateValue&, ImmediateValue&);
/* true if i was deleted */
bool opnd(Instruction *i, ImmediateValue&, int s);
+ /* 3 srcs where 1st and 2nd are immediates */
+ void opnd(Instruction *, ImmediateValue&, ImmediateValue&);
void opnd3(Instruction *, ImmediateValue&);
void unary(Instruction *, const ImmediateValue&);
@@ -432,6 +434,10 @@ ConstantFolding::visit(BasicBlock *bb)
}
if (i->srcExists(2) && i->src(2).getImmediate(src2))
opnd3(i, src2);
+ else
+ if (i->srcExists(2) &&
+ i->src(0).getImmediate(src0) && i->src(1).getImmediate(src1))
+ opnd(i, src0, src1);
}
return true;
}
@@ -935,6 +941,50 @@ ConstantFolding::tryCollapseChainedMULs(Instruction *mul2,
}
}
+void
+ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, ImmediateValue &imm1)
+{
+ const Storage &a = imm0.reg;
+ const Storage &b = imm1.reg;
+
+ switch (i->op) {
+ case OP_SLCT: {
+ CmpInstruction *slct = i->asCmp();
+ if (a.data.u32 == 0xffffffff && b.data.u32 == 0x0) {
+ slct->setSrc(0, slct->getSrc(2));
+ slct->setSrc(2, NULL);
+ slct->dType = TYPE_U32;
+ slct->op = OP_SET;
+ }
+ else if (a.data.u32 == 0x3f800000 && b.data.u32 == 0x0) {
+ slct->setSrc(0, slct->getSrc(2));
+ slct->setSrc(2, NULL);
+ slct->dType = TYPE_F32;
+ slct->op = OP_SET;
+ }
+ else if (a.data.u32 == 0x0 && b.data.u32 == 0xffffffff) {
+ slct->swapSources(0, 1);
+ slct->setSrc(0, slct->getSrc(2));
+ slct->setSrc(2, NULL);
+ slct->dType = TYPE_U32;
+ slct->setCondition(inverseCondCode(slct->getCondition()));
+ slct->op = OP_SET;
+ }
+ else if (a.data.u32 == 0x0 && b.data.u32 == 0x3f800000) {
+ slct->swapSources(0, 1);
+ slct->setSrc(0, slct->getSrc(2));
+ slct->setSrc(2, NULL);
+ slct->dType = TYPE_F32;
+ slct->setCondition(inverseCondCode(slct->getCondition()));
+ slct->op = OP_SET;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+}
+
void
ConstantFolding::opnd3(Instruction *i, ImmediateValue &imm2)
{
--
2.19.2
More information about the mesa-dev
mailing list