#define NEXT_SEMANTICS
#define DEFAULT_ABI ABI_MACOSX
#define RS6000_ABI_NAME "Apple Mac OS X"
#define MACHO_PIC 1
#define DWARF2_UNWIND_INFO 1
#define PIC_OFFSET_TABLE_REGNUM 31
#define FRAME_POINTER_REGNUM 30
#define TARGET_NO_TOC 1
#define TARGET_TOC 0
#define MASK_ALIGN_MAC68K 0x200000
#define TARGET_ALIGN_MAC68K (target_flags & MASK_ALIGN_MAC68K)
#define MASK_ALIGN_MACOSX1 0x400000
#define TARGET_ALIGN_MACOSX1 (target_flags & MASK_ALIGN_MACOSX1)
#define MASK_LONG_BRANCH 0x800000
#define TARGET_LONG_BRANCH (target_flags & MASK_LONG_BRANCH)
#define SUBTARGET_SWITCHES \
{"align-mac68k", MASK_ALIGN_MAC68K}, \
{"no-align-mac68k", - MASK_ALIGN_MAC68K}, \
{"align-power", - MASK_ALIGN_MAC68K}, \
{"no-align-power", MASK_ALIGN_MAC68K}, \
{"align-macosx1", MASK_ALIGN_MACOSX1}, \
{"no-align-macosx1", - (MASK_ALIGN_MAC68K | MASK_ALIGN_MACOSX1)}, \
{"long-branch", MASK_LONG_BRANCH}, \
{"no-long-branch", - MASK_LONG_BRANCH},
#define SUBTARGET_OVERRIDE_OPTIONS \
do { \
extern int flag_dave_indirect; \
if (flag_dave_indirect) flag_pic = 2; \
if (flag_pic == 2) flag_no_function_cse = 1; \
if (TARGET_LONG_BRANCH && flag_pic) \
error ("-mlong-branch can only be used in combination with -static."); \
if (TARGET_ALIGN_MAC68K) maximum_field_alignment = 16; \
} while (0)
#if 0
#define FIXED_R2 0
#define ALLOC_R2_AS_VOLATILE 2,
#define ALLOC_R2_AS_FIXED
#endif
#include "rs6000/rs6000.h"
#include "apple/openstep.h"
#define TARGET_ARCHITECTURE \
{ { "ppc", 0 }, \
{ "m98k", 0 }, \
{ "ppc-nomult", -MASK_MULTIPLE }, \
{ "ppc-nostr", -MASK_STRING }}
#define DEFAULT_TARGET_ARCH "ppc"
#undef TARGET_DEFAULT
#define TARGET_DEFAULT (MASK_POWERPC | MASK_MULTIPLE | MASK_NEW_MNEMONICS \
| MASK_NO_FP_IN_TOC | MASK_NO_SUM_IN_TOC)
#define RS6000_LONG_BRANCH
#define OUTPUT_COMPILER_STUB
char *output_call ();
#define CC1_SPEC \
"%{!static:-fPIC %{O:-fforce-mem}%{O1:-fforce-mem}%{O3:-fno-inline-functions}} -Wno-four-char-constants%{fdump-syms: -fsyntax-only}"
#define CC1PLUS_SPEC "-fnew-abi -fno-honor-std"
#undef SELECT_RTX_SECTION
#define SELECT_RTX_SECTION(mode, rtx) const_section()
#undef ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)
#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
fprintf (FILE, "%s%d:\n", PREFIX, NUM)
#undef ASM_OUTPUT_INTERNAL_LABEL_PREFIX(FILE,PREFIX)
#define ASM_OUTPUT_INTERNAL_LABEL_PREFIX(FILE,PREFIX) \
fprintf (FILE, "%s", PREFIX)
#undef STACK_BOUNDARY
#define STACK_BOUNDARY 128
#undef CPP_PREDEFINES
#ifdef MAC_OS_X_SERVER_1_0
#define CPP_PREDEFINES "-Dppc -DNATURAL_ALIGNMENT -DNeXT -Dunix -D__MACH__ -D__BIG_ENDIAN__ -D__ARCHITECTURE__=\"ppc\" -D__APPLE__"
#elif defined (MACOSX) || defined (RC_RELEASE_Flask)
#define CPP_PREDEFINES "-D__ppc__ -D__NATURAL_ALIGNMENT__ -D__MACH__ -D__BIG_ENDIAN__ -D__APPLE__"
#else
#define CPP_PREDEFINES "-Dppc -D__NATURAL_ALIGNMENT__ -D__MACH__ -D__BIG_ENDIAN__ -D__ARCHITECTURE__=\"ppc\" -D__APPLE__"
#endif
#define JMP_BUF_SIZE (26 + 36 + 129 + 4)
#undef ASM_DECLARE_FUNCTION_NAME
#undef REGISTER_NAMES
#define REGISTER_NAMES \
{"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", \
"r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", \
"r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", \
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \
"mq", "lr", "ctr", "ap", \
"cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
"fpmem", "vrsave", \
"v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", \
"v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", \
"v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", \
"v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" \
}
#define ORDINARY_REG_NO (11)
#define RS6000_LAST_REG (frame_pointer_needed ? 29 : (flag_pic ? 30 : 31))
#undef BRANCH_COST
#define BRANCH_COST 1
#undef DEFAULT_PCC_STRUCT_RETURN
#define DEFAULT_PCC_STRUCT_RETURN 1
#undef STRIP_NAME_ENCODING
#define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
(VAR) = ((SYMBOL_NAME) + ((SYMBOL_NAME)[0] == '*'))
#undef PROCESSOR_DEFAULT
#define PROCESSOR_DEFAULT PROCESSOR_PPC750
#undef ASM_FILE_START
#define ASM_FILE_START(FILE) \
if (rs6000_cpu == PROCESSOR_PPC604 || rs6000_cpu == PROCESSOR_PPC604e) \
fprintf (FILE, ".macro mul\n\tcror 0, 0, 0\n\tcror 0, 0, 0\n\tcror 0, 0, 0\n\tmul$0 $1,$2,$3\n.endmacro\n.macro div\n\tcror 0, 0, 0\n\tcror 0, 0, 0\n\tcror 0, 0, 0\n\tdiv$0 $1,$2,$3\n.endmacro\n"); \
else fprintf (FILE, ".macro mul\n\tmul$0 $1,$2,$3\n.endmacro\n.macro div\n\tdiv$0 $1,$2,$3\n.endmacro\n")
#undef RS6000_OUTPUT_BASENAME
#define RS6000_OUTPUT_BASENAME(FILE, NAME) \
assemble_name ((FILE), (NAME));
#undef ASM_OUTPUT_LABEL
#define ASM_OUTPUT_LABEL(FILE,NAME) \
do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0)
#undef ASM_OUTPUT_DOUBLE
#ifdef REAL_VALUE_TO_TARGET_DOUBLE
#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
do { \
long hex[2]; \
REAL_VALUE_TO_TARGET_DOUBLE (VALUE, hex); \
if (sizeof (int) == sizeof (long)) \
fprintf (FILE, "\t.long 0x%x\n\t.long 0x%x\n", hex[0], hex[1]); \
else \
fprintf (FILE, "\t.long 0x%lx\n\t.long 0x%lx\n", hex[0], hex[1]); \
} while (0)
#else
#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
do { if (REAL_VALUE_ISINF (VALUE)) \
{ \
if (REAL_VALUE_NEGATIVE (VALUE)) \
fprintf (FILE, "\t.double 0r-99e999\n"); \
else \
fprintf (FILE, "\t.double 0r99e999\n"); \
} \
else \
{ char dstr[30]; \
REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr); \
fprintf (FILE, "\t.double 0r%s\n", dstr); \
} \
} while (0)
#endif
#undef ASM_OUTPUT_FLOAT_OPERAND
#ifdef REAL_VALUE_TO_TARGET_SINGLE
#define ASM_OUTPUT_FLOAT_OPERAND(CODE,FILE,VALUE) \
do { \
long hex; \
REAL_VALUE_TO_TARGET_SINGLE (VALUE, hex); \
fprintf (FILE, "#0%c%x", (CODE) == 'f' ? 'b' : 'x', hex); \
} while (0)
#else
#define ASM_OUTPUT_FLOAT_OPERAND(CODE,FILE,VALUE) \
do{ \
if (CODE != 'f') \
{ \
long l; \
REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \
if (sizeof (int) == sizeof (long)) \
asm_fprintf ((FILE), "%I0x%x", l); \
else \
asm_fprintf ((FILE), "%I0x%lx", l); \
} \
else if (REAL_VALUE_ISINF (VALUE)) \
{ \
if (REAL_VALUE_NEGATIVE (VALUE)) \
fprintf (FILE, "#0r-99e999"); \
else \
fprintf (FILE, "#0r99e999"); \
} \
else \
{ char dstr[30]; \
REAL_VALUE_TO_DECIMAL ((VALUE), "%.9g", dstr); \
fprintf (FILE, "#0r%s", dstr); \
} \
} while (0)
#endif
#undef ASM_OUTPUT_DOUBLE_OPERAND
#ifdef REAL_VALUE_TO_TARGET_DOUBLE
#define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE) \
do { \
long hex[2]; \
REAL_VALUE_TO_TARGET_DOUBLE (VALUE, hex); \
fprintf (FILE, "#0b%x%08x", hex[0], hex[1]); \
} while (0)
#else
#define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE) \
do { if (REAL_VALUE_ISINF (VALUE)) \
{ \
if (REAL_VALUE_NEGATIVE (VALUE)) \
fprintf (FILE, "#0r-99e999"); \
else \
fprintf (FILE, "#0r99e999"); \
} \
else \
{ char dstr[30]; \
REAL_VALUE_TO_DECIMAL ((VALUE), "%.20g", dstr); \
fprintf (FILE, "#0r%s", dstr); \
} \
} while (0)
#endif
#undef ASM_OUTPUT_ASCII
#define ASM_OUTPUT_ASCII(FILE, P, N) apple_output_ascii ((FILE), (P), (N))
extern void apple_output_ascii ();
#undef ASM_OUTPUT_CASE_LABEL
#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN) \
{ ASM_OUTPUT_ALIGN (FILE, 2); ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); }
#undef ASM_OUTPUT_ALIGNED_COMMON
#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
do { fputs (".comm ", (FILE)); \
RS6000_OUTPUT_BASENAME ((FILE), (NAME)); \
fprintf ((FILE), ",%d\n", (SIZE)); } while (0)
#undef GO_IF_INDEXABLE_BASE(X, ADDR)
#define GO_IF_INDEXABLE_BASE(X, ADDR) \
{ if (LEGITIMATE_BASE_REG_P (X)) goto ADDR; }
#define OBJC_FORWARDING_STACK_OFFSET 8
#define OBJC_FORWARDING_MIN_OFFSET 8
#undef VECTOR_SAVE_INLINE
#define VECTOR_SAVE_INLINE(FIRST_REG) ((FIRST_REG) == 109)
extern char *language_string;
#define LEGITIMATE_PIC_OPERAND_P(X) \
(! symbolic_operand (X) \
|| machopic_operand_p (X) \
|| ((GET_CODE(X) == SYMBOL_REF) && \
(SYMBOL_REF_FLAG(X) || !strcmp (language_string, "GNU C++") \
|| !strcmp (language_string, "GNU Obj-C++"))))
#undef TEXT_SECTION_ASM_OP
#define TEXT_SECTION_ASM_OP ".text"
#undef DATA_SECTION_ASM_OP
#define DATA_SECTION_ASM_OP ".data"
#undef ASM_OUTPUT_SPECIAL_POOL_ENTRY
#undef RS6000_CALL_GLUE
#define RS6000_CALL_GLUE ""
#undef ASM_GENERATE_INTERNAL_LABEL
#ifndef MXW
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
sprintf (LABEL, "*%s%d", PREFIX, NUM)
#else
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
do { \
extern int currentLabelNumber; \
if ( !strcmp(PREFIX,"LC") ) \
sprintf (LABEL, "*%s%d-%s%d", PREFIX, NUM, PREFIX, currentLabelNumber); \
else \
sprintf (LABEL, "*%s%d", PREFIX, NUM); \
} while (0)
#endif
#undef ASM_OUTPUT_EXTERNAL
#undef ASM_OUTPUT_EXTERNAL_LIBCALL
#undef DEFAULT_SIGNED_CHAR
#define DEFAULT_SIGNED_CHAR (1)
#undef ASM_OUTPUT_FLOAT
#define ASM_OUTPUT_FLOAT(FILE,VALUE) \
fprintf (FILE, "\t.single 0d%.20e\n", (VALUE))
#undef BIGGEST_ALIGNMENT
#define BIGGEST_ALIGNMENT (flag_altivec ? 128 : 32)
extern int flag_altivec;
#undef ADJUST_FIELD_ALIGN
#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
(((COMPUTED) == RS6000_VECTOR_ALIGNMENT) \
? RS6000_VECTOR_ALIGNMENT \
: MIN ((COMPUTED), 32))
#undef ROUND_TYPE_ALIGN
extern int round_type_align (union tree_node*, int, int);
#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED) \
round_type_align(STRUCT, COMPUTED, SPECIFIED)
#define __PIN_ALIGN_TO_MAX(DESIRED) \
(((DESIRED) == RS6000_VECTOR_ALIGNMENT) ? RS6000_VECTOR_ALIGNMENT : \
MIN ((DESIRED), (unsigned) maximum_field_alignment))
#define APPLE_ALIGN_CHECK
#ifdef APPLE_ALIGN_CHECK
extern int warn_osx1_size_align;
extern unsigned get_type_size_as_int (const union tree_node *);
extern int type_has_different_size_in_osx1 (const union tree_node *);
extern const char *get_type_name_string (const union tree_node *);
extern void apple_align_check (union tree_node *rec, unsigned const_size,
int osx1_size_delta, union tree_node *var_size);
#endif
#define WARN_POOR_FIELD_ALIGN(FIELD, ALIGN) \
do { \
tree t = (TREE_CODE (TREE_TYPE (FIELD)) == ARRAY_TYPE) \
? get_inner_array_type (FIELD) : TREE_TYPE (FIELD); \
if ((TYPE_MODE (t) == SFmode && ALIGN % 32 != 0) \
|| (TYPE_MODE (t) == DFmode && ALIGN % 32 != 0)) \
warning_with_decl (FIELD, "`%s' has non-optimal alignment" \
" (%d bytes, should be 4)", (ALIGN % 32) / 8); \
} while (0)
#define RELOAD_PIC_REGISTER reload_ppc_pic_register()
#define INITIALIZE_PIC initialize_pic ()
#undef FINALIZE_PIC
#define FINALIZE_PIC finalize_pic ()
#define SMALL_INT(X) ((unsigned) (INTVAL(X) + 0x4000) < 0x8000)
#if 0
#undef TRAMPOLINE_TEMPLATE
#define TRAMPOLINE_TEMPLATE(FILE) { fprintf (FILE, "\t.long 0, 0, 0, 0\n"); }
#endif
#undef TRAMPOLINE_SIZE
#define TRAMPOLINE_SIZE 16
#define INITIALIZE_TRAMPOLINE(ADDR, FNADDR, CXT) \
rs6000_initialize_trampoline (ADDR, FNADDR, CXT)
extern void machopic_define_decl ();
#define MACHOPIC_DEFINE_DECL(decl, name) machopic_define_decl (decl, name)
#define ASM_OUTPUT_OPCODE(STREAM, PTR) \
do {if (PTR[0] == '%' && PTR[1] >= '0' && PTR[1] <= '9' \
&& GET_CODE (recog_operand[PTR[1]-'0']) == SYMBOL_REF) { \
fputs (XSTR (recog_operand[PTR[1]-'0'], 0), STREAM); \
PTR += 2; }} while (0)
#undef PREFERRED_RELOAD_CLASS
#define PREFERRED_RELOAD_CLASS(X,CLASS) \
((GET_CODE (X) == CONST_DOUBLE \
&& GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT) \
? NO_REGS \
: (GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == HIGH) \
? BASE_REGS : (CLASS))
#define CONST_S16BIT_P(K) ((unsigned HOST_WIDE_INT) ((K)+0x8000) < 0x10000)
#define CONST_U16BIT_P(K) (((unsigned HOST_WIDE_INT) (K)) < 0x10000)
#define PPC_CONST_IS_FREE_P(K) \
((CONST_S16BIT_P (K) || CONST_U16BIT_P (K)) \
|| (((unsigned HOST_WIDE_INT)(K)) & 0x0000FFFF) == 0)
#undef CONST_COSTS
#define CONST_COSTS(RTX,CODE,OUTER_CODE) \
case CONST_INT: \
return (PPC_CONST_IS_FREE_P (INTVAL (RTX))) ? 0 : COSTS_N_INSNS (2); \
case LABEL_REF: \
case SYMBOL_REF: \
case HIGH: \
case CONST: \
case CONST_DOUBLE: \
return 0;
#define NO_EH_RECEIVER_CODE_NECESSARY_P() (flag_pic)
#define EH_CLEANUPS_SEPARATE_SECTION
#ifdef EH_CLEANUPS_SEPARATE_SECTION
#define EXTRA_NOTE_NAMES , "NOTE_INSN_EH_CLEANUP_BEG", \
"NOTE_INSN_EH_CLEANUP_END"
#define NOTE_INSN_EH_CLEANUP_BEG -21
#define NOTE_INSN_EH_CLEANUP_END -22
#define NOTE_EH_CLEANUP_BEG_P(INSN) \
(GET_CODE (INSN) == NOTE \
&& NOTE_LINE_NUMBER (INSN) == NOTE_INSN_EH_CLEANUP_BEG)
#define NOTE_EH_CLEANUP_END_P(INSN) \
(GET_CODE (INSN) == NOTE \
&& NOTE_LINE_NUMBER (INSN) == NOTE_INSN_EH_CLEANUP_END)
extern void prune_and_graft_eh_cleanup_info ();
#undef MACHINE_DEPENDENT_REORG
#define MACHINE_DEPENDENT_REORG(INSNS) prune_and_graft_eh_cleanup_info (INSNS)
extern const char begin_apple_cleanup_section_name_tag[],
end_apple_cleanup_section_name_tag[];
#define PREPROCESS_INTERNAL_LABEL(FILE, LABEL) \
do { \
if (flag_separate_eh_cleanup_section) { \
const char *name = LABEL_NAME (LABEL); \
if (name == begin_apple_cleanup_section_name_tag \
|| name == end_apple_cleanup_section_name_tag) \
handle_eh_tagged_label (FILE, LABEL); \
} \
} while (0)
#define EH_LABEL_ALIGN_VALUE 15
#define LABEL_ALIGN(LABEL) \
((LABEL_NAME (LABEL) == begin_apple_cleanup_section_name_tag) \
? get_eh_label_align_value (LABEL) : 0)
#undef ASM_OUTPUT_ALIGN
#define ASM_OUTPUT_ALIGN(FILE,LOG) \
if ((LOG) != 0 && (LOG) != EH_LABEL_ALIGN_VALUE) \
fprintf (FILE, "\t.align %d\n", (LOG))
#endif
#ifdef DWARF2_UNWIND_INFO
#define DWARF_FRAME_RETURN_COLUMN 65
#define RS6000_DEF_CFA_FRAMESIZE 80
#define DWARF2_TARGET_CALLING_CONVENTION() \
{ \
dwarf2out_same_value_regs (NULL, 13, 31); \
dwarf2out_same_value_regs (NULL, 46, 63); \
dwarf2out_same_value_regs (NULL, 70, 73); \
dwarf2out_same_value_regs (NULL, 65, 65); \
if (flag_altivec) { \
dwarf2out_same_value_regs (NULL, 77, 77); \
dwarf2out_same_value_regs (NULL, 98, 109); \
} \
dwarf2out_undefined_regs (NULL, 0, 12); \
dwarf2out_undefined_regs (NULL, 32, 45); \
dwarf2out_undefined_regs (NULL, 68, 69); \
dwarf2out_undefined_regs (NULL, 74, 75); \
if (!TARGET_POWERPC) \
dwarf2out_undefined_regs (NULL, 64, 64); \
if (flag_altivec) \
dwarf2out_undefined_regs (NULL, 78, 97); \
dwarf2out_def_cfa (NULL, 1, RS6000_DEF_CFA_FRAMESIZE);\
}
#define TARGET_EH_REG_SET_P(REG) ((REG) == 77)
#define DO_TARGET_EH_REG_SET(REG, MEMADDR) \
do { \
unsigned long vrs = *(unsigned long *)(MEMADDR); \
if ((REG) != 77) abort (); \
asm ("mtspr VRsave,%0" : : "r" (vrs)); \
} while (0)
#define PLAUSIBLE_PC_RANGE(PC, LEN) \
((*(unsigned int *)(((char *)(PC))+(size_t)(LEN)-4)) == 0x4e800020)
#if 0
#define TRACE_DWARF2_UNWIND 1
#undef ASM_COMMENT_START
#define ASM_COMMENT_START ";#"
#endif
#endif
#include "apple/embedded.h"