|
|
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: /* By default, target has a 80387, with IEEE FP. */
24:
25: #undef TARGET_DEFAULT
26: #define TARGET_DEFAULT (1|0100)
27:
28: /* Implicit library calls should use memcpy, not bcopy, etc. */
29:
30: #define TARGET_MEM_FUNCTIONS
31:
32: /* Machines that use the AT&T assembler syntax
33: also return floating point values in an FP register.
34: Define how to find the value returned by a function.
35: VALTYPE is the data type of the value (as a tree).
36: If the precise function being called is known, FUNC is its FUNCTION_DECL;
37: otherwise, FUNC is 0. */
38:
39: #undef VALUE_REGNO
40: #define VALUE_REGNO(MODE) \
41: (((MODE)==SFmode || (MODE)==DFmode) ? FIRST_FLOAT_REG : 0)
42:
43: /* 1 if N is a possible register number for a function value. */
44:
45: #undef FUNCTION_VALUE_REGNO_P
46: #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0 || (N)== FIRST_FLOAT_REG)
47:
48: #ifdef REAL_VALUE_TO_TARGET_DOUBLE
49: #undef ASM_OUTPUT_DOUBLE
50: #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
51: do { \
52: long hex[2]; \
53: REAL_VALUE_TO_TARGET_DOUBLE (VALUE, hex); \
54: fprintf (FILE, "\t.long 0x%x\n\t.long 0x%x\n", hex[0], hex[1]); \
55: } while (0)
56: #endif
57:
58: /* This is how to output an assembler line defining a `float' constant. */
59:
60: #ifdef REAL_VALUE_TO_TARGET_SINGLE
61: #undef ASM_OUTPUT_FLOAT
62: #define ASM_OUTPUT_FLOAT(FILE,VALUE) \
63: do { \
64: long hex; \
65: REAL_VALUE_TO_TARGET_SINGLE (VALUE, hex); \
66: fprintf (FILE, "\t.long 0x%x\n", hex); \
67: } while (0)
68: #endif
69:
70: /* A C statement or statements which output an assembler instruction
71: opcode to the stdio stream STREAM. The macro-operand PTR is a
72: variable of type `char *' which points to the opcode name in its
73: "internal" form--the form that is written in the machine description.
74:
75: GAS version 1.38.1 doesn't understand the `repz' opcode mnemonic.
76: So use `repe' instead. */
77:
78: #undef ASM_OUTPUT_OPCODE
79: #define ASM_OUTPUT_OPCODE(STREAM, PTR) \
80: { \
81: if ((PTR)[0] == 'r' \
82: && (PTR)[1] == 'e' \
83: && (PTR)[2] == 'p') \
84: { \
85: if ((PTR)[3] == 'z') \
86: { \
87: fprintf (STREAM, "repe"); \
88: (PTR) += 4; \
89: } \
90: else if ((PTR)[3] == 'n' && (PTR)[4] == 'z') \
91: { \
92: fprintf (STREAM, "repne"); \
93: (PTR) += 5; \
94: } \
95: } \
96: }
97:
98: /* Define macro used to output shift-double opcodes when the shift
99: count is in %cl. Some assemblers require %cl as an argument;
100: some don't.
101:
102: GAS requires the %cl argument, so override unx386.h. */
103:
104: #undef AS3_SHIFT_DOUBLE
105: #define AS3_SHIFT_DOUBLE(a,b,c,d) AS3 (a,b,c,d)
106:
107: /* Print opcodes the way that GAS expects them. */
108: #define GAS_MNEMONICS 1
109:
110: /* Names to predefine in the preprocessor for this target machine. */
111:
112: #undef CPP_PREDEFINES
113: #define CPP_PREDEFINES "-Di386 -DNeXT -Dunix -D__MACH__ -D__LITTLE_ENDIAN__ -D__ARCHITECTURE__=\"i386\""
114:
115: /* This accounts for the return pc and saved fp on the i386. */
116:
117: #define OBJC_FORWARDING_STACK_OFFSET 8
118: #define OBJC_FORWARDING_MIN_OFFSET 8
119:
120: /* We do not want a dot in internal labels. */
121:
122: #undef LPREFIX
123: #define LPREFIX "L"
124:
125: #undef ASM_GENERATE_INTERNAL_LABEL
126: #define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \
127: sprintf ((BUF), "*%s%d", (PREFIX), (NUMBER))
128:
129: #undef ASM_OUTPUT_INTERNAL_LABEL
130: #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
131: fprintf (FILE, "%s%d:\n", PREFIX, NUM)
132:
133: /* Output to assembler file text saying following lines
134: may contain character constants, extra white space, comments, etc. */
135:
136: #undef ASM_APP_ON
137: #define ASM_APP_ON "#APP\n"
138:
139: /* Output to assembler file text saying following lines
140: no longer contain unusual constructs. */
141:
142: #undef ASM_APP_OFF
143: #define ASM_APP_OFF "#NO_APP\n"
144:
145: #undef ASM_OUTPUT_REG_PUSH
146: #define ASM_OUTPUT_REG_PUSH(FILE,REGNO) \
147: fprintf (FILE, "\tpushl %se%s\n", "%", reg_names[REGNO])
148:
149: #undef ASM_OUTPUT_REG_POP
150: #define ASM_OUTPUT_REG_POP(FILE,REGNO) \
151: fprintf (FILE, "\tpopl %se%s\n", "%", reg_names[REGNO])
152:
153: /* This is being overridden because the default i386 configuration
154: generates calls to "_mcount". NeXT system libraries all use
155: "mcount". */
156:
157: #undef FUNCTION_PROFILER
158: #define FUNCTION_PROFILER(FILE, LABELNO) \
159: { \
160: if (flag_pic) \
161: { \
162: fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n", \
163: LPREFIX, (LABELNO)); \
164: fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n"); \
165: } \
166: else \
167: { \
168: fprintf (FILE, "\tmovl $%sP%d,%%edx\n", LPREFIX, (LABELNO)); \
169: fprintf (FILE, "\tcall mcount\n"); \
170: } \
171: }
172:
173: /* BEGIN Calling Convention CHANGES */
174:
175: /* These changes violate the Intel/Unix ABI. Specifically, they
176: change the way that space for a block return value is passed to a
177: function. The ABI says that the pointer is passed on the stack.
178: We change to pass the pointer in %ebx. This makes the NeXT
179: Objective-C forwarding mechanism possible to implement on an i386. */
180:
181: /* Do NOT pass address of structure values on the stack. */
182:
183: #undef STRUCT_VALUE_INCOMING
184: #undef STRUCT_VALUE
185:
186: /* Pass them in %ebx. */
187:
188: #undef STRUCT_VALUE_REGNUM
189: #define STRUCT_VALUE_REGNUM 3
190:
191: /* Because we are passing the pointer in a register, we don't need to
192: rely on the callee to pop it. */
193:
194: #undef RETURN_POPS_ARGS
195: #define RETURN_POPS_ARGS(FUNTYPE,SIZE) \
196: (TREE_CODE (FUNTYPE) == IDENTIFIER_NODE \
197: ? 0 \
198: : (TARGET_RTD \
199: && (TYPE_ARG_TYPES (FUNTYPE) == 0 \
200: || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (FUNTYPE))) \
201: == void_type_node))) ? (SIZE) : 0)
202:
203: /* END Calling Convention CHANGES */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.