sh.opt (mfixed-range): New option.
authorKaz Kojima <kkojima@gcc.gnu.org>
Thu, 22 May 2008 22:23:54 +0000 (22:23 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Thu, 22 May 2008 22:23:54 +0000 (22:23 +0000)
* config/sh/sh.opt (mfixed-range): New option.
* config/sh/sh-protos.h (sh_fix_range): Declare.
* config/sh/sh.c (sh_fix_range): New function.
* config/sh/sh.h (sh_fixed_range_str): Declare.
(OVERRIDE_OPTIONS): Call sh_fix_range if sh_fixed_range_str
is not empty.
* doc/invoke.texi (SH Options): Document -mfixed-range.

From-SVN: r135779

gcc/ChangeLog
gcc/config/sh/sh-protos.h
gcc/config/sh/sh.c
gcc/config/sh/sh.h
gcc/config/sh/sh.opt
gcc/doc/invoke.texi

index 68a04067cacd40d88c0e2e00814e05b51007ec9e..116fb9691092329e6708a4f368203ad9d9038f9a 100644 (file)
@@ -1,3 +1,13 @@
+2008-05-22  Kaz Kojima  <kkojima@gcc.gnu.org>
+
+       * config/sh/sh.opt (mfixed-range): New option.
+       * config/sh/sh-protos.h (sh_fix_range): Declare.
+       * config/sh/sh.c (sh_fix_range): New function.
+       * config/sh/sh.h (sh_fixed_range_str): Declare.
+       (OVERRIDE_OPTIONS): Call sh_fix_range if sh_fixed_range_str
+       is not empty.
+       * doc/invoke.texi (SH Options): Document -mfixed-range.
+
 2008-05-22  Kai Tietz  <kai.tietz@onevision.com>
 
        * config/i386/sol2-10.h (SUBTARGET_RETURN_IN_MEMORY): Undefine
index 9e1a48823543e1e110e21d9798231729b8b35c47..a03c624d660fa87e86feedf9a637fcc5acc6682e 100644 (file)
@@ -173,6 +173,7 @@ extern enum reg_class sh_secondary_reload (bool, rtx, enum reg_class,
                                           struct secondary_reload_info *);
 extern int sh2a_get_function_vector_number (rtx);
 extern int sh2a_is_function_vector_call (rtx);
+extern void sh_fix_range (const char *);
 
 #endif /* ! GCC_SH_PROTOS_H */
 
index a41783de91bf9d68ccab9636115f4f5f3d2faffb..3af0ee8cff12119a7fb102cc21b59bb263b70d0a 100644 (file)
@@ -7973,6 +7973,68 @@ initial_elimination_offset (int from, int to)
   else
     return total_auto_space;
 }
+
+/* Parse the -mfixed-range= option string.  */
+void
+sh_fix_range (const char *const_str)
+{
+  int i, first, last;
+  char *str, *dash, *comma;
+  
+  /* str must be of the form REG1'-'REG2{,REG1'-'REG} where REG1 and
+     REG2 are either register names or register numbers.  The effect
+     of this option is to mark the registers in the range from REG1 to
+     REG2 as ``fixed'' so they won't be used by the compiler.  */
+  
+  i = strlen (const_str);
+  str = (char *) alloca (i + 1);
+  memcpy (str, const_str, i + 1);
+  
+  while (1)
+    {
+      dash = strchr (str, '-');
+      if (!dash)
+       {
+         warning (0, "value of -mfixed-range must have form REG1-REG2");
+         return;
+       }
+      *dash = '\0';
+      comma = strchr (dash + 1, ',');
+      if (comma)
+       *comma = '\0';
+      
+      first = decode_reg_name (str);
+      if (first < 0)
+       {
+         warning (0, "unknown register name: %s", str);
+         return;
+       }
+      
+      last = decode_reg_name (dash + 1);
+      if (last < 0)
+       {
+         warning (0, "unknown register name: %s", dash + 1);
+         return;
+       }
+      
+      *dash = '-';
+      
+      if (first > last)
+       {
+         warning (0, "%s-%s is an empty range", str, dash + 1);
+         return;
+       }
+      
+      for (i = first; i <= last; ++i)
+       fixed_regs[i] = call_used_regs[i] = 1;
+
+      if (!comma)
+       break;
+
+      *comma = ',';
+      str = comma + 1;
+    }
+}
 \f
 /* Insert any deferred function attributes from earlier pragmas.  */
 static void
index 67a6e3923fbd02fcc6e7458bd2eccf6c95740bad..2ff4a81f9b6b3ca7a00e7b4b0a5b6175e743ec57 100644 (file)
@@ -533,6 +533,8 @@ extern enum sh_divide_strategy_e sh_div_strategy;
 
 #define SUBTARGET_OVERRIDE_OPTIONS (void) 0
 
+extern const char *sh_fixed_range_str;
+
 #define OVERRIDE_OPTIONS                                               \
 do {                                                                   \
   int regno;                                                           \
@@ -754,6 +756,9 @@ do {                                                                        \
       if (align_functions < min_align)                                 \
        align_functions = min_align;                                    \
     }                                                                  \
+                                                                       \
+  if (sh_fixed_range_str)                                              \
+    sh_fix_range (sh_fixed_range_str);                                 \
 } while (0)
 \f
 /* Target machine storage layout.  */
index b62530f61003c87395b654cd0be30ddb3ed0c6d6..145e2d504c39857161a2172dc1692363d089f845 100644 (file)
@@ -248,6 +248,10 @@ mdivsi3_libfunc=
 Target RejectNegative Joined Var(sh_divsi3_libfunc) Init("")
 Specify name for 32 bit signed division function
 
+mfixed-range=
+Target RejectNegative Joined Var(sh_fixed_range_str)
+Specify range of registers to make fixed
+
 mfmovd
 Target RejectNegative Mask(FMOVD) Undocumented
 
index 842755d1a24a5014c16bafa8d2d32b78ff954eac..061311fb2603d540967fb44c8461665ff33d05b2 100644 (file)
@@ -748,7 +748,7 @@ See RS/6000 and PowerPC Options.
 -mbigtable  -mfmovd  -mhitachi -mrenesas -mno-renesas -mnomacsave @gol
 -mieee  -mbitops  -misize  -minline-ic_invalidate -mpadstruct  -mspace @gol
 -mprefergot  -musermode -multcost=@var{number} -mdiv=@var{strategy} @gol
--mdivsi3_libfunc=@var{name}  @gol
+-mdivsi3_libfunc=@var{name} -mfixed-range=@var{register-range} @gol
 -madjust-unroll -mindexed-addressing -mgettrcost=@var{number} -mpt-fixed @gol
  -minvalid-symbols}
 
@@ -14090,6 +14090,14 @@ Set the name of the library function used for 32 bit signed division to
 division strategies, and the compiler will still expect the same
 sets of input/output/clobbered registers as if this option was not present.
 
+@item -mfixed-range=@var{register-range}
+@opindex mfixed-range
+Generate code treating the given register range as fixed registers.
+A fixed register is one that the register allocator can not use.  This is
+useful when compiling kernel code.  A register range is specified as
+two registers separated by a dash.  Multiple register ranges can be
+specified separated by a comma.
+
 @item -madjust-unroll
 @opindex madjust-unroll
 Throttle unrolling to avoid thrashing target registers.