aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Edelsohn <dje.gcc@gmail.com>2016-01-20 19:39:08 +0000
committerDavid Edelsohn <dje.gcc@gmail.com>2016-01-20 19:39:08 +0000
commit95db4c81927910593dbc8cea83916bb124d00737 (patch)
tree81b01f670cd495b1beb1406013ac7fe4e6fb2f14
parentb46f683542ef6bde2b6cb49557ee868b99ec1b72 (diff)
PR target/68609
* config/rs6000/rs6000.c (rs6000_emit_swsqrt): Add vector sqrt domain check. * config/rs6000/vector.md (sqrt<mode>2): Call rs6000_emit_swsqrt for V4SFmode. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@232632 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/rs6000/rs6000.c17
-rw-r--r--gcc/config/rs6000/vector.md11
3 files changed, 32 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d976bd99b85..ee05d496695 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2016-01-20 David Edelsohn <dje.gcc@gmail.com>
+
+ PR target/68609
+ * config/rs6000/rs6000.c (rs6000_emit_swsqrt): Add vector sqrt
+ domain check.
+ * config/rs6000/vector.md (sqrt<mode>2): Call rs6000_emit_swsqrt
+ for V4SFmode.
+
2016-01-20 Richard Henderson <rth@redhat.com>
PR bootstrap/69343
@@ -43,7 +51,7 @@
(pc_or_label_operand): New predicate.
* config/m68k/m68k.md: Add new peephole2 patterns for GTU/LEU
tests for small integers that are 2^n - 1.
-
+
2016-01-20 Jonathan Wakely <jwakely@redhat.com>
* doc/invoke.texi (Options Summary): Add '.' after @xref.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index c589118a797..539446ce45f 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -32904,10 +32904,19 @@ rs6000_emit_swsqrt (rtx dst, rtx src, bool recip)
if (!recip)
{
rtx zero = force_reg (mode, CONST0_RTX (mode));
- rtx target = emit_conditional_move (e, GT, src, zero, mode,
- e, zero, mode, 0);
- if (target != e)
- emit_move_insn (e, target);
+
+ if (mode == SFmode)
+ {
+ rtx target = emit_conditional_move (e, GT, src, zero, mode,
+ e, zero, mode, 0);
+ if (target != e)
+ emit_move_insn (e, target);
+ }
+ else
+ {
+ rtx cond = gen_rtx_GT (VOIDmode, e, zero);
+ rs6000_emit_vector_cond_expr (e, e, zero, cond, src, zero);
+ }
}
/* g = sqrt estimate. */
diff --git a/gcc/config/rs6000/vector.md b/gcc/config/rs6000/vector.md
index 7eca7ce9755..02fb3e3d12f 100644
--- a/gcc/config/rs6000/vector.md
+++ b/gcc/config/rs6000/vector.md
@@ -270,7 +270,16 @@
[(set (match_operand:VEC_F 0 "vfloat_operand" "")
(sqrt:VEC_F (match_operand:VEC_F 1 "vfloat_operand" "")))]
"VECTOR_UNIT_VSX_P (<MODE>mode)"
- "")
+{
+ if (<MODE>mode == V4SFmode
+ && !optimize_function_for_size_p (cfun)
+ && flag_finite_math_only && !flag_trapping_math
+ && flag_unsafe_math_optimizations)
+ {
+ rs6000_emit_swsqrt (operands[0], operands[1], 0);
+ DONE;
+ }
+})
(define_expand "rsqrte<mode>2"
[(set (match_operand:VEC_F 0 "vfloat_operand" "")