nvir: add constant folding for OP_PERMT

Important for SM70 INSBF/EXTBF lowering, as these can can often be
eliminated completely.

v2:
- skip CF when subOp is set

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5377>
This commit is contained in:
Ben Skeggs 2020-06-07 09:52:00 +10:00 committed by Marge Bot
parent a831967c72
commit 7dbb7572e2
1 changed files with 9 additions and 0 deletions

View File

@ -801,6 +801,15 @@ ConstantFolding::expr(Instruction *i,
res.data.u32 |= !!(i->subOp & (1 << lut)) << n;
}
break;
case OP_PERMT:
if (!i->subOp) {
uint64_t input = (uint64_t)c->data.u32 << 32 | a->data.u32;
uint16_t permt = b->data.u32;
for (int n = 0 ; n < 4; n++, permt >>= 4)
res.data.u32 |= ((input >> ((permt & 0xf) * 8)) & 0xff) << n * 8;
} else
return;
break;
case OP_INSBF: {
int offset = b->data.u32 & 0xff;
int width = (b->data.u32 >> 8) & 0xff;