s390.c (s390_alloc_pool, [...]): Use BITMAP_ALLOC and BITMAP_FREE.
[gcc.git] / gcc / config / frv / frv.c
1 /* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
2 Free Software Foundation, Inc.
3 Contributed by Red Hat, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "rtl.h"
27 #include "tree.h"
28 #include "regs.h"
29 #include "hard-reg-set.h"
30 #include "real.h"
31 #include "insn-config.h"
32 #include "conditions.h"
33 #include "insn-flags.h"
34 #include "output.h"
35 #include "insn-attr.h"
36 #include "flags.h"
37 #include "recog.h"
38 #include "reload.h"
39 #include "expr.h"
40 #include "obstack.h"
41 #include "except.h"
42 #include "function.h"
43 #include "optabs.h"
44 #include "toplev.h"
45 #include "basic-block.h"
46 #include "tm_p.h"
47 #include "ggc.h"
48 #include <ctype.h>
49 #include "target.h"
50 #include "target-def.h"
51 #include "targhooks.h"
52 #include "integrate.h"
53 #include "langhooks.h"
54
55 #ifndef FRV_INLINE
56 #define FRV_INLINE inline
57 #endif
58
59 /* The maximum number of distinct NOP patterns. There are three:
60 nop, fnop and mnop. */
61 #define NUM_NOP_PATTERNS 3
62
63 /* Classification of instructions and units: integer, floating-point/media,
64 branch and control. */
65 enum frv_insn_group { GROUP_I, GROUP_FM, GROUP_B, GROUP_C, NUM_GROUPS };
66
67 /* The DFA names of the units, in packet order. */
68 static const char *const frv_unit_names[] =
69 {
70 "c",
71 "i0", "f0",
72 "i1", "f1",
73 "i2", "f2",
74 "i3", "f3",
75 "b0", "b1"
76 };
77
78 /* The classification of each unit in frv_unit_names[]. */
79 static const enum frv_insn_group frv_unit_groups[ARRAY_SIZE (frv_unit_names)] =
80 {
81 GROUP_C,
82 GROUP_I, GROUP_FM,
83 GROUP_I, GROUP_FM,
84 GROUP_I, GROUP_FM,
85 GROUP_I, GROUP_FM,
86 GROUP_B, GROUP_B
87 };
88
89 /* Return the DFA unit code associated with the Nth unit of integer
90 or floating-point group GROUP, */
91 #define NTH_UNIT(GROUP, N) frv_unit_codes[(GROUP) + (N) * 2 + 1]
92
93 /* Return the number of integer or floating-point unit UNIT
94 (1 for I1, 2 for F2, etc.). */
95 #define UNIT_NUMBER(UNIT) (((UNIT) - 1) / 2)
96
97 /* The DFA unit number for each unit in frv_unit_names[]. */
98 static int frv_unit_codes[ARRAY_SIZE (frv_unit_names)];
99
100 /* FRV_TYPE_TO_UNIT[T] is the last unit in frv_unit_names[] that can issue
101 an instruction of type T. The value is ARRAY_SIZE (frv_unit_names) if
102 no instruction of type T has been seen. */
103 static unsigned int frv_type_to_unit[TYPE_UNKNOWN + 1];
104
105 /* An array of dummy nop INSNs, one for each type of nop that the
106 target supports. */
107 static GTY(()) rtx frv_nops[NUM_NOP_PATTERNS];
108
109 /* The number of nop instructions in frv_nops[]. */
110 static unsigned int frv_num_nops;
111
112 /* Return true if instruction INSN should be packed with the following
113 instruction. */
114 #define PACKING_FLAG_P(INSN) (GET_MODE (INSN) == TImode)
115
116 /* Set the value of PACKING_FLAG_P(INSN). */
117 #define SET_PACKING_FLAG(INSN) PUT_MODE (INSN, TImode)
118 #define CLEAR_PACKING_FLAG(INSN) PUT_MODE (INSN, VOIDmode)
119
120 /* Loop with REG set to each hard register in rtx X. */
121 #define FOR_EACH_REGNO(REG, X) \
122 for (REG = REGNO (X); \
123 REG < REGNO (X) + HARD_REGNO_NREGS (REGNO (X), GET_MODE (X)); \
124 REG++)
125
126 /* Information about a relocation unspec. SYMBOL is the relocation symbol
127 (a SYMBOL_REF or LABEL_REF), RELOC is the type of relocation and OFFSET
128 is the constant addend. */
129 struct frv_unspec {
130 rtx symbol;
131 int reloc;
132 HOST_WIDE_INT offset;
133 };
134
135 /* Temporary register allocation support structure. */
136 typedef struct frv_tmp_reg_struct
137 {
138 HARD_REG_SET regs; /* possible registers to allocate */
139 int next_reg[N_REG_CLASSES]; /* next register to allocate per class */
140 }
141 frv_tmp_reg_t;
142
143 /* Register state information for VLIW re-packing phase. */
144 #define REGSTATE_CC_MASK 0x07 /* Mask to isolate CCn for cond exec */
145 #define REGSTATE_MODIFIED 0x08 /* reg modified in current VLIW insn */
146 #define REGSTATE_IF_TRUE 0x10 /* reg modified in cond exec true */
147 #define REGSTATE_IF_FALSE 0x20 /* reg modified in cond exec false */
148
149 #define REGSTATE_IF_EITHER (REGSTATE_IF_TRUE | REGSTATE_IF_FALSE)
150
151 typedef unsigned char regstate_t;
152
153 /* Used in frv_frame_accessor_t to indicate the direction of a register-to-
154 memory move. */
155 enum frv_stack_op
156 {
157 FRV_LOAD,
158 FRV_STORE
159 };
160
161 /* Information required by frv_frame_access. */
162 typedef struct
163 {
164 /* This field is FRV_LOAD if registers are to be loaded from the stack and
165 FRV_STORE if they should be stored onto the stack. FRV_STORE implies
166 the move is being done by the prologue code while FRV_LOAD implies it
167 is being done by the epilogue. */
168 enum frv_stack_op op;
169
170 /* The base register to use when accessing the stack. This may be the
171 frame pointer, stack pointer, or a temporary. The choice of register
172 depends on which part of the frame is being accessed and how big the
173 frame is. */
174 rtx base;
175
176 /* The offset of BASE from the bottom of the current frame, in bytes. */
177 int base_offset;
178 } frv_frame_accessor_t;
179
180 /* Define the information needed to generate branch and scc insns. This is
181 stored from the compare operation. */
182 rtx frv_compare_op0;
183 rtx frv_compare_op1;
184
185 /* Conditional execution support gathered together in one structure. */
186 typedef struct
187 {
188 /* Linked list of insns to add if the conditional execution conversion was
189 successful. Each link points to an EXPR_LIST which points to the pattern
190 of the insn to add, and the insn to be inserted before. */
191 rtx added_insns_list;
192
193 /* Identify which registers are safe to allocate for if conversions to
194 conditional execution. We keep the last allocated register in the
195 register classes between COND_EXEC statements. This will mean we allocate
196 different registers for each different COND_EXEC group if we can. This
197 might allow the scheduler to intermix two different COND_EXEC sections. */
198 frv_tmp_reg_t tmp_reg;
199
200 /* For nested IFs, identify which CC registers are used outside of setting
201 via a compare isnsn, and using via a check insn. This will allow us to
202 know if we can rewrite the register to use a different register that will
203 be paired with the CR register controlling the nested IF-THEN blocks. */
204 HARD_REG_SET nested_cc_ok_rewrite;
205
206 /* Temporary registers allocated to hold constants during conditional
207 execution. */
208 rtx scratch_regs[FIRST_PSEUDO_REGISTER];
209
210 /* Current number of temp registers available. */
211 int cur_scratch_regs;
212
213 /* Number of nested conditional execution blocks. */
214 int num_nested_cond_exec;
215
216 /* Map of insns that set up constants in scratch registers. */
217 bitmap scratch_insns_bitmap;
218
219 /* Conditional execution test register (CC0..CC7). */
220 rtx cr_reg;
221
222 /* Conditional execution compare register that is paired with cr_reg, so that
223 nested compares can be done. The csubcc and caddcc instructions don't
224 have enough bits to specify both a CC register to be set and a CR register
225 to do the test on, so the same bit number is used for both. Needless to
226 say, this is rather inconvenient for GCC. */
227 rtx nested_cc_reg;
228
229 /* Extra CR registers used for &&, ||. */
230 rtx extra_int_cr;
231 rtx extra_fp_cr;
232
233 /* Previous CR used in nested if, to make sure we are dealing with the same
234 nested if as the previous statement. */
235 rtx last_nested_if_cr;
236 }
237 frv_ifcvt_t;
238
239 static /* GTY(()) */ frv_ifcvt_t frv_ifcvt;
240
241 /* Map register number to smallest register class. */
242 enum reg_class regno_reg_class[FIRST_PSEUDO_REGISTER];
243
244 /* Map class letter into register class. */
245 enum reg_class reg_class_from_letter[256];
246
247 /* Cached value of frv_stack_info. */
248 static frv_stack_t *frv_stack_cache = (frv_stack_t *)0;
249
250 /* -mbranch-cost= support */
251 const char *frv_branch_cost_string;
252 int frv_branch_cost_int = DEFAULT_BRANCH_COST;
253
254 /* -mcpu= support */
255 const char *frv_cpu_string; /* -mcpu= option */
256 frv_cpu_t frv_cpu_type = CPU_TYPE; /* value of -mcpu= */
257
258 /* -mcond-exec-insns= support */
259 const char *frv_condexec_insns_str; /* -mcond-exec-insns= option */
260 int frv_condexec_insns = DEFAULT_CONDEXEC_INSNS; /* value of -mcond-exec-insns*/
261
262 /* -mcond-exec-temps= support */
263 const char *frv_condexec_temps_str; /* -mcond-exec-temps= option */
264 int frv_condexec_temps = DEFAULT_CONDEXEC_TEMPS; /* value of -mcond-exec-temps*/
265
266 /* -msched-lookahead=n */
267 const char *frv_sched_lookahead_str; /* -msched-lookahead=n */
268 int frv_sched_lookahead = 4; /* -msched-lookahead=n */
269
270 /* Forward references */
271 static int frv_default_flags_for_cpu (void);
272 static int frv_string_begins_with (tree, const char *);
273 static FRV_INLINE bool frv_small_data_reloc_p (rtx, int);
274 static FRV_INLINE bool frv_const_unspec_p (rtx, struct frv_unspec *);
275 static void frv_print_operand_memory_reference_reg
276 (FILE *, rtx);
277 static void frv_print_operand_memory_reference (FILE *, rtx, int);
278 static int frv_print_operand_jump_hint (rtx);
279 static const char *comparison_string (enum rtx_code, rtx);
280 static FRV_INLINE int frv_regno_ok_for_base_p (int, int);
281 static rtx single_set_pattern (rtx);
282 static int frv_function_contains_far_jump (void);
283 static rtx frv_alloc_temp_reg (frv_tmp_reg_t *,
284 enum reg_class,
285 enum machine_mode,
286 int, int);
287 static rtx frv_frame_offset_rtx (int);
288 static rtx frv_frame_mem (enum machine_mode, rtx, int);
289 static rtx frv_dwarf_store (rtx, int);
290 static void frv_frame_insn (rtx, rtx);
291 static void frv_frame_access (frv_frame_accessor_t*,
292 rtx, int);
293 static void frv_frame_access_multi (frv_frame_accessor_t*,
294 frv_stack_t *, int);
295 static void frv_frame_access_standard_regs (enum frv_stack_op,
296 frv_stack_t *);
297 static struct machine_function *frv_init_machine_status (void);
298 static int frv_legitimate_memory_operand (rtx, enum machine_mode, int);
299 static rtx frv_int_to_acc (enum insn_code, int, rtx);
300 static enum machine_mode frv_matching_accg_mode (enum machine_mode);
301 static rtx frv_read_argument (tree *);
302 static rtx frv_read_iacc_argument (enum machine_mode, tree *);
303 static int frv_check_constant_argument (enum insn_code, int, rtx);
304 static rtx frv_legitimize_target (enum insn_code, rtx);
305 static rtx frv_legitimize_argument (enum insn_code, int, rtx);
306 static rtx frv_legitimize_tls_address (rtx, enum tls_model);
307 static rtx frv_expand_set_builtin (enum insn_code, tree, rtx);
308 static rtx frv_expand_unop_builtin (enum insn_code, tree, rtx);
309 static rtx frv_expand_binop_builtin (enum insn_code, tree, rtx);
310 static rtx frv_expand_cut_builtin (enum insn_code, tree, rtx);
311 static rtx frv_expand_binopimm_builtin (enum insn_code, tree, rtx);
312 static rtx frv_expand_voidbinop_builtin (enum insn_code, tree);
313 static rtx frv_expand_int_void2arg (enum insn_code, tree);
314 static rtx frv_expand_prefetches (enum insn_code, tree);
315 static rtx frv_expand_voidtriop_builtin (enum insn_code, tree);
316 static rtx frv_expand_voidaccop_builtin (enum insn_code, tree);
317 static rtx frv_expand_mclracc_builtin (tree);
318 static rtx frv_expand_mrdacc_builtin (enum insn_code, tree);
319 static rtx frv_expand_mwtacc_builtin (enum insn_code, tree);
320 static rtx frv_expand_noargs_builtin (enum insn_code);
321 static void frv_split_iacc_move (rtx, rtx);
322 static rtx frv_emit_comparison (enum rtx_code, rtx, rtx);
323 static int frv_clear_registers_used (rtx *, void *);
324 static void frv_ifcvt_add_insn (rtx, rtx, int);
325 static rtx frv_ifcvt_rewrite_mem (rtx, enum machine_mode, rtx);
326 static rtx frv_ifcvt_load_value (rtx, rtx);
327 static int frv_acc_group_1 (rtx *, void *);
328 static unsigned int frv_insn_unit (rtx);
329 static bool frv_issues_to_branch_unit_p (rtx);
330 static int frv_cond_flags (rtx);
331 static bool frv_regstate_conflict_p (regstate_t, regstate_t);
332 static int frv_registers_conflict_p_1 (rtx *, void *);
333 static bool frv_registers_conflict_p (rtx);
334 static void frv_registers_update_1 (rtx, rtx, void *);
335 static void frv_registers_update (rtx);
336 static void frv_start_packet (void);
337 static void frv_start_packet_block (void);
338 static void frv_finish_packet (void (*) (void));
339 static bool frv_pack_insn_p (rtx);
340 static void frv_add_insn_to_packet (rtx);
341 static void frv_insert_nop_in_packet (rtx);
342 static bool frv_for_each_packet (void (*) (void));
343 static bool frv_sort_insn_group_1 (enum frv_insn_group,
344 unsigned int, unsigned int,
345 unsigned int, unsigned int,
346 state_t);
347 static int frv_compare_insns (const void *, const void *);
348 static void frv_sort_insn_group (enum frv_insn_group);
349 static void frv_reorder_packet (void);
350 static void frv_fill_unused_units (enum frv_insn_group);
351 static void frv_align_label (void);
352 static void frv_reorg_packet (void);
353 static void frv_register_nop (rtx);
354 static void frv_reorg (void);
355 static void frv_pack_insns (void);
356 static void frv_function_prologue (FILE *, HOST_WIDE_INT);
357 static void frv_function_epilogue (FILE *, HOST_WIDE_INT);
358 static bool frv_assemble_integer (rtx, unsigned, int);
359 static void frv_init_builtins (void);
360 static rtx frv_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
361 static void frv_init_libfuncs (void);
362 static bool frv_in_small_data_p (tree);
363 static void frv_asm_output_mi_thunk
364 (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT, tree);
365 static void frv_setup_incoming_varargs (CUMULATIVE_ARGS *,
366 enum machine_mode,
367 tree, int *, int);
368 static rtx frv_expand_builtin_saveregs (void);
369 static bool frv_rtx_costs (rtx, int, int, int*);
370 static void frv_asm_out_constructor (rtx, int);
371 static void frv_asm_out_destructor (rtx, int);
372 static bool frv_function_symbol_referenced_p (rtx);
373 static bool frv_cannot_force_const_mem (rtx);
374 static const char *unspec_got_name (int);
375 static void frv_output_const_unspec (FILE *,
376 const struct frv_unspec *);
377 static bool frv_function_ok_for_sibcall (tree, tree);
378 static rtx frv_struct_value_rtx (tree, int);
379 static bool frv_must_pass_in_stack (enum machine_mode mode, tree type);
380 static int frv_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
381 tree, bool);
382 \f
383 /* Initialize the GCC target structure. */
384 #undef TARGET_ASM_FUNCTION_PROLOGUE
385 #define TARGET_ASM_FUNCTION_PROLOGUE frv_function_prologue
386 #undef TARGET_ASM_FUNCTION_EPILOGUE
387 #define TARGET_ASM_FUNCTION_EPILOGUE frv_function_epilogue
388 #undef TARGET_ASM_INTEGER
389 #define TARGET_ASM_INTEGER frv_assemble_integer
390 #undef TARGET_INIT_BUILTINS
391 #define TARGET_INIT_BUILTINS frv_init_builtins
392 #undef TARGET_EXPAND_BUILTIN
393 #define TARGET_EXPAND_BUILTIN frv_expand_builtin
394 #undef TARGET_INIT_LIBFUNCS
395 #define TARGET_INIT_LIBFUNCS frv_init_libfuncs
396 #undef TARGET_IN_SMALL_DATA_P
397 #define TARGET_IN_SMALL_DATA_P frv_in_small_data_p
398 #undef TARGET_RTX_COSTS
399 #define TARGET_RTX_COSTS frv_rtx_costs
400 #undef TARGET_ASM_CONSTRUCTOR
401 #define TARGET_ASM_CONSTRUCTOR frv_asm_out_constructor
402 #undef TARGET_ASM_DESTRUCTOR
403 #define TARGET_ASM_DESTRUCTOR frv_asm_out_destructor
404
405 #undef TARGET_ASM_OUTPUT_MI_THUNK
406 #define TARGET_ASM_OUTPUT_MI_THUNK frv_asm_output_mi_thunk
407 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
408 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
409
410 #undef TARGET_SCHED_ISSUE_RATE
411 #define TARGET_SCHED_ISSUE_RATE frv_issue_rate
412
413 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
414 #define TARGET_FUNCTION_OK_FOR_SIBCALL frv_function_ok_for_sibcall
415 #undef TARGET_CANNOT_FORCE_CONST_MEM
416 #define TARGET_CANNOT_FORCE_CONST_MEM frv_cannot_force_const_mem
417
418 #undef TARGET_HAVE_TLS
419 #define TARGET_HAVE_TLS HAVE_AS_TLS
420
421 #undef TARGET_STRUCT_VALUE_RTX
422 #define TARGET_STRUCT_VALUE_RTX frv_struct_value_rtx
423 #undef TARGET_MUST_PASS_IN_STACK
424 #define TARGET_MUST_PASS_IN_STACK frv_must_pass_in_stack
425 #undef TARGET_PASS_BY_REFERENCE
426 #define TARGET_PASS_BY_REFERENCE hook_pass_by_reference_must_pass_in_stack
427 #undef TARGET_ARG_PARTIAL_BYTES
428 #define TARGET_ARG_PARTIAL_BYTES frv_arg_partial_bytes
429
430 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
431 #define TARGET_EXPAND_BUILTIN_SAVEREGS frv_expand_builtin_saveregs
432 #undef TARGET_SETUP_INCOMING_VARARGS
433 #define TARGET_SETUP_INCOMING_VARARGS frv_setup_incoming_varargs
434 #undef TARGET_MACHINE_DEPENDENT_REORG
435 #define TARGET_MACHINE_DEPENDENT_REORG frv_reorg
436
437 struct gcc_target targetm = TARGET_INITIALIZER;
438
439 #define FRV_SYMBOL_REF_TLS_P(RTX) \
440 (GET_CODE (RTX) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (RTX) != 0)
441
442 \f
443 /* Any function call that satisfies the machine-independent
444 requirements is eligible on FR-V. */
445
446 static bool
447 frv_function_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED,
448 tree exp ATTRIBUTE_UNUSED)
449 {
450 return true;
451 }
452
453 /* Return true if SYMBOL is a small data symbol and relocation RELOC
454 can be used to access it directly in a load or store. */
455
456 static FRV_INLINE bool
457 frv_small_data_reloc_p (rtx symbol, int reloc)
458 {
459 return (GET_CODE (symbol) == SYMBOL_REF
460 && SYMBOL_REF_SMALL_P (symbol)
461 && (!TARGET_FDPIC || flag_pic == 1)
462 && (reloc == R_FRV_GOTOFF12 || reloc == R_FRV_GPREL12));
463 }
464
465 /* Return true if X is a valid relocation unspec. If it is, fill in UNSPEC
466 appropriately. */
467
468 static FRV_INLINE bool
469 frv_const_unspec_p (rtx x, struct frv_unspec *unspec)
470 {
471 if (GET_CODE (x) == CONST)
472 {
473 unspec->offset = 0;
474 x = XEXP (x, 0);
475 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
476 {
477 unspec->offset += INTVAL (XEXP (x, 1));
478 x = XEXP (x, 0);
479 }
480 if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_GOT)
481 {
482 unspec->symbol = XVECEXP (x, 0, 0);
483 unspec->reloc = INTVAL (XVECEXP (x, 0, 1));
484
485 if (unspec->offset == 0)
486 return true;
487
488 if (frv_small_data_reloc_p (unspec->symbol, unspec->reloc)
489 && unspec->offset > 0
490 && (unsigned HOST_WIDE_INT) unspec->offset < g_switch_value)
491 return true;
492 }
493 }
494 return false;
495 }
496
497 /* Decide whether we can force certain constants to memory. If we
498 decide we can't, the caller should be able to cope with it in
499 another way.
500
501 We never allow constants to be forced into memory for TARGET_FDPIC.
502 This is necessary for several reasons:
503
504 1. Since LEGITIMATE_CONSTANT_P rejects constant pool addresses, the
505 target-independent code will try to force them into the constant
506 pool, thus leading to infinite recursion.
507
508 2. We can never introduce new constant pool references during reload.
509 Any such reference would require use of the pseudo FDPIC register.
510
511 3. We can't represent a constant added to a function pointer (which is
512 not the same as a pointer to a function+constant).
513
514 4. In many cases, it's more efficient to calculate the constant in-line. */
515
516 static bool
517 frv_cannot_force_const_mem (rtx x ATTRIBUTE_UNUSED)
518 {
519 return TARGET_FDPIC;
520 }
521 \f
522 static int
523 frv_default_flags_for_cpu (void)
524 {
525 switch (frv_cpu_type)
526 {
527 case FRV_CPU_GENERIC:
528 return MASK_DEFAULT_FRV;
529
530 case FRV_CPU_FR550:
531 return MASK_DEFAULT_FR550;
532
533 case FRV_CPU_FR500:
534 case FRV_CPU_TOMCAT:
535 return MASK_DEFAULT_FR500;
536
537 case FRV_CPU_FR450:
538 return MASK_DEFAULT_FR450;
539
540 case FRV_CPU_FR405:
541 case FRV_CPU_FR400:
542 return MASK_DEFAULT_FR400;
543
544 case FRV_CPU_FR300:
545 case FRV_CPU_SIMPLE:
546 return MASK_DEFAULT_SIMPLE;
547 }
548 abort ();
549 }
550
551 /* Sometimes certain combinations of command options do not make
552 sense on a particular target machine. You can define a macro
553 `OVERRIDE_OPTIONS' to take account of this. This macro, if
554 defined, is executed once just after all the command options have
555 been parsed.
556
557 Don't use this macro to turn on various extra optimizations for
558 `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */
559
560 void
561 frv_override_options (void)
562 {
563 int regno;
564 unsigned int i;
565
566 /* Set the cpu type. */
567 if (frv_cpu_string)
568 {
569 if (strcmp (frv_cpu_string, "simple") == 0)
570 frv_cpu_type = FRV_CPU_SIMPLE;
571
572 else if (strcmp (frv_cpu_string, "tomcat") == 0)
573 frv_cpu_type = FRV_CPU_TOMCAT;
574
575 else if (strncmp (frv_cpu_string, "fr", sizeof ("fr")-1) != 0)
576 error ("Unknown cpu: -mcpu=%s", frv_cpu_string);
577
578 else
579 {
580 const char *p = frv_cpu_string + sizeof ("fr") - 1;
581 if (strcmp (p, "550") == 0)
582 frv_cpu_type = FRV_CPU_FR550;
583
584 else if (strcmp (p, "500") == 0)
585 frv_cpu_type = FRV_CPU_FR500;
586
587 else if (strcmp (p, "450") == 0)
588 frv_cpu_type = FRV_CPU_FR450;
589
590 else if (strcmp (p, "405") == 0)
591 frv_cpu_type = FRV_CPU_FR405;
592
593 else if (strcmp (p, "400") == 0)
594 frv_cpu_type = FRV_CPU_FR400;
595
596 else if (strcmp (p, "300") == 0)
597 frv_cpu_type = FRV_CPU_FR300;
598
599 else if (strcmp (p, "v") == 0)
600 frv_cpu_type = FRV_CPU_GENERIC;
601
602 else
603 error ("Unknown cpu: -mcpu=%s", frv_cpu_string);
604 }
605 }
606
607 target_flags |= (frv_default_flags_for_cpu () & ~target_flags_explicit);
608
609 /* -mlibrary-pic sets -fPIC and -G0 and also suppresses warnings from the
610 linker about linking pic and non-pic code. */
611 if (TARGET_LIBPIC)
612 {
613 if (!flag_pic) /* -fPIC */
614 flag_pic = 2;
615
616 if (! g_switch_set) /* -G0 */
617 {
618 g_switch_set = 1;
619 g_switch_value = 0;
620 }
621 }
622
623 /* Change the branch cost value. */
624 if (frv_branch_cost_string)
625 frv_branch_cost_int = atoi (frv_branch_cost_string);
626
627 /* Change the # of insns to be converted to conditional execution. */
628 if (frv_condexec_insns_str)
629 frv_condexec_insns = atoi (frv_condexec_insns_str);
630
631 /* Change # of temporary registers used to hold integer constants. */
632 if (frv_condexec_temps_str)
633 frv_condexec_temps = atoi (frv_condexec_temps_str);
634
635 /* Change scheduling look ahead. */
636 if (frv_sched_lookahead_str)
637 frv_sched_lookahead = atoi (frv_sched_lookahead_str);
638
639 /* A C expression whose value is a register class containing hard
640 register REGNO. In general there is more than one such class;
641 choose a class which is "minimal", meaning that no smaller class
642 also contains the register. */
643
644 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
645 {
646 enum reg_class class;
647
648 if (GPR_P (regno))
649 {
650 int gpr_reg = regno - GPR_FIRST;
651
652 if (gpr_reg == GR8_REG)
653 class = GR8_REGS;
654
655 else if (gpr_reg == GR9_REG)
656 class = GR9_REGS;
657
658 else if (gpr_reg == GR14_REG)
659 class = FDPIC_FPTR_REGS;
660
661 else if (gpr_reg == FDPIC_REGNO)
662 class = FDPIC_REGS;
663
664 else if ((gpr_reg & 3) == 0)
665 class = QUAD_REGS;
666
667 else if ((gpr_reg & 1) == 0)
668 class = EVEN_REGS;
669
670 else
671 class = GPR_REGS;
672 }
673
674 else if (FPR_P (regno))
675 {
676 int fpr_reg = regno - GPR_FIRST;
677 if ((fpr_reg & 3) == 0)
678 class = QUAD_FPR_REGS;
679
680 else if ((fpr_reg & 1) == 0)
681 class = FEVEN_REGS;
682
683 else
684 class = FPR_REGS;
685 }
686
687 else if (regno == LR_REGNO)
688 class = LR_REG;
689
690 else if (regno == LCR_REGNO)
691 class = LCR_REG;
692
693 else if (ICC_P (regno))
694 class = ICC_REGS;
695
696 else if (FCC_P (regno))
697 class = FCC_REGS;
698
699 else if (ICR_P (regno))
700 class = ICR_REGS;
701
702 else if (FCR_P (regno))
703 class = FCR_REGS;
704
705 else if (ACC_P (regno))
706 {
707 int r = regno - ACC_FIRST;
708 if ((r & 3) == 0)
709 class = QUAD_ACC_REGS;
710 else if ((r & 1) == 0)
711 class = EVEN_ACC_REGS;
712 else
713 class = ACC_REGS;
714 }
715
716 else if (ACCG_P (regno))
717 class = ACCG_REGS;
718
719 else
720 class = NO_REGS;
721
722 regno_reg_class[regno] = class;
723 }
724
725 /* Check for small data option */
726 if (!g_switch_set)
727 g_switch_value = SDATA_DEFAULT_SIZE;
728
729 /* A C expression which defines the machine-dependent operand
730 constraint letters for register classes. If CHAR is such a
731 letter, the value should be the register class corresponding to
732 it. Otherwise, the value should be `NO_REGS'. The register
733 letter `r', corresponding to class `GENERAL_REGS', will not be
734 passed to this macro; you do not need to handle it.
735
736 The following letters are unavailable, due to being used as
737 constraints:
738 '0'..'9'
739 '<', '>'
740 'E', 'F', 'G', 'H'
741 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'
742 'Q', 'R', 'S', 'T', 'U'
743 'V', 'X'
744 'g', 'i', 'm', 'n', 'o', 'p', 'r', 's' */
745
746 for (i = 0; i < 256; i++)
747 reg_class_from_letter[i] = NO_REGS;
748
749 reg_class_from_letter['a'] = ACC_REGS;
750 reg_class_from_letter['b'] = EVEN_ACC_REGS;
751 reg_class_from_letter['c'] = CC_REGS;
752 reg_class_from_letter['d'] = GPR_REGS;
753 reg_class_from_letter['e'] = EVEN_REGS;
754 reg_class_from_letter['f'] = FPR_REGS;
755 reg_class_from_letter['h'] = FEVEN_REGS;
756 reg_class_from_letter['l'] = LR_REG;
757 reg_class_from_letter['q'] = QUAD_REGS;
758 reg_class_from_letter['t'] = ICC_REGS;
759 reg_class_from_letter['u'] = FCC_REGS;
760 reg_class_from_letter['v'] = ICR_REGS;
761 reg_class_from_letter['w'] = FCR_REGS;
762 reg_class_from_letter['x'] = QUAD_FPR_REGS;
763 reg_class_from_letter['y'] = LCR_REG;
764 reg_class_from_letter['z'] = SPR_REGS;
765 reg_class_from_letter['A'] = QUAD_ACC_REGS;
766 reg_class_from_letter['B'] = ACCG_REGS;
767 reg_class_from_letter['C'] = CR_REGS;
768 reg_class_from_letter['W'] = FDPIC_CALL_REGS; /* gp14+15 */
769 reg_class_from_letter['Z'] = FDPIC_REGS; /* gp15 */
770
771 /* There is no single unaligned SI op for PIC code. Sometimes we
772 need to use ".4byte" and sometimes we need to use ".picptr".
773 See frv_assemble_integer for details. */
774 if (flag_pic || TARGET_FDPIC)
775 targetm.asm_out.unaligned_op.si = 0;
776
777 if ((target_flags_explicit & MASK_LINKED_FP) == 0)
778 target_flags |= MASK_LINKED_FP;
779
780 for (i = 0; i < ARRAY_SIZE (frv_unit_names); i++)
781 frv_unit_codes[i] = get_cpu_unit_code (frv_unit_names[i]);
782
783 for (i = 0; i < ARRAY_SIZE (frv_type_to_unit); i++)
784 frv_type_to_unit[i] = ARRAY_SIZE (frv_unit_codes);
785
786 init_machine_status = frv_init_machine_status;
787 }
788
789 \f
790 /* Some machines may desire to change what optimizations are performed for
791 various optimization levels. This macro, if defined, is executed once just
792 after the optimization level is determined and before the remainder of the
793 command options have been parsed. Values set in this macro are used as the
794 default values for the other command line options.
795
796 LEVEL is the optimization level specified; 2 if `-O2' is specified, 1 if
797 `-O' is specified, and 0 if neither is specified.
798
799 SIZE is nonzero if `-Os' is specified, 0 otherwise.
800
801 You should not use this macro to change options that are not
802 machine-specific. These should uniformly selected by the same optimization
803 level on all supported machines. Use this macro to enable machbine-specific
804 optimizations.
805
806 *Do not examine `write_symbols' in this macro!* The debugging options are
807 *not supposed to alter the generated code. */
808
809 /* On the FRV, possibly disable VLIW packing which is done by the 2nd
810 scheduling pass at the current time. */
811 void
812 frv_optimization_options (int level, int size ATTRIBUTE_UNUSED)
813 {
814 if (level >= 2)
815 {
816 #ifdef DISABLE_SCHED2
817 flag_schedule_insns_after_reload = 0;
818 #endif
819 #ifdef ENABLE_RCSP
820 flag_rcsp = 1;
821 #endif
822 }
823 }
824
825 \f
826 /* Return true if NAME (a STRING_CST node) begins with PREFIX. */
827
828 static int
829 frv_string_begins_with (tree name, const char *prefix)
830 {
831 int prefix_len = strlen (prefix);
832
833 /* Remember: NAME's length includes the null terminator. */
834 return (TREE_STRING_LENGTH (name) > prefix_len
835 && strncmp (TREE_STRING_POINTER (name), prefix, prefix_len) == 0);
836 }
837 \f
838 /* Zero or more C statements that may conditionally modify two variables
839 `fixed_regs' and `call_used_regs' (both of type `char []') after they have
840 been initialized from the two preceding macros.
841
842 This is necessary in case the fixed or call-clobbered registers depend on
843 target flags.
844
845 You need not define this macro if it has no work to do.
846
847 If the usage of an entire class of registers depends on the target flags,
848 you may indicate this to GCC by using this macro to modify `fixed_regs' and
849 `call_used_regs' to 1 for each of the registers in the classes which should
850 not be used by GCC. Also define the macro `REG_CLASS_FROM_LETTER' to return
851 `NO_REGS' if it is called with a letter for a class that shouldn't be used.
852
853 (However, if this class is not included in `GENERAL_REGS' and all of the
854 insn patterns whose constraints permit this class are controlled by target
855 switches, then GCC will automatically avoid using these registers when the
856 target switches are opposed to them.) */
857
858 void
859 frv_conditional_register_usage (void)
860 {
861 int i;
862
863 for (i = GPR_FIRST + NUM_GPRS; i <= GPR_LAST; i++)
864 fixed_regs[i] = call_used_regs[i] = 1;
865
866 for (i = FPR_FIRST + NUM_FPRS; i <= FPR_LAST; i++)
867 fixed_regs[i] = call_used_regs[i] = 1;
868
869 /* Reserve the registers used for conditional execution. At present, we need
870 1 ICC and 1 ICR register. */
871 fixed_regs[ICC_TEMP] = call_used_regs[ICC_TEMP] = 1;
872 fixed_regs[ICR_TEMP] = call_used_regs[ICR_TEMP] = 1;
873
874 if (TARGET_FIXED_CC)
875 {
876 fixed_regs[ICC_FIRST] = call_used_regs[ICC_FIRST] = 1;
877 fixed_regs[FCC_FIRST] = call_used_regs[FCC_FIRST] = 1;
878 fixed_regs[ICR_FIRST] = call_used_regs[ICR_FIRST] = 1;
879 fixed_regs[FCR_FIRST] = call_used_regs[FCR_FIRST] = 1;
880 }
881
882 if (TARGET_FDPIC)
883 fixed_regs[GPR_FIRST + 16] = fixed_regs[GPR_FIRST + 17] =
884 call_used_regs[GPR_FIRST + 16] = call_used_regs[GPR_FIRST + 17] = 0;
885
886 #if 0
887 /* If -fpic, SDA_BASE_REG is the PIC register. */
888 if (g_switch_value == 0 && !flag_pic)
889 fixed_regs[SDA_BASE_REG] = call_used_regs[SDA_BASE_REG] = 0;
890
891 if (!flag_pic)
892 fixed_regs[PIC_REGNO] = call_used_regs[PIC_REGNO] = 0;
893 #endif
894 }
895
896 \f
897 /*
898 * Compute the stack frame layout
899 *
900 * Register setup:
901 * +---------------+-----------------------+-----------------------+
902 * |Register |type |caller-save/callee-save|
903 * +---------------+-----------------------+-----------------------+
904 * |GR0 |Zero register | - |
905 * |GR1 |Stack pointer(SP) | - |
906 * |GR2 |Frame pointer(FP) | - |
907 * |GR3 |Hidden parameter | caller save |
908 * |GR4-GR7 | - | caller save |
909 * |GR8-GR13 |Argument register | caller save |
910 * |GR14-GR15 | - | caller save |
911 * |GR16-GR31 | - | callee save |
912 * |GR32-GR47 | - | caller save |
913 * |GR48-GR63 | - | callee save |
914 * |FR0-FR15 | - | caller save |
915 * |FR16-FR31 | - | callee save |
916 * |FR32-FR47 | - | caller save |
917 * |FR48-FR63 | - | callee save |
918 * +---------------+-----------------------+-----------------------+
919 *
920 * Stack frame setup:
921 * Low
922 * SP-> |-----------------------------------|
923 * | Argument area |
924 * |-----------------------------------|
925 * | Register save area |
926 * |-----------------------------------|
927 * | Local variable save area |
928 * FP-> |-----------------------------------|
929 * | Old FP |
930 * |-----------------------------------|
931 * | Hidden parameter save area |
932 * |-----------------------------------|
933 * | Return address(LR) storage area |
934 * |-----------------------------------|
935 * | Padding for alignment |
936 * |-----------------------------------|
937 * | Register argument area |
938 * OLD SP-> |-----------------------------------|
939 * | Parameter area |
940 * |-----------------------------------|
941 * High
942 *
943 * Argument area/Parameter area:
944 *
945 * When a function is called, this area is used for argument transfer. When
946 * the argument is set up by the caller function, this area is referred to as
947 * the argument area. When the argument is referenced by the callee function,
948 * this area is referred to as the parameter area. The area is allocated when
949 * all arguments cannot be placed on the argument register at the time of
950 * argument transfer.
951 *
952 * Register save area:
953 *
954 * This is a register save area that must be guaranteed for the caller
955 * function. This area is not secured when the register save operation is not
956 * needed.
957 *
958 * Local variable save area:
959 *
960 * This is the area for local variables and temporary variables.
961 *
962 * Old FP:
963 *
964 * This area stores the FP value of the caller function.
965 *
966 * Hidden parameter save area:
967 *
968 * This area stores the start address of the return value storage
969 * area for a struct/union return function.
970 * When a struct/union is used as the return value, the caller
971 * function stores the return value storage area start address in
972 * register GR3 and passes it to the caller function.
973 * The callee function interprets the address stored in the GR3
974 * as the return value storage area start address.
975 * When register GR3 needs to be saved into memory, the callee
976 * function saves it in the hidden parameter save area. This
977 * area is not secured when the save operation is not needed.
978 *
979 * Return address(LR) storage area:
980 *
981 * This area saves the LR. The LR stores the address of a return to the caller
982 * function for the purpose of function calling.
983 *
984 * Argument register area:
985 *
986 * This area saves the argument register. This area is not secured when the
987 * save operation is not needed.
988 *
989 * Argument:
990 *
991 * Arguments, the count of which equals the count of argument registers (6
992 * words), are positioned in registers GR8 to GR13 and delivered to the callee
993 * function. When a struct/union return function is called, the return value
994 * area address is stored in register GR3. Arguments not placed in the
995 * argument registers will be stored in the stack argument area for transfer
996 * purposes. When an 8-byte type argument is to be delivered using registers,
997 * it is divided into two and placed in two registers for transfer. When
998 * argument registers must be saved to memory, the callee function secures an
999 * argument register save area in the stack. In this case, a continuous
1000 * argument register save area must be established in the parameter area. The
1001 * argument register save area must be allocated as needed to cover the size of
1002 * the argument register to be saved. If the function has a variable count of
1003 * arguments, it saves all argument registers in the argument register save
1004 * area.
1005 *
1006 * Argument Extension Format:
1007 *
1008 * When an argument is to be stored in the stack, its type is converted to an
1009 * extended type in accordance with the individual argument type. The argument
1010 * is freed by the caller function after the return from the callee function is
1011 * made.
1012 *
1013 * +-----------------------+---------------+------------------------+
1014 * | Argument Type |Extended Type |Stack Storage Size(byte)|
1015 * +-----------------------+---------------+------------------------+
1016 * |char |int | 4 |
1017 * |signed char |int | 4 |
1018 * |unsigned char |int | 4 |
1019 * |[signed] short int |int | 4 |
1020 * |unsigned short int |int | 4 |
1021 * |[signed] int |No extension | 4 |
1022 * |unsigned int |No extension | 4 |
1023 * |[signed] long int |No extension | 4 |
1024 * |unsigned long int |No extension | 4 |
1025 * |[signed] long long int |No extension | 8 |
1026 * |unsigned long long int |No extension | 8 |
1027 * |float |double | 8 |
1028 * |double |No extension | 8 |
1029 * |long double |No extension | 8 |
1030 * |pointer |No extension | 4 |
1031 * |struct/union |- | 4 (*1) |
1032 * +-----------------------+---------------+------------------------+
1033 *
1034 * When a struct/union is to be delivered as an argument, the caller copies it
1035 * to the local variable area and delivers the address of that area.
1036 *
1037 * Return Value:
1038 *
1039 * +-------------------------------+----------------------+
1040 * |Return Value Type |Return Value Interface|
1041 * +-------------------------------+----------------------+
1042 * |void |None |
1043 * |[signed|unsigned] char |GR8 |
1044 * |[signed|unsigned] short int |GR8 |
1045 * |[signed|unsigned] int |GR8 |
1046 * |[signed|unsigned] long int |GR8 |
1047 * |pointer |GR8 |
1048 * |[signed|unsigned] long long int|GR8 & GR9 |
1049 * |float |GR8 |
1050 * |double |GR8 & GR9 |
1051 * |long double |GR8 & GR9 |
1052 * |struct/union |(*1) |
1053 * +-------------------------------+----------------------+
1054 *
1055 * When a struct/union is used as the return value, the caller function stores
1056 * the start address of the return value storage area into GR3 and then passes
1057 * it to the callee function. The callee function interprets GR3 as the start
1058 * address of the return value storage area. When this address needs to be
1059 * saved in memory, the callee function secures the hidden parameter save area
1060 * and saves the address in that area.
1061 */
1062
1063 frv_stack_t *
1064 frv_stack_info (void)
1065 {
1066 static frv_stack_t info, zero_info;
1067 frv_stack_t *info_ptr = &info;
1068 tree fndecl = current_function_decl;
1069 int varargs_p = 0;
1070 tree cur_arg;
1071 tree next_arg;
1072 int range;
1073 int alignment;
1074 int offset;
1075
1076 /* If we've already calculated the values and reload is complete,
1077 just return now. */
1078 if (frv_stack_cache)
1079 return frv_stack_cache;
1080
1081 /* Zero all fields. */
1082 info = zero_info;
1083
1084 /* Set up the register range information. */
1085 info_ptr->regs[STACK_REGS_GPR].name = "gpr";
1086 info_ptr->regs[STACK_REGS_GPR].first = LAST_ARG_REGNUM + 1;
1087 info_ptr->regs[STACK_REGS_GPR].last = GPR_LAST;
1088 info_ptr->regs[STACK_REGS_GPR].dword_p = TRUE;
1089
1090 info_ptr->regs[STACK_REGS_FPR].name = "fpr";
1091 info_ptr->regs[STACK_REGS_FPR].first = FPR_FIRST;
1092 info_ptr->regs[STACK_REGS_FPR].last = FPR_LAST;
1093 info_ptr->regs[STACK_REGS_FPR].dword_p = TRUE;
1094
1095 info_ptr->regs[STACK_REGS_LR].name = "lr";
1096 info_ptr->regs[STACK_REGS_LR].first = LR_REGNO;
1097 info_ptr->regs[STACK_REGS_LR].last = LR_REGNO;
1098 info_ptr->regs[STACK_REGS_LR].special_p = 1;
1099
1100 info_ptr->regs[STACK_REGS_CC].name = "cc";
1101 info_ptr->regs[STACK_REGS_CC].first = CC_FIRST;
1102 info_ptr->regs[STACK_REGS_CC].last = CC_LAST;
1103 info_ptr->regs[STACK_REGS_CC].field_p = TRUE;
1104
1105 info_ptr->regs[STACK_REGS_LCR].name = "lcr";
1106 info_ptr->regs[STACK_REGS_LCR].first = LCR_REGNO;
1107 info_ptr->regs[STACK_REGS_LCR].last = LCR_REGNO;
1108
1109 info_ptr->regs[STACK_REGS_STDARG].name = "stdarg";
1110 info_ptr->regs[STACK_REGS_STDARG].first = FIRST_ARG_REGNUM;
1111 info_ptr->regs[STACK_REGS_STDARG].last = LAST_ARG_REGNUM;
1112 info_ptr->regs[STACK_REGS_STDARG].dword_p = 1;
1113 info_ptr->regs[STACK_REGS_STDARG].special_p = 1;
1114
1115 info_ptr->regs[STACK_REGS_STRUCT].name = "struct";
1116 info_ptr->regs[STACK_REGS_STRUCT].first = FRV_STRUCT_VALUE_REGNUM;
1117 info_ptr->regs[STACK_REGS_STRUCT].last = FRV_STRUCT_VALUE_REGNUM;
1118 info_ptr->regs[STACK_REGS_STRUCT].special_p = 1;
1119
1120 info_ptr->regs[STACK_REGS_FP].name = "fp";
1121 info_ptr->regs[STACK_REGS_FP].first = FRAME_POINTER_REGNUM;
1122 info_ptr->regs[STACK_REGS_FP].last = FRAME_POINTER_REGNUM;
1123 info_ptr->regs[STACK_REGS_FP].special_p = 1;
1124
1125 /* Determine if this is a stdarg function. If so, allocate space to store
1126 the 6 arguments. */
1127 if (cfun->stdarg)
1128 varargs_p = 1;
1129
1130 else
1131 {
1132 /* Find the last argument, and see if it is __builtin_va_alist. */
1133 for (cur_arg = DECL_ARGUMENTS (fndecl); cur_arg != (tree)0; cur_arg = next_arg)
1134 {
1135 next_arg = TREE_CHAIN (cur_arg);
1136 if (next_arg == (tree)0)
1137 {
1138 if (DECL_NAME (cur_arg)
1139 && !strcmp (IDENTIFIER_POINTER (DECL_NAME (cur_arg)), "__builtin_va_alist"))
1140 varargs_p = 1;
1141
1142 break;
1143 }
1144 }
1145 }
1146
1147 /* Iterate over all of the register ranges. */
1148 for (range = 0; range < STACK_REGS_MAX; range++)
1149 {
1150 frv_stack_regs_t *reg_ptr = &(info_ptr->regs[range]);
1151 int first = reg_ptr->first;
1152 int last = reg_ptr->last;
1153 int size_1word = 0;
1154 int size_2words = 0;
1155 int regno;
1156
1157 /* Calculate which registers need to be saved & save area size. */
1158 switch (range)
1159 {
1160 default:
1161 for (regno = first; regno <= last; regno++)
1162 {
1163 if ((regs_ever_live[regno] && !call_used_regs[regno])
1164 || (current_function_calls_eh_return
1165 && (regno >= FIRST_EH_REGNUM && regno <= LAST_EH_REGNUM))
1166 || (!TARGET_FDPIC && flag_pic
1167 && cfun->uses_pic_offset_table && regno == PIC_REGNO))
1168 {
1169 info_ptr->save_p[regno] = REG_SAVE_1WORD;
1170 size_1word += UNITS_PER_WORD;
1171 }
1172 }
1173 break;
1174
1175 /* Calculate whether we need to create a frame after everything else
1176 has been processed. */
1177 case STACK_REGS_FP:
1178 break;
1179
1180 case STACK_REGS_LR:
1181 if (regs_ever_live[LR_REGNO]
1182 || profile_flag
1183 /* This is set for __builtin_return_address, etc. */
1184 || cfun->machine->frame_needed
1185 || (TARGET_LINKED_FP && frame_pointer_needed)
1186 || (!TARGET_FDPIC && flag_pic
1187 && cfun->uses_pic_offset_table))
1188 {
1189 info_ptr->save_p[LR_REGNO] = REG_SAVE_1WORD;
1190 size_1word += UNITS_PER_WORD;
1191 }
1192 break;
1193
1194 case STACK_REGS_STDARG:
1195 if (varargs_p)
1196 {
1197 /* If this is a stdarg function with a non varardic
1198 argument split between registers and the stack,
1199 adjust the saved registers downward. */
1200 last -= (ADDR_ALIGN (cfun->pretend_args_size, UNITS_PER_WORD)
1201 / UNITS_PER_WORD);
1202
1203 for (regno = first; regno <= last; regno++)
1204 {
1205 info_ptr->save_p[regno] = REG_SAVE_1WORD;
1206 size_1word += UNITS_PER_WORD;
1207 }
1208
1209 info_ptr->stdarg_size = size_1word;
1210 }
1211 break;
1212
1213 case STACK_REGS_STRUCT:
1214 if (cfun->returns_struct)
1215 {
1216 info_ptr->save_p[FRV_STRUCT_VALUE_REGNUM] = REG_SAVE_1WORD;
1217 size_1word += UNITS_PER_WORD;
1218 }
1219 break;
1220 }
1221
1222
1223 if (size_1word)
1224 {
1225 /* If this is a field, it only takes one word. */
1226 if (reg_ptr->field_p)
1227 size_1word = UNITS_PER_WORD;
1228
1229 /* Determine which register pairs can be saved together. */
1230 else if (reg_ptr->dword_p && TARGET_DWORD)
1231 {
1232 for (regno = first; regno < last; regno += 2)
1233 {
1234 if (info_ptr->save_p[regno] && info_ptr->save_p[regno+1])
1235 {
1236 size_2words += 2 * UNITS_PER_WORD;
1237 size_1word -= 2 * UNITS_PER_WORD;
1238 info_ptr->save_p[regno] = REG_SAVE_2WORDS;
1239 info_ptr->save_p[regno+1] = REG_SAVE_NO_SAVE;
1240 }
1241 }
1242 }
1243
1244 reg_ptr->size_1word = size_1word;
1245 reg_ptr->size_2words = size_2words;
1246
1247 if (! reg_ptr->special_p)
1248 {
1249 info_ptr->regs_size_1word += size_1word;
1250 info_ptr->regs_size_2words += size_2words;
1251 }
1252 }
1253 }
1254
1255 /* Set up the sizes of each each field in the frame body, making the sizes
1256 of each be divisible by the size of a dword if dword operations might
1257 be used, or the size of a word otherwise. */
1258 alignment = (TARGET_DWORD? 2 * UNITS_PER_WORD : UNITS_PER_WORD);
1259
1260 info_ptr->parameter_size = ADDR_ALIGN (cfun->outgoing_args_size, alignment);
1261 info_ptr->regs_size = ADDR_ALIGN (info_ptr->regs_size_2words
1262 + info_ptr->regs_size_1word,
1263 alignment);
1264 info_ptr->vars_size = ADDR_ALIGN (get_frame_size (), alignment);
1265
1266 info_ptr->pretend_size = cfun->pretend_args_size;
1267
1268 /* Work out the size of the frame, excluding the header. Both the frame
1269 body and register parameter area will be dword-aligned. */
1270 info_ptr->total_size
1271 = (ADDR_ALIGN (info_ptr->parameter_size
1272 + info_ptr->regs_size
1273 + info_ptr->vars_size,
1274 2 * UNITS_PER_WORD)
1275 + ADDR_ALIGN (info_ptr->pretend_size
1276 + info_ptr->stdarg_size,
1277 2 * UNITS_PER_WORD));
1278
1279 /* See if we need to create a frame at all, if so add header area. */
1280 if (info_ptr->total_size > 0
1281 || frame_pointer_needed
1282 || info_ptr->regs[STACK_REGS_LR].size_1word > 0
1283 || info_ptr->regs[STACK_REGS_STRUCT].size_1word > 0)
1284 {
1285 offset = info_ptr->parameter_size;
1286 info_ptr->header_size = 4 * UNITS_PER_WORD;
1287 info_ptr->total_size += 4 * UNITS_PER_WORD;
1288
1289 /* Calculate the offsets to save normal register pairs. */
1290 for (range = 0; range < STACK_REGS_MAX; range++)
1291 {
1292 frv_stack_regs_t *reg_ptr = &(info_ptr->regs[range]);
1293 if (! reg_ptr->special_p)
1294 {
1295 int first = reg_ptr->first;
1296 int last = reg_ptr->last;
1297 int regno;
1298
1299 for (regno = first; regno <= last; regno++)
1300 if (info_ptr->save_p[regno] == REG_SAVE_2WORDS
1301 && regno != FRAME_POINTER_REGNUM
1302 && (regno < FIRST_ARG_REGNUM
1303 || regno > LAST_ARG_REGNUM))
1304 {
1305 info_ptr->reg_offset[regno] = offset;
1306 offset += 2 * UNITS_PER_WORD;
1307 }
1308 }
1309 }
1310
1311 /* Calculate the offsets to save normal single registers. */
1312 for (range = 0; range < STACK_REGS_MAX; range++)
1313 {
1314 frv_stack_regs_t *reg_ptr = &(info_ptr->regs[range]);
1315 if (! reg_ptr->special_p)
1316 {
1317 int first = reg_ptr->first;
1318 int last = reg_ptr->last;
1319 int regno;
1320
1321 for (regno = first; regno <= last; regno++)
1322 if (info_ptr->save_p[regno] == REG_SAVE_1WORD
1323 && regno != FRAME_POINTER_REGNUM
1324 && (regno < FIRST_ARG_REGNUM
1325 || regno > LAST_ARG_REGNUM))
1326 {
1327 info_ptr->reg_offset[regno] = offset;
1328 offset += UNITS_PER_WORD;
1329 }
1330 }
1331 }
1332
1333 /* Calculate the offset to save the local variables at. */
1334 offset = ADDR_ALIGN (offset, alignment);
1335 if (info_ptr->vars_size)
1336 {
1337 info_ptr->vars_offset = offset;
1338 offset += info_ptr->vars_size;
1339 }
1340
1341 /* Align header to a dword-boundary. */
1342 offset = ADDR_ALIGN (offset, 2 * UNITS_PER_WORD);
1343
1344 /* Calculate the offsets in the fixed frame. */
1345 info_ptr->save_p[FRAME_POINTER_REGNUM] = REG_SAVE_1WORD;
1346 info_ptr->reg_offset[FRAME_POINTER_REGNUM] = offset;
1347 info_ptr->regs[STACK_REGS_FP].size_1word = UNITS_PER_WORD;
1348
1349 info_ptr->save_p[LR_REGNO] = REG_SAVE_1WORD;
1350 info_ptr->reg_offset[LR_REGNO] = offset + 2*UNITS_PER_WORD;
1351 info_ptr->regs[STACK_REGS_LR].size_1word = UNITS_PER_WORD;
1352
1353 if (cfun->returns_struct)
1354 {
1355 info_ptr->save_p[FRV_STRUCT_VALUE_REGNUM] = REG_SAVE_1WORD;
1356 info_ptr->reg_offset[FRV_STRUCT_VALUE_REGNUM] = offset + UNITS_PER_WORD;
1357 info_ptr->regs[STACK_REGS_STRUCT].size_1word = UNITS_PER_WORD;
1358 }
1359
1360 /* Calculate the offsets to store the arguments passed in registers
1361 for stdarg functions. The register pairs are first and the single
1362 register if any is last. The register save area starts on a
1363 dword-boundary. */
1364 if (info_ptr->stdarg_size)
1365 {
1366 int first = info_ptr->regs[STACK_REGS_STDARG].first;
1367 int last = info_ptr->regs[STACK_REGS_STDARG].last;
1368 int regno;
1369
1370 /* Skip the header. */
1371 offset += 4 * UNITS_PER_WORD;
1372 for (regno = first; regno <= last; regno++)
1373 {
1374 if (info_ptr->save_p[regno] == REG_SAVE_2WORDS)
1375 {
1376 info_ptr->reg_offset[regno] = offset;
1377 offset += 2 * UNITS_PER_WORD;
1378 }
1379 else if (info_ptr->save_p[regno] == REG_SAVE_1WORD)
1380 {
1381 info_ptr->reg_offset[regno] = offset;
1382 offset += UNITS_PER_WORD;
1383 }
1384 }
1385 }
1386 }
1387
1388 if (reload_completed)
1389 frv_stack_cache = info_ptr;
1390
1391 return info_ptr;
1392 }
1393
1394 \f
1395 /* Print the information about the frv stack offsets, etc. when debugging. */
1396
1397 void
1398 frv_debug_stack (frv_stack_t *info)
1399 {
1400 int range;
1401
1402 if (!info)
1403 info = frv_stack_info ();
1404
1405 fprintf (stderr, "\nStack information for function %s:\n",
1406 ((current_function_decl && DECL_NAME (current_function_decl))
1407 ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
1408 : "<unknown>"));
1409
1410 fprintf (stderr, "\ttotal_size\t= %6d\n", info->total_size);
1411 fprintf (stderr, "\tvars_size\t= %6d\n", info->vars_size);
1412 fprintf (stderr, "\tparam_size\t= %6d\n", info->parameter_size);
1413 fprintf (stderr, "\tregs_size\t= %6d, 1w = %3d, 2w = %3d\n",
1414 info->regs_size, info->regs_size_1word, info->regs_size_2words);
1415
1416 fprintf (stderr, "\theader_size\t= %6d\n", info->header_size);
1417 fprintf (stderr, "\tpretend_size\t= %6d\n", info->pretend_size);
1418 fprintf (stderr, "\tvars_offset\t= %6d\n", info->vars_offset);
1419 fprintf (stderr, "\tregs_offset\t= %6d\n", info->regs_offset);
1420
1421 for (range = 0; range < STACK_REGS_MAX; range++)
1422 {
1423 frv_stack_regs_t *regs = &(info->regs[range]);
1424 if ((regs->size_1word + regs->size_2words) > 0)
1425 {
1426 int first = regs->first;
1427 int last = regs->last;
1428 int regno;
1429
1430 fprintf (stderr, "\t%s\tsize\t= %6d, 1w = %3d, 2w = %3d, save =",
1431 regs->name, regs->size_1word + regs->size_2words,
1432 regs->size_1word, regs->size_2words);
1433
1434 for (regno = first; regno <= last; regno++)
1435 {
1436 if (info->save_p[regno] == REG_SAVE_1WORD)
1437 fprintf (stderr, " %s (%d)", reg_names[regno],
1438 info->reg_offset[regno]);
1439
1440 else if (info->save_p[regno] == REG_SAVE_2WORDS)
1441 fprintf (stderr, " %s-%s (%d)", reg_names[regno],
1442 reg_names[regno+1], info->reg_offset[regno]);
1443 }
1444
1445 fputc ('\n', stderr);
1446 }
1447 }
1448
1449 fflush (stderr);
1450 }
1451
1452
1453 \f
1454
1455 /* Used during final to control the packing of insns. The value is
1456 1 if the current instruction should be packed with the next one,
1457 0 if it shouldn't or -1 if packing is disabled altogether. */
1458
1459 static int frv_insn_packing_flag;
1460
1461 /* True if the current function contains a far jump. */
1462
1463 static int
1464 frv_function_contains_far_jump (void)
1465 {
1466 rtx insn = get_insns ();
1467 while (insn != NULL
1468 && !(GET_CODE (insn) == JUMP_INSN
1469 /* Ignore tablejump patterns. */
1470 && GET_CODE (PATTERN (insn)) != ADDR_VEC
1471 && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC
1472 && get_attr_far_jump (insn) == FAR_JUMP_YES))
1473 insn = NEXT_INSN (insn);
1474 return (insn != NULL);
1475 }
1476
1477 /* For the FRV, this function makes sure that a function with far jumps
1478 will return correctly. It also does the VLIW packing. */
1479
1480 static void
1481 frv_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
1482 {
1483 /* If no frame was created, check whether the function uses a call
1484 instruction to implement a far jump. If so, save the link in gr3 and
1485 replace all returns to LR with returns to GR3. GR3 is used because it
1486 is call-clobbered, because is not available to the register allocator,
1487 and because all functions that take a hidden argument pointer will have
1488 a stack frame. */
1489 if (frv_stack_info ()->total_size == 0 && frv_function_contains_far_jump ())
1490 {
1491 rtx insn;
1492
1493 /* Just to check that the above comment is true. */
1494 if (regs_ever_live[GPR_FIRST + 3])
1495 abort ();
1496
1497 /* Generate the instruction that saves the link register. */
1498 fprintf (file, "\tmovsg lr,gr3\n");
1499
1500 /* Replace the LR with GR3 in *return_internal patterns. The insn
1501 will now return using jmpl @(gr3,0) rather than bralr. We cannot
1502 simply emit a different assembly directive because bralr and jmpl
1503 execute in different units. */
1504 for (insn = get_insns(); insn != NULL; insn = NEXT_INSN (insn))
1505 if (GET_CODE (insn) == JUMP_INSN)
1506 {
1507 rtx pattern = PATTERN (insn);
1508 if (GET_CODE (pattern) == PARALLEL
1509 && XVECLEN (pattern, 0) >= 2
1510 && GET_CODE (XVECEXP (pattern, 0, 0)) == RETURN
1511 && GET_CODE (XVECEXP (pattern, 0, 1)) == USE)
1512 {
1513 rtx address = XEXP (XVECEXP (pattern, 0, 1), 0);
1514 if (GET_CODE (address) == REG && REGNO (address) == LR_REGNO)
1515 REGNO (address) = GPR_FIRST + 3;
1516 }
1517 }
1518 }
1519
1520 frv_pack_insns ();
1521
1522 /* Allow the garbage collector to free the nops created by frv_reorg. */
1523 memset (frv_nops, 0, sizeof (frv_nops));
1524 }
1525
1526 \f
1527 /* Return the next available temporary register in a given class. */
1528
1529 static rtx
1530 frv_alloc_temp_reg (
1531 frv_tmp_reg_t *info, /* which registers are available */
1532 enum reg_class class, /* register class desired */
1533 enum machine_mode mode, /* mode to allocate register with */
1534 int mark_as_used, /* register not available after allocation */
1535 int no_abort) /* return NULL instead of aborting */
1536 {
1537 int regno = info->next_reg[ (int)class ];
1538 int orig_regno = regno;
1539 HARD_REG_SET *reg_in_class = &reg_class_contents[ (int)class ];
1540 int i, nr;
1541
1542 for (;;)
1543 {
1544 if (TEST_HARD_REG_BIT (*reg_in_class, regno)
1545 && TEST_HARD_REG_BIT (info->regs, regno))
1546 break;
1547
1548 if (++regno >= FIRST_PSEUDO_REGISTER)
1549 regno = 0;
1550 if (regno == orig_regno)
1551 {
1552 if (no_abort)
1553 return NULL_RTX;
1554 else
1555 abort ();
1556 }
1557 }
1558
1559 nr = HARD_REGNO_NREGS (regno, mode);
1560 info->next_reg[ (int)class ] = regno + nr;
1561
1562 if (mark_as_used)
1563 for (i = 0; i < nr; i++)
1564 CLEAR_HARD_REG_BIT (info->regs, regno+i);
1565
1566 return gen_rtx_REG (mode, regno);
1567 }
1568
1569 \f
1570 /* Return an rtx with the value OFFSET, which will either be a register or a
1571 signed 12-bit integer. It can be used as the second operand in an "add"
1572 instruction, or as the index in a load or store.
1573
1574 The function returns a constant rtx if OFFSET is small enough, otherwise
1575 it loads the constant into register OFFSET_REGNO and returns that. */
1576 static rtx
1577 frv_frame_offset_rtx (int offset)
1578 {
1579 rtx offset_rtx = GEN_INT (offset);
1580 if (IN_RANGE_P (offset, -2048, 2047))
1581 return offset_rtx;
1582 else
1583 {
1584 rtx reg_rtx = gen_rtx_REG (SImode, OFFSET_REGNO);
1585 if (IN_RANGE_P (offset, -32768, 32767))
1586 emit_insn (gen_movsi (reg_rtx, offset_rtx));
1587 else
1588 {
1589 emit_insn (gen_movsi_high (reg_rtx, offset_rtx));
1590 emit_insn (gen_movsi_lo_sum (reg_rtx, offset_rtx));
1591 }
1592 return reg_rtx;
1593 }
1594 }
1595
1596 /* Generate (mem:MODE (plus:Pmode BASE (frv_frame_offset OFFSET)))). The
1597 prologue and epilogue uses such expressions to access the stack. */
1598 static rtx
1599 frv_frame_mem (enum machine_mode mode, rtx base, int offset)
1600 {
1601 return gen_rtx_MEM (mode, gen_rtx_PLUS (Pmode,
1602 base,
1603 frv_frame_offset_rtx (offset)));
1604 }
1605
1606 /* Generate a frame-related expression:
1607
1608 (set REG (mem (plus (sp) (const_int OFFSET)))).
1609
1610 Such expressions are used in FRAME_RELATED_EXPR notes for more complex
1611 instructions. Marking the expressions as frame-related is superfluous if
1612 the note contains just a single set. But if the note contains a PARALLEL
1613 or SEQUENCE that has several sets, each set must be individually marked
1614 as frame-related. */
1615 static rtx
1616 frv_dwarf_store (rtx reg, int offset)
1617 {
1618 rtx set = gen_rtx_SET (VOIDmode,
1619 gen_rtx_MEM (GET_MODE (reg),
1620 plus_constant (stack_pointer_rtx,
1621 offset)),
1622 reg);
1623 RTX_FRAME_RELATED_P (set) = 1;
1624 return set;
1625 }
1626
1627 /* Emit a frame-related instruction whose pattern is PATTERN. The
1628 instruction is the last in a sequence that cumulatively performs the
1629 operation described by DWARF_PATTERN. The instruction is marked as
1630 frame-related and has a REG_FRAME_RELATED_EXPR note containing
1631 DWARF_PATTERN. */
1632 static void
1633 frv_frame_insn (rtx pattern, rtx dwarf_pattern)
1634 {
1635 rtx insn = emit_insn (pattern);
1636 RTX_FRAME_RELATED_P (insn) = 1;
1637 REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
1638 dwarf_pattern,
1639 REG_NOTES (insn));
1640 }
1641
1642 /* Emit instructions that transfer REG to or from the memory location (sp +
1643 STACK_OFFSET). The register is stored in memory if ACCESSOR->OP is
1644 FRV_STORE and loaded if it is FRV_LOAD. Only the prologue uses this
1645 function to store registers and only the epilogue uses it to load them.
1646
1647 The caller sets up ACCESSOR so that BASE is equal to (sp + BASE_OFFSET).
1648 The generated instruction will use BASE as its base register. BASE may
1649 simply be the stack pointer, but if several accesses are being made to a
1650 region far away from the stack pointer, it may be more efficient to set
1651 up a temporary instead.
1652
1653 Store instructions will be frame-related and will be annotated with the
1654 overall effect of the store. Load instructions will be followed by a
1655 (use) to prevent later optimizations from zapping them.
1656
1657 The function takes care of the moves to and from SPRs, using TEMP_REGNO
1658 as a temporary in such cases. */
1659 static void
1660 frv_frame_access (frv_frame_accessor_t *accessor, rtx reg, int stack_offset)
1661 {
1662 enum machine_mode mode = GET_MODE (reg);
1663 rtx mem = frv_frame_mem (mode,
1664 accessor->base,
1665 stack_offset - accessor->base_offset);
1666
1667 if (accessor->op == FRV_LOAD)
1668 {
1669 if (SPR_P (REGNO (reg)))
1670 {
1671 rtx temp = gen_rtx_REG (mode, TEMP_REGNO);
1672 emit_insn (gen_rtx_SET (VOIDmode, temp, mem));
1673 emit_insn (gen_rtx_SET (VOIDmode, reg, temp));
1674 }
1675 else
1676 emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
1677 emit_insn (gen_rtx_USE (VOIDmode, reg));
1678 }
1679 else
1680 {
1681 if (SPR_P (REGNO (reg)))
1682 {
1683 rtx temp = gen_rtx_REG (mode, TEMP_REGNO);
1684 emit_insn (gen_rtx_SET (VOIDmode, temp, reg));
1685 frv_frame_insn (gen_rtx_SET (Pmode, mem, temp),
1686 frv_dwarf_store (reg, stack_offset));
1687 }
1688 else if (GET_MODE (reg) == DImode)
1689 {
1690 /* For DImode saves, the dwarf2 version needs to be a SEQUENCE
1691 with a separate save for each register. */
1692 rtx reg1 = gen_rtx_REG (SImode, REGNO (reg));
1693 rtx reg2 = gen_rtx_REG (SImode, REGNO (reg) + 1);
1694 rtx set1 = frv_dwarf_store (reg1, stack_offset);
1695 rtx set2 = frv_dwarf_store (reg2, stack_offset + 4);
1696 frv_frame_insn (gen_rtx_SET (Pmode, mem, reg),
1697 gen_rtx_PARALLEL (VOIDmode,
1698 gen_rtvec (2, set1, set2)));
1699 }
1700 else
1701 frv_frame_insn (gen_rtx_SET (Pmode, mem, reg),
1702 frv_dwarf_store (reg, stack_offset));
1703 }
1704 }
1705
1706 /* A function that uses frv_frame_access to transfer a group of registers to
1707 or from the stack. ACCESSOR is passed directly to frv_frame_access, INFO
1708 is the stack information generated by frv_stack_info, and REG_SET is the
1709 number of the register set to transfer. */
1710 static void
1711 frv_frame_access_multi (frv_frame_accessor_t *accessor,
1712 frv_stack_t *info,
1713 int reg_set)
1714 {
1715 frv_stack_regs_t *regs_info;
1716 int regno;
1717
1718 regs_info = &info->regs[reg_set];
1719 for (regno = regs_info->first; regno <= regs_info->last; regno++)
1720 if (info->save_p[regno])
1721 frv_frame_access (accessor,
1722 info->save_p[regno] == REG_SAVE_2WORDS
1723 ? gen_rtx_REG (DImode, regno)
1724 : gen_rtx_REG (SImode, regno),
1725 info->reg_offset[regno]);
1726 }
1727
1728 /* Save or restore callee-saved registers that are kept outside the frame
1729 header. The function saves the registers if OP is FRV_STORE and restores
1730 them if OP is FRV_LOAD. INFO is the stack information generated by
1731 frv_stack_info. */
1732 static void
1733 frv_frame_access_standard_regs (enum frv_stack_op op, frv_stack_t *info)
1734 {
1735 frv_frame_accessor_t accessor;
1736
1737 accessor.op = op;
1738 accessor.base = stack_pointer_rtx;
1739 accessor.base_offset = 0;
1740 frv_frame_access_multi (&accessor, info, STACK_REGS_GPR);
1741 frv_frame_access_multi (&accessor, info, STACK_REGS_FPR);
1742 frv_frame_access_multi (&accessor, info, STACK_REGS_LCR);
1743 }
1744
1745
1746 /* Called after register allocation to add any instructions needed for the
1747 prologue. Using a prologue insn is favored compared to putting all of the
1748 instructions in the TARGET_ASM_FUNCTION_PROLOGUE target hook, since
1749 it allows the scheduler to intermix instructions with the saves of
1750 the caller saved registers. In some cases, it might be necessary
1751 to emit a barrier instruction as the last insn to prevent such
1752 scheduling.
1753
1754 Also any insns generated here should have RTX_FRAME_RELATED_P(insn) = 1
1755 so that the debug info generation code can handle them properly. */
1756 void
1757 frv_expand_prologue (void)
1758 {
1759 frv_stack_t *info = frv_stack_info ();
1760 rtx sp = stack_pointer_rtx;
1761 rtx fp = frame_pointer_rtx;
1762 frv_frame_accessor_t accessor;
1763
1764 if (TARGET_DEBUG_STACK)
1765 frv_debug_stack (info);
1766
1767 if (info->total_size == 0)
1768 return;
1769
1770 /* We're interested in three areas of the frame here:
1771
1772 A: the register save area
1773 B: the old FP
1774 C: the header after B
1775
1776 If the frame pointer isn't used, we'll have to set up A, B and C
1777 using the stack pointer. If the frame pointer is used, we'll access
1778 them as follows:
1779
1780 A: set up using sp
1781 B: set up using sp or a temporary (see below)
1782 C: set up using fp
1783
1784 We set up B using the stack pointer if the frame is small enough.
1785 Otherwise, it's more efficient to copy the old stack pointer into a
1786 temporary and use that.
1787
1788 Note that it's important to make sure the prologue and epilogue use the
1789 same registers to access A and C, since doing otherwise will confuse
1790 the aliasing code. */
1791
1792 /* Set up ACCESSOR for accessing region B above. If the frame pointer
1793 isn't used, the same method will serve for C. */
1794 accessor.op = FRV_STORE;
1795 if (frame_pointer_needed && info->total_size > 2048)
1796 {
1797 rtx insn;
1798
1799 accessor.base = gen_rtx_REG (Pmode, OLD_SP_REGNO);
1800 accessor.base_offset = info->total_size;
1801 insn = emit_insn (gen_movsi (accessor.base, sp));
1802 }
1803 else
1804 {
1805 accessor.base = stack_pointer_rtx;
1806 accessor.base_offset = 0;
1807 }
1808
1809 /* Allocate the stack space. */
1810 {
1811 rtx asm_offset = frv_frame_offset_rtx (-info->total_size);
1812 rtx dwarf_offset = GEN_INT (-info->total_size);
1813
1814 frv_frame_insn (gen_stack_adjust (sp, sp, asm_offset),
1815 gen_rtx_SET (Pmode,
1816 sp,
1817 gen_rtx_PLUS (Pmode, sp, dwarf_offset)));
1818 }
1819
1820 /* If the frame pointer is needed, store the old one at (sp + FP_OFFSET)
1821 and point the new one to that location. */
1822 if (frame_pointer_needed)
1823 {
1824 int fp_offset = info->reg_offset[FRAME_POINTER_REGNUM];
1825
1826 /* ASM_SRC and DWARF_SRC both point to the frame header. ASM_SRC is
1827 based on ACCESSOR.BASE but DWARF_SRC is always based on the stack
1828 pointer. */
1829 rtx asm_src = plus_constant (accessor.base,
1830 fp_offset - accessor.base_offset);
1831 rtx dwarf_src = plus_constant (sp, fp_offset);
1832
1833 /* Store the old frame pointer at (sp + FP_OFFSET). */
1834 frv_frame_access (&accessor, fp, fp_offset);
1835
1836 /* Set up the new frame pointer. */
1837 frv_frame_insn (gen_rtx_SET (VOIDmode, fp, asm_src),
1838 gen_rtx_SET (VOIDmode, fp, dwarf_src));
1839
1840 /* Access region C from the frame pointer. */
1841 accessor.base = fp;
1842 accessor.base_offset = fp_offset;
1843 }
1844
1845 /* Set up region C. */
1846 frv_frame_access_multi (&accessor, info, STACK_REGS_STRUCT);
1847 frv_frame_access_multi (&accessor, info, STACK_REGS_LR);
1848 frv_frame_access_multi (&accessor, info, STACK_REGS_STDARG);
1849
1850 /* Set up region A. */
1851 frv_frame_access_standard_regs (FRV_STORE, info);
1852
1853 /* If this is a varargs/stdarg function, issue a blockage to prevent the
1854 scheduler from moving loads before the stores saving the registers. */
1855 if (info->stdarg_size > 0)
1856 emit_insn (gen_blockage ());
1857
1858 /* Set up pic register/small data register for this function. */
1859 if (!TARGET_FDPIC && flag_pic && cfun->uses_pic_offset_table)
1860 emit_insn (gen_pic_prologue (gen_rtx_REG (Pmode, PIC_REGNO),
1861 gen_rtx_REG (Pmode, LR_REGNO),
1862 gen_rtx_REG (SImode, OFFSET_REGNO)));
1863 }
1864
1865 \f
1866 /* Under frv, all of the work is done via frv_expand_epilogue, but
1867 this function provides a convenient place to do cleanup. */
1868
1869 static void
1870 frv_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
1871 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
1872 {
1873 frv_stack_cache = (frv_stack_t *)0;
1874
1875 /* Zap last used registers for conditional execution. */
1876 memset (&frv_ifcvt.tmp_reg, 0, sizeof (frv_ifcvt.tmp_reg));
1877
1878 /* Release the bitmap of created insns. */
1879 BITMAP_FREE (frv_ifcvt.scratch_insns_bitmap);
1880 }
1881
1882 \f
1883 /* Called after register allocation to add any instructions needed for the
1884 epilogue. Using an epilogue insn is favored compared to putting all of the
1885 instructions in the TARGET_ASM_FUNCTION_PROLOGUE target hook, since
1886 it allows the scheduler to intermix instructions with the saves of
1887 the caller saved registers. In some cases, it might be necessary
1888 to emit a barrier instruction as the last insn to prevent such
1889 scheduling. */
1890
1891 void
1892 frv_expand_epilogue (bool emit_return)
1893 {
1894 frv_stack_t *info = frv_stack_info ();
1895 rtx fp = frame_pointer_rtx;
1896 rtx sp = stack_pointer_rtx;
1897 rtx return_addr;
1898 int fp_offset;
1899
1900 fp_offset = info->reg_offset[FRAME_POINTER_REGNUM];
1901
1902 /* Restore the stack pointer to its original value if alloca or the like
1903 is used. */
1904 if (! current_function_sp_is_unchanging)
1905 emit_insn (gen_addsi3 (sp, fp, frv_frame_offset_rtx (-fp_offset)));
1906
1907 /* Restore the callee-saved registers that were used in this function. */
1908 frv_frame_access_standard_regs (FRV_LOAD, info);
1909
1910 /* Set RETURN_ADDR to the address we should return to. Set it to NULL if
1911 no return instruction should be emitted. */
1912 if (info->save_p[LR_REGNO])
1913 {
1914 int lr_offset;
1915 rtx mem;
1916
1917 /* Use the same method to access the link register's slot as we did in
1918 the prologue. In other words, use the frame pointer if available,
1919 otherwise use the stack pointer.
1920
1921 LR_OFFSET is the offset of the link register's slot from the start
1922 of the frame and MEM is a memory rtx for it. */
1923 lr_offset = info->reg_offset[LR_REGNO];
1924 if (frame_pointer_needed)
1925 mem = frv_frame_mem (Pmode, fp, lr_offset - fp_offset);
1926 else
1927 mem = frv_frame_mem (Pmode, sp, lr_offset);
1928
1929 /* Load the old link register into a GPR. */
1930 return_addr = gen_rtx_REG (Pmode, TEMP_REGNO);
1931 emit_insn (gen_rtx_SET (VOIDmode, return_addr, mem));
1932 }
1933 else
1934 return_addr = gen_rtx_REG (Pmode, LR_REGNO);
1935
1936 /* Restore the old frame pointer. Emit a USE afterwards to make sure
1937 the load is preserved. */
1938 if (frame_pointer_needed)
1939 {
1940 emit_insn (gen_rtx_SET (VOIDmode, fp, gen_rtx_MEM (Pmode, fp)));
1941 emit_insn (gen_rtx_USE (VOIDmode, fp));
1942 }
1943
1944 /* Deallocate the stack frame. */
1945 if (info->total_size != 0)
1946 {
1947 rtx offset = frv_frame_offset_rtx (info->total_size);
1948 emit_insn (gen_stack_adjust (sp, sp, offset));
1949 }
1950
1951 /* If this function uses eh_return, add the final stack adjustment now. */
1952 if (current_function_calls_eh_return)
1953 emit_insn (gen_stack_adjust (sp, sp, EH_RETURN_STACKADJ_RTX));
1954
1955 if (emit_return)
1956 emit_jump_insn (gen_epilogue_return (return_addr));
1957 else
1958 {
1959 rtx lr = return_addr;
1960
1961 if (REGNO (return_addr) != LR_REGNO)
1962 {
1963 lr = gen_rtx_REG (Pmode, LR_REGNO);
1964 emit_move_insn (lr, return_addr);
1965 }
1966
1967 emit_insn (gen_rtx_USE (VOIDmode, lr));
1968 }
1969 }
1970
1971 \f
1972 /* Worker function for TARGET_ASM_OUTPUT_MI_THUNK. */
1973
1974 static void
1975 frv_asm_output_mi_thunk (FILE *file,
1976 tree thunk_fndecl ATTRIBUTE_UNUSED,
1977 HOST_WIDE_INT delta,
1978 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED,
1979 tree function)
1980 {
1981 const char *name_func = XSTR (XEXP (DECL_RTL (function), 0), 0);
1982 const char *name_arg0 = reg_names[FIRST_ARG_REGNUM];
1983 const char *name_jmp = reg_names[JUMP_REGNO];
1984 const char *parallel = (frv_issue_rate () > 1 ? ".p" : "");
1985
1986 /* Do the add using an addi if possible. */
1987 if (IN_RANGE_P (delta, -2048, 2047))
1988 fprintf (file, "\taddi %s,#%d,%s\n", name_arg0, (int) delta, name_arg0);
1989 else
1990 {
1991 const char *const name_add = reg_names[TEMP_REGNO];
1992 fprintf (file, "\tsethi%s #hi(" HOST_WIDE_INT_PRINT_DEC "),%s\n",
1993 parallel, delta, name_add);
1994 fprintf (file, "\tsetlo #lo(" HOST_WIDE_INT_PRINT_DEC "),%s\n",
1995 delta, name_add);
1996 fprintf (file, "\tadd %s,%s,%s\n", name_add, name_arg0, name_arg0);
1997 }
1998
1999 if (TARGET_FDPIC)
2000 {
2001 const char *name_pic = reg_names[FDPIC_REGNO];
2002 name_jmp = reg_names[FDPIC_FPTR_REGNO];
2003
2004 if (flag_pic != 1)
2005 {
2006 fprintf (file, "\tsethi%s #gotofffuncdeschi(", parallel);
2007 assemble_name (file, name_func);
2008 fprintf (file, "),%s\n", name_jmp);
2009
2010 fprintf (file, "\tsetlo #gotofffuncdesclo(");
2011 assemble_name (file, name_func);
2012 fprintf (file, "),%s\n", name_jmp);
2013
2014 fprintf (file, "\tldd @(%s,%s), %s\n", name_jmp, name_pic, name_jmp);
2015 }
2016 else
2017 {
2018 fprintf (file, "\tlddo @(%s,#gotofffuncdesc12(", name_pic);
2019 assemble_name (file, name_func);
2020 fprintf (file, "\t)), %s\n", name_jmp);
2021 }
2022 }
2023 else if (!flag_pic)
2024 {
2025 fprintf (file, "\tsethi%s #hi(", parallel);
2026 assemble_name (file, name_func);
2027 fprintf (file, "),%s\n", name_jmp);
2028
2029 fprintf (file, "\tsetlo #lo(");
2030 assemble_name (file, name_func);
2031 fprintf (file, "),%s\n", name_jmp);
2032 }
2033 else
2034 {
2035 /* Use JUMP_REGNO as a temporary PIC register. */
2036 const char *name_lr = reg_names[LR_REGNO];
2037 const char *name_gppic = name_jmp;
2038 const char *name_tmp = reg_names[TEMP_REGNO];
2039
2040 fprintf (file, "\tmovsg %s,%s\n", name_lr, name_tmp);
2041 fprintf (file, "\tcall 1f\n");
2042 fprintf (file, "1:\tmovsg %s,%s\n", name_lr, name_gppic);
2043 fprintf (file, "\tmovgs %s,%s\n", name_tmp, name_lr);
2044 fprintf (file, "\tsethi%s #gprelhi(1b),%s\n", parallel, name_tmp);
2045 fprintf (file, "\tsetlo #gprello(1b),%s\n", name_tmp);
2046 fprintf (file, "\tsub %s,%s,%s\n", name_gppic, name_tmp, name_gppic);
2047
2048 fprintf (file, "\tsethi%s #gprelhi(", parallel);
2049 assemble_name (file, name_func);
2050 fprintf (file, "),%s\n", name_tmp);
2051
2052 fprintf (file, "\tsetlo #gprello(");
2053 assemble_name (file, name_func);
2054 fprintf (file, "),%s\n", name_tmp);
2055
2056 fprintf (file, "\tadd %s,%s,%s\n", name_gppic, name_tmp, name_jmp);
2057 }
2058
2059 /* Jump to the function address. */
2060 fprintf (file, "\tjmpl @(%s,%s)\n", name_jmp, reg_names[GPR_FIRST+0]);
2061 }
2062
2063 \f
2064 /* A C expression which is nonzero if a function must have and use a frame
2065 pointer. This expression is evaluated in the reload pass. If its value is
2066 nonzero the function will have a frame pointer.
2067
2068 The expression can in principle examine the current function and decide
2069 according to the facts, but on most machines the constant 0 or the constant
2070 1 suffices. Use 0 when the machine allows code to be generated with no
2071 frame pointer, and doing so saves some time or space. Use 1 when there is
2072 no possible advantage to avoiding a frame pointer.
2073
2074 In certain cases, the compiler does not know how to produce valid code
2075 without a frame pointer. The compiler recognizes those cases and
2076 automatically gives the function a frame pointer regardless of what
2077 `FRAME_POINTER_REQUIRED' says. You don't need to worry about them.
2078
2079 In a function that does not require a frame pointer, the frame pointer
2080 register can be allocated for ordinary usage, unless you mark it as a fixed
2081 register. See `FIXED_REGISTERS' for more information. */
2082
2083 /* On frv, create a frame whenever we need to create stack. */
2084
2085 int
2086 frv_frame_pointer_required (void)
2087 {
2088 /* If we forgoing the usual linkage requirements, we only need
2089 a frame pointer if the stack pointer might change. */
2090 if (!TARGET_LINKED_FP)
2091 return !current_function_sp_is_unchanging;
2092
2093 if (! current_function_is_leaf)
2094 return TRUE;
2095
2096 if (get_frame_size () != 0)
2097 return TRUE;
2098
2099 if (cfun->stdarg)
2100 return TRUE;
2101
2102 if (!current_function_sp_is_unchanging)
2103 return TRUE;
2104
2105 if (!TARGET_FDPIC && flag_pic && cfun->uses_pic_offset_table)
2106 return TRUE;
2107
2108 if (profile_flag)
2109 return TRUE;
2110
2111 if (cfun->machine->frame_needed)
2112 return TRUE;
2113
2114 return FALSE;
2115 }
2116
2117 \f
2118 /* This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'. It specifies the
2119 initial difference between the specified pair of registers. This macro must
2120 be defined if `ELIMINABLE_REGS' is defined. */
2121
2122 /* See frv_stack_info for more details on the frv stack frame. */
2123
2124 int
2125 frv_initial_elimination_offset (int from, int to)
2126 {
2127 frv_stack_t *info = frv_stack_info ();
2128 int ret = 0;
2129
2130 if (to == STACK_POINTER_REGNUM && from == ARG_POINTER_REGNUM)
2131 ret = info->total_size - info->pretend_size;
2132
2133 else if (to == STACK_POINTER_REGNUM && from == FRAME_POINTER_REGNUM)
2134 ret = info->reg_offset[FRAME_POINTER_REGNUM];
2135
2136 else if (to == FRAME_POINTER_REGNUM && from == ARG_POINTER_REGNUM)
2137 ret = (info->total_size
2138 - info->reg_offset[FRAME_POINTER_REGNUM]
2139 - info->pretend_size);
2140
2141 else
2142 abort ();
2143
2144 if (TARGET_DEBUG_STACK)
2145 fprintf (stderr, "Eliminate %s to %s by adding %d\n",
2146 reg_names [from], reg_names[to], ret);
2147
2148 return ret;
2149 }
2150
2151 \f
2152 /* Worker function for TARGET_SETUP_INCOMING_VARARGS. */
2153
2154 static void
2155 frv_setup_incoming_varargs (CUMULATIVE_ARGS *cum,
2156 enum machine_mode mode,
2157 tree type ATTRIBUTE_UNUSED,
2158 int *pretend_size,
2159 int second_time)
2160 {
2161 if (TARGET_DEBUG_ARG)
2162 fprintf (stderr,
2163 "setup_vararg: words = %2d, mode = %4s, pretend_size = %d, second_time = %d\n",
2164 *cum, GET_MODE_NAME (mode), *pretend_size, second_time);
2165 }
2166
2167 \f
2168 /* Worker function for TARGET_EXPAND_BUILTIN_SAVEREGS. */
2169
2170 static rtx
2171 frv_expand_builtin_saveregs (void)
2172 {
2173 int offset = UNITS_PER_WORD * FRV_NUM_ARG_REGS;
2174
2175 if (TARGET_DEBUG_ARG)
2176 fprintf (stderr, "expand_builtin_saveregs: offset from ap = %d\n",
2177 offset);
2178
2179 return gen_rtx_PLUS (Pmode, virtual_incoming_args_rtx, GEN_INT (- offset));
2180 }
2181
2182 \f
2183 /* Expand __builtin_va_start to do the va_start macro. */
2184
2185 void
2186 frv_expand_builtin_va_start (tree valist, rtx nextarg)
2187 {
2188 tree t;
2189 int num = cfun->args_info - FIRST_ARG_REGNUM - FRV_NUM_ARG_REGS;
2190
2191 nextarg = gen_rtx_PLUS (Pmode, virtual_incoming_args_rtx,
2192 GEN_INT (UNITS_PER_WORD * num));
2193
2194 if (TARGET_DEBUG_ARG)
2195 {
2196 fprintf (stderr, "va_start: args_info = %d, num = %d\n",
2197 cfun->args_info, num);
2198
2199 debug_rtx (nextarg);
2200 }
2201
2202 t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
2203 make_tree (ptr_type_node, nextarg));
2204 TREE_SIDE_EFFECTS (t) = 1;
2205
2206 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2207 }
2208
2209 \f
2210 /* Expand a block move operation, and return 1 if successful. Return 0
2211 if we should let the compiler generate normal code.
2212
2213 operands[0] is the destination
2214 operands[1] is the source
2215 operands[2] is the length
2216 operands[3] is the alignment */
2217
2218 /* Maximum number of loads to do before doing the stores */
2219 #ifndef MAX_MOVE_REG
2220 #define MAX_MOVE_REG 4
2221 #endif
2222
2223 /* Maximum number of total loads to do. */
2224 #ifndef TOTAL_MOVE_REG
2225 #define TOTAL_MOVE_REG 8
2226 #endif
2227
2228 int
2229 frv_expand_block_move (rtx operands[])
2230 {
2231 rtx orig_dest = operands[0];
2232 rtx orig_src = operands[1];
2233 rtx bytes_rtx = operands[2];
2234 rtx align_rtx = operands[3];
2235 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
2236 int align;
2237 int bytes;
2238 int offset;
2239 int num_reg;
2240 int i;
2241 rtx src_reg;
2242 rtx dest_reg;
2243 rtx src_addr;
2244 rtx dest_addr;
2245 rtx src_mem;
2246 rtx dest_mem;
2247 rtx tmp_reg;
2248 rtx stores[MAX_MOVE_REG];
2249 int move_bytes;
2250 enum machine_mode mode;
2251
2252 /* If this is not a fixed size move, just call memcpy. */
2253 if (! constp)
2254 return FALSE;
2255
2256 /* If this is not a fixed size alignment, abort. */
2257 if (GET_CODE (align_rtx) != CONST_INT)
2258 abort ();
2259
2260 align = INTVAL (align_rtx);
2261
2262 /* Anything to move? */
2263 bytes = INTVAL (bytes_rtx);
2264 if (bytes <= 0)
2265 return TRUE;
2266
2267 /* Don't support real large moves. */
2268 if (bytes > TOTAL_MOVE_REG*align)
2269 return FALSE;
2270
2271 /* Move the address into scratch registers. */
2272 dest_reg = copy_addr_to_reg (XEXP (orig_dest, 0));
2273 src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
2274
2275 num_reg = offset = 0;
2276 for ( ; bytes > 0; (bytes -= move_bytes), (offset += move_bytes))
2277 {
2278 /* Calculate the correct offset for src/dest. */
2279 if (offset == 0)
2280 {
2281 src_addr = src_reg;
2282 dest_addr = dest_reg;
2283 }
2284 else
2285 {
2286 src_addr = plus_constant (src_reg, offset);
2287 dest_addr = plus_constant (dest_reg, offset);
2288 }
2289
2290 /* Generate the appropriate load and store, saving the stores
2291 for later. */
2292 if (bytes >= 4 && align >= 4)
2293 mode = SImode;
2294 else if (bytes >= 2 && align >= 2)
2295 mode = HImode;
2296 else
2297 mode = QImode;
2298
2299 move_bytes = GET_MODE_SIZE (mode);
2300 tmp_reg = gen_reg_rtx (mode);
2301 src_mem = change_address (orig_src, mode, src_addr);
2302 dest_mem = change_address (orig_dest, mode, dest_addr);
2303 emit_insn (gen_rtx_SET (VOIDmode, tmp_reg, src_mem));
2304 stores[num_reg++] = gen_rtx_SET (VOIDmode, dest_mem, tmp_reg);
2305
2306 if (num_reg >= MAX_MOVE_REG)
2307 {
2308 for (i = 0; i < num_reg; i++)
2309 emit_insn (stores[i]);
2310 num_reg = 0;
2311 }
2312 }
2313
2314 for (i = 0; i < num_reg; i++)
2315 emit_insn (stores[i]);
2316
2317 return TRUE;
2318 }
2319
2320 \f
2321 /* Expand a block clear operation, and return 1 if successful. Return 0
2322 if we should let the compiler generate normal code.
2323
2324 operands[0] is the destination
2325 operands[1] is the length
2326 operands[2] is the alignment */
2327
2328 int
2329 frv_expand_block_clear (rtx operands[])
2330 {
2331 rtx orig_dest = operands[0];
2332 rtx bytes_rtx = operands[1];
2333 rtx align_rtx = operands[2];
2334 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
2335 int align;
2336 int bytes;
2337 int offset;
2338 int num_reg;
2339 rtx dest_reg;
2340 rtx dest_addr;
2341 rtx dest_mem;
2342 int clear_bytes;
2343 enum machine_mode mode;
2344
2345 /* If this is not a fixed size move, just call memcpy. */
2346 if (! constp)
2347 return FALSE;
2348
2349 /* If this is not a fixed size alignment, abort. */
2350 if (GET_CODE (align_rtx) != CONST_INT)
2351 abort ();
2352
2353 align = INTVAL (align_rtx);
2354
2355 /* Anything to move? */
2356 bytes = INTVAL (bytes_rtx);
2357 if (bytes <= 0)
2358 return TRUE;
2359
2360 /* Don't support real large clears. */
2361 if (bytes > TOTAL_MOVE_REG*align)
2362 return FALSE;
2363
2364 /* Move the address into a scratch register. */
2365 dest_reg = copy_addr_to_reg (XEXP (orig_dest, 0));
2366
2367 num_reg = offset = 0;
2368 for ( ; bytes > 0; (bytes -= clear_bytes), (offset += clear_bytes))
2369 {
2370 /* Calculate the correct offset for src/dest. */
2371 dest_addr = ((offset == 0)
2372 ? dest_reg
2373 : plus_constant (dest_reg, offset));
2374
2375 /* Generate the appropriate store of gr0. */
2376 if (bytes >= 4 && align >= 4)
2377 mode = SImode;
2378 else if (bytes >= 2 && align >= 2)
2379 mode = HImode;
2380 else
2381 mode = QImode;
2382
2383 clear_bytes = GET_MODE_SIZE (mode);
2384 dest_mem = change_address (orig_dest, mode, dest_addr);
2385 emit_insn (gen_rtx_SET (VOIDmode, dest_mem, const0_rtx));
2386 }
2387
2388 return TRUE;
2389 }
2390
2391 \f
2392 /* The following variable is used to output modifiers of assembler
2393 code of the current output insn. */
2394
2395 static rtx *frv_insn_operands;
2396
2397 /* The following function is used to add assembler insn code suffix .p
2398 if it is necessary. */
2399
2400 const char *
2401 frv_asm_output_opcode (FILE *f, const char *ptr)
2402 {
2403 int c;
2404
2405 if (frv_insn_packing_flag <= 0)
2406 return ptr;
2407
2408 for (; *ptr && *ptr != ' ' && *ptr != '\t';)
2409 {
2410 c = *ptr++;
2411 if (c == '%' && ((*ptr >= 'a' && *ptr <= 'z')
2412 || (*ptr >= 'A' && *ptr <= 'Z')))
2413 {
2414 int letter = *ptr++;
2415
2416 c = atoi (ptr);
2417 frv_print_operand (f, frv_insn_operands [c], letter);
2418 while ((c = *ptr) >= '0' && c <= '9')
2419 ptr++;
2420 }
2421 else
2422 fputc (c, f);
2423 }
2424
2425 fprintf (f, ".p");
2426
2427 return ptr;
2428 }
2429
2430 /* Set up the packing bit for the current output insn. Note that this
2431 function is not called for asm insns. */
2432
2433 void
2434 frv_final_prescan_insn (rtx insn, rtx *opvec,
2435 int noperands ATTRIBUTE_UNUSED)
2436 {
2437 if (INSN_P (insn))
2438 {
2439 if (frv_insn_packing_flag >= 0)
2440 {
2441 frv_insn_operands = opvec;
2442 frv_insn_packing_flag = PACKING_FLAG_P (insn);
2443 }
2444 else if (recog_memoized (insn) >= 0
2445 && get_attr_acc_group (insn) == ACC_GROUP_ODD)
2446 /* Packing optimizations have been disabled, but INSN can only
2447 be issued in M1. Insert an mnop in M0. */
2448 fprintf (asm_out_file, "\tmnop.p\n");
2449 }
2450 }
2451
2452
2453 \f
2454 /* A C expression whose value is RTL representing the address in a stack frame
2455 where the pointer to the caller's frame is stored. Assume that FRAMEADDR is
2456 an RTL expression for the address of the stack frame itself.
2457
2458 If you don't define this macro, the default is to return the value of
2459 FRAMEADDR--that is, the stack frame address is also the address of the stack
2460 word that points to the previous frame. */
2461
2462 /* The default is correct, but we need to make sure the frame gets created. */
2463 rtx
2464 frv_dynamic_chain_address (rtx frame)
2465 {
2466 cfun->machine->frame_needed = 1;
2467 return frame;
2468 }
2469
2470
2471 /* A C expression whose value is RTL representing the value of the return
2472 address for the frame COUNT steps up from the current frame, after the
2473 prologue. FRAMEADDR is the frame pointer of the COUNT frame, or the frame
2474 pointer of the COUNT - 1 frame if `RETURN_ADDR_IN_PREVIOUS_FRAME' is
2475 defined.
2476
2477 The value of the expression must always be the correct address when COUNT is
2478 zero, but may be `NULL_RTX' if there is not way to determine the return
2479 address of other frames. */
2480
2481 rtx
2482 frv_return_addr_rtx (int count, rtx frame)
2483 {
2484 if (count != 0)
2485 return const0_rtx;
2486 cfun->machine->frame_needed = 1;
2487 return gen_rtx_MEM (Pmode, plus_constant (frame, 8));
2488 }
2489
2490 /* Given a memory reference MEMREF, interpret the referenced memory as
2491 an array of MODE values, and return a reference to the element
2492 specified by INDEX. Assume that any pre-modification implicit in
2493 MEMREF has already happened.
2494
2495 MEMREF must be a legitimate operand for modes larger than SImode.
2496 GO_IF_LEGITIMATE_ADDRESS forbids register+register addresses, which
2497 this function cannot handle. */
2498 rtx
2499 frv_index_memory (rtx memref, enum machine_mode mode, int index)
2500 {
2501 rtx base = XEXP (memref, 0);
2502 if (GET_CODE (base) == PRE_MODIFY)
2503 base = XEXP (base, 0);
2504 return change_address (memref, mode,
2505 plus_constant (base, index * GET_MODE_SIZE (mode)));
2506 }
2507
2508 \f
2509 /* Print a memory address as an operand to reference that memory location. */
2510 void
2511 frv_print_operand_address (FILE * stream, rtx x)
2512 {
2513 if (GET_CODE (x) == MEM)
2514 x = XEXP (x, 0);
2515
2516 switch (GET_CODE (x))
2517 {
2518 case REG:
2519 fputs (reg_names [ REGNO (x)], stream);
2520 return;
2521
2522 case CONST_INT:
2523 fprintf (stream, "%ld", (long) INTVAL (x));
2524 return;
2525
2526 case SYMBOL_REF:
2527 assemble_name (stream, XSTR (x, 0));
2528 return;
2529
2530 case LABEL_REF:
2531 case CONST:
2532 output_addr_const (stream, x);
2533 return;
2534
2535 default:
2536 break;
2537 }
2538
2539 fatal_insn ("Bad insn to frv_print_operand_address:", x);
2540 }
2541
2542 \f
2543 static void
2544 frv_print_operand_memory_reference_reg (FILE * stream, rtx x)
2545 {
2546 int regno = true_regnum (x);
2547 if (GPR_P (regno))
2548 fputs (reg_names[regno], stream);
2549 else
2550 fatal_insn ("Bad register to frv_print_operand_memory_reference_reg:", x);
2551 }
2552
2553 /* Print a memory reference suitable for the ld/st instructions. */
2554
2555 static void
2556 frv_print_operand_memory_reference (FILE * stream, rtx x, int addr_offset)
2557 {
2558 struct frv_unspec unspec;
2559 rtx x0 = NULL_RTX;
2560 rtx x1 = NULL_RTX;
2561
2562 switch (GET_CODE (x))
2563 {
2564 case SUBREG:
2565 case REG:
2566 x0 = x;
2567 break;
2568
2569 case PRE_MODIFY: /* (pre_modify (reg) (plus (reg) (reg))) */
2570 x0 = XEXP (x, 0);
2571 x1 = XEXP (XEXP (x, 1), 1);
2572 break;
2573
2574 case CONST_INT:
2575 x1 = x;
2576 break;
2577
2578 case PLUS:
2579 x0 = XEXP (x, 0);
2580 x1 = XEXP (x, 1);
2581 if (GET_CODE (x0) == CONST_INT)
2582 {
2583 x0 = XEXP (x, 1);
2584 x1 = XEXP (x, 0);
2585 }
2586 break;
2587
2588 default:
2589 fatal_insn ("Bad insn to frv_print_operand_memory_reference:", x);
2590 break;
2591
2592 }
2593
2594 if (addr_offset)
2595 {
2596 if (!x1)
2597 x1 = const0_rtx;
2598 else if (GET_CODE (x1) != CONST_INT)
2599 fatal_insn ("Bad insn to frv_print_operand_memory_reference:", x);
2600 }
2601
2602 fputs ("@(", stream);
2603 if (!x0)
2604 fputs (reg_names[GPR_R0], stream);
2605 else if (GET_CODE (x0) == REG || GET_CODE (x0) == SUBREG)
2606 frv_print_operand_memory_reference_reg (stream, x0);
2607 else
2608 fatal_insn ("Bad insn to frv_print_operand_memory_reference:", x);
2609
2610 fputs (",", stream);
2611 if (!x1)
2612 fputs (reg_names [GPR_R0], stream);
2613
2614 else
2615 {
2616 switch (GET_CODE (x1))
2617 {
2618 case SUBREG:
2619 case REG:
2620 frv_print_operand_memory_reference_reg (stream, x1);
2621 break;
2622
2623 case CONST_INT:
2624 fprintf (stream, "%ld", (long) (INTVAL (x1) + addr_offset));
2625 break;
2626
2627 case CONST:
2628 if (!frv_const_unspec_p (x1, &unspec))
2629 fatal_insn ("Bad insn to frv_print_operand_memory_reference:", x1);
2630 frv_output_const_unspec (stream, &unspec);
2631 break;
2632
2633 default:
2634 fatal_insn ("Bad insn to frv_print_operand_memory_reference:", x);
2635 }
2636 }
2637
2638 fputs (")", stream);
2639 }
2640
2641 \f
2642 /* Return 2 for likely branches and 0 for non-likely branches */
2643
2644 #define FRV_JUMP_LIKELY 2
2645 #define FRV_JUMP_NOT_LIKELY 0
2646
2647 static int
2648 frv_print_operand_jump_hint (rtx insn)
2649 {
2650 rtx note;
2651 rtx labelref;
2652 int ret;
2653 HOST_WIDE_INT prob = -1;
2654 enum { UNKNOWN, BACKWARD, FORWARD } jump_type = UNKNOWN;
2655
2656 if (GET_CODE (insn) != JUMP_INSN)
2657 abort ();
2658
2659 /* Assume any non-conditional jump is likely. */
2660 if (! any_condjump_p (insn))
2661 ret = FRV_JUMP_LIKELY;
2662
2663 else
2664 {
2665 labelref = condjump_label (insn);
2666 if (labelref)
2667 {
2668 rtx label = XEXP (labelref, 0);
2669 jump_type = (insn_current_address > INSN_ADDRESSES (INSN_UID (label))
2670 ? BACKWARD
2671 : FORWARD);
2672 }
2673
2674 note = find_reg_note (insn, REG_BR_PROB, 0);
2675 if (!note)
2676 ret = ((jump_type == BACKWARD) ? FRV_JUMP_LIKELY : FRV_JUMP_NOT_LIKELY);
2677
2678 else
2679 {
2680 prob = INTVAL (XEXP (note, 0));
2681 ret = ((prob >= (REG_BR_PROB_BASE / 2))
2682 ? FRV_JUMP_LIKELY
2683 : FRV_JUMP_NOT_LIKELY);
2684 }
2685 }
2686
2687 #if 0
2688 if (TARGET_DEBUG)
2689 {
2690 char *direction;
2691
2692 switch (jump_type)
2693 {
2694 default:
2695 case UNKNOWN: direction = "unknown jump direction"; break;
2696 case BACKWARD: direction = "jump backward"; break;
2697 case FORWARD: direction = "jump forward"; break;
2698 }
2699
2700 fprintf (stderr,
2701 "%s: uid %ld, %s, probability = %ld, max prob. = %ld, hint = %d\n",
2702 IDENTIFIER_POINTER (DECL_NAME (current_function_decl)),
2703 (long)INSN_UID (insn), direction, (long)prob,
2704 (long)REG_BR_PROB_BASE, ret);
2705 }
2706 #endif
2707
2708 return ret;
2709 }
2710
2711 \f
2712 /* Return the comparison operator to use for CODE given that the ICC
2713 register is OP0. */
2714
2715 static const char *
2716 comparison_string (enum rtx_code code, rtx op0)
2717 {
2718 bool is_nz_p = GET_MODE (op0) == CC_NZmode;
2719 switch (code)
2720 {
2721 default: output_operand_lossage ("bad condition code");
2722 case EQ: return "eq";
2723 case NE: return "ne";
2724 case LT: return is_nz_p ? "n" : "lt";
2725 case LE: return "le";
2726 case GT: return "gt";
2727 case GE: return is_nz_p ? "p" : "ge";
2728 case LTU: return is_nz_p ? "no" : "c";
2729 case LEU: return is_nz_p ? "eq" : "ls";
2730 case GTU: return is_nz_p ? "ne" : "hi";
2731 case GEU: return is_nz_p ? "ra" : "nc";
2732 }
2733 }
2734
2735 /* Print an operand to an assembler instruction.
2736
2737 `%' followed by a letter and a digit says to output an operand in an
2738 alternate fashion. Four letters have standard, built-in meanings described
2739 below. The machine description macro `PRINT_OPERAND' can define additional
2740 letters with nonstandard meanings.
2741
2742 `%cDIGIT' can be used to substitute an operand that is a constant value
2743 without the syntax that normally indicates an immediate operand.
2744
2745 `%nDIGIT' is like `%cDIGIT' except that the value of the constant is negated
2746 before printing.
2747
2748 `%aDIGIT' can be used to substitute an operand as if it were a memory
2749 reference, with the actual operand treated as the address. This may be
2750 useful when outputting a "load address" instruction, because often the
2751 assembler syntax for such an instruction requires you to write the operand
2752 as if it were a memory reference.
2753
2754 `%lDIGIT' is used to substitute a `label_ref' into a jump instruction.
2755
2756 `%=' outputs a number which is unique to each instruction in the entire
2757 compilation. This is useful for making local labels to be referred to more
2758 than once in a single template that generates multiple assembler
2759 instructions.
2760
2761 `%' followed by a punctuation character specifies a substitution that does
2762 not use an operand. Only one case is standard: `%%' outputs a `%' into the
2763 assembler code. Other nonstandard cases can be defined in the
2764 `PRINT_OPERAND' macro. You must also define which punctuation characters
2765 are valid with the `PRINT_OPERAND_PUNCT_VALID_P' macro. */
2766
2767 void
2768 frv_print_operand (FILE * file, rtx x, int code)
2769 {
2770 struct frv_unspec unspec;
2771 HOST_WIDE_INT value;
2772 int offset;
2773
2774 if (code != 0 && !isalpha (code))
2775 value = 0;
2776
2777 else if (GET_CODE (x) == CONST_INT)
2778 value = INTVAL (x);
2779
2780 else if (GET_CODE (x) == CONST_DOUBLE)
2781 {
2782 if (GET_MODE (x) == SFmode)
2783 {
2784 REAL_VALUE_TYPE rv;
2785 long l;
2786
2787 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
2788 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
2789 value = l;
2790 }
2791
2792 else if (GET_MODE (x) == VOIDmode)
2793 value = CONST_DOUBLE_LOW (x);
2794
2795 else
2796 fatal_insn ("Bad insn in frv_print_operand, bad const_double", x);
2797 }
2798
2799 else
2800 value = 0;
2801
2802 switch (code)
2803 {
2804
2805 case '.':
2806 /* Output r0. */
2807 fputs (reg_names[GPR_R0], file);
2808 break;
2809
2810 case '#':
2811 fprintf (file, "%d", frv_print_operand_jump_hint (current_output_insn));
2812 break;
2813
2814 case '@':
2815 /* Output small data area base register (gr16). */
2816 fputs (reg_names[SDA_BASE_REG], file);
2817 break;
2818
2819 case '~':
2820 /* Output pic register (gr17). */
2821 fputs (reg_names[PIC_REGNO], file);
2822 break;
2823
2824 case '*':
2825 /* Output the temporary integer CCR register. */
2826 fputs (reg_names[ICR_TEMP], file);
2827 break;
2828
2829 case '&':
2830 /* Output the temporary integer CC register. */
2831 fputs (reg_names[ICC_TEMP], file);
2832 break;
2833
2834 /* case 'a': print an address. */
2835
2836 case 'C':
2837 /* Print appropriate test for integer branch false operation. */
2838 fputs (comparison_string (reverse_condition (GET_CODE (x)),
2839 XEXP (x, 0)), file);
2840 break;
2841
2842 case 'c':
2843 /* Print appropriate test for integer branch true operation. */
2844 fputs (comparison_string (GET_CODE (x), XEXP (x, 0)), file);
2845 break;
2846
2847 case 'e':
2848 /* Print 1 for a NE and 0 for an EQ to give the final argument
2849 for a conditional instruction. */
2850 if (GET_CODE (x) == NE)
2851 fputs ("1", file);
2852
2853 else if (GET_CODE (x) == EQ)
2854 fputs ("0", file);
2855
2856 else
2857 fatal_insn ("Bad insn to frv_print_operand, 'e' modifier:", x);
2858 break;
2859
2860 case 'F':
2861 /* Print appropriate test for floating point branch false operation. */
2862 switch (GET_CODE (x))
2863 {
2864 default:
2865 fatal_insn ("Bad insn to frv_print_operand, 'F' modifier:", x);
2866
2867 case EQ: fputs ("ne", file); break;
2868 case NE: fputs ("eq", file); break;
2869 case LT: fputs ("uge", file); break;
2870 case LE: fputs ("ug", file); break;
2871 case GT: fputs ("ule", file); break;
2872 case GE: fputs ("ul", file); break;
2873 }
2874 break;
2875
2876 case 'f':
2877 /* Print appropriate test for floating point branch true operation. */
2878 switch (GET_CODE (x))
2879 {
2880 default:
2881 fatal_insn ("Bad insn to frv_print_operand, 'f' modifier:", x);
2882
2883 case EQ: fputs ("eq", file); break;
2884 case NE: fputs ("ne", file); break;
2885 case LT: fputs ("lt", file); break;
2886 case LE: fputs ("le", file); break;
2887 case GT: fputs ("gt", file); break;
2888 case GE: fputs ("ge", file); break;
2889 }
2890 break;
2891
2892 case 'g':
2893 /* Print appropriate GOT function. */
2894 if (GET_CODE (x) != CONST_INT)
2895 fatal_insn ("Bad insn to frv_print_operand, 'g' modifier:", x);
2896 fputs (unspec_got_name (INTVAL (x)), file);
2897 break;
2898
2899 case 'I':
2900 /* Print 'i' if the operand is a constant, or is a memory reference that
2901 adds a constant. */
2902 if (GET_CODE (x) == MEM)
2903 x = ((GET_CODE (XEXP (x, 0)) == PLUS)
2904 ? XEXP (XEXP (x, 0), 1)
2905 : XEXP (x, 0));
2906 else if (GET_CODE (x) == PLUS)
2907 x = XEXP (x, 1);
2908
2909 switch (GET_CODE (x))
2910 {
2911 default:
2912 break;
2913
2914 case CONST_INT:
2915 case SYMBOL_REF:
2916 case CONST:
2917 fputs ("i", file);
2918 break;
2919 }
2920 break;
2921
2922 case 'i':
2923 /* For jump instructions, print 'i' if the operand is a constant or
2924 is an expression that adds a constant. */
2925 if (GET_CODE (x) == CONST_INT)
2926 fputs ("i", file);
2927
2928 else
2929 {
2930 if (GET_CODE (x) == CONST_INT
2931 || (GET_CODE (x) == PLUS
2932 && (GET_CODE (XEXP (x, 1)) == CONST_INT
2933 || GET_CODE (XEXP (x, 0)) == CONST_INT)))
2934 fputs ("i", file);
2935 }
2936 break;
2937
2938 case 'L':
2939 /* Print the lower register of a double word register pair */
2940 if (GET_CODE (x) == REG)
2941 fputs (reg_names[ REGNO (x)+1 ], file);
2942 else
2943 fatal_insn ("Bad insn to frv_print_operand, 'L' modifier:", x);
2944 break;
2945
2946 /* case 'l': print a LABEL_REF. */
2947
2948 case 'M':
2949 case 'N':
2950 /* Print a memory reference for ld/st/jmp, %N prints a memory reference
2951 for the second word of double memory operations. */
2952 offset = (code == 'M') ? 0 : UNITS_PER_WORD;
2953 switch (GET_CODE (x))
2954 {
2955 default:
2956 fatal_insn ("Bad insn to frv_print_operand, 'M/N' modifier:", x);
2957
2958 case MEM:
2959 frv_print_operand_memory_reference (file, XEXP (x, 0), offset);
2960 break;
2961
2962 case REG:
2963 case SUBREG:
2964 case CONST_INT:
2965 case PLUS:
2966 case SYMBOL_REF:
2967 frv_print_operand_memory_reference (file, x, offset);
2968 break;
2969 }
2970 break;
2971
2972 case 'O':
2973 /* Print the opcode of a command. */
2974 switch (GET_CODE (x))
2975 {
2976 default:
2977 fatal_insn ("Bad insn to frv_print_operand, 'O' modifier:", x);
2978
2979 case PLUS: fputs ("add", file); break;
2980 case MINUS: fputs ("sub", file); break;
2981 case AND: fputs ("and", file); break;
2982 case IOR: fputs ("or", file); break;
2983 case XOR: fputs ("xor", file); break;
2984 case ASHIFT: fputs ("sll", file); break;
2985 case ASHIFTRT: fputs ("sra", file); break;
2986 case LSHIFTRT: fputs ("srl", file); break;
2987 }
2988 break;
2989
2990 /* case 'n': negate and print a constant int. */
2991
2992 case 'P':
2993 /* Print PIC label using operand as the number. */
2994 if (GET_CODE (x) != CONST_INT)
2995 fatal_insn ("Bad insn to frv_print_operand, P modifier:", x);
2996
2997 fprintf (file, ".LCF%ld", (long)INTVAL (x));
2998 break;
2999
3000 case 'U':
3001 /* Print 'u' if the operand is a update load/store. */
3002 if (GET_CODE (x) == MEM && GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
3003 fputs ("u", file);
3004 break;
3005
3006 case 'z':
3007 /* If value is 0, print gr0, otherwise it must be a register. */
3008 if (GET_CODE (x) == CONST_INT && INTVAL (x) == 0)
3009 fputs (reg_names[GPR_R0], file);
3010
3011 else if (GET_CODE (x) == REG)
3012 fputs (reg_names [REGNO (x)], file);
3013
3014 else
3015 fatal_insn ("Bad insn in frv_print_operand, z case", x);
3016 break;
3017
3018 case 'x':
3019 /* Print constant in hex. */
3020 if (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE)
3021 {
3022 fprintf (file, "%s0x%.4lx", IMMEDIATE_PREFIX, (long) value);
3023 break;
3024 }
3025
3026 /* Fall through. */
3027
3028 case '\0':
3029 if (GET_CODE (x) == REG)
3030 fputs (reg_names [REGNO (x)], file);
3031
3032 else if (GET_CODE (x) == CONST_INT
3033 || GET_CODE (x) == CONST_DOUBLE)
3034 fprintf (file, "%s%ld", IMMEDIATE_PREFIX, (long) value);
3035
3036 else if (frv_const_unspec_p (x, &unspec))
3037 frv_output_const_unspec (file, &unspec);
3038
3039 else if (GET_CODE (x) == MEM)
3040 frv_print_operand_address (file, XEXP (x, 0));
3041
3042 else if (CONSTANT_ADDRESS_P (x))
3043 frv_print_operand_address (file, x);
3044
3045 else
3046 fatal_insn ("Bad insn in frv_print_operand, 0 case", x);
3047
3048 break;
3049
3050 default:
3051 fatal_insn ("frv_print_operand: unknown code", x);
3052 break;
3053 }
3054
3055 return;
3056 }
3057
3058 \f
3059 /* A C statement (sans semicolon) for initializing the variable CUM for the
3060 state at the beginning of the argument list. The variable has type
3061 `CUMULATIVE_ARGS'. The value of FNTYPE is the tree node for the data type
3062 of the function which will receive the args, or 0 if the args are to a
3063 compiler support library function. The value of INDIRECT is nonzero when
3064 processing an indirect call, for example a call through a function pointer.
3065 The value of INDIRECT is zero for a call to an explicitly named function, a
3066 library function call, or when `INIT_CUMULATIVE_ARGS' is used to find
3067 arguments for the function being compiled.
3068
3069 When processing a call to a compiler support library function, LIBNAME
3070 identifies which one. It is a `symbol_ref' rtx which contains the name of
3071 the function, as a string. LIBNAME is 0 when an ordinary C function call is
3072 being processed. Thus, each time this macro is called, either LIBNAME or
3073 FNTYPE is nonzero, but never both of them at once. */
3074
3075 void
3076 frv_init_cumulative_args (CUMULATIVE_ARGS *cum,
3077 tree fntype,
3078 rtx libname,
3079 tree fndecl,
3080 int incoming)
3081 {
3082 *cum = FIRST_ARG_REGNUM;
3083
3084 if (TARGET_DEBUG_ARG)
3085 {
3086 fprintf (stderr, "\ninit_cumulative_args:");
3087 if (!fndecl && fntype)
3088 fputs (" indirect", stderr);
3089
3090 if (incoming)
3091 fputs (" incoming", stderr);
3092
3093 if (fntype)
3094 {
3095 tree ret_type = TREE_TYPE (fntype);
3096 fprintf (stderr, " return=%s,",
3097 tree_code_name[ (int)TREE_CODE (ret_type) ]);
3098 }
3099
3100 if (libname && GET_CODE (libname) == SYMBOL_REF)
3101 fprintf (stderr, " libname=%s", XSTR (libname, 0));
3102
3103 if (cfun->returns_struct)
3104 fprintf (stderr, " return-struct");
3105
3106 putc ('\n', stderr);
3107 }
3108 }
3109
3110 \f
3111 /* Return true if we should pass an argument on the stack rather than
3112 in registers. */
3113
3114 static bool
3115 frv_must_pass_in_stack (enum machine_mode mode, tree type)
3116 {
3117 if (mode == BLKmode)
3118 return true;
3119 if (type == NULL)
3120 return false;
3121 return AGGREGATE_TYPE_P (type);
3122 }
3123
3124 /* If defined, a C expression that gives the alignment boundary, in bits, of an
3125 argument with the specified mode and type. If it is not defined,
3126 `PARM_BOUNDARY' is used for all arguments. */
3127
3128 int
3129 frv_function_arg_boundary (enum machine_mode mode ATTRIBUTE_UNUSED,
3130 tree type ATTRIBUTE_UNUSED)
3131 {
3132 return BITS_PER_WORD;
3133 }
3134
3135 rtx
3136 frv_function_arg (CUMULATIVE_ARGS *cum,
3137 enum machine_mode mode,
3138 tree type ATTRIBUTE_UNUSED,
3139 int named,
3140 int incoming ATTRIBUTE_UNUSED)
3141 {
3142 enum machine_mode xmode = (mode == BLKmode) ? SImode : mode;
3143 int arg_num = *cum;
3144 rtx ret;
3145 const char *debstr;
3146
3147 /* Return a marker for use in the call instruction. */
3148 if (xmode == VOIDmode)
3149 {
3150 ret = const0_rtx;
3151 debstr = "<0>";
3152 }
3153
3154 else if (arg_num <= LAST_ARG_REGNUM)
3155 {
3156 ret = gen_rtx_REG (xmode, arg_num);
3157 debstr = reg_names[arg_num];
3158 }
3159
3160 else
3161 {
3162 ret = NULL_RTX;
3163 debstr = "memory";
3164 }
3165
3166 if (TARGET_DEBUG_ARG)
3167 fprintf (stderr,
3168 "function_arg: words = %2d, mode = %4s, named = %d, size = %3d, arg = %s\n",
3169 arg_num, GET_MODE_NAME (mode), named, GET_MODE_SIZE (mode), debstr);
3170
3171 return ret;
3172 }
3173
3174 \f
3175 /* A C statement (sans semicolon) to update the summarizer variable CUM to
3176 advance past an argument in the argument list. The values MODE, TYPE and
3177 NAMED describe that argument. Once this is done, the variable CUM is
3178 suitable for analyzing the *following* argument with `FUNCTION_ARG', etc.
3179
3180 This macro need not do anything if the argument in question was passed on
3181 the stack. The compiler knows how to track the amount of stack space used
3182 for arguments without any special help. */
3183
3184 void
3185 frv_function_arg_advance (CUMULATIVE_ARGS *cum,
3186 enum machine_mode mode,
3187 tree type ATTRIBUTE_UNUSED,
3188 int named)
3189 {
3190 enum machine_mode xmode = (mode == BLKmode) ? SImode : mode;
3191 int bytes = GET_MODE_SIZE (xmode);
3192 int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3193 int arg_num = *cum;
3194
3195 *cum = arg_num + words;
3196
3197 if (TARGET_DEBUG_ARG)
3198 fprintf (stderr,
3199 "function_adv: words = %2d, mode = %4s, named = %d, size = %3d\n",
3200 arg_num, GET_MODE_NAME (mode), named, words * UNITS_PER_WORD);
3201 }
3202
3203 \f
3204 /* A C expression for the number of words, at the beginning of an argument,
3205 must be put in registers. The value must be zero for arguments that are
3206 passed entirely in registers or that are entirely pushed on the stack.
3207
3208 On some machines, certain arguments must be passed partially in registers
3209 and partially in memory. On these machines, typically the first N words of
3210 arguments are passed in registers, and the rest on the stack. If a
3211 multi-word argument (a `double' or a structure) crosses that boundary, its
3212 first few words must be passed in registers and the rest must be pushed.
3213 This macro tells the compiler when this occurs, and how many of the words
3214 should go in registers.
3215
3216 `FUNCTION_ARG' for these arguments should return the first register to be
3217 used by the caller for this argument; likewise `FUNCTION_INCOMING_ARG', for
3218 the called function. */
3219
3220 static int
3221 frv_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
3222 tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
3223 {
3224 enum machine_mode xmode = (mode == BLKmode) ? SImode : mode;
3225 int bytes = GET_MODE_SIZE (xmode);
3226 int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3227 int arg_num = *cum;
3228 int ret;
3229
3230 ret = ((arg_num <= LAST_ARG_REGNUM && arg_num + words > LAST_ARG_REGNUM+1)
3231 ? LAST_ARG_REGNUM - arg_num + 1
3232 : 0);
3233 ret *= UNITS_PER_WORD;
3234
3235 if (TARGET_DEBUG_ARG && ret)
3236 fprintf (stderr, "frv_arg_partial_bytes: %d\n", ret);
3237
3238 return ret;
3239 }
3240
3241 \f
3242 /* Return true if a register is ok to use as a base or index register. */
3243
3244 static FRV_INLINE int
3245 frv_regno_ok_for_base_p (int regno, int strict_p)
3246 {
3247 if (GPR_P (regno))
3248 return TRUE;
3249
3250 if (strict_p)
3251 return (reg_renumber[regno] >= 0 && GPR_P (reg_renumber[regno]));
3252
3253 if (regno == ARG_POINTER_REGNUM)
3254 return TRUE;
3255
3256 return (regno >= FIRST_PSEUDO_REGISTER);
3257 }
3258
3259 \f
3260 /* A C compound statement with a conditional `goto LABEL;' executed if X (an
3261 RTX) is a legitimate memory address on the target machine for a memory
3262 operand of mode MODE.
3263
3264 It usually pays to define several simpler macros to serve as subroutines for
3265 this one. Otherwise it may be too complicated to understand.
3266
3267 This macro must exist in two variants: a strict variant and a non-strict
3268 one. The strict variant is used in the reload pass. It must be defined so
3269 that any pseudo-register that has not been allocated a hard register is
3270 considered a memory reference. In contexts where some kind of register is
3271 required, a pseudo-register with no hard register must be rejected.
3272
3273 The non-strict variant is used in other passes. It must be defined to
3274 accept all pseudo-registers in every context where some kind of register is
3275 required.
3276
3277 Compiler source files that want to use the strict variant of this macro
3278 define the macro `REG_OK_STRICT'. You should use an `#ifdef REG_OK_STRICT'
3279 conditional to define the strict variant in that case and the non-strict
3280 variant otherwise.
3281
3282 Subroutines to check for acceptable registers for various purposes (one for
3283 base registers, one for index registers, and so on) are typically among the
3284 subroutines used to define `GO_IF_LEGITIMATE_ADDRESS'. Then only these
3285 subroutine macros need have two variants; the higher levels of macros may be
3286 the same whether strict or not.
3287
3288 Normally, constant addresses which are the sum of a `symbol_ref' and an
3289 integer are stored inside a `const' RTX to mark them as constant.
3290 Therefore, there is no need to recognize such sums specifically as
3291 legitimate addresses. Normally you would simply recognize any `const' as
3292 legitimate.
3293
3294 Usually `PRINT_OPERAND_ADDRESS' is not prepared to handle constant sums that
3295 are not marked with `const'. It assumes that a naked `plus' indicates
3296 indexing. If so, then you *must* reject such naked constant sums as
3297 illegitimate addresses, so that none of them will be given to
3298 `PRINT_OPERAND_ADDRESS'.
3299
3300 On some machines, whether a symbolic address is legitimate depends on the
3301 section that the address refers to. On these machines, define the macro
3302 `ENCODE_SECTION_INFO' to store the information into the `symbol_ref', and
3303 then check for it here. When you see a `const', you will have to look
3304 inside it to find the `symbol_ref' in order to determine the section.
3305
3306 The best way to modify the name string is by adding text to the beginning,
3307 with suitable punctuation to prevent any ambiguity. Allocate the new name
3308 in `saveable_obstack'. You will have to modify `ASM_OUTPUT_LABELREF' to
3309 remove and decode the added text and output the name accordingly, and define
3310 `(* targetm.strip_name_encoding)' to access the original name string.
3311
3312 You can check the information stored here into the `symbol_ref' in the
3313 definitions of the macros `GO_IF_LEGITIMATE_ADDRESS' and
3314 `PRINT_OPERAND_ADDRESS'. */
3315
3316 int
3317 frv_legitimate_address_p (enum machine_mode mode,
3318 rtx x,
3319 int strict_p,
3320 int condexec_p,
3321 int allow_double_reg_p)
3322 {
3323 rtx x0, x1;
3324 int ret = 0;
3325 HOST_WIDE_INT value;
3326 unsigned regno0;
3327
3328 if (FRV_SYMBOL_REF_TLS_P (x))
3329 return 0;
3330
3331 switch (GET_CODE (x))
3332 {
3333 default:
3334 break;
3335
3336 case SUBREG:
3337 x = SUBREG_REG (x);
3338 if (GET_CODE (x) != REG)
3339 break;
3340
3341 /* Fall through. */
3342
3343 case REG:
3344 ret = frv_regno_ok_for_base_p (REGNO (x), strict_p);
3345 break;
3346
3347 case PRE_MODIFY:
3348 x0 = XEXP (x, 0);
3349 x1 = XEXP (x, 1);
3350 if (GET_CODE (x0) != REG
3351 || ! frv_regno_ok_for_base_p (REGNO (x0), strict_p)
3352 || GET_CODE (x1) != PLUS
3353 || ! rtx_equal_p (x0, XEXP (x1, 0))
3354 || GET_CODE (XEXP (x1, 1)) != REG
3355 || ! frv_regno_ok_for_base_p (REGNO (XEXP (x1, 1)), strict_p))
3356 break;
3357
3358 ret = 1;
3359 break;
3360
3361 case CONST_INT:
3362 /* 12 bit immediate */
3363 if (condexec_p)
3364 ret = FALSE;
3365 else
3366 {
3367 ret = IN_RANGE_P (INTVAL (x), -2048, 2047);
3368
3369 /* If we can't use load/store double operations, make sure we can
3370 address the second word. */
3371 if (ret && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
3372 ret = IN_RANGE_P (INTVAL (x) + GET_MODE_SIZE (mode) - 1,
3373 -2048, 2047);
3374 }
3375 break;
3376
3377 case PLUS:
3378 x0 = XEXP (x, 0);
3379 x1 = XEXP (x, 1);
3380
3381 if (GET_CODE (x0) == SUBREG)
3382 x0 = SUBREG_REG (x0);
3383
3384 if (GET_CODE (x0) != REG)
3385 break;
3386
3387 regno0 = REGNO (x0);
3388 if (!frv_regno_ok_for_base_p (regno0, strict_p))
3389 break;
3390
3391 switch (GET_CODE (x1))
3392 {
3393 default:
3394 break;
3395
3396 case SUBREG:
3397 x1 = SUBREG_REG (x1);
3398 if (GET_CODE (x1) != REG)
3399 break;
3400
3401 /* Fall through. */
3402
3403 case REG:
3404 /* Do not allow reg+reg addressing for modes > 1 word if we
3405 can't depend on having move double instructions. */
3406 if (!allow_double_reg_p && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
3407 ret = FALSE;
3408 else
3409 ret = frv_regno_ok_for_base_p (REGNO (x1), strict_p);
3410 break;
3411
3412 case CONST_INT:
3413 /* 12 bit immediate */
3414 if (condexec_p)
3415 ret = FALSE;
3416 else
3417 {
3418 value = INTVAL (x1);
3419 ret = IN_RANGE_P (value, -2048, 2047);
3420
3421 /* If we can't use load/store double operations, make sure we can
3422 address the second word. */
3423 if (ret && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
3424 ret = IN_RANGE_P (value + GET_MODE_SIZE (mode) - 1, -2048, 2047);
3425 }
3426 break;
3427
3428 case CONST:
3429 if (!condexec_p && got12_operand (x1, VOIDmode))
3430 ret = TRUE;
3431 break;
3432
3433 }
3434 break;
3435 }
3436
3437 if (TARGET_DEBUG_ADDR)
3438 {
3439 fprintf (stderr, "\n========== GO_IF_LEGITIMATE_ADDRESS, mode = %s, result = %d, addresses are %sstrict%s\n",
3440 GET_MODE_NAME (mode), ret, (strict_p) ? "" : "not ",
3441 (condexec_p) ? ", inside conditional code" : "");
3442 debug_rtx (x);
3443 }
3444
3445 return ret;
3446 }
3447
3448 /* Given an ADDR, generate code to inline the PLT. */
3449 static rtx
3450 gen_inlined_tls_plt (rtx addr)
3451 {
3452 rtx mem, retval, dest;
3453 rtx picreg = get_hard_reg_initial_val (Pmode, FDPIC_REG);
3454
3455
3456 dest = gen_reg_rtx (DImode);
3457
3458 if (flag_pic == 1)
3459 {
3460 /*
3461 -fpic version:
3462
3463 lddi.p @(gr15, #gottlsdesc12(ADDR)), gr8
3464 calll #gettlsoff(ADDR)@(gr8, gr0)
3465 */
3466 emit_insn (gen_tls_lddi (dest, addr, picreg));
3467 }
3468 else
3469 {
3470 /*
3471 -fPIC version:
3472
3473 sethi.p #gottlsdeschi(ADDR), gr8
3474 setlo #gottlsdesclo(ADDR), gr8
3475 ldd #tlsdesc(ADDR)@(gr15, gr8), gr8
3476 calll #gettlsoff(ADDR)@(gr8, gr0)
3477 */
3478 rtx reguse = gen_reg_rtx (Pmode);
3479 emit_insn (gen_tlsoff_hilo (reguse, addr, GEN_INT (R_FRV_GOTTLSDESCHI)));
3480 emit_insn (gen_tls_tlsdesc_ldd (dest, picreg, reguse, addr));
3481 }
3482
3483 retval = gen_reg_rtx (Pmode);
3484 emit_insn (gen_tls_indirect_call (retval, addr, dest, picreg));
3485 return retval;
3486 }
3487
3488 /* Emit a TLSMOFF or TLSMOFF12 offset, depending on -mTLS. Returns
3489 the destination address. */
3490 static rtx
3491 gen_tlsmoff (rtx addr, rtx reg)
3492 {
3493 rtx dest = gen_reg_rtx (Pmode);
3494
3495 if (TARGET_BIG_TLS)
3496 {
3497 /* sethi.p #tlsmoffhi(x), grA
3498 setlo #tlsmofflo(x), grA
3499 */
3500 dest = gen_reg_rtx (Pmode);
3501 emit_insn (gen_tlsoff_hilo (dest, addr,
3502 GEN_INT (R_FRV_TLSMOFFHI)));
3503 dest = gen_rtx_PLUS (Pmode, dest, reg);
3504 }
3505 else
3506 {
3507 /* addi grB, #tlsmoff12(x), grC
3508 -or-
3509 ld/st @(grB, #tlsmoff12(x)), grC
3510 */
3511 dest = gen_reg_rtx (Pmode);
3512 emit_insn (gen_symGOTOFF2reg_i (dest, addr, reg,
3513 GEN_INT (R_FRV_TLSMOFF12)));
3514 }
3515 return dest;
3516 }
3517
3518 /* Generate code for a TLS address. */
3519 static rtx
3520 frv_legitimize_tls_address (rtx addr, enum tls_model model)
3521 {
3522 rtx dest, tp = gen_rtx_REG (Pmode, 29);
3523 rtx picreg = get_hard_reg_initial_val (Pmode, 15);
3524
3525 switch (model)
3526 {
3527 case TLS_MODEL_INITIAL_EXEC:
3528 if (flag_pic == 1)
3529 {
3530 /* -fpic version.
3531 ldi @(gr15, #gottlsoff12(x)), gr5
3532 */
3533 dest = gen_reg_rtx (Pmode);
3534 emit_insn (gen_tls_load_gottlsoff12 (dest, addr, picreg));
3535 dest = gen_rtx_PLUS (Pmode, tp, dest);
3536 }
3537 else
3538 {
3539 /* -fPIC or anything else.
3540
3541 sethi.p #gottlsoffhi(x), gr14
3542 setlo #gottlsofflo(x), gr14
3543 ld #tlsoff(x)@(gr15, gr14), gr9
3544 */
3545 rtx tmp = gen_reg_rtx (Pmode);
3546 dest = gen_reg_rtx (Pmode);
3547 emit_insn (gen_tlsoff_hilo (tmp, addr,
3548 GEN_INT (R_FRV_GOTTLSOFF_HI)));
3549
3550 emit_insn (gen_tls_tlsoff_ld (dest, picreg, tmp, addr));
3551 dest = gen_rtx_PLUS (Pmode, tp, dest);
3552 }
3553 break;
3554 case TLS_MODEL_LOCAL_DYNAMIC:
3555 {
3556 rtx reg, retval;
3557
3558 if (TARGET_INLINE_PLT)
3559 retval = gen_inlined_tls_plt (GEN_INT (0));
3560 else
3561 {
3562 /* call #gettlsoff(0) */
3563 retval = gen_reg_rtx (Pmode);
3564 emit_insn (gen_call_gettlsoff (retval, GEN_INT (0), picreg));
3565 }
3566
3567 reg = gen_reg_rtx (Pmode);
3568 emit_insn (gen_rtx_SET (VOIDmode, reg,
3569 gen_rtx_PLUS (Pmode,
3570 retval, tp)));
3571
3572 dest = gen_tlsmoff (addr, reg);
3573
3574 /*
3575 dest = gen_reg_rtx (Pmode);
3576 emit_insn (gen_tlsoff_hilo (dest, addr,
3577 GEN_INT (R_FRV_TLSMOFFHI)));
3578 dest = gen_rtx_PLUS (Pmode, dest, reg);
3579 */
3580 break;
3581 }
3582 case TLS_MODEL_LOCAL_EXEC:
3583 dest = gen_tlsmoff (addr, gen_rtx_REG (Pmode, 29));
3584 break;
3585 case TLS_MODEL_GLOBAL_DYNAMIC:
3586 {
3587 rtx retval;
3588
3589 if (TARGET_INLINE_PLT)
3590 retval = gen_inlined_tls_plt (addr);
3591 else
3592 {
3593 /* call #gettlsoff(x) */
3594 retval = gen_reg_rtx (Pmode);
3595 emit_insn (gen_call_gettlsoff (retval, addr, picreg));
3596 }
3597 dest = gen_rtx_PLUS (Pmode, retval, tp);
3598 break;
3599 }
3600 default:
3601 abort ();
3602 }
3603
3604 return dest;
3605 }
3606
3607 rtx
3608 frv_legitimize_address (rtx x,
3609 rtx oldx ATTRIBUTE_UNUSED,
3610 enum machine_mode mode ATTRIBUTE_UNUSED)
3611 {
3612 if (GET_CODE (x) == SYMBOL_REF)
3613 {
3614 enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
3615 if (model != 0)
3616 return frv_legitimize_tls_address (x, model);
3617 }
3618
3619 return NULL_RTX;
3620 }
3621 \f
3622 /* Test whether a local function descriptor is canonical, i.e.,
3623 whether we can use FUNCDESC_GOTOFF to compute the address of the
3624 function. */
3625
3626 static bool
3627 frv_local_funcdesc_p (rtx fnx)
3628 {
3629 tree fn;
3630 enum symbol_visibility vis;
3631 bool ret;
3632
3633 if (! SYMBOL_REF_LOCAL_P (fnx))
3634 return FALSE;
3635
3636 fn = SYMBOL_REF_DECL (fnx);
3637
3638 if (! fn)
3639 return FALSE;
3640
3641 vis = DECL_VISIBILITY (fn);
3642
3643 if (vis == VISIBILITY_PROTECTED)
3644 /* Private function descriptors for protected functions are not
3645 canonical. Temporarily change the visibility to global. */
3646 vis = VISIBILITY_DEFAULT;
3647 else if (flag_shlib)
3648 /* If we're already compiling for a shared library (that, unlike
3649 executables, can't assume that the existence of a definition
3650 implies local binding), we can skip the re-testing. */
3651 return TRUE;
3652
3653 ret = default_binds_local_p_1 (fn, flag_pic);
3654
3655 DECL_VISIBILITY (fn) = vis;
3656
3657 return ret;
3658 }
3659
3660 /* Load the _gp symbol into DEST. SRC is supposed to be the FDPIC
3661 register. */
3662
3663 rtx
3664 frv_gen_GPsym2reg (rtx dest, rtx src)
3665 {
3666 tree gp = get_identifier ("_gp");
3667 rtx gp_sym = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (gp));
3668
3669 return gen_symGOT2reg (dest, gp_sym, src, GEN_INT (R_FRV_GOT12));
3670 }
3671
3672 static const char *
3673 unspec_got_name (int i)
3674 {
3675 switch (i)
3676 {
3677 case R_FRV_GOT12: return "got12";
3678 case R_FRV_GOTHI: return "gothi";
3679 case R_FRV_GOTLO: return "gotlo";
3680 case R_FRV_FUNCDESC: return "funcdesc";
3681 case R_FRV_FUNCDESC_GOT12: return "gotfuncdesc12";
3682 case R_FRV_FUNCDESC_GOTHI: return "gotfuncdeschi";
3683 case R_FRV_FUNCDESC_GOTLO: return "gotfuncdesclo";
3684 case R_FRV_FUNCDESC_VALUE: return "funcdescvalue";
3685 case R_FRV_FUNCDESC_GOTOFF12: return "gotofffuncdesc12";
3686 case R_FRV_FUNCDESC_GOTOFFHI: return "gotofffuncdeschi";
3687 case R_FRV_FUNCDESC_GOTOFFLO: return "gotofffuncdesclo";
3688 case R_FRV_GOTOFF12: return "gotoff12";
3689 case R_FRV_GOTOFFHI: return "gotoffhi";
3690 case R_FRV_GOTOFFLO: return "gotofflo";
3691 case R_FRV_GPREL12: return "gprel12";
3692 case R_FRV_GPRELHI: return "gprelhi";
3693 case R_FRV_GPRELLO: return "gprello";
3694 case R_FRV_GOTTLSOFF_HI: return "gottlsoffhi";
3695 case R_FRV_GOTTLSOFF_LO: return "gottlsofflo";
3696 case R_FRV_TLSMOFFHI: return "tlsmoffhi";
3697 case R_FRV_TLSMOFFLO: return "tlsmofflo";
3698 case R_FRV_TLSMOFF12: return "tlsmoff12";
3699 case R_FRV_TLSDESCHI: return "tlsdeschi";
3700 case R_FRV_TLSDESCLO: return "tlsdesclo";
3701 case R_FRV_GOTTLSDESCHI: return "gottlsdeschi";
3702 case R_FRV_GOTTLSDESCLO: return "gottlsdesclo";
3703 default: abort ();
3704 }
3705 }
3706
3707 /* Write the assembler syntax for UNSPEC to STREAM. Note that any offset
3708 is added inside the relocation operator. */
3709
3710 static void
3711 frv_output_const_unspec (FILE *stream, const struct frv_unspec *unspec)
3712 {
3713 fprintf (stream, "#%s(", unspec_got_name (unspec->reloc));
3714 output_addr_const (stream, plus_constant (unspec->symbol, unspec->offset));
3715 fputs (")", stream);
3716 }
3717
3718 /* Implement FIND_BASE_TERM. See whether ORIG_X represents #gprel12(foo)
3719 or #gotoff12(foo) for some small data symbol foo. If so, return foo,
3720 otherwise return ORIG_X. */
3721
3722 rtx
3723 frv_find_base_term (rtx x)
3724 {
3725 struct frv_unspec unspec;
3726
3727 if (frv_const_unspec_p (x, &unspec)
3728 && frv_small_data_reloc_p (unspec.symbol, unspec.reloc))
3729 return plus_constant (unspec.symbol, unspec.offset);
3730
3731 return x;
3732 }
3733
3734 /* Return 1 if operand is a valid FRV address. CONDEXEC_P is true if
3735 the operand is used by a predicated instruction. */
3736
3737 static int
3738 frv_legitimate_memory_operand (rtx op, enum machine_mode mode, int condexec_p)
3739 {
3740 return ((GET_MODE (op) == mode || mode == VOIDmode)
3741 && GET_CODE (op) == MEM
3742 && frv_legitimate_address_p (mode, XEXP (op, 0),
3743 reload_completed, condexec_p, FALSE));
3744 }
3745
3746 void
3747 frv_expand_fdpic_call (rtx *operands, bool ret_value, bool sibcall)
3748 {
3749 rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
3750 rtx picreg = get_hard_reg_initial_val (SImode, FDPIC_REG);
3751 rtx c, rvrtx=0;
3752 rtx addr;
3753
3754 if (ret_value)
3755 {
3756 rvrtx = operands[0];
3757 operands ++;
3758 }
3759
3760 addr = XEXP (operands[0], 0);
3761
3762 /* Inline PLTs if we're optimizing for speed. We'd like to inline
3763 any calls that would involve a PLT, but can't tell, since we
3764 don't know whether an extern function is going to be provided by
3765 a separate translation unit or imported from a separate module.
3766 When compiling for shared libraries, if the function has default
3767 visibility, we assume it's overridable, so we inline the PLT, but
3768 for executables, we don't really have a way to make a good
3769 decision: a function is as likely to be imported from a shared
3770 library as it is to be defined in the executable itself. We
3771 assume executables will get global functions defined locally,
3772 whereas shared libraries will have them potentially overridden,
3773 so we only inline PLTs when compiling for shared libraries.
3774
3775 In order to mark a function as local to a shared library, any
3776 non-default visibility attribute suffices. Unfortunately,
3777 there's no simple way to tag a function declaration as ``in a
3778 different module'', which we could then use to trigger PLT
3779 inlining on executables. There's -minline-plt, but it affects
3780 all external functions, so one would have to also mark function
3781 declarations available in the same module with non-default
3782 visibility, which is advantageous in itself. */
3783 if (GET_CODE (addr) == SYMBOL_REF
3784 && ((!SYMBOL_REF_LOCAL_P (addr) && TARGET_INLINE_PLT)
3785 || sibcall))
3786 {
3787 rtx x, dest;
3788 dest = gen_reg_rtx (SImode);
3789 if (flag_pic != 1)
3790 x = gen_symGOTOFF2reg_hilo (dest, addr, OUR_FDPIC_REG,
3791 GEN_INT (R_FRV_FUNCDESC_GOTOFF12));
3792 else
3793 x = gen_symGOTOFF2reg (dest, addr, OUR_FDPIC_REG,
3794 GEN_INT (R_FRV_FUNCDESC_GOTOFF12));
3795 emit_insn (x);
3796 cfun->uses_pic_offset_table = TRUE;
3797 addr = dest;
3798 }
3799 else if (GET_CODE (addr) == SYMBOL_REF)
3800 {
3801 /* These are always either local, or handled through a local
3802 PLT. */
3803 if (ret_value)
3804 c = gen_call_value_fdpicsi (rvrtx, addr, operands[1],
3805 operands[2], picreg, lr);
3806 else
3807 c = gen_call_fdpicsi (addr, operands[1], operands[2], picreg, lr);
3808 emit_call_insn (c);
3809 return;
3810 }
3811 else if (! ldd_address_operand (addr, Pmode))
3812 addr = force_reg (Pmode, addr);
3813
3814 picreg = gen_reg_rtx (DImode);
3815 emit_insn (gen_movdi_ldd (picreg, addr));
3816
3817 if (sibcall && ret_value)
3818 c = gen_sibcall_value_fdpicdi (rvrtx, picreg, const0_rtx);
3819 else if (sibcall)
3820 c = gen_sibcall_fdpicdi (picreg, const0_rtx);
3821 else if (ret_value)
3822 c = gen_call_value_fdpicdi (rvrtx, picreg, const0_rtx, lr);
3823 else
3824 c = gen_call_fdpicdi (picreg, const0_rtx, lr);
3825 emit_call_insn (c);
3826 }
3827
3828 /* An address operand that may use a pair of registers, an addressing
3829 mode that we reject in general. */
3830
3831 int
3832 ldd_address_operand (rtx x, enum machine_mode mode)
3833 {
3834 if (GET_MODE (x) != mode && GET_MODE (x) != VOIDmode)
3835 return FALSE;
3836
3837 return frv_legitimate_address_p (DImode, x, reload_completed, FALSE, TRUE);
3838 }
3839
3840 int
3841 fdpic_fptr_operand (rtx op, enum machine_mode mode)
3842 {
3843 if (GET_MODE (op) != mode && mode != VOIDmode)
3844 return FALSE;
3845 if (GET_CODE (op) != REG)
3846 return FALSE;
3847 if (REGNO (op) != FDPIC_FPTR_REGNO && REGNO (op) < FIRST_PSEUDO_REGISTER)
3848 return FALSE;
3849 return TRUE;
3850 }
3851 \f
3852 /* Return 1 is OP is a memory operand, or will be turned into one by
3853 reload. */
3854
3855 int
3856 frv_load_operand (rtx op, enum machine_mode mode)
3857 {
3858 if (GET_MODE (op) != mode && mode != VOIDmode)
3859 return FALSE;
3860
3861 if (reload_in_progress)
3862 {
3863 rtx tmp = op;
3864 if (GET_CODE (tmp) == SUBREG)
3865 tmp = SUBREG_REG (tmp);
3866 if (GET_CODE (tmp) == REG
3867 && REGNO (tmp) >= FIRST_PSEUDO_REGISTER)
3868 op = reg_equiv_memory_loc[REGNO (tmp)];
3869 }
3870
3871 return op && memory_operand (op, mode);
3872 }
3873
3874
3875 /* Return 1 if operand is a GPR register or a FPR register. */
3876
3877 int
3878 gpr_or_fpr_operand (rtx op, enum machine_mode mode)
3879 {
3880 int regno;
3881
3882 if (GET_MODE (op) != mode && mode != VOIDmode)
3883 return FALSE;
3884
3885 if (GET_CODE (op) == SUBREG)
3886 {
3887 if (GET_CODE (SUBREG_REG (op)) != REG)
3888 return register_operand (op, mode);
3889
3890 op = SUBREG_REG (op);
3891 }
3892
3893 if (GET_CODE (op) != REG)
3894 return FALSE;
3895
3896 regno = REGNO (op);
3897 if (GPR_P (regno) || FPR_P (regno) || regno >= FIRST_PSEUDO_REGISTER)
3898 return TRUE;
3899
3900 return FALSE;
3901 }
3902
3903 /* Return 1 if operand is a GPR register or 12 bit signed immediate. */
3904
3905 int
3906 gpr_or_int12_operand (rtx op, enum machine_mode mode)
3907 {
3908 if (GET_CODE (op) == CONST_INT)
3909 return IN_RANGE_P (INTVAL (op), -2048, 2047);
3910
3911 if (got12_operand (op, mode))
3912 return true;
3913
3914 if (GET_MODE (op) != mode && mode != VOIDmode)
3915 return FALSE;
3916
3917 if (GET_CODE (op) == SUBREG)
3918 {
3919 if (GET_CODE (SUBREG_REG (op)) != REG)
3920 return register_operand (op, mode);
3921
3922 op = SUBREG_REG (op);
3923 }
3924
3925 if (GET_CODE (op) != REG)
3926 return FALSE;
3927
3928 return GPR_OR_PSEUDO_P (REGNO (op));
3929 }
3930
3931 /* Return 1 if operand is a GPR register, or a FPR register, or a 12 bit
3932 signed immediate. */
3933
3934 int
3935 gpr_fpr_or_int12_operand (rtx op, enum machine_mode mode)
3936 {
3937 int regno;
3938
3939 if (GET_CODE (op) == CONST_INT)
3940 return IN_RANGE_P (INTVAL (op), -2048, 2047);
3941
3942 if (GET_MODE (op) != mode && mode != VOIDmode)
3943 return FALSE;
3944
3945 if (GET_CODE (op) == SUBREG)
3946 {
3947 if (GET_CODE (SUBREG_REG (op)) != REG)
3948 return register_operand (op, mode);
3949
3950 op = SUBREG_REG (op);
3951 }
3952
3953 if (GET_CODE (op) != REG)
3954 return FALSE;
3955
3956 regno = REGNO (op);
3957 if (GPR_P (regno) || FPR_P (regno) || regno >= FIRST_PSEUDO_REGISTER)
3958 return TRUE;
3959
3960 return FALSE;
3961 }
3962
3963 /* Return 1 if operand is a register or 6 bit signed immediate. */
3964
3965 int
3966 fpr_or_int6_operand (rtx op, enum machine_mode mode)
3967 {
3968 if (GET_CODE (op) == CONST_INT)
3969 return IN_RANGE_P (INTVAL (op), -32, 31);
3970
3971 if (GET_MODE (op) != mode && mode != VOIDmode)
3972 return FALSE;
3973
3974 if (GET_CODE (op) == SUBREG)
3975 {
3976 if (GET_CODE (SUBREG_REG (op)) != REG)
3977 return register_operand (op, mode);
3978
3979 op = SUBREG_REG (op);
3980 }
3981
3982 if (GET_CODE (op) != REG)
3983 return FALSE;
3984
3985 return FPR_OR_PSEUDO_P (REGNO (op));
3986 }
3987
3988 /* Return 1 if operand is a register or 10 bit signed immediate. */
3989
3990 int
3991 gpr_or_int10_operand (rtx op, enum machine_mode mode)
3992 {
3993 if (GET_CODE (op) == CONST_INT)
3994 return IN_RANGE_P (INTVAL (op), -512, 511);
3995
3996 if (GET_MODE (op) != mode && mode != VOIDmode)
3997 return FALSE;
3998
3999 if (GET_CODE (op) == SUBREG)
4000 {
4001 if (GET_CODE (SUBREG_REG (op)) != REG)
4002 return register_operand (op, mode);
4003
4004 op = SUBREG_REG (op);
4005 }
4006
4007 if (GET_CODE (op) != REG)
4008 return FALSE;
4009
4010 return GPR_OR_PSEUDO_P (REGNO (op));
4011 }
4012
4013 /* Return 1 if operand is a register or an integer immediate. */
4014
4015 int
4016 gpr_or_int_operand (rtx op, enum machine_mode mode)
4017 {
4018 if (GET_CODE (op) == CONST_INT)
4019 return TRUE;
4020
4021 if (GET_MODE (op) != mode && mode != VOIDmode)
4022 return FALSE;
4023
4024 if (GET_CODE (op) == SUBREG)
4025 {
4026 if (GET_CODE (SUBREG_REG (op)) != REG)
4027 return register_operand (op, mode);
4028
4029 op = SUBREG_REG (op);
4030 }
4031
4032 if (GET_CODE (op) != REG)
4033 return FALSE;
4034
4035 return GPR_OR_PSEUDO_P (REGNO (op));
4036 }
4037
4038 /* Return 1 if operand is a 12 bit signed immediate. */
4039
4040 int
4041 int12_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
4042 {
4043 if (GET_CODE (op) != CONST_INT)
4044 return FALSE;
4045
4046 return IN_RANGE_P (INTVAL (op), -2048, 2047);
4047 }
4048
4049 /* Return 1 if operand is a 6 bit signed immediate. */
4050
4051 int
4052 int6_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
4053 {
4054 if (GET_CODE (op) != CONST_INT)
4055 return FALSE;
4056
4057 return IN_RANGE_P (INTVAL (op), -32, 31);
4058 }
4059
4060 /* Return 1 if operand is a 5 bit signed immediate. */
4061
4062 int
4063 int5_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
4064 {
4065 return GET_CODE (op) == CONST_INT && IN_RANGE_P (INTVAL (op), -16, 15);
4066 }
4067
4068 /* Return 1 if operand is a 5 bit unsigned immediate. */
4069
4070 int
4071 uint5_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
4072 {
4073 return GET_CODE (op) == CONST_INT && IN_RANGE_P (INTVAL (op), 0, 31);
4074 }
4075
4076 /* Return 1 if operand is a 4 bit unsigned immediate. */
4077
4078 int
4079 uint4_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
4080 {
4081 return GET_CODE (op) == CONST_INT && IN_RANGE_P (INTVAL (op), 0, 15);
4082 }
4083
4084 /* Return 1 if operand is a 1 bit unsigned immediate (0 or 1). */
4085
4086 int
4087 uint1_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
4088 {
4089 return GET_CODE (op) == CONST_INT && IN_RANGE_P (INTVAL (op), 0, 1);
4090 }
4091
4092 /* Return 1 if operand is an integer constant that takes 2 instructions
4093 to load up and can be split into sethi/setlo instructions.. */
4094
4095 int
4096 int_2word_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
4097 {
4098 HOST_WIDE_INT value;
4099 REAL_VALUE_TYPE rv;
4100 long l;
4101
4102 switch (GET_CODE (op))
4103 {
4104 default:
4105 break;
4106
4107 case LABEL_REF:
4108 if (TARGET_FDPIC)
4109 return FALSE;
4110
4111 return (flag_pic == 0);
4112
4113 case CONST:
4114 if (flag_pic || TARGET_FDPIC)
4115 return FALSE;
4116
4117 op = XEXP (op, 0);
4118 if (GET_CODE (op) == PLUS && GET_CODE (XEXP (op, 1)) == CONST_INT)
4119 op = XEXP (op, 0);
4120 return GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF;
4121
4122 case SYMBOL_REF:
4123 if (TARGET_FDPIC)
4124 return FALSE;
4125
4126 /* small data references are already 1 word */
4127 return (flag_pic == 0) && (! SYMBOL_REF_SMALL_P (op));
4128
4129 case CONST_INT:
4130 return ! IN_RANGE_P (INTVAL (op), -32768, 32767);
4131
4132 case CONST_DOUBLE:
4133 if (GET_MODE (op) == SFmode)
4134 {
4135 REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
4136 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
4137 value = l;
4138 return ! IN_RANGE_P (value, -32768, 32767);
4139 }
4140 else if (GET_MODE (op) == VOIDmode)
4141 {
4142 value = CONST_DOUBLE_LOW (op);
4143 return ! IN_RANGE_P (value, -32768, 32767);
4144 }
4145 break;
4146 }
4147
4148 return FALSE;
4149 }
4150
4151 /* Return 1 if operand is a 16 bit unsigned immediate. */
4152
4153 int
4154 uint16_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
4155 {
4156 if (GET_CODE (op) != CONST_INT)
4157 return FALSE;
4158
4159 return IN_RANGE_P (INTVAL (op), 0, 0xffff);
4160 }
4161
4162 /* Return 1 if operand is an integer constant with the bottom 16 bits
4163 clear. */
4164
4165 int
4166 upper_int16_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
4167 {
4168 if (GET_CODE (op) != CONST_INT)
4169 return FALSE;
4170
4171 return ((INTVAL (op) & 0xffff) == 0);
4172 }
4173
4174 /* Return true if operand is a GPR register. */
4175
4176 int
4177 integer_register_operand (rtx op, enum machine_mode mode)
4178 {
4179 if (GET_MODE (op) != mode && mode != VOIDmode)
4180 return FALSE;
4181
4182 if (GET_CODE (op) == SUBREG)
4183 {
4184 if (GET_CODE (SUBREG_REG (op)) != REG)
4185 return register_operand (op, mode);
4186
4187 op = SUBREG_REG (op);
4188 }
4189
4190 if (GET_CODE (op) != REG)
4191 return FALSE;
4192
4193 return GPR_OR_PSEUDO_P (REGNO (op));
4194 }
4195
4196 /* Return true if operand is a GPR register. Do not allow SUBREG's
4197 here, in order to prevent a combine bug. */
4198
4199 int
4200 gpr_no_subreg_operand (rtx op, enum machine_mode mode)
4201 {
4202 if (GET_MODE (op) != mode && mode != VOIDmode)
4203 return FALSE;
4204
4205 if (GET_CODE (op) != REG)
4206 return FALSE;
4207
4208 return GPR_OR_PSEUDO_P (REGNO (op));
4209 }
4210
4211 /* Return true if operand is a FPR register. */
4212
4213 int
4214 fpr_operand (rtx op, enum machine_mode mode)
4215 {
4216 if (GET_MODE (op) != mode && mode != VOIDmode)
4217 return FALSE;
4218
4219 if (GET_CODE (op) == SUBREG)
4220 {
4221 if (GET_CODE (SUBREG_REG (op)) != REG)
4222 return register_operand (op, mode);
4223
4224 op = SUBREG_REG (op);
4225 }
4226
4227 if (GET_CODE (op) != REG)
4228 return FALSE;
4229
4230 return FPR_OR_PSEUDO_P (REGNO (op));
4231 }
4232
4233 /* Return true if operand is an even GPR or FPR register. */
4234
4235 int
4236 even_reg_operand (rtx op, enum machine_mode mode)
4237 {
4238 int regno;
4239
4240 if (GET_MODE (op) != mode && mode != VOIDmode)
4241 return FALSE;
4242
4243 if (GET_CODE (op) == SUBREG)
4244 {
4245 if (GET_CODE (SUBREG_REG (op)) != REG)
4246 return register_operand (op, mode);
4247
4248 op = SUBREG_REG (op);
4249 }
4250
4251 if (GET_CODE (op) != REG)
4252 return FALSE;
4253
4254 regno = REGNO (op);
4255 if (regno >= FIRST_PSEUDO_REGISTER)
4256 return TRUE;
4257
4258 if (GPR_P (regno))
4259 return (((regno - GPR_FIRST) & 1) == 0);
4260
4261 if (FPR_P (regno))
4262 return (((regno - FPR_FIRST) & 1) == 0);
4263
4264 return FALSE;
4265 }
4266
4267 /* Return true if operand is an odd GPR register. */
4268
4269 int
4270 odd_reg_operand (rtx op, enum machine_mode mode)
4271 {
4272 int regno;
4273
4274 if (GET_MODE (op) != mode && mode != VOIDmode)
4275 return FALSE;
4276
4277 if (GET_CODE (op) == SUBREG)
4278 {
4279 if (GET_CODE (SUBREG_REG (op)) != REG)
4280 return register_operand (op, mode);
4281
4282 op = SUBREG_REG (op);
4283 }
4284
4285 if (GET_CODE (op) != REG)
4286 return FALSE;
4287
4288 regno = REGNO (op);
4289 /* Assume that reload will give us an even register. */
4290 if (regno >= FIRST_PSEUDO_REGISTER)
4291 return FALSE;
4292
4293 if (GPR_P (regno))
4294 return (((regno - GPR_FIRST) & 1) != 0);
4295
4296 if (FPR_P (regno))
4297 return (((regno - FPR_FIRST) & 1) != 0);
4298
4299 return FALSE;
4300 }
4301
4302 /* Return true if operand is an even GPR register. */
4303
4304 int
4305 even_gpr_operand (rtx op, enum machine_mode mode)
4306 {
4307 int regno;
4308
4309 if (GET_MODE (op) != mode && mode != VOIDmode)
4310 return FALSE;
4311
4312 if (GET_CODE (op) == SUBREG)
4313 {
4314 if (GET_CODE (SUBREG_REG (op)) != REG)
4315 return register_operand (op, mode);
4316
4317 op = SUBREG_REG (op);
4318 }
4319
4320 if (GET_CODE (op) != REG)
4321 return FALSE;
4322
4323 regno = REGNO (op);
4324 if (regno >= FIRST_PSEUDO_REGISTER)
4325 return TRUE;
4326
4327 if (! GPR_P (regno))
4328 return FALSE;
4329
4330 return (((regno - GPR_FIRST) & 1) == 0);
4331 }
4332
4333 /* Return true if operand is an odd GPR register. */
4334
4335 int
4336 odd_gpr_operand (rtx op, enum machine_mode mode)
4337 {
4338 int regno;
4339
4340 if (GET_MODE (op) != mode && mode != VOIDmode)
4341 return FALSE;
4342
4343 if (GET_CODE (op) == SUBREG)
4344 {
4345 if (GET_CODE (SUBREG_REG (op)) != REG)
4346 return register_operand (op, mode);
4347
4348 op = SUBREG_REG (op);
4349 }
4350
4351 if (GET_CODE (op) != REG)
4352 return FALSE;
4353
4354 regno = REGNO (op);
4355 /* Assume that reload will give us an even register. */
4356 if (regno >= FIRST_PSEUDO_REGISTER)
4357 return FALSE;
4358
4359 if (! GPR_P (regno))
4360 return FALSE;
4361
4362 return (((regno - GPR_FIRST) & 1) != 0);
4363 }
4364
4365 /* Return true if operand is a quad aligned FPR register. */
4366
4367 int
4368 quad_fpr_operand (rtx op, enum machine_mode mode)
4369 {
4370 int regno;
4371
4372 if (GET_MODE (op) != mode && mode != VOIDmode)
4373 return FALSE;
4374
4375 if (GET_CODE (op) == SUBREG)
4376 {
4377 if (GET_CODE (SUBREG_REG (op)) != REG)
4378 return register_operand (op, mode);
4379
4380 op = SUBREG_REG (op);
4381 }
4382
4383 if (GET_CODE (op) != REG)
4384 return FALSE;
4385
4386 regno = REGNO (op);
4387 if (regno >= FIRST_PSEUDO_REGISTER)
4388 return TRUE;
4389
4390 if (! FPR_P (regno))
4391 return FALSE;
4392
4393 return (((regno - FPR_FIRST) & 3) == 0);
4394 }
4395
4396 /* Return true if operand is an even FPR register. */
4397
4398 int
4399 even_fpr_operand (rtx op, enum machine_mode mode)
4400 {
4401 int regno;
4402
4403 if (GET_MODE (op) != mode && mode != VOIDmode)
4404 return FALSE;
4405
4406 if (GET_CODE (op) == SUBREG)
4407 {
4408 if (GET_CODE (SUBREG_REG (op)) != REG)
4409 return register_operand (op, mode);
4410
4411 op = SUBREG_REG (op);
4412 }
4413
4414 if (GET_CODE (op) != REG)
4415 return FALSE;
4416
4417 regno = REGNO (op);
4418 if (regno >= FIRST_PSEUDO_REGISTER)
4419 return TRUE;
4420
4421 if (! FPR_P (regno))
4422 return FALSE;
4423
4424 return (((regno - FPR_FIRST) & 1) == 0);
4425 }
4426
4427 /* Return true if operand is an odd FPR register. */
4428
4429 int
4430 odd_fpr_operand (rtx op, enum machine_mode mode)
4431 {
4432 int regno;
4433
4434 if (GET_MODE (op) != mode && mode != VOIDmode)
4435 return FALSE;
4436
4437 if (GET_CODE (op) == SUBREG)
4438 {
4439 if (GET_CODE (SUBREG_REG (op)) != REG)
4440 return register_operand (op, mode);
4441
4442 op = SUBREG_REG (op);
4443 }
4444
4445 if (GET_CODE (op) != REG)
4446 return FALSE;
4447
4448 regno = REGNO (op);
4449 /* Assume that reload will give us an even register. */
4450 if (regno >= FIRST_PSEUDO_REGISTER)
4451 return FALSE;
4452
4453 if (! FPR_P (regno))
4454 return FALSE;
4455
4456 return (((regno - FPR_FIRST) & 1) != 0);
4457 }
4458
4459 /* Return true if operand is a 2 word memory address that can be loaded in one
4460 instruction to load or store. We assume the stack and frame pointers are
4461 suitably aligned, and variables in the small data area. FIXME -- at some we
4462 should recognize other globals and statics. We can't assume that any old
4463 pointer is aligned, given that arguments could be passed on an odd word on
4464 the stack and the address taken and passed through to another function. */
4465
4466 int
4467 dbl_memory_one_insn_operand (rtx op, enum machine_mode mode)
4468 {
4469 rtx addr;
4470 rtx addr_reg;
4471
4472 if (! TARGET_DWORD)
4473 return FALSE;
4474
4475 if (GET_CODE (op) != MEM)
4476 return FALSE;
4477
4478 if (mode != VOIDmode && GET_MODE_SIZE (mode) != 2*UNITS_PER_WORD)
4479 return FALSE;
4480
4481 addr = XEXP (op, 0);
4482 if (GET_CODE (addr) == REG)
4483 addr_reg = addr;
4484
4485 else if (GET_CODE (addr) == PLUS)
4486 {
4487 rtx addr0 = XEXP (addr, 0);
4488 rtx addr1 = XEXP (addr, 1);
4489
4490 if (GET_CODE (addr0) != REG)
4491 return FALSE;
4492
4493 if (got12_operand (addr1, VOIDmode))
4494 return TRUE;
4495
4496 if (GET_CODE (addr1) != CONST_INT)
4497 return FALSE;
4498
4499 if ((INTVAL (addr1) & 7) != 0)
4500 return FALSE;
4501
4502 addr_reg = addr0;
4503 }
4504
4505 else
4506 return FALSE;
4507
4508 if (addr_reg == frame_pointer_rtx || addr_reg == stack_pointer_rtx)
4509 return TRUE;
4510
4511 return FALSE;
4512 }
4513
4514 /* Return true if operand is a 2 word memory address that needs to
4515 use two instructions to load or store. */
4516
4517 int
4518 dbl_memory_two_insn_operand (rtx op, enum machine_mode mode)
4519 {
4520 if (GET_CODE (op) != MEM)
4521 return FALSE;
4522
4523 if (mode != VOIDmode && GET_MODE_SIZE (mode) != 2*UNITS_PER_WORD)
4524 return FALSE;
4525
4526 if (! TARGET_DWORD)
4527 return TRUE;
4528
4529 return ! dbl_memory_one_insn_operand (op, mode);
4530 }
4531
4532 /* Return true if operand is something that can be an output for a move
4533 operation. */
4534
4535 int
4536 move_destination_operand (rtx op, enum machine_mode mode)
4537 {
4538 rtx subreg;
4539 enum rtx_code code;
4540
4541 switch (GET_CODE (op))
4542 {
4543 default:
4544 break;
4545
4546 case SUBREG:
4547 if (GET_MODE (op) != mode && mode != VOIDmode)
4548 return FALSE;
4549
4550 subreg = SUBREG_REG (op);
4551 code = GET_CODE (subreg);
4552 if (code == MEM)
4553 return frv_legitimate_address_p (mode, XEXP (subreg, 0),
4554 reload_completed, FALSE, FALSE);
4555
4556 return (code == REG);
4557
4558 case REG:
4559 if (GET_MODE (op) != mode && mode != VOIDmode)
4560 return FALSE;
4561
4562 return TRUE;
4563
4564 case MEM:
4565 return frv_legitimate_memory_operand (op, mode, FALSE);
4566 }
4567
4568 return FALSE;
4569 }
4570
4571 /* Return true if we the operand is a valid destination for a movcc_fp
4572 instruction. This means rejecting fcc_operands, since we need
4573 scratch registers to write to them. */
4574
4575 int
4576 movcc_fp_destination_operand (rtx op, enum machine_mode mode)
4577 {
4578 if (fcc_operand (op, mode))
4579 return FALSE;
4580
4581 return move_destination_operand (op, mode);
4582 }
4583
4584 /* Look for a SYMBOL_REF of a function in an rtx. We always want to
4585 process these separately from any offsets, such that we add any
4586 offsets to the function descriptor (the actual pointer), not to the
4587 function address. */
4588
4589 static bool
4590 frv_function_symbol_referenced_p (rtx x)
4591 {
4592 const char *format;
4593 int length;
4594 int j;
4595
4596 if (GET_CODE (x) == SYMBOL_REF)
4597 return SYMBOL_REF_FUNCTION_P (x);
4598
4599 length = GET_RTX_LENGTH (GET_CODE (x));
4600 format = GET_RTX_FORMAT (GET_CODE (x));
4601
4602 for (j = 0; j < length; ++j)
4603 {
4604 switch (format[j])
4605 {
4606 case 'e':
4607 if (frv_function_symbol_referenced_p (XEXP (x, j)))
4608 return TRUE;
4609 break;
4610
4611 case 'V':
4612 case 'E':
4613 if (XVEC (x, j) != 0)
4614 {
4615 int k;
4616 for (k = 0; k < XVECLEN (x, j); ++k)
4617 if (frv_function_symbol_referenced_p (XVECEXP (x, j, k)))
4618 return TRUE;
4619 }
4620 break;
4621
4622 default:
4623 /* Nothing to do. */
4624 break;
4625 }
4626 }
4627
4628 return FALSE;
4629 }
4630
4631 /* Return true if operand is something that can be an input for a move
4632 operation. */
4633
4634 int
4635 move_source_operand (rtx op, enum machine_mode mode)
4636 {
4637 rtx subreg;
4638 enum rtx_code code;
4639
4640 switch (GET_CODE (op))
4641 {
4642 default:
4643 break;
4644
4645 case CONST_INT:
4646 case CONST_DOUBLE:
4647 return immediate_operand (op, mode);
4648
4649 case SUBREG:
4650 if (GET_MODE (op) != mode && mode != VOIDmode)
4651 return FALSE;
4652
4653 subreg = SUBREG_REG (op);
4654 code = GET_CODE (subreg);
4655 if (code == MEM)
4656 return frv_legitimate_address_p (mode, XEXP (subreg, 0),
4657 reload_completed, FALSE, FALSE);
4658
4659 return (code == REG);
4660
4661 case REG:
4662 if (GET_MODE (op) != mode && mode != VOIDmode)
4663 return FALSE;
4664
4665 return TRUE;
4666
4667 case MEM:
4668 return frv_legitimate_memory_operand (op, mode, FALSE);
4669 }
4670
4671 return FALSE;
4672 }
4673
4674 /* Return true if operand is something that can be an output for a conditional
4675 move operation. */
4676
4677 int
4678 condexec_dest_operand (rtx op, enum machine_mode mode)
4679 {
4680 rtx subreg;
4681 enum rtx_code code;
4682
4683 switch (GET_CODE (op))
4684 {
4685 default:
4686 break;
4687
4688 case SUBREG:
4689 if (GET_MODE (op) != mode && mode != VOIDmode)
4690 return FALSE;
4691
4692 subreg = SUBREG_REG (op);
4693 code = GET_CODE (subreg);
4694 if (code == MEM)
4695 return frv_legitimate_address_p (mode, XEXP (subreg, 0),
4696 reload_completed, TRUE, FALSE);
4697
4698 return (code == REG);
4699
4700 case REG:
4701 if (GET_MODE (op) != mode && mode != VOIDmode)
4702 return FALSE;
4703
4704 return TRUE;
4705
4706 case MEM:
4707 return frv_legitimate_memory_operand (op, mode, TRUE);
4708 }
4709
4710 return FALSE;
4711 }
4712
4713 /* Return true if operand is something that can be an input for a conditional
4714 move operation. */
4715
4716 int
4717 condexec_source_operand (rtx op, enum machine_mode mode)
4718 {
4719 rtx subreg;
4720 enum rtx_code code;
4721
4722 switch (GET_CODE (op))
4723 {
4724 default:
4725 break;
4726
4727 case CONST_INT:
4728 case CONST_DOUBLE:
4729 return ZERO_P (op);
4730
4731 case SUBREG:
4732 if (GET_MODE (op) != mode && mode != VOIDmode)
4733 return FALSE;
4734
4735 subreg = SUBREG_REG (op);
4736 code = GET_CODE (subreg);
4737 if (code == MEM)
4738 return frv_legitimate_address_p (mode, XEXP (subreg, 0),
4739 reload_completed, TRUE, FALSE);
4740
4741 return (code == REG);
4742
4743 case REG:
4744 if (GET_MODE (op) != mode && mode != VOIDmode)
4745 return FALSE;
4746
4747 return TRUE;
4748
4749 case MEM:
4750 return frv_legitimate_memory_operand (op, mode, TRUE);
4751 }
4752
4753 return FALSE;
4754 }
4755
4756 /* Return true if operand is a register of any flavor or a 0 of the
4757 appropriate type. */
4758
4759 int
4760 reg_or_0_operand (rtx op, enum machine_mode mode)
4761 {
4762 switch (GET_CODE (op))
4763 {
4764 default:
4765 break;
4766
4767 case REG:
4768 case SUBREG:
4769 if (GET_MODE (op) != mode && mode != VOIDmode)
4770 return FALSE;
4771
4772 return register_operand (op, mode);
4773
4774 case CONST_INT:
4775 case CONST_DOUBLE:
4776 return ZERO_P (op);
4777 }
4778
4779 return FALSE;
4780 }
4781
4782 /* Return true if operand is the link register. */
4783
4784 int
4785 lr_operand (rtx op, enum machine_mode mode)
4786 {
4787 if (GET_CODE (op) != REG)
4788 return FALSE;
4789
4790 if (GET_MODE (op) != mode && mode != VOIDmode)
4791 return FALSE;
4792
4793 if (REGNO (op) != LR_REGNO && REGNO (op) < FIRST_PSEUDO_REGISTER)
4794 return FALSE;
4795
4796 return TRUE;
4797 }
4798
4799 /* Return true if operand is the uClinux PIC register. */
4800
4801 int
4802 fdpic_operand (rtx op, enum machine_mode mode)
4803 {
4804 if (!TARGET_FDPIC)
4805 return FALSE;
4806
4807 if (GET_CODE (op) != REG)
4808 return FALSE;
4809
4810 if (GET_MODE (op) != mode && mode != VOIDmode)
4811 return FALSE;
4812
4813 if (REGNO (op) != FDPIC_REGNO && REGNO (op) < FIRST_PSEUDO_REGISTER)
4814 return FALSE;
4815
4816 return TRUE;
4817 }
4818
4819 int
4820 got12_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
4821 {
4822 struct frv_unspec unspec;
4823
4824 if (frv_const_unspec_p (op, &unspec))
4825 switch (unspec.reloc)
4826 {
4827 case R_FRV_GOT12:
4828 case R_FRV_GOTOFF12:
4829 case R_FRV_FUNCDESC_GOT12:
4830 case R_FRV_FUNCDESC_GOTOFF12:
4831 case R_FRV_GPREL12:
4832 case R_FRV_TLSMOFF12:
4833 return true;
4834 }
4835 return false;
4836 }
4837
4838 /* Return true if OP is a valid const-unspec expression. */
4839
4840 int
4841 const_unspec_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
4842 {
4843 struct frv_unspec unspec;
4844
4845 return frv_const_unspec_p (op, &unspec);
4846 }
4847
4848 /* Return true if operand is a gpr register or a valid memory operand. */
4849
4850 int
4851 gpr_or_memory_operand (rtx op, enum machine_mode mode)
4852 {
4853 return (integer_register_operand (op, mode)
4854 || frv_legitimate_memory_operand (op, mode, FALSE));
4855 }
4856
4857 /* Return true if operand is a gpr register, a valid memory operand,
4858 or a memory operand that can be made valid using an additional gpr
4859 register. */
4860
4861 int
4862 gpr_or_memory_operand_with_scratch (rtx op, enum machine_mode mode)
4863 {
4864 rtx addr;
4865
4866 if (gpr_or_memory_operand (op, mode))
4867 return TRUE;
4868
4869 if (GET_CODE (op) != MEM)
4870 return FALSE;
4871
4872 if (GET_MODE (op) != mode)
4873 return FALSE;
4874
4875 addr = XEXP (op, 0);
4876
4877 if (GET_CODE (addr) != PLUS)
4878 return FALSE;
4879
4880 if (!integer_register_operand (XEXP (addr, 0), Pmode))
4881 return FALSE;
4882
4883 if (GET_CODE (XEXP (addr, 1)) != CONST_INT)
4884 return FALSE;
4885
4886 return TRUE;
4887 }
4888
4889 /* Return true if operand is a fpr register or a valid memory operation. */
4890
4891 int
4892 fpr_or_memory_operand (rtx op, enum machine_mode mode)
4893 {
4894 return (fpr_operand (op, mode)
4895 || frv_legitimate_memory_operand (op, mode, FALSE));
4896 }
4897
4898 /* Return true if operand is an icc register. */
4899
4900 int
4901 icc_operand (rtx op, enum machine_mode mode)
4902 {
4903 int regno;
4904
4905 if (GET_MODE (op) != mode && mode != VOIDmode)
4906 return FALSE;
4907
4908 if (GET_CODE (op) != REG)
4909 return FALSE;
4910
4911 regno = REGNO (op);
4912 return ICC_OR_PSEUDO_P (regno);
4913 }
4914
4915 /* Return true if operand is an fcc register. */
4916
4917 int
4918 fcc_operand (rtx op, enum machine_mode mode)
4919 {
4920 int regno;
4921
4922 if (GET_MODE (op) != mode && mode != VOIDmode)
4923 return FALSE;
4924
4925 if (GET_CODE (op) != REG)
4926 return FALSE;
4927
4928 regno = REGNO (op);
4929 return FCC_OR_PSEUDO_P (regno);
4930 }
4931
4932 /* Return true if operand is either an fcc or icc register. */
4933
4934 int
4935 cc_operand (rtx op, enum machine_mode mode)
4936 {
4937 int regno;
4938
4939 if (GET_MODE (op) != mode && mode != VOIDmode)
4940 return FALSE;
4941
4942 if (GET_CODE (op) != REG)
4943 return FALSE;
4944
4945 regno = REGNO (op);
4946 if (CC_OR_PSEUDO_P (regno))
4947 return TRUE;
4948
4949 return FALSE;
4950 }
4951
4952 /* Return true if operand is an integer CCR register. */
4953
4954 int
4955 icr_operand (rtx op, enum machine_mode mode)
4956 {
4957 int regno;
4958
4959 if (GET_MODE (op) != mode && mode != VOIDmode)
4960 return FALSE;
4961
4962 if (GET_CODE (op) != REG)
4963 return FALSE;
4964
4965 regno = REGNO (op);
4966 return ICR_OR_PSEUDO_P (regno);
4967 }
4968
4969 /* Return true if operand is an fcc register. */
4970
4971 int
4972 fcr_operand (rtx op, enum machine_mode mode)
4973 {
4974 int regno;
4975
4976 if (GET_MODE (op) != mode && mode != VOIDmode)
4977 return FALSE;
4978
4979 if (GET_CODE (op) != REG)
4980 return FALSE;
4981
4982 regno = REGNO (op);
4983 return FCR_OR_PSEUDO_P (regno);
4984 }
4985
4986 /* Return true if operand is either an fcc or icc register. */
4987
4988 int
4989 cr_operand (rtx op, enum machine_mode mode)
4990 {
4991 int regno;
4992
4993 if (GET_MODE (op) != mode && mode != VOIDmode)
4994 return FALSE;
4995
4996 if (GET_CODE (op) != REG)
4997 return FALSE;
4998
4999 regno = REGNO (op);
5000 if (CR_OR_PSEUDO_P (regno))
5001 return TRUE;
5002
5003 return FALSE;
5004 }
5005
5006 /* Return true if operand is a memory reference suitable for a call. */
5007
5008 int
5009 call_operand (rtx op, enum machine_mode mode)
5010 {
5011 if (GET_MODE (op) != mode && mode != VOIDmode && GET_CODE (op) != CONST_INT)
5012 return FALSE;
5013
5014 if (GET_CODE (op) == SYMBOL_REF)
5015 return !TARGET_LONG_CALLS || SYMBOL_REF_LOCAL_P (op);
5016
5017 /* Note this doesn't allow reg+reg or reg+imm12 addressing (which should
5018 never occur anyway), but prevents reload from not handling the case
5019 properly of a call through a pointer on a function that calls
5020 vfork/setjmp, etc. due to the need to flush all of the registers to stack. */
5021 return gpr_or_int12_operand (op, mode);
5022 }
5023
5024 /* Return true if operand is a memory reference suitable for a sibcall. */
5025
5026 int
5027 sibcall_operand (rtx op, enum machine_mode mode)
5028 {
5029 if (GET_MODE (op) != mode && mode != VOIDmode && GET_CODE (op) != CONST_INT)
5030 return FALSE;
5031
5032 /* Note this doesn't allow reg+reg or reg+imm12 addressing (which should
5033 never occur anyway), but prevents reload from not handling the case
5034 properly of a call through a pointer on a function that calls
5035 vfork/setjmp, etc. due to the need to flush all of the registers to stack. */
5036 return gpr_or_int12_operand (op, mode);
5037 }
5038
5039 /* Returns 1 if OP is either a SYMBOL_REF or a constant. */
5040 int
5041 symbolic_operand (register rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
5042 {
5043 enum rtx_code c = GET_CODE (op);
5044
5045 if (c == CONST)
5046 {
5047 /* Allow (const:SI (plus:SI (symbol_ref) (const_int))). */
5048 return GET_MODE (op) == SImode
5049 && GET_CODE (XEXP (op, 0)) == PLUS
5050 && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
5051 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT;
5052 }
5053
5054 return c == SYMBOL_REF || c == CONST_INT;
5055 }
5056
5057 /* Return true if operator is a kind of relational operator. */
5058
5059 int
5060 relational_operator (rtx op, enum machine_mode mode)
5061 {
5062 return (integer_relational_operator (op, mode)
5063 || float_relational_operator (op, mode));
5064 }
5065
5066 /* Return true if OP is a relational operator suitable for CCmode,
5067 CC_UNSmode or CC_NZmode. */
5068
5069 int
5070 integer_relational_operator (rtx op, enum machine_mode mode)
5071 {
5072 if (mode != VOIDmode && mode != GET_MODE (op))
5073 return FALSE;
5074
5075 /* The allowable relations depend on the mode of the ICC register. */
5076 switch (GET_CODE (op))
5077 {
5078 default:
5079 return FALSE;
5080
5081 case EQ:
5082 case NE:
5083 case LT:
5084 case GE:
5085 return (GET_MODE (XEXP (op, 0)) == CC_NZmode
5086 || GET_MODE (XEXP (op, 0)) == CCmode);
5087
5088 case LE:
5089 case GT:
5090 return GET_MODE (XEXP (op, 0)) == CCmode;
5091
5092 case GTU:
5093 case GEU:
5094 case LTU:
5095 case LEU:
5096 return (GET_MODE (XEXP (op, 0)) == CC_NZmode
5097 || GET_MODE (XEXP (op, 0)) == CC_UNSmode);
5098 }
5099 }
5100
5101 /* Return true if operator is a floating point relational operator. */
5102
5103 int
5104 float_relational_operator (rtx op, enum machine_mode mode)
5105 {
5106 if (mode != VOIDmode && mode != GET_MODE (op))
5107 return FALSE;
5108
5109 switch (GET_CODE (op))
5110 {
5111 default:
5112 return FALSE;
5113
5114 case EQ: case NE:
5115 case LE: case LT:
5116 case GE: case GT:
5117 #if 0
5118 case UEQ: case UNE:
5119 case ULE: case ULT:
5120 case UGE: case UGT:
5121 case ORDERED:
5122 case UNORDERED:
5123 #endif
5124 return GET_MODE (XEXP (op, 0)) == CC_FPmode;
5125 }
5126 }
5127
5128 /* Return true if operator is EQ/NE of a conditional execution register. */
5129
5130 int
5131 ccr_eqne_operator (rtx op, enum machine_mode mode)
5132 {
5133 enum machine_mode op_mode = GET_MODE (op);
5134 rtx op0;
5135 rtx op1;
5136 int regno;
5137
5138 if (mode != VOIDmode && op_mode != mode)
5139 return FALSE;
5140
5141 switch (GET_CODE (op))
5142 {
5143 default:
5144 return FALSE;
5145
5146 case EQ:
5147 case NE:
5148 break;
5149 }
5150
5151 op1 = XEXP (op, 1);
5152 if (op1 != const0_rtx)
5153 return FALSE;
5154
5155 op0 = XEXP (op, 0);
5156 if (GET_CODE (op0) != REG)
5157 return FALSE;
5158
5159 regno = REGNO (op0);
5160 if (op_mode == CC_CCRmode && CR_OR_PSEUDO_P (regno))
5161 return TRUE;
5162
5163 return FALSE;
5164 }
5165
5166 /* Return true if operator is a minimum or maximum operator (both signed and
5167 unsigned). */
5168
5169 int
5170 minmax_operator (rtx op, enum machine_mode mode)
5171 {
5172 if (mode != VOIDmode && mode != GET_MODE (op))
5173 return FALSE;
5174
5175 switch (GET_CODE (op))
5176 {
5177 default:
5178 return FALSE;
5179
5180 case SMIN:
5181 case SMAX:
5182 case UMIN:
5183 case UMAX:
5184 break;
5185 }
5186
5187 if (! integer_register_operand (XEXP (op, 0), mode))
5188 return FALSE;
5189
5190 if (! gpr_or_int10_operand (XEXP (op, 1), mode))
5191 return FALSE;
5192
5193 return TRUE;
5194 }
5195
5196 /* Return true if operator is an integer binary operator that can executed
5197 conditionally and takes 1 cycle. */
5198
5199 int
5200 condexec_si_binary_operator (rtx op, enum machine_mode mode)
5201 {
5202 enum machine_mode op_mode = GET_MODE (op);
5203
5204 if (mode != VOIDmode && op_mode != mode)
5205 return FALSE;
5206
5207 switch (GET_CODE (op))
5208 {
5209 default:
5210 return FALSE;
5211
5212 case PLUS:
5213 case MINUS:
5214 case AND:
5215 case IOR:
5216 case XOR:
5217 case ASHIFT:
5218 case ASHIFTRT:
5219 case LSHIFTRT:
5220 return TRUE;
5221 }
5222 }
5223
5224 /* Return true if operator is an integer binary operator that can be
5225 executed conditionally by a media instruction. */
5226
5227 int
5228 condexec_si_media_operator (rtx op, enum machine_mode mode)
5229 {
5230 enum machine_mode op_mode = GET_MODE (op);
5231
5232 if (mode != VOIDmode && op_mode != mode)
5233 return FALSE;
5234
5235 switch (GET_CODE (op))
5236 {
5237 default:
5238 return FALSE;
5239
5240 case AND:
5241 case IOR:
5242 case XOR:
5243 return TRUE;
5244 }
5245 }
5246
5247 /* Return true if operator is an integer division operator that can executed
5248 conditionally. */
5249
5250 int
5251 condexec_si_divide_operator (rtx op, enum machine_mode mode)
5252 {
5253 enum machine_mode op_mode = GET_MODE (op);
5254
5255 if (mode != VOIDmode && op_mode != mode)
5256 return FALSE;
5257
5258 switch (GET_CODE (op))
5259 {
5260 default:
5261 return FALSE;
5262
5263 case DIV:
5264 case UDIV:
5265 return TRUE;
5266 }
5267 }
5268
5269 /* Return true if operator is an integer unary operator that can executed
5270 conditionally. */
5271
5272 int
5273 condexec_si_unary_operator (rtx op, enum machine_mode mode)
5274 {
5275 enum machine_mode op_mode = GET_MODE (op);
5276
5277 if (mode != VOIDmode && op_mode != mode)
5278 return FALSE;
5279
5280 switch (GET_CODE (op))
5281 {
5282 default:
5283 return FALSE;
5284
5285 case NEG:
5286 case NOT:
5287 return TRUE;
5288 }
5289 }
5290
5291 /* Return true if operator is a conversion-type expression that can be
5292 evaluated conditionally by floating-point instructions. */
5293
5294 int
5295 condexec_sf_conv_operator (rtx op, enum machine_mode mode)
5296 {
5297 enum machine_mode op_mode = GET_MODE (op);
5298
5299 if (mode != VOIDmode && op_mode != mode)
5300 return FALSE;
5301
5302 switch (GET_CODE (op))
5303 {
5304 default:
5305 return FALSE;
5306
5307 case NEG:
5308 case ABS:
5309 return TRUE;
5310 }
5311 }
5312
5313 /* Return true if operator is an addition or subtraction expression.
5314 Such expressions can be evaluated conditionally by floating-point
5315 instructions. */
5316
5317 int
5318 condexec_sf_add_operator (rtx op, enum machine_mode mode)
5319 {
5320 enum machine_mode op_mode = GET_MODE (op);
5321
5322 if (mode != VOIDmode && op_mode != mode)
5323 return FALSE;
5324
5325 switch (GET_CODE (op))
5326 {
5327 default:
5328 return FALSE;
5329
5330 case PLUS:
5331 case MINUS:
5332 return TRUE;
5333 }
5334 }
5335
5336 /* Return true if the memory operand is one that can be conditionally
5337 executed. */
5338
5339 int
5340 condexec_memory_operand (rtx op, enum machine_mode mode)
5341 {
5342 enum machine_mode op_mode = GET_MODE (op);
5343 rtx addr;
5344
5345 if (mode != VOIDmode && op_mode != mode)
5346 return FALSE;
5347
5348 switch (op_mode)
5349 {
5350 default:
5351 return FALSE;
5352
5353 case QImode:
5354 case HImode:
5355 case SImode:
5356 case SFmode:
5357 break;
5358 }
5359
5360 if (GET_CODE (op) != MEM)
5361 return FALSE;
5362
5363 addr = XEXP (op, 0);
5364 return frv_legitimate_address_p (mode, addr, reload_completed, TRUE, FALSE);
5365 }
5366
5367 /* Return true if OP is an integer binary operator that can be combined
5368 with a (set ... (compare:CC_NZ ...)) pattern. */
5369
5370 int
5371 intop_compare_operator (rtx op, enum machine_mode mode)
5372 {
5373 if (mode != VOIDmode && GET_MODE (op) != mode)
5374 return FALSE;
5375
5376 switch (GET_CODE (op))
5377 {
5378 default:
5379 return FALSE;
5380
5381 case PLUS:
5382 case MINUS:
5383 case AND:
5384 case IOR:
5385 case XOR:
5386 case ASHIFTRT:
5387 case LSHIFTRT:
5388 return GET_MODE (op) == SImode;
5389 }
5390 }
5391
5392 /* Return 1 if operand is a valid ACC register number. */
5393
5394 int
5395 acc_operand (rtx op, enum machine_mode mode)
5396 {
5397 return ((mode == VOIDmode || mode == GET_MODE (op))
5398 && REG_P (op) && ACC_P (REGNO (op))
5399 && ((REGNO (op) - ACC_FIRST) & ~ACC_MASK) == 0);
5400 }
5401
5402 /* Return 1 if operand is a valid even ACC register number. */
5403
5404 int
5405 even_acc_operand (rtx op, enum machine_mode mode)
5406 {
5407 return acc_operand (op, mode) && ((REGNO (op) - ACC_FIRST) & 1) == 0;
5408 }
5409
5410 /* Return 1 if operand is zero or four. */
5411
5412 int
5413 quad_acc_operand (rtx op, enum machine_mode mode)
5414 {
5415 return acc_operand (op, mode) && ((REGNO (op) - ACC_FIRST) & 3) == 0;
5416 }
5417
5418 /* Return 1 if operand is a valid ACCG register number. */
5419
5420 int
5421 accg_operand (rtx op, enum machine_mode mode)
5422 {
5423 return ((mode == VOIDmode || mode == GET_MODE (op))
5424 && REG_P (op) && ACCG_P (REGNO (op))
5425 && ((REGNO (op) - ACCG_FIRST) & ~ACC_MASK) == 0);
5426 }
5427
5428 \f
5429 /* Return true if the bare return instruction can be used outside of the
5430 epilog code. For frv, we only do it if there was no stack allocation. */
5431
5432 int
5433 direct_return_p (void)
5434 {
5435 frv_stack_t *info;
5436
5437 if (!reload_completed)
5438 return FALSE;
5439
5440 info = frv_stack_info ();
5441 return (info->total_size == 0);
5442 }
5443
5444 \f
5445 void
5446 frv_emit_move (enum machine_mode mode, rtx dest, rtx src)
5447 {
5448 if (GET_CODE (src) == SYMBOL_REF)
5449 {
5450 enum tls_model model = SYMBOL_REF_TLS_MODEL (src);
5451 if (model != 0)
5452 src = frv_legitimize_tls_address (src, model);
5453 }
5454
5455 switch (mode)
5456 {
5457 case SImode:
5458 if (frv_emit_movsi (dest, src))
5459 return;
5460 break;
5461
5462 case QImode:
5463 case HImode:
5464 case DImode:
5465 case SFmode:
5466 case DFmode:
5467 if (!reload_in_progress
5468 && !reload_completed
5469 && !register_operand (dest, mode)
5470 && !reg_or_0_operand (src, mode))
5471 src = copy_to_mode_reg (mode, src);
5472 break;
5473
5474 default:
5475 abort ();
5476 }
5477
5478 emit_insn (gen_rtx_SET (VOIDmode, dest, src));
5479 }
5480
5481 /* Emit code to handle a MOVSI, adding in the small data register or pic
5482 register if needed to load up addresses. Return TRUE if the appropriate
5483 instructions are emitted. */
5484
5485 int
5486 frv_emit_movsi (rtx dest, rtx src)
5487 {
5488 int base_regno = -1;
5489 int unspec = 0;
5490 rtx sym = src;
5491 struct frv_unspec old_unspec;
5492
5493 if (!reload_in_progress
5494 && !reload_completed
5495 && !register_operand (dest, SImode)
5496 && (!reg_or_0_operand (src, SImode)
5497 /* Virtual registers will almost always be replaced by an
5498 add instruction, so expose this to CSE by copying to
5499 an intermediate register. */
5500 || (GET_CODE (src) == REG
5501 && IN_RANGE_P (REGNO (src),
5502 FIRST_VIRTUAL_REGISTER,
5503 LAST_VIRTUAL_REGISTER))))
5504 {
5505 emit_insn (gen_rtx_SET (VOIDmode, dest, copy_to_mode_reg (SImode, src)));
5506 return TRUE;
5507 }
5508
5509 /* Explicitly add in the PIC or small data register if needed. */
5510 switch (GET_CODE (src))
5511 {
5512 default:
5513 break;
5514
5515 case LABEL_REF:
5516 handle_label:
5517 if (TARGET_FDPIC)
5518 {
5519 /* Using GPREL12, we use a single GOT entry for all symbols
5520 in read-only sections, but trade sequences such as:
5521
5522 sethi #gothi(label), gr#
5523 setlo #gotlo(label), gr#
5524 ld @(gr15,gr#), gr#
5525
5526 for
5527
5528 ld @(gr15,#got12(_gp)), gr#
5529 sethi #gprelhi(label), gr##
5530 setlo #gprello(label), gr##
5531 add gr#, gr##, gr##
5532
5533 We may often be able to share gr# for multiple
5534 computations of GPREL addresses, and we may often fold
5535 the final add into the pair of registers of a load or
5536 store instruction, so it's often profitable. Even when
5537 optimizing for size, we're trading a GOT entry for an
5538 additional instruction, which trades GOT space
5539 (read-write) for code size (read-only, shareable), as
5540 long as the symbol is not used in more than two different
5541 locations.
5542
5543 With -fpie/-fpic, we'd be trading a single load for a
5544 sequence of 4 instructions, because the offset of the
5545 label can't be assumed to be addressable with 12 bits, so
5546 we don't do this. */
5547 if (TARGET_GPREL_RO)
5548 unspec = R_FRV_GPREL12;
5549 else
5550 unspec = R_FRV_GOT12;
5551 }
5552 else if (flag_pic)
5553 base_regno = PIC_REGNO;
5554
5555 break;
5556
5557 case CONST:
5558 if (frv_const_unspec_p (src, &old_unspec))
5559 break;
5560
5561 if (TARGET_FDPIC && frv_function_symbol_referenced_p (XEXP (src, 0)))
5562 {
5563 handle_whatever:
5564 src = force_reg (GET_MODE (XEXP (src, 0)), XEXP (src, 0));
5565 emit_move_insn (dest, src);
5566 return TRUE;
5567 }
5568 else
5569 {
5570 sym = XEXP (sym, 0);
5571 if (GET_CODE (sym) == PLUS
5572 && GET_CODE (XEXP (sym, 0)) == SYMBOL_REF
5573 && GET_CODE (XEXP (sym, 1)) == CONST_INT)
5574 sym = XEXP (sym, 0);
5575 if (GET_CODE (sym) == SYMBOL_REF)
5576 goto handle_sym;
5577 else if (GET_CODE (sym) == LABEL_REF)
5578 goto handle_label;
5579 else
5580 goto handle_whatever;
5581 }
5582 break;
5583
5584 case SYMBOL_REF:
5585 handle_sym:
5586 if (TARGET_FDPIC)
5587 {
5588 enum tls_model model = SYMBOL_REF_TLS_MODEL (sym);
5589
5590 if (model != 0)
5591 {
5592 src = frv_legitimize_tls_address (src, model);
5593 emit_move_insn (dest, src);
5594 return TRUE;
5595 }
5596
5597 if (SYMBOL_REF_FUNCTION_P (sym))
5598 {
5599 if (frv_local_funcdesc_p (sym))
5600 unspec = R_FRV_FUNCDESC_GOTOFF12;
5601 else
5602 unspec = R_FRV_FUNCDESC_GOT12;
5603 }
5604 else
5605 {
5606 if (CONSTANT_POOL_ADDRESS_P (sym))
5607 switch (GET_CODE (get_pool_constant (sym)))
5608 {
5609 case CONST:
5610 case SYMBOL_REF:
5611 case LABEL_REF:
5612 if (flag_pic)
5613 {
5614 unspec = R_FRV_GOTOFF12;
5615 break;
5616 }
5617 /* Fall through. */
5618 default:
5619 if (TARGET_GPREL_RO)
5620 unspec = R_FRV_GPREL12;
5621 else
5622 unspec = R_FRV_GOT12;
5623 break;
5624 }
5625 else if (SYMBOL_REF_LOCAL_P (sym)
5626 && !SYMBOL_REF_EXTERNAL_P (sym)
5627 && SYMBOL_REF_DECL (sym)
5628 && (!DECL_P (SYMBOL_REF_DECL (sym))
5629 || !DECL_COMMON (SYMBOL_REF_DECL (sym))))
5630 {
5631 tree decl = SYMBOL_REF_DECL (sym);
5632 tree init = TREE_CODE (decl) == VAR_DECL
5633 ? DECL_INITIAL (decl)
5634 : TREE_CODE (decl) == CONSTRUCTOR
5635 ? decl : 0;
5636 int reloc = 0;
5637 bool named_section, readonly;
5638
5639 if (init && init != error_mark_node)
5640 reloc = compute_reloc_for_constant (init);
5641
5642 named_section = TREE_CODE (decl) == VAR_DECL
5643 && lookup_attribute ("section", DECL_ATTRIBUTES (decl));
5644 readonly = decl_readonly_section (decl, reloc);
5645
5646 if (named_section)
5647 unspec = R_FRV_GOT12;
5648 else if (!readonly)
5649 unspec = R_FRV_GOTOFF12;
5650 else if (readonly && TARGET_GPREL_RO)
5651 unspec = R_FRV_GPREL12;
5652 else
5653 unspec = R_FRV_GOT12;
5654 }
5655 else
5656 unspec = R_FRV_GOT12;
5657 }
5658 }
5659
5660 else if (SYMBOL_REF_SMALL_P (sym))
5661 base_regno = SDA_BASE_REG;
5662
5663 else if (flag_pic)
5664 base_regno = PIC_REGNO;
5665
5666 break;
5667 }
5668
5669 if (base_regno >= 0)
5670 {
5671 if (GET_CODE (sym) == SYMBOL_REF && SYMBOL_REF_SMALL_P (sym))
5672 emit_insn (gen_symGOTOFF2reg (dest, src,
5673 gen_rtx_REG (Pmode, base_regno),
5674 GEN_INT (R_FRV_GPREL12)));
5675 else
5676 emit_insn (gen_symGOTOFF2reg_hilo (dest, src,
5677 gen_rtx_REG (Pmode, base_regno),
5678 GEN_INT (R_FRV_GPREL12)));
5679 if (base_regno == PIC_REGNO)
5680 cfun->uses_pic_offset_table = TRUE;
5681 return TRUE;
5682 }
5683
5684 if (unspec)
5685 {
5686 rtx x;
5687
5688 /* Since OUR_FDPIC_REG is a pseudo register, we can't safely introduce
5689 new uses of it once reload has begun. */
5690 if (reload_in_progress || reload_completed)
5691 abort ();
5692
5693 switch (unspec)
5694 {
5695 case R_FRV_GOTOFF12:
5696 if (!frv_small_data_reloc_p (sym, unspec))
5697 x = gen_symGOTOFF2reg_hilo (dest, src, OUR_FDPIC_REG,
5698 GEN_INT (unspec));
5699 else
5700 x = gen_symGOTOFF2reg (dest, src, OUR_FDPIC_REG, GEN_INT (unspec));
5701 break;
5702 case R_FRV_GPREL12:
5703 if (!frv_small_data_reloc_p (sym, unspec))
5704 x = gen_symGPREL2reg_hilo (dest, src, OUR_FDPIC_REG,
5705 GEN_INT (unspec));
5706 else
5707 x = gen_symGPREL2reg (dest, src, OUR_FDPIC_REG, GEN_INT (unspec));
5708 break;
5709 case R_FRV_FUNCDESC_GOTOFF12:
5710 if (flag_pic != 1)
5711 x = gen_symGOTOFF2reg_hilo (dest, src, OUR_FDPIC_REG,
5712 GEN_INT (unspec));
5713 else
5714 x = gen_symGOTOFF2reg (dest, src, OUR_FDPIC_REG, GEN_INT (unspec));
5715 break;
5716 default:
5717 if (flag_pic != 1)
5718 x = gen_symGOT2reg_hilo (dest, src, OUR_FDPIC_REG,
5719 GEN_INT (unspec));
5720 else
5721 x = gen_symGOT2reg (dest, src, OUR_FDPIC_REG, GEN_INT (unspec));
5722 break;
5723 }
5724 emit_insn (x);
5725 cfun->uses_pic_offset_table = TRUE;
5726 return TRUE;
5727 }
5728
5729
5730 return FALSE;
5731 }
5732
5733 \f
5734 /* Return a string to output a single word move. */
5735
5736 const char *
5737 output_move_single (rtx operands[], rtx insn)
5738 {
5739 rtx dest = operands[0];
5740 rtx src = operands[1];
5741
5742 if (GET_CODE (dest) == REG)
5743 {
5744 int dest_regno = REGNO (dest);
5745 enum machine_mode mode = GET_MODE (dest);
5746
5747 if (GPR_P (dest_regno))
5748 {
5749 if (GET_CODE (src) == REG)
5750 {
5751 /* gpr <- some sort of register */
5752 int src_regno = REGNO (src);
5753
5754 if (GPR_P (src_regno))
5755 return "mov %1, %0";
5756
5757 else if (FPR_P (src_regno))
5758 return "movfg %1, %0";
5759
5760 else if (SPR_P (src_regno))
5761 return "movsg %1, %0";
5762 }
5763
5764 else if (GET_CODE (src) == MEM)
5765 {
5766 /* gpr <- memory */
5767 switch (mode)
5768 {
5769 default:
5770 break;
5771
5772 case QImode:
5773 return "ldsb%I1%U1 %M1,%0";
5774
5775 case HImode:
5776 return "ldsh%I1%U1 %M1,%0";
5777
5778 case SImode:
5779 case SFmode:
5780 return "ld%I1%U1 %M1, %0";
5781 }
5782 }
5783
5784 else if (GET_CODE (src) == CONST_INT
5785 || GET_CODE (src) == CONST_DOUBLE)
5786 {
5787 /* gpr <- integer/floating constant */
5788 HOST_WIDE_INT value;
5789
5790 if (GET_CODE (src) == CONST_INT)
5791 value = INTVAL (src);
5792
5793 else if (mode == SFmode)
5794 {
5795 REAL_VALUE_TYPE rv;
5796 long l;
5797
5798 REAL_VALUE_FROM_CONST_DOUBLE (rv, src);
5799 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
5800 value = l;
5801 }
5802
5803 else
5804 value = CONST_DOUBLE_LOW (src);
5805
5806 if (IN_RANGE_P (value, -32768, 32767))
5807 return "setlos %1, %0";
5808
5809 return "#";
5810 }
5811
5812 else if (GET_CODE (src) == SYMBOL_REF
5813 || GET_CODE (src) == LABEL_REF
5814 || GET_CODE (src) == CONST)
5815 {
5816 return "#";
5817 }
5818 }
5819
5820 else if (FPR_P (dest_regno))
5821 {
5822 if (GET_CODE (src) == REG)
5823 {
5824 /* fpr <- some sort of register */
5825 int src_regno = REGNO (src);
5826
5827 if (GPR_P (src_regno))
5828 return "movgf %1, %0";
5829
5830 else if (FPR_P (src_regno))
5831 {
5832 if (TARGET_HARD_FLOAT)
5833 return "fmovs %1, %0";
5834 else
5835 return "mor %1, %1, %0";
5836 }
5837 }
5838
5839 else if (GET_CODE (src) == MEM)
5840 {
5841 /* fpr <- memory */
5842 switch (mode)
5843 {
5844 default:
5845 break;
5846
5847 case QImode:
5848 return "ldbf%I1%U1 %M1,%0";
5849
5850 case HImode:
5851 return "ldhf%I1%U1 %M1,%0";
5852
5853 case SImode:
5854 case SFmode:
5855 return "ldf%I1%U1 %M1, %0";
5856 }
5857 }
5858
5859 else if (ZERO_P (src))
5860 return "movgf %., %0";
5861 }
5862
5863 else if (SPR_P (dest_regno))
5864 {
5865 if (GET_CODE (src) == REG)
5866 {
5867 /* spr <- some sort of register */
5868 int src_regno = REGNO (src);
5869
5870 if (GPR_P (src_regno))
5871 return "movgs %1, %0";
5872 }
5873 else if (ZERO_P (src))
5874 return "movgs %., %0";
5875 }
5876 }
5877
5878 else if (GET_CODE (dest) == MEM)
5879 {
5880 if (GET_CODE (src) == REG)
5881 {
5882 int src_regno = REGNO (src);
5883 enum machine_mode mode = GET_MODE (dest);
5884
5885 if (GPR_P (src_regno))
5886 {
5887 switch (mode)
5888 {
5889 default:
5890 break;
5891
5892 case QImode:
5893 return "stb%I0%U0 %1, %M0";
5894
5895 case HImode:
5896 return "sth%I0%U0 %1, %M0";
5897
5898 case SImode:
5899 case SFmode:
5900 return "st%I0%U0 %1, %M0";
5901 }
5902 }
5903
5904 else if (FPR_P (src_regno))
5905 {
5906 switch (mode)
5907 {
5908 default:
5909 break;
5910
5911 case QImode:
5912 return "stbf%I0%U0 %1, %M0";
5913
5914 case HImode:
5915 return "sthf%I0%U0 %1, %M0";
5916
5917 case SImode:
5918 case SFmode:
5919 return "stf%I0%U0 %1, %M0";
5920 }
5921 }
5922 }
5923
5924 else if (ZERO_P (src))
5925 {
5926 switch (GET_MODE (dest))
5927 {
5928 default:
5929 break;
5930
5931 case QImode:
5932 return "stb%I0%U0 %., %M0";
5933
5934 case HImode:
5935 return "sth%I0%U0 %., %M0";
5936
5937 case SImode:
5938 case SFmode:
5939 return "st%I0%U0 %., %M0";
5940 }
5941 }
5942 }
5943
5944 fatal_insn ("Bad output_move_single operand", insn);
5945 return "";
5946 }
5947
5948 \f
5949 /* Return a string to output a double word move. */
5950
5951 const char *
5952 output_move_double (rtx operands[], rtx insn)
5953 {
5954 rtx dest = operands[0];
5955 rtx src = operands[1];
5956 enum machine_mode mode = GET_MODE (dest);
5957
5958 if (GET_CODE (dest) == REG)
5959 {
5960 int dest_regno = REGNO (dest);
5961
5962 if (GPR_P (dest_regno))
5963 {
5964 if (GET_CODE (src) == REG)
5965 {
5966 /* gpr <- some sort of register */
5967 int src_regno = REGNO (src);
5968
5969 if (GPR_P (src_regno))
5970 return "#";
5971
5972 else if (FPR_P (src_regno))
5973 {
5974 if (((dest_regno - GPR_FIRST) & 1) == 0
5975 && ((src_regno - FPR_FIRST) & 1) == 0)
5976 return "movfgd %1, %0";
5977
5978 return "#";
5979 }
5980 }
5981
5982 else if (GET_CODE (src) == MEM)
5983 {
5984 /* gpr <- memory */
5985 if (dbl_memory_one_insn_operand (src, mode))
5986 return "ldd%I1%U1 %M1, %0";
5987
5988 return "#";
5989 }
5990
5991 else if (GET_CODE (src) == CONST_INT
5992 || GET_CODE (src) == CONST_DOUBLE)
5993 return "#";
5994 }
5995
5996 else if (FPR_P (dest_regno))
5997 {
5998 if (GET_CODE (src) == REG)
5999 {
6000 /* fpr <- some sort of register */
6001 int src_regno = REGNO (src);
6002
6003 if (GPR_P (src_regno))
6004 {
6005 if (((dest_regno - FPR_FIRST) & 1) == 0
6006 && ((src_regno - GPR_FIRST) & 1) == 0)
6007 return "movgfd %1, %0";
6008
6009 return "#";
6010 }
6011
6012 else if (FPR_P (src_regno))
6013 {
6014 if (TARGET_DOUBLE
6015 && ((dest_regno - FPR_FIRST) & 1) == 0
6016 && ((src_regno - FPR_FIRST) & 1) == 0)
6017 return "fmovd %1, %0";
6018
6019 return "#";
6020 }
6021 }
6022
6023 else if (GET_CODE (src) == MEM)
6024 {
6025 /* fpr <- memory */
6026 if (dbl_memory_one_insn_operand (src, mode))
6027 return "lddf%I1%U1 %M1, %0";
6028
6029 return "#";
6030 }
6031
6032 else if (ZERO_P (src))
6033 return "#";
6034 }
6035 }
6036
6037 else if (GET_CODE (dest) == MEM)
6038 {
6039 if (GET_CODE (src) == REG)
6040 {
6041 int src_regno = REGNO (src);
6042
6043 if (GPR_P (src_regno))
6044 {
6045 if (((src_regno - GPR_FIRST) & 1) == 0
6046 && dbl_memory_one_insn_operand (dest, mode))
6047 return "std%I0%U0 %1, %M0";
6048
6049 return "#";
6050 }
6051
6052 if (FPR_P (src_regno))
6053 {
6054 if (((src_regno - FPR_FIRST) & 1) == 0
6055 && dbl_memory_one_insn_operand (dest, mode))
6056 return "stdf%I0%U0 %1, %M0";
6057
6058 return "#";
6059 }
6060 }
6061
6062 else if (ZERO_P (src))
6063 {
6064 if (dbl_memory_one_insn_operand (dest, mode))
6065 return "std%I0%U0 %., %M0";
6066
6067 return "#";
6068 }
6069 }
6070
6071 fatal_insn ("Bad output_move_double operand", insn);
6072 return "";
6073 }
6074
6075 \f
6076 /* Return a string to output a single word conditional move.
6077 Operand0 -- EQ/NE of ccr register and 0
6078 Operand1 -- CCR register
6079 Operand2 -- destination
6080 Operand3 -- source */
6081
6082 const char *
6083 output_condmove_single (rtx operands[], rtx insn)
6084 {
6085 rtx dest = operands[2];
6086 rtx src = operands[3];
6087
6088 if (GET_CODE (dest) == REG)
6089 {
6090 int dest_regno = REGNO (dest);
6091 enum machine_mode mode = GET_MODE (dest);
6092
6093 if (GPR_P (dest_regno))
6094 {
6095 if (GET_CODE (src) == REG)
6096 {
6097 /* gpr <- some sort of register */
6098 int src_regno = REGNO (src);
6099
6100 if (GPR_P (src_regno))
6101 return "cmov %z3, %2, %1, %e0";
6102
6103 else if (FPR_P (src_regno))
6104 return "cmovfg %3, %2, %1, %e0";
6105 }
6106
6107 else if (GET_CODE (src) == MEM)
6108 {
6109 /* gpr <- memory */
6110 switch (mode)
6111 {
6112 default:
6113 break;
6114
6115 case QImode:
6116 return "cldsb%I3%U3 %M3, %2, %1, %e0";
6117
6118 case HImode:
6119 return "cldsh%I3%U3 %M3, %2, %1, %e0";
6120
6121 case SImode:
6122 case SFmode:
6123 return "cld%I3%U3 %M3, %2, %1, %e0";
6124 }
6125 }
6126
6127 else if (ZERO_P (src))
6128 return "cmov %., %2, %1, %e0";
6129 }
6130
6131 else if (FPR_P (dest_regno))
6132 {
6133 if (GET_CODE (src) == REG)
6134 {
6135 /* fpr <- some sort of register */
6136 int src_regno = REGNO (src);
6137
6138 if (GPR_P (src_regno))
6139 return "cmovgf %3, %2, %1, %e0";
6140
6141 else if (FPR_P (src_regno))
6142 {
6143 if (TARGET_HARD_FLOAT)
6144 return "cfmovs %3,%2,%1,%e0";
6145 else
6146 return "cmor %3, %3, %2, %1, %e0";
6147 }
6148 }
6149
6150 else if (GET_CODE (src) == MEM)
6151 {
6152 /* fpr <- memory */
6153 if (mode == SImode || mode == SFmode)
6154 return "cldf%I3%U3 %M3, %2, %1, %e0";
6155 }
6156
6157 else if (ZERO_P (src))
6158 return "cmovgf %., %2, %1, %e0";
6159 }
6160 }
6161
6162 else if (GET_CODE (dest) == MEM)
6163 {
6164 if (GET_CODE (src) == REG)
6165 {
6166 int src_regno = REGNO (src);
6167 enum machine_mode mode = GET_MODE (dest);
6168
6169 if (GPR_P (src_regno))
6170 {
6171 switch (mode)
6172 {
6173 default:
6174 break;
6175
6176 case QImode:
6177 return "cstb%I2%U2 %3, %M2, %1, %e0";
6178
6179 case HImode:
6180 return "csth%I2%U2 %3, %M2, %1, %e0";
6181
6182 case SImode:
6183 case SFmode:
6184 return "cst%I2%U2 %3, %M2, %1, %e0";
6185 }
6186 }
6187
6188 else if (FPR_P (src_regno) && (mode == SImode || mode == SFmode))
6189 return "cstf%I2%U2 %3, %M2, %1, %e0";
6190 }
6191
6192 else if (ZERO_P (src))
6193 {
6194 enum machine_mode mode = GET_MODE (dest);
6195 switch (mode)
6196 {
6197 default:
6198 break;
6199
6200 case QImode:
6201 return "cstb%I2%U2 %., %M2, %1, %e0";
6202
6203 case HImode:
6204 return "csth%I2%U2 %., %M2, %1, %e0";
6205
6206 case SImode:
6207 case SFmode:
6208 return "cst%I2%U2 %., %M2, %1, %e0";
6209 }
6210 }
6211 }
6212
6213 fatal_insn ("Bad output_condmove_single operand", insn);
6214 return "";
6215 }
6216
6217 \f
6218 /* Emit the appropriate code to do a comparison, returning the register the
6219 comparison was done it. */
6220
6221 static rtx
6222 frv_emit_comparison (enum rtx_code test, rtx op0, rtx op1)
6223 {
6224 enum machine_mode cc_mode;
6225 rtx cc_reg;
6226
6227 /* Floating point doesn't have comparison against a constant. */
6228 if (GET_MODE (op0) == CC_FPmode && GET_CODE (op1) != REG)
6229 op1 = force_reg (GET_MODE (op0), op1);
6230
6231 /* Possibly disable using anything but a fixed register in order to work
6232 around cse moving comparisons past function calls. */
6233 cc_mode = SELECT_CC_MODE (test, op0, op1);
6234 cc_reg = ((TARGET_ALLOC_CC)
6235 ? gen_reg_rtx (cc_mode)
6236 : gen_rtx_REG (cc_mode,
6237 (cc_mode == CC_FPmode) ? FCC_FIRST : ICC_FIRST));
6238
6239 emit_insn (gen_rtx_SET (VOIDmode, cc_reg,
6240 gen_rtx_COMPARE (cc_mode, op0, op1)));
6241
6242 return cc_reg;
6243 }
6244
6245 \f
6246 /* Emit code for a conditional branch. The comparison operands were previously
6247 stored in frv_compare_op0 and frv_compare_op1.
6248
6249 XXX: I originally wanted to add a clobber of a CCR register to use in
6250 conditional execution, but that confuses the rest of the compiler. */
6251
6252 int
6253 frv_emit_cond_branch (enum rtx_code test, rtx label)
6254 {
6255 rtx test_rtx;
6256 rtx label_ref;
6257 rtx if_else;
6258 rtx cc_reg = frv_emit_comparison (test, frv_compare_op0, frv_compare_op1);
6259 enum machine_mode cc_mode = GET_MODE (cc_reg);
6260
6261 /* Branches generate:
6262 (set (pc)
6263 (if_then_else (<test>, <cc_reg>, (const_int 0))
6264 (label_ref <branch_label>)
6265 (pc))) */
6266 label_ref = gen_rtx_LABEL_REF (VOIDmode, label);
6267 test_rtx = gen_rtx_fmt_ee (test, cc_mode, cc_reg, const0_rtx);
6268 if_else = gen_rtx_IF_THEN_ELSE (cc_mode, test_rtx, label_ref, pc_rtx);
6269 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, if_else));
6270 return TRUE;
6271 }
6272
6273 \f
6274 /* Emit code to set a gpr to 1/0 based on a comparison. The comparison
6275 operands were previously stored in frv_compare_op0 and frv_compare_op1. */
6276
6277 int
6278 frv_emit_scc (enum rtx_code test, rtx target)
6279 {
6280 rtx set;
6281 rtx test_rtx;
6282 rtx clobber;
6283 rtx cr_reg;
6284 rtx cc_reg = frv_emit_comparison (test, frv_compare_op0, frv_compare_op1);
6285
6286 /* SCC instructions generate:
6287 (parallel [(set <target> (<test>, <cc_reg>, (const_int 0))
6288 (clobber (<ccr_reg>))]) */
6289 test_rtx = gen_rtx_fmt_ee (test, SImode, cc_reg, const0_rtx);
6290 set = gen_rtx_SET (VOIDmode, target, test_rtx);
6291
6292 cr_reg = ((TARGET_ALLOC_CC)
6293 ? gen_reg_rtx (CC_CCRmode)
6294 : gen_rtx_REG (CC_CCRmode,
6295 ((GET_MODE (cc_reg) == CC_FPmode)
6296 ? FCR_FIRST
6297 : ICR_FIRST)));
6298
6299 clobber = gen_rtx_CLOBBER (VOIDmode, cr_reg);
6300 emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber)));
6301 return TRUE;
6302 }
6303
6304 \f
6305 /* Split a SCC instruction into component parts, returning a SEQUENCE to hold
6306 the separate insns. */
6307
6308 rtx
6309 frv_split_scc (rtx dest, rtx test, rtx cc_reg, rtx cr_reg, HOST_WIDE_INT value)
6310 {
6311 rtx ret;
6312
6313 start_sequence ();
6314
6315 /* Set the appropriate CCR bit. */
6316 emit_insn (gen_rtx_SET (VOIDmode,
6317 cr_reg,
6318 gen_rtx_fmt_ee (GET_CODE (test),
6319 GET_MODE (cr_reg),
6320 cc_reg,
6321 const0_rtx)));
6322
6323 /* Move the value into the destination. */
6324 emit_move_insn (dest, GEN_INT (value));
6325
6326 /* Move 0 into the destination if the test failed */
6327 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
6328 gen_rtx_EQ (GET_MODE (cr_reg),
6329 cr_reg,
6330 const0_rtx),
6331 gen_rtx_SET (VOIDmode, dest, const0_rtx)));
6332
6333 /* Finish up, return sequence. */
6334 ret = get_insns ();
6335 end_sequence ();
6336 return ret;
6337 }
6338
6339 \f
6340 /* Emit the code for a conditional move, return TRUE if we could do the
6341 move. */
6342
6343 int
6344 frv_emit_cond_move (rtx dest, rtx test_rtx, rtx src1, rtx src2)
6345 {
6346 rtx set;
6347 rtx clobber_cc;
6348 rtx test2;
6349 rtx cr_reg;
6350 rtx if_rtx;
6351 enum rtx_code test = GET_CODE (test_rtx);
6352 rtx cc_reg = frv_emit_comparison (test, frv_compare_op0, frv_compare_op1);
6353 enum machine_mode cc_mode = GET_MODE (cc_reg);
6354
6355 /* Conditional move instructions generate:
6356 (parallel [(set <target>
6357 (if_then_else (<test> <cc_reg> (const_int 0))
6358 <src1>
6359 <src2>))
6360 (clobber (<ccr_reg>))]) */
6361
6362 /* Handle various cases of conditional move involving two constants. */
6363 if (GET_CODE (src1) == CONST_INT && GET_CODE (src2) == CONST_INT)
6364 {
6365 HOST_WIDE_INT value1 = INTVAL (src1);
6366 HOST_WIDE_INT value2 = INTVAL (src2);
6367
6368 /* Having 0 as one of the constants can be done by loading the other
6369 constant, and optionally moving in gr0. */
6370 if (value1 == 0 || value2 == 0)
6371 ;
6372
6373 /* If the first value is within an addi range and also the difference
6374 between the two fits in an addi's range, load up the difference, then
6375 conditionally move in 0, and then unconditionally add the first
6376 value. */
6377 else if (IN_RANGE_P (value1, -2048, 2047)
6378 && IN_RANGE_P (value2 - value1, -2048, 2047))
6379 ;
6380
6381 /* If neither condition holds, just force the constant into a
6382 register. */
6383 else
6384 {
6385 src1 = force_reg (GET_MODE (dest), src1);
6386 src2 = force_reg (GET_MODE (dest), src2);
6387 }
6388 }
6389
6390 /* If one value is a register, insure the other value is either 0 or a
6391 register. */
6392 else
6393 {
6394 if (GET_CODE (src1) == CONST_INT && INTVAL (src1) != 0)
6395 src1 = force_reg (GET_MODE (dest), src1);
6396
6397 if (GET_CODE (src2) == CONST_INT && INTVAL (src2) != 0)
6398 src2 = force_reg (GET_MODE (dest), src2);
6399 }
6400
6401 test2 = gen_rtx_fmt_ee (test, cc_mode, cc_reg, const0_rtx);
6402 if_rtx = gen_rtx_IF_THEN_ELSE (GET_MODE (dest), test2, src1, src2);
6403
6404 set = gen_rtx_SET (VOIDmode, dest, if_rtx);
6405
6406 cr_reg = ((TARGET_ALLOC_CC)
6407 ? gen_reg_rtx (CC_CCRmode)
6408 : gen_rtx_REG (CC_CCRmode,
6409 (cc_mode == CC_FPmode) ? FCR_FIRST : ICR_FIRST));
6410
6411 clobber_cc = gen_rtx_CLOBBER (VOIDmode, cr_reg);
6412 emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber_cc)));
6413 return TRUE;
6414 }
6415
6416 \f
6417 /* Split a conditional move into constituent parts, returning a SEQUENCE
6418 containing all of the insns. */
6419
6420 rtx
6421 frv_split_cond_move (rtx operands[])
6422 {
6423 rtx dest = operands[0];
6424 rtx test = operands[1];
6425 rtx cc_reg = operands[2];
6426 rtx src1 = operands[3];
6427 rtx src2 = operands[4];
6428 rtx cr_reg = operands[5];
6429 rtx ret;
6430 enum machine_mode cr_mode = GET_MODE (cr_reg);
6431
6432 start_sequence ();
6433
6434 /* Set the appropriate CCR bit. */
6435 emit_insn (gen_rtx_SET (VOIDmode,
6436 cr_reg,
6437 gen_rtx_fmt_ee (GET_CODE (test),
6438 GET_MODE (cr_reg),
6439 cc_reg,
6440 const0_rtx)));
6441
6442 /* Handle various cases of conditional move involving two constants. */
6443 if (GET_CODE (src1) == CONST_INT && GET_CODE (src2) == CONST_INT)
6444 {
6445 HOST_WIDE_INT value1 = INTVAL (src1);
6446 HOST_WIDE_INT value2 = INTVAL (src2);
6447
6448 /* Having 0 as one of the constants can be done by loading the other
6449 constant, and optionally moving in gr0. */
6450 if (value1 == 0)
6451 {
6452 emit_move_insn (dest, src2);
6453 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
6454 gen_rtx_NE (cr_mode, cr_reg,
6455 const0_rtx),
6456 gen_rtx_SET (VOIDmode, dest, src1)));
6457 }
6458
6459 else if (value2 == 0)
6460 {
6461 emit_move_insn (dest, src1);
6462 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
6463 gen_rtx_EQ (cr_mode, cr_reg,
6464 const0_rtx),
6465 gen_rtx_SET (VOIDmode, dest, src2)));
6466 }
6467
6468 /* If the first value is within an addi range and also the difference
6469 between the two fits in an addi's range, load up the difference, then
6470 conditionally move in 0, and then unconditionally add the first
6471 value. */
6472 else if (IN_RANGE_P (value1, -2048, 2047)
6473 && IN_RANGE_P (value2 - value1, -2048, 2047))
6474 {
6475 rtx dest_si = ((GET_MODE (dest) == SImode)
6476 ? dest
6477 : gen_rtx_SUBREG (SImode, dest, 0));
6478
6479 emit_move_insn (dest_si, GEN_INT (value2 - value1));
6480 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
6481 gen_rtx_NE (cr_mode, cr_reg,
6482 const0_rtx),
6483 gen_rtx_SET (VOIDmode, dest_si,
6484 const0_rtx)));
6485 emit_insn (gen_addsi3 (dest_si, dest_si, src1));
6486 }
6487
6488 else
6489 abort ();
6490 }
6491 else
6492 {
6493 /* Emit the conditional move for the test being true if needed. */
6494 if (! rtx_equal_p (dest, src1))
6495 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
6496 gen_rtx_NE (cr_mode, cr_reg, const0_rtx),
6497 gen_rtx_SET (VOIDmode, dest, src1)));
6498
6499 /* Emit the conditional move for the test being false if needed. */
6500 if (! rtx_equal_p (dest, src2))
6501 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
6502 gen_rtx_EQ (cr_mode, cr_reg, const0_rtx),
6503 gen_rtx_SET (VOIDmode, dest, src2)));
6504 }
6505
6506 /* Finish up, return sequence. */
6507 ret = get_insns ();
6508 end_sequence ();
6509 return ret;
6510 }
6511
6512 \f
6513 /* Split (set DEST SOURCE), where DEST is a double register and SOURCE is a
6514 memory location that is not known to be dword-aligned. */
6515 void
6516 frv_split_double_load (rtx dest, rtx source)
6517 {
6518 int regno = REGNO (dest);
6519 rtx dest1 = gen_highpart (SImode, dest);
6520 rtx dest2 = gen_lowpart (SImode, dest);
6521 rtx address = XEXP (source, 0);
6522
6523 /* If the address is pre-modified, load the lower-numbered register
6524 first, then load the other register using an integer offset from
6525 the modified base register. This order should always be safe,
6526 since the pre-modification cannot affect the same registers as the
6527 load does.
6528
6529 The situation for other loads is more complicated. Loading one
6530 of the registers could affect the value of ADDRESS, so we must
6531 be careful which order we do them in. */
6532 if (GET_CODE (address) == PRE_MODIFY
6533 || ! refers_to_regno_p (regno, regno + 1, address, NULL))
6534 {
6535 /* It is safe to load the lower-numbered register first. */
6536 emit_move_insn (dest1, change_address (source, SImode, NULL));
6537 emit_move_insn (dest2, frv_index_memory (source, SImode, 1));
6538 }
6539 else
6540 {
6541 /* ADDRESS is not pre-modified and the address depends on the
6542 lower-numbered register. Load the higher-numbered register
6543 first. */
6544 emit_move_insn (dest2, frv_index_memory (source, SImode, 1));
6545 emit_move_insn (dest1, change_address (source, SImode, NULL));
6546 }
6547 }
6548
6549 /* Split (set DEST SOURCE), where DEST refers to a dword memory location
6550 and SOURCE is either a double register or the constant zero. */
6551 void
6552 frv_split_double_store (rtx dest, rtx source)
6553 {
6554 rtx dest1 = change_address (dest, SImode, NULL);
6555 rtx dest2 = frv_index_memory (dest, SImode, 1);
6556 if (ZERO_P (source))
6557 {
6558 emit_move_insn (dest1, CONST0_RTX (SImode));
6559 emit_move_insn (dest2, CONST0_RTX (SImode));
6560 }
6561 else
6562 {
6563 emit_move_insn (dest1, gen_highpart (SImode, source));
6564 emit_move_insn (dest2, gen_lowpart (SImode, source));
6565 }
6566 }
6567
6568 \f
6569 /* Split a min/max operation returning a SEQUENCE containing all of the
6570 insns. */
6571
6572 rtx
6573 frv_split_minmax (rtx operands[])
6574 {
6575 rtx dest = operands[0];
6576 rtx minmax = operands[1];
6577 rtx src1 = operands[2];
6578 rtx src2 = operands[3];
6579 rtx cc_reg = operands[4];
6580 rtx cr_reg = operands[5];
6581 rtx ret;
6582 enum rtx_code test_code;
6583 enum machine_mode cr_mode = GET_MODE (cr_reg);
6584
6585 start_sequence ();
6586
6587 /* Figure out which test to use. */
6588 switch (GET_CODE (minmax))
6589 {
6590 default:
6591 abort ();
6592
6593 case SMIN: test_code = LT; break;
6594 case SMAX: test_code = GT; break;
6595 case UMIN: test_code = LTU; break;
6596 case UMAX: test_code = GTU; break;
6597 }
6598
6599 /* Issue the compare instruction. */
6600 emit_insn (gen_rtx_SET (VOIDmode,
6601 cc_reg,
6602 gen_rtx_COMPARE (GET_MODE (cc_reg),
6603 src1, src2)));
6604
6605 /* Set the appropriate CCR bit. */
6606 emit_insn (gen_rtx_SET (VOIDmode,
6607 cr_reg,
6608 gen_rtx_fmt_ee (test_code,
6609 GET_MODE (cr_reg),
6610 cc_reg,
6611 const0_rtx)));
6612
6613 /* If are taking the min/max of a nonzero constant, load that first, and
6614 then do a conditional move of the other value. */
6615 if (GET_CODE (src2) == CONST_INT && INTVAL (src2) != 0)
6616 {
6617 if (rtx_equal_p (dest, src1))
6618 abort ();
6619
6620 emit_move_insn (dest, src2);
6621 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
6622 gen_rtx_NE (cr_mode, cr_reg, const0_rtx),
6623 gen_rtx_SET (VOIDmode, dest, src1)));
6624 }
6625
6626 /* Otherwise, do each half of the move. */
6627 else
6628 {
6629 /* Emit the conditional move for the test being true if needed. */
6630 if (! rtx_equal_p (dest, src1))
6631 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
6632 gen_rtx_NE (cr_mode, cr_reg, const0_rtx),
6633 gen_rtx_SET (VOIDmode, dest, src1)));
6634
6635 /* Emit the conditional move for the test being false if needed. */
6636 if (! rtx_equal_p (dest, src2))
6637 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
6638 gen_rtx_EQ (cr_mode, cr_reg, const0_rtx),
6639 gen_rtx_SET (VOIDmode, dest, src2)));
6640 }
6641
6642 /* Finish up, return sequence. */
6643 ret = get_insns ();
6644 end_sequence ();
6645 return ret;
6646 }
6647
6648 \f
6649 /* Split an integer abs operation returning a SEQUENCE containing all of the
6650 insns. */
6651
6652 rtx
6653 frv_split_abs (rtx operands[])
6654 {
6655 rtx dest = operands[0];
6656 rtx src = operands[1];
6657 rtx cc_reg = operands[2];
6658 rtx cr_reg = operands[3];
6659 rtx ret;
6660
6661 start_sequence ();
6662
6663 /* Issue the compare < 0 instruction. */
6664 emit_insn (gen_rtx_SET (VOIDmode,
6665 cc_reg,
6666 gen_rtx_COMPARE (CCmode, src, const0_rtx)));
6667
6668 /* Set the appropriate CCR bit. */
6669 emit_insn (gen_rtx_SET (VOIDmode,
6670 cr_reg,
6671 gen_rtx_fmt_ee (LT, CC_CCRmode, cc_reg, const0_rtx)));
6672
6673 /* Emit the conditional negate if the value is negative. */
6674 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
6675 gen_rtx_NE (CC_CCRmode, cr_reg, const0_rtx),
6676 gen_negsi2 (dest, src)));
6677
6678 /* Emit the conditional move for the test being false if needed. */
6679 if (! rtx_equal_p (dest, src))
6680 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
6681 gen_rtx_EQ (CC_CCRmode, cr_reg, const0_rtx),
6682 gen_rtx_SET (VOIDmode, dest, src)));
6683
6684 /* Finish up, return sequence. */
6685 ret = get_insns ();
6686 end_sequence ();
6687 return ret;
6688 }
6689
6690 \f
6691 /* An internal function called by for_each_rtx to clear in a hard_reg set each
6692 register used in an insn. */
6693
6694 static int
6695 frv_clear_registers_used (rtx *ptr, void *data)
6696 {
6697 if (GET_CODE (*ptr) == REG)
6698 {
6699 int regno = REGNO (*ptr);
6700 HARD_REG_SET *p_regs = (HARD_REG_SET *)data;
6701
6702 if (regno < FIRST_PSEUDO_REGISTER)
6703 {
6704 int reg_max = regno + HARD_REGNO_NREGS (regno, GET_MODE (*ptr));
6705
6706 while (regno < reg_max)
6707 {
6708 CLEAR_HARD_REG_BIT (*p_regs, regno);
6709 regno++;
6710 }
6711 }
6712 }
6713
6714 return 0;
6715 }
6716
6717 \f
6718 /* Initialize the extra fields provided by IFCVT_EXTRA_FIELDS. */
6719
6720 /* On the FR-V, we don't have any extra fields per se, but it is useful hook to
6721 initialize the static storage. */
6722 void
6723 frv_ifcvt_init_extra_fields (ce_if_block_t *ce_info ATTRIBUTE_UNUSED)
6724 {
6725 frv_ifcvt.added_insns_list = NULL_RTX;
6726 frv_ifcvt.cur_scratch_regs = 0;
6727 frv_ifcvt.num_nested_cond_exec = 0;
6728 frv_ifcvt.cr_reg = NULL_RTX;
6729 frv_ifcvt.nested_cc_reg = NULL_RTX;
6730 frv_ifcvt.extra_int_cr = NULL_RTX;
6731 frv_ifcvt.extra_fp_cr = NULL_RTX;
6732 frv_ifcvt.last_nested_if_cr = NULL_RTX;
6733 }
6734
6735 \f
6736 /* Internal function to add a potential insn to the list of insns to be inserted
6737 if the conditional execution conversion is successful. */
6738
6739 static void
6740 frv_ifcvt_add_insn (rtx pattern, rtx insn, int before_p)
6741 {
6742 rtx link = alloc_EXPR_LIST (VOIDmode, pattern, insn);
6743
6744 link->jump = before_p; /* Mark to add this before or after insn. */
6745 frv_ifcvt.added_insns_list = alloc_EXPR_LIST (VOIDmode, link,
6746 frv_ifcvt.added_insns_list);
6747
6748 if (TARGET_DEBUG_COND_EXEC)
6749 {
6750 fprintf (stderr,
6751 "\n:::::::::: frv_ifcvt_add_insn: add the following %s insn %d:\n",
6752 (before_p) ? "before" : "after",
6753 (int)INSN_UID (insn));
6754
6755 debug_rtx (pattern);
6756 }
6757 }
6758
6759 \f
6760 /* A C expression to modify the code described by the conditional if
6761 information CE_INFO, possibly updating the tests in TRUE_EXPR, and
6762 FALSE_EXPR for converting if-then and if-then-else code to conditional
6763 instructions. Set either TRUE_EXPR or FALSE_EXPR to a null pointer if the
6764 tests cannot be converted. */
6765
6766 void
6767 frv_ifcvt_modify_tests (ce_if_block_t *ce_info, rtx *p_true, rtx *p_false)
6768 {
6769 basic_block test_bb = ce_info->test_bb; /* test basic block */
6770 basic_block then_bb = ce_info->then_bb; /* THEN */
6771 basic_block else_bb = ce_info->else_bb; /* ELSE or NULL */
6772 basic_block join_bb = ce_info->join_bb; /* join block or NULL */
6773 rtx true_expr = *p_true;
6774 rtx cr;
6775 rtx cc;
6776 rtx nested_cc;
6777 enum machine_mode mode = GET_MODE (true_expr);
6778 int j;
6779 basic_block *bb;
6780 int num_bb;
6781 frv_tmp_reg_t *tmp_reg = &frv_ifcvt.tmp_reg;
6782 rtx check_insn;
6783 rtx sub_cond_exec_reg;
6784 enum rtx_code code;
6785 enum rtx_code code_true;
6786 enum rtx_code code_false;
6787 enum reg_class cc_class;
6788 enum reg_class cr_class;
6789 int cc_first;
6790 int cc_last;
6791 reg_set_iterator rsi;
6792
6793 /* Make sure we are only dealing with hard registers. Also honor the
6794 -mno-cond-exec switch, and -mno-nested-cond-exec switches if
6795 applicable. */
6796 if (!reload_completed || TARGET_NO_COND_EXEC
6797 || (TARGET_NO_NESTED_CE && ce_info->pass > 1))
6798 goto fail;
6799
6800 /* Figure out which registers we can allocate for our own purposes. Only
6801 consider registers that are not preserved across function calls and are
6802 not fixed. However, allow the ICC/ICR temporary registers to be allocated
6803 if we did not need to use them in reloading other registers. */
6804 memset (&tmp_reg->regs, 0, sizeof (tmp_reg->regs));
6805 COPY_HARD_REG_SET (tmp_reg->regs, call_used_reg_set);
6806 AND_COMPL_HARD_REG_SET (tmp_reg->regs, fixed_reg_set);
6807 SET_HARD_REG_BIT (tmp_reg->regs, ICC_TEMP);
6808 SET_HARD_REG_BIT (tmp_reg->regs, ICR_TEMP);
6809
6810 /* If this is a nested IF, we need to discover whether the CC registers that
6811 are set/used inside of the block are used anywhere else. If not, we can
6812 change them to be the CC register that is paired with the CR register that
6813 controls the outermost IF block. */
6814 if (ce_info->pass > 1)
6815 {
6816 CLEAR_HARD_REG_SET (frv_ifcvt.nested_cc_ok_rewrite);
6817 for (j = CC_FIRST; j <= CC_LAST; j++)
6818 if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
6819 {
6820 if (REGNO_REG_SET_P (then_bb->global_live_at_start, j))
6821 continue;
6822
6823 if (else_bb && REGNO_REG_SET_P (else_bb->global_live_at_start, j))
6824 continue;
6825
6826 if (join_bb && REGNO_REG_SET_P (join_bb->global_live_at_start, j))
6827 continue;
6828
6829 SET_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite, j);
6830 }
6831 }
6832
6833 for (j = 0; j < frv_ifcvt.cur_scratch_regs; j++)
6834 frv_ifcvt.scratch_regs[j] = NULL_RTX;
6835
6836 frv_ifcvt.added_insns_list = NULL_RTX;
6837 frv_ifcvt.cur_scratch_regs = 0;
6838
6839 bb = (basic_block *) alloca ((2 + ce_info->num_multiple_test_blocks)
6840 * sizeof (basic_block));
6841
6842 if (join_bb)
6843 {
6844 int regno;
6845
6846 /* Remove anything live at the beginning of the join block from being
6847 available for allocation. */
6848 EXECUTE_IF_SET_IN_REG_SET (join_bb->global_live_at_start, 0, regno, rsi)
6849 {
6850 if (regno < FIRST_PSEUDO_REGISTER)
6851 CLEAR_HARD_REG_BIT (tmp_reg->regs, regno);
6852 }
6853 }
6854
6855 /* Add in all of the blocks in multiple &&/|| blocks to be scanned. */
6856 num_bb = 0;
6857 if (ce_info->num_multiple_test_blocks)
6858 {
6859 basic_block multiple_test_bb = ce_info->last_test_bb;
6860
6861 while (multiple_test_bb != test_bb)
6862 {
6863 bb[num_bb++] = multiple_test_bb;
6864 multiple_test_bb = EDGE_PRED (multiple_test_bb, 0)->src;
6865 }
6866 }
6867
6868 /* Add in the THEN and ELSE blocks to be scanned. */
6869 bb[num_bb++] = then_bb;
6870 if (else_bb)
6871 bb[num_bb++] = else_bb;
6872
6873 sub_cond_exec_reg = NULL_RTX;
6874 frv_ifcvt.num_nested_cond_exec = 0;
6875
6876 /* Scan all of the blocks for registers that must not be allocated. */
6877 for (j = 0; j < num_bb; j++)
6878 {
6879 rtx last_insn = BB_END (bb[j]);
6880 rtx insn = BB_HEAD (bb[j]);
6881 int regno;
6882
6883 if (dump_file)
6884 fprintf (dump_file, "Scanning %s block %d, start %d, end %d\n",
6885 (bb[j] == else_bb) ? "else" : ((bb[j] == then_bb) ? "then" : "test"),
6886 (int) bb[j]->index,
6887 (int) INSN_UID (BB_HEAD (bb[j])),
6888 (int) INSN_UID (BB_END (bb[j])));
6889
6890 /* Anything live at the beginning of the block is obviously unavailable
6891 for allocation. */
6892 EXECUTE_IF_SET_IN_REG_SET (bb[j]->global_live_at_start, 0, regno, rsi)
6893 {
6894 if (regno < FIRST_PSEUDO_REGISTER)
6895 CLEAR_HARD_REG_BIT (tmp_reg->regs, regno);
6896 }
6897
6898 /* Loop through the insns in the block. */
6899 for (;;)
6900 {
6901 /* Mark any new registers that are created as being unavailable for
6902 allocation. Also see if the CC register used in nested IFs can be
6903 reallocated. */
6904 if (INSN_P (insn))
6905 {
6906 rtx pattern;
6907 rtx set;
6908 int skip_nested_if = FALSE;
6909
6910 for_each_rtx (&PATTERN (insn), frv_clear_registers_used,
6911 (void *)&tmp_reg->regs);
6912
6913 pattern = PATTERN (insn);
6914 if (GET_CODE (pattern) == COND_EXEC)
6915 {
6916 rtx reg = XEXP (COND_EXEC_TEST (pattern), 0);
6917
6918 if (reg != sub_cond_exec_reg)
6919 {
6920 sub_cond_exec_reg = reg;
6921 frv_ifcvt.num_nested_cond_exec++;
6922 }
6923 }
6924
6925 set = single_set_pattern (pattern);
6926 if (set)
6927 {
6928 rtx dest = SET_DEST (set);
6929 rtx src = SET_SRC (set);
6930
6931 if (GET_CODE (dest) == REG)
6932 {
6933 int regno = REGNO (dest);
6934 enum rtx_code src_code = GET_CODE (src);
6935
6936 if (CC_P (regno) && src_code == COMPARE)
6937 skip_nested_if = TRUE;
6938
6939 else if (CR_P (regno)
6940 && (src_code == IF_THEN_ELSE
6941 || COMPARISON_P (src)))
6942 skip_nested_if = TRUE;
6943 }
6944 }
6945
6946 if (! skip_nested_if)
6947 for_each_rtx (&PATTERN (insn), frv_clear_registers_used,
6948 (void *)&frv_ifcvt.nested_cc_ok_rewrite);
6949 }
6950
6951 if (insn == last_insn)
6952 break;
6953
6954 insn = NEXT_INSN (insn);
6955 }
6956 }
6957
6958 /* If this is a nested if, rewrite the CC registers that are available to
6959 include the ones that can be rewritten, to increase the chance of being
6960 able to allocate a paired CC/CR register combination. */
6961 if (ce_info->pass > 1)
6962 {
6963 for (j = CC_FIRST; j <= CC_LAST; j++)
6964 if (TEST_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite, j))
6965 SET_HARD_REG_BIT (tmp_reg->regs, j);
6966 else
6967 CLEAR_HARD_REG_BIT (tmp_reg->regs, j);
6968 }
6969
6970 if (dump_file)
6971 {
6972 int num_gprs = 0;
6973 fprintf (dump_file, "Available GPRs: ");
6974
6975 for (j = GPR_FIRST; j <= GPR_LAST; j++)
6976 if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
6977 {
6978 fprintf (dump_file, " %d [%s]", j, reg_names[j]);
6979 if (++num_gprs > GPR_TEMP_NUM+2)
6980 break;
6981 }
6982
6983 fprintf (dump_file, "%s\nAvailable CRs: ",
6984 (num_gprs > GPR_TEMP_NUM+2) ? " ..." : "");
6985
6986 for (j = CR_FIRST; j <= CR_LAST; j++)
6987 if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
6988 fprintf (dump_file, " %d [%s]", j, reg_names[j]);
6989
6990 fputs ("\n", dump_file);
6991
6992 if (ce_info->pass > 1)
6993 {
6994 fprintf (dump_file, "Modifiable CCs: ");
6995 for (j = CC_FIRST; j <= CC_LAST; j++)
6996 if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
6997 fprintf (dump_file, " %d [%s]", j, reg_names[j]);
6998
6999 fprintf (dump_file, "\n%d nested COND_EXEC statements\n",
7000 frv_ifcvt.num_nested_cond_exec);
7001 }
7002 }
7003
7004 /* Allocate the appropriate temporary condition code register. Try to
7005 allocate the ICR/FCR register that corresponds to the ICC/FCC register so
7006 that conditional cmp's can be done. */
7007 if (mode == CCmode || mode == CC_UNSmode || mode == CC_NZmode)
7008 {
7009 cr_class = ICR_REGS;
7010 cc_class = ICC_REGS;
7011 cc_first = ICC_FIRST;
7012 cc_last = ICC_LAST;
7013 }
7014 else if (mode == CC_FPmode)
7015 {
7016 cr_class = FCR_REGS;
7017 cc_class = FCC_REGS;
7018 cc_first = FCC_FIRST;
7019 cc_last = FCC_LAST;
7020 }
7021 else
7022 {
7023 cc_first = cc_last = 0;
7024 cr_class = cc_class = NO_REGS;
7025 }
7026
7027 cc = XEXP (true_expr, 0);
7028 nested_cc = cr = NULL_RTX;
7029 if (cc_class != NO_REGS)
7030 {
7031 /* For nested IFs and &&/||, see if we can find a CC and CR register pair
7032 so we can execute a csubcc/caddcc/cfcmps instruction. */
7033 int cc_regno;
7034
7035 for (cc_regno = cc_first; cc_regno <= cc_last; cc_regno++)
7036 {
7037 int cr_regno = cc_regno - CC_FIRST + CR_FIRST;
7038
7039 if (TEST_HARD_REG_BIT (frv_ifcvt.tmp_reg.regs, cc_regno)
7040 && TEST_HARD_REG_BIT (frv_ifcvt.tmp_reg.regs, cr_regno))
7041 {
7042 frv_ifcvt.tmp_reg.next_reg[ (int)cr_class ] = cr_regno;
7043 cr = frv_alloc_temp_reg (tmp_reg, cr_class, CC_CCRmode, TRUE,
7044 TRUE);
7045
7046 frv_ifcvt.tmp_reg.next_reg[ (int)cc_class ] = cc_regno;
7047 nested_cc = frv_alloc_temp_reg (tmp_reg, cc_class, CCmode,
7048 TRUE, TRUE);
7049 break;
7050 }
7051 }
7052 }
7053
7054 if (! cr)
7055 {
7056 if (dump_file)
7057 fprintf (dump_file, "Could not allocate a CR temporary register\n");
7058
7059 goto fail;
7060 }
7061
7062 if (dump_file)
7063 fprintf (dump_file,
7064 "Will use %s for conditional execution, %s for nested comparisons\n",
7065 reg_names[ REGNO (cr)],
7066 (nested_cc) ? reg_names[ REGNO (nested_cc) ] : "<none>");
7067
7068 /* Set the CCR bit. Note for integer tests, we reverse the condition so that
7069 in an IF-THEN-ELSE sequence, we are testing the TRUE case against the CCR
7070 bit being true. We don't do this for floating point, because of NaNs. */
7071 code = GET_CODE (true_expr);
7072 if (GET_MODE (cc) != CC_FPmode)
7073 {
7074 code = reverse_condition (code);
7075 code_true = EQ;
7076 code_false = NE;
7077 }
7078 else
7079 {
7080 code_true = NE;
7081 code_false = EQ;
7082 }
7083
7084 check_insn = gen_rtx_SET (VOIDmode, cr,
7085 gen_rtx_fmt_ee (code, CC_CCRmode, cc, const0_rtx));
7086
7087 /* Record the check insn to be inserted later. */
7088 frv_ifcvt_add_insn (check_insn, BB_END (test_bb), TRUE);
7089
7090 /* Update the tests. */
7091 frv_ifcvt.cr_reg = cr;
7092 frv_ifcvt.nested_cc_reg = nested_cc;
7093 *p_true = gen_rtx_fmt_ee (code_true, CC_CCRmode, cr, const0_rtx);
7094 *p_false = gen_rtx_fmt_ee (code_false, CC_CCRmode, cr, const0_rtx);
7095 return;
7096
7097 /* Fail, don't do this conditional execution. */
7098 fail:
7099 *p_true = NULL_RTX;
7100 *p_false = NULL_RTX;
7101 if (dump_file)
7102 fprintf (dump_file, "Disabling this conditional execution.\n");
7103
7104 return;
7105 }
7106
7107 \f
7108 /* A C expression to modify the code described by the conditional if
7109 information CE_INFO, for the basic block BB, possibly updating the tests in
7110 TRUE_EXPR, and FALSE_EXPR for converting the && and || parts of if-then or
7111 if-then-else code to conditional instructions. Set either TRUE_EXPR or
7112 FALSE_EXPR to a null pointer if the tests cannot be converted. */
7113
7114 /* p_true and p_false are given expressions of the form:
7115
7116 (and (eq:CC_CCR (reg:CC_CCR)
7117 (const_int 0))
7118 (eq:CC (reg:CC)
7119 (const_int 0))) */
7120
7121 void
7122 frv_ifcvt_modify_multiple_tests (ce_if_block_t *ce_info,
7123 basic_block bb,
7124 rtx *p_true,
7125 rtx *p_false)
7126 {
7127 rtx old_true = XEXP (*p_true, 0);
7128 rtx old_false = XEXP (*p_false, 0);
7129 rtx true_expr = XEXP (*p_true, 1);
7130 rtx false_expr = XEXP (*p_false, 1);
7131 rtx test_expr;
7132 rtx old_test;
7133 rtx cr = XEXP (old_true, 0);
7134 rtx check_insn;
7135 rtx new_cr = NULL_RTX;
7136 rtx *p_new_cr = (rtx *)0;
7137 rtx if_else;
7138 rtx compare;
7139 rtx cc;
7140 enum reg_class cr_class;
7141 enum machine_mode mode = GET_MODE (true_expr);
7142 rtx (*logical_func)(rtx, rtx, rtx);
7143
7144 if (TARGET_DEBUG_COND_EXEC)
7145 {
7146 fprintf (stderr,
7147 "\n:::::::::: frv_ifcvt_modify_multiple_tests, before modification for %s\ntrue insn:\n",
7148 ce_info->and_and_p ? "&&" : "||");
7149
7150 debug_rtx (*p_true);
7151
7152 fputs ("\nfalse insn:\n", stderr);
7153 debug_rtx (*p_false);
7154 }
7155
7156 if (TARGET_NO_MULTI_CE)
7157 goto fail;
7158
7159 if (GET_CODE (cr) != REG)
7160 goto fail;
7161
7162 if (mode == CCmode || mode == CC_UNSmode || mode == CC_NZmode)
7163 {
7164 cr_class = ICR_REGS;
7165 p_new_cr = &frv_ifcvt.extra_int_cr;
7166 }
7167 else if (mode == CC_FPmode)
7168 {
7169 cr_class = FCR_REGS;
7170 p_new_cr = &frv_ifcvt.extra_fp_cr;
7171 }
7172 else
7173 goto fail;
7174
7175 /* Allocate a temp CR, reusing a previously allocated temp CR if we have 3 or
7176 more &&/|| tests. */
7177 new_cr = *p_new_cr;
7178 if (! new_cr)
7179 {
7180 new_cr = *p_new_cr = frv_alloc_temp_reg (&frv_ifcvt.tmp_reg, cr_class,
7181 CC_CCRmode, TRUE, TRUE);
7182 if (! new_cr)
7183 goto fail;
7184 }
7185
7186 if (ce_info->and_and_p)
7187 {
7188 old_test = old_false;
7189 test_expr = true_expr;
7190 logical_func = (GET_CODE (old_true) == EQ) ? gen_andcr : gen_andncr;
7191 *p_true = gen_rtx_NE (CC_CCRmode, cr, const0_rtx);
7192 *p_false = gen_rtx_EQ (CC_CCRmode, cr, const0_rtx);
7193 }
7194 else
7195 {
7196 old_test = old_false;
7197 test_expr = false_expr;
7198 logical_func = (GET_CODE (old_false) == EQ) ? gen_orcr : gen_orncr;
7199 *p_true = gen_rtx_EQ (CC_CCRmode, cr, const0_rtx);
7200 *p_false = gen_rtx_NE (CC_CCRmode, cr, const0_rtx);
7201 }
7202
7203 /* First add the andcr/andncr/orcr/orncr, which will be added after the
7204 conditional check instruction, due to frv_ifcvt_add_insn being a LIFO
7205 stack. */
7206 frv_ifcvt_add_insn ((*logical_func) (cr, cr, new_cr), BB_END (bb), TRUE);
7207
7208 /* Now add the conditional check insn. */
7209 cc = XEXP (test_expr, 0);
7210 compare = gen_rtx_fmt_ee (GET_CODE (test_expr), CC_CCRmode, cc, const0_rtx);
7211 if_else = gen_rtx_IF_THEN_ELSE (CC_CCRmode, old_test, compare, const0_rtx);
7212
7213 check_insn = gen_rtx_SET (VOIDmode, new_cr, if_else);
7214
7215 /* Add the new check insn to the list of check insns that need to be
7216 inserted. */
7217 frv_ifcvt_add_insn (check_insn, BB_END (bb), TRUE);
7218
7219 if (TARGET_DEBUG_COND_EXEC)
7220 {
7221 fputs ("\n:::::::::: frv_ifcvt_modify_multiple_tests, after modification\ntrue insn:\n",
7222 stderr);
7223
7224 debug_rtx (*p_true);
7225
7226 fputs ("\nfalse insn:\n", stderr);
7227 debug_rtx (*p_false);
7228 }
7229
7230 return;
7231
7232 fail:
7233 *p_true = *p_false = NULL_RTX;
7234
7235 /* If we allocated a CR register, release it. */
7236 if (new_cr)
7237 {
7238 CLEAR_HARD_REG_BIT (frv_ifcvt.tmp_reg.regs, REGNO (new_cr));
7239 *p_new_cr = NULL_RTX;
7240 }
7241
7242 if (TARGET_DEBUG_COND_EXEC)
7243 fputs ("\n:::::::::: frv_ifcvt_modify_multiple_tests, failed.\n", stderr);
7244
7245 return;
7246 }
7247
7248 \f
7249 /* Return a register which will be loaded with a value if an IF block is
7250 converted to conditional execution. This is used to rewrite instructions
7251 that use constants to ones that just use registers. */
7252
7253 static rtx
7254 frv_ifcvt_load_value (rtx value, rtx insn ATTRIBUTE_UNUSED)
7255 {
7256 int num_alloc = frv_ifcvt.cur_scratch_regs;
7257 int i;
7258 rtx reg;
7259
7260 /* We know gr0 == 0, so replace any errant uses. */
7261 if (value == const0_rtx)
7262 return gen_rtx_REG (SImode, GPR_FIRST);
7263
7264 /* First search all registers currently loaded to see if we have an
7265 applicable constant. */
7266 if (CONSTANT_P (value)
7267 || (GET_CODE (value) == REG && REGNO (value) == LR_REGNO))
7268 {
7269 for (i = 0; i < num_alloc; i++)
7270 {
7271 if (rtx_equal_p (SET_SRC (frv_ifcvt.scratch_regs[i]), value))
7272 return SET_DEST (frv_ifcvt.scratch_regs[i]);
7273 }
7274 }
7275
7276 /* Have we exhausted the number of registers available? */
7277 if (num_alloc >= GPR_TEMP_NUM)
7278 {
7279 if (dump_file)
7280 fprintf (dump_file, "Too many temporary registers allocated\n");
7281
7282 return NULL_RTX;
7283 }
7284
7285 /* Allocate the new register. */
7286 reg = frv_alloc_temp_reg (&frv_ifcvt.tmp_reg, GPR_REGS, SImode, TRUE, TRUE);
7287 if (! reg)
7288 {
7289 if (dump_file)
7290 fputs ("Could not find a scratch register\n", dump_file);
7291
7292 return NULL_RTX;
7293 }
7294
7295 frv_ifcvt.cur_scratch_regs++;
7296 frv_ifcvt.scratch_regs[num_alloc] = gen_rtx_SET (VOIDmode, reg, value);
7297
7298 if (dump_file)
7299 {
7300 if (GET_CODE (value) == CONST_INT)
7301 fprintf (dump_file, "Register %s will hold %ld\n",
7302 reg_names[ REGNO (reg)], (long)INTVAL (value));
7303
7304 else if (GET_CODE (value) == REG && REGNO (value) == LR_REGNO)
7305 fprintf (dump_file, "Register %s will hold LR\n",
7306 reg_names[ REGNO (reg)]);
7307
7308 else
7309 fprintf (dump_file, "Register %s will hold a saved value\n",
7310 reg_names[ REGNO (reg)]);
7311 }
7312
7313 return reg;
7314 }
7315
7316 \f
7317 /* Update a MEM used in conditional code that might contain an offset to put
7318 the offset into a scratch register, so that the conditional load/store
7319 operations can be used. This function returns the original pointer if the
7320 MEM is valid to use in conditional code, NULL if we can't load up the offset
7321 into a temporary register, or the new MEM if we were successful. */
7322
7323 static rtx
7324 frv_ifcvt_rewrite_mem (rtx mem, enum machine_mode mode, rtx insn)
7325 {
7326 rtx addr = XEXP (mem, 0);
7327
7328 if (!frv_legitimate_address_p (mode, addr, reload_completed, TRUE, FALSE))
7329 {
7330 if (GET_CODE (addr) == PLUS)
7331 {
7332 rtx addr_op0 = XEXP (addr, 0);
7333 rtx addr_op1 = XEXP (addr, 1);
7334
7335 if (GET_CODE (addr_op0) == REG && CONSTANT_P (addr_op1))
7336 {
7337 rtx reg = frv_ifcvt_load_value (addr_op1, insn);
7338 if (!reg)
7339 return NULL_RTX;
7340
7341 addr = gen_rtx_PLUS (Pmode, addr_op0, reg);
7342 }
7343
7344 else
7345 return NULL_RTX;
7346 }
7347
7348 else if (CONSTANT_P (addr))
7349 addr = frv_ifcvt_load_value (addr, insn);
7350
7351 else
7352 return NULL_RTX;
7353
7354 if (addr == NULL_RTX)
7355 return NULL_RTX;
7356
7357 else if (XEXP (mem, 0) != addr)
7358 return change_address (mem, mode, addr);
7359 }
7360
7361 return mem;
7362 }
7363
7364 \f
7365 /* Given a PATTERN, return a SET expression if this PATTERN has only a single
7366 SET, possibly conditionally executed. It may also have CLOBBERs, USEs. */
7367
7368 static rtx
7369 single_set_pattern (rtx pattern)
7370 {
7371 rtx set;
7372 int i;
7373
7374 if (GET_CODE (pattern) == COND_EXEC)
7375 pattern = COND_EXEC_CODE (pattern);
7376
7377 if (GET_CODE (pattern) == SET)
7378 return pattern;
7379
7380 else if (GET_CODE (pattern) == PARALLEL)
7381 {
7382 for (i = 0, set = 0; i < XVECLEN (pattern, 0); i++)
7383 {
7384 rtx sub = XVECEXP (pattern, 0, i);
7385
7386 switch (GET_CODE (sub))
7387 {
7388 case USE:
7389 case CLOBBER:
7390 break;
7391
7392 case SET:
7393 if (set)
7394 return 0;
7395 else
7396 set = sub;
7397 break;
7398
7399 default:
7400 return 0;
7401 }
7402 }
7403 return set;
7404 }
7405
7406 return 0;
7407 }
7408
7409 \f
7410 /* A C expression to modify the code described by the conditional if
7411 information CE_INFO with the new PATTERN in INSN. If PATTERN is a null
7412 pointer after the IFCVT_MODIFY_INSN macro executes, it is assumed that that
7413 insn cannot be converted to be executed conditionally. */
7414
7415 rtx
7416 frv_ifcvt_modify_insn (ce_if_block_t *ce_info,
7417 rtx pattern,
7418 rtx insn)
7419 {
7420 rtx orig_ce_pattern = pattern;
7421 rtx set;
7422 rtx op0;
7423 rtx op1;
7424 rtx test;
7425
7426 if (GET_CODE (pattern) != COND_EXEC)
7427 abort ();
7428
7429 test = COND_EXEC_TEST (pattern);
7430 if (GET_CODE (test) == AND)
7431 {
7432 rtx cr = frv_ifcvt.cr_reg;
7433 rtx test_reg;
7434
7435 op0 = XEXP (test, 0);
7436 if (! rtx_equal_p (cr, XEXP (op0, 0)))
7437 goto fail;
7438
7439 op1 = XEXP (test, 1);
7440 test_reg = XEXP (op1, 0);
7441 if (GET_CODE (test_reg) != REG)
7442 goto fail;
7443
7444 /* Is this the first nested if block in this sequence? If so, generate
7445 an andcr or andncr. */
7446 if (! frv_ifcvt.last_nested_if_cr)
7447 {
7448 rtx and_op;
7449
7450 frv_ifcvt.last_nested_if_cr = test_reg;
7451 if (GET_CODE (op0) == NE)
7452 and_op = gen_andcr (test_reg, cr, test_reg);
7453 else
7454 and_op = gen_andncr (test_reg, cr, test_reg);
7455
7456 frv_ifcvt_add_insn (and_op, insn, TRUE);
7457 }
7458
7459 /* If this isn't the first statement in the nested if sequence, see if we
7460 are dealing with the same register. */
7461 else if (! rtx_equal_p (test_reg, frv_ifcvt.last_nested_if_cr))
7462 goto fail;
7463
7464 COND_EXEC_TEST (pattern) = test = op1;
7465 }
7466
7467 /* If this isn't a nested if, reset state variables. */
7468 else
7469 {
7470 frv_ifcvt.last_nested_if_cr = NULL_RTX;
7471 }
7472
7473 set = single_set_pattern (pattern);
7474 if (set)
7475 {
7476 rtx dest = SET_DEST (set);
7477 rtx src = SET_SRC (set);
7478 enum machine_mode mode = GET_MODE (dest);
7479
7480 /* Check for normal binary operators. */
7481 if (mode == SImode && ARITHMETIC_P (src))
7482 {
7483 op0 = XEXP (src, 0);
7484 op1 = XEXP (src, 1);
7485
7486 if (integer_register_operand (op0, SImode) && CONSTANT_P (op1))
7487 {
7488 op1 = frv_ifcvt_load_value (op1, insn);
7489 if (op1)
7490 COND_EXEC_CODE (pattern)
7491 = gen_rtx_SET (VOIDmode, dest, gen_rtx_fmt_ee (GET_CODE (src),
7492 GET_MODE (src),
7493 op0, op1));
7494 else
7495 goto fail;
7496 }
7497 }
7498
7499 /* For multiply by a constant, we need to handle the sign extending
7500 correctly. Add a USE of the value after the multiply to prevent flow
7501 from cratering because only one register out of the two were used. */
7502 else if (mode == DImode && GET_CODE (src) == MULT)
7503 {
7504 op0 = XEXP (src, 0);
7505 op1 = XEXP (src, 1);
7506 if (GET_CODE (op0) == SIGN_EXTEND && GET_CODE (op1) == CONST_INT)
7507 {
7508 op1 = frv_ifcvt_load_value (op1, insn);
7509 if (op1)
7510 {
7511 op1 = gen_rtx_SIGN_EXTEND (DImode, op1);
7512 COND_EXEC_CODE (pattern)
7513 = gen_rtx_SET (VOIDmode, dest,
7514 gen_rtx_MULT (DImode, op0, op1));
7515 }
7516 else
7517 goto fail;
7518 }
7519
7520 frv_ifcvt_add_insn (gen_rtx_USE (VOIDmode, dest), insn, FALSE);
7521 }
7522
7523 /* If we are just loading a constant created for a nested conditional
7524 execution statement, just load the constant without any conditional
7525 execution, since we know that the constant will not interfere with any
7526 other registers. */
7527 else if (frv_ifcvt.scratch_insns_bitmap
7528 && bitmap_bit_p (frv_ifcvt.scratch_insns_bitmap,
7529 INSN_UID (insn))
7530 && REG_P (SET_DEST (set))
7531 /* We must not unconditionally set a scratch reg chosen
7532 for a nested if-converted block if its incoming
7533 value from the TEST block (or the result of the THEN
7534 branch) could/should propagate to the JOIN block.
7535 It suffices to test whether the register is live at
7536 the JOIN point: if it's live there, we can infer
7537 that we set it in the former JOIN block of the
7538 nested if-converted block (otherwise it wouldn't
7539 have been available as a scratch register), and it
7540 is either propagated through or set in the other
7541 conditional block. It's probably not worth trying
7542 to catch the latter case, and it could actually
7543 limit scheduling of the combined block quite
7544 severely. */
7545 && ce_info->join_bb
7546 && ! (REGNO_REG_SET_P
7547 (ce_info->join_bb->global_live_at_start,
7548 REGNO (SET_DEST (set))))
7549 /* Similarly, we must not unconditionally set a reg
7550 used as scratch in the THEN branch if the same reg
7551 is live in the ELSE branch. */
7552 && (! ce_info->else_bb
7553 || BLOCK_FOR_INSN (insn) == ce_info->else_bb
7554 || ! (REGNO_REG_SET_P
7555 (ce_info->else_bb->global_live_at_start,
7556 REGNO (SET_DEST (set))))))
7557 pattern = set;
7558
7559 else if (mode == QImode || mode == HImode || mode == SImode
7560 || mode == SFmode)
7561 {
7562 int changed_p = FALSE;
7563
7564 /* Check for just loading up a constant */
7565 if (CONSTANT_P (src) && integer_register_operand (dest, mode))
7566 {
7567 src = frv_ifcvt_load_value (src, insn);
7568 if (!src)
7569 goto fail;
7570
7571 changed_p = TRUE;
7572 }
7573
7574 /* See if we need to fix up stores */
7575 if (GET_CODE (dest) == MEM)
7576 {
7577 rtx new_mem = frv_ifcvt_rewrite_mem (dest, mode, insn);
7578
7579 if (!new_mem)
7580 goto fail;
7581
7582 else if (new_mem != dest)
7583 {
7584 changed_p = TRUE;
7585 dest = new_mem;
7586 }
7587 }
7588
7589 /* See if we need to fix up loads */
7590 if (GET_CODE (src) == MEM)
7591 {
7592 rtx new_mem = frv_ifcvt_rewrite_mem (src, mode, insn);
7593
7594 if (!new_mem)
7595 goto fail;
7596
7597 else if (new_mem != src)
7598 {
7599 changed_p = TRUE;
7600 src = new_mem;
7601 }
7602 }
7603
7604 /* If either src or destination changed, redo SET. */
7605 if (changed_p)
7606 COND_EXEC_CODE (pattern) = gen_rtx_SET (VOIDmode, dest, src);
7607 }
7608
7609 /* Rewrite a nested set cccr in terms of IF_THEN_ELSE. Also deal with
7610 rewriting the CC register to be the same as the paired CC/CR register
7611 for nested ifs. */
7612 else if (mode == CC_CCRmode && COMPARISON_P (src))
7613 {
7614 int regno = REGNO (XEXP (src, 0));
7615 rtx if_else;
7616
7617 if (ce_info->pass > 1
7618 && regno != (int)REGNO (frv_ifcvt.nested_cc_reg)
7619 && TEST_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite, regno))
7620 {
7621 src = gen_rtx_fmt_ee (GET_CODE (src),
7622 CC_CCRmode,
7623 frv_ifcvt.nested_cc_reg,
7624 XEXP (src, 1));
7625 }
7626
7627 if_else = gen_rtx_IF_THEN_ELSE (CC_CCRmode, test, src, const0_rtx);
7628 pattern = gen_rtx_SET (VOIDmode, dest, if_else);
7629 }
7630
7631 /* Remap a nested compare instruction to use the paired CC/CR reg. */
7632 else if (ce_info->pass > 1
7633 && GET_CODE (dest) == REG
7634 && CC_P (REGNO (dest))
7635 && REGNO (dest) != REGNO (frv_ifcvt.nested_cc_reg)
7636 && TEST_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite,
7637 REGNO (dest))
7638 && GET_CODE (src) == COMPARE)
7639 {
7640 PUT_MODE (frv_ifcvt.nested_cc_reg, GET_MODE (dest));
7641 COND_EXEC_CODE (pattern)
7642 = gen_rtx_SET (VOIDmode, frv_ifcvt.nested_cc_reg, copy_rtx (src));
7643 }
7644 }
7645
7646 if (TARGET_DEBUG_COND_EXEC)
7647 {
7648 rtx orig_pattern = PATTERN (insn);
7649
7650 PATTERN (insn) = pattern;
7651 fprintf (stderr,
7652 "\n:::::::::: frv_ifcvt_modify_insn: pass = %d, insn after modification:\n",
7653 ce_info->pass);
7654
7655 debug_rtx (insn);
7656 PATTERN (insn) = orig_pattern;
7657 }
7658
7659 return pattern;
7660
7661 fail:
7662 if (TARGET_DEBUG_COND_EXEC)
7663 {
7664 rtx orig_pattern = PATTERN (insn);
7665
7666 PATTERN (insn) = orig_ce_pattern;
7667 fprintf (stderr,
7668 "\n:::::::::: frv_ifcvt_modify_insn: pass = %d, insn could not be modified:\n",
7669 ce_info->pass);
7670
7671 debug_rtx (insn);
7672 PATTERN (insn) = orig_pattern;
7673 }
7674
7675 return NULL_RTX;
7676 }
7677
7678 \f
7679 /* A C expression to perform any final machine dependent modifications in
7680 converting code to conditional execution in the code described by the
7681 conditional if information CE_INFO. */
7682
7683 void
7684 frv_ifcvt_modify_final (ce_if_block_t *ce_info ATTRIBUTE_UNUSED)
7685 {
7686 rtx existing_insn;
7687 rtx check_insn;
7688 rtx p = frv_ifcvt.added_insns_list;
7689 int i;
7690
7691 /* Loop inserting the check insns. The last check insn is the first test,
7692 and is the appropriate place to insert constants. */
7693 if (! p)
7694 abort ();
7695
7696 do
7697 {
7698 rtx check_and_insert_insns = XEXP (p, 0);
7699 rtx old_p = p;
7700
7701 check_insn = XEXP (check_and_insert_insns, 0);
7702 existing_insn = XEXP (check_and_insert_insns, 1);
7703 p = XEXP (p, 1);
7704
7705 /* The jump bit is used to say that the new insn is to be inserted BEFORE
7706 the existing insn, otherwise it is to be inserted AFTER. */
7707 if (check_and_insert_insns->jump)
7708 {
7709 emit_insn_before (check_insn, existing_insn);
7710 check_and_insert_insns->jump = 0;
7711 }
7712 else
7713 emit_insn_after (check_insn, existing_insn);
7714
7715 free_EXPR_LIST_node (check_and_insert_insns);
7716 free_EXPR_LIST_node (old_p);
7717 }
7718 while (p != NULL_RTX);
7719
7720 /* Load up any constants needed into temp gprs */
7721 for (i = 0; i < frv_ifcvt.cur_scratch_regs; i++)
7722 {
7723 rtx insn = emit_insn_before (frv_ifcvt.scratch_regs[i], existing_insn);
7724 if (! frv_ifcvt.scratch_insns_bitmap)
7725 frv_ifcvt.scratch_insns_bitmap = BITMAP_ALLOC (NULL);
7726 bitmap_set_bit (frv_ifcvt.scratch_insns_bitmap, INSN_UID (insn));
7727 frv_ifcvt.scratch_regs[i] = NULL_RTX;
7728 }
7729
7730 frv_ifcvt.added_insns_list = NULL_RTX;
7731 frv_ifcvt.cur_scratch_regs = 0;
7732 }
7733
7734 \f
7735 /* A C expression to cancel any machine dependent modifications in converting
7736 code to conditional execution in the code described by the conditional if
7737 information CE_INFO. */
7738
7739 void
7740 frv_ifcvt_modify_cancel (ce_if_block_t *ce_info ATTRIBUTE_UNUSED)
7741 {
7742 int i;
7743 rtx p = frv_ifcvt.added_insns_list;
7744
7745 /* Loop freeing up the EXPR_LIST's allocated. */
7746 while (p != NULL_RTX)
7747 {
7748 rtx check_and_jump = XEXP (p, 0);
7749 rtx old_p = p;
7750
7751 p = XEXP (p, 1);
7752 free_EXPR_LIST_node (check_and_jump);
7753 free_EXPR_LIST_node (old_p);
7754 }
7755
7756 /* Release any temporary gprs allocated. */
7757 for (i = 0; i < frv_ifcvt.cur_scratch_regs; i++)
7758 frv_ifcvt.scratch_regs[i] = NULL_RTX;
7759
7760 frv_ifcvt.added_insns_list = NULL_RTX;
7761 frv_ifcvt.cur_scratch_regs = 0;
7762 return;
7763 }
7764 \f
7765 /* A C expression for the size in bytes of the trampoline, as an integer.
7766 The template is:
7767
7768 setlo #0, <jmp_reg>
7769 setlo #0, <static_chain>
7770 sethi #0, <jmp_reg>
7771 sethi #0, <static_chain>
7772 jmpl @(gr0,<jmp_reg>) */
7773
7774 int
7775 frv_trampoline_size (void)
7776 {
7777 if (TARGET_FDPIC)
7778 /* Allocate room for the function descriptor and the lddi
7779 instruction. */
7780 return 8 + 6 * 4;
7781 return 5 /* instructions */ * 4 /* instruction size. */;
7782 }
7783
7784 \f
7785 /* A C statement to initialize the variable parts of a trampoline. ADDR is an
7786 RTX for the address of the trampoline; FNADDR is an RTX for the address of
7787 the nested function; STATIC_CHAIN is an RTX for the static chain value that
7788 should be passed to the function when it is called.
7789
7790 The template is:
7791
7792 setlo #0, <jmp_reg>
7793 setlo #0, <static_chain>
7794 sethi #0, <jmp_reg>
7795 sethi #0, <static_chain>
7796 jmpl @(gr0,<jmp_reg>) */
7797
7798 void
7799 frv_initialize_trampoline (rtx addr, rtx fnaddr, rtx static_chain)
7800 {
7801 rtx sc_reg = force_reg (Pmode, static_chain);
7802
7803 emit_library_call (gen_rtx_SYMBOL_REF (SImode, "__trampoline_setup"),
7804 FALSE, VOIDmode, 4,
7805 addr, Pmode,
7806 GEN_INT (frv_trampoline_size ()), SImode,
7807 fnaddr, Pmode,
7808 sc_reg, Pmode);
7809 }
7810
7811 \f
7812 /* Many machines have some registers that cannot be copied directly to or from
7813 memory or even from other types of registers. An example is the `MQ'
7814 register, which on most machines, can only be copied to or from general
7815 registers, but not memory. Some machines allow copying all registers to and
7816 from memory, but require a scratch register for stores to some memory
7817 locations (e.g., those with symbolic address on the RT, and those with
7818 certain symbolic address on the SPARC when compiling PIC). In some cases,
7819 both an intermediate and a scratch register are required.
7820
7821 You should define these macros to indicate to the reload phase that it may
7822 need to allocate at least one register for a reload in addition to the
7823 register to contain the data. Specifically, if copying X to a register
7824 CLASS in MODE requires an intermediate register, you should define
7825 `SECONDARY_INPUT_RELOAD_CLASS' to return the largest register class all of
7826 whose registers can be used as intermediate registers or scratch registers.
7827
7828 If copying a register CLASS in MODE to X requires an intermediate or scratch
7829 register, `SECONDARY_OUTPUT_RELOAD_CLASS' should be defined to return the
7830 largest register class required. If the requirements for input and output
7831 reloads are the same, the macro `SECONDARY_RELOAD_CLASS' should be used
7832 instead of defining both macros identically.
7833
7834 The values returned by these macros are often `GENERAL_REGS'. Return
7835 `NO_REGS' if no spare register is needed; i.e., if X can be directly copied
7836 to or from a register of CLASS in MODE without requiring a scratch register.
7837 Do not define this macro if it would always return `NO_REGS'.
7838
7839 If a scratch register is required (either with or without an intermediate
7840 register), you should define patterns for `reload_inM' or `reload_outM', as
7841 required.. These patterns, which will normally be implemented with a
7842 `define_expand', should be similar to the `movM' patterns, except that
7843 operand 2 is the scratch register.
7844
7845 Define constraints for the reload register and scratch register that contain
7846 a single register class. If the original reload register (whose class is
7847 CLASS) can meet the constraint given in the pattern, the value returned by
7848 these macros is used for the class of the scratch register. Otherwise, two
7849 additional reload registers are required. Their classes are obtained from
7850 the constraints in the insn pattern.
7851
7852 X might be a pseudo-register or a `subreg' of a pseudo-register, which could
7853 either be in a hard register or in memory. Use `true_regnum' to find out;
7854 it will return -1 if the pseudo is in memory and the hard register number if
7855 it is in a register.
7856
7857 These macros should not be used in the case where a particular class of
7858 registers can only be copied to memory and not to another class of
7859 registers. In that case, secondary reload registers are not needed and
7860 would not be helpful. Instead, a stack location must be used to perform the
7861 copy and the `movM' pattern should use memory as an intermediate storage.
7862 This case often occurs between floating-point and general registers. */
7863
7864 enum reg_class
7865 frv_secondary_reload_class (enum reg_class class,
7866 enum machine_mode mode ATTRIBUTE_UNUSED,
7867 rtx x,
7868 int in_p ATTRIBUTE_UNUSED)
7869 {
7870 enum reg_class ret;
7871
7872 switch (class)
7873 {
7874 default:
7875 ret = NO_REGS;
7876 break;
7877
7878 /* Accumulators/Accumulator guard registers need to go through floating
7879 point registers. */
7880 case QUAD_REGS:
7881 case EVEN_REGS:
7882 case GPR_REGS:
7883 ret = NO_REGS;
7884 if (x && GET_CODE (x) == REG)
7885 {
7886 int regno = REGNO (x);
7887
7888 if (ACC_P (regno) || ACCG_P (regno))
7889 ret = FPR_REGS;
7890 }
7891 break;
7892
7893 /* Nonzero constants should be loaded into an FPR through a GPR. */
7894 case QUAD_FPR_REGS:
7895 case FEVEN_REGS:
7896 case FPR_REGS:
7897 if (x && CONSTANT_P (x) && !ZERO_P (x))
7898 ret = GPR_REGS;
7899 else
7900 ret = NO_REGS;
7901 break;
7902
7903 /* All of these types need gpr registers. */
7904 case ICC_REGS:
7905 case FCC_REGS:
7906 case CC_REGS:
7907 case ICR_REGS:
7908 case FCR_REGS:
7909 case CR_REGS:
7910 case LCR_REG:
7911 case LR_REG:
7912 ret = GPR_REGS;
7913 break;
7914
7915 /* The accumulators need fpr registers */
7916 case ACC_REGS:
7917 case EVEN_ACC_REGS:
7918 case QUAD_ACC_REGS:
7919 case ACCG_REGS:
7920 ret = FPR_REGS;
7921 break;
7922 }
7923
7924 return ret;
7925 }
7926
7927 \f
7928 /* A C expression whose value is nonzero if pseudos that have been assigned to
7929 registers of class CLASS would likely be spilled because registers of CLASS
7930 are needed for spill registers.
7931
7932 The default value of this macro returns 1 if CLASS has exactly one register
7933 and zero otherwise. On most machines, this default should be used. Only
7934 define this macro to some other expression if pseudo allocated by
7935 `local-alloc.c' end up in memory because their hard registers were needed
7936 for spill registers. If this macro returns nonzero for those classes, those
7937 pseudos will only be allocated by `global.c', which knows how to reallocate
7938 the pseudo to another register. If there would not be another register
7939 available for reallocation, you should not change the definition of this
7940 macro since the only effect of such a definition would be to slow down
7941 register allocation. */
7942
7943 int
7944 frv_class_likely_spilled_p (enum reg_class class)
7945 {
7946 switch (class)
7947 {
7948 default:
7949 break;
7950
7951 case GR8_REGS:
7952 case GR9_REGS:
7953 case GR89_REGS:
7954 case FDPIC_FPTR_REGS:
7955 case FDPIC_REGS:
7956 case ICC_REGS:
7957 case FCC_REGS:
7958 case CC_REGS:
7959 case ICR_REGS:
7960 case FCR_REGS:
7961 case CR_REGS:
7962 case LCR_REG:
7963 case LR_REG:
7964 case SPR_REGS:
7965 case QUAD_ACC_REGS:
7966 case EVEN_ACC_REGS:
7967 case ACC_REGS:
7968 case ACCG_REGS:
7969 return TRUE;
7970 }
7971
7972 return FALSE;
7973 }
7974
7975 \f
7976 /* An expression for the alignment of a structure field FIELD if the
7977 alignment computed in the usual way is COMPUTED. GCC uses this
7978 value instead of the value in `BIGGEST_ALIGNMENT' or
7979 `BIGGEST_FIELD_ALIGNMENT', if defined, for structure fields only. */
7980
7981 /* The definition type of the bit field data is either char, short, long or
7982 long long. The maximum bit size is the number of bits of its own type.
7983
7984 The bit field data is assigned to a storage unit that has an adequate size
7985 for bit field data retention and is located at the smallest address.
7986
7987 Consecutive bit field data are packed at consecutive bits having the same
7988 storage unit, with regard to the type, beginning with the MSB and continuing
7989 toward the LSB.
7990
7991 If a field to be assigned lies over a bit field type boundary, its
7992 assignment is completed by aligning it with a boundary suitable for the
7993 type.
7994
7995 When a bit field having a bit length of 0 is declared, it is forcibly
7996 assigned to the next storage unit.
7997
7998 e.g)
7999 struct {
8000 int a:2;
8001 int b:6;
8002 char c:4;
8003 int d:10;
8004 int :0;
8005 int f:2;
8006 } x;
8007
8008 +0 +1 +2 +3
8009 &x 00000000 00000000 00000000 00000000
8010 MLM----L
8011 a b
8012 &x+4 00000000 00000000 00000000 00000000
8013 M--L
8014 c
8015 &x+8 00000000 00000000 00000000 00000000
8016 M----------L
8017 d
8018 &x+12 00000000 00000000 00000000 00000000
8019 ML
8020 f
8021 */
8022
8023 int
8024 frv_adjust_field_align (tree field, int computed)
8025 {
8026 /* Make sure that the bitfield is not wider than the type. */
8027 if (DECL_BIT_FIELD (field)
8028 && !DECL_ARTIFICIAL (field))
8029 {
8030 tree parent = DECL_CONTEXT (field);
8031 tree prev = NULL_TREE;
8032 tree cur;
8033
8034 for (cur = TYPE_FIELDS (parent); cur && cur != field; cur = TREE_CHAIN (cur))
8035 {
8036 if (TREE_CODE (cur) != FIELD_DECL)
8037 continue;
8038
8039 prev = cur;
8040 }
8041
8042 if (!cur)
8043 abort ();
8044
8045 /* If this isn't a :0 field and if the previous element is a bitfield
8046 also, see if the type is different, if so, we will need to align the
8047 bit-field to the next boundary. */
8048 if (prev
8049 && ! DECL_PACKED (field)
8050 && ! integer_zerop (DECL_SIZE (field))
8051 && DECL_BIT_FIELD_TYPE (field) != DECL_BIT_FIELD_TYPE (prev))
8052 {
8053 int prev_align = TYPE_ALIGN (TREE_TYPE (prev));
8054 int cur_align = TYPE_ALIGN (TREE_TYPE (field));
8055 computed = (prev_align > cur_align) ? prev_align : cur_align;
8056 }
8057 }
8058
8059 return computed;
8060 }
8061
8062 \f
8063 /* A C expression that is nonzero if it is permissible to store a value of mode
8064 MODE in hard register number REGNO (or in several registers starting with
8065 that one). For a machine where all registers are equivalent, a suitable
8066 definition is
8067
8068 #define HARD_REGNO_MODE_OK(REGNO, MODE) 1
8069
8070 It is not necessary for this macro to check for the numbers of fixed
8071 registers, because the allocation mechanism considers them to be always
8072 occupied.
8073
8074 On some machines, double-precision values must be kept in even/odd register
8075 pairs. The way to implement that is to define this macro to reject odd
8076 register numbers for such modes.
8077
8078 The minimum requirement for a mode to be OK in a register is that the
8079 `movMODE' instruction pattern support moves between the register and any
8080 other hard register for which the mode is OK; and that moving a value into
8081 the register and back out not alter it.
8082
8083 Since the same instruction used to move `SImode' will work for all narrower
8084 integer modes, it is not necessary on any machine for `HARD_REGNO_MODE_OK'
8085 to distinguish between these modes, provided you define patterns `movhi',
8086 etc., to take advantage of this. This is useful because of the interaction
8087 between `HARD_REGNO_MODE_OK' and `MODES_TIEABLE_P'; it is very desirable for
8088 all integer modes to be tieable.
8089
8090 Many machines have special registers for floating point arithmetic. Often
8091 people assume that floating point machine modes are allowed only in floating
8092 point registers. This is not true. Any registers that can hold integers
8093 can safely *hold* a floating point machine mode, whether or not floating
8094 arithmetic can be done on it in those registers. Integer move instructions
8095 can be used to move the values.
8096
8097 On some machines, though, the converse is true: fixed-point machine modes
8098 may not go in floating registers. This is true if the floating registers
8099 normalize any value stored in them, because storing a non-floating value
8100 there would garble it. In this case, `HARD_REGNO_MODE_OK' should reject
8101 fixed-point machine modes in floating registers. But if the floating
8102 registers do not automatically normalize, if you can store any bit pattern
8103 in one and retrieve it unchanged without a trap, then any machine mode may
8104 go in a floating register, so you can define this macro to say so.
8105
8106 The primary significance of special floating registers is rather that they
8107 are the registers acceptable in floating point arithmetic instructions.
8108 However, this is of no concern to `HARD_REGNO_MODE_OK'. You handle it by
8109 writing the proper constraints for those instructions.
8110
8111 On some machines, the floating registers are especially slow to access, so
8112 that it is better to store a value in a stack frame than in such a register
8113 if floating point arithmetic is not being done. As long as the floating
8114 registers are not in class `GENERAL_REGS', they will not be used unless some
8115 pattern's constraint asks for one. */
8116
8117 int
8118 frv_hard_regno_mode_ok (int regno, enum machine_mode mode)
8119 {
8120 int base;
8121 int mask;
8122
8123 switch (mode)
8124 {
8125 case CCmode:
8126 case CC_UNSmode:
8127 case CC_NZmode:
8128 return ICC_P (regno) || GPR_P (regno);
8129
8130 case CC_CCRmode:
8131 return CR_P (regno) || GPR_P (regno);
8132
8133 case CC_FPmode:
8134 return FCC_P (regno) || GPR_P (regno);
8135
8136 default:
8137 break;
8138 }
8139
8140 /* Set BASE to the first register in REGNO's class. Set MASK to the
8141 bits that must be clear in (REGNO - BASE) for the register to be
8142 well-aligned. */
8143 if (INTEGRAL_MODE_P (mode) || FLOAT_MODE_P (mode) || VECTOR_MODE_P (mode))
8144 {
8145 if (ACCG_P (regno))
8146 {
8147 /* ACCGs store one byte. Two-byte quantities must start in
8148 even-numbered registers, four-byte ones in registers whose
8149 numbers are divisible by four, and so on. */
8150 base = ACCG_FIRST;
8151 mask = GET_MODE_SIZE (mode) - 1;
8152 }
8153 else
8154 {
8155 /* The other registers store one word. */
8156 if (GPR_P (regno) || regno == AP_FIRST)
8157 base = GPR_FIRST;
8158
8159 else if (FPR_P (regno))
8160 base = FPR_FIRST;
8161
8162 else if (ACC_P (regno))
8163 base = ACC_FIRST;
8164
8165 else if (SPR_P (regno))
8166 return mode == SImode;
8167
8168 /* Fill in the table. */
8169 else
8170 return 0;
8171
8172 /* Anything smaller than an SI is OK in any word-sized register. */
8173 if (GET_MODE_SIZE (mode) < 4)
8174 return 1;
8175
8176 mask = (GET_MODE_SIZE (mode) / 4) - 1;
8177 }
8178 return (((regno - base) & mask) == 0);
8179 }
8180
8181 return 0;
8182 }
8183
8184 \f
8185 /* A C expression for the number of consecutive hard registers, starting at
8186 register number REGNO, required to hold a value of mode MODE.
8187
8188 On a machine where all registers are exactly one word, a suitable definition
8189 of this macro is
8190
8191 #define HARD_REGNO_NREGS(REGNO, MODE) \
8192 ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \
8193 / UNITS_PER_WORD)) */
8194
8195 /* On the FRV, make the CC_FP mode take 3 words in the integer registers, so
8196 that we can build the appropriate instructions to properly reload the
8197 values. Also, make the byte-sized accumulator guards use one guard
8198 for each byte. */
8199
8200 int
8201 frv_hard_regno_nregs (int regno, enum machine_mode mode)
8202 {
8203 if (ACCG_P (regno))
8204 return GET_MODE_SIZE (mode);
8205 else
8206 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
8207 }
8208
8209 \f
8210 /* A C expression for the maximum number of consecutive registers of
8211 class CLASS needed to hold a value of mode MODE.
8212
8213 This is closely related to the macro `HARD_REGNO_NREGS'. In fact, the value
8214 of the macro `CLASS_MAX_NREGS (CLASS, MODE)' should be the maximum value of
8215 `HARD_REGNO_NREGS (REGNO, MODE)' for all REGNO values in the class CLASS.
8216
8217 This macro helps control the handling of multiple-word values in
8218 the reload pass.
8219
8220 This declaration is required. */
8221
8222 int
8223 frv_class_max_nregs (enum reg_class class, enum machine_mode mode)
8224 {
8225 if (class == ACCG_REGS)
8226 /* An N-byte value requires N accumulator guards. */
8227 return GET_MODE_SIZE (mode);
8228 else
8229 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
8230 }
8231
8232 \f
8233 /* A C expression that is nonzero if X is a legitimate constant for an
8234 immediate operand on the target machine. You can assume that X satisfies
8235 `CONSTANT_P', so you need not check this. In fact, `1' is a suitable
8236 definition for this macro on machines where anything `CONSTANT_P' is valid. */
8237
8238 int
8239 frv_legitimate_constant_p (rtx x)
8240 {
8241 enum machine_mode mode = GET_MODE (x);
8242
8243 /* frv_cannot_force_const_mem always returns true for FDPIC. This
8244 means that the move expanders will be expected to deal with most
8245 kinds of constant, regardless of what we return here.
8246
8247 However, among its other duties, LEGITIMATE_CONSTANT_P decides whether
8248 a constant can be entered into reg_equiv_constant[]. If we return true,
8249 reload can create new instances of the constant whenever it likes.
8250
8251 The idea is therefore to accept as many constants as possible (to give
8252 reload more freedom) while rejecting constants that can only be created
8253 at certain times. In particular, anything with a symbolic component will
8254 require use of the pseudo FDPIC register, which is only available before
8255 reload. */
8256 if (TARGET_FDPIC)
8257 return LEGITIMATE_PIC_OPERAND_P (x);
8258
8259 /* All of the integer constants are ok. */
8260 if (GET_CODE (x) != CONST_DOUBLE)
8261 return TRUE;
8262
8263 /* double integer constants are ok. */
8264 if (mode == VOIDmode || mode == DImode)
8265 return TRUE;
8266
8267 /* 0 is always ok. */
8268 if (x == CONST0_RTX (mode))
8269 return TRUE;
8270
8271 /* If floating point is just emulated, allow any constant, since it will be
8272 constructed in the GPRs. */
8273 if (!TARGET_HAS_FPRS)
8274 return TRUE;
8275
8276 if (mode == DFmode && !TARGET_DOUBLE)
8277 return TRUE;
8278
8279 /* Otherwise store the constant away and do a load. */
8280 return FALSE;
8281 }
8282
8283 /* Implement SELECT_CC_MODE. Choose CC_FP for floating-point comparisons,
8284 CC_NZ for comparisons against zero in which a single Z or N flag test
8285 is enough, CC_UNS for other unsigned comparisons, and CC for other
8286 signed comparisons. */
8287
8288 enum machine_mode
8289 frv_select_cc_mode (enum rtx_code code, rtx x, rtx y)
8290 {
8291 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
8292 return CC_FPmode;
8293
8294 switch (code)
8295 {
8296 case EQ:
8297 case NE:
8298 case LT:
8299 case GE:
8300 return y == const0_rtx ? CC_NZmode : CCmode;
8301
8302 case GTU:
8303 case GEU:
8304 case LTU:
8305 case LEU:
8306 return y == const0_rtx ? CC_NZmode : CC_UNSmode;
8307
8308 default:
8309 return CCmode;
8310 }
8311 }
8312 \f
8313 /* A C expression for the cost of moving data from a register in class FROM to
8314 one in class TO. The classes are expressed using the enumeration values
8315 such as `GENERAL_REGS'. A value of 4 is the default; other values are
8316 interpreted relative to that.
8317
8318 It is not required that the cost always equal 2 when FROM is the same as TO;
8319 on some machines it is expensive to move between registers if they are not
8320 general registers.
8321
8322 If reload sees an insn consisting of a single `set' between two hard
8323 registers, and if `REGISTER_MOVE_COST' applied to their classes returns a
8324 value of 2, reload does not check to ensure that the constraints of the insn
8325 are met. Setting a cost of other than 2 will allow reload to verify that
8326 the constraints are met. You should do this if the `movM' pattern's
8327 constraints do not allow such copying. */
8328
8329 #define HIGH_COST 40
8330 #define MEDIUM_COST 3
8331 #define LOW_COST 1
8332
8333 int
8334 frv_register_move_cost (enum reg_class from, enum reg_class to)
8335 {
8336 switch (from)
8337 {
8338 default:
8339 break;
8340
8341 case QUAD_REGS:
8342 case EVEN_REGS:
8343 case GPR_REGS:
8344 switch (to)
8345 {
8346 default:
8347 break;
8348
8349 case QUAD_REGS:
8350 case EVEN_REGS:
8351 case GPR_REGS:
8352 return LOW_COST;
8353
8354 case FEVEN_REGS:
8355 case FPR_REGS:
8356 return LOW_COST;
8357
8358 case LCR_REG:
8359 case LR_REG:
8360 case SPR_REGS:
8361 return LOW_COST;
8362 }
8363
8364 case FEVEN_REGS:
8365 case FPR_REGS:
8366 switch (to)
8367 {
8368 default:
8369 break;
8370
8371 case QUAD_REGS:
8372 case EVEN_REGS:
8373 case GPR_REGS:
8374 case ACC_REGS:
8375 case EVEN_ACC_REGS:
8376 case QUAD_ACC_REGS:
8377 case ACCG_REGS:
8378 return MEDIUM_COST;
8379
8380 case FEVEN_REGS:
8381 case FPR_REGS:
8382 return LOW_COST;
8383 }
8384
8385 case LCR_REG:
8386 case LR_REG:
8387 case SPR_REGS:
8388 switch (to)
8389 {
8390 default:
8391 break;
8392
8393 case QUAD_REGS:
8394 case EVEN_REGS:
8395 case GPR_REGS:
8396 return MEDIUM_COST;
8397 }
8398
8399 case ACC_REGS:
8400 case EVEN_ACC_REGS:
8401 case QUAD_ACC_REGS:
8402 case ACCG_REGS:
8403 switch (to)
8404 {
8405 default:
8406 break;
8407
8408 case FEVEN_REGS:
8409 case FPR_REGS:
8410 return MEDIUM_COST;
8411
8412 }
8413 }
8414
8415 return HIGH_COST;
8416 }
8417 \f
8418 /* Implementation of TARGET_ASM_INTEGER. In the FRV case we need to
8419 use ".picptr" to generate safe relocations for PIC code. We also
8420 need a fixup entry for aligned (non-debugging) code. */
8421
8422 static bool
8423 frv_assemble_integer (rtx value, unsigned int size, int aligned_p)
8424 {
8425 if ((flag_pic || TARGET_FDPIC) && size == UNITS_PER_WORD)
8426 {
8427 if (GET_CODE (value) == CONST
8428 || GET_CODE (value) == SYMBOL_REF
8429 || GET_CODE (value) == LABEL_REF)
8430 {
8431 if (TARGET_FDPIC && GET_CODE (value) == SYMBOL_REF
8432 && SYMBOL_REF_FUNCTION_P (value))
8433 {
8434 fputs ("\t.picptr\tfuncdesc(", asm_out_file);
8435 output_addr_const (asm_out_file, value);
8436 fputs (")\n", asm_out_file);
8437 return true;
8438 }
8439 else if (TARGET_FDPIC && GET_CODE (value) == CONST
8440 && frv_function_symbol_referenced_p (value))
8441 return false;
8442 if (aligned_p && !TARGET_FDPIC)
8443 {
8444 static int label_num = 0;
8445 char buf[256];
8446 const char *p;
8447
8448 ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", label_num++);
8449 p = (* targetm.strip_name_encoding) (buf);
8450
8451 fprintf (asm_out_file, "%s:\n", p);
8452 fprintf (asm_out_file, "%s\n", FIXUP_SECTION_ASM_OP);
8453 fprintf (asm_out_file, "\t.picptr\t%s\n", p);
8454 fprintf (asm_out_file, "\t.previous\n");
8455 }
8456 assemble_integer_with_op ("\t.picptr\t", value);
8457 return true;
8458 }
8459 if (!aligned_p)
8460 {
8461 /* We've set the unaligned SI op to NULL, so we always have to
8462 handle the unaligned case here. */
8463 assemble_integer_with_op ("\t.4byte\t", value);
8464 return true;
8465 }
8466 }
8467 return default_assemble_integer (value, size, aligned_p);
8468 }
8469
8470 /* Function to set up the backend function structure. */
8471
8472 static struct machine_function *
8473 frv_init_machine_status (void)
8474 {
8475 return ggc_alloc_cleared (sizeof (struct machine_function));
8476 }
8477 \f
8478 /* Implement TARGET_SCHED_ISSUE_RATE. */
8479
8480 int
8481 frv_issue_rate (void)
8482 {
8483 if (!TARGET_PACK)
8484 return 1;
8485
8486 switch (frv_cpu_type)
8487 {
8488 default:
8489 case FRV_CPU_FR300:
8490 case FRV_CPU_SIMPLE:
8491 return 1;
8492
8493 case FRV_CPU_FR400:
8494 case FRV_CPU_FR405:
8495 case FRV_CPU_FR450:
8496 return 2;
8497
8498 case FRV_CPU_GENERIC:
8499 case FRV_CPU_FR500:
8500 case FRV_CPU_TOMCAT:
8501 return 4;
8502
8503 case FRV_CPU_FR550:
8504 return 8;
8505 }
8506 }
8507 \f
8508 /* A for_each_rtx callback. If X refers to an accumulator, return
8509 ACC_GROUP_ODD if the bit 2 of the register number is set and
8510 ACC_GROUP_EVEN if it is clear. Return 0 (ACC_GROUP_NONE)
8511 otherwise. */
8512
8513 static int
8514 frv_acc_group_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
8515 {
8516 if (REG_P (*x))
8517 {
8518 if (ACC_P (REGNO (*x)))
8519 return (REGNO (*x) - ACC_FIRST) & 4 ? ACC_GROUP_ODD : ACC_GROUP_EVEN;
8520 if (ACCG_P (REGNO (*x)))
8521 return (REGNO (*x) - ACCG_FIRST) & 4 ? ACC_GROUP_ODD : ACC_GROUP_EVEN;
8522 }
8523 return 0;
8524 }
8525
8526 /* Return the value of INSN's acc_group attribute. */
8527
8528 int
8529 frv_acc_group (rtx insn)
8530 {
8531 /* This distinction only applies to the FR550 packing constraints. */
8532 if (frv_cpu_type != FRV_CPU_FR550)
8533 return ACC_GROUP_NONE;
8534 return for_each_rtx (&PATTERN (insn), frv_acc_group_1, 0);
8535 }
8536
8537 /* Return the index of the DFA unit in FRV_UNIT_NAMES[] that instruction
8538 INSN will try to claim first. Since this value depends only on the
8539 type attribute, we can cache the results in FRV_TYPE_TO_UNIT[]. */
8540
8541 static unsigned int
8542 frv_insn_unit (rtx insn)
8543 {
8544 enum attr_type type;
8545
8546 type = get_attr_type (insn);
8547 if (frv_type_to_unit[type] == ARRAY_SIZE (frv_unit_codes))
8548 {
8549 /* We haven't seen this type of instruction before. */
8550 state_t state;
8551 unsigned int unit;
8552
8553 /* Issue the instruction on its own to see which unit it prefers. */
8554 state = alloca (state_size ());
8555 state_reset (state);
8556 state_transition (state, insn);
8557
8558 /* Find out which unit was taken. */
8559 for (unit = 0; unit < ARRAY_SIZE (frv_unit_codes); unit++)
8560 if (cpu_unit_reservation_p (state, frv_unit_codes[unit]))
8561 break;
8562
8563 if (unit == ARRAY_SIZE (frv_unit_codes))
8564 abort ();
8565
8566 frv_type_to_unit[type] = unit;
8567 }
8568 return frv_type_to_unit[type];
8569 }
8570
8571 /* Return true if INSN issues to a branch unit. */
8572
8573 static bool
8574 frv_issues_to_branch_unit_p (rtx insn)
8575 {
8576 return frv_unit_groups[frv_insn_unit (insn)] == GROUP_B;
8577 }
8578 \f
8579 /* The current state of the packing pass, implemented by frv_pack_insns. */
8580 static struct {
8581 /* The state of the pipeline DFA. */
8582 state_t dfa_state;
8583
8584 /* Which hardware registers are set within the current packet,
8585 and the conditions under which they are set. */
8586 regstate_t regstate[FIRST_PSEUDO_REGISTER];
8587
8588 /* The memory locations that have been modified so far in this
8589 packet. MEM is the memref and COND is the regstate_t condition
8590 under which it is set. */
8591 struct {
8592 rtx mem;
8593 regstate_t cond;
8594 } mems[2];
8595
8596 /* The number of valid entries in MEMS. The value is larger than
8597 ARRAY_SIZE (mems) if there were too many mems to record. */
8598 unsigned int num_mems;
8599
8600 /* The maximum number of instructions that can be packed together. */
8601 unsigned int issue_rate;
8602
8603 /* The instructions in the packet, partitioned into groups. */
8604 struct frv_packet_group {
8605 /* How many instructions in the packet belong to this group. */
8606 unsigned int num_insns;
8607
8608 /* A list of the instructions that belong to this group, in the order
8609 they appear in the rtl stream. */
8610 rtx insns[ARRAY_SIZE (frv_unit_codes)];
8611
8612 /* The contents of INSNS after they have been sorted into the correct
8613 assembly-language order. Element X issues to unit X. The list may
8614 contain extra nops. */
8615 rtx sorted[ARRAY_SIZE (frv_unit_codes)];
8616
8617 /* The member of frv_nops[] to use in sorted[]. */
8618 rtx nop;
8619 } groups[NUM_GROUPS];
8620
8621 /* The instructions that make up the current packet. */
8622 rtx insns[ARRAY_SIZE (frv_unit_codes)];
8623 unsigned int num_insns;
8624 } frv_packet;
8625
8626 /* Return the regstate_t flags for the given COND_EXEC condition.
8627 Abort if the condition isn't in the right form. */
8628
8629 static int
8630 frv_cond_flags (rtx cond)
8631 {
8632 if ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
8633 && GET_CODE (XEXP (cond, 0)) == REG
8634 && CR_P (REGNO (XEXP (cond, 0)))
8635 && XEXP (cond, 1) == const0_rtx)
8636 return ((REGNO (XEXP (cond, 0)) - CR_FIRST)
8637 | (GET_CODE (cond) == NE
8638 ? REGSTATE_IF_TRUE
8639 : REGSTATE_IF_FALSE));
8640 abort ();
8641 }
8642
8643
8644 /* Return true if something accessed under condition COND2 can
8645 conflict with something written under condition COND1. */
8646
8647 static bool
8648 frv_regstate_conflict_p (regstate_t cond1, regstate_t cond2)
8649 {
8650 /* If either reference was unconditional, we have a conflict. */
8651 if ((cond1 & REGSTATE_IF_EITHER) == 0
8652 || (cond2 & REGSTATE_IF_EITHER) == 0)
8653 return true;
8654
8655 /* The references might conflict if they were controlled by
8656 different CRs. */
8657 if ((cond1 & REGSTATE_CC_MASK) != (cond2 & REGSTATE_CC_MASK))
8658 return true;
8659
8660 /* They definitely conflict if they are controlled by the
8661 same condition. */
8662 if ((cond1 & cond2 & REGSTATE_IF_EITHER) != 0)
8663 return true;
8664
8665 return false;
8666 }
8667
8668
8669 /* A for_each_rtx callback. Return 1 if *X depends on an instruction in
8670 the current packet. DATA points to a regstate_t that describes the
8671 condition under which *X might be set or used. */
8672
8673 static int
8674 frv_registers_conflict_p_1 (rtx *x, void *data)
8675 {
8676 unsigned int regno, i;
8677 regstate_t cond;
8678
8679 cond = *(regstate_t *) data;
8680
8681 if (GET_CODE (*x) == REG)
8682 FOR_EACH_REGNO (regno, *x)
8683 if ((frv_packet.regstate[regno] & REGSTATE_MODIFIED) != 0)
8684 if (frv_regstate_conflict_p (frv_packet.regstate[regno], cond))
8685 return 1;
8686
8687 if (GET_CODE (*x) == MEM)
8688 {
8689 /* If we ran out of memory slots, assume a conflict. */
8690 if (frv_packet.num_mems > ARRAY_SIZE (frv_packet.mems))
8691 return 1;
8692
8693 /* Check for output or true dependencies with earlier MEMs. */
8694 for (i = 0; i < frv_packet.num_mems; i++)
8695 if (frv_regstate_conflict_p (frv_packet.mems[i].cond, cond))
8696 {
8697 if (true_dependence (frv_packet.mems[i].mem, VOIDmode,
8698 *x, rtx_varies_p))
8699 return 1;
8700
8701 if (output_dependence (frv_packet.mems[i].mem, *x))
8702 return 1;
8703 }
8704 }
8705
8706 /* The return values of calls aren't significant: they describe
8707 the effect of the call as a whole, not of the insn itself. */
8708 if (GET_CODE (*x) == SET && GET_CODE (SET_SRC (*x)) == CALL)
8709 {
8710 if (for_each_rtx (&SET_SRC (*x), frv_registers_conflict_p_1, data))
8711 return 1;
8712 return -1;
8713 }
8714
8715 /* Check subexpressions. */
8716 return 0;
8717 }
8718
8719
8720 /* Return true if something in X might depend on an instruction
8721 in the current packet. */
8722
8723 static bool
8724 frv_registers_conflict_p (rtx x)
8725 {
8726 regstate_t flags;
8727
8728 flags = 0;
8729 if (GET_CODE (x) == COND_EXEC)
8730 {
8731 if (for_each_rtx (&XEXP (x, 0), frv_registers_conflict_p_1, &flags))
8732 return true;
8733
8734 flags |= frv_cond_flags (XEXP (x, 0));
8735 x = XEXP (x, 1);
8736 }
8737 return for_each_rtx (&x, frv_registers_conflict_p_1, &flags);
8738 }
8739
8740
8741 /* A note_stores callback. DATA points to the regstate_t condition
8742 under which X is modified. Update FRV_PACKET accordingly. */
8743
8744 static void
8745 frv_registers_update_1 (rtx x, rtx pat ATTRIBUTE_UNUSED, void *data)
8746 {
8747 unsigned int regno;
8748
8749 if (GET_CODE (x) == REG)
8750 FOR_EACH_REGNO (regno, x)
8751 frv_packet.regstate[regno] |= *(regstate_t *) data;
8752
8753 if (GET_CODE (x) == MEM)
8754 {
8755 if (frv_packet.num_mems < ARRAY_SIZE (frv_packet.mems))
8756 {
8757 frv_packet.mems[frv_packet.num_mems].mem = x;
8758 frv_packet.mems[frv_packet.num_mems].cond = *(regstate_t *) data;
8759 }
8760 frv_packet.num_mems++;
8761 }
8762 }
8763
8764
8765 /* Update the register state information for an instruction whose
8766 body is X. */
8767
8768 static void
8769 frv_registers_update (rtx x)
8770 {
8771 regstate_t flags;
8772
8773 flags = REGSTATE_MODIFIED;
8774 if (GET_CODE (x) == COND_EXEC)
8775 {
8776 flags |= frv_cond_flags (XEXP (x, 0));
8777 x = XEXP (x, 1);
8778 }
8779 note_stores (x, frv_registers_update_1, &flags);
8780 }
8781
8782
8783 /* Initialize frv_packet for the start of a new packet. */
8784
8785 static void
8786 frv_start_packet (void)
8787 {
8788 enum frv_insn_group group;
8789
8790 memset (frv_packet.regstate, 0, sizeof (frv_packet.regstate));
8791 frv_packet.num_mems = 0;
8792 frv_packet.num_insns = 0;
8793 for (group = 0; group < NUM_GROUPS; group++)
8794 frv_packet.groups[group].num_insns = 0;
8795 }
8796
8797
8798 /* Likewise for the start of a new basic block. */
8799
8800 static void
8801 frv_start_packet_block (void)
8802 {
8803 state_reset (frv_packet.dfa_state);
8804 frv_start_packet ();
8805 }
8806
8807
8808 /* Finish the current packet, if any, and start a new one. Call
8809 HANDLE_PACKET with FRV_PACKET describing the completed packet. */
8810
8811 static void
8812 frv_finish_packet (void (*handle_packet) (void))
8813 {
8814 if (frv_packet.num_insns > 0)
8815 {
8816 handle_packet ();
8817 state_transition (frv_packet.dfa_state, 0);
8818 frv_start_packet ();
8819 }
8820 }
8821
8822
8823 /* Return true if INSN can be added to the current packet. Update
8824 the DFA state on success. */
8825
8826 static bool
8827 frv_pack_insn_p (rtx insn)
8828 {
8829 /* See if the packet is already as long as it can be. */
8830 if (frv_packet.num_insns == frv_packet.issue_rate)
8831 return false;
8832
8833 /* If the scheduler thought that an instruction should start a packet,
8834 it's usually a good idea to believe it. It knows much more about
8835 the latencies than we do.
8836
8837 There are some exceptions though:
8838
8839 - Conditional instructions are scheduled on the assumption that
8840 they will be executed. This is usually a good thing, since it
8841 tends to avoid unnecessary stalls in the conditional code.
8842 But we want to pack conditional instructions as tightly as
8843 possible, in order to optimize the case where they aren't
8844 executed.
8845
8846 - The scheduler will always put branches on their own, even
8847 if there's no real dependency.
8848
8849 - There's no point putting a call in its own packet unless
8850 we have to. */
8851 if (frv_packet.num_insns > 0
8852 && GET_CODE (insn) == INSN
8853 && GET_MODE (insn) == TImode
8854 && GET_CODE (PATTERN (insn)) != COND_EXEC)
8855 return false;
8856
8857 /* Check for register conflicts. Don't do this for setlo since any
8858 conflict will be with the partnering sethi, with which it can
8859 be packed. */
8860 if (get_attr_type (insn) != TYPE_SETLO)
8861 if (frv_registers_conflict_p (PATTERN (insn)))
8862 return false;
8863
8864 return state_transition (frv_packet.dfa_state, insn) < 0;
8865 }
8866
8867
8868 /* Add instruction INSN to the current packet. */
8869
8870 static void
8871 frv_add_insn_to_packet (rtx insn)
8872 {
8873 struct frv_packet_group *packet_group;
8874
8875 packet_group = &frv_packet.groups[frv_unit_groups[frv_insn_unit (insn)]];
8876 packet_group->insns[packet_group->num_insns++] = insn;
8877 frv_packet.insns[frv_packet.num_insns++] = insn;
8878
8879 frv_registers_update (PATTERN (insn));
8880 }
8881
8882
8883 /* Insert INSN (a member of frv_nops[]) into the current packet. If the
8884 packet ends in a branch or call, insert the nop before it, otherwise
8885 add to the end. */
8886
8887 static void
8888 frv_insert_nop_in_packet (rtx insn)
8889 {
8890 struct frv_packet_group *packet_group;
8891 rtx last;
8892
8893 packet_group = &frv_packet.groups[frv_unit_groups[frv_insn_unit (insn)]];
8894 last = frv_packet.insns[frv_packet.num_insns - 1];
8895 if (GET_CODE (last) != INSN)
8896 {
8897 insn = emit_insn_before (PATTERN (insn), last);
8898 frv_packet.insns[frv_packet.num_insns - 1] = insn;
8899 frv_packet.insns[frv_packet.num_insns++] = last;
8900 }
8901 else
8902 {
8903 insn = emit_insn_after (PATTERN (insn), last);
8904 frv_packet.insns[frv_packet.num_insns++] = insn;
8905 }
8906 packet_group->insns[packet_group->num_insns++] = insn;
8907 }
8908
8909
8910 /* If packing is enabled, divide the instructions into packets and
8911 return true. Call HANDLE_PACKET for each complete packet. */
8912
8913 static bool
8914 frv_for_each_packet (void (*handle_packet) (void))
8915 {
8916 rtx insn, next_insn;
8917
8918 frv_packet.issue_rate = frv_issue_rate ();
8919
8920 /* Early exit if we don't want to pack insns. */
8921 if (!optimize
8922 || !flag_schedule_insns_after_reload
8923 || TARGET_NO_VLIW_BRANCH
8924 || frv_packet.issue_rate == 1)
8925 return false;
8926
8927 /* Set up the initial packing state. */
8928 dfa_start ();
8929 frv_packet.dfa_state = alloca (state_size ());
8930
8931 frv_start_packet_block ();
8932 for (insn = get_insns (); insn != 0; insn = next_insn)
8933 {
8934 enum rtx_code code;
8935 bool eh_insn_p;
8936
8937 code = GET_CODE (insn);
8938 next_insn = NEXT_INSN (insn);
8939
8940 if (code == CODE_LABEL)
8941 {
8942 frv_finish_packet (handle_packet);
8943 frv_start_packet_block ();
8944 }
8945
8946 if (INSN_P (insn))
8947 switch (GET_CODE (PATTERN (insn)))
8948 {
8949 case USE:
8950 case CLOBBER:
8951 case ADDR_VEC:
8952 case ADDR_DIFF_VEC:
8953 break;
8954
8955 default:
8956 /* Calls mustn't be packed on a TOMCAT. */
8957 if (GET_CODE (insn) == CALL_INSN && frv_cpu_type == FRV_CPU_TOMCAT)
8958 frv_finish_packet (handle_packet);
8959
8960 /* Since the last instruction in a packet determines the EH
8961 region, any exception-throwing instruction must come at
8962 the end of reordered packet. Insns that issue to a
8963 branch unit are bound to come last; for others it's
8964 too hard to predict. */
8965 eh_insn_p = (find_reg_note (insn, REG_EH_REGION, NULL) != NULL);
8966 if (eh_insn_p && !frv_issues_to_branch_unit_p (insn))
8967 frv_finish_packet (handle_packet);
8968
8969 /* Finish the current packet if we can't add INSN to it.
8970 Simulate cycles until INSN is ready to issue. */
8971 if (!frv_pack_insn_p (insn))
8972 {
8973 frv_finish_packet (handle_packet);
8974 while (!frv_pack_insn_p (insn))
8975 state_transition (frv_packet.dfa_state, 0);
8976 }
8977
8978 /* Add the instruction to the packet. */
8979 frv_add_insn_to_packet (insn);
8980
8981 /* Calls and jumps end a packet, as do insns that throw
8982 an exception. */
8983 if (code == CALL_INSN || code == JUMP_INSN || eh_insn_p)
8984 frv_finish_packet (handle_packet);
8985 break;
8986 }
8987 }
8988 frv_finish_packet (handle_packet);
8989 dfa_finish ();
8990 return true;
8991 }
8992 \f
8993 /* Subroutine of frv_sort_insn_group. We are trying to sort
8994 frv_packet.groups[GROUP].sorted[0...NUM_INSNS-1] into assembly
8995 language order. We have already picked a new position for
8996 frv_packet.groups[GROUP].sorted[X] if bit X of ISSUED is set.
8997 These instructions will occupy elements [0, LOWER_SLOT) and
8998 [UPPER_SLOT, NUM_INSNS) of the final (sorted) array. STATE is
8999 the DFA state after issuing these instructions.
9000
9001 Try filling elements [LOWER_SLOT, UPPER_SLOT) with every permutation
9002 of the unused instructions. Return true if one such permutation gives
9003 a valid ordering, leaving the successful permutation in sorted[].
9004 Do not modify sorted[] until a valid permutation is found. */
9005
9006 static bool
9007 frv_sort_insn_group_1 (enum frv_insn_group group,
9008 unsigned int lower_slot, unsigned int upper_slot,
9009 unsigned int issued, unsigned int num_insns,
9010 state_t state)
9011 {
9012 struct frv_packet_group *packet_group;
9013 unsigned int i;
9014 state_t test_state;
9015 size_t dfa_size;
9016 rtx insn;
9017
9018 /* Early success if we've filled all the slots. */
9019 if (lower_slot == upper_slot)
9020 return true;
9021
9022 packet_group = &frv_packet.groups[group];
9023 dfa_size = state_size ();
9024 test_state = alloca (dfa_size);
9025
9026 /* Try issuing each unused instruction. */
9027 for (i = num_insns - 1; i + 1 != 0; i--)
9028 if (~issued & (1 << i))
9029 {
9030 insn = packet_group->sorted[i];
9031 memcpy (test_state, state, dfa_size);
9032 if (state_transition (test_state, insn) < 0
9033 && cpu_unit_reservation_p (test_state,
9034 NTH_UNIT (group, upper_slot - 1))
9035 && frv_sort_insn_group_1 (group, lower_slot, upper_slot - 1,
9036 issued | (1 << i), num_insns,
9037 test_state))
9038 {
9039 packet_group->sorted[upper_slot - 1] = insn;
9040 return true;
9041 }
9042 }
9043
9044 return false;
9045 }
9046
9047 /* Compare two instructions by their frv_insn_unit. */
9048
9049 static int
9050 frv_compare_insns (const void *first, const void *second)
9051 {
9052 const rtx *insn1 = first, *insn2 = second;
9053 return frv_insn_unit (*insn1) - frv_insn_unit (*insn2);
9054 }
9055
9056 /* Copy frv_packet.groups[GROUP].insns[] to frv_packet.groups[GROUP].sorted[]
9057 and sort it into assembly language order. See frv.md for a description of
9058 the algorithm. */
9059
9060 static void
9061 frv_sort_insn_group (enum frv_insn_group group)
9062 {
9063 struct frv_packet_group *packet_group;
9064 unsigned int first, i, nop, max_unit, num_slots;
9065 state_t state, test_state;
9066 size_t dfa_size;
9067
9068 packet_group = &frv_packet.groups[group];
9069
9070 /* Assume no nop is needed. */
9071 packet_group->nop = 0;
9072
9073 if (packet_group->num_insns == 0)
9074 return;
9075
9076 /* Copy insns[] to sorted[]. */
9077 memcpy (packet_group->sorted, packet_group->insns,
9078 sizeof (rtx) * packet_group->num_insns);
9079
9080 /* Sort sorted[] by the unit that each insn tries to take first. */
9081 if (packet_group->num_insns > 1)
9082 qsort (packet_group->sorted, packet_group->num_insns,
9083 sizeof (rtx), frv_compare_insns);
9084
9085 /* That's always enough for branch and control insns. */
9086 if (group == GROUP_B || group == GROUP_C)
9087 return;
9088
9089 dfa_size = state_size ();
9090 state = alloca (dfa_size);
9091 test_state = alloca (dfa_size);
9092
9093 /* Find the highest FIRST such that sorted[0...FIRST-1] can issue
9094 consecutively and such that the DFA takes unit X when sorted[X]
9095 is added. Set STATE to the new DFA state. */
9096 state_reset (test_state);
9097 for (first = 0; first < packet_group->num_insns; first++)
9098 {
9099 memcpy (state, test_state, dfa_size);
9100 if (state_transition (test_state, packet_group->sorted[first]) >= 0
9101 || !cpu_unit_reservation_p (test_state, NTH_UNIT (group, first)))
9102 break;
9103 }
9104
9105 /* If all the instructions issued in ascending order, we're done. */
9106 if (first == packet_group->num_insns)
9107 return;
9108
9109 /* Add nops to the end of sorted[] and try each permutation until
9110 we find one that works. */
9111 for (nop = 0; nop < frv_num_nops; nop++)
9112 {
9113 max_unit = frv_insn_unit (frv_nops[nop]);
9114 if (frv_unit_groups[max_unit] == group)
9115 {
9116 packet_group->nop = frv_nops[nop];
9117 num_slots = UNIT_NUMBER (max_unit) + 1;
9118 for (i = packet_group->num_insns; i < num_slots; i++)
9119 packet_group->sorted[i] = frv_nops[nop];
9120 if (frv_sort_insn_group_1 (group, first, num_slots,
9121 (1 << first) - 1, num_slots, state))
9122 return;
9123 }
9124 }
9125 abort ();
9126 }
9127 \f
9128 /* Sort the current packet into assembly-language order. Set packing
9129 flags as appropriate. */
9130
9131 static void
9132 frv_reorder_packet (void)
9133 {
9134 unsigned int cursor[NUM_GROUPS];
9135 rtx insns[ARRAY_SIZE (frv_unit_groups)];
9136 unsigned int unit, to, from;
9137 enum frv_insn_group group;
9138 struct frv_packet_group *packet_group;
9139
9140 /* First sort each group individually. */
9141 for (group = 0; group < NUM_GROUPS; group++)
9142 {
9143 cursor[group] = 0;
9144 frv_sort_insn_group (group);
9145 }
9146
9147 /* Go through the unit template and try add an instruction from
9148 that unit's group. */
9149 to = 0;
9150 for (unit = 0; unit < ARRAY_SIZE (frv_unit_groups); unit++)
9151 {
9152 group = frv_unit_groups[unit];
9153 packet_group = &frv_packet.groups[group];
9154 if (cursor[group] < packet_group->num_insns)
9155 {
9156 /* frv_reorg should have added nops for us. */
9157 if (packet_group->sorted[cursor[group]] == packet_group->nop)
9158 abort ();
9159 insns[to++] = packet_group->sorted[cursor[group]++];
9160 }
9161 }
9162
9163 if (to != frv_packet.num_insns)
9164 abort ();
9165
9166 /* Clear the last instruction's packing flag, thus marking the end of
9167 a packet. Reorder the other instructions relative to it. */
9168 CLEAR_PACKING_FLAG (insns[to - 1]);
9169 for (from = 0; from < to - 1; from++)
9170 {
9171 remove_insn (insns[from]);
9172 add_insn_before (insns[from], insns[to - 1]);
9173 SET_PACKING_FLAG (insns[from]);
9174 }
9175 }
9176
9177
9178 /* Divide instructions into packets. Reorder the contents of each
9179 packet so that they are in the correct assembly-language order.
9180
9181 Since this pass can change the raw meaning of the rtl stream, it must
9182 only be called at the last minute, just before the instructions are
9183 written out. */
9184
9185 static void
9186 frv_pack_insns (void)
9187 {
9188 if (frv_for_each_packet (frv_reorder_packet))
9189 frv_insn_packing_flag = 0;
9190 else
9191 frv_insn_packing_flag = -1;
9192 }
9193 \f
9194 /* See whether we need to add nops to group GROUP in order to
9195 make a valid packet. */
9196
9197 static void
9198 frv_fill_unused_units (enum frv_insn_group group)
9199 {
9200 unsigned int non_nops, nops, i;
9201 struct frv_packet_group *packet_group;
9202
9203 packet_group = &frv_packet.groups[group];
9204
9205 /* Sort the instructions into assembly-language order.
9206 Use nops to fill slots that are otherwise unused. */
9207 frv_sort_insn_group (group);
9208
9209 /* See how many nops are needed before the final useful instruction. */
9210 i = nops = 0;
9211 for (non_nops = 0; non_nops < packet_group->num_insns; non_nops++)
9212 while (packet_group->sorted[i++] == packet_group->nop)
9213 nops++;
9214
9215 /* Insert that many nops into the instruction stream. */
9216 while (nops-- > 0)
9217 frv_insert_nop_in_packet (packet_group->nop);
9218 }
9219
9220 /* Used by frv_reorg to keep track of the current packet's address. */
9221 static unsigned int frv_packet_address;
9222
9223 /* If the current packet falls through to a label, try to pad the packet
9224 with nops in order to fit the label's alignment requirements. */
9225
9226 static void
9227 frv_align_label (void)
9228 {
9229 unsigned int alignment, target, nop;
9230 rtx x, last, barrier, label;
9231
9232 /* Walk forward to the start of the next packet. Set ALIGNMENT to the
9233 maximum alignment of that packet, LABEL to the last label between
9234 the packets, and BARRIER to the last barrier. */
9235 last = frv_packet.insns[frv_packet.num_insns - 1];
9236 label = barrier = 0;
9237 alignment = 4;
9238 for (x = NEXT_INSN (last); x != 0 && !INSN_P (x); x = NEXT_INSN (x))
9239 {
9240 if (LABEL_P (x))
9241 {
9242 unsigned int subalign = 1 << label_to_alignment (x);
9243 alignment = MAX (alignment, subalign);
9244 label = x;
9245 }
9246 if (BARRIER_P (x))
9247 barrier = x;
9248 }
9249
9250 /* If -malign-labels, and the packet falls through to an unaligned
9251 label, try introducing a nop to align that label to 8 bytes. */
9252 if (TARGET_ALIGN_LABELS
9253 && label != 0
9254 && barrier == 0
9255 && frv_packet.num_insns < frv_packet.issue_rate)
9256 alignment = MAX (alignment, 8);
9257
9258 /* Advance the address to the end of the current packet. */
9259 frv_packet_address += frv_packet.num_insns * 4;
9260
9261 /* Work out the target address, after alignment. */
9262 target = (frv_packet_address + alignment - 1) & -alignment;
9263
9264 /* If the packet falls through to the label, try to find an efficient
9265 padding sequence. */
9266 if (barrier == 0)
9267 {
9268 /* First try adding nops to the current packet. */
9269 for (nop = 0; nop < frv_num_nops; nop++)
9270 while (frv_packet_address < target && frv_pack_insn_p (frv_nops[nop]))
9271 {
9272 frv_insert_nop_in_packet (frv_nops[nop]);
9273 frv_packet_address += 4;
9274 }
9275
9276 /* If we still haven't reached the target, add some new packets that
9277 contain only nops. If there are two types of nop, insert an
9278 alternating sequence of frv_nops[0] and frv_nops[1], which will
9279 lead to packets like:
9280
9281 nop.p
9282 mnop.p/fnop.p
9283 nop.p
9284 mnop/fnop
9285
9286 etc. Just emit frv_nops[0] if that's the only nop we have. */
9287 last = frv_packet.insns[frv_packet.num_insns - 1];
9288 nop = 0;
9289 while (frv_packet_address < target)
9290 {
9291 last = emit_insn_after (PATTERN (frv_nops[nop]), last);
9292 frv_packet_address += 4;
9293 if (frv_num_nops > 1)
9294 nop ^= 1;
9295 }
9296 }
9297
9298 frv_packet_address = target;
9299 }
9300
9301 /* Subroutine of frv_reorg, called after each packet has been constructed
9302 in frv_packet. */
9303
9304 static void
9305 frv_reorg_packet (void)
9306 {
9307 frv_fill_unused_units (GROUP_I);
9308 frv_fill_unused_units (GROUP_FM);
9309 frv_align_label ();
9310 }
9311
9312 /* Add an instruction with pattern NOP to frv_nops[]. */
9313
9314 static void
9315 frv_register_nop (rtx nop)
9316 {
9317 nop = make_insn_raw (nop);
9318 NEXT_INSN (nop) = 0;
9319 PREV_INSN (nop) = 0;
9320 frv_nops[frv_num_nops++] = nop;
9321 }
9322
9323 /* Implement TARGET_MACHINE_DEPENDENT_REORG. Divide the instructions
9324 into packets and check whether we need to insert nops in order to
9325 fulfill the processor's issue requirements. Also, if the user has
9326 requested a certain alignment for a label, try to meet that alignment
9327 by inserting nops in the previous packet. */
9328
9329 static void
9330 frv_reorg (void)
9331 {
9332 frv_num_nops = 0;
9333 frv_register_nop (gen_nop ());
9334 if (TARGET_MEDIA)
9335 frv_register_nop (gen_mnop ());
9336 if (TARGET_HARD_FLOAT)
9337 frv_register_nop (gen_fnop ());
9338
9339 /* Estimate the length of each branch. Although this may change after
9340 we've inserted nops, it will only do so in big functions. */
9341 shorten_branches (get_insns ());
9342
9343 frv_packet_address = 0;
9344 frv_for_each_packet (frv_reorg_packet);
9345 }
9346 \f
9347 #define def_builtin(name, type, code) \
9348 lang_hooks.builtin_function ((name), (type), (code), BUILT_IN_MD, NULL, NULL)
9349
9350 struct builtin_description
9351 {
9352 enum insn_code icode;
9353 const char *name;
9354 enum frv_builtins code;
9355 enum rtx_code comparison;
9356 unsigned int flag;
9357 };
9358
9359 /* Media intrinsics that take a single, constant argument. */
9360
9361 static struct builtin_description bdesc_set[] =
9362 {
9363 { CODE_FOR_mhdsets, "__MHDSETS", FRV_BUILTIN_MHDSETS, 0, 0 }
9364 };
9365
9366 /* Media intrinsics that take just one argument. */
9367
9368 static struct builtin_description bdesc_1arg[] =
9369 {
9370 { CODE_FOR_mnot, "__MNOT", FRV_BUILTIN_MNOT, 0, 0 },
9371 { CODE_FOR_munpackh, "__MUNPACKH", FRV_BUILTIN_MUNPACKH, 0, 0 },
9372 { CODE_FOR_mbtoh, "__MBTOH", FRV_BUILTIN_MBTOH, 0, 0 },
9373 { CODE_FOR_mhtob, "__MHTOB", FRV_BUILTIN_MHTOB, 0, 0 },
9374 { CODE_FOR_mabshs, "__MABSHS", FRV_BUILTIN_MABSHS, 0, 0 },
9375 { CODE_FOR_scutss, "__SCUTSS", FRV_BUILTIN_SCUTSS, 0, 0 }
9376 };
9377
9378 /* Media intrinsics that take two arguments. */
9379
9380 static struct builtin_description bdesc_2arg[] =
9381 {
9382 { CODE_FOR_mand, "__MAND", FRV_BUILTIN_MAND, 0, 0 },
9383 { CODE_FOR_mor, "__MOR", FRV_BUILTIN_MOR, 0, 0 },
9384 { CODE_FOR_mxor, "__MXOR", FRV_BUILTIN_MXOR, 0, 0 },
9385 { CODE_FOR_maveh, "__MAVEH", FRV_BUILTIN_MAVEH, 0, 0 },
9386 { CODE_FOR_msaths, "__MSATHS", FRV_BUILTIN_MSATHS, 0, 0 },
9387 { CODE_FOR_msathu, "__MSATHU", FRV_BUILTIN_MSATHU, 0, 0 },
9388 { CODE_FOR_maddhss, "__MADDHSS", FRV_BUILTIN_MADDHSS, 0, 0 },
9389 { CODE_FOR_maddhus, "__MADDHUS", FRV_BUILTIN_MADDHUS, 0, 0 },
9390 { CODE_FOR_msubhss, "__MSUBHSS", FRV_BUILTIN_MSUBHSS, 0, 0 },
9391 { CODE_FOR_msubhus, "__MSUBHUS", FRV_BUILTIN_MSUBHUS, 0, 0 },
9392 { CODE_FOR_mqaddhss, "__MQADDHSS", FRV_BUILTIN_MQADDHSS, 0, 0 },
9393 { CODE_FOR_mqaddhus, "__MQADDHUS", FRV_BUILTIN_MQADDHUS, 0, 0 },
9394 { CODE_FOR_mqsubhss, "__MQSUBHSS", FRV_BUILTIN_MQSUBHSS, 0, 0 },
9395 { CODE_FOR_mqsubhus, "__MQSUBHUS", FRV_BUILTIN_MQSUBHUS, 0, 0 },
9396 { CODE_FOR_mpackh, "__MPACKH", FRV_BUILTIN_MPACKH, 0, 0 },
9397 { CODE_FOR_mcop1, "__Mcop1", FRV_BUILTIN_MCOP1, 0, 0 },
9398 { CODE_FOR_mcop2, "__Mcop2", FRV_BUILTIN_MCOP2, 0, 0 },
9399 { CODE_FOR_mwcut, "__MWCUT", FRV_BUILTIN_MWCUT, 0, 0 },
9400 { CODE_FOR_mqsaths, "__MQSATHS", FRV_BUILTIN_MQSATHS, 0, 0 },
9401 { CODE_FOR_mqlclrhs, "__MQLCLRHS", FRV_BUILTIN_MQLCLRHS, 0, 0 },
9402 { CODE_FOR_mqlmths, "__MQLMTHS", FRV_BUILTIN_MQLMTHS, 0, 0 },
9403 { CODE_FOR_smul, "__SMUL", FRV_BUILTIN_SMUL, 0, 0 },
9404 { CODE_FOR_umul, "__UMUL", FRV_BUILTIN_UMUL, 0, 0 },
9405 { CODE_FOR_addss, "__ADDSS", FRV_BUILTIN_ADDSS, 0, 0 },
9406 { CODE_FOR_subss, "__SUBSS", FRV_BUILTIN_SUBSS, 0, 0 },
9407 { CODE_FOR_slass, "__SLASS", FRV_BUILTIN_SLASS, 0, 0 },
9408 { CODE_FOR_scan, "__SCAN", FRV_BUILTIN_SCAN, 0, 0 }
9409 };
9410
9411 /* Integer intrinsics that take two arguments and have no return value. */
9412
9413 static struct builtin_description bdesc_int_void2arg[] =
9414 {
9415 { CODE_FOR_smass, "__SMASS", FRV_BUILTIN_SMASS, 0, 0 },
9416 { CODE_FOR_smsss, "__SMSSS", FRV_BUILTIN_SMSSS, 0, 0 },
9417 { CODE_FOR_smu, "__SMU", FRV_BUILTIN_SMU, 0, 0 }
9418 };
9419
9420 static struct builtin_description bdesc_prefetches[] =
9421 {
9422 { CODE_FOR_frv_prefetch0, "__data_prefetch0", FRV_BUILTIN_PREFETCH0, 0, 0 },
9423 { CODE_FOR_frv_prefetch, "__data_prefetch", FRV_BUILTIN_PREFETCH, 0, 0 }
9424 };
9425
9426 /* Media intrinsics that take two arguments, the first being an ACC number. */
9427
9428 static struct builtin_description bdesc_cut[] =
9429 {
9430 { CODE_FOR_mcut, "__MCUT", FRV_BUILTIN_MCUT, 0, 0 },
9431 { CODE_FOR_mcutss, "__MCUTSS", FRV_BUILTIN_MCUTSS, 0, 0 },
9432 { CODE_FOR_mdcutssi, "__MDCUTSSI", FRV_BUILTIN_MDCUTSSI, 0, 0 }
9433 };
9434
9435 /* Two-argument media intrinsics with an immediate second argument. */
9436
9437 static struct builtin_description bdesc_2argimm[] =
9438 {
9439 { CODE_FOR_mrotli, "__MROTLI", FRV_BUILTIN_MROTLI, 0, 0 },
9440 { CODE_FOR_mrotri, "__MROTRI", FRV_BUILTIN_MROTRI, 0, 0 },
9441 { CODE_FOR_msllhi, "__MSLLHI", FRV_BUILTIN_MSLLHI, 0, 0 },
9442 { CODE_FOR_msrlhi, "__MSRLHI", FRV_BUILTIN_MSRLHI, 0, 0 },
9443 { CODE_FOR_msrahi, "__MSRAHI", FRV_BUILTIN_MSRAHI, 0, 0 },
9444 { CODE_FOR_mexpdhw, "__MEXPDHW", FRV_BUILTIN_MEXPDHW, 0, 0 },
9445 { CODE_FOR_mexpdhd, "__MEXPDHD", FRV_BUILTIN_MEXPDHD, 0, 0 },
9446 { CODE_FOR_mdrotli, "__MDROTLI", FRV_BUILTIN_MDROTLI, 0, 0 },
9447 { CODE_FOR_mcplhi, "__MCPLHI", FRV_BUILTIN_MCPLHI, 0, 0 },
9448 { CODE_FOR_mcpli, "__MCPLI", FRV_BUILTIN_MCPLI, 0, 0 },
9449 { CODE_FOR_mhsetlos, "__MHSETLOS", FRV_BUILTIN_MHSETLOS, 0, 0 },
9450 { CODE_FOR_mhsetloh, "__MHSETLOH", FRV_BUILTIN_MHSETLOH, 0, 0 },
9451 { CODE_FOR_mhsethis, "__MHSETHIS", FRV_BUILTIN_MHSETHIS, 0, 0 },
9452 { CODE_FOR_mhsethih, "__MHSETHIH", FRV_BUILTIN_MHSETHIH, 0, 0 },
9453 { CODE_FOR_mhdseth, "__MHDSETH", FRV_BUILTIN_MHDSETH, 0, 0 },
9454 { CODE_FOR_mqsllhi, "__MQSLLHI", FRV_BUILTIN_MQSLLHI, 0, 0 },
9455 { CODE_FOR_mqsrahi, "__MQSRAHI", FRV_BUILTIN_MQSRAHI, 0, 0 }
9456 };
9457
9458 /* Media intrinsics that take two arguments and return void, the first argument
9459 being a pointer to 4 words in memory. */
9460
9461 static struct builtin_description bdesc_void2arg[] =
9462 {
9463 { CODE_FOR_mdunpackh, "__MDUNPACKH", FRV_BUILTIN_MDUNPACKH, 0, 0 },
9464 { CODE_FOR_mbtohe, "__MBTOHE", FRV_BUILTIN_MBTOHE, 0, 0 },
9465 };
9466
9467 /* Media intrinsics that take three arguments, the first being a const_int that
9468 denotes an accumulator, and that return void. */
9469
9470 static struct builtin_description bdesc_void3arg[] =
9471 {
9472 { CODE_FOR_mcpxrs, "__MCPXRS", FRV_BUILTIN_MCPXRS, 0, 0 },
9473 { CODE_FOR_mcpxru, "__MCPXRU", FRV_BUILTIN_MCPXRU, 0, 0 },
9474 { CODE_FOR_mcpxis, "__MCPXIS", FRV_BUILTIN_MCPXIS, 0, 0 },
9475 { CODE_FOR_mcpxiu, "__MCPXIU", FRV_BUILTIN_MCPXIU, 0, 0 },
9476 { CODE_FOR_mmulhs, "__MMULHS", FRV_BUILTIN_MMULHS, 0, 0 },
9477 { CODE_FOR_mmulhu, "__MMULHU", FRV_BUILTIN_MMULHU, 0, 0 },
9478 { CODE_FOR_mmulxhs, "__MMULXHS", FRV_BUILTIN_MMULXHS, 0, 0 },
9479 { CODE_FOR_mmulxhu, "__MMULXHU", FRV_BUILTIN_MMULXHU, 0, 0 },
9480 { CODE_FOR_mmachs, "__MMACHS", FRV_BUILTIN_MMACHS, 0, 0 },
9481 { CODE_FOR_mmachu, "__MMACHU", FRV_BUILTIN_MMACHU, 0, 0 },
9482 { CODE_FOR_mmrdhs, "__MMRDHS", FRV_BUILTIN_MMRDHS, 0, 0 },
9483 { CODE_FOR_mmrdhu, "__MMRDHU", FRV_BUILTIN_MMRDHU, 0, 0 },
9484 { CODE_FOR_mqcpxrs, "__MQCPXRS", FRV_BUILTIN_MQCPXRS, 0, 0 },
9485 { CODE_FOR_mqcpxru, "__MQCPXRU", FRV_BUILTIN_MQCPXRU, 0, 0 },
9486 { CODE_FOR_mqcpxis, "__MQCPXIS", FRV_BUILTIN_MQCPXIS, 0, 0 },
9487 { CODE_FOR_mqcpxiu, "__MQCPXIU", FRV_BUILTIN_MQCPXIU, 0, 0 },
9488 { CODE_FOR_mqmulhs, "__MQMULHS", FRV_BUILTIN_MQMULHS, 0, 0 },
9489 { CODE_FOR_mqmulhu, "__MQMULHU", FRV_BUILTIN_MQMULHU, 0, 0 },
9490 { CODE_FOR_mqmulxhs, "__MQMULXHS", FRV_BUILTIN_MQMULXHS, 0, 0 },
9491 { CODE_FOR_mqmulxhu, "__MQMULXHU", FRV_BUILTIN_MQMULXHU, 0, 0 },
9492 { CODE_FOR_mqmachs, "__MQMACHS", FRV_BUILTIN_MQMACHS, 0, 0 },
9493 { CODE_FOR_mqmachu, "__MQMACHU", FRV_BUILTIN_MQMACHU, 0, 0 },
9494 { CODE_FOR_mqxmachs, "__MQXMACHS", FRV_BUILTIN_MQXMACHS, 0, 0 },
9495 { CODE_FOR_mqxmacxhs, "__MQXMACXHS", FRV_BUILTIN_MQXMACXHS, 0, 0 },
9496 { CODE_FOR_mqmacxhs, "__MQMACXHS", FRV_BUILTIN_MQMACXHS, 0, 0 }
9497 };
9498
9499 /* Media intrinsics that take two accumulator numbers as argument and
9500 return void. */
9501
9502 static struct builtin_description bdesc_voidacc[] =
9503 {
9504 { CODE_FOR_maddaccs, "__MADDACCS", FRV_BUILTIN_MADDACCS, 0, 0 },
9505 { CODE_FOR_msubaccs, "__MSUBACCS", FRV_BUILTIN_MSUBACCS, 0, 0 },
9506 { CODE_FOR_masaccs, "__MASACCS", FRV_BUILTIN_MASACCS, 0, 0 },
9507 { CODE_FOR_mdaddaccs, "__MDADDACCS", FRV_BUILTIN_MDADDACCS, 0, 0 },
9508 { CODE_FOR_mdsubaccs, "__MDSUBACCS", FRV_BUILTIN_MDSUBACCS, 0, 0 },
9509 { CODE_FOR_mdasaccs, "__MDASACCS", FRV_BUILTIN_MDASACCS, 0, 0 }
9510 };
9511
9512 /* Initialize media builtins. */
9513
9514 static void
9515 frv_init_builtins (void)
9516 {
9517 tree endlink = void_list_node;
9518 tree accumulator = integer_type_node;
9519 tree integer = integer_type_node;
9520 tree voidt = void_type_node;
9521 tree uhalf = short_unsigned_type_node;
9522 tree sword1 = long_integer_type_node;
9523 tree uword1 = long_unsigned_type_node;
9524 tree sword2 = long_long_integer_type_node;
9525 tree uword2 = long_long_unsigned_type_node;
9526 tree uword4 = build_pointer_type (uword1);
9527 tree iacc = integer_type_node;
9528
9529 #define UNARY(RET, T1) \
9530 build_function_type (RET, tree_cons (NULL_TREE, T1, endlink))
9531
9532 #define BINARY(RET, T1, T2) \
9533 build_function_type (RET, tree_cons (NULL_TREE, T1, \
9534 tree_cons (NULL_TREE, T2, endlink)))
9535
9536 #define TRINARY(RET, T1, T2, T3) \
9537 build_function_type (RET, tree_cons (NULL_TREE, T1, \
9538 tree_cons (NULL_TREE, T2, \
9539 tree_cons (NULL_TREE, T3, endlink))))
9540
9541 #define QUAD(RET, T1, T2, T3, T4) \
9542 build_function_type (RET, tree_cons (NULL_TREE, T1, \
9543 tree_cons (NULL_TREE, T2, \
9544 tree_cons (NULL_TREE, T3, \
9545 tree_cons (NULL_TREE, T4, endlink)))))
9546
9547 tree void_ftype_void = build_function_type (voidt, endlink);
9548
9549 tree void_ftype_acc = UNARY (voidt, accumulator);
9550 tree void_ftype_uw4_uw1 = BINARY (voidt, uword4, uword1);
9551 tree void_ftype_uw4_uw2 = BINARY (voidt, uword4, uword2);
9552 tree void_ftype_acc_uw1 = BINARY (voidt, accumulator, uword1);
9553 tree void_ftype_acc_acc = BINARY (voidt, accumulator, accumulator);
9554 tree void_ftype_acc_uw1_uw1 = TRINARY (voidt, accumulator, uword1, uword1);
9555 tree void_ftype_acc_sw1_sw1 = TRINARY (voidt, accumulator, sword1, sword1);
9556 tree void_ftype_acc_uw2_uw2 = TRINARY (voidt, accumulator, uword2, uword2);
9557 tree void_ftype_acc_sw2_sw2 = TRINARY (voidt, accumulator, sword2, sword2);
9558
9559 tree uw1_ftype_uw1 = UNARY (uword1, uword1);
9560 tree uw1_ftype_sw1 = UNARY (uword1, sword1);
9561 tree uw1_ftype_uw2 = UNARY (uword1, uword2);
9562 tree uw1_ftype_acc = UNARY (uword1, accumulator);
9563 tree uw1_ftype_uh_uh = BINARY (uword1, uhalf, uhalf);
9564 tree uw1_ftype_uw1_uw1 = BINARY (uword1, uword1, uword1);
9565 tree uw1_ftype_uw1_int = BINARY (uword1, uword1, integer);
9566 tree uw1_ftype_acc_uw1 = BINARY (uword1, accumulator, uword1);
9567 tree uw1_ftype_acc_sw1 = BINARY (uword1, accumulator, sword1);
9568 tree uw1_ftype_uw2_uw1 = BINARY (uword1, uword2, uword1);
9569 tree uw1_ftype_uw2_int = BINARY (uword1, uword2, integer);
9570
9571 tree sw1_ftype_int = UNARY (sword1, integer);
9572 tree sw1_ftype_sw1_sw1 = BINARY (sword1, sword1, sword1);
9573 tree sw1_ftype_sw1_int = BINARY (sword1, sword1, integer);
9574
9575 tree uw2_ftype_uw1 = UNARY (uword2, uword1);
9576 tree uw2_ftype_uw1_int = BINARY (uword2, uword1, integer);
9577 tree uw2_ftype_uw2_uw2 = BINARY (uword2, uword2, uword2);
9578 tree uw2_ftype_uw2_int = BINARY (uword2, uword2, integer);
9579 tree uw2_ftype_acc_int = BINARY (uword2, accumulator, integer);
9580 tree uw2_ftype_uh_uh_uh_uh = QUAD (uword2, uhalf, uhalf, uhalf, uhalf);
9581
9582 tree sw2_ftype_sw2_sw2 = BINARY (sword2, sword2, sword2);
9583 tree sw2_ftype_sw2_int = BINARY (sword2, sword2, integer);
9584 tree uw2_ftype_uw1_uw1 = BINARY (uword2, uword1, uword1);
9585 tree sw2_ftype_sw1_sw1 = BINARY (sword2, sword1, sword1);
9586 tree void_ftype_sw1_sw1 = BINARY (voidt, sword1, sword1);
9587 tree void_ftype_iacc_sw2 = BINARY (voidt, iacc, sword2);
9588 tree void_ftype_iacc_sw1 = BINARY (voidt, iacc, sword1);
9589 tree sw1_ftype_sw1 = UNARY (sword1, sword1);
9590 tree sw2_ftype_iacc = UNARY (sword2, iacc);
9591 tree sw1_ftype_iacc = UNARY (sword1, iacc);
9592 tree void_ftype_ptr = UNARY (voidt, const_ptr_type_node);
9593
9594 def_builtin ("__MAND", uw1_ftype_uw1_uw1, FRV_BUILTIN_MAND);
9595 def_builtin ("__MOR", uw1_ftype_uw1_uw1, FRV_BUILTIN_MOR);
9596 def_builtin ("__MXOR", uw1_ftype_uw1_uw1, FRV_BUILTIN_MXOR);
9597 def_builtin ("__MNOT", uw1_ftype_uw1, FRV_BUILTIN_MNOT);
9598 def_builtin ("__MROTLI", uw1_ftype_uw1_int, FRV_BUILTIN_MROTLI);
9599 def_builtin ("__MROTRI", uw1_ftype_uw1_int, FRV_BUILTIN_MROTRI);
9600 def_builtin ("__MWCUT", uw1_ftype_uw2_uw1, FRV_BUILTIN_MWCUT);
9601 def_builtin ("__MAVEH", uw1_ftype_uw1_uw1, FRV_BUILTIN_MAVEH);
9602 def_builtin ("__MSLLHI", uw1_ftype_uw1_int, FRV_BUILTIN_MSLLHI);
9603 def_builtin ("__MSRLHI", uw1_ftype_uw1_int, FRV_BUILTIN_MSRLHI);
9604 def_builtin ("__MSRAHI", sw1_ftype_sw1_int, FRV_BUILTIN_MSRAHI);
9605 def_builtin ("__MSATHS", sw1_ftype_sw1_sw1, FRV_BUILTIN_MSATHS);
9606 def_builtin ("__MSATHU", uw1_ftype_uw1_uw1, FRV_BUILTIN_MSATHU);
9607 def_builtin ("__MADDHSS", sw1_ftype_sw1_sw1, FRV_BUILTIN_MADDHSS);
9608 def_builtin ("__MADDHUS", uw1_ftype_uw1_uw1, FRV_BUILTIN_MADDHUS);
9609 def_builtin ("__MSUBHSS", sw1_ftype_sw1_sw1, FRV_BUILTIN_MSUBHSS);
9610 def_builtin ("__MSUBHUS", uw1_ftype_uw1_uw1, FRV_BUILTIN_MSUBHUS);
9611 def_builtin ("__MMULHS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MMULHS);
9612 def_builtin ("__MMULHU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MMULHU);
9613 def_builtin ("__MMULXHS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MMULXHS);
9614 def_builtin ("__MMULXHU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MMULXHU);
9615 def_builtin ("__MMACHS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MMACHS);
9616 def_builtin ("__MMACHU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MMACHU);
9617 def_builtin ("__MMRDHS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MMRDHS);
9618 def_builtin ("__MMRDHU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MMRDHU);
9619 def_builtin ("__MQADDHSS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQADDHSS);
9620 def_builtin ("__MQADDHUS", uw2_ftype_uw2_uw2, FRV_BUILTIN_MQADDHUS);
9621 def_builtin ("__MQSUBHSS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQSUBHSS);
9622 def_builtin ("__MQSUBHUS", uw2_ftype_uw2_uw2, FRV_BUILTIN_MQSUBHUS);
9623 def_builtin ("__MQMULHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQMULHS);
9624 def_builtin ("__MQMULHU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQMULHU);
9625 def_builtin ("__MQMULXHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQMULXHS);
9626 def_builtin ("__MQMULXHU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQMULXHU);
9627 def_builtin ("__MQMACHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQMACHS);
9628 def_builtin ("__MQMACHU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQMACHU);
9629 def_builtin ("__MCPXRS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MCPXRS);
9630 def_builtin ("__MCPXRU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MCPXRU);
9631 def_builtin ("__MCPXIS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MCPXIS);
9632 def_builtin ("__MCPXIU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MCPXIU);
9633 def_builtin ("__MQCPXRS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQCPXRS);
9634 def_builtin ("__MQCPXRU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQCPXRU);
9635 def_builtin ("__MQCPXIS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQCPXIS);
9636 def_builtin ("__MQCPXIU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQCPXIU);
9637 def_builtin ("__MCUT", uw1_ftype_acc_uw1, FRV_BUILTIN_MCUT);
9638 def_builtin ("__MCUTSS", uw1_ftype_acc_sw1, FRV_BUILTIN_MCUTSS);
9639 def_builtin ("__MEXPDHW", uw1_ftype_uw1_int, FRV_BUILTIN_MEXPDHW);
9640 def_builtin ("__MEXPDHD", uw2_ftype_uw1_int, FRV_BUILTIN_MEXPDHD);
9641 def_builtin ("__MPACKH", uw1_ftype_uh_uh, FRV_BUILTIN_MPACKH);
9642 def_builtin ("__MUNPACKH", uw2_ftype_uw1, FRV_BUILTIN_MUNPACKH);
9643 def_builtin ("__MDPACKH", uw2_ftype_uh_uh_uh_uh, FRV_BUILTIN_MDPACKH);
9644 def_builtin ("__MDUNPACKH", void_ftype_uw4_uw2, FRV_BUILTIN_MDUNPACKH);
9645 def_builtin ("__MBTOH", uw2_ftype_uw1, FRV_BUILTIN_MBTOH);
9646 def_builtin ("__MHTOB", uw1_ftype_uw2, FRV_BUILTIN_MHTOB);
9647 def_builtin ("__MBTOHE", void_ftype_uw4_uw1, FRV_BUILTIN_MBTOHE);
9648 def_builtin ("__MCLRACC", void_ftype_acc, FRV_BUILTIN_MCLRACC);
9649 def_builtin ("__MCLRACCA", void_ftype_void, FRV_BUILTIN_MCLRACCA);
9650 def_builtin ("__MRDACC", uw1_ftype_acc, FRV_BUILTIN_MRDACC);
9651 def_builtin ("__MRDACCG", uw1_ftype_acc, FRV_BUILTIN_MRDACCG);
9652 def_builtin ("__MWTACC", void_ftype_acc_uw1, FRV_BUILTIN_MWTACC);
9653 def_builtin ("__MWTACCG", void_ftype_acc_uw1, FRV_BUILTIN_MWTACCG);
9654 def_builtin ("__Mcop1", uw1_ftype_uw1_uw1, FRV_BUILTIN_MCOP1);
9655 def_builtin ("__Mcop2", uw1_ftype_uw1_uw1, FRV_BUILTIN_MCOP2);
9656 def_builtin ("__MTRAP", void_ftype_void, FRV_BUILTIN_MTRAP);
9657 def_builtin ("__MQXMACHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQXMACHS);
9658 def_builtin ("__MQXMACXHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQXMACXHS);
9659 def_builtin ("__MQMACXHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQMACXHS);
9660 def_builtin ("__MADDACCS", void_ftype_acc_acc, FRV_BUILTIN_MADDACCS);
9661 def_builtin ("__MSUBACCS", void_ftype_acc_acc, FRV_BUILTIN_MSUBACCS);
9662 def_builtin ("__MASACCS", void_ftype_acc_acc, FRV_BUILTIN_MASACCS);
9663 def_builtin ("__MDADDACCS", void_ftype_acc_acc, FRV_BUILTIN_MDADDACCS);
9664 def_builtin ("__MDSUBACCS", void_ftype_acc_acc, FRV_BUILTIN_MDSUBACCS);
9665 def_builtin ("__MDASACCS", void_ftype_acc_acc, FRV_BUILTIN_MDASACCS);
9666 def_builtin ("__MABSHS", uw1_ftype_sw1, FRV_BUILTIN_MABSHS);
9667 def_builtin ("__MDROTLI", uw2_ftype_uw2_int, FRV_BUILTIN_MDROTLI);
9668 def_builtin ("__MCPLHI", uw1_ftype_uw2_int, FRV_BUILTIN_MCPLHI);
9669 def_builtin ("__MCPLI", uw1_ftype_uw2_int, FRV_BUILTIN_MCPLI);
9670 def_builtin ("__MDCUTSSI", uw2_ftype_acc_int, FRV_BUILTIN_MDCUTSSI);
9671 def_builtin ("__MQSATHS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQSATHS);
9672 def_builtin ("__MHSETLOS", sw1_ftype_sw1_int, FRV_BUILTIN_MHSETLOS);
9673 def_builtin ("__MHSETHIS", sw1_ftype_sw1_int, FRV_BUILTIN_MHSETHIS);
9674 def_builtin ("__MHDSETS", sw1_ftype_int, FRV_BUILTIN_MHDSETS);
9675 def_builtin ("__MHSETLOH", uw1_ftype_uw1_int, FRV_BUILTIN_MHSETLOH);
9676 def_builtin ("__MHSETHIH", uw1_ftype_uw1_int, FRV_BUILTIN_MHSETHIH);
9677 def_builtin ("__MHDSETH", uw1_ftype_uw1_int, FRV_BUILTIN_MHDSETH);
9678 def_builtin ("__MQLCLRHS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQLCLRHS);
9679 def_builtin ("__MQLMTHS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQLMTHS);
9680 def_builtin ("__MQSLLHI", uw2_ftype_uw2_int, FRV_BUILTIN_MQSLLHI);
9681 def_builtin ("__MQSRAHI", sw2_ftype_sw2_int, FRV_BUILTIN_MQSRAHI);
9682 def_builtin ("__SMUL", sw2_ftype_sw1_sw1, FRV_BUILTIN_SMUL);
9683 def_builtin ("__UMUL", uw2_ftype_uw1_uw1, FRV_BUILTIN_UMUL);
9684 def_builtin ("__SMASS", void_ftype_sw1_sw1, FRV_BUILTIN_SMASS);
9685 def_builtin ("__SMSSS", void_ftype_sw1_sw1, FRV_BUILTIN_SMSSS);
9686 def_builtin ("__SMU", void_ftype_sw1_sw1, FRV_BUILTIN_SMU);
9687 def_builtin ("__ADDSS", sw1_ftype_sw1_sw1, FRV_BUILTIN_ADDSS);
9688 def_builtin ("__SUBSS", sw1_ftype_sw1_sw1, FRV_BUILTIN_SUBSS);
9689 def_builtin ("__SLASS", sw1_ftype_sw1_sw1, FRV_BUILTIN_SLASS);
9690 def_builtin ("__SCAN", sw1_ftype_sw1_sw1, FRV_BUILTIN_SCAN);
9691 def_builtin ("__SCUTSS", sw1_ftype_sw1, FRV_BUILTIN_SCUTSS);
9692 def_builtin ("__IACCreadll", sw2_ftype_iacc, FRV_BUILTIN_IACCreadll);
9693 def_builtin ("__IACCreadl", sw1_ftype_iacc, FRV_BUILTIN_IACCreadl);
9694 def_builtin ("__IACCsetll", void_ftype_iacc_sw2, FRV_BUILTIN_IACCsetll);
9695 def_builtin ("__IACCsetl", void_ftype_iacc_sw1, FRV_BUILTIN_IACCsetl);
9696 def_builtin ("__data_prefetch0", void_ftype_ptr, FRV_BUILTIN_PREFETCH0);
9697 def_builtin ("__data_prefetch", void_ftype_ptr, FRV_BUILTIN_PREFETCH);
9698
9699 #undef UNARY
9700 #undef BINARY
9701 #undef TRINARY
9702 #undef QUAD
9703 }
9704
9705 /* Set the names for various arithmetic operations according to the
9706 FRV ABI. */
9707 static void
9708 frv_init_libfuncs (void)
9709 {
9710 set_optab_libfunc (smod_optab, SImode, "__modi");
9711 set_optab_libfunc (umod_optab, SImode, "__umodi");
9712
9713 set_optab_libfunc (add_optab, DImode, "__addll");
9714 set_optab_libfunc (sub_optab, DImode, "__subll");
9715 set_optab_libfunc (smul_optab, DImode, "__mulll");
9716 set_optab_libfunc (sdiv_optab, DImode, "__divll");
9717 set_optab_libfunc (smod_optab, DImode, "__modll");
9718 set_optab_libfunc (umod_optab, DImode, "__umodll");
9719 set_optab_libfunc (and_optab, DImode, "__andll");
9720 set_optab_libfunc (ior_optab, DImode, "__orll");
9721 set_optab_libfunc (xor_optab, DImode, "__xorll");
9722 set_optab_libfunc (one_cmpl_optab, DImode, "__notll");
9723
9724 set_optab_libfunc (add_optab, SFmode, "__addf");
9725 set_optab_libfunc (sub_optab, SFmode, "__subf");
9726 set_optab_libfunc (smul_optab, SFmode, "__mulf");
9727 set_optab_libfunc (sdiv_optab, SFmode, "__divf");
9728
9729 set_optab_libfunc (add_optab, DFmode, "__addd");
9730 set_optab_libfunc (sub_optab, DFmode, "__subd");
9731 set_optab_libfunc (smul_optab, DFmode, "__muld");
9732 set_optab_libfunc (sdiv_optab, DFmode, "__divd");
9733
9734 set_conv_libfunc (sext_optab, DFmode, SFmode, "__ftod");
9735 set_conv_libfunc (trunc_optab, SFmode, DFmode, "__dtof");
9736
9737 set_conv_libfunc (sfix_optab, SImode, SFmode, "__ftoi");
9738 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftoll");
9739 set_conv_libfunc (sfix_optab, SImode, DFmode, "__dtoi");
9740 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtoll");
9741
9742 set_conv_libfunc (ufix_optab, SImode, SFmode, "__ftoui");
9743 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoull");
9744 set_conv_libfunc (ufix_optab, SImode, DFmode, "__dtoui");
9745 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoull");
9746
9747 set_conv_libfunc (sfloat_optab, SFmode, SImode, "__itof");
9748 set_conv_libfunc (sfloat_optab, SFmode, DImode, "__lltof");
9749 set_conv_libfunc (sfloat_optab, DFmode, SImode, "__itod");
9750 set_conv_libfunc (sfloat_optab, DFmode, DImode, "__lltod");
9751 }
9752
9753 /* Convert an integer constant to an accumulator register. ICODE is the
9754 code of the target instruction, OPNUM is the number of the
9755 accumulator operand and OPVAL is the constant integer. Try both
9756 ACC and ACCG registers; only report an error if neither fit the
9757 instruction. */
9758
9759 static rtx
9760 frv_int_to_acc (enum insn_code icode, int opnum, rtx opval)
9761 {
9762 rtx reg;
9763 int i;
9764
9765 /* ACCs and ACCGs are implicity global registers if media intrinsics
9766 are being used. We set up this lazily to avoid creating lots of
9767 unnecessary call_insn rtl in non-media code. */
9768 for (i = 0; i <= ACC_MASK; i++)
9769 if ((i & ACC_MASK) == i)
9770 global_regs[i + ACC_FIRST] = global_regs[i + ACCG_FIRST] = 1;
9771
9772 if (GET_CODE (opval) != CONST_INT)
9773 {
9774 error ("accumulator is not a constant integer");
9775 return NULL_RTX;
9776 }
9777 if ((INTVAL (opval) & ~ACC_MASK) != 0)
9778 {
9779 error ("accumulator number is out of bounds");
9780 return NULL_RTX;
9781 }
9782
9783 reg = gen_rtx_REG (insn_data[icode].operand[opnum].mode,
9784 ACC_FIRST + INTVAL (opval));
9785 if (! (*insn_data[icode].operand[opnum].predicate) (reg, VOIDmode))
9786 REGNO (reg) = ACCG_FIRST + INTVAL (opval);
9787
9788 if (! (*insn_data[icode].operand[opnum].predicate) (reg, VOIDmode))
9789 {
9790 error ("inappropriate accumulator for %qs", insn_data[icode].name);
9791 return NULL_RTX;
9792 }
9793 return reg;
9794 }
9795
9796 /* If an ACC rtx has mode MODE, return the mode that the matching ACCG
9797 should have. */
9798
9799 static enum machine_mode
9800 frv_matching_accg_mode (enum machine_mode mode)
9801 {
9802 switch (mode)
9803 {
9804 case V4SImode:
9805 return V4QImode;
9806
9807 case DImode:
9808 return HImode;
9809
9810 case SImode:
9811 return QImode;
9812
9813 default:
9814 abort ();
9815 }
9816 }
9817
9818 /* Return the accumulator guard that should be paired with accumulator
9819 register ACC. The mode of the returned register is in the same
9820 class as ACC, but is four times smaller. */
9821
9822 rtx
9823 frv_matching_accg_for_acc (rtx acc)
9824 {
9825 return gen_rtx_REG (frv_matching_accg_mode (GET_MODE (acc)),
9826 REGNO (acc) - ACC_FIRST + ACCG_FIRST);
9827 }
9828
9829 /* Read a value from the head of the tree list pointed to by ARGLISTPTR.
9830 Return the value as an rtx and replace *ARGLISTPTR with the tail of the
9831 list. */
9832
9833 static rtx
9834 frv_read_argument (tree *arglistptr)
9835 {
9836 tree next = TREE_VALUE (*arglistptr);
9837 *arglistptr = TREE_CHAIN (*arglistptr);
9838 return expand_expr (next, NULL_RTX, VOIDmode, 0);
9839 }
9840
9841 /* Like frv_read_argument, but interpret the argument as the number
9842 of an IACC register and return a (reg:MODE ...) rtx for it. */
9843
9844 static rtx
9845 frv_read_iacc_argument (enum machine_mode mode, tree *arglistptr)
9846 {
9847 int i, regno;
9848 rtx op;
9849
9850 op = frv_read_argument (arglistptr);
9851 if (GET_CODE (op) != CONST_INT
9852 || INTVAL (op) < 0
9853 || INTVAL (op) > IACC_LAST - IACC_FIRST
9854 || ((INTVAL (op) * 4) & (GET_MODE_SIZE (mode) - 1)) != 0)
9855 {
9856 error ("invalid IACC argument");
9857 op = const0_rtx;
9858 }
9859
9860 /* IACCs are implicity global registers. We set up this lazily to
9861 avoid creating lots of unnecessary call_insn rtl when IACCs aren't
9862 being used. */
9863 regno = INTVAL (op) + IACC_FIRST;
9864 for (i = 0; i < HARD_REGNO_NREGS (regno, mode); i++)
9865 global_regs[regno + i] = 1;
9866
9867 return gen_rtx_REG (mode, regno);
9868 }
9869
9870 /* Return true if OPVAL can be used for operand OPNUM of instruction ICODE.
9871 The instruction should require a constant operand of some sort. The
9872 function prints an error if OPVAL is not valid. */
9873
9874 static int
9875 frv_check_constant_argument (enum insn_code icode, int opnum, rtx opval)
9876 {
9877 if (GET_CODE (opval) != CONST_INT)
9878 {
9879 error ("%qs expects a constant argument", insn_data[icode].name);
9880 return FALSE;
9881 }
9882 if (! (*insn_data[icode].operand[opnum].predicate) (opval, VOIDmode))
9883 {
9884 error ("constant argument out of range for %qs", insn_data[icode].name);
9885 return FALSE;
9886 }
9887 return TRUE;
9888 }
9889
9890 /* Return a legitimate rtx for instruction ICODE's return value. Use TARGET
9891 if it's not null, has the right mode, and satisfies operand 0's
9892 predicate. */
9893
9894 static rtx
9895 frv_legitimize_target (enum insn_code icode, rtx target)
9896 {
9897 enum machine_mode mode = insn_data[icode].operand[0].mode;
9898
9899 if (! target
9900 || GET_MODE (target) != mode
9901 || ! (*insn_data[icode].operand[0].predicate) (target, mode))
9902 return gen_reg_rtx (mode);
9903 else
9904 return target;
9905 }
9906
9907 /* Given that ARG is being passed as operand OPNUM to instruction ICODE,
9908 check whether ARG satisfies the operand's constraints. If it doesn't,
9909 copy ARG to a temporary register and return that. Otherwise return ARG
9910 itself. */
9911
9912 static rtx
9913 frv_legitimize_argument (enum insn_code icode, int opnum, rtx arg)
9914 {
9915 enum machine_mode mode = insn_data[icode].operand[opnum].mode;
9916
9917 if ((*insn_data[icode].operand[opnum].predicate) (arg, mode))
9918 return arg;
9919 else
9920 return copy_to_mode_reg (mode, arg);
9921 }
9922
9923 /* Expand builtins that take a single, constant argument. At the moment,
9924 only MHDSETS falls into this category. */
9925
9926 static rtx
9927 frv_expand_set_builtin (enum insn_code icode, tree arglist, rtx target)
9928 {
9929 rtx pat;
9930 rtx op0 = frv_read_argument (&arglist);
9931
9932 if (! frv_check_constant_argument (icode, 1, op0))
9933 return NULL_RTX;
9934
9935 target = frv_legitimize_target (icode, target);
9936 pat = GEN_FCN (icode) (target, op0);
9937 if (! pat)
9938 return NULL_RTX;
9939
9940 emit_insn (pat);
9941 return target;
9942 }
9943
9944 /* Expand builtins that take one operand. */
9945
9946 static rtx
9947 frv_expand_unop_builtin (enum insn_code icode, tree arglist, rtx target)
9948 {
9949 rtx pat;
9950 rtx op0 = frv_read_argument (&arglist);
9951
9952 target = frv_legitimize_target (icode, target);
9953 op0 = frv_legitimize_argument (icode, 1, op0);
9954 pat = GEN_FCN (icode) (target, op0);
9955 if (! pat)
9956 return NULL_RTX;
9957
9958 emit_insn (pat);
9959 return target;
9960 }
9961
9962 /* Expand builtins that take two operands. */
9963
9964 static rtx
9965 frv_expand_binop_builtin (enum insn_code icode, tree arglist, rtx target)
9966 {
9967 rtx pat;
9968 rtx op0 = frv_read_argument (&arglist);
9969 rtx op1 = frv_read_argument (&arglist);
9970
9971 target = frv_legitimize_target (icode, target);
9972 op0 = frv_legitimize_argument (icode, 1, op0);
9973 op1 = frv_legitimize_argument (icode, 2, op1);
9974 pat = GEN_FCN (icode) (target, op0, op1);
9975 if (! pat)
9976 return NULL_RTX;
9977
9978 emit_insn (pat);
9979 return target;
9980 }
9981
9982 /* Expand cut-style builtins, which take two operands and an implicit ACCG
9983 one. */
9984
9985 static rtx
9986 frv_expand_cut_builtin (enum insn_code icode, tree arglist, rtx target)
9987 {
9988 rtx pat;
9989 rtx op0 = frv_read_argument (&arglist);
9990 rtx op1 = frv_read_argument (&arglist);
9991 rtx op2;
9992
9993 target = frv_legitimize_target (icode, target);
9994 op0 = frv_int_to_acc (icode, 1, op0);
9995 if (! op0)
9996 return NULL_RTX;
9997
9998 if (icode == CODE_FOR_mdcutssi || GET_CODE (op1) == CONST_INT)
9999 {
10000 if (! frv_check_constant_argument (icode, 2, op1))
10001 return NULL_RTX;
10002 }
10003 else
10004 op1 = frv_legitimize_argument (icode, 2, op1);
10005
10006 op2 = frv_matching_accg_for_acc (op0);
10007 pat = GEN_FCN (icode) (target, op0, op1, op2);
10008 if (! pat)
10009 return NULL_RTX;
10010
10011 emit_insn (pat);
10012 return target;
10013 }
10014
10015 /* Expand builtins that take two operands and the second is immediate. */
10016
10017 static rtx
10018 frv_expand_binopimm_builtin (enum insn_code icode, tree arglist, rtx target)
10019 {
10020 rtx pat;
10021 rtx op0 = frv_read_argument (&arglist);
10022 rtx op1 = frv_read_argument (&arglist);
10023
10024 if (! frv_check_constant_argument (icode, 2, op1))
10025 return NULL_RTX;
10026
10027 target = frv_legitimize_target (icode, target);
10028 op0 = frv_legitimize_argument (icode, 1, op0);
10029 pat = GEN_FCN (icode) (target, op0, op1);
10030 if (! pat)
10031 return NULL_RTX;
10032
10033 emit_insn (pat);
10034 return target;
10035 }
10036
10037 /* Expand builtins that take two operands, the first operand being a pointer to
10038 ints and return void. */
10039
10040 static rtx
10041 frv_expand_voidbinop_builtin (enum insn_code icode, tree arglist)
10042 {
10043 rtx pat;
10044 rtx op0 = frv_read_argument (&arglist);
10045 rtx op1 = frv_read_argument (&arglist);
10046 enum machine_mode mode0 = insn_data[icode].operand[0].mode;
10047 rtx addr;
10048
10049 if (GET_CODE (op0) != MEM)
10050 {
10051 rtx reg = op0;
10052
10053 if (! offsettable_address_p (0, mode0, op0))
10054 {
10055 reg = gen_reg_rtx (Pmode);
10056 emit_insn (gen_rtx_SET (VOIDmode, reg, op0));
10057 }
10058
10059 op0 = gen_rtx_MEM (SImode, reg);
10060 }
10061
10062 addr = XEXP (op0, 0);
10063 if (! offsettable_address_p (0, mode0, addr))
10064 addr = copy_to_mode_reg (Pmode, op0);
10065
10066 op0 = change_address (op0, V4SImode, addr);
10067 op1 = frv_legitimize_argument (icode, 1, op1);
10068 pat = GEN_FCN (icode) (op0, op1);
10069 if (! pat)
10070 return 0;
10071
10072 emit_insn (pat);
10073 return 0;
10074 }
10075
10076 /* Expand builtins that take two long operands and return void. */
10077
10078 static rtx
10079 frv_expand_int_void2arg (enum insn_code icode, tree arglist)
10080 {
10081 rtx pat;
10082 rtx op0 = frv_read_argument (&arglist);
10083 rtx op1 = frv_read_argument (&arglist);
10084
10085 op0 = frv_legitimize_argument (icode, 1, op0);
10086 op1 = frv_legitimize_argument (icode, 1, op1);
10087 pat = GEN_FCN (icode) (op0, op1);
10088 if (! pat)
10089 return NULL_RTX;
10090
10091 emit_insn (pat);
10092 return NULL_RTX;
10093 }
10094
10095 /* Expand prefetch builtins. These take a single address as argument. */
10096
10097 static rtx
10098 frv_expand_prefetches (enum insn_code icode, tree arglist)
10099 {
10100 rtx pat;
10101 rtx op0 = frv_read_argument (&arglist);
10102
10103 pat = GEN_FCN (icode) (force_reg (Pmode, op0));
10104 if (! pat)
10105 return 0;
10106
10107 emit_insn (pat);
10108 return 0;
10109 }
10110
10111 /* Expand builtins that take three operands and return void. The first
10112 argument must be a constant that describes a pair or quad accumulators. A
10113 fourth argument is created that is the accumulator guard register that
10114 corresponds to the accumulator. */
10115
10116 static rtx
10117 frv_expand_voidtriop_builtin (enum insn_code icode, tree arglist)
10118 {
10119 rtx pat;
10120 rtx op0 = frv_read_argument (&arglist);
10121 rtx op1 = frv_read_argument (&arglist);
10122 rtx op2 = frv_read_argument (&arglist);
10123 rtx op3;
10124
10125 op0 = frv_int_to_acc (icode, 0, op0);
10126 if (! op0)
10127 return NULL_RTX;
10128
10129 op1 = frv_legitimize_argument (icode, 1, op1);
10130 op2 = frv_legitimize_argument (icode, 2, op2);
10131 op3 = frv_matching_accg_for_acc (op0);
10132 pat = GEN_FCN (icode) (op0, op1, op2, op3);
10133 if (! pat)
10134 return NULL_RTX;
10135
10136 emit_insn (pat);
10137 return NULL_RTX;
10138 }
10139
10140 /* Expand builtins that perform accumulator-to-accumulator operations.
10141 These builtins take two accumulator numbers as argument and return
10142 void. */
10143
10144 static rtx
10145 frv_expand_voidaccop_builtin (enum insn_code icode, tree arglist)
10146 {
10147 rtx pat;
10148 rtx op0 = frv_read_argument (&arglist);
10149 rtx op1 = frv_read_argument (&arglist);
10150 rtx op2;
10151 rtx op3;
10152
10153 op0 = frv_int_to_acc (icode, 0, op0);
10154 if (! op0)
10155 return NULL_RTX;
10156
10157 op1 = frv_int_to_acc (icode, 1, op1);
10158 if (! op1)
10159 return NULL_RTX;
10160
10161 op2 = frv_matching_accg_for_acc (op0);
10162 op3 = frv_matching_accg_for_acc (op1);
10163 pat = GEN_FCN (icode) (op0, op1, op2, op3);
10164 if (! pat)
10165 return NULL_RTX;
10166
10167 emit_insn (pat);
10168 return NULL_RTX;
10169 }
10170
10171 /* Expand the MDPACKH builtin. It takes four unsigned short arguments and
10172 each argument forms one word of the two double-word input registers.
10173 ARGLIST is a TREE_LIST of the arguments and TARGET, if nonnull,
10174 suggests a good place to put the return value. */
10175
10176 static rtx
10177 frv_expand_mdpackh_builtin (tree arglist, rtx target)
10178 {
10179 enum insn_code icode = CODE_FOR_mdpackh;
10180 rtx pat, op0, op1;
10181 rtx arg1 = frv_read_argument (&arglist);
10182 rtx arg2 = frv_read_argument (&arglist);
10183 rtx arg3 = frv_read_argument (&arglist);
10184 rtx arg4 = frv_read_argument (&arglist);
10185
10186 target = frv_legitimize_target (icode, target);
10187 op0 = gen_reg_rtx (DImode);
10188 op1 = gen_reg_rtx (DImode);
10189
10190 /* The high half of each word is not explicitly initialised, so indicate
10191 that the input operands are not live before this point. */
10192 emit_insn (gen_rtx_CLOBBER (DImode, op0));
10193 emit_insn (gen_rtx_CLOBBER (DImode, op1));
10194
10195 /* Move each argument into the low half of its associated input word. */
10196 emit_move_insn (simplify_gen_subreg (HImode, op0, DImode, 2), arg1);
10197 emit_move_insn (simplify_gen_subreg (HImode, op0, DImode, 6), arg2);
10198 emit_move_insn (simplify_gen_subreg (HImode, op1, DImode, 2), arg3);
10199 emit_move_insn (simplify_gen_subreg (HImode, op1, DImode, 6), arg4);
10200
10201 pat = GEN_FCN (icode) (target, op0, op1);
10202 if (! pat)
10203 return NULL_RTX;
10204
10205 emit_insn (pat);
10206 return target;
10207 }
10208
10209 /* Expand the MCLRACC builtin. This builtin takes a single accumulator
10210 number as argument. */
10211
10212 static rtx
10213 frv_expand_mclracc_builtin (tree arglist)
10214 {
10215 enum insn_code icode = CODE_FOR_mclracc;
10216 rtx pat;
10217 rtx op0 = frv_read_argument (&arglist);
10218
10219 op0 = frv_int_to_acc (icode, 0, op0);
10220 if (! op0)
10221 return NULL_RTX;
10222
10223 pat = GEN_FCN (icode) (op0);
10224 if (pat)
10225 emit_insn (pat);
10226
10227 return NULL_RTX;
10228 }
10229
10230 /* Expand builtins that take no arguments. */
10231
10232 static rtx
10233 frv_expand_noargs_builtin (enum insn_code icode)
10234 {
10235 rtx pat = GEN_FCN (icode) (const0_rtx);
10236 if (pat)
10237 emit_insn (pat);
10238
10239 return NULL_RTX;
10240 }
10241
10242 /* Expand MRDACC and MRDACCG. These builtins take a single accumulator
10243 number or accumulator guard number as argument and return an SI integer. */
10244
10245 static rtx
10246 frv_expand_mrdacc_builtin (enum insn_code icode, tree arglist)
10247 {
10248 rtx pat;
10249 rtx target = gen_reg_rtx (SImode);
10250 rtx op0 = frv_read_argument (&arglist);
10251
10252 op0 = frv_int_to_acc (icode, 1, op0);
10253 if (! op0)
10254 return NULL_RTX;
10255
10256 pat = GEN_FCN (icode) (target, op0);
10257 if (! pat)
10258 return NULL_RTX;
10259
10260 emit_insn (pat);
10261 return target;
10262 }
10263
10264 /* Expand MWTACC and MWTACCG. These builtins take an accumulator or
10265 accumulator guard as their first argument and an SImode value as their
10266 second. */
10267
10268 static rtx
10269 frv_expand_mwtacc_builtin (enum insn_code icode, tree arglist)
10270 {
10271 rtx pat;
10272 rtx op0 = frv_read_argument (&arglist);
10273 rtx op1 = frv_read_argument (&arglist);
10274
10275 op0 = frv_int_to_acc (icode, 0, op0);
10276 if (! op0)
10277 return NULL_RTX;
10278
10279 op1 = frv_legitimize_argument (icode, 1, op1);
10280 pat = GEN_FCN (icode) (op0, op1);
10281 if (pat)
10282 emit_insn (pat);
10283
10284 return NULL_RTX;
10285 }
10286
10287 /* Emit a move from SRC to DEST in SImode chunks. This can be used
10288 to move DImode values into and out of IACC0. */
10289
10290 static void
10291 frv_split_iacc_move (rtx dest, rtx src)
10292 {
10293 enum machine_mode inner;
10294 int i;
10295
10296 inner = GET_MODE (dest);
10297 for (i = 0; i < GET_MODE_SIZE (inner); i += GET_MODE_SIZE (SImode))
10298 emit_move_insn (simplify_gen_subreg (SImode, dest, inner, i),
10299 simplify_gen_subreg (SImode, src, inner, i));
10300 }
10301
10302 /* Expand builtins. */
10303
10304 static rtx
10305 frv_expand_builtin (tree exp,
10306 rtx target,
10307 rtx subtarget ATTRIBUTE_UNUSED,
10308 enum machine_mode mode ATTRIBUTE_UNUSED,
10309 int ignore ATTRIBUTE_UNUSED)
10310 {
10311 tree arglist = TREE_OPERAND (exp, 1);
10312 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
10313 unsigned fcode = (unsigned)DECL_FUNCTION_CODE (fndecl);
10314 unsigned i;
10315 struct builtin_description *d;
10316
10317 if (fcode < FRV_BUILTIN_FIRST_NONMEDIA && !TARGET_MEDIA)
10318 {
10319 error ("media functions are not available unless -mmedia is used");
10320 return NULL_RTX;
10321 }
10322
10323 switch (fcode)
10324 {
10325 case FRV_BUILTIN_MCOP1:
10326 case FRV_BUILTIN_MCOP2:
10327 case FRV_BUILTIN_MDUNPACKH:
10328 case FRV_BUILTIN_MBTOHE:
10329 if (! TARGET_MEDIA_REV1)
10330 {
10331 error ("this media function is only available on the fr500");
10332 return NULL_RTX;
10333 }
10334 break;
10335
10336 case FRV_BUILTIN_MQXMACHS:
10337 case FRV_BUILTIN_MQXMACXHS:
10338 case FRV_BUILTIN_MQMACXHS:
10339 case FRV_BUILTIN_MADDACCS:
10340 case FRV_BUILTIN_MSUBACCS:
10341 case FRV_BUILTIN_MASACCS:
10342 case FRV_BUILTIN_MDADDACCS:
10343 case FRV_BUILTIN_MDSUBACCS:
10344 case FRV_BUILTIN_MDASACCS:
10345 case FRV_BUILTIN_MABSHS:
10346 case FRV_BUILTIN_MDROTLI:
10347 case FRV_BUILTIN_MCPLHI:
10348 case FRV_BUILTIN_MCPLI:
10349 case FRV_BUILTIN_MDCUTSSI:
10350 case FRV_BUILTIN_MQSATHS:
10351 case FRV_BUILTIN_MHSETLOS:
10352 case FRV_BUILTIN_MHSETLOH:
10353 case FRV_BUILTIN_MHSETHIS:
10354 case FRV_BUILTIN_MHSETHIH:
10355 case FRV_BUILTIN_MHDSETS:
10356 case FRV_BUILTIN_MHDSETH:
10357 if (! TARGET_MEDIA_REV2)
10358 {
10359 error ("this media function is only available on the fr400"
10360 " and fr550");
10361 return NULL_RTX;
10362 }
10363 break;
10364
10365 case FRV_BUILTIN_SMASS:
10366 case FRV_BUILTIN_SMSSS:
10367 case FRV_BUILTIN_SMU:
10368 case FRV_BUILTIN_ADDSS:
10369 case FRV_BUILTIN_SUBSS:
10370 case FRV_BUILTIN_SLASS:
10371 case FRV_BUILTIN_SCUTSS:
10372 case FRV_BUILTIN_IACCreadll:
10373 case FRV_BUILTIN_IACCreadl:
10374 case FRV_BUILTIN_IACCsetll:
10375 case FRV_BUILTIN_IACCsetl:
10376 if (!TARGET_FR405_BUILTINS)
10377 {
10378 error ("this builtin function is only available"
10379 " on the fr405 and fr450");
10380 return NULL_RTX;
10381 }
10382 break;
10383
10384 case FRV_BUILTIN_PREFETCH:
10385 if (!TARGET_FR500_FR550_BUILTINS)
10386 {
10387 error ("this builtin function is only available on the fr500"
10388 " and fr550");
10389 return NULL_RTX;
10390 }
10391 break;
10392
10393 case FRV_BUILTIN_MQLCLRHS:
10394 case FRV_BUILTIN_MQLMTHS:
10395 case FRV_BUILTIN_MQSLLHI:
10396 case FRV_BUILTIN_MQSRAHI:
10397 if (!TARGET_MEDIA_FR450)
10398 {
10399 error ("this builtin function is only available on the fr450");
10400 return NULL_RTX;
10401 }
10402 break;
10403
10404 default:
10405 break;
10406 }
10407
10408 /* Expand unique builtins. */
10409
10410 switch (fcode)
10411 {
10412 case FRV_BUILTIN_MTRAP:
10413 return frv_expand_noargs_builtin (CODE_FOR_mtrap);
10414
10415 case FRV_BUILTIN_MCLRACC:
10416 return frv_expand_mclracc_builtin (arglist);
10417
10418 case FRV_BUILTIN_MCLRACCA:
10419 if (TARGET_ACC_8)
10420 return frv_expand_noargs_builtin (CODE_FOR_mclracca8);
10421 else
10422 return frv_expand_noargs_builtin (CODE_FOR_mclracca4);
10423
10424 case FRV_BUILTIN_MRDACC:
10425 return frv_expand_mrdacc_builtin (CODE_FOR_mrdacc, arglist);
10426
10427 case FRV_BUILTIN_MRDACCG:
10428 return frv_expand_mrdacc_builtin (CODE_FOR_mrdaccg, arglist);
10429
10430 case FRV_BUILTIN_MWTACC:
10431 return frv_expand_mwtacc_builtin (CODE_FOR_mwtacc, arglist);
10432
10433 case FRV_BUILTIN_MWTACCG:
10434 return frv_expand_mwtacc_builtin (CODE_FOR_mwtaccg, arglist);
10435
10436 case FRV_BUILTIN_MDPACKH:
10437 return frv_expand_mdpackh_builtin (arglist, target);
10438
10439 case FRV_BUILTIN_IACCreadll:
10440 {
10441 rtx src = frv_read_iacc_argument (DImode, &arglist);
10442 if (target == 0 || !REG_P (target))
10443 target = gen_reg_rtx (DImode);
10444 frv_split_iacc_move (target, src);
10445 return target;
10446 }
10447
10448 case FRV_BUILTIN_IACCreadl:
10449 return frv_read_iacc_argument (SImode, &arglist);
10450
10451 case FRV_BUILTIN_IACCsetll:
10452 {
10453 rtx dest = frv_read_iacc_argument (DImode, &arglist);
10454 rtx src = frv_read_argument (&arglist);
10455 frv_split_iacc_move (dest, force_reg (DImode, src));
10456 return 0;
10457 }
10458
10459 case FRV_BUILTIN_IACCsetl:
10460 {
10461 rtx dest = frv_read_iacc_argument (SImode, &arglist);
10462 rtx src = frv_read_argument (&arglist);
10463 emit_move_insn (dest, force_reg (SImode, src));
10464 return 0;
10465 }
10466
10467 default:
10468 break;
10469 }
10470
10471 /* Expand groups of builtins. */
10472
10473 for (i = 0, d = bdesc_set; i < ARRAY_SIZE (bdesc_set); i++, d++)
10474 if (d->code == fcode)
10475 return frv_expand_set_builtin (d->icode, arglist, target);
10476
10477 for (i = 0, d = bdesc_1arg; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
10478 if (d->code == fcode)
10479 return frv_expand_unop_builtin (d->icode, arglist, target);
10480
10481 for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
10482 if (d->code == fcode)
10483 return frv_expand_binop_builtin (d->icode, arglist, target);
10484
10485 for (i = 0, d = bdesc_cut; i < ARRAY_SIZE (bdesc_cut); i++, d++)
10486 if (d->code == fcode)
10487 return frv_expand_cut_builtin (d->icode, arglist, target);
10488
10489 for (i = 0, d = bdesc_2argimm; i < ARRAY_SIZE (bdesc_2argimm); i++, d++)
10490 if (d->code == fcode)
10491 return frv_expand_binopimm_builtin (d->icode, arglist, target);
10492
10493 for (i = 0, d = bdesc_void2arg; i < ARRAY_SIZE (bdesc_void2arg); i++, d++)
10494 if (d->code == fcode)
10495 return frv_expand_voidbinop_builtin (d->icode, arglist);
10496
10497 for (i = 0, d = bdesc_void3arg; i < ARRAY_SIZE (bdesc_void3arg); i++, d++)
10498 if (d->code == fcode)
10499 return frv_expand_voidtriop_builtin (d->icode, arglist);
10500
10501 for (i = 0, d = bdesc_voidacc; i < ARRAY_SIZE (bdesc_voidacc); i++, d++)
10502 if (d->code == fcode)
10503 return frv_expand_voidaccop_builtin (d->icode, arglist);
10504
10505 for (i = 0, d = bdesc_int_void2arg;
10506 i < ARRAY_SIZE (bdesc_int_void2arg); i++, d++)
10507 if (d->code == fcode)
10508 return frv_expand_int_void2arg (d->icode, arglist);
10509
10510 for (i = 0, d = bdesc_prefetches;
10511 i < ARRAY_SIZE (bdesc_prefetches); i++, d++)
10512 if (d->code == fcode)
10513 return frv_expand_prefetches (d->icode, arglist);
10514
10515 return 0;
10516 }
10517
10518 static bool
10519 frv_in_small_data_p (tree decl)
10520 {
10521 HOST_WIDE_INT size;
10522 tree section_name;
10523
10524 /* Don't apply the -G flag to internal compiler structures. We
10525 should leave such structures in the main data section, partly
10526 for efficiency and partly because the size of some of them
10527 (such as C++ typeinfos) is not known until later. */
10528 if (TREE_CODE (decl) != VAR_DECL || DECL_ARTIFICIAL (decl))
10529 return false;
10530
10531 /* If we already know which section the decl should be in, see if
10532 it's a small data section. */
10533 section_name = DECL_SECTION_NAME (decl);
10534 if (section_name)
10535 {
10536 if (TREE_CODE (section_name) != STRING_CST)
10537 abort ();
10538 if (frv_string_begins_with (section_name, ".sdata"))
10539 return true;
10540 if (frv_string_begins_with (section_name, ".sbss"))
10541 return true;
10542 return false;
10543 }
10544
10545 size = int_size_in_bytes (TREE_TYPE (decl));
10546 if (size > 0 && (unsigned HOST_WIDE_INT) size <= g_switch_value)
10547 return true;
10548
10549 return false;
10550 }
10551 \f
10552 static bool
10553 frv_rtx_costs (rtx x,
10554 int code ATTRIBUTE_UNUSED,
10555 int outer_code ATTRIBUTE_UNUSED,
10556 int *total)
10557 {
10558 if (outer_code == MEM)
10559 {
10560 /* Don't differentiate between memory addresses. All the ones
10561 we accept have equal cost. */
10562 *total = COSTS_N_INSNS (0);
10563 return true;
10564 }
10565
10566 switch (code)
10567 {
10568 case CONST_INT:
10569 /* Make 12 bit integers really cheap. */
10570 if (IN_RANGE_P (INTVAL (x), -2048, 2047))
10571 {
10572 *total = 0;
10573 return true;
10574 }
10575 /* Fall through. */
10576
10577 case CONST:
10578 case LABEL_REF:
10579 case SYMBOL_REF:
10580 case CONST_DOUBLE:
10581 *total = COSTS_N_INSNS (2);
10582 return true;
10583
10584 case PLUS:
10585 case MINUS:
10586 case AND:
10587 case IOR:
10588 case XOR:
10589 case ASHIFT:
10590 case ASHIFTRT:
10591 case LSHIFTRT:
10592 case NOT:
10593 case NEG:
10594 case COMPARE:
10595 if (GET_MODE (x) == SImode)
10596 *total = COSTS_N_INSNS (1);
10597 else if (GET_MODE (x) == DImode)
10598 *total = COSTS_N_INSNS (2);
10599 else
10600 *total = COSTS_N_INSNS (3);
10601 return true;
10602
10603 case MULT:
10604 if (GET_MODE (x) == SImode)
10605 *total = COSTS_N_INSNS (2);
10606 else
10607 *total = COSTS_N_INSNS (6); /* guess */
10608 return true;
10609
10610 case DIV:
10611 case UDIV:
10612 case MOD:
10613 case UMOD:
10614 *total = COSTS_N_INSNS (18);
10615 return true;
10616
10617 case MEM:
10618 *total = COSTS_N_INSNS (3);
10619 return true;
10620
10621 default:
10622 return false;
10623 }
10624 }
10625 \f
10626 static void
10627 frv_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
10628 {
10629 ctors_section ();
10630 assemble_align (POINTER_SIZE);
10631 if (TARGET_FDPIC)
10632 {
10633 if (!frv_assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1))
10634 abort ();
10635 return;
10636 }
10637 assemble_integer_with_op ("\t.picptr\t", symbol);
10638 }
10639
10640 static void
10641 frv_asm_out_destructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
10642 {
10643 dtors_section ();
10644 assemble_align (POINTER_SIZE);
10645 if (TARGET_FDPIC)
10646 {
10647 if (!frv_assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1))
10648 abort ();
10649 return;
10650 }
10651 assemble_integer_with_op ("\t.picptr\t", symbol);
10652 }
10653
10654 /* Worker function for TARGET_STRUCT_VALUE_RTX. */
10655
10656 static rtx
10657 frv_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
10658 int incoming ATTRIBUTE_UNUSED)
10659 {
10660 return gen_rtx_REG (Pmode, FRV_STRUCT_VALUE_REGNUM);
10661 }
10662
10663 #define TLS_BIAS (2048 - 16)
10664
10665 /* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
10666 We need to emit DTP-relative relocations. */
10667
10668 void
10669 frv_output_dwarf_dtprel (FILE *file, int size, rtx x)
10670 {
10671 if (size != 4)
10672 abort ();
10673 fputs ("\t.picptr\ttlsmoff(", file);
10674 /* We want the unbiased TLS offset, so add the bias to the
10675 expression, such that the implicit biasing cancels out. */
10676 output_addr_const (file, plus_constant (x, TLS_BIAS));
10677 fputs (")", file);
10678 }
10679
10680 #include "gt-frv.h"