From 6f3bbf8884791bcc861c995eef3ec73262b71216 Mon Sep 17 00:00:00 2001
From: uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Fri, 19 Jan 2007 08:59:39 +0000
Subject: [PATCH] 	* config/i386/i386.md (*fpatanxf3_i387,
 fpatan_extend<mode>xf3_i387): 	New insn patterns. 	(atan2sf3_1,
 atan2df3_1, atan2xf3_1): Remove insn patterns. 	(atan2xf3): Directly
 generate RTL pattern. 	(atan2<mode>3): Rename from atan2sf3 and atan2df3 and
 macroize insn 	patterns using X87MODEF12 mode macro.  Use
 fpatan_extend<mode>xf3_i387 	and truncate result to requested mode.  Use
 SSE_FLOAT_MODE_P to 	disable patterns for SSE math. 	(atan<mode>2): Rename
 from atansf2 and atandf2 and macroize insn 	patterns using X87MODEF12 mode
 macro.  Use fpatan_extend<mode>xf3_i387 	and truncate result to
 requested mode.  Use SSE_FLOAT_MODE_P to 	disable patterns for SSE math.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120950 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog           |  15 +++++
 gcc/config/i386/i386.md | 141 +++++++++++++++-------------------------
 2 files changed, 68 insertions(+), 88 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9b3d6a32be67..1843e84d2391 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,18 @@
+2007-01-19  Uros Bizjak  <ubizjak@gmail.com>
+
+	* config/i386/i386.md (*fpatanxf3_i387, fpatan_extend<mode>xf3_i387):
+	New insn patterns.
+	(atan2sf3_1, atan2df3_1, atan2xf3_1): Remove insn patterns.
+	(atan2xf3): Directly generate RTL pattern.
+	(atan2<mode>3): Rename from atan2sf3 and atan2df3 and macroize insn
+	patterns using X87MODEF12 mode macro.  Use fpatan_extend<mode>xf3_i387
+	and truncate result to requested mode.  Use SSE_FLOAT_MODE_P to
+	disable patterns for SSE math.
+	(atan<mode>2): Rename from atansf2 and atandf2 and macroize insn
+	patterns using X87MODEF12 mode macro.  Use fpatan_extend<mode>xf3_i387
+	and truncate result to requested mode.  Use SSE_FLOAT_MODE_P to
+	disable patterns for SSE math.
+
 2007-01-19  Alexandre Oliva  <aoliva@redhat.com>
 
 	* libgcc-std.ver: Fix typo in %inherit for GCC_4.3.0.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 0e535ba5b1f5..9766548ef0a9 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -15927,110 +15927,57 @@
   DONE;
 })
 
-(define_insn "atan2df3_1"
-  [(set (match_operand:DF 0 "register_operand" "=f")
-	(unspec:DF [(match_operand:DF 2 "register_operand" "0")
-		    (match_operand:DF 1 "register_operand" "u")]
-		   UNSPEC_FPATAN))
-   (clobber (match_scratch:DF 3 "=1"))]
-  "TARGET_USE_FANCY_MATH_387
-   && (!(TARGET_SSE2 && TARGET_SSE_MATH) || TARGET_MIX_SSE_I387)
-   && flag_unsafe_math_optimizations"
-  "fpatan"
-  [(set_attr "type" "fpspc")
-   (set_attr "mode" "DF")])
-
-(define_expand "atan2df3"
-  [(use (match_operand:DF 0 "register_operand" ""))
-   (use (match_operand:DF 2 "register_operand" ""))
-   (use (match_operand:DF 1 "register_operand" ""))]
-  "TARGET_USE_FANCY_MATH_387
-   && (!(TARGET_SSE2 && TARGET_SSE_MATH) || TARGET_MIX_SSE_I387)
-   && flag_unsafe_math_optimizations"
-{
-  rtx copy = gen_reg_rtx (DFmode);
-  emit_move_insn (copy, operands[1]);
-  emit_insn (gen_atan2df3_1 (operands[0], copy, operands[2]));
-  DONE;
-})
-
-(define_expand "atandf2"
-  [(parallel [(set (match_operand:DF 0 "register_operand" "")
-		   (unspec:DF [(match_dup 2)
-			       (match_operand:DF 1 "register_operand" "")]
-		    UNSPEC_FPATAN))
-	      (clobber (match_scratch:DF 3 ""))])]
-  "TARGET_USE_FANCY_MATH_387
-   && (!(TARGET_SSE2 && TARGET_SSE_MATH) || TARGET_MIX_SSE_I387)
-   && flag_unsafe_math_optimizations"
-{
-  operands[2] = gen_reg_rtx (DFmode);
-  emit_move_insn (operands[2], CONST1_RTX (DFmode));  /* fld1 */
-})
-
-(define_insn "atan2sf3_1"
-  [(set (match_operand:SF 0 "register_operand" "=f")
-        (unspec:SF [(match_operand:SF 2 "register_operand" "0")
-		    (match_operand:SF 1 "register_operand" "u")]
-		   UNSPEC_FPATAN))
-   (clobber (match_scratch:SF 3 "=1"))]
+(define_insn "*fpatanxf3_i387"
+  [(set (match_operand:XF 0 "register_operand" "=f")
+        (unspec:XF [(match_operand:XF 1 "register_operand" "0")
+	            (match_operand:XF 2 "register_operand" "u")]
+	           UNSPEC_FPATAN))
+   (clobber (match_scratch:XF 3 "=2"))]
   "TARGET_USE_FANCY_MATH_387
-   && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387)
    && flag_unsafe_math_optimizations"
   "fpatan"
   [(set_attr "type" "fpspc")
-   (set_attr "mode" "SF")])
-
-(define_expand "atan2sf3"
-  [(use (match_operand:SF 0 "register_operand" ""))
-   (use (match_operand:SF 2 "register_operand" ""))
-   (use (match_operand:SF 1 "register_operand" ""))]
-  "TARGET_USE_FANCY_MATH_387
-   && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387)
-   && flag_unsafe_math_optimizations"
-{
-  rtx copy = gen_reg_rtx (SFmode);
-  emit_move_insn (copy, operands[1]);
-  emit_insn (gen_atan2sf3_1 (operands[0], copy, operands[2]));
-  DONE;
-})
-
-(define_expand "atansf2"
-  [(parallel [(set (match_operand:SF 0 "register_operand" "")
-		   (unspec:SF [(match_dup 2)
-			       (match_operand:SF 1 "register_operand" "")]
-		    UNSPEC_FPATAN))
-	      (clobber (match_scratch:SF 3 ""))])]
-  "TARGET_USE_FANCY_MATH_387
-   && (!TARGET_SSE_MATH || TARGET_MIX_SSE_I387)
-   && flag_unsafe_math_optimizations"
-{
-  operands[2] = gen_reg_rtx (SFmode);
-  emit_move_insn (operands[2], CONST1_RTX (SFmode));  /* fld1 */
-})
+   (set_attr "mode" "XF")])
 
-(define_insn "atan2xf3_1"
+(define_insn "fpatan_extend<mode>xf3_i387"
   [(set (match_operand:XF 0 "register_operand" "=f")
-        (unspec:XF [(match_operand:XF 2 "register_operand" "0")
-	            (match_operand:XF 1 "register_operand" "u")]
+        (unspec:XF [(float_extend:XF
+		      (match_operand:X87MODEF12 1 "register_operand" "0"))
+		    (float_extend:XF
+		      (match_operand:X87MODEF12 2 "register_operand" "u"))]
 	           UNSPEC_FPATAN))
-   (clobber (match_scratch:XF 3 "=1"))]
+   (clobber (match_scratch:XF 3 "=2"))]
   "TARGET_USE_FANCY_MATH_387
+   && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
+       || TARGET_MIX_SSE_I387)
    && flag_unsafe_math_optimizations"
   "fpatan"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")])
 
 (define_expand "atan2xf3"
-  [(use (match_operand:XF 0 "register_operand" ""))
-   (use (match_operand:XF 2 "register_operand" ""))
-   (use (match_operand:XF 1 "register_operand" ""))]
+  [(parallel [(set (match_operand:XF 0 "register_operand" "")
+		   (unspec:XF [(match_operand:XF 2 "register_operand" "")
+			       (match_operand:XF 1 "register_operand" "")]
+			      UNSPEC_FPATAN))
+	      (clobber (match_scratch:XF 3 ""))])]
+  "TARGET_USE_FANCY_MATH_387
+   && flag_unsafe_math_optimizations"
+  "")
+
+(define_expand "atan2<mode>3"
+  [(use (match_operand:X87MODEF12 0 "register_operand" ""))
+   (use (match_operand:X87MODEF12 1 "register_operand" ""))
+   (use (match_operand:X87MODEF12 2 "register_operand" ""))]
   "TARGET_USE_FANCY_MATH_387
+   && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
+       || TARGET_MIX_SSE_I387)
    && flag_unsafe_math_optimizations"
 {
-  rtx copy = gen_reg_rtx (XFmode);
-  emit_move_insn (copy, operands[1]);
-  emit_insn (gen_atan2xf3_1 (operands[0], copy, operands[2]));
+  rtx op0 = gen_reg_rtx (XFmode);
+
+  emit_insn (gen_fpatan_extend<mode>xf3_i387 (op0, operands[2], operands[1]));
+  emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
   DONE;
 })
 
@@ -16038,7 +15985,7 @@
   [(parallel [(set (match_operand:XF 0 "register_operand" "")
 		   (unspec:XF [(match_dup 2)
 			       (match_operand:XF 1 "register_operand" "")]
-		    UNSPEC_FPATAN))
+			      UNSPEC_FPATAN))
 	      (clobber (match_scratch:XF 3 ""))])]
   "TARGET_USE_FANCY_MATH_387
    && flag_unsafe_math_optimizations"
@@ -16047,6 +15994,24 @@
   emit_move_insn (operands[2], CONST1_RTX (XFmode));  /* fld1 */
 })
 
+(define_expand "atan<mode>2"
+  [(use (match_operand:X87MODEF12 0 "register_operand" ""))
+   (use (match_operand:X87MODEF12 1 "register_operand" ""))]
+  "TARGET_USE_FANCY_MATH_387
+   && (!(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)
+       || TARGET_MIX_SSE_I387)
+   && flag_unsafe_math_optimizations"
+{
+  rtx op0 = gen_reg_rtx (XFmode);
+
+  operands[2] = gen_reg_rtx (<MODE>mode);
+  emit_move_insn (operands[2], CONST1_RTX (<MODE>mode));  /* fld1 */
+
+  emit_insn (gen_fpatan_extend<mode>xf3_i387 (op0, operands[2], operands[1]));
+  emit_insn (gen_truncxf<mode>2_i387_noop (operands[0], op0));
+  DONE;
+})
+
 (define_expand "asindf2"
   [(set (match_dup 2)
 	(float_extend:XF (match_operand:DF 1 "register_operand" "")))
-- 
GitLab