]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/config/mcore/mcore.c
target.def (legitimate_constant_p): New hook.
[thirdparty/gcc.git] / gcc / config / mcore / mcore.c
1 /* Output routines for Motorola MCore processor
2 Copyright (C) 1993, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
3 2009, 2010 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published
9 by the Free Software Foundation; either version 3, or (at your
10 option) any later version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "tm_p.h"
28 #include "mcore.h"
29 #include "regs.h"
30 #include "hard-reg-set.h"
31 #include "insn-config.h"
32 #include "conditions.h"
33 #include "output.h"
34 #include "insn-attr.h"
35 #include "flags.h"
36 #include "obstack.h"
37 #include "expr.h"
38 #include "reload.h"
39 #include "recog.h"
40 #include "function.h"
41 #include "ggc.h"
42 #include "diagnostic-core.h"
43 #include "target.h"
44 #include "target-def.h"
45 #include "df.h"
46
47 /* For dumping information about frame sizes. */
48 char * mcore_current_function_name = 0;
49 long mcore_current_compilation_timestamp = 0;
50
51 /* Global variables for machine-dependent things. */
52
53 /* Provides the class number of the smallest class containing
54 reg number. */
55 const enum reg_class regno_reg_class[FIRST_PSEUDO_REGISTER] =
56 {
57 GENERAL_REGS, ONLYR1_REGS, LRW_REGS, LRW_REGS,
58 LRW_REGS, LRW_REGS, LRW_REGS, LRW_REGS,
59 LRW_REGS, LRW_REGS, LRW_REGS, LRW_REGS,
60 LRW_REGS, LRW_REGS, LRW_REGS, GENERAL_REGS,
61 GENERAL_REGS, C_REGS, NO_REGS, NO_REGS,
62 };
63
64 struct mcore_frame
65 {
66 int arg_size; /* Stdarg spills (bytes). */
67 int reg_size; /* Non-volatile reg saves (bytes). */
68 int reg_mask; /* Non-volatile reg saves. */
69 int local_size; /* Locals. */
70 int outbound_size; /* Arg overflow on calls out. */
71 int pad_outbound;
72 int pad_local;
73 int pad_reg;
74 /* Describe the steps we'll use to grow it. */
75 #define MAX_STACK_GROWS 4 /* Gives us some spare space. */
76 int growth[MAX_STACK_GROWS];
77 int arg_offset;
78 int reg_offset;
79 int reg_growth;
80 int local_growth;
81 };
82
83 typedef enum
84 {
85 COND_NO,
86 COND_MOV_INSN,
87 COND_CLR_INSN,
88 COND_INC_INSN,
89 COND_DEC_INSN,
90 COND_BRANCH_INSN
91 }
92 cond_type;
93
94 static void output_stack_adjust (int, int);
95 static int calc_live_regs (int *);
96 static int try_constant_tricks (long, HOST_WIDE_INT *, HOST_WIDE_INT *);
97 static const char * output_inline_const (enum machine_mode, rtx *);
98 static void layout_mcore_frame (struct mcore_frame *);
99 static void mcore_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode, tree, int *, int);
100 static cond_type is_cond_candidate (rtx);
101 static rtx emit_new_cond_insn (rtx, int);
102 static rtx conditionalize_block (rtx);
103 static void conditionalize_optimization (void);
104 static void mcore_reorg (void);
105 static rtx handle_structs_in_regs (enum machine_mode, const_tree, int);
106 static void mcore_mark_dllexport (tree);
107 static void mcore_mark_dllimport (tree);
108 static int mcore_dllexport_p (tree);
109 static int mcore_dllimport_p (tree);
110 static tree mcore_handle_naked_attribute (tree *, tree, tree, int, bool *);
111 #ifdef OBJECT_FORMAT_ELF
112 static void mcore_asm_named_section (const char *,
113 unsigned int, tree);
114 #endif
115 static void mcore_print_operand (FILE *, rtx, int);
116 static void mcore_print_operand_address (FILE *, rtx);
117 static bool mcore_print_operand_punct_valid_p (unsigned char code);
118 static void mcore_unique_section (tree, int);
119 static void mcore_encode_section_info (tree, rtx, int);
120 static const char *mcore_strip_name_encoding (const char *);
121 static int mcore_const_costs (rtx, RTX_CODE);
122 static int mcore_and_cost (rtx);
123 static int mcore_ior_cost (rtx);
124 static bool mcore_rtx_costs (rtx, int, int, int *, bool);
125 static void mcore_external_libcall (rtx);
126 static bool mcore_return_in_memory (const_tree, const_tree);
127 static int mcore_arg_partial_bytes (CUMULATIVE_ARGS *,
128 enum machine_mode,
129 tree, bool);
130 static rtx mcore_function_arg (CUMULATIVE_ARGS *,
131 enum machine_mode,
132 const_tree, bool);
133 static void mcore_function_arg_advance (CUMULATIVE_ARGS *,
134 enum machine_mode,
135 const_tree, bool);
136 static unsigned int mcore_function_arg_boundary (enum machine_mode,
137 const_tree);
138 static void mcore_asm_trampoline_template (FILE *);
139 static void mcore_trampoline_init (rtx, tree, rtx);
140 static void mcore_option_override (void);
141 static bool mcore_legitimate_constant_p (enum machine_mode, rtx);
142 \f
143 /* MCore specific attributes. */
144
145 static const struct attribute_spec mcore_attribute_table[] =
146 {
147 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
148 affects_type_identity } */
149 { "dllexport", 0, 0, true, false, false, NULL, false },
150 { "dllimport", 0, 0, true, false, false, NULL, false },
151 { "naked", 0, 0, true, false, false, mcore_handle_naked_attribute,
152 false },
153 { NULL, 0, 0, false, false, false, NULL, false }
154 };
155
156 /* What options are we going to default to specific settings when
157 -O* happens; the user can subsequently override these settings.
158
159 Omitting the frame pointer is a very good idea on the MCore.
160 Scheduling isn't worth anything on the current MCore implementation. */
161
162 static const struct default_options mcore_option_optimization_table[] =
163 {
164 { OPT_LEVELS_1_PLUS, OPT_ffunction_cse, NULL, 0 },
165 { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 },
166 { OPT_LEVELS_ALL, OPT_fcaller_saves, NULL, 0 },
167 { OPT_LEVELS_ALL, OPT_fschedule_insns, NULL, 0 },
168 { OPT_LEVELS_ALL, OPT_fschedule_insns2, NULL, 0 },
169 { OPT_LEVELS_SIZE, OPT_mhardlit, NULL, 0 },
170 { OPT_LEVELS_NONE, 0, NULL, 0 }
171 };
172 \f
173 /* Initialize the GCC target structure. */
174 #undef TARGET_ASM_EXTERNAL_LIBCALL
175 #define TARGET_ASM_EXTERNAL_LIBCALL mcore_external_libcall
176
177 #if TARGET_DLLIMPORT_DECL_ATTRIBUTES
178 #undef TARGET_MERGE_DECL_ATTRIBUTES
179 #define TARGET_MERGE_DECL_ATTRIBUTES merge_dllimport_decl_attributes
180 #endif
181
182 #ifdef OBJECT_FORMAT_ELF
183 #undef TARGET_ASM_UNALIGNED_HI_OP
184 #define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t"
185 #undef TARGET_ASM_UNALIGNED_SI_OP
186 #define TARGET_ASM_UNALIGNED_SI_OP "\t.long\t"
187 #endif
188
189 #undef TARGET_PRINT_OPERAND
190 #define TARGET_PRINT_OPERAND mcore_print_operand
191 #undef TARGET_PRINT_OPERAND_ADDRESS
192 #define TARGET_PRINT_OPERAND_ADDRESS mcore_print_operand_address
193 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
194 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P mcore_print_operand_punct_valid_p
195
196 #undef TARGET_ATTRIBUTE_TABLE
197 #define TARGET_ATTRIBUTE_TABLE mcore_attribute_table
198 #undef TARGET_ASM_UNIQUE_SECTION
199 #define TARGET_ASM_UNIQUE_SECTION mcore_unique_section
200 #undef TARGET_ASM_FUNCTION_RODATA_SECTION
201 #define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
202 #undef TARGET_DEFAULT_TARGET_FLAGS
203 #define TARGET_DEFAULT_TARGET_FLAGS TARGET_DEFAULT
204 #undef TARGET_ENCODE_SECTION_INFO
205 #define TARGET_ENCODE_SECTION_INFO mcore_encode_section_info
206 #undef TARGET_STRIP_NAME_ENCODING
207 #define TARGET_STRIP_NAME_ENCODING mcore_strip_name_encoding
208 #undef TARGET_RTX_COSTS
209 #define TARGET_RTX_COSTS mcore_rtx_costs
210 #undef TARGET_ADDRESS_COST
211 #define TARGET_ADDRESS_COST hook_int_rtx_bool_0
212 #undef TARGET_MACHINE_DEPENDENT_REORG
213 #define TARGET_MACHINE_DEPENDENT_REORG mcore_reorg
214
215 #undef TARGET_PROMOTE_FUNCTION_MODE
216 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
217 #undef TARGET_PROMOTE_PROTOTYPES
218 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
219
220 #undef TARGET_RETURN_IN_MEMORY
221 #define TARGET_RETURN_IN_MEMORY mcore_return_in_memory
222 #undef TARGET_MUST_PASS_IN_STACK
223 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
224 #undef TARGET_PASS_BY_REFERENCE
225 #define TARGET_PASS_BY_REFERENCE hook_pass_by_reference_must_pass_in_stack
226 #undef TARGET_ARG_PARTIAL_BYTES
227 #define TARGET_ARG_PARTIAL_BYTES mcore_arg_partial_bytes
228 #undef TARGET_FUNCTION_ARG
229 #define TARGET_FUNCTION_ARG mcore_function_arg
230 #undef TARGET_FUNCTION_ARG_ADVANCE
231 #define TARGET_FUNCTION_ARG_ADVANCE mcore_function_arg_advance
232 #undef TARGET_FUNCTION_ARG_BOUNDARY
233 #define TARGET_FUNCTION_ARG_BOUNDARY mcore_function_arg_boundary
234
235 #undef TARGET_SETUP_INCOMING_VARARGS
236 #define TARGET_SETUP_INCOMING_VARARGS mcore_setup_incoming_varargs
237
238 #undef TARGET_ASM_TRAMPOLINE_TEMPLATE
239 #define TARGET_ASM_TRAMPOLINE_TEMPLATE mcore_asm_trampoline_template
240 #undef TARGET_TRAMPOLINE_INIT
241 #define TARGET_TRAMPOLINE_INIT mcore_trampoline_init
242
243 #undef TARGET_OPTION_OVERRIDE
244 #define TARGET_OPTION_OVERRIDE mcore_option_override
245 #undef TARGET_OPTION_OPTIMIZATION_TABLE
246 #define TARGET_OPTION_OPTIMIZATION_TABLE mcore_option_optimization_table
247
248 #undef TARGET_EXCEPT_UNWIND_INFO
249 #define TARGET_EXCEPT_UNWIND_INFO sjlj_except_unwind_info
250
251 #undef TARGET_LEGITIMATE_CONSTANT_P
252 #define TARGET_LEGITIMATE_CONSTANT_P mcore_legitimate_constant_p
253
254 struct gcc_target targetm = TARGET_INITIALIZER;
255 \f
256 /* Adjust the stack and return the number of bytes taken to do it. */
257 static void
258 output_stack_adjust (int direction, int size)
259 {
260 /* If extending stack a lot, we do it incrementally. */
261 if (direction < 0 && size > mcore_stack_increment && mcore_stack_increment > 0)
262 {
263 rtx tmp = gen_rtx_REG (SImode, 1);
264 rtx memref;
265
266 emit_insn (gen_movsi (tmp, GEN_INT (mcore_stack_increment)));
267 do
268 {
269 emit_insn (gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, tmp));
270 memref = gen_rtx_MEM (SImode, stack_pointer_rtx);
271 MEM_VOLATILE_P (memref) = 1;
272 emit_insn (gen_movsi (memref, stack_pointer_rtx));
273 size -= mcore_stack_increment;
274 }
275 while (size > mcore_stack_increment);
276
277 /* SIZE is now the residual for the last adjustment,
278 which doesn't require a probe. */
279 }
280
281 if (size)
282 {
283 rtx insn;
284 rtx val = GEN_INT (size);
285
286 if (size > 32)
287 {
288 rtx nval = gen_rtx_REG (SImode, 1);
289 emit_insn (gen_movsi (nval, val));
290 val = nval;
291 }
292
293 if (direction > 0)
294 insn = gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, val);
295 else
296 insn = gen_subsi3 (stack_pointer_rtx, stack_pointer_rtx, val);
297
298 emit_insn (insn);
299 }
300 }
301
302 /* Work out the registers which need to be saved,
303 both as a mask and a count. */
304
305 static int
306 calc_live_regs (int * count)
307 {
308 int reg;
309 int live_regs_mask = 0;
310
311 * count = 0;
312
313 for (reg = 0; reg < FIRST_PSEUDO_REGISTER; reg++)
314 {
315 if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
316 {
317 (*count)++;
318 live_regs_mask |= (1 << reg);
319 }
320 }
321
322 return live_regs_mask;
323 }
324
325 /* Print the operand address in x to the stream. */
326
327 static void
328 mcore_print_operand_address (FILE * stream, rtx x)
329 {
330 switch (GET_CODE (x))
331 {
332 case REG:
333 fprintf (stream, "(%s)", reg_names[REGNO (x)]);
334 break;
335
336 case PLUS:
337 {
338 rtx base = XEXP (x, 0);
339 rtx index = XEXP (x, 1);
340
341 if (GET_CODE (base) != REG)
342 {
343 /* Ensure that BASE is a register (one of them must be). */
344 rtx temp = base;
345 base = index;
346 index = temp;
347 }
348
349 switch (GET_CODE (index))
350 {
351 case CONST_INT:
352 fprintf (stream, "(%s," HOST_WIDE_INT_PRINT_DEC ")",
353 reg_names[REGNO(base)], INTVAL (index));
354 break;
355
356 default:
357 gcc_unreachable ();
358 }
359 }
360
361 break;
362
363 default:
364 output_addr_const (stream, x);
365 break;
366 }
367 }
368
369 static bool
370 mcore_print_operand_punct_valid_p (unsigned char code)
371 {
372 return (code == '.' || code == '#' || code == '*' || code == '^'
373 || code == '!');
374 }
375
376 /* Print operand x (an rtx) in assembler syntax to file stream
377 according to modifier code.
378
379 'R' print the next register or memory location along, i.e. the lsw in
380 a double word value
381 'O' print a constant without the #
382 'M' print a constant as its negative
383 'P' print log2 of a power of two
384 'Q' print log2 of an inverse of a power of two
385 'U' print register for ldm/stm instruction
386 'X' print byte number for xtrbN instruction. */
387
388 static void
389 mcore_print_operand (FILE * stream, rtx x, int code)
390 {
391 switch (code)
392 {
393 case 'N':
394 if (INTVAL(x) == -1)
395 fprintf (asm_out_file, "32");
396 else
397 fprintf (asm_out_file, "%d", exact_log2 (INTVAL (x) + 1));
398 break;
399 case 'P':
400 fprintf (asm_out_file, "%d", exact_log2 (INTVAL (x) & 0xffffffff));
401 break;
402 case 'Q':
403 fprintf (asm_out_file, "%d", exact_log2 (~INTVAL (x)));
404 break;
405 case 'O':
406 fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
407 break;
408 case 'M':
409 fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, - INTVAL (x));
410 break;
411 case 'R':
412 /* Next location along in memory or register. */
413 switch (GET_CODE (x))
414 {
415 case REG:
416 fputs (reg_names[REGNO (x) + 1], (stream));
417 break;
418 case MEM:
419 mcore_print_operand_address
420 (stream, XEXP (adjust_address (x, SImode, 4), 0));
421 break;
422 default:
423 gcc_unreachable ();
424 }
425 break;
426 case 'U':
427 fprintf (asm_out_file, "%s-%s", reg_names[REGNO (x)],
428 reg_names[REGNO (x) + 3]);
429 break;
430 case 'x':
431 fprintf (asm_out_file, HOST_WIDE_INT_PRINT_HEX, INTVAL (x));
432 break;
433 case 'X':
434 fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC, 3 - INTVAL (x) / 8);
435 break;
436
437 default:
438 switch (GET_CODE (x))
439 {
440 case REG:
441 fputs (reg_names[REGNO (x)], (stream));
442 break;
443 case MEM:
444 output_address (XEXP (x, 0));
445 break;
446 default:
447 output_addr_const (stream, x);
448 break;
449 }
450 break;
451 }
452 }
453
454 /* What does a constant cost ? */
455
456 static int
457 mcore_const_costs (rtx exp, enum rtx_code code)
458 {
459 HOST_WIDE_INT val = INTVAL (exp);
460
461 /* Easy constants. */
462 if ( CONST_OK_FOR_I (val)
463 || CONST_OK_FOR_M (val)
464 || CONST_OK_FOR_N (val)
465 || (code == PLUS && CONST_OK_FOR_L (val)))
466 return 1;
467 else if (code == AND
468 && ( CONST_OK_FOR_M (~val)
469 || CONST_OK_FOR_N (~val)))
470 return 2;
471 else if (code == PLUS
472 && ( CONST_OK_FOR_I (-val)
473 || CONST_OK_FOR_M (-val)
474 || CONST_OK_FOR_N (-val)))
475 return 2;
476
477 return 5;
478 }
479
480 /* What does an and instruction cost - we do this b/c immediates may
481 have been relaxed. We want to ensure that cse will cse relaxed immeds
482 out. Otherwise we'll get bad code (multiple reloads of the same const). */
483
484 static int
485 mcore_and_cost (rtx x)
486 {
487 HOST_WIDE_INT val;
488
489 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
490 return 2;
491
492 val = INTVAL (XEXP (x, 1));
493
494 /* Do it directly. */
495 if (CONST_OK_FOR_K (val) || CONST_OK_FOR_M (~val))
496 return 2;
497 /* Takes one instruction to load. */
498 else if (const_ok_for_mcore (val))
499 return 3;
500 /* Takes two instructions to load. */
501 else if (TARGET_HARDLIT && mcore_const_ok_for_inline (val))
502 return 4;
503
504 /* Takes a lrw to load. */
505 return 5;
506 }
507
508 /* What does an or cost - see and_cost(). */
509
510 static int
511 mcore_ior_cost (rtx x)
512 {
513 HOST_WIDE_INT val;
514
515 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
516 return 2;
517
518 val = INTVAL (XEXP (x, 1));
519
520 /* Do it directly with bclri. */
521 if (CONST_OK_FOR_M (val))
522 return 2;
523 /* Takes one instruction to load. */
524 else if (const_ok_for_mcore (val))
525 return 3;
526 /* Takes two instructions to load. */
527 else if (TARGET_HARDLIT && mcore_const_ok_for_inline (val))
528 return 4;
529
530 /* Takes a lrw to load. */
531 return 5;
532 }
533
534 static bool
535 mcore_rtx_costs (rtx x, int code, int outer_code, int * total,
536 bool speed ATTRIBUTE_UNUSED)
537 {
538 switch (code)
539 {
540 case CONST_INT:
541 *total = mcore_const_costs (x, (enum rtx_code) outer_code);
542 return true;
543 case CONST:
544 case LABEL_REF:
545 case SYMBOL_REF:
546 *total = 5;
547 return true;
548 case CONST_DOUBLE:
549 *total = 10;
550 return true;
551
552 case AND:
553 *total = COSTS_N_INSNS (mcore_and_cost (x));
554 return true;
555
556 case IOR:
557 *total = COSTS_N_INSNS (mcore_ior_cost (x));
558 return true;
559
560 case DIV:
561 case UDIV:
562 case MOD:
563 case UMOD:
564 case FLOAT:
565 case FIX:
566 *total = COSTS_N_INSNS (100);
567 return true;
568
569 default:
570 return false;
571 }
572 }
573
574 /* Prepare the operands for a comparison. Return whether the branch/setcc
575 should reverse the operands. */
576
577 bool
578 mcore_gen_compare (enum rtx_code code, rtx op0, rtx op1)
579 {
580 rtx cc_reg = gen_rtx_REG (CCmode, CC_REG);
581 bool invert;
582
583 if (GET_CODE (op1) == CONST_INT)
584 {
585 HOST_WIDE_INT val = INTVAL (op1);
586
587 switch (code)
588 {
589 case GTU:
590 /* Unsigned > 0 is the same as != 0; everything else is converted
591 below to LEU (reversed cmphs). */
592 if (val == 0)
593 code = NE;
594 break;
595
596 /* Check whether (LE A imm) can become (LT A imm + 1),
597 or (GT A imm) can become (GE A imm + 1). */
598 case GT:
599 case LE:
600 if (CONST_OK_FOR_J (val + 1))
601 {
602 op1 = GEN_INT (val + 1);
603 code = code == LE ? LT : GE;
604 }
605 break;
606
607 default:
608 break;
609 }
610 }
611
612 if (CONSTANT_P (op1) && GET_CODE (op1) != CONST_INT)
613 op1 = force_reg (SImode, op1);
614
615 /* cmpnei: 0-31 (K immediate)
616 cmplti: 1-32 (J immediate, 0 using btsti x,31). */
617 invert = false;
618 switch (code)
619 {
620 case EQ: /* Use inverted condition, cmpne. */
621 code = NE;
622 invert = true;
623 /* Drop through. */
624
625 case NE: /* Use normal condition, cmpne. */
626 if (GET_CODE (op1) == CONST_INT && ! CONST_OK_FOR_K (INTVAL (op1)))
627 op1 = force_reg (SImode, op1);
628 break;
629
630 case LE: /* Use inverted condition, reversed cmplt. */
631 code = GT;
632 invert = true;
633 /* Drop through. */
634
635 case GT: /* Use normal condition, reversed cmplt. */
636 if (GET_CODE (op1) == CONST_INT)
637 op1 = force_reg (SImode, op1);
638 break;
639
640 case GE: /* Use inverted condition, cmplt. */
641 code = LT;
642 invert = true;
643 /* Drop through. */
644
645 case LT: /* Use normal condition, cmplt. */
646 if (GET_CODE (op1) == CONST_INT &&
647 /* covered by btsti x,31. */
648 INTVAL (op1) != 0 &&
649 ! CONST_OK_FOR_J (INTVAL (op1)))
650 op1 = force_reg (SImode, op1);
651 break;
652
653 case GTU: /* Use inverted condition, cmple. */
654 /* We coped with unsigned > 0 above. */
655 gcc_assert (GET_CODE (op1) != CONST_INT || INTVAL (op1) != 0);
656 code = LEU;
657 invert = true;
658 /* Drop through. */
659
660 case LEU: /* Use normal condition, reversed cmphs. */
661 if (GET_CODE (op1) == CONST_INT && INTVAL (op1) != 0)
662 op1 = force_reg (SImode, op1);
663 break;
664
665 case LTU: /* Use inverted condition, cmphs. */
666 code = GEU;
667 invert = true;
668 /* Drop through. */
669
670 case GEU: /* Use normal condition, cmphs. */
671 if (GET_CODE (op1) == CONST_INT && INTVAL (op1) != 0)
672 op1 = force_reg (SImode, op1);
673 break;
674
675 default:
676 break;
677 }
678
679 emit_insn (gen_rtx_SET (VOIDmode,
680 cc_reg,
681 gen_rtx_fmt_ee (code, CCmode, op0, op1)));
682 return invert;
683 }
684
685 int
686 mcore_symbolic_address_p (rtx x)
687 {
688 switch (GET_CODE (x))
689 {
690 case SYMBOL_REF:
691 case LABEL_REF:
692 return 1;
693 case CONST:
694 x = XEXP (x, 0);
695 return ( (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
696 || GET_CODE (XEXP (x, 0)) == LABEL_REF)
697 && GET_CODE (XEXP (x, 1)) == CONST_INT);
698 default:
699 return 0;
700 }
701 }
702
703 /* Functions to output assembly code for a function call. */
704
705 char *
706 mcore_output_call (rtx operands[], int index)
707 {
708 static char buffer[20];
709 rtx addr = operands [index];
710
711 if (REG_P (addr))
712 {
713 if (TARGET_CG_DATA)
714 {
715 gcc_assert (mcore_current_function_name);
716
717 ASM_OUTPUT_CG_EDGE (asm_out_file, mcore_current_function_name,
718 "unknown", 1);
719 }
720
721 sprintf (buffer, "jsr\t%%%d", index);
722 }
723 else
724 {
725 if (TARGET_CG_DATA)
726 {
727 gcc_assert (mcore_current_function_name);
728 gcc_assert (GET_CODE (addr) == SYMBOL_REF);
729
730 ASM_OUTPUT_CG_EDGE (asm_out_file, mcore_current_function_name,
731 XSTR (addr, 0), 0);
732 }
733
734 sprintf (buffer, "jbsr\t%%%d", index);
735 }
736
737 return buffer;
738 }
739
740 /* Can we load a constant with a single instruction ? */
741
742 int
743 const_ok_for_mcore (HOST_WIDE_INT value)
744 {
745 if (value >= 0 && value <= 127)
746 return 1;
747
748 /* Try exact power of two. */
749 if (CONST_OK_FOR_M (value))
750 return 1;
751
752 /* Try exact power of two - 1. */
753 if (CONST_OK_FOR_N (value) && value != -1)
754 return 1;
755
756 return 0;
757 }
758
759 /* Can we load a constant inline with up to 2 instructions ? */
760
761 int
762 mcore_const_ok_for_inline (HOST_WIDE_INT value)
763 {
764 HOST_WIDE_INT x, y;
765
766 return try_constant_tricks (value, & x, & y) > 0;
767 }
768
769 /* Are we loading the constant using a not ? */
770
771 int
772 mcore_const_trick_uses_not (HOST_WIDE_INT value)
773 {
774 HOST_WIDE_INT x, y;
775
776 return try_constant_tricks (value, & x, & y) == 2;
777 }
778
779 /* Try tricks to load a constant inline and return the trick number if
780 success (0 is non-inlinable).
781
782 0: not inlinable
783 1: single instruction (do the usual thing)
784 2: single insn followed by a 'not'
785 3: single insn followed by a subi
786 4: single insn followed by an addi
787 5: single insn followed by rsubi
788 6: single insn followed by bseti
789 7: single insn followed by bclri
790 8: single insn followed by rotli
791 9: single insn followed by lsli
792 10: single insn followed by ixh
793 11: single insn followed by ixw. */
794
795 static int
796 try_constant_tricks (HOST_WIDE_INT value, HOST_WIDE_INT * x, HOST_WIDE_INT * y)
797 {
798 HOST_WIDE_INT i;
799 unsigned HOST_WIDE_INT bit, shf, rot;
800
801 if (const_ok_for_mcore (value))
802 return 1; /* Do the usual thing. */
803
804 if (! TARGET_HARDLIT)
805 return 0;
806
807 if (const_ok_for_mcore (~value))
808 {
809 *x = ~value;
810 return 2;
811 }
812
813 for (i = 1; i <= 32; i++)
814 {
815 if (const_ok_for_mcore (value - i))
816 {
817 *x = value - i;
818 *y = i;
819
820 return 3;
821 }
822
823 if (const_ok_for_mcore (value + i))
824 {
825 *x = value + i;
826 *y = i;
827
828 return 4;
829 }
830 }
831
832 bit = 0x80000000ULL;
833
834 for (i = 0; i <= 31; i++)
835 {
836 if (const_ok_for_mcore (i - value))
837 {
838 *x = i - value;
839 *y = i;
840
841 return 5;
842 }
843
844 if (const_ok_for_mcore (value & ~bit))
845 {
846 *y = bit;
847 *x = value & ~bit;
848 return 6;
849 }
850
851 if (const_ok_for_mcore (value | bit))
852 {
853 *y = ~bit;
854 *x = value | bit;
855
856 return 7;
857 }
858
859 bit >>= 1;
860 }
861
862 shf = value;
863 rot = value;
864
865 for (i = 1; i < 31; i++)
866 {
867 int c;
868
869 /* MCore has rotate left. */
870 c = rot << 31;
871 rot >>= 1;
872 rot &= 0x7FFFFFFF;
873 rot |= c; /* Simulate rotate. */
874
875 if (const_ok_for_mcore (rot))
876 {
877 *y = i;
878 *x = rot;
879
880 return 8;
881 }
882
883 if (shf & 1)
884 shf = 0; /* Can't use logical shift, low order bit is one. */
885
886 shf >>= 1;
887
888 if (shf != 0 && const_ok_for_mcore (shf))
889 {
890 *y = i;
891 *x = shf;
892
893 return 9;
894 }
895 }
896
897 if ((value % 3) == 0 && const_ok_for_mcore (value / 3))
898 {
899 *x = value / 3;
900
901 return 10;
902 }
903
904 if ((value % 5) == 0 && const_ok_for_mcore (value / 5))
905 {
906 *x = value / 5;
907
908 return 11;
909 }
910
911 return 0;
912 }
913
914 /* Check whether reg is dead at first. This is done by searching ahead
915 for either the next use (i.e., reg is live), a death note, or a set of
916 reg. Don't just use dead_or_set_p() since reload does not always mark
917 deaths (especially if PRESERVE_DEATH_NOTES_REGNO_P is not defined). We
918 can ignore subregs by extracting the actual register. BRC */
919
920 int
921 mcore_is_dead (rtx first, rtx reg)
922 {
923 rtx insn;
924
925 /* For mcore, subregs can't live independently of their parent regs. */
926 if (GET_CODE (reg) == SUBREG)
927 reg = SUBREG_REG (reg);
928
929 /* Dies immediately. */
930 if (dead_or_set_p (first, reg))
931 return 1;
932
933 /* Look for conclusive evidence of live/death, otherwise we have
934 to assume that it is live. */
935 for (insn = NEXT_INSN (first); insn; insn = NEXT_INSN (insn))
936 {
937 if (GET_CODE (insn) == JUMP_INSN)
938 return 0; /* We lose track, assume it is alive. */
939
940 else if (GET_CODE(insn) == CALL_INSN)
941 {
942 /* Call's might use it for target or register parms. */
943 if (reg_referenced_p (reg, PATTERN (insn))
944 || find_reg_fusage (insn, USE, reg))
945 return 0;
946 else if (dead_or_set_p (insn, reg))
947 return 1;
948 }
949 else if (GET_CODE (insn) == INSN)
950 {
951 if (reg_referenced_p (reg, PATTERN (insn)))
952 return 0;
953 else if (dead_or_set_p (insn, reg))
954 return 1;
955 }
956 }
957
958 /* No conclusive evidence either way, we cannot take the chance
959 that control flow hid the use from us -- "I'm not dead yet". */
960 return 0;
961 }
962
963 /* Count the number of ones in mask. */
964
965 int
966 mcore_num_ones (HOST_WIDE_INT mask)
967 {
968 /* A trick to count set bits recently posted on comp.compilers. */
969 mask = (mask >> 1 & 0x55555555) + (mask & 0x55555555);
970 mask = ((mask >> 2) & 0x33333333) + (mask & 0x33333333);
971 mask = ((mask >> 4) + mask) & 0x0f0f0f0f;
972 mask = ((mask >> 8) + mask);
973
974 return (mask + (mask >> 16)) & 0xff;
975 }
976
977 /* Count the number of zeros in mask. */
978
979 int
980 mcore_num_zeros (HOST_WIDE_INT mask)
981 {
982 return 32 - mcore_num_ones (mask);
983 }
984
985 /* Determine byte being masked. */
986
987 int
988 mcore_byte_offset (unsigned int mask)
989 {
990 if (mask == 0x00ffffffL)
991 return 0;
992 else if (mask == 0xff00ffffL)
993 return 1;
994 else if (mask == 0xffff00ffL)
995 return 2;
996 else if (mask == 0xffffff00L)
997 return 3;
998
999 return -1;
1000 }
1001
1002 /* Determine halfword being masked. */
1003
1004 int
1005 mcore_halfword_offset (unsigned int mask)
1006 {
1007 if (mask == 0x0000ffffL)
1008 return 0;
1009 else if (mask == 0xffff0000L)
1010 return 1;
1011
1012 return -1;
1013 }
1014
1015 /* Output a series of bseti's corresponding to mask. */
1016
1017 const char *
1018 mcore_output_bseti (rtx dst, int mask)
1019 {
1020 rtx out_operands[2];
1021 int bit;
1022
1023 out_operands[0] = dst;
1024
1025 for (bit = 0; bit < 32; bit++)
1026 {
1027 if ((mask & 0x1) == 0x1)
1028 {
1029 out_operands[1] = GEN_INT (bit);
1030
1031 output_asm_insn ("bseti\t%0,%1", out_operands);
1032 }
1033 mask >>= 1;
1034 }
1035
1036 return "";
1037 }
1038
1039 /* Output a series of bclri's corresponding to mask. */
1040
1041 const char *
1042 mcore_output_bclri (rtx dst, int mask)
1043 {
1044 rtx out_operands[2];
1045 int bit;
1046
1047 out_operands[0] = dst;
1048
1049 for (bit = 0; bit < 32; bit++)
1050 {
1051 if ((mask & 0x1) == 0x0)
1052 {
1053 out_operands[1] = GEN_INT (bit);
1054
1055 output_asm_insn ("bclri\t%0,%1", out_operands);
1056 }
1057
1058 mask >>= 1;
1059 }
1060
1061 return "";
1062 }
1063
1064 /* Output a conditional move of two constants that are +/- 1 within each
1065 other. See the "movtK" patterns in mcore.md. I'm not sure this is
1066 really worth the effort. */
1067
1068 const char *
1069 mcore_output_cmov (rtx operands[], int cmp_t, const char * test)
1070 {
1071 HOST_WIDE_INT load_value;
1072 HOST_WIDE_INT adjust_value;
1073 rtx out_operands[4];
1074
1075 out_operands[0] = operands[0];
1076
1077 /* Check to see which constant is loadable. */
1078 if (const_ok_for_mcore (INTVAL (operands[1])))
1079 {
1080 out_operands[1] = operands[1];
1081 out_operands[2] = operands[2];
1082 }
1083 else if (const_ok_for_mcore (INTVAL (operands[2])))
1084 {
1085 out_operands[1] = operands[2];
1086 out_operands[2] = operands[1];
1087
1088 /* Complement test since constants are swapped. */
1089 cmp_t = (cmp_t == 0);
1090 }
1091 load_value = INTVAL (out_operands[1]);
1092 adjust_value = INTVAL (out_operands[2]);
1093
1094 /* First output the test if folded into the pattern. */
1095
1096 if (test)
1097 output_asm_insn (test, operands);
1098
1099 /* Load the constant - for now, only support constants that can be
1100 generated with a single instruction. maybe add general inlinable
1101 constants later (this will increase the # of patterns since the
1102 instruction sequence has a different length attribute). */
1103 if (load_value >= 0 && load_value <= 127)
1104 output_asm_insn ("movi\t%0,%1", out_operands);
1105 else if (CONST_OK_FOR_M (load_value))
1106 output_asm_insn ("bgeni\t%0,%P1", out_operands);
1107 else if (CONST_OK_FOR_N (load_value))
1108 output_asm_insn ("bmaski\t%0,%N1", out_operands);
1109
1110 /* Output the constant adjustment. */
1111 if (load_value > adjust_value)
1112 {
1113 if (cmp_t)
1114 output_asm_insn ("decf\t%0", out_operands);
1115 else
1116 output_asm_insn ("dect\t%0", out_operands);
1117 }
1118 else
1119 {
1120 if (cmp_t)
1121 output_asm_insn ("incf\t%0", out_operands);
1122 else
1123 output_asm_insn ("inct\t%0", out_operands);
1124 }
1125
1126 return "";
1127 }
1128
1129 /* Outputs the peephole for moving a constant that gets not'ed followed
1130 by an and (i.e. combine the not and the and into andn). BRC */
1131
1132 const char *
1133 mcore_output_andn (rtx insn ATTRIBUTE_UNUSED, rtx operands[])
1134 {
1135 HOST_WIDE_INT x, y;
1136 rtx out_operands[3];
1137 const char * load_op;
1138 char buf[256];
1139 int trick_no;
1140
1141 trick_no = try_constant_tricks (INTVAL (operands[1]), &x, &y);
1142 gcc_assert (trick_no == 2);
1143
1144 out_operands[0] = operands[0];
1145 out_operands[1] = GEN_INT (x);
1146 out_operands[2] = operands[2];
1147
1148 if (x >= 0 && x <= 127)
1149 load_op = "movi\t%0,%1";
1150
1151 /* Try exact power of two. */
1152 else if (CONST_OK_FOR_M (x))
1153 load_op = "bgeni\t%0,%P1";
1154
1155 /* Try exact power of two - 1. */
1156 else if (CONST_OK_FOR_N (x))
1157 load_op = "bmaski\t%0,%N1";
1158
1159 else
1160 {
1161 load_op = "BADMOVI-andn\t%0, %1";
1162 gcc_unreachable ();
1163 }
1164
1165 sprintf (buf, "%s\n\tandn\t%%2,%%0", load_op);
1166 output_asm_insn (buf, out_operands);
1167
1168 return "";
1169 }
1170
1171 /* Output an inline constant. */
1172
1173 static const char *
1174 output_inline_const (enum machine_mode mode, rtx operands[])
1175 {
1176 HOST_WIDE_INT x = 0, y = 0;
1177 int trick_no;
1178 rtx out_operands[3];
1179 char buf[256];
1180 char load_op[256];
1181 const char *dst_fmt;
1182 HOST_WIDE_INT value;
1183
1184 value = INTVAL (operands[1]);
1185
1186 trick_no = try_constant_tricks (value, &x, &y);
1187 /* lrw's are handled separately: Large inlinable constants never get
1188 turned into lrw's. Our caller uses try_constant_tricks to back
1189 off to an lrw rather than calling this routine. */
1190 gcc_assert (trick_no != 0);
1191
1192 if (trick_no == 1)
1193 x = value;
1194
1195 /* operands: 0 = dst, 1 = load immed., 2 = immed. adjustment. */
1196 out_operands[0] = operands[0];
1197 out_operands[1] = GEN_INT (x);
1198
1199 if (trick_no > 2)
1200 out_operands[2] = GEN_INT (y);
1201
1202 /* Select dst format based on mode. */
1203 if (mode == DImode && (! TARGET_LITTLE_END))
1204 dst_fmt = "%R0";
1205 else
1206 dst_fmt = "%0";
1207
1208 if (x >= 0 && x <= 127)
1209 sprintf (load_op, "movi\t%s,%%1", dst_fmt);
1210
1211 /* Try exact power of two. */
1212 else if (CONST_OK_FOR_M (x))
1213 sprintf (load_op, "bgeni\t%s,%%P1", dst_fmt);
1214
1215 /* Try exact power of two - 1. */
1216 else if (CONST_OK_FOR_N (x))
1217 sprintf (load_op, "bmaski\t%s,%%N1", dst_fmt);
1218
1219 else
1220 {
1221 sprintf (load_op, "BADMOVI-inline_const %s, %%1", dst_fmt);
1222 gcc_unreachable ();
1223 }
1224
1225 switch (trick_no)
1226 {
1227 case 1:
1228 strcpy (buf, load_op);
1229 break;
1230 case 2: /* not */
1231 sprintf (buf, "%s\n\tnot\t%s\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1232 break;
1233 case 3: /* add */
1234 sprintf (buf, "%s\n\taddi\t%s,%%2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1235 break;
1236 case 4: /* sub */
1237 sprintf (buf, "%s\n\tsubi\t%s,%%2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1238 break;
1239 case 5: /* rsub */
1240 /* Never happens unless -mrsubi, see try_constant_tricks(). */
1241 sprintf (buf, "%s\n\trsubi\t%s,%%2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1242 break;
1243 case 6: /* bseti */
1244 sprintf (buf, "%s\n\tbseti\t%s,%%P2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1245 break;
1246 case 7: /* bclr */
1247 sprintf (buf, "%s\n\tbclri\t%s,%%Q2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1248 break;
1249 case 8: /* rotl */
1250 sprintf (buf, "%s\n\trotli\t%s,%%2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1251 break;
1252 case 9: /* lsl */
1253 sprintf (buf, "%s\n\tlsli\t%s,%%2\t// %ld 0x%lx", load_op, dst_fmt, value, value);
1254 break;
1255 case 10: /* ixh */
1256 sprintf (buf, "%s\n\tixh\t%s,%s\t// %ld 0x%lx", load_op, dst_fmt, dst_fmt, value, value);
1257 break;
1258 case 11: /* ixw */
1259 sprintf (buf, "%s\n\tixw\t%s,%s\t// %ld 0x%lx", load_op, dst_fmt, dst_fmt, value, value);
1260 break;
1261 default:
1262 return "";
1263 }
1264
1265 output_asm_insn (buf, out_operands);
1266
1267 return "";
1268 }
1269
1270 /* Output a move of a word or less value. */
1271
1272 const char *
1273 mcore_output_move (rtx insn ATTRIBUTE_UNUSED, rtx operands[],
1274 enum machine_mode mode ATTRIBUTE_UNUSED)
1275 {
1276 rtx dst = operands[0];
1277 rtx src = operands[1];
1278
1279 if (GET_CODE (dst) == REG)
1280 {
1281 if (GET_CODE (src) == REG)
1282 {
1283 if (REGNO (src) == CC_REG) /* r-c */
1284 return "mvc\t%0";
1285 else
1286 return "mov\t%0,%1"; /* r-r*/
1287 }
1288 else if (GET_CODE (src) == MEM)
1289 {
1290 if (GET_CODE (XEXP (src, 0)) == LABEL_REF)
1291 return "lrw\t%0,[%1]"; /* a-R */
1292 else
1293 switch (GET_MODE (src)) /* r-m */
1294 {
1295 case SImode:
1296 return "ldw\t%0,%1";
1297 case HImode:
1298 return "ld.h\t%0,%1";
1299 case QImode:
1300 return "ld.b\t%0,%1";
1301 default:
1302 gcc_unreachable ();
1303 }
1304 }
1305 else if (GET_CODE (src) == CONST_INT)
1306 {
1307 HOST_WIDE_INT x, y;
1308
1309 if (CONST_OK_FOR_I (INTVAL (src))) /* r-I */
1310 return "movi\t%0,%1";
1311 else if (CONST_OK_FOR_M (INTVAL (src))) /* r-M */
1312 return "bgeni\t%0,%P1\t// %1 %x1";
1313 else if (CONST_OK_FOR_N (INTVAL (src))) /* r-N */
1314 return "bmaski\t%0,%N1\t// %1 %x1";
1315 else if (try_constant_tricks (INTVAL (src), &x, &y)) /* R-P */
1316 return output_inline_const (SImode, operands); /* 1-2 insns */
1317 else
1318 return "lrw\t%0,%x1\t// %1"; /* Get it from literal pool. */
1319 }
1320 else
1321 return "lrw\t%0, %1"; /* Into the literal pool. */
1322 }
1323 else if (GET_CODE (dst) == MEM) /* m-r */
1324 switch (GET_MODE (dst))
1325 {
1326 case SImode:
1327 return "stw\t%1,%0";
1328 case HImode:
1329 return "st.h\t%1,%0";
1330 case QImode:
1331 return "st.b\t%1,%0";
1332 default:
1333 gcc_unreachable ();
1334 }
1335
1336 gcc_unreachable ();
1337 }
1338
1339 /* Return a sequence of instructions to perform DI or DF move.
1340 Since the MCORE cannot move a DI or DF in one instruction, we have
1341 to take care when we see overlapping source and dest registers. */
1342
1343 const char *
1344 mcore_output_movedouble (rtx operands[], enum machine_mode mode ATTRIBUTE_UNUSED)
1345 {
1346 rtx dst = operands[0];
1347 rtx src = operands[1];
1348
1349 if (GET_CODE (dst) == REG)
1350 {
1351 if (GET_CODE (src) == REG)
1352 {
1353 int dstreg = REGNO (dst);
1354 int srcreg = REGNO (src);
1355
1356 /* Ensure the second source not overwritten. */
1357 if (srcreg + 1 == dstreg)
1358 return "mov %R0,%R1\n\tmov %0,%1";
1359 else
1360 return "mov %0,%1\n\tmov %R0,%R1";
1361 }
1362 else if (GET_CODE (src) == MEM)
1363 {
1364 rtx memexp = memexp = XEXP (src, 0);
1365 int dstreg = REGNO (dst);
1366 int basereg = -1;
1367
1368 if (GET_CODE (memexp) == LABEL_REF)
1369 return "lrw\t%0,[%1]\n\tlrw\t%R0,[%R1]";
1370 else if (GET_CODE (memexp) == REG)
1371 basereg = REGNO (memexp);
1372 else if (GET_CODE (memexp) == PLUS)
1373 {
1374 if (GET_CODE (XEXP (memexp, 0)) == REG)
1375 basereg = REGNO (XEXP (memexp, 0));
1376 else if (GET_CODE (XEXP (memexp, 1)) == REG)
1377 basereg = REGNO (XEXP (memexp, 1));
1378 else
1379 gcc_unreachable ();
1380 }
1381 else
1382 gcc_unreachable ();
1383
1384 /* ??? length attribute is wrong here. */
1385 if (dstreg == basereg)
1386 {
1387 /* Just load them in reverse order. */
1388 return "ldw\t%R0,%R1\n\tldw\t%0,%1";
1389
1390 /* XXX: alternative: move basereg to basereg+1
1391 and then fall through. */
1392 }
1393 else
1394 return "ldw\t%0,%1\n\tldw\t%R0,%R1";
1395 }
1396 else if (GET_CODE (src) == CONST_INT)
1397 {
1398 if (TARGET_LITTLE_END)
1399 {
1400 if (CONST_OK_FOR_I (INTVAL (src)))
1401 output_asm_insn ("movi %0,%1", operands);
1402 else if (CONST_OK_FOR_M (INTVAL (src)))
1403 output_asm_insn ("bgeni %0,%P1", operands);
1404 else if (CONST_OK_FOR_N (INTVAL (src)))
1405 output_asm_insn ("bmaski %0,%N1", operands);
1406 else
1407 gcc_unreachable ();
1408
1409 if (INTVAL (src) < 0)
1410 return "bmaski %R0,32";
1411 else
1412 return "movi %R0,0";
1413 }
1414 else
1415 {
1416 if (CONST_OK_FOR_I (INTVAL (src)))
1417 output_asm_insn ("movi %R0,%1", operands);
1418 else if (CONST_OK_FOR_M (INTVAL (src)))
1419 output_asm_insn ("bgeni %R0,%P1", operands);
1420 else if (CONST_OK_FOR_N (INTVAL (src)))
1421 output_asm_insn ("bmaski %R0,%N1", operands);
1422 else
1423 gcc_unreachable ();
1424
1425 if (INTVAL (src) < 0)
1426 return "bmaski %0,32";
1427 else
1428 return "movi %0,0";
1429 }
1430 }
1431 else
1432 gcc_unreachable ();
1433 }
1434 else if (GET_CODE (dst) == MEM && GET_CODE (src) == REG)
1435 return "stw\t%1,%0\n\tstw\t%R1,%R0";
1436 else
1437 gcc_unreachable ();
1438 }
1439
1440 /* Predicates used by the templates. */
1441
1442 int
1443 mcore_arith_S_operand (rtx op)
1444 {
1445 if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_M (~INTVAL (op)))
1446 return 1;
1447
1448 return 0;
1449 }
1450
1451 /* Expand insert bit field. BRC */
1452
1453 int
1454 mcore_expand_insv (rtx operands[])
1455 {
1456 int width = INTVAL (operands[1]);
1457 int posn = INTVAL (operands[2]);
1458 int mask;
1459 rtx mreg, sreg, ereg;
1460
1461 /* To get width 1 insv, the test in store_bit_field() (expmed.c, line 191)
1462 for width==1 must be removed. Look around line 368. This is something
1463 we really want the md part to do. */
1464 if (width == 1 && GET_CODE (operands[3]) == CONST_INT)
1465 {
1466 /* Do directly with bseti or bclri. */
1467 /* RBE: 2/97 consider only low bit of constant. */
1468 if ((INTVAL (operands[3]) & 1) == 0)
1469 {
1470 mask = ~(1 << posn);
1471 emit_insn (gen_rtx_SET (SImode, operands[0],
1472 gen_rtx_AND (SImode, operands[0], GEN_INT (mask))));
1473 }
1474 else
1475 {
1476 mask = 1 << posn;
1477 emit_insn (gen_rtx_SET (SImode, operands[0],
1478 gen_rtx_IOR (SImode, operands[0], GEN_INT (mask))));
1479 }
1480
1481 return 1;
1482 }
1483
1484 /* Look at some bit-field placements that we aren't interested
1485 in handling ourselves, unless specifically directed to do so. */
1486 if (! TARGET_W_FIELD)
1487 return 0; /* Generally, give up about now. */
1488
1489 if (width == 8 && posn % 8 == 0)
1490 /* Byte sized and aligned; let caller break it up. */
1491 return 0;
1492
1493 if (width == 16 && posn % 16 == 0)
1494 /* Short sized and aligned; let caller break it up. */
1495 return 0;
1496
1497 /* The general case - we can do this a little bit better than what the
1498 machine independent part tries. This will get rid of all the subregs
1499 that mess up constant folding in combine when working with relaxed
1500 immediates. */
1501
1502 /* If setting the entire field, do it directly. */
1503 if (GET_CODE (operands[3]) == CONST_INT
1504 && INTVAL (operands[3]) == ((1 << width) - 1))
1505 {
1506 mreg = force_reg (SImode, GEN_INT (INTVAL (operands[3]) << posn));
1507 emit_insn (gen_rtx_SET (SImode, operands[0],
1508 gen_rtx_IOR (SImode, operands[0], mreg)));
1509 return 1;
1510 }
1511
1512 /* Generate the clear mask. */
1513 mreg = force_reg (SImode, GEN_INT (~(((1 << width) - 1) << posn)));
1514
1515 /* Clear the field, to overlay it later with the source. */
1516 emit_insn (gen_rtx_SET (SImode, operands[0],
1517 gen_rtx_AND (SImode, operands[0], mreg)));
1518
1519 /* If the source is constant 0, we've nothing to add back. */
1520 if (GET_CODE (operands[3]) == CONST_INT && INTVAL (operands[3]) == 0)
1521 return 1;
1522
1523 /* XXX: Should we worry about more games with constant values?
1524 We've covered the high profile: set/clear single-bit and many-bit
1525 fields. How often do we see "arbitrary bit pattern" constants? */
1526 sreg = copy_to_mode_reg (SImode, operands[3]);
1527
1528 /* Extract src as same width as dst (needed for signed values). We
1529 always have to do this since we widen everything to SImode.
1530 We don't have to mask if we're shifting this up against the
1531 MSB of the register (e.g., the shift will push out any hi-order
1532 bits. */
1533 if (width + posn != (int) GET_MODE_SIZE (SImode))
1534 {
1535 ereg = force_reg (SImode, GEN_INT ((1 << width) - 1));
1536 emit_insn (gen_rtx_SET (SImode, sreg,
1537 gen_rtx_AND (SImode, sreg, ereg)));
1538 }
1539
1540 /* Insert source value in dest. */
1541 if (posn != 0)
1542 emit_insn (gen_rtx_SET (SImode, sreg,
1543 gen_rtx_ASHIFT (SImode, sreg, GEN_INT (posn))));
1544
1545 emit_insn (gen_rtx_SET (SImode, operands[0],
1546 gen_rtx_IOR (SImode, operands[0], sreg)));
1547
1548 return 1;
1549 }
1550 \f
1551 /* ??? Block move stuff stolen from m88k. This code has not been
1552 verified for correctness. */
1553
1554 /* Emit code to perform a block move. Choose the best method.
1555
1556 OPERANDS[0] is the destination.
1557 OPERANDS[1] is the source.
1558 OPERANDS[2] is the size.
1559 OPERANDS[3] is the alignment safe to use. */
1560
1561 /* Emit code to perform a block move with an offset sequence of ldw/st
1562 instructions (..., ldw 0, stw 1, ldw 1, stw 0, ...). SIZE and ALIGN are
1563 known constants. DEST and SRC are registers. OFFSET is the known
1564 starting point for the output pattern. */
1565
1566 static const enum machine_mode mode_from_align[] =
1567 {
1568 VOIDmode, QImode, HImode, VOIDmode, SImode,
1569 };
1570
1571 static void
1572 block_move_sequence (rtx dst_mem, rtx src_mem, int size, int align)
1573 {
1574 rtx temp[2];
1575 enum machine_mode mode[2];
1576 int amount[2];
1577 bool active[2];
1578 int phase = 0;
1579 int next;
1580 int offset_ld = 0;
1581 int offset_st = 0;
1582 rtx x;
1583
1584 x = XEXP (dst_mem, 0);
1585 if (!REG_P (x))
1586 {
1587 x = force_reg (Pmode, x);
1588 dst_mem = replace_equiv_address (dst_mem, x);
1589 }
1590
1591 x = XEXP (src_mem, 0);
1592 if (!REG_P (x))
1593 {
1594 x = force_reg (Pmode, x);
1595 src_mem = replace_equiv_address (src_mem, x);
1596 }
1597
1598 active[0] = active[1] = false;
1599
1600 do
1601 {
1602 next = phase;
1603 phase ^= 1;
1604
1605 if (size > 0)
1606 {
1607 int next_amount;
1608
1609 next_amount = (size >= 4 ? 4 : (size >= 2 ? 2 : 1));
1610 next_amount = MIN (next_amount, align);
1611
1612 amount[next] = next_amount;
1613 mode[next] = mode_from_align[next_amount];
1614 temp[next] = gen_reg_rtx (mode[next]);
1615
1616 x = adjust_address (src_mem, mode[next], offset_ld);
1617 emit_insn (gen_rtx_SET (VOIDmode, temp[next], x));
1618
1619 offset_ld += next_amount;
1620 size -= next_amount;
1621 active[next] = true;
1622 }
1623
1624 if (active[phase])
1625 {
1626 active[phase] = false;
1627
1628 x = adjust_address (dst_mem, mode[phase], offset_st);
1629 emit_insn (gen_rtx_SET (VOIDmode, x, temp[phase]));
1630
1631 offset_st += amount[phase];
1632 }
1633 }
1634 while (active[next]);
1635 }
1636
1637 bool
1638 mcore_expand_block_move (rtx *operands)
1639 {
1640 HOST_WIDE_INT align, bytes, max;
1641
1642 if (GET_CODE (operands[2]) != CONST_INT)
1643 return false;
1644
1645 bytes = INTVAL (operands[2]);
1646 align = INTVAL (operands[3]);
1647
1648 if (bytes <= 0)
1649 return false;
1650 if (align > 4)
1651 align = 4;
1652
1653 switch (align)
1654 {
1655 case 4:
1656 if (bytes & 1)
1657 max = 4*4;
1658 else if (bytes & 3)
1659 max = 8*4;
1660 else
1661 max = 16*4;
1662 break;
1663 case 2:
1664 max = 4*2;
1665 break;
1666 case 1:
1667 max = 4*1;
1668 break;
1669 default:
1670 gcc_unreachable ();
1671 }
1672
1673 if (bytes <= max)
1674 {
1675 block_move_sequence (operands[0], operands[1], bytes, align);
1676 return true;
1677 }
1678
1679 return false;
1680 }
1681 \f
1682
1683 /* Code to generate prologue and epilogue sequences. */
1684 static int number_of_regs_before_varargs;
1685
1686 /* Set by TARGET_SETUP_INCOMING_VARARGS to indicate to prolog that this is
1687 for a varargs function. */
1688 static int current_function_anonymous_args;
1689
1690 #define STACK_BYTES (STACK_BOUNDARY/BITS_PER_UNIT)
1691 #define STORE_REACH (64) /* Maximum displace of word store + 4. */
1692 #define ADDI_REACH (32) /* Maximum addi operand. */
1693
1694 static void
1695 layout_mcore_frame (struct mcore_frame * infp)
1696 {
1697 int n;
1698 unsigned int i;
1699 int nbytes;
1700 int regarg;
1701 int localregarg;
1702 int outbounds;
1703 unsigned int growths;
1704 int step;
1705
1706 /* Might have to spill bytes to re-assemble a big argument that
1707 was passed partially in registers and partially on the stack. */
1708 nbytes = crtl->args.pretend_args_size;
1709
1710 /* Determine how much space for spilled anonymous args (e.g., stdarg). */
1711 if (current_function_anonymous_args)
1712 nbytes += (NPARM_REGS - number_of_regs_before_varargs) * UNITS_PER_WORD;
1713
1714 infp->arg_size = nbytes;
1715
1716 /* How much space to save non-volatile registers we stomp. */
1717 infp->reg_mask = calc_live_regs (& n);
1718 infp->reg_size = n * 4;
1719
1720 /* And the rest of it... locals and space for overflowed outbounds. */
1721 infp->local_size = get_frame_size ();
1722 infp->outbound_size = crtl->outgoing_args_size;
1723
1724 /* Make sure we have a whole number of words for the locals. */
1725 if (infp->local_size % STACK_BYTES)
1726 infp->local_size = (infp->local_size + STACK_BYTES - 1) & ~ (STACK_BYTES -1);
1727
1728 /* Only thing we know we have to pad is the outbound space, since
1729 we've aligned our locals assuming that base of locals is aligned. */
1730 infp->pad_local = 0;
1731 infp->pad_reg = 0;
1732 infp->pad_outbound = 0;
1733 if (infp->outbound_size % STACK_BYTES)
1734 infp->pad_outbound = STACK_BYTES - (infp->outbound_size % STACK_BYTES);
1735
1736 /* Now we see how we want to stage the prologue so that it does
1737 the most appropriate stack growth and register saves to either:
1738 (1) run fast,
1739 (2) reduce instruction space, or
1740 (3) reduce stack space. */
1741 for (i = 0; i < ARRAY_SIZE (infp->growth); i++)
1742 infp->growth[i] = 0;
1743
1744 regarg = infp->reg_size + infp->arg_size;
1745 localregarg = infp->local_size + regarg;
1746 outbounds = infp->outbound_size + infp->pad_outbound;
1747 growths = 0;
1748
1749 /* XXX: Consider one where we consider localregarg + outbound too! */
1750
1751 /* Frame of <= 32 bytes and using stm would get <= 2 registers.
1752 use stw's with offsets and buy the frame in one shot. */
1753 if (localregarg <= ADDI_REACH
1754 && (infp->reg_size <= 8 || (infp->reg_mask & 0xc000) != 0xc000))
1755 {
1756 /* Make sure we'll be aligned. */
1757 if (localregarg % STACK_BYTES)
1758 infp->pad_reg = STACK_BYTES - (localregarg % STACK_BYTES);
1759
1760 step = localregarg + infp->pad_reg;
1761 infp->reg_offset = infp->local_size;
1762
1763 if (outbounds + step <= ADDI_REACH && !frame_pointer_needed)
1764 {
1765 step += outbounds;
1766 infp->reg_offset += outbounds;
1767 outbounds = 0;
1768 }
1769
1770 infp->arg_offset = step - 4;
1771 infp->growth[growths++] = step;
1772 infp->reg_growth = growths;
1773 infp->local_growth = growths;
1774
1775 /* If we haven't already folded it in. */
1776 if (outbounds)
1777 infp->growth[growths++] = outbounds;
1778
1779 goto finish;
1780 }
1781
1782 /* Frame can't be done with a single subi, but can be done with 2
1783 insns. If the 'stm' is getting <= 2 registers, we use stw's and
1784 shift some of the stack purchase into the first subi, so both are
1785 single instructions. */
1786 if (localregarg <= STORE_REACH
1787 && (infp->local_size > ADDI_REACH)
1788 && (infp->reg_size <= 8 || (infp->reg_mask & 0xc000) != 0xc000))
1789 {
1790 int all;
1791
1792 /* Make sure we'll be aligned; use either pad_reg or pad_local. */
1793 if (localregarg % STACK_BYTES)
1794 infp->pad_reg = STACK_BYTES - (localregarg % STACK_BYTES);
1795
1796 all = localregarg + infp->pad_reg + infp->pad_local;
1797 step = ADDI_REACH; /* As much up front as we can. */
1798 if (step > all)
1799 step = all;
1800
1801 /* XXX: Consider whether step will still be aligned; we believe so. */
1802 infp->arg_offset = step - 4;
1803 infp->growth[growths++] = step;
1804 infp->reg_growth = growths;
1805 infp->reg_offset = step - infp->pad_reg - infp->reg_size;
1806 all -= step;
1807
1808 /* Can we fold in any space required for outbounds? */
1809 if (outbounds + all <= ADDI_REACH && !frame_pointer_needed)
1810 {
1811 all += outbounds;
1812 outbounds = 0;
1813 }
1814
1815 /* Get the rest of the locals in place. */
1816 step = all;
1817 infp->growth[growths++] = step;
1818 infp->local_growth = growths;
1819 all -= step;
1820
1821 gcc_assert (all == 0);
1822
1823 /* Finish off if we need to do so. */
1824 if (outbounds)
1825 infp->growth[growths++] = outbounds;
1826
1827 goto finish;
1828 }
1829
1830 /* Registers + args is nicely aligned, so we'll buy that in one shot.
1831 Then we buy the rest of the frame in 1 or 2 steps depending on
1832 whether we need a frame pointer. */
1833 if ((regarg % STACK_BYTES) == 0)
1834 {
1835 infp->growth[growths++] = regarg;
1836 infp->reg_growth = growths;
1837 infp->arg_offset = regarg - 4;
1838 infp->reg_offset = 0;
1839
1840 if (infp->local_size % STACK_BYTES)
1841 infp->pad_local = STACK_BYTES - (infp->local_size % STACK_BYTES);
1842
1843 step = infp->local_size + infp->pad_local;
1844
1845 if (!frame_pointer_needed)
1846 {
1847 step += outbounds;
1848 outbounds = 0;
1849 }
1850
1851 infp->growth[growths++] = step;
1852 infp->local_growth = growths;
1853
1854 /* If there's any left to be done. */
1855 if (outbounds)
1856 infp->growth[growths++] = outbounds;
1857
1858 goto finish;
1859 }
1860
1861 /* XXX: optimizations that we'll want to play with....
1862 -- regarg is not aligned, but it's a small number of registers;
1863 use some of localsize so that regarg is aligned and then
1864 save the registers. */
1865
1866 /* Simple encoding; plods down the stack buying the pieces as it goes.
1867 -- does not optimize space consumption.
1868 -- does not attempt to optimize instruction counts.
1869 -- but it is safe for all alignments. */
1870 if (regarg % STACK_BYTES != 0)
1871 infp->pad_reg = STACK_BYTES - (regarg % STACK_BYTES);
1872
1873 infp->growth[growths++] = infp->arg_size + infp->reg_size + infp->pad_reg;
1874 infp->reg_growth = growths;
1875 infp->arg_offset = infp->growth[0] - 4;
1876 infp->reg_offset = 0;
1877
1878 if (frame_pointer_needed)
1879 {
1880 if (infp->local_size % STACK_BYTES != 0)
1881 infp->pad_local = STACK_BYTES - (infp->local_size % STACK_BYTES);
1882
1883 infp->growth[growths++] = infp->local_size + infp->pad_local;
1884 infp->local_growth = growths;
1885
1886 infp->growth[growths++] = outbounds;
1887 }
1888 else
1889 {
1890 if ((infp->local_size + outbounds) % STACK_BYTES != 0)
1891 infp->pad_local = STACK_BYTES - ((infp->local_size + outbounds) % STACK_BYTES);
1892
1893 infp->growth[growths++] = infp->local_size + infp->pad_local + outbounds;
1894 infp->local_growth = growths;
1895 }
1896
1897 /* Anything else that we've forgotten?, plus a few consistency checks. */
1898 finish:
1899 gcc_assert (infp->reg_offset >= 0);
1900 gcc_assert (growths <= MAX_STACK_GROWS);
1901
1902 for (i = 0; i < growths; i++)
1903 gcc_assert (!(infp->growth[i] % STACK_BYTES));
1904 }
1905
1906 /* Define the offset between two registers, one to be eliminated, and
1907 the other its replacement, at the start of a routine. */
1908
1909 int
1910 mcore_initial_elimination_offset (int from, int to)
1911 {
1912 int above_frame;
1913 int below_frame;
1914 struct mcore_frame fi;
1915
1916 layout_mcore_frame (& fi);
1917
1918 /* fp to ap */
1919 above_frame = fi.local_size + fi.pad_local + fi.reg_size + fi.pad_reg;
1920 /* sp to fp */
1921 below_frame = fi.outbound_size + fi.pad_outbound;
1922
1923 if (from == ARG_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
1924 return above_frame;
1925
1926 if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
1927 return above_frame + below_frame;
1928
1929 if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
1930 return below_frame;
1931
1932 gcc_unreachable ();
1933 }
1934
1935 /* Keep track of some information about varargs for the prolog. */
1936
1937 static void
1938 mcore_setup_incoming_varargs (CUMULATIVE_ARGS *args_so_far,
1939 enum machine_mode mode, tree type,
1940 int * ptr_pretend_size ATTRIBUTE_UNUSED,
1941 int second_time ATTRIBUTE_UNUSED)
1942 {
1943 current_function_anonymous_args = 1;
1944
1945 /* We need to know how many argument registers are used before
1946 the varargs start, so that we can push the remaining argument
1947 registers during the prologue. */
1948 number_of_regs_before_varargs = *args_so_far + mcore_num_arg_regs (mode, type);
1949
1950 /* There is a bug somewhere in the arg handling code.
1951 Until I can find it this workaround always pushes the
1952 last named argument onto the stack. */
1953 number_of_regs_before_varargs = *args_so_far;
1954
1955 /* The last named argument may be split between argument registers
1956 and the stack. Allow for this here. */
1957 if (number_of_regs_before_varargs > NPARM_REGS)
1958 number_of_regs_before_varargs = NPARM_REGS;
1959 }
1960
1961 void
1962 mcore_expand_prolog (void)
1963 {
1964 struct mcore_frame fi;
1965 int space_allocated = 0;
1966 int growth = 0;
1967
1968 /* Find out what we're doing. */
1969 layout_mcore_frame (&fi);
1970
1971 space_allocated = fi.arg_size + fi.reg_size + fi.local_size +
1972 fi.outbound_size + fi.pad_outbound + fi.pad_local + fi.pad_reg;
1973
1974 if (TARGET_CG_DATA)
1975 {
1976 /* Emit a symbol for this routine's frame size. */
1977 rtx x;
1978
1979 x = DECL_RTL (current_function_decl);
1980
1981 gcc_assert (GET_CODE (x) == MEM);
1982
1983 x = XEXP (x, 0);
1984
1985 gcc_assert (GET_CODE (x) == SYMBOL_REF);
1986
1987 free (mcore_current_function_name);
1988
1989 mcore_current_function_name = xstrdup (XSTR (x, 0));
1990
1991 ASM_OUTPUT_CG_NODE (asm_out_file, mcore_current_function_name, space_allocated);
1992
1993 if (cfun->calls_alloca)
1994 ASM_OUTPUT_CG_EDGE (asm_out_file, mcore_current_function_name, "alloca", 1);
1995
1996 /* 970425: RBE:
1997 We're looking at how the 8byte alignment affects stack layout
1998 and where we had to pad things. This emits information we can
1999 extract which tells us about frame sizes and the like. */
2000 fprintf (asm_out_file,
2001 "\t.equ\t__$frame$info$_%s_$_%d_%d_x%x_%d_%d_%d,0\n",
2002 mcore_current_function_name,
2003 fi.arg_size, fi.reg_size, fi.reg_mask,
2004 fi.local_size, fi.outbound_size,
2005 frame_pointer_needed);
2006 }
2007
2008 if (mcore_naked_function_p ())
2009 return;
2010
2011 /* Handle stdarg+regsaves in one shot: can't be more than 64 bytes. */
2012 output_stack_adjust (-1, fi.growth[growth++]); /* Grows it. */
2013
2014 /* If we have a parameter passed partially in regs and partially in memory,
2015 the registers will have been stored to memory already in function.c. So
2016 we only need to do something here for varargs functions. */
2017 if (fi.arg_size != 0 && crtl->args.pretend_args_size == 0)
2018 {
2019 int offset;
2020 int rn = FIRST_PARM_REG + NPARM_REGS - 1;
2021 int remaining = fi.arg_size;
2022
2023 for (offset = fi.arg_offset; remaining >= 4; offset -= 4, rn--, remaining -= 4)
2024 {
2025 emit_insn (gen_movsi
2026 (gen_rtx_MEM (SImode,
2027 plus_constant (stack_pointer_rtx, offset)),
2028 gen_rtx_REG (SImode, rn)));
2029 }
2030 }
2031
2032 /* Do we need another stack adjustment before we do the register saves? */
2033 if (growth < fi.reg_growth)
2034 output_stack_adjust (-1, fi.growth[growth++]); /* Grows it. */
2035
2036 if (fi.reg_size != 0)
2037 {
2038 int i;
2039 int offs = fi.reg_offset;
2040
2041 for (i = 15; i >= 0; i--)
2042 {
2043 if (offs == 0 && i == 15 && ((fi.reg_mask & 0xc000) == 0xc000))
2044 {
2045 int first_reg = 15;
2046
2047 while (fi.reg_mask & (1 << first_reg))
2048 first_reg--;
2049 first_reg++;
2050
2051 emit_insn (gen_store_multiple (gen_rtx_MEM (SImode, stack_pointer_rtx),
2052 gen_rtx_REG (SImode, first_reg),
2053 GEN_INT (16 - first_reg)));
2054
2055 i -= (15 - first_reg);
2056 offs += (16 - first_reg) * 4;
2057 }
2058 else if (fi.reg_mask & (1 << i))
2059 {
2060 emit_insn (gen_movsi
2061 (gen_rtx_MEM (SImode,
2062 plus_constant (stack_pointer_rtx, offs)),
2063 gen_rtx_REG (SImode, i)));
2064 offs += 4;
2065 }
2066 }
2067 }
2068
2069 /* Figure the locals + outbounds. */
2070 if (frame_pointer_needed)
2071 {
2072 /* If we haven't already purchased to 'fp'. */
2073 if (growth < fi.local_growth)
2074 output_stack_adjust (-1, fi.growth[growth++]); /* Grows it. */
2075
2076 emit_insn (gen_movsi (frame_pointer_rtx, stack_pointer_rtx));
2077
2078 /* ... and then go any remaining distance for outbounds, etc. */
2079 if (fi.growth[growth])
2080 output_stack_adjust (-1, fi.growth[growth++]);
2081 }
2082 else
2083 {
2084 if (growth < fi.local_growth)
2085 output_stack_adjust (-1, fi.growth[growth++]); /* Grows it. */
2086 if (fi.growth[growth])
2087 output_stack_adjust (-1, fi.growth[growth++]);
2088 }
2089 }
2090
2091 void
2092 mcore_expand_epilog (void)
2093 {
2094 struct mcore_frame fi;
2095 int i;
2096 int offs;
2097 int growth = MAX_STACK_GROWS - 1 ;
2098
2099
2100 /* Find out what we're doing. */
2101 layout_mcore_frame(&fi);
2102
2103 if (mcore_naked_function_p ())
2104 return;
2105
2106 /* If we had a frame pointer, restore the sp from that. */
2107 if (frame_pointer_needed)
2108 {
2109 emit_insn (gen_movsi (stack_pointer_rtx, frame_pointer_rtx));
2110 growth = fi.local_growth - 1;
2111 }
2112 else
2113 {
2114 /* XXX: while loop should accumulate and do a single sell. */
2115 while (growth >= fi.local_growth)
2116 {
2117 if (fi.growth[growth] != 0)
2118 output_stack_adjust (1, fi.growth[growth]);
2119 growth--;
2120 }
2121 }
2122
2123 /* Make sure we've shrunk stack back to the point where the registers
2124 were laid down. This is typically 0/1 iterations. Then pull the
2125 register save information back off the stack. */
2126 while (growth >= fi.reg_growth)
2127 output_stack_adjust ( 1, fi.growth[growth--]);
2128
2129 offs = fi.reg_offset;
2130
2131 for (i = 15; i >= 0; i--)
2132 {
2133 if (offs == 0 && i == 15 && ((fi.reg_mask & 0xc000) == 0xc000))
2134 {
2135 int first_reg;
2136
2137 /* Find the starting register. */
2138 first_reg = 15;
2139
2140 while (fi.reg_mask & (1 << first_reg))
2141 first_reg--;
2142
2143 first_reg++;
2144
2145 emit_insn (gen_load_multiple (gen_rtx_REG (SImode, first_reg),
2146 gen_rtx_MEM (SImode, stack_pointer_rtx),
2147 GEN_INT (16 - first_reg)));
2148
2149 i -= (15 - first_reg);
2150 offs += (16 - first_reg) * 4;
2151 }
2152 else if (fi.reg_mask & (1 << i))
2153 {
2154 emit_insn (gen_movsi
2155 (gen_rtx_REG (SImode, i),
2156 gen_rtx_MEM (SImode,
2157 plus_constant (stack_pointer_rtx, offs))));
2158 offs += 4;
2159 }
2160 }
2161
2162 /* Give back anything else. */
2163 /* XXX: Should accumulate total and then give it back. */
2164 while (growth >= 0)
2165 output_stack_adjust ( 1, fi.growth[growth--]);
2166 }
2167 \f
2168 /* This code is borrowed from the SH port. */
2169
2170 /* The MCORE cannot load a large constant into a register, constants have to
2171 come from a pc relative load. The reference of a pc relative load
2172 instruction must be less than 1k in front of the instruction. This
2173 means that we often have to dump a constant inside a function, and
2174 generate code to branch around it.
2175
2176 It is important to minimize this, since the branches will slow things
2177 down and make things bigger.
2178
2179 Worst case code looks like:
2180
2181 lrw L1,r0
2182 br L2
2183 align
2184 L1: .long value
2185 L2:
2186 ..
2187
2188 lrw L3,r0
2189 br L4
2190 align
2191 L3: .long value
2192 L4:
2193 ..
2194
2195 We fix this by performing a scan before scheduling, which notices which
2196 instructions need to have their operands fetched from the constant table
2197 and builds the table.
2198
2199 The algorithm is:
2200
2201 scan, find an instruction which needs a pcrel move. Look forward, find the
2202 last barrier which is within MAX_COUNT bytes of the requirement.
2203 If there isn't one, make one. Process all the instructions between
2204 the find and the barrier.
2205
2206 In the above example, we can tell that L3 is within 1k of L1, so
2207 the first move can be shrunk from the 2 insn+constant sequence into
2208 just 1 insn, and the constant moved to L3 to make:
2209
2210 lrw L1,r0
2211 ..
2212 lrw L3,r0
2213 bra L4
2214 align
2215 L3:.long value
2216 L4:.long value
2217
2218 Then the second move becomes the target for the shortening process. */
2219
2220 typedef struct
2221 {
2222 rtx value; /* Value in table. */
2223 rtx label; /* Label of value. */
2224 } pool_node;
2225
2226 /* The maximum number of constants that can fit into one pool, since
2227 the pc relative range is 0...1020 bytes and constants are at least 4
2228 bytes long. We subtract 4 from the range to allow for the case where
2229 we need to add a branch/align before the constant pool. */
2230
2231 #define MAX_COUNT 1016
2232 #define MAX_POOL_SIZE (MAX_COUNT/4)
2233 static pool_node pool_vector[MAX_POOL_SIZE];
2234 static int pool_size;
2235
2236 /* Dump out any constants accumulated in the final pass. These
2237 will only be labels. */
2238
2239 const char *
2240 mcore_output_jump_label_table (void)
2241 {
2242 int i;
2243
2244 if (pool_size)
2245 {
2246 fprintf (asm_out_file, "\t.align 2\n");
2247
2248 for (i = 0; i < pool_size; i++)
2249 {
2250 pool_node * p = pool_vector + i;
2251
2252 (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (p->label));
2253
2254 output_asm_insn (".long %0", &p->value);
2255 }
2256
2257 pool_size = 0;
2258 }
2259
2260 return "";
2261 }
2262
2263 /* Check whether insn is a candidate for a conditional. */
2264
2265 static cond_type
2266 is_cond_candidate (rtx insn)
2267 {
2268 /* The only things we conditionalize are those that can be directly
2269 changed into a conditional. Only bother with SImode items. If
2270 we wanted to be a little more aggressive, we could also do other
2271 modes such as DImode with reg-reg move or load 0. */
2272 if (GET_CODE (insn) == INSN)
2273 {
2274 rtx pat = PATTERN (insn);
2275 rtx src, dst;
2276
2277 if (GET_CODE (pat) != SET)
2278 return COND_NO;
2279
2280 dst = XEXP (pat, 0);
2281
2282 if ((GET_CODE (dst) != REG &&
2283 GET_CODE (dst) != SUBREG) ||
2284 GET_MODE (dst) != SImode)
2285 return COND_NO;
2286
2287 src = XEXP (pat, 1);
2288
2289 if ((GET_CODE (src) == REG ||
2290 (GET_CODE (src) == SUBREG &&
2291 GET_CODE (SUBREG_REG (src)) == REG)) &&
2292 GET_MODE (src) == SImode)
2293 return COND_MOV_INSN;
2294 else if (GET_CODE (src) == CONST_INT &&
2295 INTVAL (src) == 0)
2296 return COND_CLR_INSN;
2297 else if (GET_CODE (src) == PLUS &&
2298 (GET_CODE (XEXP (src, 0)) == REG ||
2299 (GET_CODE (XEXP (src, 0)) == SUBREG &&
2300 GET_CODE (SUBREG_REG (XEXP (src, 0))) == REG)) &&
2301 GET_MODE (XEXP (src, 0)) == SImode &&
2302 GET_CODE (XEXP (src, 1)) == CONST_INT &&
2303 INTVAL (XEXP (src, 1)) == 1)
2304 return COND_INC_INSN;
2305 else if (((GET_CODE (src) == MINUS &&
2306 GET_CODE (XEXP (src, 1)) == CONST_INT &&
2307 INTVAL( XEXP (src, 1)) == 1) ||
2308 (GET_CODE (src) == PLUS &&
2309 GET_CODE (XEXP (src, 1)) == CONST_INT &&
2310 INTVAL (XEXP (src, 1)) == -1)) &&
2311 (GET_CODE (XEXP (src, 0)) == REG ||
2312 (GET_CODE (XEXP (src, 0)) == SUBREG &&
2313 GET_CODE (SUBREG_REG (XEXP (src, 0))) == REG)) &&
2314 GET_MODE (XEXP (src, 0)) == SImode)
2315 return COND_DEC_INSN;
2316
2317 /* Some insns that we don't bother with:
2318 (set (rx:DI) (ry:DI))
2319 (set (rx:DI) (const_int 0))
2320 */
2321
2322 }
2323 else if (GET_CODE (insn) == JUMP_INSN &&
2324 GET_CODE (PATTERN (insn)) == SET &&
2325 GET_CODE (XEXP (PATTERN (insn), 1)) == LABEL_REF)
2326 return COND_BRANCH_INSN;
2327
2328 return COND_NO;
2329 }
2330
2331 /* Emit a conditional version of insn and replace the old insn with the
2332 new one. Return the new insn if emitted. */
2333
2334 static rtx
2335 emit_new_cond_insn (rtx insn, int cond)
2336 {
2337 rtx c_insn = 0;
2338 rtx pat, dst, src;
2339 cond_type num;
2340
2341 if ((num = is_cond_candidate (insn)) == COND_NO)
2342 return NULL;
2343
2344 pat = PATTERN (insn);
2345
2346 if (GET_CODE (insn) == INSN)
2347 {
2348 dst = SET_DEST (pat);
2349 src = SET_SRC (pat);
2350 }
2351 else
2352 {
2353 dst = JUMP_LABEL (insn);
2354 src = NULL_RTX;
2355 }
2356
2357 switch (num)
2358 {
2359 case COND_MOV_INSN:
2360 case COND_CLR_INSN:
2361 if (cond)
2362 c_insn = gen_movt0 (dst, src, dst);
2363 else
2364 c_insn = gen_movt0 (dst, dst, src);
2365 break;
2366
2367 case COND_INC_INSN:
2368 if (cond)
2369 c_insn = gen_incscc (dst, dst);
2370 else
2371 c_insn = gen_incscc_false (dst, dst);
2372 break;
2373
2374 case COND_DEC_INSN:
2375 if (cond)
2376 c_insn = gen_decscc (dst, dst);
2377 else
2378 c_insn = gen_decscc_false (dst, dst);
2379 break;
2380
2381 case COND_BRANCH_INSN:
2382 if (cond)
2383 c_insn = gen_branch_true (dst);
2384 else
2385 c_insn = gen_branch_false (dst);
2386 break;
2387
2388 default:
2389 return NULL;
2390 }
2391
2392 /* Only copy the notes if they exist. */
2393 if (rtx_length [GET_CODE (c_insn)] >= 7 && rtx_length [GET_CODE (insn)] >= 7)
2394 {
2395 /* We really don't need to bother with the notes and links at this
2396 point, but go ahead and save the notes. This will help is_dead()
2397 when applying peepholes (links don't matter since they are not
2398 used any more beyond this point for the mcore). */
2399 REG_NOTES (c_insn) = REG_NOTES (insn);
2400 }
2401
2402 if (num == COND_BRANCH_INSN)
2403 {
2404 /* For jumps, we need to be a little bit careful and emit the new jump
2405 before the old one and to update the use count for the target label.
2406 This way, the barrier following the old (uncond) jump will get
2407 deleted, but the label won't. */
2408 c_insn = emit_jump_insn_before (c_insn, insn);
2409
2410 ++ LABEL_NUSES (dst);
2411
2412 JUMP_LABEL (c_insn) = dst;
2413 }
2414 else
2415 c_insn = emit_insn_after (c_insn, insn);
2416
2417 delete_insn (insn);
2418
2419 return c_insn;
2420 }
2421
2422 /* Attempt to change a basic block into a series of conditional insns. This
2423 works by taking the branch at the end of the 1st block and scanning for the
2424 end of the 2nd block. If all instructions in the 2nd block have cond.
2425 versions and the label at the start of block 3 is the same as the target
2426 from the branch at block 1, then conditionalize all insn in block 2 using
2427 the inverse condition of the branch at block 1. (Note I'm bending the
2428 definition of basic block here.)
2429
2430 e.g., change:
2431
2432 bt L2 <-- end of block 1 (delete)
2433 mov r7,r8
2434 addu r7,1
2435 br L3 <-- end of block 2
2436
2437 L2: ... <-- start of block 3 (NUSES==1)
2438 L3: ...
2439
2440 to:
2441
2442 movf r7,r8
2443 incf r7
2444 bf L3
2445
2446 L3: ...
2447
2448 we can delete the L2 label if NUSES==1 and re-apply the optimization
2449 starting at the last instruction of block 2. This may allow an entire
2450 if-then-else statement to be conditionalized. BRC */
2451 static rtx
2452 conditionalize_block (rtx first)
2453 {
2454 rtx insn;
2455 rtx br_pat;
2456 rtx end_blk_1_br = 0;
2457 rtx end_blk_2_insn = 0;
2458 rtx start_blk_3_lab = 0;
2459 int cond;
2460 int br_lab_num;
2461 int blk_size = 0;
2462
2463
2464 /* Check that the first insn is a candidate conditional jump. This is
2465 the one that we'll eliminate. If not, advance to the next insn to
2466 try. */
2467 if (GET_CODE (first) != JUMP_INSN ||
2468 GET_CODE (PATTERN (first)) != SET ||
2469 GET_CODE (XEXP (PATTERN (first), 1)) != IF_THEN_ELSE)
2470 return NEXT_INSN (first);
2471
2472 /* Extract some information we need. */
2473 end_blk_1_br = first;
2474 br_pat = PATTERN (end_blk_1_br);
2475
2476 /* Complement the condition since we use the reverse cond. for the insns. */
2477 cond = (GET_CODE (XEXP (XEXP (br_pat, 1), 0)) == EQ);
2478
2479 /* Determine what kind of branch we have. */
2480 if (GET_CODE (XEXP (XEXP (br_pat, 1), 1)) == LABEL_REF)
2481 {
2482 /* A normal branch, so extract label out of first arm. */
2483 br_lab_num = CODE_LABEL_NUMBER (XEXP (XEXP (XEXP (br_pat, 1), 1), 0));
2484 }
2485 else
2486 {
2487 /* An inverse branch, so extract the label out of the 2nd arm
2488 and complement the condition. */
2489 cond = (cond == 0);
2490 br_lab_num = CODE_LABEL_NUMBER (XEXP (XEXP (XEXP (br_pat, 1), 2), 0));
2491 }
2492
2493 /* Scan forward for the start of block 2: it must start with a
2494 label and that label must be the same as the branch target
2495 label from block 1. We don't care about whether block 2 actually
2496 ends with a branch or a label (an uncond. branch is
2497 conditionalizable). */
2498 for (insn = NEXT_INSN (first); insn; insn = NEXT_INSN (insn))
2499 {
2500 enum rtx_code code;
2501
2502 code = GET_CODE (insn);
2503
2504 /* Look for the label at the start of block 3. */
2505 if (code == CODE_LABEL && CODE_LABEL_NUMBER (insn) == br_lab_num)
2506 break;
2507
2508 /* Skip barriers, notes, and conditionalizable insns. If the
2509 insn is not conditionalizable or makes this optimization fail,
2510 just return the next insn so we can start over from that point. */
2511 if (code != BARRIER && code != NOTE && !is_cond_candidate (insn))
2512 return NEXT_INSN (insn);
2513
2514 /* Remember the last real insn before the label (i.e. end of block 2). */
2515 if (code == JUMP_INSN || code == INSN)
2516 {
2517 blk_size ++;
2518 end_blk_2_insn = insn;
2519 }
2520 }
2521
2522 if (!insn)
2523 return insn;
2524
2525 /* It is possible for this optimization to slow performance if the blocks
2526 are long. This really depends upon whether the branch is likely taken
2527 or not. If the branch is taken, we slow performance in many cases. But,
2528 if the branch is not taken, we always help performance (for a single
2529 block, but for a double block (i.e. when the optimization is re-applied)
2530 this is not true since the 'right thing' depends on the overall length of
2531 the collapsed block). As a compromise, don't apply this optimization on
2532 blocks larger than size 2 (unlikely for the mcore) when speed is important.
2533 the best threshold depends on the latencies of the instructions (i.e.,
2534 the branch penalty). */
2535 if (optimize > 1 && blk_size > 2)
2536 return insn;
2537
2538 /* At this point, we've found the start of block 3 and we know that
2539 it is the destination of the branch from block 1. Also, all
2540 instructions in the block 2 are conditionalizable. So, apply the
2541 conditionalization and delete the branch. */
2542 start_blk_3_lab = insn;
2543
2544 for (insn = NEXT_INSN (end_blk_1_br); insn != start_blk_3_lab;
2545 insn = NEXT_INSN (insn))
2546 {
2547 rtx newinsn;
2548
2549 if (INSN_DELETED_P (insn))
2550 continue;
2551
2552 /* Try to form a conditional variant of the instruction and emit it. */
2553 if ((newinsn = emit_new_cond_insn (insn, cond)))
2554 {
2555 if (end_blk_2_insn == insn)
2556 end_blk_2_insn = newinsn;
2557
2558 insn = newinsn;
2559 }
2560 }
2561
2562 /* Note whether we will delete the label starting blk 3 when the jump
2563 gets deleted. If so, we want to re-apply this optimization at the
2564 last real instruction right before the label. */
2565 if (LABEL_NUSES (start_blk_3_lab) == 1)
2566 {
2567 start_blk_3_lab = 0;
2568 }
2569
2570 /* ??? we probably should redistribute the death notes for this insn, esp.
2571 the death of cc, but it doesn't really matter this late in the game.
2572 The peepholes all use is_dead() which will find the correct death
2573 regardless of whether there is a note. */
2574 delete_insn (end_blk_1_br);
2575
2576 if (! start_blk_3_lab)
2577 return end_blk_2_insn;
2578
2579 /* Return the insn right after the label at the start of block 3. */
2580 return NEXT_INSN (start_blk_3_lab);
2581 }
2582
2583 /* Apply the conditionalization of blocks optimization. This is the
2584 outer loop that traverses through the insns scanning for a branch
2585 that signifies an opportunity to apply the optimization. Note that
2586 this optimization is applied late. If we could apply it earlier,
2587 say before cse 2, it may expose more optimization opportunities.
2588 but, the pay back probably isn't really worth the effort (we'd have
2589 to update all reg/flow/notes/links/etc to make it work - and stick it
2590 in before cse 2). */
2591
2592 static void
2593 conditionalize_optimization (void)
2594 {
2595 rtx insn;
2596
2597 for (insn = get_insns (); insn; insn = conditionalize_block (insn))
2598 continue;
2599 }
2600
2601 static int saved_warn_return_type = -1;
2602 static int saved_warn_return_type_count = 0;
2603
2604 /* This is to handle loads from the constant pool. */
2605
2606 static void
2607 mcore_reorg (void)
2608 {
2609 /* Reset this variable. */
2610 current_function_anonymous_args = 0;
2611
2612 /* Restore the warn_return_type if it has been altered. */
2613 if (saved_warn_return_type != -1)
2614 {
2615 /* Only restore the value if we have reached another function.
2616 The test of warn_return_type occurs in final_function () in
2617 c-decl.c a long time after the code for the function is generated,
2618 so we need a counter to tell us when we have finished parsing that
2619 function and can restore the flag. */
2620 if (--saved_warn_return_type_count == 0)
2621 {
2622 warn_return_type = saved_warn_return_type;
2623 saved_warn_return_type = -1;
2624 }
2625 }
2626
2627 if (optimize == 0)
2628 return;
2629
2630 /* Conditionalize blocks where we can. */
2631 conditionalize_optimization ();
2632
2633 /* Literal pool generation is now pushed off until the assembler. */
2634 }
2635
2636 \f
2637 /* Return true if X is something that can be moved directly into r15. */
2638
2639 bool
2640 mcore_r15_operand_p (rtx x)
2641 {
2642 switch (GET_CODE (x))
2643 {
2644 case CONST_INT:
2645 return mcore_const_ok_for_inline (INTVAL (x));
2646
2647 case REG:
2648 case SUBREG:
2649 case MEM:
2650 return 1;
2651
2652 default:
2653 return 0;
2654 }
2655 }
2656
2657 /* Implement SECONDARY_RELOAD_CLASS. If RCLASS contains r15, and we can't
2658 directly move X into it, use r1-r14 as a temporary. */
2659
2660 enum reg_class
2661 mcore_secondary_reload_class (enum reg_class rclass,
2662 enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
2663 {
2664 if (TEST_HARD_REG_BIT (reg_class_contents[rclass], 15)
2665 && !mcore_r15_operand_p (x))
2666 return LRW_REGS;
2667 return NO_REGS;
2668 }
2669
2670 /* Return the reg_class to use when reloading the rtx X into the class
2671 RCLASS. If X is too complex to move directly into r15, prefer to
2672 use LRW_REGS instead. */
2673
2674 enum reg_class
2675 mcore_reload_class (rtx x, enum reg_class rclass)
2676 {
2677 if (reg_class_subset_p (LRW_REGS, rclass) && !mcore_r15_operand_p (x))
2678 return LRW_REGS;
2679
2680 return rclass;
2681 }
2682
2683 /* Tell me if a pair of reg/subreg rtx's actually refer to the same
2684 register. Note that the current version doesn't worry about whether
2685 they are the same mode or note (e.g., a QImode in r2 matches an HImode
2686 in r2 matches an SImode in r2. Might think in the future about whether
2687 we want to be able to say something about modes. */
2688
2689 int
2690 mcore_is_same_reg (rtx x, rtx y)
2691 {
2692 /* Strip any and all of the subreg wrappers. */
2693 while (GET_CODE (x) == SUBREG)
2694 x = SUBREG_REG (x);
2695
2696 while (GET_CODE (y) == SUBREG)
2697 y = SUBREG_REG (y);
2698
2699 if (GET_CODE(x) == REG && GET_CODE(y) == REG && REGNO(x) == REGNO(y))
2700 return 1;
2701
2702 return 0;
2703 }
2704
2705 static void
2706 mcore_option_override (void)
2707 {
2708 /* Only the m340 supports little endian code. */
2709 if (TARGET_LITTLE_END && ! TARGET_M340)
2710 target_flags |= MASK_M340;
2711 }
2712
2713 \f
2714 /* Compute the number of word sized registers needed to
2715 hold a function argument of mode MODE and type TYPE. */
2716
2717 int
2718 mcore_num_arg_regs (enum machine_mode mode, const_tree type)
2719 {
2720 int size;
2721
2722 if (targetm.calls.must_pass_in_stack (mode, type))
2723 return 0;
2724
2725 if (type && mode == BLKmode)
2726 size = int_size_in_bytes (type);
2727 else
2728 size = GET_MODE_SIZE (mode);
2729
2730 return ROUND_ADVANCE (size);
2731 }
2732
2733 static rtx
2734 handle_structs_in_regs (enum machine_mode mode, const_tree type, int reg)
2735 {
2736 int size;
2737
2738 /* The MCore ABI defines that a structure whose size is not a whole multiple
2739 of bytes is passed packed into registers (or spilled onto the stack if
2740 not enough registers are available) with the last few bytes of the
2741 structure being packed, left-justified, into the last register/stack slot.
2742 GCC handles this correctly if the last word is in a stack slot, but we
2743 have to generate a special, PARALLEL RTX if the last word is in an
2744 argument register. */
2745 if (type
2746 && TYPE_MODE (type) == BLKmode
2747 && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
2748 && (size = int_size_in_bytes (type)) > UNITS_PER_WORD
2749 && (size % UNITS_PER_WORD != 0)
2750 && (reg + mcore_num_arg_regs (mode, type) <= (FIRST_PARM_REG + NPARM_REGS)))
2751 {
2752 rtx arg_regs [NPARM_REGS];
2753 int nregs;
2754 rtx result;
2755 rtvec rtvec;
2756
2757 for (nregs = 0; size > 0; size -= UNITS_PER_WORD)
2758 {
2759 arg_regs [nregs] =
2760 gen_rtx_EXPR_LIST (SImode, gen_rtx_REG (SImode, reg ++),
2761 GEN_INT (nregs * UNITS_PER_WORD));
2762 nregs ++;
2763 }
2764
2765 /* We assume here that NPARM_REGS == 6. The assert checks this. */
2766 gcc_assert (ARRAY_SIZE (arg_regs) == 6);
2767 rtvec = gen_rtvec (nregs, arg_regs[0], arg_regs[1], arg_regs[2],
2768 arg_regs[3], arg_regs[4], arg_regs[5]);
2769
2770 result = gen_rtx_PARALLEL (mode, rtvec);
2771 return result;
2772 }
2773
2774 return gen_rtx_REG (mode, reg);
2775 }
2776
2777 rtx
2778 mcore_function_value (const_tree valtype, const_tree func)
2779 {
2780 enum machine_mode mode;
2781 int unsigned_p;
2782
2783 mode = TYPE_MODE (valtype);
2784
2785 /* Since we promote return types, we must promote the mode here too. */
2786 mode = promote_function_mode (valtype, mode, &unsigned_p, func, 1);
2787
2788 return handle_structs_in_regs (mode, valtype, FIRST_RET_REG);
2789 }
2790
2791 /* Define where to put the arguments to a function.
2792 Value is zero to push the argument on the stack,
2793 or a hard register in which to store the argument.
2794
2795 MODE is the argument's machine mode.
2796 TYPE is the data type of the argument (as a tree).
2797 This is null for libcalls where that information may
2798 not be available.
2799 CUM is a variable of type CUMULATIVE_ARGS which gives info about
2800 the preceding args and about the function being called.
2801 NAMED is nonzero if this argument is a named parameter
2802 (otherwise it is an extra parameter matching an ellipsis).
2803
2804 On MCore the first args are normally in registers
2805 and the rest are pushed. Any arg that starts within the first
2806 NPARM_REGS words is at least partially passed in a register unless
2807 its data type forbids. */
2808
2809 static rtx
2810 mcore_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode,
2811 const_tree type, bool named)
2812 {
2813 int arg_reg;
2814
2815 if (! named || mode == VOIDmode)
2816 return 0;
2817
2818 if (targetm.calls.must_pass_in_stack (mode, type))
2819 return 0;
2820
2821 arg_reg = ROUND_REG (*cum, mode);
2822
2823 if (arg_reg < NPARM_REGS)
2824 return handle_structs_in_regs (mode, type, FIRST_PARM_REG + arg_reg);
2825
2826 return 0;
2827 }
2828
2829 static void
2830 mcore_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode,
2831 const_tree type, bool named ATTRIBUTE_UNUSED)
2832 {
2833 *cum = (ROUND_REG (*cum, mode)
2834 + (int)named * mcore_num_arg_regs (mode, type));
2835 }
2836
2837 static unsigned int
2838 mcore_function_arg_boundary (enum machine_mode mode,
2839 const_tree type ATTRIBUTE_UNUSED)
2840 {
2841 /* Doubles must be aligned to an 8 byte boundary. */
2842 return (mode != BLKmode && GET_MODE_SIZE (mode) == 8
2843 ? BIGGEST_ALIGNMENT
2844 : PARM_BOUNDARY);
2845 }
2846
2847 /* Returns the number of bytes of argument registers required to hold *part*
2848 of a parameter of machine mode MODE and type TYPE (which may be NULL if
2849 the type is not known). If the argument fits entirely in the argument
2850 registers, or entirely on the stack, then 0 is returned. CUM is the
2851 number of argument registers already used by earlier parameters to
2852 the function. */
2853
2854 static int
2855 mcore_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
2856 tree type, bool named)
2857 {
2858 int reg = ROUND_REG (*cum, mode);
2859
2860 if (named == 0)
2861 return 0;
2862
2863 if (targetm.calls.must_pass_in_stack (mode, type))
2864 return 0;
2865
2866 /* REG is not the *hardware* register number of the register that holds
2867 the argument, it is the *argument* register number. So for example,
2868 the first argument to a function goes in argument register 0, which
2869 translates (for the MCore) into hardware register 2. The second
2870 argument goes into argument register 1, which translates into hardware
2871 register 3, and so on. NPARM_REGS is the number of argument registers
2872 supported by the target, not the maximum hardware register number of
2873 the target. */
2874 if (reg >= NPARM_REGS)
2875 return 0;
2876
2877 /* If the argument fits entirely in registers, return 0. */
2878 if (reg + mcore_num_arg_regs (mode, type) <= NPARM_REGS)
2879 return 0;
2880
2881 /* The argument overflows the number of available argument registers.
2882 Compute how many argument registers have not yet been assigned to
2883 hold an argument. */
2884 reg = NPARM_REGS - reg;
2885
2886 /* Return partially in registers and partially on the stack. */
2887 return reg * UNITS_PER_WORD;
2888 }
2889 \f
2890 /* Return nonzero if SYMBOL is marked as being dllexport'd. */
2891
2892 int
2893 mcore_dllexport_name_p (const char * symbol)
2894 {
2895 return symbol[0] == '@' && symbol[1] == 'e' && symbol[2] == '.';
2896 }
2897
2898 /* Return nonzero if SYMBOL is marked as being dllimport'd. */
2899
2900 int
2901 mcore_dllimport_name_p (const char * symbol)
2902 {
2903 return symbol[0] == '@' && symbol[1] == 'i' && symbol[2] == '.';
2904 }
2905
2906 /* Mark a DECL as being dllexport'd. */
2907
2908 static void
2909 mcore_mark_dllexport (tree decl)
2910 {
2911 const char * oldname;
2912 char * newname;
2913 rtx rtlname;
2914 tree idp;
2915
2916 rtlname = XEXP (DECL_RTL (decl), 0);
2917
2918 if (GET_CODE (rtlname) == MEM)
2919 rtlname = XEXP (rtlname, 0);
2920 gcc_assert (GET_CODE (rtlname) == SYMBOL_REF);
2921 oldname = XSTR (rtlname, 0);
2922
2923 if (mcore_dllexport_name_p (oldname))
2924 return; /* Already done. */
2925
2926 newname = XALLOCAVEC (char, strlen (oldname) + 4);
2927 sprintf (newname, "@e.%s", oldname);
2928
2929 /* We pass newname through get_identifier to ensure it has a unique
2930 address. RTL processing can sometimes peek inside the symbol ref
2931 and compare the string's addresses to see if two symbols are
2932 identical. */
2933 /* ??? At least I think that's why we do this. */
2934 idp = get_identifier (newname);
2935
2936 XEXP (DECL_RTL (decl), 0) =
2937 gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp));
2938 }
2939
2940 /* Mark a DECL as being dllimport'd. */
2941
2942 static void
2943 mcore_mark_dllimport (tree decl)
2944 {
2945 const char * oldname;
2946 char * newname;
2947 tree idp;
2948 rtx rtlname;
2949 rtx newrtl;
2950
2951 rtlname = XEXP (DECL_RTL (decl), 0);
2952
2953 if (GET_CODE (rtlname) == MEM)
2954 rtlname = XEXP (rtlname, 0);
2955 gcc_assert (GET_CODE (rtlname) == SYMBOL_REF);
2956 oldname = XSTR (rtlname, 0);
2957
2958 gcc_assert (!mcore_dllexport_name_p (oldname));
2959 if (mcore_dllimport_name_p (oldname))
2960 return; /* Already done. */
2961
2962 /* ??? One can well ask why we're making these checks here,
2963 and that would be a good question. */
2964
2965 /* Imported variables can't be initialized. */
2966 if (TREE_CODE (decl) == VAR_DECL
2967 && !DECL_VIRTUAL_P (decl)
2968 && DECL_INITIAL (decl))
2969 {
2970 error ("initialized variable %q+D is marked dllimport", decl);
2971 return;
2972 }
2973
2974 /* `extern' needn't be specified with dllimport.
2975 Specify `extern' now and hope for the best. Sigh. */
2976 if (TREE_CODE (decl) == VAR_DECL
2977 /* ??? Is this test for vtables needed? */
2978 && !DECL_VIRTUAL_P (decl))
2979 {
2980 DECL_EXTERNAL (decl) = 1;
2981 TREE_PUBLIC (decl) = 1;
2982 }
2983
2984 newname = XALLOCAVEC (char, strlen (oldname) + 11);
2985 sprintf (newname, "@i.__imp_%s", oldname);
2986
2987 /* We pass newname through get_identifier to ensure it has a unique
2988 address. RTL processing can sometimes peek inside the symbol ref
2989 and compare the string's addresses to see if two symbols are
2990 identical. */
2991 /* ??? At least I think that's why we do this. */
2992 idp = get_identifier (newname);
2993
2994 newrtl = gen_rtx_MEM (Pmode,
2995 gen_rtx_SYMBOL_REF (Pmode,
2996 IDENTIFIER_POINTER (idp)));
2997 XEXP (DECL_RTL (decl), 0) = newrtl;
2998 }
2999
3000 static int
3001 mcore_dllexport_p (tree decl)
3002 {
3003 if ( TREE_CODE (decl) != VAR_DECL
3004 && TREE_CODE (decl) != FUNCTION_DECL)
3005 return 0;
3006
3007 return lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)) != 0;
3008 }
3009
3010 static int
3011 mcore_dllimport_p (tree decl)
3012 {
3013 if ( TREE_CODE (decl) != VAR_DECL
3014 && TREE_CODE (decl) != FUNCTION_DECL)
3015 return 0;
3016
3017 return lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl)) != 0;
3018 }
3019
3020 /* We must mark dll symbols specially. Definitions of dllexport'd objects
3021 install some info in the .drective (PE) or .exports (ELF) sections. */
3022
3023 static void
3024 mcore_encode_section_info (tree decl, rtx rtl ATTRIBUTE_UNUSED, int first ATTRIBUTE_UNUSED)
3025 {
3026 /* Mark the decl so we can tell from the rtl whether the object is
3027 dllexport'd or dllimport'd. */
3028 if (mcore_dllexport_p (decl))
3029 mcore_mark_dllexport (decl);
3030 else if (mcore_dllimport_p (decl))
3031 mcore_mark_dllimport (decl);
3032
3033 /* It might be that DECL has already been marked as dllimport, but
3034 a subsequent definition nullified that. The attribute is gone
3035 but DECL_RTL still has @i.__imp_foo. We need to remove that. */
3036 else if ((TREE_CODE (decl) == FUNCTION_DECL
3037 || TREE_CODE (decl) == VAR_DECL)
3038 && DECL_RTL (decl) != NULL_RTX
3039 && GET_CODE (DECL_RTL (decl)) == MEM
3040 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == MEM
3041 && GET_CODE (XEXP (XEXP (DECL_RTL (decl), 0), 0)) == SYMBOL_REF
3042 && mcore_dllimport_name_p (XSTR (XEXP (XEXP (DECL_RTL (decl), 0), 0), 0)))
3043 {
3044 const char * oldname = XSTR (XEXP (XEXP (DECL_RTL (decl), 0), 0), 0);
3045 tree idp = get_identifier (oldname + 9);
3046 rtx newrtl = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp));
3047
3048 XEXP (DECL_RTL (decl), 0) = newrtl;
3049
3050 /* We previously set TREE_PUBLIC and DECL_EXTERNAL.
3051 ??? We leave these alone for now. */
3052 }
3053 }
3054
3055 /* Undo the effects of the above. */
3056
3057 static const char *
3058 mcore_strip_name_encoding (const char * str)
3059 {
3060 return str + (str[0] == '@' ? 3 : 0);
3061 }
3062
3063 /* MCore specific attribute support.
3064 dllexport - for exporting a function/variable that will live in a dll
3065 dllimport - for importing a function/variable from a dll
3066 naked - do not create a function prologue/epilogue. */
3067
3068 /* Handle a "naked" attribute; arguments as in
3069 struct attribute_spec.handler. */
3070
3071 static tree
3072 mcore_handle_naked_attribute (tree * node, tree name, tree args ATTRIBUTE_UNUSED,
3073 int flags ATTRIBUTE_UNUSED, bool * no_add_attrs)
3074 {
3075 if (TREE_CODE (*node) == FUNCTION_DECL)
3076 {
3077 /* PR14310 - don't complain about lack of return statement
3078 in naked functions. The solution here is a gross hack
3079 but this is the only way to solve the problem without
3080 adding a new feature to GCC. I did try submitting a patch
3081 that would add such a new feature, but it was (rightfully)
3082 rejected on the grounds that it was creeping featurism,
3083 so hence this code. */
3084 if (warn_return_type)
3085 {
3086 saved_warn_return_type = warn_return_type;
3087 warn_return_type = 0;
3088 saved_warn_return_type_count = 2;
3089 }
3090 else if (saved_warn_return_type_count)
3091 saved_warn_return_type_count = 2;
3092 }
3093 else
3094 {
3095 warning (OPT_Wattributes, "%qE attribute only applies to functions",
3096 name);
3097 *no_add_attrs = true;
3098 }
3099
3100 return NULL_TREE;
3101 }
3102
3103 /* ??? It looks like this is PE specific? Oh well, this is what the
3104 old code did as well. */
3105
3106 static void
3107 mcore_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
3108 {
3109 int len;
3110 const char * name;
3111 char * string;
3112 const char * prefix;
3113
3114 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
3115
3116 /* Strip off any encoding in name. */
3117 name = (* targetm.strip_name_encoding) (name);
3118
3119 /* The object is put in, for example, section .text$foo.
3120 The linker will then ultimately place them in .text
3121 (everything from the $ on is stripped). */
3122 if (TREE_CODE (decl) == FUNCTION_DECL)
3123 prefix = ".text$";
3124 /* For compatibility with EPOC, we ignore the fact that the
3125 section might have relocs against it. */
3126 else if (decl_readonly_section (decl, 0))
3127 prefix = ".rdata$";
3128 else
3129 prefix = ".data$";
3130
3131 len = strlen (name) + strlen (prefix);
3132 string = XALLOCAVEC (char, len + 1);
3133
3134 sprintf (string, "%s%s", prefix, name);
3135
3136 DECL_SECTION_NAME (decl) = build_string (len, string);
3137 }
3138
3139 int
3140 mcore_naked_function_p (void)
3141 {
3142 return lookup_attribute ("naked", DECL_ATTRIBUTES (current_function_decl)) != NULL_TREE;
3143 }
3144
3145 #ifdef OBJECT_FORMAT_ELF
3146 static void
3147 mcore_asm_named_section (const char *name,
3148 unsigned int flags ATTRIBUTE_UNUSED,
3149 tree decl ATTRIBUTE_UNUSED)
3150 {
3151 fprintf (asm_out_file, "\t.section %s\n", name);
3152 }
3153 #endif /* OBJECT_FORMAT_ELF */
3154
3155 /* Worker function for TARGET_ASM_EXTERNAL_LIBCALL. */
3156
3157 static void
3158 mcore_external_libcall (rtx fun)
3159 {
3160 fprintf (asm_out_file, "\t.import\t");
3161 assemble_name (asm_out_file, XSTR (fun, 0));
3162 fprintf (asm_out_file, "\n");
3163 }
3164
3165 /* Worker function for TARGET_RETURN_IN_MEMORY. */
3166
3167 static bool
3168 mcore_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
3169 {
3170 const HOST_WIDE_INT size = int_size_in_bytes (type);
3171 return (size == -1 || size > 2 * UNITS_PER_WORD);
3172 }
3173
3174 /* Worker function for TARGET_ASM_TRAMPOLINE_TEMPLATE.
3175 Output assembler code for a block containing the constant parts
3176 of a trampoline, leaving space for the variable parts.
3177
3178 On the MCore, the trampoline looks like:
3179 lrw r1, function
3180 lrw r13, area
3181 jmp r13
3182 or r0, r0
3183 .literals */
3184
3185 static void
3186 mcore_asm_trampoline_template (FILE *f)
3187 {
3188 fprintf (f, "\t.short 0x7102\n");
3189 fprintf (f, "\t.short 0x7d02\n");
3190 fprintf (f, "\t.short 0x00cd\n");
3191 fprintf (f, "\t.short 0x1e00\n");
3192 fprintf (f, "\t.long 0\n");
3193 fprintf (f, "\t.long 0\n");
3194 }
3195
3196 /* Worker function for TARGET_TRAMPOLINE_INIT. */
3197
3198 static void
3199 mcore_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
3200 {
3201 rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
3202 rtx mem;
3203
3204 emit_block_move (m_tramp, assemble_trampoline_template (),
3205 GEN_INT (2*UNITS_PER_WORD), BLOCK_OP_NORMAL);
3206
3207 mem = adjust_address (m_tramp, SImode, 8);
3208 emit_move_insn (mem, chain_value);
3209 mem = adjust_address (m_tramp, SImode, 12);
3210 emit_move_insn (mem, fnaddr);
3211 }
3212
3213 /* Implement TARGET_LEGITIMATE_CONSTANT_P
3214
3215 On the MCore, allow anything but a double. */
3216
3217 static bool
3218 mcore_legitimate_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
3219 {
3220 return GET_CODE (x) != CONST_DOUBLE;
3221 }