mirror of git://gcc.gnu.org/git/gcc.git
spu.opt (mfixed-range): New option.
* config/spu/spu.opt (mfixed-range): New option. * config/spu/spu.h (spu_fixed_range_string): Declare. * config/spu/spu.c (spu_override_options): Handle -mfixed-range. (fix_range): New function. * doc/invoke.texi (SPU Options): Document -mfixed-range. * testsuite/gcc.target/spu/fixed-range.c: New. * testsuite/gcc.target/spu/fixed-range-bad.c: Ditto. Co-Authored-By: Ben Elliston <bje@au.ibm.com> From-SVN: r119768
This commit is contained in:
parent
8b494895e3
commit
32fb22af5d
|
|
@ -1,3 +1,14 @@
|
||||||
|
2006-12-12 Sa Liu <saliu@de.ibm.com>
|
||||||
|
Ben Elliston <bje@au.ibm.com>
|
||||||
|
|
||||||
|
* config/spu/spu.opt (mfixed-range): New option.
|
||||||
|
* config/spu/spu.h (spu_fixed_range_string): Declare.
|
||||||
|
* config/spu/spu.c (spu_override_options): Handle -mfixed-range.
|
||||||
|
(fix_range): New function.
|
||||||
|
* doc/invoke.texi (SPU Options): Document -mfixed-range.
|
||||||
|
* testsuite/gcc.target/spu/fixed-range.c: New.
|
||||||
|
* testsuite/gcc.target/spu/fixed-range-bad.c: Ditto.
|
||||||
|
|
||||||
2006-12-11 H.J. Lu <hongjiu.lu@intel.com>
|
2006-12-11 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR middle-end/17982
|
PR middle-end/17982
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,7 @@ static unsigned char spu_rtx_costs (rtx x, int code, int outer_code,
|
||||||
static unsigned char spu_function_ok_for_sibcall (tree decl, tree exp);
|
static unsigned char spu_function_ok_for_sibcall (tree decl, tree exp);
|
||||||
static void spu_init_libfuncs (void);
|
static void spu_init_libfuncs (void);
|
||||||
static bool spu_return_in_memory (tree type, tree fntype);
|
static bool spu_return_in_memory (tree type, tree fntype);
|
||||||
|
static void fix_range (const char *);
|
||||||
|
|
||||||
extern const char *reg_names[];
|
extern const char *reg_names[];
|
||||||
rtx spu_compare_op0, spu_compare_op1;
|
rtx spu_compare_op0, spu_compare_op1;
|
||||||
|
|
@ -264,6 +265,9 @@ spu_override_options (void)
|
||||||
|
|
||||||
if (align_functions < 8)
|
if (align_functions < 8)
|
||||||
align_functions = 8;
|
align_functions = 8;
|
||||||
|
|
||||||
|
if (spu_fixed_range_string)
|
||||||
|
fix_range (spu_fixed_range_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle an attribute requiring a FUNCTION_DECL; arguments as in
|
/* Handle an attribute requiring a FUNCTION_DECL; arguments as in
|
||||||
|
|
@ -3574,6 +3578,68 @@ mem_is_padded_component_ref (rtx x)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Parse the -mfixed-range= option string. */
|
||||||
|
static void
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
spu_valid_move (rtx * ops)
|
spu_valid_move (rtx * ops)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
#define OVERRIDE_OPTIONS spu_override_options()
|
#define OVERRIDE_OPTIONS spu_override_options()
|
||||||
|
|
||||||
extern int target_flags;
|
extern int target_flags;
|
||||||
|
extern const char *spu_fixed_range_string;
|
||||||
|
|
||||||
/* Default target_flags if no switches specified. */
|
/* Default target_flags if no switches specified. */
|
||||||
#ifndef TARGET_DEFAULT
|
#ifndef TARGET_DEFAULT
|
||||||
|
|
|
||||||
|
|
@ -52,3 +52,6 @@ mlarge-mem
|
||||||
Target Report RejectNegative Mask(LARGE_MEM)
|
Target Report RejectNegative Mask(LARGE_MEM)
|
||||||
Generate code for 32 bit addressing
|
Generate code for 32 bit addressing
|
||||||
|
|
||||||
|
mfixed-range=
|
||||||
|
Target RejectNegative Joined Var(spu_fixed_range_string)
|
||||||
|
Specify range of registers to make fixed
|
||||||
|
|
|
||||||
|
|
@ -733,7 +733,8 @@ See RS/6000 and PowerPC Options.
|
||||||
@gccoptlist{-mwarn-reloc -merror-reloc @gol
|
@gccoptlist{-mwarn-reloc -merror-reloc @gol
|
||||||
-msafe-dma -munsafe-dma @gol
|
-msafe-dma -munsafe-dma @gol
|
||||||
-mbranch-hints @gol
|
-mbranch-hints @gol
|
||||||
-msmall-mem -mlarge-mem -mstdmain}
|
-msmall-mem -mlarge-mem -mstdmain @gol
|
||||||
|
-mfixed-range=@var{register-range}}
|
||||||
|
|
||||||
@emph{System V Options}
|
@emph{System V Options}
|
||||||
@gccoptlist{-Qy -Qn -YP,@var{paths} -Ym,@var{dir}}
|
@gccoptlist{-Qy -Qn -YP,@var{paths} -Ym,@var{dir}}
|
||||||
|
|
@ -12909,6 +12910,14 @@ With @option{-mstdmain}, GCC will link your program against startup
|
||||||
code that assumes a C99-style interface to @code{main}, including a
|
code that assumes a C99-style interface to @code{main}, including a
|
||||||
local copy of @code{argv} strings.
|
local copy of @code{argv} strings.
|
||||||
|
|
||||||
|
@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.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@node System V Options
|
@node System V Options
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-mfixed-range=1-x" } */
|
||||||
|
/* { dg-error "unknown register name" "" { target spu-*-* } 0 } */
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-mfixed-range=1-20" } */
|
||||||
|
/* { dg-final { scan-assembler "lqd.*21" } } */
|
||||||
|
|
||||||
|
int foo (int i)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue