[Nouveau] [PATCH] nv50/ir: constant fold OP_SPLIT

Ilia Mirkin imirkin at alum.mit.edu
Wed Sep 28 00:01:50 UTC 2016


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?

> +         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