Turn SLOW_UNALIGNED_ACCESS into a target hook
[official-gcc.git] / gcc / config / tilepro / tilepro.h
blob221f32a62c131f8cf74441f6899cec50cbfd6b07
1 /* Definitions of target machine for GNU compiler for TILEPro.
2 Copyright (C) 2011-2017 Free Software Foundation, Inc.
3 Contributed by Walter Lee (walt@tilera.com)
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published
9 by the Free Software Foundation; either version 3, or (at your
10 option) any later version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* This is used by tilepro_cpu_cpp_builtins to indicate the byte order
22 we're compiling for. */
23 #define TILEPRO_CPU_CPP_ENDIAN_BUILTINS() \
24 do \
25 { \
26 if (BYTES_BIG_ENDIAN) \
27 builtin_define ("__BIG_ENDIAN__"); \
28 else \
29 builtin_define ("__LITTLE_ENDIAN__"); \
30 } \
31 while (0)
33 /* Target CPU builtins. */
34 #define TARGET_CPU_CPP_BUILTINS() \
35 tilepro_cpu_cpp_builtins (pfile)
37 #undef PTRDIFF_TYPE
38 #define PTRDIFF_TYPE "int"
40 #undef SIZE_TYPE
41 #define SIZE_TYPE "unsigned int"
44 /* Target machine storage layout */
46 #define BITS_BIG_ENDIAN 0
47 #define BYTES_BIG_ENDIAN 0
48 #define WORDS_BIG_ENDIAN 0
50 #define UNITS_PER_WORD 4
51 #define PARM_BOUNDARY 32
52 #define STACK_BOUNDARY 64
53 #define FUNCTION_BOUNDARY 64
54 #define BIGGEST_ALIGNMENT 64
55 #define STRICT_ALIGNMENT 1
57 #define PCC_BITFIELD_TYPE_MATTERS 1
58 #define FASTEST_ALIGNMENT 32
59 #define BIGGEST_FIELD_ALIGNMENT 64
61 /* Make strings word-aligned so strcpy from constants will be
62 faster. */
63 #define CONSTANT_ALIGNMENT(EXP, ALIGN) \
64 ((TREE_CODE (EXP) == STRING_CST \
65 && (ALIGN) < FASTEST_ALIGNMENT) \
66 ? FASTEST_ALIGNMENT : (ALIGN))
68 /* Make arrays of chars word-aligned for the same reasons. */
69 #define DATA_ALIGNMENT(TYPE, ALIGN) \
70 (TREE_CODE (TYPE) == ARRAY_TYPE \
71 && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \
72 && (ALIGN) < FASTEST_ALIGNMENT ? FASTEST_ALIGNMENT : (ALIGN))
74 /* Make local arrays of chars word-aligned for the same reasons. */
75 #define LOCAL_ALIGNMENT(TYPE, ALIGN) DATA_ALIGNMENT (TYPE, ALIGN)
78 /* Standard register usage. */
80 #define FIRST_PSEUDO_REGISTER (64 + 3)
82 #define FIXED_REGISTERS \
83 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
84 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
85 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
86 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, \
87 1, 1, 1}
89 #define CALL_USED_REGISTERS \
90 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
91 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, \
92 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
93 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
94 1, 1, 1}
96 #define CALL_REALLY_USED_REGISTERS \
97 CALL_USED_REGISTERS
99 #define REG_ALLOC_ORDER { \
100 10, 11, 12, 13, 14, /* call used */ \
101 15, 16, 17, 18, 19, \
102 20, 21, 22, 23, 24, \
103 25, 26, 27, 28, 29, \
105 9, 8, 7, 6, 5, /* argument */ \
106 4, 3, 2, 1, 0, \
108 55, /* return address */ \
110 30, 31, 32, 33, 34, /* call saved registers */ \
111 35, 36, 37, 38, 39, \
112 40, 41, 42, 43, 44, \
113 45, 46, 47, 48, 49, \
114 50, 51, \
116 52, /* hard frame pointer */ \
117 53, 54, /* tp, sp */ \
119 56, 57, 58, 59, 60, /* special purpose */ \
120 61, 62, 63, 64, 65, /* or fake registers */ \
121 66 \
124 #define HARD_REGNO_NREGS(REGNO, MODE) \
125 ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
127 /* Register that holds an address into the text segment that can be
128 used by pic code. */
129 #define TILEPRO_PIC_TEXT_LABEL_REGNUM (flag_pic ? 50 : INVALID_REGNUM)
130 #define PIC_OFFSET_TABLE_REGNUM (flag_pic ? 51 : INVALID_REGNUM)
131 #define HARD_FRAME_POINTER_REGNUM 52
132 #define THREAD_POINTER_REGNUM 53
133 #define STACK_POINTER_REGNUM 54
134 #define TILEPRO_LINK_REGNUM 55
135 #define FRAME_POINTER_REGNUM 64
136 #define ARG_POINTER_REGNUM 65
137 /* Pseudo register used to enforce order between instructions that
138 touch the networks. */
139 #define TILEPRO_NETORDER_REGNUM 66
140 #define STATIC_CHAIN_REGNUM 10
143 enum reg_class
145 NO_REGS,
146 R0_REGS,
147 R1_REGS,
148 R2_REGS,
149 R3_REGS,
150 R4_REGS,
151 R5_REGS,
152 R6_REGS,
153 R7_REGS,
154 R8_REGS,
155 R9_REGS,
156 R10_REGS,
157 ALL_REGS,
158 LIM_REG_CLASSES
161 #define N_REG_CLASSES (int) LIM_REG_CLASSES
163 /* Since GENERAL_REGS is the same class as ALL_REGS, don't give it a
164 different class number; just make it an alias. */
165 #define GENERAL_REGS ALL_REGS
167 #define REG_CLASS_NAMES \
169 "NO_REGS", \
170 "R0_REGS", \
171 "R1_REGS", \
172 "R2_REGS", \
173 "R3_REGS", \
174 "R4_REGS", \
175 "R5_REGS", \
176 "R6_REGS", \
177 "R7_REGS", \
178 "R8_REGS", \
179 "R9_REGS", \
180 "R10_REGS", \
181 "ALL_REGS" \
184 #define REG_CLASS_CONTENTS \
186 { 0 }, \
187 { 1 << 0 }, \
188 { 1 << 1 }, \
189 { 1 << 2 }, \
190 { 1 << 3 }, \
191 { 1 << 4 }, \
192 { 1 << 5 }, \
193 { 1 << 6 }, \
194 { 1 << 7 }, \
195 { 1 << 8 }, \
196 { 1 << 9 }, \
197 { 1 << 10 }, \
198 { 0xffffffff, 0xffffffff } \
201 #define REGNO_REG_CLASS(REGNO) \
202 ((unsigned)(REGNO) <= 10 ? \
203 (enum reg_class)(R0_REGS + (REGNO)) : ALL_REGS)
205 #define INDEX_REG_CLASS NO_REGS
206 #define BASE_REG_CLASS ALL_REGS
208 #define PREFERRED_RELOAD_CLASS(X,CLASS) (CLASS)
210 #define CLASS_MAX_NREGS(CLASS, MODE) \
211 ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
214 /* Stack layout; function entry, exit and calling. */
216 #define STACK_GROWS_DOWNWARD 1
217 #define FRAME_GROWS_DOWNWARD 1
218 #define STARTING_FRAME_OFFSET 0
220 #define DYNAMIC_CHAIN_ADDRESS(FRAME) \
221 plus_constant (Pmode, (FRAME), UNITS_PER_WORD)
223 #define FIRST_PARM_OFFSET(FNDECL) 0
225 #define ACCUMULATE_OUTGOING_ARGS 1
227 #define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 1
229 #define INCOMING_FRAME_SP_OFFSET 0
231 #define STACK_POINTER_OFFSET (2 * UNITS_PER_WORD)
233 #define ARG_POINTER_CFA_OFFSET(FNDECL) (-STACK_POINTER_OFFSET)
235 #define DEFAULT_PCC_STRUCT_RETURN 0
237 /* The first 10 registers may hold return value. */
238 #define TILEPRO_NUM_RETURN_REGS 10
240 /* The first 10 registers hold function arguments. */
241 #define TILEPRO_NUM_ARG_REGS 10
243 #define FUNCTION_ARG_REGNO_P(N) ((N) < TILEPRO_NUM_ARG_REGS)
245 /* The type used to store the number of words of arguments scanned so
246 far during argument scanning. This includes any space that is
247 skipped. */
248 #define CUMULATIVE_ARGS int
250 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \
251 ((CUM) = 0)
254 #define ELIMINABLE_REGS \
255 {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
256 {ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \
257 {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
258 {FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}}
260 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
261 ((OFFSET) = tilepro_initial_elimination_offset((FROM),(TO)))
263 #define PROFILE_BEFORE_PROLOGUE 1
265 #define FUNCTION_PROFILER(FILE, LABELNO) \
266 tilepro_function_profiler (FILE, LABELNO)
268 #define TRAMPOLINE_SIZE 48
269 #define TRAMPOLINE_ALIGNMENT 64
270 #define TRAMPOLINE_SECTION text_section
273 /* Call frame debugging information. */
275 #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, TILEPRO_LINK_REGNUM)
277 #define RETURN_ADDR_RTX tilepro_return_addr
279 #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (TILEPRO_LINK_REGNUM)
281 #define DWARF_ZERO_REG 63
283 #define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N + 12) : INVALID_REGNUM)
284 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, 11)
285 #define EH_RETURN_HANDLER_RTX tilepro_eh_return_handler_rtx ()
287 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
288 tilepro_asm_preferred_eh_data_format ((CODE), (GLOBAL))
291 /* Addressing modes, and classification of registers for them. */
293 #define HAVE_POST_INCREMENT 1
294 #define HAVE_POST_DECREMENT 1
295 #define HAVE_POST_MODIFY_DISP 1
297 #define REGNO_OK_FOR_INDEX_P(regno) 0
298 #define REGNO_OK_FOR_BASE_P(regno) \
299 ((regno) < FIRST_PSEUDO_REGISTER || reg_renumber[regno] >= 0)
301 #define MAX_REGS_PER_ADDRESS 1
303 #define CONSTANT_ADDRESS_P(X) 0
305 #define LEGITIMATE_PIC_OPERAND_P(X) tilepro_legitimate_pic_operand_p (X)
308 #define CASE_VECTOR_MODE SImode
309 #define CASE_VECTOR_PC_RELATIVE 0
310 #define JUMP_TABLES_IN_TEXT_SECTION 0
312 #define DEFAULT_SIGNED_CHAR 1
314 #define MOVE_MAX UNITS_PER_WORD
316 /* Use a value of 11 for MOVE_RATIO and friends, because TILEPro
317 returns structs as large as 10 words in registers. Because of some
318 some code generation inefficiency, we never get smaller code for
319 turning that into a memcpy, so pick a value that guarantees this
320 doesn't happen. */
321 #define TILEPRO_CALL_RATIO 11
322 #define MOVE_RATIO(speed) ((speed) ? 15 : TILEPRO_CALL_RATIO)
323 #define CLEAR_RATIO(speed) ((speed) ? 15 : TILEPRO_CALL_RATIO)
324 #define SET_RATIO(speed) ((speed) ? 15 : TILEPRO_CALL_RATIO)
326 #define WORD_REGISTER_OPERATIONS 1
328 #define LOAD_EXTEND_OP(MODE) ZERO_EXTEND
330 #define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \
331 if (GET_MODE_CLASS (MODE) == MODE_INT \
332 && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \
333 (MODE) = SImode;
335 /* Define SLOW_BYTE_ACCESS to avoid making a QI or HI mode
336 register. */
337 #define SLOW_BYTE_ACCESS 1
339 #define SHIFT_COUNT_TRUNCATED 1
341 #define SHORT_IMMEDIATES_SIGN_EXTEND 1
343 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
345 #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
346 #define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
348 #define Pmode SImode
350 #define STORE_FLAG_VALUE 1
352 #define FUNCTION_MODE SImode
354 #define NO_FUNCTION_CSE 1
356 #define ADJUST_INSN_LENGTH(INSN, LENGTH) \
357 ((LENGTH) = tilepro_adjust_insn_length ((INSN), (LENGTH)))
359 #define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
361 #define BRANCH_COST(speed_p, predictable_p) ((predictable_p) ? 2 : 6)
364 /* Control the assembler format that we output. */
366 #undef NO_DOLLAR_IN_LABEL
368 #define ASM_COMMENT_START "##"
370 #define TEXT_SECTION_ASM_OP "\t.text"
372 #define DATA_SECTION_ASM_OP "\t.data"
374 #undef READONLY_DATA_SECTION_ASM_OP
375 #define READONLY_DATA_SECTION_ASM_OP "\t.section\t.rodata, \"a\""
377 #undef BSS_SECTION_ASM_OP
378 #define BSS_SECTION_ASM_OP "\t.section\t.bss, \"wa\""
380 #undef INIT_SECTION_ASM_OP
381 #define INIT_SECTION_ASM_OP "\t.section\t.init, \"ax\""
383 #undef FINI_SECTION_ASM_OP
384 #define FINI_SECTION_ASM_OP "\t.section\t.fini, \"ax\""
386 #define GLOBAL_ASM_OP ".global "
388 #define SUPPORTS_WEAK 1
390 #define USER_LABEL_PREFIX ""
392 #define REGISTER_PREFIX ""
393 #define REGISTER_NAMES \
394 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
395 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", \
396 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", \
397 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", \
398 "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39", \
399 "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47", \
400 "r48", "r49", "r50", "r51", "r52", "tp", "sp", "lr", \
401 "sn", "idn0", "idn1", "udn0", "udn1", "udn2", "udn3", "zero", \
402 "?FRAME?", "?ARG?", "?NET?" }
404 /* This is used to help emit bundles. */
405 #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \
406 tilepro_final_prescan_insn (insn)
408 /* This is used to help emit bundles. */
409 #define ASM_OUTPUT_OPCODE(STREAM, PTR) \
410 (PTR = tilepro_asm_output_opcode (STREAM, PTR))
412 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
413 do \
415 char label[256]; \
416 ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE));\
417 fprintf (FILE, "\t.word "); \
418 assemble_name (FILE, label); \
419 fprintf (FILE, "\n"); \
421 while (0)
423 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
424 do \
426 char label[256]; \
427 ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE)); \
428 fprintf (FILE, "\t.word "); \
429 assemble_name (FILE, label); \
430 ASM_GENERATE_INTERNAL_LABEL (label, "L", (REL)); \
431 fprintf (FILE, "-"); \
432 assemble_name (FILE, label); \
433 fprintf (FILE, "\n"); \
435 while (0)
437 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
438 do { if ((LOG) != 0) fprintf (FILE, "\t.align %d\n", 1 << (LOG)); } while (0)
440 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
441 ( fputs (".comm ", (FILE)), \
442 assemble_name ((FILE), (NAME)), \
443 fprintf ((FILE), ",%u\n", (unsigned int)(ROUNDED)))
445 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \
446 ( fputs (".lcomm ", (FILE)), \
447 assemble_name ((FILE), (NAME)), \
448 fprintf ((FILE), ",%u\n", (unsigned int)(ROUNDED)))
452 #define INIT_EXPANDERS tilepro_init_expanders ()
454 /* A C structure for machine-specific, per-function data. This is
455 added to the cfun structure. */
456 typedef struct GTY(()) machine_function
458 /* Symbol for the text label used for pic. */
459 rtx text_label_symbol;
461 /* Register for the text label. */
462 rtx text_label_rtx;
464 /* Register for the pic offset table. */
465 rtx got_rtx;
467 /* The function calls tls_get_addr. */
468 int calls_tls_get_addr;
469 } machine_function;
471 #ifndef HAVE_AS_TLS
472 #define HAVE_AS_TLS 0
473 #endif