altivec.md (VNEG iterator): New iterator for VNEGW/VNEGD instructions.
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Tue, 24 May 2016 23:19:08 +0000 (23:19 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Tue, 24 May 2016 23:19:08 +0000 (23:19 +0000)
[gcc]
2016-05-24  Michael Meissner  <meissner@linux.vnet.ibm.com>

* config/rs6000/altivec.md (VNEG iterator): New iterator for
VNEGW/VNEGD instructions.
(p9_neg<mode>2): New insns for ISA 3.0 VNEGW/VNEGD.
(neg<mode>2): Add expander for V2DImode added in ISA 2.06, and
support for ISA 3.0 VNEGW/VNEGD instructions.

[gcc/testsuite]
2016-05-24  Michael Meissner  <meissner@linux.vnet.ibm.com>

* gcc.target/powerpc/p9-vneg.c: New test for ISA 3.0 VNEGW/VNEGD
instructions.

From-SVN: r236679

gcc/ChangeLog
gcc/config/rs6000/altivec.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/p9-vneg.c [new file with mode: 0644]

index 57e9ba14d4a60c67d28b27e25d3fbd14e64f7b8e..8b0a5043c9507e1bcd482b8a993689a5eec8419c 100644 (file)
@@ -1,3 +1,11 @@
+2016-05-24  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       * config/rs6000/altivec.md (VNEG iterator): New iterator for
+       VNEGW/VNEGD instructions.
+       (p9_neg<mode>2): New insns for ISA 3.0 VNEGW/VNEGD.
+       (neg<mode>2): Add expander for V2DImode added in ISA 2.06, and
+       support for ISA 3.0 VNEGW/VNEGD instructions.
+
 2016-05-24  Cesar Philippidis  <cesar@codesourcery.com>
 
        * gimplify.c (omp_notice_variable): Use zero-length arrays for data
index 03ae1d94ce04a565217ff90169afba77f4168cfb..4397cbcb005750e161ceef2ffce23a39b20bd180 100644 (file)
 (define_mode_attr VP_small_lc [(V2DI "v4si") (V4SI "v8hi") (V8HI "v16qi")])
 (define_mode_attr VU_char [(V2DI "w") (V4SI "h") (V8HI "b")])
 
+;; Vector negate
+(define_mode_iterator VNEG [V4SI V2DI])
+
 ;; Vector move instructions.
 (define_insn "*altivec_mov<mode>"
   [(set (match_operand:VM2 0 "nonimmediate_operand" "=Z,v,v,*Y,*r,*r,v,v,*r")
   DONE;
 })
 
+(define_insn "*p9_neg<mode>2"
+  [(set (match_operand:VNEG 0 "altivec_register_operand" "=v")
+       (neg:VNEG (match_operand:VNEG 1 "altivec_register_operand" "v")))]
+  "TARGET_P9_VECTOR"
+  "vneg<VI_char> %0,%1"
+  [(set_attr "type" "vecsimple")])
+
 (define_expand "neg<mode>2"
-  [(use (match_operand:VI 0 "register_operand" ""))
-   (use (match_operand:VI 1 "register_operand" ""))]
-  "TARGET_ALTIVEC"
-  "
+  [(set (match_operand:VI2 0 "register_operand" "")
+       (neg:VI2 (match_operand:VI2 1 "register_operand" "")))]
+  "<VI_unit>"
 {
-  rtx vzero;
+  if (!TARGET_P9_VECTOR || (<MODE>mode != V4SImode && <MODE>mode != V2DImode))
+    {
+      rtx vzero;
 
-  vzero = gen_reg_rtx (GET_MODE (operands[0]));
-  emit_insn (gen_altivec_vspltis<VI_char> (vzero, const0_rtx));
-  emit_insn (gen_sub<mode>3 (operands[0], vzero, operands[1])); 
-  
-  DONE;
-}")
+      vzero = gen_reg_rtx (GET_MODE (operands[0]));
+      emit_move_insn (vzero, CONST0_RTX (<MODE>mode));
+      emit_insn (gen_sub<mode>3 (operands[0], vzero, operands[1]));
+      DONE;
+    }
+})
 
 (define_expand "udot_prod<mode>"
   [(set (match_operand:V4SI 0 "register_operand" "=v")
index bb082a177ced45d05eac794609250dfc2dbb319a..c5c1e3b57725081ed946063fee9843aa0b718ad5 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-24  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       * gcc.target/powerpc/p9-vneg.c: New test for ISA 3.0 VNEGW/VNEGD
+       instructions.
+
 2016-05-24  Cesar Philippidis  <cesar@codesourcery.com>
 
        * c-c++-common/goacc/data-clause-duplicate-1.c: Adjust test.
diff --git a/gcc/testsuite/gcc.target/powerpc/p9-vneg.c b/gcc/testsuite/gcc.target/powerpc/p9-vneg.c
new file mode 100644 (file)
index 0000000..10041c9
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile { target { powerpc64*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-options "-mcpu=power9 -O2" } */
+
+/* Verify P9 vector negate instructions.  */
+
+vector long long v2di_neg (vector long long a) { return -a; }
+vector int v4si_neg (vector int a) { return -a; }
+
+/* { dg-final { scan-assembler "vnegd" } } */
+/* { dg-final { scan-assembler "vnegw" } } */