loop.c (emit_prefetch_instructions): Do conversion at right place in RTL chain.
authorJan Hubicka <jh@suse.cz>
Fri, 31 Jan 2003 23:34:17 +0000 (00:34 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 31 Jan 2003 23:34:17 +0000 (23:34 +0000)
* loop.c (emit_prefetch_instructions):  Do conversion at right place in
RTL chain.

* combine.c (simplify_set): Reverse order of ragumetns to
REG_CANNOT_CHANGE_MODE_P
* df.c (df_def_record_1): Likewise.
* recog.c (register_operand): Likewise.
* simplify-rtx.c (simplify_subreg): Likewise.
* hard-reg-set.h (REG_CANNOT_CHANGE_MODE_P): Update use of
CANNOT_CHANGE_MODE_CLASS.
* regclass.c (cannot_change_mode_set_regs, invalid_mode_change_p):
Likewise.
* reload.c (push_reload): Likewise.
* alpha.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
* ia64.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
* mips.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
* mips-protos.h (mips_cannot_change_mode_class): Update prototype.
* mips.c (mips_cannot_change_mode_class): Update.
* pa64-regs.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
* rs6000.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
* s390.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
* sh.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
* sh-protos.h (sh_cannot_change_mode_class): Update prototype.
* sh.c (sh_cannot_change_mode_class): Update.
* i386.h (CANNOT_CHANGE_MODE_CLASS): New.
* tm.texi (CANNOT_CHANGE_MODE_CLASS): Update documentation.

From-SVN: r62212

23 files changed:
gcc/ChangeLog
gcc/combine.c
gcc/config/alpha/alpha.h
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/config/ia64/ia64.h
gcc/config/mips/mips-protos.h
gcc/config/mips/mips.c
gcc/config/mips/mips.h
gcc/config/pa/pa64-regs.h
gcc/config/rs6000/rs6000.h
gcc/config/s390/s390.h
gcc/config/sh/sh-protos.h
gcc/config/sh/sh.c
gcc/config/sh/sh.h
gcc/df.c
gcc/doc/tm.texi
gcc/hard-reg-set.h
gcc/loop.c
gcc/recog.c
gcc/regclass.c
gcc/reload.c
gcc/simplify-rtx.c

index 009dcb130414958d301bf444d4d6c25399b2f509..769983ae93a70378887060a4b0a688ec8548639a 100644 (file)
@@ -1,3 +1,32 @@
+Sat Feb  1 00:28:30 CET 2003  Jan Hubicka  <jh@suse.cz>
+
+       * loop.c (emit_prefetch_instructions):  Do conversion at right place in
+       RTL chain.
+
+       * combine.c (simplify_set): Reverse order of ragumetns to
+       REG_CANNOT_CHANGE_MODE_P
+       * df.c (df_def_record_1): Likewise.
+       * recog.c (register_operand): Likewise.
+       * simplify-rtx.c (simplify_subreg): Likewise.
+       * hard-reg-set.h (REG_CANNOT_CHANGE_MODE_P): Update use of
+       CANNOT_CHANGE_MODE_CLASS.
+       * regclass.c (cannot_change_mode_set_regs, invalid_mode_change_p):
+       Likewise.
+       * reload.c (push_reload): Likewise.
+       * alpha.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
+       * ia64.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
+       * mips.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
+       * mips-protos.h (mips_cannot_change_mode_class): Update prototype.
+       * mips.c (mips_cannot_change_mode_class): Update.
+       * pa64-regs.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
+       * rs6000.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
+       * s390.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
+       * sh.h (CANNOT_CHANGE_MODE_CLASS): Update definition.
+       * sh-protos.h (sh_cannot_change_mode_class): Update prototype.
+       * sh.c (sh_cannot_change_mode_class): Update.
+       * i386.h (CANNOT_CHANGE_MODE_CLASS): New.
+       * tm.texi (CANNOT_CHANGE_MODE_CLASS): Update documentation.
+
 2003-01-31  Geoffrey Keating  <geoffk@apple.com>
 
        * config/darwin.h (LINK_COMMAND_SPEC): Update for Nathan's recent
index 90c4482e33a466d9cd7dbf7fe6009fb387bb55e8..d3203fe5a49ed8fc0e71665d4a1247ca8ce5c6a8 100644 (file)
@@ -5238,8 +5238,8 @@ simplify_set (x)
 #ifdef CANNOT_CHANGE_MODE_CLASS
       && ! (GET_CODE (dest) == REG && REGNO (dest) < FIRST_PSEUDO_REGISTER
            && REG_CANNOT_CHANGE_MODE_P (REGNO (dest),
-                                        GET_MODE (src), 
-                                        GET_MODE (SUBREG_REG (src))))
+                                        GET_MODE (SUBREG_REG (src)), 
+                                        GET_MODE (src)))
 #endif
       && (GET_CODE (dest) == REG
          || (GET_CODE (dest) == SUBREG
index 0522ba6c080878e1958821d9668b131cde7ddd55..8824f12f0f78f70ce0ef3c07e0bcfbe54737b97f 100644 (file)
@@ -869,8 +869,9 @@ enum reg_class {
 
 /* Return the class of registers that cannot change mode from FROM to TO.  */
 
-#define CANNOT_CHANGE_MODE_CLASS(FROM, TO) \
-  (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) ? FLOAT_REGS : NO_REGS)
+#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)              \
+  (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO)                  \
+   ? reg_classes_intersect_p (FLOAT_REGS, CLASS) : 0)
 
 /* Define the cost of moving between registers of various classes.  Moving
    between FLOAT_REGS and anything else except float regs is expensive. 
index d70054b069cf9bd5e9eb66ea7ae18a880ebe7d27..edf6d44747eb43b2b53de6df02078450c4afec78 100644 (file)
@@ -10153,7 +10153,6 @@ ix86_expand_int_addcc (operands)
   rtx compare_op;
   rtx val = const0_rtx;
   bool fpcmp = false;
-  rtx pat, clob;
   enum machine_mode mode = GET_MODE (operands[0]);
 
   if (operands[3] != const1_rtx
index 1e38d10d36e32c83fa1b09bd8bd494ff2721cf5e..e46a19f6b3094806d1a0af49923a64ba25713042 100644 (file)
@@ -1558,6 +1558,20 @@ enum reg_class
    || ((CLASS) == SIREG)                                               \
    || ((CLASS) == DIREG))
 
+/* Return a class of registers that cannot change FROM mode to TO mode.
+  
+   x87 registers can't do subreg as all values are reformated to extended
+   precision.  XMM registers does not support with nonzero offsets equal
+   to 4, 8 and 12 otherwise valid for integer registers. Since we can't
+   determine these, prohibit all nonparadoxical subregs changing size.  */
+
+#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)      \
+  (GET_MODE_SIZE (TO) < GET_MODE_SIZE (FROM)           \
+   ? reg_classes_intersect_p (FLOAT_SSE_REGS, (CLASS)) \
+     || MAYBE_MMX_CLASS_P (CLASS)                      \
+   : GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO)                \
+   ? reg_classes_intersect_p (FLOAT_REGS, (CLASS)) : 0)
+
 /* A C statement that adds to CLOBBERS any hard regs the port wishes
    to automatically clobber for all asms.
 
index 3e1f295d73e26c52399e1bd7125e28051fbb8905..835c93faeab9e9dcacd5e1c061b14288e9029350 100644 (file)
@@ -1036,8 +1036,9 @@ enum reg_class
 /* In FP regs, we can't change FP values to integer values and vice
    versa, but we can change e.g. DImode to SImode.  */
 
-#define CANNOT_CHANGE_MODE_CLASS(FROM, TO)     \
-  (GET_MODE_CLASS (FROM) != GET_MODE_CLASS (TO) ? FR_REGS : NO_REGS)
+#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)      \
+  (GET_MODE_CLASS (FROM) != GET_MODE_CLASS (TO)                \
+   ? reg_classes_intersect_p (CLASS, FR_REGS) : 0)
 
 /* A C expression that defines the machine-dependent operand constraint
    letters (`I', `J', `K', .. 'P') that specify particular ranges of
index 902f1bef48b506e466a4a8416b1545e1e59c08ef..75489de623bd102f0e8d18f4d62f98317f2a5204 100644 (file)
@@ -121,8 +121,9 @@ extern int              mips_adjust_insn_length PARAMS ((rtx, int));
 extern enum reg_class  mips_secondary_reload_class PARAMS ((enum reg_class,
                                                             enum machine_mode,
                                                             rtx, int));
-extern enum reg_class  mips_cannot_change_mode_class 
-                         PARAMS ((enum machine_mode, enum machine_mode));
+extern bool            mips_cannot_change_mode_class 
+                         PARAMS ((enum machine_mode, enum machine_mode,
+                                  enum reg_class));
 extern int              mips_class_max_nregs PARAMS ((enum reg_class,
                                                      enum machine_mode));
 extern int              mips_register_move_cost PARAMS ((enum machine_mode,
index a6ad4c0f7ab78867d3c3a7f002c1ffcaf1299e72..bcfc0f65f1be6d6df920b395950f4fa90c0d29df 100644 (file)
@@ -8779,19 +8779,20 @@ function_arg_pass_by_reference (cum, mode, type, named)
    We can't allow 64-bit float registers to change from a 32-bit
    mode to a 64-bit mode.  */
 
-enum reg_class
-mips_cannot_change_mode_class (from, to)
+bool
+mips_cannot_change_mode_class (from, to, class)
      enum machine_mode from, to;
+     enum reg_class class;
 {
   if (GET_MODE_SIZE (from) != GET_MODE_SIZE (to))
     {
       if (TARGET_BIG_ENDIAN)
-        return FP_REGS;
+       return reg_classes_intersect_p (FP_REGS, class);
       if (TARGET_FLOAT64)
-        return HI_AND_FP_REGS;
-      return HI_REG;
+       return reg_classes_intersect_p (HI_AND_FP_REGS, class);
+      return reg_classes_intersect_p (HI_REG, class);
     }
-  return NO_REGS;
+  return false;
 }
 
 /* This function returns the register class required for a secondary
index 24b668b70fef6865a2d8f44869e7d79ae158ce22..e76a7395259fd379600b7fb99e61e65766849c3a 100644 (file)
@@ -2376,8 +2376,8 @@ extern enum reg_class mips_char_to_class[256];
 
 #define CLASS_MAX_NREGS(CLASS, MODE) mips_class_max_nregs (CLASS, MODE)
 
-#define CANNOT_CHANGE_MODE_CLASS(FROM, TO) \
-  mips_cannot_change_mode_class (FROM, TO)
+#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \
+  mips_cannot_change_mode_class (FROM, TO, CLASS)
 \f
 /* Stack layout; function entry, exit and calling.  */
 
index 2d0ebe3d17264b23035dee556f1a916e41d7db85..ced7df737e747fcc347fb2baaf53f42aa89c6bd1 100644 (file)
@@ -240,9 +240,9 @@ enum reg_class { NO_REGS, R1_REGS, GENERAL_REGS, FPUPPER_REGS, FP_REGS,
    we inhibit changes from SImode unless they are to a mode that is
    identical in size.  */
 
-#define CANNOT_CHANGE_MODE_CLASS(FROM, TO)                     \
+#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)              \
   ((FROM) == SImode && GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO)       \
-   ? FP_REGS : NO_REGS)
+   ? reg_classes_intersect_p (CLASS, FP_REGS) : 0)
 
 /* Return the class number of the smallest class containing
    reg number REGNO.  This could be a conditional expression
index a96984d17ba3ebea1839fe0dee94383af3d2b96a..7cfb3ccfdc42c17fabab6842747b330bf8ac8c0e 100644 (file)
@@ -1329,10 +1329,12 @@ enum reg_class
 
 /* Return a class of registers that cannot change FROM mode to TO mode.  */
 
-#define CANNOT_CHANGE_MODE_CLASS(FROM, TO)                              \
-  (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) ? FLOAT_REGS              \
-   : (SPE_VECTOR_MODE (FROM) + SPE_VECTOR_MODE (TO)) == 1 ? GENERAL_REGS \
-   : NO_REGS)
+#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)                      \
+  (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO)                          \
+   ? reg_classes_intersect_p (FLOAT_REGS, CLASS)                       \
+   : (SPE_VECTOR_MODE (FROM) + SPE_VECTOR_MODE (TO)) == 1              \
+   ? reg_classes_intersect_p (GENERAL_REGS, CLASS)                     \
+   : 0)
 
 /* Stack layout; function entry, exit and calling.  */
 
index 1623666cb658562b8f7d86ebf0dc1dc67c244547..3cc731c84f29e1daa1aedf3d9e97af2e55be5ec2 100644 (file)
@@ -374,8 +374,9 @@ do                                                          \
 /* If a 4-byte value is loaded into a FPR, it is placed into the
    *upper* half of the register, not the lower.  Therefore, we
    cannot use SUBREGs to switch between modes in FP registers.  */
-#define CANNOT_CHANGE_MODE_CLASS(FROM, TO)             \
-  (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) ? FP_REGS : NO_REGS)
+#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)              \
+  (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO)                  \
+   ? reg_classes_intersect_p (FP_REGS, CLASS) : 0)
 
 /* Register classes.  */
  
index 535fb30687aa911cd3b407c9f9f26b3855f111ef..f04ab01670925ee1c943efd832fffddb8b9628c0 100644 (file)
@@ -123,8 +123,8 @@ extern int sh_pr_n_sets PARAMS ((void));
 extern int sh_hard_regno_rename_ok PARAMS ((unsigned int, unsigned int));
 extern int sh_cfun_interrupt_handler_p PARAMS ((void));
 extern void sh_initialize_trampoline PARAMS ((rtx, rtx, rtx));
-extern enum reg_class sh_cannot_change_mode_class
-             PARAMS ((enum machine_mode, enum machine_mode));
+extern bool sh_cannot_change_mode_class
+             PARAMS ((enum machine_mode, enum machine_mode, enum reg_class));
 extern void sh_mark_label PARAMS ((rtx, int));
 extern int sh_register_move_cost
   PARAMS ((enum machine_mode mode, enum reg_class, enum reg_class));
index 0d83910974748b0a000bf0a517c6b3a84d5048c1..b1df940dd9d826a5f05ad1e59bc7193c5113c29a 100644 (file)
@@ -8030,24 +8030,25 @@ sh_expand_binop_v2sf (code, op0, op1, op2)
 
 /* Return the class of registers for which a mode change from FROM to TO
    is invalid.  */
-enum reg_class 
-sh_cannot_change_mode_class (from, to)
+bool
+sh_cannot_change_mode_class (from, to, class)
      enum machine_mode from, to;
+     enum reg_class class;
 {
   if (GET_MODE_SIZE (from) != GET_MODE_SIZE (to))
     {
        if (TARGET_LITTLE_ENDIAN)
          {
           if (GET_MODE_SIZE (to) < 8 || GET_MODE_SIZE (from) < 8)
-            return DF_REGS;
+            return reg_classes_intersect_p (DF_REGS, class);
         }
        else
         {
           if (GET_MODE_SIZE (from) < 8)
-            return DF_HI_REGS;
+            return reg_classes_intersect_p (DF_HI_REGS, class);
         }
     }
-  return NO_REGS;
+  return 0;
 }
 
 
index cf8ac7fd910c7ab1ea0f06d32ccc85d929f8ee40..25406a17839ca537f785c0cea9d203d759992683 100644 (file)
@@ -1395,8 +1395,8 @@ extern enum reg_class reg_class_from_letter[];
 /* ??? We need to renumber the internal numbers for the frnn registers
    when in little endian in order to allow mode size changes.  */
 
-#define CANNOT_CHANGE_MODE_CLASS(FROM, TO)                         \
-  sh_cannot_change_mode_class (FROM, TO)
+#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)                          \
+  sh_cannot_change_mode_class (FROM, TO, CLASS)
 \f
 /* Stack layout; function entry, exit and calling.  */
 
index cce6a3c03ecfa0b91cf32a62bbdb1e8b71497e14..c151249a197ccf620ce70a07e0241a69be9b2d89 100644 (file)
--- a/gcc/df.c
+++ b/gcc/df.c
@@ -928,8 +928,8 @@ df_def_record_1 (df, x, bb, insn)
 
 #ifdef CLASS_CANNOT_CHANGE_MODE
   if (GET_CODE (dst) == SUBREG
-      && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (dst),
-                                    GET_MODE (SUBREG_REG (dst))))
+      && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (SUBREG_REG (dst)),
+                                    GET_MODE (dst)))
     flags |= DF_REF_MODE_CHANGE;
 #endif
 
@@ -949,8 +949,8 @@ df_def_record_1 (df, x, bb, insn)
        }
 #ifdef CLASS_CANNOT_CHANGE_MODE
       if (GET_CODE (dst) == SUBREG
-         && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (dst),
-                                        GET_MODE (SUBREG_REG (dst))))
+         && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (SUBREG_REG (dst)),
+                                        GET_MODE (dst)))
         flags |= DF_REF_MODE_CHANGE;
 #endif
       loc = &XEXP (dst, 0);
index 382df86688c9fa2b57cf8d37f47ca7343e569d11..b5cb2404429be11db2b4dc0b36333e4344ce9f48 100644 (file)
@@ -2599,10 +2599,9 @@ should be the maximum value of @code{HARD_REGNO_NREGS (@var{regno},
 This macro helps control the handling of multiple-word values
 in the reload pass.
 
-@item CANNOT_CHANGE_MODE_CLASS(@var{from}, @var{to})
-If defined, a C expression that returns a register class for which
-a change from mode @var{from} to mode @var{to} is invalid, otherwise the
-macro returns @code{NO_REGS}.
+@item CANNOT_CHANGE_MODE_CLASS(@var{from}, @var{to}, @var{class})
+If defined, a C expression that returns nonzero for a @var{class} for which
+a change from mode @var{from} to mode @var{to} is invalid.
 
 For the example, loading 32-bit integer or floating-point objects into
 floating-point registers on the Alpha extends them to 64 bits.
@@ -2612,8 +2611,9 @@ register.  Therefore, @file{alpha.h} defines @code{CANNOT_CHANGE_MODE_CLASS}
 as below:
 
 @example
-#define CANNOT_CHANGE_MODE_CLASS \
-  (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) ? FLOAT_REGS : NO_REGS)
+#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \
+  (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) \
+   ? reg_classes_intersect_p (FLOAT_REGS, (CLASS)) : 0)
 @end example
 @end table
 
index 0574738fbe5fffc7b94cd0147618aada54d14049..53330cf28b7675f3bc85954852e8e85f6ee357a2 100644 (file)
@@ -491,8 +491,6 @@ extern const char * reg_names[FIRST_PSEUDO_REGISTER];
 /* Given a hard REGN a FROM mode and a TO mode, return nonzero if
    REGN cannot change modes between the specified modes.  */
 #define REG_CANNOT_CHANGE_MODE_P(REGN, FROM, TO)                          \
-        (TEST_HARD_REG_BIT                                                \
-          (reg_class_contents[(int) CANNOT_CHANGE_MODE_CLASS (FROM, TO)],  \
-           REGN))
+         CANNOT_CHANGE_MODE_CLASS (FROM, TO, REGNO_REG_CLASS (REGN))
 
 #endif /* ! GCC_HARD_REG_SET_H */
index b366b542445917a921d976dba6030af9de8f6409..4bdef2d0af7711428d3cbc5298006dd0b29492ae 100644 (file)
@@ -4199,7 +4199,15 @@ emit_prefetch_instructions (loop)
                 non-constant INIT_VAL to have the same mode as REG, which
                 in this case we know to be Pmode.  */
              if (GET_MODE (init_val) != Pmode && !CONSTANT_P (init_val))
-               init_val = convert_to_mode (Pmode, init_val, 0);
+               {
+                 rtx seq;
+
+                 start_sequence ();
+                 init_val = convert_to_mode (Pmode, init_val, 0);
+                 seq = get_insns ();
+                 end_sequence ();
+                 loop_insn_emit_before (loop, 0, loop_start, seq);
+               }
              loop_iv_add_mult_emit_before (loop, init_val,
                                            info[i].giv->mult_val,
                                            add_val, reg, 0, loop_start);
index d7618b90305d87d9880f8c235202a80f21c4ee75..34eaeb3273205a608cd7e3cbf12178f7a79ba1af 100644 (file)
@@ -1088,7 +1088,7 @@ register_operand (op, mode)
 #ifdef CANNOT_CHANGE_MODE_CLASS
       if (GET_CODE (sub) == REG
          && REGNO (sub) < FIRST_PSEUDO_REGISTER
-         && REG_CANNOT_CHANGE_MODE_P (REGNO (sub), mode, GET_MODE (sub))
+         && REG_CANNOT_CHANGE_MODE_P (REGNO (sub), GET_MODE (sub), mode)
          && GET_MODE_CLASS (GET_MODE (sub)) != MODE_COMPLEX_INT
          && GET_MODE_CLASS (GET_MODE (sub)) != MODE_COMPLEX_FLOAT)
        return 0;
index ea6c86b6c578e7366f67823fd6b1c90abf45abd4..5481ea2a26f2fe24fcd550952e3d4a45bed5b0ad 100644 (file)
@@ -2633,14 +2633,15 @@ cannot_change_mode_set_regs (used, from, regno)
      unsigned int regno;
 {
   enum machine_mode to;
-  enum reg_class class;
 
   for (to = VOIDmode; to < MAX_MACHINE_MODE; ++to)
     if (REGNO_REG_SET_P (&subregs_of_mode[to], regno))
       {
-        class = CANNOT_CHANGE_MODE_CLASS (from, to);
-        if (class != NO_REGS)
-          IOR_HARD_REG_SET (*used, reg_class_contents [(int) class]);
+       int i;
+       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+          if (! TEST_HARD_REG_BIT (*used, i)
+             && REG_CANNOT_CHANGE_MODE_P (from, to, i))
+           SET_HARD_REG_BIT (*used, i);
       }
 }
 
@@ -2657,8 +2658,7 @@ invalid_mode_change_p (regno, class, from_mode)
 
   for (to_mode = 0; to_mode < NUM_MACHINE_MODES; ++to_mode)
     if (REGNO_REG_SET_P (&subregs_of_mode[(int) to_mode], regno)
-       && reg_classes_intersect_p 
-            (class, CANNOT_CHANGE_MODE_CLASS (from_mode, to_mode)))
+       && CANNOT_CHANGE_MODE_CLASS (from_mode, to_mode, class))
       return 1;
   return 0;
 }
index a16012c651fa1560add4fdd6d409932a4cb15382..46d0d6417df02b41b73bb22c36dbaa8c3ac30b96 100644 (file)
@@ -976,9 +976,7 @@ push_reload (in, out, inloc, outloc, class,
   if (in != 0 && GET_CODE (in) == SUBREG
       && (subreg_lowpart_p (in) || strict_low)
 #ifdef CANNOT_CHANGE_MODE_CLASS
-      && !reg_classes_intersect_p 
-          (class, CANNOT_CHANGE_MODE_CLASS (GET_MODE (SUBREG_REG (in)),
-                                            inmode))
+      && !CANNOT_CHANGE_MODE_CLASS (GET_MODE (SUBREG_REG (in)), inmode, class)
 #endif
       && (CONSTANT_P (SUBREG_REG (in))
          || GET_CODE (SUBREG_REG (in)) == PLUS
@@ -1088,9 +1086,7 @@ push_reload (in, out, inloc, outloc, class,
   if (out != 0 && GET_CODE (out) == SUBREG
       && (subreg_lowpart_p (out) || strict_low)
 #ifdef CANNOT_CHANGE_MODE_CLASS
-      && !reg_classes_intersect_p 
-           (class, CANNOT_CHANGE_MODE_CLASS (GET_MODE (SUBREG_REG (out)),
-                                             outmode))
+      && !CANNOT_CHANGE_MODE_CLASS (GET_MODE (SUBREG_REG (out)), outmode, class)
 #endif
       && (CONSTANT_P (SUBREG_REG (out))
          || strict_low
index 1cef92a211fa3183f51ae8a7f6c609f0ef6f8ce8..d563caeae2ffef178cbf12755c5d123ed94925f8 100644 (file)
@@ -2544,7 +2544,7 @@ simplify_subreg (outermode, op, innermode, byte)
          || ! rtx_equal_function_value_matters)
       && REGNO (op) < FIRST_PSEUDO_REGISTER
 #ifdef CANNOT_CHANGE_MODE_CLASS
-      && ! (REG_CANNOT_CHANGE_MODE_P (REGNO (op), outermode, innermode)
+      && ! (REG_CANNOT_CHANGE_MODE_P (REGNO (op), innermode, outermode)
            && GET_MODE_CLASS (innermode) != MODE_COMPLEX_INT
            && GET_MODE_CLASS (innermode) != MODE_COMPLEX_FLOAT)
 #endif