+2015-07-15 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ * simplify-rtx.c (simplify_ternary_operation): Add simplification
+ for (!c) != {0,...,0} ? a : b for vector modes.
+
2015-07-15 Paolo Bonzini <bonzini@gnu.org>
Martin Jambor <mjambor@suse.cz>
&& rtx_equal_p (XEXP (op0, 1), op1))))
return op2;
+ /* Convert (!c) != {0,...,0} ? a : b into
+ c != {0,...,0} ? b : a for vector modes. */
+ if (VECTOR_MODE_P (GET_MODE (op1))
+ && GET_CODE (op0) == NE
+ && GET_CODE (XEXP (op0, 0)) == NOT
+ && GET_CODE (XEXP (op0, 1)) == CONST_VECTOR)
+ {
+ rtx cv = XEXP (op0, 1);
+ int nunits = CONST_VECTOR_NUNITS (cv);
+ bool ok = true;
+ for (int i = 0; i < nunits; ++i)
+ if (CONST_VECTOR_ELT (cv, i) != const0_rtx)
+ {
+ ok = false;
+ break;
+ }
+ if (ok)
+ {
+ rtx new_op0 = gen_rtx_NE (GET_MODE (op0),
+ XEXP (XEXP (op0, 0), 0),
+ XEXP (op0, 1));
+ rtx retval = gen_rtx_IF_THEN_ELSE (mode, new_op0, op2, op1);
+ return retval;
+ }
+ }
+
if (COMPARISON_P (op0) && ! side_effects_p (op0))
{
machine_mode cmp_mode = (GET_MODE (XEXP (op0, 0)) == VOIDmode
+2015-07-15 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ * gcc.target/powerpc/vec-cmp-sel.c: New test.
+
2015-07-15 Richard Biener <rguenther@suse.de>
* lib/objc-torture.exp (OBJC_TORTURE_OPTIONS): Remove
--- /dev/null
+/* { dg-do compile { target powerpc64*-*-* } } */
+/* { dg-require-effective-target powerpc_p8vector_ok } */
+/* { dg-options "-maltivec -O2" } */
+/* { dg-final { scan-assembler "vcmpgtsd" } } */
+/* { dg-final { scan-assembler-not "xxlnor" } } */
+
+/* Test code in simplify-rtx.c that converts
+ (!c) != {0,...,0} ? a : b
+ into
+ c != {0,...,0} ? b : a */
+
+#include <altivec.h>
+
+vector signed long long foo () {
+ vector signed long long x = { 25399, -12900 };
+ vector signed long long y = { 12178, -9987 };
+ vector bool long long b = vec_cmpge (x, y);
+ vector signed long long z = vec_sel (y, x, b);
+ return z;
+}