|
|
1.1 root 1: /* Definitions of target machine for GNU compiler, for Acorn RISC Machine.
2: Copyright (C) 1991, 1993 Free Software Foundation, Inc.
3: Contributed by Pieter `Tiggr' Schoenmakers ([email protected])
4: and Martin Simmons (@harleqn.co.uk).
5: More major hacks by Richard Earnshaw ([email protected])
6:
7: This file is part of GNU CC.
8:
9: GNU CC is free software; you can redistribute it and/or modify
10: it under the terms of the GNU General Public License as published by
11: the Free Software Foundation; either version 2, or (at your option)
12: any later version.
13:
14: GNU CC is distributed in the hope that it will be useful,
15: but WITHOUT ANY WARRANTY; without even the implied warranty of
16: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17: GNU General Public License for more details.
18:
19: You should have received a copy of the GNU General Public License
20: along with GNU CC; see the file COPYING. If not, write to
21: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
22:
23: /* Sometimes the directive `riscos' is checked. This does not imply that this
24: tm file can be used unchanged to build a GCC for RISC OS.
25: (Since in fact, it can't.) */
26:
27: extern void output_prologue ();
28: extern void output_epilogue ();
29: extern char *arm_output_asm_insn ();
30: extern char *arm_output_llc ();
31: extern char *arithmetic_instr ();
32: extern char *output_add_immediate ();
33: extern char *output_call ();
34: extern char *output_call_mem ();
35: extern char *output_move_double ();
36: extern char *output_mov_double_fpu_from_arm ();
37: extern char *output_mov_double_arm_from_fpu ();
38: extern char *output_mov_long_double_fpu_from_arm ();
39: extern char *output_mov_long_double_arm_from_fpu ();
40: extern char *output_mov_long_double_arm_from_arm ();
41: extern char *output_mov_immediate ();
42: extern char *output_multi_immediate ();
43: extern char *output_shifted_move ();
44: extern char *output_shift_compare ();
45: extern char *output_arithmetic_with_immediate_multiply ();
46: extern char *output_arithmetic_with_shift ();
47: extern char *output_return_instruction ();
48: extern char *output_load_symbol ();
49: extern char *fp_immediate_constant ();
50: extern char *shift_instr ();
51: extern struct rtx_def *gen_compare_reg ();
52: extern struct rtx_def *arm_gen_store_multiple ();
53: extern struct rtx_def *arm_gen_load_multiple ();
54:
55: extern char *arm_condition_codes[];
56:
57: /* This is needed by the tail-calling peepholes */
58: extern int frame_pointer_needed;
59:
60:
61: #ifndef CPP_PREDEFINES
62: #define CPP_PREDEFINES "-Darm -Acpu(arm) -Amachine(arm)"
63: #endif
64:
65: #ifndef CPP_SPEC
66: #define CPP_SPEC "%{m6:-D__arm6__}"
67: #endif
68:
69: /* Run-time Target Specification. */
70: #ifndef TARGET_VERSION
71: #define TARGET_VERSION \
72: fputs (" (ARM/generic)", stderr);
73: #endif
74:
75: /* Run-time compilation parameters selecting different hardware subsets.
76: On the ARM, misuse it in a different way. */
77: extern int target_flags;
78:
79: /* Nonzero if the function prologue (and epilogue) should obey
80: the ARM Procedure Call Standard. */
81: #define TARGET_APCS (target_flags & 1)
82:
83: /* Nonzero if the function prologue should output the function name to enable
84: the post mortem debugger to print a backtrace (very useful on RISCOS,
85: unused on RISCiX). Specifying this flag also enables -mapcs.
86: XXX Must still be implemented in the prologue. */
87: #define TARGET_POKE_FUNCTION_NAME (target_flags & 2)
88:
89: /* Nonzero if floating point instructions are emulated by the FPE, in which
90: case instruction scheduling becomes very uninteresting. */
91: #define TARGET_FPE (target_flags & 4)
92:
93: /* Nonzero if destined for an ARM6xx. Takes out bits that assume restoration
94: of condition flags when returning from a branch & link (ie. a function) */
95: #define TARGET_6 (target_flags & 8)
96:
97: /* ARM_EXTRA_TARGET_SWITCHES is used in riscix.h to define some options which
98: are passed to the preprocessor and the assembler post-processor. They
99: aren't needed in the main pass of the compiler, but if we don't define
100: them in target switches cc1 complains about them. For the sake of
101: argument lets allocate bit 31 of target flags for such options. */
102:
103: #ifndef ARM_EXTRA_TARGET_SWITCHES
104: #define ARM_EXTRA_TARGET_SWITCHES
105: #endif
106:
107: #define TARGET_SWITCHES \
108: { \
109: {"apcs", 1}, \
110: {"poke-function-name", 2}, \
111: {"fpe", 4}, \
112: {"6", 8}, \
113: {"2", -8}, \
114: {"3", -8}, \
115: ARM_EXTRA_TARGET_SWITCHES \
116: {"", TARGET_DEFAULT } \
117: }
118:
119: /* Which processor we are running on. Currently this is only used to
120: get the condition code clobbering attribute right when we are running on
121: an arm 6 */
122:
123: enum processor_type
124: {
125: PROCESSOR_ARM2,
126: PROCESSOR_ARM3,
127: PROCESSOR_ARM6
128: };
129:
130: /* Recast the cpu class to be the cpu attribute. */
131:
132: /* Recast the cpu class to be the cpu attribute. */
133: #define arm_cpu_attr ((enum attr_cpu)arm_cpu)
134:
135: extern enum processor_type arm_cpu;
136:
137: #define TARGET_DEFAULT 0
138:
139: #define TARGET_MEM_FUNCTIONS 1
140:
141: /* OVERRIDE_OPTIONS takes care of the following:
142: - if -mpoke-function-name, then -mapcs.
143: - if doing debugging, then -mapcs; if RISCOS, then -mpoke-function-name.
144: - if floating point is done by emulation, forget about instruction
145: scheduling. Note that this only saves compilation time; it doesn't
146: matter for the final code. */
147: #ifndef TARGET_WHEN_DEBUGGING
148: #define TARGET_WHEN_DEBUGGING 1
149: #endif
150:
151: #define OVERRIDE_OPTIONS \
152: { \
153: if (write_symbols != NO_DEBUG && flag_omit_frame_pointer) \
154: warning ("-g without a frame pointer may not give sensible debugging");\
155: if (TARGET_POKE_FUNCTION_NAME) \
156: target_flags |= 1; \
157: if (TARGET_FPE) \
158: flag_schedule_insns = flag_schedule_insns_after_reload = 0; \
159: arm_cpu = TARGET_6 ? PROCESSOR_ARM6: PROCESSOR_ARM2; \
160: }
161:
162: /* Omitting the frame pointer is a very good idea on the ARM, especially if
163: not TARGET_APCS, in which case all that pushing on function entry isn't
164: mandatory anymore. Unfortunately this is not permitted since we mustn't
165: change the flags when -g is enabled and without a frame pointer debugging
166: using dbx is impossible.
167: Forcing loads to be explicit allows cse to work better */
168:
169: #define OPTIMIZATION_OPTIONS(OPTIMIZE) \
170: { \
171: if (OPTIMIZE) \
172: flag_force_mem = 1; \
173: }
174:
175: /* Target machine storage Layout. */
176:
177:
178: /* Define this macro if it is advisable to hold scalars in registers
179: in a wider mode than that declared by the program. In such cases,
180: the value is constrained to be within the bounds of the declared
181: type, but kept valid in the wider mode. The signedness of the
182: extension may differ from that of the type. */
183:
184: /* It is far faster to zero extend chars than to sign extend them */
185:
186: #define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \
187: if (GET_MODE_CLASS (MODE) == MODE_INT \
188: && GET_MODE_SIZE (MODE) < 4) \
189: { \
190: if (MODE == QImode) \
191: UNSIGNEDP = 1; \
192: (MODE) = SImode; \
193: }
194:
195: /* Define for XFmode extended real floating point support.
196: This will automatically cause REAL_ARITHMETIC to be defined. */
197: /* For the ARM:
198: I think I have added all the code to make this work. Unfortunately,
199: early releases of the floating point emulation code on RISCiX used a
200: different format for extended precision numbers. On my RISCiX box there
201: is a bug somewhere which causes the machine to lock up when running enquire
202: with long doubles. There is the additional aspect that Norcroft C
203: treats long doubles as doubles and we ought to remain compatible.
204: Perhaps someone with an FPA coprocessor and not running RISCiX would like
205: to try this someday. */
206: /* #define LONG_DOUBLE_TYPE_SIZE 96 */
207:
208: /* Disable XFmode patterns in md file */
209: #define ENABLE_XF_PATTERNS 0
210:
211: /* Define if you don't want extended real, but do want to use the
212: software floating point emulator for REAL_ARITHMETIC and
213: decimal <-> binary conversion. */
214: /* See comment above */
215: #define REAL_ARITHMETIC
216:
217: /* Define this if most significant bit is lowest numbered
218: in instructions that operate on numbered bit-fields. */
219: #define BITS_BIG_ENDIAN 0
220:
221: /* Define this if most significant byte of a word is the lowest numbered. */
222: #define BYTES_BIG_ENDIAN 0
223:
224: /* Define this if most significant word of a multiword number is the lowest
225: numbered. */
226: #define WORDS_BIG_ENDIAN 0
227:
228: /* Define this if most significant word of doubles is the lowest numbered */
229: #define FLOAT_WORDS_BIG_ENDIAN 1
230:
231: /* Number of bits in an addressable storage unit */
232: #define BITS_PER_UNIT 8
233:
234: #define BITS_PER_WORD 32
235:
236: #define UNITS_PER_WORD 4
237:
238: #define POINTER_SIZE 32
239:
240: #define PARM_BOUNDARY 32
241:
242: #define STACK_BOUNDARY 32
243:
244: #define FUNCTION_BOUNDARY 32
245:
246: #define EMPTY_FIELD_BOUNDARY 32
247:
248: #define BIGGEST_ALIGNMENT 32
249:
250: /* Make strings word-aligned so strcpy from constants will be faster. */
251: #define CONSTANT_ALIGNMENT(EXP, ALIGN) \
252: (TREE_CODE (EXP) == STRING_CST \
253: && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
254:
255: /* Every structures size must be a multiple of 32 bits. */
256: #define STRUCTURE_SIZE_BOUNDARY 32
257:
258: /* Non-zero if move instructions will actually fail to work
259: when given unaligned data. */
260: #define STRICT_ALIGNMENT 1
261:
262: #define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
263:
264: /* Define number of bits in most basic integer type.
265: (If undefined, default is BITS_PER_WORD). */
266: /* #define INT_TYPE_SIZE */
267:
268: /* Standard register usage. */
269:
270: /* Register allocation in ARM Procedure Call Standard (as used on RISCiX):
271: (S - saved over call).
272:
273: r0 * argument word/integer result
274: r1-r3 argument word
275:
276: r4-r8 S register variable
277: r9 S (rfp) register variable (real frame pointer)
278:
279: r10 F S (sl) stack limit (not currently used)
280: r11 F S (fp) argument pointer
281: r12 (ip) temp workspace
282: r13 F S (sp) lower end of current stack frame
283: r14 (lr) link address/workspace
284: r15 F (pc) program counter
285:
286: f0 floating point result
287: f1-f3 floating point scratch
288:
289: f4-f7 S floating point variable
290:
291: cc This is NOT a real register, but is used internally
292: to represent things that use or set the condition
293: codes.
294: sfp This isn't either. It is used during rtl generation
295: since the offset between the frame pointer and the
296: auto's isn't known until after register allocation.
297: afp Nor this, we only need this because of non-local
298: goto. Without it fp appears to be used and the
299: elimination code won't get rid of sfp. It tracks
300: fp exactly at all times.
301:
302: *: See CONDITIONAL_REGISTER_USAGE */
303:
304: /* The stack backtrace structure is as follows:
305: fp points to here: | save code pointer | [fp]
306: | return link value | [fp, #-4]
307: | return sp value | [fp, #-8]
308: | return fp value | [fp, #-12]
309: [| saved r10 value |]
310: [| saved r9 value |]
311: [| saved r8 value |]
312: [| saved r7 value |]
313: [| saved r6 value |]
314: [| saved r5 value |]
315: [| saved r4 value |]
316: [| saved r3 value |]
317: [| saved r2 value |]
318: [| saved r1 value |]
319: [| saved r0 value |]
320: [| saved f7 value |] three words
321: [| saved f6 value |] three words
322: [| saved f5 value |] three words
323: [| saved f4 value |] three words
324: r0-r3 are not normally saved in a C function. */
325:
326: /* The number of hard registers is 16 ARM + 8 FPU + 1 CC + 1 SFP. */
327: #define FIRST_PSEUDO_REGISTER 27
328:
329: /* 1 for registers that have pervasive standard uses
330: and are not available for the register allocator. */
331: #define FIXED_REGISTERS \
332: { \
333: 0,0,0,0,0,0,0,0, \
334: 0,0,1,1,0,1,0,1, \
335: 0,0,0,0,0,0,0,0, \
336: 1,1,1 \
337: }
338:
339: /* 1 for registers not available across function calls.
340: These must include the FIXED_REGISTERS and also any
341: registers that can be used without being saved.
342: The latter must include the registers where values are returned
343: and the register where structure-value addresses are passed.
344: Aside from that, you can include as many other registers as you like.
345: The CC is not preserved over function calls on the ARM 6, so it is
346: easier to assume this for all. SFP is preserved, since FP is. */
347: #define CALL_USED_REGISTERS \
348: { \
349: 1,1,1,1,0,0,0,0, \
350: 0,0,1,1,1,1,1,1, \
351: 1,1,1,1,0,0,0,0, \
352: 1,1,1 \
353: }
354:
355: /* If doing stupid life analysis, avoid a bug causing a return value r0 to be
356: trampled. This effectively reduces the number of available registers by 1.
357: XXX It is a hack, I know.
358: XXX Is this still needed? */
359: #define CONDITIONAL_REGISTER_USAGE \
360: { \
361: if (obey_regdecls) \
362: fixed_regs[0] = 1; \
363: }
364:
365: /* Return number of consecutive hard regs needed starting at reg REGNO
366: to hold something of mode MODE.
367: This is ordinarily the length in words of a value of mode MODE
368: but can be less for certain modes in special long registers.
369:
370: On the ARM regs are UNITS_PER_WORD bits wide; FPU regs can hold any FP
371: mode. */
372: #define HARD_REGNO_NREGS(REGNO, MODE) \
373: (((REGNO) >= 16 && REGNO != FRAME_POINTER_REGNUM \
374: && (REGNO) != ARG_POINTER_REGNUM) ? 1 \
375: : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
376:
377: /* Value is 1 if hard register REGNO can hold a value of machine-mode MODE.
378: This is TRUE for ARM regs since they can hold anything, and TRUE for FPU
379: regs holding FP. */
380: #define HARD_REGNO_MODE_OK(REGNO, MODE) \
381: ((GET_MODE_CLASS (MODE) == MODE_CC) ? (REGNO == CC_REGNUM) : \
382: ((REGNO) < 16 || REGNO == FRAME_POINTER_REGNUM \
383: || REGNO == ARG_POINTER_REGNUM \
384: || GET_MODE_CLASS (MODE) == MODE_FLOAT))
385:
386: /* Value is 1 if it is a good idea to tie two pseudo registers
387: when one has mode MODE1 and one has mode MODE2.
388: If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
389: for any hard reg, then this must be 0 for correct output. */
390: #define MODES_TIEABLE_P(MODE1, MODE2) \
391: (((MODE1) == SFmode || (MODE1) == DFmode) \
392: == ((MODE2) == SFmode || (MODE2) == DFmode))
393:
394: /* Specify the registers used for certain standard purposes.
395: The values of these macros are register numbers. */
396:
397: /* Define this if the program counter is overloaded on a register. */
398: #define PC_REGNUM 15
399:
400: /* Register to use for pushing function arguments. */
401: #define STACK_POINTER_REGNUM 13
402:
403: /* Base register for access to local variables of the function. */
404: #define FRAME_POINTER_REGNUM 25
405:
406: /* Define this to be where the real frame pointer is if it is not possible to
407: work out the offset between the frame pointer and the automatic variables
408: until after register allocation has taken place. FRAME_POINTER_REGNUM
409: should point to a special register that we will make sure is eliminated. */
410: #define HARD_FRAME_POINTER_REGNUM 11
411:
412: /* Value should be nonzero if functions must have frame pointers.
413: Zero means the frame pointer need not be set up (and parms may be accessed
414: via the stack pointer) in functions that seem suitable.
415: If we have to have a frame pointer we might as well make use of it.
416: APCS says that the frame pointer does not need to be pushed in leaf
417: functions. */
418: #define FRAME_POINTER_REQUIRED (TARGET_APCS && !leaf_function_p ())
419:
420: /* Base register for access to arguments of the function. */
421: #define ARG_POINTER_REGNUM 26
422:
423: /* The native (Norcroft) Pascal compiler for the ARM passes the static chain
424: as an invisible last argument (possible since varargs don't exist in
425: Pascal), so the following is not true. */
426: #define STATIC_CHAIN_REGNUM 8
427:
428: /* Register in which address to store a structure value
429: is passed to a function. */
430: #define STRUCT_VALUE_REGNUM 0
431:
432: /* Internal, so that we don't need to refer to a raw number */
433: #define CC_REGNUM 24
434:
435: /* The order in which register should be allocated. It is good to use ip
436: since no saving is required (though calls clobber it) and it never contains
437: function parameters. It is quite good to use lr since other calls may
438: clobber it anyway. Allocate r0 through r3 in reverse order since r3 is
439: least likely to contain a function parameter; in addition results are
440: returned in r0.
441: */
442: #define REG_ALLOC_ORDER \
443: { \
444: 3, 2, 1, 0, 12, 14, 4, 5, \
445: 6, 7, 8, 10, 9, 11, 13, 15, \
446: 16, 17, 18, 19, 20, 21, 22, 23, \
447: 24, 25 \
448: }
449:
450: /* Register and constant classes. */
451:
452: /* Register classes: all ARM regs or all FPU regs---simple! */
453: enum reg_class
454: {
455: NO_REGS,
456: FPU_REGS,
457: GENERAL_REGS,
458: ALL_REGS,
459: LIM_REG_CLASSES
460: };
461:
462: #define N_REG_CLASSES (int) LIM_REG_CLASSES
463:
464: /* Give names of register classes as strings for dump file. */
465: #define REG_CLASS_NAMES \
466: { \
467: "NO_REGS", \
468: "FPU_REGS", \
469: "GENERAL_REGS", \
470: "ALL_REGS", \
471: }
472:
473: /* Define which registers fit in which classes.
474: This is an initializer for a vector of HARD_REG_SET
475: of length N_REG_CLASSES. */
476: #define REG_CLASS_CONTENTS \
477: { \
478: 0x0000000, /* NO_REGS */ \
479: 0x0FF0000, /* FPU_REGS */ \
480: 0x200FFFF, /* GENERAL_REGS */ \
481: 0x2FFFFFF /* ALL_REGS */ \
482: }
483:
484: /* The same information, inverted:
485: Return the class number of the smallest class containing
486: reg number REGNO. This could be a conditional expression
487: or could index an array. */
488: #define REGNO_REG_CLASS(REGNO) \
489: (((REGNO) < 16 || REGNO == FRAME_POINTER_REGNUM \
490: || REGNO == ARG_POINTER_REGNUM) \
491: ? GENERAL_REGS : (REGNO) == CC_REGNUM \
492: ? NO_REGS : FPU_REGS)
493:
494: /* The class value for index registers, and the one for base regs. */
495: #define INDEX_REG_CLASS GENERAL_REGS
496: #define BASE_REG_CLASS GENERAL_REGS
497:
498: /* Get reg_class from a letter such as appears in the machine description.
499: We only need constraint `f' for FPU_REGS (`r' == GENERAL_REGS). */
500: #define REG_CLASS_FROM_LETTER(C) \
501: ((C)=='f' ? FPU_REGS : NO_REGS)
502:
503: /* The letters I, J, K, L and M in a register constraint string
504: can be used to stand for particular ranges of immediate operands.
505: This macro defines what the ranges are.
506: C is the letter, and VALUE is a constant value.
507: Return 1 if VALUE is in the range specified by C.
508: I: immediate arithmetic operand (i.e. 8 bits shifted as required).
509: J: valid indexing constants.
510: K: as I but also (not (value)) ok.
511: L: as I but also (neg (value)) ok.*/
512: #define CONST_OK_FOR_LETTER_P(VALUE, C) \
513: ((C) == 'I' ? const_ok_for_arm (VALUE) : \
514: (C) == 'J' ? ((VALUE) < 4096 && (VALUE) > -4096) : \
515: (C) == 'K' ? (const_ok_for_arm (VALUE) || const_ok_for_arm (~(VALUE))) : \
516: (C) == 'L' ? (const_ok_for_arm (VALUE) || const_ok_for_arm (-(VALUE))) : 0)
517:
518: /* For the ARM, `Q' means that this is a memory operand that is just
519: an offset from a register.
520: `S' means any symbol that has the SYMBOL_REF_FLAG set or a CONSTANT_POOL
521: address. This means that the symbol is in the text segment and can be
522: accessed without using a load. */
523:
524: #define EXTRA_CONSTRAINT(OP, C) \
525: ((C) == 'Q' ? GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) == REG \
526: : (C) == 'S' ? CONSTANT_ADDRESS_P (OP) : 0)
527:
528: /* Constant letter 'G' for the FPU immediate constants.
529: 'H' means the same constant negated. */
530: #define CONST_DOUBLE_OK_FOR_LETTER_P(X,C) \
531: ((C) == 'G' ? const_double_rtx_ok_for_fpu (X) \
532: : (C) == 'H' ? neg_const_double_rtx_ok_for_fpu (X) : 0)
533:
534: /* Given an rtx X being reloaded into a reg required to be
535: in class CLASS, return the class of reg to actually use.
536: In general this is just CLASS; but on some machines
537: in some cases it is preferable to use a more restrictive class. */
538: #define PREFERRED_RELOAD_CLASS(X, CLASS) (CLASS)
539:
540: /* Return the register class of a scratch register needed to copy IN into
541: or out of a register in CLASS in MODE. If it can be done directly,
542: NO_REGS is returned. */
543: #define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS,MODE,X) \
544: (((MODE) == DFmode && (CLASS) == GENERAL_REGS \
545: && true_regnum (X) == -1) ? GENERAL_REGS \
546: : ((MODE) == HImode && true_regnum (X) == -1) ? GENERAL_REGS : NO_REGS)
547:
548: /* Return the maximum number of consecutive registers
549: needed to represent mode MODE in a register of class CLASS.
550: ARM regs are UNITS_PER_WORD bits while FPU regs can hold any FP mode */
551: #define CLASS_MAX_NREGS(CLASS, MODE) \
552: ((CLASS) == FPU_REGS ? 1 \
553: : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
554:
555: /* Moves between FPU_REGS and GENERAL_REGS are two memory insns. */
556: #define REGISTER_MOVE_COST(CLASS1, CLASS2) \
557: ((((CLASS1) == FPU_REGS && (CLASS2) != FPU_REGS) \
558: || ((CLASS2) == FPU_REGS && (CLASS1) != FPU_REGS)) \
559: ? 20 : 2)
560:
561: /* Stack layout; function entry, exit and calling. */
562:
563: /* Define this if pushing a word on the stack
564: makes the stack pointer a smaller address. */
565: #define STACK_GROWS_DOWNWARD 1
566:
567: /* Define this if the nominal address of the stack frame
568: is at the high-address end of the local variables;
569: that is, each additional local variable allocated
570: goes at a more negative offset in the frame. */
571: #define FRAME_GROWS_DOWNWARD 1
572:
573: /* Offset within stack frame to start allocating local variables at.
574: If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
575: first local allocated. Otherwise, it is the offset to the BEGINNING
576: of the first local allocated. */
577: #define STARTING_FRAME_OFFSET 0
578:
579: /* If we generate an insn to push BYTES bytes,
580: this says how many the stack pointer really advances by. */
581: #define PUSH_ROUNDING(NPUSHED) (((NPUSHED) + 3) & ~3)
582:
583: /* Offset of first parameter from the argument pointer register value. */
584: #define FIRST_PARM_OFFSET(FNDECL) 4
585:
586: /* Value is the number of byte of arguments automatically
587: popped when returning from a subroutine call.
588: FUNTYPE is the data type of the function (as a tree),
589: or for a library call it is an identifier node for the subroutine name.
590: SIZE is the number of bytes of arguments passed on the stack.
591:
592: On the ARM, the caller does not pop any of its arguments that were passed
593: on the stack. */
594: #define RETURN_POPS_ARGS(FUNTYPE, SIZE) 0
595:
596: /* Define how to find the value returned by a function.
597: VALTYPE is the data type of the value (as a tree).
598: If the precise function being called is known, FUNC is its FUNCTION_DECL;
599: otherwise, FUNC is 0. */
600: #define FUNCTION_VALUE(VALTYPE, FUNC) \
601: (GET_MODE_CLASS (TYPE_MODE (VALTYPE)) == MODE_FLOAT \
602: ? gen_rtx (REG, TYPE_MODE (VALTYPE), 16) \
603: : gen_rtx (REG, TYPE_MODE (VALTYPE), 0))
604:
605: /* Define how to find the value returned by a library function
606: assuming the value has mode MODE. */
607: #define LIBCALL_VALUE(MODE) \
608: (GET_MODE_CLASS (MODE) == MODE_FLOAT \
609: ? gen_rtx (REG, MODE, 16) \
610: : gen_rtx (REG, MODE, 0))
611:
612: /* 1 if N is a possible register number for a function value.
613: On the ARM, only r0 and f0 can return results. */
614: #define FUNCTION_VALUE_REGNO_P(REGNO) \
615: ((REGNO) == 0 || (REGNO) == 16)
616:
617: /* Define where to put the arguments to a function.
618: Value is zero to push the argument on the stack,
619: or a hard register in which to store the argument.
620:
621: MODE is the argument's machine mode.
622: TYPE is the data type of the argument (as a tree).
623: This is null for libcalls where that information may
624: not be available.
625: CUM is a variable of type CUMULATIVE_ARGS which gives info about
626: the preceding args and about the function being called.
627: NAMED is nonzero if this argument is a named parameter
628: (otherwise it is an extra parameter matching an ellipsis).
629:
630: On the ARM, normally the first 16 bytes are passed in registers r0-r3; all
631: other arguments are passed on the stack. If (NAMED == 0) (which happens
632: only in assign_parms, since SETUP_INCOMING_VARARGS is defined), say it is
633: passed in the stack (function_prologue will indeed make it pass in the
634: stack if necessary). */
635: #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
636: ((NAMED) \
637: ? ((CUM) >= 16 ? 0 : gen_rtx (REG, MODE, (CUM) / 4)) \
638: : 0)
639:
640: /* For an arg passed partly in registers and partly in memory,
641: this is the number of registers used.
642: For args passed entirely in registers or entirely in memory, zero. */
643: #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) \
644: ((CUM) < 16 && 16 < (CUM) + ((MODE) != BLKmode \
645: ? GET_MODE_SIZE (MODE) \
646: : int_size_in_bytes (TYPE)) \
647: ? 4 - (CUM) / 4 : 0)
648:
649: /* A C type for declaring a variable that is used as the first argument of
650: `FUNCTION_ARG' and other related values. For some target machines, the
651: type `int' suffices and can hold the number of bytes of argument so far.
652:
653: On the ARM, this is the number of bytes of arguments scanned so far. */
654: #define CUMULATIVE_ARGS int
655:
656: /* Initialize a variable CUM of type CUMULATIVE_ARGS
657: for a call to a function whose data type is FNTYPE.
658: For a library call, FNTYPE is 0.
659: On the ARM, the offset starts at 0. */
660: #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME) \
661: ((CUM) = (((FNTYPE) && aggregate_value_p (TREE_TYPE ((FNTYPE)))) ? 4 : 0))
662:
663: /* Update the data in CUM to advance over an argument
664: of mode MODE and data type TYPE.
665: (TYPE is null for libcalls where that information may not be available.) */
666: #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
667: (CUM) += ((MODE) != BLKmode \
668: ? (GET_MODE_SIZE (MODE) + 3) & ~3 \
669: : (int_size_in_bytes (TYPE) + 3) & ~3) \
670:
671: /* 1 if N is a possible register number for function argument passing.
672: On the ARM, r0-r3 are used to pass args. */
673: #define FUNCTION_ARG_REGNO_P(REGNO) \
674: ((REGNO) >= 0 && (REGNO) <= 3)
675:
676: /* Perform any actions needed for a function that is receiving a variable
677: number of arguments. CUM is as above. MODE and TYPE are the mode and type
678: of the current parameter. PRETEND_SIZE is a variable that should be set to
679: the amount of stack that must be pushed by the prolog to pretend that our
680: caller pushed it.
681:
682: Normally, this macro will push all remaining incoming registers on the
683: stack and set PRETEND_SIZE to the length of the registers pushed.
684:
685: On the ARM, PRETEND_SIZE is set in order to have the prologue push the last
686: named arg and all anonymous args onto the stack.
687: XXX I know the prologue shouldn't be pushing registers, but it is faster
688: that way. */
689: #define SETUP_INCOMING_VARARGS(CUM, MODE, TYPE, PRETEND_SIZE, NO_RTL) \
690: { \
691: extern int current_function_anonymous_args; \
692: current_function_anonymous_args = 1; \
693: if ((CUM) < 16) \
694: (PRETEND_SIZE) = 16 - (CUM); \
695: }
696:
697: /* Generate assembly output for the start of a function. */
698: #define FUNCTION_PROLOGUE(STREAM, SIZE) \
699: output_prologue ((STREAM), (SIZE))
700:
701: /* Call the function profiler with a given profile label. The Acorn compiler
702: puts this BEFORE the prolog but gcc pust it afterwards. The ``mov ip,lr''
703: seems like a good idea to stick with cc convention. ``prof'' doesn't seem
704: to mind about this! */
705: #define FUNCTION_PROFILER(STREAM,LABELNO) \
706: { \
707: fprintf(STREAM, "\tmov\tip, lr\n"); \
708: fprintf(STREAM, "\tbl\tmcount\n"); \
709: fprintf(STREAM, "\t.word\tLP%d\n", (LABELNO)); \
710: arm_increase_location (12); \
711: }
712:
713: /* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
714: the stack pointer does not matter. The value is tested only in
715: functions that have frame pointers.
716: No definition is equivalent to always zero.
717:
718: On the ARM, the function epilogue recovers the stack pointer from the
719: frame. */
720: #define EXIT_IGNORE_STACK 1
721:
722: /* Generate the assembly code for function exit. */
723: #define FUNCTION_EPILOGUE(STREAM, SIZE) \
724: output_epilogue ((STREAM), (SIZE))
725:
726: /* Determine if the epilogue should be output as RTL.
727: You should override this if you define FUNCTION_EXTRA_EPILOGUE. */
728: #define USE_RETURN_INSN use_return_insn ()
729:
730: /* Definitions for register eliminations.
731:
732: This is an array of structures. Each structure initializes one pair
733: of eliminable registers. The "from" register number is given first,
734: followed by "to". Eliminations of the same "from" register are listed
735: in order of preference.
736:
737: We have two registers that can be eliminated on the ARM. First, the
738: arg pointer register can often be eliminated in favor of the stack
739: pointer register. Secondly, the pseudo frame pointer register can always
740: be eliminated; it is replaced with either the stack or the real frame
741: pointer. */
742:
743: #define ELIMINABLE_REGS \
744: {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
745: {ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \
746: {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
747: {FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}}
748:
749: /* Given FROM and TO register numbers, say whether this elimination is allowed.
750: Frame pointer elimination is automatically handled.
751:
752: All eliminations are permissible. Note that ARG_POINTER_REGNUM and
753: HARD_FRAME_POINTER_REGNUM are infact the same thing. If we need a frame
754: pointer, we must eliminate FRAME_POINTER_REGNUM into
755: HARD_FRAME_POINTER_REGNUM and not into STACK_POINTER_REGNUM. */
756: #define CAN_ELIMINATE(FROM, TO) \
757: (((TO) == STACK_POINTER_REGNUM && frame_pointer_needed) ? 0 : 1)
758:
759: /* Define the offset between two registers, one to be eliminated, and the other
760: its replacement, at the start of a routine. */
761: #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
762: { \
763: if ((FROM) == ARG_POINTER_REGNUM && (TO) == HARD_FRAME_POINTER_REGNUM)\
764: (OFFSET) = 0; \
765: else if ((FROM) == FRAME_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM)\
766: (OFFSET) = (get_frame_size () + 3 & ~3); \
767: else \
768: { \
769: int regno; \
770: int offset = 12; \
771: \
772: for (regno = 4; regno <= 10; regno++) \
773: if (regs_ever_live[regno]) \
774: offset += 4; \
775: for (regno = 20; regno <=23; regno++) \
776: if (regs_ever_live[regno]) \
777: offset += 12; \
778: if ((FROM) == FRAME_POINTER_REGNUM) \
779: (OFFSET) = -offset; \
780: else \
781: { \
782: if (! regs_ever_live[HARD_FRAME_POINTER_REGNUM]) \
783: offset -= 16; \
784: if (regs_ever_live[14]) \
785: offset += 4; \
786: (OFFSET) = (get_frame_size () + 3 & ~3) + offset; \
787: } \
788: } \
789: }
790:
791: #if 0
792: /* Store in the variable DEPTH the initial difference between the frame
793: pointer reg contents and the stack pointer reg contents, as of the start of
794: the function body. This depends on the layout of the fixed parts of the
795: stack frame and on how registers are saved. */
796: #define INITIAL_FRAME_POINTER_OFFSET(DEPTH) \
797: { \
798: int regno; \
799: int offset = 12; \
800: \
801: for (regno = 0; regno < FRAME_POINTER_REGNUM; regno++) \
802: if (regs_ever_live[regno]) \
803: offset += 4; \
804: for (regno = 20; regno < 24; regno++) \
805: if (regs_ever_live[regno]) \
806: offset += 12; \
807: (DEPTH) = offset + (get_frame_size () + 3 & ~3); \
808: }
809:
810: #define INITIAL_FRAME_POINTER_OFFSET(DEPTH) \
811: (DEPTH) = (get_frame_size () + 3) & ~3;
812: #endif
813: /* Output assembler code for a block containing the constant parts
814: of a trampoline, leaving space for the variable parts.
815:
816: On the ARM, (if r8 is the static chain regnum, and remembering that
817: referencing pc adds an offset of 8) the trampoline looks like:
818: ldr r8, [pc, #0]
819: ldr pc, [pc]
820: .word static chain value
821: .word function's address */
822: #define TRAMPOLINE_TEMPLATE(FILE) \
823: { \
824: fprintf ((FILE), "\tldr\tr8, [pc, #0]\n"); \
825: fprintf ((FILE), "\tldr\tpc, [pc, #0]\n"); \
826: fprintf ((FILE), "\t.word\t0\n"); \
827: fprintf ((FILE), "\t.word\t0\n"); \
828: }
829:
830: /* Length in units of the trampoline for entering a nested function. */
831: #define TRAMPOLINE_SIZE 16
832:
833: /* Alignment required for a trampoline in units. */
834: #define TRAMPOLINE_ALIGN 4
835:
836: /* Emit RTL insns to initialize the variable parts of a trampoline.
837: FNADDR is an RTX for the address of the function's pure code.
838: CXT is an RTX for the static chain value for the function. */
839: #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
840: { \
841: emit_move_insn (gen_rtx (MEM, SImode, plus_constant ((TRAMP), 8)), \
842: (CXT)); \
843: emit_move_insn (gen_rtx (MEM, SImode, plus_constant ((TRAMP), 12)), \
844: (FNADDR)); \
845: }
846:
847: /* Call the function profiler with a given profile label. The Acorn compiler
848: puts this BEFORE the prolog but gcc pust it afterwards. The ``mov ip,lr''
849: seems like a good idea to stick with cc convention. ``prof'' doesn't seem
850: to mind about this! */
851: #define FUNCTION_PROFILER(STREAM,LABELNO) \
852: { \
853: fprintf(STREAM, "\tmov\tip, lr\n"); \
854: fprintf(STREAM, "\tbl\tmcount\n"); \
855: fprintf(STREAM, "\t.word\tLP%d\n", (LABELNO)); \
856: arm_increase_location (12); \
857: }
858:
859: /* Addressing modes, and classification of registers for them. */
860:
861: #define HAVE_POST_INCREMENT 1
862: #define HAVE_PRE_INCREMENT 1
863: #define HAVE_POST_DECREMENT 1
864: #define HAVE_PRE_DECREMENT 1
865:
866: /* Macros to check register numbers against specific register classes. */
867:
868: /* These assume that REGNO is a hard or pseudo reg number.
869: They give nonzero only if REGNO is a hard reg of the suitable class
870: or a pseudo reg currently allocated to a suitable hard reg.
871: Since they use reg_renumber, they are safe only once reg_renumber
872: has been allocated, which happens in local-alloc.c.
873:
874: On the ARM, don't allow the pc to be used. */
875: #define REGNO_OK_FOR_BASE_P(REGNO) \
876: ((REGNO) < 15 || (REGNO) == FRAME_POINTER_REGNUM \
877: || (REGNO) == ARG_POINTER_REGNUM \
878: || (unsigned) reg_renumber[(REGNO)] < 15 \
879: || (unsigned) reg_renumber[(REGNO)] == FRAME_POINTER_REGNUM \
880: || (unsigned) reg_renumber[(REGNO)] == ARG_POINTER_REGNUM)
881: #define REGNO_OK_FOR_INDEX_P(REGNO) \
882: REGNO_OK_FOR_BASE_P(REGNO)
883:
884: /* Maximum number of registers that can appear in a valid memory address.
885: Shifts in addresses can't be by a register. */
886:
887: #define MAX_REGS_PER_ADDRESS 2
888:
889: /* Recognize any constant value that is a valid address. */
890: /* XXX We can address any constant, eventually... */
891: #if 0
892: #define CONSTANT_ADDRESS_P(X) \
893: ( GET_CODE(X) == LABEL_REF \
894: || GET_CODE(X) == SYMBOL_REF \
895: || GET_CODE(X) == CONST_INT \
896: || GET_CODE(X) == CONST )
897: #endif
898:
899: #define CONSTANT_ADDRESS_P(X) \
900: (GET_CODE (X) == SYMBOL_REF \
901: && (CONSTANT_POOL_ADDRESS_P (X) || SYMBOL_REF_FLAG (X)))
902:
903: /* Nonzero if the constant value X is a legitimate general operand.
904: It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE.
905:
906: On the ARM, allow any integer (invalid ones are removed later by insn
907: patterns), nice doubles and symbol_refs which refer to the function's
908: constant pool XXX. */
909: #define LEGITIMATE_CONSTANT_P(X) \
910: (GET_CODE (X) == CONST_INT \
911: || (GET_CODE (X) == CONST_DOUBLE \
912: && (const_double_rtx_ok_for_fpu (X) \
913: || neg_const_double_rtx_ok_for_fpu (X))) \
914: || CONSTANT_ADDRESS_P (X))
915:
916: /* Symbols in the text segment can be accessed without indirecting via the
917: constant pool; it may take an extra binary operation, but this is still
918: faster than indirecting via memory. */
919:
920: #define ENCODE_SECTION_INFO(decl) \
921: { \
922: if (TREE_CONSTANT (decl) \
923: && (!flag_writable_strings || TREE_CODE (decl) != STRING_CST)) \
924: { \
925: rtx rtl = (TREE_CODE_CLASS (TREE_CODE (decl)) != 'd' \
926: ? TREE_CST_RTL (decl) : DECL_RTL (decl)); \
927: SYMBOL_REF_FLAG (XEXP (rtl, 0)) = 1; \
928: } \
929: }
930:
931: /* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
932: and check its validity for a certain class.
933: We have two alternate definitions for each of them.
934: The usual definition accepts all pseudo regs; the other rejects
935: them unless they have been allocated suitable hard regs.
936: The symbol REG_OK_STRICT causes the latter definition to be used. */
937: #ifndef REG_OK_STRICT
938:
939: /* Nonzero if X is a hard reg that can be used as a base reg
940: or if it is a pseudo reg. */
941: #define REG_OK_FOR_BASE_P(X) \
942: (REGNO (X) < 16 || REGNO (X) >= FIRST_PSEUDO_REGISTER \
943: || REGNO (X) == FRAME_POINTER_REGNUM || REGNO (X) == ARG_POINTER_REGNUM)
944:
945: /* Nonzero if X is a hard reg that can be used as an index
946: or if it is a pseudo reg. */
947: #define REG_OK_FOR_INDEX_P(X) \
948: REG_OK_FOR_BASE_P(X)
949:
950: #define REG_OK_FOR_PRE_POST_P(X) \
951: (REGNO (X) < 16 || REGNO (X) >= FIRST_PSEUDO_REGISTER \
952: || REGNO (X) == FRAME_POINTER_REGNUM || REGNO (X) == ARG_POINTER_REGNUM)
953:
954: #else
955:
956: /* Nonzero if X is a hard reg that can be used as a base reg. */
957: #define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
958:
959: /* Nonzero if X is a hard reg that can be used as an index. */
960: #define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
961:
962: #define REG_OK_FOR_PRE_POST_P(X) \
963: (REGNO (X) < 16 || (unsigned) reg_renumber[REGNO (X)] < 16 \
964: || REGNO (X) == FRAME_POINTER_REGNUM || REGNO (X) == ARG_POINTER_REGNUM \
965: || (unsigned) reg_renumber[REGNO (X)] == FRAME_POINTER_REGNUM \
966: || (unsigned) reg_renumber[REGNO (X)] == ARG_POINTER_REGNUM)
967:
968: #endif
969:
970: /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
971: that is a valid memory address for an instruction.
972: The MODE argument is the machine mode for the MEM expression
973: that wants to use this address.
974:
975: The other macros defined here are used only in GO_IF_LEGITIMATE_ADDRESS. */
976: #define BASE_REGISTER_RTX_P(X) \
977: (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X))
978:
979: #define INDEX_REGISTER_RTX_P(X) \
980: (GET_CODE (X) == REG && REG_OK_FOR_INDEX_P (X))
981:
982: /* A C statement (sans semicolon) to jump to LABEL for legitimate index RTXs
983: used by the macro GO_IF_LEGITIMATE_ADDRESS. Floating point indices can
984: only be small constants. */
985: #define GO_IF_LEGITIMATE_INDEX(MODE, BASE_REGNO, INDEX, LABEL) \
986: do \
987: { \
988: int range; \
989: int code = GET_CODE (INDEX); \
990: \
991: if (GET_MODE_CLASS (MODE) == MODE_FLOAT) \
992: { \
993: if (code == CONST_INT && INTVAL (INDEX) < 1024 \
994: && INTVAL (INDEX) > -1024 \
995: && (INTVAL (INDEX) & 3) == 0) \
996: goto LABEL; \
997: } \
998: else \
999: { \
1000: if (INDEX_REGISTER_RTX_P (INDEX) && GET_MODE_SIZE (MODE) <= 4) \
1001: goto LABEL; \
1002: if (GET_MODE_SIZE (MODE) <= 4 && code == MULT) \
1003: { \
1004: rtx xiop0 = XEXP (INDEX, 0); \
1005: rtx xiop1 = XEXP (INDEX, 1); \
1006: if (INDEX_REGISTER_RTX_P (xiop0) \
1007: && power_of_two_operand (xiop1, SImode)) \
1008: goto LABEL; \
1009: if (INDEX_REGISTER_RTX_P (xiop1) \
1010: && power_of_two_operand (xiop0, SImode)) \
1011: goto LABEL; \
1012: } \
1013: if (GET_MODE_SIZE (MODE) <= 4 \
1014: && (code == LSHIFTRT || code == ASHIFTRT || code == LSHIFT \
1015: || code == ASHIFT || code == ROTATERT)) \
1016: { \
1017: rtx op = XEXP (INDEX, 1); \
1018: if (INDEX_REGISTER_RTX_P (XEXP (INDEX, 0)) \
1019: && GET_CODE (op) == CONST_INT && INTVAL (op) > 0 \
1020: && INTVAL (op) <= 31) \
1021: goto LABEL; \
1022: } \
1023: range = (MODE) == HImode ? 4095 : 4096; \
1024: if (code == CONST_INT && INTVAL (INDEX) < range \
1025: && INTVAL (INDEX) > -range) \
1026: goto LABEL; \
1027: } \
1028: } while (0)
1029:
1030: /* Jump to LABEL if X is a valid address RTX. This must also take
1031: REG_OK_STRICT into account when deciding about valid registers, but it uses
1032: the above macros so we are in luck. Allow REG, REG+REG, REG+INDEX,
1033: INDEX+REG, REG-INDEX, and non floating SYMBOL_REF to the constant pool.
1034: Allow REG-only and AUTINC-REG if handling TImode or HImode. Other symbol
1035: refs must be forced though a static cell to ensure addressability. */
1036: #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, LABEL) \
1037: { \
1038: if (BASE_REGISTER_RTX_P (X)) \
1039: goto LABEL; \
1040: else if ((GET_CODE (X) == POST_INC || GET_CODE (X) == PRE_DEC) \
1041: && GET_CODE (XEXP (X, 0)) == REG \
1042: && REG_OK_FOR_PRE_POST_P (XEXP (X, 0))) \
1043: goto LABEL; \
1044: else if ((MODE) == TImode) \
1045: ; \
1046: else if (GET_CODE (X) == PLUS) \
1047: { \
1048: rtx xop0 = XEXP(X,0); \
1049: rtx xop1 = XEXP(X,1); \
1050: \
1051: if (BASE_REGISTER_RTX_P (xop0)) \
1052: GO_IF_LEGITIMATE_INDEX (MODE, REGNO (xop0), xop1, LABEL); \
1053: else if (BASE_REGISTER_RTX_P (xop1)) \
1054: GO_IF_LEGITIMATE_INDEX (MODE, REGNO (xop1), xop0, LABEL); \
1055: } \
1056: else if (GET_CODE (X) == MINUS) \
1057: { \
1058: rtx xop0 = XEXP (X,0); \
1059: rtx xop1 = XEXP (X,1); \
1060: \
1061: if (BASE_REGISTER_RTX_P (xop0)) \
1062: GO_IF_LEGITIMATE_INDEX (MODE, -1, xop1, LABEL); \
1063: } \
1064: else if (GET_MODE_CLASS (MODE) != MODE_FLOAT \
1065: && GET_CODE (X) == SYMBOL_REF \
1066: && CONSTANT_POOL_ADDRESS_P (X)) \
1067: goto LABEL; \
1068: else if ((GET_CODE (X) == PRE_INC || GET_CODE (X) == POST_DEC) \
1069: && GET_CODE (XEXP (X, 0)) == REG \
1070: && REG_OK_FOR_PRE_POST_P (XEXP (X, 0))) \
1071: goto LABEL; \
1072: }
1073:
1074: /* Try machine-dependent ways of modifying an illegitimate address
1075: to be legitimate. If we find one, return the new, valid address.
1076: This macro is used in only one place: `memory_address' in explow.c.
1077:
1078: OLDX is the address as it was before break_out_memory_refs was called.
1079: In some cases it is useful to look at this to decide what needs to be done.
1080:
1081: MODE and WIN are passed so that this macro can use
1082: GO_IF_LEGITIMATE_ADDRESS.
1083:
1084: It is always safe for this macro to do nothing. It exists to recognize
1085: opportunities to optimize the output.
1086:
1087: On the ARM, try to convert [REG, #BIGCONST]
1088: into ADD BASE, REG, #UPPERCONST and [BASE, #VALIDCONST],
1089: where VALIDCONST == 0 in case of TImode. */
1090: #define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \
1091: { \
1092: if (GET_CODE (X) == PLUS) \
1093: { \
1094: rtx xop0 = XEXP (X, 0); \
1095: rtx xop1 = XEXP (X, 1); \
1096: \
1097: if (BASE_REGISTER_RTX_P (xop0) && GET_CODE (xop1) == CONST_INT) \
1098: { \
1099: int n = INTVAL (xop1); \
1100: int low_n = ((MODE) == TImode ? 0 \
1101: : n >= 0 ? (n & 0xFFF) : -((-n) & 0xFFF)); \
1102: rtx base_reg = gen_reg_rtx (SImode); \
1103: rtx val = force_operand (gen_rtx (PLUS, SImode, xop0, \
1104: gen_rtx (CONST_INT, \
1105: VOIDmode, n - low_n)), \
1106: 0); \
1107: emit_move_insn (base_reg, val); \
1108: (X) = (low_n == 0 ? base_reg \
1109: : gen_rtx (PLUS, SImode, base_reg, \
1110: gen_rtx (CONST_INT, VOIDmode, low_n))); \
1111: } \
1112: else if (BASE_REGISTER_RTX_P (xop1) && GET_CODE (xop0) == CONST_INT) \
1113: { \
1114: int n = INTVAL (xop0); \
1115: int low_n = ((MODE) == TImode ? 0 \
1116: : n >= 0 ? (n & 0xFFF) : -((-n) & 0xFFF)); \
1117: rtx base_reg = gen_reg_rtx (SImode); \
1118: rtx val = force_operand (gen_rtx (PLUS, SImode, xop1, \
1119: gen_rtx (CONST_INT, \
1120: VOIDmode, n - low_n)), \
1121: 0); \
1122: emit_move_insn (base_reg, val); \
1123: (X) = (low_n == 0 ? base_reg \
1124: : gen_rtx (PLUS, SImode, base_reg, \
1125: gen_rtx (CONST_INT, VOIDmode, low_n))); \
1126: } \
1127: } \
1128: if (memory_address_p (MODE, X)) \
1129: goto win; \
1130: }
1131:
1132: /* Go to LABEL if ADDR (a legitimate address expression)
1133: has an effect that depends on the machine mode it is used for. */
1134: #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
1135: { \
1136: if (GET_CODE(ADDR) == PRE_DEC || GET_CODE(ADDR) == POST_DEC \
1137: || GET_CODE(ADDR) == PRE_INC || GET_CODE(ADDR) == POST_INC) \
1138: goto LABEL; \
1139: }
1140:
1141: /* Specify the machine mode that this machine uses
1142: for the index in the tablejump instruction. */
1143: #define CASE_VECTOR_MODE SImode
1144:
1145: /* Define this if the tablejump instruction expects the table
1146: to contain offsets from the address of the table.
1147: Do not define this if the table should contain absolute addresses. */
1148: /* #define CASE_VECTOR_PC_RELATIVE */
1149:
1150: /* Specify the tree operation to be used to convert reals to integers. */
1151: #define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR
1152:
1153: /* This is the kind of divide that is easiest to do in the general case. */
1154: #define EASY_DIV_EXPR TRUNC_DIV_EXPR
1155:
1156: /* signed 'char' is most compatible, but RISC OS wants it unsigned.
1157: unsigned is probably best, but may break some code. */
1158: #ifndef DEFAULT_SIGNED_CHAR
1159: #define DEFAULT_SIGNED_CHAR 1
1160: #endif
1161:
1162: /* Don't cse the address of the function being compiled. */
1163: #define NO_RECURSIVE_FUNCTION_CSE 1
1164:
1165: /* Max number of bytes we can move from memory to memory
1166: in one reasonably fast instruction. */
1167: #define MOVE_MAX 4
1168:
1169: /* Define if operations between registers always perform the operation
1170: on the full register even if a narrower mode is specified. */
1171: #define WORD_REGISTER_OPERATIONS
1172:
1173: /* Define if loading in MODE, an integral mode narrower than BITS_PER_WORD
1174: will either zero-extend or sign-extend. The value of this macro should
1175: be the code that says which one of the two operations is implicitly
1176: done, NIL if none. */
1177: #define LOAD_EXTEND_OP(MODE) \
1178: ((MODE) == QImode ? ZERO_EXTEND : NIL)
1179:
1180: /* Define this if zero-extension is slow (more than one real instruction).
1181: On the ARM, it is more than one instruction only if not fetching from
1182: memory. */
1183: /* #define SLOW_ZERO_EXTEND */
1184:
1185: /* Nonzero if access to memory by bytes is slow and undesirable. */
1186: #define SLOW_BYTE_ACCESS 0
1187:
1188: /* Immediate shift counts are truncated by the output routines (or was it
1189: the assembler?). Shift counts in a register are truncated by ARM. Note
1190: that the native compiler puts too large (> 32) immediate shift counts
1191: into a register and shifts by the register, letting the ARM decide what
1192: to do instead of doing that itself. */
1193: /* This is all wrong. Defining SHIFT_COUNT_TRUNCATED tells combine that
1194: code like (X << (Y % 32)) for register X, Y is equivalent to (X << Y).
1195: On the arm, Y in a register is used modulo 256 for the shift. Only for
1196: rotates is modulo 32 used. */
1197: /* #define SHIFT_COUNT_TRUNCATED 1 */
1198:
1199: /* XX This is not true, is it? */
1200: /* All integers have the same format so truncation is easy. */
1201: #define TRULY_NOOP_TRUNCATION(OUTPREC,INPREC) 1
1202:
1203: /* Calling from registers is a massive pain. */
1204: #define NO_FUNCTION_CSE 1
1205:
1206: /* Chars and shorts should be passed as ints. */
1207: #define PROMOTE_PROTOTYPES 1
1208:
1209: /* The machine modes of pointers and functions */
1210: #define Pmode SImode
1211: #define FUNCTION_MODE Pmode
1212:
1213: /* The structure type of the machine dependent info field of insns
1214: No uses for this yet. */
1215: /* #define INSN_MACHINE_INFO struct machine_info */
1216:
1217: /* The relative costs of various types of constants. Note that cse.c defines
1218: REG = 1, SUBREG = 2, any node = (2 + sum of subnodes). */
1219: #define CONST_COSTS(RTX, CODE, OUTER_CODE) \
1220: case CONST_INT: \
1221: if (const_ok_for_arm (INTVAL (RTX))) \
1222: return (OUTER_CODE) == SET ? 2 : -1; \
1223: else if (OUTER_CODE == AND \
1224: && const_ok_for_arm (~INTVAL (RTX))) \
1225: return -1; \
1226: else if ((OUTER_CODE == COMPARE \
1227: || OUTER_CODE == PLUS || OUTER_CODE == MINUS) \
1228: && const_ok_for_arm (-INTVAL (RTX))) \
1229: return -1; \
1230: else \
1231: return 5; \
1232: case CONST: \
1233: case LABEL_REF: \
1234: case SYMBOL_REF: \
1235: return 6; \
1236: case CONST_DOUBLE: \
1237: if (const_double_rtx_ok_for_fpu (RTX)) \
1238: return (OUTER_CODE) == SET ? 2 : -1; \
1239: else if (((OUTER_CODE) == COMPARE || (OUTER_CODE) == PLUS) \
1240: && neg_const_double_rtx_ok_for_fpu (RTX)) \
1241: return -1; \
1242: return(7);
1243:
1244: #define RTX_COSTS(X,CODE,OUTER_CODE) \
1245: case MEM: \
1246: { \
1247: int num_words = (GET_MODE_SIZE (GET_MODE (X)) > UNITS_PER_WORD) ? 2 : 1;\
1248: return (COSTS_N_INSNS (10*num_words)); \
1249: } \
1250: case MULT: \
1251: if (GET_CODE (XEXP (X, 1)) == CONST_INT \
1252: && exact_log2 (INTVAL (XEXP (X, 1))) >= 0) \
1253: return rtx_cost (XEXP (X, 0), GET_CODE (X))+1; \
1254: return COSTS_N_INSNS (9); \
1255: case LSHIFT: \
1256: case ASHIFT: \
1257: case LSHIFTRT: \
1258: case ASHIFTRT: \
1259: if (GET_CODE (XEXP (X, 1)) == CONST_INT) \
1260: return rtx_cost (XEXP (X, 0), GET_CODE (X))+1; \
1261: break; \
1262: case MINUS: \
1263: { \
1264: enum rtx_code code = GET_CODE (XEXP (X, 1)); \
1265: if (code == MULT) \
1266: { \
1267: if (GET_CODE (XEXP (XEXP (X, 1), 1)) == CONST_INT \
1268: && exact_log2 (INTVAL (XEXP (XEXP (X, 0), 1))) >= 0) \
1269: return COSTS_N_INSNS (1); \
1270: break; \
1271: } \
1272: else if (code == ASHIFT || code == LSHIFT || code == ASHIFTRT \
1273: || code == LSHIFTRT) \
1274: return COSTS_N_INSNS (1); \
1275: } /* fall through */ \
1276: case PLUS: \
1277: case IOR: \
1278: case XOR: \
1279: case AND: \
1280: { \
1281: enum rtx_code code = GET_CODE (XEXP (X, 0)); \
1282: if (code == MULT) \
1283: { \
1284: if (GET_CODE (XEXP (XEXP (X, 0), 1)) == CONST_INT \
1285: && exact_log2 (INTVAL (XEXP (XEXP (X, 0), 1))) >= 0) \
1286: return COSTS_N_INSNS (1); \
1287: if (GET_CODE (X) == PLUS) \
1288: return COSTS_N_INSNS (12); \
1289: break; \
1290: } \
1291: else if (code == ASHIFT || code == LSHIFT || code == ASHIFTRT \
1292: || code == LSHIFTRT) \
1293: return COSTS_N_INSNS (1); \
1294: break; \
1295: } \
1296: case NOT: \
1297: return rtx_cost (XEXP (X, 0), GET_CODE (XEXP (X, 0))); \
1298: case IF_THEN_ELSE: \
1299: { \
1300: if (GET_CODE (XEXP(X,1)) == PC || GET_CODE (XEXP(X,2)) == PC) \
1301: return COSTS_N_INSNS (4); \
1302: return COSTS_N_INSNS (1); \
1303: } \
1304: case SIGN_EXTEND: \
1305: return COSTS_N_INSNS (2); \
1306: case ZERO_EXTEND: \
1307: if (GET_MODE (XEXP (X, 0)) == QImode) \
1308: { \
1309: if (GET_CODE (XEXP (X, 0)) == MEM) \
1310: return COSTS_N_INSNS (10); \
1311: return COSTS_N_INSNS (1); \
1312: } \
1313: break; \
1314: case COMPARE: \
1315: if (GET_CODE (XEXP (X, 1)) == REG) \
1316: return 4; \
1317: case SMIN: \
1318: case SMAX: \
1319: case UMIN: \
1320: case UMAX: \
1321: return COSTS_N_INSNS (3); \
1322: case ABS: \
1323: if (GET_MODE (X) == SImode) \
1324: return COSTS_N_INSNS (2); \
1325: return COSTS_N_INSNS (1);
1326:
1327: /* Moves to and from memory are quite expensive */
1328: #define MEMORY_MOVE_COST(MODE) 10
1329:
1330: /* All address computations that can be done are free */
1331: #define ADDRESS_COST(x) 2
1332:
1333: /* Try to generate sequences that don't involve branches, we can then use
1334: conditional instructions */
1335: #define BRANCH_COST 4
1336:
1337: /* Condition code information. */
1338: /* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
1339: return the mode to be used for the comparison.
1340: CCFPEmode should be used with floating inequalites,
1341: CCFPmode should be used with floating equalities.
1342: CC_NOOVmode should be used with SImode integer equalites
1343: CCmode should be used otherwise. */
1344:
1345: #define EXTRA_CC_MODES CC_NOOVmode, CCFPmode, CCFPEmode
1346:
1347: #define EXTRA_CC_NAMES "CC_NOOV", "CCFP", "CCFPE"
1348:
1349: #define SELECT_CC_MODE(OP,X,Y) \
1350: (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \
1351: ? ((OP == EQ || OP == NE) ? CCFPmode : CCFPEmode) \
1352: : ((GET_MODE (X) == SImode) \
1353: && ((OP) == EQ || (OP) == NE) \
1354: && (GET_CODE (X) == PLUS || GET_CODE (X) == MINUS \
1355: || GET_CODE (X) == AND || GET_CODE (X) == IOR \
1356: || GET_CODE (X) == XOR || GET_CODE (X) == MULT \
1357: || GET_CODE (X) == NOT || GET_CODE (X) == NEG \
1358: || GET_CODE (X) == LSHIFT || GET_CODE (X) == LSHIFTRT \
1359: || GET_CODE (X) == ASHIFT || GET_CODE (X) == ASHIFTRT \
1360: || GET_CODE (X) == ROTATERT || GET_CODE (X) == ZERO_EXTRACT) \
1361: ? CC_NOOVmode \
1362: : GET_MODE (X) == QImode ? CC_NOOVmode : CCmode))
1363:
1364: #define STORE_FLAG_VALUE 1
1365:
1366: /* Define the information needed to generate branch insns. This is
1367: stored from the compare operation. Note that we can't use "rtx" here
1368: since it hasn't been defined! */
1369:
1370: extern struct rtx_def *arm_compare_op0, *arm_compare_op1;
1371: extern int arm_compare_fp;
1372:
1373: /* Define the codes that are matched by predicates in arm.c */
1374: #define PREDICATE_CODES \
1375: {"s_register_operand", {SUBREG, REG}}, \
1376: {"arm_add_operand", {SUBREG, REG, CONST_INT}}, \
1377: {"fpu_add_operand", {SUBREG, REG, CONST_DOUBLE}}, \
1378: {"arm_rhs_operand", {SUBREG, REG, CONST_INT}}, \
1379: {"fpu_rhs_operand", {SUBREG, REG, CONST_DOUBLE}}, \
1380: {"arm_not_operand", {SUBREG, REG, CONST_INT}}, \
1381: {"shiftable_operator", {PLUS, MINUS, AND, IOR, XOR}}, \
1382: {"minmax_operator", {SMIN, SMAX, UMIN, UMAX}}, \
1383: {"shift_operator", {ASHIFT, LSHIFT, ASHIFTRT, LSHIFTRT, MULT}}, \
1384: {"di_operand", {SUBREG, REG, CONST_INT, CONST_DOUBLE, MEM}}, \
1385: {"load_multiple_operation", {PARALLEL}}, \
1386: {"store_multiple_operation", {PARALLEL}}, \
1387: {"equality_operator", {EQ, NE}}, \
1388: {"arm_rhsm_operand", {SUBREG, REG, CONST_INT, MEM}}, \
1389: {"const_shift_operand", {CONST_INT}}, \
1390: {"index_operand", {SUBREG, REG, CONST_INT}}, \
1391: {"cc_register", {REG}},
1392:
1393:
1394: /* Assembler output control */
1395:
1396: #ifndef ARM_OS_NAME
1397: #define ARM_OS_NAME "(generic)"
1398: #endif
1399:
1400: /* The text to go at the start of the assembler file */
1401: #define ASM_FILE_START(STREAM) \
1402: { \
1403: extern char *version_string; \
1404: \
1405: fprintf (STREAM,"@ Generated by gcc %s for ARM/%s\n", version_string, \
1406: ARM_OS_NAME); \
1407: fprintf (STREAM,"rfp\t.req\tr9\n"); \
1408: fprintf (STREAM,"fp\t.req\tr11\n"); \
1409: fprintf (STREAM,"ip\t.req\tr12\n"); \
1410: fprintf (STREAM,"sp\t.req\tr13\n"); \
1411: fprintf (STREAM,"lr\t.req\tr14\n"); \
1412: fprintf (STREAM,"pc\t.req\tr15\n"); \
1413: }
1414:
1415: #define ASM_APP_ON ""
1416: #define ASM_APP_OFF ""
1417:
1418: /* Switch to the text or data segment. */
1419: #define TEXT_SECTION_ASM_OP ".text"
1420: #define DATA_SECTION_ASM_OP ".data"
1421:
1422: /* The assembler's names for the registers. RFP need not always be used as
1423: the Real framepointer; it can also be used as a normal general register.
1424: Note that the name `fp' is horribly misleading since `fp' is in fact only
1425: the argument-and-return-context pointer. */
1426: #define REGISTER_NAMES \
1427: { \
1428: "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
1429: "r8","rfp", "sl", "fp", "ip", "sp", "lr", "pc", \
1430: "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
1431: "cc", "sfp", "afp" \
1432: }
1433:
1434: /* Arm Assembler barfs on dollars */
1435: #define DOLLARS_IN_IDENTIFIERS 0
1436:
1437: #define NO_DOLLAR_IN_LABEL
1438:
1439: /* DBX register number for a given compiler register number */
1440: #define DBX_REGISTER_NUMBER(REGNO) (REGNO)
1441:
1442: /* Generate DBX debugging information. riscix.h will undefine this because
1443: the native assembler does not support stabs. */
1444: #define DBX_DEBUGGING_INFO 1
1445:
1446: /* Acorn dbx moans about continuation chars, so don't use any. */
1447: #define DBX_CONTIN_LENGTH 0
1448:
1449: /* Output a source filename for the debugger. RISCiX dbx insists that the
1450: ``desc'' field is set to compiler version number >= 315 (sic). */
1451: #define DBX_OUTPUT_MAIN_SOURCE_FILENAME(STREAM,NAME) \
1452: do { \
1453: fprintf (STREAM, ".stabs \"%s\",%d,0,315,%s\n", (NAME), N_SO, \
1454: <ext_label_name[1]); \
1455: text_section (); \
1456: ASM_OUTPUT_INTERNAL_LABEL (STREAM, "Ltext", 0); \
1457: } while (0)
1458:
1459: /* Output a label definition. */
1460: #define ASM_OUTPUT_LABEL(STREAM,NAME) \
1461: arm_asm_output_label ((STREAM), (NAME))
1462:
1463: /* Output a function label definition. */
1464: #define ASM_DECLARE_FUNCTION_NAME(STREAM,NAME,DECL) \
1465: ASM_OUTPUT_LABEL(STREAM, NAME)
1466:
1467: /* Output a globalising directive for a label. */
1468: #define ASM_GLOBALIZE_LABEL(STREAM,NAME) \
1469: (fprintf (STREAM, "\t.global\t"), \
1470: assemble_name (STREAM, NAME), \
1471: fputc ('\n',STREAM)) \
1472:
1473: /* Output a reference to a label. */
1474: #define ASM_OUTPUT_LABELREF(STREAM,NAME) \
1475: fprintf (STREAM, "_%s", NAME)
1476:
1477: /* Make an internal label into a string. */
1478: #define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM) \
1479: sprintf (STRING, "*%s%d", PREFIX, NUM)
1480:
1481: /* Output an internal label definition. */
1482: #define ASM_OUTPUT_INTERNAL_LABEL(STREAM, PREFIX, NUM) \
1483: do \
1484: { \
1485: char *s = (char *) alloca (11 + strlen (PREFIX)); \
1486: extern int arm_target_label, arm_ccfsm_state; \
1487: extern rtx arm_target_insn; \
1488: \
1489: if (arm_ccfsm_state == 3 && arm_target_label == (NUM) \
1490: && !strcmp (PREFIX, "L")) \
1491: { \
1492: arm_ccfsm_state = 0; \
1493: arm_target_insn = NULL; \
1494: } \
1495: strcpy (s, "*"); \
1496: sprintf (&s[strlen (s)], "%s%d", (PREFIX), (NUM)); \
1497: arm_asm_output_label (STREAM, s); \
1498: } while (0)
1499:
1500: /* Nothing special is done about jump tables */
1501: /* #define ASM_OUTPUT_CASE_LABEL(STREAM,PREFIX,NUM,TABLE) */
1502: /* #define ASM_OUTPUT_CASE_END(STREAM,NUM,TABLE) */
1503:
1504: /* Construct a private name. */
1505: #define ASM_FORMAT_PRIVATE_NAME(OUTVAR,NAME,NUMBER) \
1506: ((OUTVAR) = (char *) alloca (strlen (NAME) + 10), \
1507: sprintf ((OUTVAR), "%s.%d", (NAME), (NUMBER)))
1508:
1509: /* Output a push or a pop instruction (only used when profiling). */
1510: #define ASM_OUTPUT_REG_PUSH(STREAM,REGNO) \
1511: (arm_increase_location (4) \
1512: , fprintf(STREAM,"\tstmfd\tsp!,{%s}\n", reg_names[REGNO]))
1513:
1514: #define ASM_OUTPUT_REG_POP(STREAM,REGNO) \
1515: (arm_increase_location (4) \
1516: , fprintf(STREAM,"\tldmfd\tsp!,{%s}\n", reg_names[REGNO]))
1517:
1518: /* Output a relative address. Not needed since jump tables are absolute
1519: but we must define it anyway. */
1520: #define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM,VALUE,REL) \
1521: fputs ("- - - ASM_OUTPUT_ADDR_DIFF_ELT called!\n", STREAM)
1522:
1523: /* Output an element of a dispatch table. */
1524: #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM,VALUE) \
1525: (arm_increase_location (4) \
1526: , fprintf (STREAM, "\t.word\tL%d\n", VALUE))
1527:
1528: /* Output various types of constants. For real numbers we output hex, with
1529: a comment containing the "human" value, this allows us to pass NaN's which
1530: the riscix assembler doesn't understand (it also makes cross-assembling
1531: less likely to fail). */
1532:
1533: #define ASM_OUTPUT_LONG_DOUBLE(STREAM,VALUE) \
1534: do { char dstr[30]; \
1535: long l[3]; \
1536: arm_increase_location (12); \
1537: REAL_VALUE_TO_TARGET_LONG_DOUBLE (VALUE, l); \
1538: REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr); \
1539: if (sizeof (int) == sizeof (long)) \
1540: fprintf (STREAM, "\t.long 0x%x,0x%x,0x%x\t@ long double %s\n", \
1541: l[2], l[1], l[0], dstr); \
1542: else \
1543: fprintf (STREAM, "\t.long 0x%lx,0x%lx,0x%lx\t@ long double %s\n",\
1544: l[0], l[1], l[2], dstr); \
1545: } while (0)
1546:
1547:
1548: #define ASM_OUTPUT_DOUBLE(STREAM, VALUE) \
1549: do { char dstr[30]; \
1550: long l[2]; \
1551: arm_increase_location (8); \
1552: REAL_VALUE_TO_TARGET_DOUBLE (VALUE, l); \
1553: REAL_VALUE_TO_DECIMAL (VALUE, "%.14g", dstr); \
1554: if (sizeof (int) == sizeof (long)) \
1555: fprintf (STREAM, "\t.long 0x%x, 0x%x\t@ double %s\n", l[0], l[1],\
1556: dstr); \
1557: else \
1558: fprintf (STREAM, "\t.long 0x%lx, 0x%lx\t@ double %s\n", l[0], \
1559: l[1], dstr); \
1560: } while (0)
1561:
1562: #define ASM_OUTPUT_FLOAT(STREAM, VALUE) \
1563: do { char dstr[30]; \
1564: long l; \
1565: arm_increase_location (4); \
1566: REAL_VALUE_TO_TARGET_SINGLE (VALUE, l); \
1567: REAL_VALUE_TO_DECIMAL (VALUE, "%.7g", dstr); \
1568: if (sizeof (int) == sizeof (long)) \
1569: fprintf (STREAM, "\t.word 0x%x\t@ float %s\n", l, dstr); \
1570: else \
1571: fprintf (STREAM, "\t.word 0x%lx\t@ float %s\n", l, dstr); \
1572: } while (0);
1573:
1574: #define ASM_OUTPUT_INT(STREAM, EXP) \
1575: (fprintf (STREAM, "\t.word\t"), \
1576: output_addr_const (STREAM, (EXP)), \
1577: arm_increase_location (4), \
1578: fputc ('\n', STREAM))
1579:
1580: #define ASM_OUTPUT_SHORT(STREAM, EXP) \
1581: (fprintf (STREAM, "\t.short\t"), \
1582: output_addr_const (STREAM, (EXP)), \
1583: arm_increase_location (2), \
1584: fputc ('\n', STREAM))
1585:
1586: #define ASM_OUTPUT_CHAR(STREAM, EXP) \
1587: (fprintf (STREAM, "\t.byte\t"), \
1588: output_addr_const (STREAM, (EXP)), \
1589: arm_increase_location (1), \
1590: fputc ('\n', STREAM))
1591:
1592: #define ASM_OUTPUT_BYTE(STREAM, VALUE) \
1593: (fprintf (STREAM, "\t.byte\t%d\n", VALUE), \
1594: arm_increase_location (1))
1595:
1596: #define ASM_OUTPUT_ASCII(STREAM, PTR, LEN) \
1597: output_ascii_pseudo_op ((STREAM), (unsigned char *)(PTR), (LEN))
1598:
1599: /* Output a gap. In fact we fill it with nulls. */
1600: #define ASM_OUTPUT_SKIP(STREAM, NBYTES) \
1601: (arm_increase_location (NBYTES), \
1602: fprintf (STREAM, "\t.space\t%d\n", NBYTES))
1603:
1604: /* Align output to a power of two. Horrible /bin/as. */
1605: #define ASM_OUTPUT_ALIGN(STREAM, POWER) \
1606: do \
1607: { \
1608: register int amount = 1 << (POWER); \
1609: extern int arm_text_location; \
1610: \
1611: if (amount == 2) \
1612: fprintf (STREAM, "\t.even\n"); \
1613: else \
1614: fprintf (STREAM, "\t.align\t%d\n", amount - 4); \
1615: \
1616: if (in_text_section ()) \
1617: arm_text_location = ((arm_text_location + amount - 1) \
1618: & ~(amount - 1)); \
1619: } while (0)
1620:
1621: /* Output a common block */
1622: #define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED) \
1623: (fprintf (STREAM, "\t.comm\t"), \
1624: assemble_name ((STREAM), (NAME)), \
1625: fprintf(STREAM, ", %d\t@%d\n", ROUNDED, SIZE))
1626:
1627: /* Output a local common block. /bin/as can't do this, so hack a `.space' into
1628: the bss segment. Note that this is *bad* practice. */
1629: #define ASM_OUTPUT_LOCAL(STREAM,NAME,SIZE,ROUNDED) \
1630: output_lcomm_directive (STREAM, NAME, SIZE, ROUNDED)
1631:
1632: /* Output a source filename for the debugger. RISCiX dbx insists that the
1633: ``desc'' field is set to compiler version number >= 315 (sic). */
1634: #if 0
1635: #define ASM_OUTPUT_SOURCE_FILENAME(STREAM,NAME) \
1636: fprintf (STREAM, "\t.stabs\t\"%s\", %d, 0, 315, Ltext\n", (NAME), N_SOL)
1637: #endif
1638:
1639: /* Output a source line for the debugger. */
1640: /* #define ASM_OUTPUT_SOURCE_LINE(STREAM,LINE) */
1641:
1642: /* Output a #ident directive. */
1643: #define ASM_OUTPUT_IDENT(STREAM,STRING) \
1644: fprintf (STREAM,"- - - ident %s\n",STRING)
1645:
1646: /* The assembler's parentheses characters. */
1647: #define ASM_OPEN_PAREN "("
1648: #define ASM_CLOSE_PAREN ")"
1649:
1650: /* Target characters. */
1651: #define TARGET_BELL 007
1652: #define TARGET_BS 010
1653: #define TARGET_TAB 011
1654: #define TARGET_NEWLINE 012
1655: #define TARGET_VT 013
1656: #define TARGET_FF 014
1657: #define TARGET_CR 015
1658:
1659: /* FINAL_PRESCAN_INSN is used to take a look at the insns, in order to delete
1660: small-distance conditional branches and have ASM_OUTPUT_OPCODE make the
1661: instructions conditional. Suffixes like s (affect flags) and b (bytewise
1662: load/store) need to stay suffixes, so the possible condition code comes
1663: before these suffixes. %d<n> or %D<n> may appear in the opcode if
1664: it can take a condition; a null rtx will cause no condition to be added,
1665: this is what we expect to happen if arm_ccfsm_state is non-zero. */
1666: #define ASM_OUTPUT_OPCODE(STREAM, PTR) \
1667: { \
1668: extern int arm_ccfsm_state, arm_current_cc; \
1669: extern char *arm_condition_codes[]; \
1670: int i; \
1671: \
1672: fflush (STREAM); /* XXX for debugging only. */ \
1673: if (arm_ccfsm_state == 3 || arm_ccfsm_state == 4) \
1674: { \
1675: for (i = 0; *(PTR) != ' ' && *(PTR) != '\t' && *(PTR) != '%' && i < 3;\
1676: i++, (PTR)++) \
1677: putc (*(PTR), STREAM); \
1678: fprintf (STREAM, "%s", arm_condition_codes[arm_current_cc]); \
1679: for (; *(PTR) != ' ' && *(PTR) != '\t' && *(PTR) != '%'; (PTR)++) \
1680: putc (*(PTR), STREAM); \
1681: } \
1682: }
1683:
1684: /* Only perform branch elimination (by making instructions conditional) if
1685: we're optimising. Otherwise it's of no use anyway. */
1686: #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \
1687: if (optimize) \
1688: final_prescan_insn (INSN, OPVEC, NOPERANDS)
1689:
1690: /* Output an operand of an instruction. If X is a REG and CODE is `M', output
1691: a ldm/stm style multi-reg. */
1692: #define PRINT_OPERAND(STREAM, X, CODE) \
1693: { \
1694: if ((CODE) == 'd') \
1695: { \
1696: if (X) \
1697: fputs (arm_condition_codes[get_arm_condition_code (X)], \
1698: (STREAM)); \
1699: } \
1700: else if ((CODE) == 'D') \
1701: { \
1702: if (X) \
1703: fputs (arm_condition_codes[get_arm_condition_code (X) ^ 1], \
1704: (STREAM)); \
1705: } \
1706: else if ((CODE) == 'R') \
1707: fputs (reg_names[REGNO (X) + 1], (STREAM)); \
1708: else if (GET_CODE (X) == REG) \
1709: { \
1710: if ((CODE) != 'M') \
1711: fputs (reg_names[REGNO (X)], (STREAM)); \
1712: else \
1713: fprintf ((STREAM), "{%s-%s}", \
1714: reg_names[REGNO (X)], \
1715: reg_names[REGNO (X) - 1 \
1716: + ((GET_MODE_SIZE (GET_MODE (X)) \
1717: + GET_MODE_SIZE (SImode) - 1) \
1718: / GET_MODE_SIZE (SImode))]); \
1719: } \
1720: else if (GET_CODE (X) == MEM) \
1721: { \
1722: extern int output_memory_reference_mode; \
1723: output_memory_reference_mode = GET_MODE (X); \
1724: output_address (XEXP (X, 0)); \
1725: } \
1726: else if (GET_CODE(X) == CONST_DOUBLE) \
1727: fprintf(STREAM,"#%s", fp_immediate_constant(X)); \
1728: else if (GET_CODE (X) == NEG) \
1729: { \
1730: fputc ('-', (STREAM)); \
1731: output_operand ((X), 0); \
1732: } \
1733: else \
1734: { \
1735: fputc('#', STREAM); \
1736: output_addr_const(STREAM, X); \
1737: } \
1738: }
1739:
1740: /* Output the address of an operand. */
1741: #define PRINT_OPERAND_ADDRESS(STREAM,X) \
1742: { \
1743: int is_minus = GET_CODE (X) == MINUS; \
1744: \
1745: if (GET_CODE (X) == REG) \
1746: fprintf (STREAM, "[%s, #0]", reg_names[REGNO (X)]); \
1747: else if (GET_CODE (X) == PLUS || is_minus) \
1748: { \
1749: rtx base = XEXP (X, 0); \
1750: rtx index = XEXP (X, 1); \
1751: char *base_reg_name; \
1752: int offset = 0; \
1753: int shift; \
1754: if (GET_CODE (base) != REG) \
1755: { \
1756: /* Ensure that BASE is a register (one of them must be). */ \
1757: rtx temp = base; \
1758: base = index; \
1759: index = temp; \
1760: } \
1761: base_reg_name = reg_names[REGNO (base)]; \
1762: switch (GET_CODE (index)) \
1763: { \
1764: case CONST_INT: \
1765: offset = INTVAL (index); \
1766: if (is_minus) \
1767: offset = -offset; \
1768: fprintf (STREAM, "[%s, #%d]", base_reg_name, offset); \
1769: break; \
1770: \
1771: case REG: \
1772: fprintf (STREAM, "[%s, %s%s]", base_reg_name, \
1773: is_minus ? "-" : "", reg_names[REGNO (index)] ); \
1774: break; \
1775: \
1776: case MULT: \
1777: if (GET_CODE (XEXP (index,0)) == CONST_INT) \
1778: { \
1779: shift = int_log2 (INTVAL (XEXP (index, 0))); \
1780: index = XEXP (index, 1); \
1781: } \
1782: else if (GET_CODE(XEXP(index,1)) == CONST_INT) \
1783: { \
1784: shift = int_log2 (INTVAL (XEXP (index, 1))); \
1785: index = XEXP (index, 0); \
1786: } \
1787: else \
1788: abort(); \
1789: fprintf (STREAM, "[%s, %s%s, asl #%d]", base_reg_name, \
1790: is_minus ? "-" : "", reg_names[REGNO (index)], \
1791: shift); \
1792: break; \
1793: case ASHIFTRT: \
1794: case LSHIFTRT: \
1795: case ASHIFT: \
1796: case LSHIFT: \
1797: case ROTATERT: \
1798: { \
1799: char *shift_type = shift_instr (GET_CODE (index), \
1800: &XEXP (index, 1)); \
1801: shift = INTVAL (XEXP (index, 1)); \
1802: index = XEXP (index, 0); \
1803: fprintf (STREAM, "[%s, %s%s, %s #%d]", base_reg_name, \
1804: is_minus ? "-" : "", reg_names[REGNO (index)], \
1805: shift_type, shift); \
1806: break; \
1807: } \
1808: \
1809: default: \
1810: abort(); \
1811: } \
1812: } \
1813: else if (GET_CODE (X) == PRE_INC || GET_CODE (X) == POST_INC \
1814: || GET_CODE (X) == PRE_DEC || GET_CODE (X) == POST_DEC) \
1815: { \
1816: extern int output_memory_reference_mode; \
1817: \
1818: if (GET_CODE (XEXP (X, 0)) != REG) \
1819: abort (); \
1820: \
1821: if (GET_CODE (X) == PRE_DEC || GET_CODE (X) == PRE_INC) \
1822: fprintf (STREAM, "[%s, #%s%d]!", reg_names[REGNO (XEXP (X, 0))],\
1823: GET_CODE (X) == PRE_DEC ? "-" : "", \
1824: GET_MODE_SIZE (output_memory_reference_mode)); \
1825: else \
1826: fprintf (STREAM, "[%s], #%s%d", reg_names[REGNO (XEXP (X, 0))], \
1827: GET_CODE (X) == POST_DEC ? "-" : "", \
1828: GET_MODE_SIZE (output_memory_reference_mode)); \
1829: } \
1830: else output_addr_const(STREAM, X); \
1831: }
1832:
1833: /* EOF arm.h */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.