rs6000.h (MEMBER_TYPE_FORCES_BLK): Adjust for e500 doubles.
authorAldy Hernandez <aldyh@redhat.com>
Tue, 26 Oct 2004 17:36:29 +0000 (17:36 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Tue, 26 Oct 2004 17:36:29 +0000 (17:36 +0000)
* config/rs6000/rs6000.h (MEMBER_TYPE_FORCES_BLK): Adjust for e500
doubles.

[[Split portion of a mixed commit.]]

From-SVN: r89592.2

gcc/ChangeLog
gcc/config/rs6000/rs6000.h

index 270f1bdbb4d3a8367d581f4bef0f85714a93616a..9869e4174bd8505a2aa8726dd8aa1f0f1a592116 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-26  Aldy Hernandez  <aldyh@redhat.com>
+
+       * config/rs6000/rs6000.h (MEMBER_TYPE_FORCES_BLK): Adjust for e500
+       doubles.
+
 2004-10-26  Kazu Hirata  <kazu@cs.umass.edu>
 
        * stmt.c (expand_case): Update a comment.
index a64d6827538c5ccd60ed0c2f3ec2a11090e5e64b..50b6ac1cfcc430de6ff190b8b110a9361cf8a59c 100644 (file)
@@ -759,9 +759,13 @@ extern const char *rs6000_warn_altivec_long_switch;
    store_bit_field() will force (subreg:DI (reg:V2SI x))'s to the
    back-end.  Because a single GPR can hold a V2SI, but not a DI, the
    best thing to do is set structs to BLKmode and avoid Severe Tire
-   Damage.  */
+   Damage.
+
+   On e500 v2, DF and DI modes suffer from the same anomaly.  DF can
+   fit into 1, whereas DI still needs two.  */
 #define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) \
-  (TARGET_SPE && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE)
+  ((TARGET_SPE && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE) \
+   || (TARGET_E500_DOUBLE && (MODE) == DFmode))
 
 /* A bit-field declared as `int' forces `int' alignment for the struct.  */
 #define PCC_BITFIELD_TYPE_MATTERS 1