[Mesa-dev] [PATCH 3/5] i965/vs: Add src_reg::negative_equals method

Matt Turner mattst88 at gmail.com
Thu Apr 9 09:31:33 PDT 2015


On Wed, Apr 8, 2015 at 4:38 PM, Ian Romanick <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> This method is similar to the existing ::equals method.  Instead of
> testing that two src_regs are equal to each other, it tests that one is
> the negation of the other.
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/mesa/drivers/dri/i965/brw_ir_vec4.h |  1 +
>  src/mesa/drivers/dri/i965/brw_vec4.cpp  | 43 +++++++++++++++++++++++++++++++++
>  2 files changed, 44 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_ir_vec4.h b/src/mesa/drivers/dri/i965/brw_ir_vec4.h
> index d3bd64d..449795a 100644
> --- a/src/mesa/drivers/dri/i965/brw_ir_vec4.h
> +++ b/src/mesa/drivers/dri/i965/brw_ir_vec4.h
> @@ -49,6 +49,7 @@ public:
>     src_reg(struct brw_reg reg);
>
>     bool equals(const src_reg &r) const;
> +   bool negative_equals(const src_reg &r) const;
>
>     src_reg(class vec4_visitor *v, const struct glsl_type *type);
>     src_reg(class vec4_visitor *v, const struct glsl_type *type, int size);
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> index ef2fd40..d5286c2 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
> @@ -328,6 +328,49 @@ src_reg::equals(const src_reg &r) const
>  }
>
>  bool
> +src_reg::negative_equals(const src_reg &r) const
> +{
> +   if (file != r.file)
> +      return false;
> +
> +   if (file == IMM) {
> +      if (!(reg == r.reg &&
> +            reg_offset == r.reg_offset &&
> +            type == r.type &&
> +            negate == r.negate &&
> +            abs == r.abs &&
> +            swizzle == r.swizzle &&
> +            !reladdr && !r.reladdr))

I would have applied DeMorgan's Law and made this a series of ORs.

> +         return false;
> +
> +      switch (fixed_hw_reg.type) {

I don't think we keep fixed_hw_reg.type in sync with src_reg's type.
(Another reason to move towards a brw_reg-based register model)

Looking at the constructors for immediate, this appears to be the
case. Just changing this to switch (type) should do the trick.

> +      case BRW_REGISTER_TYPE_F:
> +         return memcmp(&fixed_hw_reg, &r.fixed_hw_reg,
> +                       sizeof(fixed_hw_reg) - sizeof(fixed_hw_reg.dw1)) == 0 &&
> +                fixed_hw_reg.dw1.f == -r.fixed_hw_reg.dw1.f;

I don't think you need the memcmp. For immediates, we really just use
the fixed_hw_reg for the immediate storage itself and none of the
other metadata.

> +
> +      case BRW_REGISTER_TYPE_D:
> +         return memcmp(&fixed_hw_reg, &r.fixed_hw_reg,
> +                       sizeof(fixed_hw_reg) - sizeof(fixed_hw_reg.dw1)) == 0 &&
> +                fixed_hw_reg.dw1.d == -r.fixed_hw_reg.dw1.d;
> +
> +      default:
> +         return false;
> +      }
> +   } else {
> +      return reg == r.reg &&
> +             reg_offset == r.reg_offset &&
> +             type == r.type &&
> +             negate != r.negate &&
> +             abs == r.abs &&
> +             swizzle == r.swizzle &&
> +             !reladdr && !r.reladdr &&
> +             memcmp(&fixed_hw_reg, &r.fixed_hw_reg,
> +                    sizeof(fixed_hw_reg)) == 0;

Indent these to match reg == ...

I think the function does what it advertises. I just don't think that
happens to be the thing you really want. See next patch's reply.


More information about the mesa-dev mailing list