[Nouveau] [PATCH 1/2] nv50/ir: Add support for MAD short+IMM notation

Ilia Mirkin imirkin at alum.mit.edu
Fri Jan 23 14:19:38 PST 2015


On Fri, Jan 23, 2015 at 1:46 PM, Roy Spliet <rspliet at eclipso.eu> wrote:
> Add emission rules for negative and saturate flags for MAD 4-byte opcodes,
> and get rid of constraints. Short MAD has a very specific SDST == SSRC2
> requirement, and since MAD IMM is short notation + 4-byte immediate, don't
> have the compiler create MAD IMM instructions yet.
>
> V2: Document MAD as supported short form
>
> Signed-off-by: Roy Spliet <rspliet at eclipso.eu>
> ---
>  .../drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp      | 18 ++++++++++++------
>  .../drivers/nouveau/codegen/nv50_ir_target_nv50.cpp    |  4 ++--
>  2 files changed, 14 insertions(+), 8 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp
> index 2077388..b1e7409 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp
> @@ -939,9 +939,20 @@ CodeEmitterNV50::emitFMAD(const Instruction *i)
>
>     code[0] = 0xe0000000;
>
> +   if (i->src(1).getFile() == FILE_IMMEDIATE) {
> +      code[1] = 0;
> +      emitForm_IMM(i);
> +      code[0] |= neg_mul << 15;
> +      code[0] |= neg_add << 22;
> +      if (i->saturate)
> +         code[0] |= 1 << 8;
> +   } else
>     if (i->encSize == 4) {
>        emitForm_MUL(i);
> -      assert(!neg_mul && !neg_add);
> +      code[0] |= neg_mul << 15;
> +      code[0] |= neg_add << 22;
> +      if (i->saturate)
> +         code[0] |= 1 << 8;
>     } else {
>        code[1]  = neg_mul << 26;
>        code[1] |= neg_add << 27;
> @@ -1931,11 +1942,6 @@ CodeEmitterNV50::getMinEncodingSize(const Instruction *i) const
>
>     // check constraints on short MAD
>     if (info.srcNr >= 2 && i->srcExists(2)) {
> -      if (i->saturate || i->src(2).mod)
> -         return 8;
> -      if ((i->src(0).mod ^ i->src(1).mod) ||
> -          (i->src(0).mod | i->src(1).mod).abs())
> -         return 8;

Please confirm that you tested shaders with these specific
instructions being generated, i.e. short form mad + sat and mad +
neg/abs.

Separately, please split this (and related bits) from the mad + imm
change, which is separate. When there's a regression because of this,
I want the bisected change to say "enable sat/neg/abs for mad short
form", not "add mad imm but don't enable it" :)

>        if (!i->defExists(0) ||
>            i->def(0).rep()->reg.data.id != i->src(2).rep()->reg.data.id)
>           return 8;
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp
> index 48f996b..178a167 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp
> @@ -117,8 +117,8 @@ void TargetNV50::initOpInfo()
>     };
>     static const uint32_t shortForm[(OP_LAST + 31) / 32] =
>     {
> -      // MOV,ADD,SUB,MUL,SAD,L/PINTERP,RCP,TEX,TXF
> -      0x00010e40, 0x00000040, 0x00000498, 0x00000000
> +      // MOV,ADD,SUB,MUL,MAD,SAD,L/PINTERP,RCP,TEX,TXF
> +      0x00014e40, 0x00000040, 0x00000498, 0x00000000
>     };
>     static const operation noDestList[] =
>     {
> --
> 2.1.0
>
>
>
> _______________________________________________
> Nouveau mailing list
> Nouveau at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/nouveau


More information about the Nouveau mailing list