190075Sobrien/* Target definitions for PowerPC running Darwin (Mac OS X).
2169689Skan   Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
3169689Skan   Free Software Foundation, Inc.
490075Sobrien   Contributed by Apple Computer Inc.
590075Sobrien
6132718Skan   This file is part of GCC.
790075Sobrien
8132718Skan   GCC is free software; you can redistribute it and/or modify it
9132718Skan   under the terms of the GNU General Public License as published
10132718Skan   by the Free Software Foundation; either version 2, or (at your
11132718Skan   option) any later version.
1290075Sobrien
13132718Skan   GCC is distributed in the hope that it will be useful, but WITHOUT
14132718Skan   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15132718Skan   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16132718Skan   License for more details.
1790075Sobrien
18132718Skan   You should have received a copy of the GNU General Public License
19132718Skan   along with GCC; see the file COPYING.  If not, write to the
20169689Skan   Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
21169689Skan   MA 02110-1301, USA.  */
2290075Sobrien
2390075Sobrien#undef  TARGET_VERSION
2490075Sobrien#define TARGET_VERSION fprintf (stderr, " (Darwin/PowerPC)");
2590075Sobrien
2690075Sobrien/* The "Darwin ABI" is mostly like AIX, but with some key differences.  */
2790075Sobrien
2890075Sobrien#define DEFAULT_ABI ABI_DARWIN
2990075Sobrien
30169689Skan#ifdef IN_LIBGCC2
31169689Skan#undef TARGET_64BIT
32169689Skan#ifdef __powerpc64__
33169689Skan#define TARGET_64BIT 1
34169689Skan#else
35169689Skan#define TARGET_64BIT 0
36169689Skan#endif
37169689Skan#endif
38169689Skan
3990075Sobrien/* The object file format is Mach-O.  */
4090075Sobrien
4190075Sobrien#define TARGET_OBJECT_FORMAT OBJECT_MACHO
4290075Sobrien
43169689Skan/* Size of the Obj-C jump buffer.  */
44169689Skan#define OBJC_JBLEN ((TARGET_64BIT) ? (26*2 + 18*2 + 129 + 1) : (26 + 18*2 + 129 + 1))
45169689Skan
4690075Sobrien/* We're not ever going to do TOCs.  */
4790075Sobrien
4890075Sobrien#define TARGET_TOC 0
4990075Sobrien#define TARGET_NO_TOC 1
5090075Sobrien
51169689Skan/* Override the default rs6000 definition.  */
52169689Skan#undef  PTRDIFF_TYPE
53169689Skan#define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int")
54132718Skan
55169689Skan/* Translate config/rs6000/darwin.opt to config/darwin.h.  */
56169689Skan#define TARGET_DYNAMIC_NO_PIC (TARGET_MACHO_DYNAMIC_NO_PIC)
57132718Skan
58117395Skan#define TARGET_OS_CPP_BUILTINS()                \
59117395Skan  do                                            \
60117395Skan    {                                           \
61169689Skan      if (!TARGET_64BIT) builtin_define ("__ppc__");   \
62169689Skan      if (TARGET_64BIT) builtin_define ("__ppc64__");  \
63117395Skan      builtin_define ("__POWERPC__");           \
64117395Skan      builtin_define ("__NATURAL_ALIGNMENT__"); \
65169689Skan      darwin_cpp_builtins (pfile);		\
66117395Skan    }                                           \
67117395Skan  while (0)
6890075Sobrien
69132718Skan
70169689Skan#define SUBTARGET_OVERRIDE_OPTIONS					\
71132718Skando {									\
72169689Skan  /* The Darwin ABI always includes AltiVec, can't be (validly) turned	\
73169689Skan     off.  */								\
74132718Skan  rs6000_altivec_abi = 1;						\
75169689Skan  TARGET_ALTIVEC_VRSAVE = 1;						\
76132718Skan  if (DEFAULT_ABI == ABI_DARWIN)					\
77132718Skan  {									\
78132718Skan    if (MACHO_DYNAMIC_NO_PIC_P)						\
79132718Skan      {									\
80132718Skan        if (flag_pic)							\
81169689Skan            warning (0, "-mdynamic-no-pic overrides -fpic or -fPIC");	\
82132718Skan        flag_pic = 0;							\
83132718Skan      }									\
84132718Skan    else if (flag_pic == 1)						\
85132718Skan      {									\
86132718Skan        flag_pic = 2;							\
87132718Skan      }									\
88132718Skan  }									\
89169689Skan  if (TARGET_64BIT && ! TARGET_POWERPC64)				\
90169689Skan    {									\
91169689Skan      target_flags |= MASK_POWERPC64;					\
92169689Skan      warning (0, "-m64 requires PowerPC64 architecture, enabling");	\
93169689Skan    }									\
94169689Skan  if (flag_mkernel)							\
95169689Skan    {									\
96169689Skan      rs6000_default_long_calls = 1;					\
97169689Skan      target_flags |= MASK_SOFT_FLOAT;					\
98169689Skan    }									\
99169689Skan									\
100169689Skan  /* Make -m64 imply -maltivec.  Darwin's 64-bit ABI includes		\
101169689Skan     Altivec.  */							\
102169689Skan  if (!flag_mkernel && !flag_apple_kext					\
103169689Skan      && TARGET_64BIT							\
104169689Skan      && ! (target_flags_explicit & MASK_ALTIVEC))			\
105169689Skan    target_flags |= MASK_ALTIVEC;					\
106169689Skan									\
107169689Skan  /* Unless the user (not the configurer) has explicitly overridden	\
108169689Skan     it with -mcpu=G3 or -mno-altivec, then 10.5+ targets default to	\
109169689Skan     G4 unless targetting the kernel.  */				\
110169689Skan  if (!flag_mkernel							\
111169689Skan      && !flag_apple_kext						\
112169689Skan      && darwin_macosx_version_min					\
113169689Skan      && strverscmp (darwin_macosx_version_min, "10.5") >= 0		\
114169689Skan      && ! (target_flags_explicit & MASK_ALTIVEC)			\
115169689Skan      && ! rs6000_select[1].string)					\
116169689Skan    {									\
117169689Skan      target_flags |= MASK_ALTIVEC;					\
118169689Skan    }									\
119169689Skan} while(0)
120132718Skan
121169689Skan#define C_COMMON_OVERRIDE_OPTIONS do {					\
122169689Skan  /* On powerpc, __cxa_get_exception_ptr is available starting in the	\
123169689Skan     10.4.6 libstdc++.dylib.  */					\
124169689Skan  if ((! darwin_macosx_version_min					\
125169689Skan       || strverscmp (darwin_macosx_version_min, "10.4.6") < 0)		\
126169689Skan      && flag_use_cxa_get_exception_ptr == 2)				\
127169689Skan    flag_use_cxa_get_exception_ptr = 0;					\
128169689Skan  if (flag_mkernel)							\
129169689Skan    flag_no_builtin = 1;						\
130169689Skan  SUBTARGET_C_COMMON_OVERRIDE_OPTIONS;					\
131169689Skan} while (0)
132169689Skan
133169689Skan/* Darwin has 128-bit long double support in libc in 10.4 and later.
134169689Skan   Default to 128-bit long doubles even on earlier platforms for ABI
135169689Skan   consistency; arithmetic will work even if libc and libm support is
136169689Skan   not available.  */
137169689Skan
138169689Skan#define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128
139169689Skan
140169689Skan
14190075Sobrien/* We want -fPIC by default, unless we're using -static to compile for
14290075Sobrien   the kernel or some such.  */
14390075Sobrien
144117395Skan#define CC1_SPEC "\
145169689Skan  %{g: %{!fno-eliminate-unused-debug-symbols: -feliminate-unused-debug-symbols }} \
146169689Skan  %{static: %{Zdynamic: %e conflicting code gen style switches are used}}\
147169689Skan  %{!mkernel:%{!static:%{!mdynamic-no-pic:-fPIC}}}"
14890075Sobrien
149169689Skan#define DARWIN_ARCH_SPEC "%{m64:ppc64;:ppc}"
150132718Skan
151169689Skan#define DARWIN_SUBARCH_SPEC "			\
152169689Skan %{m64: ppc64}					\
153169689Skan %{!m64:					\
154169689Skan %{mcpu=601:ppc601;				\
155169689Skan   mcpu=603:ppc603;				\
156169689Skan   mcpu=603e:ppc603;				\
157169689Skan   mcpu=604:ppc604;				\
158169689Skan   mcpu=604e:ppc604e;				\
159169689Skan   mcpu=740:ppc750;				\
160169689Skan   mcpu=750:ppc750;				\
161169689Skan   mcpu=G3:ppc750;				\
162169689Skan   mcpu=7400:ppc7400;				\
163169689Skan   mcpu=G4:ppc7400;				\
164169689Skan   mcpu=7450:ppc7450;				\
165169689Skan   mcpu=970:ppc970;				\
166169689Skan   mcpu=power4:ppc970;				\
167169689Skan   mcpu=G5:ppc970;				\
168169689Skan   :ppc}}"
169169689Skan
170169689Skan/* crt2.o is at least partially required for 10.3.x and earlier.  */
171169689Skan#define DARWIN_CRT2_SPEC \
172169689Skan  "%{!m64:%:version-compare(!> 10.4 mmacosx-version-min= crt2.o%s)}"
173169689Skan
174132718Skan#undef SUBTARGET_EXTRA_SPECS
175132718Skan#define SUBTARGET_EXTRA_SPECS			\
176169689Skan  { "darwin_arch", DARWIN_ARCH_SPEC },		\
177169689Skan  { "darwin_crt2", DARWIN_CRT2_SPEC },		\
178169689Skan  { "darwin_subarch", DARWIN_SUBARCH_SPEC },
179132718Skan
180169689Skan/* Output a .machine directive.  */
181169689Skan#undef TARGET_ASM_FILE_START
182169689Skan#define TARGET_ASM_FILE_START rs6000_darwin_file_start
183169689Skan
184169689Skan/* The "-faltivec" option should have been called "-maltivec" all
185169689Skan   along.  -ffix-and-continue and -findirect-data is for compatibility
186169689Skan   for old compilers.  */
187169689Skan
188169689Skan#define SUBTARGET_OPTION_TRANSLATE_TABLE				\
189169689Skan  { "-ffix-and-continue", "-mfix-and-continue" },			\
190169689Skan  { "-findirect-data", "-mfix-and-continue" },				\
191169689Skan  { "-faltivec", "-maltivec -include altivec.h" },			\
192169689Skan  { "-fno-altivec", "-mno-altivec" },					\
193169689Skan  { "-Waltivec-long-deprecated",	"-mwarn-altivec-long" },	\
194146895Skan  { "-Wno-altivec-long-deprecated", "-mno-warn-altivec-long" }
195146895Skan
196169689Skan/* Make both r2 and r13 available for allocation.  */
19790075Sobrien#define FIXED_R2 0
19890075Sobrien#define FIXED_R13 0
19990075Sobrien
20090075Sobrien/* Base register for access to local variables of the function.  */
20190075Sobrien
202169689Skan#undef  HARD_FRAME_POINTER_REGNUM
203169689Skan#define HARD_FRAME_POINTER_REGNUM 30
20490075Sobrien
20596263Sobrien#undef  RS6000_PIC_OFFSET_TABLE_REGNUM
20696263Sobrien#define RS6000_PIC_OFFSET_TABLE_REGNUM 31
20790075Sobrien
20890075Sobrien/* Pad the outgoing args area to 16 bytes instead of the usual 8.  */
20990075Sobrien
21090075Sobrien#undef STARTING_FRAME_OFFSET
21190075Sobrien#define STARTING_FRAME_OFFSET						\
212169689Skan  (FRAME_GROWS_DOWNWARD							\
213169689Skan   ? 0									\
214169689Skan   : (RS6000_ALIGN (current_function_outgoing_args_size, 16)		\
215169689Skan      + RS6000_SAVE_AREA))
21690075Sobrien
21790075Sobrien#undef STACK_DYNAMIC_OFFSET
21890075Sobrien#define STACK_DYNAMIC_OFFSET(FUNDECL)					\
21990075Sobrien  (RS6000_ALIGN (current_function_outgoing_args_size, 16)		\
22090075Sobrien   + (STACK_POINTER_OFFSET))
22190075Sobrien
222132718Skan/* These are used by -fbranch-probabilities */
223132718Skan#define HOT_TEXT_SECTION_NAME "__TEXT,__text,regular,pure_instructions"
224132718Skan#define UNLIKELY_EXECUTED_TEXT_SECTION_NAME \
225169689Skan                              "__TEXT,__unlikely,regular,pure_instructions"
226132718Skan
22790075Sobrien/* Define cutoff for using external functions to save floating point.
22890075Sobrien   Currently on Darwin, always use inline stores.  */
22990075Sobrien
23090075Sobrien#undef	FP_SAVE_INLINE
23190075Sobrien#define FP_SAVE_INLINE(FIRST_REG) ((FIRST_REG) < 64)
23290075Sobrien
233169689Skan/* Darwin uses a function call if everything needs to be saved/restored.  */
234169689Skan#undef WORLD_SAVE_P
235169689Skan#define WORLD_SAVE_P(INFO) ((INFO)->world_save_p)
236169689Skan
237132718Skan/* The assembler wants the alternate register names, but without
238132718Skan   leading percent sign.  */
23990075Sobrien#undef REGISTER_NAMES
240132718Skan#define REGISTER_NAMES							\
241132718Skan{									\
242132718Skan     "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",		\
243132718Skan     "r8",  "r9", "r10", "r11", "r12", "r13", "r14", "r15",		\
244132718Skan    "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",		\
245132718Skan    "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",		\
246132718Skan     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",		\
247132718Skan     "f8",  "f9", "f10", "f11", "f12", "f13", "f14", "f15",		\
248132718Skan    "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",		\
249132718Skan    "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",		\
250132718Skan     "mq",  "lr", "ctr",  "ap",						\
251132718Skan    "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",		\
252132718Skan    "xer",								\
253132718Skan     "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",             \
254132718Skan     "v8",  "v9", "v10", "v11", "v12", "v13", "v14", "v15",             \
255132718Skan    "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",             \
256132718Skan    "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",             \
257132718Skan    "vrsave", "vscr",							\
258169689Skan    "spe_acc", "spefscr",                                               \
259169689Skan    "sfp"								\
260132718Skan}
26190075Sobrien
26290075Sobrien/* This outputs NAME to FILE.  */
26390075Sobrien
26490075Sobrien#undef  RS6000_OUTPUT_BASENAME
26590075Sobrien#define RS6000_OUTPUT_BASENAME(FILE, NAME)	\
266132718Skan    assemble_name (FILE, NAME)
26790075Sobrien
268117395Skan/* Globalizing directive for a label.  */
269117395Skan#undef GLOBAL_ASM_OP
270117395Skan#define GLOBAL_ASM_OP "\t.globl "
271117395Skan#undef TARGET_ASM_GLOBALIZE_LABEL
27290075Sobrien
27390075Sobrien/* This is how to output an internal label prefix.  rs6000.c uses this
27490075Sobrien   when generating traceback tables.  */
27590075Sobrien/* Not really used for Darwin?  */
27690075Sobrien
27790075Sobrien#undef ASM_OUTPUT_INTERNAL_LABEL_PREFIX
27890075Sobrien#define ASM_OUTPUT_INTERNAL_LABEL_PREFIX(FILE,PREFIX)	\
27990075Sobrien  fprintf (FILE, "%s", PREFIX)
28090075Sobrien
28190075Sobrien/* This says how to output an assembler line to define a global common
28290075Sobrien   symbol.  */
283169689Skan#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)			\
284169689Skan  do {									\
285169689Skan    unsigned HOST_WIDE_INT _new_size = SIZE;				\
286169689Skan    fputs (".comm ", (FILE));						\
287169689Skan    RS6000_OUTPUT_BASENAME ((FILE), (NAME));				\
288169689Skan    if (_new_size == 0) _new_size = 1;					\
289169689Skan    fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED"\n", _new_size);	\
290169689Skan  } while (0)
29190075Sobrien
29290075Sobrien/* Override the standard rs6000 definition.  */
29390075Sobrien
29490075Sobrien#undef ASM_COMMENT_START
29590075Sobrien#define ASM_COMMENT_START ";"
29690075Sobrien
29790075Sobrien/* FP save and restore routines.  */
29890075Sobrien#define	SAVE_FP_PREFIX "._savef"
29990075Sobrien#define SAVE_FP_SUFFIX ""
30090075Sobrien#define	RESTORE_FP_PREFIX "._restf"
30190075Sobrien#define RESTORE_FP_SUFFIX ""
30290075Sobrien
303117395Skan/* This is how to output an assembler line that says to advance
304117395Skan   the location counter to a multiple of 2**LOG bytes using the
305117395Skan   "nop" instruction as padding.  */
306117395Skan
307117395Skan#define ASM_OUTPUT_ALIGN_WITH_NOP(FILE,LOG)                   \
308117395Skan  do                                                          \
309117395Skan    {                                                         \
310117395Skan      if ((LOG) < 3)                                          \
311117395Skan        {                                                     \
312117395Skan          ASM_OUTPUT_ALIGN (FILE,LOG);                        \
313117395Skan        }                                                     \
314117395Skan      else /* nop == ori r0,r0,0 */                           \
315117395Skan        fprintf (FILE, "\t.align32 %d,0x60000000\n", (LOG));  \
316117395Skan    } while (0)
317117395Skan
318169689Skan#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
319169689Skan/* This is supported in cctools 465 and later.  The macro test
320169689Skan   above prevents using it in earlier build environments.  */
321169689Skan#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP)          \
322169689Skan  if ((LOG) != 0)                                             \
323169689Skan    {                                                         \
324169689Skan      if ((MAX_SKIP) == 0)                                    \
325169689Skan        fprintf ((FILE), "\t.p2align %d\n", (LOG));           \
326169689Skan      else                                                    \
327169689Skan        fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \
328169689Skan    }
329169689Skan#endif
330169689Skan
33190075Sobrien/* Generate insns to call the profiler.  */
33290075Sobrien
33390075Sobrien#define PROFILE_HOOK(LABEL)   output_profile_hook (LABEL)
33490075Sobrien
33590075Sobrien/* Function name to call to do profiling.  */
33690075Sobrien
33790075Sobrien#define RS6000_MCOUNT "*mcount"
33890075Sobrien
339169689Skan/* Default processor: G4, and G5 for 64-bit.  */
34090075Sobrien
34190075Sobrien#undef PROCESSOR_DEFAULT
34290075Sobrien#define PROCESSOR_DEFAULT  PROCESSOR_PPC7400
343169689Skan#undef PROCESSOR_DEFAULT64
344169689Skan#define PROCESSOR_DEFAULT64  PROCESSOR_POWER4
34590075Sobrien
34690075Sobrien/* Default target flag settings.  Despite the fact that STMW/LMW
347132718Skan   serializes, it's still a big code size win to use them.  Use FSEL by
34890075Sobrien   default as well.  */
34990075Sobrien
35090075Sobrien#undef  TARGET_DEFAULT
35190075Sobrien#define TARGET_DEFAULT (MASK_POWERPC | MASK_MULTIPLE | MASK_NEW_MNEMONICS \
35290075Sobrien                      | MASK_PPC_GFXOPT)
35390075Sobrien
354169689Skan/* Darwin only runs on PowerPC, so short-circuit POWER patterns.  */
355169689Skan#undef  TARGET_POWER
356169689Skan#define TARGET_POWER 0
357169689Skan#undef  TARGET_IEEEQUAD
358169689Skan#define TARGET_IEEEQUAD 0
359169689Skan
36090075Sobrien/* Since Darwin doesn't do TOCs, stub this out.  */
36190075Sobrien
362169689Skan#define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE)  ((void)X, (void)MODE, 0)
36390075Sobrien
36490075Sobrien/* Unlike most other PowerPC targets, chars are signed, for
36590075Sobrien   consistency with other Darwin architectures.  */
36690075Sobrien
36790075Sobrien#undef DEFAULT_SIGNED_CHAR
36890075Sobrien#define DEFAULT_SIGNED_CHAR (1)
36990075Sobrien
370169689Skan/* Given an rtx X being reloaded into a reg required to be
371169689Skan   in class CLASS, return the class of reg to actually use.
37290075Sobrien   In general this is just CLASS; but on some machines
37390075Sobrien   in some cases it is preferable to use a more restrictive class.
374169689Skan
37590075Sobrien   On the RS/6000, we have to return NO_REGS when we want to reload a
37690075Sobrien   floating-point CONST_DOUBLE to force it to be copied to memory.
37790075Sobrien
37890075Sobrien   Don't allow R0 when loading the address of, or otherwise furtling with,
37990075Sobrien   a SYMBOL_REF.  */
38090075Sobrien
38190075Sobrien#undef PREFERRED_RELOAD_CLASS
382132718Skan#define PREFERRED_RELOAD_CLASS(X,CLASS)				\
383169689Skan  ((CONSTANT_P (X)						\
384169689Skan    && reg_classes_intersect_p ((CLASS), FLOAT_REGS))		\
385132718Skan   ? NO_REGS							\
386132718Skan   : ((GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == HIGH)	\
387132718Skan      && reg_class_subset_p (BASE_REGS, (CLASS)))		\
388132718Skan   ? BASE_REGS							\
389132718Skan   : (GET_MODE_CLASS (GET_MODE (X)) == MODE_INT			\
390132718Skan      && (CLASS) == NON_SPECIAL_REGS)				\
391132718Skan   ? GENERAL_REGS						\
392132718Skan   : (CLASS))
39390075Sobrien
39490075Sobrien/* Fix for emit_group_load (): force large constants to be pushed via regs.  */
39590075Sobrien#define ALWAYS_PUSH_CONSTS_USING_REGS_P		1
39690075Sobrien
397132718Skan/* This now supports a natural alignment mode */
39890075Sobrien/* Darwin word-aligns FP doubles but doubleword-aligns 64-bit ints.  */
39990075Sobrien#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
400132718Skan  (TARGET_ALIGN_NATURAL ? (COMPUTED) : \
40190075Sobrien  (TYPE_MODE (TREE_CODE (TREE_TYPE (FIELD)) == ARRAY_TYPE \
40290075Sobrien	      ? get_inner_array_type (FIELD) \
40390075Sobrien	      : TREE_TYPE (FIELD)) == DFmode \
404132718Skan   ? MIN ((COMPUTED), 32) : (COMPUTED)))
40590075Sobrien
40690075Sobrien/* Darwin increases natural record alignment to doubleword if the first
40790075Sobrien   field is an FP double while the FP fields remain word aligned.  */
408132718Skan#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED)			\
409132718Skan  ((TREE_CODE (STRUCT) == RECORD_TYPE					\
410132718Skan    || TREE_CODE (STRUCT) == UNION_TYPE					\
411132718Skan    || TREE_CODE (STRUCT) == QUAL_UNION_TYPE)				\
412132718Skan   && TARGET_ALIGN_NATURAL == 0                         		\
413132718Skan   ? rs6000_special_round_type_align (STRUCT, COMPUTED, SPECIFIED)	\
414169689Skan   : (TREE_CODE (STRUCT) == VECTOR_TYPE					\
415169689Skan      && ALTIVEC_VECTOR_MODE (TYPE_MODE (STRUCT))) 			\
416132718Skan   ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128)          			 \
41790075Sobrien   : MAX ((COMPUTED), (SPECIFIED)))
41896263Sobrien
419169689Skan/* Specify padding for the last element of a block move between
420169689Skan   registers and memory.  FIRST is nonzero if this is the only
421169689Skan   element.  */
422169689Skan#define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \
423169689Skan  (!(FIRST) ? upward : FUNCTION_ARG_PADDING (MODE, TYPE))
424169689Skan
42590075Sobrien/* XXX: Darwin supports neither .quad, or .llong, but it also doesn't
426117395Skan   support 64 bit PowerPC either, so this just keeps things happy.  */
42790075Sobrien#define DOUBLE_INT_ASM_OP "\t.quad\t"
42890075Sobrien
42996263Sobrien/* For binary compatibility with 2.95; Darwin C APIs use bool from
430169689Skan   stdbool.h, which was an int-sized enum in 2.95.  Users can explicitly
431169689Skan   choose to have sizeof(bool)==1 with the -mone-byte-bool switch. */
432169689Skan#define BOOL_TYPE_SIZE (darwin_one_byte_bool ? CHAR_TYPE_SIZE : INT_TYPE_SIZE)
433117395Skan
434117395Skan#undef REGISTER_TARGET_PRAGMAS
435169689Skan#define REGISTER_TARGET_PRAGMAS() \
436169689Skan  do \
437169689Skan    { \
438169689Skan      DARWIN_REGISTER_TARGET_PRAGMAS(); \
439169689Skan      targetm.resolve_overloaded_builtin = altivec_resolve_overloaded_builtin; \
440169689Skan    } \
441169689Skan  while (0)
442132718Skan
443169689Skan#ifdef IN_LIBGCC2
444169689Skan#include <stdbool.h>
445169689Skan#endif
446169689Skan
447169689Skan#define MD_UNWIND_SUPPORT "config/rs6000/darwin-unwind.h"
448169689Skan
449169689Skan#define HAS_MD_FALLBACK_FRAME_STATE_FOR 1
450169689Skan
451169689Skan/* True, iff we're generating fast turn around debugging code.  When
452169689Skan   true, we arrange for function prologues to start with 5 nops so
453169689Skan   that gdb may insert code to redirect them, and for data to be
454169689Skan   accessed indirectly.  The runtime uses this indirection to forward
455169689Skan   references for data to the original instance of that data.  */
456169689Skan
457169689Skan#define TARGET_FIX_AND_CONTINUE (darwin_fix_and_continue)
458169689Skan
459169689Skan/* This is the reserved direct dispatch address for Objective-C.  */
460169689Skan#define OFFS_MSGSEND_FAST		0xFFFEFF00
461169689Skan
462169689Skan/* This is the reserved ivar address Objective-C.  */
463169689Skan#define OFFS_ASSIGNIVAR_FAST		0xFFFEFEC0
464169689Skan
465169689Skan/* Old versions of Mac OS/Darwin don't have C99 functions available.  */
466169689Skan#undef TARGET_C99_FUNCTIONS
467169689Skan#define TARGET_C99_FUNCTIONS					\
468169689Skan  (TARGET_64BIT							\
469169689Skan   || (darwin_macosx_version_min				\
470169689Skan       && strverscmp (darwin_macosx_version_min, "10.3") >= 0))
471169689Skan
472169689Skan/* When generating kernel code or kexts, we don't use Altivec by
473169689Skan   default, as kernel code doesn't save/restore those registers.  */
474169689Skan#define OS_MISSING_ALTIVEC (flag_mkernel || flag_apple_kext)
475