mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 11:18:08 +02:00
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@mni.thm.de> [imirkin: always use U32, set newi for foldCount tracking] Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
75128d6ffd
commit
b7d9677de8
1 changed files with 18 additions and 0 deletions
|
|
@ -932,6 +932,24 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s)
|
||||||
Instruction *newi = i;
|
Instruction *newi = i;
|
||||||
|
|
||||||
switch (i->op) {
|
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:
|
case OP_MUL:
|
||||||
if (i->dType == TYPE_F32)
|
if (i->dType == TYPE_F32)
|
||||||
tryCollapseChainedMULs(i, s, imm0);
|
tryCollapseChainedMULs(i, s, imm0);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue