Annotation of gcc/config/arm/arm.h, revision 1.1

1.1     ! root        1: /* Definitions of target machine for GNU compiler, for Acorn RISC Machine.
        !             2:    Copyright (C) 1991 Free Software Foundation, Inc.
        !             3:    Contributed by Pieter `Tiggr' Schoenmakers ([email protected])
        !             4:               and Martin Simmons (@harleqn.co.uk).
        !             5: 
        !             6: This file is part of GNU CC.
        !             7: 
        !             8: GNU CC is free software; you can redistribute it and/or modify
        !             9: it under the terms of the GNU General Public License as published by
        !            10: the Free Software Foundation; either version 2, or (at your option)
        !            11: any later version.
        !            12: 
        !            13: GNU CC is distributed in the hope that it will be useful,
        !            14: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            16: GNU General Public License for more details.
        !            17: 
        !            18: You should have received a copy of the GNU General Public License
        !            19: along with GNU CC; see the file COPYING.  If not, write to
        !            20: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            21: 
        !            22: /* Sometimes the directive `riscos' is checked.  This does not imply that this
        !            23:    tm file can be used unchanged to build a GCC for RISC OS.
        !            24:    (Since in fact, it can't.)  */
        !            25: 
        !            26: extern void output_prologue ();
        !            27: extern void output_epilogue ();
        !            28: extern char *arm_output_asm_insn ();
        !            29: extern char *arm_output_llc ();
        !            30: extern char *output_add_immediate ();
        !            31: extern char *output_call ();
        !            32: extern char *output_move_double ();
        !            33: extern char *output_mov_double_fpu_from_arm ();
        !            34: extern char *output_mov_double_arm_from_fpu ();
        !            35: extern char *output_mov_immediate ();
        !            36: extern char *output_multi_immediate ();
        !            37: extern char *output_shifted_move ();
        !            38: extern char *output_arithmetic_with_immediate_multiply ();
        !            39: 
        !            40: /* Translation to find startup files.  On RISCiX boxes, gcrt0.o is in
        !            41:    /usr/lib.  */
        !            42: #define STARTFILE_SPEC  \
        !            43:   "%{pg:/usr/lib/gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}"
        !            44: 
        !            45: #ifdef riscos
        !            46: #define CPP_PREDEFINES  "-Darm -Driscos"
        !            47: #else
        !            48: #define CPP_PREDEFINES  "-Darm -Driscix -Dunix"
        !            49: #endif
        !            50: 
        !            51: /* Run-time Target Specification.  */
        !            52: #define TARGET_VERSION  \
        !            53:   fputs (" (ARM/RISCiX)", stderr);
        !            54: 
        !            55: /* Run-time compilation parameters selecting different hardware subsets.
        !            56:    On the ARM, misuse it in a different way.  */
        !            57: extern int target_flags;
        !            58: 
        !            59: /* Nonzero if the function prologue (and epilogue) should obey
        !            60:    the ARM Procedure Call Standard.  */
        !            61: #define TARGET_APCS    (target_flags & 1)
        !            62: 
        !            63: /* Nonzero if the function prologue should output the function name to enable
        !            64:    the post mortem debugger to print a backtrace (very useful on RISCOS,
        !            65:    unused on RISCiX).  Specifying this flag also enables -mapcs.
        !            66:    XXX Must still be implemented in the prologue.  */
        !            67: #define TARGET_POKE_FUNCTION_NAME      (target_flags & 2)
        !            68: 
        !            69: /* Nonzero if floating point instructions are emulated by the FPE, in which
        !            70:    case instruction scheduling becomes very uninteresting.  */
        !            71: #define TARGET_FPE     (target_flags & 4)
        !            72: 
        !            73: #define TARGET_SWITCHES  \
        !            74: {                                              \
        !            75:   {"apcs",              1},                    \
        !            76:   {"poke-function-name", 2},                   \
        !            77:   {"fpe",               4},                    \
        !            78:   {"",                  TARGET_DEFAULT }       \
        !            79: }
        !            80: 
        !            81: #define TARGET_DEFAULT  0
        !            82: 
        !            83: #define TARGET_MEM_FUNCTIONS 1
        !            84: 
        !            85: /* OVERRIDE_OPTIONS takes care of the following:
        !            86:    - if -mpoke-function-name, then -mapcs.
        !            87:    - if doing debugging, then -mapcs; if RISCOS, then -mpoke-function-name.
        !            88:    - if floating point is done by emulation, forget about instruction
        !            89:      scheduling.  Note that this only saves compilation time; it doesn't
        !            90:      matter for the final code.  */
        !            91: #ifdef riscos
        !            92: #define TARGET_WHEN_DEBUGGING  3
        !            93: #else
        !            94: #define TARGET_WHEN_DEBUGGING  1
        !            95: #endif
        !            96: 
        !            97: #define OVERRIDE_OPTIONS  \
        !            98: {                                                              \
        !            99:   if (write_symbols != NO_DEBUG)                               \
        !           100:     target_flags |= TARGET_WHEN_DEBUGGING;                     \
        !           101:   else if (TARGET_POKE_FUNCTION_NAME)                          \
        !           102:     target_flags |= 1;                                         \
        !           103:   if (TARGET_FPE)                                              \
        !           104:     flag_schedule_insns = flag_schedule_insns_after_reload = 0;        \
        !           105: }
        !           106: 
        !           107: /* Omitting the frame pointer is a very good idea on the ARM, especially if
        !           108:    not TARGET_APCS, in which case all that pushing on function entry isn't
        !           109:    mandatory anymore.  */
        !           110: #define OPTIMIZATION_OPTIONS(OPTIMIZE)  \
        !           111: {                                      \
        !           112:   if (OPTIMIZE)                                \
        !           113:     flag_omit_frame_pointer = 1;       \
        !           114: }
        !           115: 
        !           116: /* Target machine storage Layout.  */
        !           117: 
        !           118: /* Define this if most significant bit is lowest numbered
        !           119:    in instructions that operate on numbered bit-fields.  */
        !           120: #define BITS_BIG_ENDIAN  0
        !           121: 
        !           122: /* Define this if most significant byte of a word is the lowest numbered.  */
        !           123: #define BYTES_BIG_ENDIAN  0
        !           124: 
        !           125: /* Define this if most significant word of a multiword number is the lowest
        !           126:    numbered.  */
        !           127: #define WORDS_BIG_ENDIAN  0
        !           128: 
        !           129: /* Number of bits in an addressable storage unit */
        !           130: #define BITS_PER_UNIT  8
        !           131: 
        !           132: #define BITS_PER_WORD  32
        !           133: 
        !           134: #define UNITS_PER_WORD 4
        !           135: 
        !           136: #define POINTER_SIZE  32
        !           137: 
        !           138: #define PARM_BOUNDARY          32
        !           139: 
        !           140: #define STACK_BOUNDARY  32
        !           141: 
        !           142: #define FUNCTION_BOUNDARY  32
        !           143: 
        !           144: #define EMPTY_FIELD_BOUNDARY  32
        !           145: 
        !           146: #define BIGGEST_ALIGNMENT  32
        !           147: 
        !           148: /* Every structures size must be a multiple of 32 bits.  */
        !           149: #define STRUCTURE_SIZE_BOUNDARY 32
        !           150: 
        !           151: #define STRICT_ALIGNMENT 1
        !           152: 
        !           153: /* Define number of bits in most basic integer type.
        !           154:    (If undefined, default is BITS_PER_WORD).  */
        !           155: /* #define INT_TYPE_SIZE */
        !           156: 
        !           157: /* Standard register usage.  */
        !           158: 
        !           159: /* Register allocation in ARM Procedure Call Standard (as used on RISCiX):
        !           160:    (S - saved over call).
        !           161: 
        !           162:        r0         *    argument word/integer result
        !           163:        r1-r3           argument word
        !           164: 
        !           165:        r4-r8        S  register variable
        !           166:        r9           S  (rfp) register variable (real frame pointer)
        !           167: 
        !           168:        r10        F S  (sl) stack limit (not currently used)
        !           169:        r11        F S  (fp) argument pointer
        !           170:        r12             (ip) temp workspace
        !           171:        r13        F S  (sp) lower end of current stack frame
        !           172:        r14             (lr) link address/workspace
        !           173:        r15        F    (pc) program counter
        !           174: 
        !           175:        f0              floating point result
        !           176:        f1-f3           floating point scratch
        !           177: 
        !           178:        f4-f7        S  floating point variable
        !           179: 
        !           180:    *: See CONDITIONAL_REGISTER_USAGE  */
        !           181: 
        !           182: /* The number of hard registers is 16 ARM + 8 FPU.  */
        !           183: #define FIRST_PSEUDO_REGISTER  24
        !           184: 
        !           185: /* 1 for registers that have pervasive standard uses
        !           186:    and are not available for the register allocator.  */
        !           187: #define FIXED_REGISTERS  \
        !           188: {                        \
        !           189:   0,0,0,0,0,0,0,0,      \
        !           190:   0,0,1,1,0,1,0,1,      \
        !           191:   0,0,0,0,0,0,0,0       \
        !           192: }
        !           193: 
        !           194: /* 1 for registers not available across function calls.
        !           195:    These must include the FIXED_REGISTERS and also any
        !           196:    registers that can be used without being saved.
        !           197:    The latter must include the registers where values are returned
        !           198:    and the register where structure-value addresses are passed.
        !           199:    Aside from that, you can include as many other registers as you like.  */
        !           200: #define CALL_USED_REGISTERS  \
        !           201: {                            \
        !           202:   1,1,1,1,0,0,0,0,          \
        !           203:   0,0,1,1,1,1,1,1,          \
        !           204:   1,1,1,1,0,0,0,0           \
        !           205: }
        !           206: 
        !           207: /* If doing stupid life analysis, avoid a bug causing a return value r0 to be
        !           208:    trampled.  This effectively reduces the number of available registers by 1.
        !           209:    XXX It is a hack, I know.
        !           210:    XXX Is this still needed?  */
        !           211: #define CONDITIONAL_REGISTER_USAGE  \
        !           212: {                      \
        !           213:   if (obey_regdecls)   \
        !           214:     fixed_regs[0] = 1; \
        !           215: }
        !           216: 
        !           217: /* Return number of consecutive hard regs needed starting at reg REGNO
        !           218:    to hold something of mode MODE.
        !           219:    This is ordinarily the length in words of a value of mode MODE
        !           220:    but can be less for certain modes in special long registers.
        !           221: 
        !           222:    On the ARM regs are UNITS_PER_WORD bits wide; FPU regs can hold any FP
        !           223:    mode.  */
        !           224: #define HARD_REGNO_NREGS(REGNO, MODE)  \
        !           225:     ((REGNO) >= 16 ? 1                                                 \
        !           226:      : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
        !           227: 
        !           228: /* Value is 1 if hard register REGNO can hold a value of machine-mode MODE.
        !           229:    This is TRUE for ARM regs since they can hold anything, and TRUE for FPU
        !           230:    regs holding FP.  */
        !           231: #define HARD_REGNO_MODE_OK(REGNO, MODE)  \
        !           232:   ((REGNO) < 16 || GET_MODE_CLASS (MODE) == MODE_FLOAT)
        !           233: 
        !           234: /* Value is 1 if it is a good idea to tie two pseudo registers
        !           235:    when one has mode MODE1 and one has mode MODE2.
        !           236:    If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
        !           237:    for any hard reg, then this must be 0 for correct output.  */
        !           238: #define MODES_TIEABLE_P(MODE1, MODE2)  \
        !           239:   (((MODE1) == SFmode || (MODE1) == DFmode)      \
        !           240:    == ((MODE2) == SFmode || (MODE2) == DFmode))
        !           241: 
        !           242: /* Specify the registers used for certain standard purposes.
        !           243:    The values of these macros are register numbers.  */
        !           244: 
        !           245: /* Define this if the program counter is overloaded on a register.  */
        !           246: #define PC_REGNUM              15
        !           247: 
        !           248: /* Register to use for pushing function arguments.  */
        !           249: #define STACK_POINTER_REGNUM   13
        !           250: 
        !           251: /* Base register for access to local variables of the function.  */
        !           252: #define FRAME_POINTER_REGNUM   9
        !           253: 
        !           254: /* Value should be nonzero if functions must have frame pointers.
        !           255:    Zero means the frame pointer need not be set up (and parms may be accessed
        !           256:    via the stack pointer) in functions that seem suitable.  */
        !           257: #define FRAME_POINTER_REQUIRED 0
        !           258: 
        !           259: /* Base register for access to arguments of the function.  */
        !           260: #define ARG_POINTER_REGNUM     11
        !           261: 
        !           262: /* The native (Norcroft) Pascal compiler for the ARM passes the static chain
        !           263:    as an invisible last argument (possible since varargs don't exist in
        !           264:    Pascal), so the following is not true.  */
        !           265: #define STATIC_CHAIN_REGNUM    8
        !           266: 
        !           267: /* Register in which address to store a structure value
        !           268:    is passed to a function.  */
        !           269: #define STRUCT_VALUE_REGNUM    0
        !           270: 
        !           271: /* The order in which register should be allocated.  It is good to use ip
        !           272:    since no saving is required (though calls clobber it).  It is quite good to
        !           273:    use lr since other calls may clobber it anyway.  */
        !           274: #define REG_ALLOC_ORDER  \
        !           275: {                                   \
        !           276:     0, 1, 2, 3, 12, 14,        4, 5,       \
        !           277:     6, 7, 8, 10, 9, 11, 13, 15,     \
        !           278:     16, 17, 18, 19, 20, 21, 22, 23  \
        !           279: }
        !           280: 
        !           281: /* Register and constant classes.  */
        !           282: 
        !           283: /* Register classes: all ARM regs or all FPU regs---simple! */
        !           284: enum reg_class
        !           285: {
        !           286:   NO_REGS,
        !           287:   FPU_REGS,
        !           288:   GENERAL_REGS,
        !           289:   ALL_REGS,
        !           290:   LIM_REG_CLASSES
        !           291: };
        !           292: 
        !           293: #define N_REG_CLASSES  (int) LIM_REG_CLASSES
        !           294: 
        !           295: /* Give names of register classes as strings for dump file.   */
        !           296: #define REG_CLASS_NAMES  \
        !           297: {                      \
        !           298:   "NO_REGS",           \
        !           299:   "FPU_REGS",          \
        !           300:   "GENERAL_REGS",      \
        !           301:   "ALL_REGS",          \
        !           302: }
        !           303: 
        !           304: /* Define which registers fit in which classes.
        !           305:    This is an initializer for a vector of HARD_REG_SET
        !           306:    of length N_REG_CLASSES.  */
        !           307: #define REG_CLASS_CONTENTS  \
        !           308: {                              \
        !           309:   0x000000,  /* NO_REGS  */    \
        !           310:   0xFF0000,  /* FPU_REGS */    \
        !           311:   0x00FFFF,  /* GENERAL_REGS */        \
        !           312:   0xFFFFFF   /* ALL_REGS */    \
        !           313: }
        !           314: 
        !           315: /* The same information, inverted:
        !           316:    Return the class number of the smallest class containing
        !           317:    reg number REGNO.  This could be a conditional expression
        !           318:    or could index an array.  */
        !           319: #define REGNO_REG_CLASS(REGNO)  \
        !           320:   ((REGNO) < 16 ? GENERAL_REGS : FPU_REGS)
        !           321: 
        !           322: /* The class value for index registers, and the one for base regs.  */
        !           323: #define INDEX_REG_CLASS  GENERAL_REGS
        !           324: #define BASE_REG_CLASS GENERAL_REGS
        !           325: 
        !           326: /* Get reg_class from a letter such as appears in the machine description.
        !           327:    We only need constraint `f' for FPU_REGS (`r' == GENERAL_REGS).  */
        !           328: #define REG_CLASS_FROM_LETTER(C)  \
        !           329:   ((C)=='f' ? FPU_REGS : NO_REGS)
        !           330: 
        !           331: /* The letters I, J, K, L and M in a register constraint string
        !           332:    can be used to stand for particular ranges of immediate operands.
        !           333:    This macro defines what the ranges are.
        !           334:    C is the letter, and VALUE is a constant value.
        !           335:    Return 1 if VALUE is in the range specified by C.
        !           336:        I: immediate arithmetic operand (i.e. 8 bits shifted as required).
        !           337:        J: valid indexing constants.  */
        !           338: #define CONST_OK_FOR_LETTER_P(VALUE, C)  \
        !           339:   ((C) == 'I' ? const_ok_for_arm (VALUE) :             \
        !           340:    (C) == 'J' ? (abs (VALUE) < 4096) : 0)
        !           341: 
        !           342: /* Constant letter 'G' for the FPU immediate constants. */
        !           343: #define CONST_DOUBLE_OK_FOR_LETTER_P(X,C)      \
        !           344:     ((C) == 'G' ? const_double_rtx_ok_for_fpu (X) : 0)
        !           345: 
        !           346: /* Given an rtx X being reloaded into a reg required to be
        !           347:    in class CLASS, return the class of reg to actually use.
        !           348:    In general this is just CLASS; but on some machines
        !           349:    in some cases it is preferable to use a more restrictive class.  */
        !           350: #define PREFERRED_RELOAD_CLASS(X, CLASS)  (CLASS)
        !           351: 
        !           352: /* Return the maximum number of consecutive registers
        !           353:    needed to represent mode MODE in a register of class CLASS.
        !           354:    ARM regs are UNITS_PER_WORD bits while FPU regs can hold any FP mode */
        !           355: #define CLASS_MAX_NREGS(CLASS, MODE)  \
        !           356:     ((CLASS) == FPU_REGS ? 1                                          \
        !           357:      : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
        !           358: 
        !           359: /* Moves between FPU_REGS and GENERAL_REGS are two insns.  */
        !           360: #define REGISTER_MOVE_COST(CLASS1, CLASS2)  \
        !           361:   ((((CLASS1) == FPU_REGS && (CLASS2) != FPU_REGS)     \
        !           362:     || ((CLASS2) == FPU_REGS && (CLASS1) != FPU_REGS)) \
        !           363:    ? 4 : 2)
        !           364: 
        !           365: /* Stack layout; function entry, exit and calling.  */
        !           366: 
        !           367: /* Define this if pushing a word on the stack
        !           368:    makes the stack pointer a smaller address.  */
        !           369: #define STACK_GROWS_DOWNWARD  1
        !           370: 
        !           371: /* Define this if the nominal address of the stack frame
        !           372:    is at the high-address end of the local variables;
        !           373:    that is, each additional local variable allocated
        !           374:    goes at a more negative offset in the frame.  */
        !           375: #define FRAME_GROWS_DOWNWARD 1
        !           376: 
        !           377: /* Offset within stack frame to start allocating local variables at.
        !           378:    If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
        !           379:    first local allocated.  Otherwise, it is the offset to the BEGINNING
        !           380:    of the first local allocated.  */
        !           381: #define STARTING_FRAME_OFFSET  0
        !           382: 
        !           383: /* If we generate an insn to push BYTES bytes,
        !           384:    this says how many the stack pointer really advances by.  */
        !           385: #define PUSH_ROUNDING(NPUSHED)  (((NPUSHED) + 3) & ~3)
        !           386: 
        !           387: /* Offset of first parameter from the argument pointer register value.  */
        !           388: #define FIRST_PARM_OFFSET(FNDECL)  4
        !           389: 
        !           390: /* Value is the number of byte of arguments automatically
        !           391:    popped when returning from a subroutine call.
        !           392:    FUNTYPE is the data type of the function (as a tree),
        !           393:    or for a library call it is an identifier node for the subroutine name.
        !           394:    SIZE is the number of bytes of arguments passed on the stack.
        !           395: 
        !           396:    On the ARM, the caller does not pop any of its arguments that were passed
        !           397:    on the stack.  */
        !           398: #define RETURN_POPS_ARGS(FUNTYPE, SIZE)  0
        !           399: 
        !           400: /* Define how to find the value returned by a function.
        !           401:    VALTYPE is the data type of the value (as a tree).
        !           402:    If the precise function being called is known, FUNC is its FUNCTION_DECL;
        !           403:    otherwise, FUNC is 0.  */
        !           404: #define FUNCTION_VALUE(VALTYPE, FUNC)  \
        !           405:   (GET_MODE_CLASS (TYPE_MODE (VALTYPE)) == MODE_FLOAT  \
        !           406:    ? gen_rtx (REG, TYPE_MODE (VALTYPE), 16)            \
        !           407:    : gen_rtx (REG, TYPE_MODE (VALTYPE), 0))
        !           408: 
        !           409: /* Define how to find the value returned by a library function
        !           410:    assuming the value has mode MODE.  */
        !           411: #define LIBCALL_VALUE(MODE)  \
        !           412:   (GET_MODE_CLASS (MODE) == MODE_FLOAT  \
        !           413:    ? gen_rtx (REG, MODE, 16)           \
        !           414:    : gen_rtx (REG, MODE, 0))
        !           415: 
        !           416: /* 1 if N is a possible register number for a function value.
        !           417:    On the ARM, only r0 and f0 can return results.  */
        !           418: #define FUNCTION_VALUE_REGNO_P(REGNO)  \
        !           419:   ((REGNO) == 0 || (REGNO) == 16)
        !           420: 
        !           421: /* Define where to put the arguments to a function.
        !           422:    Value is zero to push the argument on the stack,
        !           423:    or a hard register in which to store the argument.
        !           424: 
        !           425:    MODE is the argument's machine mode.
        !           426:    TYPE is the data type of the argument (as a tree).
        !           427:     This is null for libcalls where that information may
        !           428:     not be available.
        !           429:    CUM is a variable of type CUMULATIVE_ARGS which gives info about
        !           430:     the preceding args and about the function being called.
        !           431:    NAMED is nonzero if this argument is a named parameter
        !           432:     (otherwise it is an extra parameter matching an ellipsis).
        !           433: 
        !           434:    On the ARM, normally the first 16 bytes are passed in registers r0-r3; all
        !           435:    other arguments are passed on the stack.  If (NAMED == 0) (which happens
        !           436:    only in assign_parms, since SETUP_INCOMING_VARARGS is defined), say it is
        !           437:    passed in the stack (function_prologue will indeed make it pass in the
        !           438:    stack if necessary).  */
        !           439: #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED)  \
        !           440:   ((NAMED)                                             \
        !           441:    ? ((CUM) >= 16 ? 0 : gen_rtx (REG, MODE, (CUM) / 4))        \
        !           442:    : 0)
        !           443: 
        !           444: /* For an arg passed partly in registers and partly in memory,
        !           445:    this is the number of registers used.
        !           446:    For args passed entirely in registers or entirely in memory, zero.  */
        !           447: #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED)  \
        !           448:   ((CUM) < 16 && 16 < (CUM) + ((MODE) != BLKmode            \
        !           449:                               ? GET_MODE_SIZE (MODE)       \
        !           450:                               : int_size_in_bytes (TYPE))  \
        !           451:    ? 4 - (CUM) / 4 : 0)
        !           452: 
        !           453: /* A C type for declaring a variable that is used as the first argument of
        !           454:    `FUNCTION_ARG' and other related values.  For some target machines, the
        !           455:    type `int' suffices and can hold the number of bytes of argument so far.
        !           456: 
        !           457:    On the ARM, this is the number of bytes of arguments scanned so far.  */
        !           458: #define CUMULATIVE_ARGS  int
        !           459: 
        !           460: /* Initialize a variable CUM of type CUMULATIVE_ARGS
        !           461:    for a call to a function whose data type is FNTYPE.
        !           462:    For a library call, FNTYPE is 0.
        !           463:    On the ARM, the offset starts at 0.  */
        !           464: #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME)  \
        !           465:   ((CUM) = (((FNTYPE) && aggregate_value_p (FNTYPE)) ? 4 : 0))
        !           466: 
        !           467: /* Update the data in CUM to advance over an argument
        !           468:    of mode MODE and data type TYPE.
        !           469:    (TYPE is null for libcalls where that information may not be available.)  */
        !           470: #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)  \
        !           471:   (CUM) += ((MODE) != BLKmode                       \
        !           472:            ? (GET_MODE_SIZE (MODE) + 3) & ~3       \
        !           473:            : (int_size_in_bytes (TYPE) + 3) & ~3)  \
        !           474: 
        !           475: /* 1 if N is a possible register number for function argument passing.
        !           476:    On the ARM, r0-r3 are used to pass args.  */
        !           477: #define FUNCTION_ARG_REGNO_P(REGNO)  \
        !           478:   ((REGNO) >= 0 && (REGNO) <= 3)
        !           479: 
        !           480: /* Perform any actions needed for a function that is receiving a variable
        !           481:    number of arguments.  CUM is as above.  MODE and TYPE are the mode and type
        !           482:    of the current parameter.  PRETEND_SIZE is a variable that should be set to
        !           483:    the amount of stack that must be pushed by the prolog to pretend that our
        !           484:    caller pushed it.
        !           485: 
        !           486:    Normally, this macro will push all remaining incoming registers on the
        !           487:    stack and set PRETEND_SIZE to the length of the registers pushed.
        !           488: 
        !           489:    On the ARM, PRETEND_SIZE is set in order to have the prologue push the last
        !           490:    named arg and all anonymous args onto the stack.
        !           491:    XXX I know the prologue shouldn't be pushing registers, but it is faster
        !           492:    that way.  */
        !           493: #define SETUP_INCOMING_VARARGS(CUM, MODE, TYPE, PRETEND_SIZE, NO_RTL)  \
        !           494: {                                                                      \
        !           495:   extern int current_function_anonymous_args;                          \
        !           496:   current_function_anonymous_args = 1;                                 \
        !           497:   if ((CUM) < 16)                                                      \
        !           498:     (PRETEND_SIZE) = 16 - (CUM);                                       \
        !           499: }
        !           500: 
        !           501: /* Generate assembly output for the start of a function.  */
        !           502: #define FUNCTION_PROLOGUE(STREAM, SIZE)  \
        !           503:   output_prologue ((STREAM), (SIZE))
        !           504: 
        !           505: /* Call the function profiler with a given profile label.  The Acorn compiler
        !           506:    puts this BEFORE the prolog but gcc pust it afterwards.  The ``mov ip,lr''
        !           507:    seems like a good idea to stick with cc convention.  ``prof'' doesn't seem
        !           508:    to mind about this!  */
        !           509: #define FUNCTION_PROFILER(STREAM,LABELNO)  \
        !           510: {                                                      \
        !           511:     fprintf(STREAM, "\tmov\tip, lr\n");                        \
        !           512:     fprintf(STREAM, "\tbl\tmcount\n");                 \
        !           513:     fprintf(STREAM, "\t.word\tLP%d\n", (LABELNO));     \
        !           514:     arm_increase_location (12);                                \
        !           515: }
        !           516: 
        !           517: /* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
        !           518:    the stack pointer does not matter.  The value is tested only in
        !           519:    functions that have frame pointers.
        !           520:    No definition is equivalent to always zero.
        !           521: 
        !           522:    On the ARM, the function epilogue recovers the stack pointer from the
        !           523:    frame.  */
        !           524: #define EXIT_IGNORE_STACK 1
        !           525: 
        !           526: /* Generate the assembly code for function exit. */
        !           527: #define FUNCTION_EPILOGUE(STREAM, SIZE)  \
        !           528:   output_epilogue ((STREAM), (SIZE))
        !           529: 
        !           530: /* Determine if the epilogue should be output as RTL.
        !           531:    You should override this if you define FUNCTION_EXTRA_EPILOGUE.  */
        !           532: /* #define USE_RETURN_INSN use_return_insn () */
        !           533: 
        !           534: /* Store in the variable DEPTH the initial difference between the frame
        !           535:    pointer reg contents and the stack pointer reg contents, as of the start of
        !           536:    the function body.  This depends on the layout of the fixed parts of the
        !           537:    stack frame and on how registers are saved.  */
        !           538: #define INITIAL_FRAME_POINTER_OFFSET(DEPTH)  \
        !           539:   (DEPTH) = (get_frame_size () + 3) & ~3;
        !           540: 
        !           541: /* Output assembler code for a block containing the constant parts
        !           542:    of a trampoline, leaving space for the variable parts.
        !           543: 
        !           544:    On the ARM, (if r8 is the static chain regnum, and remembering that
        !           545:    referencing pc adds an offset of 8) the trampoline looks like:
        !           546:           ldr          r8, [pc, #0]
        !           547:           ldr          pc, [pc]
        !           548:           .word        static chain value
        !           549:           .word        function's address  */
        !           550: #define TRAMPOLINE_TEMPLATE(FILE)  \
        !           551: {                                              \
        !           552:   fprintf ((FILE), "\tldr\tr8, [pc, #0]\n");   \
        !           553:   fprintf ((FILE), "\tldr\tpc, [pc, #0]\n");   \
        !           554:   fprintf ((FILE), "\t.word\t0\n");            \
        !           555:   fprintf ((FILE), "\t.word\t0\n");            \
        !           556: }
        !           557: 
        !           558: /* Length in units of the trampoline for entering a nested function.  */
        !           559: #define TRAMPOLINE_SIZE  16
        !           560: 
        !           561: /* Alignment required for a trampoline in units.  */
        !           562: #define TRAMPOLINE_ALIGN  4
        !           563: 
        !           564: /* Emit RTL insns to initialize the variable parts of a trampoline.
        !           565:    FNADDR is an RTX for the address of the function's pure code.
        !           566:    CXT is an RTX for the static chain value for the function.  */
        !           567: #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT)  \
        !           568: {                                                                      \
        !           569:   emit_move_insn (gen_rtx (MEM, SImode, plus_constant ((TRAMP), 8)),   \
        !           570:                  (CXT));                                               \
        !           571:   emit_move_insn (gen_rtx (MEM, SImode, plus_constant ((TRAMP), 12)),  \
        !           572:                  (FNADDR));                                            \
        !           573: }
        !           574: 
        !           575: /* Call the function profiler with a given profile label.  The Acorn compiler
        !           576:    puts this BEFORE the prolog but gcc pust it afterwards.  The ``mov ip,lr''
        !           577:    seems like a good idea to stick with cc convention.  ``prof'' doesn't seem
        !           578:    to mind about this!  */
        !           579: #define FUNCTION_PROFILER(STREAM,LABELNO)  \
        !           580: {                                                      \
        !           581:     fprintf(STREAM, "\tmov\tip, lr\n");                        \
        !           582:     fprintf(STREAM, "\tbl\tmcount\n");                 \
        !           583:     fprintf(STREAM, "\t.word\tLP%d\n", (LABELNO));     \
        !           584:     arm_increase_location (12);                                \
        !           585: }
        !           586: 
        !           587: /* Addressing modes, and classification of registers for them.  */
        !           588: 
        !           589: #define HAVE_POST_INCREMENT  1
        !           590: #define HAVE_PRE_INCREMENT  1
        !           591: #define HAVE_POST_DECREMENT  1
        !           592: #define HAVE_PRE_DECREMENT  1
        !           593: 
        !           594: /* Macros to check register numbers against specific register classes.  */
        !           595: 
        !           596: /* These assume that REGNO is a hard or pseudo reg number.
        !           597:    They give nonzero only if REGNO is a hard reg of the suitable class
        !           598:    or a pseudo reg currently allocated to a suitable hard reg.
        !           599:    Since they use reg_renumber, they are safe only once reg_renumber
        !           600:    has been allocated, which happens in local-alloc.c.
        !           601: 
        !           602:    On the ARM, don't allow the pc to be used.  */
        !           603: #define REGNO_OK_FOR_BASE_P(REGNO)  \
        !           604:   ((REGNO) < 15 || (unsigned) reg_renumber[(REGNO)] < 15)
        !           605: #define REGNO_OK_FOR_INDEX_P(REGNO)  \
        !           606:   REGNO_OK_FOR_BASE_P(REGNO)
        !           607: 
        !           608: /* Maximum number of registers that can appear in a valid memory address.
        !           609:    The addressing mode [ra,rb, <shift> rc] uses the greatest number of
        !           610:    registers.  */
        !           611: #define MAX_REGS_PER_ADDRESS 3
        !           612: 
        !           613: /* Recognize any constant value that is a valid address.  */
        !           614: /* XXX We can address any constant, eventually...  */
        !           615: #if 0
        !           616: #define CONSTANT_ADDRESS_P(X)  \
        !           617:     ( GET_CODE(X) == LABEL_REF \
        !           618:   ||  GET_CODE(X) == SYMBOL_REF \
        !           619:   ||  GET_CODE(X) == CONST_INT \
        !           620:   ||  GET_CODE(X) == CONST )
        !           621: #endif
        !           622: 
        !           623: #define CONSTANT_ADDRESS_P(X)  \
        !           624:   (GET_CODE (X) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (X))
        !           625: 
        !           626: /* Nonzero if the constant value X is a legitimate general operand.
        !           627:    It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE.
        !           628: 
        !           629:    On the ARM, allow any integer (invalid ones are removed later by insn
        !           630:    patterns), nice doubles and symbol_refs which refer to the function's
        !           631:    constant pool XXX.  */
        !           632: #define LEGITIMATE_CONSTANT_P(X)                               \
        !           633:   (GET_CODE (X) == CONST_INT                                   \
        !           634:    || (GET_CODE (X) == CONST_DOUBLE                            \
        !           635:        &&  const_double_rtx_ok_for_fpu (X)))
        !           636: #if 0
        !           637:    || GET_CODE(X) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P(X))
        !           638: #endif
        !           639: 
        !           640: /* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
        !           641:    and check its validity for a certain class.
        !           642:    We have two alternate definitions for each of them.
        !           643:    The usual definition accepts all pseudo regs; the other rejects
        !           644:    them unless they have been allocated suitable hard regs.
        !           645:    The symbol REG_OK_STRICT causes the latter definition to be used.  */
        !           646: #ifndef REG_OK_STRICT
        !           647: /* Nonzero if X is a hard reg that can be used as a base reg
        !           648:    or if it is a pseudo reg.  */
        !           649: #define REG_OK_FOR_BASE_P(X)  \
        !           650:   (REGNO (X) < 16 || REGNO (X) >= 24)
        !           651: /* Nonzero if X is a hard reg that can be used as an index
        !           652:    or if it is a pseudo reg.  */
        !           653: #define REG_OK_FOR_INDEX_P(X)  \
        !           654:   REG_OK_FOR_BASE_P(X)
        !           655: #define REG_OK_FOR_PRE_POST_P(X)  \
        !           656:   (REGNO (X) < 16 || REGNO (X) >= FIRST_PSEUDO_REGISTER)
        !           657: #else
        !           658: /* Nonzero if X is a hard reg that can be used as a base reg.  */
        !           659: #define REG_OK_FOR_BASE_P(X)  REGNO_OK_FOR_BASE_P (REGNO (X))
        !           660: /* Nonzero if X is a hard reg that can be used as an index.  */
        !           661: #define REG_OK_FOR_INDEX_P(X)  REGNO_OK_FOR_INDEX_P (REGNO (X))
        !           662: #define REG_OK_FOR_PRE_POST_P(X)  \
        !           663:   (REGNO (X) < 16 || (unsigned) reg_renumber[REGNO (X)] < 16)
        !           664: #endif
        !           665: 
        !           666: /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
        !           667:    that is a valid memory address for an instruction.
        !           668:    The MODE argument is the machine mode for the MEM expression
        !           669:    that wants to use this address.
        !           670: 
        !           671:    The other macros defined here are used only in GO_IF_LEGITIMATE_ADDRESS.  */
        !           672: #define BASE_REGISTER_RTX_P(X)  \
        !           673:   (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X))
        !           674: 
        !           675: #define INDEX_REGISTER_RTX_P(X)  \
        !           676:   (GET_CODE (X) == REG && REG_OK_FOR_INDEX_P (X))
        !           677: 
        !           678: /* A C statement (sans semicolon) to jump to LABEL for legitimate index RTXs
        !           679:    used by the macro GO_IF_LEGITIMATE_ADDRESS.  Floating point indices can
        !           680:    only be small constants. */
        !           681: #define GO_IF_LEGITIMATE_INDEX(MODE, BASE_REGNO, INDEX, LABEL)         \
        !           682: do                                                                     \
        !           683: {                                                                      \
        !           684:   int range;                                                           \
        !           685:                                                                        \
        !           686:   if (GET_MODE_CLASS (MODE) == MODE_FLOAT)                             \
        !           687:     range = 1024;                                                      \
        !           688:   else                                                                 \
        !           689:     {                                                                  \
        !           690:       if (INDEX_REGISTER_RTX_P (INDEX))                                        \
        !           691:        goto LABEL;                                                     \
        !           692:       if (GET_MODE_SIZE (MODE) <= 4  &&  GET_CODE (INDEX) == MULT)     \
        !           693:        {                                                               \
        !           694:          rtx xiop0 = XEXP (INDEX, 0);                                  \
        !           695:          rtx xiop1 = XEXP (INDEX, 1);                                  \
        !           696:          if (INDEX_REGISTER_RTX_P (xiop0)                              \
        !           697:              && power_of_two_operand (xiop1, SImode))                  \
        !           698:            goto LABEL;                                                 \
        !           699:          if (INDEX_REGISTER_RTX_P (xiop1)                              \
        !           700:              && power_of_two_operand (xiop0, SImode))                  \
        !           701:            goto LABEL;                                                 \
        !           702:        }                                                               \
        !           703:       range = 4096;                                                    \
        !           704:     }                                                                  \
        !           705:                                                                        \
        !           706:     if (GET_CODE (INDEX) == CONST_INT && INTVAL (INDEX) < range                \
        !           707:        && INTVAL (INDEX) > -range)                                     \
        !           708:       goto LABEL;                                                      \
        !           709: } while (0)
        !           710: 
        !           711: /* Jump to LABEL if X is a valid address RTX.  This must also take
        !           712:    REG_OK_STRICT into account when deciding about valid registers, but it uses
        !           713:    the above macros so we are in luck.  Allow REG, REG+REG, REG+INDEX,
        !           714:    INDEX+REG, REG-INDEX, and non floating SYMBOL_REF to the constant pool.
        !           715:    Allow REG-only and AUTINC-REG if handling TImode.  Other symbol refs must
        !           716:    be forced though a static cell to ensure addressability.  */
        !           717: #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, LABEL)  \
        !           718: {                                                                      \
        !           719:   if (BASE_REGISTER_RTX_P (X))                                         \
        !           720:     goto LABEL;                                                                \
        !           721:   else if ((GET_CODE (X) == POST_INC || GET_CODE (X) == PRE_DEC)       \
        !           722:           && GET_CODE (XEXP (X, 0)) == REG                             \
        !           723:           && REG_OK_FOR_PRE_POST_P (XEXP (X, 0)))                      \
        !           724:     goto LABEL;                                                                \
        !           725:   else if ((MODE) == TImode)                                           \
        !           726:     ;                                                                  \
        !           727:   else if (GET_CODE (X) == PLUS)                                       \
        !           728:     {                                                                  \
        !           729:       rtx xop0 = XEXP(X,0);                                            \
        !           730:       rtx xop1 = XEXP(X,1);                                            \
        !           731:                                                                        \
        !           732:       if (BASE_REGISTER_RTX_P (xop0))                                  \
        !           733:        GO_IF_LEGITIMATE_INDEX (MODE, REGNO (xop0), xop1, LABEL);       \
        !           734:       else if (BASE_REGISTER_RTX_P (xop1))                             \
        !           735:        GO_IF_LEGITIMATE_INDEX (MODE, REGNO (xop1), xop0, LABEL);       \
        !           736:     }                                                                  \
        !           737:   else if (GET_CODE (X) == MINUS)                                      \
        !           738:     {                                                                  \
        !           739:       rtx xop0 = XEXP (X,0);                                           \
        !           740:       rtx xop1 = XEXP (X,1);                                           \
        !           741:                                                                        \
        !           742:       if (BASE_REGISTER_RTX_P (xop0))                                  \
        !           743:        GO_IF_LEGITIMATE_INDEX (MODE, -1, xop1, LABEL);                 \
        !           744:     }                                                                  \
        !           745:   else if (GET_MODE_CLASS (MODE) != MODE_FLOAT                         \
        !           746:           && GET_CODE (X) == SYMBOL_REF                                \
        !           747:           && CONSTANT_POOL_ADDRESS_P (X))                              \
        !           748:     goto LABEL;                                                                \
        !           749:   else if ((GET_CODE (X) == PRE_INC || GET_CODE (X) == POST_DEC)       \
        !           750:           && GET_CODE (XEXP (X, 0)) == REG                             \
        !           751:           && REG_OK_FOR_PRE_POST_P (XEXP (X, 0)))                      \
        !           752:     goto LABEL;                                                                \
        !           753: }
        !           754: 
        !           755: /* Try machine-dependent ways of modifying an illegitimate address
        !           756:    to be legitimate.  If we find one, return the new, valid address.
        !           757:    This macro is used in only one place: `memory_address' in explow.c.
        !           758: 
        !           759:    OLDX is the address as it was before break_out_memory_refs was called.
        !           760:    In some cases it is useful to look at this to decide what needs to be done.
        !           761: 
        !           762:    MODE and WIN are passed so that this macro can use
        !           763:    GO_IF_LEGITIMATE_ADDRESS.
        !           764: 
        !           765:    It is always safe for this macro to do nothing.  It exists to recognize
        !           766:    opportunities to optimize the output.
        !           767: 
        !           768:    On the ARM, try to convert [REG, #BIGCONST]
        !           769:    into ADD BASE, REG, #UPPERCONST and [BASE, #VALIDCONST],
        !           770:    where VALIDCONST == 0 in case of TImode.  */
        !           771: #define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN)  \
        !           772: {                                                                           \
        !           773:   if (GET_CODE (X) == PLUS)                                                 \
        !           774:     {                                                                       \
        !           775:       rtx xop0 = XEXP (X, 0);                                               \
        !           776:       rtx xop1 = XEXP (X, 1);                                               \
        !           777:                                                                             \
        !           778:       if (BASE_REGISTER_RTX_P (xop0) && GET_CODE (xop1) == CONST_INT)       \
        !           779:        {                                                                    \
        !           780:          int n = INTVAL (xop1);                                             \
        !           781:          int low_n = ((MODE) == TImode ? 0                                  \
        !           782:                       : n >= 0 ? (n & 0xFFF) : -((-n) & 0xFFF));            \
        !           783:          rtx base_reg = gen_reg_rtx (SImode);                               \
        !           784:          rtx val = force_operand (gen_rtx (PLUS, SImode, xop0,              \
        !           785:                                            gen_rtx (CONST_INT,              \
        !           786:                                                     VOIDmode, n - low_n)),  \
        !           787:                                   0);                                       \
        !           788:           emit_move_insn (base_reg, val);                                   \
        !           789:          (X) = (low_n == 0 ? base_reg                                       \
        !           790:                 : gen_rtx (PLUS, SImode, base_reg,                          \
        !           791:                            gen_rtx (CONST_INT, VOIDmode, low_n)));          \
        !           792:        }                                                                    \
        !           793:       else if (BASE_REGISTER_RTX_P (xop1) && GET_CODE (xop0) == CONST_INT)   \
        !           794:        {                                                                    \
        !           795:          int n = INTVAL (xop0);                                             \
        !           796:          int low_n = ((MODE) == TImode ? 0                                  \
        !           797:                       : n >= 0 ? (n & 0xFFF) : -((-n) & 0xFFF));            \
        !           798:          rtx base_reg = gen_reg_rtx (SImode);                               \
        !           799:          rtx val = force_operand (gen_rtx (PLUS, SImode, xop1,              \
        !           800:                                            gen_rtx (CONST_INT,              \
        !           801:                                                     VOIDmode, n - low_n)),  \
        !           802:                                   0);                                       \
        !           803:          emit_move_insn (base_reg, val);                                    \
        !           804:          (X) = (low_n == 0 ? base_reg                                       \
        !           805:                 : gen_rtx (PLUS, SImode, base_reg,                          \
        !           806:                            gen_rtx (CONST_INT, VOIDmode, low_n)));          \
        !           807:        }                                                                    \
        !           808:     }                                                                       \
        !           809:   if (memory_address_p (MODE, X))                                           \
        !           810:     goto win;                                                               \
        !           811: }
        !           812: 
        !           813: /* Go to LABEL if ADDR (a legitimate address expression)
        !           814:    has an effect that depends on the machine mode it is used for.  */
        !           815: #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)  \
        !           816: {                                                                      \
        !           817:   if (GET_CODE(ADDR) == PRE_DEC || GET_CODE(ADDR) == POST_DEC          \
        !           818:       || GET_CODE(ADDR) == PRE_INC || GET_CODE(ADDR) == POST_INC)      \
        !           819:     goto LABEL;                                                                \
        !           820: }
        !           821: 
        !           822: /* Specify the machine mode that this machine uses
        !           823:    for the index in the tablejump instruction.  */
        !           824: #define CASE_VECTOR_MODE SImode
        !           825: 
        !           826: /* Define this if the tablejump instruction expects the table
        !           827:    to contain offsets from the address of the table.
        !           828:    Do not define this if the table should contain absolute addresses.  */
        !           829: /* #define CASE_VECTOR_PC_RELATIVE */
        !           830: 
        !           831: /* Specify the tree operation to be used to convert reals to integers.  */
        !           832: #define IMPLICIT_FIX_EXPR  FIX_ROUND_EXPR
        !           833: 
        !           834: /* This is the kind of divide that is easiest to do in the general case.  */
        !           835: #define EASY_DIV_EXPR  TRUNC_DIV_EXPR
        !           836: 
        !           837: /* 'char' is signed by default on RISCiX, unsigned on RISCOS.  */
        !           838: #ifdef riscos
        !           839: #define DEFAULT_SIGNED_CHAR  0
        !           840: #else
        !           841: #define DEFAULT_SIGNED_CHAR  1
        !           842: #endif
        !           843: 
        !           844: /* Don't cse the address of the function being compiled.  */
        !           845: #define NO_RECURSIVE_FUNCTION_CSE 1
        !           846: 
        !           847: /* Max number of bytes we can move from memory to memory
        !           848:    in one reasonably fast instruction.  */
        !           849: #define MOVE_MAX 4
        !           850: 
        !           851: /* Define if normal loads of shorter-than-word items from memory clears
        !           852:    the rest of the bigs in the register.
        !           853:    On the ARM, movhi does a garbage extend.  */
        !           854: /* #define BYTE_LOADS_ZERO_EXTEND */
        !           855: 
        !           856: /* Define this if zero-extension is slow (more than one real instruction).
        !           857:    On the ARM, it is more than one instruction only if not fetching from
        !           858:    memory.  */
        !           859: /* #define SLOW_ZERO_EXTEND */
        !           860: 
        !           861: /* Nonzero if access to memory by bytes is slow and undesirable.  */
        !           862: #define SLOW_BYTE_ACCESS 0
        !           863: 
        !           864: /* Immediate shift counts are truncated by the output routines (or was it
        !           865:    the assembler?).  Shift counts in a register are truncated by ARM.  Note
        !           866:    that the native compiler puts too large (> 32) immediate shift counts
        !           867:    into a register and shifts by the register, letting the ARM decide what
        !           868:    to do instead of doing that itself.  */
        !           869: #define SHIFT_COUNT_TRUNCATED 1
        !           870: 
        !           871: /* We have the vprintf function.  */
        !           872: #define HAVE_VPRINTF 1
        !           873: 
        !           874: /* XX This is not true, is it?  */
        !           875: /* All integers have the same format so truncation is easy.  */
        !           876: #define TRULY_NOOP_TRUNCATION(OUTPREC,INPREC)  1
        !           877: 
        !           878: /* Calling from registers is a massive pain.  */
        !           879: #define NO_FUNCTION_CSE 1
        !           880: 
        !           881: /* Chars and shorts should be passed as ints.  */
        !           882: #define PROMOTE_PROTOTYPES 1
        !           883: 
        !           884: /* The machine modes of pointers and functions */
        !           885: #define Pmode  SImode
        !           886: #define FUNCTION_MODE  Pmode
        !           887: 
        !           888: /* The structure type of the machine dependent info field of insns
        !           889:    No uses for this yet.  */
        !           890: /* #define INSN_MACHINE_INFO  struct machine_info  */
        !           891: 
        !           892: /* The relative costs of various types of constants.  Note that cse.c defines
        !           893:    REG = 1, SUBREG = 2, any node = (2 + sum of subnodes).  */
        !           894: #define CONST_COSTS(RTX, CODE, OUTER_CODE)  \
        !           895:   case CONST_INT:                              \
        !           896:     if (const_ok_for_arm (INTVAL (RTX)))       \
        !           897:       return (2);                              \
        !           898:     else                                       \
        !           899:       return (5);                              \
        !           900:                                                \
        !           901:   case CONST:                                  \
        !           902:   case LABEL_REF:                              \
        !           903:   case SYMBOL_REF:                             \
        !           904:     return (6);                                        \
        !           905:                                                \
        !           906:   case CONST_DOUBLE:                           \
        !           907:     if (const_double_rtx_ok_for_fpu (RTX))     \
        !           908:       return(2);                               \
        !           909:     else                                       \
        !           910:       return(7);
        !           911: 
        !           912: /* Condition code information.  */
        !           913: 
        !           914: /* Store in cc_status the expressions
        !           915:    that the condition codes will describe
        !           916:    after execution of an instruction whose pattern is EXP.
        !           917:    Do not alter them if the instruction would not alter the cc's.  */
        !           918: 
        !           919: /* On the ARM nothing sets the condition code implicitly---apart from DImode
        !           920:    operations excluding moves---but we have to watch for registers in the
        !           921:    condition code value being clobbered.  This clobbering includes (alas)
        !           922:    function calls.  XXX They could just be considered to clobber regs 0-3 and
        !           923:    10-15 with extra work.  */
        !           924: #define NOTICE_UPDATE_CC(EXP, INSN)  \
        !           925: {                                                                      \
        !           926:   if (GET_MODE (EXP) == DImode                                         \
        !           927:       && GET_CODE (EXP) == SET                                         \
        !           928:       && GET_CODE (SET_SRC (EXP)) != REG                               \
        !           929:       && GET_CODE (SET_SRC (EXP)) != MEM                               \
        !           930:       && GET_CODE (SET_SRC (EXP)) != CONST_INT)                                \
        !           931:     CC_STATUS_INIT;                                                    \
        !           932:   else if (GET_CODE (EXP) == SET)                                      \
        !           933:     {                                                                  \
        !           934:       rtx dest = SET_DEST (EXP);                                       \
        !           935:       if (dest == cc0_rtx)                                             \
        !           936:        {                                                               \
        !           937:          cc_status.flags = 0;                                          \
        !           938:          cc_status.value1 = SET_DEST (EXP);                            \
        !           939:          cc_status.value2 = SET_SRC (EXP);                             \
        !           940:        }                                                               \
        !           941:       if (BASE_REGISTER_RTX_P (dest))                                  \
        !           942:        {                                                               \
        !           943:          if (cc_status.value1                                          \
        !           944:              && reg_overlap_mentioned_p (dest, cc_status.value1))      \
        !           945:            cc_status.value1 = 0;                                       \
        !           946:          if (cc_status.value2                                          \
        !           947:              && reg_overlap_mentioned_p (dest, cc_status.value2))      \
        !           948:            cc_status.value2 = 0;                                       \
        !           949:        }                                                               \
        !           950:     }                                                                  \
        !           951:   else if (GET_CODE (INSN) != JUMP_INSN && GET_CODE (EXP) == PARALLEL) \
        !           952:     {                                                                  \
        !           953:       CC_STATUS_INIT;                                                  \
        !           954:     }                                                                  \
        !           955: }
        !           956: 
        !           957: /* Assembler output control */
        !           958: 
        !           959: /* The text to go at the start of the assembler file */
        !           960: #define ASM_FILE_START(STREAM)  \
        !           961: {                                                                             \
        !           962:   extern char *version_string;                                                \
        !           963:                                                                               \
        !           964:   fprintf (STREAM,"@ Generated by gcc %s for ARM/RISCiX\n", version_string);  \
        !           965:   fprintf (STREAM,"rfp\t.req\tr9\n");                                         \
        !           966:   fprintf (STREAM,"fp\t.req\tr11\n");                                        \
        !           967:   fprintf (STREAM,"ip\t.req\tr12\n");                                        \
        !           968:   fprintf (STREAM,"sp\t.req\tr13\n");                                        \
        !           969:   fprintf (STREAM,"lr\t.req\tr14\n");                                        \
        !           970:   fprintf (STREAM,"pc\t.req\tr15\n");                                        \
        !           971: }
        !           972: 
        !           973: #define ASM_APP_ON  ""
        !           974: #define ASM_APP_OFF  ""
        !           975: 
        !           976: /* Switch to the text or data segment.  */
        !           977: #define TEXT_SECTION_ASM_OP  ".text"
        !           978: #define DATA_SECTION_ASM_OP  ".data"
        !           979: 
        !           980: /* The assembler's names for the registers.  RFP need not always be used as
        !           981:    the Real framepointer; it can also be used as a normal general register.
        !           982:    Note that the name `fp' is horribly misleading since `fp' is in fact only
        !           983:    the argument-and-return-context pointer.  */
        !           984: #define REGISTER_NAMES  \
        !           985: {                                                 \
        !           986:   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",  \
        !           987:   "r8","rfp", "sl", "fp", "ip", "sp", "lr", "pc",  \
        !           988:   "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7"   \
        !           989: }
        !           990: 
        !           991: /* DBX register number for a given compiler register number */
        !           992: #define DBX_REGISTER_NUMBER(REGNO)  (REGNO)
        !           993: 
        !           994: /* Generate DBX debugging information.  */
        !           995: #define DBX_DEBUGGING_INFO  1
        !           996: 
        !           997: /* Acorn dbx moans about continuation chars, so don't use any.  */
        !           998: #define DBX_CONTIN_LENGTH  0
        !           999: 
        !          1000: /* Output a label definition.  */
        !          1001: #define ASM_OUTPUT_LABEL(STREAM,NAME)  \
        !          1002:   arm_asm_output_label ((STREAM), (NAME))
        !          1003: 
        !          1004: /* Output a function label definition.  */
        !          1005: #define ASM_DECLARE_FUNCTION_NAME(STREAM,NAME,DECL) \
        !          1006:     ASM_OUTPUT_LABEL(STREAM, NAME)
        !          1007: 
        !          1008: /* Output a globalising directive for a label.  */
        !          1009: #define ASM_GLOBALIZE_LABEL(STREAM,NAME)  \
        !          1010:   (fprintf (STREAM, "\t.global\t"),      \
        !          1011:    assemble_name (STREAM, NAME),         \
        !          1012:    fputc ('\n',STREAM))                   \
        !          1013: 
        !          1014: /* Output a reference to a label.  */
        !          1015: #define ASM_OUTPUT_LABELREF(STREAM,NAME)  \
        !          1016:   fprintf (STREAM, "_%s", NAME)
        !          1017: 
        !          1018: /* Make an internal label into a string.  */
        !          1019: #define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM)  \
        !          1020:   sprintf (STRING, "*%s%d", PREFIX, NUM)
        !          1021: 
        !          1022: /* Output an internal label definition.  */
        !          1023: #define ASM_OUTPUT_INTERNAL_LABEL(STREAM, PREFIX, NUM)  \
        !          1024:   do                                                                   \
        !          1025:     {                                                                  \
        !          1026:       char *s = (char *) alloca (11 + strlen (PREFIX));                        \
        !          1027:       extern int arm_target_label, arm_ccfsm_state;                    \
        !          1028:                                                                        \
        !          1029:       if (arm_ccfsm_state == 3 && arm_target_label == (NUM))                   \
        !          1030:        arm_ccfsm_state = 0;                                            \
        !          1031:       strcpy (s, "*");                                                 \
        !          1032:       sprintf (&s[strlen (s)], "%s%d", (PREFIX), (NUM));               \
        !          1033:       arm_asm_output_label (STREAM, s);                                        \
        !          1034:     } while (0)
        !          1035: 
        !          1036: /* Nothing special is done about jump tables */
        !          1037: /* #define ASM_OUTPUT_CASE_LABEL(STREAM,PREFIX,NUM,TABLE)   */
        !          1038: /* #define ASM_OUTPUT_CASE_END(STREAM,NUM,TABLE)           */
        !          1039: 
        !          1040: /* Construct a private name.  */
        !          1041: #define ASM_FORMAT_PRIVATE_NAME(OUTVAR,NAME,NUMBER)  \
        !          1042:   ((OUTVAR) = (char *) alloca (strlen (NAME) + 10),  \
        !          1043:    sprintf ((OUTVAR), "%s.%d", (NAME), (NUMBER)))
        !          1044: 
        !          1045: /* Output a push or a pop instruction (only used when profiling).  */
        !          1046: #define ASM_OUTPUT_REG_PUSH(STREAM,REGNO)   \
        !          1047:   (arm_increase_location (4)                                   \
        !          1048:    , fprintf(STREAM,"\tstmfd\tsp!,{%s}\n", reg_names[REGNO]))
        !          1049: 
        !          1050: #define ASM_OUTPUT_REG_POP(STREAM,REGNO)   \
        !          1051:   (arm_increase_location (4)                                   \
        !          1052:    , fprintf(STREAM,"\tldmfd\tsp!,{%s}\n", reg_names[REGNO]))
        !          1053: 
        !          1054: /* Output a relative address. Not needed since jump tables are absolute
        !          1055:    but we must define it anyway.  */
        !          1056: #define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM,VALUE,REL)  \
        !          1057:   fputs ("- - - ASM_OUTPUT_ADDR_DIFF_ELT called!\n", STREAM)
        !          1058: 
        !          1059: /* Output an element of a dispatch table.  */
        !          1060: #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM,VALUE)  \
        !          1061:   (arm_increase_location (4)                     \
        !          1062:    , fprintf (STREAM, "\t.word\tL%d\n", VALUE))
        !          1063: 
        !          1064: /* Output various types of constants.  */
        !          1065: #define ASM_OUTPUT_DOUBLE(STREAM, VALUE)  \
        !          1066:   (arm_increase_location (sizeof (double))        \
        !          1067:    , fprintf (STREAM, "\t.double\t%20.20f\n", VALUE))
        !          1068: 
        !          1069: #define ASM_OUTPUT_FLOAT(STREAM, VALUE)        \
        !          1070:   (arm_increase_location (sizeof (float))        \
        !          1071:    , fprintf (STREAM, "\t.float\t%20.20f\n", VALUE))
        !          1072: 
        !          1073: #define ASM_OUTPUT_INT(STREAM, EXP)  \
        !          1074:   (fprintf (STREAM, "\t.word\t"),      \
        !          1075:    output_addr_const (STREAM, (EXP)),  \
        !          1076:    arm_increase_location (4),          \
        !          1077:    fputc ('\n', STREAM))
        !          1078: 
        !          1079: #define ASM_OUTPUT_SHORT(STREAM, EXP)  \
        !          1080:   (fprintf (STREAM, "\t.short\t"),     \
        !          1081:    output_addr_const (STREAM, (EXP)),  \
        !          1082:    arm_increase_location (2),          \
        !          1083:    fputc ('\n', STREAM))
        !          1084: 
        !          1085: #define ASM_OUTPUT_CHAR(STREAM, EXP)  \
        !          1086:   (fprintf (STREAM, "\t.byte\t"),      \
        !          1087:    output_addr_const (STREAM, (EXP)),  \
        !          1088:    arm_increase_location (1),          \
        !          1089:    fputc ('\n', STREAM))
        !          1090: 
        !          1091: #define ASM_OUTPUT_BYTE(STREAM, VALUE)  \
        !          1092:   (fprintf (STREAM, "\t.byte\t%d\n", VALUE),  \
        !          1093:    arm_increase_location (1))
        !          1094: 
        !          1095: #define ASM_OUTPUT_ASCII(STREAM, PTR, LEN)  \
        !          1096:   output_ascii_pseudo_op ((STREAM), (PTR), (LEN))
        !          1097: 
        !          1098: /* Output a gap.  In fact we fill it with nulls.  */
        !          1099: #define ASM_OUTPUT_SKIP(STREAM, NBYTES)  \
        !          1100:   (arm_increase_location (NBYTES),              \
        !          1101:    fprintf (STREAM, "\t.space\t%d\n", NBYTES))
        !          1102: 
        !          1103: /* Align output to a power of two.  Horrible /bin/as.  */
        !          1104: #define ASM_OUTPUT_ALIGN(STREAM, POWER)  \
        !          1105:   do                                                           \
        !          1106:     {                                                          \
        !          1107:       register int amount = 1 << (POWER);                      \
        !          1108:       extern int arm_text_location;                           \
        !          1109:                                                                \
        !          1110:       if (amount == 2)                                         \
        !          1111:        fprintf (STREAM, "\t.even\n");                         \
        !          1112:       else                                                     \
        !          1113:        fprintf (STREAM, "\t.align\t%d\n", amount - 4);        \
        !          1114:                                                                \
        !          1115:       if (in_text_section ())                                  \
        !          1116:        arm_text_location = ((arm_text_location + amount - 1)  \
        !          1117:                             & ~(amount - 1));                 \
        !          1118:     } while (0)
        !          1119: 
        !          1120: /* Output a common block */
        !          1121: #define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED)  \
        !          1122:   (fprintf (STREAM, "\t.comm\t"),                   \
        !          1123:    assemble_name ((STREAM), (NAME)),                \
        !          1124:    fprintf(STREAM, ", %d\t@%d\n", ROUNDED, SIZE))
        !          1125: 
        !          1126: /* Output a local common block.  /bin/as can't do this, so hack a `.space' into
        !          1127:    the bss segment.  Note that this is *bad* practice.  */
        !          1128: #define ASM_OUTPUT_LOCAL(STREAM,NAME,SIZE,ROUNDED)  \
        !          1129:   output_lcomm_directive (STREAM, NAME, SIZE, ROUNDED)
        !          1130: 
        !          1131: /* Output a source filename for the debugger. RISCiX dbx insists that the
        !          1132:    ``desc'' field is set to compiler version number >= 315 (sic).  */
        !          1133: #if 0
        !          1134: #define ASM_OUTPUT_SOURCE_FILENAME(STREAM,NAME)         \
        !          1135:   fprintf (STREAM, "\t.stabs\t\"%s\", %d, 0, 315, Ltext\n", (NAME), N_SOL)
        !          1136: #endif
        !          1137: 
        !          1138: /* Output a source line for the debugger.  */
        !          1139: /* #define ASM_OUTPUT_SOURCE_LINE(STREAM,LINE) */
        !          1140: 
        !          1141: /* Output a #ident directive.  */
        !          1142: #define ASM_OUTPUT_IDENT(STREAM,STRING)  \
        !          1143:   fprintf (STREAM,"- - - ident %s\n",STRING)
        !          1144: 
        !          1145: /* The assembler's parentheses characters.  */
        !          1146: #define ASM_OPEN_PAREN "("
        !          1147: #define ASM_CLOSE_PAREN ")"
        !          1148: 
        !          1149: /* Target characters.  */
        !          1150: #define TARGET_BELL    007
        !          1151: #define TARGET_BS      010
        !          1152: #define TARGET_TAB     011
        !          1153: #define TARGET_NEWLINE 012
        !          1154: #define TARGET_VT      013
        !          1155: #define TARGET_FF      014
        !          1156: #define TARGET_CR      015
        !          1157: 
        !          1158: /* FINAL_PRESCAN_INSN is used to take a look at the insns, in order to delete
        !          1159:    small-distance conditional branches and have ASM_OUTPUT_OPCODE make the
        !          1160:    instructions conditional.  Suffixes like s (affect flags) and b (bytewise
        !          1161:    load/store) need to stay suffixes, so the possible condition code comes
        !          1162:    before these suffixes.  */
        !          1163: #define ASM_OUTPUT_OPCODE(STREAM, PTR)  \
        !          1164:   {                                                                  \
        !          1165:     extern int arm_ccfsm_state, arm_current_cc;                              \
        !          1166:     extern char *arm_condition_codes[];                                      \
        !          1167:     int i;                                                           \
        !          1168:                                                                      \
        !          1169:     fflush (STREAM);       /* XXX for debugging only.  */            \
        !          1170:     if (arm_ccfsm_state == 1 || arm_ccfsm_state == 2)                \
        !          1171:       {                                                                      \
        !          1172:        fprintf (STREAM, "@ \t");                                     \
        !          1173:        arm_ccfsm_state += 2;                                         \
        !          1174:       }                                                                             \
        !          1175:     else if (arm_ccfsm_state == 3 || arm_ccfsm_state == 4)                  \
        !          1176:       {                                                                             \
        !          1177:        for (i = 0; *(PTR) != ' ' && *(PTR) != '\t' && i < 3; i++, (PTR)++)  \
        !          1178:          putc (*(PTR), STREAM);                                             \
        !          1179:        fprintf (STREAM, "%s", arm_condition_codes[arm_current_cc]);         \
        !          1180:        for (; *(PTR) != ' ' && *(PTR) != '\t'; (PTR)++)                     \
        !          1181:          putc (*(PTR), STREAM);                                             \
        !          1182:       }                                                                             \
        !          1183:   }
        !          1184: 
        !          1185: /* Only perform branch elimination (by making instructions conditional) if
        !          1186:    we're optimising.  Otherwise it's of no use anyway.  */
        !          1187: #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS)  \
        !          1188:   if (optimize)                                            \
        !          1189:     final_prescan_insn (INSN, OPVEC, NOPERANDS)
        !          1190: 
        !          1191: /* Output an operand of an instruction.  If X is a REG and CODE is `M', output
        !          1192:    a ldm/stm style multi-reg.  */
        !          1193: #define PRINT_OPERAND(STREAM, X, CODE)  \
        !          1194: {                                                              \
        !          1195:   if ((CODE) == 'R')                                           \
        !          1196:     fputs (reg_names[REGNO (X) + 1], (STREAM));                        \
        !          1197:   else if (GET_CODE (X) == REG)                                        \
        !          1198:     {                                                          \
        !          1199:       if ((CODE) != 'M')                                       \
        !          1200:        fputs (reg_names[REGNO (X)], (STREAM));                 \
        !          1201:       else                                                     \
        !          1202:        fprintf ((STREAM), "{%s-%s}",                           \
        !          1203:                 reg_names[REGNO (X)],                          \
        !          1204:                 reg_names[REGNO (X) - 1                        \
        !          1205:                           + ((GET_MODE_SIZE (GET_MODE (X))     \
        !          1206:                               + GET_MODE_SIZE (SImode) - 1)    \
        !          1207:                              / GET_MODE_SIZE (SImode))]);      \
        !          1208:     }                                                          \
        !          1209:   else if (GET_CODE (X) == MEM)                                        \
        !          1210:     {                                                          \
        !          1211:       extern int output_memory_reference_mode;                 \
        !          1212:       output_memory_reference_mode = GET_MODE (X);             \
        !          1213:       output_address (XEXP (X, 0));                            \
        !          1214:     }                                                          \
        !          1215:   else if (GET_CODE(X) == CONST_DOUBLE)                                \
        !          1216:     {                                                          \
        !          1217:       union real_extract u;                                    \
        !          1218:       u.i[0] = CONST_DOUBLE_LOW (X);                           \
        !          1219:       u.i[1] = CONST_DOUBLE_HIGH (X);                          \
        !          1220:       fprintf(STREAM,"#%20.20f",u.d);                          \
        !          1221:     }                                                          \
        !          1222:   else if (GET_CODE (X) == NEG)                                        \
        !          1223:     {                                                          \
        !          1224:       fputc ('-', (STREAM));                                   \
        !          1225:       output_operand ((X), 0);                                 \
        !          1226:     }                                                          \
        !          1227:   else                                                         \
        !          1228:     {                                                          \
        !          1229:       fputc('#', STREAM);                                      \
        !          1230:       output_addr_const(STREAM, X);                            \
        !          1231:     }                                                          \
        !          1232: }
        !          1233: 
        !          1234: /* Output the address of an operand.  */
        !          1235: #define PRINT_OPERAND_ADDRESS(STREAM,X)  \
        !          1236: {                                                                      \
        !          1237:     int is_minus = GET_CODE (X) == MINUS;                              \
        !          1238:                                                                        \
        !          1239:     if (GET_CODE (X) == REG)                                           \
        !          1240:        fprintf (STREAM, "[%s, #0]", reg_names[REGNO (X)]);             \
        !          1241:     else if (GET_CODE (X) == PLUS || is_minus)                         \
        !          1242:       {                                                                        \
        !          1243:        rtx base = XEXP (X, 0);                                         \
        !          1244:        rtx index = XEXP (X, 1);                                        \
        !          1245:        char *base_reg_name;                                            \
        !          1246:        int offset = 0;                                                 \
        !          1247:        int shift;                                                      \
        !          1248:        if (GET_CODE (base) != REG)                                     \
        !          1249:          {                                                             \
        !          1250:            /* Ensure that BASE is a register (one of them must be). */ \
        !          1251:            rtx temp = base;                                            \
        !          1252:            base = index;                                               \
        !          1253:            index = temp;                                               \
        !          1254:          }                                                             \
        !          1255:        base_reg_name = reg_names[REGNO (base)];                        \
        !          1256:        switch (GET_CODE (index))                                       \
        !          1257:          {                                                             \
        !          1258:          case CONST_INT:                                               \
        !          1259:            offset = INTVAL (index);                                    \
        !          1260:            if (is_minus)                                               \
        !          1261:              offset = -offset;                                         \
        !          1262:            fprintf (STREAM, "[%s, #%d]", base_reg_name, offset);       \
        !          1263:            break;                                                      \
        !          1264:                                                                        \
        !          1265:          case REG:                                                     \
        !          1266:            fprintf (STREAM, "[%s, %s%s]", base_reg_name,               \
        !          1267:                     is_minus ? "-" : "", reg_names[REGNO (index)] );   \
        !          1268:            break;                                                      \
        !          1269:                                                                        \
        !          1270:          case MULT:                                                    \
        !          1271:            if (GET_CODE (XEXP (index,0)) == CONST_INT)                 \
        !          1272:              {                                                         \
        !          1273:                shift = int_log2 (INTVAL (XEXP (index, 0)));            \
        !          1274:                index = XEXP (index, 1);                                \
        !          1275:              }                                                         \
        !          1276:            else if (GET_CODE(XEXP(index,1)) == CONST_INT)              \
        !          1277:              {                                                         \
        !          1278:                shift = int_log2 (INTVAL (XEXP (index, 1)));            \
        !          1279:                index = XEXP (index, 0);                                \
        !          1280:              }                                                         \
        !          1281:            else                                                        \
        !          1282:                abort();                                                \
        !          1283:            fprintf (STREAM, "[%s, %s%s, asl#%d]", base_reg_name,       \
        !          1284:                     is_minus ? "-" : "", reg_names[REGNO (index)],     \
        !          1285:                     shift);                                            \
        !          1286:            break;                                                      \
        !          1287:                                                                        \
        !          1288:          default:                                                      \
        !          1289:            abort();                                                    \
        !          1290:        }                                                               \
        !          1291:     }                                                                  \
        !          1292:   else if (GET_CODE (X) == PRE_INC || GET_CODE (X) == POST_INC         \
        !          1293:           || GET_CODE (X) == PRE_DEC || GET_CODE (X) == POST_DEC)      \
        !          1294:     {                                                                  \
        !          1295:       extern int output_memory_reference_mode;                         \
        !          1296:                                                                        \
        !          1297:       if (GET_CODE (XEXP (X, 0)) != REG)                               \
        !          1298:        abort ();                                                       \
        !          1299:                                                                        \
        !          1300:       if (GET_CODE (X) == PRE_DEC || GET_CODE (X) == PRE_INC)          \
        !          1301:        fprintf (STREAM, "[%s, #%s%d]!", reg_names[REGNO (XEXP (X, 0))],\
        !          1302:                 GET_CODE (X) == PRE_DEC ? "-" : "",                    \
        !          1303:                 GET_MODE_SIZE (output_memory_reference_mode));         \
        !          1304:       else                                                             \
        !          1305:        fprintf (STREAM, "[%s], #%s%d", reg_names[REGNO (XEXP (X, 0))], \
        !          1306:                 GET_CODE (X) == POST_DEC ? "-" : "",                   \
        !          1307:                 GET_MODE_SIZE (output_memory_reference_mode));         \
        !          1308:     }                                                                  \
        !          1309:   else output_addr_const(STREAM, X);                                   \
        !          1310: }
        !          1311: 
        !          1312: /* EOF arm.h */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.