diff options
author | Tobias Klausmann <[email protected]> | 2014-06-04 00:35:50 +0200 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2014-06-06 00:05:11 -0400 |
commit | 4f4e9ba1661528bed8e956a4931ae154e6612824 (patch) | |
tree | be68b2272ae51e60bd679a17fb3eccdc75e1847d | |
parent | fdc1d96b0ff59e163ed9fe894a1e6d08d4204b94 (diff) |
nvc0/ir: Handle OP_POPCNT when folding constant expressions
Signed-off-by: Tobias Klausmann <[email protected]>
[imirkin: make sure to only fold 1-arg popcnt in opnd]
Reviewed-by: Ilia Mirkin <[email protected]>
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp index a91d698c5b2..b89da43136e 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp @@ -540,6 +540,9 @@ ConstantFolding::expr(Instruction *i, } break; } + case OP_POPCNT: + res.data.u32 = util_bitcount(a->data.u32 & b->data.u32); + break; default: return; } @@ -957,6 +960,16 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s) i->subOp = 0; break; } + case OP_POPCNT: { + // Only deal with 1-arg POPCNT here + if (i->srcExists(1)) + break; + uint32_t res = util_bitcount(imm0.reg.data.u32); + i->setSrc(0, new_ImmediateValue(i->bb->getProgram(), res)); + i->setSrc(1, NULL); + i->op = OP_MOV; + break; + } default: return; } |