From: Ian Romanick <ian.d.roman...@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.roman...@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)) + return false; + + switch (fixed_hw_reg.type) { + 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; + + 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; + } +} + +bool vec4_visitor::opt_vector_float() { bool progress = false; -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev