xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/nios2/nios2.h (revision 33881f779a77dce6440bdc44610d94de75bebefe)
1 /* Definitions of target machine for Altera Nios II.
2    Copyright (C) 2012-2017 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 /* Indicate R2 ISA level support.  */
27 #define TARGET_ARCH_R2 (nios2_arch_option == ARCH_R2)
28 
29 /* FPU insn codes declared here.  */
30 #include "config/nios2/nios2-opts.h"
31 
32 /* Define built-in preprocessor macros.  */
33 #define TARGET_CPU_CPP_BUILTINS()                   \
34   do                                                \
35     {                                               \
36       builtin_define_std ("NIOS2");                 \
37       builtin_define_std ("nios2");                 \
38       if (TARGET_BIG_ENDIAN)                        \
39         builtin_define_std ("nios2_big_endian");    \
40       else                                          \
41         builtin_define_std ("nios2_little_endian"); \
42       builtin_define_with_int_value (		    \
43         "__nios2_arch__", (int) nios2_arch_option); \
44     }						    \
45   while (0)
46 
47 /* We're little endian, unless otherwise specified by defining
48    BIG_ENDIAN_FLAG.  */
49 #ifndef TARGET_ENDIAN_DEFAULT
50 # define TARGET_ENDIAN_DEFAULT 0
51 #endif
52 
53 /* Default target_flags if no switches specified.  */
54 #ifndef TARGET_DEFAULT
55 # define TARGET_DEFAULT (MASK_HAS_MUL | TARGET_ENDIAN_DEFAULT)
56 #endif
57 
58 #define OPTION_DEFAULT_SPECS \
59   {"arch", "%{!march=*:%{!mcpu=*:-march=%(VALUE)}}" }
60 
61 #define CC1_SPEC "%{G*}"
62 
63 #if TARGET_ENDIAN_DEFAULT == 0
64 # define ASM_SPEC "%{!meb:-EL} %{meb:-EB} %{march=*:-march=%*}"
65 # define LINK_SPEC_ENDIAN "%{!meb:-EL} %{meb:-EB}"
66 # define MULTILIB_DEFAULTS { "EL" }
67 #else
68 # define ASM_SPEC "%{!mel:-EB} %{mel:-EL} %{march=*:-march=%*}"
69 # define LINK_SPEC_ENDIAN "%{!mel:-EB} %{mel:-EL}"
70 # define MULTILIB_DEFAULTS { "EB" }
71 #endif
72 
73 #define LINK_SPEC LINK_SPEC_ENDIAN \
74   " %{shared:-shared} \
75     %{static:-Bstatic}"
76 
77 
78 /* Storage layout.  */
79 
80 #define DEFAULT_SIGNED_CHAR 1
81 #define BITS_BIG_ENDIAN 0
82 #define BYTES_BIG_ENDIAN (TARGET_BIG_ENDIAN != 0)
83 #define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN != 0)
84 #define BITS_PER_WORD 32
85 #define UNITS_PER_WORD 4
86 #define POINTER_SIZE 32
87 #define BIGGEST_ALIGNMENT 32
88 #define STRICT_ALIGNMENT 1
89 #define FUNCTION_BOUNDARY 32
90 #define PARM_BOUNDARY 32
91 #define STACK_BOUNDARY 32
92 #define PREFERRED_STACK_BOUNDARY 32
93 #define MAX_FIXED_MODE_SIZE 64
94 
95 #define CONSTANT_ALIGNMENT(EXP, ALIGN)                          \
96   ((TREE_CODE (EXP) == STRING_CST)                              \
97    && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
98 
99 #define LABEL_ALIGN(LABEL) nios2_label_align (LABEL)
100 
101 /* Layout of source language data types.  */
102 
103 #define INT_TYPE_SIZE 32
104 #define SHORT_TYPE_SIZE 16
105 #define LONG_TYPE_SIZE 32
106 #define LONG_LONG_TYPE_SIZE 64
107 #define FLOAT_TYPE_SIZE 32
108 #define DOUBLE_TYPE_SIZE 64
109 #define LONG_DOUBLE_TYPE_SIZE DOUBLE_TYPE_SIZE
110 
111 #undef SIZE_TYPE
112 #define SIZE_TYPE "unsigned int"
113 
114 #undef PTRDIFF_TYPE
115 #define PTRDIFF_TYPE "int"
116 
117 
118 /* Basic characteristics of Nios II registers:
119 
120    Regno  Name
121    0      r0       zero    always zero
122    1      r1       at      Assembler Temporary
123    2-3    r2-r3            Return Location
124    4-7    r4-r7            Register Arguments
125    8-15   r8-r15           Caller Saved Registers
126    16-22  r16-r22          Callee Saved Registers
127    22     r22              Global Offset Table pointer (Linux ABI only)
128    23     r23              Thread pointer (Linux ABI only)
129    24     r24      et      Exception Temporary
130    25     r25      bt      Breakpoint Temporary
131    26     r26      gp      Global Pointer
132    27     r27      sp      Stack Pointer
133    28     r28      fp      Frame Pointer
134    29     r29      ea      Exception Return Address
135    30     r30      ba      Breakpoint Return Address
136    31     r31      ra      Return Address
137 
138    32     ctl0     status
139    33     ctl1     estatus STATUS saved by exception
140    34     ctl2     bstatus STATUS saved by break
141    35     ctl3     ipri    Interrupt Priority Mask
142    36     ctl4     ecause  Exception Cause
143 
144    37     pc               Not an actual register
145 
146    38     fake_fp          Fake Frame Pointer (always eliminated)
147    39     fake_ap          Fake Argument Pointer (always eliminated)
148    40                      First Pseudo Register
149 
150    In addition, r12 is used as the static chain register and r13, r14, and r15
151    are clobbered by PLT code sequences.
152 
153    The definitions for all the hard register numbers are located in nios2.md.
154 */
155 
156 #define FIXED_REGISTERS                      \
157   {					     \
158 /*        +0  1  2  3  4  5  6  7  8  9 */   \
159 /*   0 */  1, 1, 0, 0, 0, 0, 0, 0, 0, 0,     \
160 /*  10 */  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,     \
161 /*  20 */  0, 0, TARGET_LINUX_ABI, TARGET_LINUX_ABI, 1, 1, 1, 1, 0, 1,     \
162 /*  30 */  1, 0, 1, 1, 1, 1, 1, 1, 1, 1,     \
163   }
164 
165 /* Call used == caller saved + fixed regs + args + ret vals.  */
166 #define CALL_USED_REGISTERS                  \
167   {					     \
168 /*        +0  1  2  3  4  5  6  7  8  9 */   \
169 /*   0 */  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,     \
170 /*  10 */  1, 1, 1, 1, 1, 1, 0, 0, 0, 0,     \
171 /*  20 */  0, 0, TARGET_LINUX_ABI, TARGET_LINUX_ABI, 1, 1, 1, 1, 0, 1,     \
172 /*  30 */  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,     \
173   }
174 
175 #define MODES_TIEABLE_P(MODE1, MODE2) 1
176 #define HARD_REGNO_MODE_OK(REGNO, MODE) 1
177 #define HARD_REGNO_NREGS(REGNO, MODE)            \
178   ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
179 
180 /* Order in which to allocate registers.  Each register must be
181    listed once.  This is the default ordering for R1 and non-CDX R2
182    code.  For CDX, we overwrite this in ADJUST_REG_ALLOC_ORDER.  */
183 #define REG_ALLOC_ORDER							\
184   { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, \
185       20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, \
186       37, 38, 39 }
187 
188 #define ADJUST_REG_ALLOC_ORDER nios2_adjust_reg_alloc_order ()
189 
190 /* Caller-save costs can be less emphasized under R2 CDX, where we can
191    use push.n/pop.n.  */
192 #define HONOR_REG_ALLOC_ORDER (TARGET_HAS_CDX)
193 
194 /* Register Classes.  */
195 
196 enum reg_class
197 {
198   NO_REGS,
199   SIB_REGS,
200   IJMP_REGS,
201   GP_REGS,
202   ALL_REGS,
203   LIM_REG_CLASSES
204 };
205 
206 #define N_REG_CLASSES (int) LIM_REG_CLASSES
207 
208 #define REG_CLASS_NAMES   \
209   {  "NO_REGS",		  \
210      "SIB_REGS",	  \
211      "IJMP_REGS",	  \
212      "GP_REGS",           \
213      "ALL_REGS" }
214 
215 #define GENERAL_REGS ALL_REGS
216 
217 #define REG_CLASS_CONTENTS			\
218   {						\
219     /* NO_REGS    */ { 0, 0},			\
220     /* SIB_REGS   */ { 0xfe0c, 0},		\
221     /* IJMP_REGS  */ { 0x7fffffff, 0},		\
222     /* GP_REGS    */ {~0, 0},			\
223     /* ALL_REGS   */ {~0,~0}			\
224   }
225 
226 
227 #define GP_REG_P(REGNO) ((unsigned)(REGNO) <= LAST_GP_REG)
228 #define REGNO_REG_CLASS(REGNO) (GP_REG_P (REGNO) ? GP_REGS : ALL_REGS)
229 #define CLASS_MAX_NREGS(CLASS, MODE)					\
230   ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
231 
232 #define CDX_REG_P(REGNO)						\
233   ((REGNO) == 16 || (REGNO) == 17 || (2 <= (REGNO) && (REGNO) <= 7))
234 
235 /* Tests for various kinds of constants used in the Nios II port.  */
236 
237 #define SMALL_INT(X) ((unsigned HOST_WIDE_INT)(X) + 0x8000 < 0x10000)
238 #define SMALL_INT12(X) ((unsigned HOST_WIDE_INT)(X) + 0x800 < 0x1000)
239 #define SMALL_INT_UNSIGNED(X) ((X) >= 0 && (X) < 0x10000)
240 #define UPPER16_INT(X) (((X) & 0xffff) == 0)
241 #define SHIFT_INT(X) ((X) >= 0 && (X) <= 31)
242 #define RDWRCTL_INT(X) ((X) >= 0 && (X) <= 31)
243 #define CUSTOM_INSN_OPCODE(X) ((X) >= 0 && (X) <= 255)
244 #define ANDCLEAR_INT(X) \
245   (((X) & 0xffff) == 0xffff || (((X) >> 16) & 0xffff) == 0xffff)
246 
247 /* Say that the epilogue uses the return address register.  Note that
248    in the case of sibcalls, the values "used by the epilogue" are
249    considered live at the start of the called function.  */
250 #define EPILOGUE_USES(REGNO) (epilogue_completed && (REGNO) == RA_REGNO)
251 
252 /* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
253    the stack pointer does not matter.  The value is tested only in
254    functions that have frame pointers.
255    No definition is equivalent to always zero.  */
256 
257 #define EXIT_IGNORE_STACK 1
258 
259 /* Trampolines use a 5-instruction sequence.  */
260 #define TRAMPOLINE_SIZE 20
261 
262 /* Stack layout.  */
263 #define STACK_GROWS_DOWNWARD 1
264 #define STARTING_FRAME_OFFSET 0
265 #define FIRST_PARM_OFFSET(FUNDECL) 0
266 
267 /* Before the prologue, RA lives in r31.  */
268 #define INCOMING_RETURN_ADDR_RTX  gen_rtx_REG (Pmode, RA_REGNO)
269 #define RETURN_ADDR_RTX(C,F) nios2_get_return_address (C)
270 
271 #define DWARF_FRAME_RETURN_COLUMN RA_REGNO
272 
273 /* The CFA includes the pretend args.  */
274 #define ARG_POINTER_CFA_OFFSET(FNDECL) \
275   (gcc_assert ((FNDECL) == current_function_decl), \
276    FIRST_PARM_OFFSET (FNDECL) + crtl->args.pretend_args_size)
277 
278 /* Frame/arg pointer elimination settings.  */
279 #define ELIMINABLE_REGS                                                 \
280 {{ ARG_POINTER_REGNUM,   STACK_POINTER_REGNUM},                         \
281  { ARG_POINTER_REGNUM,   HARD_FRAME_POINTER_REGNUM},                    \
282  { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM},                         \
283  { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}}
284 
285 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
286   (OFFSET) = nios2_initial_elimination_offset ((FROM), (TO))
287 
288 /* Calling convention definitions.  */
289 typedef struct nios2_args
290 {
291   int regs_used;
292 } CUMULATIVE_ARGS;
293 
294 #define NUM_ARG_REGS (LAST_ARG_REGNO - FIRST_ARG_REGNO + 1)
295 
296 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
297   do { (CUM).regs_used = 0; } while (0)
298 
299 #define FUNCTION_ARG_PADDING(MODE, TYPE) \
300   (nios2_function_arg_padding ((MODE), (TYPE)))
301 
302 #define PAD_VARARGS_DOWN \
303   (FUNCTION_ARG_PADDING (TYPE_MODE (type), type) == downward)
304 
305 #define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \
306   (nios2_block_reg_padding ((MODE), (TYPE), (FIRST)))
307 
308 #define FUNCTION_ARG_REGNO_P(REGNO) \
309   ((REGNO) >= FIRST_ARG_REGNO && (REGNO) <= LAST_ARG_REGNO)
310 
311 /* Passing function arguments on stack.  */
312 #define PUSH_ARGS 0
313 #define ACCUMULATE_OUTGOING_ARGS 1
314 
315 /* We define TARGET_RETURN_IN_MEMORY, so set to zero.  */
316 #define DEFAULT_PCC_STRUCT_RETURN 0
317 
318 /* Profiling.  */
319 #define PROFILE_BEFORE_PROLOGUE
320 #define NO_PROFILE_COUNTERS 1
321 #define FUNCTION_PROFILER(FILE, LABELNO) \
322   nios2_function_profiler ((FILE), (LABELNO))
323 
324 /* Addressing modes.  */
325 
326 #define CONSTANT_ADDRESS_P(X) \
327   (CONSTANT_P (X) && memory_address_p (SImode, X))
328 
329 #define MAX_REGS_PER_ADDRESS 1
330 #define BASE_REG_CLASS ALL_REGS
331 #define INDEX_REG_CLASS NO_REGS
332 
333 #define REGNO_OK_FOR_BASE_P(REGNO) nios2_regno_ok_for_base_p ((REGNO), true)
334 #define REGNO_OK_FOR_INDEX_P(REGNO) 0
335 
336 /* Describing Relative Costs of Operations.  */
337 #define MOVE_MAX 4
338 #define SLOW_BYTE_ACCESS 1
339 
340 /* It is as good to call a constant function address as to call an address
341    kept in a register.  */
342 #define NO_FUNCTION_CSE 1
343 
344 /* Position independent code.  */
345 
346 #define PIC_OFFSET_TABLE_REGNUM 22
347 #define LEGITIMATE_PIC_OPERAND_P(X) nios2_legitimate_pic_operand_p (X)
348 
349 /* Define output assembler language.  */
350 
351 #define ASM_APP_ON "#APP\n"
352 #define ASM_APP_OFF "#NO_APP\n"
353 
354 #define ASM_COMMENT_START "# "
355 
356 #define GLOBAL_ASM_OP "\t.global\t"
357 
358 #define REGISTER_NAMES \
359   {		       \
360     "zero", \
361     "at", \
362     "r2", \
363     "r3", \
364     "r4", \
365     "r5", \
366     "r6", \
367     "r7", \
368     "r8", \
369     "r9", \
370     "r10", \
371     "r11", \
372     "r12", \
373     "r13", \
374     "r14", \
375     "r15", \
376     "r16", \
377     "r17", \
378     "r18", \
379     "r19", \
380     "r20", \
381     "r21", \
382     "r22", \
383     "r23", \
384     "et", \
385     "bt", \
386     "gp", \
387     "sp", \
388     "fp", \
389     "ta", \
390     "ba", \
391     "ra", \
392     "status", \
393     "estatus", \
394     "bstatus", \
395     "ipri", \
396     "ecause", \
397     "pc", \
398     "fake_fp", \
399     "fake_ap", \
400 }
401 
402 #define ADDITIONAL_REGISTER_NAMES       \
403 {					\
404   {"r0", 0},				\
405   {"r1", 1},				\
406   {"r24", 24},                          \
407   {"r25", 25},                          \
408   {"r26", 26},                          \
409   {"r27", 27},                          \
410   {"r28", 28},                          \
411   {"r29", 29},                          \
412   {"r30", 30},                          \
413   {"r31", 31}                           \
414 }
415 
416 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \
417   do									\
418     {									\
419       fputs (integer_asm_op (POINTER_SIZE / BITS_PER_UNIT, TRUE), FILE); \
420       fprintf (FILE, ".L%u\n", (unsigned) (VALUE));			\
421     }									\
422   while (0)
423 
424 #define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL)\
425   do									\
426     {									\
427       fputs (integer_asm_op (POINTER_SIZE / BITS_PER_UNIT, TRUE), STREAM); \
428       fprintf (STREAM, ".L%u-.L%u\n", (unsigned) (VALUE), (unsigned) (REL)); \
429     }									\
430   while (0)
431 
432 /* Section directives.  */
433 
434 /* Output before read-only data.  */
435 #define TEXT_SECTION_ASM_OP "\t.section\t.text"
436 
437 /* Output before writable data.  */
438 #define DATA_SECTION_ASM_OP "\t.section\t.data"
439 
440 /* Output before uninitialized data.  */
441 #define BSS_SECTION_ASM_OP "\t.section\t.bss"
442 
443 /* Output before 'small' uninitialized data.  */
444 #define SBSS_SECTION_ASM_OP "\t.section\t.sbss"
445 
446 #ifndef IN_LIBGCC2
447 /* Default the definition of "small data" to 8 bytes.  */
448 extern unsigned HOST_WIDE_INT nios2_section_threshold;
449 #endif
450 
451 #define NIOS2_DEFAULT_GVALUE 8
452 
453 /* This says how to output assembler code to declare an
454    uninitialized external linkage data object.  Under SVR4,
455    the linker seems to want the alignment of data objects
456    to depend on their types.  We do exactly that here.  */
457 #undef COMMON_ASM_OP
458 #define COMMON_ASM_OP   "\t.comm\t"
459 
460 #define ASM_OUTPUT_ALIGN(FILE, LOG)		     \
461   do {						     \
462     fprintf ((FILE), "%s%d\n", ALIGN_ASM_OP, (LOG)); \
463   } while (0)
464 
465 #undef  ASM_OUTPUT_ALIGNED_COMMON
466 #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)              \
467 do                                                                      \
468   {									\
469     fprintf ((FILE), "%s", COMMON_ASM_OP);				\
470     assemble_name ((FILE), (NAME));					\
471     fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", (SIZE),	\
472 	     (ALIGN) / BITS_PER_UNIT);					\
473   }									\
474 while (0)
475 
476 
477 /* This says how to output assembler code to declare an
478    uninitialized internal linkage data object.  Under SVR4,
479    the linker seems to want the alignment of data objects
480    to depend on their types.  We do exactly that here.  */
481 
482 #undef  ASM_OUTPUT_ALIGNED_LOCAL
483 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)               \
484 do {                                                                    \
485   if ((SIZE) <= nios2_section_threshold)                                \
486     switch_to_section (sbss_section);					\
487   else                                                                  \
488     switch_to_section (bss_section);					\
489   ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");                     \
490   if (!flag_inhibit_size_directive)                                     \
491     ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE);                       \
492   ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT));       \
493   ASM_OUTPUT_LABEL(FILE, NAME);                                         \
494   ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1);                         \
495 } while (0)
496 
497 /* Put the jump tables in .text because when using position-independent code,
498    Nios II elf has no relocation that can represent arbitrary differences
499    between symbols in different sections.  */
500 #define JUMP_TABLES_IN_TEXT_SECTION 1
501 
502 /* Exception handling.  */
503 
504 /* Describe __builtin_eh_return.  */
505 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, LAST_RETVAL_REGNO)
506 #define EH_RETURN_DATA_REGNO(N) ((N) <= (LAST_ARG_REGNO - FIRST_ARG_REGNO) \
507 				 ? (N) + FIRST_ARG_REGNO : INVALID_REGNUM)
508 
509 /* Nios II has no appropriate relocations for a 32-bit PC-relative or
510    section-relative pointer encoding.  This therefore always chooses an
511    absolute representation for pointers.  An unfortunate consequence of
512    this is that ld complains about the absolute fde encoding when linking
513    with -shared or -fpie, but the warning is harmless and there seems to
514    be no good way to suppress it.  */
515 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL)		\
516   (flag_pic ? DW_EH_PE_aligned : DW_EH_PE_sdata4)
517 
518 /* Misc. parameters.  */
519 
520 #define STORE_FLAG_VALUE 1
521 #define Pmode SImode
522 #define FUNCTION_MODE QImode
523 
524 #define CASE_VECTOR_MODE Pmode
525 
526 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
527 
528 #define LOAD_EXTEND_OP(MODE) (ZERO_EXTEND)
529 
530 #define WORD_REGISTER_OPERATIONS 1
531 
532 #endif /* GCC_NIOS2_H */
533