OSDN Git Service

(ASM_RETURN_CASE_JUMP): Use extl to explicitly sign extend index
[pf3gnuchains/gcc-fork.git] / gcc / config / m68k / linux.h
1 /* Definitions for Motorola 68k running Linux with ELF format.
2    Copyright (C) 1995, 1996, 1997 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 1, 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 #define LINUX_DEFAULT_ELF
22 #define MOTOROLA                /* Use Motorola syntax */
23 #define USE_GAS                 /* But GAS wants jbsr instead of jsr */
24
25 #include <m68k/m68k.h>
26 #include <linux.h>              /* some common stuff */
27
28 #undef TARGET_VERSION
29 #define TARGET_VERSION fprintf (stderr, " (68k Linux/ELF)");
30
31 /* 68020 with 68881 */
32 #define TARGET_DEFAULT (MASK_BITFIELD|MASK_68881|MASK_68020)
33
34 /* for 68k machines this only needs to be TRUE for the 68000 */
35
36 #undef STRICT_ALIGNMENT     
37 #define STRICT_ALIGNMENT 0
38
39 #undef SUBTARGET_SWITCHES
40 #define SUBTARGET_SWITCHES      {"ieee-fp", 0},
41
42 /* Here are four prefixes that are used by asm_fprintf to
43    facilitate customization for alternate assembler syntaxes.
44    Machines with no likelihood of an alternate syntax need not
45    define these and need not use asm_fprintf.  */
46
47 /* The prefix for register names.  Note that REGISTER_NAMES
48    is supposed to include this prefix. Also note that this is NOT an
49    fprintf format string, it is a literal string */
50
51 #undef REGISTER_PREFIX
52 #define REGISTER_PREFIX "%"
53
54 /* The prefix for local (compiler generated) labels.
55    These labels will not appear in the symbol table. */
56
57 #undef LOCAL_LABEL_PREFIX
58 #define LOCAL_LABEL_PREFIX "."
59
60 /* The prefix to add to user-visible assembler symbols. */
61
62 #undef USER_LABEL_PREFIX
63 #define USER_LABEL_PREFIX ""
64
65 /* How to refer to registers in assembler output.
66    This sequence is indexed by compiler's hard-register-number.
67    Motorola format uses different register names than defined in m68k.h. */
68
69 #undef REGISTER_NAMES
70
71 #ifndef SUPPORT_SUN_FPA
72
73 #define REGISTER_NAMES \
74 {"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \
75  "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%sp", \
76  "%fp0", "%fp1", "%fp2", "%fp3", "%fp4", "%fp5", "%fp6", "%fp7" }
77
78 #else /* SUPPORTED_SUN_FPA */
79
80 #define REGISTER_NAMES \
81 {"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \
82  "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%sp", \
83  "%fp0", "%fp1", "%fp2", "%fp3", "%fp4", "%fp5", "%fp6", "%fp7", \
84  "%fpa0", "%fpa1", "%fpa2", "%fpa3", "%fpa4", "%fpa5", "%fpa6", "%fpa7", \
85  "%fpa8", "%fpa9", "%fpa10","%fpa11","%fpa12","%fpa13","%fpa14","%fpa15", \
86  "%fpa16","%fpa17","%fpa18","%fpa19","%fpa20","%fpa21","%fpa22","%fpa23", \
87  "%fpa24","%fpa25","%fpa26","%fpa27","%fpa28","%fpa29","%fpa30","%fpa31" }
88
89 #endif /* defined SUPPORT_SUN_FPA */
90
91 #undef SIZE_TYPE
92 #define SIZE_TYPE "unsigned int"
93  
94 #undef PTRDIFF_TYPE
95 #define PTRDIFF_TYPE "int"
96   
97 #undef WCHAR_TYPE
98 #define WCHAR_TYPE "long int"
99    
100 #undef WCHAR_TYPE_SIZE
101 #define WCHAR_TYPE_SIZE BITS_PER_WORD
102
103 #define CPP_PREDEFINES \
104   "-D__ELF__ -Dunix -Dmc68000 -Dmc68020 -Dlinux -Asystem(unix) -Asystem(posix) -Acpu(m68k) -Amachine(m68k)"
105
106 #undef CPP_SPEC
107 #if TARGET_DEFAULT & MASK_68881
108 #define CPP_SPEC \
109   "%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!msoft-float:-D__HAVE_68881__} %{posix:-D_POSIX_SOURCE}"
110 #else
111 #define CPP_SPEC \
112   "%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{m68881:-D__HAVE_68881__} %{posix:-D_POSIX_SOURCE}"
113 #endif
114
115 /* Provide a LINK_SPEC appropriate for Linux.  Here we provide support
116    for the special GCC options -static and -shared, which allow us to
117    link things in one of these three modes by applying the appropriate
118    combinations of options at link-time.  We like to support here for
119    as many of the other GNU linker options as possible.  But I don't
120    have the time to search for those flags.  I am sure how to add
121    support for -soname shared_object_name. H.J.
122
123    I took out %{v:%{!V:-V}}.  It is too much :-(.  They can use
124    -Wl,-V.
125
126    When the -shared link option is used a final link is not being
127    done.  */
128
129 /* If ELF is the default format, we should not use /lib/elf. */
130
131 #undef  LINK_SPEC
132 #ifndef LINUX_DEFAULT_ELF
133 #define LINK_SPEC "-m m68kelf %{shared} %{symbolic:-shared -Bsymbolic} \
134   %{!shared:%{!symbolic: \
135     %{!static: \
136       %{rdynamic:-export-dynamic} \
137       %{!dynamic-linker*:-dynamic-linker /lib/elf/ld-linux.so.1} \
138       %{!rpath*:-rpath /lib/elf/}} %{static}}}"
139 #else
140 #define LINK_SPEC "-m m68kelf %{shared} %{symbolic:-shared -Bsymbolic} \
141   %{!shared:%{!symbolic: \
142     %{!static: \
143       %{rdynamic:-export-dynamic} \
144       %{!dynamic-linker*:-dynamic-linker /lib/ld-linux.so.1}} \
145     %{static}}}"
146 #endif
147
148 /* For compatibility with linux/a.out */
149
150 #undef PCC_BITFIELD_TYPE_MATTERS
151
152 /* Currently, JUMP_TABLES_IN_TEXT_SECTION must be defined in order to
153    keep switch tables in the text section.  */
154    
155 #define JUMP_TABLES_IN_TEXT_SECTION 1
156
157 /* Use the default action for outputting the case label.  */
158 #undef ASM_OUTPUT_CASE_LABEL
159 #define ASM_RETURN_CASE_JUMP                    \
160   do {                                          \
161     if (TARGET_5200)                            \
162       return "ext%.l %0\n\tjmp %%pc@(2,%0:l)";  \
163     else                                        \
164       return "jmp %%pc@(2,%0:w)";               \
165   } while (0)
166
167 /* This is how to output an assembler line that says to advance the
168    location counter to a multiple of 2**LOG bytes.  */
169
170 #undef ASM_OUTPUT_ALIGN
171 #define ASM_OUTPUT_ALIGN(FILE,LOG)                              \
172   if ((LOG) > 0)                                                \
173     fprintf ((FILE), "\t%s \t%u\n", ALIGN_ASM_OP, 1 << (LOG));
174
175 /* If defined, a C expression whose value is a string containing the
176    assembler operation to identify the following data as uninitialized global
177    data.  */
178
179 #define BSS_SECTION_ASM_OP ".section\t.bss"
180
181 /* A C statement (sans semicolon) to output to the stdio stream
182    FILE the assembler definition of uninitialized global DECL named
183    NAME whose size is SIZE bytes and alignment is ALIGN bytes.
184    Try to use asm_output_aligned_bss to implement this macro.  */
185
186 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
187   asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
188
189 /* Output assembler code to FILE to increment profiler label # LABELNO
190    for profiling a function entry.  */
191
192 #undef FUNCTION_PROFILER
193 #define FUNCTION_PROFILER(FILE, LABELNO) \
194 {                                                                       \
195   asm_fprintf (FILE, "\tlea (%LLP%d,%Rpc),%Ra1\n", (LABELNO));          \
196   if (flag_pic)                                                         \
197     fprintf (FILE, "\tbsr.l _mcount@PLTPC\n");                          \
198   else                                                                  \
199     fprintf (FILE, "\tjbsr _mcount\n");                                 \
200 }
201
202 /* Register in which address to store a structure value is passed to a
203    function.  The default in m68k.h is a1.  For m68k/SVR4 it is a0. */
204
205 #undef STRUCT_VALUE_REGNUM
206 #define STRUCT_VALUE_REGNUM 8
207
208 /* Register in which static-chain is passed to a function.  The
209    default in m68k.h is a0, but that is already the struct value
210    regnum.  Make it a1 instead.  */
211
212 #undef STATIC_CHAIN_REGNUM
213 #define STATIC_CHAIN_REGNUM 9
214
215 /* How to renumber registers for dbx and gdb.
216    On the Sun-3, the floating point registers have numbers
217    18 to 25, not 16 to 23 as they do in the compiler.  */
218
219 #define DBX_REGISTER_NUMBER(REGNO) ((REGNO) < 16 ? (REGNO) : (REGNO) + 2)
220
221 /* Do not break .stabs pseudos into continuations.  */
222
223 #define DBX_CONTIN_LENGTH 0
224
225 /* Allow folding division by zero.  */
226 #define REAL_INFINITY
227
228 /* 1 if N is a possible register number for a function value.  For
229    m68k/SVR4 allow d0, a0, or fp0 as return registers, for integral,
230    pointer, or floating types, respectively.  Reject fp0 if not using
231    a 68881 coprocessor.  */
232
233 #undef FUNCTION_VALUE_REGNO_P
234 #define FUNCTION_VALUE_REGNO_P(N) \
235   ((N) == 0 || (N) == 8 || (TARGET_68881 && (N) == 16))
236
237 /* Define this to be true when FUNCTION_VALUE_REGNO_P is true for
238    more than one register.  */
239
240 #undef NEEDS_UNTYPED_CALL
241 #define NEEDS_UNTYPED_CALL 1
242
243 /* Define how to generate (in the callee) the output value of a
244    function and how to find (in the caller) the value returned by a
245    function.  VALTYPE is the data type of the value (as a tree).  If
246    the precise function being called is known, FUNC is its
247    FUNCTION_DECL; otherwise, FUNC is 0.  For m68k/SVR4 generate the
248    result in d0, a0, or fp0 as appropriate. */
249    
250 #undef FUNCTION_VALUE
251 #define FUNCTION_VALUE(VALTYPE, FUNC)                                   \
252   (TREE_CODE (VALTYPE) == REAL_TYPE && TARGET_68881                     \
253    ? gen_rtx (REG, TYPE_MODE (VALTYPE), 16)                             \
254    : (POINTER_TYPE_P (VALTYPE)                                          \
255       ? gen_rtx (REG, TYPE_MODE (VALTYPE), 8)                           \
256       : gen_rtx (REG, TYPE_MODE (VALTYPE), 0)))
257
258 /* For compatibility with the large body of existing code which does
259    not always properly declare external functions returning pointer
260    types, the m68k/SVR4 convention is to copy the value returned for
261    pointer functions from a0 to d0 in the function epilogue, so that
262    callers that have neglected to properly declare the callee can
263    still find the correct return value.  */
264
265 extern int current_function_returns_pointer;
266 #define FUNCTION_EXTRA_EPILOGUE(FILE, SIZE)                             \
267 do {                                                                    \
268   if ((current_function_returns_pointer) &&                             \
269       ! find_equiv_reg (0, get_last_insn (), 0, 0, 0, 8, Pmode))        \
270     asm_fprintf (FILE, "\tmove.l %Ra0,%Rd0\n");                         \
271 } while (0);
272
273 /* Define how to find the value returned by a library function
274    assuming the value has mode MODE.
275    For m68k/SVR4 look for integer values in d0, pointer values in d0
276    (returned in both d0 and a0), and floating values in fp0.  */
277
278 #undef LIBCALL_VALUE
279 #define LIBCALL_VALUE(MODE)                                             \
280   ((((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode)          \
281     && TARGET_68881)                                                    \
282    ? gen_rtx (REG, (MODE), 16)                                          \
283    : gen_rtx (REG, (MODE), 0))
284
285 /* In m68k svr4, a symbol_ref rtx can be a valid PIC operand if it is
286    an operand of a function call. */
287 #undef LEGITIMATE_PIC_OPERAND_P
288 #define LEGITIMATE_PIC_OPERAND_P(X) \
289   ((! symbolic_operand (X, VOIDmode) \
290     && ! (GET_CODE (X) == CONST_DOUBLE && CONST_DOUBLE_MEM (X)  \
291           && GET_CODE (CONST_DOUBLE_MEM (X)) == MEM             \
292           && symbolic_operand (XEXP (CONST_DOUBLE_MEM (X), 0), VOIDmode))) \
293    || (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X)))
294
295 /* Turn off function cse if we are doing PIC. We always want function
296    call to be done as `bsr foo@PLTPC', so it will force the assembler
297    to create the PLT entry for `foo'.  Doing function cse will cause
298    the address of `foo' to be loaded into a register, which is exactly
299    what we want to avoid when we are doing PIC on svr4 m68k.  */
300 #undef SUBTARGET_OVERRIDE_OPTIONS
301 #define SUBTARGET_OVERRIDE_OPTIONS \
302   if (flag_pic) flag_no_function_cse = 1;
303
304 /* For m68k SVR4, structures are returned using the reentrant
305    technique. */
306 #undef PCC_STATIC_STRUCT_RETURN
307 #define DEFAULT_PCC_STRUCT_RETURN 0
308
309 /* Emit RTL insns to initialize the variable parts of a trampoline.
310    FNADDR is an RTX for the address of the function's pure code.
311    CXT is an RTX for the static chain value for the function.  */
312
313 /* This is different from the generic version in that we use a1 as the
314    static call chain.  */
315
316 #undef INITIALIZE_TRAMPOLINE
317 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT)                       \
318 {                                                                       \
319   emit_move_insn (gen_rtx (MEM, HImode, TRAMP), GEN_INT (0x227C));      \
320   emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 2)), CXT); \
321   emit_move_insn (gen_rtx (MEM, HImode, plus_constant (TRAMP, 6)),      \
322                   GEN_INT (0x4EF9));                                    \
323   emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 8)), FNADDR); \
324   FINALIZE_TRAMPOLINE (TRAMP);                                          \
325 }
326
327 /* Finalize the trampoline by flushing the insn cache.  */
328
329 #undef FINALIZE_TRAMPOLINE
330 #define FINALIZE_TRAMPOLINE(TRAMP)                                      \
331   emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__clear_cache"),      \
332                      0, VOIDmode, 2, TRAMP, Pmode,                      \
333                      plus_constant (TRAMP, TRAMPOLINE_SIZE), Pmode);
334
335 /* Clear the instruction cache from `beg' to `end'.  This makes an
336    inline system call to SYS_cacheflush.  The arguments are as
337    follows:
338
339         cacheflush (addr, scope, cache, len)
340
341    addr   - the start address for the flush
342    scope  - the scope of the flush (see the cpush insn)
343    cache  - which cache to flush (see the cpush insn)
344    len    - a factor relating to the number of flushes to perform:
345             len/16 lines, or len/4096 pages.  */
346
347 #define CLEAR_INSN_CACHE(BEG, END)                                      \
348 {                                                                       \
349   register unsigned long _beg __asm ("%d1") = (unsigned long) (BEG);    \
350   unsigned long _end = (unsigned long) (END);                           \
351   register unsigned long _len __asm ("%d4") = (_end - _beg + 32);       \
352   __asm __volatile                                                      \
353     ("move%.l %#123, %/d0\n\t"  /* system call nr */                    \
354      "move%.l %#1, %/d2\n\t"    /* clear lines */                       \
355      "move%.l %#3, %/d3\n\t"    /* insn+data caches */                  \
356      "trap %#0"                                                         \
357      : /* no outputs */                                                 \
358      : "d" (_beg), "d" (_len)                                           \
359      : "%d0", "%d2", "%d3");                                            \
360 }
361 \f
362 /* Output code to add DELTA to the first argument, and then jump to FUNCTION.
363    Used for C++ multiple inheritance.  */
364 #define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION)        \
365 do {                                                                    \
366   if (DELTA > 0 && DELTA <= 8)                                          \
367     asm_fprintf (FILE, "\taddq.l %I%d,4(%Rsp)\n", DELTA);               \
368   else if (DELTA < 0 && DELTA >= -8)                                    \
369     asm_fprintf (FILE, "\tsubq.l %I%d,4(%Rsp)\n", -DELTA);              \
370   else                                                                  \
371     asm_fprintf (FILE, "\tadd.l %I%d,4(%Rsp)\n", DELTA);                \
372                                                                         \
373   if (flag_pic)                                                         \
374     {                                                                   \
375       fprintf (FILE, "\tbra.l ");                                       \
376       assemble_name                                                     \
377         (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION)));    \
378       fprintf (FILE, "@PLTPC\n");                                       \
379     }                                                                   \
380   else                                                                  \
381     {                                                                   \
382       fprintf (FILE, "\tjmp ");                                         \
383       assemble_name                                                     \
384         (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION)));    \
385       fprintf (FILE, "\n");                                             \
386     }                                                                   \
387 } while (0)