OSDN Git Service

Split movdf so it can go into a branch delay slot.
[pf3gnuchains/gcc-fork.git] / gcc / config / m88k / sysv3.h
1 /* Definitions of target machine for GNU compiler.
2    Motorola m88100 running the AT&T/Unisoft/Motorola V.3 reference port.
3    Copyright (C) 1990, 1991 Free Software Foundation, Inc.
4    Contributed by Ray Essick (ressick@mot.com)
5    Enhanced by Tom Wood (Tom_Wood@NeXT.com)
6
7 This file is part of GNU CC.
8
9 GNU CC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
13
14 GNU CC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GNU CC; see the file COPYING.  If not, write to
21 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
22
23 #include "m88k/m88k.h"
24
25 /* Default switches */
26 #undef  TARGET_DEFAULT
27 #define TARGET_DEFAULT  (MASK_CHECK_ZERO_DIV    | \
28                          MASK_OCS_DEBUG_INFO    | \
29                          MASK_OCS_FRAME_POSITION)
30
31 /* Macros to be automatically defined.  */
32 #undef  CPP_PREDEFINES
33 #define CPP_PREDEFINES "-Dm88000 -Dm88k -Dunix -DsysV88 -D__CLASSIFY_TYPE__=2 -Asystem(unix) -Asystem(svr3) -Acpu(m88k) -Amachine(m88k)"
34
35 /* Override svr3.h to link with ?crt0.o instead of ?crt1.o and ?crtn.o.
36    From arul@sdsu.edu.  */
37 #undef  STARTFILE_SPEC
38 #define STARTFILE_SPEC \
39    "%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}} crtbegin.o%s"
40
41 /* Profiled libraries live in a different directory but keep the same
42    names other than that.  arul@sdsu.edu says -lg is always needed.  */
43 #undef  LIB_SPEC
44 #define LIB_SPEC "%{p:-L/lib/libp}%{pg:%{!p:-L/lib/libp}} -lg -lc crtend.o%s"
45
46 /* Hot version of the profiler that uses r10 to pass the address of
47    the counter.  the _gcc_mcount routine knows not to screw with
48    the parameter registers.
49
50    DG/UX does this; i wrote a gnu-c/88k specific version and put it
51    in libgcc2.c -- RBE; this macro knows about the leading underscore
52    convention.  */
53 #undef  FUNCTION_PROFILER
54 #define FUNCTION_PROFILER(FILE, LABELNO) \
55   output_function_profiler (FILE, LABELNO, "_gcc_mcount", 0)
56
57 /* Various other changes that we want to have in place without
58    too many changes to the m88k.h file.  */
59 #undef  USE_LIBG
60 #define USE_LIBG
61
62 /* Define a few machine-specific details of the implementation of
63    constructors.  */
64
65 /* Although the .init section is used, it is not automatically invoked.  */
66 #define INVOKE__main
67
68 /* State that atexit exists so __do_global_ctors will register
69    __do_global_dtors.  */
70 #define HAVE_ATEXIT
71
72 #define CTOR_LIST_BEGIN                 \
73   asm (INIT_SECTION_ASM_OP);            \
74   asm ("\tsubu\t r31,r31,16");  /* (STACK_BOUNDARY / BITS_PER_UNIT) == 16 */ \
75   asm ("\tst\t r0,r31,32");     /* REG_PARM_STACK_SPACE (0) == 32 */
76 #define CTOR_LIST_END
77
78 /* ASM_OUTPUT_CONSTRUCTOR outputs code into the .init section to push the
79    address of the constructor.  This becomes the body of __do_global_ctors
80    in crtstuff.c.  r13 is a temporary register.  */
81 #undef  ASM_OUTPUT_CONSTRUCTOR
82 #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)                               \
83   do {                                                                  \
84     init_section ();                                                    \
85     fprintf (FILE, "\tor.u\t r13,r0,hi16(");                            \
86     assemble_name (FILE, NAME);                                         \
87     fprintf (FILE, ")\n\tor\t r13,r13,lo16(");                          \
88     assemble_name (FILE, NAME);                                         \
89     fprintf (FILE, ")\n\tsubu\t r31,r31,%d\n\tst\t r13,r31,%d\n",       \
90              STACK_BOUNDARY / BITS_PER_UNIT, REG_PARM_STACK_SPACE (0)); \
91   } while (0)
92
93 #undef  DO_GLOBAL_CTORS_BODY
94 #define DO_GLOBAL_CTORS_BODY                                            \
95 do {                                                                    \
96   func_ptr *__CTOR_LIST__ = __builtin_alloca (0), *p;                   \
97   for (p = __CTOR_LIST__; *p; p += 4)                                   \
98     (*p) ();                                                            \
99 } while (0)
100
101 #define DTOR_LIST_BEGIN                                                 \
102   asm (FINI_SECTION_ASM_OP);                                            \
103   func_ptr __DTOR_LIST__[4] = { (func_ptr) (-1), (func_ptr) (-1),       \
104                                 (func_ptr) (-1), (func_ptr) (-1) }
105 #define DTOR_LIST_END                                                   \
106   asm (FINI_SECTION_ASM_OP);                                            \
107   func_ptr __DTOR_END__[4] = { (func_ptr) 0, (func_ptr) 0,              \
108                                (func_ptr) 0, (func_ptr) 0 }  
109
110 /* A C statement (sans semicolon) to output an element in the table of
111    global destructors.  The table is constructed in the .fini section
112    so that an explicit linker script is not required.  The complication
113    is that this section is padded with NOP instructions and to either
114    8 or 16 byte alignment depending on the specific system.  A clever
115    way to avoid trouble is to output a block of 16 bytes where the
116    extra words are known values (-1).  */
117 #undef  ASM_OUTPUT_DESTRUCTOR
118 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)        \
119   do {                                          \
120     register int i;                             \
121     fini_section ();                            \
122     fprintf (FILE, "\t%s\t ", ASM_LONG);        \
123     assemble_name (FILE,NAME);                  \
124     fprintf (FILE, "\n");                       \
125     for (i = 1; i < 4; i++)                     \
126       fprintf (FILE, "\t%s\t -1\n", ASM_LONG);  \
127     } while (0)
128
129 /* Walk the list looking for the terminating zero and ignoring all values of
130    -1.  */
131 #undef  DO_GLOBAL_DTORS_BODY
132 #define DO_GLOBAL_DTORS_BODY                    \
133   do {                                          \
134     int i;                                      \
135     for (i = 0; __DTOR_LIST__[i] != 0; i++)     \
136       if (((int *)__DTOR_LIST__)[i] != -1)      \
137         __DTOR_LIST__[i] ();                    \
138   } while (0)