1 /* Target definitions for PowerPC running Darwin (Mac OS X).
2 Copyright (C) 1997, 2000, 2001 Free Software Foundation, Inc.
3 Contributed by Apple Computer Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
23 #define TARGET_VERSION fprintf (stderr, " (Darwin/PowerPC)");
25 /* The "Darwin ABI" is mostly like AIX, but with some key differences. */
27 #define DEFAULT_ABI ABI_DARWIN
29 /* The object file format is Mach-O. */
31 #define TARGET_OBJECT_FORMAT OBJECT_MACHO
33 /* We're not ever going to do TOCs. */
36 #define TARGET_NO_TOC 1
38 /* Handle #pragma weak and #pragma pack. */
39 #define HANDLE_SYSV_PRAGMA 1
41 /* The Darwin ABI always includes AltiVec, can't be (validly) turned
44 #define SUBTARGET_OVERRIDE_OPTIONS \
45 rs6000_altivec_abi = 1;
47 #define TARGET_OS_CPP_BUILTINS() \
50 builtin_define ("__ppc__"); \
51 builtin_define ("__POWERPC__"); \
52 builtin_define ("__NATURAL_ALIGNMENT__"); \
53 builtin_define ("__MACH__"); \
54 builtin_define ("__APPLE__"); \
58 /* We want -fPIC by default, unless we're using -static to compile for
59 the kernel or some such. */
62 %{static: %{Zdynamic: %e conflicting code gen style switches are used}}\
65 /* Make both r2 and r3 available for allocation. */
69 /* Base register for access to local variables of the function. */
71 #undef FRAME_POINTER_REGNUM
72 #define FRAME_POINTER_REGNUM 30
74 #undef RS6000_PIC_OFFSET_TABLE_REGNUM
75 #define RS6000_PIC_OFFSET_TABLE_REGNUM 31
77 /* Pad the outgoing args area to 16 bytes instead of the usual 8. */
79 #undef STARTING_FRAME_OFFSET
80 #define STARTING_FRAME_OFFSET \
81 (RS6000_ALIGN (current_function_outgoing_args_size, 16) \
82 + RS6000_VARARGS_AREA \
85 #undef STACK_DYNAMIC_OFFSET
86 #define STACK_DYNAMIC_OFFSET(FUNDECL) \
87 (RS6000_ALIGN (current_function_outgoing_args_size, 16) \
88 + (STACK_POINTER_OFFSET))
90 /* These are used by -fbranch-probabilities */
91 #define HOT_TEXT_SECTION_NAME "__TEXT,__text,regular,pure_instructions"
92 #define UNLIKELY_EXECUTED_TEXT_SECTION_NAME \
93 "__TEXT,__text2,regular,pure_instructions"
95 /* Define cutoff for using external functions to save floating point.
96 Currently on Darwin, always use inline stores. */
99 #define FP_SAVE_INLINE(FIRST_REG) ((FIRST_REG) < 64)
101 /* Always use the "debug" register names, they're what the assembler
104 #undef REGISTER_NAMES
105 #define REGISTER_NAMES DEBUG_REGISTER_NAMES
107 /* This outputs NAME to FILE. */
109 #undef RS6000_OUTPUT_BASENAME
110 #define RS6000_OUTPUT_BASENAME(FILE, NAME) \
111 assemble_name (FILE, NAME);
113 /* Globalizing directive for a label. */
115 #define GLOBAL_ASM_OP "\t.globl "
116 #undef TARGET_ASM_GLOBALIZE_LABEL
118 /* This is how to output an internal label prefix. rs6000.c uses this
119 when generating traceback tables. */
120 /* Not really used for Darwin? */
122 #undef ASM_OUTPUT_INTERNAL_LABEL_PREFIX
123 #define ASM_OUTPUT_INTERNAL_LABEL_PREFIX(FILE,PREFIX) \
124 fprintf (FILE, "%s", PREFIX)
126 /* This says how to output an assembler line to define a global common
129 #undef ASM_OUTPUT_ALIGNED_COMMON
130 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
131 do { fputs (".comm ", (FILE)); \
132 RS6000_OUTPUT_BASENAME ((FILE), (NAME)); \
133 fprintf ((FILE), ",%d\n", (SIZE)); } while (0)
135 /* Override the standard rs6000 definition. */
137 #undef ASM_COMMENT_START
138 #define ASM_COMMENT_START ";"
140 /* FP save and restore routines. */
141 #define SAVE_FP_PREFIX "._savef"
142 #define SAVE_FP_SUFFIX ""
143 #define RESTORE_FP_PREFIX "._restf"
144 #define RESTORE_FP_SUFFIX ""
146 /* This is how to output an assembler line that says to advance
147 the location counter to a multiple of 2**LOG bytes using the
148 "nop" instruction as padding. */
150 #define ASM_OUTPUT_ALIGN_WITH_NOP(FILE,LOG) \
155 ASM_OUTPUT_ALIGN (FILE,LOG); \
157 else /* nop == ori r0,r0,0 */ \
158 fprintf (FILE, "\t.align32 %d,0x60000000\n", (LOG)); \
161 /* Generate insns to call the profiler. */
163 #define PROFILE_HOOK(LABEL) output_profile_hook (LABEL)
165 /* Function name to call to do profiling. */
167 #define RS6000_MCOUNT "*mcount"
169 /* Default processor: a G4. */
171 #undef PROCESSOR_DEFAULT
172 #define PROCESSOR_DEFAULT PROCESSOR_PPC7400
174 /* Default target flag settings. Despite the fact that STMW/LMW
175 serializes, it's still a big codesize win to use them. Use FSEL by
178 #undef TARGET_DEFAULT
179 #define TARGET_DEFAULT (MASK_POWERPC | MASK_MULTIPLE | MASK_NEW_MNEMONICS \
182 /* Since Darwin doesn't do TOCs, stub this out. */
184 #define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE) 0
186 /* Unlike most other PowerPC targets, chars are signed, for
187 consistency with other Darwin architectures. */
189 #undef DEFAULT_SIGNED_CHAR
190 #define DEFAULT_SIGNED_CHAR (1)
192 /* Given an rtx X being reloaded into a reg required to be
193 in class CLASS, return the class of reg to actually use.
194 In general this is just CLASS; but on some machines
195 in some cases it is preferable to use a more restrictive class.
197 On the RS/6000, we have to return NO_REGS when we want to reload a
198 floating-point CONST_DOUBLE to force it to be copied to memory.
200 Don't allow R0 when loading the address of, or otherwise furtling with,
203 #undef PREFERRED_RELOAD_CLASS
204 #define PREFERRED_RELOAD_CLASS(X,CLASS) \
205 (((GET_CODE (X) == CONST_DOUBLE \
206 && GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT) \
208 : (GET_MODE_CLASS (GET_MODE (X)) == MODE_INT \
209 && (CLASS) == NON_SPECIAL_REGS) \
211 : (GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == HIGH) \
215 /* Fix for emit_group_load (): force large constants to be pushed via regs. */
216 #define ALWAYS_PUSH_CONSTS_USING_REGS_P 1
218 /* Darwin word-aligns FP doubles but doubleword-aligns 64-bit ints. */
219 #define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
220 (TYPE_MODE (TREE_CODE (TREE_TYPE (FIELD)) == ARRAY_TYPE \
221 ? get_inner_array_type (FIELD) \
222 : TREE_TYPE (FIELD)) == DFmode \
223 ? MIN ((COMPUTED), 32) : (COMPUTED))
225 /* Darwin increases natural record alignment to doubleword if the first
226 field is an FP double while the FP fields remain word aligned. */
227 #define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED) \
228 ((TREE_CODE (STRUCT) == RECORD_TYPE \
229 || TREE_CODE (STRUCT) == UNION_TYPE \
230 || TREE_CODE (STRUCT) == QUAL_UNION_TYPE) \
231 && TYPE_FIELDS (STRUCT) != 0 \
232 && DECL_MODE (TYPE_FIELDS (STRUCT)) == DFmode \
233 ? MAX (MAX ((COMPUTED), (SPECIFIED)), 64) \
234 : (TARGET_ALTIVEC && TREE_CODE (STRUCT) == VECTOR_TYPE) \
235 ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128) \
236 : MAX ((COMPUTED), (SPECIFIED)))
238 /* XXX: Darwin supports neither .quad, or .llong, but it also doesn't
239 support 64 bit PowerPC either, so this just keeps things happy. */
240 #define DOUBLE_INT_ASM_OP "\t.quad\t"
242 /* Get HOST_WIDE_INT and CONST_INT to be 32 bits, for compile time
244 #undef MAX_LONG_TYPE_SIZE
245 #define MAX_LONG_TYPE_SIZE 32
247 /* For binary compatibility with 2.95; Darwin C APIs use bool from
248 stdbool.h, which was an int-sized enum in 2.95. */
249 #define BOOL_TYPE_SIZE INT_TYPE_SIZE
251 #undef REGISTER_TARGET_PRAGMAS
252 #define REGISTER_TARGET_PRAGMAS DARWIN_REGISTER_TARGET_PRAGMAS