|
|
1.1 root 1: /* Target definitions for GNU compiler for mc680x0 running NeXTSTEP
2: Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
3:
4: This file is part of GNU CC.
5:
6: GNU CC is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2, or (at your option)
9: any later version.
10:
11: GNU CC is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GNU CC; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20: #include "m68k/m68k.h"
21: #include "nextstep.h"
22:
23: /* The default -arch flag in the driver */
24: #define DEFAULT_TARGET_ARCH "m68k"
25:
26: #define MACHO_PIC 1
27:
28: #ifndef MACHOPIC_PURE
29: #define MACHOPIC_PURE (flag_pic == 2)
30: #define MACHOPIC_INDIRECT (flag_pic)
31: #define MACHOPIC_JUST_INDIRECT (flag_pic == 1)
32: #endif
33:
34: #define MACHOPIC_FUNCTION_BRANCHES
35:
36: /* See m68k.h. 0407 means 68040 (or 68030 or 68020, with 68881/2). */
37:
38: #define TARGET_DEFAULT 0407
39:
40: #define TARGET_ARCHITECTURE \
41: { { "m68k", 0 }, /* Accept. */ \
42: { "m68030", -01400 }, /* Just -like -m68030. */ \
43: { "m68030", 5 }, \
44: { "m68040", 01007 }} /* Just like -m68040-only. */
45:
46: /* Boundary (in *bits*) on which stack pointer should be aligned. */
47:
48: #undef STACK_BOUNDARY
49: #define STACK_BOUNDARY 32
50:
51: /* NeXT's calling convention is to use the struct-value register
52: passing a pointer to the struct to the function being called. */
53: #undef PCC_STATIC_STRUCT_RETURN
54:
55: /* Names to predefine in the preprocessor for this target machine. */
56:
57: #define CPP_PREDEFINES "-Dmc68000 -Dm68k -DNeXT -Dunix -D__MACH__ -D__BIG_ENDIAN__ -D__ARCHITECTURE__=\"m68k\""
58:
59: /* Every structure or union's size must be a multiple of 2 bytes.
60: (Why isn't this in m68k.h?) */
61:
62: #define STRUCTURE_SIZE_BOUNDARY 16
63: /* This is how to output an assembler line defining a `double' constant. */
64:
65: #undef ASM_OUTPUT_DOUBLE
66: #ifdef REAL_VALUE_TO_TARGET_DOUBLE
67: #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
68: do { \
69: long hex[2]; \
70: REAL_VALUE_TO_TARGET_DOUBLE (VALUE, hex); \
71: if (sizeof (int) == sizeof (long)) \
72: fprintf (FILE, "\t.long 0x%x\n\t.long 0x%x\n", hex[0], hex[1]); \
73: else \
74: fprintf (FILE, "\t.long 0x%lx\n\t.long 0x%lx\n", hex[0], hex[1]); \
75: } while (0)
76: #else
77: #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
78: do { if (REAL_VALUE_ISINF (VALUE)) \
79: { \
80: if (REAL_VALUE_NEGATIVE (VALUE)) \
81: fprintf (FILE, "\t.double 0r-99e999\n"); \
82: else \
83: fprintf (FILE, "\t.double 0r99e999\n"); \
84: } \
85: else \
86: { char dstr[30]; \
87: REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr); \
88: fprintf (FILE, "\t.double 0r%s\n", dstr); \
89: } \
90: } while (0)
91: #endif
92:
93: /* This is how to output an assembler line defining a `float' constant. */
94:
95: #undef ASM_OUTPUT_FLOAT
96: #ifdef REAL_VALUE_TO_TARGET_SINGLE
97: #define ASM_OUTPUT_FLOAT(FILE,VALUE) \
98: do { \
99: long hex; \
100: REAL_VALUE_TO_TARGET_SINGLE (VALUE, hex); \
101: if (sizeof (int) == sizeof (long)) \
102: fprintf (FILE, "\t.long 0x%x\n", hex); \
103: else \
104: fprintf (FILE, "\t.long 0x%lx\n", hex); \
105: } while (0)
106: #else
107: #define ASM_OUTPUT_FLOAT(FILE,VALUE) \
108: do { if (REAL_VALUE_ISINF (VALUE)) \
109: { \
110: if (REAL_VALUE_NEGATIVE (VALUE)) \
111: fprintf (FILE, "\t.single 0r-99e999\n"); \
112: else \
113: fprintf (FILE, "\t.single 0r99e999\n"); \
114: } \
115: else \
116: { char dstr[30]; \
117: REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr); \
118: fprintf (FILE, "\t.single 0r%s\n", dstr); \
119: } \
120: } while (0)
121: #endif
122:
123: #undef ASM_OUTPUT_FLOAT_OPERAND
124: #ifdef REAL_VALUE_TO_TARGET_SINGLE
125: #define ASM_OUTPUT_FLOAT_OPERAND(CODE,FILE,VALUE) \
126: do { \
127: long hex; \
128: REAL_VALUE_TO_TARGET_SINGLE (VALUE, hex); \
129: fprintf (FILE, "#0%c%x", (CODE) == 'f' ? 'b' : 'x', hex); \
130: } while (0)
131: #else
132: #define ASM_OUTPUT_FLOAT_OPERAND(CODE,FILE,VALUE) \
133: do{ \
134: if (CODE != 'f') \
135: { \
136: long l; \
137: REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \
138: if (sizeof (int) == sizeof (long)) \
139: asm_fprintf ((FILE), "%I0x%x", l); \
140: else \
141: asm_fprintf ((FILE), "%I0x%lx", l); \
142: } \
143: else if (REAL_VALUE_ISINF (VALUE)) \
144: { \
145: if (REAL_VALUE_NEGATIVE (VALUE)) \
146: fprintf (FILE, "#0r-99e999"); \
147: else \
148: fprintf (FILE, "#0r99e999"); \
149: } \
150: else \
151: { char dstr[30]; \
152: REAL_VALUE_TO_DECIMAL ((VALUE), "%.9g", dstr); \
153: fprintf (FILE, "#0r%s", dstr); \
154: } \
155: } while (0)
156: #endif
157:
158: #undef ASM_OUTPUT_DOUBLE_OPERAND
159: #ifdef REAL_VALUE_TO_TARGET_DOUBLE
160: #define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE) \
161: do { \
162: long hex[2]; \
163: REAL_VALUE_TO_TARGET_DOUBLE (VALUE, hex); \
164: fprintf (FILE, "#0b%x%08x", hex[0], hex[1]); \
165: } while (0)
166: #else
167: #define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE) \
168: do { if (REAL_VALUE_ISINF (VALUE)) \
169: { \
170: if (REAL_VALUE_NEGATIVE (VALUE)) \
171: fprintf (FILE, "#0r-99e999"); \
172: else \
173: fprintf (FILE, "#0r99e999"); \
174: } \
175: else \
176: { char dstr[30]; \
177: REAL_VALUE_TO_DECIMAL ((VALUE), "%.20g", dstr); \
178: fprintf (FILE, "#0r%s", dstr); \
179: } \
180: } while (0)
181: #endif
182:
183: /* We do not define JUMP_TABLES_IN_TEXT_SECTION, since we wish to keep
184: the text section pure. There is no point in addressing the jump
185: tables using pc relative addressing, since they are not in the text
186: section, so we undefine CASE_VECTOR_PC_RELATIVE. This also
187: causes the compiler to use absolute addresses in the jump table,
188: so we redefine CASE_VECTOR_MODE to be SImode. */
189:
190: #undef CASE_VECTOR_MODE
191: #define CASE_VECTOR_MODE SImode
192: #undef CASE_VECTOR_PC_RELATIVE
193:
194: /* When generating PIC code, jump tables must have 32 bits elements,
195: to support scattered loading in the future. */
196: #undef ASM_OUTPUT_ADDR_DIFF_ELT
197: #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
198: do { fprintf (FILE, "\t.long\tL%u-", (VALUE)); \
199: assemble_name (FILE, (char*)machopic_function_base_name ()); \
200: fprintf (FILE, "\n"); } while (0)
201:
202: /* Make sure jump tables have the same alignment as other pointers. */
203:
204: #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN) \
205: { ASM_OUTPUT_ALIGN (FILE, 1); ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); }
206:
207: /* Don't treat addresses involving labels differently from symbol names.
208: Previously, references to labels generated pc-relative addressing modes
209: while references to symbol names generated absolute addressing modes. */
210:
211: #undef GO_IF_INDEXABLE_BASE(X, ADDR)
212: #define GO_IF_INDEXABLE_BASE(X, ADDR) \
213: { if (LEGITIMATE_BASE_REG_P (X)) goto ADDR; }
214:
215: /* This accounts for the return pc and saved fp on the m68k. */
216:
217: #define OBJC_FORWARDING_STACK_OFFSET 8
218: #define OBJC_FORWARDING_MIN_OFFSET 8
219:
220: /* INITIALIZE_TRAMPOLINE is changed so that it also enables executable
221: stack. The __enable_execute_stack also clears the insn cache. */
222:
223: /* NOTE: part of this is copied from m68k.h */
224: #undef INITIALIZE_TRAMPOLINE
225: #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
226: { \
227: rtx _addr, _func; \
228: emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 2)), TRAMP); \
229: emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 18)), CXT); \
230: emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 22)), FNADDR); \
231: _addr = memory_address (SImode, (TRAMP)); \
232: _func = gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"); \
233: emit_library_call (_func, 0, VOIDmode, 1, _addr, Pmode); \
234: }
235:
236: /* A C expression used to clear the instruction cache from
237: address BEG to address END. On NeXTSTEP this i a system trap. */
238:
239: #define CLEAR_INSN_CACHE(BEG, END) \
240: asm volatile ("trap #2")
241:
242: /* Turn on floating point precision control as default */
243:
244: /* #define DEFAULT_FPPC 1 */
245:
246:
247: #undef SUBTARGET_OVERRIDE_OPTIONS
248: #define SUBTARGET_OVERRIDE_OPTIONS \
249: { extern int flag_dave_indirect; \
250: if (flag_dave_indirect) flag_pic = 2; \
251: if (flag_pic == 2) flag_no_function_cse = 1; }
252:
253:
254: #undef LEGITIMATE_PIC_OPERAND_P
255: #define LEGITIMATE_PIC_OPERAND_P(X) \
256: (! symbolic_operand (X, VOIDmode) \
257: || machopic_operand_p (X) \
258: || ((GET_CODE(X) == SYMBOL_REF) && SYMBOL_REF_FLAG(X)))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.