From 70a39602ab762d1cd7a1b34b9895598c81112fe0 Mon Sep 17 00:00:00 2001 From: Ira Rosen Date: Mon, 22 Aug 2005 08:13:18 +0000 Subject: [PATCH] altivec.md (xorv4sf3): New. * config/rs6000/altivec.md (xorv4sf3): New. (negv4sf2, neg2): Likewise. From-SVN: r103335 --- gcc/ChangeLog | 5 ++++ gcc/config/rs6000/altivec.md | 42 +++++++++++++++++++++++++++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/vect/vect-22.c | 27 ++++++++++++++++++- 4 files changed, 78 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ab5bb6a022e..968c435ca8b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-08-22 Ira Rosen + + * config/rs6000/altivec.md (xorv4sf3): New. + (negv4sf2, neg2): Likewise. + 2005-08-21 H.J. Lu PR target/23485 diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index 02524355703..9016b0d09a0 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -1039,6 +1039,14 @@ "vxor %0,%1,%2" [(set_attr "type" "vecsimple")]) +(define_insn "xorv4sf3" + [(set (match_operand:V4SF 0 "register_operand" "=v") + (xor:V4SF (match_operand:V4SF 1 "register_operand" "v") + (match_operand:V4SF 2 "register_operand" "v")))] + "TARGET_ALTIVEC" + "vxor %0,%1,%2" + [(set_attr "type" "vecsimple")]) + (define_insn "one_cmpl2" [(set (match_operand:VI 0 "register_operand" "=v") (not:VI (match_operand:VI 1 "register_operand" "v")))] @@ -2161,3 +2169,37 @@ "TARGET_ALTIVEC" "vperm %0,%1,%2,%3" [(set_attr "type" "vecperm")]) + +(define_expand "neg2" + [(use (match_operand:VI 0 "register_operand" "")) + (use (match_operand:VI 1 "register_operand" ""))] + "TARGET_ALTIVEC" + " +{ + rtx vzero; + + vzero = gen_reg_rtx (GET_MODE (operands[0])); + emit_insn (gen_altivec_vspltis (vzero, const0_rtx)); + emit_insn (gen_sub3 (operands[0], vzero, operands[1])); + + DONE; +}") + +(define_expand "negv4sf2" + [(use (match_operand:V4SF 0 "register_operand" "")) + (use (match_operand:V4SF 1 "register_operand" ""))] + "TARGET_ALTIVEC" + " +{ + rtx neg0; + + /* Generate [-0.0, -0.0, -0.0, -0.0]. */ + neg0 = gen_reg_rtx (V4SFmode); + emit_insn (gen_altivec_vspltisw_v4sf (neg0, constm1_rtx)); + emit_insn (gen_altivec_vslw_v4sf (neg0, neg0, neg0)); + + /* XOR */ + emit_insn (gen_xorv4sf3 (operands[0], neg0, operands[1])); + + DONE; +}") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1fb2989b716..518c6a00496 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-08-22 Ira Rosen + + * gcc.dg/vect/vect-22.c: Add test for float. All four loops + are vectorizable. + 2005-08-21 Tobias Schl"uter * d_lines_1.f, d_lines_2.f, d_lines_3.f, d_lines_4.f, diff --git a/gcc/testsuite/gcc.dg/vect/vect-22.c b/gcc/testsuite/gcc.dg/vect/vect-22.c index f15a4ff50fc..af46e8216ed 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-22.c +++ b/gcc/testsuite/gcc.dg/vect/vect-22.c @@ -42,6 +42,17 @@ main1 () 1,1,0,0,1,0,1,0, 1,1,0,0,1,0,1,0}; + float fa[N]; + float fb[N] = + {1,1,0,0,1,0,1,0, + 1,1,0,0,1,0,1,0, + 1,1,0,0,1,0,1,0, + 1,1,0,0,1,0,1,0, + 1,1,0,0,1,0,1,0, + 1,1,0,0,1,0,1,0, + 1,1,0,0,1,0,1,0, + 1,1,0,0,1,0,1,0}; + /* Check ints. */ for (i = 0; i < N; i++) @@ -84,6 +95,20 @@ main1 () abort (); } + /* Check floats. */ + + for (i = 0; i < N; i++) + { + fa[i] = -fb[i]; + } + + /* check results: */ + for (i = 0; i