Annotation of GNUtools/cc/config/m68k/m68kv4.h, revision 1.1.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.