mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-08 09:26:58 +08:00
sparc.h (ASM_CPU_SPEC): Pass -Av9a for v8plus, ultrasparc.
* sparc/sparc.h (ASM_CPU_SPEC): Pass -Av9a for v8plus, ultrasparc. (TARGET_OPTIONS): Add -malign-loops=, -malign-jumps=, -malign-functions=. (sparc_align_{loops,jumps,funcs}_string): Declare. (sparc_align_{loops,jumps,funcs}): Declare. (DEFAULT_SPARC_ALIGN_FUNCS): New macro. (FUNCTION_BOUNDARY): Use sparc_align_funcs. (STACK_BIAS): Define. (SPARC_SIMM*_P): Cast to unsigned HOST_WIDE_INT first, then perform test. (SPARC_SETHI_P): New macro. (CONST_OK_FOR_LETTER_P): Use it. (ASM_OUTPUT_ALIGN_CODE): Define. (ASM_OUTPUT_LOOP_ALIGN): Define. * sparc.h (ASM_COMMENT_START): Define. * sparc/sparc.h (ASM_OUTPUT_{FLOAT,DOUBLE,LONG_DOUBLE}): Print ascii form as well. From-SVN: r15708
This commit is contained in:
parent
96987e9648
commit
1ccfa253c9
@ -1,6 +1,5 @@
|
|||||||
/* Definitions of target machine for GNU compiler, for Sun SPARC.
|
/* Definitions of target machine for GNU compiler, for Sun SPARC.
|
||||||
Copyright (C) 1987, 88, 89, 92, 94, 95, 96, 1997 Free Software Foundation,
|
Copyright (C) 1987, 88, 89, 92, 94-6, 1997 Free Software Foundation, Inc.
|
||||||
Inc.
|
|
||||||
Contributed by Michael Tiemann (tiemann@cygnus.com).
|
Contributed by Michael Tiemann (tiemann@cygnus.com).
|
||||||
64 bit SPARC V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
|
64 bit SPARC V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
|
||||||
at Cygnus Support.
|
at Cygnus Support.
|
||||||
@ -174,9 +173,9 @@ Unrecognized value in TARGET_CPU_DEFAULT.
|
|||||||
%{mf930:-Asparclite} %{mf934:-Asparclite} \
|
%{mf930:-Asparclite} %{mf934:-Asparclite} \
|
||||||
%{mcpu=sparclite:-Asparclite} \
|
%{mcpu=sparclite:-Asparclite} \
|
||||||
%{mcpu=f930:-Asparclite} %{mcpu=f934:-Asparclite} \
|
%{mcpu=f930:-Asparclite} %{mcpu=f934:-Asparclite} \
|
||||||
%{mcpu=v8plus:-Av9} \
|
%{mcpu=v8plus:-Av9a} \
|
||||||
%{mcpu=v9:-Av9} \
|
%{mcpu=v9:-Av9} \
|
||||||
%{mcpu=ultrasparc:-Av9} \
|
%{mcpu=ultrasparc:-Av9a} \
|
||||||
%{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:%(asm_default)}}}}}}} \
|
%{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:%(asm_default)}}}}}}} \
|
||||||
"
|
"
|
||||||
|
|
||||||
@ -515,10 +514,13 @@ extern enum processor_type sparc_cpu;
|
|||||||
#define TARGET_OPTIONS { { "short-data-", &m88k_short_data } } */
|
#define TARGET_OPTIONS { { "short-data-", &m88k_short_data } } */
|
||||||
|
|
||||||
#define TARGET_OPTIONS \
|
#define TARGET_OPTIONS \
|
||||||
{ \
|
{ \
|
||||||
{"cpu=", &sparc_select[1].string}, \
|
{"cpu=", &sparc_select[1].string}, \
|
||||||
{"tune=", &sparc_select[2].string}, \
|
{"tune=", &sparc_select[2].string}, \
|
||||||
SUBTARGET_OPTIONS \
|
{"align-loops=", &sparc_align_loops_string }, \
|
||||||
|
{"align-jumps=", &sparc_align_jumps_string }, \
|
||||||
|
{"align-functions=", &sparc_align_funcs_string }, \
|
||||||
|
SUBTARGET_OPTIONS \
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is meant to be redefined in target specific files. */
|
/* This is meant to be redefined in target specific files. */
|
||||||
@ -534,6 +536,18 @@ struct sparc_cpu_select
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern struct sparc_cpu_select sparc_select[];
|
extern struct sparc_cpu_select sparc_select[];
|
||||||
|
|
||||||
|
/* Variables to record values the user passes. */
|
||||||
|
extern char *sparc_align_loops_string;
|
||||||
|
extern char *sparc_align_jumps_string;
|
||||||
|
extern char *sparc_align_funcs_string;
|
||||||
|
/* Parsed values as a power of two. */
|
||||||
|
extern int sparc_align_loops;
|
||||||
|
extern int sparc_align_jumps;
|
||||||
|
extern int sparc_align_funcs;
|
||||||
|
|
||||||
|
#define DEFAULT_SPARC_ALIGN_FUNCS \
|
||||||
|
(sparc_cpu == PROCESSOR_ULTRASPARC ? 5 : 2)
|
||||||
|
|
||||||
/* target machine storage layout */
|
/* target machine storage layout */
|
||||||
|
|
||||||
@ -610,7 +624,7 @@ extern struct sparc_cpu_select sparc_select[];
|
|||||||
(TARGET_ARCH64 ? (((LOC)+15) & ~15) : (((LOC)+7) & ~7))
|
(TARGET_ARCH64 ? (((LOC)+15) & ~15) : (((LOC)+7) & ~7))
|
||||||
|
|
||||||
/* Allocation boundary (in *bits*) for the code of a function. */
|
/* Allocation boundary (in *bits*) for the code of a function. */
|
||||||
#define FUNCTION_BOUNDARY 32
|
#define FUNCTION_BOUNDARY (1 << (sparc_align_funcs + 3))
|
||||||
|
|
||||||
/* Alignment of field after `int : 0' in a structure. */
|
/* Alignment of field after `int : 0' in a structure. */
|
||||||
/* ??? Should this be based on TARGET_INT64? */
|
/* ??? Should this be based on TARGET_INT64? */
|
||||||
@ -912,6 +926,9 @@ extern int sparc_mode_class[];
|
|||||||
/* The stack bias (amount by which the hardware register is offset by). */
|
/* The stack bias (amount by which the hardware register is offset by). */
|
||||||
#define SPARC_STACK_BIAS (TARGET_STACK_BIAS ? 2047 : 0)
|
#define SPARC_STACK_BIAS (TARGET_STACK_BIAS ? 2047 : 0)
|
||||||
|
|
||||||
|
/* Is stack biased? */
|
||||||
|
#define STACK_BIAS SPARC_STACK_BIAS
|
||||||
|
|
||||||
/* Base register for access to local variables of the function. */
|
/* Base register for access to local variables of the function. */
|
||||||
#define FRAME_POINTER_REGNUM 30
|
#define FRAME_POINTER_REGNUM 30
|
||||||
|
|
||||||
@ -1178,17 +1195,19 @@ extern char leaf_reg_remap[];
|
|||||||
`L' is used for the range of constants supported by the movcc insns.
|
`L' is used for the range of constants supported by the movcc insns.
|
||||||
`M' is used for the range of constants supported by the movrcc insns. */
|
`M' is used for the range of constants supported by the movrcc insns. */
|
||||||
|
|
||||||
#define SPARC_SIMM10_P(X) ((unsigned HOST_WIDE_INT) ((X) + 0x200) < 0x400)
|
#define SPARC_SIMM10_P(X) ((unsigned HOST_WIDE_INT) (X) + 0x200 < 0x400)
|
||||||
#define SPARC_SIMM11_P(X) ((unsigned HOST_WIDE_INT) ((X) + 0x400) < 0x800)
|
#define SPARC_SIMM11_P(X) ((unsigned HOST_WIDE_INT) (X) + 0x400 < 0x800)
|
||||||
#define SPARC_SIMM13_P(X) ((unsigned HOST_WIDE_INT) ((X) + 0x1000) < 0x2000)
|
#define SPARC_SIMM13_P(X) ((unsigned HOST_WIDE_INT) (X) + 0x1000 < 0x2000)
|
||||||
/* 10 and 11 bit immediates are only used for a few specific insns.
|
/* 10 and 11 bit immediates are only used for a few specific insns.
|
||||||
SMALL_INT is used throughout the port so we continue to use it. */
|
SMALL_INT is used throughout the port so we continue to use it. */
|
||||||
#define SMALL_INT(X) (SPARC_SIMM13_P (INTVAL (X)))
|
#define SMALL_INT(X) (SPARC_SIMM13_P (INTVAL (X)))
|
||||||
|
#define SPARC_SETHI_P(X) \
|
||||||
|
(((unsigned HOST_WIDE_INT) (X) & ~(unsigned HOST_WIDE_INT) 0xfffffc00) == 0)
|
||||||
|
|
||||||
#define CONST_OK_FOR_LETTER_P(VALUE, C) \
|
#define CONST_OK_FOR_LETTER_P(VALUE, C) \
|
||||||
((C) == 'I' ? SPARC_SIMM13_P (VALUE) \
|
((C) == 'I' ? SPARC_SIMM13_P (VALUE) \
|
||||||
: (C) == 'J' ? (VALUE) == 0 \
|
: (C) == 'J' ? (VALUE) == 0 \
|
||||||
: (C) == 'K' ? ((VALUE) & 0x3ff) == 0 \
|
: (C) == 'K' ? SPARC_SETHI_P (VALUE) \
|
||||||
: (C) == 'L' ? SPARC_SIMM11_P (VALUE) \
|
: (C) == 'L' ? SPARC_SIMM11_P (VALUE) \
|
||||||
: (C) == 'M' ? SPARC_SIMM10_P (VALUE) \
|
: (C) == 'M' ? SPARC_SIMM10_P (VALUE) \
|
||||||
: 0)
|
: 0)
|
||||||
@ -2737,6 +2756,12 @@ extern struct rtx_def *legitimize_pic_address ();
|
|||||||
|
|
||||||
#define ASM_FILE_START(file)
|
#define ASM_FILE_START(file)
|
||||||
|
|
||||||
|
/* A C string constant describing how to begin a comment in the target
|
||||||
|
assembler language. The compiler assumes that the comment will end at
|
||||||
|
the end of the line. */
|
||||||
|
|
||||||
|
#define ASM_COMMENT_START "!"
|
||||||
|
|
||||||
/* Output to assembler file text saying following lines
|
/* Output to assembler file text saying following lines
|
||||||
may contain character constants, extra white space, comments, etc. */
|
may contain character constants, extra white space, comments, etc. */
|
||||||
|
|
||||||
@ -2843,34 +2868,51 @@ extern struct rtx_def *legitimize_pic_address ();
|
|||||||
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
|
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
|
||||||
sprintf (LABEL, "*%s%d", PREFIX, NUM)
|
sprintf (LABEL, "*%s%d", PREFIX, NUM)
|
||||||
|
|
||||||
/* This is how to output an assembler line defining a `double' constant. */
|
/* This is how to output an assembler line defining a `float' constant.
|
||||||
|
We always have to use a .long pseudo-op to do this because the native
|
||||||
|
SVR4 ELF assembler is buggy and it generates incorrect values when we
|
||||||
|
try to use the .float pseudo-op instead. */
|
||||||
|
|
||||||
#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
|
#define ASM_OUTPUT_FLOAT(FILE,VALUE) \
|
||||||
{ \
|
{ \
|
||||||
long t[2]; \
|
long t; \
|
||||||
REAL_VALUE_TO_TARGET_DOUBLE ((VALUE), t); \
|
char str[30]; \
|
||||||
fprintf (FILE, "\t%s\t0x%lx\n\t%s\t0x%lx\n", \
|
REAL_VALUE_TO_TARGET_SINGLE ((VALUE), t); \
|
||||||
ASM_LONG, t[0], ASM_LONG, t[1]); \
|
REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", str); \
|
||||||
|
fprintf (FILE, "\t%s\t0x%lx %s ~%s\n", ASM_LONG, t, \
|
||||||
|
ASM_COMMENT_START, str); \
|
||||||
|
} \
|
||||||
|
|
||||||
|
/* This is how to output an assembler line defining a `double' constant.
|
||||||
|
We always have to use a .long pseudo-op to do this because the native
|
||||||
|
SVR4 ELF assembler is buggy and it generates incorrect values when we
|
||||||
|
try to use the .float pseudo-op instead. */
|
||||||
|
|
||||||
|
#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
|
||||||
|
{ \
|
||||||
|
long t[2]; \
|
||||||
|
char str[30]; \
|
||||||
|
REAL_VALUE_TO_TARGET_DOUBLE ((VALUE), t); \
|
||||||
|
REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", str); \
|
||||||
|
fprintf (FILE, "\t%s\t0x%lx %s ~%s\n", ASM_LONG, t[0], \
|
||||||
|
ASM_COMMENT_START, str); \
|
||||||
|
fprintf (FILE, "\t%s\t0x%lx\n", ASM_LONG, t[1]); \
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is how to output an assembler line defining a `float' constant. */
|
|
||||||
|
|
||||||
#define ASM_OUTPUT_FLOAT(FILE,VALUE) \
|
|
||||||
{ \
|
|
||||||
long t; \
|
|
||||||
REAL_VALUE_TO_TARGET_SINGLE ((VALUE), t); \
|
|
||||||
fprintf (FILE, "\t%s\t0x%lx\n", ASM_LONG, t); \
|
|
||||||
} \
|
|
||||||
|
|
||||||
/* This is how to output an assembler line defining a `long double'
|
/* This is how to output an assembler line defining a `long double'
|
||||||
constant. */
|
constant. */
|
||||||
|
|
||||||
#define ASM_OUTPUT_LONG_DOUBLE(FILE,VALUE) \
|
#define ASM_OUTPUT_LONG_DOUBLE(FILE,VALUE) \
|
||||||
{ \
|
{ \
|
||||||
long t[4]; \
|
long t[4]; \
|
||||||
REAL_VALUE_TO_TARGET_LONG_DOUBLE ((VALUE), t); \
|
char str[30]; \
|
||||||
fprintf (FILE, "\t%s\t0x%lx\n\t%s\t0x%lx\n\t%s\t0x%lx\n\t%s\t0x%lx\n", \
|
REAL_VALUE_TO_TARGET_LONG_DOUBLE ((VALUE), t); \
|
||||||
ASM_LONG, t[0], ASM_LONG, t[1], ASM_LONG, t[2], ASM_LONG, t[3]); \
|
REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", str); \
|
||||||
|
fprintf (FILE, "\t%s\t0x%lx %s ~%s\n", ASM_LONG, t[0], \
|
||||||
|
ASM_COMMENT_START, str); \
|
||||||
|
fprintf (FILE, "\t%s\t0x%lx\n", ASM_LONG, t[1]); \
|
||||||
|
fprintf (FILE, "\t%s\t0x%lx\n", ASM_LONG, t[2]); \
|
||||||
|
fprintf (FILE, "\t%s\t0x%lx\n", ASM_LONG, t[3]); \
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is how to output an assembler line defining an `int' constant. */
|
/* This is how to output an assembler line defining an `int' constant. */
|
||||||
@ -2942,6 +2984,12 @@ do { \
|
|||||||
if ((LOG) != 0) \
|
if ((LOG) != 0) \
|
||||||
fprintf (FILE, "\t.align %d\n", (1<<(LOG)))
|
fprintf (FILE, "\t.align %d\n", (1<<(LOG)))
|
||||||
|
|
||||||
|
#define ASM_OUTPUT_ALIGN_CODE(FILE) \
|
||||||
|
ASM_OUTPUT_ALIGN (FILE, sparc_align_jumps)
|
||||||
|
|
||||||
|
#define ASM_OUTPUT_LOOP_ALIGN(FILE) \
|
||||||
|
ASM_OUTPUT_ALIGN (FILE, sparc_align_loops)
|
||||||
|
|
||||||
#define ASM_OUTPUT_SKIP(FILE,SIZE) \
|
#define ASM_OUTPUT_SKIP(FILE,SIZE) \
|
||||||
fprintf (FILE, "\t.skip %u\n", (SIZE))
|
fprintf (FILE, "\t.skip %u\n", (SIZE))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user