c++/contracts: ICE in build_contract_condition_function [PR116490]
[official-gcc.git] / gcc / config / xtensa / xtensa.h
blob8680234315224be5ef54e5c95eb8f6c2870149e1
1 /* Definitions of Tensilica's Xtensa target machine for GNU compiler.
2 Copyright (C) 2001-2024 Free Software Foundation, Inc.
3 Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 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 /* Get Xtensa configuration settings */
22 #include "xtensa-dynconfig.h"
24 /* External variables defined in xtensa.cc. */
26 /* Macros used in the machine description to select various Xtensa
27 configuration options. */
28 #define TARGET_BIG_ENDIAN XCHAL_HAVE_BE
29 #define TARGET_DENSITY XCHAL_HAVE_DENSITY
30 #define TARGET_MAC16 XCHAL_HAVE_MAC16
31 #define TARGET_MUL16 XCHAL_HAVE_MUL16
32 #define TARGET_MUL32 XCHAL_HAVE_MUL32
33 #define TARGET_MUL32_HIGH XCHAL_HAVE_MUL32_HIGH
34 #define TARGET_DIV32 XCHAL_HAVE_DIV32
35 #define TARGET_NSA XCHAL_HAVE_NSA
36 #define TARGET_MINMAX XCHAL_HAVE_MINMAX
37 #define TARGET_SEXT XCHAL_HAVE_SEXT
38 #define TARGET_CLAMPS XCHAL_HAVE_CLAMPS
39 #define TARGET_BOOLEANS XCHAL_HAVE_BOOLEANS
40 #define TARGET_HARD_FLOAT XCHAL_HAVE_FP
41 #define TARGET_HARD_FLOAT_DIV XCHAL_HAVE_FP_DIV
42 #define TARGET_HARD_FLOAT_RECIP XCHAL_HAVE_FP_RECIP
43 #define TARGET_HARD_FLOAT_SQRT XCHAL_HAVE_FP_SQRT
44 #define TARGET_HARD_FLOAT_RSQRT XCHAL_HAVE_FP_RSQRT
45 #define TARGET_HARD_FLOAT_POSTINC XCHAL_HAVE_FP_POSTINC
46 #define TARGET_ABS XCHAL_HAVE_ABS
47 #define TARGET_ADDX XCHAL_HAVE_ADDX
48 #define TARGET_RELEASE_SYNC XCHAL_HAVE_RELEASE_SYNC
49 #define TARGET_S32C1I XCHAL_HAVE_S32C1I
50 #define TARGET_ABSOLUTE_LITERALS XSHAL_USE_ABSOLUTE_LITERALS
51 #define TARGET_THREADPTR XCHAL_HAVE_THREADPTR
52 #define TARGET_LOOPS XCHAL_HAVE_LOOPS
53 #define TARGET_WINDOWED_ABI_DEFAULT (XSHAL_ABI == XTHAL_ABI_WINDOWED)
54 #define TARGET_WINDOWED_ABI xtensa_windowed_abi
55 #define TARGET_DEBUG XCHAL_HAVE_DEBUG
56 #define TARGET_L32R XCHAL_HAVE_L32R
57 #define TARGET_SALT (XTENSA_MARCH_EARLIEST >= 270000)
59 #define TARGET_DEFAULT (MASK_SERIALIZE_VOLATILE)
61 #ifndef HAVE_AS_TLS
62 #define HAVE_AS_TLS 0
63 #endif
65 /* Define this if the target has no hardware divide instructions. */
66 #if !__XCHAL_HAVE_DIV32
67 #define TARGET_HAS_NO_HW_DIVIDE
68 #endif
71 /* Target CPU builtins. */
72 #define TARGET_CPU_CPP_BUILTINS() \
73 do { \
74 const char **builtin; \
75 builtin_assert ("cpu=xtensa"); \
76 builtin_assert ("machine=xtensa"); \
77 builtin_define ("__xtensa__"); \
78 builtin_define ("__XTENSA__"); \
79 builtin_define (TARGET_WINDOWED_ABI ? \
80 "__XTENSA_WINDOWED_ABI__" : "__XTENSA_CALL0_ABI__");\
81 builtin_define (TARGET_BIG_ENDIAN ? "__XTENSA_EB__" : "__XTENSA_EL__"); \
82 if (!TARGET_HARD_FLOAT) \
83 builtin_define ("__XTENSA_SOFT_FLOAT__"); \
84 for (builtin = xtensa_get_config_strings (); *builtin; ++builtin) \
85 builtin_define (*builtin); \
86 } while (0)
88 #define CPP_SPEC " %(subtarget_cpp_spec) "
90 #ifndef SUBTARGET_CPP_SPEC
91 #define SUBTARGET_CPP_SPEC ""
92 #endif
94 #define EXTRA_SPECS \
95 { "subtarget_cpp_spec", SUBTARGET_CPP_SPEC },
97 /* Target machine storage layout */
99 /* Define this if most significant bit is lowest numbered
100 in instructions that operate on numbered bit-fields. */
101 #define BITS_BIG_ENDIAN (TARGET_BIG_ENDIAN != 0)
103 /* Define this if most significant byte of a word is the lowest numbered. */
104 #define BYTES_BIG_ENDIAN (TARGET_BIG_ENDIAN != 0)
106 /* Define this if most significant word of a multiword number is the lowest. */
107 #define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN != 0)
109 #define MAX_BITS_PER_WORD 32
111 /* Width of a word, in units (bytes). */
112 #define UNITS_PER_WORD 4
113 #define MIN_UNITS_PER_WORD 4
115 /* Width of a floating point register. */
116 #define UNITS_PER_FPREG 4
118 /* Size in bits of various types on the target machine. */
119 #define INT_TYPE_SIZE 32
120 #define SHORT_TYPE_SIZE 16
121 #define LONG_TYPE_SIZE 32
122 #define LONG_LONG_TYPE_SIZE 64
124 /* Allocation boundary (in *bits*) for storing pointers in memory. */
125 #define POINTER_BOUNDARY 32
127 /* Allocation boundary (in *bits*) for storing arguments in argument list. */
128 #define PARM_BOUNDARY 32
130 /* Allocation boundary (in *bits*) for the code of a function. */
131 #define FUNCTION_BOUNDARY 32
133 /* Alignment of field after 'int : 0' in a structure. */
134 #define EMPTY_FIELD_BOUNDARY 32
136 /* Every structure's size must be a multiple of this. */
137 #define STRUCTURE_SIZE_BOUNDARY 8
139 /* There is no point aligning anything to a rounder boundary than this. */
140 #define BIGGEST_ALIGNMENT 128
142 /* Set this nonzero if move instructions will actually fail to work
143 when given unaligned data. */
144 #define STRICT_ALIGNMENT (xtensa_strict_alignment)
146 /* Promote integer modes smaller than a word to SImode. Set UNSIGNEDP
147 for QImode, because there is no 8-bit load from memory with sign
148 extension. Otherwise, leave UNSIGNEDP alone, since Xtensa has 16-bit
149 loads both with and without sign extension. */
150 #define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \
151 do { \
152 if (GET_MODE_CLASS (MODE) == MODE_INT \
153 && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \
155 if ((MODE) == QImode) \
156 (UNSIGNEDP) = 1; \
157 (MODE) = SImode; \
159 } while (0)
161 /* Imitate the way many other C compilers handle alignment of
162 bitfields and the structures that contain them. */
163 #define PCC_BITFIELD_TYPE_MATTERS 1
165 /* Align arrays, unions and records to at least a word boundary.
166 One use of this macro is to increase alignment of medium-size
167 data to make it all fit in fewer cache lines. Another is to
168 cause character arrays to be word-aligned so that 'strcpy' calls
169 that copy constants to character arrays can be done inline. */
170 #undef DATA_ALIGNMENT
171 #define DATA_ALIGNMENT(TYPE, ALIGN) \
172 (!optimize_size && (((ALIGN) < BITS_PER_WORD) \
173 && (TREE_CODE (TYPE) == ARRAY_TYPE \
174 || TREE_CODE (TYPE) == UNION_TYPE \
175 || TREE_CODE (TYPE) == RECORD_TYPE)) ? BITS_PER_WORD : (ALIGN))
177 /* Operations between registers always perform the operation
178 on the full register even if a narrower mode is specified. */
179 #define WORD_REGISTER_OPERATIONS 1
181 /* Xtensa loads are zero-extended by default. */
182 #define LOAD_EXTEND_OP(MODE) ZERO_EXTEND
184 /* Standard register usage. */
186 /* Number of actual hardware registers.
187 The hardware registers are assigned numbers for the compiler
188 from 0 to just below FIRST_PSEUDO_REGISTER.
189 All registers that the compiler knows about must be given numbers,
190 even those that are not normally considered general registers.
192 The fake frame pointer and argument pointer will never appear in
193 the generated code, since they will always be eliminated and replaced
194 by either the stack pointer or the hard frame pointer.
196 0 - 15 AR[0] - AR[15]
197 16 FRAME_POINTER (fake = initial sp)
198 17 ARG_POINTER (fake = initial sp + framesize)
199 18 BR[0] for floating-point CC
200 19 - 34 FR[0] - FR[15]
201 35 MAC16 accumulator */
203 #define FIRST_PSEUDO_REGISTER 36
205 /* Return the stabs register number to use for REGNO. */
206 #define DEBUGGER_REGNO(REGNO) xtensa_debugger_regno (REGNO)
208 /* 1 for registers that have pervasive standard uses
209 and are not available for the register allocator. */
210 #define FIXED_REGISTERS \
212 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
213 1, 1, 0, \
214 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
215 0, \
218 /* 1 for registers not available across function calls.
219 These need not include the FIXED_REGISTERS but must any
220 registers that can be used without being saved.
221 The latter must include the registers where values are returned
222 and the register where structure-value addresses are passed.
223 Aside from that, you can include as many other registers as you like.
225 The value encoding is the following:
226 1: register is used by all ABIs;
227 bit 1 is set: register is used by windowed ABI;
228 bit 2 is set: register is used by call0 ABI.
230 Proper values are computed in TARGET_CONDITIONAL_REGISTER_USAGE. */
232 #define CALL_REALLY_USED_REGISTERS \
234 1, 0, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 2, 2, 2, 2, \
235 0, 0, 1, \
236 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
237 1, \
240 /* For the windowed register ABI on Xtensa processors, the allocation
241 order is as specified below by REG_ALLOC_ORDER.
242 For the call0 ABI, on the other hand, ADJUST_REG_ALLOC_ORDER hook
243 will be called once at the start of IRA, replacing it with the
244 appropriate one. */
246 #define REG_ALLOC_ORDER \
248 8, 9, 10, 11, 12, 13, 14, 15, 7, 6, 5, 4, 3, 2, \
249 18, \
250 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, \
251 0, 1, 16, 17, \
252 35, \
254 #define ADJUST_REG_ALLOC_ORDER xtensa_adjust_reg_alloc_order ()
256 /* Internal macros to classify a register number. */
258 /* 16 address registers + fake registers */
259 #define GP_REG_FIRST 0
260 #define GP_REG_LAST 17
261 #define GP_REG_NUM (GP_REG_LAST - GP_REG_FIRST + 1)
263 /* Coprocessor registers */
264 #define BR_REG_FIRST 18
265 #define BR_REG_LAST 18
266 #define BR_REG_NUM (BR_REG_LAST - BR_REG_FIRST + 1)
268 /* 16 floating-point registers */
269 #define FP_REG_FIRST 19
270 #define FP_REG_LAST 34
271 #define FP_REG_NUM (FP_REG_LAST - FP_REG_FIRST + 1)
273 /* MAC16 accumulator */
274 #define ACC_REG_FIRST 35
275 #define ACC_REG_LAST 35
276 #define ACC_REG_NUM (ACC_REG_LAST - ACC_REG_FIRST + 1)
278 #define GP_REG_P(REGNO) ((unsigned) ((REGNO) - GP_REG_FIRST) < GP_REG_NUM)
279 #define BR_REG_P(REGNO) ((unsigned) ((REGNO) - BR_REG_FIRST) < BR_REG_NUM)
280 #define FP_REG_P(REGNO) ((unsigned) ((REGNO) - FP_REG_FIRST) < FP_REG_NUM)
281 #define ACC_REG_P(REGNO) ((unsigned) ((REGNO) - ACC_REG_FIRST) < ACC_REG_NUM)
283 /* Register to use for pushing function arguments. */
284 #define STACK_POINTER_REGNUM (GP_REG_FIRST + 1)
286 /* Base register for access to local variables of the function. */
287 #define HARD_FRAME_POINTER_REGNUM \
288 (TARGET_WINDOWED_ABI \
289 ? XTENSA_WINDOWED_HARD_FRAME_POINTER_REGNUM \
290 : XTENSA_CALL0_HARD_FRAME_POINTER_REGNUM)
292 #define XTENSA_WINDOWED_HARD_FRAME_POINTER_REGNUM (GP_REG_FIRST + 7)
293 #define XTENSA_CALL0_HARD_FRAME_POINTER_REGNUM (GP_REG_FIRST + 15)
295 /* The register number of the frame pointer register, which is used to
296 access automatic variables in the stack frame. For Xtensa, this
297 register never appears in the output. It is always eliminated to
298 either the stack pointer or the hard frame pointer. */
299 #define FRAME_POINTER_REGNUM (GP_REG_FIRST + 16)
301 /* Base register for access to arguments of the function. */
302 #define ARG_POINTER_REGNUM (GP_REG_FIRST + 17)
304 /* Hard frame pointer is neither frame nor arg pointer.
305 The definitions are here because actual hard frame pointer register
306 definition is not a preprocessor constant. */
307 #define HARD_FRAME_POINTER_IS_FRAME_POINTER 0
308 #define HARD_FRAME_POINTER_IS_ARG_POINTER 0
310 /* For now we don't try to use the full set of boolean registers. Without
311 software pipelining of FP operations, there's not much to gain and it's
312 a real pain to get them reloaded. */
313 #define FPCC_REGNUM (BR_REG_FIRST + 0)
315 /* It is as good or better to call a constant function address than to
316 call an address kept in a register. */
317 #define NO_FUNCTION_CSE 1
319 /* Xtensa processors have "register windows". GCC does not currently
320 take advantage of the possibility for variable-sized windows; instead,
321 we use a fixed window size of 8. */
323 #define INCOMING_REGNO(OUT) \
324 (TARGET_WINDOWED_ABI ? \
325 ((GP_REG_P (OUT) && \
326 ((unsigned) ((OUT) - GP_REG_FIRST) >= WINDOW_SIZE)) ? \
327 (OUT) - WINDOW_SIZE : (OUT)) : (OUT))
329 #define OUTGOING_REGNO(IN) \
330 (TARGET_WINDOWED_ABI ? \
331 ((GP_REG_P (IN) && \
332 ((unsigned) ((IN) - GP_REG_FIRST) < WINDOW_SIZE)) ? \
333 (IN) + WINDOW_SIZE : (IN)) : (IN))
336 /* Define the classes of registers for register constraints in the
337 machine description. */
338 enum reg_class
340 NO_REGS, /* no registers in set */
341 BR_REGS, /* coprocessor boolean registers */
342 FP_REGS, /* floating point registers */
343 ACC_REG, /* MAC16 accumulator */
344 SP_REG, /* sp register (aka a1) */
345 ISC_REGS, /* registers for indirect sibling calls */
346 RL_REGS, /* preferred reload regs (not sp or fp) */
347 GR_REGS, /* integer registers except sp */
348 AR_REGS, /* all integer registers */
349 ALL_REGS, /* all registers */
350 LIM_REG_CLASSES /* max value + 1 */
353 #define N_REG_CLASSES (int) LIM_REG_CLASSES
355 #define GENERAL_REGS AR_REGS
357 /* An initializer containing the names of the register classes as C
358 string constants. These names are used in writing some of the
359 debugging dumps. */
360 #define REG_CLASS_NAMES \
362 "NO_REGS", \
363 "BR_REGS", \
364 "FP_REGS", \
365 "ACC_REG", \
366 "SP_REG", \
367 "ISC_REGS", \
368 "RL_REGS", \
369 "GR_REGS", \
370 "AR_REGS", \
371 "ALL_REGS" \
374 /* Contents of the register classes. The Nth integer specifies the
375 contents of class N. The way the integer MASK is interpreted is
376 that register R is in the class if 'MASK & (1 << R)' is 1. */
377 #define REG_CLASS_CONTENTS \
379 { 0x00000000, 0x00000000 }, /* no registers */ \
380 { 0x00040000, 0x00000000 }, /* coprocessor boolean registers */ \
381 { 0xfff80000, 0x00000007 }, /* floating-point registers */ \
382 { 0x00000000, 0x00000008 }, /* MAC16 accumulator */ \
383 { 0x00000002, 0x00000000 }, /* stack pointer register */ \
384 { 0x000001fc, 0x00000000 }, /* registers for indirect sibling calls */ \
385 { 0x0000fffd, 0x00000000 }, /* preferred reload registers */ \
386 { 0x0000fffd, 0x00000000 }, /* general-purpose registers */ \
387 { 0x0003ffff, 0x00000000 }, /* integer registers */ \
388 { 0xffffffff, 0x0000000f } /* all registers */ \
391 /* A C expression whose value is a register class containing hard
392 register REGNO. In general there is more that one such class;
393 choose a class which is "minimal", meaning that no smaller class
394 also contains the register. */
395 #define REGNO_REG_CLASS(REGNO) xtensa_regno_to_class (REGNO)
397 /* Use the Xtensa AR register file for base registers.
398 No index registers. */
399 #define BASE_REG_CLASS AR_REGS
400 #define INDEX_REG_CLASS NO_REGS
402 /* The small_register_classes_for_mode_p hook must always return true for
403 Xtrnase, because all of the 16 AR registers may be explicitly used in
404 the RTL, as either incoming or outgoing arguments. */
405 #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P hook_bool_mode_true
407 /* Stack layout; function entry, exit and calling. */
409 #define STACK_GROWS_DOWNWARD 1
411 #define FRAME_GROWS_DOWNWARD (flag_stack_protect \
412 || (flag_sanitize & SANITIZE_ADDRESS) != 0)
414 /* The ARG_POINTER and FRAME_POINTER are not real Xtensa registers, so
415 they are eliminated to either the stack pointer or hard frame pointer.
416 Since hard frame pointer is different register in windowed and call0
417 ABIs list them both and only allow real HARD_FRAME_POINTER_REGNUM in
418 TARGET_CAN_ELIMINATE. */
419 #define ELIMINABLE_REGS \
420 {{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
421 { ARG_POINTER_REGNUM, XTENSA_WINDOWED_HARD_FRAME_POINTER_REGNUM}, \
422 { ARG_POINTER_REGNUM, XTENSA_CALL0_HARD_FRAME_POINTER_REGNUM}, \
423 { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
424 { FRAME_POINTER_REGNUM, XTENSA_WINDOWED_HARD_FRAME_POINTER_REGNUM}, \
425 { FRAME_POINTER_REGNUM, XTENSA_CALL0_HARD_FRAME_POINTER_REGNUM}}
427 /* Specify the initial difference between the specified pair of registers. */
428 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
429 (OFFSET) = xtensa_initial_elimination_offset ((FROM), (TO))
431 /* If defined, the maximum amount of space required for outgoing
432 arguments will be computed and placed into the variable
433 'crtl->outgoing_args_size'. No space will be pushed
434 onto the stack for each call; instead, the function prologue
435 should increase the stack frame size by this amount. */
436 #define ACCUMULATE_OUTGOING_ARGS 1
438 /* Offset from the argument pointer register to the first argument's
439 address. On some machines it may depend on the data type of the
440 function. If 'ARGS_GROW_DOWNWARD', this is the offset to the
441 location above the first argument's address. */
442 #define FIRST_PARM_OFFSET(FNDECL) 0
444 /* Align stack frames on 128 bits for Xtensa. This is necessary for
445 128-bit datatypes defined in TIE (e.g., for Vectra). */
446 #define STACK_BOUNDARY 128
448 /* Use a fixed register window size of 8. */
449 #define WINDOW_SIZE (TARGET_WINDOWED_ABI ? 8 : 0)
451 /* Symbolic macros for the registers used to return integer, floating
452 point, and values of coprocessor and user-defined modes. */
453 #define GP_RETURN_FIRST (GP_REG_FIRST + 2 + WINDOW_SIZE)
454 #define GP_RETURN_LAST (GP_RETURN_FIRST + 3)
455 #define GP_OUTGOING_RETURN (GP_REG_FIRST + 2)
457 /* Symbolic macros for the first/last argument registers. */
458 #define GP_ARG_FIRST (GP_REG_FIRST + 2)
459 #define GP_ARG_LAST (GP_REG_FIRST + 7)
460 #define GP_OUTGOING_ARG_FIRST (GP_REG_FIRST + 2 + WINDOW_SIZE)
461 #define GP_OUTGOING_ARG_LAST (GP_REG_FIRST + 7 + WINDOW_SIZE)
463 #define MAX_ARGS_IN_REGISTERS 6
465 /* Don't worry about compatibility with PCC. */
466 #define DEFAULT_PCC_STRUCT_RETURN 0
468 /* A C expression that is nonzero if REGNO is the number of a hard
469 register in which function arguments are sometimes passed. This
470 does *not* include implicit arguments such as the static chain and
471 the structure-value address. On many machines, no registers can be
472 used for this purpose since all function arguments are pushed on
473 the stack. */
474 #define FUNCTION_ARG_REGNO_P(N) \
475 IN_RANGE ((N), GP_OUTGOING_ARG_FIRST, GP_OUTGOING_ARG_LAST)
477 /* Record the number of argument words seen so far, along with a flag to
478 indicate whether these are incoming arguments. (FUNCTION_INCOMING_ARG
479 is used for both incoming and outgoing args, so a separate flag is
480 needed. */
481 typedef struct xtensa_args
483 int arg_words;
484 int incoming;
485 } CUMULATIVE_ARGS;
487 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \
488 init_cumulative_args (&CUM, 0)
490 #define INIT_CUMULATIVE_INCOMING_ARGS(CUM, FNTYPE, LIBNAME) \
491 init_cumulative_args (&CUM, 1)
493 /* Profiling Xtensa code is typically done with the built-in profiling
494 feature of Tensilica's instruction set simulator, which does not
495 require any compiler support. Profiling code on a real (i.e.,
496 non-simulated) Xtensa processor is currently only supported by
497 GNU/Linux with glibc. The glibc version of _mcount doesn't require
498 counter variables. The _mcount function needs the current PC and
499 the current return address to identify an arc in the call graph.
500 Pass the current return address as the first argument; the current
501 PC is available as a0 in _mcount's register window. Both of these
502 values contain window size information in the two most significant
503 bits; we assume that _mcount will mask off those bits. The call to
504 _mcount uses a window size of 8 to make sure that it doesn't clobber
505 any incoming argument values. */
507 #define NO_PROFILE_COUNTERS 1
509 #define FUNCTION_PROFILER(FILE, LABELNO) \
510 do { \
511 fprintf (FILE, "\t%s\ta10, a0\n", TARGET_DENSITY ? "mov.n" : "mov"); \
512 if (flag_pic) \
514 fprintf (FILE, "\tmovi\ta%d, _mcount@PLT\n", WINDOW_SIZE); \
515 fprintf (FILE, "\tcallx%d\ta%d\n", WINDOW_SIZE, WINDOW_SIZE); \
517 else \
518 fprintf (FILE, "\tcall%d\t_mcount\n", WINDOW_SIZE); \
519 } while (0)
521 /* Stack pointer value doesn't matter at exit. */
522 #define EXIT_IGNORE_STACK 1
524 /* Size in bytes of the trampoline, as an integer. Make sure this is
525 a multiple of TRAMPOLINE_ALIGNMENT to avoid -Wpadded warnings. */
526 #define TRAMPOLINE_SIZE (TARGET_WINDOWED_ABI ? \
527 (TARGET_CONST16 || TARGET_ABSOLUTE_LITERALS ? \
528 60 : 52) : \
529 (TARGET_CONST16 || TARGET_ABSOLUTE_LITERALS ? \
530 32 : 24))
532 /* Alignment required for trampolines, in bits. */
533 #define TRAMPOLINE_ALIGNMENT 32
535 /* If defined, a C expression that produces the machine-specific code
536 to setup the stack so that arbitrary frames can be accessed.
538 On Xtensa, a stack back-trace must always begin from the stack pointer,
539 so that the register overflow save area can be located. However, the
540 stack-walking code in GCC always begins from the hard_frame_pointer
541 register, not the stack pointer. The frame pointer is usually equal
542 to the stack pointer, but the __builtin_return_address and
543 __builtin_frame_address functions will not work if count > 0 and
544 they are called from a routine that uses alloca. These functions
545 are not guaranteed to work at all if count > 0 so maybe that is OK.
547 A nicer solution would be to allow the architecture-specific files to
548 specify whether to start from the stack pointer or frame pointer. That
549 would also allow us to skip the machine->accesses_prev_frame stuff that
550 we currently need to ensure that there is a frame pointer when these
551 builtin functions are used. */
553 #define SETUP_FRAME_ADDRESSES xtensa_setup_frame_addresses
555 /* A C expression whose value is RTL representing the address in a
556 stack frame where the pointer to the caller's frame is stored.
557 Assume that FRAMEADDR is an RTL expression for the address of the
558 stack frame itself.
560 For Xtensa, there is no easy way to get the frame pointer if it is
561 not equivalent to the stack pointer. Moreover, the result of this
562 macro is used for continuing to walk back up the stack, so it must
563 return the stack pointer address. Thus, there is some inconsistency
564 here in that __builtin_frame_address will return the frame pointer
565 when count == 0 and the stack pointer when count > 0. */
567 #define DYNAMIC_CHAIN_ADDRESS(frame) \
568 gen_rtx_PLUS (Pmode, frame, GEN_INT (-3 * UNITS_PER_WORD))
570 /* Define this if the return address of a particular stack frame is
571 accessed from the frame pointer of the previous stack frame. */
572 #define RETURN_ADDR_IN_PREVIOUS_FRAME TARGET_WINDOWED_ABI
574 /* A C expression whose value is RTL representing the value of the
575 return address for the frame COUNT steps up from the current
576 frame, after the prologue. */
577 #define RETURN_ADDR_RTX xtensa_return_addr
579 /* Addressing modes, and classification of registers for them. */
581 /* C expressions which are nonzero if register number NUM is suitable
582 for use as a base or index register in operand addresses. */
584 #define REGNO_OK_FOR_INDEX_P(NUM) 0
585 #define REGNO_OK_FOR_BASE_P(NUM) \
586 (GP_REG_P (NUM) || GP_REG_P ((unsigned) reg_renumber[NUM]))
588 /* C expressions that are nonzero if X (assumed to be a `reg' RTX) is
589 valid for use as a base or index register. */
591 #define BASE_REG_P(X, STRICT) \
592 ((!(STRICT) && ! HARD_REGISTER_P (X)) \
593 || REGNO_OK_FOR_BASE_P (REGNO (X)))
595 /* Maximum number of registers that can appear in a valid memory address. */
596 #define MAX_REGS_PER_ADDRESS 1
598 /* A C expression that is 1 if the RTX X is a constant which is a
599 valid address. This is defined to be the same as 'CONSTANT_P (X)',
600 but rejecting CONST_DOUBLE. */
601 #define CONSTANT_ADDRESS_P(X) \
602 ((LABEL_REF_P (X) || SYMBOL_REF_P (X) || CONST_INT_P (X) \
603 || (GET_CODE (X) == HIGH) \
604 || (GET_CODE (X) == CONST)))
606 /* A C expression that is nonzero if X is a legitimate immediate
607 operand on the target machine when generating position independent
608 code. */
609 #define LEGITIMATE_PIC_OPERAND_P(X) \
610 ((! SYMBOL_REF_P (X) \
611 || (SYMBOL_REF_LOCAL_P (X) && ! SYMBOL_REF_EXTERNAL_P (X))) \
612 && ! LABEL_REF_P (X) \
613 && GET_CODE (X) != CONST)
615 /* Specify the machine mode that this machine uses
616 for the index in the tablejump instruction. */
617 #define CASE_VECTOR_MODE (SImode)
619 /* Define this as 1 if 'char' should by default be signed; else as 0. */
620 #define DEFAULT_SIGNED_CHAR 0
622 /* Max number of bytes we can move from memory to memory
623 in one reasonably fast instruction. */
624 #define MOVE_MAX 4
625 #define MAX_MOVE_MAX 4
627 /* Prefer word-sized loads. */
628 #define SLOW_BYTE_ACCESS 1
630 /* Shift instructions ignore all but the low-order few bits. */
631 #define SHIFT_COUNT_TRUNCATED 1
633 #define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = 32, 1)
634 #define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) ((VALUE) = -1, 1)
636 /* Specify the machine mode that pointers have.
637 After generation of rtl, the compiler makes no further distinction
638 between pointers and any other objects of this machine mode. */
639 #define Pmode SImode
641 /* A function address in a call instruction is a word address (for
642 indexing purposes) so give the MEM rtx a words's mode. */
643 #define FUNCTION_MODE SImode
645 #define BRANCH_COST(speed_p, predictable_p) 3
647 /* How to refer to registers in assembler output.
648 This sequence is indexed by compiler's hard-register-number (see above). */
649 #define REGISTER_NAMES \
651 "a0", "sp", "a2", "a3", "a4", "a5", "a6", "a7", \
652 "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", \
653 "fp", "argp", "b0", \
654 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
655 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
656 "acc" \
659 /* If defined, a C initializer for an array of structures containing a
660 name and a register number. This macro defines additional names
661 for hard registers, thus allowing the 'asm' option in declarations
662 to refer to registers using alternate names. */
663 #define ADDITIONAL_REGISTER_NAMES \
665 { "a1", 1 + GP_REG_FIRST } \
668 #define PRINT_OPERAND(FILE, X, CODE) print_operand (FILE, X, CODE)
669 #define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR)
671 /* Globalizing directive for a label. */
672 #define GLOBAL_ASM_OP "\t.global\t"
674 /* Declare an uninitialized external linkage data object. */
675 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
676 asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
678 /* This is how to output an element of a case-vector that is absolute. */
679 #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \
680 fprintf (STREAM, "%s%sL%u\n", integer_asm_op (4, TRUE), \
681 LOCAL_LABEL_PREFIX, VALUE)
683 /* This is how to output an element of a case-vector that is relative.
684 This is used for pc-relative code. */
685 #define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \
686 do { \
687 fprintf (STREAM, "%s%sL%u-%sL%u\n", integer_asm_op (4, TRUE), \
688 LOCAL_LABEL_PREFIX, (VALUE), \
689 LOCAL_LABEL_PREFIX, (REL)); \
690 } while (0)
692 /* This is how to output an assembler line that says to advance the
693 location counter to a multiple of 2**LOG bytes. */
694 #define ASM_OUTPUT_ALIGN(STREAM, LOG) \
695 do { \
696 if ((LOG) != 0) \
697 fprintf (STREAM, "\t.align\t%d\n", 1 << (LOG)); \
698 } while (0)
700 /* Indicate that jump tables go in the text section. This is
701 necessary when compiling PIC code. */
702 #define JUMP_TABLES_IN_TEXT_SECTION (flag_pic)
705 /* Define the strings to put out for each section in the object file. */
706 #define TEXT_SECTION_ASM_OP "\t.text"
707 #define DATA_SECTION_ASM_OP "\t.data"
708 #define BSS_SECTION_ASM_OP "\t.section\t.bss"
711 /* Define output to appear before the constant pool. */
712 #define ASM_OUTPUT_POOL_PROLOGUE(FILE, FUNNAME, FUNDECL, SIZE) \
713 do { \
714 if ((SIZE) > 0 || !TARGET_WINDOWED_ABI) \
716 resolve_unique_section ((FUNDECL), 0, flag_function_sections); \
717 switch_to_section (function_section (FUNDECL)); \
718 fprintf (FILE, "\t.literal_position\n"); \
720 } while (0)
723 /* A C statement (with or without semicolon) to output a constant in
724 the constant pool, if it needs special treatment. */
725 #define ASM_OUTPUT_SPECIAL_POOL_ENTRY(FILE, X, MODE, ALIGN, LABELNO, JUMPTO) \
726 do { \
727 xtensa_output_literal (FILE, X, MODE, LABELNO); \
728 goto JUMPTO; \
729 } while (0)
731 /* How to start an assembler comment. */
732 #define ASM_COMMENT_START "#"
734 /* Exception handling. Xtensa uses much of the standard DWARF2 unwinding
735 machinery, but the variable size register window save areas are too
736 complicated to efficiently describe with CFI entries. The CFA must
737 still be specified in DWARF so that DW_AT_frame_base is set correctly
738 for debugging. */
739 #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, 0)
740 #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (0)
741 #define DWARF_ALT_FRAME_RETURN_COLUMN 16
742 #define DWARF_FRAME_REGISTERS (TARGET_WINDOWED_ABI \
743 ? DWARF_ALT_FRAME_RETURN_COLUMN \
744 : DWARF_ALT_FRAME_RETURN_COLUMN + 1)
745 #define EH_RETURN_DATA_REGNO(N) ((N) < 2 ? (N) + 2 : INVALID_REGNUM)
746 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
747 (flag_pic \
748 ? (((GLOBAL) ? DW_EH_PE_indirect : 0) \
749 | DW_EH_PE_pcrel | DW_EH_PE_sdata4) \
750 : DW_EH_PE_absptr)
752 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, GP_REG_FIRST + 10)
754 /* Emit a PC-relative relocation. */
755 #define ASM_OUTPUT_DWARF_PCREL(FILE, SIZE, LABEL) \
756 do { \
757 fputs (integer_asm_op (SIZE, FALSE), FILE); \
758 assemble_name (FILE, LABEL); \
759 fputs ("@pcrel", FILE); \
760 } while (0)
762 /* Xtensa constant pool breaks the devices in crtstuff.c to control
763 section in where code resides. We have to write it as asm code. Use
764 a MOVI and let the assembler relax it -- for the .init and .fini
765 sections, the assembler knows to put the literal in the right
766 place. */
767 #if defined(__XTENSA_WINDOWED_ABI__)
768 #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
769 asm (SECTION_OP "\n\
770 movi\ta8, " USER_LABEL_PREFIX #FUNC "\n\
771 callx8\ta8\n" \
772 TEXT_SECTION_ASM_OP);
773 #elif defined(__XTENSA_CALL0_ABI__)
774 #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
775 asm (SECTION_OP "\n\
776 movi\ta0, " USER_LABEL_PREFIX #FUNC "\n\
777 callx0\ta0\n" \
778 TEXT_SECTION_ASM_OP);
779 #endif