cris.c (cris_target_asm_function_prologue, [...]): Fix format specifier warnings.
[gcc.git] / gcc / config / cris / cris.c
1 /* Definitions for GCC. Part of the machine description for CRIS.
2 Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
3 Contributed by Axis Communications. Written by Hans-Peter Nilsson.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
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 "real.h"
30 #include "insn-config.h"
31 #include "conditions.h"
32 #include "insn-attr.h"
33 #include "flags.h"
34 #include "tree.h"
35 #include "expr.h"
36 #include "except.h"
37 #include "function.h"
38 #include "toplev.h"
39 #include "recog.h"
40 #include "tm_p.h"
41 #include "debug.h"
42 #include "output.h"
43 #include "target.h"
44 #include "target-def.h"
45 #include "ggc.h"
46
47 /* Usable when we have an amount to add or subtract, and want the
48 optimal size of the insn. */
49 #define ADDITIVE_SIZE_MODIFIER(size) \
50 ((size) <= 63 ? "q" : (size) <= 255 ? "u.b" : (size) <= 65535 ? "u.w" : ".d")
51
52 #define ASSERT_PLT_UNSPEC(x) \
53 do \
54 { \
55 if (XEXP (x, 1) != NULL_RTX \
56 || (GET_CODE (XVECEXP (x, 0, 0)) != SYMBOL_REF \
57 && GET_CODE (XVECEXP (x, 0, 0)) != LABEL_REF)) \
58 abort (); \
59 } while (0)
60
61 #define LOSE_AND_RETURN(msgid, x) \
62 do \
63 { \
64 cris_operand_lossage (msgid, x); \
65 return; \
66 } while (0)
67
68 /* Per-function machine data. */
69 struct machine_function GTY(())
70 {
71 int needs_return_address_on_stack;
72 };
73
74 /* This little fix suppresses the 'u' or 's' when '%e' in assembly
75 pattern. */
76 static char cris_output_insn_is_bound = 0;
77
78 /* This one suppresses printing out the "rPIC+" in
79 "rPIC+sym:GOTOFF+offset" when doing PIC. For a PLT symbol, it
80 suppresses outputting it as [rPIC+sym:GOTPLT] and outputs similarly
81 just the "sym:GOTOFF" part. */
82 static int cris_pic_sympart_only = 0;
83
84 /* Fix for reg_overlap_mentioned_p. */
85 static int cris_reg_overlap_mentioned_p PARAMS ((rtx, rtx));
86
87 static void cris_print_base PARAMS ((rtx, FILE *));
88
89 static void cris_print_index PARAMS ((rtx, FILE *));
90
91 static struct machine_function * cris_init_machine_status PARAMS ((void));
92
93 static int cris_initial_frame_pointer_offset PARAMS ((void));
94
95 static int saved_regs_mentioned PARAMS ((rtx));
96
97 static void cris_target_asm_function_prologue
98 PARAMS ((FILE *, HOST_WIDE_INT));
99
100 static void cris_target_asm_function_epilogue
101 PARAMS ((FILE *, HOST_WIDE_INT));
102
103 static void cris_operand_lossage PARAMS ((const char *, rtx));
104
105 static void cris_asm_output_mi_thunk
106 PARAMS ((FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT, tree));
107
108 static bool cris_rtx_costs PARAMS ((rtx, int, int, int *));
109 static int cris_address_cost PARAMS ((rtx));
110
111 /* The function cris_target_asm_function_epilogue puts the last insn to
112 output here. It always fits; there won't be a symbol operand. Used in
113 delay_slots_for_epilogue and function_epilogue. */
114 static char save_last[80];
115
116 /* This is the argument from the "-max-stack-stackframe=" option. */
117 const char *cris_max_stackframe_str;
118
119 /* This is the argument from the "-march=" option. */
120 const char *cris_cpu_str;
121
122 /* This is the argument from the "-mtune=" option. */
123 const char *cris_tune_str;
124
125 /* This is the argument from the "-melinux-stacksize=" option. */
126 const char *cris_elinux_stacksize_str;
127
128 /* This is the parsed result of the "-max-stack-stackframe=" option. If
129 it (still) is zero, then there was no such option given. */
130 int cris_max_stackframe = 0;
131
132 /* This is the parsed result of the "-march=" option, if given. */
133 int cris_cpu_version = CRIS_DEFAULT_CPU_VERSION;
134
135 #undef TARGET_ASM_ALIGNED_HI_OP
136 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
137 #undef TARGET_ASM_ALIGNED_SI_OP
138 #define TARGET_ASM_ALIGNED_SI_OP "\t.dword\t"
139 #undef TARGET_ASM_ALIGNED_DI_OP
140 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
141
142 /* We need to define these, since the 2byte, 4byte, 8byte op:s are only
143 available in ELF. These "normal" pseudos do not have any alignment
144 constraints or side-effects. */
145 #undef TARGET_ASM_UNALIGNED_HI_OP
146 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
147
148 #undef TARGET_ASM_UNALIGNED_SI_OP
149 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
150
151 #undef TARGET_ASM_UNALIGNED_DI_OP
152 #define TARGET_ASM_UNALIGNED_DI_OP TARGET_ASM_ALIGNED_DI_OP
153
154 #undef TARGET_ASM_FUNCTION_PROLOGUE
155 #define TARGET_ASM_FUNCTION_PROLOGUE cris_target_asm_function_prologue
156
157 #undef TARGET_ASM_FUNCTION_EPILOGUE
158 #define TARGET_ASM_FUNCTION_EPILOGUE cris_target_asm_function_epilogue
159
160 #undef TARGET_ASM_OUTPUT_MI_THUNK
161 #define TARGET_ASM_OUTPUT_MI_THUNK cris_asm_output_mi_thunk
162 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
163 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
164
165 #undef TARGET_RTX_COSTS
166 #define TARGET_RTX_COSTS cris_rtx_costs
167 #undef TARGET_ADDRESS_COST
168 #define TARGET_ADDRESS_COST cris_address_cost
169
170 struct gcc_target targetm = TARGET_INITIALIZER;
171
172 /* Predicate functions. */
173
174 /* This checks a part of an address, the one that is not a plain register
175 for an addressing mode using BDAP.
176 Allowed operands is either:
177 a) a register
178 b) a CONST operand (but not a symbol when generating PIC)
179 c) a [r] or [r+] in SImode, or sign-extend from HI or QI. */
180
181 int
182 cris_bdap_operand (op, mode)
183 rtx op;
184 enum machine_mode mode;
185 {
186 register enum rtx_code code = GET_CODE (op);
187
188 if (mode != SImode && (mode != VOIDmode || GET_MODE (op) != VOIDmode))
189 return 0;
190
191 /* Just return whether this is a simple register or constant. */
192 if (register_operand (op, mode)
193 || (CONSTANT_P (op) && !(flag_pic && cris_symbol (op))))
194 return 1;
195
196 /* Is it a [r] or possibly a [r+]? */
197 if (code == MEM)
198 {
199 rtx tem = XEXP (op, 0);
200
201 if (mode == SImode
202 && (register_operand (tem, SImode)
203 || (GET_CODE (tem) == POST_INC
204 && register_operand (XEXP (tem, 0), SImode))))
205 return 1;
206 else
207 return 0;
208 }
209
210 /* Perhaps a sign-extended mem: [r].(b|w) or [r+].(b|w)? */
211 if (code == SIGN_EXTEND)
212 {
213 rtx tem = XEXP (op, 0);
214
215 if (GET_CODE (tem) != MEM)
216 return 0;
217
218 tem = XEXP (tem, 0);
219 if (mode == SImode
220 && (register_operand (tem, SImode)
221 || (GET_CODE (tem) == POST_INC
222 && register_operand (XEXP (tem, 0), SImode))))
223 return 1;
224 else
225 return 0;
226 }
227
228 return 0;
229 }
230
231 /* This is similar to cris_bdap_operand:
232 It checks a part of an address, the one that is not a plain register
233 for an addressing mode using BDAP *or* BIAP.
234 Allowed operands is either:
235 a) a register
236 b) a CONST operand (but not a symbol when generating PIC)
237 c) a mult of (1, 2 or 4) and a register
238 d) a [r] or [r+] in SImode, or sign-extend from HI or QI. */
239
240 int
241 cris_bdap_biap_operand (op, mode)
242 rtx op;
243 enum machine_mode mode;
244 {
245 register enum rtx_code code = GET_CODE (op);
246 rtx reg;
247 rtx val;
248
249 /* Check for bdap operand. */
250 if (cris_bdap_operand (op, mode))
251 return 1;
252
253 if (mode != SImode && (mode != VOIDmode || GET_MODE (op) != VOIDmode))
254 return 0;
255
256 /* Check that we're looking at a BIAP operand. */
257 if (code != MULT)
258 return 0;
259
260 /* Canonicalize register and multiplicand. */
261 if (GET_CODE (XEXP (op, 0)) == CONST_INT)
262 {
263 val = XEXP (op, 0);
264 reg = XEXP (op, 1);
265 }
266 else
267 {
268 val = XEXP (op, 1);
269 reg = XEXP (op, 0);
270 }
271
272 /* Check that the operands are correct after canonicalization. */
273 if (! register_operand (reg, SImode) || GET_CODE (val) != CONST_INT)
274 return 0;
275
276 /* Check that the multiplicand has a valid value. */
277 if ((code == MULT
278 && (INTVAL (val) == 1 || INTVAL (val) == 2 || INTVAL (val) == 4)))
279 return 1;
280
281 return 0;
282 }
283
284 /* Check if MODE is same as mode for X, and X is PLUS, MINUS, IOR or
285 AND or UMIN. */
286
287 int
288 cris_orthogonal_operator (x, mode)
289 rtx x;
290 enum machine_mode mode;
291 {
292 enum rtx_code code = GET_CODE (x);
293
294 if (mode == VOIDmode)
295 mode = GET_MODE (x);
296
297 return (GET_MODE (x) == mode
298 && (code == PLUS || code == MINUS
299 || code == IOR || code == AND || code == UMIN));
300 }
301
302 /* Check if MODE is same as mode for X, and X is PLUS, IOR or AND or
303 UMIN. */
304
305 int
306 cris_commutative_orth_op (x, mode)
307 rtx x;
308 enum machine_mode mode;
309 {
310 enum rtx_code code = GET_CODE (x);
311
312 if (mode == VOIDmode)
313 mode = GET_MODE (x);
314
315 return (GET_MODE (x) == mode &&
316 (code == PLUS
317 || code == IOR || code == AND || code == UMIN));
318 }
319
320 /* Check if MODE is same as mode for X, and X is PLUS or MINUS or UMIN. */
321
322 int
323 cris_operand_extend_operator (x, mode)
324 rtx x;
325 enum machine_mode mode;
326 {
327 enum rtx_code code = GET_CODE (x);
328
329 if (mode == VOIDmode)
330 mode = GET_MODE (x);
331
332 return (GET_MODE (x) == mode
333 && (code == PLUS || code == MINUS || code == UMIN));
334 }
335
336 /* Check if MODE is same as mode for X, and X is PLUS or MINUS. */
337
338 int
339 cris_additive_operand_extend_operator (x, mode)
340 rtx x;
341 enum machine_mode mode;
342 {
343 enum rtx_code code = GET_CODE (x);
344
345 if (mode == VOIDmode)
346 mode = GET_MODE (x);
347
348 return (GET_MODE (x) == mode
349 && (code == PLUS || code == MINUS));
350 }
351
352 /* Check to see if MODE is same as mode for X, and X is SIGN_EXTEND or
353 ZERO_EXTEND. */
354
355 int
356 cris_extend_operator (x, mode)
357 rtx x;
358 enum machine_mode mode;
359 {
360 enum rtx_code code = GET_CODE (x);
361
362 if (mode == VOIDmode)
363 mode = GET_MODE (x);
364
365 return
366 (GET_MODE (x) == mode && (code == SIGN_EXTEND || code == ZERO_EXTEND));
367 }
368
369 /* Check to see if MODE is same as mode for X, and X is PLUS or BOUND. */
370
371 int
372 cris_plus_or_bound_operator (x, mode)
373 rtx x;
374 enum machine_mode mode;
375 {
376 enum rtx_code code = GET_CODE (x);
377
378 if (mode == VOIDmode)
379 mode = GET_MODE (x);
380
381 return
382 (GET_MODE (x) == mode && (code == UMIN || code == PLUS));
383 }
384
385 /* Since with -fPIC, not all symbols are valid PIC symbols or indeed
386 general_operands, we have to have a predicate that matches it for the
387 "movsi" expander. */
388
389 int
390 cris_general_operand_or_symbol (op, mode)
391 rtx op;
392 enum machine_mode mode;
393 {
394 return general_operand (op, mode)
395 || (CONSTANT_P (op) && cris_symbol (op));
396 }
397
398 /* Since a PIC symbol without a GOT entry is not a general_operand, we
399 have to have a predicate that matches it. We use this in the expanded
400 "movsi" anonymous pattern for PIC symbols. */
401
402 int
403 cris_general_operand_or_gotless_symbol (op, mode)
404 rtx op;
405 enum machine_mode mode;
406 {
407 return general_operand (op, mode)
408 || (CONSTANT_P (op) && cris_gotless_symbol (op));
409 }
410
411 /* Since a PLT symbol is not a general_operand, we have to have a
412 predicate that matches it when we need it. We use this in the expanded
413 "call" and "call_value" anonymous patterns. */
414
415 int
416 cris_general_operand_or_plt_symbol (op, mode)
417 rtx op;
418 enum machine_mode mode;
419 {
420 return general_operand (op, mode)
421 || (GET_CODE (op) == CONST
422 && GET_CODE (XEXP (op, 0)) == UNSPEC
423 && !TARGET_AVOID_GOTPLT);
424 }
425
426 /* This matches a (MEM (general_operand)) or
427 (MEM (cris_general_operand_or_symbol)). The second one isn't a valid
428 memory_operand, so we need this predicate to recognize call
429 destinations before we change them to a PLT operand (by wrapping in
430 UNSPEC 0). */
431
432 int
433 cris_mem_call_operand (op, mode)
434 rtx op;
435 enum machine_mode mode;
436 {
437 rtx xmem;
438
439 if (GET_CODE (op) != MEM)
440 return 0;
441
442 if (memory_operand (op, mode))
443 return 1;
444
445 xmem = XEXP (op, 0);
446
447 return cris_general_operand_or_symbol (xmem, GET_MODE (op));
448 }
449
450 /* The CONDITIONAL_REGISTER_USAGE worker. */
451
452 void
453 cris_conditional_register_usage ()
454 {
455 /* FIXME: This isn't nice. We should be able to use that register for
456 something else if the PIC table isn't needed. */
457 if (flag_pic)
458 fixed_regs[PIC_OFFSET_TABLE_REGNUM]
459 = call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
460 }
461
462 /* Return current_function_uses_pic_offset_table. For use in cris.md,
463 since some generated files do not include function.h. */
464
465 int
466 cris_cfun_uses_pic_table ()
467 {
468 return current_function_uses_pic_offset_table;
469 }
470
471 /* Given an rtx, return the text string corresponding to the CODE of X.
472 Intended for use in the assembly language output section of a
473 define_insn. */
474
475 const char *
476 cris_op_str (x)
477 rtx x;
478 {
479 cris_output_insn_is_bound = 0;
480 switch (GET_CODE (x))
481 {
482 case PLUS:
483 return "add";
484 break;
485
486 case MINUS:
487 return "sub";
488 break;
489
490 case MULT:
491 return "mul";
492 break;
493
494 case DIV:
495 return "div";
496 break;
497
498 case AND:
499 return "and";
500 break;
501
502 case IOR:
503 return "or";
504 break;
505
506 case XOR:
507 return "xor";
508 break;
509
510 case NOT:
511 return "not";
512 break;
513
514 case ASHIFT:
515 return "lsl";
516 break;
517
518 case LSHIFTRT:
519 return "lsr";
520 break;
521
522 case ASHIFTRT:
523 return "asr";
524 break;
525
526 case UMIN:
527 /* Used to control the sign/zero-extend character for the 'e' modifier.
528 BOUND has none. */
529 cris_output_insn_is_bound = 1;
530 return "bound";
531 break;
532
533 default:
534 return "Unknown operator";
535 break;
536 }
537 }
538
539 /* Emit an error message when we're in an asm, and a fatal error for
540 "normal" insns. Formatted output isn't easily implemented, since we
541 use output_operand_lossage to output the actual message and handle the
542 categorization of the error. */
543
544 static void
545 cris_operand_lossage (msgid, op)
546 const char *msgid;
547 rtx op;
548 {
549 debug_rtx (op);
550 output_operand_lossage ("%s", msgid);
551 }
552
553 /* Print an index part of an address to file. */
554
555 static void
556 cris_print_index (index, file)
557 rtx index;
558 FILE * file;
559 {
560 rtx inner = XEXP (index, 0);
561
562 /* Make the index "additive" unless we'll output a negative number, in
563 which case the sign character is free (as in free beer). */
564 if (GET_CODE (index) != CONST_INT || INTVAL (index) >= 0)
565 putc ('+', file);
566
567 if (REG_P (index))
568 fprintf (file, "$%s.b", reg_names[REGNO (index)]);
569 else if (CONSTANT_P (index))
570 cris_output_addr_const (file, index);
571 else if (GET_CODE (index) == MULT)
572 {
573 fprintf (file, "$%s.",
574 reg_names[REGNO (XEXP (index, 0))]);
575
576 putc (INTVAL (XEXP (index, 1)) == 2 ? 'w' : 'd', file);
577 }
578 else if (GET_CODE (index) == SIGN_EXTEND &&
579 GET_CODE (inner) == MEM)
580 {
581 rtx inner_inner = XEXP (inner, 0);
582
583 if (GET_CODE (inner_inner) == POST_INC)
584 {
585 fprintf (file, "[$%s+].",
586 reg_names[REGNO (XEXP (inner_inner, 0))]);
587 putc (GET_MODE (inner) == HImode ? 'w' : 'b', file);
588 }
589 else
590 {
591 fprintf (file, "[$%s].", reg_names[REGNO (inner_inner)]);
592
593 putc (GET_MODE (inner) == HImode ? 'w' : 'b', file);
594 }
595 }
596 else if (GET_CODE (index) == MEM)
597 {
598 if (GET_CODE (inner) == POST_INC)
599 fprintf (file, "[$%s+].d", reg_names[REGNO (XEXP (inner, 0))]);
600 else
601 fprintf (file, "[$%s].d", reg_names[REGNO (inner)]);
602 }
603 else
604 cris_operand_lossage ("unexpected index-type in cris_print_index",
605 index);
606 }
607
608 /* Print a base rtx of an address to file. */
609
610 static void
611 cris_print_base (base, file)
612 rtx base;
613 FILE *file;
614 {
615 if (REG_P (base))
616 fprintf (file, "$%s", reg_names[REGNO (base)]);
617 else if (GET_CODE (base) == POST_INC)
618 fprintf (file, "$%s+", reg_names[REGNO (XEXP (base, 0))]);
619 else
620 cris_operand_lossage ("unexpected base-type in cris_print_base",
621 base);
622 }
623
624 /* Usable as a guard in expressions. */
625
626 int
627 cris_fatal (arg)
628 char *arg;
629 {
630 internal_error (arg);
631
632 /* We'll never get here; this is just to appease compilers. */
633 return 0;
634 }
635
636 /* Textual function prologue. */
637
638 static void
639 cris_target_asm_function_prologue (file, size)
640 FILE *file;
641 HOST_WIDE_INT size;
642 {
643 int regno;
644
645 /* Shorten the used name for readability. */
646 int cfoa_size = current_function_outgoing_args_size;
647 int last_movem_reg = -1;
648 int doing_dwarf = dwarf2out_do_frame ();
649 int framesize;
650 int faked_args_size = 0;
651 int cfa_write_offset = 0;
652 char *cfa_label = NULL;
653 int return_address_on_stack
654 = regs_ever_live[CRIS_SRP_REGNUM]
655 || cfun->machine->needs_return_address_on_stack != 0;
656
657 /* Don't do anything if no prologues or epilogues are wanted. */
658 if (!TARGET_PROLOGUE_EPILOGUE)
659 return;
660
661 if (size < 0)
662 abort ();
663
664 /* Align the size to what's best for the CPU model. */
665 if (TARGET_STACK_ALIGN)
666 size = TARGET_ALIGN_BY_32 ? (size + 3) & ~3 : (size + 1) & ~1;
667
668 if (current_function_pretend_args_size)
669 {
670 int pretend = current_function_pretend_args_size;
671 for (regno = CRIS_FIRST_ARG_REG + CRIS_MAX_ARGS_IN_REGS - 1;
672 pretend > 0;
673 regno--, pretend -= 4)
674 {
675 fprintf (file, "\tpush $%s\n", reg_names[regno]);
676 faked_args_size += 4;
677 }
678 }
679
680 framesize = faked_args_size;
681
682 if (doing_dwarf)
683 {
684 /* FIXME: Slightly redundant calculation, as we do the same in
685 pieces below. This offset must be the total adjustment of the
686 stack-pointer. We can then def_cfa call at the end of this
687 function with the current implementation of execute_cfa_insn, but
688 that wouldn't really be clean. */
689
690 int cfa_offset
691 = faked_args_size
692 + (return_address_on_stack ? 4 : 0)
693 + (frame_pointer_needed ? 4 : 0);
694
695 int cfa_reg;
696
697 if (frame_pointer_needed)
698 cfa_reg = FRAME_POINTER_REGNUM;
699 else
700 {
701 cfa_reg = STACK_POINTER_REGNUM;
702 cfa_offset += cris_initial_frame_pointer_offset ();
703 }
704
705 cfa_label = dwarf2out_cfi_label ();
706 dwarf2out_def_cfa (cfa_label, cfa_reg, cfa_offset);
707
708 cfa_write_offset = - faked_args_size - 4;
709 }
710
711 /* Save SRP if not a leaf function. */
712 if (return_address_on_stack)
713 {
714 fprintf (file, "\tPush $srp\n");
715 framesize += 4;
716
717 if (doing_dwarf)
718 {
719 dwarf2out_return_save (cfa_label, cfa_write_offset);
720 cfa_write_offset -= 4;
721 }
722 }
723
724 /* Set up frame pointer if needed. */
725 if (frame_pointer_needed)
726 {
727 fprintf (file, "\tpush $%s\n\tmove.d $sp,$%s\n",
728 reg_names[FRAME_POINTER_REGNUM],
729 reg_names[FRAME_POINTER_REGNUM]);
730 framesize += 4;
731
732 if (doing_dwarf)
733 {
734 dwarf2out_reg_save (cfa_label, FRAME_POINTER_REGNUM,
735 cfa_write_offset);
736 cfa_write_offset -= 4;
737 }
738 }
739
740 /* Local vars are located above saved regs. */
741 cfa_write_offset -= size;
742
743 /* Get a contiguous sequence of registers, starting with r0, that need
744 to be saved. */
745 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
746 {
747 if ((((regs_ever_live[regno]
748 && !call_used_regs[regno])
749 || (regno == (int) PIC_OFFSET_TABLE_REGNUM
750 && (current_function_uses_pic_offset_table
751 /* It is saved anyway, if there would be a gap. */
752 || (flag_pic
753 && regs_ever_live[regno + 1]
754 && !call_used_regs[regno + 1]))))
755 && (regno != FRAME_POINTER_REGNUM || !frame_pointer_needed)
756 && regno != CRIS_SRP_REGNUM)
757 || (current_function_calls_eh_return
758 && (regno == EH_RETURN_DATA_REGNO (0)
759 || regno == EH_RETURN_DATA_REGNO (1)
760 || regno == EH_RETURN_DATA_REGNO (2)
761 || regno == EH_RETURN_DATA_REGNO (3))))
762 {
763 /* Check if movem may be used for registers so far. */
764 if (regno == last_movem_reg + 1)
765 /* Yes, update next expected register. */
766 last_movem_reg++;
767 else
768 {
769 /* We cannot use movem for all registers. We have to flush
770 any movem:ed registers we got so far. */
771 if (last_movem_reg != -1)
772 {
773 /* It is a win to use a side-effect assignment for
774 64 <= size <= 128. But side-effect on movem was
775 not usable for CRIS v0..3. Also only do it if
776 side-effects insns are allowed. */
777 if ((last_movem_reg + 1) * 4 + size >= 64
778 && (last_movem_reg + 1) * 4 + size <= 128
779 && cris_cpu_version >= CRIS_CPU_SVINTO
780 && TARGET_SIDE_EFFECT_PREFIXES)
781 fprintf (file, "\tmovem $%s,[$sp=$sp-"HOST_WIDE_INT_PRINT_DEC"]\n",
782 reg_names[last_movem_reg],
783 (last_movem_reg + 1) * 4 + size);
784 else
785 {
786 /* Avoid printing multiple subsequent sub:s for sp. */
787 fprintf (file, "\tsub%s "HOST_WIDE_INT_PRINT_DEC",$sp\n",
788 ADDITIVE_SIZE_MODIFIER ((last_movem_reg + 1)
789 * 4 + size),
790 (last_movem_reg + 1) * 4 + size);
791
792 fprintf (file, "\tmovem $%s,[$sp]\n",
793 reg_names[last_movem_reg]);
794 }
795
796 framesize += (last_movem_reg + 1) * 4 + size;
797
798 if (TARGET_PDEBUG)
799 fprintf (file, "; frame "HOST_WIDE_INT_PRINT_DEC
800 ", #regs %d, bytes %d args %d\n",
801 size,
802 last_movem_reg + 1,
803 (last_movem_reg + 1) * 4,
804 current_function_args_size);
805
806 last_movem_reg = -1;
807 size = 0;
808 }
809 else if (size > 0)
810 {
811 /* Local vars on stack, but there are no movem:s.
812 Just allocate space. */
813 fprintf (file, "\tSub%s "HOST_WIDE_INT_PRINT_DEC",$sp\n",
814 ADDITIVE_SIZE_MODIFIER (size),
815 size);
816 framesize += size;
817 size = 0;
818 }
819
820 fprintf (file, "\tPush $%s\n", reg_names[regno]);
821 framesize += 4;
822 }
823
824 if (doing_dwarf)
825 {
826 /* Registers are stored lowest numbered at highest address,
827 which matches the loop order; we just need to update the
828 write-offset. */
829 dwarf2out_reg_save (cfa_label, regno, cfa_write_offset);
830 cfa_write_offset -= 4;
831 }
832 }
833 }
834
835 /* Check after, if we can movem all registers. This is the normal
836 case. */
837 if (last_movem_reg != -1)
838 {
839 /* Side-effect assignment on movem was not supported for CRIS v0..3,
840 and don't do it if we're asked not to.
841
842 The movem is already accounted for, for unwind. */
843
844 if ((last_movem_reg + 1) * 4 + size >= 64
845 && (last_movem_reg + 1) * 4 + size <= 128
846 && cris_cpu_version >= CRIS_CPU_SVINTO
847 && TARGET_SIDE_EFFECT_PREFIXES)
848 fprintf (file, "\tmovem $%s,[$sp=$sp-"HOST_WIDE_INT_PRINT_DEC"]\n",
849 reg_names[last_movem_reg],
850 (last_movem_reg+1) * 4 + size);
851 else
852 {
853 /* Avoid printing multiple subsequent sub:s for sp. FIXME:
854 Clean up the conditional expression. */
855 fprintf (file, "\tsub%s "HOST_WIDE_INT_PRINT_DEC",$sp\n",
856 ADDITIVE_SIZE_MODIFIER ((last_movem_reg + 1) * 4 + size),
857 (last_movem_reg + 1) * 4 + size);
858 /* To be compatible with v0..v3 means we do not use an assignment
859 addressing mode with movem. We normally don't need that
860 anyway. It would only be slightly more efficient for 64..128
861 bytes frame size. */
862 fprintf (file, "\tmovem $%s,[$sp]\n", reg_names[last_movem_reg]);
863 }
864
865 framesize += (last_movem_reg + 1) * 4 + size;
866
867 if (TARGET_PDEBUG)
868 fprintf (file, "; frame "HOST_WIDE_INT_PRINT_DEC
869 ", #regs %d, bytes %d args %d\n",
870 size,
871 last_movem_reg + 1,
872 (last_movem_reg + 1) * 4,
873 current_function_args_size);
874
875 /* We have to put outgoing argument space after regs. */
876 if (cfoa_size)
877 {
878 /* This does not need to be accounted for, for unwind. */
879
880 fprintf (file, "\tSub%s %d,$sp\n",
881 ADDITIVE_SIZE_MODIFIER (cfoa_size),
882 cfoa_size);
883 framesize += cfoa_size;
884 }
885 }
886 else if ((size + cfoa_size) > 0)
887 {
888 /* This does not need to be accounted for, for unwind. */
889
890 /* Local vars on stack, and we could not use movem. Add a sub here. */
891 fprintf (file, "\tSub%s "HOST_WIDE_INT_PRINT_DEC",$sp\n",
892 ADDITIVE_SIZE_MODIFIER (size + cfoa_size),
893 cfoa_size + size);
894 framesize += size + cfoa_size;
895 }
896
897 /* Set up the PIC register. */
898 if (current_function_uses_pic_offset_table)
899 fprintf (file, "\tmove.d $pc,$%s\n\tsub.d .:GOTOFF,$%s\n",
900 reg_names[PIC_OFFSET_TABLE_REGNUM],
901 reg_names[PIC_OFFSET_TABLE_REGNUM]);
902
903 if (TARGET_PDEBUG)
904 fprintf (file,
905 "; parm #%d @ %d; frame " HOST_WIDE_INT_PRINT_DEC
906 ", FP-SP is %d; leaf: %s%s; fp %s, outg: %d arg %d\n",
907 CRIS_MAX_ARGS_IN_REGS + 1, FIRST_PARM_OFFSET (0),
908 get_frame_size (),
909 cris_initial_frame_pointer_offset (),
910 leaf_function_p () ? "yes" : "no",
911 return_address_on_stack ? "no" :"yes",
912 frame_pointer_needed ? "yes" : "no",
913 cfoa_size, current_function_args_size);
914
915 if (cris_max_stackframe && framesize > cris_max_stackframe)
916 warning ("stackframe too big: %d bytes", framesize);
917 }
918
919 /* Return nonzero if there are regs mentioned in the insn that are not all
920 in the call_used regs. This is part of the decision whether an insn
921 can be put in the epilogue. */
922
923 static int
924 saved_regs_mentioned (x)
925 rtx x;
926 {
927 int i;
928 const char *fmt;
929 RTX_CODE code;
930
931 /* Mainly stolen from refers_to_regno_p in rtlanal.c. */
932
933 code = GET_CODE (x);
934
935 switch (code)
936 {
937 case REG:
938 i = REGNO (x);
939 return !call_used_regs[i];
940
941 case SUBREG:
942 /* If this is a SUBREG of a hard reg, we can see exactly which
943 registers are being modified. Otherwise, handle normally. */
944 i = REGNO (SUBREG_REG (x));
945 return !call_used_regs[i];
946
947 default:
948 ;
949 }
950
951 fmt = GET_RTX_FORMAT (code);
952 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
953 {
954 if (fmt[i] == 'e')
955 {
956 if (saved_regs_mentioned (XEXP (x, i)))
957 return 1;
958 }
959 else if (fmt[i] == 'E')
960 {
961 int j;
962 for (j = XVECLEN (x, i) - 1; j >=0; j--)
963 if (saved_regs_mentioned (XEXP (x, i)))
964 return 1;
965 }
966 }
967
968 return 0;
969 }
970
971 /* Figure out if the insn may be put in the epilogue. */
972
973 int
974 cris_eligible_for_epilogue_delay (insn)
975 rtx insn;
976 {
977 /* First of all, it must be as slottable as for a delayed branch insn. */
978 if (get_attr_slottable (insn) != SLOTTABLE_YES)
979 return 0;
980
981 /* It must not refer to the stack pointer (may be valid for some cases
982 that I can't think of). */
983 if (reg_mentioned_p (stack_pointer_rtx, PATTERN (insn)))
984 return 0;
985
986 /* The frame pointer will be restored in the epilogue, before the
987 "ret", so it can't be referred to. */
988 if (frame_pointer_needed
989 && reg_mentioned_p (frame_pointer_rtx, PATTERN (insn)))
990 return 0;
991
992 /* All saved regs are restored before the delayed insn.
993 This means that we cannot have any instructions that mention the
994 registers that are restored by the epilogue. */
995 if (saved_regs_mentioned (PATTERN (insn)))
996 return 0;
997
998 /* It seems to be ok. */
999 return 1;
1000 }
1001
1002 /* Return the number of delay-slots in the epilogue: return 1 if it
1003 contains "ret", else 0. */
1004
1005 int
1006 cris_delay_slots_for_epilogue ()
1007 {
1008 /* Check if we use a return insn, which we only do for leaf functions.
1009 Else there is no slot to fill. */
1010 if (regs_ever_live[CRIS_SRP_REGNUM]
1011 || cfun->machine->needs_return_address_on_stack != 0)
1012 return 0;
1013
1014 /* By calling function_epilogue with the same parameters as from gcc
1015 we can get info about if the epilogue can fill the delay-slot by itself.
1016 If it is filled from the epilogue, then the corresponding string
1017 is in save_last.
1018 This depends on that the "size" argument to function_epilogue
1019 always is get_frame_size.
1020 FIXME: Kludgy. At least make it a separate function that is not
1021 misnamed or abuses the stream parameter. */
1022 cris_target_asm_function_epilogue (NULL, get_frame_size ());
1023
1024 if (*save_last)
1025 return 1;
1026 return 0;
1027 }
1028
1029 /* Textual function epilogue. When file is NULL, it serves doubly as
1030 a test for whether the epilogue can fill any "ret" delay-slots by
1031 itself by storing the delay insn in save_last. */
1032
1033 static void
1034 cris_target_asm_function_epilogue (file, size)
1035 FILE *file;
1036 HOST_WIDE_INT size;
1037 {
1038 int regno;
1039 int last_movem_reg = -1;
1040 rtx insn = get_last_insn ();
1041 int argspace_offset = current_function_outgoing_args_size;
1042 int pretend = current_function_pretend_args_size;
1043 int return_address_on_stack
1044 = regs_ever_live[CRIS_SRP_REGNUM]
1045 || cfun->machine->needs_return_address_on_stack != 0;
1046
1047 save_last[0] = 0;
1048
1049 if (file && !TARGET_PROLOGUE_EPILOGUE)
1050 return;
1051
1052 if (TARGET_PDEBUG && file)
1053 fprintf (file, ";;\n");
1054
1055 /* Align byte count of stack frame. */
1056 if (TARGET_STACK_ALIGN)
1057 size = TARGET_ALIGN_BY_32 ? (size + 3) & ~3 : (size + 1) & ~1;
1058
1059 /* If the last insn was a BARRIER, we don't have to write any code,
1060 then all returns were covered by "return" insns. */
1061 if (GET_CODE (insn) == NOTE)
1062 insn = prev_nonnote_insn (insn);
1063 if (insn
1064 && (GET_CODE (insn) == BARRIER
1065 /* We must make sure that the insn really is a "return" and
1066 not a conditional branch. Try to match the return exactly,
1067 and if it doesn't match, assume it is a conditional branch
1068 (and output an epilogue). */
1069 || (GET_CODE (insn) == JUMP_INSN
1070 && GET_CODE (PATTERN (insn)) == RETURN)))
1071 {
1072 if (TARGET_PDEBUG && file)
1073 fprintf (file, ";;;;;\n");
1074 return;
1075 }
1076
1077 /* Check how many saved regs we can movem. They start at r0 and must
1078 be contiguous. */
1079 for (regno = 0;
1080 regno < FIRST_PSEUDO_REGISTER;
1081 regno++)
1082 if ((((regs_ever_live[regno]
1083 && !call_used_regs[regno])
1084 || (regno == (int) PIC_OFFSET_TABLE_REGNUM
1085 && (current_function_uses_pic_offset_table
1086 /* It is saved anyway, if there would be a gap. */
1087 || (flag_pic
1088 && regs_ever_live[regno + 1]
1089 && !call_used_regs[regno + 1]))))
1090 && (regno != FRAME_POINTER_REGNUM || !frame_pointer_needed)
1091 && regno != CRIS_SRP_REGNUM)
1092 || (current_function_calls_eh_return
1093 && (regno == EH_RETURN_DATA_REGNO (0)
1094 || regno == EH_RETURN_DATA_REGNO (1)
1095 || regno == EH_RETURN_DATA_REGNO (2)
1096 || regno == EH_RETURN_DATA_REGNO (3))))
1097
1098 {
1099 if (regno == last_movem_reg + 1)
1100 last_movem_reg++;
1101 else
1102 break;
1103 }
1104
1105 for (regno = FIRST_PSEUDO_REGISTER - 1;
1106 regno > last_movem_reg;
1107 regno--)
1108 if ((((regs_ever_live[regno]
1109 && !call_used_regs[regno])
1110 || (regno == (int) PIC_OFFSET_TABLE_REGNUM
1111 && (current_function_uses_pic_offset_table
1112 /* It is saved anyway, if there would be a gap. */
1113 || (flag_pic
1114 && regs_ever_live[regno + 1]
1115 && !call_used_regs[regno + 1]))))
1116 && (regno != FRAME_POINTER_REGNUM || !frame_pointer_needed)
1117 && regno != CRIS_SRP_REGNUM)
1118 || (current_function_calls_eh_return
1119 && (regno == EH_RETURN_DATA_REGNO (0)
1120 || regno == EH_RETURN_DATA_REGNO (1)
1121 || regno == EH_RETURN_DATA_REGNO (2)
1122 || regno == EH_RETURN_DATA_REGNO (3))))
1123 {
1124 if (argspace_offset)
1125 {
1126 /* There is an area for outgoing parameters located before
1127 the saved registers. We have to adjust for that. */
1128 if (file)
1129 fprintf (file, "\tAdd%s %d,$sp\n",
1130 ADDITIVE_SIZE_MODIFIER (argspace_offset),
1131 argspace_offset);
1132
1133 /* Make sure we only do this once. */
1134 argspace_offset = 0;
1135 }
1136
1137 /* Flush previous non-movem:ed registers. */
1138 if (*save_last && file)
1139 fprintf (file, save_last);
1140 sprintf (save_last, "\tPop $%s\n", reg_names[regno]);
1141 }
1142
1143 if (last_movem_reg != -1)
1144 {
1145 if (argspace_offset)
1146 {
1147 /* Adjust for the outgoing parameters area, if that's not
1148 handled yet. */
1149 if (*save_last && file)
1150 {
1151 fprintf (file, save_last);
1152 *save_last = 0;
1153 }
1154
1155 if (file)
1156 fprintf (file, "\tAdd%s %d,$sp\n",
1157 ADDITIVE_SIZE_MODIFIER (argspace_offset),
1158 argspace_offset);
1159 argspace_offset = 0;
1160 }
1161 /* Flush previous non-movem:ed registers. */
1162 else if (*save_last && file)
1163 fprintf (file, save_last);
1164 sprintf (save_last, "\tmovem [$sp+],$%s\n", reg_names[last_movem_reg]);
1165 }
1166
1167 /* Restore frame pointer if necessary. */
1168 if (frame_pointer_needed)
1169 {
1170 if (*save_last && file)
1171 fprintf (file, save_last);
1172
1173 if (file)
1174 fprintf (file, "\tmove.d $%s,$sp\n",
1175 reg_names[FRAME_POINTER_REGNUM]);
1176 sprintf (save_last, "\tPop $%s\n",
1177 reg_names[FRAME_POINTER_REGNUM]);
1178 }
1179 else
1180 {
1181 /* If there was no frame-pointer to restore sp from, we must
1182 explicitly deallocate local variables. */
1183
1184 /* Handle space for outgoing parameters that hasn't been handled
1185 yet. */
1186 size += argspace_offset;
1187
1188 if (size)
1189 {
1190 if (*save_last && file)
1191 fprintf (file, save_last);
1192
1193 sprintf (save_last, "\tadd%s "HOST_WIDE_INT_PRINT_DEC",$sp\n",
1194 ADDITIVE_SIZE_MODIFIER (size), size);
1195 }
1196
1197 /* If the size was not in the range for a "quick", we must flush
1198 it here. */
1199 if (size > 63)
1200 {
1201 if (file)
1202 fprintf (file, save_last);
1203 *save_last = 0;
1204 }
1205 }
1206
1207 /* If this function has no pushed register parameters
1208 (stdargs/varargs), and if it is not a leaf function, then we can
1209 just jump-return here. */
1210 if (return_address_on_stack && pretend == 0)
1211 {
1212 if (*save_last && file)
1213 fprintf (file, save_last);
1214 *save_last = 0;
1215
1216 if (file)
1217 {
1218 if (current_function_calls_eh_return)
1219 {
1220 /* The installed EH-return address is in *this* frame, so we
1221 need to pop it before we return. */
1222 fprintf (file, "\tpop $srp\n");
1223 fprintf (file, "\tret\n");
1224 fprintf (file, "\tadd.d $%s,$sp\n", reg_names[CRIS_STACKADJ_REG]);
1225 }
1226 else
1227 fprintf (file, "\tJump [$sp+]\n");
1228
1229 /* Do a sanity check to avoid generating invalid code. */
1230 if (current_function_epilogue_delay_list)
1231 internal_error ("allocated but unused delay list in epilogue");
1232 }
1233 return;
1234 }
1235
1236 /* Rather than add current_function_calls_eh_return conditions
1237 everywhere in the following code (and not be able to test it
1238 thoroughly), assert the assumption that all usage of
1239 __builtin_eh_return are handled above. */
1240 if (current_function_calls_eh_return)
1241 internal_error ("unexpected function type needing stack adjustment for\
1242 __builtin_eh_return");
1243
1244 /* If we pushed some register parameters, then adjust the stack for
1245 them. */
1246 if (pretend)
1247 {
1248 /* Since srp is stored on the way, we need to restore it first. */
1249 if (return_address_on_stack)
1250 {
1251 if (*save_last && file)
1252 fprintf (file, save_last);
1253 *save_last = 0;
1254
1255 if (file)
1256 fprintf (file, "\tpop $srp\n");
1257 }
1258
1259 if (*save_last && file)
1260 fprintf (file, save_last);
1261
1262 sprintf (save_last, "\tadd%s %d,$sp\n",
1263 ADDITIVE_SIZE_MODIFIER (pretend), pretend);
1264 }
1265
1266 /* Here's where we have a delay-slot we need to fill. */
1267 if (file && current_function_epilogue_delay_list)
1268 {
1269 /* If gcc has allocated an insn for the epilogue delay slot, but
1270 things were arranged so we now thought we could do it
1271 ourselves, don't forget to flush that insn. */
1272 if (*save_last)
1273 fprintf (file, save_last);
1274
1275 fprintf (file, "\tRet\n");
1276
1277 /* Output the delay-slot-insn the mandated way. */
1278 final_scan_insn (XEXP (current_function_epilogue_delay_list, 0),
1279 file, 1, -2, 1);
1280 }
1281 else if (file)
1282 {
1283 fprintf (file, "\tRet\n");
1284
1285 /* If the GCC did not do it, we have to use whatever insn we have,
1286 or a nop. */
1287 if (*save_last)
1288 fprintf (file, save_last);
1289 else
1290 fprintf (file, "\tnOp\n");
1291 }
1292 }
1293
1294 /* The PRINT_OPERAND worker. */
1295
1296 void
1297 cris_print_operand (file, x, code)
1298 FILE *file;
1299 rtx x;
1300 int code;
1301 {
1302 rtx operand = x;
1303
1304 /* Size-strings corresponding to MULT expressions. */
1305 static const char *const mults[] = { "BAD:0", ".b", ".w", "BAD:3", ".d" };
1306
1307 /* New code entries should just be added to the switch below. If
1308 handling is finished, just return. If handling was just a
1309 modification of the operand, the modified operand should be put in
1310 "operand", and then do a break to let default handling
1311 (zero-modifier) output the operand. */
1312
1313 switch (code)
1314 {
1315 case 'b':
1316 /* Print the unsigned supplied integer as if it was signed
1317 and < 0, i.e print 255 or 65535 as -1, 254, 65534 as -2, etc. */
1318 if (GET_CODE (x) != CONST_INT
1319 || ! CONST_OK_FOR_LETTER_P (INTVAL (x), 'O'))
1320 LOSE_AND_RETURN ("invalid operand for 'b' modifier", x);
1321 fprintf (file, HOST_WIDE_INT_PRINT_DEC,
1322 INTVAL (x)| (INTVAL (x) <= 255 ? ~255 : ~65535));
1323 return;
1324
1325 case 'x':
1326 /* Print assembler code for operator. */
1327 fprintf (file, "%s", cris_op_str (operand));
1328 return;
1329
1330 case 'v':
1331 /* Print the operand without the PIC register. */
1332 if (! flag_pic || ! CONSTANT_P (x) || ! cris_gotless_symbol (x))
1333 LOSE_AND_RETURN ("invalid operand for 'v' modifier", x);
1334 cris_pic_sympart_only++;
1335 cris_output_addr_const (file, x);
1336 cris_pic_sympart_only--;
1337 return;
1338
1339 case 'P':
1340 /* Print the PIC register. Applied to a GOT-less PIC symbol for
1341 sanity. */
1342 if (! flag_pic || ! CONSTANT_P (x) || ! cris_gotless_symbol (x))
1343 LOSE_AND_RETURN ("invalid operand for 'P' modifier", x);
1344 fprintf (file, "$%s", reg_names [PIC_OFFSET_TABLE_REGNUM]);
1345 return;
1346
1347 case 'p':
1348 /* Adjust a power of two to its log2. */
1349 if (GET_CODE (x) != CONST_INT || exact_log2 (INTVAL (x)) < 0 )
1350 LOSE_AND_RETURN ("invalid operand for 'p' modifier", x);
1351 fprintf (file, "%d", exact_log2 (INTVAL (x)));
1352 return;
1353
1354 case 's':
1355 /* For an integer, print 'b' or 'w' if <= 255 or <= 65535
1356 respectively. This modifier also terminates the inhibiting
1357 effects of the 'x' modifier. */
1358 cris_output_insn_is_bound = 0;
1359 if (GET_MODE (x) == VOIDmode && GET_CODE (x) == CONST_INT)
1360 {
1361 if (INTVAL (x) >= 0)
1362 {
1363 if (INTVAL (x) <= 255)
1364 putc ('b', file);
1365 else if (INTVAL (x) <= 65535)
1366 putc ('w', file);
1367 else
1368 putc ('d', file);
1369 }
1370 else
1371 putc ('d', file);
1372 return;
1373 }
1374
1375 /* For a non-integer, print the size of the operand. */
1376 putc ((GET_MODE (x) == SImode || GET_MODE (x) == SFmode)
1377 ? 'd' : GET_MODE (x) == HImode ? 'w'
1378 : GET_MODE (x) == QImode ? 'b'
1379 /* If none of the above, emit an erroneous size letter. */
1380 : 'X',
1381 file);
1382 return;
1383
1384 case 'z':
1385 /* Const_int: print b for -127 <= x <= 255,
1386 w for -32768 <= x <= 65535, else abort. */
1387 if (GET_CODE (x) != CONST_INT
1388 || INTVAL (x) < -32768 || INTVAL (x) > 65535)
1389 LOSE_AND_RETURN ("invalid operand for 'z' modifier", x);
1390 putc (INTVAL (x) >= -128 && INTVAL (x) <= 255 ? 'b' : 'w', file);
1391 return;
1392
1393 case '#':
1394 /* Output a 'nop' if there's nothing for the delay slot.
1395 This method stolen from the sparc files. */
1396 if (dbr_sequence_length () == 0)
1397 fputs ("\n\tnop", file);
1398 return;
1399
1400 case 'H':
1401 /* Print high (most significant) part of something. */
1402 switch (GET_CODE (operand))
1403 {
1404 case CONST_INT:
1405 if (HOST_BITS_PER_WIDE_INT == 32)
1406 /* Sign-extension from a normal int to a long long. */
1407 fprintf (file, INTVAL (operand) < 0 ? "-1" : "0");
1408 else
1409 fprintf (file, "0x%x", (unsigned int)(INTVAL (x) >> 31 >> 1));
1410 return;
1411
1412 case CONST_DOUBLE:
1413 /* High part of a long long constant. */
1414 if (GET_MODE (operand) == VOIDmode)
1415 {
1416 fprintf (file, HOST_WIDE_INT_PRINT_HEX, CONST_DOUBLE_HIGH (x));
1417 return;
1418 }
1419 else
1420 LOSE_AND_RETURN ("invalid operand for 'H' modifier", x);
1421
1422 case REG:
1423 /* Print reg + 1. Check that there's not an attempt to print
1424 high-parts of registers like stack-pointer or higher. */
1425 if (REGNO (operand) > STACK_POINTER_REGNUM - 2)
1426 LOSE_AND_RETURN ("bad register", operand);
1427 fprintf (file, "$%s", reg_names[REGNO (operand) + 1]);
1428 return;
1429
1430 case MEM:
1431 /* Adjust memory address to high part. */
1432 {
1433 rtx adj_mem = operand;
1434 int size
1435 = GET_MODE_BITSIZE (GET_MODE (operand)) / BITS_PER_UNIT;
1436
1437 /* Adjust so we can use two SImode in DImode.
1438 Calling adj_offsettable_operand will make sure it is an
1439 offsettable address. Don't do this for a postincrement
1440 though; it should remain as it was. */
1441 if (GET_CODE (XEXP (adj_mem, 0)) != POST_INC)
1442 adj_mem
1443 = adjust_address (adj_mem, GET_MODE (adj_mem), size / 2);
1444
1445 output_address (XEXP (adj_mem, 0));
1446 return;
1447 }
1448
1449 default:
1450 LOSE_AND_RETURN ("invalid operand for 'H' modifier", x);
1451 }
1452
1453 case 'L':
1454 /* Strip the MEM expression. */
1455 operand = XEXP (operand, 0);
1456 break;
1457
1458 case 'e':
1459 /* Print 's' if operand is SIGN_EXTEND or 'u' if ZERO_EXTEND unless
1460 cris_output_insn_is_bound is nonzero. */
1461 if (GET_CODE (operand) != SIGN_EXTEND
1462 && GET_CODE (operand) != ZERO_EXTEND
1463 && GET_CODE (operand) != CONST_INT)
1464 LOSE_AND_RETURN ("invalid operand for 'e' modifier", x);
1465
1466 if (cris_output_insn_is_bound)
1467 {
1468 cris_output_insn_is_bound = 0;
1469 return;
1470 }
1471
1472 putc (GET_CODE (operand) == SIGN_EXTEND
1473 || (GET_CODE (operand) == CONST_INT && INTVAL (operand) < 0)
1474 ? 's' : 'u', file);
1475 return;
1476
1477 case 'm':
1478 /* Print the size letter of the inner element. We can do it by
1479 calling ourselves with the 's' modifier. */
1480 if (GET_CODE (operand) != SIGN_EXTEND && GET_CODE (operand) != ZERO_EXTEND)
1481 LOSE_AND_RETURN ("invalid operand for 'm' modifier", x);
1482 cris_print_operand (file, XEXP (operand, 0), 's');
1483 return;
1484
1485 case 'M':
1486 /* Print the least significant part of operand. */
1487 if (GET_CODE (operand) == CONST_DOUBLE)
1488 {
1489 fprintf (file, HOST_WIDE_INT_PRINT_HEX, CONST_DOUBLE_LOW (x));
1490 return;
1491 }
1492 else if (HOST_BITS_PER_WIDE_INT > 32 && GET_CODE (operand) == CONST_INT)
1493 {
1494 fprintf (file, HOST_WIDE_INT_PRINT_HEX,
1495 INTVAL (x) & ((unsigned int) 0x7fffffff * 2 + 1));
1496 return;
1497 }
1498 /* Otherwise the least significant part equals the normal part,
1499 so handle it normally. */
1500 break;
1501
1502 case 'A':
1503 /* When emitting an add for the high part of a DImode constant, we
1504 want to use addq for 0 and adds.w for -1. */
1505 if (GET_CODE (operand) != CONST_INT)
1506 LOSE_AND_RETURN ("invalid operand for 'A' modifier", x);
1507 fprintf (file, INTVAL (operand) < 0 ? "adds.w" : "addq");
1508 return;
1509
1510 case 'D':
1511 /* When emitting an sub for the high part of a DImode constant, we
1512 want to use subq for 0 and subs.w for -1. */
1513 if (GET_CODE (operand) != CONST_INT)
1514 LOSE_AND_RETURN ("invalid operand for 'D' modifier", x);
1515 fprintf (file, INTVAL (operand) < 0 ? "subs.w" : "subq");
1516 return;
1517
1518 case 'S':
1519 /* Print the operand as the index-part of an address.
1520 Easiest way out is to use cris_print_index. */
1521 cris_print_index (operand, file);
1522 return;
1523
1524 case 'T':
1525 /* Print the size letter for an operand to a MULT, which must be a
1526 const_int with a suitable value. */
1527 if (GET_CODE (operand) != CONST_INT || INTVAL (operand) > 4)
1528 LOSE_AND_RETURN ("invalid operand for 'T' modifier", x);
1529 fprintf (file, "%s", mults[INTVAL (operand)]);
1530 return;
1531
1532 case 0:
1533 /* No code, print as usual. */
1534 break;
1535
1536 default:
1537 LOSE_AND_RETURN ("invalid operand modifier letter", x);
1538 }
1539
1540 /* Print an operand as without a modifier letter. */
1541 switch (GET_CODE (operand))
1542 {
1543 case REG:
1544 if (REGNO (operand) > 15)
1545 internal_error ("internal error: bad register: %d", REGNO (operand));
1546 fprintf (file, "$%s", reg_names[REGNO (operand)]);
1547 return;
1548
1549 case MEM:
1550 output_address (XEXP (operand, 0));
1551 return;
1552
1553 case CONST_DOUBLE:
1554 if (GET_MODE (operand) == VOIDmode)
1555 /* A long long constant. */
1556 output_addr_const (file, operand);
1557 else
1558 {
1559 /* Only single precision is allowed as plain operands the
1560 moment. FIXME: REAL_VALUE_FROM_CONST_DOUBLE isn't
1561 documented. */
1562 REAL_VALUE_TYPE r;
1563 long l;
1564
1565 /* FIXME: Perhaps check overflow of the "single". */
1566 REAL_VALUE_FROM_CONST_DOUBLE (r, operand);
1567 REAL_VALUE_TO_TARGET_SINGLE (r, l);
1568
1569 fprintf (file, "0x%lx", l);
1570 }
1571 return;
1572
1573 case UNSPEC:
1574 ASSERT_PLT_UNSPEC (operand);
1575 /* Fall through. */
1576
1577 case CONST:
1578 cris_output_addr_const (file, operand);
1579 return;
1580
1581 case MULT:
1582 case ASHIFT:
1583 {
1584 /* For a (MULT (reg X) const_int) we output "rX.S". */
1585 int i = GET_CODE (XEXP (operand, 1)) == CONST_INT
1586 ? INTVAL (XEXP (operand, 1)) : INTVAL (XEXP (operand, 0));
1587 rtx reg = GET_CODE (XEXP (operand, 1)) == CONST_INT
1588 ? XEXP (operand, 0) : XEXP (operand, 1);
1589
1590 if (GET_CODE (reg) != REG
1591 || (GET_CODE (XEXP (operand, 0)) != CONST_INT
1592 && GET_CODE (XEXP (operand, 1)) != CONST_INT))
1593 LOSE_AND_RETURN ("unexpected multiplicative operand", x);
1594
1595 cris_print_base (reg, file);
1596 fprintf (file, ".%c",
1597 i == 0 || (i == 1 && GET_CODE (operand) == MULT) ? 'b'
1598 : i == 4 ? 'd'
1599 : (i == 2 && GET_CODE (operand) == MULT) || i == 1 ? 'w'
1600 : 'd');
1601 return;
1602 }
1603
1604 default:
1605 /* No need to handle all strange variants, let output_addr_const
1606 do it for us. */
1607 if (CONSTANT_P (operand))
1608 {
1609 cris_output_addr_const (file, operand);
1610 return;
1611 }
1612
1613 LOSE_AND_RETURN ("unexpected operand", x);
1614 }
1615 }
1616
1617 /* The PRINT_OPERAND_ADDRESS worker. */
1618
1619 void
1620 cris_print_operand_address (file, x)
1621 FILE *file;
1622 rtx x;
1623 {
1624 /* All these were inside MEM:s so output indirection characters. */
1625 putc ('[', file);
1626
1627 if (CONSTANT_ADDRESS_P (x))
1628 cris_output_addr_const (file, x);
1629 else if (BASE_OR_AUTOINCR_P (x))
1630 cris_print_base (x, file);
1631 else if (GET_CODE (x) == PLUS)
1632 {
1633 rtx x1, x2;
1634
1635 x1 = XEXP (x, 0);
1636 x2 = XEXP (x, 1);
1637 if (BASE_P (x1))
1638 {
1639 cris_print_base (x1, file);
1640 cris_print_index (x2, file);
1641 }
1642 else if (BASE_P (x2))
1643 {
1644 cris_print_base (x2, file);
1645 cris_print_index (x1, file);
1646 }
1647 else
1648 LOSE_AND_RETURN ("unrecognized address", x);
1649 }
1650 else if (GET_CODE (x) == MEM)
1651 {
1652 /* A DIP. Output more indirection characters. */
1653 putc ('[', file);
1654 cris_print_base (XEXP (x, 0), file);
1655 putc (']', file);
1656 }
1657 else
1658 LOSE_AND_RETURN ("unrecognized address", x);
1659
1660 putc (']', file);
1661 }
1662
1663 /* The RETURN_ADDR_RTX worker.
1664 We mark that the return address is used, either by EH or
1665 __builtin_return_address, for use by the function prologue and
1666 epilogue. FIXME: This isn't optimal; we just use the mark in the
1667 prologue and epilogue to say that the return address is to be stored
1668 in the stack frame. We could return SRP for leaf-functions and use the
1669 initial-value machinery. */
1670
1671 rtx
1672 cris_return_addr_rtx (count, frameaddr)
1673 int count;
1674 rtx frameaddr ATTRIBUTE_UNUSED;
1675 {
1676 cfun->machine->needs_return_address_on_stack = 1;
1677
1678 /* The return-address is stored just above the saved frame-pointer (if
1679 present). Apparently we can't eliminate from the frame-pointer in
1680 that direction, so use the incoming args (maybe pretended) pointer. */
1681 return count == 0
1682 ? gen_rtx_MEM (Pmode, plus_constant (virtual_incoming_args_rtx, -4))
1683 : NULL_RTX;
1684 }
1685
1686 /* This used to be the INITIAL_FRAME_POINTER_OFFSET worker; now only
1687 handles FP -> SP elimination offset. */
1688
1689 static int
1690 cris_initial_frame_pointer_offset ()
1691 {
1692 int regno;
1693
1694 /* Initial offset is 0 if we don't have a frame pointer. */
1695 int offs = 0;
1696
1697 /* And 4 for each register pushed. */
1698 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1699 if ((((regs_ever_live[regno]
1700 && !call_used_regs[regno])
1701 || (regno == (int) PIC_OFFSET_TABLE_REGNUM
1702 && (current_function_uses_pic_offset_table
1703 /* It is saved anyway, if there would be a gap. */
1704 || (flag_pic
1705 && regs_ever_live[regno + 1]
1706 && !call_used_regs[regno + 1]))))
1707 && (regno != FRAME_POINTER_REGNUM || !frame_pointer_needed)
1708 && regno != CRIS_SRP_REGNUM)
1709 || (current_function_calls_eh_return
1710 && (regno == EH_RETURN_DATA_REGNO (0)
1711 || regno == EH_RETURN_DATA_REGNO (1)
1712 || regno == EH_RETURN_DATA_REGNO (2)
1713 || regno == EH_RETURN_DATA_REGNO (3))))
1714 offs += 4;
1715
1716 /* And then, last, we add the locals allocated. */
1717 offs += get_frame_size ();
1718
1719 /* And more; the accumulated args size. */
1720 offs += current_function_outgoing_args_size;
1721
1722 /* Then round it off, in case we use aligned stack. */
1723 if (TARGET_STACK_ALIGN)
1724 offs = TARGET_ALIGN_BY_32 ? (offs + 3) & ~3 : (offs + 1) & ~1;
1725
1726 return offs;
1727 }
1728
1729 /* The INITIAL_ELIMINATION_OFFSET worker.
1730 Calculate the difference between imaginary registers such as frame
1731 pointer and the stack pointer. Used to eliminate the frame pointer
1732 and imaginary arg pointer. */
1733
1734 int
1735 cris_initial_elimination_offset (fromreg, toreg)
1736 int fromreg;
1737 int toreg;
1738 {
1739 int fp_sp_offset
1740 = cris_initial_frame_pointer_offset ();
1741
1742 /* We should be able to use regs_ever_live and related prologue
1743 information here, or alpha should not as well. */
1744 int return_address_on_stack
1745 = regs_ever_live[CRIS_SRP_REGNUM]
1746 || cfun->machine->needs_return_address_on_stack != 0;
1747
1748 /* Here we act as if the frame-pointer is needed. */
1749 int ap_fp_offset = 4 + (return_address_on_stack ? 4 : 0);
1750
1751 if (fromreg == ARG_POINTER_REGNUM
1752 && toreg == FRAME_POINTER_REGNUM)
1753 return ap_fp_offset;
1754
1755 /* Between the frame pointer and the stack are only "normal" stack
1756 variables and saved registers. */
1757 if (fromreg == FRAME_POINTER_REGNUM
1758 && toreg == STACK_POINTER_REGNUM)
1759 return fp_sp_offset;
1760
1761 /* We need to balance out the frame pointer here. */
1762 if (fromreg == ARG_POINTER_REGNUM
1763 && toreg == STACK_POINTER_REGNUM)
1764 return ap_fp_offset + fp_sp_offset - 4;
1765
1766 abort ();
1767 }
1768
1769 /* This function looks into the pattern to see how this insn affects
1770 condition codes.
1771
1772 Used when to eliminate test insns before a condition-code user,
1773 such as a "scc" insn or a conditional branch. This includes
1774 checking if the entities that cc was updated by, are changed by the
1775 operation.
1776
1777 Currently a jumble of the old peek-inside-the-insn and the newer
1778 check-cc-attribute methods. */
1779
1780 void
1781 cris_notice_update_cc (exp, insn)
1782 rtx exp;
1783 rtx insn;
1784 {
1785 /* Check if user specified "-mcc-init" as a bug-workaround. FIXME:
1786 TARGET_CCINIT does not work; we must set CC_REVERSED as below.
1787 Several test-cases will otherwise fail, for example
1788 gcc.c-torture/execute/20000217-1.c -O0 and -O1. */
1789 if (TARGET_CCINIT)
1790 {
1791 CC_STATUS_INIT;
1792 return;
1793 }
1794
1795 /* Slowly, we're converting to using attributes to control the setting
1796 of condition-code status. */
1797 switch (get_attr_cc (insn))
1798 {
1799 case CC_NONE:
1800 /* Even if it is "none", a setting may clobber a previous
1801 cc-value, so check. */
1802 if (GET_CODE (exp) == SET)
1803 {
1804 if (cc_status.value1
1805 && cris_reg_overlap_mentioned_p (SET_DEST (exp),
1806 cc_status.value1))
1807 cc_status.value1 = 0;
1808
1809 if (cc_status.value2
1810 && cris_reg_overlap_mentioned_p (SET_DEST (exp),
1811 cc_status.value2))
1812 cc_status.value2 = 0;
1813 }
1814 return;
1815
1816 case CC_CLOBBER:
1817 CC_STATUS_INIT;
1818 break;
1819
1820 case CC_NORMAL:
1821 /* Which means, for:
1822 (set (cc0) (...)):
1823 CC is (...).
1824
1825 (set (reg) (...)):
1826 CC is (reg) and (...) - unless (...) is 0, then CC does not change.
1827 CC_NO_OVERFLOW unless (...) is reg or mem.
1828
1829 (set (mem) (...)):
1830 CC does not change.
1831
1832 (set (pc) (...)):
1833 CC does not change.
1834
1835 (parallel
1836 (set (reg1) (mem (bdap/biap)))
1837 (set (reg2) (bdap/biap))):
1838 CC is (reg1) and (mem (reg2))
1839
1840 (parallel
1841 (set (mem (bdap/biap)) (reg1)) [or 0]
1842 (set (reg2) (bdap/biap))):
1843 CC does not change.
1844
1845 (where reg and mem includes strict_low_parts variants thereof)
1846
1847 For all others, assume CC is clobbered.
1848 Note that we do not have to care about setting CC_NO_OVERFLOW,
1849 since the overflow flag is set to 0 (i.e. right) for
1850 instructions where it does not have any sane sense, but where
1851 other flags have meanings. (This includes shifts; the carry is
1852 not set by them).
1853
1854 Note that there are other parallel constructs we could match,
1855 but we don't do that yet. */
1856
1857 if (GET_CODE (exp) == SET)
1858 {
1859 /* FIXME: Check when this happens. It looks like we should
1860 actually do a CC_STATUS_INIT here to be safe. */
1861 if (SET_DEST (exp) == pc_rtx)
1862 return;
1863
1864 /* Record CC0 changes, so we do not have to output multiple
1865 test insns. */
1866 if (SET_DEST (exp) == cc0_rtx)
1867 {
1868 cc_status.value1 = SET_SRC (exp);
1869 cc_status.value2 = 0;
1870
1871 /* Handle flags for the special btstq on one bit. */
1872 if (GET_CODE (SET_SRC (exp)) == ZERO_EXTRACT
1873 && XEXP (SET_SRC (exp), 1) == const1_rtx)
1874 {
1875 if (GET_CODE (XEXP (SET_SRC (exp), 0)) == CONST_INT)
1876 /* Using cmpq. */
1877 cc_status.flags = CC_INVERTED;
1878 else
1879 /* A one-bit btstq. */
1880 cc_status.flags = CC_Z_IN_NOT_N;
1881 }
1882 else
1883 cc_status.flags = 0;
1884
1885 if (GET_CODE (SET_SRC (exp)) == COMPARE)
1886 {
1887 if (!REG_P (XEXP (SET_SRC (exp), 0))
1888 && XEXP (SET_SRC (exp), 1) != const0_rtx)
1889 /* For some reason gcc will not canonicalize compare
1890 operations, reversing the sign by itself if
1891 operands are in wrong order. */
1892 /* (But NOT inverted; eq is still eq.) */
1893 cc_status.flags = CC_REVERSED;
1894
1895 /* This seems to be overlooked by gcc. FIXME: Check again.
1896 FIXME: Is it really safe? */
1897 cc_status.value2
1898 = gen_rtx_MINUS (GET_MODE (SET_SRC (exp)),
1899 XEXP (SET_SRC (exp), 0),
1900 XEXP (SET_SRC (exp), 1));
1901 }
1902 return;
1903 }
1904 else if (REG_P (SET_DEST (exp))
1905 || (GET_CODE (SET_DEST (exp)) == STRICT_LOW_PART
1906 && REG_P (XEXP (SET_DEST (exp), 0))))
1907 {
1908 /* A register is set; normally CC is set to show that no
1909 test insn is needed. Catch the exceptions. */
1910
1911 /* If not to cc0, then no "set"s in non-natural mode give
1912 ok cc0... */
1913 if (GET_MODE_SIZE (GET_MODE (SET_DEST (exp))) > UNITS_PER_WORD
1914 || GET_MODE_CLASS (GET_MODE (SET_DEST (exp))) == MODE_FLOAT)
1915 {
1916 /* ... except add:s and sub:s in DImode. */
1917 if (GET_MODE (SET_DEST (exp)) == DImode
1918 && (GET_CODE (SET_SRC (exp)) == PLUS
1919 || GET_CODE (SET_SRC (exp)) == MINUS))
1920 {
1921 cc_status.flags = 0;
1922 cc_status.value1 = SET_DEST (exp);
1923 cc_status.value2 = SET_SRC (exp);
1924
1925 if (cris_reg_overlap_mentioned_p (cc_status.value1,
1926 cc_status.value2))
1927 cc_status.value2 = 0;
1928
1929 /* Add and sub may set V, which gets us
1930 unoptimizable results in "gt" and "le" condition
1931 codes. */
1932 cc_status.flags |= CC_NO_OVERFLOW;
1933
1934 return;
1935 }
1936 }
1937 else if (SET_SRC (exp) == const0_rtx)
1938 {
1939 /* There's no CC0 change when clearing a register or
1940 memory. Just check for overlap. */
1941 if ((cc_status.value1
1942 && cris_reg_overlap_mentioned_p (SET_DEST (exp),
1943 cc_status.value1)))
1944 cc_status.value1 = 0;
1945
1946 if ((cc_status.value2
1947 && cris_reg_overlap_mentioned_p (SET_DEST (exp),
1948 cc_status.value2)))
1949 cc_status.value2 = 0;
1950
1951 return;
1952 }
1953 else
1954 {
1955 cc_status.flags = 0;
1956 cc_status.value1 = SET_DEST (exp);
1957 cc_status.value2 = SET_SRC (exp);
1958
1959 if (cris_reg_overlap_mentioned_p (cc_status.value1,
1960 cc_status.value2))
1961 cc_status.value2 = 0;
1962
1963 /* Some operations may set V, which gets us
1964 unoptimizable results in "gt" and "le" condition
1965 codes. */
1966 if (GET_CODE (SET_SRC (exp)) == PLUS
1967 || GET_CODE (SET_SRC (exp)) == MINUS
1968 || GET_CODE (SET_SRC (exp)) == NEG)
1969 cc_status.flags |= CC_NO_OVERFLOW;
1970
1971 return;
1972 }
1973 }
1974 else if (GET_CODE (SET_DEST (exp)) == MEM
1975 || (GET_CODE (SET_DEST (exp)) == STRICT_LOW_PART
1976 && GET_CODE (XEXP (SET_DEST (exp), 0)) == MEM))
1977 {
1978 /* When SET to MEM, then CC is not changed (except for
1979 overlap). */
1980 if ((cc_status.value1
1981 && cris_reg_overlap_mentioned_p (SET_DEST (exp),
1982 cc_status.value1)))
1983 cc_status.value1 = 0;
1984
1985 if ((cc_status.value2
1986 && cris_reg_overlap_mentioned_p (SET_DEST (exp),
1987 cc_status.value2)))
1988 cc_status.value2 = 0;
1989
1990 return;
1991 }
1992 }
1993 else if (GET_CODE (exp) == PARALLEL)
1994 {
1995 if (GET_CODE (XVECEXP (exp, 0, 0)) == SET
1996 && GET_CODE (XVECEXP (exp, 0, 1)) == SET
1997 && REG_P (XEXP (XVECEXP (exp, 0, 1), 0)))
1998 {
1999 if (REG_P (XEXP (XVECEXP (exp, 0, 0), 0))
2000 && GET_CODE (XEXP (XVECEXP (exp, 0, 0), 1)) == MEM)
2001 {
2002 /* For "move.S [rx=ry+o],rz", say CC reflects
2003 value1=rz and value2=[rx] */
2004 cc_status.value1 = XEXP (XVECEXP (exp, 0, 0), 0);
2005 cc_status.value2
2006 = gen_rtx_MEM (GET_MODE (XEXP (XVECEXP (exp, 0, 0), 0)),
2007 XEXP (XVECEXP (exp, 0, 1), 0));
2008 cc_status.flags = 0;
2009
2010 /* Huh? A side-effect cannot change the destination
2011 register. */
2012 if (cris_reg_overlap_mentioned_p (cc_status.value1,
2013 cc_status.value2))
2014 internal_error ("internal error: sideeffect-insn affecting main effect");
2015 return;
2016 }
2017 else if ((REG_P (XEXP (XVECEXP (exp, 0, 0), 1))
2018 || XEXP (XVECEXP (exp, 0, 0), 1) == const0_rtx)
2019 && GET_CODE (XEXP (XVECEXP (exp, 0, 0), 0)) == MEM)
2020 {
2021 /* For "move.S rz,[rx=ry+o]" and "clear.S [rx=ry+o]",
2022 say flags are not changed, except for overlap. */
2023 if (cc_status.value1
2024 && cris_reg_overlap_mentioned_p (XEXP
2025 (XVECEXP
2026 (exp, 0, 0), 0),
2027 cc_status.value1))
2028 cc_status.value1 = 0;
2029
2030 if (cc_status.value1
2031 && cris_reg_overlap_mentioned_p (XEXP
2032 (XVECEXP
2033 (exp, 0, 1), 0),
2034 cc_status.value1))
2035 cc_status.value1 = 0;
2036
2037 if (cc_status.value2
2038 && cris_reg_overlap_mentioned_p (XEXP
2039 (XVECEXP
2040 (exp, 0, 0), 0),
2041 cc_status.value2))
2042 cc_status.value2 = 0;
2043
2044 if (cc_status.value2
2045 && cris_reg_overlap_mentioned_p (XEXP
2046 (XVECEXP
2047 (exp, 0, 1), 0),
2048 cc_status.value2))
2049 cc_status.value2 = 0;
2050
2051 return;
2052 }
2053 }
2054 }
2055 break;
2056
2057 default:
2058 /* Unknown cc_attr value. */
2059 abort ();
2060 }
2061
2062 CC_STATUS_INIT;
2063 }
2064
2065 /* Return != 0 if the return sequence for the current function is short,
2066 like "ret" or "jump [sp+]". Prior to reloading, we can't tell how
2067 many registers must be saved, so return 0 then. */
2068
2069 int
2070 cris_simple_epilogue ()
2071 {
2072 int regno;
2073 int reglimit = STACK_POINTER_REGNUM;
2074 int lastreg = -1;
2075
2076 if (! reload_completed
2077 || frame_pointer_needed
2078 || get_frame_size () != 0
2079 || current_function_pretend_args_size
2080 || current_function_args_size
2081 || current_function_outgoing_args_size
2082 || current_function_calls_eh_return
2083
2084 /* If we're not supposed to emit prologue and epilogue, we must
2085 not emit return-type instructions. */
2086 || !TARGET_PROLOGUE_EPILOGUE)
2087 return 0;
2088
2089 /* We allow a "movem [sp+],rN" to sit in front if the "jump [sp+]" or
2090 in the delay-slot of the "ret". */
2091 for (regno = 0; regno < reglimit; regno++)
2092 if ((regs_ever_live[regno] && ! call_used_regs[regno])
2093 || (regno == (int) PIC_OFFSET_TABLE_REGNUM
2094 && (current_function_uses_pic_offset_table
2095 /* It is saved anyway, if there would be a gap. */
2096 || (flag_pic
2097 && regs_ever_live[regno + 1]
2098 && !call_used_regs[regno + 1]))))
2099 {
2100 if (lastreg != regno - 1)
2101 return 0;
2102 lastreg = regno;
2103 }
2104
2105 return 1;
2106 }
2107
2108 /* Compute a (partial) cost for rtx X. Return true if the complete
2109 cost has been computed, and false if subexpressions should be
2110 scanned. In either case, *TOTAL contains the cost result. */
2111
2112 static bool
2113 cris_rtx_costs (x, code, outer_code, total)
2114 rtx x;
2115 int code, outer_code;
2116 int *total;
2117 {
2118 switch (code)
2119 {
2120 case CONST_INT:
2121 {
2122 HOST_WIDE_INT val = INTVAL (x);
2123 if (val == 0)
2124 *total = 0;
2125 else if (val < 32 && val >= -32)
2126 *total = 1;
2127 /* Eight or 16 bits are a word and cycle more expensive. */
2128 else if (val <= 32767 && val >= -32768)
2129 *total = 2;
2130 /* A 32 bit constant (or very seldom, unsigned 16 bits) costs
2131 another word. FIXME: This isn't linear to 16 bits. */
2132 else
2133 *total = 4;
2134 return true;
2135 }
2136
2137 case LABEL_REF:
2138 *total = 6;
2139 return true;
2140
2141 case CONST:
2142 case SYMBOL_REF:
2143 /* For PIC, we need a prefix (if it isn't already there),
2144 and the PIC register. For a global PIC symbol, we also
2145 need a read of the GOT. */
2146 if (flag_pic)
2147 {
2148 if (cris_got_symbol (x))
2149 *total = 2 + 4 + 6;
2150 else
2151 *total = 2 + 6;
2152 }
2153 else
2154 *total = 6;
2155 return true;
2156
2157 case CONST_DOUBLE:
2158 if (x != CONST0_RTX (GET_MODE (x) == VOIDmode ? DImode : GET_MODE (x)))
2159 *total = 12;
2160 else
2161 /* Make 0.0 cheap, else test-insns will not be used. */
2162 *total = 0;
2163 return true;
2164
2165 case MULT:
2166 /* Identify values that are no powers of two. Powers of 2 are
2167 taken care of already and those values should not be changed. */
2168 if (GET_CODE (XEXP (x, 1)) != CONST_INT
2169 || exact_log2 (INTVAL (XEXP (x, 1)) < 0))
2170 {
2171 /* If we have a multiply insn, then the cost is between
2172 1 and 2 "fast" instructions. */
2173 if (TARGET_HAS_MUL_INSNS)
2174 {
2175 *total = COSTS_N_INSNS (1) + COSTS_N_INSNS (1) / 2;
2176 return true;
2177 }
2178
2179 /* Estimate as 4 + 4 * #ofbits. */
2180 *total = COSTS_N_INSNS (132);
2181 return true;
2182 }
2183 return false;
2184
2185 case UDIV:
2186 case MOD:
2187 case UMOD:
2188 case DIV:
2189 if (GET_CODE (XEXP (x, 1)) != CONST_INT
2190 || exact_log2 (INTVAL (XEXP (x, 1)) < 0))
2191 {
2192 /* Estimate this as 4 + 8 * #of bits. */
2193 *total = COSTS_N_INSNS (260);
2194 return true;
2195 }
2196 return false;
2197
2198 case AND:
2199 if (GET_CODE (XEXP (x, 1)) == CONST_INT
2200 /* Two constants may actually happen before optimization. */
2201 && GET_CODE (XEXP (x, 0)) != CONST_INT
2202 && !CONST_OK_FOR_LETTER_P (INTVAL (XEXP (x, 1)), 'I'))
2203 {
2204 *total = (rtx_cost (XEXP (x, 0), outer_code) + 2
2205 + 2 * GET_MODE_NUNITS (GET_MODE (XEXP (x, 0))));
2206 return true;
2207 }
2208 return false;
2209
2210 case ZERO_EXTEND: case SIGN_EXTEND:
2211 *total = rtx_cost (XEXP (x, 0), outer_code);
2212 return true;
2213
2214 default:
2215 return false;
2216 }
2217 }
2218
2219 /* The ADDRESS_COST worker. */
2220
2221 static int
2222 cris_address_cost (x)
2223 rtx x;
2224 {
2225 /* The metric to use for the cost-macros is unclear.
2226 The metric used here is (the number of cycles needed) / 2,
2227 where we consider equal a cycle for a word of code and a cycle to
2228 read memory. */
2229
2230 /* The cheapest addressing modes get 0, since nothing extra is needed. */
2231 if (BASE_OR_AUTOINCR_P (x))
2232 return 0;
2233
2234 /* An indirect mem must be a DIP. This means two bytes extra for code,
2235 and 4 bytes extra for memory read, i.e. (2 + 4) / 2. */
2236 if (GET_CODE (x) == MEM)
2237 return (2 + 4) / 2;
2238
2239 /* Assume (2 + 4) / 2 for a single constant; a dword, since it needs
2240 an extra DIP prefix and 4 bytes of constant in most cases.
2241 For PIC and a symbol with a GOT entry, we double the cost since we
2242 add a [rPIC+...] offset. A GOT-less symbol uses a BDAP prefix
2243 equivalent to the DIP prefix for non-PIC, hence the same cost. */
2244 if (CONSTANT_P (x))
2245 return flag_pic && cris_got_symbol (x) ? 2 * (2 + 4) / 2 : (2 + 4) / 2;
2246
2247 /* Handle BIAP and BDAP prefixes. */
2248 if (GET_CODE (x) == PLUS)
2249 {
2250 rtx tem1 = XEXP (x, 0);
2251 rtx tem2 = XEXP (x, 1);
2252
2253 /* A BIAP is 2 extra bytes for the prefix insn, nothing more. We
2254 recognize the typical MULT which is always in tem1 because of
2255 insn canonicalization. */
2256 if ((GET_CODE (tem1) == MULT && BIAP_INDEX_P (tem1))
2257 || REG_P (tem1))
2258 return 2 / 2;
2259
2260 /* A BDAP (quick) is 2 extra bytes. Any constant operand to the
2261 PLUS is always found in tem2. */
2262 if (GET_CODE (tem2) == CONST_INT
2263 && INTVAL (tem2) < 128 && INTVAL (tem2) >= -128)
2264 return 2 / 2;
2265
2266 /* A BDAP -32768 .. 32767 is like BDAP quick, but with 2 extra
2267 bytes. */
2268 if (GET_CODE (tem2) == CONST_INT
2269 && CONST_OK_FOR_LETTER_P (INTVAL (tem2), 'L'))
2270 return (2 + 2) / 2;
2271
2272 /* A BDAP with some other constant is 2 bytes extra. */
2273 if (CONSTANT_P (tem2))
2274 return (2 + 2 + 2) / 2;
2275
2276 /* BDAP with something indirect should have a higher cost than
2277 BIAP with register. FIXME: Should it cost like a MEM or more? */
2278 /* Don't need to check it, it's the only one left.
2279 FIXME: There was a REG test missing, perhaps there are others.
2280 Think more. */
2281 return (2 + 2 + 2) / 2;
2282 }
2283
2284 /* What else? Return a high cost. It matters only for valid
2285 addressing modes. */
2286 return 10;
2287 }
2288
2289 /* Check various objections to the side-effect. Used in the test-part
2290 of an anonymous insn describing an insn with a possible side-effect.
2291 Returns nonzero if the implied side-effect is ok.
2292
2293 code : PLUS or MULT
2294 ops : An array of rtx:es. lreg, rreg, rval,
2295 The variables multop and other_op are indexes into this,
2296 or -1 if they are not applicable.
2297 lreg : The register that gets assigned in the side-effect.
2298 rreg : One register in the side-effect expression
2299 rval : The other register, or an int.
2300 multop : An integer to multiply rval with.
2301 other_op : One of the entities of the main effect,
2302 whose mode we must consider. */
2303
2304 int
2305 cris_side_effect_mode_ok (code, ops, lreg, rreg, rval, multop, other_op)
2306 enum rtx_code code;
2307 rtx *ops;
2308 int lreg, rreg, rval, multop, other_op;
2309 {
2310 /* Find what value to multiply with, for rx =ry + rz * n. */
2311 int mult = multop < 0 ? 1 : INTVAL (ops[multop]);
2312
2313 rtx reg_rtx = ops[rreg];
2314 rtx val_rtx = ops[rval];
2315
2316 /* The operands may be swapped. Canonicalize them in reg_rtx and
2317 val_rtx, where reg_rtx always is a reg (for this constraint to
2318 match). */
2319 if (! BASE_P (reg_rtx))
2320 reg_rtx = val_rtx, val_rtx = ops[rreg];
2321
2322 /* Don't forget to check that reg_rtx really is a reg. If it isn't,
2323 we have no business. */
2324 if (! BASE_P (reg_rtx))
2325 return 0;
2326
2327 /* Don't do this when -mno-split. */
2328 if (!TARGET_SIDE_EFFECT_PREFIXES)
2329 return 0;
2330
2331 /* The mult expression may be hidden in lreg. FIXME: Add more
2332 commentary about that. */
2333 if (GET_CODE (val_rtx) == MULT)
2334 {
2335 mult = INTVAL (XEXP (val_rtx, 1));
2336 val_rtx = XEXP (val_rtx, 0);
2337 code = MULT;
2338 }
2339
2340 /* First check the "other operand". */
2341 if (other_op >= 0)
2342 {
2343 if (GET_MODE_SIZE (GET_MODE (ops[other_op])) > UNITS_PER_WORD)
2344 return 0;
2345
2346 /* Check if the lvalue register is the same as the "other
2347 operand". If so, the result is undefined and we shouldn't do
2348 this. FIXME: Check again. */
2349 if ((BASE_P (ops[lreg])
2350 && BASE_P (ops[other_op])
2351 && REGNO (ops[lreg]) == REGNO (ops[other_op]))
2352 || rtx_equal_p (ops[other_op], ops[lreg]))
2353 return 0;
2354 }
2355
2356 /* Do not accept frame_pointer_rtx as any operand. */
2357 if (ops[lreg] == frame_pointer_rtx || ops[rreg] == frame_pointer_rtx
2358 || ops[rval] == frame_pointer_rtx
2359 || (other_op >= 0 && ops[other_op] == frame_pointer_rtx))
2360 return 0;
2361
2362 if (code == PLUS
2363 && ! BASE_P (val_rtx))
2364 {
2365
2366 /* Do not allow rx = rx + n if a normal add or sub with same size
2367 would do. */
2368 if (rtx_equal_p (ops[lreg], reg_rtx)
2369 && GET_CODE (val_rtx) == CONST_INT
2370 && (INTVAL (val_rtx) <= 63 && INTVAL (val_rtx) >= -63))
2371 return 0;
2372
2373 /* Check allowed cases, like [r(+)?].[bwd] and const.
2374 A symbol is not allowed with PIC. */
2375 if (CONSTANT_P (val_rtx))
2376 return flag_pic == 0 || cris_symbol (val_rtx) == 0;
2377
2378 if (GET_CODE (val_rtx) == MEM
2379 && BASE_OR_AUTOINCR_P (XEXP (val_rtx, 0)))
2380 return 1;
2381
2382 if (GET_CODE (val_rtx) == SIGN_EXTEND
2383 && GET_CODE (XEXP (val_rtx, 0)) == MEM
2384 && BASE_OR_AUTOINCR_P (XEXP (XEXP (val_rtx, 0), 0)))
2385 return 1;
2386
2387 /* If we got here, it's not a valid addressing mode. */
2388 return 0;
2389 }
2390 else if (code == MULT
2391 || (code == PLUS && BASE_P (val_rtx)))
2392 {
2393 /* Do not allow rx = rx + ry.S, since it doesn't give better code. */
2394 if (rtx_equal_p (ops[lreg], reg_rtx)
2395 || (mult == 1 && rtx_equal_p (ops[lreg], val_rtx)))
2396 return 0;
2397
2398 /* Do not allow bad multiply-values. */
2399 if (mult != 1 && mult != 2 && mult != 4)
2400 return 0;
2401
2402 /* Only allow r + ... */
2403 if (! BASE_P (reg_rtx))
2404 return 0;
2405
2406 /* If we got here, all seems ok.
2407 (All checks need to be done above). */
2408 return 1;
2409 }
2410
2411 /* If we get here, the caller got its initial tests wrong. */
2412 internal_error ("internal error: cris_side_effect_mode_ok with bad operands");
2413 }
2414
2415 /* The function reg_overlap_mentioned_p in CVS (still as of 2001-05-16)
2416 does not handle the case where the IN operand is strict_low_part; it
2417 does handle it for X. Test-case in Axis-20010516. This function takes
2418 care of that for THIS port. FIXME: strict_low_part is going away
2419 anyway. */
2420
2421 static int
2422 cris_reg_overlap_mentioned_p (x, in)
2423 rtx x, in;
2424 {
2425 /* The function reg_overlap_mentioned now handles when X is
2426 strict_low_part, but not when IN is a STRICT_LOW_PART. */
2427 if (GET_CODE (in) == STRICT_LOW_PART)
2428 in = XEXP (in, 0);
2429
2430 return reg_overlap_mentioned_p (x, in);
2431 }
2432
2433 /* The TARGET_ASM_NAMED_SECTION worker.
2434 We just dispatch to the functions for ELF and a.out. */
2435
2436 void
2437 cris_target_asm_named_section (name, flags)
2438 const char *name;
2439 unsigned int flags;
2440 {
2441 if (! TARGET_ELF)
2442 default_no_named_section (name, flags);
2443 else
2444 default_elf_asm_named_section (name, flags);
2445 }
2446
2447 /* The LEGITIMATE_PIC_OPERAND_P worker. */
2448
2449 int
2450 cris_legitimate_pic_operand (x)
2451 rtx x;
2452 {
2453 /* The PIC representation of a symbol with a GOT entry will be (for
2454 example; relocations differ):
2455 sym => [rPIC+sym:GOT]
2456 and for a GOT-less symbol it will be (for example, relocation differ):
2457 sym => rPIC+sym:GOTOFF
2458 so only a symbol with a GOT is by itself a valid operand, and it
2459 can't be a sum of a symbol and an offset. */
2460 return ! cris_symbol (x) || cris_got_symbol (x);
2461 }
2462
2463 /* Return nonzero if there's a SYMBOL_REF or LABEL_REF hiding inside this
2464 CONSTANT_P. */
2465
2466 int
2467 cris_symbol (x)
2468 rtx x;
2469 {
2470 switch (GET_CODE (x))
2471 {
2472 case SYMBOL_REF:
2473 case LABEL_REF:
2474 return 1;
2475
2476 case UNSPEC:
2477 /* A PLT reference. */
2478 ASSERT_PLT_UNSPEC (x);
2479 return 1;
2480
2481 case CONST:
2482 return cris_symbol (XEXP (x, 0));
2483
2484 case PLUS:
2485 case MINUS:
2486 return cris_symbol (XEXP (x, 0)) || cris_symbol (XEXP (x, 1));
2487
2488 case CONST_INT:
2489 case CONST_DOUBLE:
2490 case CONSTANT_P_RTX:
2491 return 0;
2492
2493 default:
2494 fatal_insn ("unrecognized supposed constant", x);
2495 }
2496
2497 return 1;
2498 }
2499
2500 /* Return nonzero if there's a SYMBOL_REF or LABEL_REF hiding inside this
2501 CONSTANT_P, and the symbol does not need a GOT entry. Also set
2502 current_function_uses_pic_offset_table if we're generating PIC and ever
2503 see something that would need one. */
2504
2505 int
2506 cris_gotless_symbol (x)
2507 rtx x;
2508 {
2509 #ifdef ENABLE_CHECKING
2510 if (!flag_pic)
2511 abort ();
2512 #endif
2513
2514 switch (GET_CODE (x))
2515 {
2516 case UNSPEC:
2517 ASSERT_PLT_UNSPEC (x);
2518 return 1;
2519
2520 case SYMBOL_REF:
2521 if (cfun != NULL)
2522 current_function_uses_pic_offset_table = 1;
2523 return SYMBOL_REF_LOCAL_P (x);
2524
2525 case LABEL_REF:
2526 /* We don't set current_function_uses_pic_offset_table for
2527 LABEL_REF:s in here, since they are almost always originating
2528 from some branch. The only time it does not come from a label is
2529 when GCC does something like __builtin_setjmp. Then we get the
2530 LABEL_REF from the movsi expander, so we mark it there as a
2531 special case. */
2532 return 1;
2533
2534 case CONST:
2535 return cris_gotless_symbol (XEXP (x, 0));
2536
2537 case PLUS:
2538 case MINUS:
2539 {
2540 int x0 = cris_gotless_symbol (XEXP (x, 0)) != 0;
2541 int x1 = cris_gotless_symbol (XEXP (x, 1)) != 0;
2542
2543 /* One and only one of them must be a local symbol. Neither must
2544 be some other, more general kind of symbol. */
2545 return
2546 (x0 ^ x1)
2547 && ! (x0 == 0 && cris_symbol (XEXP (x, 0)))
2548 && ! (x1 == 0 && cris_symbol (XEXP (x, 1)));
2549 }
2550
2551 case CONST_INT:
2552 case CONST_DOUBLE:
2553 case CONSTANT_P_RTX:
2554 return 0;
2555
2556 default:
2557 fatal_insn ("unrecognized supposed constant", x);
2558 }
2559
2560 return 1;
2561 }
2562
2563 /* Return nonzero if there's a SYMBOL_REF or LABEL_REF hiding inside this
2564 CONSTANT_P, and the symbol needs a GOT entry. */
2565
2566 int
2567 cris_got_symbol (x)
2568 rtx x;
2569 {
2570 #ifdef ENABLE_CHECKING
2571 if (!flag_pic)
2572 abort ();
2573 #endif
2574
2575 switch (GET_CODE (x))
2576 {
2577 case UNSPEC:
2578 ASSERT_PLT_UNSPEC (x);
2579 return 0;
2580
2581 case SYMBOL_REF:
2582 if (cfun != NULL)
2583 current_function_uses_pic_offset_table = 1;
2584 return ! SYMBOL_REF_LOCAL_P (x);
2585
2586 case CONST:
2587 return cris_got_symbol (XEXP (x, 0));
2588
2589 case LABEL_REF:
2590 /* A LABEL_REF is never visible as a symbol outside the local
2591 function. */
2592 case PLUS:
2593 case MINUS:
2594 /* Nope, can't access the GOT for "symbol + offset". */
2595 return 0;
2596
2597 case CONST_INT:
2598 case CONST_DOUBLE:
2599 case CONSTANT_P_RTX:
2600 return 0;
2601
2602 default:
2603 fatal_insn ("unrecognized supposed constant in cris_global_pic_symbol",
2604 x);
2605 }
2606
2607 return 1;
2608 }
2609
2610 /* The OVERRIDE_OPTIONS worker.
2611 As is the norm, this also parses -mfoo=bar type parameters. */
2612
2613 void
2614 cris_override_options ()
2615 {
2616 if (cris_max_stackframe_str)
2617 {
2618 cris_max_stackframe = atoi (cris_max_stackframe_str);
2619
2620 /* Do some sanity checking. */
2621 if (cris_max_stackframe < 0 || cris_max_stackframe > 0x20000000)
2622 internal_error ("-max-stackframe=%d is not usable, not between 0 and %d",
2623 cris_max_stackframe, 0x20000000);
2624 }
2625
2626 /* Let "-metrax4" and "-metrax100" change the cpu version. */
2627 if (TARGET_SVINTO && cris_cpu_version < CRIS_CPU_SVINTO)
2628 cris_cpu_version = CRIS_CPU_SVINTO;
2629 else if (TARGET_ETRAX4_ADD && cris_cpu_version < CRIS_CPU_ETRAX4)
2630 cris_cpu_version = CRIS_CPU_ETRAX4;
2631
2632 /* Parse -march=... and its synonym, the deprecated -mcpu=... */
2633 if (cris_cpu_str)
2634 {
2635 cris_cpu_version
2636 = (*cris_cpu_str == 'v' ? atoi (cris_cpu_str + 1) : -1);
2637
2638 if (strcmp ("etrax4", cris_cpu_str) == 0)
2639 cris_cpu_version = 3;
2640
2641 if (strcmp ("svinto", cris_cpu_str) == 0
2642 || strcmp ("etrax100", cris_cpu_str) == 0)
2643 cris_cpu_version = 8;
2644
2645 if (strcmp ("ng", cris_cpu_str) == 0
2646 || strcmp ("etrax100lx", cris_cpu_str) == 0)
2647 cris_cpu_version = 10;
2648
2649 if (cris_cpu_version < 0 || cris_cpu_version > 10)
2650 error ("unknown CRIS version specification in -march= or -mcpu= : %s",
2651 cris_cpu_str);
2652
2653 /* Set the target flags. */
2654 if (cris_cpu_version >= CRIS_CPU_ETRAX4)
2655 target_flags |= TARGET_MASK_ETRAX4_ADD;
2656
2657 /* If this is Svinto or higher, align for 32 bit accesses. */
2658 if (cris_cpu_version >= CRIS_CPU_SVINTO)
2659 target_flags
2660 |= (TARGET_MASK_SVINTO | TARGET_MASK_ALIGN_BY_32
2661 | TARGET_MASK_STACK_ALIGN | TARGET_MASK_CONST_ALIGN
2662 | TARGET_MASK_DATA_ALIGN);
2663
2664 /* Note that we do not add new flags when it can be completely
2665 described with a macro that uses -mcpu=X. So
2666 TARGET_HAS_MUL_INSNS is (cris_cpu_version >= CRIS_CPU_NG). */
2667 }
2668
2669 if (cris_tune_str)
2670 {
2671 int cris_tune
2672 = (*cris_tune_str == 'v' ? atoi (cris_tune_str + 1) : -1);
2673
2674 if (strcmp ("etrax4", cris_tune_str) == 0)
2675 cris_tune = 3;
2676
2677 if (strcmp ("svinto", cris_tune_str) == 0
2678 || strcmp ("etrax100", cris_tune_str) == 0)
2679 cris_tune = 8;
2680
2681 if (strcmp ("ng", cris_tune_str) == 0
2682 || strcmp ("etrax100lx", cris_tune_str) == 0)
2683 cris_tune = 10;
2684
2685 if (cris_tune < 0 || cris_tune > 10)
2686 error ("unknown CRIS cpu version specification in -mtune= : %s",
2687 cris_tune_str);
2688
2689 if (cris_tune >= CRIS_CPU_SVINTO)
2690 /* We have currently nothing more to tune than alignment for
2691 memory accesses. */
2692 target_flags
2693 |= (TARGET_MASK_STACK_ALIGN | TARGET_MASK_CONST_ALIGN
2694 | TARGET_MASK_DATA_ALIGN | TARGET_MASK_ALIGN_BY_32);
2695 }
2696
2697 if (flag_pic)
2698 {
2699 /* Use error rather than warning, so invalid use is easily
2700 detectable. Still change to the values we expect, to avoid
2701 further errors. */
2702 if (! TARGET_LINUX)
2703 {
2704 error ("-fPIC and -fpic are not supported in this configuration");
2705 flag_pic = 0;
2706 }
2707
2708 /* Turn off function CSE. We need to have the addresses reach the
2709 call expanders to get PLT-marked, as they could otherwise be
2710 compared against zero directly or indirectly. After visiting the
2711 call expanders they will then be cse:ed, as the call expanders
2712 force_reg the addresses, effectively forcing flag_no_function_cse
2713 to 0. */
2714 flag_no_function_cse = 1;
2715 }
2716
2717 if ((write_symbols == DWARF_DEBUG
2718 || write_symbols == DWARF2_DEBUG) && ! TARGET_ELF)
2719 {
2720 warning ("that particular -g option is invalid with -maout and -melinux");
2721 write_symbols = DBX_DEBUG;
2722 }
2723
2724 /* Set the per-function-data initializer. */
2725 init_machine_status = cris_init_machine_status;
2726 }
2727
2728 /* The TARGET_ASM_OUTPUT_MI_THUNK worker. */
2729
2730 static void
2731 cris_asm_output_mi_thunk (stream, thunkdecl, delta, vcall_offset, funcdecl)
2732 FILE *stream;
2733 tree thunkdecl ATTRIBUTE_UNUSED;
2734 HOST_WIDE_INT delta;
2735 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED;
2736 tree funcdecl;
2737 {
2738 if (delta > 0)
2739 {
2740 fprintf (stream, "\tadd%s ", ADDITIVE_SIZE_MODIFIER (delta));
2741 fprintf (stream, HOST_WIDE_INT_PRINT_DEC, delta);
2742 fprintf (stream, ",$%s\n", reg_names[CRIS_FIRST_ARG_REG]);
2743 }
2744 else if (delta < 0)
2745 {
2746 fprintf (stream, "\tsub%s ", ADDITIVE_SIZE_MODIFIER (-delta));
2747 fprintf (stream, HOST_WIDE_INT_PRINT_DEC, -delta);
2748 fprintf (stream, ",$%s\n", reg_names[CRIS_FIRST_ARG_REG]);
2749 }
2750
2751 if (flag_pic)
2752 {
2753 const char *name = XSTR (XEXP (DECL_RTL (funcdecl), 0), 0);
2754
2755 name = (* targetm.strip_name_encoding) (name);
2756 fprintf (stream, "add.d ");
2757 assemble_name (stream, name);
2758 fprintf (stream, "%s,$pc\n", CRIS_PLT_PCOFFSET_SUFFIX);
2759 }
2760 else
2761 {
2762 fprintf (stream, "jump ");
2763 assemble_name (stream, XSTR (XEXP (DECL_RTL (funcdecl), 0), 0));
2764 fprintf (stream, "\n");
2765 }
2766 }
2767
2768 /* The EXPAND_BUILTIN_VA_ARG worker. This is modified from the
2769 "standard" implementation of va_arg: read the value from the current
2770 address and increment by the size of one or two registers. The
2771 important difference for CRIS is that if the type is
2772 pass-by-reference, then perform an indirection. */
2773
2774 rtx
2775 cris_expand_builtin_va_arg (valist, type)
2776 tree valist;
2777 tree type;
2778 {
2779 tree addr_tree, t;
2780 rtx addr;
2781 tree passed_size = size_zero_node;
2782 tree type_size = NULL;
2783 tree size3 = size_int (3);
2784 tree size4 = size_int (4);
2785 tree size8 = size_int (8);
2786 tree rounded_size;
2787
2788 /* Get AP. */
2789 addr_tree = valist;
2790
2791 if (type == error_mark_node
2792 || (type_size = TYPE_SIZE_UNIT (TYPE_MAIN_VARIANT (type))) == NULL
2793 || TREE_OVERFLOW (type_size))
2794 /* Presumably an error; the size isn't computable. A message has
2795 supposedly been emitted elsewhere. */
2796 rounded_size = size_zero_node;
2797 else
2798 rounded_size
2799 = fold (build (MULT_EXPR, sizetype,
2800 fold (build (TRUNC_DIV_EXPR, sizetype,
2801 fold (build (PLUS_EXPR, sizetype,
2802 type_size, size3)),
2803 size4)),
2804 size4));
2805
2806 if (!integer_zerop (rounded_size))
2807 {
2808 /* Check if the type is passed by value or by reference. Values up
2809 to 8 bytes are passed by-value, padded to register-size (4
2810 bytes). Larger values and varying-size types are passed
2811 by reference. */
2812 passed_size
2813 = (!really_constant_p (type_size)
2814 ? size4
2815 : fold (build (COND_EXPR, sizetype,
2816 fold (build (GT_EXPR, sizetype,
2817 rounded_size,
2818 size8)),
2819 size4,
2820 rounded_size)));
2821
2822 addr_tree
2823 = (!really_constant_p (type_size)
2824 ? build1 (INDIRECT_REF, build_pointer_type (type), addr_tree)
2825 : fold (build (COND_EXPR, TREE_TYPE (addr_tree),
2826 fold (build (GT_EXPR, sizetype,
2827 rounded_size,
2828 size8)),
2829 build1 (INDIRECT_REF, build_pointer_type (type),
2830 addr_tree),
2831 addr_tree)));
2832 }
2833
2834 addr = expand_expr (addr_tree, NULL_RTX, Pmode, EXPAND_NORMAL);
2835 addr = copy_to_reg (addr);
2836
2837 if (!integer_zerop (rounded_size))
2838 {
2839 /* Compute new value for AP. */
2840 t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
2841 build (PLUS_EXPR, TREE_TYPE (valist), valist,
2842 passed_size));
2843 TREE_SIDE_EFFECTS (t) = 1;
2844 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2845 }
2846
2847 return addr;
2848 }
2849
2850 /* The INIT_EXPANDERS worker sets the per-function-data initializer and
2851 mark functions. */
2852
2853 void
2854 cris_init_expanders ()
2855 {
2856 /* Nothing here at the moment. */
2857 }
2858
2859 /* Zero initialization is OK for all current fields. */
2860
2861 static struct machine_function *
2862 cris_init_machine_status ()
2863 {
2864 return ggc_alloc_cleared (sizeof (struct machine_function));
2865 }
2866
2867 /* Split a 2 word move (DI or presumably DF) into component parts.
2868 Originally a copy of gen_split_move_double in m32r.c. */
2869
2870 rtx
2871 cris_split_movdx (operands)
2872 rtx *operands;
2873 {
2874 enum machine_mode mode = GET_MODE (operands[0]);
2875 rtx dest = operands[0];
2876 rtx src = operands[1];
2877 rtx val;
2878
2879 /* We used to have to handle (SUBREG (MEM)) here, but that should no
2880 longer happen; after reload there are no SUBREGs any more, and we're
2881 only called after reload. */
2882 if (GET_CODE (dest) == SUBREG || GET_CODE (src) == SUBREG)
2883 abort ();
2884
2885 start_sequence ();
2886 if (GET_CODE (dest) == REG)
2887 {
2888 int dregno = REGNO (dest);
2889
2890 /* Reg-to-reg copy. */
2891 if (GET_CODE (src) == REG)
2892 {
2893 int sregno = REGNO (src);
2894
2895 int reverse = (dregno == sregno + 1);
2896
2897 /* We normally copy the low-numbered register first. However, if
2898 the first register operand 0 is the same as the second register of
2899 operand 1, we must copy in the opposite order. */
2900 emit_insn (gen_rtx_SET (VOIDmode,
2901 operand_subword (dest, reverse, TRUE, mode),
2902 operand_subword (src, reverse, TRUE, mode)));
2903
2904 emit_insn (gen_rtx_SET (VOIDmode,
2905 operand_subword (dest, !reverse, TRUE, mode),
2906 operand_subword (src, !reverse, TRUE, mode)));
2907 }
2908 /* Constant-to-reg copy. */
2909 else if (GET_CODE (src) == CONST_INT || GET_CODE (src) == CONST_DOUBLE)
2910 {
2911 rtx words[2];
2912 split_double (src, &words[0], &words[1]);
2913 emit_insn (gen_rtx_SET (VOIDmode,
2914 operand_subword (dest, 0, TRUE, mode),
2915 words[0]));
2916
2917 emit_insn (gen_rtx_SET (VOIDmode,
2918 operand_subword (dest, 1, TRUE, mode),
2919 words[1]));
2920 }
2921 /* Mem-to-reg copy. */
2922 else if (GET_CODE (src) == MEM)
2923 {
2924 /* If the high-address word is used in the address, we must load it
2925 last. Otherwise, load it first. */
2926 rtx addr = XEXP (src, 0);
2927 int reverse
2928 = (refers_to_regno_p (dregno, dregno + 1, addr, NULL) != 0);
2929
2930 /* The original code imples that we can't do
2931 move.x [rN+],rM move.x [rN],rM+1
2932 when rN is dead, because of REG_NOTES damage. That is
2933 consistent with what I've seen, so don't try it.
2934
2935 We have two different cases here; if the addr is POST_INC,
2936 just pass it through, otherwise add constants. */
2937
2938 if (GET_CODE (addr) == POST_INC)
2939 {
2940 emit_insn (gen_rtx_SET (VOIDmode,
2941 operand_subword (dest, 0, TRUE, mode),
2942 change_address (src, SImode, addr)));
2943 emit_insn (gen_rtx_SET (VOIDmode,
2944 operand_subword (dest, 1, TRUE, mode),
2945 change_address (src, SImode, addr)));
2946 }
2947 else
2948 {
2949 /* Make sure we don't get any other addresses with
2950 embedded postincrements. They should be stopped in
2951 GO_IF_LEGITIMATE_ADDRESS, but we're here for your
2952 safety. */
2953 if (side_effects_p (addr))
2954 fatal_insn ("unexpected side-effects in address", addr);
2955
2956 emit_insn (gen_rtx_SET
2957 (VOIDmode,
2958 operand_subword (dest, reverse, TRUE, mode),
2959 change_address
2960 (src, SImode,
2961 plus_constant (addr,
2962 reverse * UNITS_PER_WORD))));
2963 emit_insn (gen_rtx_SET
2964 (VOIDmode,
2965 operand_subword (dest, ! reverse, TRUE, mode),
2966 change_address
2967 (src, SImode,
2968 plus_constant (addr,
2969 (! reverse) *
2970 UNITS_PER_WORD))));
2971 }
2972 }
2973 else
2974 abort ();
2975 }
2976 /* Reg-to-mem copy or clear mem. */
2977 else if (GET_CODE (dest) == MEM
2978 && (GET_CODE (src) == REG
2979 || src == const0_rtx
2980 || src == CONST0_RTX (DFmode)))
2981 {
2982 rtx addr = XEXP (dest, 0);
2983
2984 if (GET_CODE (addr) == POST_INC)
2985 {
2986 emit_insn (gen_rtx_SET (VOIDmode,
2987 change_address (dest, SImode, addr),
2988 operand_subword (src, 0, TRUE, mode)));
2989 emit_insn (gen_rtx_SET (VOIDmode,
2990 change_address (dest, SImode, addr),
2991 operand_subword (src, 1, TRUE, mode)));
2992 }
2993 else
2994 {
2995 /* Make sure we don't get any other addresses with embedded
2996 postincrements. They should be stopped in
2997 GO_IF_LEGITIMATE_ADDRESS, but we're here for your safety. */
2998 if (side_effects_p (addr))
2999 fatal_insn ("unexpected side-effects in address", addr);
3000
3001 emit_insn (gen_rtx_SET
3002 (VOIDmode,
3003 change_address (dest, SImode, addr),
3004 operand_subword (src, 0, TRUE, mode)));
3005
3006 emit_insn (gen_rtx_SET
3007 (VOIDmode,
3008 change_address (dest, SImode,
3009 plus_constant (addr,
3010 UNITS_PER_WORD)),
3011 operand_subword (src, 1, TRUE, mode)));
3012 }
3013 }
3014
3015 else
3016 abort ();
3017
3018 val = get_insns ();
3019 end_sequence ();
3020 return val;
3021 }
3022
3023 /* This is in essence a copy of output_addr_const altered to output
3024 symbolic operands as PIC.
3025
3026 FIXME: Add hooks similar to ASM_OUTPUT_SYMBOL_REF to get this effect in
3027 the "real" output_addr_const. All we need is one for LABEL_REF (and
3028 one for CODE_LABEL?). */
3029
3030 void
3031 cris_output_addr_const (file, x)
3032 FILE *file;
3033 rtx x;
3034 {
3035 int is_plt = 0;
3036
3037 restart:
3038 switch (GET_CODE (x))
3039 {
3040 case UNSPEC:
3041 ASSERT_PLT_UNSPEC (x);
3042 x = XVECEXP (x, 0, 0);
3043 is_plt = 1;
3044
3045 /* Fall through. */
3046 case SYMBOL_REF:
3047 if (flag_pic)
3048 {
3049 const char *origstr = XSTR (x, 0);
3050 const char *str;
3051
3052 str = (* targetm.strip_name_encoding) (origstr);
3053
3054 if (is_plt)
3055 {
3056 if (cris_pic_sympart_only)
3057 {
3058 assemble_name (file, str);
3059 fprintf (file, ":PLTG");
3060 }
3061 else
3062 {
3063 if (TARGET_AVOID_GOTPLT)
3064 /* We shouldn't get here. */
3065 abort ();
3066
3067 fprintf (file, "[$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
3068 assemble_name (file, XSTR (x, 0));
3069
3070 if (flag_pic == 1)
3071 fprintf (file, ":GOTPLT16]");
3072 else
3073 fprintf (file, ":GOTPLT]");
3074 }
3075 }
3076 else if (cris_gotless_symbol (x))
3077 {
3078 if (! cris_pic_sympart_only)
3079 fprintf (file, "$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
3080 assemble_name (file, str);
3081 fprintf (file, ":GOTOFF");
3082 }
3083 else if (cris_got_symbol (x))
3084 {
3085 if (cris_pic_sympart_only)
3086 abort ();
3087 fprintf (file, "[$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
3088 assemble_name (file, XSTR (x, 0));
3089
3090 if (flag_pic == 1)
3091 fprintf (file, ":GOT16]");
3092 else
3093 fprintf (file, ":GOT]");
3094 }
3095 else
3096 LOSE_AND_RETURN ("unexpected PIC symbol", x);
3097
3098 /* Sanity check. */
3099 if (! current_function_uses_pic_offset_table)
3100 output_operand_lossage ("PIC register isn't set up");
3101 }
3102 else
3103 assemble_name (file, XSTR (x, 0));
3104 break;
3105
3106 case LABEL_REF:
3107 /* If we get one of those here, it should be dressed as PIC. Branch
3108 labels are normally output with the 'l' specifier, which means it
3109 will go directly to output_asm_label and not end up here. */
3110 if (GET_CODE (XEXP (x, 0)) != CODE_LABEL
3111 && (GET_CODE (XEXP (x, 0)) != NOTE
3112 || NOTE_LINE_NUMBER (XEXP (x, 0)) != NOTE_INSN_DELETED_LABEL))
3113 fatal_insn ("unexpected address expression", x);
3114
3115 if (flag_pic)
3116 {
3117 if (cris_gotless_symbol (x))
3118 {
3119 if (! cris_pic_sympart_only)
3120 fprintf (file, "$%s+", reg_names [PIC_OFFSET_TABLE_REGNUM]);
3121 cris_output_addr_const (file, XEXP (x, 0));
3122
3123 fprintf (file, ":GOTOFF");
3124 }
3125 else
3126 /* Labels are never marked as global symbols. */
3127 fatal_insn ("unexpected PIC symbol", x);
3128
3129 /* Sanity check. */
3130 if (! current_function_uses_pic_offset_table)
3131 internal_error ("emitting PIC operand, but PIC register isn't set up");
3132 break;
3133 }
3134
3135 output_addr_const (file, x);
3136 break;
3137
3138 case NOTE:
3139 if (NOTE_LINE_NUMBER (x) != NOTE_INSN_DELETED_LABEL)
3140 fatal_insn ("unexpected NOTE as addr_const:", x);
3141 case CODE_LABEL:
3142 case CONST_INT:
3143 case CONST_DOUBLE:
3144 case ZERO_EXTEND:
3145 case SIGN_EXTEND:
3146 output_addr_const (file, x);
3147 break;
3148
3149 case CONST:
3150 /* This used to output parentheses around the expression,
3151 but that does not work on the 386 (either ATT or BSD assembler). */
3152 cris_output_addr_const (file, XEXP (x, 0));
3153 break;
3154
3155 case PLUS:
3156 /* Some assemblers need integer constants to appear last (eg masm). */
3157 if (GET_CODE (XEXP (x, 0)) == CONST_INT)
3158 {
3159 cris_output_addr_const (file, XEXP (x, 1));
3160 if (INTVAL (XEXP (x, 0)) >= 0)
3161 fprintf (file, "+");
3162 output_addr_const (file, XEXP (x, 0));
3163 }
3164 else
3165 {
3166 cris_output_addr_const (file, XEXP (x, 0));
3167 if (GET_CODE (XEXP (x, 1)) != CONST_INT
3168 || INTVAL (XEXP (x, 1)) >= 0)
3169 fprintf (file, "+");
3170 cris_output_addr_const (file, XEXP (x, 1));
3171 }
3172 break;
3173
3174 case MINUS:
3175 /* Avoid outputting things like x-x or x+5-x,
3176 since some assemblers can't handle that. */
3177 x = simplify_subtraction (x);
3178 if (GET_CODE (x) != MINUS)
3179 goto restart;
3180
3181 cris_output_addr_const (file, XEXP (x, 0));
3182 fprintf (file, "-");
3183 if ((GET_CODE (XEXP (x, 1)) == CONST_INT
3184 && INTVAL (XEXP (x, 1)) < 0)
3185 || GET_CODE (XEXP (x, 1)) != CONST_INT)
3186 {
3187 fprintf (file, "%s", targetm.asm_out.open_paren);
3188 cris_output_addr_const (file, XEXP (x, 1));
3189 fprintf (file, "%s", targetm.asm_out.close_paren);
3190 }
3191 else
3192 output_addr_const (file, XEXP (x, 1));
3193 break;
3194
3195 default:
3196 LOSE_AND_RETURN ("unexpected address expression", x);
3197 }
3198 }
3199
3200 #if 0
3201 /* Various small functions to replace macros. Only called from a
3202 debugger. They might collide with gcc functions or system functions,
3203 so only emit them when '#if 1' above. */
3204
3205 enum rtx_code Get_code PARAMS ((rtx));
3206
3207 enum rtx_code
3208 Get_code (x)
3209 rtx x;
3210 {
3211 return GET_CODE (x);
3212 }
3213
3214 const char *Get_mode PARAMS ((rtx));
3215
3216 const char *
3217 Get_mode (x)
3218 rtx x;
3219 {
3220 return GET_MODE_NAME (GET_MODE (x));
3221 }
3222
3223 rtx Xexp PARAMS ((rtx, int));
3224
3225 rtx
3226 Xexp (x, n)
3227 rtx x;
3228 int n;
3229 {
3230 return XEXP (x, n);
3231 }
3232
3233 rtx Xvecexp PARAMS ((rtx, int, int));
3234
3235 rtx
3236 Xvecexp (x, n, m)
3237 rtx x;
3238 int n;
3239 {
3240 return XVECEXP (x, n, m);
3241 }
3242
3243 int Get_rtx_len PARAMS ((rtx));
3244
3245 int
3246 Get_rtx_len (x)
3247 rtx x;
3248 {
3249 return GET_RTX_LENGTH (GET_CODE (x));
3250 }
3251
3252 /* Use upper-case to distinguish from local variables that are sometimes
3253 called next_insn and prev_insn. */
3254
3255 rtx Next_insn PARAMS ((rtx));
3256
3257 rtx
3258 Next_insn (insn)
3259 rtx insn;
3260 {
3261 return NEXT_INSN (insn);
3262 }
3263
3264 rtx Prev_insn PARAMS ((rtx));
3265
3266 rtx
3267 Prev_insn (insn)
3268 rtx insn;
3269 {
3270 return PREV_INSN (insn);
3271 }
3272 #endif
3273
3274 #include "gt-cris.h"
3275
3276 /*
3277 * Local variables:
3278 * eval: (c-set-style "gnu")
3279 * indent-tabs-mode: t
3280 * End:
3281 */