This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Don't set -mfprnd on power5


Off the list, David asked me to check the floating point conversion patches for
various machines to make sure we weren't generating instructions that aren't
implemented for various -mcpu=<cpu> targets.

I discovered that -mcpu=power5 was generating the FRIZ instruciton (and other
rounding instrucitons) that were added in ISA 2.04 (power5+).  This wasn't in
the fp conversion patches I just submitted, but in patches we submitted
earlier.  This patch restricts the (double)(long long) optimization to use FRIZ
to machines with FPRND, and does not set the FPRND flag for -mcpu=power5.

I have bootstraped the compiler with these tests, and done unit tests on a
power5 machine to make sure the FRIZ instruction is not generated.  My unit
test of doing all possible conversions and rounds works fine on the power5
machine.

Is this patch ok to apply?  Note, the patch won't apply cleanly to the target
attributes patch, since the enum got moved to file scope in that patch.

2010-11-03  Michael Meissner  <meissner@linux.vnet.ibm.com>

	* config/rs6000/rs6000.c (rs6000_option_override_internal): Don't
	turn on ISA 2.04 rounding instructions for power5.

	* config/rs6000/rs6000.md (friz): Friz is an ISA 2.04 instruciton,
	not ISA 2.02.

Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 166212)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -2569,7 +2569,8 @@ rs6000_option_override_internal (const c
   /* Masks for instructions set at various powerpc ISAs.  */
   enum {
     ISA_2_1_MASKS = MASK_MFCRF,
-    ISA_2_2_MASKS = (ISA_2_1_MASKS | MASK_POPCNTB | MASK_FPRND),
+    ISA_2_2_MASKS = (ISA_2_1_MASKS | MASK_POPCNTB),
+    ISA_2_4_MASKS = (ISA_2_2_MASKS | MASK_FPRND),
 
     /* For ISA 2.05, do not add MFPGPR, since it isn't in ISA 2.06, and don't
        add ALTIVEC, since in general it isn't a win on power6.  In ISA 2.04,
@@ -2738,7 +2739,9 @@ rs6000_option_override_internal (const c
     target_flags |= (ISA_2_5_MASKS_SERVER & ~target_flags_explicit);
   else if (TARGET_CMPB)
     target_flags |= (ISA_2_5_MASKS_EMBEDDED & ~target_flags_explicit);
-  else if (TARGET_POPCNTB || TARGET_FPRND)
+  else if (TARGET_FPRND)
+    target_flags |= (ISA_2_4_MASKS & ~target_flags_explicit);
+  else if (TARGET_POPCNTB)
     target_flags |= (ISA_2_2_MASKS & ~target_flags_explicit);
   else if (TARGET_ALTIVEC)
     target_flags |= (MASK_PPC_GFXOPT & ~target_flags_explicit);
Index: gcc/config/rs6000/rs6000.md
===================================================================
--- gcc/config/rs6000/rs6000.md	(revision 166212)
+++ gcc/config/rs6000/rs6000.md	(working copy)
@@ -7142,7 +7142,7 @@ (define_insn "fctiwuz_<mode>"
 (define_insn "*friz"
   [(set (match_operand:DF 0 "gpc_reg_operand" "=d")
 	(float:DF (fix:DI (match_operand:DF 1 "gpc_reg_operand" "d"))))]
-  "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT && TARGET_POPCNTB
+  "TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT && TARGET_FPRND
    && !VECTOR_UNIT_VSX_P (DFmode) && flag_unsafe_math_optimizations
    && !flag_trapping_math && TARGET_FRIZ"
   "friz %0,%1"


-- 
Michael Meissner, IBM
5 Technology Place Drive, M/S 2757, Westford, MA 01886-3141, USA
meissner@linux.vnet.ibm.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]