|
|
1.1 ! root 1: /* Target definitions for GNU compiler for Intel x86 CPU running NeXTSTEP ! 2: Copyright (C) 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 "i386/gas.h" ! 21: #include "nextstep.h" ! 22: ! 23: #define MACHO_PIC 1 ! 24: ! 25: #ifndef MACHOPIC_PURE ! 26: #define MACHOPIC_PURE (flag_pic == 2) ! 27: #define MACHOPIC_INDIRECT (flag_pic) ! 28: #define MACHOPIC_JUST_INDIRECT (flag_pic == 1) ! 29: #endif ! 30: ! 31: #define DEFAULT_TARGET_ARCH "i386" ! 32: ! 33: /* By default, target has a 80387, with IEEE FP. */ ! 34: ! 35: #undef TARGET_DEFAULT ! 36: #define TARGET_DEFAULT (1|0100) ! 37: ! 38: #undef SUBTARGET_SWITCHES ! 39: #define SUBTARGET_SWITCHES \ ! 40: { "unaligned-text", 0400 }, \ ! 41: { "no-unaligned-text", -0400 }, ! 42: ! 43: #define TARGET_NO_LOOP_ALIGNMENT (target_flags & 0400) ! 44: ! 45: /* The NeXT configuration aligns everything at 4 byte boundary. ! 46: Even though this is not optimal with respect to cache lines, this ! 47: saves us sigificant space, which is a precious ressource on a ! 48: NeXTSTEP machine. */ ! 49: ! 50: #undef ASM_OUTPUT_ALIGN_CODE ! 51: #define ASM_OUTPUT_ALIGN_CODE(FILE) \ ! 52: if (!TARGET_NO_LOOP_ALIGNMENT) \ ! 53: fprintf ((FILE), "\t.align 2,0x90\n") ! 54: ! 55: /* Align start of loop at 4-byte boundary. */ ! 56: ! 57: #undef ASM_OUTPUT_LOOP_ALIGN ! 58: #define ASM_OUTPUT_LOOP_ALIGN(FILE) \ ! 59: if (!TARGET_NO_LOOP_ALIGNMENT) \ ! 60: fprintf ((FILE), "\t.align 2,0x90\n"); /* Use log of 4 as arg. */ ! 61: ! 62: #undef ASM_OUTPUT_ALIGN ! 63: #undef ASM_OUTPUT_ALIGN ! 64: #define ASM_OUTPUT_ALIGN(FILE,LOG) \ ! 65: do { if ((LOG) != 0) \ ! 66: if (in_text_section ()) \ ! 67: fprintf (FILE, "\t%s %d,0x90\n", ALIGN_ASM_OP, (LOG)); \ ! 68: else \ ! 69: fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG)); \ ! 70: } while (0) ! 71: ! 72: ! 73: #undef FUNCTION_BOUNDARY ! 74: #define FUNCTION_BOUNDARY 32 ! 75: ! 76: #define TARGET_ARCHITECTURE \ ! 77: { { "i386", 2 }, /* Treat i386 like i486. */ \ ! 78: { "i486", 2 }, /* Turn on -m486. */ \ ! 79: { "i486SX", 2 }, /* Turn on -m486. */ \ ! 80: /* { "i586", 4 }, */ /* Turn on -m486. */ \ ! 81: /* { "i586SX", 4 }, */ /* Turn on -m586. */ \ ! 82: } ! 83: ! 84: /* Implicit library calls should use memcpy, not bcopy, etc. */ ! 85: ! 86: #define TARGET_MEM_FUNCTIONS ! 87: ! 88: /* Machines that use the AT&T assembler syntax ! 89: also return floating point values in an FP register. ! 90: Define how to find the value returned by a function. ! 91: VALTYPE is the data type of the value (as a tree). ! 92: If the precise function being called is known, FUNC is its FUNCTION_DECL; ! 93: otherwise, FUNC is 0. */ ! 94: ! 95: #undef VALUE_REGNO ! 96: #define VALUE_REGNO(MODE) \ ! 97: ((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode \ ! 98: ? FIRST_FLOAT_REG : 0) ! 99: ! 100: /* 1 if N is a possible register number for a function value. */ ! 101: ! 102: #undef FUNCTION_VALUE_REGNO_P ! 103: #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0 || (N)== FIRST_FLOAT_REG) ! 104: ! 105: #ifdef REAL_VALUE_TO_TARGET_LONG_DOUBLE ! 106: #undef ASM_OUTPUT_LONG_DOUBLE ! 107: #define ASM_OUTPUT_LONG_DOUBLE(FILE,VALUE) \ ! 108: do { \ ! 109: long hex[3]; \ ! 110: REAL_VALUE_TO_TARGET_LONG_DOUBLE (VALUE, hex); \ ! 111: if (sizeof (int) == sizeof (long)) \ ! 112: fprintf (FILE, "\t.long 0x%x\n\t.long 0x%x\n\t.long 0x%x\n", \ ! 113: hex[0], hex[1], hex[2]); \ ! 114: else \ ! 115: fprintf (FILE, "\t.long 0x%lx\n\t.long 0x%lx\n\t.long 0x%lx\n", \ ! 116: hex[0], hex[1], hex[2]); \ ! 117: } while (0) ! 118: #endif ! 119: ! 120: #ifdef REAL_VALUE_TO_TARGET_DOUBLE ! 121: #undef ASM_OUTPUT_DOUBLE ! 122: #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \ ! 123: do { \ ! 124: long hex[2]; \ ! 125: REAL_VALUE_TO_TARGET_DOUBLE (VALUE, hex); \ ! 126: if (sizeof (int) == sizeof (long)) \ ! 127: fprintf (FILE, "\t.long 0x%x\n\t.long 0x%x\n", hex[0], hex[1]); \ ! 128: else \ ! 129: fprintf (FILE, "\t.long 0x%lx\n\t.long 0x%lx\n", hex[0], hex[1]); \ ! 130: } while (0) ! 131: #endif ! 132: ! 133: /* This is how to output an assembler line defining a `float' constant. */ ! 134: ! 135: #ifdef REAL_VALUE_TO_TARGET_SINGLE ! 136: #undef ASM_OUTPUT_FLOAT ! 137: #define ASM_OUTPUT_FLOAT(FILE,VALUE) \ ! 138: do { \ ! 139: long hex; \ ! 140: REAL_VALUE_TO_TARGET_SINGLE (VALUE, hex); \ ! 141: if (sizeof (int) == sizeof (long)) \ ! 142: fprintf (FILE, "\t.long 0x%x\n", hex); \ ! 143: else \ ! 144: fprintf (FILE, "\t.long 0x%lx\n", hex); \ ! 145: } while (0) ! 146: #endif ! 147: ! 148: /* A C statement or statements which output an assembler instruction ! 149: opcode to the stdio stream STREAM. The macro-operand PTR is a ! 150: variable of type `char *' which points to the opcode name in its ! 151: "internal" form--the form that is written in the machine description. ! 152: ! 153: GAS version 1.38.1 doesn't understand the `repz' opcode mnemonic. ! 154: So use `repe' instead. */ ! 155: ! 156: #undef ASM_OUTPUT_OPCODE ! 157: #define ASM_OUTPUT_OPCODE(STREAM, PTR) \ ! 158: { \ ! 159: if ((PTR)[0] == 'r' \ ! 160: && (PTR)[1] == 'e' \ ! 161: && (PTR)[2] == 'p') \ ! 162: { \ ! 163: if ((PTR)[3] == 'z') \ ! 164: { \ ! 165: fprintf (STREAM, "repe"); \ ! 166: (PTR) += 4; \ ! 167: } \ ! 168: else if ((PTR)[3] == 'n' && (PTR)[4] == 'z') \ ! 169: { \ ! 170: fprintf (STREAM, "repne"); \ ! 171: (PTR) += 5; \ ! 172: } \ ! 173: } \ ! 174: } ! 175: ! 176: /* Define macro used to output shift-double opcodes when the shift ! 177: count is in %cl. Some assemblers require %cl as an argument; ! 178: some don't. ! 179: ! 180: GAS requires the %cl argument, so override unx386.h. */ ! 181: ! 182: #undef AS3_SHIFT_DOUBLE ! 183: #define AS3_SHIFT_DOUBLE(a,b,c,d) AS3 (a,b,c,d) ! 184: ! 185: /* Print opcodes the way that GAS expects them. */ ! 186: #define GAS_MNEMONICS 1 ! 187: ! 188: /* Names to predefine in the preprocessor for this target machine. */ ! 189: ! 190: #undef CPP_PREDEFINES ! 191: #define CPP_PREDEFINES "-Di386 -DNeXT -Dunix -D__MACH__ -D__LITTLE_ENDIAN__ -D__ARCHITECTURE__=\"i386\" " ! 192: ! 193: /* This accounts for the return pc and saved fp on the i386. */ ! 194: ! 195: #define OBJC_FORWARDING_STACK_OFFSET 8 ! 196: #define OBJC_FORWARDING_MIN_OFFSET 8 ! 197: ! 198: /* We do not want a dot in internal labels. */ ! 199: ! 200: #undef LPREFIX ! 201: #define LPREFIX "L" ! 202: ! 203: #undef ASM_GENERATE_INTERNAL_LABEL ! 204: #define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \ ! 205: sprintf ((BUF), "*%s%d", (PREFIX), (NUMBER)) ! 206: ! 207: #undef ASM_OUTPUT_INTERNAL_LABEL ! 208: #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ ! 209: fprintf (FILE, "%s%d:\n", PREFIX, NUM) ! 210: ! 211: /* Output to assembler file text saying following lines ! 212: may contain character constants, extra white space, comments, etc. */ ! 213: ! 214: #undef ASM_APP_ON ! 215: #define ASM_APP_ON "#APP\n" ! 216: ! 217: /* Output to assembler file text saying following lines ! 218: no longer contain unusual constructs. */ ! 219: ! 220: #undef ASM_APP_OFF ! 221: #define ASM_APP_OFF "#NO_APP\n" ! 222: ! 223: #undef ASM_OUTPUT_REG_PUSH ! 224: #define ASM_OUTPUT_REG_PUSH(FILE,REGNO) \ ! 225: fprintf (FILE, "\tpushl %se%s\n", "%", reg_names[REGNO]) ! 226: ! 227: #undef ASM_OUTPUT_REG_POP ! 228: #define ASM_OUTPUT_REG_POP(FILE,REGNO) \ ! 229: fprintf (FILE, "\tpopl %se%s\n", "%", reg_names[REGNO]) ! 230: ! 231: /* This is being overridden because the default i386 configuration ! 232: generates calls to "_mcount". NeXT system libraries all use ! 233: "mcount". */ ! 234: ! 235: #undef FUNCTION_PROFILER ! 236: #define FUNCTION_PROFILER(FILE, LABELNO) \ ! 237: { \ ! 238: if (flag_pic) \ ! 239: { \ ! 240: fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n", \ ! 241: LPREFIX, (LABELNO)); \ ! 242: fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n"); \ ! 243: } \ ! 244: else \ ! 245: { \ ! 246: fprintf (FILE, "\tmovl $%sP%d,%%edx\n", LPREFIX, (LABELNO)); \ ! 247: fprintf (FILE, "\tcall mcount\n"); \ ! 248: } \ ! 249: } ! 250: ! 251: /* BEGIN Calling Convention CHANGES */ ! 252: ! 253: /* These changes violate the Intel/Unix ABI. Specifically, they ! 254: change the way that space for a block return value is passed to a ! 255: function. The ABI says that the pointer is passed on the stack. ! 256: We change to pass the pointer in %ebx. This makes the NeXT ! 257: Objective-C forwarding mechanism possible to implement on an i386. */ ! 258: ! 259: /* Do NOT pass address of structure values on the stack. */ ! 260: ! 261: #undef STRUCT_VALUE_INCOMING ! 262: #undef STRUCT_VALUE ! 263: ! 264: /* Pass them in %ebx. */ ! 265: ! 266: #undef STRUCT_VALUE_REGNUM ! 267: #define STRUCT_VALUE_REGNUM 3 ! 268: ! 269: /* Because we are passing the pointer in a register, we don't need to ! 270: rely on the callee to pop it. */ ! 271: ! 272: #undef RETURN_POPS_ARGS ! 273: #define RETURN_POPS_ARGS(FUNTYPE,SIZE) \ ! 274: (TREE_CODE (FUNTYPE) == IDENTIFIER_NODE \ ! 275: ? 0 \ ! 276: : (TARGET_RTD \ ! 277: && (TYPE_ARG_TYPES (FUNTYPE) == 0 \ ! 278: || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (FUNTYPE))) \ ! 279: == void_type_node))) ? (SIZE) : 0) ! 280: ! 281: /* END Calling Convention CHANGES */ ! 282: ! 283: /* Turn on floating point precision control as default */ ! 284: ! 285: /* #define DEFAULT_FPPC 1 */ ! 286: ! 287: #undef ASM_OUTPUT_ADDR_DIFF_ELT ! 288: #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \ ! 289: fprintf (FILE, "\t.long %s%d-%s%d\n",LPREFIX, VALUE,LPREFIX, REL) ! 290: ! 291:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.