Annotation of GNUtools/cc/config/m68k/m68kv4.h, revision 1.1

1.1     ! root        1: /* Target definitions for GNU compiler for mc680x0 running System V.4
        !             2:    Copyright (C) 1991 Free Software Foundation, Inc.
        !             3: 
        !             4:    Written by Ron Guilmette ([email protected]) and Fred Fish ([email protected]).
        !             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: /* Use SGS_* macros to control compilation in m68k.md */
        !            23: 
        !            24: #define SGS_SWITCH_TABLES      /* Different switch table handling */
        !            25: 
        !            26: #include "m68k/sgs.h"          /* The m68k/SVR4 assembler is SGS based */
        !            27: #include "svr4.h"              /* Pick up the generic SVR4 macros */
        !            28: 
        !            29: /* See m68k.h.  7 means 68020 with 68881.  */
        !            30: 
        !            31: #ifndef TARGET_DEFAULT
        !            32: #define        TARGET_DEFAULT (5 /*68020*/ + 2 /*68881*/)
        !            33: #endif
        !            34: 
        !            35: /*  Override the definition of NO_DOLLAR_IN_LABEL in svr4.h, for special
        !            36:     g++ assembler names.  When this is defined, g++ uses embedded '.'
        !            37:     characters and some m68k assemblers have problems with this.  The
        !            38:     chances are much greater that any particular assembler will permit
        !            39:     embedded '$' characters. */
        !            40: 
        !            41: #undef NO_DOLLAR_IN_LABEL
        !            42: 
        !            43: /* Define PCC_STATIC_STRUCT_RETURN if the convention on the target machine
        !            44:    is to use the nonreentrant technique for returning structure and union
        !            45:    values, as commonly implemented by the AT&T Portable C Compiler (PCC).
        !            46:    When defined, the gcc option -fpcc-struct-return can be used to cause
        !            47:    this form to be generated.  When undefined, the option does nothing.
        !            48:    For m68k SVR4, the convention is to use a reentrant technique compatible
        !            49:    with the gcc default, so override the definition of this macro in m68k.h */
        !            50: 
        !            51: #undef PCC_STATIC_STRUCT_RETURN
        !            52: 
        !            53: /* Provide a set of pre-definitions and pre-assertions appropriate for
        !            54:    the m68k running svr4.  __svr4__ is our extension.  */
        !            55: 
        !            56: #define CPP_PREDEFINES \
        !            57:   "-Dm68k -Dunix -D__svr4__ -D__motorola__ \
        !            58:  -Asystem(unix) -Asystem(svr4) -Acpu(m68k) -Amachine(m68k)"
        !            59: 
        !            60: /* Test to see if the target includes a 68881 by default, and use CPP_SPEC
        !            61:    to control whether or not __HAVE_68881__ is defined by default or not.
        !            62:    If a 68881 is the default, gcc will use inline 68881 instructions, by
        !            63:    predefining __HAVE_68881__, unless -msoft-float is specified.
        !            64:    If a 68881 is not the default, gcc will only define __HAVE_68881__ if
        !            65:    -m68881 is specified. */
        !            66: 
        !            67: #if TARGET_DEFAULT & 2
        !            68: #define CPP_SPEC "%{!msoft-float:-D__HAVE_68881__}"
        !            69: #else
        !            70: #define CPP_SPEC "%{m68881:-D__HAVE_68881__}"
        !            71: #endif
        !            72: 
        !            73: /* Output assembler code to FILE to increment profiler label # LABELNO
        !            74:    for profiling a function entry.  We override the definition in m68k.h
        !            75:    and match the way the native m68k/SVR4 compiler does profiling, with the
        !            76:    address of the profile counter in a1, not a0, and using bsr rather
        !            77:    than jsr. */
        !            78: 
        !            79: #undef FUNCTION_PROFILER
        !            80: #define FUNCTION_PROFILER(FILE, LABELNO)                               \
        !            81:   asm_fprintf ((FILE), "\tlea.l\t(%LLP%d,%Rpc),%Ra1\n\tbsr\t_mcount\n", \
        !            82:               (LABELNO))
        !            83: 
        !            84: /* Local common symbols are declared to the assembler with ".lcomm" rather
        !            85:    than ".bss", so override the definition in svr4.h */
        !            86: 
        !            87: #undef BSS_ASM_OP
        !            88: #define BSS_ASM_OP     ".lcomm"
        !            89: 
        !            90: /* Register in which address to store a structure value is passed to a
        !            91:    function.  The default in m68k.h is a1.  For m68k/SVR4 it is a0. */
        !            92: 
        !            93: #undef STRUCT_VALUE_REGNUM
        !            94: #define STRUCT_VALUE_REGNUM 8
        !            95: 
        !            96: #define ASM_COMMENT_START "#"
        !            97: 
        !            98: #undef TYPE_OPERAND_FMT
        !            99: #define TYPE_OPERAND_FMT      "@%s"
        !           100: 
        !           101: /* Define how the m68k registers should be numbered for Dwarf output.
        !           102:    The numbering provided here should be compatible with the native
        !           103:    SVR4 SDB debugger in the m68k/SVR4 reference port, where d0-d7
        !           104:    are 0-7, a0-a8 are 8-15, and fp0-fp7 are 16-23. */
        !           105: 
        !           106: #define DBX_REGISTER_NUMBER(REGNO) (REGNO)
        !           107: 
        !           108: /* The ASM_OUTPUT_SKIP macro is first defined in m68k.h, using ".skip".
        !           109:    It is then overridden by m68k/sgs.h to use ".space", and again by svr4.h
        !           110:    to use ".zero".  The m68k/SVR4 assembler uses ".space", so repeat the
        !           111:    definition from m68k/sgs.h here.  Note that ASM_NO_SKIP_IN_TEXT is
        !           112:    defined in m68k/sgs.h, so we don't have to repeat it here. */
        !           113: 
        !           114: #undef ASM_OUTPUT_SKIP
        !           115: #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
        !           116:   fprintf (FILE, "\t%s %u\n", SPACE_ASM_OP, (SIZE))
        !           117: 
        !           118: /* 1 if N is a possible register number for a function value.
        !           119:    For m68k/SVR4 allow d0, a0, or fp0 as return registers, for integral,
        !           120:    pointer, or floating types, respectively. Reject fp0 if not using a
        !           121:    68881 coprocessor. */
        !           122: 
        !           123: #undef FUNCTION_VALUE_REGNO_P
        !           124: #define FUNCTION_VALUE_REGNO_P(N) \
        !           125:   ((N) == 0 || (N) == 8 || (TARGET_68881 && (N) == 16))
        !           126: 
        !           127: /* Define this to be true when FUNCTION_VALUE_REGNO_P is true for
        !           128:    more than one register.  */
        !           129: 
        !           130: #undef NEEDS_UNTYPED_CALL
        !           131: #define NEEDS_UNTYPED_CALL 1
        !           132: 
        !           133: /* Define how to generate (in the callee) the output value of a function
        !           134:    and how to find (in the caller) the value returned by a function.  VALTYPE
        !           135:    is the data type of the value (as a tree).  If the precise function being
        !           136:    called is known, FUNC is its FUNCTION_DECL; otherwise, FUNC is 0.
        !           137:    For m68k/SVR4 generate the result in d0, a0, or fp0 as appropriate. */
        !           138:    
        !           139: #undef FUNCTION_VALUE
        !           140: #define FUNCTION_VALUE(VALTYPE, FUNC)                                  \
        !           141:   (TREE_CODE (VALTYPE) == REAL_TYPE && TARGET_68881                    \
        !           142:    ? gen_rtx (REG, TYPE_MODE (VALTYPE), 16)                            \
        !           143:    : (TREE_CODE (VALTYPE) == POINTER_TYPE                              \
        !           144:       ? gen_rtx (REG, TYPE_MODE (VALTYPE), 8)                          \
        !           145:       : gen_rtx (REG, TYPE_MODE (VALTYPE), 0)))
        !           146: 
        !           147: /* For compatibility with the large body of existing code which does not
        !           148:    always properly declare external functions returning pointer types, the
        !           149:    m68k/SVR4 convention is to copy the value returned for pointer functions
        !           150:    from a0 to d0 in the function epilogue, so that callers that have
        !           151:    neglected to properly declare the callee can still find the correct return
        !           152:    value. */
        !           153: 
        !           154: extern int current_function_returns_pointer;
        !           155: #define FUNCTION_EXTRA_EPILOGUE(FILE, SIZE)                            \
        !           156: do {                                                                   \
        !           157:   if ((current_function_returns_pointer) &&                            \
        !           158:       ! find_equiv_reg (0, get_last_insn (), 0, 0, 0, 8, Pmode))       \
        !           159:     asm_fprintf (FILE, "\tmov.l %Ra0,%Rd0\n");                         \
        !           160: } while (0);
        !           161: 
        !           162: /* Define how to find the value returned by a library function assuming the
        !           163:    value has mode MODE.
        !           164:    For m68k/SVR4 look for integer values in d0, pointer values in d0
        !           165:    (returned in both d0 and a0), and floating values in fp0. */
        !           166: 
        !           167: #undef LIBCALL_VALUE
        !           168: #define LIBCALL_VALUE(MODE)                                            \
        !           169:   (((MODE) == SFmode || (MODE) == DFmode) && TARGET_68881              \
        !           170:    ? gen_rtx (REG, (MODE), 16)                                         \
        !           171:    : gen_rtx (REG, (MODE), 0))
        !           172: 
        !           173: /* Boundary (in *bits*) on which stack pointer should be aligned.
        !           174:    The m68k/SVR4 convention is to keep the stack pointer longword aligned. */
        !           175:  
        !           176: #undef STACK_BOUNDARY
        !           177: #define STACK_BOUNDARY 32
        !           178: 
        !           179: /* Alignment of field after `int : 0' in a structure.
        !           180:    For m68k/SVR4, this is the next longword boundary. */
        !           181: 
        !           182: #undef EMPTY_FIELD_BOUNDARY
        !           183: #define EMPTY_FIELD_BOUNDARY 32
        !           184: 
        !           185: /* No data type wants to be aligned rounder than this.
        !           186:    For m68k/SVR4, some types (doubles for example) are aligned on 8 byte
        !           187:    boundaries */
        !           188:        
        !           189: #undef BIGGEST_ALIGNMENT
        !           190: #define BIGGEST_ALIGNMENT 64
        !           191: 
        !           192: /* SVR4 m68k assembler is bitching on the `comm i,1,1' which askes for 
        !           193:    1 byte alignment. Don't generate alignment for COMMON seems to be
        !           194:    safer until we the assembler is fixed. */
        !           195: #undef ASM_OUTPUT_ALIGNED_COMMON
        !           196: /* Same problem with this one.  */
        !           197: #undef ASM_OUTPUT_ALIGNED_LOCAL
        !           198: 
        !           199: /* The `string' directive on m68k svr4 does not handle string with
        !           200:    escape char (ie., `\') right. Use normal way to output ASCII bytes
        !           201:    seems to be safer. */
        !           202: #undef ASM_OUTPUT_ASCII
        !           203: #define ASM_OUTPUT_ASCII(FILE,PTR,LEN)                         \
        !           204: {                                                              \
        !           205:   register int sp = 0, lp = 0, ch;                             \
        !           206:   fprintf ((FILE), "\t%s ", BYTE_ASM_OP);                      \
        !           207:   do {                                                         \
        !           208:     ch = (PTR)[sp];                                            \
        !           209:     if (ch > ' ' && ! (ch & 0x80) && ch != '\\')               \
        !           210:       {                                                                \
        !           211:        fprintf ((FILE), "'%c", ch);                            \
        !           212:       }                                                                \
        !           213:     else                                                       \
        !           214:       {                                                                \
        !           215:        fprintf ((FILE), "0x%x", ch);                           \
        !           216:       }                                                                \
        !           217:     if (++sp < (LEN))                                          \
        !           218:       {                                                                \
        !           219:        if ((sp % 10) == 0)                                     \
        !           220:          {                                                     \
        !           221:            fprintf ((FILE), "\n\t%s ", BYTE_ASM_OP);           \
        !           222:          }                                                     \
        !           223:        else                                                    \
        !           224:          {                                                     \
        !           225:            putc (',', (FILE));                                 \
        !           226:          }                                                     \
        !           227:       }                                                                \
        !           228:   } while (sp < (LEN));                                                \
        !           229:   putc ('\n', (FILE));                                         \
        !           230: }
        !           231: 
        !           232: /* SVR4 m68k assembler is bitching on the syntax `2.b'.
        !           233:    So use the "LLDnnn-LLnnn" format.  Define LLDnnn after the table.  */
        !           234: 
        !           235: #undef ASM_OUTPUT_CASE_END
        !           236: #define ASM_OUTPUT_CASE_END(FILE,NUM,TABLE)                            \
        !           237: do {                                                                   \
        !           238:   if (switch_table_difference_label_flag)                              \
        !           239:     asm_fprintf ((FILE), "\t%s %LLD%d,%LL%d\n", SET_ASM_OP, (NUM), (NUM));\
        !           240:   switch_table_difference_label_flag = 0;                              \
        !           241: } while (0)
        !           242: 
        !           243: int switch_table_difference_label_flag;
        !           244: 
        !           245: #undef ASM_OUTPUT_COMMON
        !           246: #undef ASM_OUTPUT_LOCAL
        !           247: #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)  \
        !           248: ( fputs (".comm ", (FILE)),                    \
        !           249:   assemble_name ((FILE), (NAME)),              \
        !           250:   fprintf ((FILE), ",%u\n", (SIZE)))
        !           251: 
        !           252: #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)  \
        !           253: ( fputs (".lcomm ", (FILE)),                   \
        !           254:   assemble_name ((FILE), (NAME)),              \
        !           255:   fprintf ((FILE), ",%u\n", (SIZE)))
        !           256: 
        !           257: /* Override the definition in svr4.h. In m68k svr4, using swbeg is the 
        !           258:    standard way to do switch table. */
        !           259: #undef ASM_OUTPUT_BEFORE_CASE_LABEL
        !           260: #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE)            \
        !           261:   fprintf ((FILE), "\t%s &%d\n", SWBEG_ASM_OP, XVECLEN (PATTERN (TABLE), 1));
        !           262: 
        !           263: /* In m68k svr4, a symbol_ref rtx can be a valid PIC operand if it is an
        !           264:    operand of a function call. */
        !           265: #undef LEGITIMATE_PIC_OPERAND_P
        !           266: #define LEGITIMATE_PIC_OPERAND_P(X) \
        !           267:   (! symbolic_operand (X, VOIDmode) \
        !           268:    || ((GET_CODE(X) == SYMBOL_REF) && SYMBOL_REF_FLAG(X)))
        !           269: 
        !           270: /* Turn off function cse if we are doing PIC. We always want function call
        !           271:    to be done as `bsr foo@PLTPC', so it will force the assembler to create 
        !           272:    the PLT entry for `foo'. Doing function cse will cause the address of `foo'
        !           273:    to be loaded into a register, which is exactly what we want to avoid when
        !           274:    we are doing PIC on svr4 m68k. */
        !           275: #undef OVERRIDE_OPTIONS
        !           276: #define OVERRIDE_OPTIONS               \
        !           277: {                                      \
        !           278:   if (flag_pic) flag_no_function_cse = 1; \
        !           279:   if (! TARGET_68020 && flag_pic == 2) \
        !           280:     error("-fPIC is not currently supported on the 68000 or 68010\n"); \
        !           281: }

unix.superglobalmegacorp.com

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