Annotation of gcc/config/mips/abi64.h, revision 1.1.1.1

1.1       root        1: /* Definitions of target machine for GNU compiler.  64 bit ABI support.
                      2:    Copyright (C) 1994, 1995 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU CC.
                      5: 
                      6: GNU CC is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 2, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU CC is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU CC; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 59 Temple Place - Suite 330,
                     19: Boston, MA 02111-1307, USA.  */
                     20: 
                     21: /* Macros to implement the 64 bit ABI.  This file is meant to be included
                     22:    after mips.h.  */
                     23: 
                     24: #undef ABI_64BIT
                     25: #define ABI_64BIT 1
                     26: 
                     27: /* For Irix 6, -mips3 implies TARGET_LONG64.  */
                     28: #undef TARGET_LONG64
                     29: #define TARGET_LONG64          (target_flags & MASK_64BIT)
                     30: 
                     31: #undef CPP_PREDEFINES
                     32: #define CPP_PREDEFINES \
                     33:  "-Dunix -Dmips -Dsgi -Dhost_mips -DMIPSEB -D_MIPSEB -DSYSTYPE_SVR4 \
                     34:   -D_SVR4_SOURCE -D_MODERN_C -D__DSO__ \
                     35:   -Asystem(unix) -Asystem(svr4) -Acpu(mips) -Amachine(sgi)"
                     36: 
                     37: /* We must make -mips3 do what -mlong64 used to do.  */
                     38: #undef CPP_SPEC
                     39: #define CPP_SPEC "\
                     40: %{!ansi:-D__EXTENSIONS__ -D_SGI_SOURCE -D_LONGLONG} \
                     41: %{.cc: -D_LANGUAGE_C_PLUS_PLUS} \
                     42: %{.cxx:        -D_LANGUAGE_C_PLUS_PLUS} \
                     43: %{.C:  -D_LANGUAGE_C_PLUS_PLUS} \
                     44: %{.m:  -D_LANGUAGE_OBJECTIVE_C -D_LANGUAGE_C} \
                     45: %{.S:  -D_LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} \
                     46: %{.s:  -D_LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} \
                     47: %{!.S:%{!.s: %{!.cc: %{!.cxx: %{!.C: %{!.m: -D_LANGUAGE_C %{!ansi:-DLANGUAGE_C}}}}}}}\
                     48: %{mfp32: -D_MIPS_FPSET=16}%{!mfp32: -D_MIPS_FPSET=32} \
                     49: %{mips1: -D_MIPS_ISA=_MIPS_ISA_MIPS1} \
                     50: %{mips2: -D_MIPS_ISA=_MIPS_ISA_MIPS2} \
                     51: %{mips3: -D_MIPS_ISA=_MIPS_ISA_MIPS3} \
                     52: %{mips4: -D_MIPS_ISA=_MIPS_ISA_MIPS4} \
                     53: %{!mips1: %{!mips2: %{!mips3: %{!mips4: -D_MIPS_ISA=_MIPS_ISA_MIPS4}}}} \
                     54: %{mips1: -D_MIPS_SIM=_MIPS_SIM_ABI32}  \
                     55: %{mips2: -D_MIPS_SIM=_MIPS_SIM_ABI32}  \
                     56: %{mips3: -D_ABI64=3 -D_MIPS_SIM=_ABI64}        \
                     57: %{mips4: -D_ABI64=3 -D_MIPS_SIM=_ABI64}        \
                     58: %{!mips1: %{!mips2: %{!mips3: %{!mips4: -D_ABI64=3 -D_MIPS_SIM=_ABI64}}}}      \
                     59: %{!mint64: -D_MIPS_SZINT=32}%{mint64: -D_MIPS_SZINT=64} \
                     60: %{mips1: -D_MIPS_SZLONG=32}%{mips2: -D_MIPS_SZLONG=32}  \
                     61: %{!mips1:%{!mips2: -D_MIPS_SZLONG=64}}                 \
                     62: %{mips1: -D_MIPS_SZPTR=32}%{mips2: -D_MIPS_SZPTR=32}   \
                     63: %{mips3: -D_MIPS_SZPTR=64}%{mips4: -D_MIPS_SZPTR=64}   \
                     64: %{!mips1: %{!mips2: %{!mips3: %{!mips4: -D_MIPS_SZPTR=64}}}}   \
                     65: %{!mips1:%{!mips2: -D_COMPILER_VERSION=601}}           \
                     66: %{mips1: -D__SIZE_TYPE__=unsigned\\ int -D__PTRDIFF_TYPE__=int} \
                     67: %{mips2: -D__SIZE_TYPE__=unsigned\\ int -D__PTRDIFF_TYPE__=int} \
                     68: %{!mips1:%{!mips2: -D__SIZE_TYPE__=long\\ unsigned\\ int -D__PTRDIFF_TYPE__=long\\ int}} \
                     69: %{mips3:-U__mips -D__mips=3 -D__mips64} \
                     70: %{!mips1:%{!mips2:-U__mips -D__mips=4 -D__mips64}} \
                     71: %{mgp32:-U__mips64} %{mgp64:-D__mips64} \
                     72: %{EB:-UMIPSEL -U_MIPSEL -U__MIPSEL -U__MIPSEL__ -D_MIPSEB -D__MIPSEB -D__MIPSEB__ %{!ansi:-DMIPSEB}} \
                     73: %{EL:-UMIPSEB -U_MIPSEB -U__MIPSEB -U__MIPSEB__ -D_MIPSEL -D__MIPSEL -D__MIPSEL__ %{!ansi:-DMIPSEL}}"
                     74: 
                     75: #undef EMPTY_FIELD_BOUNDARY
                     76: #define EMPTY_FIELD_BOUNDARY   32
                     77: 
                     78: #undef STACK_BOUNDARY
                     79: #define STACK_BOUNDARY 128
                     80: 
                     81: #undef MIPS_STACK_ALIGN
                     82: #define MIPS_STACK_ALIGN(LOC) (((LOC)+15) & ~15)
                     83: 
                     84: #undef GP_ARG_LAST
                     85: #define GP_ARG_LAST  (mips_isa < 3 ? GP_REG_FIRST + 7 : GP_REG_FIRST + 11)
                     86: #undef FP_ARG_LAST
                     87: #define FP_ARG_LAST  (mips_isa < 3 ? FP_REG_FIRST + 15 : FP_REG_FIRST + 19)
                     88: 
                     89: /* fp20-23 are now caller saved.  */
                     90: #undef SUBTARGET_CONDITIONAL_REGISTER_USAGE
                     91: #define SUBTARGET_CONDITIONAL_REGISTER_USAGE \
                     92: {                                                                      \
                     93:   if (mips_isa >= 3)                                                   \
                     94:     {                                                                  \
                     95:       int regno;                                                       \
                     96:       for (regno = FP_REG_FIRST + 20; regno < FP_REG_FIRST + 24; regno++) \
                     97:        call_used_regs[regno] = 1;                                      \
                     98:     }                                                                  \
                     99: }
                    100: 
                    101: #undef MAX_ARGS_IN_REGISTERS
                    102: #define MAX_ARGS_IN_REGISTERS  (mips_isa < 3 ? 4 : 8)
                    103: 
                    104: #undef REG_PARM_STACK_SPACE
                    105: #define REG_PARM_STACK_SPARC(FNDECL)                                    \
                    106:   (mips_abi < 3                                                                 \
                    107:    ? (MAX_ARGS_IN_REGISTERS*UNITS_PER_WORD) - FIRST_PARM_OFFSET (FNDECL) \
                    108:    : 0)
                    109: 
                    110: #define FUNCTION_ARG_PADDING(MODE, TYPE)                               \
                    111:   (! BYTES_BIG_ENDIAN                                                  \
                    112:    ? upward                                                            \
                    113:    : (((MODE) == BLKmode                                               \
                    114:        ? ((TYPE) && TREE_CODE (TYPE_SIZE (TYPE)) == INTEGER_CST                \
                    115:          && int_size_in_bytes (TYPE) < (PARM_BOUNDARY / BITS_PER_UNIT))\
                    116:        : (GET_MODE_BITSIZE (MODE) < PARM_BOUNDARY                      \
                    117:          && (mips_isa < 3 || GET_MODE_CLASS (MODE) == MODE_INT)))      \
                    118:       ? downward : upward))
                    119: 
                    120: extern struct rtx_def *type_dependent_reg ();
                    121: #define TYPE_DEPENDENT_REG(REGNO, INDEX, TYPE) \
                    122:   type_dependent_reg (REGNO, INDEX, TYPE)
                    123: 
                    124: #undef RETURN_IN_MEMORY
                    125: #define RETURN_IN_MEMORY(TYPE) \
                    126:   (mips_isa < 3 ? TYPE_MODE (TYPE) == BLKmode : int_size_in_bytes (TYPE) > 16)
                    127: 
                    128: extern struct rtx_def *mips_function_value ();
                    129: #undef FUNCTION_VALUE
                    130: #define FUNCTION_VALUE(VALTYPE, FUNC)  mips_function_value (VALTYPE, FUNC)
                    131: 
                    132: /* For varargs, we must save the current argument, because it is the fake
                    133:    argument va_alist, and will need to be converted to the real argument.
                    134:    For stdarg, we do not need to save the current argument, because it
                    135:    is a real argument.  */
                    136: #define SETUP_INCOMING_VARARGS(CUM,MODE,TYPE,PRETEND_SIZE,NO_RTL)      \
                    137: { if (mips_isa >= 3                                                    \
                    138:       && ((CUM).arg_words                                              \
                    139:          < (MAX_ARGS_IN_REGISTERS - ! current_function_varargs)))      \
                    140:     {                                                                  \
                    141:       PRETEND_SIZE                                                     \
                    142:        = (MAX_ARGS_IN_REGISTERS - (CUM).arg_words                      \
                    143:           - ! current_function_varargs) * UNITS_PER_WORD;              \
                    144:                                                                        \
                    145:       if (! (NO_RTL))                                                  \
                    146:        {                                                               \
                    147:          rtx mem = gen_rtx (MEM, BLKmode, virtual_incoming_args_rtx);  \
                    148:          /* va_arg is an array access in this case, which causes it to \
                    149:             get MEM_IN_STRUCT_P set.  We must set it here so that the  \
                    150:             insn scheduler won't assume that these stores can't        \
                    151:             possibly overlap with the va_arg loads.  */                \
                    152:          if (BYTES_BIG_ENDIAN)                                         \
                    153:            MEM_IN_STRUCT_P (mem) = 1;                                  \
                    154:          move_block_from_reg                                           \
                    155:            ((CUM).arg_words + GP_ARG_FIRST + ! current_function_varargs, \
                    156:             mem,                                                       \
                    157:             (MAX_ARGS_IN_REGISTERS - (CUM).arg_words                   \
                    158:              - ! current_function_varargs),                            \
                    159:             PRETEND_SIZE);                                             \
                    160:        }                                                               \
                    161:     }                                                                  \
                    162: }
                    163: 
                    164: #define STRICT_ARGUMENT_NAMING
                    165: 
                    166: /* ??? Unimplemented stuff follows.  */
                    167: 
                    168: /* ??? Add support for 16 byte/128 bit long doubles here when
                    169:    mips_isa >= 3.  */
                    170: 
                    171: /* ??? Make main return zero if user did not specify return value.  */
                    172: 
                    173: /* ??? Add support for .interfaces section, so as to get linker warnings
                    174:    when stdarg functions called without prototype in scope?  */
                    175: 
                    176: /* ??? Could optimize structure passing by putting the right register rtx
                    177:    into the field decl, so that if we use the field, we can take the value from
                    178:    a register instead of from memory.  */
                    179: 

unix.superglobalmegacorp.com

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