]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
arm-protos.h (arm_modes_tieable_p): Declare.
authorRichard Sandiford <richard.sandiford@linaro.org>
Thu, 29 Sep 2011 15:03:06 +0000 (15:03 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 29 Sep 2011 15:03:06 +0000 (15:03 +0000)
gcc/
* config/arm/arm-protos.h (arm_modes_tieable_p): Declare.
* config/arm/arm.h (MODES_TIEABLE_P): Use it.
* config/arm/arm.c (arm_modes_tieable_p): New function.  Allow
NEON vector and structure modes to be tied.

From-SVN: r179355

gcc/ChangeLog
gcc/config/arm/arm-protos.h
gcc/config/arm/arm.c
gcc/config/arm/arm.h

index 71f9b59a2a755ada70510d4a18eecc72c0e8e9eb..5a1d1012a2c086b799b496435535f1264f91e09d 100644 (file)
@@ -1,3 +1,10 @@
+2011-09-29  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * config/arm/arm-protos.h (arm_modes_tieable_p): Declare.
+       * config/arm/arm.h (MODES_TIEABLE_P): Use it.
+       * config/arm/arm.c (arm_modes_tieable_p): New function.  Allow
+       NEON vector and structure modes to be tied.
+
 2011-09-29  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * graphite-scop-detection.c (make_close_phi_nodes_unique):  New
index 9030e96052eff6cbba82199a463e6412d0eff8dd..23a29c6639b376167082066738f22a2b618d6d83 100644 (file)
@@ -46,6 +46,7 @@ extern void arm_output_fn_unwind (FILE *, bool);
 extern bool arm_vector_mode_supported_p (enum machine_mode);
 extern bool arm_small_register_classes_for_mode_p (enum machine_mode);
 extern int arm_hard_regno_mode_ok (unsigned int, enum machine_mode);
+extern bool arm_modes_tieable_p (enum machine_mode, enum machine_mode);
 extern int const_ok_for_arm (HOST_WIDE_INT);
 extern int const_ok_for_op (HOST_WIDE_INT, enum rtx_code);
 extern int arm_split_constant (RTX_CODE, enum machine_mode, rtx,
index e730881f40b732c54a61f8a2207f0a653d5a3580..51614396da4de4ec58b2f76a8e48627011ffca77 100644 (file)
@@ -18260,6 +18260,29 @@ arm_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
          && regno <= LAST_FPA_REGNUM);
 }
 
+/* Implement MODES_TIEABLE_P.  */
+
+bool
+arm_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
+{
+  if (GET_MODE_CLASS (mode1) == GET_MODE_CLASS (mode2))
+    return true;
+
+  /* We specifically want to allow elements of "structure" modes to
+     be tieable to the structure.  This more general condition allows
+     other rarer situations too.  */
+  if (TARGET_NEON
+      && (VALID_NEON_DREG_MODE (mode1)
+         || VALID_NEON_QREG_MODE (mode1)
+         || VALID_NEON_STRUCT_MODE (mode1))
+      && (VALID_NEON_DREG_MODE (mode2)
+         || VALID_NEON_QREG_MODE (mode2)
+         || VALID_NEON_STRUCT_MODE (mode2)))
+    return true;
+
+  return false;
+}
+
 /* For efficiency and historical reasons LO_REGS, HI_REGS and CC_REGS are
    not used in arm mode.  */
 
index a76988efac877747809ca949e34cf276b1d72a08..993e3a07874b2527997495e4c7cd8d1cc9e1d1fc 100644 (file)
@@ -975,12 +975,7 @@ extern int arm_arch_thumb_hwdiv;
 #define HARD_REGNO_MODE_OK(REGNO, MODE)                                        \
   arm_hard_regno_mode_ok ((REGNO), (MODE))
 
-/* Value is 1 if it is a good idea to tie two pseudo registers
-   when one has mode MODE1 and one has mode MODE2.
-   If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
-   for any hard reg, then this must be 0 for correct output.  */
-#define MODES_TIEABLE_P(MODE1, MODE2)  \
-  (GET_MODE_CLASS (MODE1) == GET_MODE_CLASS (MODE2))
+#define MODES_TIEABLE_P(MODE1, MODE2) arm_modes_tieable_p (MODE1, MODE2)
 
 #define VALID_IWMMXT_REG_MODE(MODE) \
  (arm_vector_mode_supported_p (MODE) || (MODE) == DImode)