Imported Upstream version 4.8.1
[platform/upstream/gcc48.git] / gcc / config / tilepro / tilepro.h
1 /* Definitions of target machine for GNU compiler for TILEPro.
2    Copyright (C) 2011-2013 Free Software Foundation, Inc.
3    Contributed by Walter Lee (walt@tilera.com)
4
5    This file is part of GCC.
6
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.
11
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.
16
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/>.  */
20
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)
32
33 /* Target CPU builtins.  */
34 #define TARGET_CPU_CPP_BUILTINS() \
35   tilepro_cpu_cpp_builtins (pfile)
36
37 #undef PTRDIFF_TYPE
38 #define PTRDIFF_TYPE "int"
39
40 #undef SIZE_TYPE
41 #define SIZE_TYPE "unsigned int"
42 \f
43
44 /* Target machine storage layout */
45
46 #define BITS_BIG_ENDIAN 0
47 #define BYTES_BIG_ENDIAN 0
48 #define WORDS_BIG_ENDIAN 0
49
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
56
57 #define PCC_BITFIELD_TYPE_MATTERS 1
58 #define FASTEST_ALIGNMENT 32
59 #define BIGGEST_FIELD_ALIGNMENT 64
60
61 /* Unaligned moves trap and are very slow.  */
62 #define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) 1
63
64 /* Make strings word-aligned so strcpy from constants will be
65    faster.  */
66 #define CONSTANT_ALIGNMENT(EXP, ALIGN)  \
67   ((TREE_CODE (EXP) == STRING_CST       \
68     && (ALIGN) < FASTEST_ALIGNMENT)     \
69    ? FASTEST_ALIGNMENT : (ALIGN))
70
71 /* Make arrays of chars word-aligned for the same reasons.  */
72 #define DATA_ALIGNMENT(TYPE, ALIGN)             \
73   (TREE_CODE (TYPE) == ARRAY_TYPE               \
74    && TYPE_MODE (TREE_TYPE (TYPE)) == QImode    \
75    && (ALIGN) < FASTEST_ALIGNMENT ? FASTEST_ALIGNMENT : (ALIGN))
76
77 /* Make local arrays of chars word-aligned for the same reasons.  */
78 #define LOCAL_ALIGNMENT(TYPE, ALIGN) DATA_ALIGNMENT (TYPE, ALIGN)
79 \f
80
81 /* Standard register usage.  */
82
83 #define FIRST_PSEUDO_REGISTER (64 + 3)
84
85 #define FIXED_REGISTERS \
86  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
87   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
88   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
89   0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, \
90   1, 1, 1}
91
92 #define CALL_USED_REGISTERS \
93  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
94   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, \
95   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
96   0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
97   1, 1, 1}
98
99 #define CALL_REALLY_USED_REGISTERS \
100  CALL_USED_REGISTERS
101
102 #define REG_ALLOC_ORDER {                               \
103       10, 11, 12, 13, 14, /* call used */               \
104       15, 16, 17, 18, 19,                               \
105       20, 21, 22, 23, 24,                               \
106       25, 26, 27, 28, 29,                               \
107                                                         \
108       9, 8, 7, 6, 5,      /* argument */                \
109       4, 3, 2, 1, 0,                                    \
110                                                         \
111       55,                 /* return address */          \
112                                                         \
113       30, 31, 32, 33, 34, /* call saved registers */    \
114       35, 36, 37, 38, 39,                               \
115       40, 41, 42, 43, 44,                               \
116       45, 46, 47, 48, 49,                               \
117       50, 51,                                           \
118                                                         \
119       52,                 /* hard frame pointer */      \
120       53, 54,             /* tp, sp */                  \
121                                                         \
122       56, 57, 58, 59, 60, /* special purpose */         \
123       61, 62, 63, 64, 65, /* or fake registers */       \
124       66                                                \
125 }
126
127 #define HARD_REGNO_NREGS(REGNO, MODE)   \
128   ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
129
130 /* All registers can hold all modes.  */
131 #define HARD_REGNO_MODE_OK(REGNO, MODE) 1
132
133 #define MODES_TIEABLE_P(MODE1, MODE2)  1
134
135 /* Register that holds an address into the text segment that can be
136    used by pic code.  */
137 #define TILEPRO_PIC_TEXT_LABEL_REGNUM (flag_pic ? 50 : INVALID_REGNUM)
138 #define PIC_OFFSET_TABLE_REGNUM (flag_pic ? 51 : INVALID_REGNUM)
139 #define HARD_FRAME_POINTER_REGNUM 52
140 #define THREAD_POINTER_REGNUM 53
141 #define STACK_POINTER_REGNUM 54
142 #define TILEPRO_LINK_REGNUM 55
143 #define FRAME_POINTER_REGNUM 64
144 #define ARG_POINTER_REGNUM 65
145 /* Pseudo register used to enforce order between instructions that
146    touch the networks.  */
147 #define TILEPRO_NETORDER_REGNUM 66
148 #define STATIC_CHAIN_REGNUM 10
149 \f
150
151 enum reg_class
152 {
153   NO_REGS,
154   R0_REGS,
155   R1_REGS,
156   R2_REGS,
157   R3_REGS,
158   R4_REGS,
159   R5_REGS,
160   R6_REGS,
161   R7_REGS,
162   R8_REGS,
163   R9_REGS,
164   R10_REGS,
165   ALL_REGS,
166   LIM_REG_CLASSES
167 };
168
169 #define N_REG_CLASSES (int) LIM_REG_CLASSES
170
171 /* Since GENERAL_REGS is the same class as ALL_REGS, don't give it a
172    different class number; just make it an alias.  */
173 #define GENERAL_REGS ALL_REGS
174
175 #define REG_CLASS_NAMES \
176   { \
177     "NO_REGS", \
178     "R0_REGS", \
179     "R1_REGS", \
180     "R2_REGS", \
181     "R3_REGS", \
182     "R4_REGS", \
183     "R5_REGS", \
184     "R6_REGS", \
185     "R7_REGS", \
186     "R8_REGS", \
187     "R9_REGS", \
188     "R10_REGS", \
189     "ALL_REGS" \
190   }
191
192 #define REG_CLASS_CONTENTS \
193   { \
194     { 0 }, \
195     { 1 << 0 }, \
196     { 1 << 1 }, \
197     { 1 << 2 }, \
198     { 1 << 3 }, \
199     { 1 << 4 }, \
200     { 1 << 5 }, \
201     { 1 << 6 }, \
202     { 1 << 7 }, \
203     { 1 << 8 }, \
204     { 1 << 9 }, \
205     { 1 << 10 }, \
206     { 0xffffffff, 0xffffffff } \
207   }
208
209 #define REGNO_REG_CLASS(REGNO) \
210   ((unsigned)(REGNO) <= 10 ? \
211    (enum reg_class)(R0_REGS + (REGNO)) : ALL_REGS)
212
213 #define INDEX_REG_CLASS NO_REGS
214 #define BASE_REG_CLASS ALL_REGS
215
216 #define PREFERRED_RELOAD_CLASS(X,CLASS)  (CLASS)
217
218 #define CLASS_MAX_NREGS(CLASS, MODE)    \
219  ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
220 \f
221
222 /* Stack layout; function entry, exit and calling.  */
223
224 #define STACK_GROWS_DOWNWARD
225 #define FRAME_GROWS_DOWNWARD 1
226 #define STARTING_FRAME_OFFSET 0
227
228 #define DYNAMIC_CHAIN_ADDRESS(FRAME) \
229   plus_constant (Pmode, (FRAME), UNITS_PER_WORD)
230
231 #define FIRST_PARM_OFFSET(FNDECL) 0
232
233 #define ACCUMULATE_OUTGOING_ARGS 1
234
235 #define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 1
236
237 #define INCOMING_FRAME_SP_OFFSET 0
238
239 #define STACK_POINTER_OFFSET (2 * UNITS_PER_WORD)
240
241 #define ARG_POINTER_CFA_OFFSET(FNDECL) (-STACK_POINTER_OFFSET)
242
243 #define DEFAULT_PCC_STRUCT_RETURN 0
244
245 /* The first 10 registers may hold return value.  */
246 #define TILEPRO_NUM_RETURN_REGS 10
247
248 /* The first 10 registers hold function arguments.  */
249 #define TILEPRO_NUM_ARG_REGS 10
250
251 #define FUNCTION_ARG_REGNO_P(N) ((N) < TILEPRO_NUM_ARG_REGS)
252
253 /* The type used to store the number of words of arguments scanned so
254    far during argument scanning.  This includes any space that is
255    skipped.  */
256 #define CUMULATIVE_ARGS int
257
258 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \
259  ((CUM) = 0)
260 \f
261
262 #define ELIMINABLE_REGS                                 \
263   {{ARG_POINTER_REGNUM,  STACK_POINTER_REGNUM},         \
264   {ARG_POINTER_REGNUM,   HARD_FRAME_POINTER_REGNUM},    \
265   {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM},         \
266   {FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}}
267
268 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
269   ((OFFSET) = tilepro_initial_elimination_offset((FROM),(TO)))
270
271 #define PROFILE_BEFORE_PROLOGUE 1
272
273 #define FUNCTION_PROFILER(FILE, LABELNO) \
274   tilepro_function_profiler (FILE, LABELNO)
275
276 #define TRAMPOLINE_SIZE 48
277 #define TRAMPOLINE_ALIGNMENT 64
278 #define TRAMPOLINE_SECTION text_section
279 \f
280
281 /* Call frame debugging information.  */
282
283 #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, TILEPRO_LINK_REGNUM)
284
285 #define RETURN_ADDR_RTX tilepro_return_addr
286
287 #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (TILEPRO_LINK_REGNUM)
288
289 #define DWARF_ZERO_REG 63
290
291 #define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N + 12) : INVALID_REGNUM)
292 #define EH_RETURN_STACKADJ_RTX  gen_rtx_REG (Pmode, 11)
293 #define EH_RETURN_HANDLER_RTX tilepro_eh_return_handler_rtx ()
294
295 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
296   tilepro_asm_preferred_eh_data_format ((CODE), (GLOBAL))
297 \f
298
299 /* Addressing modes, and classification of registers for them.  */
300
301 #define HAVE_POST_INCREMENT 1
302 #define HAVE_POST_DECREMENT 1
303 #define HAVE_POST_MODIFY_DISP 1
304
305 #define REGNO_OK_FOR_INDEX_P(regno) 0
306 #define REGNO_OK_FOR_BASE_P(regno)      \
307   ((regno) < FIRST_PSEUDO_REGISTER || reg_renumber[regno] >= 0)
308
309 #define MAX_REGS_PER_ADDRESS 1
310
311 #define CONSTANT_ADDRESS_P(X) 0
312
313 #define LEGITIMATE_PIC_OPERAND_P(X) tilepro_legitimate_pic_operand_p (X)
314 \f
315
316 #define CASE_VECTOR_MODE SImode
317 #define CASE_VECTOR_PC_RELATIVE 0
318 #define JUMP_TABLES_IN_TEXT_SECTION 0
319
320 #define DEFAULT_SIGNED_CHAR 1
321
322 #define MOVE_MAX UNITS_PER_WORD
323
324 /* Use a value of 11 for MOVE_RATIO and friends, because TILEPro
325    returns structs as large as 10 words in registers.  Because of some
326    some code generation inefficiency, we never get smaller code for
327    turning that into a memcpy, so pick a value that guarantees this
328    doesn't happen.  */
329 #define TILEPRO_CALL_RATIO 11
330 #define MOVE_RATIO(speed) ((speed) ? 15 : TILEPRO_CALL_RATIO)
331 #define CLEAR_RATIO(speed) ((speed) ? 15 : TILEPRO_CALL_RATIO)
332 #define SET_RATIO(speed) ((speed) ? 15 : TILEPRO_CALL_RATIO)
333
334 #define WORD_REGISTER_OPERATIONS
335
336 #define LOAD_EXTEND_OP(MODE) ZERO_EXTEND
337
338 #define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE)       \
339   if (GET_MODE_CLASS (MODE) == MODE_INT         \
340       && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \
341     (MODE) = SImode;
342
343 /* Define SLOW_BYTE_ACCESS to avoid making a QI or HI mode
344    register.  */
345 #define SLOW_BYTE_ACCESS 1
346
347 #define SHIFT_COUNT_TRUNCATED 1
348
349 #define SHORT_IMMEDIATES_SIGN_EXTEND
350
351 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
352
353 #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
354 #define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
355
356 #define Pmode SImode
357
358 #define STORE_FLAG_VALUE 1
359
360 #define FUNCTION_MODE SImode
361
362 #define NO_FUNCTION_CSE 1
363
364 #define ADJUST_INSN_LENGTH(INSN, LENGTH) \
365   ((LENGTH) = tilepro_adjust_insn_length ((INSN), (LENGTH)))
366
367 #define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT
368
369 #define BRANCH_COST(speed_p, predictable_p) ((predictable_p) ? 2 : 6)
370 \f
371
372 /* Control the assembler format that we output.  */
373
374 #undef NO_DOLLAR_IN_LABEL
375
376 #define ASM_COMMENT_START "##"
377
378 #define TEXT_SECTION_ASM_OP "\t.text"
379
380 #define DATA_SECTION_ASM_OP "\t.data"
381
382 #undef READONLY_DATA_SECTION_ASM_OP
383 #define READONLY_DATA_SECTION_ASM_OP "\t.section\t.rodata, \"a\""
384
385 #undef BSS_SECTION_ASM_OP
386 #define BSS_SECTION_ASM_OP      "\t.section\t.bss, \"wa\""
387
388 #undef INIT_SECTION_ASM_OP
389 #define INIT_SECTION_ASM_OP     "\t.section\t.init, \"ax\""
390
391 #undef FINI_SECTION_ASM_OP
392 #define FINI_SECTION_ASM_OP     "\t.section\t.fini, \"ax\""
393
394 #define GLOBAL_ASM_OP ".global "
395
396 #define SUPPORTS_WEAK 1
397
398 #define USER_LABEL_PREFIX ""
399
400 #define REGISTER_PREFIX ""
401 #define REGISTER_NAMES                                                  \
402   { "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",       \
403     "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",      \
404     "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",      \
405     "r24",  "r25",  "r26",  "r27",  "r28",  "r29",  "r30",  "r31",      \
406     "r32",  "r33",  "r34",  "r35",  "r36",  "r37",  "r38",  "r39",      \
407     "r40",  "r41",  "r42",  "r43",  "r44",  "r45",  "r46",  "r47",      \
408     "r48",  "r49",  "r50",  "r51",  "r52",  "tp",   "sp",   "lr",       \
409     "sn",   "idn0", "idn1", "udn0", "udn1", "udn2", "udn3", "zero",     \
410     "?FRAME?", "?ARG?", "?NET?" }
411
412 /* This is used to help emit bundles.  */
413 #define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \
414   tilepro_final_prescan_insn (insn)
415
416 /* This is used to help emit bundles.  */
417 #define ASM_OUTPUT_OPCODE(STREAM, PTR)  \
418   (PTR = tilepro_asm_output_opcode (STREAM, PTR))
419
420 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)            \
421   do                                                    \
422     {                                                   \
423       char label[256];                                  \
424       ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE));\
425       fprintf (FILE, "\t.word ");                       \
426       assemble_name (FILE, label);                      \
427       fprintf (FILE, "\n");                             \
428     }                                                   \
429   while (0)
430
431 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL)        \
432   do                                                            \
433     {                                                           \
434       char label[256];                                          \
435       ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE));        \
436       fprintf (FILE, "\t.word ");                               \
437       assemble_name (FILE, label);                              \
438       ASM_GENERATE_INTERNAL_LABEL (label, "L", (REL));          \
439       fprintf (FILE, "-");                                      \
440       assemble_name (FILE, label);                              \
441       fprintf (FILE, "\n");                                     \
442     }                                                           \
443   while (0)
444
445 #define ASM_OUTPUT_ALIGN(FILE,LOG)  \
446   do { if ((LOG) != 0) fprintf (FILE, "\t.align %d\n", 1 << (LOG)); } while (0)
447
448 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)    \
449   ( fputs (".comm ", (FILE)),                           \
450     assemble_name ((FILE), (NAME)),                     \
451     fprintf ((FILE), ",%u\n", (unsigned int)(ROUNDED)))
452
453 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)     \
454   ( fputs (".lcomm ", (FILE)),                          \
455     assemble_name ((FILE), (NAME)),                     \
456     fprintf ((FILE), ",%u\n", (unsigned int)(ROUNDED)))
457
458 \f
459
460 #define INIT_EXPANDERS tilepro_init_expanders ()
461
462 /* A C structure for machine-specific, per-function data.  This is
463    added to the cfun structure.  */
464 typedef struct GTY(()) machine_function
465 {
466   /* Symbol for the text label used for pic.  */
467   rtx text_label_symbol;
468
469   /* Register for the text label.  */
470   rtx text_label_rtx;
471
472   /* Register for the pic offset table.  */
473   rtx got_rtx;
474
475   /* The function calls tls_get_addr.  */
476   int calls_tls_get_addr;
477 } machine_function;
478
479 #ifndef HAVE_AS_TLS
480 #define HAVE_AS_TLS 0
481 #endif