Annotation of gcc/config/mips/abi64.h, revision 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.