OSDN Git Service

Add NIOS2 support. Code from SourceyG++.
[pf3gnuchains/gcc-fork.git] / gcc / config / nios2 / nios2.h
1 /* Definitions of target machine for Altera Nios II.
2    Copyright (C) 2012 Free Software Foundation, Inc.
3    Contributed by Jonah Graham (jgraham@altera.com), 
4    Will Reece (wreece@altera.com), and Jeff DaSilva (jdasilva@altera.com).
5    Contributed by Mentor Graphics, Inc.
6
7    This file is part of GCC.
8
9    GCC is free software; you can redistribute it and/or modify it
10    under the terms of the GNU General Public License as published
11    by the Free Software Foundation; either version 3, or (at your
12    option) any later version.
13
14    GCC is distributed in the hope that it will be useful, but WITHOUT
15    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
17    License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with GCC; see the file COPYING3.  If not see
21    <http://www.gnu.org/licenses/>.  */
22
23 #ifndef GCC_NIOS2_H
24 #define GCC_NIOS2_H
25
26 /* FPU insn codes declared here.  */
27 #include "config/nios2/nios2-opts.h"
28
29 /* Define built-in preprocessor macros.  */
30 #define TARGET_CPU_CPP_BUILTINS()                   \
31   do                                                \
32     {                                               \
33       builtin_define_std ("NIOS2");                 \
34       builtin_define_std ("nios2");                 \
35       if (TARGET_BIG_ENDIAN)                        \
36         builtin_define_std ("nios2_big_endian");    \
37       else                                          \
38         builtin_define_std ("nios2_little_endian"); \
39     }                                               \
40   while (0)
41
42 /* We're little endian, unless otherwise specified by defining
43    BIG_ENDIAN_FLAG.  */
44 #ifndef TARGET_ENDIAN_DEFAULT
45 # define TARGET_ENDIAN_DEFAULT 0
46 #endif
47
48 /* Default target_flags if no switches specified.  */
49 #ifndef TARGET_DEFAULT
50 # define TARGET_DEFAULT (MASK_HAS_MUL | TARGET_ENDIAN_DEFAULT)
51 #endif
52
53 #define CC1_SPEC "%{G*}"
54
55 #if TARGET_ENDIAN_DEFAULT == 0
56 # define ASM_SPEC "%{!meb:-EL} %{meb:-EB}"
57 # define LINK_SPEC_ENDIAN "%{!meb:-EL} %{meb:-EB}"
58 # define MULTILIB_DEFAULTS { "EL" }
59 #else
60 # define ASM_SPEC "%{!mel:-EB} %{mel:-EL}"
61 # define LINK_SPEC_ENDIAN "%{!mel:-EB} %{mel:-EL}"
62 # define MULTILIB_DEFAULTS { "EB" }
63 #endif
64
65 #define LINK_SPEC LINK_SPEC_ENDIAN \
66   " %{shared:-shared} \
67     %{static:-Bstatic}"
68
69
70 /* Storage Layout.  */
71
72 #define DEFAULT_SIGNED_CHAR 1
73 #define BITS_BIG_ENDIAN 0
74 #define BYTES_BIG_ENDIAN (TARGET_BIG_ENDIAN != 0)
75 #define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN != 0)
76 #define BITS_PER_UNIT 8
77 #define BITS_PER_WORD 32
78 #define UNITS_PER_WORD 4
79 #define POINTER_SIZE 32
80 #define BIGGEST_ALIGNMENT 32
81 #define STRICT_ALIGNMENT 1
82 #define FUNCTION_BOUNDARY 32
83 #define PARM_BOUNDARY 32
84 #define STACK_BOUNDARY 32
85 #define PREFERRED_STACK_BOUNDARY 32
86 #define MAX_FIXED_MODE_SIZE 64
87
88 #define CONSTANT_ALIGNMENT(EXP, ALIGN)                          \
89   ((TREE_CODE (EXP) == STRING_CST)                              \
90    && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
91
92
93 /* Layout of Source Language Data Types.  */
94
95 #define INT_TYPE_SIZE 32
96 #define SHORT_TYPE_SIZE 16
97 #define LONG_TYPE_SIZE 32
98 #define LONG_LONG_TYPE_SIZE 64
99 #define FLOAT_TYPE_SIZE 32
100 #define DOUBLE_TYPE_SIZE 64
101 #define LONG_DOUBLE_TYPE_SIZE DOUBLE_TYPE_SIZE
102
103 #undef SIZE_TYPE
104 #define SIZE_TYPE "unsigned int"
105
106 #undef PTRDIFF_TYPE
107 #define PTRDIFF_TYPE "int"
108
109
110 /* Basic Characteristics of Registers:
111 Register Number
112       Register Name
113           Alternate Name
114                 Purpose
115 0     r0  zero  always zero
116 1     r1  at    Assembler Temporary
117 2-3   r2-r3     Return Location
118 4-7   r4-r7     Register Arguments
119 8-15  r8-r15    Caller Saved Registers
120 16-22 r16-r22   Callee Saved Registers
121 22    r22       Global Offset Table pointer (Linux ABI only)
122 23    r23       Thread pointer (Linux ABI only)
123 24    r24 et    Exception Temporary
124 25    r25 bt    Breakpoint Temporary
125 26    r26 gp    Global Pointer
126 27    r27 sp    Stack Pointer
127 28    r28 fp    Frame Pointer
128 29    r29 ea    Exception Return Address
129 30    r30 ba    Breakpoint Return Address
130 31    r31 ra    Return Address
131
132 32    ctl0 status
133 33    ctl1 estatus STATUS saved by exception ?
134 34    ctl2 bstatus STATUS saved by break ?
135 35    ctl3 ipri    Interrupt Priority Mask ?
136 36    ctl4 ecause  Exception Cause ?
137
138 37    pc       Not an actual register
139
140 38    fake_fp  Fake Frame Pointer which will always be eliminated.
141 39    fake_ap  Fake Argument Pointer which will always be eliminated.
142
143 40             First Pseudo Register
144
145 In addition, r12 is used as the static chain register and r13, r14, and r15
146 are clobbered by PLT code sequences.  
147
148 The definitions for all the hard register numbers
149 are located in nios2.md.
150 */
151
152 #define ET_REGNO (24)
153 #define GP_REGNO (26)
154 #define SP_REGNO (27)
155 #define FP_REGNO (28)
156 #define EA_REGNO (29)
157 #define RA_REGNO (31)
158 #define FIRST_RETVAL_REGNO (2)
159 #define LAST_RETVAL_REGNO (3)
160 #define FIRST_ARG_REGNO (4)
161 #define LAST_ARG_REGNO (7)
162 #define SC_REGNO (12)
163 #define PC_REGNO (37)
164 #define FAKE_FP_REGNO (38)
165 #define FAKE_AP_REGNO (39)
166
167 #define FIRST_PSEUDO_REGISTER 40
168 #define NUM_ARG_REGS (LAST_ARG_REGNO - FIRST_ARG_REGNO + 1)
169
170
171
172 #define FIXED_REGISTERS                      \
173   {                                          \
174 /*        +0  1  2  3  4  5  6  7  8  9 */   \
175 /*   0 */  1, 1, 0, 0, 0, 0, 0, 0, 0, 0,     \
176 /*  10 */  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,     \
177 /*  20 */  0, 0, TARGET_LINUX_ABI, TARGET_LINUX_ABI, 1, 1, 1, 1, 0, 1,     \
178 /*  30 */  1, 0, 1, 1, 1, 1, 1, 1, 1, 1,     \
179   }
180
181 /* call used is the same as caller saved
182    + fixed regs + args + ret vals */
183 #define CALL_USED_REGISTERS                  \
184   {                                          \
185 /*        +0  1  2  3  4  5  6  7  8  9 */   \
186 /*   0 */  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,     \
187 /*  10 */  1, 1, 1, 1, 1, 1, 0, 0, 0, 0,     \
188 /*  20 */  0, 0, TARGET_LINUX_ABI, TARGET_LINUX_ABI, 1, 1, 1, 1, 0, 1,     \
189 /*  30 */  1, 0, 1, 1, 1, 1, 1, 1, 1, 1,     \
190   }
191
192 #define THREAD_POINTER_REGNUM 23
193
194 #define HARD_REGNO_NREGS(REGNO, MODE)            \
195   ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1)   \
196    / UNITS_PER_WORD)
197
198 #define HARD_REGNO_MODE_OK(REGNO, MODE) 1
199 #define MODES_TIEABLE_P(MODE1, MODE2) 1
200
201 /* Register Classes.  */
202
203 enum reg_class
204 {
205   NO_REGS,
206   D00_REG,
207   D01_REG,
208   D02_REG,
209   D03_REG,
210   D04_REG,
211   D05_REG,
212   D06_REG,
213   D07_REG,
214   D08_REG,
215   D09_REG,
216   D10_REG,
217   D11_REG,
218   D12_REG,
219   D13_REG,
220   D14_REG,
221   D15_REG,
222   D16_REG,
223   D17_REG,
224   D18_REG,
225   D19_REG,
226   D20_REG,
227   D21_REG,
228   D22_REG,
229   D23_REG,
230   D24_REG,
231   D25_REG,
232   D26_REG,
233   D27_REG,
234   D28_REG,
235   D29_REG,
236   D30_REG,
237   D31_REG,
238   SIB_REGS,
239   GP_REGS,
240   ALL_REGS,
241   LIM_REG_CLASSES
242 };
243
244 #define N_REG_CLASSES (int) LIM_REG_CLASSES
245
246 #define REG_CLASS_NAMES   \
247   {  "NO_REGS",           \
248      "D00_REG",   \
249      "D01_REG",   \
250      "D02_REG",           \
251      "D03_REG",           \
252      "D04_REG",           \
253      "D05_REG",           \
254      "D06_REG",           \
255      "D07_REG",           \
256      "D08_REG",           \
257      "D09_REG",           \
258      "D10_REG",           \
259      "D11_REG",           \
260      "D12_REG",           \
261      "D13_REG",           \
262      "D14_REG",           \
263      "D15_REG",           \
264      "D16_REG",           \
265      "D17_REG",           \
266      "D18_REG",           \
267      "D19_REG",           \
268      "D20_REG",           \
269      "D21_REG",           \
270      "D22_REG",           \
271      "D23_REG",           \
272      "D24_REG",           \
273      "D25_REG",           \
274      "D26_REG",           \
275      "D27_REG",           \
276      "D28_REG",           \
277      "D29_REG",           \
278      "D30_REG",           \
279      "D31_REG",           \
280      "SIB_REGS",          \
281      "GP_REGS",           \
282      "ALL_REGS" }
283
284 #define GENERAL_REGS ALL_REGS
285
286 #define REG_CLASS_CONTENTS   \
287 /* NO_REGS  */       {{ 0, 0},     \
288 /* D00_REG  */        { 1 << 0, 0},    \
289 /* D01_REG  */        { 1 << 1, 0},    \
290 /* D02_REG  */        { 1 << 2, 0},    \
291 /* D03_REG  */        { 1 << 3, 0},    \
292 /* D04_REG  */        { 1 << 4, 0},    \
293 /* D05_REG  */        { 1 << 5, 0},    \
294 /* D06_REG  */        { 1 << 6, 0},    \
295 /* D07_REG  */        { 1 << 7, 0},    \
296 /* D08_REG  */        { 1 << 8, 0},    \
297 /* D09_REG  */        { 1 << 9, 0},    \
298 /* D10_REG  */        { 1 << 10, 0},    \
299 /* D11_REG  */        { 1 << 11, 0},    \
300 /* D12_REG  */        { 1 << 12, 0},    \
301 /* D13_REG  */        { 1 << 13, 0},    \
302 /* D14_REG  */        { 1 << 14, 0},    \
303 /* D15_REG  */        { 1 << 15, 0},    \
304 /* D16_REG  */        { 1 << 16, 0},    \
305 /* D17_REG  */        { 1 << 17, 0},    \
306 /* D18_REG  */        { 1 << 18, 0},    \
307 /* D19_REG  */        { 1 << 19, 0},    \
308 /* D20_REG  */        { 1 << 20, 0},    \
309 /* D21_REG  */        { 1 << 21, 0},    \
310 /* D22_REG  */        { 1 << 22, 0},    \
311 /* D23_REG  */        { 1 << 23, 0},    \
312 /* D24_REG  */        { 1 << 24, 0},    \
313 /* D25_REG  */        { 1 << 25, 0},    \
314 /* D26_REG  */        { 1 << 26, 0},    \
315 /* D27_REG  */        { 1 << 27, 0},    \
316 /* D28_REG  */        { 1 << 28, 0},    \
317 /* D29_REG  */        { 1 << 29, 0},    \
318 /* D30_REG  */        { 1 << 30, 0},    \
319 /* D31_REG  */        { 1 << 31, 0},    \
320 /* SIB_REGS */        { 0xfe0c, 0},     \
321 /* GP_REGS  */        {~0, 0},    \
322 /* ALL_REGS */        {~0,~0}}    \
323
324 #define GP_REGNO_P(REGNO) ((REGNO) < 32)
325 #define REGNO_REG_CLASS(REGNO) (GP_REGNO_P (REGNO) ? GP_REGS : ALL_REGS)
326
327 #define BASE_REG_CLASS ALL_REGS
328 #define INDEX_REG_CLASS ALL_REGS
329
330 #define REGNO_OK_FOR_BASE_P2(REGNO, STRICT) \
331   ((STRICT)                                 \
332    ? (REGNO) < FIRST_PSEUDO_REGISTER        \
333    : ((REGNO) < FIRST_PSEUDO_REGISTER                                   \
334       || (reg_renumber && reg_renumber[REGNO] < FIRST_PSEUDO_REGISTER)))
335
336 #define REGNO_OK_FOR_INDEX_P2(REGNO, STRICT) \
337   (REGNO_OK_FOR_BASE_P2 (REGNO, STRICT))
338
339 #define REGNO_OK_FOR_BASE_P(REGNO) \
340   (REGNO_OK_FOR_BASE_P2 (REGNO, 1))
341
342 #define REGNO_OK_FOR_INDEX_P(REGNO) \
343   (REGNO_OK_FOR_INDEX_P2 (REGNO, 1))
344
345 #define REG_OK_FOR_BASE_P2(X, STRICT)                                   \
346   (STRICT                                                               \
347    ? REGNO_OK_FOR_BASE_P2 (REGNO (X), 1)                                \
348    : (REGNO_OK_FOR_BASE_P2 (REGNO (X), 1)                               \
349       || REGNO(X) >= FIRST_PSEUDO_REGISTER))
350
351 #define REG_OK_FOR_INDEX_P2(X, STRICT)                                  \
352   (STRICT                                                               \
353    ? REGNO_OK_FOR_INDEX_P2 (REGNO (X), 1)                               \
354    : (REGNO_OK_FOR_INDEX_P2 (REGNO (X), 1)                              \
355       || REGNO(X) >= FIRST_PSEUDO_REGISTER))
356
357 #define CLASS_MAX_NREGS(CLASS, MODE)             \
358   ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1)   \
359    / UNITS_PER_WORD)
360
361 #define SMALL_INT(X) ((X) >= -0x8000 && (X) < 0x8000)
362 #define SMALL_INT_UNSIGNED(X) ((X) >= 0 && (X) < 0x10000)
363 #define UPPER16_INT(X) (((X) & 0xffff) == 0)
364 #define SHIFT_INT(X) ((X) >= 0 && (X) <= 31)
365 #define RDWRCTL_INT(X) ((X) >= 0 && (X) <= 31)
366 #define CUSTOM_INSN_OPCODE(X) ((X) >= 0 && (X) <= 255)
367
368 /* Say that the epilogue uses the return address register.  Note that
369    in the case of sibcalls, the values "used by the epilogue" are
370    considered live at the start of the called function.  */
371 #define EPILOGUE_USES(REGNO) ((REGNO) == RA_REGNO)
372
373 /* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
374    the stack pointer does not matter.  The value is tested only in
375    functions that have frame pointers.
376    No definition is equivalent to always zero.  */
377
378 #define EXIT_IGNORE_STACK 1
379
380 /* Trampolines use a 5-instruction sequence.  */
381 #define TRAMPOLINE_SIZE 20
382
383
384 /* Stack Layout and Calling Conventions.  */
385
386 /* The downward variants are used by the compiler,
387    the upward ones serve as documentation.  */
388 #define STACK_GROWS_DOWNWARD
389 #define FRAME_GROWS_UPWARD
390 #define ARGS_GROW_UPWARD
391
392 #define STARTING_FRAME_OFFSET 0
393 #define FIRST_PARM_OFFSET(FUNDECL) 0
394
395 /* Before the prologue, RA lives in r31.  */
396 #define INCOMING_RETURN_ADDR_RTX  gen_rtx_REG (VOIDmode, RA_REGNO)
397 #define RETURN_ADDR_RTX(C,F) nios2_get_return_address (C)
398
399 /* Registers That Address the Stack Frame.  */
400 #define STACK_POINTER_REGNUM SP_REGNO
401 #define STATIC_CHAIN_REGNUM SC_REGNO
402 #define PC_REGNUM PC_REGNO
403 #define DWARF_FRAME_RETURN_COLUMN RA_REGNO
404
405 /* Base register for access to local variables of the function.  We
406    pretend that the frame pointer is a non-existent hard register, and
407    then eliminate it to HARD_FRAME_POINTER_REGNUM. */
408 #define FRAME_POINTER_REGNUM FAKE_FP_REGNO
409
410 #define HARD_FRAME_POINTER_REGNUM FP_REGNO
411
412 /* The argument pointer needs to always be eliminated
413    so it is set to a fake hard register.  */
414 #define ARG_POINTER_REGNUM FAKE_AP_REGNO
415
416 /* The CFA includes the pretend args.  */
417 #define ARG_POINTER_CFA_OFFSET(FNDECL) \
418   (gcc_assert ((FNDECL) == current_function_decl), \
419    FIRST_PARM_OFFSET (FNDECL) + crtl->args.pretend_args_size)
420
421 /* Frame/arg pointer elimination settings.  */
422 #define ELIMINABLE_REGS                                                 \
423 {{ ARG_POINTER_REGNUM,   STACK_POINTER_REGNUM},                         \
424  { ARG_POINTER_REGNUM,   HARD_FRAME_POINTER_REGNUM},                    \
425  { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM},                         \
426  { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}}
427
428 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
429   (OFFSET) = nios2_initial_elimination_offset ((FROM), (TO))
430
431 /* Treat LOC as a byte offset from the stack pointer and round it up
432    to the next fully-aligned offset.  */
433 #define STACK_ALIGN(LOC)                                                \
434   (((LOC) + ((PREFERRED_STACK_BOUNDARY / 8) - 1))                       \
435    & ~((PREFERRED_STACK_BOUNDARY / 8) - 1))
436
437 /* Calling convention definitions.  */
438 typedef struct nios2_args
439 {
440   int regs_used;
441 } CUMULATIVE_ARGS;
442
443 /* This is to initialize the above unused CUM data type.  */
444 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
445   (nios2_init_cumulative_args (&CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS))
446
447 #define FUNCTION_ARG_PADDING(MODE, TYPE) \
448   (nios2_function_arg_padding ((MODE), (TYPE)))
449
450 #define PAD_VARARGS_DOWN \
451   (FUNCTION_ARG_PADDING (TYPE_MODE (type), type) == downward)
452
453 #define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \
454   (nios2_block_reg_padding ((MODE), (TYPE), (FIRST)))
455
456 #define FUNCTION_ARG_REGNO_P(REGNO) \
457   ((REGNO) >= FIRST_ARG_REGNO && (REGNO) <= LAST_ARG_REGNO)
458
459 /* Passing Function Arguments on the Stack.  */
460 #define PUSH_ARGS 0
461 #define ACCUMULATE_OUTGOING_ARGS 1
462
463 /* We define TARGET_RETURN_IN_MEMORY, so set to zero.  */
464 #define DEFAULT_PCC_STRUCT_RETURN 0
465
466 /* Profiling.  */
467 #define PROFILE_BEFORE_PROLOGUE
468 #define NO_PROFILE_COUNTERS 1
469 #define FUNCTION_PROFILER(FILE, LABELNO) \
470   nios2_function_profiler ((FILE), (LABELNO))
471
472 /* Addressing Modes.  */
473
474 #define CONSTANT_ADDRESS_P(X) \
475   (CONSTANT_P (X) && memory_address_p (SImode, X))
476
477 #define MAX_REGS_PER_ADDRESS 1
478
479 #ifndef REG_OK_STRICT
480 #define REG_OK_FOR_BASE_P(X)   REGNO_OK_FOR_BASE_P2 (REGNO (X), 0)
481 #define REG_OK_FOR_INDEX_P(X)  REGNO_OK_FOR_INDEX_P2 (REGNO (X), 0)
482 #else
483 #define REG_OK_FOR_BASE_P(X)   REGNO_OK_FOR_BASE_P2 (REGNO (X), 1)
484 #define REG_OK_FOR_INDEX_P(X)  REGNO_OK_FOR_INDEX_P2 (REGNO (X), 1)
485 #endif
486
487 /* Set if this has a weak declaration.  */
488 #define SYMBOL_FLAG_WEAK_DECL   (1 << SYMBOL_FLAG_MACH_DEP_SHIFT)
489 #define SYMBOL_REF_WEAK_DECL_P(RTX) \
490   ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_WEAK_DECL) != 0)
491
492
493 /* True if a symbol is both small and not weak.  In this case, GP-relative
494    access can be used.  GP-relative access cannot be used in
495    position-independent code.  GP-relative access cannot be used for externally
496    defined symbols, because the compilation unit that defines the symbol may
497    place it in a section that cannot be reached from GP.  */
498 #define SYMBOL_REF_IN_NIOS2_SMALL_DATA_P(RTX) \
499   (!flag_pic && SYMBOL_REF_SMALL_P (RTX)      \
500    && !SYMBOL_REF_WEAK_DECL_P (RTX)           \
501    && !SYMBOL_REF_EXTERNAL_P (RTX)            \
502    && SYMBOL_REF_TLS_MODEL (RTX) == 0)
503
504 /* Describing Relative Costs of Operations.  */
505 #define MOVE_MAX 4
506 #define SLOW_BYTE_ACCESS 1
507
508 /* It is as good to call a constant function address as to call an address
509    kept in a register.
510    ??? Not true anymore really. Now that call cannot address full range
511    of memory callr may need to be used */
512
513 #define NO_FUNCTION_CSE
514
515 /* Position Independent Code.  */
516
517 #define PIC_OFFSET_TABLE_REGNUM 22
518 #define LEGITIMATE_PIC_OPERAND_P(X) nios2_legitimate_pic_operand_p (X)
519
520 /* Define output assembler language.  */
521
522 #define ASM_APP_ON "#APP\n"
523 #define ASM_APP_OFF "#NO_APP\n"
524
525 #define ASM_COMMENT_START "# "
526
527 #define GLOBAL_ASM_OP "\t.global\t"
528
529 #define REGISTER_NAMES \
530   {                    \
531     "zero", \
532     "at", \
533     "r2", \
534     "r3", \
535     "r4", \
536     "r5", \
537     "r6", \
538     "r7", \
539     "r8", \
540     "r9", \
541     "r10", \
542     "r11", \
543     "r12", \
544     "r13", \
545     "r14", \
546     "r15", \
547     "r16", \
548     "r17", \
549     "r18", \
550     "r19", \
551     "r20", \
552     "r21", \
553     "r22", \
554     "r23", \
555     "et", \
556     "bt", \
557     "gp", \
558     "sp", \
559     "fp", \
560     "ta", \
561     "ba", \
562     "ra", \
563     "status", \
564     "estatus", \
565     "bstatus", \
566     "ipri", \
567     "ecause", \
568     "pc", \
569     "fake_fp", \
570     "fake_ap", \
571 }
572
573 #define ADDITIONAL_REGISTER_NAMES       \
574 {                                       \
575   {"r0", 0},                            \
576   {"r1", 1},                            \
577   {"r24", 24},                          \
578   {"r25", 25},                          \
579   {"r26", 26},                          \
580   {"r27", 27},                          \
581   {"r28", 28},                          \
582   {"r29", 29},                          \
583   {"r30", 30},                          \
584   {"r31", 31}                           \
585 }
586
587
588 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \
589   do                                                                    \
590     {                                                                   \
591       fputs (integer_asm_op (POINTER_SIZE / BITS_PER_UNIT, TRUE), FILE); \
592       fprintf (FILE, ".L%u\n", (unsigned) (VALUE));                     \
593     }                                                                   \
594   while (0)
595
596 #define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL)\
597   do                                                                    \
598     {                                                                   \
599       fputs (integer_asm_op (POINTER_SIZE / BITS_PER_UNIT, TRUE), STREAM); \
600       fprintf (STREAM, ".L%u-.L%u\n", (unsigned) (VALUE), (unsigned) (REL)); \
601     }                                                                   \
602   while (0)
603
604
605 /* Section directives.  */
606
607 /* Output before read-only data.  */
608 #define TEXT_SECTION_ASM_OP "\t.section\t.text"
609
610 /* Output before writable data.  */
611 #define DATA_SECTION_ASM_OP "\t.section\t.data"
612
613 /* Output before uninitialized data.  */
614 #define BSS_SECTION_ASM_OP "\t.section\t.bss"
615
616 /* Output before 'small' uninitialized data.  */
617 #define SBSS_SECTION_ASM_OP "\t.section\t.sbss"
618
619 #ifndef IN_LIBGCC2
620 /* Default the definition of "small data" to 8 bytes. */
621 extern unsigned HOST_WIDE_INT nios2_section_threshold;
622 #endif
623
624 #define NIOS2_DEFAULT_GVALUE 8
625
626 /* This says how to output assembler code to declare an
627    uninitialized external linkage data object.  Under SVR4,
628    the linker seems to want the alignment of data objects
629    to depend on their types.  We do exactly that here.  */
630 #undef COMMON_ASM_OP
631 #define COMMON_ASM_OP   "\t.comm\t"
632
633 #define ASM_OUTPUT_ALIGN(FILE, LOG)                  \
634   do {                                               \
635     fprintf ((FILE), "%s%d\n", ALIGN_ASM_OP, (LOG)); \
636   } while (0)
637
638 #undef  ASM_OUTPUT_ALIGNED_COMMON
639 #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)              \
640 do                                                                      \
641   {                                                                     \
642     fprintf ((FILE), "%s", COMMON_ASM_OP);                              \
643     assemble_name ((FILE), (NAME));                                     \
644     fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", (SIZE),    \
645              (ALIGN) / BITS_PER_UNIT);                                  \
646   }                                                                     \
647 while (0)
648
649
650 /* This says how to output assembler code to declare an
651    uninitialized internal linkage data object.  Under SVR4,
652    the linker seems to want the alignment of data objects
653    to depend on their types.  We do exactly that here.  */
654
655 #undef  ASM_OUTPUT_ALIGNED_LOCAL
656 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)               \
657 do {                                                                    \
658   if ((SIZE) <= nios2_section_threshold)                                \
659     switch_to_section (sbss_section);                                   \
660   else                                                                  \
661     switch_to_section (bss_section);                                    \
662   ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");                     \
663   if (!flag_inhibit_size_directive)                                     \
664     ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE);                       \
665   ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT));       \
666   ASM_OUTPUT_LABEL(FILE, NAME);                                         \
667   ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1);                         \
668 } while (0)
669
670 /* Put the jump tables in .text because when using position-independent code,
671    Nios II elf has no relocation that can represent arbitrary differences
672    between symbols in different sections.  */
673 #define JUMP_TABLES_IN_TEXT_SECTION 1
674
675 /* Exception Handling */
676
677 /* Describe __builtin_eh_return.  */
678 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, LAST_RETVAL_REGNO)
679 #define EH_RETURN_DATA_REGNO(N) ((N) <= (LAST_ARG_REGNO - FIRST_ARG_REGNO) \
680                                  ? (N) + FIRST_ARG_REGNO : INVALID_REGNUM)
681
682 /* Nios II has no appropriate relocations for a 32-bit PC-relative or
683    section-relative pointer encoding.  This therefore always chooses an
684    absolute representation for pointers.  An unfortunate consequence of
685    this is that ld complains about the absolute fde encoding when linking
686    with -shared or -fpie, but the warning is harmless and there seems to
687    be no good way to suppress it.  */
688 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL)              \
689   (flag_pic ? DW_EH_PE_aligned : DW_EH_PE_sdata4)
690
691 /* Misc. Parameters.  */
692
693 #define STORE_FLAG_VALUE 1
694 #define Pmode SImode
695 #define FUNCTION_MODE QImode
696
697 #define CASE_VECTOR_MODE Pmode
698
699 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
700
701 #define LOAD_EXTEND_OP(MODE) (ZERO_EXTEND)
702
703 #define WORD_REGISTER_OPERATIONS
704
705 #endif /* GCC_NIOS2_H */