aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i960/i960.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/i960/i960.h')
-rw-r--r--gcc/config/i960/i960.h190
1 files changed, 133 insertions, 57 deletions
diff --git a/gcc/config/i960/i960.h b/gcc/config/i960/i960.h
index fac037bb348..36aa6d9757b 100644
--- a/gcc/config/i960/i960.h
+++ b/gcc/config/i960/i960.h
@@ -24,6 +24,8 @@ Boston, MA 02111-1307, USA. */
/* Note that some other tm.h files may include this one and then override
many of the definitions that relate to assembler syntax. */
+#define MULTILIB_DEFAULTS { "mnumerics" }
+
/* Names to predefine in the preprocessor for this target machine. */
#define CPP_PREDEFINES "-Di960 -Di80960 -DI960 -DI80960 -Acpu(i960) -Amachine(i960)"
@@ -45,7 +47,8 @@ Boston, MA 02111-1307, USA. */
%{mcc:-D__i960CC__ -D__i960_CC__}\
%{mcf:-D__i960CF__ -D__i960_CF__}\
%{!mka:%{!mkb:%{!msa:%{!msb:%{!mmc:%{!mca:\
- %{!mcc:%{!mcf:-D__i960_KB -D__i960KB__ %{mic*:-D__i960KB}}}}}}}}}"
+ %{!mcc:%{!mcf:-D__i960_KB -D__i960KB__ %{mic*:-D__i960KB}}}}}}}}}\
+ %{mlong-double-64:-D__LONG_DOUBLE_64__}"
/* -mic* options make characters signed by default. */
/* Use #if rather than ?: because MIPS C compiler rejects ?: in
@@ -209,6 +212,11 @@ extern int process_pragma ();
#define TARGET_FLAG_OLD_ALIGN 0x8000
#define TARGET_OLD_ALIGN (target_flags & TARGET_FLAG_OLD_ALIGN)
+/* Nonzero if long doubles are to be 64 bits. Useful for soft-float targets
+ if 80 bit long double support is missing. */
+#define TARGET_FLAG_LONG_DOUBLE_64 0x10000
+#define TARGET_LONG_DOUBLE_64 (target_flags & TARGET_FLAG_LONG_DOUBLE_64)
+
extern int target_flags;
/* Macro to define tables used to set the flags.
@@ -221,57 +229,98 @@ extern int target_flags;
am not sure which are real and which aren't. */
#define TARGET_SWITCHES \
- { {"sa", (TARGET_FLAG_K_SERIES|TARGET_FLAG_COMPLEX_ADDR)},\
- {"sb", (TARGET_FLAG_NUMERICS|TARGET_FLAG_K_SERIES| \
- TARGET_FLAG_COMPLEX_ADDR)},\
-/* {"sc", (TARGET_FLAG_NUMERICS|TARGET_FLAG_PROTECTED|\
- TARGET_FLAG_MC|TARGET_FLAG_COMPLEX_ADDR)},*/ \
- {"ka", (TARGET_FLAG_K_SERIES|TARGET_FLAG_COMPLEX_ADDR)},\
- {"kb", (TARGET_FLAG_NUMERICS|TARGET_FLAG_K_SERIES| \
- TARGET_FLAG_COMPLEX_ADDR)},\
-/* {"kc", (TARGET_FLAG_NUMERICS|TARGET_FLAG_PROTECTED|\
- TARGET_FLAG_MC|TARGET_FLAG_COMPLEX_ADDR)},*/ \
- {"ja", (TARGET_FLAG_K_SERIES|TARGET_FLAG_COMPLEX_ADDR)},\
- {"jd", (TARGET_FLAG_K_SERIES|TARGET_FLAG_COMPLEX_ADDR)},\
- {"jf", (TARGET_FLAG_NUMERICS|TARGET_FLAG_K_SERIES| \
- TARGET_FLAG_COMPLEX_ADDR)},\
- {"rp", (TARGET_FLAG_K_SERIES|TARGET_FLAG_COMPLEX_ADDR)},\
- {"mc", (TARGET_FLAG_NUMERICS|TARGET_FLAG_PROTECTED|\
- TARGET_FLAG_MC|TARGET_FLAG_COMPLEX_ADDR)},\
- {"ca", (TARGET_FLAG_C_SERIES|TARGET_FLAG_BRANCH_PREDICT|\
- TARGET_FLAG_CODE_ALIGN|TARGET_FLAG_COMPLEX_ADDR)},\
-/* {"cb", (TARGET_FLAG_NUMERICS|TARGET_FLAG_C_SERIES|\
- TARGET_FLAG_BRANCH_PREDICT|TARGET_FLAG_CODE_ALIGN)},\
- {"cc", (TARGET_FLAG_NUMERICS|TARGET_FLAG_PROTECTED|\
+ { {"sa", (TARGET_FLAG_K_SERIES|TARGET_FLAG_COMPLEX_ADDR), \
+ "Generate SA code"}, \
+ {"sb", (TARGET_FLAG_NUMERICS|TARGET_FLAG_K_SERIES| \
+ TARGET_FLAG_COMPLEX_ADDR), \
+ "Generate SB code"}, \
+/* {"sc", (TARGET_FLAG_NUMERICS|TARGET_FLAG_PROTECTED| \
+ TARGET_FLAG_MC|TARGET_FLAG_COMPLEX_ADDR), \
+ "Generate SC code"}, */ \
+ {"ka", (TARGET_FLAG_K_SERIES|TARGET_FLAG_COMPLEX_ADDR), \
+ "Generate KA code"}, \
+ {"kb", (TARGET_FLAG_NUMERICS|TARGET_FLAG_K_SERIES| \
+ TARGET_FLAG_COMPLEX_ADDR), \
+ "Generate KB code"}, \
+/* {"kc", (TARGET_FLAG_NUMERICS|TARGET_FLAG_PROTECTED| \
+ TARGET_FLAG_MC|TARGET_FLAG_COMPLEX_ADDR), \
+ "Generate KC code"}, */ \
+ {"ja", (TARGET_FLAG_K_SERIES|TARGET_FLAG_COMPLEX_ADDR), \
+ "Generate JA code"}, \
+ {"jd", (TARGET_FLAG_K_SERIES|TARGET_FLAG_COMPLEX_ADDR), \
+ "Generate JD code"}, \
+ {"jf", (TARGET_FLAG_NUMERICS|TARGET_FLAG_K_SERIES| \
+ TARGET_FLAG_COMPLEX_ADDR), \
+ "Generate JF code"}, \
+ {"rp", (TARGET_FLAG_K_SERIES|TARGET_FLAG_COMPLEX_ADDR), \
+ "generate RP code"}, \
+ {"mc", (TARGET_FLAG_NUMERICS|TARGET_FLAG_PROTECTED| \
+ TARGET_FLAG_MC|TARGET_FLAG_COMPLEX_ADDR), \
+ "Generate MC code"}, \
+ {"ca", (TARGET_FLAG_C_SERIES|TARGET_FLAG_BRANCH_PREDICT| \
+ TARGET_FLAG_CODE_ALIGN|TARGET_FLAG_COMPLEX_ADDR),\
+ "Generate CA code"}, \
+/* {"cb", (TARGET_FLAG_NUMERICS|TARGET_FLAG_C_SERIES| \
+ TARGET_FLAG_BRANCH_PREDICT|TARGET_FLAG_CODE_ALIGN),\
+ "Generate CB code"}, \
+ {"cc", (TARGET_FLAG_NUMERICS|TARGET_FLAG_PROTECTED| \
TARGET_FLAG_C_SERIES|TARGET_FLAG_BRANCH_PREDICT|\
- TARGET_FLAG_CODE_ALIGN)}, */ \
- {"cf", (TARGET_FLAG_C_SERIES|TARGET_FLAG_BRANCH_PREDICT|\
- TARGET_FLAG_CODE_ALIGN|TARGET_FLAG_COMPLEX_ADDR)},\
- {"numerics", (TARGET_FLAG_NUMERICS)}, \
- {"soft-float", -(TARGET_FLAG_NUMERICS)}, \
- {"leaf-procedures", TARGET_FLAG_LEAFPROC}, \
- {"no-leaf-procedures",-(TARGET_FLAG_LEAFPROC)}, \
- {"tail-call",TARGET_FLAG_TAILCALL}, \
- {"no-tail-call",-(TARGET_FLAG_TAILCALL)}, \
- {"complex-addr",TARGET_FLAG_COMPLEX_ADDR}, \
- {"no-complex-addr",-(TARGET_FLAG_COMPLEX_ADDR)}, \
- {"code-align",TARGET_FLAG_CODE_ALIGN}, \
- {"no-code-align",-(TARGET_FLAG_CODE_ALIGN)}, \
- {"clean-linkage", (TARGET_FLAG_CLEAN_LINKAGE)}, \
- {"no-clean-linkage", -(TARGET_FLAG_CLEAN_LINKAGE)}, \
- {"ic-compat", TARGET_FLAG_IC_COMPAT2_0}, \
- {"ic2.0-compat", TARGET_FLAG_IC_COMPAT2_0}, \
- {"ic3.0-compat", TARGET_FLAG_IC_COMPAT3_0}, \
- {"asm-compat",TARGET_FLAG_ASM_COMPAT}, \
- {"intel-asm",TARGET_FLAG_ASM_COMPAT}, \
- {"strict-align", TARGET_FLAG_STRICT_ALIGN}, \
- {"no-strict-align", -(TARGET_FLAG_STRICT_ALIGN)}, \
- {"old-align", (TARGET_FLAG_OLD_ALIGN|TARGET_FLAG_STRICT_ALIGN)}, \
- {"no-old-align", -(TARGET_FLAG_OLD_ALIGN|TARGET_FLAG_STRICT_ALIGN)}, \
- {"link-relax", 0}, \
- {"no-link-relax", 0}, \
+ TARGET_FLAG_CODE_ALIGN), \
+ "Generate CC code"}, */ \
+ {"cf", (TARGET_FLAG_C_SERIES|TARGET_FLAG_BRANCH_PREDICT| \
+ TARGET_FLAG_CODE_ALIGN|TARGET_FLAG_COMPLEX_ADDR),\
+ "Generate CF code"}, \
+ {"numerics", (TARGET_FLAG_NUMERICS), \
+ "Use hardware floating point instructions"}, \
+ {"soft-float", -(TARGET_FLAG_NUMERICS), \
+ "Use software floating point"}, \
+ {"leaf-procedures", TARGET_FLAG_LEAFPROC, \
+ "Use alternate leaf function entries"}, \
+ {"no-leaf-procedures", -(TARGET_FLAG_LEAFPROC), \
+ "Do not use alternate leaf function entries"}, \
+ {"tail-call", TARGET_FLAG_TAILCALL, \
+ "Perform tail call optimization"}, \
+ {"no-tail-call", -(TARGET_FLAG_TAILCALL), \
+ "Do not perform tail call optimization"}, \
+ {"complex-addr", TARGET_FLAG_COMPLEX_ADDR, \
+ "Use complex addressing modes"}, \
+ {"no-complex-addr", -(TARGET_FLAG_COMPLEX_ADDR), \
+ "Do not use complex addressing modes"}, \
+ {"code-align", TARGET_FLAG_CODE_ALIGN, \
+ "Align code to 8 byte boundary"}, \
+ {"no-code-align", -(TARGET_FLAG_CODE_ALIGN), \
+ "Do not align code to 8 byte boundary"}, \
+/* {"clean-linkage", (TARGET_FLAG_CLEAN_LINKAGE), \
+ "Force use of prototypes"}, \
+ {"no-clean-linkage", -(TARGET_FLAG_CLEAN_LINKAGE), \
+ "Do not force use of prototypes"}, */ \
+ {"ic-compat", TARGET_FLAG_IC_COMPAT2_0, \
+ "Enable compatibility with iC960 v2.0"}, \
+ {"ic2.0-compat", TARGET_FLAG_IC_COMPAT2_0, \
+ "Enable compatibility with iC960 v2.0"}, \
+ {"ic3.0-compat", TARGET_FLAG_IC_COMPAT3_0, \
+ "Enable compatibility with iC960 v3.0"}, \
+ {"asm-compat", TARGET_FLAG_ASM_COMPAT, \
+ "Enable compatibility with ic960 assembler"}, \
+ {"intel-asm", TARGET_FLAG_ASM_COMPAT, \
+ "Enable compatibility with ic960 assembler"}, \
+ {"strict-align", TARGET_FLAG_STRICT_ALIGN, \
+ "Do not permit unaligned accesses"}, \
+ {"no-strict-align", -(TARGET_FLAG_STRICT_ALIGN), \
+ "Permit unaligned accesses"}, \
+ {"old-align", (TARGET_FLAG_OLD_ALIGN|TARGET_FLAG_STRICT_ALIGN), \
+ "Layout types like Intel's v1.3 gcc"}, \
+ {"no-old-align", -(TARGET_FLAG_OLD_ALIGN|TARGET_FLAG_STRICT_ALIGN), \
+ "Do not layout types like Intel's v1.3 gcc"}, \
+ {"long-double-64", TARGET_FLAG_LONG_DOUBLE_64, \
+ "Use 64 bit long doubles"}, \
+ {"link-relax", 0, \
+ "Enable linker relaxation"}, \
+ {"no-link-relax", 0, \
+ "Do not enable linker relaxation"}, \
SUBTARGET_SWITCHES \
- { "", TARGET_DEFAULT}}
+ { "", TARGET_DEFAULT, \
+ NULL}}
/* This are meant to be redefined in the host dependent files */
#define SUBTARGET_SWITCHES
@@ -312,6 +361,9 @@ extern int target_flags;
flag_signed_char = 1; \
target_flags |= TARGET_FLAG_CLEAN_LINKAGE; \
} \
+ /* ??? See the LONG_DOUBLE_TYPE_SIZE definition below. */ \
+ if (TARGET_LONG_DOUBLE_64) \
+ warning ("The -mlong-double-64 option does not work yet.", 0);\
i960_initialize (); \
}
@@ -356,8 +408,21 @@ extern int target_flags;
/* Width in bits of a pointer. See also the macro `Pmode' defined below. */
#define POINTER_SIZE 32
-/* Width in bits of a long double. Identical to double for now. */
-#define LONG_DOUBLE_TYPE_SIZE 64
+/* Width in bits of a long double. Define to 96, and let
+ ROUND_TYPE_ALIGN adjust the alignment for speed. */
+#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_64 ? 64 : 96)
+
+/* ??? This must be a constant, because real.c and real.h test it with #if. */
+#undef LONG_DOUBLE_TYPE_SIZE
+#define LONG_DOUBLE_TYPE_SIZE 96
+
+/* Define this to set long double type size to use in libgcc2.c, which can
+ not depend on target_flags. */
+#if defined(__LONG_DOUBLE_64__)
+#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64
+#else
+#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 96
+#endif
/* Allocation boundary (in *bits*) for storing pointers in memory. */
#define POINTER_BOUNDARY 32
@@ -924,11 +989,11 @@ extern struct rtx_def *i960_function_arg ();
/* Addressing modes, and classification of registers for them. */
-/* #define HAVE_POST_INCREMENT */
-/* #define HAVE_POST_DECREMENT */
+/* #define HAVE_POST_INCREMENT 0 */
+/* #define HAVE_POST_DECREMENT 0 */
-/* #define HAVE_PRE_DECREMENT */
-/* #define HAVE_PRE_INCREMENT */
+/* #define HAVE_PRE_DECREMENT 0 */
+/* #define HAVE_PRE_INCREMENT 0 */
/* Macros to check register numbers against specific register classes. */
@@ -1114,6 +1179,11 @@ extern struct rtx_def *legitimize_address ();
#define SLOW_BYTE_ACCESS 1
+/* Force sizeof(bool) == 1 to maintain binary compatibility; otherwise, the
+ change in SLOW_BYTE_ACCESS would have changed it to 4. */
+
+#define BOOL_TYPE_SIZE CHAR_TYPE_SIZE
+
/* We assume that the store-condition-codes instructions store 0 for false
and some other value for true. This is the value stored for true. */
@@ -1185,10 +1255,14 @@ extern struct rtx_def *gen_compare_reg ();
that can be non-ldconst operands in rare cases are cost 1. Other constants
have higher costs. */
+/* Must check for OUTER_CODE of SET for power2_operand, because
+ reload_cse_move2add calls us with OUTER_CODE of PLUS to decide when
+ to replace set with add. */
+
#define CONST_COSTS(RTX, CODE, OUTER_CODE) \
case CONST_INT: \
if ((INTVAL (RTX) >= 0 && INTVAL (RTX) < 32) \
- || power2_operand (RTX, VOIDmode)) \
+ || (OUTER_CODE == SET && power2_operand (RTX, VOIDmode))) \
return 0; \
else if (INTVAL (RTX) >= -31 && INTVAL (RTX) < 0) \
return 1; \
@@ -1555,7 +1629,9 @@ extern char *i960_output_ldconst ();
extern char *i960_output_call_insn ();
extern char *i960_output_ret_insn ();
extern char *i960_output_move_double ();
+extern char *i960_output_move_double_zero ();
extern char *i960_output_move_quad ();
+extern char *i960_output_move_quad_zero ();
/* Defined in reload.c, and used in insn-recog.c. */