[Nouveau] [PATCH] nv50/ir: constant fold OP_SPLIT
Tobias Klausmann
tobias.johannes.klausmann at mni.thm.de
Fri Sep 30 19:21:41 UTC 2016
On 28.09.2016 02:01, Ilia Mirkin wrote:
> On Tue, Sep 27, 2016 at 7:25 PM, Tobias Klausmann
> <tobias.johannes.klausmann at mni.thm.de> wrote:
>> 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;
>> + }
> shift = typeSizeOf(i->dType);
>
>> + 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);
> u64 val = ...u64;
> for (d = 0; i->defExists(d); ++d) {
> bld.mkMov(i->getDef(d), bld.mkImm(val & ((1 << shift) - 1));
> val >>= shift;
> }
>
> I think this will account for every case, and with a lot less
> special-casing. What do you think?
Well with this you'd not set the new type right: bld.mkMov(def, val,
>>type<<), where you always would use TYPE_U32. Not sure if that is
what we want... other than that that, shorten it like this would be nice!
>
>> + delete_Instruction(prog, i);
>> + }
>> + }
>> + break;
>> case OP_MUL:
>> if (i->dType == TYPE_F32)
>> tryCollapseChainedMULs(i, s, imm0);
>> --
>> 2.10.0
>>
>> _______________________________________________
>> Nouveau mailing list
>> Nouveau at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/nouveau
More information about the Nouveau
mailing list