OSDN Git Service

* config/m32c/m32c.c (m32c_cannot_change_mode_class): We don't
authordj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Jan 2007 01:16:57 +0000 (01:16 +0000)
committerdj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Jan 2007 01:16:57 +0000 (01:16 +0000)
allow changes to modes which don't fit in those registers.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121199 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/m32c/m32c.c

index 4cf04ef..25223c8 100644 (file)
@@ -1,5 +1,8 @@
 2007-01-25  DJ Delorie  <dj@redhat.com>
 
+       * config/m32c/m32c.c (m32c_cannot_change_mode_class): We don't
+       allow changes to modes which don't fit in those registers.
+
        * reload1.c (choose_reload_regs): Check for invalid subregs before
        computing their locations, not after.
 
index de5f22a..b28d747 100644 (file)
@@ -846,11 +846,19 @@ int
 m32c_cannot_change_mode_class (enum machine_mode from,
                               enum machine_mode to, int rclass)
 {
+  int rn;
 #if DEBUG0
   fprintf (stderr, "cannot change from %s to %s in %s\n",
           mode_name[from], mode_name[to], class_names[rclass]);
 #endif
 
+  /* If the larger mode isn't allowed in any of these registers, we
+     can't allow the change.  */
+  for (rn = 0; rn < FIRST_PSEUDO_REGISTER; rn++)
+    if (class_contents[rclass][0] & (1 << rn))
+      if (! m32c_hard_regno_ok (rn, to))
+       return 1;
+
   if (to == QImode)
     return (class_contents[rclass][0] & 0x1ffa);