Deleted Added
full compact
i386.h (37312) i386.h (50654)
1/* Definitions of target machine for GNU compiler for Intel X86
2 (386, 486, Pentium).
1/* Definitions of target machine for GNU compiler for Intel X86
2 (386, 486, Pentium).
3 Copyright (C) 1988, 1992, 1994, 1995 Free Software Foundation, Inc.
3 Copyright (C) 1988, 92, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
4
5This file is part of GNU CC.
6
7GNU CC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU CC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU CC; see the file COPYING. If not, write to
19the Free Software Foundation, 59 Temple Place - Suite 330,
4
5This file is part of GNU CC.
6
7GNU CC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU CC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU CC; see the file COPYING. If not, write to
19the Free Software Foundation, 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA. */
20Boston, MA 02111-1307, USA. */
21
21
22
23/* The purpose of this file is to define the characteristics of the i386,
24 independent of assembler syntax or operating system.
25
26 Three other files build on this one to describe a specific assembler syntax:
27 bsd386.h, att386.h, and sun386.h.
28
29 The actual tm.h file for a particular system should include
30 this file, and then the file for the appropriate assembler syntax.

--- 17 unchanged lines hidden (view full) ---

48#define HALF_PIC_ENCODE(DECL)
49#define HALF_PIC_DECLARE(NAME)
50#define HALF_PIC_INIT() error ("half-pic init called on systems that don't support it.")
51#define HALF_PIC_ADDRESS_P(X) 0
52#define HALF_PIC_PTR(X) X
53#define HALF_PIC_FINISH(STREAM)
54#endif
55
22/* The purpose of this file is to define the characteristics of the i386,
23 independent of assembler syntax or operating system.
24
25 Three other files build on this one to describe a specific assembler syntax:
26 bsd386.h, att386.h, and sun386.h.
27
28 The actual tm.h file for a particular system should include
29 this file, and then the file for the appropriate assembler syntax.

--- 17 unchanged lines hidden (view full) ---

47#define HALF_PIC_ENCODE(DECL)
48#define HALF_PIC_DECLARE(NAME)
49#define HALF_PIC_INIT() error ("half-pic init called on systems that don't support it.")
50#define HALF_PIC_ADDRESS_P(X) 0
51#define HALF_PIC_PTR(X) X
52#define HALF_PIC_FINISH(STREAM)
53#endif
54
55/* Define the specific costs for a given cpu */
56
57struct processor_costs {
58 int add; /* cost of an add instruction */
59 int lea; /* cost of a lea instruction */
60 int shift_var; /* variable shift costs */
61 int shift_const; /* constant shift costs */
62 int mult_init; /* cost of starting a multiply */
63 int mult_bit; /* cost of multiply per each bit set */
64 int divide; /* cost of a divide/mod */
65};
66
67extern struct processor_costs *ix86_cost;
68
56/* Run-time compilation parameters selecting different hardware subsets. */
57
58extern int target_flags;
59
60/* Macros used in the machine description to test the flags. */
61
62/* configure can arrange to make this 2, to force a 486. */
63#ifndef TARGET_CPU_DEFAULT
64#define TARGET_CPU_DEFAULT 0
65#endif
66
67/* Masks for the -m switches */
68#define MASK_80387 000000000001 /* Hardware floating point */
69/* Run-time compilation parameters selecting different hardware subsets. */
70
71extern int target_flags;
72
73/* Macros used in the machine description to test the flags. */
74
75/* configure can arrange to make this 2, to force a 486. */
76#ifndef TARGET_CPU_DEFAULT
77#define TARGET_CPU_DEFAULT 0
78#endif
79
80/* Masks for the -m switches */
81#define MASK_80387 000000000001 /* Hardware floating point */
69#define MASK_486 000000000002 /* 80486 specific */
70#define MASK_NOTUSED1 000000000004 /* bit not currently used */
82#define MASK_NOTUSED1 000000000002 /* bit not currently used */
83#define MASK_NOTUSED2 000000000004 /* bit not currently used */
71#define MASK_RTD 000000000010 /* Use ret that pops args */
72#define MASK_ALIGN_DOUBLE 000000000020 /* align doubles to 2 word boundary */
73#define MASK_SVR3_SHLIB 000000000040 /* Uninit locals into bss */
74#define MASK_IEEE_FP 000000000100 /* IEEE fp comparisons */
75#define MASK_FLOAT_RETURNS 000000000200 /* Return float in st(0) */
76#define MASK_NO_FANCY_MATH_387 000000000400 /* Disable sin, cos, sqrt */
84#define MASK_RTD 000000000010 /* Use ret that pops args */
85#define MASK_ALIGN_DOUBLE 000000000020 /* align doubles to 2 word boundary */
86#define MASK_SVR3_SHLIB 000000000040 /* Uninit locals into bss */
87#define MASK_IEEE_FP 000000000100 /* IEEE fp comparisons */
88#define MASK_FLOAT_RETURNS 000000000200 /* Return float in st(0) */
89#define MASK_NO_FANCY_MATH_387 000000000400 /* Disable sin, cos, sqrt */
77
90#define MASK_OMIT_LEAF_FRAME_POINTER 0x00000800 /* omit leaf frame pointers */
78 /* Temporary codegen switches */
79#define MASK_DEBUG_ADDR 000001000000 /* Debug GO_IF_LEGITIMATE_ADDRESS */
80#define MASK_NO_WIDE_MULTIPLY 000002000000 /* Disable 32x32->64 multiplies */
81#define MASK_NO_MOVE 000004000000 /* Don't generate mem->mem */
91 /* Temporary codegen switches */
92#define MASK_DEBUG_ADDR 000001000000 /* Debug GO_IF_LEGITIMATE_ADDRESS */
93#define MASK_NO_WIDE_MULTIPLY 000002000000 /* Disable 32x32->64 multiplies */
94#define MASK_NO_MOVE 000004000000 /* Don't generate mem->mem */
82#define MASK_DEBUG_ARG 000010000000 /* Debug function_arg */
95#define MASK_NO_PSEUDO 000010000000 /* Move op's args -> pseudos */
96#define MASK_DEBUG_ARG 000020000000 /* Debug function_arg */
97#define MASK_SCHEDULE_PROLOGUE 000040000000 /* Emit prologue as rtl */
98#define MASK_STACK_PROBE 000100000000 /* Enable stack probing */
83
84/* Use the floating point instructions */
85#define TARGET_80387 (target_flags & MASK_80387)
86
87/* Compile using ret insn that pops args.
88 This will not work unless you use prototypes at least
89 for all functions that can take varying numbers of args. */
90#define TARGET_RTD (target_flags & MASK_RTD)

--- 16 unchanged lines hidden (view full) ---

107 in the 387 FPU or in 386 integer registers. If set, this flag causes
108 the 387 to be used, which is compatible with most calling conventions. */
109#define TARGET_FLOAT_RETURNS_IN_80387 (target_flags & MASK_FLOAT_RETURNS)
110
111/* Disable generation of FP sin, cos and sqrt operations for 387.
112 This is because FreeBSD lacks these in the math-emulator-code */
113#define TARGET_NO_FANCY_MATH_387 (target_flags & MASK_NO_FANCY_MATH_387)
114
99
100/* Use the floating point instructions */
101#define TARGET_80387 (target_flags & MASK_80387)
102
103/* Compile using ret insn that pops args.
104 This will not work unless you use prototypes at least
105 for all functions that can take varying numbers of args. */
106#define TARGET_RTD (target_flags & MASK_RTD)

--- 16 unchanged lines hidden (view full) ---

123 in the 387 FPU or in 386 integer registers. If set, this flag causes
124 the 387 to be used, which is compatible with most calling conventions. */
125#define TARGET_FLOAT_RETURNS_IN_80387 (target_flags & MASK_FLOAT_RETURNS)
126
127/* Disable generation of FP sin, cos and sqrt operations for 387.
128 This is because FreeBSD lacks these in the math-emulator-code */
129#define TARGET_NO_FANCY_MATH_387 (target_flags & MASK_NO_FANCY_MATH_387)
130
131/* Don't create frame pointers for leaf functions */
132#define TARGET_OMIT_LEAF_FRAME_POINTER (target_flags & MASK_OMIT_LEAF_FRAME_POINTER)
133
115/* Temporary switches for tuning code generation */
116
117/* Disable 32x32->64 bit multiplies that are used for long long multiplies
118 and division by constants, but sometimes cause reload problems. */
119#define TARGET_NO_WIDE_MULTIPLY (target_flags & MASK_NO_WIDE_MULTIPLY)
120#define TARGET_WIDE_MULTIPLY (!TARGET_NO_WIDE_MULTIPLY)
121
134/* Temporary switches for tuning code generation */
135
136/* Disable 32x32->64 bit multiplies that are used for long long multiplies
137 and division by constants, but sometimes cause reload problems. */
138#define TARGET_NO_WIDE_MULTIPLY (target_flags & MASK_NO_WIDE_MULTIPLY)
139#define TARGET_WIDE_MULTIPLY (!TARGET_NO_WIDE_MULTIPLY)
140
141/* Emit/Don't emit prologue as rtl */
142#define TARGET_SCHEDULE_PROLOGUE (target_flags & MASK_SCHEDULE_PROLOGUE)
143
122/* Debug GO_IF_LEGITIMATE_ADDRESS */
123#define TARGET_DEBUG_ADDR (target_flags & MASK_DEBUG_ADDR)
124
125/* Debug FUNCTION_ARG macros */
126#define TARGET_DEBUG_ARG (target_flags & MASK_DEBUG_ARG)
127
128/* Hack macros for tuning code generation */
129#define TARGET_MOVE ((target_flags & MASK_NO_MOVE) == 0) /* Don't generate memory->memory */
144/* Debug GO_IF_LEGITIMATE_ADDRESS */
145#define TARGET_DEBUG_ADDR (target_flags & MASK_DEBUG_ADDR)
146
147/* Debug FUNCTION_ARG macros */
148#define TARGET_DEBUG_ARG (target_flags & MASK_DEBUG_ARG)
149
150/* Hack macros for tuning code generation */
151#define TARGET_MOVE ((target_flags & MASK_NO_MOVE) == 0) /* Don't generate memory->memory */
152#define TARGET_PSEUDO ((target_flags & MASK_NO_PSEUDO) == 0) /* Move op's args into pseudos */
130
153
131/* Specific hardware switches */
132#define TARGET_486 (target_flags & MASK_486) /* 80486DX, 80486SX, 80486DX[24] */
133#define TARGET_386 (!TARGET_486) /* 80386 */
154#define TARGET_386 (ix86_cpu == PROCESSOR_I386)
155#define TARGET_486 (ix86_cpu == PROCESSOR_I486)
156#define TARGET_PENTIUM (ix86_cpu == PROCESSOR_PENTIUM)
157#define TARGET_PENTIUMPRO (ix86_cpu == PROCESSOR_PENTIUMPRO)
158#define TARGET_USE_LEAVE (ix86_cpu == PROCESSOR_I386)
159#define TARGET_PUSH_MEMORY (ix86_cpu == PROCESSOR_I386)
160#define TARGET_ZERO_EXTEND_WITH_AND (ix86_cpu != PROCESSOR_I386 \
161 && ix86_cpu != PROCESSOR_PENTIUMPRO)
162#define TARGET_DOUBLE_WITH_ADD (ix86_cpu != PROCESSOR_I386)
163#define TARGET_USE_BIT_TEST (ix86_cpu == PROCESSOR_I386)
164#define TARGET_UNROLL_STRLEN (ix86_cpu != PROCESSOR_I386)
165#define TARGET_USE_Q_REG (ix86_cpu == PROCESSOR_PENTIUM \
166 || ix86_cpu == PROCESSOR_PENTIUMPRO)
167#define TARGET_USE_ANY_REG (ix86_cpu == PROCESSOR_I486)
168#define TARGET_CMOVE (ix86_arch == PROCESSOR_PENTIUMPRO)
169#define TARGET_DEEP_BRANCH_PREDICTION (ix86_cpu == PROCESSOR_PENTIUMPRO)
170#define TARGET_STACK_PROBE (target_flags & MASK_STACK_PROBE)
134
135#define TARGET_SWITCHES \
136{ { "80387", MASK_80387 }, \
137 { "no-80387", -MASK_80387 }, \
138 { "hard-float", MASK_80387 }, \
139 { "soft-float", -MASK_80387 }, \
140 { "no-soft-float", MASK_80387 }, \
171
172#define TARGET_SWITCHES \
173{ { "80387", MASK_80387 }, \
174 { "no-80387", -MASK_80387 }, \
175 { "hard-float", MASK_80387 }, \
176 { "soft-float", -MASK_80387 }, \
177 { "no-soft-float", MASK_80387 }, \
141 { "386", -MASK_486 }, \
142 { "no-386", MASK_486 }, \
143 { "486", MASK_486 }, \
144 { "no-486", -MASK_486 }, \
178 { "386", 0 }, \
179 { "no-386", 0 }, \
180 { "486", 0 }, \
181 { "no-486", 0 }, \
182 { "pentium", 0 }, \
183 { "pentiumpro", 0 }, \
145 { "rtd", MASK_RTD }, \
146 { "no-rtd", -MASK_RTD }, \
147 { "align-double", MASK_ALIGN_DOUBLE }, \
148 { "no-align-double", -MASK_ALIGN_DOUBLE }, \
149 { "svr3-shlib", MASK_SVR3_SHLIB }, \
150 { "no-svr3-shlib", -MASK_SVR3_SHLIB }, \
151 { "ieee-fp", MASK_IEEE_FP }, \
152 { "no-ieee-fp", -MASK_IEEE_FP }, \
153 { "fp-ret-in-387", MASK_FLOAT_RETURNS }, \
154 { "no-fp-ret-in-387", -MASK_FLOAT_RETURNS }, \
155 { "no-fancy-math-387", MASK_NO_FANCY_MATH_387 }, \
156 { "fancy-math-387", -MASK_NO_FANCY_MATH_387 }, \
184 { "rtd", MASK_RTD }, \
185 { "no-rtd", -MASK_RTD }, \
186 { "align-double", MASK_ALIGN_DOUBLE }, \
187 { "no-align-double", -MASK_ALIGN_DOUBLE }, \
188 { "svr3-shlib", MASK_SVR3_SHLIB }, \
189 { "no-svr3-shlib", -MASK_SVR3_SHLIB }, \
190 { "ieee-fp", MASK_IEEE_FP }, \
191 { "no-ieee-fp", -MASK_IEEE_FP }, \
192 { "fp-ret-in-387", MASK_FLOAT_RETURNS }, \
193 { "no-fp-ret-in-387", -MASK_FLOAT_RETURNS }, \
194 { "no-fancy-math-387", MASK_NO_FANCY_MATH_387 }, \
195 { "fancy-math-387", -MASK_NO_FANCY_MATH_387 }, \
196 { "omit-leaf-frame-pointer", MASK_OMIT_LEAF_FRAME_POINTER }, \
197 { "no-omit-leaf-frame-pointer",-MASK_OMIT_LEAF_FRAME_POINTER }, \
157 { "no-wide-multiply", MASK_NO_WIDE_MULTIPLY }, \
158 { "wide-multiply", -MASK_NO_WIDE_MULTIPLY }, \
198 { "no-wide-multiply", MASK_NO_WIDE_MULTIPLY }, \
199 { "wide-multiply", -MASK_NO_WIDE_MULTIPLY }, \
200 { "schedule-prologue", MASK_SCHEDULE_PROLOGUE }, \
201 { "no-schedule-prologue", -MASK_SCHEDULE_PROLOGUE }, \
159 { "debug-addr", MASK_DEBUG_ADDR }, \
160 { "no-debug-addr", -MASK_DEBUG_ADDR }, \
161 { "move", -MASK_NO_MOVE }, \
162 { "no-move", MASK_NO_MOVE }, \
163 { "debug-arg", MASK_DEBUG_ARG }, \
164 { "no-debug-arg", -MASK_DEBUG_ARG }, \
202 { "debug-addr", MASK_DEBUG_ADDR }, \
203 { "no-debug-addr", -MASK_DEBUG_ADDR }, \
204 { "move", -MASK_NO_MOVE }, \
205 { "no-move", MASK_NO_MOVE }, \
206 { "debug-arg", MASK_DEBUG_ARG }, \
207 { "no-debug-arg", -MASK_DEBUG_ARG }, \
208 { "stack-arg-probe", MASK_STACK_PROBE }, \
209 { "no-stack-arg-probe", -MASK_STACK_PROBE }, \
210 { "windows", 0 }, \
211 { "dll", 0 }, \
165 SUBTARGET_SWITCHES \
212 SUBTARGET_SWITCHES \
166 { "", TARGET_DEFAULT | TARGET_CPU_DEFAULT}}
213 { "", MASK_SCHEDULE_PROLOGUE | TARGET_DEFAULT}}
167
214
215/* Which processor to schedule for. The cpu attribute defines a list that
216 mirrors this list, so changes to i386.md must be made at the same time. */
217
218enum processor_type
219 {PROCESSOR_I386, /* 80386 */
220 PROCESSOR_I486, /* 80486DX, 80486SX, 80486DX[24] */
221 PROCESSOR_PENTIUM,
222 PROCESSOR_PENTIUMPRO};
223
224#define PROCESSOR_I386_STRING "i386"
225#define PROCESSOR_I486_STRING "i486"
226#define PROCESSOR_I586_STRING "i586"
227#define PROCESSOR_PENTIUM_STRING "pentium"
228#define PROCESSOR_I686_STRING "i686"
229#define PROCESSOR_PENTIUMPRO_STRING "pentiumpro"
230
231extern enum processor_type ix86_cpu;
232
233extern int ix86_arch;
234
235/* Define the default processor. This is overridden by other tm.h files. */
236#define PROCESSOR_DEFAULT \
237 ((enum processor_type) TARGET_CPU_DEFAULT == PROCESSOR_I486) \
238 ? PROCESSOR_I486 \
239 : ((enum processor_type) TARGET_CPU_DEFAULT == PROCESSOR_PENTIUM) \
240 ? PROCESSOR_PENTIUM \
241 : ((enum processor_type) TARGET_CPU_DEFAULT == PROCESSOR_PENTIUMPRO) \
242 ? PROCESSOR_PENTIUMPRO \
243 : PROCESSOR_I386
244#define PROCESSOR_DEFAULT_STRING \
245 ((enum processor_type) TARGET_CPU_DEFAULT == PROCESSOR_I486) \
246 ? PROCESSOR_I486_STRING \
247 : ((enum processor_type) TARGET_CPU_DEFAULT == PROCESSOR_PENTIUM) \
248 ? PROCESSOR_PENTIUM_STRING \
249 : ((enum processor_type) TARGET_CPU_DEFAULT == PROCESSOR_PENTIUMPRO) \
250 ? PROCESSOR_PENTIUMPRO_STRING \
251 : PROCESSOR_I386_STRING
252
168/* This macro is similar to `TARGET_SWITCHES' but defines names of
169 command options that have values. Its definition is an
170 initializer with a subgrouping for each command option.
171
172 Each subgrouping contains a string constant, that defines the
173 fixed part of the option name, and the address of a variable. The
174 variable, type `char *', is set to the variable part of the given
175 option if the fixed part matches. The actual option name is made
176 by appending `-m' to the specified name. */
177#define TARGET_OPTIONS \
253/* This macro is similar to `TARGET_SWITCHES' but defines names of
254 command options that have values. Its definition is an
255 initializer with a subgrouping for each command option.
256
257 Each subgrouping contains a string constant, that defines the
258 fixed part of the option name, and the address of a variable. The
259 variable, type `char *', is set to the variable part of the given
260 option if the fixed part matches. The actual option name is made
261 by appending `-m' to the specified name. */
262#define TARGET_OPTIONS \
178{ { "reg-alloc=", &i386_reg_alloc_order }, \
263{ { "cpu=", &ix86_cpu_string}, \
264 { "arch=", &ix86_arch_string}, \
265 { "reg-alloc=", &i386_reg_alloc_order }, \
179 { "regparm=", &i386_regparm_string }, \
180 { "align-loops=", &i386_align_loops_string }, \
181 { "align-jumps=", &i386_align_jumps_string }, \
182 { "align-functions=", &i386_align_funcs_string }, \
266 { "regparm=", &i386_regparm_string }, \
267 { "align-loops=", &i386_align_loops_string }, \
268 { "align-jumps=", &i386_align_jumps_string }, \
269 { "align-functions=", &i386_align_funcs_string }, \
270 { "branch-cost=", &i386_branch_cost_string }, \
183 SUBTARGET_OPTIONS \
184}
185
186/* Sometimes certain combinations of command options do not make
187 sense on a particular target machine. You can define a macro
188 `OVERRIDE_OPTIONS' to take account of this. This macro, if
189 defined, is executed once just after all the command options have
190 been parsed.
191
192 Don't use this macro to turn on various extra optimizations for
193 `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */
194
195#define OVERRIDE_OPTIONS override_options ()
196
197/* These are meant to be redefined in the host dependent files */
198#define SUBTARGET_SWITCHES
199#define SUBTARGET_OPTIONS
200
271 SUBTARGET_OPTIONS \
272}
273
274/* Sometimes certain combinations of command options do not make
275 sense on a particular target machine. You can define a macro
276 `OVERRIDE_OPTIONS' to take account of this. This macro, if
277 defined, is executed once just after all the command options have
278 been parsed.
279
280 Don't use this macro to turn on various extra optimizations for
281 `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */
282
283#define OVERRIDE_OPTIONS override_options ()
284
285/* These are meant to be redefined in the host dependent files */
286#define SUBTARGET_SWITCHES
287#define SUBTARGET_OPTIONS
288
289/* Define this to change the optimizations performed by default. */
290#define OPTIMIZATION_OPTIONS(LEVEL,SIZE) optimization_options(LEVEL,SIZE)
291
292/* Specs for the compiler proper */
293
294#ifndef CC1_CPU_SPEC
295#define CC1_CPU_SPEC "\
296%{!mcpu*: \
297%{m386:-mcpu=i386 -march=i386} \
298%{mno-486:-mcpu=i386 -march=i386} \
299%{m486:-mcpu=i486 -march=i486} \
300%{mno-386:-mcpu=i486 -march=i486} \
301%{mno-pentium:-mcpu=i486 -march=i486} \
302%{mpentium:-mcpu=pentium} \
303%{mno-pentiumpro:-mcpu=pentium} \
304%{mpentiumpro:-mcpu=pentiumpro}}"
305#endif
201
306
307#define CPP_486_SPEC "%{!ansi:-Di486} -D__i486 -D__i486__"
308#define CPP_586_SPEC "%{!ansi:-Di586 -Dpentium} \
309 -D__i586 -D__i586__ -D__pentium -D__pentium__"
310#define CPP_686_SPEC "%{!ansi:-Di686 -Dpentiumpro} \
311 -D__i686 -D__i686__ -D__pentiumpro -D__pentiumpro__"
312
313#ifndef CPP_CPU_DEFAULT_SPEC
314#if TARGET_CPU_DEFAULT == 1
315#define CPP_CPU_DEFAULT_SPEC "%(cpp_486)"
316#else
317#if TARGET_CPU_DEFAULT == 2
318#define CPP_CPU_DEFAULT_SPEC "%(cpp_586)"
319#else
320#if TARGET_CPU_DEFAULT == 3
321#define CPP_CPU_DEFAULT_SPEC "%(cpp_686)"
322#else
323#define CPP_CPU_DEFAULT_SPEC ""
324#endif
325#endif
326#endif
327#endif /* CPP_CPU_DEFAULT_SPEC */
328
329#ifndef CPP_CPU_SPEC
330#define CPP_CPU_SPEC "\
331-Asystem(unix) -Acpu(i386) -Amachine(i386) \
332%{!ansi:-Di386} -D__i386 -D__i386__ \
333%{mcpu=i486:%(cpp_486)} %{m486:%(cpp_486)} \
334%{mpentium:%(cpp_586)} %{mcpu=pentium:%(cpp_586)} \
335%{mpentiumpro:%(cpp_686)} %{mcpu=pentiumpro:%(cpp_686)} \
336%{!mcpu*:%{!m486:%{!mpentium*:%(cpp_cpu_default)}}}"
337#endif
338
339#ifndef CC1_SPEC
340#define CC1_SPEC "%(cc1_spec) "
341#endif
342
343/* This macro defines names of additional specifications to put in the
344 specs that can be used in various specifications like CC1_SPEC. Its
345 definition is an initializer with a subgrouping for each command option.
346
347 Each subgrouping contains a string constant, that defines the
348 specification name, and a string constant that used by the GNU CC driver
349 program.
350
351 Do not define this macro if it does not need to do anything. */
352
353#ifndef SUBTARGET_EXTRA_SPECS
354#define SUBTARGET_EXTRA_SPECS
355#endif
356
357#define EXTRA_SPECS \
358 { "cpp_486", CPP_486_SPEC}, \
359 { "cpp_586", CPP_586_SPEC}, \
360 { "cpp_686", CPP_686_SPEC}, \
361 { "cpp_cpu_default", CPP_CPU_DEFAULT_SPEC }, \
362 { "cpp_cpu", CPP_CPU_SPEC }, \
363 { "cc1_cpu", CC1_CPU_SPEC }, \
364 SUBTARGET_EXTRA_SPECS
365
202/* target machine storage layout */
203
204/* Define for XFmode extended real floating point support.
205 This will automatically cause REAL_ARITHMETIC to be defined. */
206#define LONG_DOUBLE_TYPE_SIZE 96
207
208/* Define if you don't want extended real, but do want to use the
209 software floating point emulator for REAL_ARITHMETIC and

--- 50 unchanged lines hidden (view full) ---

260 might need to be aligned. No data type wants to be aligned
261 rounder than this. The i386 supports 64-bit floating point
262 quantities, but these can be aligned on any 32-bit boundary.
263 The published ABIs say that doubles should be aligned on word
264 boundaries, but the Pentium gets better performance with them
265 aligned on 64 bit boundaries. */
266#define BIGGEST_ALIGNMENT (TARGET_ALIGN_DOUBLE ? 64 : 32)
267
366/* target machine storage layout */
367
368/* Define for XFmode extended real floating point support.
369 This will automatically cause REAL_ARITHMETIC to be defined. */
370#define LONG_DOUBLE_TYPE_SIZE 96
371
372/* Define if you don't want extended real, but do want to use the
373 software floating point emulator for REAL_ARITHMETIC and

--- 50 unchanged lines hidden (view full) ---

424 might need to be aligned. No data type wants to be aligned
425 rounder than this. The i386 supports 64-bit floating point
426 quantities, but these can be aligned on any 32-bit boundary.
427 The published ABIs say that doubles should be aligned on word
428 boundaries, but the Pentium gets better performance with them
429 aligned on 64 bit boundaries. */
430#define BIGGEST_ALIGNMENT (TARGET_ALIGN_DOUBLE ? 64 : 32)
431
432/* If defined, a C expression to compute the alignment given to a
433 constant that is being placed in memory. CONSTANT is the constant
434 and ALIGN is the alignment that the object would ordinarily have.
435 The value of this macro is used instead of that alignment to align
436 the object.
437
438 If this macro is not defined, then ALIGN is used.
439
440 The typical use of this macro is to increase alignment for string
441 constants to be word aligned so that `strcpy' calls that copy
442 constants can be done inline. */
443
444#define CONSTANT_ALIGNMENT(EXP, ALIGN) \
445 (TREE_CODE (EXP) == REAL_CST \
446 ? ((TYPE_MODE (TREE_TYPE (EXP)) == DFmode && (ALIGN) < 64) \
447 ? 64 \
448 : (TYPE_MODE (TREE_TYPE (EXP)) == XFmode && (ALIGN) < 128) \
449 ? 128 \
450 : (ALIGN)) \
451 : TREE_CODE (EXP) == STRING_CST \
452 ? ((TREE_STRING_LENGTH (EXP) >= 31 && (ALIGN) < 256) \
453 ? 256 \
454 : (ALIGN)) \
455 : (ALIGN))
456
457/* If defined, a C expression to compute the alignment for a static
458 variable. TYPE is the data type, and ALIGN is the alignment that
459 the object would ordinarily have. The value of this macro is used
460 instead of that alignment to align the object.
461
462 If this macro is not defined, then ALIGN is used.
463
464 One use of this macro is to increase alignment of medium-size
465 data to make it all fit in fewer cache lines. Another is to
466 cause character arrays to be word-aligned so that `strcpy' calls
467 that copy constants to character arrays can be done inline. */
468
469#define DATA_ALIGNMENT(TYPE, ALIGN) \
470 ((AGGREGATE_TYPE_P (TYPE) \
471 && TYPE_SIZE (TYPE) \
472 && TREE_CODE (TYPE_SIZE (TYPE)) == INTEGER_CST \
473 && (TREE_INT_CST_LOW (TYPE_SIZE (TYPE)) >= 256 \
474 || TREE_INT_CST_HIGH (TYPE_SIZE (TYPE))) && (ALIGN) < 256) \
475 ? 256 \
476 : TREE_CODE (TYPE) == ARRAY_TYPE \
477 ? ((TYPE_MODE (TREE_TYPE (TYPE)) == DFmode && (ALIGN) < 64) \
478 ? 64 \
479 : (TYPE_MODE (TREE_TYPE (TYPE)) == XFmode && (ALIGN) < 128) \
480 ? 128 \
481 : (ALIGN)) \
482 : TREE_CODE (TYPE) == COMPLEX_TYPE \
483 ? ((TYPE_MODE (TYPE) == DCmode && (ALIGN) < 64) \
484 ? 64 \
485 : (TYPE_MODE (TYPE) == XCmode && (ALIGN) < 128) \
486 ? 128 \
487 : (ALIGN)) \
488 : ((TREE_CODE (TYPE) == RECORD_TYPE \
489 || TREE_CODE (TYPE) == UNION_TYPE \
490 || TREE_CODE (TYPE) == QUAL_UNION_TYPE) \
491 && TYPE_FIELDS (TYPE)) \
492 ? ((DECL_MODE (TYPE_FIELDS (TYPE)) == DFmode && (ALIGN) < 64) \
493 ? 64 \
494 : (DECL_MODE (TYPE_FIELDS (TYPE)) == XFmode && (ALIGN) < 128) \
495 ? 128 \
496 : (ALIGN)) \
497 : TREE_CODE (TYPE) == REAL_TYPE \
498 ? ((TYPE_MODE (TYPE) == DFmode && (ALIGN) < 64) \
499 ? 64 \
500 : (TYPE_MODE (TYPE) == XFmode && (ALIGN) < 128) \
501 ? 128 \
502 : (ALIGN)) \
503 : (ALIGN))
504
268/* Set this non-zero if move instructions will actually fail to work
269 when given unaligned data. */
270#define STRICT_ALIGNMENT 0
271
272/* If bit field type is int, don't let it cross an int,
273 and give entire struct the alignment of an int. */
274/* Required on the 386 since it doesn't have bitfield insns. */
275#define PCC_BITFIELD_TYPE_MATTERS 1
276
277/* Maximum power of 2 that code can be aligned to. */
278#define MAX_CODE_ALIGN 6 /* 64 byte alignment */
279
280/* Align loop starts for optimal branching. */
505/* Set this non-zero if move instructions will actually fail to work
506 when given unaligned data. */
507#define STRICT_ALIGNMENT 0
508
509/* If bit field type is int, don't let it cross an int,
510 and give entire struct the alignment of an int. */
511/* Required on the 386 since it doesn't have bitfield insns. */
512#define PCC_BITFIELD_TYPE_MATTERS 1
513
514/* Maximum power of 2 that code can be aligned to. */
515#define MAX_CODE_ALIGN 6 /* 64 byte alignment */
516
517/* Align loop starts for optimal branching. */
281#define ASM_OUTPUT_LOOP_ALIGN(FILE) ASM_OUTPUT_ALIGN (FILE, i386_align_loops)
518#define LOOP_ALIGN(LABEL) (i386_align_loops)
519#define LOOP_ALIGN_MAX_SKIP (i386_align_loops_string ? 0 : 7)
282
283/* This is how to align an instruction for optimal branching.
284 On i486 we'll get better performance by aligning on a
285 cache line (i.e. 16 byte) boundary. */
520
521/* This is how to align an instruction for optimal branching.
522 On i486 we'll get better performance by aligning on a
523 cache line (i.e. 16 byte) boundary. */
286#define ASM_OUTPUT_ALIGN_CODE(FILE) ASM_OUTPUT_ALIGN ((FILE), i386_align_jumps)
524#define LABEL_ALIGN_AFTER_BARRIER(LABEL) (i386_align_jumps)
525#define LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP (i386_align_jumps_string ? 0 : 7)
287
288
289/* Standard register usage. */
290
291/* This processor has special stack-like registers. See reg-stack.c
292 for details. */
293
294#define STACK_REGS
526
527
528/* Standard register usage. */
529
530/* This processor has special stack-like registers. See reg-stack.c
531 for details. */
532
533#define STACK_REGS
534#define IS_STACK_MODE(mode) (mode==DFmode || mode==SFmode || mode==XFmode)
295
296/* Number of actual hardware registers.
297 The hardware registers are assigned numbers for the compiler
298 from 0 to just below FIRST_PSEUDO_REGISTER.
299 All registers that the compiler knows about must be given numbers,
300 even those that are not normally considered general registers.
301
302 In the 80386 we give the 8 general purpose registers the numbers 0-7.

--- 101 unchanged lines hidden (view full) ---

404 On the 80386, the first 4 cpu registers can hold any mode
405 while the floating point registers may hold only floating point.
406 Make it clear that the fp regs could not hold a 16-byte float. */
407
408/* The casts to int placate a compiler on a microvax,
409 for cross-compiler testing. */
410
411#define HARD_REGNO_MODE_OK(REGNO, MODE) \
535
536/* Number of actual hardware registers.
537 The hardware registers are assigned numbers for the compiler
538 from 0 to just below FIRST_PSEUDO_REGISTER.
539 All registers that the compiler knows about must be given numbers,
540 even those that are not normally considered general registers.
541
542 In the 80386 we give the 8 general purpose registers the numbers 0-7.

--- 101 unchanged lines hidden (view full) ---

644 On the 80386, the first 4 cpu registers can hold any mode
645 while the floating point registers may hold only floating point.
646 Make it clear that the fp regs could not hold a 16-byte float. */
647
648/* The casts to int placate a compiler on a microvax,
649 for cross-compiler testing. */
650
651#define HARD_REGNO_MODE_OK(REGNO, MODE) \
412 ((REGNO) < 2 ? 1 \
413 : (REGNO) < 4 ? 1 \
652 ((REGNO) < 4 ? 1 \
414 : FP_REGNO_P (REGNO) \
415 ? (((int) GET_MODE_CLASS (MODE) == (int) MODE_FLOAT \
416 || (int) GET_MODE_CLASS (MODE) == (int) MODE_COMPLEX_FLOAT) \
653 : FP_REGNO_P (REGNO) \
654 ? (((int) GET_MODE_CLASS (MODE) == (int) MODE_FLOAT \
655 || (int) GET_MODE_CLASS (MODE) == (int) MODE_COMPLEX_FLOAT) \
417 && GET_MODE_UNIT_SIZE (MODE) <= 12) \
418 : (int) (MODE) != (int) QImode)
656 && GET_MODE_UNIT_SIZE (MODE) <= (LONG_DOUBLE_TYPE_SIZE == 96 ? 12 : 8))\
657 : (int) (MODE) != (int) QImode ? 1 \
658 : (reload_in_progress | reload_completed) == 1)
419
420/* Value is 1 if it is a good idea to tie two pseudo registers
421 when one has mode MODE1 and one has mode MODE2.
422 If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
423 for any hard reg, then this must be 0 for correct output. */
424
659
660/* Value is 1 if it is a good idea to tie two pseudo registers
661 when one has mode MODE1 and one has mode MODE2.
662 If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
663 for any hard reg, then this must be 0 for correct output. */
664
425#define MODES_TIEABLE_P(MODE1, MODE2) ((MODE1) == (MODE2))
665#define MODES_TIEABLE_P(MODE1, MODE2) \
666 ((MODE1) == (MODE2) \
667 || ((MODE1) == SImode && (MODE2) == HImode \
668 || (MODE1) == HImode && (MODE2) == SImode))
426
669
427/* A C expression returning the cost of moving data from a register of class
428 CLASS1 to one of CLASS2.
429
430 On the i386, copying between floating-point and fixed-point
431 registers is expensive. */
432
433#define REGISTER_MOVE_COST(CLASS1, CLASS2) \
434 (((FLOAT_CLASS_P (CLASS1) && ! FLOAT_CLASS_P (CLASS2)) \
435 || (! FLOAT_CLASS_P (CLASS1) && FLOAT_CLASS_P (CLASS2))) ? 10 \
436 : 2)
437
438/* Specify the registers used for certain standard purposes.
439 The values of these macros are register numbers. */
440
441/* on the 386 the pc register is %eip, and is not usable as a general
442 register. The ordinary mov instructions won't work */
443/* #define PC_REGNUM */
444
445/* Register to use for pushing function arguments. */

--- 8 unchanged lines hidden (view full) ---

454/* First & last stack-like regs */
455#define FIRST_STACK_REG FIRST_FLOAT_REG
456#define LAST_STACK_REG (FIRST_FLOAT_REG + 7)
457
458/* Value should be nonzero if functions must have frame pointers.
459 Zero means the frame pointer need not be set up (and parms
460 may be accessed via the stack pointer) in functions that seem suitable.
461 This is computed in `reload', in reload1.c. */
670/* Specify the registers used for certain standard purposes.
671 The values of these macros are register numbers. */
672
673/* on the 386 the pc register is %eip, and is not usable as a general
674 register. The ordinary mov instructions won't work */
675/* #define PC_REGNUM */
676
677/* Register to use for pushing function arguments. */

--- 8 unchanged lines hidden (view full) ---

686/* First & last stack-like regs */
687#define FIRST_STACK_REG FIRST_FLOAT_REG
688#define LAST_STACK_REG (FIRST_FLOAT_REG + 7)
689
690/* Value should be nonzero if functions must have frame pointers.
691 Zero means the frame pointer need not be set up (and parms
692 may be accessed via the stack pointer) in functions that seem suitable.
693 This is computed in `reload', in reload1.c. */
462#define FRAME_POINTER_REQUIRED 0
694#define FRAME_POINTER_REQUIRED (TARGET_OMIT_LEAF_FRAME_POINTER && !leaf_function_p ())
463
464/* Base register for access to arguments of the function. */
465#define ARG_POINTER_REGNUM 16
466
467/* Register in which static-chain is passed to a function. */
468#define STATIC_CHAIN_REGNUM 2
469
470/* Register to hold the addressing base for position independent

--- 86 unchanged lines hidden (view full) ---

557 "FLOAT_REGS", \
558 "ALL_REGS" }
559
560/* Define which registers fit in which classes.
561 This is an initializer for a vector of HARD_REG_SET
562 of length N_REG_CLASSES. */
563
564#define REG_CLASS_CONTENTS \
695
696/* Base register for access to arguments of the function. */
697#define ARG_POINTER_REGNUM 16
698
699/* Register in which static-chain is passed to a function. */
700#define STATIC_CHAIN_REGNUM 2
701
702/* Register to hold the addressing base for position independent

--- 86 unchanged lines hidden (view full) ---

789 "FLOAT_REGS", \
790 "ALL_REGS" }
791
792/* Define which registers fit in which classes.
793 This is an initializer for a vector of HARD_REG_SET
794 of length N_REG_CLASSES. */
795
796#define REG_CLASS_CONTENTS \
565{ 0, \
566 0x1, 0x2, 0x4, 0x8, /* AREG, DREG, CREG, BREG */ \
567 0x3, /* AD_REGS */ \
568 0xf, /* Q_REGS */ \
569 0x10, 0x20, /* SIREG, DIREG */ \
570 0x07f, /* INDEX_REGS */ \
571 0x100ff, /* GENERAL_REGS */ \
572 0x0100, 0x0200, /* FP_TOP_REG, FP_SECOND_REG */ \
573 0xff00, /* FLOAT_REGS */ \
574 0x1ffff }
797{ {0}, \
798 {0x1}, {0x2}, {0x4}, {0x8}, /* AREG, DREG, CREG, BREG */ \
799 {0x3}, /* AD_REGS */ \
800 {0xf}, /* Q_REGS */ \
801 {0x10}, {0x20}, /* SIREG, DIREG */ \
802 {0x7f}, /* INDEX_REGS */ \
803 {0x100ff}, /* GENERAL_REGS */ \
804 {0x0100}, {0x0200}, /* FP_TOP_REG, FP_SECOND_REG */ \
805 {0xff00}, /* FLOAT_REGS */ \
806 {0x1ffff}}
575
576/* The same information, inverted:
577 Return the class number of the smallest class containing
578 reg number REGNO. This could be a conditional expression
579 or could index an array. */
580
581#define REGNO_REG_CLASS(REGNO) (regclass_map[REGNO])
582
583/* When defined, the compiler allows registers explicitly used in the
584 rtl to be used as spill registers but prevents the compiler from
585 extending the lifetime of these registers. */
586
807
808/* The same information, inverted:
809 Return the class number of the smallest class containing
810 reg number REGNO. This could be a conditional expression
811 or could index an array. */
812
813#define REGNO_REG_CLASS(REGNO) (regclass_map[REGNO])
814
815/* When defined, the compiler allows registers explicitly used in the
816 rtl to be used as spill registers but prevents the compiler from
817 extending the lifetime of these registers. */
818
587#define SMALL_REGISTER_CLASSES
819#define SMALL_REGISTER_CLASSES 1
588
589#define QI_REG_P(X) \
590 (REG_P (X) && REGNO (X) < 4)
591#define NON_QI_REG_P(X) \
592 (REG_P (X) && REGNO (X) >= 4 && REGNO (X) < FIRST_PSEUDO_REGISTER)
593
594#define FP_REG_P(X) (REG_P (X) && FP_REGNO_P (REGNO (X)))
595#define FP_REGNO_P(n) ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG)

--- 57 unchanged lines hidden (view full) ---

653
654#define CONST_OK_FOR_LETTER_P(VALUE, C) \
655 ((C) == 'I' ? (VALUE) >= 0 && (VALUE) <= 31 : \
656 (C) == 'J' ? (VALUE) >= 0 && (VALUE) <= 63 : \
657 (C) == 'K' ? (VALUE) == 0xff : \
658 (C) == 'L' ? (VALUE) == 0xffff : \
659 (C) == 'M' ? (VALUE) >= 0 && (VALUE) <= 3 : \
660 (C) == 'N' ? (VALUE) >= 0 && (VALUE) <= 255 :\
820
821#define QI_REG_P(X) \
822 (REG_P (X) && REGNO (X) < 4)
823#define NON_QI_REG_P(X) \
824 (REG_P (X) && REGNO (X) >= 4 && REGNO (X) < FIRST_PSEUDO_REGISTER)
825
826#define FP_REG_P(X) (REG_P (X) && FP_REGNO_P (REGNO (X)))
827#define FP_REGNO_P(n) ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG)

--- 57 unchanged lines hidden (view full) ---

885
886#define CONST_OK_FOR_LETTER_P(VALUE, C) \
887 ((C) == 'I' ? (VALUE) >= 0 && (VALUE) <= 31 : \
888 (C) == 'J' ? (VALUE) >= 0 && (VALUE) <= 63 : \
889 (C) == 'K' ? (VALUE) == 0xff : \
890 (C) == 'L' ? (VALUE) == 0xffff : \
891 (C) == 'M' ? (VALUE) >= 0 && (VALUE) <= 3 : \
892 (C) == 'N' ? (VALUE) >= 0 && (VALUE) <= 255 :\
893 (C) == 'O' ? (VALUE) >= 0 && (VALUE) <= 32 : \
661 0)
662
663/* Similar, but for floating constants, and defining letters G and H.
664 Here VALUE is the CONST_DOUBLE rtx itself. We allow constants even if
665 TARGET_387 isn't set, because the stack register converter may need to
894 0)
895
896/* Similar, but for floating constants, and defining letters G and H.
897 Here VALUE is the CONST_DOUBLE rtx itself. We allow constants even if
898 TARGET_387 isn't set, because the stack register converter may need to
666 load 0.0 into the function value register. */
899 load 0.0 into the function value register.
667
900
901 We disallow these constants when -fomit-frame-pointer and compiling
902 PIC code since reload might need to force the constant to memory.
903 Forcing the constant to memory changes the elimination offsets after
904 the point where they must stay constant.
905
906 However, we must allow them after reload as completed as reg-stack.c
907 will create insns which use these constants. */
908
668#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
909#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
669 ((C) == 'G' ? standard_80387_constant_p (VALUE) : 0)
910 (((reload_completed || !flag_pic || !flag_omit_frame_pointer) && (C) == 'G') \
911 ? standard_80387_constant_p (VALUE) : 0)
670
671/* Place additional restrictions on the register class to use when it
672 is necessary to be able to hold a value of mode MODE in a reload
673 register for which class CLASS would ordinarily be used. */
674
675#define LIMIT_RELOAD_CLASS(MODE, CLASS) \
676 ((MODE) == QImode && ((CLASS) == ALL_REGS || (CLASS) == GENERAL_REGS) \
677 ? Q_REGS : (CLASS))

--- 108 unchanged lines hidden (view full) ---

786#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \
787 (i386_return_pops_args (FUNDECL, FUNTYPE, SIZE))
788
789/* Define how to find the value returned by a function.
790 VALTYPE is the data type of the value (as a tree).
791 If the precise function being called is known, FUNC is its FUNCTION_DECL;
792 otherwise, FUNC is 0. */
793#define FUNCTION_VALUE(VALTYPE, FUNC) \
912
913/* Place additional restrictions on the register class to use when it
914 is necessary to be able to hold a value of mode MODE in a reload
915 register for which class CLASS would ordinarily be used. */
916
917#define LIMIT_RELOAD_CLASS(MODE, CLASS) \
918 ((MODE) == QImode && ((CLASS) == ALL_REGS || (CLASS) == GENERAL_REGS) \
919 ? Q_REGS : (CLASS))

--- 108 unchanged lines hidden (view full) ---

1028#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \
1029 (i386_return_pops_args (FUNDECL, FUNTYPE, SIZE))
1030
1031/* Define how to find the value returned by a function.
1032 VALTYPE is the data type of the value (as a tree).
1033 If the precise function being called is known, FUNC is its FUNCTION_DECL;
1034 otherwise, FUNC is 0. */
1035#define FUNCTION_VALUE(VALTYPE, FUNC) \
794 gen_rtx (REG, TYPE_MODE (VALTYPE), \
1036 gen_rtx_REG (TYPE_MODE (VALTYPE), \
795 VALUE_REGNO (TYPE_MODE (VALTYPE)))
796
797/* Define how to find the value returned by a library function
798 assuming the value has mode MODE. */
799
800#define LIBCALL_VALUE(MODE) \
1037 VALUE_REGNO (TYPE_MODE (VALTYPE)))
1038
1039/* Define how to find the value returned by a library function
1040 assuming the value has mode MODE. */
1041
1042#define LIBCALL_VALUE(MODE) \
801 gen_rtx (REG, MODE, VALUE_REGNO (MODE))
1043 gen_rtx_REG (MODE, VALUE_REGNO (MODE))
802
803/* Define the size of the result block used for communication between
804 untyped_call and untyped_return. The block contains a DImode value
805 followed by the block used by fnsave and frstor. */
806
807#define APPLY_RESULT_SIZE (8+108)
808
809/* 1 if N is a possible register number for function argument passing. */

--- 10 unchanged lines hidden (view full) ---

820 int nregs; /* # registers available for passing */
821 int regno; /* next available register number */
822} CUMULATIVE_ARGS;
823
824/* Initialize a variable CUM of type CUMULATIVE_ARGS
825 for a call to a function whose data type is FNTYPE.
826 For a library call, FNTYPE is 0. */
827
1044
1045/* Define the size of the result block used for communication between
1046 untyped_call and untyped_return. The block contains a DImode value
1047 followed by the block used by fnsave and frstor. */
1048
1049#define APPLY_RESULT_SIZE (8+108)
1050
1051/* 1 if N is a possible register number for function argument passing. */

--- 10 unchanged lines hidden (view full) ---

1062 int nregs; /* # registers available for passing */
1063 int regno; /* next available register number */
1064} CUMULATIVE_ARGS;
1065
1066/* Initialize a variable CUM of type CUMULATIVE_ARGS
1067 for a call to a function whose data type is FNTYPE.
1068 For a library call, FNTYPE is 0. */
1069
828#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME) \
1070#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \
829 (init_cumulative_args (&CUM, FNTYPE, LIBNAME))
830
831/* Update the data in CUM to advance over an argument
832 of mode MODE and data type TYPE.
833 (TYPE is null for libcalls where that information may not be available.) */
834
835#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
836 (function_arg_advance (&CUM, MODE, TYPE, NAMED))

--- 16 unchanged lines hidden (view full) ---

853
854/* For an arg passed partly in registers and partly in memory,
855 this is the number of registers used.
856 For args passed entirely in registers or entirely in memory, zero. */
857
858#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) \
859 (function_arg_partial_nregs (&CUM, MODE, TYPE, NAMED))
860
1071 (init_cumulative_args (&CUM, FNTYPE, LIBNAME))
1072
1073/* Update the data in CUM to advance over an argument
1074 of mode MODE and data type TYPE.
1075 (TYPE is null for libcalls where that information may not be available.) */
1076
1077#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
1078 (function_arg_advance (&CUM, MODE, TYPE, NAMED))

--- 16 unchanged lines hidden (view full) ---

1095
1096/* For an arg passed partly in registers and partly in memory,
1097 this is the number of registers used.
1098 For args passed entirely in registers or entirely in memory, zero. */
1099
1100#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) \
1101 (function_arg_partial_nregs (&CUM, MODE, TYPE, NAMED))
1102
1103/* This macro is invoked just before the start of a function.
1104 It is used here to output code for -fpic that will load the
1105 return address into %ebx. */
1106
1107#undef ASM_OUTPUT_FUNCTION_PREFIX
1108#define ASM_OUTPUT_FUNCTION_PREFIX(FILE, FNNAME) \
1109 asm_output_function_prefix (FILE, FNNAME)
1110
861/* This macro generates the assembly code for function entry.
862 FILE is a stdio stream to output the code to.
863 SIZE is an int: how many units of temporary storage to allocate.
864 Refer to the array `regs_ever_live' to determine which registers
865 to save; `regs_ever_live[I]' is nonzero if register number I
866 is ever used in the function. This macro is responsible for
867 knowing which registers should not be saved even if used. */
868

--- 13 unchanged lines hidden (view full) ---

882 } \
883 else \
884 { \
885 fprintf (FILE, "\tmovl $%sP%d,%%edx\n", LPREFIX, (LABELNO)); \
886 fprintf (FILE, "\tcall _mcount\n"); \
887 } \
888}
889
1111/* This macro generates the assembly code for function entry.
1112 FILE is a stdio stream to output the code to.
1113 SIZE is an int: how many units of temporary storage to allocate.
1114 Refer to the array `regs_ever_live' to determine which registers
1115 to save; `regs_ever_live[I]' is nonzero if register number I
1116 is ever used in the function. This macro is responsible for
1117 knowing which registers should not be saved even if used. */
1118

--- 13 unchanged lines hidden (view full) ---

1132 } \
1133 else \
1134 { \
1135 fprintf (FILE, "\tmovl $%sP%d,%%edx\n", LPREFIX, (LABELNO)); \
1136 fprintf (FILE, "\tcall _mcount\n"); \
1137 } \
1138}
1139
890/* A C statement or compound statement to output to FILE some
891 assembler code to initialize basic-block profiling for the current
892 object module. This code should call the subroutine
893 `__bb_init_func' once per object module, passing it as its sole
894 argument the address of a block allocated in the object module.
895
1140
896 The name of the block is a local symbol made with this statement:
1141/* There are three profiling modes for basic blocks available.
1142 The modes are selected at compile time by using the options
1143 -a or -ax of the gnu compiler.
1144 The variable `profile_block_flag' will be set according to the
1145 selected option.
897
1146
898 ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0);
1147 profile_block_flag == 0, no option used:
899
1148
900 Of course, since you are writing the definition of
901 `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you
902 can take a short cut in the definition of this macro and use the
903 name that you know will result.
1149 No profiling done.
904
1150
905 The first word of this block is a flag which will be nonzero if the
906 object module has already been initialized. So test this word
907 first, and do not call `__bb_init_func' if the flag is nonzero. */
1151 profile_block_flag == 1, -a option used.
908
1152
1153 Count frequency of execution of every basic block.
1154
1155 profile_block_flag == 2, -ax option used.
1156
1157 Generate code to allow several different profiling modes at run time.
1158 Available modes are:
1159 Produce a trace of all basic blocks.
1160 Count frequency of jump instructions executed.
1161 In every mode it is possible to start profiling upon entering
1162 certain functions and to disable profiling of some other functions.
1163
1164 The result of basic-block profiling will be written to a file `bb.out'.
1165 If the -ax option is used parameters for the profiling will be read
1166 from file `bb.in'.
1167
1168*/
1169
1170/* The following macro shall output assembler code to FILE
1171 to initialize basic-block profiling.
1172
1173 If profile_block_flag == 2
1174
1175 Output code to call the subroutine `__bb_init_trace_func'
1176 and pass two parameters to it. The first parameter is
1177 the address of a block allocated in the object module.
1178 The second parameter is the number of the first basic block
1179 of the function.
1180
1181 The name of the block is a local symbol made with this statement:
1182
1183 ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0);
1184
1185 Of course, since you are writing the definition of
1186 `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you
1187 can take a short cut in the definition of this macro and use the
1188 name that you know will result.
1189
1190 The number of the first basic block of the function is
1191 passed to the macro in BLOCK_OR_LABEL.
1192
1193 If described in a virtual assembler language the code to be
1194 output looks like:
1195
1196 parameter1 <- LPBX0
1197 parameter2 <- BLOCK_OR_LABEL
1198 call __bb_init_trace_func
1199
1200 else if profile_block_flag != 0
1201
1202 Output code to call the subroutine `__bb_init_func'
1203 and pass one single parameter to it, which is the same
1204 as the first parameter to `__bb_init_trace_func'.
1205
1206 The first word of this parameter is a flag which will be nonzero if
1207 the object module has already been initialized. So test this word
1208 first, and do not call `__bb_init_func' if the flag is nonzero.
1209 Note: When profile_block_flag == 2 the test need not be done
1210 but `__bb_init_trace_func' *must* be called.
1211
1212 BLOCK_OR_LABEL may be used to generate a label number as a
1213 branch destination in case `__bb_init_func' will not be called.
1214
1215 If described in a virtual assembler language the code to be
1216 output looks like:
1217
1218 cmp (LPBX0),0
1219 jne local_label
1220 parameter1 <- LPBX0
1221 call __bb_init_func
1222local_label:
1223
1224*/
1225
909#undef FUNCTION_BLOCK_PROFILER
1226#undef FUNCTION_BLOCK_PROFILER
910#define FUNCTION_BLOCK_PROFILER(STREAM, LABELNO) \
1227#define FUNCTION_BLOCK_PROFILER(FILE, BLOCK_OR_LABEL) \
911do \
912 { \
913 static int num_func = 0; \
914 rtx xops[8]; \
915 char block_table[80], false_label[80]; \
916 \
917 ASM_GENERATE_INTERNAL_LABEL (block_table, "LPBX", 0); \
1228do \
1229 { \
1230 static int num_func = 0; \
1231 rtx xops[8]; \
1232 char block_table[80], false_label[80]; \
1233 \
1234 ASM_GENERATE_INTERNAL_LABEL (block_table, "LPBX", 0); \
918 ASM_GENERATE_INTERNAL_LABEL (false_label, "LPBZ", num_func); \
919 \
1235 \
920 xops[0] = const0_rtx; \
921 xops[1] = gen_rtx (SYMBOL_REF, VOIDmode, block_table); \
922 xops[2] = gen_rtx (MEM, Pmode, gen_rtx (SYMBOL_REF, VOIDmode, false_label)); \
923 xops[3] = gen_rtx (MEM, Pmode, gen_rtx (SYMBOL_REF, VOIDmode, "__bb_init_func")); \
924 xops[4] = gen_rtx (MEM, Pmode, xops[1]); \
1236 xops[1] = gen_rtx_SYMBOL_REF (VOIDmode, block_table); \
925 xops[5] = stack_pointer_rtx; \
1237 xops[5] = stack_pointer_rtx; \
926 xops[6] = GEN_INT (4); \
927 xops[7] = gen_rtx (REG, Pmode, 0); /* eax */ \
1238 xops[7] = gen_rtx_REG (Pmode, 0); /* eax */ \
928 \
929 CONSTANT_POOL_ADDRESS_P (xops[1]) = TRUE; \
1239 \
1240 CONSTANT_POOL_ADDRESS_P (xops[1]) = TRUE; \
930 CONSTANT_POOL_ADDRESS_P (xops[2]) = TRUE; \
931 \
1241 \
932 output_asm_insn (AS2(cmp%L4,%0,%4), xops); \
933 output_asm_insn (AS1(jne,%2), xops); \
934 \
935 if (!flag_pic) \
936 output_asm_insn (AS1(push%L1,%1), xops); \
937 else \
1242 switch (profile_block_flag) \
938 { \
1243 { \
939 output_asm_insn (AS2 (lea%L7,%a1,%7), xops); \
940 output_asm_insn (AS1 (push%L7,%7), xops); \
941 } \
942 \
1244 \
943 output_asm_insn (AS1(call,%P3), xops); \
944 output_asm_insn (AS2(add%L0,%6,%5), xops); \
945 ASM_OUTPUT_INTERNAL_LABEL (STREAM, "LPBZ", num_func); \
946 num_func++; \
1245 case 2: \
1246 \
1247 xops[2] = GEN_INT ((BLOCK_OR_LABEL)); \
1248 xops[3] = gen_rtx_MEM (Pmode, gen_rtx_SYMBOL_REF (VOIDmode, "__bb_init_trace_func")); \
1249 xops[6] = GEN_INT (8); \
1250 \
1251 output_asm_insn (AS1(push%L2,%2), xops); \
1252 if (!flag_pic) \
1253 output_asm_insn (AS1(push%L1,%1), xops); \
1254 else \
1255 { \
1256 output_asm_insn (AS2 (lea%L7,%a1,%7), xops); \
1257 output_asm_insn (AS1 (push%L7,%7), xops); \
1258 } \
1259 \
1260 output_asm_insn (AS1(call,%P3), xops); \
1261 output_asm_insn (AS2(add%L0,%6,%5), xops); \
1262 \
1263 break; \
1264 \
1265 default: \
1266 \
1267 ASM_GENERATE_INTERNAL_LABEL (false_label, "LPBZ", num_func); \
1268 \
1269 xops[0] = const0_rtx; \
1270 xops[2] = gen_rtx_MEM (Pmode, gen_rtx_SYMBOL_REF (VOIDmode, false_label)); \
1271 xops[3] = gen_rtx_MEM (Pmode, gen_rtx_SYMBOL_REF (VOIDmode, "__bb_init_func")); \
1272 xops[4] = gen_rtx_MEM (Pmode, xops[1]); \
1273 xops[6] = GEN_INT (4); \
1274 \
1275 CONSTANT_POOL_ADDRESS_P (xops[2]) = TRUE; \
1276 \
1277 output_asm_insn (AS2(cmp%L4,%0,%4), xops); \
1278 output_asm_insn (AS1(jne,%2), xops); \
1279 \
1280 if (!flag_pic) \
1281 output_asm_insn (AS1(push%L1,%1), xops); \
1282 else \
1283 { \
1284 output_asm_insn (AS2 (lea%L7,%a1,%7), xops); \
1285 output_asm_insn (AS1 (push%L7,%7), xops); \
1286 } \
1287 \
1288 output_asm_insn (AS1(call,%P3), xops); \
1289 output_asm_insn (AS2(add%L0,%6,%5), xops); \
1290 ASM_OUTPUT_INTERNAL_LABEL (FILE, "LPBZ", num_func); \
1291 num_func++; \
1292 \
1293 break; \
1294 \
1295 } \
947 } \
948while (0)
949
1296 } \
1297while (0)
1298
1299/* The following macro shall output assembler code to FILE
1300 to increment a counter associated with basic block number BLOCKNO.
950
1301
951/* A C statement or compound statement to increment the count
952 associated with the basic block number BLOCKNO. Basic blocks are
953 numbered separately from zero within each compilation. The count
954 associated with block number BLOCKNO is at index BLOCKNO in a
955 vector of words; the name of this array is a local symbol made
956 with this statement:
1302 If profile_block_flag == 2
957
1303
958 ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 2);
1304 Output code to initialize the global structure `__bb' and
1305 call the function `__bb_trace_func' which will increment the
1306 counter.
959
1307
960 Of course, since you are writing the definition of
961 `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you
962 can take a short cut in the definition of this macro and use the
963 name that you know will result. */
1308 `__bb' consists of two words. In the first word the number
1309 of the basic block has to be stored. In the second word
1310 the address of a block allocated in the object module
1311 has to be stored.
964
1312
965#define BLOCK_PROFILER(STREAM, BLOCKNO) \
1313 The basic block number is given by BLOCKNO.
1314
1315 The address of the block is given by the label created with
1316
1317 ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0);
1318
1319 by FUNCTION_BLOCK_PROFILER.
1320
1321 Of course, since you are writing the definition of
1322 `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you
1323 can take a short cut in the definition of this macro and use the
1324 name that you know will result.
1325
1326 If described in a virtual assembler language the code to be
1327 output looks like:
1328
1329 move BLOCKNO -> (__bb)
1330 move LPBX0 -> (__bb+4)
1331 call __bb_trace_func
1332
1333 Note that function `__bb_trace_func' must not change the
1334 machine state, especially the flag register. To grant
1335 this, you must output code to save and restore registers
1336 either in this macro or in the macros MACHINE_STATE_SAVE
1337 and MACHINE_STATE_RESTORE. The last two macros will be
1338 used in the function `__bb_trace_func', so you must make
1339 sure that the function prologue does not change any
1340 register prior to saving it with MACHINE_STATE_SAVE.
1341
1342 else if profile_block_flag != 0
1343
1344 Output code to increment the counter directly.
1345 Basic blocks are numbered separately from zero within each
1346 compiled object module. The count associated with block number
1347 BLOCKNO is at index BLOCKNO in an array of words; the name of
1348 this array is a local symbol made with this statement:
1349
1350 ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 2);
1351
1352 Of course, since you are writing the definition of
1353 `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you
1354 can take a short cut in the definition of this macro and use the
1355 name that you know will result.
1356
1357 If described in a virtual assembler language the code to be
1358 output looks like:
1359
1360 inc (LPBX2+4*BLOCKNO)
1361
1362*/
1363
1364#define BLOCK_PROFILER(FILE, BLOCKNO) \
966do \
967 { \
1365do \
1366 { \
968 rtx xops[1], cnt_rtx; \
1367 rtx xops[8], cnt_rtx; \
969 char counts[80]; \
1368 char counts[80]; \
1369 char *block_table = counts; \
970 \
1370 \
971 ASM_GENERATE_INTERNAL_LABEL (counts, "LPBX", 2); \
972 cnt_rtx = gen_rtx (SYMBOL_REF, VOIDmode, counts); \
973 SYMBOL_REF_FLAG (cnt_rtx) = TRUE; \
1371 switch (profile_block_flag) \
1372 { \
974 \
1373 \
975 if (BLOCKNO) \
976 cnt_rtx = plus_constant (cnt_rtx, (BLOCKNO)*4); \
1374 case 2: \
977 \
1375 \
978 if (flag_pic) \
979 cnt_rtx = gen_rtx (PLUS, Pmode, pic_offset_table_rtx, cnt_rtx); \
1376 ASM_GENERATE_INTERNAL_LABEL (block_table, "LPBX", 0); \
980 \
1377 \
981 xops[0] = gen_rtx (MEM, SImode, cnt_rtx); \
982 output_asm_insn (AS1(inc%L0,%0), xops); \
1378 xops[1] = gen_rtx_SYMBOL_REF (VOIDmode, block_table); \
1379 xops[2] = GEN_INT ((BLOCKNO)); \
1380 xops[3] = gen_rtx_MEM (Pmode, gen_rtx_SYMBOL_REF (VOIDmode, "__bb_trace_func")); \
1381 xops[4] = gen_rtx_SYMBOL_REF (VOIDmode, "__bb"); \
1382 xops[5] = plus_constant (xops[4], 4); \
1383 xops[0] = gen_rtx_MEM (SImode, xops[4]); \
1384 xops[6] = gen_rtx_MEM (SImode, xops[5]); \
1385 \
1386 CONSTANT_POOL_ADDRESS_P (xops[1]) = TRUE; \
1387 \
1388 fprintf(FILE, "\tpushf\n"); \
1389 output_asm_insn (AS2(mov%L0,%2,%0), xops); \
1390 if (flag_pic) \
1391 { \
1392 xops[7] = gen_rtx_REG (Pmode, 0); /* eax */ \
1393 output_asm_insn (AS1(push%L7,%7), xops); \
1394 output_asm_insn (AS2(lea%L7,%a1,%7), xops); \
1395 output_asm_insn (AS2(mov%L6,%7,%6), xops); \
1396 output_asm_insn (AS1(pop%L7,%7), xops); \
1397 } \
1398 else \
1399 output_asm_insn (AS2(mov%L6,%1,%6), xops); \
1400 output_asm_insn (AS1(call,%P3), xops); \
1401 fprintf(FILE, "\tpopf\n"); \
1402 \
1403 break; \
1404 \
1405 default: \
1406 \
1407 ASM_GENERATE_INTERNAL_LABEL (counts, "LPBX", 2); \
1408 cnt_rtx = gen_rtx_SYMBOL_REF (VOIDmode, counts); \
1409 SYMBOL_REF_FLAG (cnt_rtx) = TRUE; \
1410 \
1411 if (BLOCKNO) \
1412 cnt_rtx = plus_constant (cnt_rtx, (BLOCKNO)*4); \
1413 \
1414 if (flag_pic) \
1415 cnt_rtx = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, cnt_rtx); \
1416 \
1417 xops[0] = gen_rtx_MEM (SImode, cnt_rtx); \
1418 output_asm_insn (AS1(inc%L0,%0), xops); \
1419 \
1420 break; \
1421 \
1422 } \
983 } \
984while (0)
985
1423 } \
1424while (0)
1425
1426/* The following macro shall output assembler code to FILE
1427 to indicate a return from function during basic-block profiling.
1428
1429 If profiling_block_flag == 2:
1430
1431 Output assembler code to call function `__bb_trace_ret'.
1432
1433 Note that function `__bb_trace_ret' must not change the
1434 machine state, especially the flag register. To grant
1435 this, you must output code to save and restore registers
1436 either in this macro or in the macros MACHINE_STATE_SAVE_RET
1437 and MACHINE_STATE_RESTORE_RET. The last two macros will be
1438 used in the function `__bb_trace_ret', so you must make
1439 sure that the function prologue does not change any
1440 register prior to saving it with MACHINE_STATE_SAVE_RET.
1441
1442 else if profiling_block_flag != 0:
1443
1444 The macro will not be used, so it need not distinguish
1445 these cases.
1446*/
1447
1448#define FUNCTION_BLOCK_PROFILER_EXIT(FILE) \
1449do \
1450 { \
1451 rtx xops[1]; \
1452 \
1453 xops[0] = gen_rtx_MEM (Pmode, gen_rtx_SYMBOL_REF (VOIDmode, "__bb_trace_ret")); \
1454 \
1455 output_asm_insn (AS1(call,%P0), xops); \
1456 \
1457 } \
1458while (0)
1459
1460/* The function `__bb_trace_func' is called in every basic block
1461 and is not allowed to change the machine state. Saving (restoring)
1462 the state can either be done in the BLOCK_PROFILER macro,
1463 before calling function (rsp. after returning from function)
1464 `__bb_trace_func', or it can be done inside the function by
1465 defining the macros:
1466
1467 MACHINE_STATE_SAVE(ID)
1468 MACHINE_STATE_RESTORE(ID)
1469
1470 In the latter case care must be taken, that the prologue code
1471 of function `__bb_trace_func' does not already change the
1472 state prior to saving it with MACHINE_STATE_SAVE.
1473
1474 The parameter `ID' is a string identifying a unique macro use.
1475
1476 On the i386 the initialization code at the begin of
1477 function `__bb_trace_func' contains a `sub' instruction
1478 therefore we handle save and restore of the flag register
1479 in the BLOCK_PROFILER macro. */
1480
1481#define MACHINE_STATE_SAVE(ID) \
1482 asm (" pushl %eax"); \
1483 asm (" pushl %ecx"); \
1484 asm (" pushl %edx"); \
1485 asm (" pushl %esi");
1486
1487#define MACHINE_STATE_RESTORE(ID) \
1488 asm (" popl %esi"); \
1489 asm (" popl %edx"); \
1490 asm (" popl %ecx"); \
1491 asm (" popl %eax");
1492
986/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
987 the stack pointer does not matter. The value is tested only in
988 functions that have frame pointers.
989 No definition is equivalent to always zero. */
990/* Note on the 386 it might be more efficient not to define this since
991 we have to restore it ourselves from the frame pointer, in order to
992 use pop */
993

--- 9 unchanged lines hidden (view full) ---

1003 of alloca; we also take advantage of it to omit stack adjustments
1004 before returning.
1005
1006 If the last non-note insn in the function is a BARRIER, then there
1007 is no need to emit a function prologue, because control does not fall
1008 off the end. This happens if the function ends in an "exit" call, or
1009 if a `return' insn is emitted directly into the function. */
1010
1493/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
1494 the stack pointer does not matter. The value is tested only in
1495 functions that have frame pointers.
1496 No definition is equivalent to always zero. */
1497/* Note on the 386 it might be more efficient not to define this since
1498 we have to restore it ourselves from the frame pointer, in order to
1499 use pop */
1500

--- 9 unchanged lines hidden (view full) ---

1510 of alloca; we also take advantage of it to omit stack adjustments
1511 before returning.
1512
1513 If the last non-note insn in the function is a BARRIER, then there
1514 is no need to emit a function prologue, because control does not fall
1515 off the end. This happens if the function ends in an "exit" call, or
1516 if a `return' insn is emitted directly into the function. */
1517
1011#define FUNCTION_EPILOGUE(FILE, SIZE) \
1518#if 0
1519#define FUNCTION_BEGIN_EPILOGUE(FILE) \
1012do { \
1013 rtx last = get_last_insn (); \
1014 if (last && GET_CODE (last) == NOTE) \
1015 last = prev_nonnote_insn (last); \
1520do { \
1521 rtx last = get_last_insn (); \
1522 if (last && GET_CODE (last) == NOTE) \
1523 last = prev_nonnote_insn (last); \
1016 if (! last || GET_CODE (last) != BARRIER) \
1017 function_epilogue (FILE, SIZE); \
1524/* if (! last || GET_CODE (last) != BARRIER) \
1525 function_epilogue (FILE, SIZE);*/ \
1018} while (0)
1526} while (0)
1527#endif
1019
1528
1529#define FUNCTION_EPILOGUE(FILE, SIZE) \
1530 function_epilogue (FILE, SIZE)
1531
1020/* Output assembler code for a block containing the constant parts
1021 of a trampoline, leaving space for the variable parts. */
1022
1023/* On the 386, the trampoline contains three instructions:
1024 mov #STATIC,ecx
1025 mov #FUNCTION,eax
1026 jmp @eax */
1027#define TRAMPOLINE_TEMPLATE(FILE) \

--- 13 unchanged lines hidden (view full) ---

1041#define TRAMPOLINE_SIZE 12
1042
1043/* Emit RTL insns to initialize the variable parts of a trampoline.
1044 FNADDR is an RTX for the address of the function's pure code.
1045 CXT is an RTX for the static chain value for the function. */
1046
1047#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
1048{ \
1532/* Output assembler code for a block containing the constant parts
1533 of a trampoline, leaving space for the variable parts. */
1534
1535/* On the 386, the trampoline contains three instructions:
1536 mov #STATIC,ecx
1537 mov #FUNCTION,eax
1538 jmp @eax */
1539#define TRAMPOLINE_TEMPLATE(FILE) \

--- 13 unchanged lines hidden (view full) ---

1553#define TRAMPOLINE_SIZE 12
1554
1555/* Emit RTL insns to initialize the variable parts of a trampoline.
1556 FNADDR is an RTX for the address of the function's pure code.
1557 CXT is an RTX for the static chain value for the function. */
1558
1559#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
1560{ \
1049 emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 1)), CXT); \
1050 emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 6)), FNADDR); \
1561 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 1)), CXT); \
1562 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 6)), FNADDR); \
1051}
1052
1053/* Definitions for register eliminations.
1054
1055 This is an array of structures. Each structure initializes one pair
1056 of eliminable registers. The "from" register number is given first,
1057 followed by "to". Eliminations of the same "from" register are listed
1058 in order of preference.

--- 30 unchanged lines hidden (view full) ---

1089 (OFFSET) = 8; /* Skip saved PC and previous frame pointer */ \
1090 else \
1091 { \
1092 int regno; \
1093 int offset = 0; \
1094 \
1095 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) \
1096 if ((regs_ever_live[regno] && ! call_used_regs[regno]) \
1563}
1564
1565/* Definitions for register eliminations.
1566
1567 This is an array of structures. Each structure initializes one pair
1568 of eliminable registers. The "from" register number is given first,
1569 followed by "to". Eliminations of the same "from" register are listed
1570 in order of preference.

--- 30 unchanged lines hidden (view full) ---

1601 (OFFSET) = 8; /* Skip saved PC and previous frame pointer */ \
1602 else \
1603 { \
1604 int regno; \
1605 int offset = 0; \
1606 \
1607 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) \
1608 if ((regs_ever_live[regno] && ! call_used_regs[regno]) \
1097 || (current_function_uses_pic_offset_table \
1098 && regno == PIC_OFFSET_TABLE_REGNUM)) \
1609 || ((current_function_uses_pic_offset_table \
1610 || current_function_uses_const_pool) \
1611 && flag_pic && regno == PIC_OFFSET_TABLE_REGNUM)) \
1099 offset += 4; \
1100 \
1101 (OFFSET) = offset + get_frame_size (); \
1102 \
1103 if ((FROM) == ARG_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM) \
1104 (OFFSET) += 4; /* Skip saved PC */ \
1105 } \
1106}

--- 127 unchanged lines hidden (view full) ---

1234 However, if REG is a broken-out memory address or multiplication,
1235 nothing needs to be done because REG can certainly go in a general reg.
1236
1237 When -fpic is used, special handling is needed for symbolic references.
1238 See comments by legitimize_pic_address in i386.c for details. */
1239
1240#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \
1241{ \
1612 offset += 4; \
1613 \
1614 (OFFSET) = offset + get_frame_size (); \
1615 \
1616 if ((FROM) == ARG_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM) \
1617 (OFFSET) += 4; /* Skip saved PC */ \
1618 } \
1619}

--- 127 unchanged lines hidden (view full) ---

1747 However, if REG is a broken-out memory address or multiplication,
1748 nothing needs to be done because REG can certainly go in a general reg.
1749
1750 When -fpic is used, special handling is needed for symbolic references.
1751 See comments by legitimize_pic_address in i386.c for details. */
1752
1753#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \
1754{ \
1242 rtx orig_x = (X); \
1243 (X) = legitimize_address (X, OLDX, MODE); \
1244 if (memory_address_p (MODE, X)) \
1245 goto WIN; \
1246}
1247
1755 (X) = legitimize_address (X, OLDX, MODE); \
1756 if (memory_address_p (MODE, X)) \
1757 goto WIN; \
1758}
1759
1760#define REWRITE_ADDRESS(x) rewrite_address(x)
1761
1248/* Nonzero if the constant value X is a legitimate general operand
1249 when generating PIC code. It is given that flag_pic is on and
1250 that X satisfies CONSTANT_P or is a CONST_DOUBLE. */
1251
1252#define LEGITIMATE_PIC_OPERAND_P(X) \
1253 (! SYMBOLIC_CONST (X) \
1254 || (GET_CODE (X) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (X)))
1255

--- 18 unchanged lines hidden (view full) ---

1274
1275#define ENCODE_SECTION_INFO(DECL) \
1276do \
1277 { \
1278 if (flag_pic) \
1279 { \
1280 rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \
1281 ? TREE_CST_RTL (DECL) : DECL_RTL (DECL)); \
1762/* Nonzero if the constant value X is a legitimate general operand
1763 when generating PIC code. It is given that flag_pic is on and
1764 that X satisfies CONSTANT_P or is a CONST_DOUBLE. */
1765
1766#define LEGITIMATE_PIC_OPERAND_P(X) \
1767 (! SYMBOLIC_CONST (X) \
1768 || (GET_CODE (X) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (X)))
1769

--- 18 unchanged lines hidden (view full) ---

1788
1789#define ENCODE_SECTION_INFO(DECL) \
1790do \
1791 { \
1792 if (flag_pic) \
1793 { \
1794 rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \
1795 ? TREE_CST_RTL (DECL) : DECL_RTL (DECL)); \
1796 \
1797 if (TARGET_DEBUG_ADDR \
1798 && TREE_CODE_CLASS (TREE_CODE (DECL)) == 'd') \
1799 { \
1800 fprintf (stderr, "Encode %s, public = %d\n", \
1801 IDENTIFIER_POINTER (DECL_NAME (DECL)), \
1802 TREE_PUBLIC (DECL)); \
1803 } \
1804 \
1282 SYMBOL_REF_FLAG (XEXP (rtl, 0)) \
1283 = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \
1284 || ! TREE_PUBLIC (DECL)); \
1285 } \
1286 } \
1287while (0)
1288
1805 SYMBOL_REF_FLAG (XEXP (rtl, 0)) \
1806 = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \
1807 || ! TREE_PUBLIC (DECL)); \
1808 } \
1809 } \
1810while (0)
1811
1289/* Define this macro if a SYMBOL_REF representing a non-global
1290 address must be marked specially. This is called for
1291 compiler-generated local symbols, such as "__EXCEPTION_TABLE__".
1292
1293 On i386, if using PIC, we use this to set the rtx's
1294 SYMBOL_REF_FLAG, so that we may access it directly as
1295 an offset from the GOT register. */
1296
1297#define MARK_LOCAL_ADDRESS(X) \
1298do \
1299 { \
1300 if (flag_pic && GET_CODE (X) == SYMBOL_REF) \
1301 SYMBOL_REF_FLAG (X) = 1; \
1302 } \
1303while (0)
1304
1305/* Initialize data used by insn expanders. This is called from
1306 init_emit, once for each function, before code is generated.
1307 For 386, clear stack slot assignments remembered from previous
1308 functions. */
1309
1310#define INIT_EXPANDERS clear_386_stack_locals ()
1311
1312/* The `FINALIZE_PIC' macro serves as a hook to emit these special

--- 47 unchanged lines hidden (view full) ---

1360
1361#define REGPARM_MAX 3
1362
1363
1364/* Specify the machine mode that this machine uses
1365 for the index in the tablejump instruction. */
1366#define CASE_VECTOR_MODE Pmode
1367
1812/* Initialize data used by insn expanders. This is called from
1813 init_emit, once for each function, before code is generated.
1814 For 386, clear stack slot assignments remembered from previous
1815 functions. */
1816
1817#define INIT_EXPANDERS clear_386_stack_locals ()
1818
1819/* The `FINALIZE_PIC' macro serves as a hook to emit these special

--- 47 unchanged lines hidden (view full) ---

1867
1868#define REGPARM_MAX 3
1869
1870
1871/* Specify the machine mode that this machine uses
1872 for the index in the tablejump instruction. */
1873#define CASE_VECTOR_MODE Pmode
1874
1368/* Define this if the tablejump instruction expects the table
1369 to contain offsets from the address of the table.
1370 Do not define this if the table should contain absolute addresses. */
1371/* #define CASE_VECTOR_PC_RELATIVE */
1875/* Define as C expression which evaluates to nonzero if the tablejump
1876 instruction expects the table to contain offsets from the address of the
1877 table.
1878 Do not define this if the table should contain absolute addresses. */
1879/* #define CASE_VECTOR_PC_RELATIVE 1 */
1372
1373/* Specify the tree operation to be used to convert reals to integers.
1374 This should be changed to take advantage of fist --wfs ??
1375 */
1376#define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR
1377
1378/* This is the kind of divide that is easiest to do in the general case. */
1379#define EASY_DIV_EXPR TRUNC_DIV_EXPR
1380
1381/* Define this as 1 if `char' should by default be signed; else as 0. */
1382#define DEFAULT_SIGNED_CHAR 1
1383
1384/* Max number of bytes we can move from memory to memory
1385 in one reasonably fast instruction. */
1386#define MOVE_MAX 4
1387
1880
1881/* Specify the tree operation to be used to convert reals to integers.
1882 This should be changed to take advantage of fist --wfs ??
1883 */
1884#define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR
1885
1886/* This is the kind of divide that is easiest to do in the general case. */
1887#define EASY_DIV_EXPR TRUNC_DIV_EXPR
1888
1889/* Define this as 1 if `char' should by default be signed; else as 0. */
1890#define DEFAULT_SIGNED_CHAR 1
1891
1892/* Max number of bytes we can move from memory to memory
1893 in one reasonably fast instruction. */
1894#define MOVE_MAX 4
1895
1388/* MOVE_RATIO is the number of move instructions that is better than a
1389 block move. Make this large on i386, since the block move is very
1390 inefficient with small blocks, and the hard register needs of the
1391 block move require much reload work. */
1392#define MOVE_RATIO 5
1896/* The number of scalar move insns which should be generated instead
1897 of a string move insn or a library call. Increasing the value
1898 will always make code faster, but eventually incurs high cost in
1899 increased code size.
1393
1900
1394/* Define this if zero-extension is slow (more than one real instruction). */
1395/* #define SLOW_ZERO_EXTEND */
1901 If you don't define this, a reasonable default is used.
1396
1902
1397/* Nonzero if access to memory by bytes is slow and undesirable. */
1398#define SLOW_BYTE_ACCESS 0
1903 Make this large on i386, since the block move is very inefficient with small
1904 blocks, and the hard register needs of the block move require much reload
1905 work. */
1399
1906
1907#define MOVE_RATIO 5
1908
1400/* Define if shifts truncate the shift count
1401 which implies one can omit a sign-extension or zero-extension
1402 of a shift count. */
1909/* Define if shifts truncate the shift count
1910 which implies one can omit a sign-extension or zero-extension
1911 of a shift count. */
1403/* One i386, shifts do truncate the count. But bit opcodes don't. */
1912/* On i386, shifts do truncate the count. But bit opcodes don't. */
1404
1405/* #define SHIFT_COUNT_TRUNCATED */
1406
1407/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
1408 is done just by pretending it is already truncated. */
1409#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
1410
1411/* We assume that the store-condition-codes instructions store 0 for false

--- 10 unchanged lines hidden (view full) ---

1422 After generation of rtl, the compiler makes no further distinction
1423 between pointers and any other objects of this machine mode. */
1424#define Pmode SImode
1425
1426/* A function address in a call instruction
1427 is a byte address (for indexing purposes)
1428 so give the MEM rtx a byte's mode. */
1429#define FUNCTION_MODE QImode
1913
1914/* #define SHIFT_COUNT_TRUNCATED */
1915
1916/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
1917 is done just by pretending it is already truncated. */
1918#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
1919
1920/* We assume that the store-condition-codes instructions store 0 for false

--- 10 unchanged lines hidden (view full) ---

1931 After generation of rtl, the compiler makes no further distinction
1932 between pointers and any other objects of this machine mode. */
1933#define Pmode SImode
1934
1935/* A function address in a call instruction
1936 is a byte address (for indexing purposes)
1937 so give the MEM rtx a byte's mode. */
1938#define FUNCTION_MODE QImode
1939
1940/* A part of a C `switch' statement that describes the relative costs
1941 of constant RTL expressions. It must contain `case' labels for
1942 expression codes `const_int', `const', `symbol_ref', `label_ref'
1943 and `const_double'. Each case must ultimately reach a `return'
1944 statement to return the relative cost of the use of that kind of
1945 constant value in an expression. The cost may depend on the
1946 precise value of the constant, which is available for examination
1947 in X, and the rtx code of the expression in which it is contained,
1948 found in OUTER_CODE.
1949
1950 CODE is the expression code--redundant, since it can be obtained
1951 with `GET_CODE (X)'. */
1430
1952
1431/* Define this if addresses of constant functions
1432 shouldn't be put through pseudo regs where they can be cse'd.
1433 Desirable on the 386 because a CALL with a constant address is
1434 not much slower than one with a register address. On a 486,
1435 it is faster to call with a constant address than indirect. */
1436#define NO_FUNCTION_CSE
1437
1438/* Provide the costs of a rtl expression. This is in the body of a
1439 switch on CODE. */
1440
1441#define RTX_COSTS(X,CODE,OUTER_CODE) \
1442 case MULT: \
1443 return COSTS_N_INSNS (20); \
1444 case DIV: \
1445 case UDIV: \
1446 case MOD: \
1447 case UMOD: \
1448 return COSTS_N_INSNS (20); \
1449 case ASHIFTRT: \
1450 case LSHIFTRT: \
1451 case ASHIFT: \
1452 return (4 + rtx_cost (XEXP (X, 0), OUTER_CODE) \
1453 + rtx_cost (XEXP (X, 1), OUTER_CODE)); \
1454 case PLUS: \
1455 if (GET_CODE (XEXP (X, 0)) == MULT \
1456 && GET_CODE (XEXP (XEXP (X, 0), 1)) == CONST_INT \
1457 && (INTVAL (XEXP (XEXP (X, 0), 1)) == 2 \
1458 || INTVAL (XEXP (XEXP (X, 0), 1)) == 4 \
1459 || INTVAL (XEXP (XEXP (X, 0), 1)) == 8)) \
1460 return (2 + rtx_cost (XEXP (XEXP (X, 0), 0), OUTER_CODE) \
1461 + rtx_cost (XEXP (X, 1), OUTER_CODE)); \
1462 break;
1463
1464
1465/* Compute the cost of computing a constant rtl expression RTX
1466 whose rtx-code is CODE. The body of this macro is a portion
1467 of a switch statement. If the code is computed here,
1468 return it with a return statement. Otherwise, break from the switch. */
1469
1470#define CONST_COSTS(RTX,CODE,OUTER_CODE) \
1471 case CONST_INT: \
1953#define CONST_COSTS(RTX,CODE,OUTER_CODE) \
1954 case CONST_INT: \
1955 return (unsigned) INTVAL (RTX) < 256 ? 0 : 1; \
1472 case CONST: \
1473 case LABEL_REF: \
1474 case SYMBOL_REF: \
1956 case CONST: \
1957 case LABEL_REF: \
1958 case SYMBOL_REF: \
1475 return flag_pic && SYMBOLIC_CONST (RTX) ? 2 : 0; \
1959 return flag_pic && SYMBOLIC_CONST (RTX) ? 2 : 1; \
1960 \
1476 case CONST_DOUBLE: \
1477 { \
1478 int code; \
1479 if (GET_MODE (RTX) == VOIDmode) \
1480 return 2; \
1961 case CONST_DOUBLE: \
1962 { \
1963 int code; \
1964 if (GET_MODE (RTX) == VOIDmode) \
1965 return 2; \
1966 \
1481 code = standard_80387_constant_p (RTX); \
1482 return code == 1 ? 0 : \
1483 code == 2 ? 1 : \
1484 2; \
1485 }
1486
1967 code = standard_80387_constant_p (RTX); \
1968 return code == 1 ? 0 : \
1969 code == 2 ? 1 : \
1970 2; \
1971 }
1972
1487/* Compute the cost of an address. This is meant to approximate the size
1488 and/or execution delay of an insn using that address. If the cost is
1489 approximated by the RTL complexity, including CONST_COSTS above, as
1490 is usually the case for CISC machines, this macro should not be defined.
1491 For aggressively RISCy machines, only one insn format is allowed, so
1492 this macro should be a constant. The value of this macro only matters
1493 for valid addresses.
1973/* Delete the definition here when TOPLEVEL_COSTS_N_INSNS gets added to cse.c */
1974#define TOPLEVEL_COSTS_N_INSNS(N) {total = COSTS_N_INSNS (N); break;}
1494
1975
1976/* Like `CONST_COSTS' but applies to nonconstant RTL expressions.
1977 This can be used, for example, to indicate how costly a multiply
1978 instruction is. In writing this macro, you can use the construct
1979 `COSTS_N_INSNS (N)' to specify a cost equal to N fast
1980 instructions. OUTER_CODE is the code of the expression in which X
1981 is contained.
1982
1983 This macro is optional; do not define it if the default cost
1984 assumptions are adequate for the target machine. */
1985
1986#define RTX_COSTS(X,CODE,OUTER_CODE) \
1987 case ASHIFT: \
1988 if (GET_CODE (XEXP (X, 1)) == CONST_INT \
1989 && GET_MODE (XEXP (X, 0)) == SImode) \
1990 { \
1991 HOST_WIDE_INT value = INTVAL (XEXP (X, 1)); \
1992 \
1993 if (value == 1) \
1994 return COSTS_N_INSNS (ix86_cost->add) \
1995 + rtx_cost(XEXP (X, 0), OUTER_CODE); \
1996 \
1997 if (value == 2 || value == 3) \
1998 return COSTS_N_INSNS (ix86_cost->lea) \
1999 + rtx_cost(XEXP (X, 0), OUTER_CODE); \
2000 } \
2001 /* fall through */ \
2002 \
2003 case ROTATE: \
2004 case ASHIFTRT: \
2005 case LSHIFTRT: \
2006 case ROTATERT: \
2007 if (GET_MODE (XEXP (X, 0)) == DImode) \
2008 { \
2009 if (GET_CODE (XEXP (X, 1)) == CONST_INT) \
2010 { \
2011 if (INTVAL (XEXP (X, 1)) > 32) \
2012 return COSTS_N_INSNS(ix86_cost->shift_const + 2); \
2013 return COSTS_N_INSNS(ix86_cost->shift_const * 2); \
2014 } \
2015 return ((GET_CODE (XEXP (X, 1)) == AND \
2016 ? COSTS_N_INSNS(ix86_cost->shift_var * 2) \
2017 : COSTS_N_INSNS(ix86_cost->shift_var * 6 + 2)) \
2018 + rtx_cost(XEXP (X, 0), OUTER_CODE)); \
2019 } \
2020 return COSTS_N_INSNS (GET_CODE (XEXP (X, 1)) == CONST_INT \
2021 ? ix86_cost->shift_const \
2022 : ix86_cost->shift_var) \
2023 + rtx_cost(XEXP (X, 0), OUTER_CODE); \
2024 \
2025 case MULT: \
2026 if (GET_CODE (XEXP (X, 1)) == CONST_INT) \
2027 { \
2028 unsigned HOST_WIDE_INT value = INTVAL (XEXP (X, 1)); \
2029 int nbits = 0; \
2030 \
2031 if (value == 2) \
2032 return COSTS_N_INSNS (ix86_cost->add) \
2033 + rtx_cost(XEXP (X, 0), OUTER_CODE); \
2034 if (value == 4 || value == 8) \
2035 return COSTS_N_INSNS (ix86_cost->lea) \
2036 + rtx_cost(XEXP (X, 0), OUTER_CODE); \
2037 \
2038 while (value != 0) \
2039 { \
2040 nbits++; \
2041 value >>= 1; \
2042 } \
2043 \
2044 if (nbits == 1) \
2045 return COSTS_N_INSNS (ix86_cost->shift_const) \
2046 + rtx_cost(XEXP (X, 0), OUTER_CODE); \
2047 \
2048 return COSTS_N_INSNS (ix86_cost->mult_init \
2049 + nbits * ix86_cost->mult_bit) \
2050 + rtx_cost(XEXP (X, 0), OUTER_CODE); \
2051 } \
2052 \
2053 else /* This is arbitrary */ \
2054 TOPLEVEL_COSTS_N_INSNS (ix86_cost->mult_init \
2055 + 7 * ix86_cost->mult_bit); \
2056 \
2057 case DIV: \
2058 case UDIV: \
2059 case MOD: \
2060 case UMOD: \
2061 TOPLEVEL_COSTS_N_INSNS (ix86_cost->divide); \
2062 \
2063 case PLUS: \
2064 if (GET_CODE (XEXP (X, 0)) == REG \
2065 && GET_MODE (XEXP (X, 0)) == SImode \
2066 && GET_CODE (XEXP (X, 1)) == PLUS) \
2067 return COSTS_N_INSNS (ix86_cost->lea); \
2068 \
2069 /* fall through */ \
2070 case AND: \
2071 case IOR: \
2072 case XOR: \
2073 case MINUS: \
2074 if (GET_MODE (X) == DImode) \
2075 return COSTS_N_INSNS (ix86_cost->add) * 2 \
2076 + (rtx_cost (XEXP (X, 0), OUTER_CODE) \
2077 << (GET_MODE (XEXP (X, 0)) != DImode)) \
2078 + (rtx_cost (XEXP (X, 1), OUTER_CODE) \
2079 << (GET_MODE (XEXP (X, 1)) != DImode)); \
2080 case NEG: \
2081 case NOT: \
2082 if (GET_MODE (X) == DImode) \
2083 TOPLEVEL_COSTS_N_INSNS (ix86_cost->add * 2) \
2084 TOPLEVEL_COSTS_N_INSNS (ix86_cost->add)
2085
2086
2087/* An expression giving the cost of an addressing mode that contains
2088 ADDRESS. If not defined, the cost is computed from the ADDRESS
2089 expression and the `CONST_COSTS' values.
2090
2091 For most CISC machines, the default cost is a good approximation
2092 of the true cost of the addressing mode. However, on RISC
2093 machines, all instructions normally have the same length and
2094 execution time. Hence all addresses will have equal costs.
2095
2096 In cases where more than one form of an address is known, the form
2097 with the lowest cost will be used. If multiple forms have the
2098 same, lowest, cost, the one that is the most complex will be used.
2099
2100 For example, suppose an address that is equal to the sum of a
2101 register and a constant is used twice in the same basic block.
2102 When this macro is not defined, the address will be computed in a
2103 register and memory references will be indirect through that
2104 register. On machines where the cost of the addressing mode
2105 containing the sum is no higher than that of a simple indirect
2106 reference, this will produce an additional instruction and
2107 possibly require an additional register. Proper specification of
2108 this macro eliminates this overhead for such machines.
2109
2110 Similar use of this macro is made in strength reduction of loops.
2111
2112 ADDRESS need not be valid as an address. In such a case, the cost
2113 is not relevant and can be any value; invalid addresses need not be
2114 assigned a different cost.
2115
2116 On machines where an address involving more than one register is as
2117 cheap as an address computation involving only one register,
2118 defining `ADDRESS_COST' to reflect this can cause two registers to
2119 be live over a region of code where only one would have been if
2120 `ADDRESS_COST' were not defined in that manner. This effect should
2121 be considered in the definition of this macro. Equivalent costs
2122 should probably only be given to addresses with different numbers
2123 of registers on machines with lots of registers.
2124
2125 This macro will normally either not be defined or be defined as a
2126 constant.
2127
1495 For i386, it is better to use a complex address than let gcc copy
1496 the address into a reg and make a new pseudo. But not if the address
1497 requires to two regs - that would mean more pseudos with longer
1498 lifetimes. */
1499
1500#define ADDRESS_COST(RTX) \
1501 ((CONSTANT_P (RTX) \
1502 || (GET_CODE (RTX) == PLUS && CONSTANT_P (XEXP (RTX, 1)) \
1503 && REG_P (XEXP (RTX, 0)))) ? 0 \
1504 : REG_P (RTX) ? 1 \
1505 : 2)
2128 For i386, it is better to use a complex address than let gcc copy
2129 the address into a reg and make a new pseudo. But not if the address
2130 requires to two regs - that would mean more pseudos with longer
2131 lifetimes. */
2132
2133#define ADDRESS_COST(RTX) \
2134 ((CONSTANT_P (RTX) \
2135 || (GET_CODE (RTX) == PLUS && CONSTANT_P (XEXP (RTX, 1)) \
2136 && REG_P (XEXP (RTX, 0)))) ? 0 \
2137 : REG_P (RTX) ? 1 \
2138 : 2)
2139
2140/* A C expression for the cost of moving data of mode M between a
2141 register and memory. A value of 2 is the default; this cost is
2142 relative to those in `REGISTER_MOVE_COST'.
2143
2144 If moving between registers and memory is more expensive than
2145 between two registers, you should define this macro to express the
2146 relative cost.
2147
2148 On the i386, copying between floating-point and fixed-point
2149 registers is expensive. */
2150
2151#define REGISTER_MOVE_COST(CLASS1, CLASS2) \
2152 (((FLOAT_CLASS_P (CLASS1) && ! FLOAT_CLASS_P (CLASS2)) \
2153 || (! FLOAT_CLASS_P (CLASS1) && FLOAT_CLASS_P (CLASS2))) ? 10 \
2154 : 2)
2155
2156
2157/* A C expression for the cost of moving data of mode M between a
2158 register and memory. A value of 2 is the default; this cost is
2159 relative to those in `REGISTER_MOVE_COST'.
2160
2161 If moving between registers and memory is more expensive than
2162 between two registers, you should define this macro to express the
2163 relative cost. */
2164
2165/* #define MEMORY_MOVE_COST(M,C,I) 2 */
2166
2167/* A C expression for the cost of a branch instruction. A value of 1
2168 is the default; other values are interpreted relative to that. */
2169
2170#define BRANCH_COST i386_branch_cost
2171
2172/* Define this macro as a C expression which is nonzero if accessing
2173 less than a word of memory (i.e. a `char' or a `short') is no
2174 faster than accessing a word of memory, i.e., if such access
2175 require more than one instruction or if there is no difference in
2176 cost between byte and (aligned) word loads.
2177
2178 When this macro is not defined, the compiler will access a field by
2179 finding the smallest containing object; when it is defined, a
2180 fullword load will be used if alignment permits. Unless bytes
2181 accesses are faster than word accesses, using word accesses is
2182 preferable since it may eliminate subsequent memory access if
2183 subsequent accesses occur to other fields in the same word of the
2184 structure, but to different bytes. */
2185
2186#define SLOW_BYTE_ACCESS 0
2187
2188/* Nonzero if access to memory by shorts is slow and undesirable. */
2189#define SLOW_SHORT_ACCESS 0
2190
2191/* Define this macro if zero-extension (of a `char' or `short' to an
2192 `int') can be done faster if the destination is a register that is
2193 known to be zero.
2194
2195 If you define this macro, you must have instruction patterns that
2196 recognize RTL structures like this:
2197
2198 (set (strict_low_part (subreg:QI (reg:SI ...) 0)) ...)
2199
2200 and likewise for `HImode'. */
2201
2202/* #define SLOW_ZERO_EXTEND */
2203
2204/* Define this macro to be the value 1 if unaligned accesses have a
2205 cost many times greater than aligned accesses, for example if they
2206 are emulated in a trap handler.
2207
2208 When this macro is non-zero, the compiler will act as if
2209 `STRICT_ALIGNMENT' were non-zero when generating code for block
2210 moves. This can cause significantly more instructions to be
2211 produced. Therefore, do not set this macro non-zero if unaligned
2212 accesses only add a cycle or two to the time for a memory access.
2213
2214 If the value of this macro is always zero, it need not be defined. */
2215
2216/* #define SLOW_UNALIGNED_ACCESS 0 */
2217
2218/* Define this macro to inhibit strength reduction of memory
2219 addresses. (On some machines, such strength reduction seems to do
2220 harm rather than good.) */
2221
2222/* #define DONT_REDUCE_ADDR */
2223
2224/* Define this macro if it is as good or better to call a constant
2225 function address than to call an address kept in a register.
2226
2227 Desirable on the 386 because a CALL with a constant address is
2228 faster than one with a register address. */
2229
2230#define NO_FUNCTION_CSE
2231
2232/* Define this macro if it is as good or better for a function to call
2233 itself with an explicit address than to call an address kept in a
2234 register. */
2235
2236#define NO_RECURSIVE_FUNCTION_CSE
2237
2238/* A C statement (sans semicolon) to update the integer variable COST
2239 based on the relationship between INSN that is dependent on
2240 DEP_INSN through the dependence LINK. The default is to make no
2241 adjustment to COST. This can be used for example to specify to
2242 the scheduler that an output- or anti-dependence does not incur
2243 the same cost as a data-dependence. */
2244
2245#define ADJUST_COST(insn,link,dep_insn,cost) \
2246 { \
2247 rtx next_inst; \
2248 if (GET_CODE (dep_insn) == CALL_INSN) \
2249 (cost) = 0; \
2250 \
2251 else if (GET_CODE (dep_insn) == INSN \
2252 && GET_CODE (PATTERN (dep_insn)) == SET \
2253 && GET_CODE (SET_DEST (PATTERN (dep_insn))) == REG \
2254 && GET_CODE (insn) == INSN \
2255 && GET_CODE (PATTERN (insn)) == SET \
2256 && !reg_overlap_mentioned_p (SET_DEST (PATTERN (dep_insn)), \
2257 SET_SRC (PATTERN (insn)))) \
2258 { \
2259 (cost) = 0; \
2260 } \
2261 \
2262 else if (GET_CODE (insn) == JUMP_INSN) \
2263 { \
2264 (cost) = 0; \
2265 } \
2266 \
2267 if (TARGET_PENTIUM) \
2268 { \
2269 if (cost !=0 && is_fp_insn (insn) && is_fp_insn (dep_insn) \
2270 && !is_fp_dest (dep_insn)) \
2271 { \
2272 (cost) = 0; \
2273 } \
2274 \
2275 if (agi_dependent (insn, dep_insn)) \
2276 { \
2277 (cost) = 3; \
2278 } \
2279 else if (GET_CODE (insn) == INSN \
2280 && GET_CODE (PATTERN (insn)) == SET \
2281 && SET_DEST (PATTERN (insn)) == cc0_rtx \
2282 && (next_inst = next_nonnote_insn (insn)) \
2283 && GET_CODE (next_inst) == JUMP_INSN) \
2284 { /* compare probably paired with jump */ \
2285 (cost) = 0; \
2286 } \
2287 } \
2288 else \
2289 if (!is_fp_dest (dep_insn)) \
2290 { \
2291 if(!agi_dependent (insn, dep_insn)) \
2292 (cost) = 0; \
2293 else if (TARGET_486) \
2294 (cost) = 2; \
2295 } \
2296 else \
2297 if (is_fp_store (insn) && is_fp_insn (dep_insn) \
2298 && NEXT_INSN (insn) && NEXT_INSN (NEXT_INSN (insn)) \
2299 && NEXT_INSN (NEXT_INSN (NEXT_INSN (insn))) \
2300 && (GET_CODE (NEXT_INSN (insn)) == INSN) \
2301 && (GET_CODE (NEXT_INSN (NEXT_INSN (insn))) == JUMP_INSN) \
2302 && (GET_CODE (NEXT_INSN (NEXT_INSN (NEXT_INSN (insn)))) == NOTE) \
2303 && (NOTE_LINE_NUMBER (NEXT_INSN (NEXT_INSN (NEXT_INSN (insn)))) \
2304 == NOTE_INSN_LOOP_END)) \
2305 { \
2306 (cost) = 3; \
2307 } \
2308 }
2309
2310
2311#define ADJUST_BLOCKAGE(last_insn,insn,blockage) \
2312{ \
2313 if (is_fp_store (last_insn) && is_fp_insn (insn) \
2314 && NEXT_INSN (last_insn) && NEXT_INSN (NEXT_INSN (last_insn)) \
2315 && NEXT_INSN (NEXT_INSN (NEXT_INSN (last_insn))) \
2316 && (GET_CODE (NEXT_INSN (last_insn)) == INSN) \
2317 && (GET_CODE (NEXT_INSN (NEXT_INSN (last_insn))) == JUMP_INSN) \
2318 && (GET_CODE (NEXT_INSN (NEXT_INSN (NEXT_INSN (last_insn)))) == NOTE) \
2319 && (NOTE_LINE_NUMBER (NEXT_INSN (NEXT_INSN (NEXT_INSN (last_insn)))) \
2320 == NOTE_INSN_LOOP_END)) \
2321 { \
2322 (blockage) = 3; \
2323 } \
2324}
2325
1506
1507/* Add any extra modes needed to represent the condition code.
1508
1509 For the i386, we need separate modes when floating-point equality
1510 comparisons are being done. */
1511
1512#define EXTRA_CC_MODES CCFPEQmode
1513

--- 16 unchanged lines hidden (view full) ---

1530
1531extern struct rtx_def *(*i386_compare_gen)(), *(*i386_compare_gen_eq)();
1532
1533/* Tell final.c how to eliminate redundant test instructions. */
1534
1535/* Here we define machine-dependent flags and fields in cc_status
1536 (see `conditions.h'). */
1537
2326
2327/* Add any extra modes needed to represent the condition code.
2328
2329 For the i386, we need separate modes when floating-point equality
2330 comparisons are being done. */
2331
2332#define EXTRA_CC_MODES CCFPEQmode
2333

--- 16 unchanged lines hidden (view full) ---

2350
2351extern struct rtx_def *(*i386_compare_gen)(), *(*i386_compare_gen_eq)();
2352
2353/* Tell final.c how to eliminate redundant test instructions. */
2354
2355/* Here we define machine-dependent flags and fields in cc_status
2356 (see `conditions.h'). */
2357
2358/* Set if the cc value was actually from the 80387 and
2359 we are testing eax directly (i.e. no sahf) */
2360#define CC_TEST_AX 020000
2361
1538/* Set if the cc value is actually in the 80387, so a floating point
1539 conditional branch must be output. */
1540#define CC_IN_80387 04000
1541
1542/* Set if the CC value was stored in a nonstandard way, so that
1543 the state of equality is indicated by zero in the carry bit. */
1544#define CC_Z_IN_NOT_C 010000
1545
2362/* Set if the cc value is actually in the 80387, so a floating point
2363 conditional branch must be output. */
2364#define CC_IN_80387 04000
2365
2366/* Set if the CC value was stored in a nonstandard way, so that
2367 the state of equality is indicated by zero in the carry bit. */
2368#define CC_Z_IN_NOT_C 010000
2369
2370/* Set if the CC value was actually from the 80387 and loaded directly
2371 into the eflags instead of via eax/sahf. */
2372#define CC_FCOMI 040000
2373
1546/* Store in cc_status the expressions
1547 that the condition codes will describe
1548 after execution of an instruction whose pattern is EXP.
1549 Do not alter them if the instruction would not alter the cc's. */
1550
1551#define NOTICE_UPDATE_CC(EXP, INSN) \
1552 notice_update_cc((EXP))
1553

--- 29 unchanged lines hidden (view full) ---

1583{"ax","dx","cx","bx","si","di","bp","sp", \
1584 "st","st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)","" }
1585
1586#define REGISTER_NAMES HI_REGISTER_NAMES
1587
1588/* Table of additional register names to use in user input. */
1589
1590#define ADDITIONAL_REGISTER_NAMES \
2374/* Store in cc_status the expressions
2375 that the condition codes will describe
2376 after execution of an instruction whose pattern is EXP.
2377 Do not alter them if the instruction would not alter the cc's. */
2378
2379#define NOTICE_UPDATE_CC(EXP, INSN) \
2380 notice_update_cc((EXP))
2381

--- 29 unchanged lines hidden (view full) ---

2411{"ax","dx","cx","bx","si","di","bp","sp", \
2412 "st","st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)","" }
2413
2414#define REGISTER_NAMES HI_REGISTER_NAMES
2415
2416/* Table of additional register names to use in user input. */
2417
2418#define ADDITIONAL_REGISTER_NAMES \
1591{ "eax", 0, "edx", 1, "ecx", 2, "ebx", 3, \
1592 "esi", 4, "edi", 5, "ebp", 6, "esp", 7, \
1593 "al", 0, "dl", 1, "cl", 2, "bl", 3, \
1594 "ah", 0, "dh", 1, "ch", 2, "bh", 3 }
2419{ { "eax", 0 }, { "edx", 1 }, { "ecx", 2 }, { "ebx", 3 }, \
2420 { "esi", 4 }, { "edi", 5 }, { "ebp", 6 }, { "esp", 7 }, \
2421 { "al", 0 }, { "dl", 1 }, { "cl", 2 }, { "bl", 3 }, \
2422 { "ah", 0 }, { "dh", 1 }, { "ch", 2 }, { "bh", 3 } }
1595
1596/* Note we are omitting these since currently I don't know how
1597to get gcc to use these, since they want the same but different
1598number as al, and ax.
1599*/
1600
1601/* note the last four are not really qi_registers, but
1602 the md will have to never output movb into one of them

--- 17 unchanged lines hidden (view full) ---

1620 (n) == 2 ? 1 : \
1621 (n) == 3 ? 3 : \
1622 (n) == 4 ? 6 : \
1623 (n) == 5 ? 7 : \
1624 (n) == 6 ? 4 : \
1625 (n) == 7 ? 5 : \
1626 (n) + 4)
1627
2423
2424/* Note we are omitting these since currently I don't know how
2425to get gcc to use these, since they want the same but different
2426number as al, and ax.
2427*/
2428
2429/* note the last four are not really qi_registers, but
2430 the md will have to never output movb into one of them

--- 17 unchanged lines hidden (view full) ---

2448 (n) == 2 ? 1 : \
2449 (n) == 3 ? 3 : \
2450 (n) == 4 ? 6 : \
2451 (n) == 5 ? 7 : \
2452 (n) == 6 ? 4 : \
2453 (n) == 7 ? 5 : \
2454 (n) + 4)
2455
2456/* Before the prologue, RA is at 0(%esp). */
2457#define INCOMING_RETURN_ADDR_RTX \
2458 gen_rtx_MEM (VOIDmode, gen_rtx_REG (VOIDmode, STACK_POINTER_REGNUM))
2459
2460/* After the prologue, RA is at -4(AP) in the current frame. */
2461#define RETURN_ADDR_RTX(COUNT, FRAME) \
2462 ((COUNT) == 0 \
2463 ? gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, arg_pointer_rtx, GEN_INT(-4)))\
2464 : gen_rtx_MEM (Pmode, gen_rtx_PLUS (Pmode, (FRAME), GEN_INT(4))))
2465
2466/* PC is dbx register 8; let's use that column for RA. */
2467#define DWARF_FRAME_RETURN_COLUMN 8
2468
2469/* Before the prologue, the top of the frame is at 4(%esp). */
2470#define INCOMING_FRAME_SP_OFFSET 4
2471
1628/* This is how to output the definition of a user-level label named NAME,
1629 such as the label on a static function or variable NAME. */
1630
1631#define ASM_OUTPUT_LABEL(FILE,NAME) \
1632 (assemble_name (FILE, NAME), fputs (":\n", FILE))
1633
1634/* This is how to output an assembler line defining a `double' constant. */
1635
1636#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
1637do { long l[2]; \
1638 REAL_VALUE_TO_TARGET_DOUBLE (VALUE, l); \
2472/* This is how to output the definition of a user-level label named NAME,
2473 such as the label on a static function or variable NAME. */
2474
2475#define ASM_OUTPUT_LABEL(FILE,NAME) \
2476 (assemble_name (FILE, NAME), fputs (":\n", FILE))
2477
2478/* This is how to output an assembler line defining a `double' constant. */
2479
2480#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
2481do { long l[2]; \
2482 REAL_VALUE_TO_TARGET_DOUBLE (VALUE, l); \
1639 if (sizeof (int) == sizeof (long)) \
1640 fprintf (FILE, "%s 0x%x,0x%x\n", ASM_LONG, (int) l[0], (int) l[1]); \
1641 else \
1642 fprintf (FILE, "%s 0x%lx,0x%lx\n", ASM_LONG, l[0], l[1]); \
2483 fprintf (FILE, "%s 0x%lx,0x%lx\n", ASM_LONG, l[0], l[1]); \
1643 } while (0)
1644
1645/* This is how to output a `long double' extended real constant. */
1646
1647#undef ASM_OUTPUT_LONG_DOUBLE
1648#define ASM_OUTPUT_LONG_DOUBLE(FILE,VALUE) \
1649do { long l[3]; \
1650 REAL_VALUE_TO_TARGET_LONG_DOUBLE (VALUE, l); \
2484 } while (0)
2485
2486/* This is how to output a `long double' extended real constant. */
2487
2488#undef ASM_OUTPUT_LONG_DOUBLE
2489#define ASM_OUTPUT_LONG_DOUBLE(FILE,VALUE) \
2490do { long l[3]; \
2491 REAL_VALUE_TO_TARGET_LONG_DOUBLE (VALUE, l); \
1651 if (sizeof (int) == sizeof (long)) \
1652 fprintf (FILE, "%s 0x%x,0x%x,0x%x\n", ASM_LONG, \
1653 (int) l[0], (int) l[1], (int) l[2]); \
1654 else \
1655 fprintf (FILE, "%s 0x%lx,0x%lx,0x%lx\n", ASM_LONG, l[0], l[1], l[2]); \
2492 fprintf (FILE, "%s 0x%lx,0x%lx,0x%lx\n", ASM_LONG, l[0], l[1], l[2]); \
1656 } while (0)
1657
1658/* This is how to output an assembler line defining a `float' constant. */
1659
1660#define ASM_OUTPUT_FLOAT(FILE,VALUE) \
1661do { long l; \
1662 REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \
2493 } while (0)
2494
2495/* This is how to output an assembler line defining a `float' constant. */
2496
2497#define ASM_OUTPUT_FLOAT(FILE,VALUE) \
2498do { long l; \
2499 REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \
1663 if (sizeof (int) == sizeof (long)) \
1664 fprintf ((FILE), "%s 0x%x\n", ASM_LONG, (int) l); \
1665 else \
1666 fprintf ((FILE), "%s 0x%lx\n", ASM_LONG, l); \
2500 fprintf ((FILE), "%s 0x%lx\n", ASM_LONG, l); \
1667 } while (0)
1668
1669/* Store in OUTPUT a string (made with alloca) containing
1670 an assembler-name for a local static variable named NAME.
1671 LABELNO is an integer which is different for each call. */
1672
1673#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
1674( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \

--- 35 unchanged lines hidden (view full) ---

1710
1711#define ASM_OUTPUT_BYTE(FILE,VALUE) \
1712 fprintf ((FILE), "%s 0x%x\n", ASM_BYTE_OP, (VALUE))
1713
1714/* This is how to output an insn to push a register on the stack.
1715 It need not be very fast code. */
1716
1717#define ASM_OUTPUT_REG_PUSH(FILE,REGNO) \
2501 } while (0)
2502
2503/* Store in OUTPUT a string (made with alloca) containing
2504 an assembler-name for a local static variable named NAME.
2505 LABELNO is an integer which is different for each call. */
2506
2507#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
2508( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \

--- 35 unchanged lines hidden (view full) ---

2544
2545#define ASM_OUTPUT_BYTE(FILE,VALUE) \
2546 fprintf ((FILE), "%s 0x%x\n", ASM_BYTE_OP, (VALUE))
2547
2548/* This is how to output an insn to push a register on the stack.
2549 It need not be very fast code. */
2550
2551#define ASM_OUTPUT_REG_PUSH(FILE,REGNO) \
1718 fprintf (FILE, "\tpushl e%s\n", reg_names[REGNO])
2552 fprintf (FILE, "\tpushl %%e%s\n", reg_names[REGNO])
1719
1720/* This is how to output an insn to pop a register from the stack.
1721 It need not be very fast code. */
1722
1723#define ASM_OUTPUT_REG_POP(FILE,REGNO) \
2553
2554/* This is how to output an insn to pop a register from the stack.
2555 It need not be very fast code. */
2556
2557#define ASM_OUTPUT_REG_POP(FILE,REGNO) \
1724 fprintf (FILE, "\tpopl e%s\n", reg_names[REGNO])
2558 fprintf (FILE, "\tpopl %%e%s\n", reg_names[REGNO])
1725
1726/* This is how to output an element of a case-vector that is absolute.
1727 */
1728
1729#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
1730 fprintf (FILE, "%s %s%d\n", ASM_LONG, LPREFIX, VALUE)
1731
1732/* This is how to output an element of a case-vector that is relative.
1733 We don't use these on the 386 yet, because the ATT assembler can't do
1734 forward reference the differences.
1735 */
1736
2559
2560/* This is how to output an element of a case-vector that is absolute.
2561 */
2562
2563#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
2564 fprintf (FILE, "%s %s%d\n", ASM_LONG, LPREFIX, VALUE)
2565
2566/* This is how to output an element of a case-vector that is relative.
2567 We don't use these on the 386 yet, because the ATT assembler can't do
2568 forward reference the differences.
2569 */
2570
1737#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
2571#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
1738 fprintf (FILE, "\t.word %s%d-%s%d\n",LPREFIX, VALUE,LPREFIX, REL)
1739
1740/* Define the parentheses used to group arithmetic operations
1741 in assembler code. */
1742
1743#define ASM_OPEN_PAREN ""
1744#define ASM_CLOSE_PAREN ""
1745

--- 12 unchanged lines hidden (view full) ---

1758 outputs b,w,or l respectively.
1759
1760 On the 80386, we use several such letters:
1761 f -- float insn (print a CONST_DOUBLE as a float rather than in hex).
1762 L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
1763 R -- print the prefix for register names.
1764 z -- print the opcode suffix for the size of the current operand.
1765 * -- print a star (in certain assembler syntax)
2572 fprintf (FILE, "\t.word %s%d-%s%d\n",LPREFIX, VALUE,LPREFIX, REL)
2573
2574/* Define the parentheses used to group arithmetic operations
2575 in assembler code. */
2576
2577#define ASM_OPEN_PAREN ""
2578#define ASM_CLOSE_PAREN ""
2579

--- 12 unchanged lines hidden (view full) ---

2592 outputs b,w,or l respectively.
2593
2594 On the 80386, we use several such letters:
2595 f -- float insn (print a CONST_DOUBLE as a float rather than in hex).
2596 L,W,B,Q,S,T -- print the opcode suffix for specified size of operand.
2597 R -- print the prefix for register names.
2598 z -- print the opcode suffix for the size of the current operand.
2599 * -- print a star (in certain assembler syntax)
1766 w -- print the operand as if it's a "word" (HImode) even if it isn't.
1767 b -- print the operand as if it's a byte (QImode) even if it isn't.
1768 c -- don't print special prefixes before constant operands. */
2600 P -- if PIC, print an @PLT suffix.
2601 X -- don't print any sort of PIC '@' suffix for a symbol.
2602 J -- print jump insn for arithmetic_comparison_operator.
2603 s -- ??? something to do with double shifts. not actually used, afaik.
2604 C -- print a conditional move suffix corresponding to the op code.
2605 c -- likewise, but reverse the condition.
2606 F,f -- likewise, but for floating-point. */
1769
1770#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \
1771 ((CODE) == '*')
1772
1773/* Print the name of a register based on its machine mode and number.
1774 If CODE is 'w', pretend the mode is HImode.
1775 If CODE is 'b', pretend the mode is QImode.
1776 If CODE is 'k', pretend the mode is SImode.

--- 88 unchanged lines hidden (view full) ---

1865 (FP_REGNO_P (REGNO) \
1866 && (GET_CODE (INSN) == JUMP_INSN || GET_CODE (INSN) == BARRIER))
1867*/
1868
1869/* a letter which is not needed by the normal asm syntax, which
1870 we can use for operand syntax in the extended asm */
1871
1872#define ASM_OPERAND_LETTER '#'
2607
2608#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \
2609 ((CODE) == '*')
2610
2611/* Print the name of a register based on its machine mode and number.
2612 If CODE is 'w', pretend the mode is HImode.
2613 If CODE is 'b', pretend the mode is QImode.
2614 If CODE is 'k', pretend the mode is SImode.

--- 88 unchanged lines hidden (view full) ---

2703 (FP_REGNO_P (REGNO) \
2704 && (GET_CODE (INSN) == JUMP_INSN || GET_CODE (INSN) == BARRIER))
2705*/
2706
2707/* a letter which is not needed by the normal asm syntax, which
2708 we can use for operand syntax in the extended asm */
2709
2710#define ASM_OPERAND_LETTER '#'
1873
1874#define RET return ""
2711#define RET return ""
1875#define AT_SP(mode) (gen_rtx (MEM, (mode), stack_pointer_rtx))
2712#define AT_SP(mode) (gen_rtx_MEM ((mode), stack_pointer_rtx))
1876
2713
2714/* Helper macros to expand a binary/unary operator if needed */
2715#define IX86_EXPAND_BINARY_OPERATOR(OP, MODE, OPERANDS) \
2716do { \
2717 if (!ix86_expand_binary_operator (OP, MODE, OPERANDS)) \
2718 FAIL; \
2719} while (0)
2720
2721#define IX86_EXPAND_UNARY_OPERATOR(OP, MODE, OPERANDS) \
2722do { \
2723 if (!ix86_expand_unary_operator (OP, MODE, OPERANDS,)) \
2724 FAIL; \
2725} while (0)
2726
2727
1877/* Functions in i386.c */
1878extern void override_options ();
1879extern void order_regs_for_local_alloc ();
2728/* Functions in i386.c */
2729extern void override_options ();
2730extern void order_regs_for_local_alloc ();
2731extern char *output_strlen_unroll ();
2732extern struct rtx_def *i386_sext16_if_const ();
2733extern int i386_aligned_p ();
2734extern int i386_cc_probably_useless_p ();
1880extern int i386_valid_decl_attribute_p ();
1881extern int i386_valid_type_attribute_p ();
1882extern int i386_return_pops_args ();
1883extern int i386_comp_type_attributes ();
1884extern void init_cumulative_args ();
1885extern void function_arg_advance ();
1886extern struct rtx_def *function_arg ();
1887extern int function_arg_partial_nregs ();
2735extern int i386_valid_decl_attribute_p ();
2736extern int i386_valid_type_attribute_p ();
2737extern int i386_return_pops_args ();
2738extern int i386_comp_type_attributes ();
2739extern void init_cumulative_args ();
2740extern void function_arg_advance ();
2741extern struct rtx_def *function_arg ();
2742extern int function_arg_partial_nregs ();
2743extern char *output_strlen_unroll ();
1888extern void output_op_from_reg ();
1889extern void output_to_reg ();
1890extern char *singlemove_string ();
1891extern char *output_move_double ();
1892extern char *output_move_memory ();
1893extern char *output_move_pushmem ();
1894extern int standard_80387_constant_p ();
1895extern char *output_move_const_single ();
1896extern int symbolic_operand ();
1897extern int call_insn_operand ();
1898extern int expander_call_insn_operand ();
1899extern int symbolic_reference_mentioned_p ();
2744extern void output_op_from_reg ();
2745extern void output_to_reg ();
2746extern char *singlemove_string ();
2747extern char *output_move_double ();
2748extern char *output_move_memory ();
2749extern char *output_move_pushmem ();
2750extern int standard_80387_constant_p ();
2751extern char *output_move_const_single ();
2752extern int symbolic_operand ();
2753extern int call_insn_operand ();
2754extern int expander_call_insn_operand ();
2755extern int symbolic_reference_mentioned_p ();
2756extern int ix86_expand_binary_operator ();
2757extern int ix86_binary_operator_ok ();
2758extern int ix86_expand_unary_operator ();
2759extern int ix86_unary_operator_ok ();
1900extern void emit_pic_move ();
1901extern void function_prologue ();
1902extern int simple_386_epilogue ();
1903extern void function_epilogue ();
1904extern int legitimate_address_p ();
1905extern struct rtx_def *legitimize_pic_address ();
1906extern struct rtx_def *legitimize_address ();
1907extern void print_operand ();

--- 6 unchanged lines hidden (view full) ---

1914extern char *output_387_binary_op ();
1915extern char *output_fix_trunc ();
1916extern char *output_float_compare ();
1917extern char *output_fp_cc0_set ();
1918extern void save_386_machine_status ();
1919extern void restore_386_machine_status ();
1920extern void clear_386_stack_locals ();
1921extern struct rtx_def *assign_386_stack_local ();
2760extern void emit_pic_move ();
2761extern void function_prologue ();
2762extern int simple_386_epilogue ();
2763extern void function_epilogue ();
2764extern int legitimate_address_p ();
2765extern struct rtx_def *legitimize_pic_address ();
2766extern struct rtx_def *legitimize_address ();
2767extern void print_operand ();

--- 6 unchanged lines hidden (view full) ---

2774extern char *output_387_binary_op ();
2775extern char *output_fix_trunc ();
2776extern char *output_float_compare ();
2777extern char *output_fp_cc0_set ();
2778extern void save_386_machine_status ();
2779extern void restore_386_machine_status ();
2780extern void clear_386_stack_locals ();
2781extern struct rtx_def *assign_386_stack_local ();
2782extern int is_mul ();
2783extern int is_div ();
2784extern int last_to_set_cc ();
2785extern int doesnt_set_condition_code ();
2786extern int sets_condition_code ();
2787extern int str_immediate_operand ();
2788extern int is_fp_insn ();
2789extern int is_fp_dest ();
2790extern int is_fp_store ();
2791extern int agi_dependent ();
2792extern int reg_mentioned_in_mem ();
2793extern char *output_int_conditional_move ();
2794extern char *output_fp_conditional_move ();
2795extern int ix86_can_use_return_insn_p ();
1922
2796
2797#ifdef NOTYET
2798extern struct rtx_def *copy_all_rtx ();
2799extern void rewrite_address ();
2800#endif
2801
1923/* Variables in i386.c */
2802/* Variables in i386.c */
2803extern char *ix86_cpu_string; /* for -mcpu=<xxx> */
2804extern char *ix86_arch_string; /* for -march=<xxx> */
1924extern char *i386_reg_alloc_order; /* register allocation order */
1925extern char *i386_regparm_string; /* # registers to use to pass args */
1926extern char *i386_align_loops_string; /* power of two alignment for loops */
1927extern char *i386_align_jumps_string; /* power of two alignment for non-loop jumps */
1928extern char *i386_align_funcs_string; /* power of two alignment for functions */
2805extern char *i386_reg_alloc_order; /* register allocation order */
2806extern char *i386_regparm_string; /* # registers to use to pass args */
2807extern char *i386_align_loops_string; /* power of two alignment for loops */
2808extern char *i386_align_jumps_string; /* power of two alignment for non-loop jumps */
2809extern char *i386_align_funcs_string; /* power of two alignment for functions */
2810extern char *i386_branch_cost_string; /* values 1-5: see jump.c */
1929extern int i386_regparm; /* i386_regparm_string as a number */
1930extern int i386_align_loops; /* power of two alignment for loops */
1931extern int i386_align_jumps; /* power of two alignment for non-loop jumps */
1932extern int i386_align_funcs; /* power of two alignment for functions */
2811extern int i386_regparm; /* i386_regparm_string as a number */
2812extern int i386_align_loops; /* power of two alignment for loops */
2813extern int i386_align_jumps; /* power of two alignment for non-loop jumps */
2814extern int i386_align_funcs; /* power of two alignment for functions */
2815extern int i386_branch_cost; /* values 1-5: see jump.c */
1933extern char *hi_reg_name[]; /* names for 16 bit regs */
1934extern char *qi_reg_name[]; /* names for 8 bit regs (low) */
1935extern char *qi_high_reg_name[]; /* names for 8 bit regs (high) */
1936extern enum reg_class regclass_map[]; /* smalled class containing REGNO */
1937extern struct rtx_def *i386_compare_op0; /* operand 0 for comparisons */
1938extern struct rtx_def *i386_compare_op1; /* operand 1 for comparisons */
1939
1940/* External variables used */
2816extern char *hi_reg_name[]; /* names for 16 bit regs */
2817extern char *qi_reg_name[]; /* names for 8 bit regs (low) */
2818extern char *qi_high_reg_name[]; /* names for 8 bit regs (high) */
2819extern enum reg_class regclass_map[]; /* smalled class containing REGNO */
2820extern struct rtx_def *i386_compare_op0; /* operand 0 for comparisons */
2821extern struct rtx_def *i386_compare_op1; /* operand 1 for comparisons */
2822
2823/* External variables used */
1941extern int optimize; /* optimization level */
1942extern int obey_regdecls; /* TRUE if stupid register allocation */
2824extern int optimize; /* optimization level */
2825extern int obey_regdecls; /* TRUE if stupid register allocation */
1943
1944/* External functions used */
1945extern struct rtx_def *force_operand ();
2826
2827/* External functions used */
2828extern struct rtx_def *force_operand ();
2829
1946
1947/*
1948Local variables:
1949version-control: t
1950End:
1951*/
2830
2831/*
2832Local variables:
2833version-control: t
2834End:
2835*/