re PR target/24914 (gcc fails when built with --with-cpu=ep9312 --with-fpu=maverick)
authorRichard Earnshaw <rearnsha@arm.com>
Fri, 18 Nov 2005 17:59:37 +0000 (17:59 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Fri, 18 Nov 2005 17:59:37 +0000 (17:59 +0000)
PR target/24914
* arm.c (arm_hard_regno_mode_ok): Co-processor registers aren't ok
when not generating code to use that co-processor.

From-SVN: r107187

gcc/ChangeLog
gcc/config/arm/arm.c

index 82b5cb84148445d487ef609803e0de0976280d65..031402b5d186e46dc0bf6b2af866735ed6516c48 100644 (file)
@@ -1,3 +1,9 @@
+2005-11-18  Richard Earnshaw  <richard.earnshaw@arm.com>
+
+       PR target/24914
+       * arm.c (arm_hard_regno_mode_ok): Co-processor registers aren't ok
+       when not generating code to use that co-processor.
+
 2005-11-18  James A. Morrison  <phython@gcc.gnu.org>
 
        * tree-flow.h (reserve_phi_args_for_new_edge, create_phi_node,
index b2fad5634e1c4f431bdb4ccca463ca0496a381a7..6165545ae4f6f8c152be5db27ac6ad314ebc083d 100644 (file)
@@ -11818,7 +11818,9 @@ int
 arm_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
 {
   if (GET_MODE_CLASS (mode) == MODE_CC)
-    return regno == CC_REGNUM || regno == VFPCC_REGNUM;
+    return (regno == CC_REGNUM
+           || (TARGET_HARD_FLOAT && TARGET_VFP
+               && regno == VFPCC_REGNUM));
 
   if (TARGET_THUMB)
     /* For the Thumb we only allow values bigger than SImode in
@@ -11828,7 +11830,8 @@ arm_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
        start of an even numbered register pair.  */
     return (ARM_NUM_REGS (mode) < 2) || (regno < LAST_LO_REGNUM);
 
-  if (IS_CIRRUS_REGNUM (regno))
+  if (TARGET_HARD_FLOAT && TARGET_MAVERICK
+      && IS_CIRRUS_REGNUM (regno))
     /* We have outlawed SI values in Cirrus registers because they
        reside in the lower 32 bits, but SF values reside in the
        upper 32 bits.  This causes gcc all sorts of grief.  We can't
@@ -11836,7 +11839,8 @@ arm_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
        get sign extended to 64bits-- aldyh.  */
     return (GET_MODE_CLASS (mode) == MODE_FLOAT) || (mode == DImode);
 
-  if (IS_VFP_REGNUM (regno))
+  if (TARGET_HARD_FLOAT && TARGET_VFP
+      && IS_VFP_REGNUM (regno))
     {
       if (mode == SFmode || mode == SImode)
        return TRUE;
@@ -11847,28 +11851,32 @@ arm_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
       return FALSE;
     }
 
-  if (IS_IWMMXT_GR_REGNUM (regno))
-    return mode == SImode;
-
-  if (IS_IWMMXT_REGNUM (regno))
-    return VALID_IWMMXT_REG_MODE (mode);
+  if (TARGET_REALLY_IWMMXT)
+    {
+      if (IS_IWMMXT_GR_REGNUM (regno))
+       return mode == SImode;
 
+      if (IS_IWMMXT_REGNUM (regno))
+       return VALID_IWMMXT_REG_MODE (mode);
+    }
+  
   /* We allow any value to be stored in the general registers.
      Restrict doubleword quantities to even register pairs so that we can
      use ldrd.  */
   if (regno <= LAST_ARM_REGNUM)
     return !(TARGET_LDRD && GET_MODE_SIZE (mode) > 4 && (regno & 1) != 0);
 
-  if (   regno == FRAME_POINTER_REGNUM
+  if (regno == FRAME_POINTER_REGNUM
       || regno == ARG_POINTER_REGNUM)
     /* We only allow integers in the fake hard registers.  */
     return GET_MODE_CLASS (mode) == MODE_INT;
 
   /* The only registers left are the FPA registers
      which we only allow to hold FP values.  */
-  return GET_MODE_CLASS (mode) == MODE_FLOAT
-    && regno >= FIRST_FPA_REGNUM
-    && regno <= LAST_FPA_REGNUM;
+  return (TARGET_HARD_FLOAT && TARGET_FPA
+         && GET_MODE_CLASS (mode) == MODE_FLOAT
+         && regno >= FIRST_FPA_REGNUM
+         && regno <= LAST_FPA_REGNUM);
 }
 
 int