|
|
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.