tm.texi (TARGET_LEGITIMATE_ADDRESS_P): Refer mainly to this in the former documentati...
[gcc.git] / gcc / config / xtensa / xtensa.c
1 /* Subroutines for insn-output.c for Tensilica's Xtensa architecture.
2 Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "rtl.h"
27 #include "regs.h"
28 #include "hard-reg-set.h"
29 #include "basic-block.h"
30 #include "real.h"
31 #include "insn-config.h"
32 #include "conditions.h"
33 #include "insn-flags.h"
34 #include "insn-attr.h"
35 #include "insn-codes.h"
36 #include "recog.h"
37 #include "output.h"
38 #include "tree.h"
39 #include "expr.h"
40 #include "flags.h"
41 #include "reload.h"
42 #include "tm_p.h"
43 #include "function.h"
44 #include "toplev.h"
45 #include "optabs.h"
46 #include "libfuncs.h"
47 #include "ggc.h"
48 #include "target.h"
49 #include "target-def.h"
50 #include "langhooks.h"
51 #include "gimple.h"
52 #include "df.h"
53
54
55 /* Enumeration for all of the relational tests, so that we can build
56 arrays indexed by the test type, and not worry about the order
57 of EQ, NE, etc. */
58
59 enum internal_test
60 {
61 ITEST_EQ,
62 ITEST_NE,
63 ITEST_GT,
64 ITEST_GE,
65 ITEST_LT,
66 ITEST_LE,
67 ITEST_GTU,
68 ITEST_GEU,
69 ITEST_LTU,
70 ITEST_LEU,
71 ITEST_MAX
72 };
73
74 /* Array giving truth value on whether or not a given hard register
75 can support a given mode. */
76 char xtensa_hard_regno_mode_ok[(int) MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
77
78 /* Current frame size calculated by compute_frame_size. */
79 unsigned xtensa_current_frame_size;
80
81 /* Largest block move to handle in-line. */
82 #define LARGEST_MOVE_RATIO 15
83
84 /* Define the structure for the machine field in struct function. */
85 struct GTY(()) machine_function
86 {
87 int accesses_prev_frame;
88 bool need_a7_copy;
89 bool vararg_a7;
90 rtx vararg_a7_copy;
91 rtx set_frame_ptr_insn;
92 };
93
94 /* Vector, indexed by hard register number, which contains 1 for a
95 register that is allowable in a candidate for leaf function
96 treatment. */
97
98 const char xtensa_leaf_regs[FIRST_PSEUDO_REGISTER] =
99 {
100 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
101 1, 1, 1,
102 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
103 1
104 };
105
106 /* Map hard register number to register class */
107 const enum reg_class xtensa_regno_to_class[FIRST_PSEUDO_REGISTER] =
108 {
109 RL_REGS, SP_REG, RL_REGS, RL_REGS,
110 RL_REGS, RL_REGS, RL_REGS, GR_REGS,
111 RL_REGS, RL_REGS, RL_REGS, RL_REGS,
112 RL_REGS, RL_REGS, RL_REGS, RL_REGS,
113 AR_REGS, AR_REGS, BR_REGS,
114 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
115 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
116 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
117 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
118 ACC_REG,
119 };
120
121 static enum internal_test map_test_to_internal_test (enum rtx_code);
122 static rtx gen_int_relational (enum rtx_code, rtx, rtx, int *);
123 static rtx gen_float_relational (enum rtx_code, rtx, rtx);
124 static rtx gen_conditional_move (enum rtx_code, enum machine_mode, rtx, rtx);
125 static rtx fixup_subreg_mem (rtx);
126 static struct machine_function * xtensa_init_machine_status (void);
127 static rtx xtensa_legitimize_tls_address (rtx);
128 static rtx xtensa_legitimize_address (rtx, rtx, enum machine_mode);
129 static bool xtensa_return_in_msb (const_tree);
130 static void printx (FILE *, signed int);
131 static void xtensa_function_epilogue (FILE *, HOST_WIDE_INT);
132 static rtx xtensa_builtin_saveregs (void);
133 static bool xtensa_legitimate_address_p (enum machine_mode, rtx, bool);
134 static unsigned int xtensa_multibss_section_type_flags (tree, const char *,
135 int) ATTRIBUTE_UNUSED;
136 static section *xtensa_select_rtx_section (enum machine_mode, rtx,
137 unsigned HOST_WIDE_INT);
138 static bool xtensa_rtx_costs (rtx, int, int, int *, bool);
139 static tree xtensa_build_builtin_va_list (void);
140 static bool xtensa_return_in_memory (const_tree, const_tree);
141 static tree xtensa_gimplify_va_arg_expr (tree, tree, gimple_seq *,
142 gimple_seq *);
143 static rtx xtensa_function_value (const_tree, const_tree, bool);
144 static void xtensa_init_builtins (void);
145 static tree xtensa_fold_builtin (tree, tree, bool);
146 static rtx xtensa_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
147 static void xtensa_va_start (tree, rtx);
148
149 static const int reg_nonleaf_alloc_order[FIRST_PSEUDO_REGISTER] =
150 REG_ALLOC_ORDER;
151 \f
152
153 /* This macro generates the assembly code for function exit,
154 on machines that need it. If FUNCTION_EPILOGUE is not defined
155 then individual return instructions are generated for each
156 return statement. Args are same as for FUNCTION_PROLOGUE. */
157
158 #undef TARGET_ASM_FUNCTION_EPILOGUE
159 #define TARGET_ASM_FUNCTION_EPILOGUE xtensa_function_epilogue
160
161 /* These hooks specify assembly directives for creating certain kinds
162 of integer object. */
163
164 #undef TARGET_ASM_ALIGNED_SI_OP
165 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
166
167 #undef TARGET_ASM_SELECT_RTX_SECTION
168 #define TARGET_ASM_SELECT_RTX_SECTION xtensa_select_rtx_section
169
170 #undef TARGET_DEFAULT_TARGET_FLAGS
171 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT | MASK_FUSED_MADD)
172
173 #undef TARGET_LEGITIMIZE_ADDRESS
174 #define TARGET_LEGITIMIZE_ADDRESS xtensa_legitimize_address
175
176 #undef TARGET_RTX_COSTS
177 #define TARGET_RTX_COSTS xtensa_rtx_costs
178 #undef TARGET_ADDRESS_COST
179 #define TARGET_ADDRESS_COST hook_int_rtx_bool_0
180
181 #undef TARGET_BUILD_BUILTIN_VA_LIST
182 #define TARGET_BUILD_BUILTIN_VA_LIST xtensa_build_builtin_va_list
183
184 #undef TARGET_EXPAND_BUILTIN_VA_START
185 #define TARGET_EXPAND_BUILTIN_VA_START xtensa_va_start
186
187 #undef TARGET_PROMOTE_FUNCTION_ARGS
188 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_const_tree_true
189 #undef TARGET_PROMOTE_FUNCTION_RETURN
190 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_const_tree_true
191 #undef TARGET_PROMOTE_PROTOTYPES
192 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
193
194 #undef TARGET_RETURN_IN_MEMORY
195 #define TARGET_RETURN_IN_MEMORY xtensa_return_in_memory
196 #undef TARGET_FUNCTION_VALUE
197 #define TARGET_FUNCTION_VALUE xtensa_function_value
198 #undef TARGET_SPLIT_COMPLEX_ARG
199 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true
200 #undef TARGET_MUST_PASS_IN_STACK
201 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
202
203 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
204 #define TARGET_EXPAND_BUILTIN_SAVEREGS xtensa_builtin_saveregs
205 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
206 #define TARGET_GIMPLIFY_VA_ARG_EXPR xtensa_gimplify_va_arg_expr
207
208 #undef TARGET_RETURN_IN_MSB
209 #define TARGET_RETURN_IN_MSB xtensa_return_in_msb
210
211 #undef TARGET_INIT_BUILTINS
212 #define TARGET_INIT_BUILTINS xtensa_init_builtins
213 #undef TARGET_FOLD_BUILTIN
214 #define TARGET_FOLD_BUILTIN xtensa_fold_builtin
215 #undef TARGET_EXPAND_BUILTIN
216 #define TARGET_EXPAND_BUILTIN xtensa_expand_builtin
217
218 #undef TARGET_SECONDARY_RELOAD
219 #define TARGET_SECONDARY_RELOAD xtensa_secondary_reload
220
221 #undef TARGET_HAVE_TLS
222 #define TARGET_HAVE_TLS (TARGET_THREADPTR && HAVE_AS_TLS)
223
224 #undef TARGET_CANNOT_FORCE_CONST_MEM
225 #define TARGET_CANNOT_FORCE_CONST_MEM xtensa_tls_referenced_p
226
227 #undef TARGET_LEGITIMATE_ADDRESS_P
228 #define TARGET_LEGITIMATE_ADDRESS_P xtensa_legitimate_address_p
229
230 struct gcc_target targetm = TARGET_INITIALIZER;
231
232 \f
233 /* Functions to test Xtensa immediate operand validity. */
234
235 bool
236 xtensa_simm8 (HOST_WIDE_INT v)
237 {
238 return v >= -128 && v <= 127;
239 }
240
241
242 bool
243 xtensa_simm8x256 (HOST_WIDE_INT v)
244 {
245 return (v & 255) == 0 && (v >= -32768 && v <= 32512);
246 }
247
248
249 bool
250 xtensa_simm12b (HOST_WIDE_INT v)
251 {
252 return v >= -2048 && v <= 2047;
253 }
254
255
256 static bool
257 xtensa_uimm8 (HOST_WIDE_INT v)
258 {
259 return v >= 0 && v <= 255;
260 }
261
262
263 static bool
264 xtensa_uimm8x2 (HOST_WIDE_INT v)
265 {
266 return (v & 1) == 0 && (v >= 0 && v <= 510);
267 }
268
269
270 static bool
271 xtensa_uimm8x4 (HOST_WIDE_INT v)
272 {
273 return (v & 3) == 0 && (v >= 0 && v <= 1020);
274 }
275
276
277 static bool
278 xtensa_b4const (HOST_WIDE_INT v)
279 {
280 switch (v)
281 {
282 case -1:
283 case 1:
284 case 2:
285 case 3:
286 case 4:
287 case 5:
288 case 6:
289 case 7:
290 case 8:
291 case 10:
292 case 12:
293 case 16:
294 case 32:
295 case 64:
296 case 128:
297 case 256:
298 return true;
299 }
300 return false;
301 }
302
303
304 bool
305 xtensa_b4const_or_zero (HOST_WIDE_INT v)
306 {
307 if (v == 0)
308 return true;
309 return xtensa_b4const (v);
310 }
311
312
313 bool
314 xtensa_b4constu (HOST_WIDE_INT v)
315 {
316 switch (v)
317 {
318 case 32768:
319 case 65536:
320 case 2:
321 case 3:
322 case 4:
323 case 5:
324 case 6:
325 case 7:
326 case 8:
327 case 10:
328 case 12:
329 case 16:
330 case 32:
331 case 64:
332 case 128:
333 case 256:
334 return true;
335 }
336 return false;
337 }
338
339
340 bool
341 xtensa_mask_immediate (HOST_WIDE_INT v)
342 {
343 #define MAX_MASK_SIZE 16
344 int mask_size;
345
346 for (mask_size = 1; mask_size <= MAX_MASK_SIZE; mask_size++)
347 {
348 if ((v & 1) == 0)
349 return false;
350 v = v >> 1;
351 if (v == 0)
352 return true;
353 }
354
355 return false;
356 }
357
358
359 /* This is just like the standard true_regnum() function except that it
360 works even when reg_renumber is not initialized. */
361
362 int
363 xt_true_regnum (rtx x)
364 {
365 if (GET_CODE (x) == REG)
366 {
367 if (reg_renumber
368 && REGNO (x) >= FIRST_PSEUDO_REGISTER
369 && reg_renumber[REGNO (x)] >= 0)
370 return reg_renumber[REGNO (x)];
371 return REGNO (x);
372 }
373 if (GET_CODE (x) == SUBREG)
374 {
375 int base = xt_true_regnum (SUBREG_REG (x));
376 if (base >= 0 && base < FIRST_PSEUDO_REGISTER)
377 return base + subreg_regno_offset (REGNO (SUBREG_REG (x)),
378 GET_MODE (SUBREG_REG (x)),
379 SUBREG_BYTE (x), GET_MODE (x));
380 }
381 return -1;
382 }
383
384
385 int
386 xtensa_valid_move (enum machine_mode mode, rtx *operands)
387 {
388 /* Either the destination or source must be a register, and the
389 MAC16 accumulator doesn't count. */
390
391 if (register_operand (operands[0], mode))
392 {
393 int dst_regnum = xt_true_regnum (operands[0]);
394
395 /* The stack pointer can only be assigned with a MOVSP opcode. */
396 if (dst_regnum == STACK_POINTER_REGNUM)
397 return (mode == SImode
398 && register_operand (operands[1], mode)
399 && !ACC_REG_P (xt_true_regnum (operands[1])));
400
401 if (!ACC_REG_P (dst_regnum))
402 return true;
403 }
404 if (register_operand (operands[1], mode))
405 {
406 int src_regnum = xt_true_regnum (operands[1]);
407 if (!ACC_REG_P (src_regnum))
408 return true;
409 }
410 return FALSE;
411 }
412
413
414 int
415 smalloffset_mem_p (rtx op)
416 {
417 if (GET_CODE (op) == MEM)
418 {
419 rtx addr = XEXP (op, 0);
420 if (GET_CODE (addr) == REG)
421 return BASE_REG_P (addr, 0);
422 if (GET_CODE (addr) == PLUS)
423 {
424 rtx offset = XEXP (addr, 0);
425 HOST_WIDE_INT val;
426 if (GET_CODE (offset) != CONST_INT)
427 offset = XEXP (addr, 1);
428 if (GET_CODE (offset) != CONST_INT)
429 return FALSE;
430
431 val = INTVAL (offset);
432 return (val & 3) == 0 && (val >= 0 && val <= 60);
433 }
434 }
435 return FALSE;
436 }
437
438
439 int
440 constantpool_address_p (rtx addr)
441 {
442 rtx sym = addr;
443
444 if (GET_CODE (addr) == CONST)
445 {
446 rtx offset;
447
448 /* Only handle (PLUS (SYM, OFFSET)) form. */
449 addr = XEXP (addr, 0);
450 if (GET_CODE (addr) != PLUS)
451 return FALSE;
452
453 /* Make sure the address is word aligned. */
454 offset = XEXP (addr, 1);
455 if ((GET_CODE (offset) != CONST_INT)
456 || ((INTVAL (offset) & 3) != 0))
457 return FALSE;
458
459 sym = XEXP (addr, 0);
460 }
461
462 if ((GET_CODE (sym) == SYMBOL_REF)
463 && CONSTANT_POOL_ADDRESS_P (sym))
464 return TRUE;
465 return FALSE;
466 }
467
468
469 int
470 constantpool_mem_p (rtx op)
471 {
472 if (GET_CODE (op) == SUBREG)
473 op = SUBREG_REG (op);
474 if (GET_CODE (op) == MEM)
475 return constantpool_address_p (XEXP (op, 0));
476 return FALSE;
477 }
478
479
480 /* Return TRUE if X is a thread-local symbol. */
481
482 static bool
483 xtensa_tls_symbol_p (rtx x)
484 {
485 if (! TARGET_HAVE_TLS)
486 return false;
487
488 return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
489 }
490
491
492 void
493 xtensa_extend_reg (rtx dst, rtx src)
494 {
495 rtx temp = gen_reg_rtx (SImode);
496 rtx shift = GEN_INT (BITS_PER_WORD - GET_MODE_BITSIZE (GET_MODE (src)));
497
498 /* Generate paradoxical subregs as needed so that the modes match. */
499 src = simplify_gen_subreg (SImode, src, GET_MODE (src), 0);
500 dst = simplify_gen_subreg (SImode, dst, GET_MODE (dst), 0);
501
502 emit_insn (gen_ashlsi3 (temp, src, shift));
503 emit_insn (gen_ashrsi3 (dst, temp, shift));
504 }
505
506
507 bool
508 xtensa_mem_offset (unsigned v, enum machine_mode mode)
509 {
510 switch (mode)
511 {
512 case BLKmode:
513 /* Handle the worst case for block moves. See xtensa_expand_block_move
514 where we emit an optimized block move operation if the block can be
515 moved in < "move_ratio" pieces. The worst case is when the block is
516 aligned but has a size of (3 mod 4) (does this happen?) so that the
517 last piece requires a byte load/store. */
518 return (xtensa_uimm8 (v)
519 && xtensa_uimm8 (v + MOVE_MAX * LARGEST_MOVE_RATIO));
520
521 case QImode:
522 return xtensa_uimm8 (v);
523
524 case HImode:
525 return xtensa_uimm8x2 (v);
526
527 case DFmode:
528 return (xtensa_uimm8x4 (v) && xtensa_uimm8x4 (v + 4));
529
530 default:
531 break;
532 }
533
534 return xtensa_uimm8x4 (v);
535 }
536
537
538 /* Make normal rtx_code into something we can index from an array. */
539
540 static enum internal_test
541 map_test_to_internal_test (enum rtx_code test_code)
542 {
543 enum internal_test test = ITEST_MAX;
544
545 switch (test_code)
546 {
547 default: break;
548 case EQ: test = ITEST_EQ; break;
549 case NE: test = ITEST_NE; break;
550 case GT: test = ITEST_GT; break;
551 case GE: test = ITEST_GE; break;
552 case LT: test = ITEST_LT; break;
553 case LE: test = ITEST_LE; break;
554 case GTU: test = ITEST_GTU; break;
555 case GEU: test = ITEST_GEU; break;
556 case LTU: test = ITEST_LTU; break;
557 case LEU: test = ITEST_LEU; break;
558 }
559
560 return test;
561 }
562
563
564 /* Generate the code to compare two integer values. The return value is
565 the comparison expression. */
566
567 static rtx
568 gen_int_relational (enum rtx_code test_code, /* relational test (EQ, etc) */
569 rtx cmp0, /* first operand to compare */
570 rtx cmp1, /* second operand to compare */
571 int *p_invert /* whether branch needs to reverse test */)
572 {
573 struct cmp_info
574 {
575 enum rtx_code test_code; /* test code to use in insn */
576 bool (*const_range_p) (HOST_WIDE_INT); /* range check function */
577 int const_add; /* constant to add (convert LE -> LT) */
578 int reverse_regs; /* reverse registers in test */
579 int invert_const; /* != 0 if invert value if cmp1 is constant */
580 int invert_reg; /* != 0 if invert value if cmp1 is register */
581 int unsignedp; /* != 0 for unsigned comparisons. */
582 };
583
584 static struct cmp_info info[ (int)ITEST_MAX ] = {
585
586 { EQ, xtensa_b4const_or_zero, 0, 0, 0, 0, 0 }, /* EQ */
587 { NE, xtensa_b4const_or_zero, 0, 0, 0, 0, 0 }, /* NE */
588
589 { LT, xtensa_b4const_or_zero, 1, 1, 1, 0, 0 }, /* GT */
590 { GE, xtensa_b4const_or_zero, 0, 0, 0, 0, 0 }, /* GE */
591 { LT, xtensa_b4const_or_zero, 0, 0, 0, 0, 0 }, /* LT */
592 { GE, xtensa_b4const_or_zero, 1, 1, 1, 0, 0 }, /* LE */
593
594 { LTU, xtensa_b4constu, 1, 1, 1, 0, 1 }, /* GTU */
595 { GEU, xtensa_b4constu, 0, 0, 0, 0, 1 }, /* GEU */
596 { LTU, xtensa_b4constu, 0, 0, 0, 0, 1 }, /* LTU */
597 { GEU, xtensa_b4constu, 1, 1, 1, 0, 1 }, /* LEU */
598 };
599
600 enum internal_test test;
601 enum machine_mode mode;
602 struct cmp_info *p_info;
603
604 test = map_test_to_internal_test (test_code);
605 gcc_assert (test != ITEST_MAX);
606
607 p_info = &info[ (int)test ];
608
609 mode = GET_MODE (cmp0);
610 if (mode == VOIDmode)
611 mode = GET_MODE (cmp1);
612
613 /* Make sure we can handle any constants given to us. */
614 if (GET_CODE (cmp1) == CONST_INT)
615 {
616 HOST_WIDE_INT value = INTVAL (cmp1);
617 unsigned HOST_WIDE_INT uvalue = (unsigned HOST_WIDE_INT)value;
618
619 /* if the immediate overflows or does not fit in the immediate field,
620 spill it to a register */
621
622 if ((p_info->unsignedp ?
623 (uvalue + p_info->const_add > uvalue) :
624 (value + p_info->const_add > value)) != (p_info->const_add > 0))
625 {
626 cmp1 = force_reg (mode, cmp1);
627 }
628 else if (!(p_info->const_range_p) (value + p_info->const_add))
629 {
630 cmp1 = force_reg (mode, cmp1);
631 }
632 }
633 else if ((GET_CODE (cmp1) != REG) && (GET_CODE (cmp1) != SUBREG))
634 {
635 cmp1 = force_reg (mode, cmp1);
636 }
637
638 /* See if we need to invert the result. */
639 *p_invert = ((GET_CODE (cmp1) == CONST_INT)
640 ? p_info->invert_const
641 : p_info->invert_reg);
642
643 /* Comparison to constants, may involve adding 1 to change a LT into LE.
644 Comparison between two registers, may involve switching operands. */
645 if (GET_CODE (cmp1) == CONST_INT)
646 {
647 if (p_info->const_add != 0)
648 cmp1 = GEN_INT (INTVAL (cmp1) + p_info->const_add);
649
650 }
651 else if (p_info->reverse_regs)
652 {
653 rtx temp = cmp0;
654 cmp0 = cmp1;
655 cmp1 = temp;
656 }
657
658 return gen_rtx_fmt_ee (p_info->test_code, VOIDmode, cmp0, cmp1);
659 }
660
661
662 /* Generate the code to compare two float values. The return value is
663 the comparison expression. */
664
665 static rtx
666 gen_float_relational (enum rtx_code test_code, /* relational test (EQ, etc) */
667 rtx cmp0, /* first operand to compare */
668 rtx cmp1 /* second operand to compare */)
669 {
670 rtx (*gen_fn) (rtx, rtx, rtx);
671 rtx brtmp;
672 int reverse_regs, invert;
673
674 switch (test_code)
675 {
676 case EQ: reverse_regs = 0; invert = 0; gen_fn = gen_seq_sf; break;
677 case NE: reverse_regs = 0; invert = 1; gen_fn = gen_seq_sf; break;
678 case LE: reverse_regs = 0; invert = 0; gen_fn = gen_sle_sf; break;
679 case GT: reverse_regs = 1; invert = 0; gen_fn = gen_slt_sf; break;
680 case LT: reverse_regs = 0; invert = 0; gen_fn = gen_slt_sf; break;
681 case GE: reverse_regs = 1; invert = 0; gen_fn = gen_sle_sf; break;
682 case UNEQ: reverse_regs = 0; invert = 0; gen_fn = gen_suneq_sf; break;
683 case LTGT: reverse_regs = 0; invert = 1; gen_fn = gen_suneq_sf; break;
684 case UNLE: reverse_regs = 0; invert = 0; gen_fn = gen_sunle_sf; break;
685 case UNGT: reverse_regs = 1; invert = 0; gen_fn = gen_sunlt_sf; break;
686 case UNLT: reverse_regs = 0; invert = 0; gen_fn = gen_sunlt_sf; break;
687 case UNGE: reverse_regs = 1; invert = 0; gen_fn = gen_sunle_sf; break;
688 case UNORDERED:
689 reverse_regs = 0; invert = 0; gen_fn = gen_sunordered_sf; break;
690 case ORDERED:
691 reverse_regs = 0; invert = 1; gen_fn = gen_sunordered_sf; break;
692 default:
693 fatal_insn ("bad test", gen_rtx_fmt_ee (test_code, VOIDmode, cmp0, cmp1));
694 reverse_regs = 0; invert = 0; gen_fn = 0; /* avoid compiler warnings */
695 }
696
697 if (reverse_regs)
698 {
699 rtx temp = cmp0;
700 cmp0 = cmp1;
701 cmp1 = temp;
702 }
703
704 brtmp = gen_rtx_REG (CCmode, FPCC_REGNUM);
705 emit_insn (gen_fn (brtmp, cmp0, cmp1));
706
707 return gen_rtx_fmt_ee (invert ? EQ : NE, VOIDmode, brtmp, const0_rtx);
708 }
709
710
711 void
712 xtensa_expand_conditional_branch (rtx *operands, enum machine_mode mode)
713 {
714 enum rtx_code test_code = GET_CODE (operands[0]);
715 rtx cmp0 = operands[1];
716 rtx cmp1 = operands[2];
717 rtx cmp;
718 int invert;
719 rtx label1, label2;
720
721 switch (mode)
722 {
723 case DFmode:
724 default:
725 fatal_insn ("bad test", gen_rtx_fmt_ee (test_code, VOIDmode, cmp0, cmp1));
726
727 case SImode:
728 invert = FALSE;
729 cmp = gen_int_relational (test_code, cmp0, cmp1, &invert);
730 break;
731
732 case SFmode:
733 if (!TARGET_HARD_FLOAT)
734 fatal_insn ("bad test", gen_rtx_fmt_ee (test_code, VOIDmode,
735 cmp0, cmp1));
736 invert = FALSE;
737 cmp = gen_float_relational (test_code, cmp0, cmp1);
738 break;
739 }
740
741 /* Generate the branch. */
742
743 label1 = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
744 label2 = pc_rtx;
745
746 if (invert)
747 {
748 label2 = label1;
749 label1 = pc_rtx;
750 }
751
752 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx,
753 gen_rtx_IF_THEN_ELSE (VOIDmode, cmp,
754 label1,
755 label2)));
756 }
757
758
759 static rtx
760 gen_conditional_move (enum rtx_code code, enum machine_mode mode,
761 rtx op0, rtx op1)
762 {
763 if (mode == SImode)
764 {
765 rtx cmp;
766
767 /* Jump optimization calls get_condition() which canonicalizes
768 comparisons like (GE x <const>) to (GT x <const-1>).
769 Transform those comparisons back to GE, since that is the
770 comparison supported in Xtensa. We shouldn't have to
771 transform <LE x const> comparisons, because neither
772 xtensa_expand_conditional_branch() nor get_condition() will
773 produce them. */
774
775 if ((code == GT) && (op1 == constm1_rtx))
776 {
777 code = GE;
778 op1 = const0_rtx;
779 }
780 cmp = gen_rtx_fmt_ee (code, VOIDmode, cc0_rtx, const0_rtx);
781
782 if (boolean_operator (cmp, VOIDmode))
783 {
784 /* Swap the operands to make const0 second. */
785 if (op0 == const0_rtx)
786 {
787 op0 = op1;
788 op1 = const0_rtx;
789 }
790
791 /* If not comparing against zero, emit a comparison (subtract). */
792 if (op1 != const0_rtx)
793 {
794 op0 = expand_binop (SImode, sub_optab, op0, op1,
795 0, 0, OPTAB_LIB_WIDEN);
796 op1 = const0_rtx;
797 }
798 }
799 else if (branch_operator (cmp, VOIDmode))
800 {
801 /* Swap the operands to make const0 second. */
802 if (op0 == const0_rtx)
803 {
804 op0 = op1;
805 op1 = const0_rtx;
806
807 switch (code)
808 {
809 case LT: code = GE; break;
810 case GE: code = LT; break;
811 default: gcc_unreachable ();
812 }
813 }
814
815 if (op1 != const0_rtx)
816 return 0;
817 }
818 else
819 return 0;
820
821 return gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
822 }
823
824 if (TARGET_HARD_FLOAT && mode == SFmode)
825 return gen_float_relational (code, op0, op1);
826
827 return 0;
828 }
829
830
831 int
832 xtensa_expand_conditional_move (rtx *operands, int isflt)
833 {
834 rtx dest = operands[0];
835 rtx cmp = operands[1];
836 enum machine_mode cmp_mode = GET_MODE (XEXP (cmp, 0));
837 rtx (*gen_fn) (rtx, rtx, rtx, rtx, rtx);
838
839 if (!(cmp = gen_conditional_move (GET_CODE (cmp), cmp_mode,
840 XEXP (cmp, 0), XEXP (cmp, 1))))
841 return 0;
842
843 if (isflt)
844 gen_fn = (cmp_mode == SImode
845 ? gen_movsfcc_internal0
846 : gen_movsfcc_internal1);
847 else
848 gen_fn = (cmp_mode == SImode
849 ? gen_movsicc_internal0
850 : gen_movsicc_internal1);
851
852 emit_insn (gen_fn (dest, XEXP (cmp, 0), operands[2], operands[3], cmp));
853 return 1;
854 }
855
856
857 int
858 xtensa_expand_scc (rtx operands[4], enum machine_mode cmp_mode)
859 {
860 rtx dest = operands[0];
861 rtx cmp;
862 rtx one_tmp, zero_tmp;
863 rtx (*gen_fn) (rtx, rtx, rtx, rtx, rtx);
864
865 if (!(cmp = gen_conditional_move (GET_CODE (operands[1]), cmp_mode,
866 operands[2], operands[3])))
867 return 0;
868
869 one_tmp = gen_reg_rtx (SImode);
870 zero_tmp = gen_reg_rtx (SImode);
871 emit_insn (gen_movsi (one_tmp, const_true_rtx));
872 emit_insn (gen_movsi (zero_tmp, const0_rtx));
873
874 gen_fn = (cmp_mode == SImode
875 ? gen_movsicc_internal0
876 : gen_movsicc_internal1);
877 emit_insn (gen_fn (dest, XEXP (cmp, 0), one_tmp, zero_tmp, cmp));
878 return 1;
879 }
880
881
882 /* Split OP[1] into OP[2,3] and likewise for OP[0] into OP[0,1]. MODE is
883 for the output, i.e., the input operands are twice as big as MODE. */
884
885 void
886 xtensa_split_operand_pair (rtx operands[4], enum machine_mode mode)
887 {
888 switch (GET_CODE (operands[1]))
889 {
890 case REG:
891 operands[3] = gen_rtx_REG (mode, REGNO (operands[1]) + 1);
892 operands[2] = gen_rtx_REG (mode, REGNO (operands[1]));
893 break;
894
895 case MEM:
896 operands[3] = adjust_address (operands[1], mode, GET_MODE_SIZE (mode));
897 operands[2] = adjust_address (operands[1], mode, 0);
898 break;
899
900 case CONST_INT:
901 case CONST_DOUBLE:
902 split_double (operands[1], &operands[2], &operands[3]);
903 break;
904
905 default:
906 gcc_unreachable ();
907 }
908
909 switch (GET_CODE (operands[0]))
910 {
911 case REG:
912 operands[1] = gen_rtx_REG (mode, REGNO (operands[0]) + 1);
913 operands[0] = gen_rtx_REG (mode, REGNO (operands[0]));
914 break;
915
916 case MEM:
917 operands[1] = adjust_address (operands[0], mode, GET_MODE_SIZE (mode));
918 operands[0] = adjust_address (operands[0], mode, 0);
919 break;
920
921 default:
922 gcc_unreachable ();
923 }
924 }
925
926
927 /* Emit insns to move operands[1] into operands[0].
928 Return 1 if we have written out everything that needs to be done to
929 do the move. Otherwise, return 0 and the caller will emit the move
930 normally. */
931
932 int
933 xtensa_emit_move_sequence (rtx *operands, enum machine_mode mode)
934 {
935 rtx src = operands[1];
936
937 if (CONSTANT_P (src)
938 && (GET_CODE (src) != CONST_INT || ! xtensa_simm12b (INTVAL (src))))
939 {
940 rtx dst = operands[0];
941
942 if (xtensa_tls_referenced_p (src))
943 {
944 rtx addend = NULL;
945
946 if (GET_CODE (src) == CONST && GET_CODE (XEXP (src, 0)) == PLUS)
947 {
948 addend = XEXP (XEXP (src, 0), 1);
949 src = XEXP (XEXP (src, 0), 0);
950 }
951
952 src = xtensa_legitimize_tls_address (src);
953 if (addend)
954 {
955 src = gen_rtx_PLUS (mode, src, addend);
956 src = force_operand (src, dst);
957 }
958 emit_move_insn (dst, src);
959 return 1;
960 }
961
962 if (! TARGET_CONST16)
963 {
964 src = force_const_mem (SImode, src);
965 operands[1] = src;
966 }
967
968 /* PC-relative loads are always SImode, and CONST16 is only
969 supported in the movsi pattern, so add a SUBREG for any other
970 (smaller) mode. */
971
972 if (mode != SImode)
973 {
974 if (register_operand (dst, mode))
975 {
976 emit_move_insn (simplify_gen_subreg (SImode, dst, mode, 0), src);
977 return 1;
978 }
979 else
980 {
981 src = force_reg (SImode, src);
982 src = gen_lowpart_SUBREG (mode, src);
983 operands[1] = src;
984 }
985 }
986 }
987
988 if (!(reload_in_progress | reload_completed)
989 && !xtensa_valid_move (mode, operands))
990 operands[1] = force_reg (mode, operands[1]);
991
992 operands[1] = xtensa_copy_incoming_a7 (operands[1]);
993
994 /* During reload we don't want to emit (subreg:X (mem:Y)) since that
995 instruction won't be recognized after reload, so we remove the
996 subreg and adjust mem accordingly. */
997 if (reload_in_progress)
998 {
999 operands[0] = fixup_subreg_mem (operands[0]);
1000 operands[1] = fixup_subreg_mem (operands[1]);
1001 }
1002 return 0;
1003 }
1004
1005
1006 static rtx
1007 fixup_subreg_mem (rtx x)
1008 {
1009 if (GET_CODE (x) == SUBREG
1010 && GET_CODE (SUBREG_REG (x)) == REG
1011 && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER)
1012 {
1013 rtx temp =
1014 gen_rtx_SUBREG (GET_MODE (x),
1015 reg_equiv_mem [REGNO (SUBREG_REG (x))],
1016 SUBREG_BYTE (x));
1017 x = alter_subreg (&temp);
1018 }
1019 return x;
1020 }
1021
1022
1023 /* Check if an incoming argument in a7 is expected to be used soon and
1024 if OPND is a register or register pair that includes a7. If so,
1025 create a new pseudo and copy a7 into that pseudo at the very
1026 beginning of the function, followed by the special "set_frame_ptr"
1027 unspec_volatile insn. The return value is either the original
1028 operand, if it is not a7, or the new pseudo containing a copy of
1029 the incoming argument. This is necessary because the register
1030 allocator will ignore conflicts with a7 and may either assign some
1031 other pseudo to a7 or use a7 as the hard_frame_pointer, clobbering
1032 the incoming argument in a7. By copying the argument out of a7 as
1033 the very first thing, and then immediately following that with an
1034 unspec_volatile to keep the scheduler away, we should avoid any
1035 problems. Putting the set_frame_ptr insn at the beginning, with
1036 only the a7 copy before it, also makes it easier for the prologue
1037 expander to initialize the frame pointer after the a7 copy and to
1038 fix up the a7 copy to use the stack pointer instead of the frame
1039 pointer. */
1040
1041 rtx
1042 xtensa_copy_incoming_a7 (rtx opnd)
1043 {
1044 rtx entry_insns = 0;
1045 rtx reg, tmp;
1046 enum machine_mode mode;
1047
1048 if (!cfun->machine->need_a7_copy)
1049 return opnd;
1050
1051 /* This function should never be called again once a7 has been copied. */
1052 gcc_assert (!cfun->machine->set_frame_ptr_insn);
1053
1054 mode = GET_MODE (opnd);
1055
1056 /* The operand using a7 may come in a later instruction, so just return
1057 the original operand if it doesn't use a7. */
1058 reg = opnd;
1059 if (GET_CODE (reg) == SUBREG)
1060 {
1061 gcc_assert (SUBREG_BYTE (reg) == 0);
1062 reg = SUBREG_REG (reg);
1063 }
1064 if (GET_CODE (reg) != REG
1065 || REGNO (reg) > A7_REG
1066 || REGNO (reg) + HARD_REGNO_NREGS (A7_REG, mode) <= A7_REG)
1067 return opnd;
1068
1069 /* 1-word args will always be in a7; 2-word args in a6/a7. */
1070 gcc_assert (REGNO (reg) + HARD_REGNO_NREGS (A7_REG, mode) - 1 == A7_REG);
1071
1072 cfun->machine->need_a7_copy = false;
1073
1074 /* Copy a7 to a new pseudo at the function entry. Use gen_raw_REG to
1075 create the REG for a7 so that hard_frame_pointer_rtx is not used. */
1076
1077 start_sequence ();
1078 tmp = gen_reg_rtx (mode);
1079
1080 switch (mode)
1081 {
1082 case DFmode:
1083 case DImode:
1084 /* Copy the value out of A7 here but keep the first word in A6 until
1085 after the set_frame_ptr insn. Otherwise, the register allocator
1086 may decide to put "subreg (tmp, 0)" in A7 and clobber the incoming
1087 value. */
1088 emit_insn (gen_movsi_internal (gen_rtx_SUBREG (SImode, tmp, 4),
1089 gen_raw_REG (SImode, A7_REG)));
1090 break;
1091 case SFmode:
1092 emit_insn (gen_movsf_internal (tmp, gen_raw_REG (mode, A7_REG)));
1093 break;
1094 case SImode:
1095 emit_insn (gen_movsi_internal (tmp, gen_raw_REG (mode, A7_REG)));
1096 break;
1097 case HImode:
1098 emit_insn (gen_movhi_internal (tmp, gen_raw_REG (mode, A7_REG)));
1099 break;
1100 case QImode:
1101 emit_insn (gen_movqi_internal (tmp, gen_raw_REG (mode, A7_REG)));
1102 break;
1103 default:
1104 gcc_unreachable ();
1105 }
1106
1107 cfun->machine->set_frame_ptr_insn = emit_insn (gen_set_frame_ptr ());
1108
1109 /* For DF and DI mode arguments, copy the incoming value in A6 now. */
1110 if (mode == DFmode || mode == DImode)
1111 emit_insn (gen_movsi_internal (gen_rtx_SUBREG (SImode, tmp, 0),
1112 gen_rtx_REG (SImode, A7_REG - 1)));
1113 entry_insns = get_insns ();
1114 end_sequence ();
1115
1116 if (cfun->machine->vararg_a7)
1117 {
1118 /* This is called from within builtin_saveregs, which will insert the
1119 saveregs code at the function entry, ahead of anything placed at
1120 the function entry now. Instead, save the sequence to be inserted
1121 at the beginning of the saveregs code. */
1122 cfun->machine->vararg_a7_copy = entry_insns;
1123 }
1124 else
1125 {
1126 /* Put entry_insns after the NOTE that starts the function. If
1127 this is inside a start_sequence, make the outer-level insn
1128 chain current, so the code is placed at the start of the
1129 function. */
1130 push_topmost_sequence ();
1131 /* Do not use entry_of_function() here. This is called from within
1132 expand_function_start, when the CFG still holds GIMPLE. */
1133 emit_insn_after (entry_insns, get_insns ());
1134 pop_topmost_sequence ();
1135 }
1136
1137 return tmp;
1138 }
1139
1140
1141 /* Try to expand a block move operation to a sequence of RTL move
1142 instructions. If not optimizing, or if the block size is not a
1143 constant, or if the block is too large, the expansion fails and GCC
1144 falls back to calling memcpy().
1145
1146 operands[0] is the destination
1147 operands[1] is the source
1148 operands[2] is the length
1149 operands[3] is the alignment */
1150
1151 int
1152 xtensa_expand_block_move (rtx *operands)
1153 {
1154 static const enum machine_mode mode_from_align[] =
1155 {
1156 VOIDmode, QImode, HImode, VOIDmode, SImode,
1157 };
1158
1159 rtx dst_mem = operands[0];
1160 rtx src_mem = operands[1];
1161 HOST_WIDE_INT bytes, align;
1162 int num_pieces, move_ratio;
1163 rtx temp[2];
1164 enum machine_mode mode[2];
1165 int amount[2];
1166 bool active[2];
1167 int phase = 0;
1168 int next;
1169 int offset_ld = 0;
1170 int offset_st = 0;
1171 rtx x;
1172
1173 /* If this is not a fixed size move, just call memcpy. */
1174 if (!optimize || (GET_CODE (operands[2]) != CONST_INT))
1175 return 0;
1176
1177 bytes = INTVAL (operands[2]);
1178 align = INTVAL (operands[3]);
1179
1180 /* Anything to move? */
1181 if (bytes <= 0)
1182 return 0;
1183
1184 if (align > MOVE_MAX)
1185 align = MOVE_MAX;
1186
1187 /* Decide whether to expand inline based on the optimization level. */
1188 move_ratio = 4;
1189 if (optimize > 2)
1190 move_ratio = LARGEST_MOVE_RATIO;
1191 num_pieces = (bytes / align) + (bytes % align); /* Close enough anyway. */
1192 if (num_pieces > move_ratio)
1193 return 0;
1194
1195 x = XEXP (dst_mem, 0);
1196 if (!REG_P (x))
1197 {
1198 x = force_reg (Pmode, x);
1199 dst_mem = replace_equiv_address (dst_mem, x);
1200 }
1201
1202 x = XEXP (src_mem, 0);
1203 if (!REG_P (x))
1204 {
1205 x = force_reg (Pmode, x);
1206 src_mem = replace_equiv_address (src_mem, x);
1207 }
1208
1209 active[0] = active[1] = false;
1210
1211 do
1212 {
1213 next = phase;
1214 phase ^= 1;
1215
1216 if (bytes > 0)
1217 {
1218 int next_amount;
1219
1220 next_amount = (bytes >= 4 ? 4 : (bytes >= 2 ? 2 : 1));
1221 next_amount = MIN (next_amount, align);
1222
1223 amount[next] = next_amount;
1224 mode[next] = mode_from_align[next_amount];
1225 temp[next] = gen_reg_rtx (mode[next]);
1226
1227 x = adjust_address (src_mem, mode[next], offset_ld);
1228 emit_insn (gen_rtx_SET (VOIDmode, temp[next], x));
1229
1230 offset_ld += next_amount;
1231 bytes -= next_amount;
1232 active[next] = true;
1233 }
1234
1235 if (active[phase])
1236 {
1237 active[phase] = false;
1238
1239 x = adjust_address (dst_mem, mode[phase], offset_st);
1240 emit_insn (gen_rtx_SET (VOIDmode, x, temp[phase]));
1241
1242 offset_st += amount[phase];
1243 }
1244 }
1245 while (active[next]);
1246
1247 return 1;
1248 }
1249
1250
1251 void
1252 xtensa_expand_nonlocal_goto (rtx *operands)
1253 {
1254 rtx goto_handler = operands[1];
1255 rtx containing_fp = operands[3];
1256
1257 /* Generate a call to "__xtensa_nonlocal_goto" (in libgcc); the code
1258 is too big to generate in-line. */
1259
1260 if (GET_CODE (containing_fp) != REG)
1261 containing_fp = force_reg (Pmode, containing_fp);
1262
1263 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__xtensa_nonlocal_goto"),
1264 0, VOIDmode, 2,
1265 containing_fp, Pmode,
1266 goto_handler, Pmode);
1267 }
1268
1269
1270 static struct machine_function *
1271 xtensa_init_machine_status (void)
1272 {
1273 return GGC_CNEW (struct machine_function);
1274 }
1275
1276
1277 /* Shift VAL of mode MODE left by COUNT bits. */
1278
1279 static inline rtx
1280 xtensa_expand_mask_and_shift (rtx val, enum machine_mode mode, rtx count)
1281 {
1282 val = expand_simple_binop (SImode, AND, val, GEN_INT (GET_MODE_MASK (mode)),
1283 NULL_RTX, 1, OPTAB_DIRECT);
1284 return expand_simple_binop (SImode, ASHIFT, val, count,
1285 NULL_RTX, 1, OPTAB_DIRECT);
1286 }
1287
1288
1289 /* Structure to hold the initial parameters for a compare_and_swap operation
1290 in HImode and QImode. */
1291
1292 struct alignment_context
1293 {
1294 rtx memsi; /* SI aligned memory location. */
1295 rtx shift; /* Bit offset with regard to lsb. */
1296 rtx modemask; /* Mask of the HQImode shifted by SHIFT bits. */
1297 rtx modemaski; /* ~modemask */
1298 };
1299
1300
1301 /* Initialize structure AC for word access to HI and QI mode memory. */
1302
1303 static void
1304 init_alignment_context (struct alignment_context *ac, rtx mem)
1305 {
1306 enum machine_mode mode = GET_MODE (mem);
1307 rtx byteoffset = NULL_RTX;
1308 bool aligned = (MEM_ALIGN (mem) >= GET_MODE_BITSIZE (SImode));
1309
1310 if (aligned)
1311 ac->memsi = adjust_address (mem, SImode, 0); /* Memory is aligned. */
1312 else
1313 {
1314 /* Alignment is unknown. */
1315 rtx addr, align;
1316
1317 /* Force the address into a register. */
1318 addr = force_reg (Pmode, XEXP (mem, 0));
1319
1320 /* Align it to SImode. */
1321 align = expand_simple_binop (Pmode, AND, addr,
1322 GEN_INT (-GET_MODE_SIZE (SImode)),
1323 NULL_RTX, 1, OPTAB_DIRECT);
1324 /* Generate MEM. */
1325 ac->memsi = gen_rtx_MEM (SImode, align);
1326 MEM_VOLATILE_P (ac->memsi) = MEM_VOLATILE_P (mem);
1327 set_mem_alias_set (ac->memsi, ALIAS_SET_MEMORY_BARRIER);
1328 set_mem_align (ac->memsi, GET_MODE_BITSIZE (SImode));
1329
1330 byteoffset = expand_simple_binop (Pmode, AND, addr,
1331 GEN_INT (GET_MODE_SIZE (SImode) - 1),
1332 NULL_RTX, 1, OPTAB_DIRECT);
1333 }
1334
1335 /* Calculate shiftcount. */
1336 if (TARGET_BIG_ENDIAN)
1337 {
1338 ac->shift = GEN_INT (GET_MODE_SIZE (SImode) - GET_MODE_SIZE (mode));
1339 if (!aligned)
1340 ac->shift = expand_simple_binop (SImode, MINUS, ac->shift, byteoffset,
1341 NULL_RTX, 1, OPTAB_DIRECT);
1342 }
1343 else
1344 {
1345 if (aligned)
1346 ac->shift = NULL_RTX;
1347 else
1348 ac->shift = byteoffset;
1349 }
1350
1351 if (ac->shift != NULL_RTX)
1352 {
1353 /* Shift is the byte count, but we need the bitcount. */
1354 ac->shift = expand_simple_binop (SImode, MULT, ac->shift,
1355 GEN_INT (BITS_PER_UNIT),
1356 NULL_RTX, 1, OPTAB_DIRECT);
1357 ac->modemask = expand_simple_binop (SImode, ASHIFT,
1358 GEN_INT (GET_MODE_MASK (mode)),
1359 ac->shift,
1360 NULL_RTX, 1, OPTAB_DIRECT);
1361 }
1362 else
1363 ac->modemask = GEN_INT (GET_MODE_MASK (mode));
1364
1365 ac->modemaski = expand_simple_unop (SImode, NOT, ac->modemask, NULL_RTX, 1);
1366 }
1367
1368
1369 /* Expand an atomic compare and swap operation for HImode and QImode.
1370 MEM is the memory location, CMP the old value to compare MEM with
1371 and NEW_RTX the value to set if CMP == MEM. */
1372
1373 void
1374 xtensa_expand_compare_and_swap (rtx target, rtx mem, rtx cmp, rtx new_rtx)
1375 {
1376 enum machine_mode mode = GET_MODE (mem);
1377 struct alignment_context ac;
1378 rtx tmp, cmpv, newv, val;
1379 rtx oldval = gen_reg_rtx (SImode);
1380 rtx res = gen_reg_rtx (SImode);
1381 rtx csloop = gen_label_rtx ();
1382 rtx csend = gen_label_rtx ();
1383
1384 init_alignment_context (&ac, mem);
1385
1386 if (ac.shift != NULL_RTX)
1387 {
1388 cmp = xtensa_expand_mask_and_shift (cmp, mode, ac.shift);
1389 new_rtx = xtensa_expand_mask_and_shift (new_rtx, mode, ac.shift);
1390 }
1391
1392 /* Load the surrounding word into VAL with the MEM value masked out. */
1393 val = force_reg (SImode, expand_simple_binop (SImode, AND, ac.memsi,
1394 ac.modemaski, NULL_RTX, 1,
1395 OPTAB_DIRECT));
1396 emit_label (csloop);
1397
1398 /* Patch CMP and NEW_RTX into VAL at correct position. */
1399 cmpv = force_reg (SImode, expand_simple_binop (SImode, IOR, cmp, val,
1400 NULL_RTX, 1, OPTAB_DIRECT));
1401 newv = force_reg (SImode, expand_simple_binop (SImode, IOR, new_rtx, val,
1402 NULL_RTX, 1, OPTAB_DIRECT));
1403
1404 /* Jump to end if we're done. */
1405 emit_insn (gen_sync_compare_and_swapsi (res, ac.memsi, cmpv, newv));
1406 emit_cmp_and_jump_insns (res, cmpv, EQ, const0_rtx, SImode, true, csend);
1407
1408 /* Check for changes outside mode. */
1409 emit_move_insn (oldval, val);
1410 tmp = expand_simple_binop (SImode, AND, res, ac.modemaski,
1411 val, 1, OPTAB_DIRECT);
1412 if (tmp != val)
1413 emit_move_insn (val, tmp);
1414
1415 /* Loop internal if so. */
1416 emit_cmp_and_jump_insns (oldval, val, NE, const0_rtx, SImode, true, csloop);
1417
1418 emit_label (csend);
1419
1420 /* Return the correct part of the bitfield. */
1421 convert_move (target,
1422 (ac.shift == NULL_RTX ? res
1423 : expand_simple_binop (SImode, LSHIFTRT, res, ac.shift,
1424 NULL_RTX, 1, OPTAB_DIRECT)),
1425 1);
1426 }
1427
1428
1429 /* Expand an atomic operation CODE of mode MODE (either HImode or QImode --
1430 the default expansion works fine for SImode). MEM is the memory location
1431 and VAL the value to play with. If AFTER is true then store the value
1432 MEM holds after the operation, if AFTER is false then store the value MEM
1433 holds before the operation. If TARGET is zero then discard that value, else
1434 store it to TARGET. */
1435
1436 void
1437 xtensa_expand_atomic (enum rtx_code code, rtx target, rtx mem, rtx val,
1438 bool after)
1439 {
1440 enum machine_mode mode = GET_MODE (mem);
1441 struct alignment_context ac;
1442 rtx csloop = gen_label_rtx ();
1443 rtx cmp, tmp;
1444 rtx old = gen_reg_rtx (SImode);
1445 rtx new_rtx = gen_reg_rtx (SImode);
1446 rtx orig = NULL_RTX;
1447
1448 init_alignment_context (&ac, mem);
1449
1450 /* Prepare values before the compare-and-swap loop. */
1451 if (ac.shift != NULL_RTX)
1452 val = xtensa_expand_mask_and_shift (val, mode, ac.shift);
1453 switch (code)
1454 {
1455 case PLUS:
1456 case MINUS:
1457 orig = gen_reg_rtx (SImode);
1458 convert_move (orig, val, 1);
1459 break;
1460
1461 case SET:
1462 case IOR:
1463 case XOR:
1464 break;
1465
1466 case MULT: /* NAND */
1467 case AND:
1468 /* val = "11..1<val>11..1" */
1469 val = expand_simple_binop (SImode, XOR, val, ac.modemaski,
1470 NULL_RTX, 1, OPTAB_DIRECT);
1471 break;
1472
1473 default:
1474 gcc_unreachable ();
1475 }
1476
1477 /* Load full word. Subsequent loads are performed by S32C1I. */
1478 cmp = force_reg (SImode, ac.memsi);
1479
1480 emit_label (csloop);
1481 emit_move_insn (old, cmp);
1482
1483 switch (code)
1484 {
1485 case PLUS:
1486 case MINUS:
1487 val = expand_simple_binop (SImode, code, old, orig,
1488 NULL_RTX, 1, OPTAB_DIRECT);
1489 val = expand_simple_binop (SImode, AND, val, ac.modemask,
1490 NULL_RTX, 1, OPTAB_DIRECT);
1491 /* FALLTHRU */
1492 case SET:
1493 tmp = expand_simple_binop (SImode, AND, old, ac.modemaski,
1494 NULL_RTX, 1, OPTAB_DIRECT);
1495 tmp = expand_simple_binop (SImode, IOR, tmp, val,
1496 new_rtx, 1, OPTAB_DIRECT);
1497 break;
1498
1499 case AND:
1500 case IOR:
1501 case XOR:
1502 tmp = expand_simple_binop (SImode, code, old, val,
1503 new_rtx, 1, OPTAB_DIRECT);
1504 break;
1505
1506 case MULT: /* NAND */
1507 tmp = expand_simple_binop (SImode, XOR, old, ac.modemask,
1508 NULL_RTX, 1, OPTAB_DIRECT);
1509 tmp = expand_simple_binop (SImode, AND, tmp, val,
1510 new_rtx, 1, OPTAB_DIRECT);
1511 break;
1512
1513 default:
1514 gcc_unreachable ();
1515 }
1516
1517 if (tmp != new_rtx)
1518 emit_move_insn (new_rtx, tmp);
1519 emit_insn (gen_sync_compare_and_swapsi (cmp, ac.memsi, old, new_rtx));
1520 emit_cmp_and_jump_insns (cmp, old, NE, const0_rtx, SImode, true, csloop);
1521
1522 if (target)
1523 {
1524 tmp = (after ? new_rtx : cmp);
1525 convert_move (target,
1526 (ac.shift == NULL_RTX ? tmp
1527 : expand_simple_binop (SImode, LSHIFTRT, tmp, ac.shift,
1528 NULL_RTX, 1, OPTAB_DIRECT)),
1529 1);
1530 }
1531 }
1532
1533
1534 void
1535 xtensa_setup_frame_addresses (void)
1536 {
1537 /* Set flag to cause FRAME_POINTER_REQUIRED to be set. */
1538 cfun->machine->accesses_prev_frame = 1;
1539
1540 emit_library_call
1541 (gen_rtx_SYMBOL_REF (Pmode, "__xtensa_libgcc_window_spill"),
1542 0, VOIDmode, 0);
1543 }
1544
1545
1546 /* Emit the assembly for the end of a zero-cost loop. Normally we just emit
1547 a comment showing where the end of the loop is. However, if there is a
1548 label or a branch at the end of the loop then we need to place a nop
1549 there. If the loop ends with a label we need the nop so that branches
1550 targeting that label will target the nop (and thus remain in the loop),
1551 instead of targeting the instruction after the loop (and thus exiting
1552 the loop). If the loop ends with a branch, we need the nop in case the
1553 branch is targeting a location inside the loop. When the branch
1554 executes it will cause the loop count to be decremented even if it is
1555 taken (because it is the last instruction in the loop), so we need to
1556 nop after the branch to prevent the loop count from being decremented
1557 when the branch is taken. */
1558
1559 void
1560 xtensa_emit_loop_end (rtx insn, rtx *operands)
1561 {
1562 char done = 0;
1563
1564 for (insn = PREV_INSN (insn); insn && !done; insn = PREV_INSN (insn))
1565 {
1566 switch (GET_CODE (insn))
1567 {
1568 case NOTE:
1569 case BARRIER:
1570 break;
1571
1572 case CODE_LABEL:
1573 output_asm_insn (TARGET_DENSITY ? "nop.n" : "nop", operands);
1574 done = 1;
1575 break;
1576
1577 default:
1578 {
1579 rtx body = PATTERN (insn);
1580
1581 if (GET_CODE (body) == JUMP_INSN)
1582 {
1583 output_asm_insn (TARGET_DENSITY ? "nop.n" : "nop", operands);
1584 done = 1;
1585 }
1586 else if ((GET_CODE (body) != USE)
1587 && (GET_CODE (body) != CLOBBER))
1588 done = 1;
1589 }
1590 break;
1591 }
1592 }
1593
1594 output_asm_insn ("# loop end for %0", operands);
1595 }
1596
1597
1598 char *
1599 xtensa_emit_branch (bool inverted, bool immed, rtx *operands)
1600 {
1601 static char result[64];
1602 enum rtx_code code;
1603 const char *op;
1604
1605 code = GET_CODE (operands[3]);
1606 switch (code)
1607 {
1608 case EQ: op = inverted ? "ne" : "eq"; break;
1609 case NE: op = inverted ? "eq" : "ne"; break;
1610 case LT: op = inverted ? "ge" : "lt"; break;
1611 case GE: op = inverted ? "lt" : "ge"; break;
1612 case LTU: op = inverted ? "geu" : "ltu"; break;
1613 case GEU: op = inverted ? "ltu" : "geu"; break;
1614 default: gcc_unreachable ();
1615 }
1616
1617 if (immed)
1618 {
1619 if (INTVAL (operands[1]) == 0)
1620 sprintf (result, "b%sz%s\t%%0, %%2", op,
1621 (TARGET_DENSITY && (code == EQ || code == NE)) ? ".n" : "");
1622 else
1623 sprintf (result, "b%si\t%%0, %%d1, %%2", op);
1624 }
1625 else
1626 sprintf (result, "b%s\t%%0, %%1, %%2", op);
1627
1628 return result;
1629 }
1630
1631
1632 char *
1633 xtensa_emit_bit_branch (bool inverted, bool immed, rtx *operands)
1634 {
1635 static char result[64];
1636 const char *op;
1637
1638 switch (GET_CODE (operands[3]))
1639 {
1640 case EQ: op = inverted ? "bs" : "bc"; break;
1641 case NE: op = inverted ? "bc" : "bs"; break;
1642 default: gcc_unreachable ();
1643 }
1644
1645 if (immed)
1646 {
1647 unsigned bitnum = INTVAL (operands[1]) & 0x1f;
1648 operands[1] = GEN_INT (bitnum);
1649 sprintf (result, "b%si\t%%0, %%d1, %%2", op);
1650 }
1651 else
1652 sprintf (result, "b%s\t%%0, %%1, %%2", op);
1653
1654 return result;
1655 }
1656
1657
1658 char *
1659 xtensa_emit_movcc (bool inverted, bool isfp, bool isbool, rtx *operands)
1660 {
1661 static char result[64];
1662 enum rtx_code code;
1663 const char *op;
1664
1665 code = GET_CODE (operands[4]);
1666 if (isbool)
1667 {
1668 switch (code)
1669 {
1670 case EQ: op = inverted ? "t" : "f"; break;
1671 case NE: op = inverted ? "f" : "t"; break;
1672 default: gcc_unreachable ();
1673 }
1674 }
1675 else
1676 {
1677 switch (code)
1678 {
1679 case EQ: op = inverted ? "nez" : "eqz"; break;
1680 case NE: op = inverted ? "eqz" : "nez"; break;
1681 case LT: op = inverted ? "gez" : "ltz"; break;
1682 case GE: op = inverted ? "ltz" : "gez"; break;
1683 default: gcc_unreachable ();
1684 }
1685 }
1686
1687 sprintf (result, "mov%s%s\t%%0, %%%d, %%1",
1688 op, isfp ? ".s" : "", inverted ? 3 : 2);
1689 return result;
1690 }
1691
1692
1693 char *
1694 xtensa_emit_call (int callop, rtx *operands)
1695 {
1696 static char result[64];
1697 rtx tgt = operands[callop];
1698
1699 if (GET_CODE (tgt) == CONST_INT)
1700 sprintf (result, "call8\t0x%lx", INTVAL (tgt));
1701 else if (register_operand (tgt, VOIDmode))
1702 sprintf (result, "callx8\t%%%d", callop);
1703 else
1704 sprintf (result, "call8\t%%%d", callop);
1705
1706 return result;
1707 }
1708
1709
1710 bool
1711 xtensa_legitimate_address_p (enum machine_mode mode, rtx addr, bool strict)
1712 {
1713 /* Allow constant pool addresses. */
1714 if (mode != BLKmode && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
1715 && ! TARGET_CONST16 && constantpool_address_p (addr)
1716 && ! xtensa_tls_referenced_p (addr))
1717 return true;
1718
1719 while (GET_CODE (addr) == SUBREG)
1720 addr = SUBREG_REG (addr);
1721
1722 /* Allow base registers. */
1723 if (GET_CODE (addr) == REG && BASE_REG_P (addr, strict))
1724 return true;
1725
1726 /* Check for "register + offset" addressing. */
1727 if (GET_CODE (addr) == PLUS)
1728 {
1729 rtx xplus0 = XEXP (addr, 0);
1730 rtx xplus1 = XEXP (addr, 1);
1731 enum rtx_code code0;
1732 enum rtx_code code1;
1733
1734 while (GET_CODE (xplus0) == SUBREG)
1735 xplus0 = SUBREG_REG (xplus0);
1736 code0 = GET_CODE (xplus0);
1737
1738 while (GET_CODE (xplus1) == SUBREG)
1739 xplus1 = SUBREG_REG (xplus1);
1740 code1 = GET_CODE (xplus1);
1741
1742 /* Swap operands if necessary so the register is first. */
1743 if (code0 != REG && code1 == REG)
1744 {
1745 xplus0 = XEXP (addr, 1);
1746 xplus1 = XEXP (addr, 0);
1747 code0 = GET_CODE (xplus0);
1748 code1 = GET_CODE (xplus1);
1749 }
1750
1751 if (code0 == REG && BASE_REG_P (xplus0, strict)
1752 && code1 == CONST_INT
1753 && xtensa_mem_offset (INTVAL (xplus1), mode))
1754 return true;
1755 }
1756
1757 return false;
1758 }
1759
1760
1761 /* Construct the SYMBOL_REF for the _TLS_MODULE_BASE_ symbol. */
1762
1763 static GTY(()) rtx xtensa_tls_module_base_symbol;
1764
1765 static rtx
1766 xtensa_tls_module_base (void)
1767 {
1768 if (! xtensa_tls_module_base_symbol)
1769 {
1770 xtensa_tls_module_base_symbol =
1771 gen_rtx_SYMBOL_REF (Pmode, "_TLS_MODULE_BASE_");
1772 SYMBOL_REF_FLAGS (xtensa_tls_module_base_symbol)
1773 |= TLS_MODEL_GLOBAL_DYNAMIC << SYMBOL_FLAG_TLS_SHIFT;
1774 }
1775
1776 return xtensa_tls_module_base_symbol;
1777 }
1778
1779
1780 static rtx
1781 xtensa_call_tls_desc (rtx sym, rtx *retp)
1782 {
1783 rtx fn, arg, a10, call_insn, insns;
1784
1785 start_sequence ();
1786 fn = gen_reg_rtx (Pmode);
1787 arg = gen_reg_rtx (Pmode);
1788 a10 = gen_rtx_REG (Pmode, 10);
1789
1790 emit_insn (gen_tls_func (fn, sym));
1791 emit_insn (gen_tls_arg (arg, sym));
1792 emit_move_insn (a10, arg);
1793 call_insn = emit_call_insn (gen_tls_call (a10, fn, sym, const1_rtx));
1794 CALL_INSN_FUNCTION_USAGE (call_insn)
1795 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_USE (VOIDmode, a10),
1796 CALL_INSN_FUNCTION_USAGE (call_insn));
1797 insns = get_insns ();
1798 end_sequence ();
1799
1800 *retp = a10;
1801 return insns;
1802 }
1803
1804
1805 static rtx
1806 xtensa_legitimize_tls_address (rtx x)
1807 {
1808 unsigned int model = SYMBOL_REF_TLS_MODEL (x);
1809 rtx dest, tp, ret, modbase, base, addend, insns;
1810
1811 dest = gen_reg_rtx (Pmode);
1812 switch (model)
1813 {
1814 case TLS_MODEL_GLOBAL_DYNAMIC:
1815 insns = xtensa_call_tls_desc (x, &ret);
1816 emit_libcall_block (insns, dest, ret, x);
1817 break;
1818
1819 case TLS_MODEL_LOCAL_DYNAMIC:
1820 base = gen_reg_rtx (Pmode);
1821 modbase = xtensa_tls_module_base ();
1822 insns = xtensa_call_tls_desc (modbase, &ret);
1823 emit_libcall_block (insns, base, ret, modbase);
1824 addend = force_reg (SImode, gen_sym_DTPOFF (x));
1825 emit_insn (gen_addsi3 (dest, base, addend));
1826 break;
1827
1828 case TLS_MODEL_INITIAL_EXEC:
1829 case TLS_MODEL_LOCAL_EXEC:
1830 tp = gen_reg_rtx (SImode);
1831 emit_insn (gen_load_tp (tp));
1832 addend = force_reg (SImode, gen_sym_TPOFF (x));
1833 emit_insn (gen_addsi3 (dest, tp, addend));
1834 break;
1835
1836 default:
1837 gcc_unreachable ();
1838 }
1839
1840 return dest;
1841 }
1842
1843
1844 rtx
1845 xtensa_legitimize_address (rtx x,
1846 rtx oldx ATTRIBUTE_UNUSED,
1847 enum machine_mode mode)
1848 {
1849 if (xtensa_tls_symbol_p (x))
1850 return xtensa_legitimize_tls_address (x);
1851
1852 if (GET_CODE (x) == PLUS)
1853 {
1854 rtx plus0 = XEXP (x, 0);
1855 rtx plus1 = XEXP (x, 1);
1856
1857 if (GET_CODE (plus0) != REG && GET_CODE (plus1) == REG)
1858 {
1859 plus0 = XEXP (x, 1);
1860 plus1 = XEXP (x, 0);
1861 }
1862
1863 /* Try to split up the offset to use an ADDMI instruction. */
1864 if (GET_CODE (plus0) == REG
1865 && GET_CODE (plus1) == CONST_INT
1866 && !xtensa_mem_offset (INTVAL (plus1), mode)
1867 && !xtensa_simm8 (INTVAL (plus1))
1868 && xtensa_mem_offset (INTVAL (plus1) & 0xff, mode)
1869 && xtensa_simm8x256 (INTVAL (plus1) & ~0xff))
1870 {
1871 rtx temp = gen_reg_rtx (Pmode);
1872 rtx addmi_offset = GEN_INT (INTVAL (plus1) & ~0xff);
1873 emit_insn (gen_rtx_SET (Pmode, temp,
1874 gen_rtx_PLUS (Pmode, plus0, addmi_offset)));
1875 return gen_rtx_PLUS (Pmode, temp, GEN_INT (INTVAL (plus1) & 0xff));
1876 }
1877 }
1878
1879 return x;
1880 }
1881
1882
1883 /* Helper for xtensa_tls_referenced_p. */
1884
1885 static int
1886 xtensa_tls_referenced_p_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
1887 {
1888 if (GET_CODE (*x) == SYMBOL_REF)
1889 return SYMBOL_REF_TLS_MODEL (*x) != 0;
1890
1891 /* Ignore TLS references that have already been legitimized. */
1892 if (GET_CODE (*x) == UNSPEC)
1893 {
1894 switch (XINT (*x, 1))
1895 {
1896 case UNSPEC_TPOFF:
1897 case UNSPEC_DTPOFF:
1898 case UNSPEC_TLS_FUNC:
1899 case UNSPEC_TLS_ARG:
1900 case UNSPEC_TLS_CALL:
1901 return -1;
1902 default:
1903 break;
1904 }
1905 }
1906
1907 return 0;
1908 }
1909
1910
1911 /* Return TRUE if X contains any TLS symbol references. */
1912
1913 bool
1914 xtensa_tls_referenced_p (rtx x)
1915 {
1916 if (! TARGET_HAVE_TLS)
1917 return false;
1918
1919 return for_each_rtx (&x, xtensa_tls_referenced_p_1, NULL);
1920 }
1921
1922
1923 /* Return the debugger register number to use for 'regno'. */
1924
1925 int
1926 xtensa_dbx_register_number (int regno)
1927 {
1928 int first = -1;
1929
1930 if (GP_REG_P (regno))
1931 {
1932 regno -= GP_REG_FIRST;
1933 first = 0;
1934 }
1935 else if (BR_REG_P (regno))
1936 {
1937 regno -= BR_REG_FIRST;
1938 first = 16;
1939 }
1940 else if (FP_REG_P (regno))
1941 {
1942 regno -= FP_REG_FIRST;
1943 first = 48;
1944 }
1945 else if (ACC_REG_P (regno))
1946 {
1947 first = 0x200; /* Start of Xtensa special registers. */
1948 regno = 16; /* ACCLO is special register 16. */
1949 }
1950
1951 /* When optimizing, we sometimes get asked about pseudo-registers
1952 that don't represent hard registers. Return 0 for these. */
1953 if (first == -1)
1954 return 0;
1955
1956 return first + regno;
1957 }
1958
1959
1960 /* Argument support functions. */
1961
1962 /* Initialize CUMULATIVE_ARGS for a function. */
1963
1964 void
1965 init_cumulative_args (CUMULATIVE_ARGS *cum, int incoming)
1966 {
1967 cum->arg_words = 0;
1968 cum->incoming = incoming;
1969 }
1970
1971
1972 /* Advance the argument to the next argument position. */
1973
1974 void
1975 function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type)
1976 {
1977 int words, max;
1978 int *arg_words;
1979
1980 arg_words = &cum->arg_words;
1981 max = MAX_ARGS_IN_REGISTERS;
1982
1983 words = (((mode != BLKmode)
1984 ? (int) GET_MODE_SIZE (mode)
1985 : int_size_in_bytes (type)) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
1986
1987 if (*arg_words < max
1988 && (targetm.calls.must_pass_in_stack (mode, type)
1989 || *arg_words + words > max))
1990 *arg_words = max;
1991
1992 *arg_words += words;
1993 }
1994
1995
1996 /* Return an RTL expression containing the register for the given mode,
1997 or 0 if the argument is to be passed on the stack. INCOMING_P is nonzero
1998 if this is an incoming argument to the current function. */
1999
2000 rtx
2001 function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
2002 int incoming_p)
2003 {
2004 int regbase, words, max;
2005 int *arg_words;
2006 int regno;
2007
2008 arg_words = &cum->arg_words;
2009 regbase = (incoming_p ? GP_ARG_FIRST : GP_OUTGOING_ARG_FIRST);
2010 max = MAX_ARGS_IN_REGISTERS;
2011
2012 words = (((mode != BLKmode)
2013 ? (int) GET_MODE_SIZE (mode)
2014 : int_size_in_bytes (type)) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2015
2016 if (type && (TYPE_ALIGN (type) > BITS_PER_WORD))
2017 {
2018 int align = MIN (TYPE_ALIGN (type), STACK_BOUNDARY) / BITS_PER_WORD;
2019 *arg_words = (*arg_words + align - 1) & -align;
2020 }
2021
2022 if (*arg_words + words > max)
2023 return (rtx)0;
2024
2025 regno = regbase + *arg_words;
2026
2027 if (cum->incoming && regno <= A7_REG && regno + words > A7_REG)
2028 cfun->machine->need_a7_copy = true;
2029
2030 return gen_rtx_REG (mode, regno);
2031 }
2032
2033
2034 int
2035 function_arg_boundary (enum machine_mode mode, tree type)
2036 {
2037 unsigned int alignment;
2038
2039 alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
2040 if (alignment < PARM_BOUNDARY)
2041 alignment = PARM_BOUNDARY;
2042 if (alignment > STACK_BOUNDARY)
2043 alignment = STACK_BOUNDARY;
2044 return alignment;
2045 }
2046
2047
2048 static bool
2049 xtensa_return_in_msb (const_tree valtype)
2050 {
2051 return (TARGET_BIG_ENDIAN
2052 && AGGREGATE_TYPE_P (valtype)
2053 && int_size_in_bytes (valtype) >= UNITS_PER_WORD);
2054 }
2055
2056
2057 void
2058 override_options (void)
2059 {
2060 int regno;
2061 enum machine_mode mode;
2062
2063 if (!TARGET_BOOLEANS && TARGET_HARD_FLOAT)
2064 error ("boolean registers required for the floating-point option");
2065
2066 /* Set up array giving whether a given register can hold a given mode. */
2067 for (mode = VOIDmode;
2068 mode != MAX_MACHINE_MODE;
2069 mode = (enum machine_mode) ((int) mode + 1))
2070 {
2071 int size = GET_MODE_SIZE (mode);
2072 enum mode_class mclass = GET_MODE_CLASS (mode);
2073
2074 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
2075 {
2076 int temp;
2077
2078 if (ACC_REG_P (regno))
2079 temp = (TARGET_MAC16
2080 && (mclass == MODE_INT) && (size <= UNITS_PER_WORD));
2081 else if (GP_REG_P (regno))
2082 temp = ((regno & 1) == 0 || (size <= UNITS_PER_WORD));
2083 else if (FP_REG_P (regno))
2084 temp = (TARGET_HARD_FLOAT && (mode == SFmode));
2085 else if (BR_REG_P (regno))
2086 temp = (TARGET_BOOLEANS && (mode == CCmode));
2087 else
2088 temp = FALSE;
2089
2090 xtensa_hard_regno_mode_ok[(int) mode][regno] = temp;
2091 }
2092 }
2093
2094 init_machine_status = xtensa_init_machine_status;
2095
2096 /* Check PIC settings. PIC is only supported when using L32R
2097 instructions, and some targets need to always use PIC. */
2098 if (flag_pic && TARGET_CONST16)
2099 error ("-f%s is not supported with CONST16 instructions",
2100 (flag_pic > 1 ? "PIC" : "pic"));
2101 else if (XTENSA_ALWAYS_PIC)
2102 {
2103 if (TARGET_CONST16)
2104 error ("PIC is required but not supported with CONST16 instructions");
2105 flag_pic = 1;
2106 }
2107 /* There's no need for -fPIC (as opposed to -fpic) on Xtensa. */
2108 if (flag_pic > 1)
2109 flag_pic = 1;
2110 if (flag_pic && !flag_pie)
2111 flag_shlib = 1;
2112
2113 /* Hot/cold partitioning does not work on this architecture, because of
2114 constant pools (the load instruction cannot necessarily reach that far).
2115 Therefore disable it on this architecture. */
2116 if (flag_reorder_blocks_and_partition)
2117 {
2118 flag_reorder_blocks_and_partition = 0;
2119 flag_reorder_blocks = 1;
2120 }
2121 }
2122
2123
2124 /* A C compound statement to output to stdio stream STREAM the
2125 assembler syntax for an instruction operand X. X is an RTL
2126 expression.
2127
2128 CODE is a value that can be used to specify one of several ways
2129 of printing the operand. It is used when identical operands
2130 must be printed differently depending on the context. CODE
2131 comes from the '%' specification that was used to request
2132 printing of the operand. If the specification was just '%DIGIT'
2133 then CODE is 0; if the specification was '%LTR DIGIT' then CODE
2134 is the ASCII code for LTR.
2135
2136 If X is a register, this macro should print the register's name.
2137 The names can be found in an array 'reg_names' whose type is
2138 'char *[]'. 'reg_names' is initialized from 'REGISTER_NAMES'.
2139
2140 When the machine description has a specification '%PUNCT' (a '%'
2141 followed by a punctuation character), this macro is called with
2142 a null pointer for X and the punctuation character for CODE.
2143
2144 'a', 'c', 'l', and 'n' are reserved.
2145
2146 The Xtensa specific codes are:
2147
2148 'd' CONST_INT, print as signed decimal
2149 'x' CONST_INT, print as signed hexadecimal
2150 'K' CONST_INT, print number of bits in mask for EXTUI
2151 'R' CONST_INT, print (X & 0x1f)
2152 'L' CONST_INT, print ((32 - X) & 0x1f)
2153 'D' REG, print second register of double-word register operand
2154 'N' MEM, print address of next word following a memory operand
2155 'v' MEM, if memory reference is volatile, output a MEMW before it
2156 't' any constant, add "@h" suffix for top 16 bits
2157 'b' any constant, add "@l" suffix for bottom 16 bits
2158 */
2159
2160 static void
2161 printx (FILE *file, signed int val)
2162 {
2163 /* Print a hexadecimal value in a nice way. */
2164 if ((val > -0xa) && (val < 0xa))
2165 fprintf (file, "%d", val);
2166 else if (val < 0)
2167 fprintf (file, "-0x%x", -val);
2168 else
2169 fprintf (file, "0x%x", val);
2170 }
2171
2172
2173 void
2174 print_operand (FILE *file, rtx x, int letter)
2175 {
2176 if (!x)
2177 error ("PRINT_OPERAND null pointer");
2178
2179 switch (letter)
2180 {
2181 case 'D':
2182 if (GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
2183 fprintf (file, "%s", reg_names[xt_true_regnum (x) + 1]);
2184 else
2185 output_operand_lossage ("invalid %%D value");
2186 break;
2187
2188 case 'v':
2189 if (GET_CODE (x) == MEM)
2190 {
2191 /* For a volatile memory reference, emit a MEMW before the
2192 load or store. */
2193 if (MEM_VOLATILE_P (x) && TARGET_SERIALIZE_VOLATILE)
2194 fprintf (file, "memw\n\t");
2195 }
2196 else
2197 output_operand_lossage ("invalid %%v value");
2198 break;
2199
2200 case 'N':
2201 if (GET_CODE (x) == MEM
2202 && (GET_MODE (x) == DFmode || GET_MODE (x) == DImode))
2203 {
2204 x = adjust_address (x, GET_MODE (x) == DFmode ? SFmode : SImode, 4);
2205 output_address (XEXP (x, 0));
2206 }
2207 else
2208 output_operand_lossage ("invalid %%N value");
2209 break;
2210
2211 case 'K':
2212 if (GET_CODE (x) == CONST_INT)
2213 {
2214 int num_bits = 0;
2215 unsigned val = INTVAL (x);
2216 while (val & 1)
2217 {
2218 num_bits += 1;
2219 val = val >> 1;
2220 }
2221 if ((val != 0) || (num_bits == 0) || (num_bits > 16))
2222 fatal_insn ("invalid mask", x);
2223
2224 fprintf (file, "%d", num_bits);
2225 }
2226 else
2227 output_operand_lossage ("invalid %%K value");
2228 break;
2229
2230 case 'L':
2231 if (GET_CODE (x) == CONST_INT)
2232 fprintf (file, "%ld", (32 - INTVAL (x)) & 0x1f);
2233 else
2234 output_operand_lossage ("invalid %%L value");
2235 break;
2236
2237 case 'R':
2238 if (GET_CODE (x) == CONST_INT)
2239 fprintf (file, "%ld", INTVAL (x) & 0x1f);
2240 else
2241 output_operand_lossage ("invalid %%R value");
2242 break;
2243
2244 case 'x':
2245 if (GET_CODE (x) == CONST_INT)
2246 printx (file, INTVAL (x));
2247 else
2248 output_operand_lossage ("invalid %%x value");
2249 break;
2250
2251 case 'd':
2252 if (GET_CODE (x) == CONST_INT)
2253 fprintf (file, "%ld", INTVAL (x));
2254 else
2255 output_operand_lossage ("invalid %%d value");
2256 break;
2257
2258 case 't':
2259 case 'b':
2260 if (GET_CODE (x) == CONST_INT)
2261 {
2262 printx (file, INTVAL (x));
2263 fputs (letter == 't' ? "@h" : "@l", file);
2264 }
2265 else if (GET_CODE (x) == CONST_DOUBLE)
2266 {
2267 REAL_VALUE_TYPE r;
2268 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
2269 if (GET_MODE (x) == SFmode)
2270 {
2271 long l;
2272 REAL_VALUE_TO_TARGET_SINGLE (r, l);
2273 fprintf (file, "0x%08lx@%c", l, letter == 't' ? 'h' : 'l');
2274 }
2275 else
2276 output_operand_lossage ("invalid %%t/%%b value");
2277 }
2278 else if (GET_CODE (x) == CONST)
2279 {
2280 /* X must be a symbolic constant on ELF. Write an expression
2281 suitable for 'const16' that sets the high or low 16 bits. */
2282 if (GET_CODE (XEXP (x, 0)) != PLUS
2283 || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
2284 && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
2285 || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
2286 output_operand_lossage ("invalid %%t/%%b value");
2287 print_operand (file, XEXP (XEXP (x, 0), 0), 0);
2288 fputs (letter == 't' ? "@h" : "@l", file);
2289 /* There must be a non-alphanumeric character between 'h' or 'l'
2290 and the number. The '-' is added by print_operand() already. */
2291 if (INTVAL (XEXP (XEXP (x, 0), 1)) >= 0)
2292 fputs ("+", file);
2293 print_operand (file, XEXP (XEXP (x, 0), 1), 0);
2294 }
2295 else
2296 {
2297 output_addr_const (file, x);
2298 fputs (letter == 't' ? "@h" : "@l", file);
2299 }
2300 break;
2301
2302 default:
2303 if (GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
2304 fprintf (file, "%s", reg_names[xt_true_regnum (x)]);
2305 else if (GET_CODE (x) == MEM)
2306 output_address (XEXP (x, 0));
2307 else if (GET_CODE (x) == CONST_INT)
2308 fprintf (file, "%ld", INTVAL (x));
2309 else
2310 output_addr_const (file, x);
2311 }
2312 }
2313
2314
2315 /* A C compound statement to output to stdio stream STREAM the
2316 assembler syntax for an instruction operand that is a memory
2317 reference whose address is ADDR. ADDR is an RTL expression. */
2318
2319 void
2320 print_operand_address (FILE *file, rtx addr)
2321 {
2322 if (!addr)
2323 error ("PRINT_OPERAND_ADDRESS, null pointer");
2324
2325 switch (GET_CODE (addr))
2326 {
2327 default:
2328 fatal_insn ("invalid address", addr);
2329 break;
2330
2331 case REG:
2332 fprintf (file, "%s, 0", reg_names [REGNO (addr)]);
2333 break;
2334
2335 case PLUS:
2336 {
2337 rtx reg = (rtx)0;
2338 rtx offset = (rtx)0;
2339 rtx arg0 = XEXP (addr, 0);
2340 rtx arg1 = XEXP (addr, 1);
2341
2342 if (GET_CODE (arg0) == REG)
2343 {
2344 reg = arg0;
2345 offset = arg1;
2346 }
2347 else if (GET_CODE (arg1) == REG)
2348 {
2349 reg = arg1;
2350 offset = arg0;
2351 }
2352 else
2353 fatal_insn ("no register in address", addr);
2354
2355 if (CONSTANT_P (offset))
2356 {
2357 fprintf (file, "%s, ", reg_names [REGNO (reg)]);
2358 output_addr_const (file, offset);
2359 }
2360 else
2361 fatal_insn ("address offset not a constant", addr);
2362 }
2363 break;
2364
2365 case LABEL_REF:
2366 case SYMBOL_REF:
2367 case CONST_INT:
2368 case CONST:
2369 output_addr_const (file, addr);
2370 break;
2371 }
2372 }
2373
2374
2375 bool
2376 xtensa_output_addr_const_extra (FILE *fp, rtx x)
2377 {
2378 if (GET_CODE (x) == UNSPEC && XVECLEN (x, 0) == 1)
2379 {
2380 switch (XINT (x, 1))
2381 {
2382 case UNSPEC_TPOFF:
2383 output_addr_const (fp, XVECEXP (x, 0, 0));
2384 fputs ("@TPOFF", fp);
2385 return true;
2386 case UNSPEC_DTPOFF:
2387 output_addr_const (fp, XVECEXP (x, 0, 0));
2388 fputs ("@DTPOFF", fp);
2389 return true;
2390 case UNSPEC_PLT:
2391 if (flag_pic)
2392 {
2393 output_addr_const (fp, XVECEXP (x, 0, 0));
2394 fputs ("@PLT", fp);
2395 return true;
2396 }
2397 break;
2398 default:
2399 break;
2400 }
2401 }
2402 return false;
2403 }
2404
2405
2406 void
2407 xtensa_output_literal (FILE *file, rtx x, enum machine_mode mode, int labelno)
2408 {
2409 long value_long[2];
2410 REAL_VALUE_TYPE r;
2411 int size;
2412 rtx first, second;
2413
2414 fprintf (file, "\t.literal .LC%u, ", (unsigned) labelno);
2415
2416 switch (GET_MODE_CLASS (mode))
2417 {
2418 case MODE_FLOAT:
2419 gcc_assert (GET_CODE (x) == CONST_DOUBLE);
2420
2421 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
2422 switch (mode)
2423 {
2424 case SFmode:
2425 REAL_VALUE_TO_TARGET_SINGLE (r, value_long[0]);
2426 if (HOST_BITS_PER_LONG > 32)
2427 value_long[0] &= 0xffffffff;
2428 fprintf (file, "0x%08lx\n", value_long[0]);
2429 break;
2430
2431 case DFmode:
2432 REAL_VALUE_TO_TARGET_DOUBLE (r, value_long);
2433 if (HOST_BITS_PER_LONG > 32)
2434 {
2435 value_long[0] &= 0xffffffff;
2436 value_long[1] &= 0xffffffff;
2437 }
2438 fprintf (file, "0x%08lx, 0x%08lx\n",
2439 value_long[0], value_long[1]);
2440 break;
2441
2442 default:
2443 gcc_unreachable ();
2444 }
2445
2446 break;
2447
2448 case MODE_INT:
2449 case MODE_PARTIAL_INT:
2450 size = GET_MODE_SIZE (mode);
2451 switch (size)
2452 {
2453 case 4:
2454 output_addr_const (file, x);
2455 fputs ("\n", file);
2456 break;
2457
2458 case 8:
2459 split_double (x, &first, &second);
2460 output_addr_const (file, first);
2461 fputs (", ", file);
2462 output_addr_const (file, second);
2463 fputs ("\n", file);
2464 break;
2465
2466 default:
2467 gcc_unreachable ();
2468 }
2469 break;
2470
2471 default:
2472 gcc_unreachable ();
2473 }
2474 }
2475
2476
2477 /* Return the bytes needed to compute the frame pointer from the current
2478 stack pointer. */
2479
2480 #define STACK_BYTES (STACK_BOUNDARY / BITS_PER_UNIT)
2481 #define XTENSA_STACK_ALIGN(LOC) (((LOC) + STACK_BYTES-1) & ~(STACK_BYTES-1))
2482
2483 long
2484 compute_frame_size (int size)
2485 {
2486 /* Add space for the incoming static chain value. */
2487 if (cfun->static_chain_decl != NULL)
2488 size += (1 * UNITS_PER_WORD);
2489
2490 xtensa_current_frame_size =
2491 XTENSA_STACK_ALIGN (size
2492 + crtl->outgoing_args_size
2493 + (WINDOW_SIZE * UNITS_PER_WORD));
2494 return xtensa_current_frame_size;
2495 }
2496
2497
2498 int
2499 xtensa_frame_pointer_required (void)
2500 {
2501 /* The code to expand builtin_frame_addr and builtin_return_addr
2502 currently uses the hard_frame_pointer instead of frame_pointer.
2503 This seems wrong but maybe it's necessary for other architectures.
2504 This function is derived from the i386 code. */
2505
2506 if (cfun->machine->accesses_prev_frame)
2507 return 1;
2508
2509 return 0;
2510 }
2511
2512
2513 /* minimum frame = reg save area (4 words) plus static chain (1 word)
2514 and the total number of words must be a multiple of 128 bits. */
2515 #define MIN_FRAME_SIZE (8 * UNITS_PER_WORD)
2516
2517 void
2518 xtensa_expand_prologue (void)
2519 {
2520 HOST_WIDE_INT total_size;
2521 rtx size_rtx;
2522 rtx insn, note_rtx;
2523
2524 total_size = compute_frame_size (get_frame_size ());
2525 size_rtx = GEN_INT (total_size);
2526
2527 if (total_size < (1 << (12+3)))
2528 insn = emit_insn (gen_entry (size_rtx));
2529 else
2530 {
2531 /* Use a8 as a temporary since a0-a7 may be live. */
2532 rtx tmp_reg = gen_rtx_REG (Pmode, A8_REG);
2533 emit_insn (gen_entry (GEN_INT (MIN_FRAME_SIZE)));
2534 emit_move_insn (tmp_reg, GEN_INT (total_size - MIN_FRAME_SIZE));
2535 emit_insn (gen_subsi3 (tmp_reg, stack_pointer_rtx, tmp_reg));
2536 insn = emit_insn (gen_movsi (stack_pointer_rtx, tmp_reg));
2537 }
2538
2539 if (frame_pointer_needed)
2540 {
2541 if (cfun->machine->set_frame_ptr_insn)
2542 {
2543 rtx first;
2544
2545 push_topmost_sequence ();
2546 first = get_insns ();
2547 pop_topmost_sequence ();
2548
2549 /* For all instructions prior to set_frame_ptr_insn, replace
2550 hard_frame_pointer references with stack_pointer. */
2551 for (insn = first;
2552 insn != cfun->machine->set_frame_ptr_insn;
2553 insn = NEXT_INSN (insn))
2554 {
2555 if (INSN_P (insn))
2556 {
2557 PATTERN (insn) = replace_rtx (copy_rtx (PATTERN (insn)),
2558 hard_frame_pointer_rtx,
2559 stack_pointer_rtx);
2560 df_insn_rescan (insn);
2561 }
2562 }
2563 }
2564 else
2565 insn = emit_insn (gen_movsi (hard_frame_pointer_rtx,
2566 stack_pointer_rtx));
2567 }
2568
2569 /* Create a note to describe the CFA. Because this is only used to set
2570 DW_AT_frame_base for debug info, don't bother tracking changes through
2571 each instruction in the prologue. It just takes up space. */
2572 note_rtx = gen_rtx_SET (VOIDmode, (frame_pointer_needed
2573 ? hard_frame_pointer_rtx
2574 : stack_pointer_rtx),
2575 plus_constant (stack_pointer_rtx, -total_size));
2576 RTX_FRAME_RELATED_P (insn) = 1;
2577 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
2578 note_rtx, REG_NOTES (insn));
2579 }
2580
2581
2582 /* Clear variables at function end. */
2583
2584 void
2585 xtensa_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
2586 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
2587 {
2588 xtensa_current_frame_size = 0;
2589 }
2590
2591
2592 rtx
2593 xtensa_return_addr (int count, rtx frame)
2594 {
2595 rtx result, retaddr, curaddr, label;
2596
2597 if (count == -1)
2598 retaddr = gen_rtx_REG (Pmode, A0_REG);
2599 else
2600 {
2601 rtx addr = plus_constant (frame, -4 * UNITS_PER_WORD);
2602 addr = memory_address (Pmode, addr);
2603 retaddr = gen_reg_rtx (Pmode);
2604 emit_move_insn (retaddr, gen_rtx_MEM (Pmode, addr));
2605 }
2606
2607 /* The 2 most-significant bits of the return address on Xtensa hold
2608 the register window size. To get the real return address, these
2609 bits must be replaced with the high bits from some address in the
2610 code. */
2611
2612 /* Get the 2 high bits of a local label in the code. */
2613 curaddr = gen_reg_rtx (Pmode);
2614 label = gen_label_rtx ();
2615 emit_label (label);
2616 LABEL_PRESERVE_P (label) = 1;
2617 emit_move_insn (curaddr, gen_rtx_LABEL_REF (Pmode, label));
2618 emit_insn (gen_lshrsi3 (curaddr, curaddr, GEN_INT (30)));
2619 emit_insn (gen_ashlsi3 (curaddr, curaddr, GEN_INT (30)));
2620
2621 /* Clear the 2 high bits of the return address. */
2622 result = gen_reg_rtx (Pmode);
2623 emit_insn (gen_ashlsi3 (result, retaddr, GEN_INT (2)));
2624 emit_insn (gen_lshrsi3 (result, result, GEN_INT (2)));
2625
2626 /* Combine them to get the result. */
2627 emit_insn (gen_iorsi3 (result, result, curaddr));
2628 return result;
2629 }
2630
2631
2632 /* Create the va_list data type.
2633
2634 This structure is set up by __builtin_saveregs. The __va_reg field
2635 points to a stack-allocated region holding the contents of the
2636 incoming argument registers. The __va_ndx field is an index
2637 initialized to the position of the first unnamed (variable)
2638 argument. This same index is also used to address the arguments
2639 passed in memory. Thus, the __va_stk field is initialized to point
2640 to the position of the first argument in memory offset to account
2641 for the arguments passed in registers and to account for the size
2642 of the argument registers not being 16-byte aligned. E.G., there
2643 are 6 argument registers of 4 bytes each, but we want the __va_ndx
2644 for the first stack argument to have the maximal alignment of 16
2645 bytes, so we offset the __va_stk address by 32 bytes so that
2646 __va_stk[32] references the first argument on the stack. */
2647
2648 static tree
2649 xtensa_build_builtin_va_list (void)
2650 {
2651 tree f_stk, f_reg, f_ndx, record, type_decl;
2652
2653 record = (*lang_hooks.types.make_type) (RECORD_TYPE);
2654 type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record);
2655
2656 f_stk = build_decl (FIELD_DECL, get_identifier ("__va_stk"),
2657 ptr_type_node);
2658 f_reg = build_decl (FIELD_DECL, get_identifier ("__va_reg"),
2659 ptr_type_node);
2660 f_ndx = build_decl (FIELD_DECL, get_identifier ("__va_ndx"),
2661 integer_type_node);
2662
2663 DECL_FIELD_CONTEXT (f_stk) = record;
2664 DECL_FIELD_CONTEXT (f_reg) = record;
2665 DECL_FIELD_CONTEXT (f_ndx) = record;
2666
2667 TREE_CHAIN (record) = type_decl;
2668 TYPE_NAME (record) = type_decl;
2669 TYPE_FIELDS (record) = f_stk;
2670 TREE_CHAIN (f_stk) = f_reg;
2671 TREE_CHAIN (f_reg) = f_ndx;
2672
2673 layout_type (record);
2674 return record;
2675 }
2676
2677
2678 /* Save the incoming argument registers on the stack. Returns the
2679 address of the saved registers. */
2680
2681 static rtx
2682 xtensa_builtin_saveregs (void)
2683 {
2684 rtx gp_regs;
2685 int arg_words = crtl->args.info.arg_words;
2686 int gp_left = MAX_ARGS_IN_REGISTERS - arg_words;
2687
2688 if (gp_left <= 0)
2689 return const0_rtx;
2690
2691 /* Allocate the general-purpose register space. */
2692 gp_regs = assign_stack_local
2693 (BLKmode, MAX_ARGS_IN_REGISTERS * UNITS_PER_WORD, -1);
2694 set_mem_alias_set (gp_regs, get_varargs_alias_set ());
2695
2696 /* Now store the incoming registers. */
2697 cfun->machine->need_a7_copy = true;
2698 cfun->machine->vararg_a7 = true;
2699 move_block_from_reg (GP_ARG_FIRST + arg_words,
2700 adjust_address (gp_regs, BLKmode,
2701 arg_words * UNITS_PER_WORD),
2702 gp_left);
2703 gcc_assert (cfun->machine->vararg_a7_copy != 0);
2704 emit_insn_before (cfun->machine->vararg_a7_copy, get_insns ());
2705
2706 return XEXP (gp_regs, 0);
2707 }
2708
2709
2710 /* Implement `va_start' for varargs and stdarg. We look at the
2711 current function to fill in an initial va_list. */
2712
2713 static void
2714 xtensa_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED)
2715 {
2716 tree f_stk, stk;
2717 tree f_reg, reg;
2718 tree f_ndx, ndx;
2719 tree t, u;
2720 int arg_words;
2721
2722 arg_words = crtl->args.info.arg_words;
2723
2724 f_stk = TYPE_FIELDS (va_list_type_node);
2725 f_reg = TREE_CHAIN (f_stk);
2726 f_ndx = TREE_CHAIN (f_reg);
2727
2728 stk = build3 (COMPONENT_REF, TREE_TYPE (f_stk), valist, f_stk, NULL_TREE);
2729 reg = build3 (COMPONENT_REF, TREE_TYPE (f_reg), unshare_expr (valist),
2730 f_reg, NULL_TREE);
2731 ndx = build3 (COMPONENT_REF, TREE_TYPE (f_ndx), unshare_expr (valist),
2732 f_ndx, NULL_TREE);
2733
2734 /* Call __builtin_saveregs; save the result in __va_reg */
2735 u = make_tree (sizetype, expand_builtin_saveregs ());
2736 u = fold_convert (ptr_type_node, u);
2737 t = build2 (MODIFY_EXPR, ptr_type_node, reg, u);
2738 TREE_SIDE_EFFECTS (t) = 1;
2739 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2740
2741 /* Set the __va_stk member to ($arg_ptr - 32). */
2742 u = make_tree (ptr_type_node, virtual_incoming_args_rtx);
2743 u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u, size_int (-32));
2744 t = build2 (MODIFY_EXPR, ptr_type_node, stk, u);
2745 TREE_SIDE_EFFECTS (t) = 1;
2746 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2747
2748 /* Set the __va_ndx member. If the first variable argument is on
2749 the stack, adjust __va_ndx by 2 words to account for the extra
2750 alignment offset for __va_stk. */
2751 if (arg_words >= MAX_ARGS_IN_REGISTERS)
2752 arg_words += 2;
2753 t = build2 (MODIFY_EXPR, integer_type_node, ndx,
2754 build_int_cst (integer_type_node, arg_words * UNITS_PER_WORD));
2755 TREE_SIDE_EFFECTS (t) = 1;
2756 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2757 }
2758
2759
2760 /* Implement `va_arg'. */
2761
2762 static tree
2763 xtensa_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
2764 gimple_seq *post_p ATTRIBUTE_UNUSED)
2765 {
2766 tree f_stk, stk;
2767 tree f_reg, reg;
2768 tree f_ndx, ndx;
2769 tree type_size, array, orig_ndx, addr, size, va_size, t;
2770 tree lab_false, lab_over, lab_false2;
2771 bool indirect;
2772
2773 indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
2774 if (indirect)
2775 type = build_pointer_type (type);
2776
2777 /* Handle complex values as separate real and imaginary parts. */
2778 if (TREE_CODE (type) == COMPLEX_TYPE)
2779 {
2780 tree real_part, imag_part;
2781
2782 real_part = xtensa_gimplify_va_arg_expr (valist, TREE_TYPE (type),
2783 pre_p, NULL);
2784 real_part = get_initialized_tmp_var (real_part, pre_p, NULL);
2785
2786 imag_part = xtensa_gimplify_va_arg_expr (unshare_expr (valist),
2787 TREE_TYPE (type),
2788 pre_p, NULL);
2789 imag_part = get_initialized_tmp_var (imag_part, pre_p, NULL);
2790
2791 return build2 (COMPLEX_EXPR, type, real_part, imag_part);
2792 }
2793
2794 f_stk = TYPE_FIELDS (va_list_type_node);
2795 f_reg = TREE_CHAIN (f_stk);
2796 f_ndx = TREE_CHAIN (f_reg);
2797
2798 stk = build3 (COMPONENT_REF, TREE_TYPE (f_stk), valist,
2799 f_stk, NULL_TREE);
2800 reg = build3 (COMPONENT_REF, TREE_TYPE (f_reg), unshare_expr (valist),
2801 f_reg, NULL_TREE);
2802 ndx = build3 (COMPONENT_REF, TREE_TYPE (f_ndx), unshare_expr (valist),
2803 f_ndx, NULL_TREE);
2804
2805 type_size = size_in_bytes (type);
2806 va_size = round_up (type_size, UNITS_PER_WORD);
2807 gimplify_expr (&va_size, pre_p, NULL, is_gimple_val, fb_rvalue);
2808
2809
2810 /* First align __va_ndx if necessary for this arg:
2811
2812 orig_ndx = (AP).__va_ndx;
2813 if (__alignof__ (TYPE) > 4 )
2814 orig_ndx = ((orig_ndx + __alignof__ (TYPE) - 1)
2815 & -__alignof__ (TYPE)); */
2816
2817 orig_ndx = get_initialized_tmp_var (ndx, pre_p, NULL);
2818
2819 if (TYPE_ALIGN (type) > BITS_PER_WORD)
2820 {
2821 int align = MIN (TYPE_ALIGN (type), STACK_BOUNDARY) / BITS_PER_UNIT;
2822
2823 t = build2 (PLUS_EXPR, integer_type_node, unshare_expr (orig_ndx),
2824 build_int_cst (integer_type_node, align - 1));
2825 t = build2 (BIT_AND_EXPR, integer_type_node, t,
2826 build_int_cst (integer_type_node, -align));
2827 gimplify_assign (unshare_expr (orig_ndx), t, pre_p);
2828 }
2829
2830
2831 /* Increment __va_ndx to point past the argument:
2832
2833 (AP).__va_ndx = orig_ndx + __va_size (TYPE); */
2834
2835 t = fold_convert (integer_type_node, va_size);
2836 t = build2 (PLUS_EXPR, integer_type_node, orig_ndx, t);
2837 gimplify_assign (unshare_expr (ndx), t, pre_p);
2838
2839
2840 /* Check if the argument is in registers:
2841
2842 if ((AP).__va_ndx <= __MAX_ARGS_IN_REGISTERS * 4
2843 && !must_pass_in_stack (type))
2844 __array = (AP).__va_reg; */
2845
2846 array = create_tmp_var (ptr_type_node, NULL);
2847
2848 lab_over = NULL;
2849 if (!targetm.calls.must_pass_in_stack (TYPE_MODE (type), type))
2850 {
2851 lab_false = create_artificial_label ();
2852 lab_over = create_artificial_label ();
2853
2854 t = build2 (GT_EXPR, boolean_type_node, unshare_expr (ndx),
2855 build_int_cst (integer_type_node,
2856 MAX_ARGS_IN_REGISTERS * UNITS_PER_WORD));
2857 t = build3 (COND_EXPR, void_type_node, t,
2858 build1 (GOTO_EXPR, void_type_node, lab_false),
2859 NULL_TREE);
2860 gimplify_and_add (t, pre_p);
2861
2862 gimplify_assign (unshare_expr (array), reg, pre_p);
2863
2864 t = build1 (GOTO_EXPR, void_type_node, lab_over);
2865 gimplify_and_add (t, pre_p);
2866
2867 t = build1 (LABEL_EXPR, void_type_node, lab_false);
2868 gimplify_and_add (t, pre_p);
2869 }
2870
2871
2872 /* ...otherwise, the argument is on the stack (never split between
2873 registers and the stack -- change __va_ndx if necessary):
2874
2875 else
2876 {
2877 if (orig_ndx <= __MAX_ARGS_IN_REGISTERS * 4)
2878 (AP).__va_ndx = 32 + __va_size (TYPE);
2879 __array = (AP).__va_stk;
2880 } */
2881
2882 lab_false2 = create_artificial_label ();
2883
2884 t = build2 (GT_EXPR, boolean_type_node, unshare_expr (orig_ndx),
2885 build_int_cst (integer_type_node,
2886 MAX_ARGS_IN_REGISTERS * UNITS_PER_WORD));
2887 t = build3 (COND_EXPR, void_type_node, t,
2888 build1 (GOTO_EXPR, void_type_node, lab_false2),
2889 NULL_TREE);
2890 gimplify_and_add (t, pre_p);
2891
2892 t = size_binop (PLUS_EXPR, unshare_expr (va_size), size_int (32));
2893 t = fold_convert (integer_type_node, t);
2894 gimplify_assign (unshare_expr (ndx), t, pre_p);
2895
2896 t = build1 (LABEL_EXPR, void_type_node, lab_false2);
2897 gimplify_and_add (t, pre_p);
2898
2899 gimplify_assign (array, stk, pre_p);
2900
2901 if (lab_over)
2902 {
2903 t = build1 (LABEL_EXPR, void_type_node, lab_over);
2904 gimplify_and_add (t, pre_p);
2905 }
2906
2907
2908 /* Given the base array pointer (__array) and index to the subsequent
2909 argument (__va_ndx), find the address:
2910
2911 __array + (AP).__va_ndx - (BYTES_BIG_ENDIAN && sizeof (TYPE) < 4
2912 ? sizeof (TYPE)
2913 : __va_size (TYPE))
2914
2915 The results are endian-dependent because values smaller than one word
2916 are aligned differently. */
2917
2918
2919 if (BYTES_BIG_ENDIAN && TREE_CODE (type_size) == INTEGER_CST)
2920 {
2921 t = fold_build2 (GE_EXPR, boolean_type_node, unshare_expr (type_size),
2922 size_int (PARM_BOUNDARY / BITS_PER_UNIT));
2923 t = fold_build3 (COND_EXPR, sizetype, t, unshare_expr (va_size),
2924 unshare_expr (type_size));
2925 size = t;
2926 }
2927 else
2928 size = unshare_expr (va_size);
2929
2930 t = fold_convert (sizetype, unshare_expr (ndx));
2931 t = build2 (MINUS_EXPR, sizetype, t, size);
2932 addr = build2 (POINTER_PLUS_EXPR, ptr_type_node, unshare_expr (array), t);
2933
2934 addr = fold_convert (build_pointer_type (type), addr);
2935 if (indirect)
2936 addr = build_va_arg_indirect_ref (addr);
2937 return build_va_arg_indirect_ref (addr);
2938 }
2939
2940
2941 /* Builtins. */
2942
2943 enum xtensa_builtin
2944 {
2945 XTENSA_BUILTIN_UMULSIDI3,
2946 XTENSA_BUILTIN_THREAD_POINTER,
2947 XTENSA_BUILTIN_SET_THREAD_POINTER,
2948 XTENSA_BUILTIN_max
2949 };
2950
2951
2952 static void
2953 xtensa_init_builtins (void)
2954 {
2955 tree ftype, decl;
2956
2957 ftype = build_function_type_list (unsigned_intDI_type_node,
2958 unsigned_intSI_type_node,
2959 unsigned_intSI_type_node, NULL_TREE);
2960
2961 decl = add_builtin_function ("__builtin_umulsidi3", ftype,
2962 XTENSA_BUILTIN_UMULSIDI3, BUILT_IN_MD,
2963 "__umulsidi3", NULL_TREE);
2964 TREE_NOTHROW (decl) = 1;
2965 TREE_READONLY (decl) = 1;
2966
2967 if (TARGET_THREADPTR)
2968 {
2969 ftype = build_function_type (ptr_type_node, void_list_node);
2970 decl = add_builtin_function ("__builtin_thread_pointer", ftype,
2971 XTENSA_BUILTIN_THREAD_POINTER, BUILT_IN_MD,
2972 NULL, NULL_TREE);
2973 TREE_READONLY (decl) = 1;
2974 TREE_NOTHROW (decl) = 1;
2975
2976 ftype = build_function_type_list (void_type_node, ptr_type_node,
2977 NULL_TREE);
2978 decl = add_builtin_function ("__builtin_set_thread_pointer", ftype,
2979 XTENSA_BUILTIN_SET_THREAD_POINTER,
2980 BUILT_IN_MD, NULL, NULL_TREE);
2981 TREE_NOTHROW (decl) = 1;
2982 }
2983 }
2984
2985
2986 static tree
2987 xtensa_fold_builtin (tree fndecl, tree arglist, bool ignore ATTRIBUTE_UNUSED)
2988 {
2989 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
2990 tree arg0, arg1;
2991
2992 switch (fcode)
2993 {
2994 case XTENSA_BUILTIN_UMULSIDI3:
2995 arg0 = TREE_VALUE (arglist);
2996 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
2997 if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
2998 || TARGET_MUL32_HIGH)
2999 return fold_build2 (MULT_EXPR, unsigned_intDI_type_node,
3000 fold_convert (unsigned_intDI_type_node, arg0),
3001 fold_convert (unsigned_intDI_type_node, arg1));
3002 break;
3003
3004 case XTENSA_BUILTIN_THREAD_POINTER:
3005 case XTENSA_BUILTIN_SET_THREAD_POINTER:
3006 break;
3007
3008 default:
3009 internal_error ("bad builtin code");
3010 break;
3011 }
3012
3013 return NULL;
3014 }
3015
3016
3017 static rtx
3018 xtensa_expand_builtin (tree exp, rtx target,
3019 rtx subtarget ATTRIBUTE_UNUSED,
3020 enum machine_mode mode ATTRIBUTE_UNUSED,
3021 int ignore)
3022 {
3023 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
3024 unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
3025 rtx arg;
3026
3027 switch (fcode)
3028 {
3029 case XTENSA_BUILTIN_UMULSIDI3:
3030 /* The umulsidi3 builtin is just a mechanism to avoid calling the real
3031 __umulsidi3 function when the Xtensa configuration can directly
3032 implement it. If not, just call the function. */
3033 return expand_call (exp, target, ignore);
3034
3035 case XTENSA_BUILTIN_THREAD_POINTER:
3036 if (!target || !register_operand (target, Pmode))
3037 target = gen_reg_rtx (Pmode);
3038 emit_insn (gen_load_tp (target));
3039 return target;
3040
3041 case XTENSA_BUILTIN_SET_THREAD_POINTER:
3042 arg = expand_normal (CALL_EXPR_ARG (exp, 0));
3043 if (!register_operand (arg, Pmode))
3044 arg = copy_to_mode_reg (Pmode, arg);
3045 emit_insn (gen_set_tp (arg));
3046 return const0_rtx;
3047
3048 default:
3049 internal_error ("bad builtin code");
3050 }
3051 return NULL_RTX;
3052 }
3053
3054
3055 enum reg_class
3056 xtensa_preferred_reload_class (rtx x, enum reg_class rclass, int isoutput)
3057 {
3058 if (!isoutput && CONSTANT_P (x) && GET_CODE (x) == CONST_DOUBLE)
3059 return NO_REGS;
3060
3061 /* Don't use the stack pointer or hard frame pointer for reloads!
3062 The hard frame pointer would normally be OK except that it may
3063 briefly hold an incoming argument in the prologue, and reload
3064 won't know that it is live because the hard frame pointer is
3065 treated specially. */
3066
3067 if (rclass == AR_REGS || rclass == GR_REGS)
3068 return RL_REGS;
3069
3070 return rclass;
3071 }
3072
3073
3074 enum reg_class
3075 xtensa_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
3076 enum machine_mode mode, secondary_reload_info *sri)
3077 {
3078 int regno;
3079
3080 if (in_p && constantpool_mem_p (x))
3081 {
3082 if (rclass == FP_REGS)
3083 return RL_REGS;
3084
3085 if (mode == QImode)
3086 sri->icode = CODE_FOR_reloadqi_literal;
3087 else if (mode == HImode)
3088 sri->icode = CODE_FOR_reloadhi_literal;
3089 }
3090
3091 regno = xt_true_regnum (x);
3092 if (ACC_REG_P (regno))
3093 return ((rclass == GR_REGS || rclass == RL_REGS) ? NO_REGS : RL_REGS);
3094 if (rclass == ACC_REG)
3095 return (GP_REG_P (regno) ? NO_REGS : RL_REGS);
3096
3097 return NO_REGS;
3098 }
3099
3100
3101 void
3102 order_regs_for_local_alloc (void)
3103 {
3104 if (!leaf_function_p ())
3105 {
3106 memcpy (reg_alloc_order, reg_nonleaf_alloc_order,
3107 FIRST_PSEUDO_REGISTER * sizeof (int));
3108 }
3109 else
3110 {
3111 int i, num_arg_regs;
3112 int nxt = 0;
3113
3114 /* Use the AR registers in increasing order (skipping a0 and a1)
3115 but save the incoming argument registers for a last resort. */
3116 num_arg_regs = crtl->args.info.arg_words;
3117 if (num_arg_regs > MAX_ARGS_IN_REGISTERS)
3118 num_arg_regs = MAX_ARGS_IN_REGISTERS;
3119 for (i = GP_ARG_FIRST; i < 16 - num_arg_regs; i++)
3120 reg_alloc_order[nxt++] = i + num_arg_regs;
3121 for (i = 0; i < num_arg_regs; i++)
3122 reg_alloc_order[nxt++] = GP_ARG_FIRST + i;
3123
3124 /* List the coprocessor registers in order. */
3125 for (i = 0; i < BR_REG_NUM; i++)
3126 reg_alloc_order[nxt++] = BR_REG_FIRST + i;
3127
3128 /* List the FP registers in order for now. */
3129 for (i = 0; i < 16; i++)
3130 reg_alloc_order[nxt++] = FP_REG_FIRST + i;
3131
3132 /* GCC requires that we list *all* the registers.... */
3133 reg_alloc_order[nxt++] = 0; /* a0 = return address */
3134 reg_alloc_order[nxt++] = 1; /* a1 = stack pointer */
3135 reg_alloc_order[nxt++] = 16; /* pseudo frame pointer */
3136 reg_alloc_order[nxt++] = 17; /* pseudo arg pointer */
3137
3138 reg_alloc_order[nxt++] = ACC_REG_FIRST; /* MAC16 accumulator */
3139 }
3140 }
3141
3142
3143 /* Some Xtensa targets support multiple bss sections. If the section
3144 name ends with ".bss", add SECTION_BSS to the flags. */
3145
3146 static unsigned int
3147 xtensa_multibss_section_type_flags (tree decl, const char *name, int reloc)
3148 {
3149 unsigned int flags = default_section_type_flags (decl, name, reloc);
3150 const char *suffix;
3151
3152 suffix = strrchr (name, '.');
3153 if (suffix && strcmp (suffix, ".bss") == 0)
3154 {
3155 if (!decl || (TREE_CODE (decl) == VAR_DECL
3156 && DECL_INITIAL (decl) == NULL_TREE))
3157 flags |= SECTION_BSS; /* @nobits */
3158 else
3159 warning (0, "only uninitialized variables can be placed in a "
3160 ".bss section");
3161 }
3162
3163 return flags;
3164 }
3165
3166
3167 /* The literal pool stays with the function. */
3168
3169 static section *
3170 xtensa_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED,
3171 rtx x ATTRIBUTE_UNUSED,
3172 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
3173 {
3174 return function_section (current_function_decl);
3175 }
3176
3177
3178 /* Compute a (partial) cost for rtx X. Return true if the complete
3179 cost has been computed, and false if subexpressions should be
3180 scanned. In either case, *TOTAL contains the cost result. */
3181
3182 static bool
3183 xtensa_rtx_costs (rtx x, int code, int outer_code, int *total,
3184 bool speed ATTRIBUTE_UNUSED)
3185 {
3186 switch (code)
3187 {
3188 case CONST_INT:
3189 switch (outer_code)
3190 {
3191 case SET:
3192 if (xtensa_simm12b (INTVAL (x)))
3193 {
3194 *total = 4;
3195 return true;
3196 }
3197 break;
3198 case PLUS:
3199 if (xtensa_simm8 (INTVAL (x))
3200 || xtensa_simm8x256 (INTVAL (x)))
3201 {
3202 *total = 0;
3203 return true;
3204 }
3205 break;
3206 case AND:
3207 if (xtensa_mask_immediate (INTVAL (x)))
3208 {
3209 *total = 0;
3210 return true;
3211 }
3212 break;
3213 case COMPARE:
3214 if ((INTVAL (x) == 0) || xtensa_b4const (INTVAL (x)))
3215 {
3216 *total = 0;
3217 return true;
3218 }
3219 break;
3220 case ASHIFT:
3221 case ASHIFTRT:
3222 case LSHIFTRT:
3223 case ROTATE:
3224 case ROTATERT:
3225 /* No way to tell if X is the 2nd operand so be conservative. */
3226 default: break;
3227 }
3228 if (xtensa_simm12b (INTVAL (x)))
3229 *total = 5;
3230 else if (TARGET_CONST16)
3231 *total = COSTS_N_INSNS (2);
3232 else
3233 *total = 6;
3234 return true;
3235
3236 case CONST:
3237 case LABEL_REF:
3238 case SYMBOL_REF:
3239 if (TARGET_CONST16)
3240 *total = COSTS_N_INSNS (2);
3241 else
3242 *total = 5;
3243 return true;
3244
3245 case CONST_DOUBLE:
3246 if (TARGET_CONST16)
3247 *total = COSTS_N_INSNS (4);
3248 else
3249 *total = 7;
3250 return true;
3251
3252 case MEM:
3253 {
3254 int num_words =
3255 (GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD) ? 2 : 1;
3256
3257 if (memory_address_p (GET_MODE (x), XEXP ((x), 0)))
3258 *total = COSTS_N_INSNS (num_words);
3259 else
3260 *total = COSTS_N_INSNS (2*num_words);
3261 return true;
3262 }
3263
3264 case FFS:
3265 case CTZ:
3266 *total = COSTS_N_INSNS (TARGET_NSA ? 5 : 50);
3267 return true;
3268
3269 case CLZ:
3270 *total = COSTS_N_INSNS (TARGET_NSA ? 1 : 50);
3271 return true;
3272
3273 case NOT:
3274 *total = COSTS_N_INSNS ((GET_MODE (x) == DImode) ? 3 : 2);
3275 return true;
3276
3277 case AND:
3278 case IOR:
3279 case XOR:
3280 if (GET_MODE (x) == DImode)
3281 *total = COSTS_N_INSNS (2);
3282 else
3283 *total = COSTS_N_INSNS (1);
3284 return true;
3285
3286 case ASHIFT:
3287 case ASHIFTRT:
3288 case LSHIFTRT:
3289 if (GET_MODE (x) == DImode)
3290 *total = COSTS_N_INSNS (50);
3291 else
3292 *total = COSTS_N_INSNS (1);
3293 return true;
3294
3295 case ABS:
3296 {
3297 enum machine_mode xmode = GET_MODE (x);
3298 if (xmode == SFmode)
3299 *total = COSTS_N_INSNS (TARGET_HARD_FLOAT ? 1 : 50);
3300 else if (xmode == DFmode)
3301 *total = COSTS_N_INSNS (50);
3302 else
3303 *total = COSTS_N_INSNS (4);
3304 return true;
3305 }
3306
3307 case PLUS:
3308 case MINUS:
3309 {
3310 enum machine_mode xmode = GET_MODE (x);
3311 if (xmode == SFmode)
3312 *total = COSTS_N_INSNS (TARGET_HARD_FLOAT ? 1 : 50);
3313 else if (xmode == DFmode || xmode == DImode)
3314 *total = COSTS_N_INSNS (50);
3315 else
3316 *total = COSTS_N_INSNS (1);
3317 return true;
3318 }
3319
3320 case NEG:
3321 *total = COSTS_N_INSNS ((GET_MODE (x) == DImode) ? 4 : 2);
3322 return true;
3323
3324 case MULT:
3325 {
3326 enum machine_mode xmode = GET_MODE (x);
3327 if (xmode == SFmode)
3328 *total = COSTS_N_INSNS (TARGET_HARD_FLOAT ? 4 : 50);
3329 else if (xmode == DFmode)
3330 *total = COSTS_N_INSNS (50);
3331 else if (xmode == DImode)
3332 *total = COSTS_N_INSNS (TARGET_MUL32_HIGH ? 10 : 50);
3333 else if (TARGET_MUL32)
3334 *total = COSTS_N_INSNS (4);
3335 else if (TARGET_MAC16)
3336 *total = COSTS_N_INSNS (16);
3337 else if (TARGET_MUL16)
3338 *total = COSTS_N_INSNS (12);
3339 else
3340 *total = COSTS_N_INSNS (50);
3341 return true;
3342 }
3343
3344 case DIV:
3345 case MOD:
3346 {
3347 enum machine_mode xmode = GET_MODE (x);
3348 if (xmode == SFmode)
3349 {
3350 *total = COSTS_N_INSNS (TARGET_HARD_FLOAT_DIV ? 8 : 50);
3351 return true;
3352 }
3353 else if (xmode == DFmode)
3354 {
3355 *total = COSTS_N_INSNS (50);
3356 return true;
3357 }
3358 }
3359 /* Fall through. */
3360
3361 case UDIV:
3362 case UMOD:
3363 {
3364 enum machine_mode xmode = GET_MODE (x);
3365 if (xmode == DImode)
3366 *total = COSTS_N_INSNS (50);
3367 else if (TARGET_DIV32)
3368 *total = COSTS_N_INSNS (32);
3369 else
3370 *total = COSTS_N_INSNS (50);
3371 return true;
3372 }
3373
3374 case SQRT:
3375 if (GET_MODE (x) == SFmode)
3376 *total = COSTS_N_INSNS (TARGET_HARD_FLOAT_SQRT ? 8 : 50);
3377 else
3378 *total = COSTS_N_INSNS (50);
3379 return true;
3380
3381 case SMIN:
3382 case UMIN:
3383 case SMAX:
3384 case UMAX:
3385 *total = COSTS_N_INSNS (TARGET_MINMAX ? 1 : 50);
3386 return true;
3387
3388 case SIGN_EXTRACT:
3389 case SIGN_EXTEND:
3390 *total = COSTS_N_INSNS (TARGET_SEXT ? 1 : 2);
3391 return true;
3392
3393 case ZERO_EXTRACT:
3394 case ZERO_EXTEND:
3395 *total = COSTS_N_INSNS (1);
3396 return true;
3397
3398 default:
3399 return false;
3400 }
3401 }
3402
3403 /* Worker function for TARGET_RETURN_IN_MEMORY. */
3404
3405 static bool
3406 xtensa_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
3407 {
3408 return ((unsigned HOST_WIDE_INT) int_size_in_bytes (type)
3409 > 4 * UNITS_PER_WORD);
3410 }
3411
3412 /* Worker function for TARGET_FUNCTION_VALUE. */
3413
3414 rtx
3415 xtensa_function_value (const_tree valtype, const_tree func ATTRIBUTE_UNUSED,
3416 bool outgoing)
3417 {
3418 return gen_rtx_REG ((INTEGRAL_TYPE_P (valtype)
3419 && TYPE_PRECISION (valtype) < BITS_PER_WORD)
3420 ? SImode : TYPE_MODE (valtype),
3421 outgoing ? GP_OUTGOING_RETURN : GP_RETURN);
3422 }
3423
3424 /* TRAMPOLINE_TEMPLATE: For Xtensa, the trampoline must perform an ENTRY
3425 instruction with a minimal stack frame in order to get some free
3426 registers. Once the actual call target is known, the proper stack frame
3427 size is extracted from the ENTRY instruction at the target and the
3428 current frame is adjusted to match. The trampoline then transfers
3429 control to the instruction following the ENTRY at the target. Note:
3430 this assumes that the target begins with an ENTRY instruction. */
3431
3432 void
3433 xtensa_trampoline_template (FILE *stream)
3434 {
3435 bool use_call0 = (TARGET_CONST16 || TARGET_ABSOLUTE_LITERALS);
3436
3437 fprintf (stream, "\t.begin no-transform\n");
3438 fprintf (stream, "\tentry\tsp, %d\n", MIN_FRAME_SIZE);
3439
3440 if (use_call0)
3441 {
3442 /* Save the return address. */
3443 fprintf (stream, "\tmov\ta10, a0\n");
3444
3445 /* Use a CALL0 instruction to skip past the constants and in the
3446 process get the PC into A0. This allows PC-relative access to
3447 the constants without relying on L32R. */
3448 fprintf (stream, "\tcall0\t.Lskipconsts\n");
3449 }
3450 else
3451 fprintf (stream, "\tj\t.Lskipconsts\n");
3452
3453 fprintf (stream, "\t.align\t4\n");
3454 fprintf (stream, ".Lchainval:%s0\n", integer_asm_op (4, TRUE));
3455 fprintf (stream, ".Lfnaddr:%s0\n", integer_asm_op (4, TRUE));
3456 fprintf (stream, ".Lskipconsts:\n");
3457
3458 /* Load the static chain and function address from the trampoline. */
3459 if (use_call0)
3460 {
3461 fprintf (stream, "\taddi\ta0, a0, 3\n");
3462 fprintf (stream, "\tl32i\ta9, a0, 0\n");
3463 fprintf (stream, "\tl32i\ta8, a0, 4\n");
3464 }
3465 else
3466 {
3467 fprintf (stream, "\tl32r\ta9, .Lchainval\n");
3468 fprintf (stream, "\tl32r\ta8, .Lfnaddr\n");
3469 }
3470
3471 /* Store the static chain. */
3472 fprintf (stream, "\ts32i\ta9, sp, %d\n", MIN_FRAME_SIZE - 20);
3473
3474 /* Set the proper stack pointer value. */
3475 fprintf (stream, "\tl32i\ta9, a8, 0\n");
3476 fprintf (stream, "\textui\ta9, a9, %d, 12\n",
3477 TARGET_BIG_ENDIAN ? 8 : 12);
3478 fprintf (stream, "\tslli\ta9, a9, 3\n");
3479 fprintf (stream, "\taddi\ta9, a9, %d\n", -MIN_FRAME_SIZE);
3480 fprintf (stream, "\tsub\ta9, sp, a9\n");
3481 fprintf (stream, "\tmovsp\tsp, a9\n");
3482
3483 if (use_call0)
3484 /* Restore the return address. */
3485 fprintf (stream, "\tmov\ta0, a10\n");
3486
3487 /* Jump to the instruction following the ENTRY. */
3488 fprintf (stream, "\taddi\ta8, a8, 3\n");
3489 fprintf (stream, "\tjx\ta8\n");
3490
3491 /* Pad size to a multiple of TRAMPOLINE_ALIGNMENT. */
3492 if (use_call0)
3493 fprintf (stream, "\t.byte\t0\n");
3494 else
3495 fprintf (stream, "\tnop\n");
3496
3497 fprintf (stream, "\t.end no-transform\n");
3498 }
3499
3500
3501 void
3502 xtensa_initialize_trampoline (rtx addr, rtx func, rtx chain)
3503 {
3504 bool use_call0 = (TARGET_CONST16 || TARGET_ABSOLUTE_LITERALS);
3505 int chain_off = use_call0 ? 12 : 8;
3506 int func_off = use_call0 ? 16 : 12;
3507 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (addr, chain_off)), chain);
3508 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (addr, func_off)), func);
3509 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__xtensa_sync_caches"),
3510 0, VOIDmode, 1, addr, Pmode);
3511 }
3512
3513
3514 #include "gt-xtensa.h"