[Mesa-dev] [PATCH v2 1/6] gk110/ir: add LIMM form of mad

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed Oct 26 17:14:43 UTC 2016


You forgot to add emission for the CC flag, ie:

if (i->flagsDef >= 0)
   code[1] |= 1 << 23;

Few other comments below.

On 10/09/2016 11:04 AM, Karol Herbst wrote:
> v2: renamed commit
>     reordered modifiers
>     add assert(dst == src2)
>
> Signed-off-by: Karol Herbst <karolherbst at gmail.com>
> ---
>  .../drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp | 50 ++++++++++++++--------
>  1 file changed, 33 insertions(+), 17 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
> index ce20ed3..7574116 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
> @@ -47,7 +47,7 @@ private:
>  private:
>     void emitForm_21(const Instruction *, uint32_t opc2, uint32_t opc1);
>     void emitForm_C(const Instruction *, uint32_t opc, uint8_t ctg);
> -   void emitForm_L(const Instruction *, uint32_t opc, uint8_t ctg, Modifier);
> +   void emitForm_L(const Instruction *, uint32_t opc, uint8_t ctg, Modifier, int sCount = 3);
>
>     void emitPredicate(const Instruction *);
>
> @@ -364,7 +364,7 @@ CodeEmitterGK110::setImmediate32(const Instruction *i, const int s,
>
>  void
>  CodeEmitterGK110::emitForm_L(const Instruction *i, uint32_t opc, uint8_t ctg,
> -                             Modifier mod)
> +                             Modifier mod, int sCount)
>  {
>     code[0] = ctg;
>     code[1] = opc << 20;
> @@ -373,7 +373,7 @@ CodeEmitterGK110::emitForm_L(const Instruction *i, uint32_t opc, uint8_t ctg,
>
>     defId(i->def(0), 2);
>
> -   for (int s = 0; s < 3 && i->srcExists(s); ++s) {
> +   for (int s = 0; s < sCount && i->srcExists(s); ++s) {
>        switch (i->src(s).getFile()) {
>        case FILE_GPR:
>           srcId(i->src(s), s ? 42 : 10);
> @@ -486,25 +486,41 @@ CodeEmitterGK110::emitNOP(const Instruction *i)
>  void
>  CodeEmitterGK110::emitFMAD(const Instruction *i)
>  {
> -   assert(!isLIMM(i->src(1), TYPE_F32));
> +   bool neg1 = (i->src(0).mod ^ i->src(1).mod).neg();
>
> -   emitForm_21(i, 0x0c0, 0x940);
> +   if (isLIMM(i->src(1), TYPE_F32)) {
> +      assert(i->getDef(0)->reg.data.id == i->getSrc(2)->reg.data.id);
>
> -   NEG_(34, 2);
> -   SAT_(35);
> -   RND_(36, F);
> -   FTZ_(38);
> -   DNZ_(39);
> +      // last source is dst, so force 2 sources
> +      emitForm_L(i, 0x600, 0x0, Modifier(0), 2);

s/Modifier(0)/0

>
> -   bool neg1 = (i->src(0).mod ^ i->src(1).mod).neg();
> +      NEG_(3b, 0);
> +      NEG_(3c, 2);
> +      SAT_(3a);

Order is opposite.
3a
3b
3c
etc

>
> -   if (code[0] & 0x1) {
> -      if (neg1)
> -         code[1] ^= 1 << 27;
> -   } else
> -   if (neg1) {
> -      code[1] |= 1 << 19;
> +      // neg 1

Please drop that comment, useless (and the other one below as well).

> +      if (neg1) {
> +         code[1] |= 1 << 27;
> +      }
> +   } else {
> +      emitForm_21(i, 0x0c0, 0x940);
> +
> +      NEG_(34, 2);
> +      SAT_(35);
> +      RND_(36, F);
> +
> +      // neg 1
> +      if (code[0] & 0x1) {
> +         if (neg1)
> +            code[1] ^= 1 << 27;
> +      } else
> +      if (neg1) {
> +         code[1] |= 1 << 19;
> +      }
>     }
> +
> +   FTZ_(38);
> +   DNZ_(39);
>  }
>
>  void
>


More information about the mesa-dev mailing list