Merged trunk at revision 161680 into branch.
[official-gcc.git] / gcc / config / frv / frv.c
blob9454bd25e7bd2e0ee02bdf7f31690f713ff309fc
1 /* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007,
2 2008, 2009, 2010 Free Software Foundation, Inc.
3 Contributed by Red Hat, Inc.
5 This file is part of GCC.
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 3, or (at your option)
10 any later version.
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.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "regs.h"
28 #include "hard-reg-set.h"
29 #include "insn-config.h"
30 #include "conditions.h"
31 #include "insn-flags.h"
32 #include "output.h"
33 #include "insn-attr.h"
34 #include "flags.h"
35 #include "recog.h"
36 #include "reload.h"
37 #include "expr.h"
38 #include "obstack.h"
39 #include "except.h"
40 #include "function.h"
41 #include "optabs.h"
42 #include "toplev.h"
43 #include "basic-block.h"
44 #include "tm_p.h"
45 #include "ggc.h"
46 #include <ctype.h>
47 #include "target.h"
48 #include "target-def.h"
49 #include "targhooks.h"
50 #include "integrate.h"
51 #include "langhooks.h"
52 #include "df.h"
54 #ifndef FRV_INLINE
55 #define FRV_INLINE inline
56 #endif
58 /* The maximum number of distinct NOP patterns. There are three:
59 nop, fnop and mnop. */
60 #define NUM_NOP_PATTERNS 3
62 /* Classification of instructions and units: integer, floating-point/media,
63 branch and control. */
64 enum frv_insn_group { GROUP_I, GROUP_FM, GROUP_B, GROUP_C, NUM_GROUPS };
66 /* The DFA names of the units, in packet order. */
67 static const char *const frv_unit_names[] =
69 "c",
70 "i0", "f0",
71 "i1", "f1",
72 "i2", "f2",
73 "i3", "f3",
74 "b0", "b1"
77 /* The classification of each unit in frv_unit_names[]. */
78 static const enum frv_insn_group frv_unit_groups[ARRAY_SIZE (frv_unit_names)] =
80 GROUP_C,
81 GROUP_I, GROUP_FM,
82 GROUP_I, GROUP_FM,
83 GROUP_I, GROUP_FM,
84 GROUP_I, GROUP_FM,
85 GROUP_B, GROUP_B
88 /* Return the DFA unit code associated with the Nth unit of integer
89 or floating-point group GROUP, */
90 #define NTH_UNIT(GROUP, N) frv_unit_codes[(GROUP) + (N) * 2 + 1]
92 /* Return the number of integer or floating-point unit UNIT
93 (1 for I1, 2 for F2, etc.). */
94 #define UNIT_NUMBER(UNIT) (((UNIT) - 1) / 2)
96 /* The DFA unit number for each unit in frv_unit_names[]. */
97 static int frv_unit_codes[ARRAY_SIZE (frv_unit_names)];
99 /* FRV_TYPE_TO_UNIT[T] is the last unit in frv_unit_names[] that can issue
100 an instruction of type T. The value is ARRAY_SIZE (frv_unit_names) if
101 no instruction of type T has been seen. */
102 static unsigned int frv_type_to_unit[TYPE_UNKNOWN + 1];
104 /* An array of dummy nop INSNs, one for each type of nop that the
105 target supports. */
106 static GTY(()) rtx frv_nops[NUM_NOP_PATTERNS];
108 /* The number of nop instructions in frv_nops[]. */
109 static unsigned int frv_num_nops;
111 /* Information about one __builtin_read or __builtin_write access, or
112 the combination of several such accesses. The most general value
113 is all-zeros (an unknown access to an unknown address). */
114 struct frv_io {
115 /* The type of access. FRV_IO_UNKNOWN means the access can be either
116 a read or a write. */
117 enum { FRV_IO_UNKNOWN, FRV_IO_READ, FRV_IO_WRITE } type;
119 /* The constant address being accessed, or zero if not known. */
120 HOST_WIDE_INT const_address;
122 /* The run-time address, as used in operand 0 of the membar pattern. */
123 rtx var_address;
126 /* Return true if instruction INSN should be packed with the following
127 instruction. */
128 #define PACKING_FLAG_P(INSN) (GET_MODE (INSN) == TImode)
130 /* Set the value of PACKING_FLAG_P(INSN). */
131 #define SET_PACKING_FLAG(INSN) PUT_MODE (INSN, TImode)
132 #define CLEAR_PACKING_FLAG(INSN) PUT_MODE (INSN, VOIDmode)
134 /* Loop with REG set to each hard register in rtx X. */
135 #define FOR_EACH_REGNO(REG, X) \
136 for (REG = REGNO (X); \
137 REG < REGNO (X) + HARD_REGNO_NREGS (REGNO (X), GET_MODE (X)); \
138 REG++)
140 /* This structure contains machine specific function data. */
141 struct GTY(()) machine_function
143 /* True if we have created an rtx that relies on the stack frame. */
144 int frame_needed;
146 /* True if this function contains at least one __builtin_{read,write}*. */
147 bool has_membar_p;
150 /* Temporary register allocation support structure. */
151 typedef struct frv_tmp_reg_struct
153 HARD_REG_SET regs; /* possible registers to allocate */
154 int next_reg[N_REG_CLASSES]; /* next register to allocate per class */
156 frv_tmp_reg_t;
158 /* Register state information for VLIW re-packing phase. */
159 #define REGSTATE_CC_MASK 0x07 /* Mask to isolate CCn for cond exec */
160 #define REGSTATE_MODIFIED 0x08 /* reg modified in current VLIW insn */
161 #define REGSTATE_IF_TRUE 0x10 /* reg modified in cond exec true */
162 #define REGSTATE_IF_FALSE 0x20 /* reg modified in cond exec false */
164 #define REGSTATE_IF_EITHER (REGSTATE_IF_TRUE | REGSTATE_IF_FALSE)
166 typedef unsigned char regstate_t;
168 /* Used in frv_frame_accessor_t to indicate the direction of a register-to-
169 memory move. */
170 enum frv_stack_op
172 FRV_LOAD,
173 FRV_STORE
176 /* Information required by frv_frame_access. */
177 typedef struct
179 /* This field is FRV_LOAD if registers are to be loaded from the stack and
180 FRV_STORE if they should be stored onto the stack. FRV_STORE implies
181 the move is being done by the prologue code while FRV_LOAD implies it
182 is being done by the epilogue. */
183 enum frv_stack_op op;
185 /* The base register to use when accessing the stack. This may be the
186 frame pointer, stack pointer, or a temporary. The choice of register
187 depends on which part of the frame is being accessed and how big the
188 frame is. */
189 rtx base;
191 /* The offset of BASE from the bottom of the current frame, in bytes. */
192 int base_offset;
193 } frv_frame_accessor_t;
195 /* Conditional execution support gathered together in one structure. */
196 typedef struct
198 /* Linked list of insns to add if the conditional execution conversion was
199 successful. Each link points to an EXPR_LIST which points to the pattern
200 of the insn to add, and the insn to be inserted before. */
201 rtx added_insns_list;
203 /* Identify which registers are safe to allocate for if conversions to
204 conditional execution. We keep the last allocated register in the
205 register classes between COND_EXEC statements. This will mean we allocate
206 different registers for each different COND_EXEC group if we can. This
207 might allow the scheduler to intermix two different COND_EXEC sections. */
208 frv_tmp_reg_t tmp_reg;
210 /* For nested IFs, identify which CC registers are used outside of setting
211 via a compare isnsn, and using via a check insn. This will allow us to
212 know if we can rewrite the register to use a different register that will
213 be paired with the CR register controlling the nested IF-THEN blocks. */
214 HARD_REG_SET nested_cc_ok_rewrite;
216 /* Temporary registers allocated to hold constants during conditional
217 execution. */
218 rtx scratch_regs[FIRST_PSEUDO_REGISTER];
220 /* Current number of temp registers available. */
221 int cur_scratch_regs;
223 /* Number of nested conditional execution blocks. */
224 int num_nested_cond_exec;
226 /* Map of insns that set up constants in scratch registers. */
227 bitmap scratch_insns_bitmap;
229 /* Conditional execution test register (CC0..CC7). */
230 rtx cr_reg;
232 /* Conditional execution compare register that is paired with cr_reg, so that
233 nested compares can be done. The csubcc and caddcc instructions don't
234 have enough bits to specify both a CC register to be set and a CR register
235 to do the test on, so the same bit number is used for both. Needless to
236 say, this is rather inconvenient for GCC. */
237 rtx nested_cc_reg;
239 /* Extra CR registers used for &&, ||. */
240 rtx extra_int_cr;
241 rtx extra_fp_cr;
243 /* Previous CR used in nested if, to make sure we are dealing with the same
244 nested if as the previous statement. */
245 rtx last_nested_if_cr;
247 frv_ifcvt_t;
249 static /* GTY(()) */ frv_ifcvt_t frv_ifcvt;
251 /* Map register number to smallest register class. */
252 enum reg_class regno_reg_class[FIRST_PSEUDO_REGISTER];
254 /* Map class letter into register class. */
255 enum reg_class reg_class_from_letter[256];
257 /* Cached value of frv_stack_info. */
258 static frv_stack_t *frv_stack_cache = (frv_stack_t *)0;
260 /* -mcpu= support */
261 frv_cpu_t frv_cpu_type = CPU_TYPE; /* value of -mcpu= */
263 /* Forward references */
265 static bool frv_handle_option (size_t, const char *, int);
266 static bool frv_legitimate_address_p (enum machine_mode, rtx, bool);
267 static int frv_default_flags_for_cpu (void);
268 static int frv_string_begins_with (const_tree, const char *);
269 static FRV_INLINE bool frv_small_data_reloc_p (rtx, int);
270 static void frv_print_operand (FILE *, rtx, int);
271 static void frv_print_operand_address (FILE *, rtx);
272 static bool frv_print_operand_punct_valid_p (unsigned char code);
273 static void frv_print_operand_memory_reference_reg
274 (FILE *, rtx);
275 static void frv_print_operand_memory_reference (FILE *, rtx, int);
276 static int frv_print_operand_jump_hint (rtx);
277 static const char *comparison_string (enum rtx_code, rtx);
278 static rtx frv_function_value (const_tree, const_tree,
279 bool);
280 static rtx frv_libcall_value (enum machine_mode,
281 const_rtx);
282 static FRV_INLINE int frv_regno_ok_for_base_p (int, int);
283 static rtx single_set_pattern (rtx);
284 static int frv_function_contains_far_jump (void);
285 static rtx frv_alloc_temp_reg (frv_tmp_reg_t *,
286 enum reg_class,
287 enum machine_mode,
288 int, int);
289 static rtx frv_frame_offset_rtx (int);
290 static rtx frv_frame_mem (enum machine_mode, rtx, int);
291 static rtx frv_dwarf_store (rtx, int);
292 static void frv_frame_insn (rtx, rtx);
293 static void frv_frame_access (frv_frame_accessor_t*,
294 rtx, int);
295 static void frv_frame_access_multi (frv_frame_accessor_t*,
296 frv_stack_t *, int);
297 static void frv_frame_access_standard_regs (enum frv_stack_op,
298 frv_stack_t *);
299 static struct machine_function *frv_init_machine_status (void);
300 static rtx frv_int_to_acc (enum insn_code, int, rtx);
301 static enum machine_mode frv_matching_accg_mode (enum machine_mode);
302 static rtx frv_read_argument (tree, unsigned int);
303 static rtx frv_read_iacc_argument (enum machine_mode, tree, unsigned int);
304 static int frv_check_constant_argument (enum insn_code, int, rtx);
305 static rtx frv_legitimize_target (enum insn_code, rtx);
306 static rtx frv_legitimize_argument (enum insn_code, int, rtx);
307 static rtx frv_legitimize_tls_address (rtx, enum tls_model);
308 static rtx frv_legitimize_address (rtx, rtx, enum machine_mode);
309 static rtx frv_expand_set_builtin (enum insn_code, tree, rtx);
310 static rtx frv_expand_unop_builtin (enum insn_code, tree, rtx);
311 static rtx frv_expand_binop_builtin (enum insn_code, tree, rtx);
312 static rtx frv_expand_cut_builtin (enum insn_code, tree, rtx);
313 static rtx frv_expand_binopimm_builtin (enum insn_code, tree, rtx);
314 static rtx frv_expand_voidbinop_builtin (enum insn_code, tree);
315 static rtx frv_expand_int_void2arg (enum insn_code, tree);
316 static rtx frv_expand_prefetches (enum insn_code, tree);
317 static rtx frv_expand_voidtriop_builtin (enum insn_code, tree);
318 static rtx frv_expand_voidaccop_builtin (enum insn_code, tree);
319 static rtx frv_expand_mclracc_builtin (tree);
320 static rtx frv_expand_mrdacc_builtin (enum insn_code, tree);
321 static rtx frv_expand_mwtacc_builtin (enum insn_code, tree);
322 static rtx frv_expand_noargs_builtin (enum insn_code);
323 static void frv_split_iacc_move (rtx, rtx);
324 static rtx frv_emit_comparison (enum rtx_code, rtx, rtx);
325 static int frv_clear_registers_used (rtx *, void *);
326 static void frv_ifcvt_add_insn (rtx, rtx, int);
327 static rtx frv_ifcvt_rewrite_mem (rtx, enum machine_mode, rtx);
328 static rtx frv_ifcvt_load_value (rtx, rtx);
329 static int frv_acc_group_1 (rtx *, void *);
330 static unsigned int frv_insn_unit (rtx);
331 static bool frv_issues_to_branch_unit_p (rtx);
332 static int frv_cond_flags (rtx);
333 static bool frv_regstate_conflict_p (regstate_t, regstate_t);
334 static int frv_registers_conflict_p_1 (rtx *, void *);
335 static bool frv_registers_conflict_p (rtx);
336 static void frv_registers_update_1 (rtx, const_rtx, void *);
337 static void frv_registers_update (rtx);
338 static void frv_start_packet (void);
339 static void frv_start_packet_block (void);
340 static void frv_finish_packet (void (*) (void));
341 static bool frv_pack_insn_p (rtx);
342 static void frv_add_insn_to_packet (rtx);
343 static void frv_insert_nop_in_packet (rtx);
344 static bool frv_for_each_packet (void (*) (void));
345 static bool frv_sort_insn_group_1 (enum frv_insn_group,
346 unsigned int, unsigned int,
347 unsigned int, unsigned int,
348 state_t);
349 static int frv_compare_insns (const void *, const void *);
350 static void frv_sort_insn_group (enum frv_insn_group);
351 static void frv_reorder_packet (void);
352 static void frv_fill_unused_units (enum frv_insn_group);
353 static void frv_align_label (void);
354 static void frv_reorg_packet (void);
355 static void frv_register_nop (rtx);
356 static void frv_reorg (void);
357 static void frv_pack_insns (void);
358 static void frv_function_prologue (FILE *, HOST_WIDE_INT);
359 static void frv_function_epilogue (FILE *, HOST_WIDE_INT);
360 static bool frv_assemble_integer (rtx, unsigned, int);
361 static void frv_init_builtins (void);
362 static rtx frv_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
363 static void frv_init_libfuncs (void);
364 static bool frv_in_small_data_p (const_tree);
365 static void frv_asm_output_mi_thunk
366 (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT, tree);
367 static void frv_setup_incoming_varargs (CUMULATIVE_ARGS *,
368 enum machine_mode,
369 tree, int *, int);
370 static rtx frv_expand_builtin_saveregs (void);
371 static void frv_expand_builtin_va_start (tree, rtx);
372 static bool frv_rtx_costs (rtx, int, int, int*, bool);
373 static void frv_asm_out_constructor (rtx, int);
374 static void frv_asm_out_destructor (rtx, int);
375 static bool frv_function_symbol_referenced_p (rtx);
376 static bool frv_cannot_force_const_mem (rtx);
377 static const char *unspec_got_name (int);
378 static void frv_output_const_unspec (FILE *,
379 const struct frv_unspec *);
380 static bool frv_function_ok_for_sibcall (tree, tree);
381 static rtx frv_struct_value_rtx (tree, int);
382 static bool frv_must_pass_in_stack (enum machine_mode mode, const_tree type);
383 static int frv_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
384 tree, bool);
385 static void frv_output_dwarf_dtprel (FILE *, int, rtx)
386 ATTRIBUTE_UNUSED;
387 static reg_class_t frv_secondary_reload (bool, rtx, reg_class_t,
388 enum machine_mode,
389 secondary_reload_info *);
390 static bool frv_frame_pointer_required (void);
391 static bool frv_can_eliminate (const int, const int);
392 static void frv_trampoline_init (rtx, tree, rtx);
394 /* Allow us to easily change the default for -malloc-cc. */
395 #ifndef DEFAULT_NO_ALLOC_CC
396 #define MASK_DEFAULT_ALLOC_CC MASK_ALLOC_CC
397 #else
398 #define MASK_DEFAULT_ALLOC_CC 0
399 #endif
401 /* Initialize the GCC target structure. */
402 #undef TARGET_PRINT_OPERAND
403 #define TARGET_PRINT_OPERAND frv_print_operand
404 #undef TARGET_PRINT_OPERAND_ADDRESS
405 #define TARGET_PRINT_OPERAND_ADDRESS frv_print_operand_address
406 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
407 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P frv_print_operand_punct_valid_p
408 #undef TARGET_ASM_FUNCTION_PROLOGUE
409 #define TARGET_ASM_FUNCTION_PROLOGUE frv_function_prologue
410 #undef TARGET_ASM_FUNCTION_EPILOGUE
411 #define TARGET_ASM_FUNCTION_EPILOGUE frv_function_epilogue
412 #undef TARGET_ASM_INTEGER
413 #define TARGET_ASM_INTEGER frv_assemble_integer
414 #undef TARGET_DEFAULT_TARGET_FLAGS
415 #define TARGET_DEFAULT_TARGET_FLAGS \
416 (MASK_DEFAULT_ALLOC_CC \
417 | MASK_COND_MOVE \
418 | MASK_SCC \
419 | MASK_COND_EXEC \
420 | MASK_VLIW_BRANCH \
421 | MASK_MULTI_CE \
422 | MASK_NESTED_CE)
423 #undef TARGET_HANDLE_OPTION
424 #define TARGET_HANDLE_OPTION frv_handle_option
425 #undef TARGET_INIT_BUILTINS
426 #define TARGET_INIT_BUILTINS frv_init_builtins
427 #undef TARGET_EXPAND_BUILTIN
428 #define TARGET_EXPAND_BUILTIN frv_expand_builtin
429 #undef TARGET_INIT_LIBFUNCS
430 #define TARGET_INIT_LIBFUNCS frv_init_libfuncs
431 #undef TARGET_IN_SMALL_DATA_P
432 #define TARGET_IN_SMALL_DATA_P frv_in_small_data_p
433 #undef TARGET_RTX_COSTS
434 #define TARGET_RTX_COSTS frv_rtx_costs
435 #undef TARGET_ASM_CONSTRUCTOR
436 #define TARGET_ASM_CONSTRUCTOR frv_asm_out_constructor
437 #undef TARGET_ASM_DESTRUCTOR
438 #define TARGET_ASM_DESTRUCTOR frv_asm_out_destructor
440 #undef TARGET_ASM_OUTPUT_MI_THUNK
441 #define TARGET_ASM_OUTPUT_MI_THUNK frv_asm_output_mi_thunk
442 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
443 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
445 #undef TARGET_SCHED_ISSUE_RATE
446 #define TARGET_SCHED_ISSUE_RATE frv_issue_rate
448 #undef TARGET_LEGITIMIZE_ADDRESS
449 #define TARGET_LEGITIMIZE_ADDRESS frv_legitimize_address
451 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
452 #define TARGET_FUNCTION_OK_FOR_SIBCALL frv_function_ok_for_sibcall
453 #undef TARGET_CANNOT_FORCE_CONST_MEM
454 #define TARGET_CANNOT_FORCE_CONST_MEM frv_cannot_force_const_mem
456 #undef TARGET_HAVE_TLS
457 #define TARGET_HAVE_TLS HAVE_AS_TLS
459 #undef TARGET_STRUCT_VALUE_RTX
460 #define TARGET_STRUCT_VALUE_RTX frv_struct_value_rtx
461 #undef TARGET_MUST_PASS_IN_STACK
462 #define TARGET_MUST_PASS_IN_STACK frv_must_pass_in_stack
463 #undef TARGET_PASS_BY_REFERENCE
464 #define TARGET_PASS_BY_REFERENCE hook_pass_by_reference_must_pass_in_stack
465 #undef TARGET_ARG_PARTIAL_BYTES
466 #define TARGET_ARG_PARTIAL_BYTES frv_arg_partial_bytes
468 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
469 #define TARGET_EXPAND_BUILTIN_SAVEREGS frv_expand_builtin_saveregs
470 #undef TARGET_SETUP_INCOMING_VARARGS
471 #define TARGET_SETUP_INCOMING_VARARGS frv_setup_incoming_varargs
472 #undef TARGET_MACHINE_DEPENDENT_REORG
473 #define TARGET_MACHINE_DEPENDENT_REORG frv_reorg
475 #undef TARGET_EXPAND_BUILTIN_VA_START
476 #define TARGET_EXPAND_BUILTIN_VA_START frv_expand_builtin_va_start
478 #if HAVE_AS_TLS
479 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
480 #define TARGET_ASM_OUTPUT_DWARF_DTPREL frv_output_dwarf_dtprel
481 #endif
483 #undef TARGET_SECONDARY_RELOAD
484 #define TARGET_SECONDARY_RELOAD frv_secondary_reload
486 #undef TARGET_LEGITIMATE_ADDRESS_P
487 #define TARGET_LEGITIMATE_ADDRESS_P frv_legitimate_address_p
489 #undef TARGET_FRAME_POINTER_REQUIRED
490 #define TARGET_FRAME_POINTER_REQUIRED frv_frame_pointer_required
492 #undef TARGET_CAN_ELIMINATE
493 #define TARGET_CAN_ELIMINATE frv_can_eliminate
495 #undef TARGET_TRAMPOLINE_INIT
496 #define TARGET_TRAMPOLINE_INIT frv_trampoline_init
498 #undef TARGET_FUNCTION_VALUE
499 #define TARGET_FUNCTION_VALUE frv_function_value
500 #undef TARGET_LIBCALL_VALUE
501 #define TARGET_LIBCALL_VALUE frv_libcall_value
503 struct gcc_target targetm = TARGET_INITIALIZER;
505 #define FRV_SYMBOL_REF_TLS_P(RTX) \
506 (GET_CODE (RTX) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (RTX) != 0)
509 /* Any function call that satisfies the machine-independent
510 requirements is eligible on FR-V. */
512 static bool
513 frv_function_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED,
514 tree exp ATTRIBUTE_UNUSED)
516 return true;
519 /* Return true if SYMBOL is a small data symbol and relocation RELOC
520 can be used to access it directly in a load or store. */
522 static FRV_INLINE bool
523 frv_small_data_reloc_p (rtx symbol, int reloc)
525 return (GET_CODE (symbol) == SYMBOL_REF
526 && SYMBOL_REF_SMALL_P (symbol)
527 && (!TARGET_FDPIC || flag_pic == 1)
528 && (reloc == R_FRV_GOTOFF12 || reloc == R_FRV_GPREL12));
531 /* Return true if X is a valid relocation unspec. If it is, fill in UNSPEC
532 appropriately. */
534 bool
535 frv_const_unspec_p (rtx x, struct frv_unspec *unspec)
537 if (GET_CODE (x) == CONST)
539 unspec->offset = 0;
540 x = XEXP (x, 0);
541 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
543 unspec->offset += INTVAL (XEXP (x, 1));
544 x = XEXP (x, 0);
546 if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_GOT)
548 unspec->symbol = XVECEXP (x, 0, 0);
549 unspec->reloc = INTVAL (XVECEXP (x, 0, 1));
551 if (unspec->offset == 0)
552 return true;
554 if (frv_small_data_reloc_p (unspec->symbol, unspec->reloc)
555 && unspec->offset > 0
556 && (unsigned HOST_WIDE_INT) unspec->offset < g_switch_value)
557 return true;
560 return false;
563 /* Decide whether we can force certain constants to memory. If we
564 decide we can't, the caller should be able to cope with it in
565 another way.
567 We never allow constants to be forced into memory for TARGET_FDPIC.
568 This is necessary for several reasons:
570 1. Since LEGITIMATE_CONSTANT_P rejects constant pool addresses, the
571 target-independent code will try to force them into the constant
572 pool, thus leading to infinite recursion.
574 2. We can never introduce new constant pool references during reload.
575 Any such reference would require use of the pseudo FDPIC register.
577 3. We can't represent a constant added to a function pointer (which is
578 not the same as a pointer to a function+constant).
580 4. In many cases, it's more efficient to calculate the constant in-line. */
582 static bool
583 frv_cannot_force_const_mem (rtx x ATTRIBUTE_UNUSED)
585 return TARGET_FDPIC;
588 /* Implement TARGET_HANDLE_OPTION. */
590 static bool
591 frv_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
593 switch (code)
595 case OPT_mcpu_:
596 if (strcmp (arg, "simple") == 0)
597 frv_cpu_type = FRV_CPU_SIMPLE;
598 else if (strcmp (arg, "tomcat") == 0)
599 frv_cpu_type = FRV_CPU_TOMCAT;
600 else if (strcmp (arg, "fr550") == 0)
601 frv_cpu_type = FRV_CPU_FR550;
602 else if (strcmp (arg, "fr500") == 0)
603 frv_cpu_type = FRV_CPU_FR500;
604 else if (strcmp (arg, "fr450") == 0)
605 frv_cpu_type = FRV_CPU_FR450;
606 else if (strcmp (arg, "fr405") == 0)
607 frv_cpu_type = FRV_CPU_FR405;
608 else if (strcmp (arg, "fr400") == 0)
609 frv_cpu_type = FRV_CPU_FR400;
610 else if (strcmp (arg, "fr300") == 0)
611 frv_cpu_type = FRV_CPU_FR300;
612 else if (strcmp (arg, "frv") == 0)
613 frv_cpu_type = FRV_CPU_GENERIC;
614 else
615 return false;
616 return true;
618 default:
619 return true;
623 static int
624 frv_default_flags_for_cpu (void)
626 switch (frv_cpu_type)
628 case FRV_CPU_GENERIC:
629 return MASK_DEFAULT_FRV;
631 case FRV_CPU_FR550:
632 return MASK_DEFAULT_FR550;
634 case FRV_CPU_FR500:
635 case FRV_CPU_TOMCAT:
636 return MASK_DEFAULT_FR500;
638 case FRV_CPU_FR450:
639 return MASK_DEFAULT_FR450;
641 case FRV_CPU_FR405:
642 case FRV_CPU_FR400:
643 return MASK_DEFAULT_FR400;
645 case FRV_CPU_FR300:
646 case FRV_CPU_SIMPLE:
647 return MASK_DEFAULT_SIMPLE;
649 default:
650 gcc_unreachable ();
654 /* Sometimes certain combinations of command options do not make
655 sense on a particular target machine. You can define a macro
656 `OVERRIDE_OPTIONS' to take account of this. This macro, if
657 defined, is executed once just after all the command options have
658 been parsed.
660 Don't use this macro to turn on various extra optimizations for
661 `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */
663 void
664 frv_override_options (void)
666 int regno;
667 unsigned int i;
669 target_flags |= (frv_default_flags_for_cpu () & ~target_flags_explicit);
671 /* -mlibrary-pic sets -fPIC and -G0 and also suppresses warnings from the
672 linker about linking pic and non-pic code. */
673 if (TARGET_LIBPIC)
675 if (!flag_pic) /* -fPIC */
676 flag_pic = 2;
678 if (! g_switch_set) /* -G0 */
680 g_switch_set = 1;
681 g_switch_value = 0;
685 /* A C expression whose value is a register class containing hard
686 register REGNO. In general there is more than one such class;
687 choose a class which is "minimal", meaning that no smaller class
688 also contains the register. */
690 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
692 enum reg_class rclass;
694 if (GPR_P (regno))
696 int gpr_reg = regno - GPR_FIRST;
698 if (gpr_reg == GR8_REG)
699 rclass = GR8_REGS;
701 else if (gpr_reg == GR9_REG)
702 rclass = GR9_REGS;
704 else if (gpr_reg == GR14_REG)
705 rclass = FDPIC_FPTR_REGS;
707 else if (gpr_reg == FDPIC_REGNO)
708 rclass = FDPIC_REGS;
710 else if ((gpr_reg & 3) == 0)
711 rclass = QUAD_REGS;
713 else if ((gpr_reg & 1) == 0)
714 rclass = EVEN_REGS;
716 else
717 rclass = GPR_REGS;
720 else if (FPR_P (regno))
722 int fpr_reg = regno - GPR_FIRST;
723 if ((fpr_reg & 3) == 0)
724 rclass = QUAD_FPR_REGS;
726 else if ((fpr_reg & 1) == 0)
727 rclass = FEVEN_REGS;
729 else
730 rclass = FPR_REGS;
733 else if (regno == LR_REGNO)
734 rclass = LR_REG;
736 else if (regno == LCR_REGNO)
737 rclass = LCR_REG;
739 else if (ICC_P (regno))
740 rclass = ICC_REGS;
742 else if (FCC_P (regno))
743 rclass = FCC_REGS;
745 else if (ICR_P (regno))
746 rclass = ICR_REGS;
748 else if (FCR_P (regno))
749 rclass = FCR_REGS;
751 else if (ACC_P (regno))
753 int r = regno - ACC_FIRST;
754 if ((r & 3) == 0)
755 rclass = QUAD_ACC_REGS;
756 else if ((r & 1) == 0)
757 rclass = EVEN_ACC_REGS;
758 else
759 rclass = ACC_REGS;
762 else if (ACCG_P (regno))
763 rclass = ACCG_REGS;
765 else
766 rclass = NO_REGS;
768 regno_reg_class[regno] = rclass;
771 /* Check for small data option */
772 if (!g_switch_set)
773 g_switch_value = SDATA_DEFAULT_SIZE;
775 /* A C expression which defines the machine-dependent operand
776 constraint letters for register classes. If CHAR is such a
777 letter, the value should be the register class corresponding to
778 it. Otherwise, the value should be `NO_REGS'. The register
779 letter `r', corresponding to class `GENERAL_REGS', will not be
780 passed to this macro; you do not need to handle it.
782 The following letters are unavailable, due to being used as
783 constraints:
784 '0'..'9'
785 '<', '>'
786 'E', 'F', 'G', 'H'
787 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'
788 'Q', 'R', 'S', 'T', 'U'
789 'V', 'X'
790 'g', 'i', 'm', 'n', 'o', 'p', 'r', 's' */
792 for (i = 0; i < 256; i++)
793 reg_class_from_letter[i] = NO_REGS;
795 reg_class_from_letter['a'] = ACC_REGS;
796 reg_class_from_letter['b'] = EVEN_ACC_REGS;
797 reg_class_from_letter['c'] = CC_REGS;
798 reg_class_from_letter['d'] = GPR_REGS;
799 reg_class_from_letter['e'] = EVEN_REGS;
800 reg_class_from_letter['f'] = FPR_REGS;
801 reg_class_from_letter['h'] = FEVEN_REGS;
802 reg_class_from_letter['l'] = LR_REG;
803 reg_class_from_letter['q'] = QUAD_REGS;
804 reg_class_from_letter['t'] = ICC_REGS;
805 reg_class_from_letter['u'] = FCC_REGS;
806 reg_class_from_letter['v'] = ICR_REGS;
807 reg_class_from_letter['w'] = FCR_REGS;
808 reg_class_from_letter['x'] = QUAD_FPR_REGS;
809 reg_class_from_letter['y'] = LCR_REG;
810 reg_class_from_letter['z'] = SPR_REGS;
811 reg_class_from_letter['A'] = QUAD_ACC_REGS;
812 reg_class_from_letter['B'] = ACCG_REGS;
813 reg_class_from_letter['C'] = CR_REGS;
814 reg_class_from_letter['W'] = FDPIC_CALL_REGS; /* gp14+15 */
815 reg_class_from_letter['Z'] = FDPIC_REGS; /* gp15 */
817 /* There is no single unaligned SI op for PIC code. Sometimes we
818 need to use ".4byte" and sometimes we need to use ".picptr".
819 See frv_assemble_integer for details. */
820 if (flag_pic || TARGET_FDPIC)
821 targetm.asm_out.unaligned_op.si = 0;
823 if ((target_flags_explicit & MASK_LINKED_FP) == 0)
824 target_flags |= MASK_LINKED_FP;
826 if ((target_flags_explicit & MASK_OPTIMIZE_MEMBAR) == 0)
827 target_flags |= MASK_OPTIMIZE_MEMBAR;
829 for (i = 0; i < ARRAY_SIZE (frv_unit_names); i++)
830 frv_unit_codes[i] = get_cpu_unit_code (frv_unit_names[i]);
832 for (i = 0; i < ARRAY_SIZE (frv_type_to_unit); i++)
833 frv_type_to_unit[i] = ARRAY_SIZE (frv_unit_codes);
835 init_machine_status = frv_init_machine_status;
839 /* Some machines may desire to change what optimizations are performed for
840 various optimization levels. This macro, if defined, is executed once just
841 after the optimization level is determined and before the remainder of the
842 command options have been parsed. Values set in this macro are used as the
843 default values for the other command line options.
845 LEVEL is the optimization level specified; 2 if `-O2' is specified, 1 if
846 `-O' is specified, and 0 if neither is specified.
848 SIZE is nonzero if `-Os' is specified, 0 otherwise.
850 You should not use this macro to change options that are not
851 machine-specific. These should uniformly selected by the same optimization
852 level on all supported machines. Use this macro to enable machine-specific
853 optimizations.
855 *Do not examine `write_symbols' in this macro!* The debugging options are
856 *not supposed to alter the generated code. */
858 /* On the FRV, possibly disable VLIW packing which is done by the 2nd
859 scheduling pass at the current time. */
860 void
861 frv_optimization_options (int level, int size ATTRIBUTE_UNUSED)
863 if (level >= 2)
865 #ifdef DISABLE_SCHED2
866 flag_schedule_insns_after_reload = 0;
867 #endif
868 #ifdef ENABLE_RCSP
869 flag_rcsp = 1;
870 #endif
875 /* Return true if NAME (a STRING_CST node) begins with PREFIX. */
877 static int
878 frv_string_begins_with (const_tree name, const char *prefix)
880 const int prefix_len = strlen (prefix);
882 /* Remember: NAME's length includes the null terminator. */
883 return (TREE_STRING_LENGTH (name) > prefix_len
884 && strncmp (TREE_STRING_POINTER (name), prefix, prefix_len) == 0);
887 /* Zero or more C statements that may conditionally modify two variables
888 `fixed_regs' and `call_used_regs' (both of type `char []') after they have
889 been initialized from the two preceding macros.
891 This is necessary in case the fixed or call-clobbered registers depend on
892 target flags.
894 You need not define this macro if it has no work to do.
896 If the usage of an entire class of registers depends on the target flags,
897 you may indicate this to GCC by using this macro to modify `fixed_regs' and
898 `call_used_regs' to 1 for each of the registers in the classes which should
899 not be used by GCC. Also define the macro `REG_CLASS_FROM_LETTER' to return
900 `NO_REGS' if it is called with a letter for a class that shouldn't be used.
902 (However, if this class is not included in `GENERAL_REGS' and all of the
903 insn patterns whose constraints permit this class are controlled by target
904 switches, then GCC will automatically avoid using these registers when the
905 target switches are opposed to them.) */
907 void
908 frv_conditional_register_usage (void)
910 int i;
912 for (i = GPR_FIRST + NUM_GPRS; i <= GPR_LAST; i++)
913 fixed_regs[i] = call_used_regs[i] = 1;
915 for (i = FPR_FIRST + NUM_FPRS; i <= FPR_LAST; i++)
916 fixed_regs[i] = call_used_regs[i] = 1;
918 /* Reserve the registers used for conditional execution. At present, we need
919 1 ICC and 1 ICR register. */
920 fixed_regs[ICC_TEMP] = call_used_regs[ICC_TEMP] = 1;
921 fixed_regs[ICR_TEMP] = call_used_regs[ICR_TEMP] = 1;
923 if (TARGET_FIXED_CC)
925 fixed_regs[ICC_FIRST] = call_used_regs[ICC_FIRST] = 1;
926 fixed_regs[FCC_FIRST] = call_used_regs[FCC_FIRST] = 1;
927 fixed_regs[ICR_FIRST] = call_used_regs[ICR_FIRST] = 1;
928 fixed_regs[FCR_FIRST] = call_used_regs[FCR_FIRST] = 1;
931 if (TARGET_FDPIC)
932 fixed_regs[GPR_FIRST + 16] = fixed_regs[GPR_FIRST + 17] =
933 call_used_regs[GPR_FIRST + 16] = call_used_regs[GPR_FIRST + 17] = 0;
935 #if 0
936 /* If -fpic, SDA_BASE_REG is the PIC register. */
937 if (g_switch_value == 0 && !flag_pic)
938 fixed_regs[SDA_BASE_REG] = call_used_regs[SDA_BASE_REG] = 0;
940 if (!flag_pic)
941 fixed_regs[PIC_REGNO] = call_used_regs[PIC_REGNO] = 0;
942 #endif
947 * Compute the stack frame layout
949 * Register setup:
950 * +---------------+-----------------------+-----------------------+
951 * |Register |type |caller-save/callee-save|
952 * +---------------+-----------------------+-----------------------+
953 * |GR0 |Zero register | - |
954 * |GR1 |Stack pointer(SP) | - |
955 * |GR2 |Frame pointer(FP) | - |
956 * |GR3 |Hidden parameter | caller save |
957 * |GR4-GR7 | - | caller save |
958 * |GR8-GR13 |Argument register | caller save |
959 * |GR14-GR15 | - | caller save |
960 * |GR16-GR31 | - | callee save |
961 * |GR32-GR47 | - | caller save |
962 * |GR48-GR63 | - | callee save |
963 * |FR0-FR15 | - | caller save |
964 * |FR16-FR31 | - | callee save |
965 * |FR32-FR47 | - | caller save |
966 * |FR48-FR63 | - | callee save |
967 * +---------------+-----------------------+-----------------------+
969 * Stack frame setup:
970 * Low
971 * SP-> |-----------------------------------|
972 * | Argument area |
973 * |-----------------------------------|
974 * | Register save area |
975 * |-----------------------------------|
976 * | Local variable save area |
977 * FP-> |-----------------------------------|
978 * | Old FP |
979 * |-----------------------------------|
980 * | Hidden parameter save area |
981 * |-----------------------------------|
982 * | Return address(LR) storage area |
983 * |-----------------------------------|
984 * | Padding for alignment |
985 * |-----------------------------------|
986 * | Register argument area |
987 * OLD SP-> |-----------------------------------|
988 * | Parameter area |
989 * |-----------------------------------|
990 * High
992 * Argument area/Parameter area:
994 * When a function is called, this area is used for argument transfer. When
995 * the argument is set up by the caller function, this area is referred to as
996 * the argument area. When the argument is referenced by the callee function,
997 * this area is referred to as the parameter area. The area is allocated when
998 * all arguments cannot be placed on the argument register at the time of
999 * argument transfer.
1001 * Register save area:
1003 * This is a register save area that must be guaranteed for the caller
1004 * function. This area is not secured when the register save operation is not
1005 * needed.
1007 * Local variable save area:
1009 * This is the area for local variables and temporary variables.
1011 * Old FP:
1013 * This area stores the FP value of the caller function.
1015 * Hidden parameter save area:
1017 * This area stores the start address of the return value storage
1018 * area for a struct/union return function.
1019 * When a struct/union is used as the return value, the caller
1020 * function stores the return value storage area start address in
1021 * register GR3 and passes it to the caller function.
1022 * The callee function interprets the address stored in the GR3
1023 * as the return value storage area start address.
1024 * When register GR3 needs to be saved into memory, the callee
1025 * function saves it in the hidden parameter save area. This
1026 * area is not secured when the save operation is not needed.
1028 * Return address(LR) storage area:
1030 * This area saves the LR. The LR stores the address of a return to the caller
1031 * function for the purpose of function calling.
1033 * Argument register area:
1035 * This area saves the argument register. This area is not secured when the
1036 * save operation is not needed.
1038 * Argument:
1040 * Arguments, the count of which equals the count of argument registers (6
1041 * words), are positioned in registers GR8 to GR13 and delivered to the callee
1042 * function. When a struct/union return function is called, the return value
1043 * area address is stored in register GR3. Arguments not placed in the
1044 * argument registers will be stored in the stack argument area for transfer
1045 * purposes. When an 8-byte type argument is to be delivered using registers,
1046 * it is divided into two and placed in two registers for transfer. When
1047 * argument registers must be saved to memory, the callee function secures an
1048 * argument register save area in the stack. In this case, a continuous
1049 * argument register save area must be established in the parameter area. The
1050 * argument register save area must be allocated as needed to cover the size of
1051 * the argument register to be saved. If the function has a variable count of
1052 * arguments, it saves all argument registers in the argument register save
1053 * area.
1055 * Argument Extension Format:
1057 * When an argument is to be stored in the stack, its type is converted to an
1058 * extended type in accordance with the individual argument type. The argument
1059 * is freed by the caller function after the return from the callee function is
1060 * made.
1062 * +-----------------------+---------------+------------------------+
1063 * | Argument Type |Extended Type |Stack Storage Size(byte)|
1064 * +-----------------------+---------------+------------------------+
1065 * |char |int | 4 |
1066 * |signed char |int | 4 |
1067 * |unsigned char |int | 4 |
1068 * |[signed] short int |int | 4 |
1069 * |unsigned short int |int | 4 |
1070 * |[signed] int |No extension | 4 |
1071 * |unsigned int |No extension | 4 |
1072 * |[signed] long int |No extension | 4 |
1073 * |unsigned long int |No extension | 4 |
1074 * |[signed] long long int |No extension | 8 |
1075 * |unsigned long long int |No extension | 8 |
1076 * |float |double | 8 |
1077 * |double |No extension | 8 |
1078 * |long double |No extension | 8 |
1079 * |pointer |No extension | 4 |
1080 * |struct/union |- | 4 (*1) |
1081 * +-----------------------+---------------+------------------------+
1083 * When a struct/union is to be delivered as an argument, the caller copies it
1084 * to the local variable area and delivers the address of that area.
1086 * Return Value:
1088 * +-------------------------------+----------------------+
1089 * |Return Value Type |Return Value Interface|
1090 * +-------------------------------+----------------------+
1091 * |void |None |
1092 * |[signed|unsigned] char |GR8 |
1093 * |[signed|unsigned] short int |GR8 |
1094 * |[signed|unsigned] int |GR8 |
1095 * |[signed|unsigned] long int |GR8 |
1096 * |pointer |GR8 |
1097 * |[signed|unsigned] long long int|GR8 & GR9 |
1098 * |float |GR8 |
1099 * |double |GR8 & GR9 |
1100 * |long double |GR8 & GR9 |
1101 * |struct/union |(*1) |
1102 * +-------------------------------+----------------------+
1104 * When a struct/union is used as the return value, the caller function stores
1105 * the start address of the return value storage area into GR3 and then passes
1106 * it to the callee function. The callee function interprets GR3 as the start
1107 * address of the return value storage area. When this address needs to be
1108 * saved in memory, the callee function secures the hidden parameter save area
1109 * and saves the address in that area.
1112 frv_stack_t *
1113 frv_stack_info (void)
1115 static frv_stack_t info, zero_info;
1116 frv_stack_t *info_ptr = &info;
1117 tree fndecl = current_function_decl;
1118 int varargs_p = 0;
1119 tree cur_arg;
1120 tree next_arg;
1121 int range;
1122 int alignment;
1123 int offset;
1125 /* If we've already calculated the values and reload is complete,
1126 just return now. */
1127 if (frv_stack_cache)
1128 return frv_stack_cache;
1130 /* Zero all fields. */
1131 info = zero_info;
1133 /* Set up the register range information. */
1134 info_ptr->regs[STACK_REGS_GPR].name = "gpr";
1135 info_ptr->regs[STACK_REGS_GPR].first = LAST_ARG_REGNUM + 1;
1136 info_ptr->regs[STACK_REGS_GPR].last = GPR_LAST;
1137 info_ptr->regs[STACK_REGS_GPR].dword_p = TRUE;
1139 info_ptr->regs[STACK_REGS_FPR].name = "fpr";
1140 info_ptr->regs[STACK_REGS_FPR].first = FPR_FIRST;
1141 info_ptr->regs[STACK_REGS_FPR].last = FPR_LAST;
1142 info_ptr->regs[STACK_REGS_FPR].dword_p = TRUE;
1144 info_ptr->regs[STACK_REGS_LR].name = "lr";
1145 info_ptr->regs[STACK_REGS_LR].first = LR_REGNO;
1146 info_ptr->regs[STACK_REGS_LR].last = LR_REGNO;
1147 info_ptr->regs[STACK_REGS_LR].special_p = 1;
1149 info_ptr->regs[STACK_REGS_CC].name = "cc";
1150 info_ptr->regs[STACK_REGS_CC].first = CC_FIRST;
1151 info_ptr->regs[STACK_REGS_CC].last = CC_LAST;
1152 info_ptr->regs[STACK_REGS_CC].field_p = TRUE;
1154 info_ptr->regs[STACK_REGS_LCR].name = "lcr";
1155 info_ptr->regs[STACK_REGS_LCR].first = LCR_REGNO;
1156 info_ptr->regs[STACK_REGS_LCR].last = LCR_REGNO;
1158 info_ptr->regs[STACK_REGS_STDARG].name = "stdarg";
1159 info_ptr->regs[STACK_REGS_STDARG].first = FIRST_ARG_REGNUM;
1160 info_ptr->regs[STACK_REGS_STDARG].last = LAST_ARG_REGNUM;
1161 info_ptr->regs[STACK_REGS_STDARG].dword_p = 1;
1162 info_ptr->regs[STACK_REGS_STDARG].special_p = 1;
1164 info_ptr->regs[STACK_REGS_STRUCT].name = "struct";
1165 info_ptr->regs[STACK_REGS_STRUCT].first = FRV_STRUCT_VALUE_REGNUM;
1166 info_ptr->regs[STACK_REGS_STRUCT].last = FRV_STRUCT_VALUE_REGNUM;
1167 info_ptr->regs[STACK_REGS_STRUCT].special_p = 1;
1169 info_ptr->regs[STACK_REGS_FP].name = "fp";
1170 info_ptr->regs[STACK_REGS_FP].first = FRAME_POINTER_REGNUM;
1171 info_ptr->regs[STACK_REGS_FP].last = FRAME_POINTER_REGNUM;
1172 info_ptr->regs[STACK_REGS_FP].special_p = 1;
1174 /* Determine if this is a stdarg function. If so, allocate space to store
1175 the 6 arguments. */
1176 if (cfun->stdarg)
1177 varargs_p = 1;
1179 else
1181 /* Find the last argument, and see if it is __builtin_va_alist. */
1182 for (cur_arg = DECL_ARGUMENTS (fndecl); cur_arg != (tree)0; cur_arg = next_arg)
1184 next_arg = TREE_CHAIN (cur_arg);
1185 if (next_arg == (tree)0)
1187 if (DECL_NAME (cur_arg)
1188 && !strcmp (IDENTIFIER_POINTER (DECL_NAME (cur_arg)), "__builtin_va_alist"))
1189 varargs_p = 1;
1191 break;
1196 /* Iterate over all of the register ranges. */
1197 for (range = 0; range < STACK_REGS_MAX; range++)
1199 frv_stack_regs_t *reg_ptr = &(info_ptr->regs[range]);
1200 int first = reg_ptr->first;
1201 int last = reg_ptr->last;
1202 int size_1word = 0;
1203 int size_2words = 0;
1204 int regno;
1206 /* Calculate which registers need to be saved & save area size. */
1207 switch (range)
1209 default:
1210 for (regno = first; regno <= last; regno++)
1212 if ((df_regs_ever_live_p (regno) && !call_used_regs[regno])
1213 || (crtl->calls_eh_return
1214 && (regno >= FIRST_EH_REGNUM && regno <= LAST_EH_REGNUM))
1215 || (!TARGET_FDPIC && flag_pic
1216 && crtl->uses_pic_offset_table && regno == PIC_REGNO))
1218 info_ptr->save_p[regno] = REG_SAVE_1WORD;
1219 size_1word += UNITS_PER_WORD;
1222 break;
1224 /* Calculate whether we need to create a frame after everything else
1225 has been processed. */
1226 case STACK_REGS_FP:
1227 break;
1229 case STACK_REGS_LR:
1230 if (df_regs_ever_live_p (LR_REGNO)
1231 || profile_flag
1232 /* This is set for __builtin_return_address, etc. */
1233 || cfun->machine->frame_needed
1234 || (TARGET_LINKED_FP && frame_pointer_needed)
1235 || (!TARGET_FDPIC && flag_pic
1236 && crtl->uses_pic_offset_table))
1238 info_ptr->save_p[LR_REGNO] = REG_SAVE_1WORD;
1239 size_1word += UNITS_PER_WORD;
1241 break;
1243 case STACK_REGS_STDARG:
1244 if (varargs_p)
1246 /* If this is a stdarg function with a non varardic
1247 argument split between registers and the stack,
1248 adjust the saved registers downward. */
1249 last -= (ADDR_ALIGN (crtl->args.pretend_args_size, UNITS_PER_WORD)
1250 / UNITS_PER_WORD);
1252 for (regno = first; regno <= last; regno++)
1254 info_ptr->save_p[regno] = REG_SAVE_1WORD;
1255 size_1word += UNITS_PER_WORD;
1258 info_ptr->stdarg_size = size_1word;
1260 break;
1262 case STACK_REGS_STRUCT:
1263 if (cfun->returns_struct)
1265 info_ptr->save_p[FRV_STRUCT_VALUE_REGNUM] = REG_SAVE_1WORD;
1266 size_1word += UNITS_PER_WORD;
1268 break;
1272 if (size_1word)
1274 /* If this is a field, it only takes one word. */
1275 if (reg_ptr->field_p)
1276 size_1word = UNITS_PER_WORD;
1278 /* Determine which register pairs can be saved together. */
1279 else if (reg_ptr->dword_p && TARGET_DWORD)
1281 for (regno = first; regno < last; regno += 2)
1283 if (info_ptr->save_p[regno] && info_ptr->save_p[regno+1])
1285 size_2words += 2 * UNITS_PER_WORD;
1286 size_1word -= 2 * UNITS_PER_WORD;
1287 info_ptr->save_p[regno] = REG_SAVE_2WORDS;
1288 info_ptr->save_p[regno+1] = REG_SAVE_NO_SAVE;
1293 reg_ptr->size_1word = size_1word;
1294 reg_ptr->size_2words = size_2words;
1296 if (! reg_ptr->special_p)
1298 info_ptr->regs_size_1word += size_1word;
1299 info_ptr->regs_size_2words += size_2words;
1304 /* Set up the sizes of each each field in the frame body, making the sizes
1305 of each be divisible by the size of a dword if dword operations might
1306 be used, or the size of a word otherwise. */
1307 alignment = (TARGET_DWORD? 2 * UNITS_PER_WORD : UNITS_PER_WORD);
1309 info_ptr->parameter_size = ADDR_ALIGN (crtl->outgoing_args_size, alignment);
1310 info_ptr->regs_size = ADDR_ALIGN (info_ptr->regs_size_2words
1311 + info_ptr->regs_size_1word,
1312 alignment);
1313 info_ptr->vars_size = ADDR_ALIGN (get_frame_size (), alignment);
1315 info_ptr->pretend_size = crtl->args.pretend_args_size;
1317 /* Work out the size of the frame, excluding the header. Both the frame
1318 body and register parameter area will be dword-aligned. */
1319 info_ptr->total_size
1320 = (ADDR_ALIGN (info_ptr->parameter_size
1321 + info_ptr->regs_size
1322 + info_ptr->vars_size,
1323 2 * UNITS_PER_WORD)
1324 + ADDR_ALIGN (info_ptr->pretend_size
1325 + info_ptr->stdarg_size,
1326 2 * UNITS_PER_WORD));
1328 /* See if we need to create a frame at all, if so add header area. */
1329 if (info_ptr->total_size > 0
1330 || frame_pointer_needed
1331 || info_ptr->regs[STACK_REGS_LR].size_1word > 0
1332 || info_ptr->regs[STACK_REGS_STRUCT].size_1word > 0)
1334 offset = info_ptr->parameter_size;
1335 info_ptr->header_size = 4 * UNITS_PER_WORD;
1336 info_ptr->total_size += 4 * UNITS_PER_WORD;
1338 /* Calculate the offsets to save normal register pairs. */
1339 for (range = 0; range < STACK_REGS_MAX; range++)
1341 frv_stack_regs_t *reg_ptr = &(info_ptr->regs[range]);
1342 if (! reg_ptr->special_p)
1344 int first = reg_ptr->first;
1345 int last = reg_ptr->last;
1346 int regno;
1348 for (regno = first; regno <= last; regno++)
1349 if (info_ptr->save_p[regno] == REG_SAVE_2WORDS
1350 && regno != FRAME_POINTER_REGNUM
1351 && (regno < FIRST_ARG_REGNUM
1352 || regno > LAST_ARG_REGNUM))
1354 info_ptr->reg_offset[regno] = offset;
1355 offset += 2 * UNITS_PER_WORD;
1360 /* Calculate the offsets to save normal single registers. */
1361 for (range = 0; range < STACK_REGS_MAX; range++)
1363 frv_stack_regs_t *reg_ptr = &(info_ptr->regs[range]);
1364 if (! reg_ptr->special_p)
1366 int first = reg_ptr->first;
1367 int last = reg_ptr->last;
1368 int regno;
1370 for (regno = first; regno <= last; regno++)
1371 if (info_ptr->save_p[regno] == REG_SAVE_1WORD
1372 && regno != FRAME_POINTER_REGNUM
1373 && (regno < FIRST_ARG_REGNUM
1374 || regno > LAST_ARG_REGNUM))
1376 info_ptr->reg_offset[regno] = offset;
1377 offset += UNITS_PER_WORD;
1382 /* Calculate the offset to save the local variables at. */
1383 offset = ADDR_ALIGN (offset, alignment);
1384 if (info_ptr->vars_size)
1386 info_ptr->vars_offset = offset;
1387 offset += info_ptr->vars_size;
1390 /* Align header to a dword-boundary. */
1391 offset = ADDR_ALIGN (offset, 2 * UNITS_PER_WORD);
1393 /* Calculate the offsets in the fixed frame. */
1394 info_ptr->save_p[FRAME_POINTER_REGNUM] = REG_SAVE_1WORD;
1395 info_ptr->reg_offset[FRAME_POINTER_REGNUM] = offset;
1396 info_ptr->regs[STACK_REGS_FP].size_1word = UNITS_PER_WORD;
1398 info_ptr->save_p[LR_REGNO] = REG_SAVE_1WORD;
1399 info_ptr->reg_offset[LR_REGNO] = offset + 2*UNITS_PER_WORD;
1400 info_ptr->regs[STACK_REGS_LR].size_1word = UNITS_PER_WORD;
1402 if (cfun->returns_struct)
1404 info_ptr->save_p[FRV_STRUCT_VALUE_REGNUM] = REG_SAVE_1WORD;
1405 info_ptr->reg_offset[FRV_STRUCT_VALUE_REGNUM] = offset + UNITS_PER_WORD;
1406 info_ptr->regs[STACK_REGS_STRUCT].size_1word = UNITS_PER_WORD;
1409 /* Calculate the offsets to store the arguments passed in registers
1410 for stdarg functions. The register pairs are first and the single
1411 register if any is last. The register save area starts on a
1412 dword-boundary. */
1413 if (info_ptr->stdarg_size)
1415 int first = info_ptr->regs[STACK_REGS_STDARG].first;
1416 int last = info_ptr->regs[STACK_REGS_STDARG].last;
1417 int regno;
1419 /* Skip the header. */
1420 offset += 4 * UNITS_PER_WORD;
1421 for (regno = first; regno <= last; regno++)
1423 if (info_ptr->save_p[regno] == REG_SAVE_2WORDS)
1425 info_ptr->reg_offset[regno] = offset;
1426 offset += 2 * UNITS_PER_WORD;
1428 else if (info_ptr->save_p[regno] == REG_SAVE_1WORD)
1430 info_ptr->reg_offset[regno] = offset;
1431 offset += UNITS_PER_WORD;
1437 if (reload_completed)
1438 frv_stack_cache = info_ptr;
1440 return info_ptr;
1444 /* Print the information about the frv stack offsets, etc. when debugging. */
1446 void
1447 frv_debug_stack (frv_stack_t *info)
1449 int range;
1451 if (!info)
1452 info = frv_stack_info ();
1454 fprintf (stderr, "\nStack information for function %s:\n",
1455 ((current_function_decl && DECL_NAME (current_function_decl))
1456 ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
1457 : "<unknown>"));
1459 fprintf (stderr, "\ttotal_size\t= %6d\n", info->total_size);
1460 fprintf (stderr, "\tvars_size\t= %6d\n", info->vars_size);
1461 fprintf (stderr, "\tparam_size\t= %6d\n", info->parameter_size);
1462 fprintf (stderr, "\tregs_size\t= %6d, 1w = %3d, 2w = %3d\n",
1463 info->regs_size, info->regs_size_1word, info->regs_size_2words);
1465 fprintf (stderr, "\theader_size\t= %6d\n", info->header_size);
1466 fprintf (stderr, "\tpretend_size\t= %6d\n", info->pretend_size);
1467 fprintf (stderr, "\tvars_offset\t= %6d\n", info->vars_offset);
1468 fprintf (stderr, "\tregs_offset\t= %6d\n", info->regs_offset);
1470 for (range = 0; range < STACK_REGS_MAX; range++)
1472 frv_stack_regs_t *regs = &(info->regs[range]);
1473 if ((regs->size_1word + regs->size_2words) > 0)
1475 int first = regs->first;
1476 int last = regs->last;
1477 int regno;
1479 fprintf (stderr, "\t%s\tsize\t= %6d, 1w = %3d, 2w = %3d, save =",
1480 regs->name, regs->size_1word + regs->size_2words,
1481 regs->size_1word, regs->size_2words);
1483 for (regno = first; regno <= last; regno++)
1485 if (info->save_p[regno] == REG_SAVE_1WORD)
1486 fprintf (stderr, " %s (%d)", reg_names[regno],
1487 info->reg_offset[regno]);
1489 else if (info->save_p[regno] == REG_SAVE_2WORDS)
1490 fprintf (stderr, " %s-%s (%d)", reg_names[regno],
1491 reg_names[regno+1], info->reg_offset[regno]);
1494 fputc ('\n', stderr);
1498 fflush (stderr);
1504 /* Used during final to control the packing of insns. The value is
1505 1 if the current instruction should be packed with the next one,
1506 0 if it shouldn't or -1 if packing is disabled altogether. */
1508 static int frv_insn_packing_flag;
1510 /* True if the current function contains a far jump. */
1512 static int
1513 frv_function_contains_far_jump (void)
1515 rtx insn = get_insns ();
1516 while (insn != NULL
1517 && !(GET_CODE (insn) == JUMP_INSN
1518 /* Ignore tablejump patterns. */
1519 && GET_CODE (PATTERN (insn)) != ADDR_VEC
1520 && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC
1521 && get_attr_far_jump (insn) == FAR_JUMP_YES))
1522 insn = NEXT_INSN (insn);
1523 return (insn != NULL);
1526 /* For the FRV, this function makes sure that a function with far jumps
1527 will return correctly. It also does the VLIW packing. */
1529 static void
1530 frv_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
1532 /* If no frame was created, check whether the function uses a call
1533 instruction to implement a far jump. If so, save the link in gr3 and
1534 replace all returns to LR with returns to GR3. GR3 is used because it
1535 is call-clobbered, because is not available to the register allocator,
1536 and because all functions that take a hidden argument pointer will have
1537 a stack frame. */
1538 if (frv_stack_info ()->total_size == 0 && frv_function_contains_far_jump ())
1540 rtx insn;
1542 /* Just to check that the above comment is true. */
1543 gcc_assert (!df_regs_ever_live_p (GPR_FIRST + 3));
1545 /* Generate the instruction that saves the link register. */
1546 fprintf (file, "\tmovsg lr,gr3\n");
1548 /* Replace the LR with GR3 in *return_internal patterns. The insn
1549 will now return using jmpl @(gr3,0) rather than bralr. We cannot
1550 simply emit a different assembly directive because bralr and jmpl
1551 execute in different units. */
1552 for (insn = get_insns(); insn != NULL; insn = NEXT_INSN (insn))
1553 if (GET_CODE (insn) == JUMP_INSN)
1555 rtx pattern = PATTERN (insn);
1556 if (GET_CODE (pattern) == PARALLEL
1557 && XVECLEN (pattern, 0) >= 2
1558 && GET_CODE (XVECEXP (pattern, 0, 0)) == RETURN
1559 && GET_CODE (XVECEXP (pattern, 0, 1)) == USE)
1561 rtx address = XEXP (XVECEXP (pattern, 0, 1), 0);
1562 if (GET_CODE (address) == REG && REGNO (address) == LR_REGNO)
1563 SET_REGNO (address, GPR_FIRST + 3);
1568 frv_pack_insns ();
1570 /* Allow the garbage collector to free the nops created by frv_reorg. */
1571 memset (frv_nops, 0, sizeof (frv_nops));
1575 /* Return the next available temporary register in a given class. */
1577 static rtx
1578 frv_alloc_temp_reg (
1579 frv_tmp_reg_t *info, /* which registers are available */
1580 enum reg_class rclass, /* register class desired */
1581 enum machine_mode mode, /* mode to allocate register with */
1582 int mark_as_used, /* register not available after allocation */
1583 int no_abort) /* return NULL instead of aborting */
1585 int regno = info->next_reg[ (int)rclass ];
1586 int orig_regno = regno;
1587 HARD_REG_SET *reg_in_class = &reg_class_contents[ (int)rclass ];
1588 int i, nr;
1590 for (;;)
1592 if (TEST_HARD_REG_BIT (*reg_in_class, regno)
1593 && TEST_HARD_REG_BIT (info->regs, regno))
1594 break;
1596 if (++regno >= FIRST_PSEUDO_REGISTER)
1597 regno = 0;
1598 if (regno == orig_regno)
1600 gcc_assert (no_abort);
1601 return NULL_RTX;
1605 nr = HARD_REGNO_NREGS (regno, mode);
1606 info->next_reg[ (int)rclass ] = regno + nr;
1608 if (mark_as_used)
1609 for (i = 0; i < nr; i++)
1610 CLEAR_HARD_REG_BIT (info->regs, regno+i);
1612 return gen_rtx_REG (mode, regno);
1616 /* Return an rtx with the value OFFSET, which will either be a register or a
1617 signed 12-bit integer. It can be used as the second operand in an "add"
1618 instruction, or as the index in a load or store.
1620 The function returns a constant rtx if OFFSET is small enough, otherwise
1621 it loads the constant into register OFFSET_REGNO and returns that. */
1622 static rtx
1623 frv_frame_offset_rtx (int offset)
1625 rtx offset_rtx = GEN_INT (offset);
1626 if (IN_RANGE_P (offset, -2048, 2047))
1627 return offset_rtx;
1628 else
1630 rtx reg_rtx = gen_rtx_REG (SImode, OFFSET_REGNO);
1631 if (IN_RANGE_P (offset, -32768, 32767))
1632 emit_insn (gen_movsi (reg_rtx, offset_rtx));
1633 else
1635 emit_insn (gen_movsi_high (reg_rtx, offset_rtx));
1636 emit_insn (gen_movsi_lo_sum (reg_rtx, offset_rtx));
1638 return reg_rtx;
1642 /* Generate (mem:MODE (plus:Pmode BASE (frv_frame_offset OFFSET)))). The
1643 prologue and epilogue uses such expressions to access the stack. */
1644 static rtx
1645 frv_frame_mem (enum machine_mode mode, rtx base, int offset)
1647 return gen_rtx_MEM (mode, gen_rtx_PLUS (Pmode,
1648 base,
1649 frv_frame_offset_rtx (offset)));
1652 /* Generate a frame-related expression:
1654 (set REG (mem (plus (sp) (const_int OFFSET)))).
1656 Such expressions are used in FRAME_RELATED_EXPR notes for more complex
1657 instructions. Marking the expressions as frame-related is superfluous if
1658 the note contains just a single set. But if the note contains a PARALLEL
1659 or SEQUENCE that has several sets, each set must be individually marked
1660 as frame-related. */
1661 static rtx
1662 frv_dwarf_store (rtx reg, int offset)
1664 rtx set = gen_rtx_SET (VOIDmode,
1665 gen_rtx_MEM (GET_MODE (reg),
1666 plus_constant (stack_pointer_rtx,
1667 offset)),
1668 reg);
1669 RTX_FRAME_RELATED_P (set) = 1;
1670 return set;
1673 /* Emit a frame-related instruction whose pattern is PATTERN. The
1674 instruction is the last in a sequence that cumulatively performs the
1675 operation described by DWARF_PATTERN. The instruction is marked as
1676 frame-related and has a REG_FRAME_RELATED_EXPR note containing
1677 DWARF_PATTERN. */
1678 static void
1679 frv_frame_insn (rtx pattern, rtx dwarf_pattern)
1681 rtx insn = emit_insn (pattern);
1682 RTX_FRAME_RELATED_P (insn) = 1;
1683 REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
1684 dwarf_pattern,
1685 REG_NOTES (insn));
1688 /* Emit instructions that transfer REG to or from the memory location (sp +
1689 STACK_OFFSET). The register is stored in memory if ACCESSOR->OP is
1690 FRV_STORE and loaded if it is FRV_LOAD. Only the prologue uses this
1691 function to store registers and only the epilogue uses it to load them.
1693 The caller sets up ACCESSOR so that BASE is equal to (sp + BASE_OFFSET).
1694 The generated instruction will use BASE as its base register. BASE may
1695 simply be the stack pointer, but if several accesses are being made to a
1696 region far away from the stack pointer, it may be more efficient to set
1697 up a temporary instead.
1699 Store instructions will be frame-related and will be annotated with the
1700 overall effect of the store. Load instructions will be followed by a
1701 (use) to prevent later optimizations from zapping them.
1703 The function takes care of the moves to and from SPRs, using TEMP_REGNO
1704 as a temporary in such cases. */
1705 static void
1706 frv_frame_access (frv_frame_accessor_t *accessor, rtx reg, int stack_offset)
1708 enum machine_mode mode = GET_MODE (reg);
1709 rtx mem = frv_frame_mem (mode,
1710 accessor->base,
1711 stack_offset - accessor->base_offset);
1713 if (accessor->op == FRV_LOAD)
1715 if (SPR_P (REGNO (reg)))
1717 rtx temp = gen_rtx_REG (mode, TEMP_REGNO);
1718 emit_insn (gen_rtx_SET (VOIDmode, temp, mem));
1719 emit_insn (gen_rtx_SET (VOIDmode, reg, temp));
1721 else
1723 /* We cannot use reg+reg addressing for DImode access. */
1724 if (mode == DImode
1725 && GET_CODE (XEXP (mem, 0)) == PLUS
1726 && GET_CODE (XEXP (XEXP (mem, 0), 0)) == REG
1727 && GET_CODE (XEXP (XEXP (mem, 0), 1)) == REG)
1729 rtx temp = gen_rtx_REG (SImode, TEMP_REGNO);
1730 rtx insn = emit_move_insn (temp,
1731 gen_rtx_PLUS (SImode, XEXP (XEXP (mem, 0), 0),
1732 XEXP (XEXP (mem, 0), 1)));
1733 mem = gen_rtx_MEM (DImode, temp);
1735 emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
1737 emit_use (reg);
1739 else
1741 if (SPR_P (REGNO (reg)))
1743 rtx temp = gen_rtx_REG (mode, TEMP_REGNO);
1744 emit_insn (gen_rtx_SET (VOIDmode, temp, reg));
1745 frv_frame_insn (gen_rtx_SET (Pmode, mem, temp),
1746 frv_dwarf_store (reg, stack_offset));
1748 else if (mode == DImode)
1750 /* For DImode saves, the dwarf2 version needs to be a SEQUENCE
1751 with a separate save for each register. */
1752 rtx reg1 = gen_rtx_REG (SImode, REGNO (reg));
1753 rtx reg2 = gen_rtx_REG (SImode, REGNO (reg) + 1);
1754 rtx set1 = frv_dwarf_store (reg1, stack_offset);
1755 rtx set2 = frv_dwarf_store (reg2, stack_offset + 4);
1757 /* Also we cannot use reg+reg addressing. */
1758 if (GET_CODE (XEXP (mem, 0)) == PLUS
1759 && GET_CODE (XEXP (XEXP (mem, 0), 0)) == REG
1760 && GET_CODE (XEXP (XEXP (mem, 0), 1)) == REG)
1762 rtx temp = gen_rtx_REG (SImode, TEMP_REGNO);
1763 rtx insn = emit_move_insn (temp,
1764 gen_rtx_PLUS (SImode, XEXP (XEXP (mem, 0), 0),
1765 XEXP (XEXP (mem, 0), 1)));
1766 mem = gen_rtx_MEM (DImode, temp);
1769 frv_frame_insn (gen_rtx_SET (Pmode, mem, reg),
1770 gen_rtx_PARALLEL (VOIDmode,
1771 gen_rtvec (2, set1, set2)));
1773 else
1774 frv_frame_insn (gen_rtx_SET (Pmode, mem, reg),
1775 frv_dwarf_store (reg, stack_offset));
1779 /* A function that uses frv_frame_access to transfer a group of registers to
1780 or from the stack. ACCESSOR is passed directly to frv_frame_access, INFO
1781 is the stack information generated by frv_stack_info, and REG_SET is the
1782 number of the register set to transfer. */
1783 static void
1784 frv_frame_access_multi (frv_frame_accessor_t *accessor,
1785 frv_stack_t *info,
1786 int reg_set)
1788 frv_stack_regs_t *regs_info;
1789 int regno;
1791 regs_info = &info->regs[reg_set];
1792 for (regno = regs_info->first; regno <= regs_info->last; regno++)
1793 if (info->save_p[regno])
1794 frv_frame_access (accessor,
1795 info->save_p[regno] == REG_SAVE_2WORDS
1796 ? gen_rtx_REG (DImode, regno)
1797 : gen_rtx_REG (SImode, regno),
1798 info->reg_offset[regno]);
1801 /* Save or restore callee-saved registers that are kept outside the frame
1802 header. The function saves the registers if OP is FRV_STORE and restores
1803 them if OP is FRV_LOAD. INFO is the stack information generated by
1804 frv_stack_info. */
1805 static void
1806 frv_frame_access_standard_regs (enum frv_stack_op op, frv_stack_t *info)
1808 frv_frame_accessor_t accessor;
1810 accessor.op = op;
1811 accessor.base = stack_pointer_rtx;
1812 accessor.base_offset = 0;
1813 frv_frame_access_multi (&accessor, info, STACK_REGS_GPR);
1814 frv_frame_access_multi (&accessor, info, STACK_REGS_FPR);
1815 frv_frame_access_multi (&accessor, info, STACK_REGS_LCR);
1819 /* Called after register allocation to add any instructions needed for the
1820 prologue. Using a prologue insn is favored compared to putting all of the
1821 instructions in the TARGET_ASM_FUNCTION_PROLOGUE target hook, since
1822 it allows the scheduler to intermix instructions with the saves of
1823 the caller saved registers. In some cases, it might be necessary
1824 to emit a barrier instruction as the last insn to prevent such
1825 scheduling.
1827 Also any insns generated here should have RTX_FRAME_RELATED_P(insn) = 1
1828 so that the debug info generation code can handle them properly. */
1829 void
1830 frv_expand_prologue (void)
1832 frv_stack_t *info = frv_stack_info ();
1833 rtx sp = stack_pointer_rtx;
1834 rtx fp = frame_pointer_rtx;
1835 frv_frame_accessor_t accessor;
1837 if (TARGET_DEBUG_STACK)
1838 frv_debug_stack (info);
1840 if (info->total_size == 0)
1841 return;
1843 /* We're interested in three areas of the frame here:
1845 A: the register save area
1846 B: the old FP
1847 C: the header after B
1849 If the frame pointer isn't used, we'll have to set up A, B and C
1850 using the stack pointer. If the frame pointer is used, we'll access
1851 them as follows:
1853 A: set up using sp
1854 B: set up using sp or a temporary (see below)
1855 C: set up using fp
1857 We set up B using the stack pointer if the frame is small enough.
1858 Otherwise, it's more efficient to copy the old stack pointer into a
1859 temporary and use that.
1861 Note that it's important to make sure the prologue and epilogue use the
1862 same registers to access A and C, since doing otherwise will confuse
1863 the aliasing code. */
1865 /* Set up ACCESSOR for accessing region B above. If the frame pointer
1866 isn't used, the same method will serve for C. */
1867 accessor.op = FRV_STORE;
1868 if (frame_pointer_needed && info->total_size > 2048)
1870 rtx insn;
1872 accessor.base = gen_rtx_REG (Pmode, OLD_SP_REGNO);
1873 accessor.base_offset = info->total_size;
1874 insn = emit_insn (gen_movsi (accessor.base, sp));
1876 else
1878 accessor.base = stack_pointer_rtx;
1879 accessor.base_offset = 0;
1882 /* Allocate the stack space. */
1884 rtx asm_offset = frv_frame_offset_rtx (-info->total_size);
1885 rtx dwarf_offset = GEN_INT (-info->total_size);
1887 frv_frame_insn (gen_stack_adjust (sp, sp, asm_offset),
1888 gen_rtx_SET (Pmode,
1890 gen_rtx_PLUS (Pmode, sp, dwarf_offset)));
1893 /* If the frame pointer is needed, store the old one at (sp + FP_OFFSET)
1894 and point the new one to that location. */
1895 if (frame_pointer_needed)
1897 int fp_offset = info->reg_offset[FRAME_POINTER_REGNUM];
1899 /* ASM_SRC and DWARF_SRC both point to the frame header. ASM_SRC is
1900 based on ACCESSOR.BASE but DWARF_SRC is always based on the stack
1901 pointer. */
1902 rtx asm_src = plus_constant (accessor.base,
1903 fp_offset - accessor.base_offset);
1904 rtx dwarf_src = plus_constant (sp, fp_offset);
1906 /* Store the old frame pointer at (sp + FP_OFFSET). */
1907 frv_frame_access (&accessor, fp, fp_offset);
1909 /* Set up the new frame pointer. */
1910 frv_frame_insn (gen_rtx_SET (VOIDmode, fp, asm_src),
1911 gen_rtx_SET (VOIDmode, fp, dwarf_src));
1913 /* Access region C from the frame pointer. */
1914 accessor.base = fp;
1915 accessor.base_offset = fp_offset;
1918 /* Set up region C. */
1919 frv_frame_access_multi (&accessor, info, STACK_REGS_STRUCT);
1920 frv_frame_access_multi (&accessor, info, STACK_REGS_LR);
1921 frv_frame_access_multi (&accessor, info, STACK_REGS_STDARG);
1923 /* Set up region A. */
1924 frv_frame_access_standard_regs (FRV_STORE, info);
1926 /* If this is a varargs/stdarg function, issue a blockage to prevent the
1927 scheduler from moving loads before the stores saving the registers. */
1928 if (info->stdarg_size > 0)
1929 emit_insn (gen_blockage ());
1931 /* Set up pic register/small data register for this function. */
1932 if (!TARGET_FDPIC && flag_pic && crtl->uses_pic_offset_table)
1933 emit_insn (gen_pic_prologue (gen_rtx_REG (Pmode, PIC_REGNO),
1934 gen_rtx_REG (Pmode, LR_REGNO),
1935 gen_rtx_REG (SImode, OFFSET_REGNO)));
1939 /* Under frv, all of the work is done via frv_expand_epilogue, but
1940 this function provides a convenient place to do cleanup. */
1942 static void
1943 frv_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
1944 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
1946 frv_stack_cache = (frv_stack_t *)0;
1948 /* Zap last used registers for conditional execution. */
1949 memset (&frv_ifcvt.tmp_reg, 0, sizeof (frv_ifcvt.tmp_reg));
1951 /* Release the bitmap of created insns. */
1952 BITMAP_FREE (frv_ifcvt.scratch_insns_bitmap);
1956 /* Called after register allocation to add any instructions needed for the
1957 epilogue. Using an epilogue insn is favored compared to putting all of the
1958 instructions in the TARGET_ASM_FUNCTION_PROLOGUE target hook, since
1959 it allows the scheduler to intermix instructions with the saves of
1960 the caller saved registers. In some cases, it might be necessary
1961 to emit a barrier instruction as the last insn to prevent such
1962 scheduling. */
1964 void
1965 frv_expand_epilogue (bool emit_return)
1967 frv_stack_t *info = frv_stack_info ();
1968 rtx fp = frame_pointer_rtx;
1969 rtx sp = stack_pointer_rtx;
1970 rtx return_addr;
1971 int fp_offset;
1973 fp_offset = info->reg_offset[FRAME_POINTER_REGNUM];
1975 /* Restore the stack pointer to its original value if alloca or the like
1976 is used. */
1977 if (! current_function_sp_is_unchanging)
1978 emit_insn (gen_addsi3 (sp, fp, frv_frame_offset_rtx (-fp_offset)));
1980 /* Restore the callee-saved registers that were used in this function. */
1981 frv_frame_access_standard_regs (FRV_LOAD, info);
1983 /* Set RETURN_ADDR to the address we should return to. Set it to NULL if
1984 no return instruction should be emitted. */
1985 if (info->save_p[LR_REGNO])
1987 int lr_offset;
1988 rtx mem;
1990 /* Use the same method to access the link register's slot as we did in
1991 the prologue. In other words, use the frame pointer if available,
1992 otherwise use the stack pointer.
1994 LR_OFFSET is the offset of the link register's slot from the start
1995 of the frame and MEM is a memory rtx for it. */
1996 lr_offset = info->reg_offset[LR_REGNO];
1997 if (frame_pointer_needed)
1998 mem = frv_frame_mem (Pmode, fp, lr_offset - fp_offset);
1999 else
2000 mem = frv_frame_mem (Pmode, sp, lr_offset);
2002 /* Load the old link register into a GPR. */
2003 return_addr = gen_rtx_REG (Pmode, TEMP_REGNO);
2004 emit_insn (gen_rtx_SET (VOIDmode, return_addr, mem));
2006 else
2007 return_addr = gen_rtx_REG (Pmode, LR_REGNO);
2009 /* Restore the old frame pointer. Emit a USE afterwards to make sure
2010 the load is preserved. */
2011 if (frame_pointer_needed)
2013 emit_insn (gen_rtx_SET (VOIDmode, fp, gen_rtx_MEM (Pmode, fp)));
2014 emit_use (fp);
2017 /* Deallocate the stack frame. */
2018 if (info->total_size != 0)
2020 rtx offset = frv_frame_offset_rtx (info->total_size);
2021 emit_insn (gen_stack_adjust (sp, sp, offset));
2024 /* If this function uses eh_return, add the final stack adjustment now. */
2025 if (crtl->calls_eh_return)
2026 emit_insn (gen_stack_adjust (sp, sp, EH_RETURN_STACKADJ_RTX));
2028 if (emit_return)
2029 emit_jump_insn (gen_epilogue_return (return_addr));
2030 else
2032 rtx lr = return_addr;
2034 if (REGNO (return_addr) != LR_REGNO)
2036 lr = gen_rtx_REG (Pmode, LR_REGNO);
2037 emit_move_insn (lr, return_addr);
2040 emit_use (lr);
2045 /* Worker function for TARGET_ASM_OUTPUT_MI_THUNK. */
2047 static void
2048 frv_asm_output_mi_thunk (FILE *file,
2049 tree thunk_fndecl ATTRIBUTE_UNUSED,
2050 HOST_WIDE_INT delta,
2051 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED,
2052 tree function)
2054 const char *name_func = XSTR (XEXP (DECL_RTL (function), 0), 0);
2055 const char *name_arg0 = reg_names[FIRST_ARG_REGNUM];
2056 const char *name_jmp = reg_names[JUMP_REGNO];
2057 const char *parallel = (frv_issue_rate () > 1 ? ".p" : "");
2059 /* Do the add using an addi if possible. */
2060 if (IN_RANGE_P (delta, -2048, 2047))
2061 fprintf (file, "\taddi %s,#%d,%s\n", name_arg0, (int) delta, name_arg0);
2062 else
2064 const char *const name_add = reg_names[TEMP_REGNO];
2065 fprintf (file, "\tsethi%s #hi(" HOST_WIDE_INT_PRINT_DEC "),%s\n",
2066 parallel, delta, name_add);
2067 fprintf (file, "\tsetlo #lo(" HOST_WIDE_INT_PRINT_DEC "),%s\n",
2068 delta, name_add);
2069 fprintf (file, "\tadd %s,%s,%s\n", name_add, name_arg0, name_arg0);
2072 if (TARGET_FDPIC)
2074 const char *name_pic = reg_names[FDPIC_REGNO];
2075 name_jmp = reg_names[FDPIC_FPTR_REGNO];
2077 if (flag_pic != 1)
2079 fprintf (file, "\tsethi%s #gotofffuncdeschi(", parallel);
2080 assemble_name (file, name_func);
2081 fprintf (file, "),%s\n", name_jmp);
2083 fprintf (file, "\tsetlo #gotofffuncdesclo(");
2084 assemble_name (file, name_func);
2085 fprintf (file, "),%s\n", name_jmp);
2087 fprintf (file, "\tldd @(%s,%s), %s\n", name_jmp, name_pic, name_jmp);
2089 else
2091 fprintf (file, "\tlddo @(%s,#gotofffuncdesc12(", name_pic);
2092 assemble_name (file, name_func);
2093 fprintf (file, "\t)), %s\n", name_jmp);
2096 else if (!flag_pic)
2098 fprintf (file, "\tsethi%s #hi(", parallel);
2099 assemble_name (file, name_func);
2100 fprintf (file, "),%s\n", name_jmp);
2102 fprintf (file, "\tsetlo #lo(");
2103 assemble_name (file, name_func);
2104 fprintf (file, "),%s\n", name_jmp);
2106 else
2108 /* Use JUMP_REGNO as a temporary PIC register. */
2109 const char *name_lr = reg_names[LR_REGNO];
2110 const char *name_gppic = name_jmp;
2111 const char *name_tmp = reg_names[TEMP_REGNO];
2113 fprintf (file, "\tmovsg %s,%s\n", name_lr, name_tmp);
2114 fprintf (file, "\tcall 1f\n");
2115 fprintf (file, "1:\tmovsg %s,%s\n", name_lr, name_gppic);
2116 fprintf (file, "\tmovgs %s,%s\n", name_tmp, name_lr);
2117 fprintf (file, "\tsethi%s #gprelhi(1b),%s\n", parallel, name_tmp);
2118 fprintf (file, "\tsetlo #gprello(1b),%s\n", name_tmp);
2119 fprintf (file, "\tsub %s,%s,%s\n", name_gppic, name_tmp, name_gppic);
2121 fprintf (file, "\tsethi%s #gprelhi(", parallel);
2122 assemble_name (file, name_func);
2123 fprintf (file, "),%s\n", name_tmp);
2125 fprintf (file, "\tsetlo #gprello(");
2126 assemble_name (file, name_func);
2127 fprintf (file, "),%s\n", name_tmp);
2129 fprintf (file, "\tadd %s,%s,%s\n", name_gppic, name_tmp, name_jmp);
2132 /* Jump to the function address. */
2133 fprintf (file, "\tjmpl @(%s,%s)\n", name_jmp, reg_names[GPR_FIRST+0]);
2138 /* On frv, create a frame whenever we need to create stack. */
2140 static bool
2141 frv_frame_pointer_required (void)
2143 /* If we forgoing the usual linkage requirements, we only need
2144 a frame pointer if the stack pointer might change. */
2145 if (!TARGET_LINKED_FP)
2146 return !current_function_sp_is_unchanging;
2148 if (! current_function_is_leaf)
2149 return true;
2151 if (get_frame_size () != 0)
2152 return true;
2154 if (cfun->stdarg)
2155 return true;
2157 if (!current_function_sp_is_unchanging)
2158 return true;
2160 if (!TARGET_FDPIC && flag_pic && crtl->uses_pic_offset_table)
2161 return true;
2163 if (profile_flag)
2164 return true;
2166 if (cfun->machine->frame_needed)
2167 return true;
2169 return false;
2173 /* Worker function for TARGET_CAN_ELIMINATE. */
2175 bool
2176 frv_can_eliminate (const int from, const int to)
2178 return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
2179 ? ! frame_pointer_needed
2180 : true);
2183 /* This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'. It specifies the
2184 initial difference between the specified pair of registers. This macro must
2185 be defined if `ELIMINABLE_REGS' is defined. */
2187 /* See frv_stack_info for more details on the frv stack frame. */
2190 frv_initial_elimination_offset (int from, int to)
2192 frv_stack_t *info = frv_stack_info ();
2193 int ret = 0;
2195 if (to == STACK_POINTER_REGNUM && from == ARG_POINTER_REGNUM)
2196 ret = info->total_size - info->pretend_size;
2198 else if (to == STACK_POINTER_REGNUM && from == FRAME_POINTER_REGNUM)
2199 ret = info->reg_offset[FRAME_POINTER_REGNUM];
2201 else if (to == FRAME_POINTER_REGNUM && from == ARG_POINTER_REGNUM)
2202 ret = (info->total_size
2203 - info->reg_offset[FRAME_POINTER_REGNUM]
2204 - info->pretend_size);
2206 else
2207 gcc_unreachable ();
2209 if (TARGET_DEBUG_STACK)
2210 fprintf (stderr, "Eliminate %s to %s by adding %d\n",
2211 reg_names [from], reg_names[to], ret);
2213 return ret;
2217 /* Worker function for TARGET_SETUP_INCOMING_VARARGS. */
2219 static void
2220 frv_setup_incoming_varargs (CUMULATIVE_ARGS *cum,
2221 enum machine_mode mode,
2222 tree type ATTRIBUTE_UNUSED,
2223 int *pretend_size,
2224 int second_time)
2226 if (TARGET_DEBUG_ARG)
2227 fprintf (stderr,
2228 "setup_vararg: words = %2d, mode = %4s, pretend_size = %d, second_time = %d\n",
2229 *cum, GET_MODE_NAME (mode), *pretend_size, second_time);
2233 /* Worker function for TARGET_EXPAND_BUILTIN_SAVEREGS. */
2235 static rtx
2236 frv_expand_builtin_saveregs (void)
2238 int offset = UNITS_PER_WORD * FRV_NUM_ARG_REGS;
2240 if (TARGET_DEBUG_ARG)
2241 fprintf (stderr, "expand_builtin_saveregs: offset from ap = %d\n",
2242 offset);
2244 return gen_rtx_PLUS (Pmode, virtual_incoming_args_rtx, GEN_INT (- offset));
2248 /* Expand __builtin_va_start to do the va_start macro. */
2250 static void
2251 frv_expand_builtin_va_start (tree valist, rtx nextarg)
2253 tree t;
2254 int num = crtl->args.info - FIRST_ARG_REGNUM - FRV_NUM_ARG_REGS;
2256 nextarg = gen_rtx_PLUS (Pmode, virtual_incoming_args_rtx,
2257 GEN_INT (UNITS_PER_WORD * num));
2259 if (TARGET_DEBUG_ARG)
2261 fprintf (stderr, "va_start: args_info = %d, num = %d\n",
2262 crtl->args.info, num);
2264 debug_rtx (nextarg);
2267 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist,
2268 fold_convert (TREE_TYPE (valist),
2269 make_tree (sizetype, nextarg)));
2270 TREE_SIDE_EFFECTS (t) = 1;
2272 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2276 /* Expand a block move operation, and return 1 if successful. Return 0
2277 if we should let the compiler generate normal code.
2279 operands[0] is the destination
2280 operands[1] is the source
2281 operands[2] is the length
2282 operands[3] is the alignment */
2284 /* Maximum number of loads to do before doing the stores */
2285 #ifndef MAX_MOVE_REG
2286 #define MAX_MOVE_REG 4
2287 #endif
2289 /* Maximum number of total loads to do. */
2290 #ifndef TOTAL_MOVE_REG
2291 #define TOTAL_MOVE_REG 8
2292 #endif
2295 frv_expand_block_move (rtx operands[])
2297 rtx orig_dest = operands[0];
2298 rtx orig_src = operands[1];
2299 rtx bytes_rtx = operands[2];
2300 rtx align_rtx = operands[3];
2301 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
2302 int align;
2303 int bytes;
2304 int offset;
2305 int num_reg;
2306 int i;
2307 rtx src_reg;
2308 rtx dest_reg;
2309 rtx src_addr;
2310 rtx dest_addr;
2311 rtx src_mem;
2312 rtx dest_mem;
2313 rtx tmp_reg;
2314 rtx stores[MAX_MOVE_REG];
2315 int move_bytes;
2316 enum machine_mode mode;
2318 /* If this is not a fixed size move, just call memcpy. */
2319 if (! constp)
2320 return FALSE;
2322 /* This should be a fixed size alignment. */
2323 gcc_assert (GET_CODE (align_rtx) == CONST_INT);
2325 align = INTVAL (align_rtx);
2327 /* Anything to move? */
2328 bytes = INTVAL (bytes_rtx);
2329 if (bytes <= 0)
2330 return TRUE;
2332 /* Don't support real large moves. */
2333 if (bytes > TOTAL_MOVE_REG*align)
2334 return FALSE;
2336 /* Move the address into scratch registers. */
2337 dest_reg = copy_addr_to_reg (XEXP (orig_dest, 0));
2338 src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
2340 num_reg = offset = 0;
2341 for ( ; bytes > 0; (bytes -= move_bytes), (offset += move_bytes))
2343 /* Calculate the correct offset for src/dest. */
2344 if (offset == 0)
2346 src_addr = src_reg;
2347 dest_addr = dest_reg;
2349 else
2351 src_addr = plus_constant (src_reg, offset);
2352 dest_addr = plus_constant (dest_reg, offset);
2355 /* Generate the appropriate load and store, saving the stores
2356 for later. */
2357 if (bytes >= 4 && align >= 4)
2358 mode = SImode;
2359 else if (bytes >= 2 && align >= 2)
2360 mode = HImode;
2361 else
2362 mode = QImode;
2364 move_bytes = GET_MODE_SIZE (mode);
2365 tmp_reg = gen_reg_rtx (mode);
2366 src_mem = change_address (orig_src, mode, src_addr);
2367 dest_mem = change_address (orig_dest, mode, dest_addr);
2368 emit_insn (gen_rtx_SET (VOIDmode, tmp_reg, src_mem));
2369 stores[num_reg++] = gen_rtx_SET (VOIDmode, dest_mem, tmp_reg);
2371 if (num_reg >= MAX_MOVE_REG)
2373 for (i = 0; i < num_reg; i++)
2374 emit_insn (stores[i]);
2375 num_reg = 0;
2379 for (i = 0; i < num_reg; i++)
2380 emit_insn (stores[i]);
2382 return TRUE;
2386 /* Expand a block clear operation, and return 1 if successful. Return 0
2387 if we should let the compiler generate normal code.
2389 operands[0] is the destination
2390 operands[1] is the length
2391 operands[3] is the alignment */
2394 frv_expand_block_clear (rtx operands[])
2396 rtx orig_dest = operands[0];
2397 rtx bytes_rtx = operands[1];
2398 rtx align_rtx = operands[3];
2399 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
2400 int align;
2401 int bytes;
2402 int offset;
2403 int num_reg;
2404 rtx dest_reg;
2405 rtx dest_addr;
2406 rtx dest_mem;
2407 int clear_bytes;
2408 enum machine_mode mode;
2410 /* If this is not a fixed size move, just call memcpy. */
2411 if (! constp)
2412 return FALSE;
2414 /* This should be a fixed size alignment. */
2415 gcc_assert (GET_CODE (align_rtx) == CONST_INT);
2417 align = INTVAL (align_rtx);
2419 /* Anything to move? */
2420 bytes = INTVAL (bytes_rtx);
2421 if (bytes <= 0)
2422 return TRUE;
2424 /* Don't support real large clears. */
2425 if (bytes > TOTAL_MOVE_REG*align)
2426 return FALSE;
2428 /* Move the address into a scratch register. */
2429 dest_reg = copy_addr_to_reg (XEXP (orig_dest, 0));
2431 num_reg = offset = 0;
2432 for ( ; bytes > 0; (bytes -= clear_bytes), (offset += clear_bytes))
2434 /* Calculate the correct offset for src/dest. */
2435 dest_addr = ((offset == 0)
2436 ? dest_reg
2437 : plus_constant (dest_reg, offset));
2439 /* Generate the appropriate store of gr0. */
2440 if (bytes >= 4 && align >= 4)
2441 mode = SImode;
2442 else if (bytes >= 2 && align >= 2)
2443 mode = HImode;
2444 else
2445 mode = QImode;
2447 clear_bytes = GET_MODE_SIZE (mode);
2448 dest_mem = change_address (orig_dest, mode, dest_addr);
2449 emit_insn (gen_rtx_SET (VOIDmode, dest_mem, const0_rtx));
2452 return TRUE;
2456 /* The following variable is used to output modifiers of assembler
2457 code of the current output insn. */
2459 static rtx *frv_insn_operands;
2461 /* The following function is used to add assembler insn code suffix .p
2462 if it is necessary. */
2464 const char *
2465 frv_asm_output_opcode (FILE *f, const char *ptr)
2467 int c;
2469 if (frv_insn_packing_flag <= 0)
2470 return ptr;
2472 for (; *ptr && *ptr != ' ' && *ptr != '\t';)
2474 c = *ptr++;
2475 if (c == '%' && ((*ptr >= 'a' && *ptr <= 'z')
2476 || (*ptr >= 'A' && *ptr <= 'Z')))
2478 int letter = *ptr++;
2480 c = atoi (ptr);
2481 frv_print_operand (f, frv_insn_operands [c], letter);
2482 while ((c = *ptr) >= '0' && c <= '9')
2483 ptr++;
2485 else
2486 fputc (c, f);
2489 fprintf (f, ".p");
2491 return ptr;
2494 /* Set up the packing bit for the current output insn. Note that this
2495 function is not called for asm insns. */
2497 void
2498 frv_final_prescan_insn (rtx insn, rtx *opvec,
2499 int noperands ATTRIBUTE_UNUSED)
2501 if (INSN_P (insn))
2503 if (frv_insn_packing_flag >= 0)
2505 frv_insn_operands = opvec;
2506 frv_insn_packing_flag = PACKING_FLAG_P (insn);
2508 else if (recog_memoized (insn) >= 0
2509 && get_attr_acc_group (insn) == ACC_GROUP_ODD)
2510 /* Packing optimizations have been disabled, but INSN can only
2511 be issued in M1. Insert an mnop in M0. */
2512 fprintf (asm_out_file, "\tmnop.p\n");
2518 /* A C expression whose value is RTL representing the address in a stack frame
2519 where the pointer to the caller's frame is stored. Assume that FRAMEADDR is
2520 an RTL expression for the address of the stack frame itself.
2522 If you don't define this macro, the default is to return the value of
2523 FRAMEADDR--that is, the stack frame address is also the address of the stack
2524 word that points to the previous frame. */
2526 /* The default is correct, but we need to make sure the frame gets created. */
2528 frv_dynamic_chain_address (rtx frame)
2530 cfun->machine->frame_needed = 1;
2531 return frame;
2535 /* A C expression whose value is RTL representing the value of the return
2536 address for the frame COUNT steps up from the current frame, after the
2537 prologue. FRAMEADDR is the frame pointer of the COUNT frame, or the frame
2538 pointer of the COUNT - 1 frame if `RETURN_ADDR_IN_PREVIOUS_FRAME' is
2539 defined.
2541 The value of the expression must always be the correct address when COUNT is
2542 zero, but may be `NULL_RTX' if there is not way to determine the return
2543 address of other frames. */
2546 frv_return_addr_rtx (int count, rtx frame)
2548 if (count != 0)
2549 return const0_rtx;
2550 cfun->machine->frame_needed = 1;
2551 return gen_rtx_MEM (Pmode, plus_constant (frame, 8));
2554 /* Given a memory reference MEMREF, interpret the referenced memory as
2555 an array of MODE values, and return a reference to the element
2556 specified by INDEX. Assume that any pre-modification implicit in
2557 MEMREF has already happened.
2559 MEMREF must be a legitimate operand for modes larger than SImode.
2560 frv_legitimate_address_p forbids register+register addresses, which
2561 this function cannot handle. */
2563 frv_index_memory (rtx memref, enum machine_mode mode, int index)
2565 rtx base = XEXP (memref, 0);
2566 if (GET_CODE (base) == PRE_MODIFY)
2567 base = XEXP (base, 0);
2568 return change_address (memref, mode,
2569 plus_constant (base, index * GET_MODE_SIZE (mode)));
2573 /* Print a memory address as an operand to reference that memory location. */
2574 static void
2575 frv_print_operand_address (FILE * stream, rtx x)
2577 if (GET_CODE (x) == MEM)
2578 x = XEXP (x, 0);
2580 switch (GET_CODE (x))
2582 case REG:
2583 fputs (reg_names [ REGNO (x)], stream);
2584 return;
2586 case CONST_INT:
2587 fprintf (stream, "%ld", (long) INTVAL (x));
2588 return;
2590 case SYMBOL_REF:
2591 assemble_name (stream, XSTR (x, 0));
2592 return;
2594 case LABEL_REF:
2595 case CONST:
2596 output_addr_const (stream, x);
2597 return;
2599 case PLUS:
2600 /* Poorly constructed asm statements can trigger this alternative.
2601 See gcc/testsuite/gcc.dg/asm-4.c for an example. */
2602 frv_print_operand_memory_reference (stream, x, 0);
2603 return;
2605 default:
2606 break;
2609 fatal_insn ("bad insn to frv_print_operand_address:", x);
2613 static void
2614 frv_print_operand_memory_reference_reg (FILE * stream, rtx x)
2616 int regno = true_regnum (x);
2617 if (GPR_P (regno))
2618 fputs (reg_names[regno], stream);
2619 else
2620 fatal_insn ("bad register to frv_print_operand_memory_reference_reg:", x);
2623 /* Print a memory reference suitable for the ld/st instructions. */
2625 static void
2626 frv_print_operand_memory_reference (FILE * stream, rtx x, int addr_offset)
2628 struct frv_unspec unspec;
2629 rtx x0 = NULL_RTX;
2630 rtx x1 = NULL_RTX;
2632 switch (GET_CODE (x))
2634 case SUBREG:
2635 case REG:
2636 x0 = x;
2637 break;
2639 case PRE_MODIFY: /* (pre_modify (reg) (plus (reg) (reg))) */
2640 x0 = XEXP (x, 0);
2641 x1 = XEXP (XEXP (x, 1), 1);
2642 break;
2644 case CONST_INT:
2645 x1 = x;
2646 break;
2648 case PLUS:
2649 x0 = XEXP (x, 0);
2650 x1 = XEXP (x, 1);
2651 if (GET_CODE (x0) == CONST_INT)
2653 x0 = XEXP (x, 1);
2654 x1 = XEXP (x, 0);
2656 break;
2658 default:
2659 fatal_insn ("bad insn to frv_print_operand_memory_reference:", x);
2660 break;
2664 if (addr_offset)
2666 if (!x1)
2667 x1 = const0_rtx;
2668 else if (GET_CODE (x1) != CONST_INT)
2669 fatal_insn ("bad insn to frv_print_operand_memory_reference:", x);
2672 fputs ("@(", stream);
2673 if (!x0)
2674 fputs (reg_names[GPR_R0], stream);
2675 else if (GET_CODE (x0) == REG || GET_CODE (x0) == SUBREG)
2676 frv_print_operand_memory_reference_reg (stream, x0);
2677 else
2678 fatal_insn ("bad insn to frv_print_operand_memory_reference:", x);
2680 fputs (",", stream);
2681 if (!x1)
2682 fputs (reg_names [GPR_R0], stream);
2684 else
2686 switch (GET_CODE (x1))
2688 case SUBREG:
2689 case REG:
2690 frv_print_operand_memory_reference_reg (stream, x1);
2691 break;
2693 case CONST_INT:
2694 fprintf (stream, "%ld", (long) (INTVAL (x1) + addr_offset));
2695 break;
2697 case CONST:
2698 if (!frv_const_unspec_p (x1, &unspec))
2699 fatal_insn ("bad insn to frv_print_operand_memory_reference:", x1);
2700 frv_output_const_unspec (stream, &unspec);
2701 break;
2703 default:
2704 fatal_insn ("bad insn to frv_print_operand_memory_reference:", x);
2708 fputs (")", stream);
2712 /* Return 2 for likely branches and 0 for non-likely branches */
2714 #define FRV_JUMP_LIKELY 2
2715 #define FRV_JUMP_NOT_LIKELY 0
2717 static int
2718 frv_print_operand_jump_hint (rtx insn)
2720 rtx note;
2721 rtx labelref;
2722 int ret;
2723 HOST_WIDE_INT prob = -1;
2724 enum { UNKNOWN, BACKWARD, FORWARD } jump_type = UNKNOWN;
2726 gcc_assert (GET_CODE (insn) == JUMP_INSN);
2728 /* Assume any non-conditional jump is likely. */
2729 if (! any_condjump_p (insn))
2730 ret = FRV_JUMP_LIKELY;
2732 else
2734 labelref = condjump_label (insn);
2735 if (labelref)
2737 rtx label = XEXP (labelref, 0);
2738 jump_type = (insn_current_address > INSN_ADDRESSES (INSN_UID (label))
2739 ? BACKWARD
2740 : FORWARD);
2743 note = find_reg_note (insn, REG_BR_PROB, 0);
2744 if (!note)
2745 ret = ((jump_type == BACKWARD) ? FRV_JUMP_LIKELY : FRV_JUMP_NOT_LIKELY);
2747 else
2749 prob = INTVAL (XEXP (note, 0));
2750 ret = ((prob >= (REG_BR_PROB_BASE / 2))
2751 ? FRV_JUMP_LIKELY
2752 : FRV_JUMP_NOT_LIKELY);
2756 #if 0
2757 if (TARGET_DEBUG)
2759 char *direction;
2761 switch (jump_type)
2763 default:
2764 case UNKNOWN: direction = "unknown jump direction"; break;
2765 case BACKWARD: direction = "jump backward"; break;
2766 case FORWARD: direction = "jump forward"; break;
2769 fprintf (stderr,
2770 "%s: uid %ld, %s, probability = %ld, max prob. = %ld, hint = %d\n",
2771 IDENTIFIER_POINTER (DECL_NAME (current_function_decl)),
2772 (long)INSN_UID (insn), direction, (long)prob,
2773 (long)REG_BR_PROB_BASE, ret);
2775 #endif
2777 return ret;
2781 /* Return the comparison operator to use for CODE given that the ICC
2782 register is OP0. */
2784 static const char *
2785 comparison_string (enum rtx_code code, rtx op0)
2787 bool is_nz_p = GET_MODE (op0) == CC_NZmode;
2788 switch (code)
2790 default: output_operand_lossage ("bad condition code");
2791 case EQ: return "eq";
2792 case NE: return "ne";
2793 case LT: return is_nz_p ? "n" : "lt";
2794 case LE: return "le";
2795 case GT: return "gt";
2796 case GE: return is_nz_p ? "p" : "ge";
2797 case LTU: return is_nz_p ? "no" : "c";
2798 case LEU: return is_nz_p ? "eq" : "ls";
2799 case GTU: return is_nz_p ? "ne" : "hi";
2800 case GEU: return is_nz_p ? "ra" : "nc";
2804 /* Print an operand to an assembler instruction.
2806 `%' followed by a letter and a digit says to output an operand in an
2807 alternate fashion. Four letters have standard, built-in meanings
2808 described below. The hook `TARGET_PRINT_OPERAND' can define
2809 additional letters with nonstandard meanings.
2811 `%cDIGIT' can be used to substitute an operand that is a constant value
2812 without the syntax that normally indicates an immediate operand.
2814 `%nDIGIT' is like `%cDIGIT' except that the value of the constant is negated
2815 before printing.
2817 `%aDIGIT' can be used to substitute an operand as if it were a memory
2818 reference, with the actual operand treated as the address. This may be
2819 useful when outputting a "load address" instruction, because often the
2820 assembler syntax for such an instruction requires you to write the operand
2821 as if it were a memory reference.
2823 `%lDIGIT' is used to substitute a `label_ref' into a jump instruction.
2825 `%=' outputs a number which is unique to each instruction in the entire
2826 compilation. This is useful for making local labels to be referred to more
2827 than once in a single template that generates multiple assembler
2828 instructions.
2830 `%' followed by a punctuation character specifies a substitution that
2831 does not use an operand. Only one case is standard: `%%' outputs a
2832 `%' into the assembler code. Other nonstandard cases can be defined
2833 in the `TARGET_PRINT_OPERAND' hook. You must also define which
2834 punctuation characters are valid with the
2835 `TARGET_PRINT_OPERAND_PUNCT_VALID_P' hook. */
2837 static void
2838 frv_print_operand (FILE * file, rtx x, int code)
2840 struct frv_unspec unspec;
2841 HOST_WIDE_INT value;
2842 int offset;
2844 if (code != 0 && !ISALPHA (code))
2845 value = 0;
2847 else if (GET_CODE (x) == CONST_INT)
2848 value = INTVAL (x);
2850 else if (GET_CODE (x) == CONST_DOUBLE)
2852 if (GET_MODE (x) == SFmode)
2854 REAL_VALUE_TYPE rv;
2855 long l;
2857 REAL_VALUE_FROM_CONST_DOUBLE (rv, x);
2858 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
2859 value = l;
2862 else if (GET_MODE (x) == VOIDmode)
2863 value = CONST_DOUBLE_LOW (x);
2865 else
2866 fatal_insn ("bad insn in frv_print_operand, bad const_double", x);
2869 else
2870 value = 0;
2872 switch (code)
2875 case '.':
2876 /* Output r0. */
2877 fputs (reg_names[GPR_R0], file);
2878 break;
2880 case '#':
2881 fprintf (file, "%d", frv_print_operand_jump_hint (current_output_insn));
2882 break;
2884 case '@':
2885 /* Output small data area base register (gr16). */
2886 fputs (reg_names[SDA_BASE_REG], file);
2887 break;
2889 case '~':
2890 /* Output pic register (gr17). */
2891 fputs (reg_names[PIC_REGNO], file);
2892 break;
2894 case '*':
2895 /* Output the temporary integer CCR register. */
2896 fputs (reg_names[ICR_TEMP], file);
2897 break;
2899 case '&':
2900 /* Output the temporary integer CC register. */
2901 fputs (reg_names[ICC_TEMP], file);
2902 break;
2904 /* case 'a': print an address. */
2906 case 'C':
2907 /* Print appropriate test for integer branch false operation. */
2908 fputs (comparison_string (reverse_condition (GET_CODE (x)),
2909 XEXP (x, 0)), file);
2910 break;
2912 case 'c':
2913 /* Print appropriate test for integer branch true operation. */
2914 fputs (comparison_string (GET_CODE (x), XEXP (x, 0)), file);
2915 break;
2917 case 'e':
2918 /* Print 1 for a NE and 0 for an EQ to give the final argument
2919 for a conditional instruction. */
2920 if (GET_CODE (x) == NE)
2921 fputs ("1", file);
2923 else if (GET_CODE (x) == EQ)
2924 fputs ("0", file);
2926 else
2927 fatal_insn ("bad insn to frv_print_operand, 'e' modifier:", x);
2928 break;
2930 case 'F':
2931 /* Print appropriate test for floating point branch false operation. */
2932 switch (GET_CODE (x))
2934 default:
2935 fatal_insn ("bad insn to frv_print_operand, 'F' modifier:", x);
2937 case EQ: fputs ("ne", file); break;
2938 case NE: fputs ("eq", file); break;
2939 case LT: fputs ("uge", file); break;
2940 case LE: fputs ("ug", file); break;
2941 case GT: fputs ("ule", file); break;
2942 case GE: fputs ("ul", file); break;
2944 break;
2946 case 'f':
2947 /* Print appropriate test for floating point branch true operation. */
2948 switch (GET_CODE (x))
2950 default:
2951 fatal_insn ("bad insn to frv_print_operand, 'f' modifier:", x);
2953 case EQ: fputs ("eq", file); break;
2954 case NE: fputs ("ne", file); break;
2955 case LT: fputs ("lt", file); break;
2956 case LE: fputs ("le", file); break;
2957 case GT: fputs ("gt", file); break;
2958 case GE: fputs ("ge", file); break;
2960 break;
2962 case 'g':
2963 /* Print appropriate GOT function. */
2964 if (GET_CODE (x) != CONST_INT)
2965 fatal_insn ("bad insn to frv_print_operand, 'g' modifier:", x);
2966 fputs (unspec_got_name (INTVAL (x)), file);
2967 break;
2969 case 'I':
2970 /* Print 'i' if the operand is a constant, or is a memory reference that
2971 adds a constant. */
2972 if (GET_CODE (x) == MEM)
2973 x = ((GET_CODE (XEXP (x, 0)) == PLUS)
2974 ? XEXP (XEXP (x, 0), 1)
2975 : XEXP (x, 0));
2976 else if (GET_CODE (x) == PLUS)
2977 x = XEXP (x, 1);
2979 switch (GET_CODE (x))
2981 default:
2982 break;
2984 case CONST_INT:
2985 case SYMBOL_REF:
2986 case CONST:
2987 fputs ("i", file);
2988 break;
2990 break;
2992 case 'i':
2993 /* For jump instructions, print 'i' if the operand is a constant or
2994 is an expression that adds a constant. */
2995 if (GET_CODE (x) == CONST_INT)
2996 fputs ("i", file);
2998 else
3000 if (GET_CODE (x) == CONST_INT
3001 || (GET_CODE (x) == PLUS
3002 && (GET_CODE (XEXP (x, 1)) == CONST_INT
3003 || GET_CODE (XEXP (x, 0)) == CONST_INT)))
3004 fputs ("i", file);
3006 break;
3008 case 'L':
3009 /* Print the lower register of a double word register pair */
3010 if (GET_CODE (x) == REG)
3011 fputs (reg_names[ REGNO (x)+1 ], file);
3012 else
3013 fatal_insn ("bad insn to frv_print_operand, 'L' modifier:", x);
3014 break;
3016 /* case 'l': print a LABEL_REF. */
3018 case 'M':
3019 case 'N':
3020 /* Print a memory reference for ld/st/jmp, %N prints a memory reference
3021 for the second word of double memory operations. */
3022 offset = (code == 'M') ? 0 : UNITS_PER_WORD;
3023 switch (GET_CODE (x))
3025 default:
3026 fatal_insn ("bad insn to frv_print_operand, 'M/N' modifier:", x);
3028 case MEM:
3029 frv_print_operand_memory_reference (file, XEXP (x, 0), offset);
3030 break;
3032 case REG:
3033 case SUBREG:
3034 case CONST_INT:
3035 case PLUS:
3036 case SYMBOL_REF:
3037 frv_print_operand_memory_reference (file, x, offset);
3038 break;
3040 break;
3042 case 'O':
3043 /* Print the opcode of a command. */
3044 switch (GET_CODE (x))
3046 default:
3047 fatal_insn ("bad insn to frv_print_operand, 'O' modifier:", x);
3049 case PLUS: fputs ("add", file); break;
3050 case MINUS: fputs ("sub", file); break;
3051 case AND: fputs ("and", file); break;
3052 case IOR: fputs ("or", file); break;
3053 case XOR: fputs ("xor", file); break;
3054 case ASHIFT: fputs ("sll", file); break;
3055 case ASHIFTRT: fputs ("sra", file); break;
3056 case LSHIFTRT: fputs ("srl", file); break;
3058 break;
3060 /* case 'n': negate and print a constant int. */
3062 case 'P':
3063 /* Print PIC label using operand as the number. */
3064 if (GET_CODE (x) != CONST_INT)
3065 fatal_insn ("bad insn to frv_print_operand, P modifier:", x);
3067 fprintf (file, ".LCF%ld", (long)INTVAL (x));
3068 break;
3070 case 'U':
3071 /* Print 'u' if the operand is a update load/store. */
3072 if (GET_CODE (x) == MEM && GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
3073 fputs ("u", file);
3074 break;
3076 case 'z':
3077 /* If value is 0, print gr0, otherwise it must be a register. */
3078 if (GET_CODE (x) == CONST_INT && INTVAL (x) == 0)
3079 fputs (reg_names[GPR_R0], file);
3081 else if (GET_CODE (x) == REG)
3082 fputs (reg_names [REGNO (x)], file);
3084 else
3085 fatal_insn ("bad insn in frv_print_operand, z case", x);
3086 break;
3088 case 'x':
3089 /* Print constant in hex. */
3090 if (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE)
3092 fprintf (file, "%s0x%.4lx", IMMEDIATE_PREFIX, (long) value);
3093 break;
3096 /* Fall through. */
3098 case '\0':
3099 if (GET_CODE (x) == REG)
3100 fputs (reg_names [REGNO (x)], file);
3102 else if (GET_CODE (x) == CONST_INT
3103 || GET_CODE (x) == CONST_DOUBLE)
3104 fprintf (file, "%s%ld", IMMEDIATE_PREFIX, (long) value);
3106 else if (frv_const_unspec_p (x, &unspec))
3107 frv_output_const_unspec (file, &unspec);
3109 else if (GET_CODE (x) == MEM)
3110 frv_print_operand_address (file, XEXP (x, 0));
3112 else if (CONSTANT_ADDRESS_P (x))
3113 frv_print_operand_address (file, x);
3115 else
3116 fatal_insn ("bad insn in frv_print_operand, 0 case", x);
3118 break;
3120 default:
3121 fatal_insn ("frv_print_operand: unknown code", x);
3122 break;
3125 return;
3128 static bool
3129 frv_print_operand_punct_valid_p (unsigned char code)
3131 return (code == '.' || code == '#' || code == '@' || code == '~'
3132 || code == '*' || code == '&');
3136 /* A C statement (sans semicolon) for initializing the variable CUM for the
3137 state at the beginning of the argument list. The variable has type
3138 `CUMULATIVE_ARGS'. The value of FNTYPE is the tree node for the data type
3139 of the function which will receive the args, or 0 if the args are to a
3140 compiler support library function. The value of INDIRECT is nonzero when
3141 processing an indirect call, for example a call through a function pointer.
3142 The value of INDIRECT is zero for a call to an explicitly named function, a
3143 library function call, or when `INIT_CUMULATIVE_ARGS' is used to find
3144 arguments for the function being compiled.
3146 When processing a call to a compiler support library function, LIBNAME
3147 identifies which one. It is a `symbol_ref' rtx which contains the name of
3148 the function, as a string. LIBNAME is 0 when an ordinary C function call is
3149 being processed. Thus, each time this macro is called, either LIBNAME or
3150 FNTYPE is nonzero, but never both of them at once. */
3152 void
3153 frv_init_cumulative_args (CUMULATIVE_ARGS *cum,
3154 tree fntype,
3155 rtx libname,
3156 tree fndecl,
3157 int incoming)
3159 *cum = FIRST_ARG_REGNUM;
3161 if (TARGET_DEBUG_ARG)
3163 fprintf (stderr, "\ninit_cumulative_args:");
3164 if (!fndecl && fntype)
3165 fputs (" indirect", stderr);
3167 if (incoming)
3168 fputs (" incoming", stderr);
3170 if (fntype)
3172 tree ret_type = TREE_TYPE (fntype);
3173 fprintf (stderr, " return=%s,",
3174 tree_code_name[ (int)TREE_CODE (ret_type) ]);
3177 if (libname && GET_CODE (libname) == SYMBOL_REF)
3178 fprintf (stderr, " libname=%s", XSTR (libname, 0));
3180 if (cfun->returns_struct)
3181 fprintf (stderr, " return-struct");
3183 putc ('\n', stderr);
3188 /* Return true if we should pass an argument on the stack rather than
3189 in registers. */
3191 static bool
3192 frv_must_pass_in_stack (enum machine_mode mode, const_tree type)
3194 if (mode == BLKmode)
3195 return true;
3196 if (type == NULL)
3197 return false;
3198 return AGGREGATE_TYPE_P (type);
3201 /* If defined, a C expression that gives the alignment boundary, in bits, of an
3202 argument with the specified mode and type. If it is not defined,
3203 `PARM_BOUNDARY' is used for all arguments. */
3206 frv_function_arg_boundary (enum machine_mode mode ATTRIBUTE_UNUSED,
3207 tree type ATTRIBUTE_UNUSED)
3209 return BITS_PER_WORD;
3213 frv_function_arg (CUMULATIVE_ARGS *cum,
3214 enum machine_mode mode,
3215 tree type ATTRIBUTE_UNUSED,
3216 int named,
3217 int incoming ATTRIBUTE_UNUSED)
3219 enum machine_mode xmode = (mode == BLKmode) ? SImode : mode;
3220 int arg_num = *cum;
3221 rtx ret;
3222 const char *debstr;
3224 /* Return a marker for use in the call instruction. */
3225 if (xmode == VOIDmode)
3227 ret = const0_rtx;
3228 debstr = "<0>";
3231 else if (arg_num <= LAST_ARG_REGNUM)
3233 ret = gen_rtx_REG (xmode, arg_num);
3234 debstr = reg_names[arg_num];
3237 else
3239 ret = NULL_RTX;
3240 debstr = "memory";
3243 if (TARGET_DEBUG_ARG)
3244 fprintf (stderr,
3245 "function_arg: words = %2d, mode = %4s, named = %d, size = %3d, arg = %s\n",
3246 arg_num, GET_MODE_NAME (mode), named, GET_MODE_SIZE (mode), debstr);
3248 return ret;
3252 /* A C statement (sans semicolon) to update the summarizer variable CUM to
3253 advance past an argument in the argument list. The values MODE, TYPE and
3254 NAMED describe that argument. Once this is done, the variable CUM is
3255 suitable for analyzing the *following* argument with `FUNCTION_ARG', etc.
3257 This macro need not do anything if the argument in question was passed on
3258 the stack. The compiler knows how to track the amount of stack space used
3259 for arguments without any special help. */
3261 void
3262 frv_function_arg_advance (CUMULATIVE_ARGS *cum,
3263 enum machine_mode mode,
3264 tree type ATTRIBUTE_UNUSED,
3265 int named)
3267 enum machine_mode xmode = (mode == BLKmode) ? SImode : mode;
3268 int bytes = GET_MODE_SIZE (xmode);
3269 int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3270 int arg_num = *cum;
3272 *cum = arg_num + words;
3274 if (TARGET_DEBUG_ARG)
3275 fprintf (stderr,
3276 "function_adv: words = %2d, mode = %4s, named = %d, size = %3d\n",
3277 arg_num, GET_MODE_NAME (mode), named, words * UNITS_PER_WORD);
3281 /* A C expression for the number of words, at the beginning of an argument,
3282 must be put in registers. The value must be zero for arguments that are
3283 passed entirely in registers or that are entirely pushed on the stack.
3285 On some machines, certain arguments must be passed partially in registers
3286 and partially in memory. On these machines, typically the first N words of
3287 arguments are passed in registers, and the rest on the stack. If a
3288 multi-word argument (a `double' or a structure) crosses that boundary, its
3289 first few words must be passed in registers and the rest must be pushed.
3290 This macro tells the compiler when this occurs, and how many of the words
3291 should go in registers.
3293 `FUNCTION_ARG' for these arguments should return the first register to be
3294 used by the caller for this argument; likewise `FUNCTION_INCOMING_ARG', for
3295 the called function. */
3297 static int
3298 frv_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
3299 tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
3301 enum machine_mode xmode = (mode == BLKmode) ? SImode : mode;
3302 int bytes = GET_MODE_SIZE (xmode);
3303 int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3304 int arg_num = *cum;
3305 int ret;
3307 ret = ((arg_num <= LAST_ARG_REGNUM && arg_num + words > LAST_ARG_REGNUM+1)
3308 ? LAST_ARG_REGNUM - arg_num + 1
3309 : 0);
3310 ret *= UNITS_PER_WORD;
3312 if (TARGET_DEBUG_ARG && ret)
3313 fprintf (stderr, "frv_arg_partial_bytes: %d\n", ret);
3315 return ret;
3319 /* Implements TARGET_FUNCTION_VALUE. */
3321 static rtx
3322 frv_function_value (const_tree valtype,
3323 const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
3324 bool outgoing ATTRIBUTE_UNUSED)
3326 return gen_rtx_REG (TYPE_MODE (valtype), RETURN_VALUE_REGNUM);
3330 /* Implements TARGET_LIBCALL_VALUE. */
3332 static rtx
3333 frv_libcall_value (enum machine_mode mode,
3334 const_rtx fun ATTRIBUTE_UNUSED)
3336 return gen_rtx_REG (mode, RETURN_VALUE_REGNUM);
3340 /* Implements FUNCTION_VALUE_REGNO_P. */
3342 bool
3343 frv_function_value_regno_p (const unsigned int regno)
3345 return (regno == RETURN_VALUE_REGNUM);
3348 /* Return true if a register is ok to use as a base or index register. */
3350 static FRV_INLINE int
3351 frv_regno_ok_for_base_p (int regno, int strict_p)
3353 if (GPR_P (regno))
3354 return TRUE;
3356 if (strict_p)
3357 return (reg_renumber[regno] >= 0 && GPR_P (reg_renumber[regno]));
3359 if (regno == ARG_POINTER_REGNUM)
3360 return TRUE;
3362 return (regno >= FIRST_PSEUDO_REGISTER);
3366 /* A C compound statement with a conditional `goto LABEL;' executed if X (an
3367 RTX) is a legitimate memory address on the target machine for a memory
3368 operand of mode MODE.
3370 It usually pays to define several simpler macros to serve as subroutines for
3371 this one. Otherwise it may be too complicated to understand.
3373 This macro must exist in two variants: a strict variant and a non-strict
3374 one. The strict variant is used in the reload pass. It must be defined so
3375 that any pseudo-register that has not been allocated a hard register is
3376 considered a memory reference. In contexts where some kind of register is
3377 required, a pseudo-register with no hard register must be rejected.
3379 The non-strict variant is used in other passes. It must be defined to
3380 accept all pseudo-registers in every context where some kind of register is
3381 required.
3383 Compiler source files that want to use the strict variant of this macro
3384 define the macro `REG_OK_STRICT'. You should use an `#ifdef REG_OK_STRICT'
3385 conditional to define the strict variant in that case and the non-strict
3386 variant otherwise.
3388 Normally, constant addresses which are the sum of a `symbol_ref' and an
3389 integer are stored inside a `const' RTX to mark them as constant.
3390 Therefore, there is no need to recognize such sums specifically as
3391 legitimate addresses. Normally you would simply recognize any `const' as
3392 legitimate.
3394 Usually `TARGET_PRINT_OPERAND_ADDRESS' is not prepared to handle
3395 constant sums that are not marked with `const'. It assumes that a
3396 naked `plus' indicates indexing. If so, then you *must* reject such
3397 naked constant sums as illegitimate addresses, so that none of them
3398 will be given to `TARGET_PRINT_OPERAND_ADDRESS'. */
3401 frv_legitimate_address_p_1 (enum machine_mode mode,
3402 rtx x,
3403 int strict_p,
3404 int condexec_p,
3405 int allow_double_reg_p)
3407 rtx x0, x1;
3408 int ret = 0;
3409 HOST_WIDE_INT value;
3410 unsigned regno0;
3412 if (FRV_SYMBOL_REF_TLS_P (x))
3413 return 0;
3415 switch (GET_CODE (x))
3417 default:
3418 break;
3420 case SUBREG:
3421 x = SUBREG_REG (x);
3422 if (GET_CODE (x) != REG)
3423 break;
3425 /* Fall through. */
3427 case REG:
3428 ret = frv_regno_ok_for_base_p (REGNO (x), strict_p);
3429 break;
3431 case PRE_MODIFY:
3432 x0 = XEXP (x, 0);
3433 x1 = XEXP (x, 1);
3434 if (GET_CODE (x0) != REG
3435 || ! frv_regno_ok_for_base_p (REGNO (x0), strict_p)
3436 || GET_CODE (x1) != PLUS
3437 || ! rtx_equal_p (x0, XEXP (x1, 0))
3438 || GET_CODE (XEXP (x1, 1)) != REG
3439 || ! frv_regno_ok_for_base_p (REGNO (XEXP (x1, 1)), strict_p))
3440 break;
3442 ret = 1;
3443 break;
3445 case CONST_INT:
3446 /* 12-bit immediate */
3447 if (condexec_p)
3448 ret = FALSE;
3449 else
3451 ret = IN_RANGE_P (INTVAL (x), -2048, 2047);
3453 /* If we can't use load/store double operations, make sure we can
3454 address the second word. */
3455 if (ret && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
3456 ret = IN_RANGE_P (INTVAL (x) + GET_MODE_SIZE (mode) - 1,
3457 -2048, 2047);
3459 break;
3461 case PLUS:
3462 x0 = XEXP (x, 0);
3463 x1 = XEXP (x, 1);
3465 if (GET_CODE (x0) == SUBREG)
3466 x0 = SUBREG_REG (x0);
3468 if (GET_CODE (x0) != REG)
3469 break;
3471 regno0 = REGNO (x0);
3472 if (!frv_regno_ok_for_base_p (regno0, strict_p))
3473 break;
3475 switch (GET_CODE (x1))
3477 default:
3478 break;
3480 case SUBREG:
3481 x1 = SUBREG_REG (x1);
3482 if (GET_CODE (x1) != REG)
3483 break;
3485 /* Fall through. */
3487 case REG:
3488 /* Do not allow reg+reg addressing for modes > 1 word if we
3489 can't depend on having move double instructions. */
3490 if (!allow_double_reg_p && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
3491 ret = FALSE;
3492 else
3493 ret = frv_regno_ok_for_base_p (REGNO (x1), strict_p);
3494 break;
3496 case CONST_INT:
3497 /* 12-bit immediate */
3498 if (condexec_p)
3499 ret = FALSE;
3500 else
3502 value = INTVAL (x1);
3503 ret = IN_RANGE_P (value, -2048, 2047);
3505 /* If we can't use load/store double operations, make sure we can
3506 address the second word. */
3507 if (ret && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
3508 ret = IN_RANGE_P (value + GET_MODE_SIZE (mode) - 1, -2048, 2047);
3510 break;
3512 case CONST:
3513 if (!condexec_p && got12_operand (x1, VOIDmode))
3514 ret = TRUE;
3515 break;
3518 break;
3521 if (TARGET_DEBUG_ADDR)
3523 fprintf (stderr, "\n========== legitimate_address_p, mode = %s, result = %d, addresses are %sstrict%s\n",
3524 GET_MODE_NAME (mode), ret, (strict_p) ? "" : "not ",
3525 (condexec_p) ? ", inside conditional code" : "");
3526 debug_rtx (x);
3529 return ret;
3532 bool
3533 frv_legitimate_address_p (enum machine_mode mode, rtx x, bool strict_p)
3535 return frv_legitimate_address_p_1 (mode, x, strict_p, FALSE, FALSE);
3538 /* Given an ADDR, generate code to inline the PLT. */
3539 static rtx
3540 gen_inlined_tls_plt (rtx addr)
3542 rtx retval, dest;
3543 rtx picreg = get_hard_reg_initial_val (Pmode, FDPIC_REG);
3546 dest = gen_reg_rtx (DImode);
3548 if (flag_pic == 1)
3551 -fpic version:
3553 lddi.p @(gr15, #gottlsdesc12(ADDR)), gr8
3554 calll #gettlsoff(ADDR)@(gr8, gr0)
3556 emit_insn (gen_tls_lddi (dest, addr, picreg));
3558 else
3561 -fPIC version:
3563 sethi.p #gottlsdeschi(ADDR), gr8
3564 setlo #gottlsdesclo(ADDR), gr8
3565 ldd #tlsdesc(ADDR)@(gr15, gr8), gr8
3566 calll #gettlsoff(ADDR)@(gr8, gr0)
3568 rtx reguse = gen_reg_rtx (Pmode);
3569 emit_insn (gen_tlsoff_hilo (reguse, addr, GEN_INT (R_FRV_GOTTLSDESCHI)));
3570 emit_insn (gen_tls_tlsdesc_ldd (dest, picreg, reguse, addr));
3573 retval = gen_reg_rtx (Pmode);
3574 emit_insn (gen_tls_indirect_call (retval, addr, dest, picreg));
3575 return retval;
3578 /* Emit a TLSMOFF or TLSMOFF12 offset, depending on -mTLS. Returns
3579 the destination address. */
3580 static rtx
3581 gen_tlsmoff (rtx addr, rtx reg)
3583 rtx dest = gen_reg_rtx (Pmode);
3585 if (TARGET_BIG_TLS)
3587 /* sethi.p #tlsmoffhi(x), grA
3588 setlo #tlsmofflo(x), grA
3590 dest = gen_reg_rtx (Pmode);
3591 emit_insn (gen_tlsoff_hilo (dest, addr,
3592 GEN_INT (R_FRV_TLSMOFFHI)));
3593 dest = gen_rtx_PLUS (Pmode, dest, reg);
3595 else
3597 /* addi grB, #tlsmoff12(x), grC
3598 -or-
3599 ld/st @(grB, #tlsmoff12(x)), grC
3601 dest = gen_reg_rtx (Pmode);
3602 emit_insn (gen_symGOTOFF2reg_i (dest, addr, reg,
3603 GEN_INT (R_FRV_TLSMOFF12)));
3605 return dest;
3608 /* Generate code for a TLS address. */
3609 static rtx
3610 frv_legitimize_tls_address (rtx addr, enum tls_model model)
3612 rtx dest, tp = gen_rtx_REG (Pmode, 29);
3613 rtx picreg = get_hard_reg_initial_val (Pmode, 15);
3615 switch (model)
3617 case TLS_MODEL_INITIAL_EXEC:
3618 if (flag_pic == 1)
3620 /* -fpic version.
3621 ldi @(gr15, #gottlsoff12(x)), gr5
3623 dest = gen_reg_rtx (Pmode);
3624 emit_insn (gen_tls_load_gottlsoff12 (dest, addr, picreg));
3625 dest = gen_rtx_PLUS (Pmode, tp, dest);
3627 else
3629 /* -fPIC or anything else.
3631 sethi.p #gottlsoffhi(x), gr14
3632 setlo #gottlsofflo(x), gr14
3633 ld #tlsoff(x)@(gr15, gr14), gr9
3635 rtx tmp = gen_reg_rtx (Pmode);
3636 dest = gen_reg_rtx (Pmode);
3637 emit_insn (gen_tlsoff_hilo (tmp, addr,
3638 GEN_INT (R_FRV_GOTTLSOFF_HI)));
3640 emit_insn (gen_tls_tlsoff_ld (dest, picreg, tmp, addr));
3641 dest = gen_rtx_PLUS (Pmode, tp, dest);
3643 break;
3644 case TLS_MODEL_LOCAL_DYNAMIC:
3646 rtx reg, retval;
3648 if (TARGET_INLINE_PLT)
3649 retval = gen_inlined_tls_plt (GEN_INT (0));
3650 else
3652 /* call #gettlsoff(0) */
3653 retval = gen_reg_rtx (Pmode);
3654 emit_insn (gen_call_gettlsoff (retval, GEN_INT (0), picreg));
3657 reg = gen_reg_rtx (Pmode);
3658 emit_insn (gen_rtx_SET (VOIDmode, reg,
3659 gen_rtx_PLUS (Pmode,
3660 retval, tp)));
3662 dest = gen_tlsmoff (addr, reg);
3665 dest = gen_reg_rtx (Pmode);
3666 emit_insn (gen_tlsoff_hilo (dest, addr,
3667 GEN_INT (R_FRV_TLSMOFFHI)));
3668 dest = gen_rtx_PLUS (Pmode, dest, reg);
3670 break;
3672 case TLS_MODEL_LOCAL_EXEC:
3673 dest = gen_tlsmoff (addr, gen_rtx_REG (Pmode, 29));
3674 break;
3675 case TLS_MODEL_GLOBAL_DYNAMIC:
3677 rtx retval;
3679 if (TARGET_INLINE_PLT)
3680 retval = gen_inlined_tls_plt (addr);
3681 else
3683 /* call #gettlsoff(x) */
3684 retval = gen_reg_rtx (Pmode);
3685 emit_insn (gen_call_gettlsoff (retval, addr, picreg));
3687 dest = gen_rtx_PLUS (Pmode, retval, tp);
3688 break;
3690 default:
3691 gcc_unreachable ();
3694 return dest;
3698 frv_legitimize_address (rtx x,
3699 rtx oldx ATTRIBUTE_UNUSED,
3700 enum machine_mode mode ATTRIBUTE_UNUSED)
3702 if (GET_CODE (x) == SYMBOL_REF)
3704 enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
3705 if (model != 0)
3706 return frv_legitimize_tls_address (x, model);
3709 return x;
3712 /* Test whether a local function descriptor is canonical, i.e.,
3713 whether we can use FUNCDESC_GOTOFF to compute the address of the
3714 function. */
3716 static bool
3717 frv_local_funcdesc_p (rtx fnx)
3719 tree fn;
3720 enum symbol_visibility vis;
3721 bool ret;
3723 if (! SYMBOL_REF_LOCAL_P (fnx))
3724 return FALSE;
3726 fn = SYMBOL_REF_DECL (fnx);
3728 if (! fn)
3729 return FALSE;
3731 vis = DECL_VISIBILITY (fn);
3733 if (vis == VISIBILITY_PROTECTED)
3734 /* Private function descriptors for protected functions are not
3735 canonical. Temporarily change the visibility to global. */
3736 vis = VISIBILITY_DEFAULT;
3737 else if (flag_shlib)
3738 /* If we're already compiling for a shared library (that, unlike
3739 executables, can't assume that the existence of a definition
3740 implies local binding), we can skip the re-testing. */
3741 return TRUE;
3743 ret = default_binds_local_p_1 (fn, flag_pic);
3745 DECL_VISIBILITY (fn) = vis;
3747 return ret;
3750 /* Load the _gp symbol into DEST. SRC is supposed to be the FDPIC
3751 register. */
3754 frv_gen_GPsym2reg (rtx dest, rtx src)
3756 tree gp = get_identifier ("_gp");
3757 rtx gp_sym = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (gp));
3759 return gen_symGOT2reg (dest, gp_sym, src, GEN_INT (R_FRV_GOT12));
3762 static const char *
3763 unspec_got_name (int i)
3765 switch (i)
3767 case R_FRV_GOT12: return "got12";
3768 case R_FRV_GOTHI: return "gothi";
3769 case R_FRV_GOTLO: return "gotlo";
3770 case R_FRV_FUNCDESC: return "funcdesc";
3771 case R_FRV_FUNCDESC_GOT12: return "gotfuncdesc12";
3772 case R_FRV_FUNCDESC_GOTHI: return "gotfuncdeschi";
3773 case R_FRV_FUNCDESC_GOTLO: return "gotfuncdesclo";
3774 case R_FRV_FUNCDESC_VALUE: return "funcdescvalue";
3775 case R_FRV_FUNCDESC_GOTOFF12: return "gotofffuncdesc12";
3776 case R_FRV_FUNCDESC_GOTOFFHI: return "gotofffuncdeschi";
3777 case R_FRV_FUNCDESC_GOTOFFLO: return "gotofffuncdesclo";
3778 case R_FRV_GOTOFF12: return "gotoff12";
3779 case R_FRV_GOTOFFHI: return "gotoffhi";
3780 case R_FRV_GOTOFFLO: return "gotofflo";
3781 case R_FRV_GPREL12: return "gprel12";
3782 case R_FRV_GPRELHI: return "gprelhi";
3783 case R_FRV_GPRELLO: return "gprello";
3784 case R_FRV_GOTTLSOFF_HI: return "gottlsoffhi";
3785 case R_FRV_GOTTLSOFF_LO: return "gottlsofflo";
3786 case R_FRV_TLSMOFFHI: return "tlsmoffhi";
3787 case R_FRV_TLSMOFFLO: return "tlsmofflo";
3788 case R_FRV_TLSMOFF12: return "tlsmoff12";
3789 case R_FRV_TLSDESCHI: return "tlsdeschi";
3790 case R_FRV_TLSDESCLO: return "tlsdesclo";
3791 case R_FRV_GOTTLSDESCHI: return "gottlsdeschi";
3792 case R_FRV_GOTTLSDESCLO: return "gottlsdesclo";
3793 default: gcc_unreachable ();
3797 /* Write the assembler syntax for UNSPEC to STREAM. Note that any offset
3798 is added inside the relocation operator. */
3800 static void
3801 frv_output_const_unspec (FILE *stream, const struct frv_unspec *unspec)
3803 fprintf (stream, "#%s(", unspec_got_name (unspec->reloc));
3804 output_addr_const (stream, plus_constant (unspec->symbol, unspec->offset));
3805 fputs (")", stream);
3808 /* Implement FIND_BASE_TERM. See whether ORIG_X represents #gprel12(foo)
3809 or #gotoff12(foo) for some small data symbol foo. If so, return foo,
3810 otherwise return ORIG_X. */
3813 frv_find_base_term (rtx x)
3815 struct frv_unspec unspec;
3817 if (frv_const_unspec_p (x, &unspec)
3818 && frv_small_data_reloc_p (unspec.symbol, unspec.reloc))
3819 return plus_constant (unspec.symbol, unspec.offset);
3821 return x;
3824 /* Return 1 if operand is a valid FRV address. CONDEXEC_P is true if
3825 the operand is used by a predicated instruction. */
3828 frv_legitimate_memory_operand (rtx op, enum machine_mode mode, int condexec_p)
3830 return ((GET_MODE (op) == mode || mode == VOIDmode)
3831 && GET_CODE (op) == MEM
3832 && frv_legitimate_address_p_1 (mode, XEXP (op, 0),
3833 reload_completed, condexec_p, FALSE));
3836 void
3837 frv_expand_fdpic_call (rtx *operands, bool ret_value, bool sibcall)
3839 rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
3840 rtx picreg = get_hard_reg_initial_val (SImode, FDPIC_REG);
3841 rtx c, rvrtx=0;
3842 rtx addr;
3844 if (ret_value)
3846 rvrtx = operands[0];
3847 operands ++;
3850 addr = XEXP (operands[0], 0);
3852 /* Inline PLTs if we're optimizing for speed. We'd like to inline
3853 any calls that would involve a PLT, but can't tell, since we
3854 don't know whether an extern function is going to be provided by
3855 a separate translation unit or imported from a separate module.
3856 When compiling for shared libraries, if the function has default
3857 visibility, we assume it's overridable, so we inline the PLT, but
3858 for executables, we don't really have a way to make a good
3859 decision: a function is as likely to be imported from a shared
3860 library as it is to be defined in the executable itself. We
3861 assume executables will get global functions defined locally,
3862 whereas shared libraries will have them potentially overridden,
3863 so we only inline PLTs when compiling for shared libraries.
3865 In order to mark a function as local to a shared library, any
3866 non-default visibility attribute suffices. Unfortunately,
3867 there's no simple way to tag a function declaration as ``in a
3868 different module'', which we could then use to trigger PLT
3869 inlining on executables. There's -minline-plt, but it affects
3870 all external functions, so one would have to also mark function
3871 declarations available in the same module with non-default
3872 visibility, which is advantageous in itself. */
3873 if (GET_CODE (addr) == SYMBOL_REF
3874 && ((!SYMBOL_REF_LOCAL_P (addr) && TARGET_INLINE_PLT)
3875 || sibcall))
3877 rtx x, dest;
3878 dest = gen_reg_rtx (SImode);
3879 if (flag_pic != 1)
3880 x = gen_symGOTOFF2reg_hilo (dest, addr, OUR_FDPIC_REG,
3881 GEN_INT (R_FRV_FUNCDESC_GOTOFF12));
3882 else
3883 x = gen_symGOTOFF2reg (dest, addr, OUR_FDPIC_REG,
3884 GEN_INT (R_FRV_FUNCDESC_GOTOFF12));
3885 emit_insn (x);
3886 crtl->uses_pic_offset_table = TRUE;
3887 addr = dest;
3889 else if (GET_CODE (addr) == SYMBOL_REF)
3891 /* These are always either local, or handled through a local
3892 PLT. */
3893 if (ret_value)
3894 c = gen_call_value_fdpicsi (rvrtx, addr, operands[1],
3895 operands[2], picreg, lr);
3896 else
3897 c = gen_call_fdpicsi (addr, operands[1], operands[2], picreg, lr);
3898 emit_call_insn (c);
3899 return;
3901 else if (! ldd_address_operand (addr, Pmode))
3902 addr = force_reg (Pmode, addr);
3904 picreg = gen_reg_rtx (DImode);
3905 emit_insn (gen_movdi_ldd (picreg, addr));
3907 if (sibcall && ret_value)
3908 c = gen_sibcall_value_fdpicdi (rvrtx, picreg, const0_rtx);
3909 else if (sibcall)
3910 c = gen_sibcall_fdpicdi (picreg, const0_rtx);
3911 else if (ret_value)
3912 c = gen_call_value_fdpicdi (rvrtx, picreg, const0_rtx, lr);
3913 else
3914 c = gen_call_fdpicdi (picreg, const0_rtx, lr);
3915 emit_call_insn (c);
3918 /* Look for a SYMBOL_REF of a function in an rtx. We always want to
3919 process these separately from any offsets, such that we add any
3920 offsets to the function descriptor (the actual pointer), not to the
3921 function address. */
3923 static bool
3924 frv_function_symbol_referenced_p (rtx x)
3926 const char *format;
3927 int length;
3928 int j;
3930 if (GET_CODE (x) == SYMBOL_REF)
3931 return SYMBOL_REF_FUNCTION_P (x);
3933 length = GET_RTX_LENGTH (GET_CODE (x));
3934 format = GET_RTX_FORMAT (GET_CODE (x));
3936 for (j = 0; j < length; ++j)
3938 switch (format[j])
3940 case 'e':
3941 if (frv_function_symbol_referenced_p (XEXP (x, j)))
3942 return TRUE;
3943 break;
3945 case 'V':
3946 case 'E':
3947 if (XVEC (x, j) != 0)
3949 int k;
3950 for (k = 0; k < XVECLEN (x, j); ++k)
3951 if (frv_function_symbol_referenced_p (XVECEXP (x, j, k)))
3952 return TRUE;
3954 break;
3956 default:
3957 /* Nothing to do. */
3958 break;
3962 return FALSE;
3965 /* Return true if the memory operand is one that can be conditionally
3966 executed. */
3969 condexec_memory_operand (rtx op, enum machine_mode mode)
3971 enum machine_mode op_mode = GET_MODE (op);
3972 rtx addr;
3974 if (mode != VOIDmode && op_mode != mode)
3975 return FALSE;
3977 switch (op_mode)
3979 default:
3980 return FALSE;
3982 case QImode:
3983 case HImode:
3984 case SImode:
3985 case SFmode:
3986 break;
3989 if (GET_CODE (op) != MEM)
3990 return FALSE;
3992 addr = XEXP (op, 0);
3993 return frv_legitimate_address_p_1 (mode, addr, reload_completed, TRUE, FALSE);
3996 /* Return true if the bare return instruction can be used outside of the
3997 epilog code. For frv, we only do it if there was no stack allocation. */
4000 direct_return_p (void)
4002 frv_stack_t *info;
4004 if (!reload_completed)
4005 return FALSE;
4007 info = frv_stack_info ();
4008 return (info->total_size == 0);
4012 void
4013 frv_emit_move (enum machine_mode mode, rtx dest, rtx src)
4015 if (GET_CODE (src) == SYMBOL_REF)
4017 enum tls_model model = SYMBOL_REF_TLS_MODEL (src);
4018 if (model != 0)
4019 src = frv_legitimize_tls_address (src, model);
4022 switch (mode)
4024 case SImode:
4025 if (frv_emit_movsi (dest, src))
4026 return;
4027 break;
4029 case QImode:
4030 case HImode:
4031 case DImode:
4032 case SFmode:
4033 case DFmode:
4034 if (!reload_in_progress
4035 && !reload_completed
4036 && !register_operand (dest, mode)
4037 && !reg_or_0_operand (src, mode))
4038 src = copy_to_mode_reg (mode, src);
4039 break;
4041 default:
4042 gcc_unreachable ();
4045 emit_insn (gen_rtx_SET (VOIDmode, dest, src));
4048 /* Emit code to handle a MOVSI, adding in the small data register or pic
4049 register if needed to load up addresses. Return TRUE if the appropriate
4050 instructions are emitted. */
4053 frv_emit_movsi (rtx dest, rtx src)
4055 int base_regno = -1;
4056 int unspec = 0;
4057 rtx sym = src;
4058 struct frv_unspec old_unspec;
4060 if (!reload_in_progress
4061 && !reload_completed
4062 && !register_operand (dest, SImode)
4063 && (!reg_or_0_operand (src, SImode)
4064 /* Virtual registers will almost always be replaced by an
4065 add instruction, so expose this to CSE by copying to
4066 an intermediate register. */
4067 || (GET_CODE (src) == REG
4068 && IN_RANGE_P (REGNO (src),
4069 FIRST_VIRTUAL_REGISTER,
4070 LAST_VIRTUAL_REGISTER))))
4072 emit_insn (gen_rtx_SET (VOIDmode, dest, copy_to_mode_reg (SImode, src)));
4073 return TRUE;
4076 /* Explicitly add in the PIC or small data register if needed. */
4077 switch (GET_CODE (src))
4079 default:
4080 break;
4082 case LABEL_REF:
4083 handle_label:
4084 if (TARGET_FDPIC)
4086 /* Using GPREL12, we use a single GOT entry for all symbols
4087 in read-only sections, but trade sequences such as:
4089 sethi #gothi(label), gr#
4090 setlo #gotlo(label), gr#
4091 ld @(gr15,gr#), gr#
4095 ld @(gr15,#got12(_gp)), gr#
4096 sethi #gprelhi(label), gr##
4097 setlo #gprello(label), gr##
4098 add gr#, gr##, gr##
4100 We may often be able to share gr# for multiple
4101 computations of GPREL addresses, and we may often fold
4102 the final add into the pair of registers of a load or
4103 store instruction, so it's often profitable. Even when
4104 optimizing for size, we're trading a GOT entry for an
4105 additional instruction, which trades GOT space
4106 (read-write) for code size (read-only, shareable), as
4107 long as the symbol is not used in more than two different
4108 locations.
4110 With -fpie/-fpic, we'd be trading a single load for a
4111 sequence of 4 instructions, because the offset of the
4112 label can't be assumed to be addressable with 12 bits, so
4113 we don't do this. */
4114 if (TARGET_GPREL_RO)
4115 unspec = R_FRV_GPREL12;
4116 else
4117 unspec = R_FRV_GOT12;
4119 else if (flag_pic)
4120 base_regno = PIC_REGNO;
4122 break;
4124 case CONST:
4125 if (frv_const_unspec_p (src, &old_unspec))
4126 break;
4128 if (TARGET_FDPIC && frv_function_symbol_referenced_p (XEXP (src, 0)))
4130 handle_whatever:
4131 src = force_reg (GET_MODE (XEXP (src, 0)), XEXP (src, 0));
4132 emit_move_insn (dest, src);
4133 return TRUE;
4135 else
4137 sym = XEXP (sym, 0);
4138 if (GET_CODE (sym) == PLUS
4139 && GET_CODE (XEXP (sym, 0)) == SYMBOL_REF
4140 && GET_CODE (XEXP (sym, 1)) == CONST_INT)
4141 sym = XEXP (sym, 0);
4142 if (GET_CODE (sym) == SYMBOL_REF)
4143 goto handle_sym;
4144 else if (GET_CODE (sym) == LABEL_REF)
4145 goto handle_label;
4146 else
4147 goto handle_whatever;
4149 break;
4151 case SYMBOL_REF:
4152 handle_sym:
4153 if (TARGET_FDPIC)
4155 enum tls_model model = SYMBOL_REF_TLS_MODEL (sym);
4157 if (model != 0)
4159 src = frv_legitimize_tls_address (src, model);
4160 emit_move_insn (dest, src);
4161 return TRUE;
4164 if (SYMBOL_REF_FUNCTION_P (sym))
4166 if (frv_local_funcdesc_p (sym))
4167 unspec = R_FRV_FUNCDESC_GOTOFF12;
4168 else
4169 unspec = R_FRV_FUNCDESC_GOT12;
4171 else
4173 if (CONSTANT_POOL_ADDRESS_P (sym))
4174 switch (GET_CODE (get_pool_constant (sym)))
4176 case CONST:
4177 case SYMBOL_REF:
4178 case LABEL_REF:
4179 if (flag_pic)
4181 unspec = R_FRV_GOTOFF12;
4182 break;
4184 /* Fall through. */
4185 default:
4186 if (TARGET_GPREL_RO)
4187 unspec = R_FRV_GPREL12;
4188 else
4189 unspec = R_FRV_GOT12;
4190 break;
4192 else if (SYMBOL_REF_LOCAL_P (sym)
4193 && !SYMBOL_REF_EXTERNAL_P (sym)
4194 && SYMBOL_REF_DECL (sym)
4195 && (!DECL_P (SYMBOL_REF_DECL (sym))
4196 || !DECL_COMMON (SYMBOL_REF_DECL (sym))))
4198 tree decl = SYMBOL_REF_DECL (sym);
4199 tree init = TREE_CODE (decl) == VAR_DECL
4200 ? DECL_INITIAL (decl)
4201 : TREE_CODE (decl) == CONSTRUCTOR
4202 ? decl : 0;
4203 int reloc = 0;
4204 bool named_section, readonly;
4206 if (init && init != error_mark_node)
4207 reloc = compute_reloc_for_constant (init);
4209 named_section = TREE_CODE (decl) == VAR_DECL
4210 && lookup_attribute ("section", DECL_ATTRIBUTES (decl));
4211 readonly = decl_readonly_section (decl, reloc);
4213 if (named_section)
4214 unspec = R_FRV_GOT12;
4215 else if (!readonly)
4216 unspec = R_FRV_GOTOFF12;
4217 else if (readonly && TARGET_GPREL_RO)
4218 unspec = R_FRV_GPREL12;
4219 else
4220 unspec = R_FRV_GOT12;
4222 else
4223 unspec = R_FRV_GOT12;
4227 else if (SYMBOL_REF_SMALL_P (sym))
4228 base_regno = SDA_BASE_REG;
4230 else if (flag_pic)
4231 base_regno = PIC_REGNO;
4233 break;
4236 if (base_regno >= 0)
4238 if (GET_CODE (sym) == SYMBOL_REF && SYMBOL_REF_SMALL_P (sym))
4239 emit_insn (gen_symGOTOFF2reg (dest, src,
4240 gen_rtx_REG (Pmode, base_regno),
4241 GEN_INT (R_FRV_GPREL12)));
4242 else
4243 emit_insn (gen_symGOTOFF2reg_hilo (dest, src,
4244 gen_rtx_REG (Pmode, base_regno),
4245 GEN_INT (R_FRV_GPREL12)));
4246 if (base_regno == PIC_REGNO)
4247 crtl->uses_pic_offset_table = TRUE;
4248 return TRUE;
4251 if (unspec)
4253 rtx x;
4255 /* Since OUR_FDPIC_REG is a pseudo register, we can't safely introduce
4256 new uses of it once reload has begun. */
4257 gcc_assert (!reload_in_progress && !reload_completed);
4259 switch (unspec)
4261 case R_FRV_GOTOFF12:
4262 if (!frv_small_data_reloc_p (sym, unspec))
4263 x = gen_symGOTOFF2reg_hilo (dest, src, OUR_FDPIC_REG,
4264 GEN_INT (unspec));
4265 else
4266 x = gen_symGOTOFF2reg (dest, src, OUR_FDPIC_REG, GEN_INT (unspec));
4267 break;
4268 case R_FRV_GPREL12:
4269 if (!frv_small_data_reloc_p (sym, unspec))
4270 x = gen_symGPREL2reg_hilo (dest, src, OUR_FDPIC_REG,
4271 GEN_INT (unspec));
4272 else
4273 x = gen_symGPREL2reg (dest, src, OUR_FDPIC_REG, GEN_INT (unspec));
4274 break;
4275 case R_FRV_FUNCDESC_GOTOFF12:
4276 if (flag_pic != 1)
4277 x = gen_symGOTOFF2reg_hilo (dest, src, OUR_FDPIC_REG,
4278 GEN_INT (unspec));
4279 else
4280 x = gen_symGOTOFF2reg (dest, src, OUR_FDPIC_REG, GEN_INT (unspec));
4281 break;
4282 default:
4283 if (flag_pic != 1)
4284 x = gen_symGOT2reg_hilo (dest, src, OUR_FDPIC_REG,
4285 GEN_INT (unspec));
4286 else
4287 x = gen_symGOT2reg (dest, src, OUR_FDPIC_REG, GEN_INT (unspec));
4288 break;
4290 emit_insn (x);
4291 crtl->uses_pic_offset_table = TRUE;
4292 return TRUE;
4296 return FALSE;
4300 /* Return a string to output a single word move. */
4302 const char *
4303 output_move_single (rtx operands[], rtx insn)
4305 rtx dest = operands[0];
4306 rtx src = operands[1];
4308 if (GET_CODE (dest) == REG)
4310 int dest_regno = REGNO (dest);
4311 enum machine_mode mode = GET_MODE (dest);
4313 if (GPR_P (dest_regno))
4315 if (GET_CODE (src) == REG)
4317 /* gpr <- some sort of register */
4318 int src_regno = REGNO (src);
4320 if (GPR_P (src_regno))
4321 return "mov %1, %0";
4323 else if (FPR_P (src_regno))
4324 return "movfg %1, %0";
4326 else if (SPR_P (src_regno))
4327 return "movsg %1, %0";
4330 else if (GET_CODE (src) == MEM)
4332 /* gpr <- memory */
4333 switch (mode)
4335 default:
4336 break;
4338 case QImode:
4339 return "ldsb%I1%U1 %M1,%0";
4341 case HImode:
4342 return "ldsh%I1%U1 %M1,%0";
4344 case SImode:
4345 case SFmode:
4346 return "ld%I1%U1 %M1, %0";
4350 else if (GET_CODE (src) == CONST_INT
4351 || GET_CODE (src) == CONST_DOUBLE)
4353 /* gpr <- integer/floating constant */
4354 HOST_WIDE_INT value;
4356 if (GET_CODE (src) == CONST_INT)
4357 value = INTVAL (src);
4359 else if (mode == SFmode)
4361 REAL_VALUE_TYPE rv;
4362 long l;
4364 REAL_VALUE_FROM_CONST_DOUBLE (rv, src);
4365 REAL_VALUE_TO_TARGET_SINGLE (rv, l);
4366 value = l;
4369 else
4370 value = CONST_DOUBLE_LOW (src);
4372 if (IN_RANGE_P (value, -32768, 32767))
4373 return "setlos %1, %0";
4375 return "#";
4378 else if (GET_CODE (src) == SYMBOL_REF
4379 || GET_CODE (src) == LABEL_REF
4380 || GET_CODE (src) == CONST)
4382 return "#";
4386 else if (FPR_P (dest_regno))
4388 if (GET_CODE (src) == REG)
4390 /* fpr <- some sort of register */
4391 int src_regno = REGNO (src);
4393 if (GPR_P (src_regno))
4394 return "movgf %1, %0";
4396 else if (FPR_P (src_regno))
4398 if (TARGET_HARD_FLOAT)
4399 return "fmovs %1, %0";
4400 else
4401 return "mor %1, %1, %0";
4405 else if (GET_CODE (src) == MEM)
4407 /* fpr <- memory */
4408 switch (mode)
4410 default:
4411 break;
4413 case QImode:
4414 return "ldbf%I1%U1 %M1,%0";
4416 case HImode:
4417 return "ldhf%I1%U1 %M1,%0";
4419 case SImode:
4420 case SFmode:
4421 return "ldf%I1%U1 %M1, %0";
4425 else if (ZERO_P (src))
4426 return "movgf %., %0";
4429 else if (SPR_P (dest_regno))
4431 if (GET_CODE (src) == REG)
4433 /* spr <- some sort of register */
4434 int src_regno = REGNO (src);
4436 if (GPR_P (src_regno))
4437 return "movgs %1, %0";
4439 else if (ZERO_P (src))
4440 return "movgs %., %0";
4444 else if (GET_CODE (dest) == MEM)
4446 if (GET_CODE (src) == REG)
4448 int src_regno = REGNO (src);
4449 enum machine_mode mode = GET_MODE (dest);
4451 if (GPR_P (src_regno))
4453 switch (mode)
4455 default:
4456 break;
4458 case QImode:
4459 return "stb%I0%U0 %1, %M0";
4461 case HImode:
4462 return "sth%I0%U0 %1, %M0";
4464 case SImode:
4465 case SFmode:
4466 return "st%I0%U0 %1, %M0";
4470 else if (FPR_P (src_regno))
4472 switch (mode)
4474 default:
4475 break;
4477 case QImode:
4478 return "stbf%I0%U0 %1, %M0";
4480 case HImode:
4481 return "sthf%I0%U0 %1, %M0";
4483 case SImode:
4484 case SFmode:
4485 return "stf%I0%U0 %1, %M0";
4490 else if (ZERO_P (src))
4492 switch (GET_MODE (dest))
4494 default:
4495 break;
4497 case QImode:
4498 return "stb%I0%U0 %., %M0";
4500 case HImode:
4501 return "sth%I0%U0 %., %M0";
4503 case SImode:
4504 case SFmode:
4505 return "st%I0%U0 %., %M0";
4510 fatal_insn ("bad output_move_single operand", insn);
4511 return "";
4515 /* Return a string to output a double word move. */
4517 const char *
4518 output_move_double (rtx operands[], rtx insn)
4520 rtx dest = operands[0];
4521 rtx src = operands[1];
4522 enum machine_mode mode = GET_MODE (dest);
4524 if (GET_CODE (dest) == REG)
4526 int dest_regno = REGNO (dest);
4528 if (GPR_P (dest_regno))
4530 if (GET_CODE (src) == REG)
4532 /* gpr <- some sort of register */
4533 int src_regno = REGNO (src);
4535 if (GPR_P (src_regno))
4536 return "#";
4538 else if (FPR_P (src_regno))
4540 if (((dest_regno - GPR_FIRST) & 1) == 0
4541 && ((src_regno - FPR_FIRST) & 1) == 0)
4542 return "movfgd %1, %0";
4544 return "#";
4548 else if (GET_CODE (src) == MEM)
4550 /* gpr <- memory */
4551 if (dbl_memory_one_insn_operand (src, mode))
4552 return "ldd%I1%U1 %M1, %0";
4554 return "#";
4557 else if (GET_CODE (src) == CONST_INT
4558 || GET_CODE (src) == CONST_DOUBLE)
4559 return "#";
4562 else if (FPR_P (dest_regno))
4564 if (GET_CODE (src) == REG)
4566 /* fpr <- some sort of register */
4567 int src_regno = REGNO (src);
4569 if (GPR_P (src_regno))
4571 if (((dest_regno - FPR_FIRST) & 1) == 0
4572 && ((src_regno - GPR_FIRST) & 1) == 0)
4573 return "movgfd %1, %0";
4575 return "#";
4578 else if (FPR_P (src_regno))
4580 if (TARGET_DOUBLE
4581 && ((dest_regno - FPR_FIRST) & 1) == 0
4582 && ((src_regno - FPR_FIRST) & 1) == 0)
4583 return "fmovd %1, %0";
4585 return "#";
4589 else if (GET_CODE (src) == MEM)
4591 /* fpr <- memory */
4592 if (dbl_memory_one_insn_operand (src, mode))
4593 return "lddf%I1%U1 %M1, %0";
4595 return "#";
4598 else if (ZERO_P (src))
4599 return "#";
4603 else if (GET_CODE (dest) == MEM)
4605 if (GET_CODE (src) == REG)
4607 int src_regno = REGNO (src);
4609 if (GPR_P (src_regno))
4611 if (((src_regno - GPR_FIRST) & 1) == 0
4612 && dbl_memory_one_insn_operand (dest, mode))
4613 return "std%I0%U0 %1, %M0";
4615 return "#";
4618 if (FPR_P (src_regno))
4620 if (((src_regno - FPR_FIRST) & 1) == 0
4621 && dbl_memory_one_insn_operand (dest, mode))
4622 return "stdf%I0%U0 %1, %M0";
4624 return "#";
4628 else if (ZERO_P (src))
4630 if (dbl_memory_one_insn_operand (dest, mode))
4631 return "std%I0%U0 %., %M0";
4633 return "#";
4637 fatal_insn ("bad output_move_double operand", insn);
4638 return "";
4642 /* Return a string to output a single word conditional move.
4643 Operand0 -- EQ/NE of ccr register and 0
4644 Operand1 -- CCR register
4645 Operand2 -- destination
4646 Operand3 -- source */
4648 const char *
4649 output_condmove_single (rtx operands[], rtx insn)
4651 rtx dest = operands[2];
4652 rtx src = operands[3];
4654 if (GET_CODE (dest) == REG)
4656 int dest_regno = REGNO (dest);
4657 enum machine_mode mode = GET_MODE (dest);
4659 if (GPR_P (dest_regno))
4661 if (GET_CODE (src) == REG)
4663 /* gpr <- some sort of register */
4664 int src_regno = REGNO (src);
4666 if (GPR_P (src_regno))
4667 return "cmov %z3, %2, %1, %e0";
4669 else if (FPR_P (src_regno))
4670 return "cmovfg %3, %2, %1, %e0";
4673 else if (GET_CODE (src) == MEM)
4675 /* gpr <- memory */
4676 switch (mode)
4678 default:
4679 break;
4681 case QImode:
4682 return "cldsb%I3%U3 %M3, %2, %1, %e0";
4684 case HImode:
4685 return "cldsh%I3%U3 %M3, %2, %1, %e0";
4687 case SImode:
4688 case SFmode:
4689 return "cld%I3%U3 %M3, %2, %1, %e0";
4693 else if (ZERO_P (src))
4694 return "cmov %., %2, %1, %e0";
4697 else if (FPR_P (dest_regno))
4699 if (GET_CODE (src) == REG)
4701 /* fpr <- some sort of register */
4702 int src_regno = REGNO (src);
4704 if (GPR_P (src_regno))
4705 return "cmovgf %3, %2, %1, %e0";
4707 else if (FPR_P (src_regno))
4709 if (TARGET_HARD_FLOAT)
4710 return "cfmovs %3,%2,%1,%e0";
4711 else
4712 return "cmor %3, %3, %2, %1, %e0";
4716 else if (GET_CODE (src) == MEM)
4718 /* fpr <- memory */
4719 if (mode == SImode || mode == SFmode)
4720 return "cldf%I3%U3 %M3, %2, %1, %e0";
4723 else if (ZERO_P (src))
4724 return "cmovgf %., %2, %1, %e0";
4728 else if (GET_CODE (dest) == MEM)
4730 if (GET_CODE (src) == REG)
4732 int src_regno = REGNO (src);
4733 enum machine_mode mode = GET_MODE (dest);
4735 if (GPR_P (src_regno))
4737 switch (mode)
4739 default:
4740 break;
4742 case QImode:
4743 return "cstb%I2%U2 %3, %M2, %1, %e0";
4745 case HImode:
4746 return "csth%I2%U2 %3, %M2, %1, %e0";
4748 case SImode:
4749 case SFmode:
4750 return "cst%I2%U2 %3, %M2, %1, %e0";
4754 else if (FPR_P (src_regno) && (mode == SImode || mode == SFmode))
4755 return "cstf%I2%U2 %3, %M2, %1, %e0";
4758 else if (ZERO_P (src))
4760 enum machine_mode mode = GET_MODE (dest);
4761 switch (mode)
4763 default:
4764 break;
4766 case QImode:
4767 return "cstb%I2%U2 %., %M2, %1, %e0";
4769 case HImode:
4770 return "csth%I2%U2 %., %M2, %1, %e0";
4772 case SImode:
4773 case SFmode:
4774 return "cst%I2%U2 %., %M2, %1, %e0";
4779 fatal_insn ("bad output_condmove_single operand", insn);
4780 return "";
4784 /* Emit the appropriate code to do a comparison, returning the register the
4785 comparison was done it. */
4787 static rtx
4788 frv_emit_comparison (enum rtx_code test, rtx op0, rtx op1)
4790 enum machine_mode cc_mode;
4791 rtx cc_reg;
4793 /* Floating point doesn't have comparison against a constant. */
4794 if (GET_MODE (op0) == CC_FPmode && GET_CODE (op1) != REG)
4795 op1 = force_reg (GET_MODE (op0), op1);
4797 /* Possibly disable using anything but a fixed register in order to work
4798 around cse moving comparisons past function calls. */
4799 cc_mode = SELECT_CC_MODE (test, op0, op1);
4800 cc_reg = ((TARGET_ALLOC_CC)
4801 ? gen_reg_rtx (cc_mode)
4802 : gen_rtx_REG (cc_mode,
4803 (cc_mode == CC_FPmode) ? FCC_FIRST : ICC_FIRST));
4805 emit_insn (gen_rtx_SET (VOIDmode, cc_reg,
4806 gen_rtx_COMPARE (cc_mode, op0, op1)));
4808 return cc_reg;
4812 /* Emit code for a conditional branch.
4813 XXX: I originally wanted to add a clobber of a CCR register to use in
4814 conditional execution, but that confuses the rest of the compiler. */
4817 frv_emit_cond_branch (rtx operands[])
4819 rtx test_rtx;
4820 rtx label_ref;
4821 rtx if_else;
4822 enum rtx_code test = GET_CODE (operands[0]);
4823 rtx cc_reg = frv_emit_comparison (test, operands[1], operands[2]);
4824 enum machine_mode cc_mode = GET_MODE (cc_reg);
4826 /* Branches generate:
4827 (set (pc)
4828 (if_then_else (<test>, <cc_reg>, (const_int 0))
4829 (label_ref <branch_label>)
4830 (pc))) */
4831 label_ref = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
4832 test_rtx = gen_rtx_fmt_ee (test, cc_mode, cc_reg, const0_rtx);
4833 if_else = gen_rtx_IF_THEN_ELSE (cc_mode, test_rtx, label_ref, pc_rtx);
4834 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, if_else));
4835 return TRUE;
4839 /* Emit code to set a gpr to 1/0 based on a comparison. */
4842 frv_emit_scc (rtx operands[])
4844 rtx set;
4845 rtx test_rtx;
4846 rtx clobber;
4847 rtx cr_reg;
4848 enum rtx_code test = GET_CODE (operands[1]);
4849 rtx cc_reg = frv_emit_comparison (test, operands[2], operands[3]);
4851 /* SCC instructions generate:
4852 (parallel [(set <target> (<test>, <cc_reg>, (const_int 0))
4853 (clobber (<ccr_reg>))]) */
4854 test_rtx = gen_rtx_fmt_ee (test, SImode, cc_reg, const0_rtx);
4855 set = gen_rtx_SET (VOIDmode, operands[0], test_rtx);
4857 cr_reg = ((TARGET_ALLOC_CC)
4858 ? gen_reg_rtx (CC_CCRmode)
4859 : gen_rtx_REG (CC_CCRmode,
4860 ((GET_MODE (cc_reg) == CC_FPmode)
4861 ? FCR_FIRST
4862 : ICR_FIRST)));
4864 clobber = gen_rtx_CLOBBER (VOIDmode, cr_reg);
4865 emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber)));
4866 return TRUE;
4870 /* Split a SCC instruction into component parts, returning a SEQUENCE to hold
4871 the separate insns. */
4874 frv_split_scc (rtx dest, rtx test, rtx cc_reg, rtx cr_reg, HOST_WIDE_INT value)
4876 rtx ret;
4878 start_sequence ();
4880 /* Set the appropriate CCR bit. */
4881 emit_insn (gen_rtx_SET (VOIDmode,
4882 cr_reg,
4883 gen_rtx_fmt_ee (GET_CODE (test),
4884 GET_MODE (cr_reg),
4885 cc_reg,
4886 const0_rtx)));
4888 /* Move the value into the destination. */
4889 emit_move_insn (dest, GEN_INT (value));
4891 /* Move 0 into the destination if the test failed */
4892 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
4893 gen_rtx_EQ (GET_MODE (cr_reg),
4894 cr_reg,
4895 const0_rtx),
4896 gen_rtx_SET (VOIDmode, dest, const0_rtx)));
4898 /* Finish up, return sequence. */
4899 ret = get_insns ();
4900 end_sequence ();
4901 return ret;
4905 /* Emit the code for a conditional move, return TRUE if we could do the
4906 move. */
4909 frv_emit_cond_move (rtx dest, rtx test_rtx, rtx src1, rtx src2)
4911 rtx set;
4912 rtx clobber_cc;
4913 rtx test2;
4914 rtx cr_reg;
4915 rtx if_rtx;
4916 enum rtx_code test = GET_CODE (test_rtx);
4917 rtx cc_reg = frv_emit_comparison (test,
4918 XEXP (test_rtx, 0), XEXP (test_rtx, 1));
4919 enum machine_mode cc_mode = GET_MODE (cc_reg);
4921 /* Conditional move instructions generate:
4922 (parallel [(set <target>
4923 (if_then_else (<test> <cc_reg> (const_int 0))
4924 <src1>
4925 <src2>))
4926 (clobber (<ccr_reg>))]) */
4928 /* Handle various cases of conditional move involving two constants. */
4929 if (GET_CODE (src1) == CONST_INT && GET_CODE (src2) == CONST_INT)
4931 HOST_WIDE_INT value1 = INTVAL (src1);
4932 HOST_WIDE_INT value2 = INTVAL (src2);
4934 /* Having 0 as one of the constants can be done by loading the other
4935 constant, and optionally moving in gr0. */
4936 if (value1 == 0 || value2 == 0)
4939 /* If the first value is within an addi range and also the difference
4940 between the two fits in an addi's range, load up the difference, then
4941 conditionally move in 0, and then unconditionally add the first
4942 value. */
4943 else if (IN_RANGE_P (value1, -2048, 2047)
4944 && IN_RANGE_P (value2 - value1, -2048, 2047))
4947 /* If neither condition holds, just force the constant into a
4948 register. */
4949 else
4951 src1 = force_reg (GET_MODE (dest), src1);
4952 src2 = force_reg (GET_MODE (dest), src2);
4956 /* If one value is a register, insure the other value is either 0 or a
4957 register. */
4958 else
4960 if (GET_CODE (src1) == CONST_INT && INTVAL (src1) != 0)
4961 src1 = force_reg (GET_MODE (dest), src1);
4963 if (GET_CODE (src2) == CONST_INT && INTVAL (src2) != 0)
4964 src2 = force_reg (GET_MODE (dest), src2);
4967 test2 = gen_rtx_fmt_ee (test, cc_mode, cc_reg, const0_rtx);
4968 if_rtx = gen_rtx_IF_THEN_ELSE (GET_MODE (dest), test2, src1, src2);
4970 set = gen_rtx_SET (VOIDmode, dest, if_rtx);
4972 cr_reg = ((TARGET_ALLOC_CC)
4973 ? gen_reg_rtx (CC_CCRmode)
4974 : gen_rtx_REG (CC_CCRmode,
4975 (cc_mode == CC_FPmode) ? FCR_FIRST : ICR_FIRST));
4977 clobber_cc = gen_rtx_CLOBBER (VOIDmode, cr_reg);
4978 emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber_cc)));
4979 return TRUE;
4983 /* Split a conditional move into constituent parts, returning a SEQUENCE
4984 containing all of the insns. */
4987 frv_split_cond_move (rtx operands[])
4989 rtx dest = operands[0];
4990 rtx test = operands[1];
4991 rtx cc_reg = operands[2];
4992 rtx src1 = operands[3];
4993 rtx src2 = operands[4];
4994 rtx cr_reg = operands[5];
4995 rtx ret;
4996 enum machine_mode cr_mode = GET_MODE (cr_reg);
4998 start_sequence ();
5000 /* Set the appropriate CCR bit. */
5001 emit_insn (gen_rtx_SET (VOIDmode,
5002 cr_reg,
5003 gen_rtx_fmt_ee (GET_CODE (test),
5004 GET_MODE (cr_reg),
5005 cc_reg,
5006 const0_rtx)));
5008 /* Handle various cases of conditional move involving two constants. */
5009 if (GET_CODE (src1) == CONST_INT && GET_CODE (src2) == CONST_INT)
5011 HOST_WIDE_INT value1 = INTVAL (src1);
5012 HOST_WIDE_INT value2 = INTVAL (src2);
5014 /* Having 0 as one of the constants can be done by loading the other
5015 constant, and optionally moving in gr0. */
5016 if (value1 == 0)
5018 emit_move_insn (dest, src2);
5019 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5020 gen_rtx_NE (cr_mode, cr_reg,
5021 const0_rtx),
5022 gen_rtx_SET (VOIDmode, dest, src1)));
5025 else if (value2 == 0)
5027 emit_move_insn (dest, src1);
5028 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5029 gen_rtx_EQ (cr_mode, cr_reg,
5030 const0_rtx),
5031 gen_rtx_SET (VOIDmode, dest, src2)));
5034 /* If the first value is within an addi range and also the difference
5035 between the two fits in an addi's range, load up the difference, then
5036 conditionally move in 0, and then unconditionally add the first
5037 value. */
5038 else if (IN_RANGE_P (value1, -2048, 2047)
5039 && IN_RANGE_P (value2 - value1, -2048, 2047))
5041 rtx dest_si = ((GET_MODE (dest) == SImode)
5042 ? dest
5043 : gen_rtx_SUBREG (SImode, dest, 0));
5045 emit_move_insn (dest_si, GEN_INT (value2 - value1));
5046 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5047 gen_rtx_NE (cr_mode, cr_reg,
5048 const0_rtx),
5049 gen_rtx_SET (VOIDmode, dest_si,
5050 const0_rtx)));
5051 emit_insn (gen_addsi3 (dest_si, dest_si, src1));
5054 else
5055 gcc_unreachable ();
5057 else
5059 /* Emit the conditional move for the test being true if needed. */
5060 if (! rtx_equal_p (dest, src1))
5061 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5062 gen_rtx_NE (cr_mode, cr_reg, const0_rtx),
5063 gen_rtx_SET (VOIDmode, dest, src1)));
5065 /* Emit the conditional move for the test being false if needed. */
5066 if (! rtx_equal_p (dest, src2))
5067 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5068 gen_rtx_EQ (cr_mode, cr_reg, const0_rtx),
5069 gen_rtx_SET (VOIDmode, dest, src2)));
5072 /* Finish up, return sequence. */
5073 ret = get_insns ();
5074 end_sequence ();
5075 return ret;
5079 /* Split (set DEST SOURCE), where DEST is a double register and SOURCE is a
5080 memory location that is not known to be dword-aligned. */
5081 void
5082 frv_split_double_load (rtx dest, rtx source)
5084 int regno = REGNO (dest);
5085 rtx dest1 = gen_highpart (SImode, dest);
5086 rtx dest2 = gen_lowpart (SImode, dest);
5087 rtx address = XEXP (source, 0);
5089 /* If the address is pre-modified, load the lower-numbered register
5090 first, then load the other register using an integer offset from
5091 the modified base register. This order should always be safe,
5092 since the pre-modification cannot affect the same registers as the
5093 load does.
5095 The situation for other loads is more complicated. Loading one
5096 of the registers could affect the value of ADDRESS, so we must
5097 be careful which order we do them in. */
5098 if (GET_CODE (address) == PRE_MODIFY
5099 || ! refers_to_regno_p (regno, regno + 1, address, NULL))
5101 /* It is safe to load the lower-numbered register first. */
5102 emit_move_insn (dest1, change_address (source, SImode, NULL));
5103 emit_move_insn (dest2, frv_index_memory (source, SImode, 1));
5105 else
5107 /* ADDRESS is not pre-modified and the address depends on the
5108 lower-numbered register. Load the higher-numbered register
5109 first. */
5110 emit_move_insn (dest2, frv_index_memory (source, SImode, 1));
5111 emit_move_insn (dest1, change_address (source, SImode, NULL));
5115 /* Split (set DEST SOURCE), where DEST refers to a dword memory location
5116 and SOURCE is either a double register or the constant zero. */
5117 void
5118 frv_split_double_store (rtx dest, rtx source)
5120 rtx dest1 = change_address (dest, SImode, NULL);
5121 rtx dest2 = frv_index_memory (dest, SImode, 1);
5122 if (ZERO_P (source))
5124 emit_move_insn (dest1, CONST0_RTX (SImode));
5125 emit_move_insn (dest2, CONST0_RTX (SImode));
5127 else
5129 emit_move_insn (dest1, gen_highpart (SImode, source));
5130 emit_move_insn (dest2, gen_lowpart (SImode, source));
5135 /* Split a min/max operation returning a SEQUENCE containing all of the
5136 insns. */
5139 frv_split_minmax (rtx operands[])
5141 rtx dest = operands[0];
5142 rtx minmax = operands[1];
5143 rtx src1 = operands[2];
5144 rtx src2 = operands[3];
5145 rtx cc_reg = operands[4];
5146 rtx cr_reg = operands[5];
5147 rtx ret;
5148 enum rtx_code test_code;
5149 enum machine_mode cr_mode = GET_MODE (cr_reg);
5151 start_sequence ();
5153 /* Figure out which test to use. */
5154 switch (GET_CODE (minmax))
5156 default:
5157 gcc_unreachable ();
5159 case SMIN: test_code = LT; break;
5160 case SMAX: test_code = GT; break;
5161 case UMIN: test_code = LTU; break;
5162 case UMAX: test_code = GTU; break;
5165 /* Issue the compare instruction. */
5166 emit_insn (gen_rtx_SET (VOIDmode,
5167 cc_reg,
5168 gen_rtx_COMPARE (GET_MODE (cc_reg),
5169 src1, src2)));
5171 /* Set the appropriate CCR bit. */
5172 emit_insn (gen_rtx_SET (VOIDmode,
5173 cr_reg,
5174 gen_rtx_fmt_ee (test_code,
5175 GET_MODE (cr_reg),
5176 cc_reg,
5177 const0_rtx)));
5179 /* If are taking the min/max of a nonzero constant, load that first, and
5180 then do a conditional move of the other value. */
5181 if (GET_CODE (src2) == CONST_INT && INTVAL (src2) != 0)
5183 gcc_assert (!rtx_equal_p (dest, src1));
5185 emit_move_insn (dest, src2);
5186 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5187 gen_rtx_NE (cr_mode, cr_reg, const0_rtx),
5188 gen_rtx_SET (VOIDmode, dest, src1)));
5191 /* Otherwise, do each half of the move. */
5192 else
5194 /* Emit the conditional move for the test being true if needed. */
5195 if (! rtx_equal_p (dest, src1))
5196 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5197 gen_rtx_NE (cr_mode, cr_reg, const0_rtx),
5198 gen_rtx_SET (VOIDmode, dest, src1)));
5200 /* Emit the conditional move for the test being false if needed. */
5201 if (! rtx_equal_p (dest, src2))
5202 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5203 gen_rtx_EQ (cr_mode, cr_reg, const0_rtx),
5204 gen_rtx_SET (VOIDmode, dest, src2)));
5207 /* Finish up, return sequence. */
5208 ret = get_insns ();
5209 end_sequence ();
5210 return ret;
5214 /* Split an integer abs operation returning a SEQUENCE containing all of the
5215 insns. */
5218 frv_split_abs (rtx operands[])
5220 rtx dest = operands[0];
5221 rtx src = operands[1];
5222 rtx cc_reg = operands[2];
5223 rtx cr_reg = operands[3];
5224 rtx ret;
5226 start_sequence ();
5228 /* Issue the compare < 0 instruction. */
5229 emit_insn (gen_rtx_SET (VOIDmode,
5230 cc_reg,
5231 gen_rtx_COMPARE (CCmode, src, const0_rtx)));
5233 /* Set the appropriate CCR bit. */
5234 emit_insn (gen_rtx_SET (VOIDmode,
5235 cr_reg,
5236 gen_rtx_fmt_ee (LT, CC_CCRmode, cc_reg, const0_rtx)));
5238 /* Emit the conditional negate if the value is negative. */
5239 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5240 gen_rtx_NE (CC_CCRmode, cr_reg, const0_rtx),
5241 gen_negsi2 (dest, src)));
5243 /* Emit the conditional move for the test being false if needed. */
5244 if (! rtx_equal_p (dest, src))
5245 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5246 gen_rtx_EQ (CC_CCRmode, cr_reg, const0_rtx),
5247 gen_rtx_SET (VOIDmode, dest, src)));
5249 /* Finish up, return sequence. */
5250 ret = get_insns ();
5251 end_sequence ();
5252 return ret;
5256 /* An internal function called by for_each_rtx to clear in a hard_reg set each
5257 register used in an insn. */
5259 static int
5260 frv_clear_registers_used (rtx *ptr, void *data)
5262 if (GET_CODE (*ptr) == REG)
5264 int regno = REGNO (*ptr);
5265 HARD_REG_SET *p_regs = (HARD_REG_SET *)data;
5267 if (regno < FIRST_PSEUDO_REGISTER)
5269 int reg_max = regno + HARD_REGNO_NREGS (regno, GET_MODE (*ptr));
5271 while (regno < reg_max)
5273 CLEAR_HARD_REG_BIT (*p_regs, regno);
5274 regno++;
5279 return 0;
5283 /* Initialize the extra fields provided by IFCVT_EXTRA_FIELDS. */
5285 /* On the FR-V, we don't have any extra fields per se, but it is useful hook to
5286 initialize the static storage. */
5287 void
5288 frv_ifcvt_init_extra_fields (ce_if_block_t *ce_info ATTRIBUTE_UNUSED)
5290 frv_ifcvt.added_insns_list = NULL_RTX;
5291 frv_ifcvt.cur_scratch_regs = 0;
5292 frv_ifcvt.num_nested_cond_exec = 0;
5293 frv_ifcvt.cr_reg = NULL_RTX;
5294 frv_ifcvt.nested_cc_reg = NULL_RTX;
5295 frv_ifcvt.extra_int_cr = NULL_RTX;
5296 frv_ifcvt.extra_fp_cr = NULL_RTX;
5297 frv_ifcvt.last_nested_if_cr = NULL_RTX;
5301 /* Internal function to add a potential insn to the list of insns to be inserted
5302 if the conditional execution conversion is successful. */
5304 static void
5305 frv_ifcvt_add_insn (rtx pattern, rtx insn, int before_p)
5307 rtx link = alloc_EXPR_LIST (VOIDmode, pattern, insn);
5309 link->jump = before_p; /* Mark to add this before or after insn. */
5310 frv_ifcvt.added_insns_list = alloc_EXPR_LIST (VOIDmode, link,
5311 frv_ifcvt.added_insns_list);
5313 if (TARGET_DEBUG_COND_EXEC)
5315 fprintf (stderr,
5316 "\n:::::::::: frv_ifcvt_add_insn: add the following %s insn %d:\n",
5317 (before_p) ? "before" : "after",
5318 (int)INSN_UID (insn));
5320 debug_rtx (pattern);
5325 /* A C expression to modify the code described by the conditional if
5326 information CE_INFO, possibly updating the tests in TRUE_EXPR, and
5327 FALSE_EXPR for converting if-then and if-then-else code to conditional
5328 instructions. Set either TRUE_EXPR or FALSE_EXPR to a null pointer if the
5329 tests cannot be converted. */
5331 void
5332 frv_ifcvt_modify_tests (ce_if_block_t *ce_info, rtx *p_true, rtx *p_false)
5334 basic_block test_bb = ce_info->test_bb; /* test basic block */
5335 basic_block then_bb = ce_info->then_bb; /* THEN */
5336 basic_block else_bb = ce_info->else_bb; /* ELSE or NULL */
5337 basic_block join_bb = ce_info->join_bb; /* join block or NULL */
5338 rtx true_expr = *p_true;
5339 rtx cr;
5340 rtx cc;
5341 rtx nested_cc;
5342 enum machine_mode mode = GET_MODE (true_expr);
5343 int j;
5344 basic_block *bb;
5345 int num_bb;
5346 frv_tmp_reg_t *tmp_reg = &frv_ifcvt.tmp_reg;
5347 rtx check_insn;
5348 rtx sub_cond_exec_reg;
5349 enum rtx_code code;
5350 enum rtx_code code_true;
5351 enum rtx_code code_false;
5352 enum reg_class cc_class;
5353 enum reg_class cr_class;
5354 int cc_first;
5355 int cc_last;
5356 reg_set_iterator rsi;
5358 /* Make sure we are only dealing with hard registers. Also honor the
5359 -mno-cond-exec switch, and -mno-nested-cond-exec switches if
5360 applicable. */
5361 if (!reload_completed || !TARGET_COND_EXEC
5362 || (!TARGET_NESTED_CE && ce_info->pass > 1))
5363 goto fail;
5365 /* Figure out which registers we can allocate for our own purposes. Only
5366 consider registers that are not preserved across function calls and are
5367 not fixed. However, allow the ICC/ICR temporary registers to be allocated
5368 if we did not need to use them in reloading other registers. */
5369 memset (&tmp_reg->regs, 0, sizeof (tmp_reg->regs));
5370 COPY_HARD_REG_SET (tmp_reg->regs, call_used_reg_set);
5371 AND_COMPL_HARD_REG_SET (tmp_reg->regs, fixed_reg_set);
5372 SET_HARD_REG_BIT (tmp_reg->regs, ICC_TEMP);
5373 SET_HARD_REG_BIT (tmp_reg->regs, ICR_TEMP);
5375 /* If this is a nested IF, we need to discover whether the CC registers that
5376 are set/used inside of the block are used anywhere else. If not, we can
5377 change them to be the CC register that is paired with the CR register that
5378 controls the outermost IF block. */
5379 if (ce_info->pass > 1)
5381 CLEAR_HARD_REG_SET (frv_ifcvt.nested_cc_ok_rewrite);
5382 for (j = CC_FIRST; j <= CC_LAST; j++)
5383 if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
5385 if (REGNO_REG_SET_P (df_get_live_in (then_bb), j))
5386 continue;
5388 if (else_bb
5389 && REGNO_REG_SET_P (df_get_live_in (else_bb), j))
5390 continue;
5392 if (join_bb
5393 && REGNO_REG_SET_P (df_get_live_in (join_bb), j))
5394 continue;
5396 SET_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite, j);
5400 for (j = 0; j < frv_ifcvt.cur_scratch_regs; j++)
5401 frv_ifcvt.scratch_regs[j] = NULL_RTX;
5403 frv_ifcvt.added_insns_list = NULL_RTX;
5404 frv_ifcvt.cur_scratch_regs = 0;
5406 bb = (basic_block *) alloca ((2 + ce_info->num_multiple_test_blocks)
5407 * sizeof (basic_block));
5409 if (join_bb)
5411 unsigned int regno;
5413 /* Remove anything live at the beginning of the join block from being
5414 available for allocation. */
5415 EXECUTE_IF_SET_IN_REG_SET (df_get_live_in (join_bb), 0, regno, rsi)
5417 if (regno < FIRST_PSEUDO_REGISTER)
5418 CLEAR_HARD_REG_BIT (tmp_reg->regs, regno);
5422 /* Add in all of the blocks in multiple &&/|| blocks to be scanned. */
5423 num_bb = 0;
5424 if (ce_info->num_multiple_test_blocks)
5426 basic_block multiple_test_bb = ce_info->last_test_bb;
5428 while (multiple_test_bb != test_bb)
5430 bb[num_bb++] = multiple_test_bb;
5431 multiple_test_bb = EDGE_PRED (multiple_test_bb, 0)->src;
5435 /* Add in the THEN and ELSE blocks to be scanned. */
5436 bb[num_bb++] = then_bb;
5437 if (else_bb)
5438 bb[num_bb++] = else_bb;
5440 sub_cond_exec_reg = NULL_RTX;
5441 frv_ifcvt.num_nested_cond_exec = 0;
5443 /* Scan all of the blocks for registers that must not be allocated. */
5444 for (j = 0; j < num_bb; j++)
5446 rtx last_insn = BB_END (bb[j]);
5447 rtx insn = BB_HEAD (bb[j]);
5448 unsigned int regno;
5450 if (dump_file)
5451 fprintf (dump_file, "Scanning %s block %d, start %d, end %d\n",
5452 (bb[j] == else_bb) ? "else" : ((bb[j] == then_bb) ? "then" : "test"),
5453 (int) bb[j]->index,
5454 (int) INSN_UID (BB_HEAD (bb[j])),
5455 (int) INSN_UID (BB_END (bb[j])));
5457 /* Anything live at the beginning of the block is obviously unavailable
5458 for allocation. */
5459 EXECUTE_IF_SET_IN_REG_SET (df_get_live_in (bb[j]), 0, regno, rsi)
5461 if (regno < FIRST_PSEUDO_REGISTER)
5462 CLEAR_HARD_REG_BIT (tmp_reg->regs, regno);
5465 /* Loop through the insns in the block. */
5466 for (;;)
5468 /* Mark any new registers that are created as being unavailable for
5469 allocation. Also see if the CC register used in nested IFs can be
5470 reallocated. */
5471 if (INSN_P (insn))
5473 rtx pattern;
5474 rtx set;
5475 int skip_nested_if = FALSE;
5477 for_each_rtx (&PATTERN (insn), frv_clear_registers_used,
5478 (void *)&tmp_reg->regs);
5480 pattern = PATTERN (insn);
5481 if (GET_CODE (pattern) == COND_EXEC)
5483 rtx reg = XEXP (COND_EXEC_TEST (pattern), 0);
5485 if (reg != sub_cond_exec_reg)
5487 sub_cond_exec_reg = reg;
5488 frv_ifcvt.num_nested_cond_exec++;
5492 set = single_set_pattern (pattern);
5493 if (set)
5495 rtx dest = SET_DEST (set);
5496 rtx src = SET_SRC (set);
5498 if (GET_CODE (dest) == REG)
5500 int regno = REGNO (dest);
5501 enum rtx_code src_code = GET_CODE (src);
5503 if (CC_P (regno) && src_code == COMPARE)
5504 skip_nested_if = TRUE;
5506 else if (CR_P (regno)
5507 && (src_code == IF_THEN_ELSE
5508 || COMPARISON_P (src)))
5509 skip_nested_if = TRUE;
5513 if (! skip_nested_if)
5514 for_each_rtx (&PATTERN (insn), frv_clear_registers_used,
5515 (void *)&frv_ifcvt.nested_cc_ok_rewrite);
5518 if (insn == last_insn)
5519 break;
5521 insn = NEXT_INSN (insn);
5525 /* If this is a nested if, rewrite the CC registers that are available to
5526 include the ones that can be rewritten, to increase the chance of being
5527 able to allocate a paired CC/CR register combination. */
5528 if (ce_info->pass > 1)
5530 for (j = CC_FIRST; j <= CC_LAST; j++)
5531 if (TEST_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite, j))
5532 SET_HARD_REG_BIT (tmp_reg->regs, j);
5533 else
5534 CLEAR_HARD_REG_BIT (tmp_reg->regs, j);
5537 if (dump_file)
5539 int num_gprs = 0;
5540 fprintf (dump_file, "Available GPRs: ");
5542 for (j = GPR_FIRST; j <= GPR_LAST; j++)
5543 if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
5545 fprintf (dump_file, " %d [%s]", j, reg_names[j]);
5546 if (++num_gprs > GPR_TEMP_NUM+2)
5547 break;
5550 fprintf (dump_file, "%s\nAvailable CRs: ",
5551 (num_gprs > GPR_TEMP_NUM+2) ? " ..." : "");
5553 for (j = CR_FIRST; j <= CR_LAST; j++)
5554 if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
5555 fprintf (dump_file, " %d [%s]", j, reg_names[j]);
5557 fputs ("\n", dump_file);
5559 if (ce_info->pass > 1)
5561 fprintf (dump_file, "Modifiable CCs: ");
5562 for (j = CC_FIRST; j <= CC_LAST; j++)
5563 if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
5564 fprintf (dump_file, " %d [%s]", j, reg_names[j]);
5566 fprintf (dump_file, "\n%d nested COND_EXEC statements\n",
5567 frv_ifcvt.num_nested_cond_exec);
5571 /* Allocate the appropriate temporary condition code register. Try to
5572 allocate the ICR/FCR register that corresponds to the ICC/FCC register so
5573 that conditional cmp's can be done. */
5574 if (mode == CCmode || mode == CC_UNSmode || mode == CC_NZmode)
5576 cr_class = ICR_REGS;
5577 cc_class = ICC_REGS;
5578 cc_first = ICC_FIRST;
5579 cc_last = ICC_LAST;
5581 else if (mode == CC_FPmode)
5583 cr_class = FCR_REGS;
5584 cc_class = FCC_REGS;
5585 cc_first = FCC_FIRST;
5586 cc_last = FCC_LAST;
5588 else
5590 cc_first = cc_last = 0;
5591 cr_class = cc_class = NO_REGS;
5594 cc = XEXP (true_expr, 0);
5595 nested_cc = cr = NULL_RTX;
5596 if (cc_class != NO_REGS)
5598 /* For nested IFs and &&/||, see if we can find a CC and CR register pair
5599 so we can execute a csubcc/caddcc/cfcmps instruction. */
5600 int cc_regno;
5602 for (cc_regno = cc_first; cc_regno <= cc_last; cc_regno++)
5604 int cr_regno = cc_regno - CC_FIRST + CR_FIRST;
5606 if (TEST_HARD_REG_BIT (frv_ifcvt.tmp_reg.regs, cc_regno)
5607 && TEST_HARD_REG_BIT (frv_ifcvt.tmp_reg.regs, cr_regno))
5609 frv_ifcvt.tmp_reg.next_reg[ (int)cr_class ] = cr_regno;
5610 cr = frv_alloc_temp_reg (tmp_reg, cr_class, CC_CCRmode, TRUE,
5611 TRUE);
5613 frv_ifcvt.tmp_reg.next_reg[ (int)cc_class ] = cc_regno;
5614 nested_cc = frv_alloc_temp_reg (tmp_reg, cc_class, CCmode,
5615 TRUE, TRUE);
5616 break;
5621 if (! cr)
5623 if (dump_file)
5624 fprintf (dump_file, "Could not allocate a CR temporary register\n");
5626 goto fail;
5629 if (dump_file)
5630 fprintf (dump_file,
5631 "Will use %s for conditional execution, %s for nested comparisons\n",
5632 reg_names[ REGNO (cr)],
5633 (nested_cc) ? reg_names[ REGNO (nested_cc) ] : "<none>");
5635 /* Set the CCR bit. Note for integer tests, we reverse the condition so that
5636 in an IF-THEN-ELSE sequence, we are testing the TRUE case against the CCR
5637 bit being true. We don't do this for floating point, because of NaNs. */
5638 code = GET_CODE (true_expr);
5639 if (GET_MODE (cc) != CC_FPmode)
5641 code = reverse_condition (code);
5642 code_true = EQ;
5643 code_false = NE;
5645 else
5647 code_true = NE;
5648 code_false = EQ;
5651 check_insn = gen_rtx_SET (VOIDmode, cr,
5652 gen_rtx_fmt_ee (code, CC_CCRmode, cc, const0_rtx));
5654 /* Record the check insn to be inserted later. */
5655 frv_ifcvt_add_insn (check_insn, BB_END (test_bb), TRUE);
5657 /* Update the tests. */
5658 frv_ifcvt.cr_reg = cr;
5659 frv_ifcvt.nested_cc_reg = nested_cc;
5660 *p_true = gen_rtx_fmt_ee (code_true, CC_CCRmode, cr, const0_rtx);
5661 *p_false = gen_rtx_fmt_ee (code_false, CC_CCRmode, cr, const0_rtx);
5662 return;
5664 /* Fail, don't do this conditional execution. */
5665 fail:
5666 *p_true = NULL_RTX;
5667 *p_false = NULL_RTX;
5668 if (dump_file)
5669 fprintf (dump_file, "Disabling this conditional execution.\n");
5671 return;
5675 /* A C expression to modify the code described by the conditional if
5676 information CE_INFO, for the basic block BB, possibly updating the tests in
5677 TRUE_EXPR, and FALSE_EXPR for converting the && and || parts of if-then or
5678 if-then-else code to conditional instructions. Set either TRUE_EXPR or
5679 FALSE_EXPR to a null pointer if the tests cannot be converted. */
5681 /* p_true and p_false are given expressions of the form:
5683 (and (eq:CC_CCR (reg:CC_CCR)
5684 (const_int 0))
5685 (eq:CC (reg:CC)
5686 (const_int 0))) */
5688 void
5689 frv_ifcvt_modify_multiple_tests (ce_if_block_t *ce_info,
5690 basic_block bb,
5691 rtx *p_true,
5692 rtx *p_false)
5694 rtx old_true = XEXP (*p_true, 0);
5695 rtx old_false = XEXP (*p_false, 0);
5696 rtx true_expr = XEXP (*p_true, 1);
5697 rtx false_expr = XEXP (*p_false, 1);
5698 rtx test_expr;
5699 rtx old_test;
5700 rtx cr = XEXP (old_true, 0);
5701 rtx check_insn;
5702 rtx new_cr = NULL_RTX;
5703 rtx *p_new_cr = (rtx *)0;
5704 rtx if_else;
5705 rtx compare;
5706 rtx cc;
5707 enum reg_class cr_class;
5708 enum machine_mode mode = GET_MODE (true_expr);
5709 rtx (*logical_func)(rtx, rtx, rtx);
5711 if (TARGET_DEBUG_COND_EXEC)
5713 fprintf (stderr,
5714 "\n:::::::::: frv_ifcvt_modify_multiple_tests, before modification for %s\ntrue insn:\n",
5715 ce_info->and_and_p ? "&&" : "||");
5717 debug_rtx (*p_true);
5719 fputs ("\nfalse insn:\n", stderr);
5720 debug_rtx (*p_false);
5723 if (!TARGET_MULTI_CE)
5724 goto fail;
5726 if (GET_CODE (cr) != REG)
5727 goto fail;
5729 if (mode == CCmode || mode == CC_UNSmode || mode == CC_NZmode)
5731 cr_class = ICR_REGS;
5732 p_new_cr = &frv_ifcvt.extra_int_cr;
5734 else if (mode == CC_FPmode)
5736 cr_class = FCR_REGS;
5737 p_new_cr = &frv_ifcvt.extra_fp_cr;
5739 else
5740 goto fail;
5742 /* Allocate a temp CR, reusing a previously allocated temp CR if we have 3 or
5743 more &&/|| tests. */
5744 new_cr = *p_new_cr;
5745 if (! new_cr)
5747 new_cr = *p_new_cr = frv_alloc_temp_reg (&frv_ifcvt.tmp_reg, cr_class,
5748 CC_CCRmode, TRUE, TRUE);
5749 if (! new_cr)
5750 goto fail;
5753 if (ce_info->and_and_p)
5755 old_test = old_false;
5756 test_expr = true_expr;
5757 logical_func = (GET_CODE (old_true) == EQ) ? gen_andcr : gen_andncr;
5758 *p_true = gen_rtx_NE (CC_CCRmode, cr, const0_rtx);
5759 *p_false = gen_rtx_EQ (CC_CCRmode, cr, const0_rtx);
5761 else
5763 old_test = old_false;
5764 test_expr = false_expr;
5765 logical_func = (GET_CODE (old_false) == EQ) ? gen_orcr : gen_orncr;
5766 *p_true = gen_rtx_EQ (CC_CCRmode, cr, const0_rtx);
5767 *p_false = gen_rtx_NE (CC_CCRmode, cr, const0_rtx);
5770 /* First add the andcr/andncr/orcr/orncr, which will be added after the
5771 conditional check instruction, due to frv_ifcvt_add_insn being a LIFO
5772 stack. */
5773 frv_ifcvt_add_insn ((*logical_func) (cr, cr, new_cr), BB_END (bb), TRUE);
5775 /* Now add the conditional check insn. */
5776 cc = XEXP (test_expr, 0);
5777 compare = gen_rtx_fmt_ee (GET_CODE (test_expr), CC_CCRmode, cc, const0_rtx);
5778 if_else = gen_rtx_IF_THEN_ELSE (CC_CCRmode, old_test, compare, const0_rtx);
5780 check_insn = gen_rtx_SET (VOIDmode, new_cr, if_else);
5782 /* Add the new check insn to the list of check insns that need to be
5783 inserted. */
5784 frv_ifcvt_add_insn (check_insn, BB_END (bb), TRUE);
5786 if (TARGET_DEBUG_COND_EXEC)
5788 fputs ("\n:::::::::: frv_ifcvt_modify_multiple_tests, after modification\ntrue insn:\n",
5789 stderr);
5791 debug_rtx (*p_true);
5793 fputs ("\nfalse insn:\n", stderr);
5794 debug_rtx (*p_false);
5797 return;
5799 fail:
5800 *p_true = *p_false = NULL_RTX;
5802 /* If we allocated a CR register, release it. */
5803 if (new_cr)
5805 CLEAR_HARD_REG_BIT (frv_ifcvt.tmp_reg.regs, REGNO (new_cr));
5806 *p_new_cr = NULL_RTX;
5809 if (TARGET_DEBUG_COND_EXEC)
5810 fputs ("\n:::::::::: frv_ifcvt_modify_multiple_tests, failed.\n", stderr);
5812 return;
5816 /* Return a register which will be loaded with a value if an IF block is
5817 converted to conditional execution. This is used to rewrite instructions
5818 that use constants to ones that just use registers. */
5820 static rtx
5821 frv_ifcvt_load_value (rtx value, rtx insn ATTRIBUTE_UNUSED)
5823 int num_alloc = frv_ifcvt.cur_scratch_regs;
5824 int i;
5825 rtx reg;
5827 /* We know gr0 == 0, so replace any errant uses. */
5828 if (value == const0_rtx)
5829 return gen_rtx_REG (SImode, GPR_FIRST);
5831 /* First search all registers currently loaded to see if we have an
5832 applicable constant. */
5833 if (CONSTANT_P (value)
5834 || (GET_CODE (value) == REG && REGNO (value) == LR_REGNO))
5836 for (i = 0; i < num_alloc; i++)
5838 if (rtx_equal_p (SET_SRC (frv_ifcvt.scratch_regs[i]), value))
5839 return SET_DEST (frv_ifcvt.scratch_regs[i]);
5843 /* Have we exhausted the number of registers available? */
5844 if (num_alloc >= GPR_TEMP_NUM)
5846 if (dump_file)
5847 fprintf (dump_file, "Too many temporary registers allocated\n");
5849 return NULL_RTX;
5852 /* Allocate the new register. */
5853 reg = frv_alloc_temp_reg (&frv_ifcvt.tmp_reg, GPR_REGS, SImode, TRUE, TRUE);
5854 if (! reg)
5856 if (dump_file)
5857 fputs ("Could not find a scratch register\n", dump_file);
5859 return NULL_RTX;
5862 frv_ifcvt.cur_scratch_regs++;
5863 frv_ifcvt.scratch_regs[num_alloc] = gen_rtx_SET (VOIDmode, reg, value);
5865 if (dump_file)
5867 if (GET_CODE (value) == CONST_INT)
5868 fprintf (dump_file, "Register %s will hold %ld\n",
5869 reg_names[ REGNO (reg)], (long)INTVAL (value));
5871 else if (GET_CODE (value) == REG && REGNO (value) == LR_REGNO)
5872 fprintf (dump_file, "Register %s will hold LR\n",
5873 reg_names[ REGNO (reg)]);
5875 else
5876 fprintf (dump_file, "Register %s will hold a saved value\n",
5877 reg_names[ REGNO (reg)]);
5880 return reg;
5884 /* Update a MEM used in conditional code that might contain an offset to put
5885 the offset into a scratch register, so that the conditional load/store
5886 operations can be used. This function returns the original pointer if the
5887 MEM is valid to use in conditional code, NULL if we can't load up the offset
5888 into a temporary register, or the new MEM if we were successful. */
5890 static rtx
5891 frv_ifcvt_rewrite_mem (rtx mem, enum machine_mode mode, rtx insn)
5893 rtx addr = XEXP (mem, 0);
5895 if (!frv_legitimate_address_p_1 (mode, addr, reload_completed, TRUE, FALSE))
5897 if (GET_CODE (addr) == PLUS)
5899 rtx addr_op0 = XEXP (addr, 0);
5900 rtx addr_op1 = XEXP (addr, 1);
5902 if (GET_CODE (addr_op0) == REG && CONSTANT_P (addr_op1))
5904 rtx reg = frv_ifcvt_load_value (addr_op1, insn);
5905 if (!reg)
5906 return NULL_RTX;
5908 addr = gen_rtx_PLUS (Pmode, addr_op0, reg);
5911 else
5912 return NULL_RTX;
5915 else if (CONSTANT_P (addr))
5916 addr = frv_ifcvt_load_value (addr, insn);
5918 else
5919 return NULL_RTX;
5921 if (addr == NULL_RTX)
5922 return NULL_RTX;
5924 else if (XEXP (mem, 0) != addr)
5925 return change_address (mem, mode, addr);
5928 return mem;
5932 /* Given a PATTERN, return a SET expression if this PATTERN has only a single
5933 SET, possibly conditionally executed. It may also have CLOBBERs, USEs. */
5935 static rtx
5936 single_set_pattern (rtx pattern)
5938 rtx set;
5939 int i;
5941 if (GET_CODE (pattern) == COND_EXEC)
5942 pattern = COND_EXEC_CODE (pattern);
5944 if (GET_CODE (pattern) == SET)
5945 return pattern;
5947 else if (GET_CODE (pattern) == PARALLEL)
5949 for (i = 0, set = 0; i < XVECLEN (pattern, 0); i++)
5951 rtx sub = XVECEXP (pattern, 0, i);
5953 switch (GET_CODE (sub))
5955 case USE:
5956 case CLOBBER:
5957 break;
5959 case SET:
5960 if (set)
5961 return 0;
5962 else
5963 set = sub;
5964 break;
5966 default:
5967 return 0;
5970 return set;
5973 return 0;
5977 /* A C expression to modify the code described by the conditional if
5978 information CE_INFO with the new PATTERN in INSN. If PATTERN is a null
5979 pointer after the IFCVT_MODIFY_INSN macro executes, it is assumed that that
5980 insn cannot be converted to be executed conditionally. */
5983 frv_ifcvt_modify_insn (ce_if_block_t *ce_info,
5984 rtx pattern,
5985 rtx insn)
5987 rtx orig_ce_pattern = pattern;
5988 rtx set;
5989 rtx op0;
5990 rtx op1;
5991 rtx test;
5993 gcc_assert (GET_CODE (pattern) == COND_EXEC);
5995 test = COND_EXEC_TEST (pattern);
5996 if (GET_CODE (test) == AND)
5998 rtx cr = frv_ifcvt.cr_reg;
5999 rtx test_reg;
6001 op0 = XEXP (test, 0);
6002 if (! rtx_equal_p (cr, XEXP (op0, 0)))
6003 goto fail;
6005 op1 = XEXP (test, 1);
6006 test_reg = XEXP (op1, 0);
6007 if (GET_CODE (test_reg) != REG)
6008 goto fail;
6010 /* Is this the first nested if block in this sequence? If so, generate
6011 an andcr or andncr. */
6012 if (! frv_ifcvt.last_nested_if_cr)
6014 rtx and_op;
6016 frv_ifcvt.last_nested_if_cr = test_reg;
6017 if (GET_CODE (op0) == NE)
6018 and_op = gen_andcr (test_reg, cr, test_reg);
6019 else
6020 and_op = gen_andncr (test_reg, cr, test_reg);
6022 frv_ifcvt_add_insn (and_op, insn, TRUE);
6025 /* If this isn't the first statement in the nested if sequence, see if we
6026 are dealing with the same register. */
6027 else if (! rtx_equal_p (test_reg, frv_ifcvt.last_nested_if_cr))
6028 goto fail;
6030 COND_EXEC_TEST (pattern) = test = op1;
6033 /* If this isn't a nested if, reset state variables. */
6034 else
6036 frv_ifcvt.last_nested_if_cr = NULL_RTX;
6039 set = single_set_pattern (pattern);
6040 if (set)
6042 rtx dest = SET_DEST (set);
6043 rtx src = SET_SRC (set);
6044 enum machine_mode mode = GET_MODE (dest);
6046 /* Check for normal binary operators. */
6047 if (mode == SImode && ARITHMETIC_P (src))
6049 op0 = XEXP (src, 0);
6050 op1 = XEXP (src, 1);
6052 if (integer_register_operand (op0, SImode) && CONSTANT_P (op1))
6054 op1 = frv_ifcvt_load_value (op1, insn);
6055 if (op1)
6056 COND_EXEC_CODE (pattern)
6057 = gen_rtx_SET (VOIDmode, dest, gen_rtx_fmt_ee (GET_CODE (src),
6058 GET_MODE (src),
6059 op0, op1));
6060 else
6061 goto fail;
6065 /* For multiply by a constant, we need to handle the sign extending
6066 correctly. Add a USE of the value after the multiply to prevent flow
6067 from cratering because only one register out of the two were used. */
6068 else if (mode == DImode && GET_CODE (src) == MULT)
6070 op0 = XEXP (src, 0);
6071 op1 = XEXP (src, 1);
6072 if (GET_CODE (op0) == SIGN_EXTEND && GET_CODE (op1) == CONST_INT)
6074 op1 = frv_ifcvt_load_value (op1, insn);
6075 if (op1)
6077 op1 = gen_rtx_SIGN_EXTEND (DImode, op1);
6078 COND_EXEC_CODE (pattern)
6079 = gen_rtx_SET (VOIDmode, dest,
6080 gen_rtx_MULT (DImode, op0, op1));
6082 else
6083 goto fail;
6086 frv_ifcvt_add_insn (gen_use (dest), insn, FALSE);
6089 /* If we are just loading a constant created for a nested conditional
6090 execution statement, just load the constant without any conditional
6091 execution, since we know that the constant will not interfere with any
6092 other registers. */
6093 else if (frv_ifcvt.scratch_insns_bitmap
6094 && bitmap_bit_p (frv_ifcvt.scratch_insns_bitmap,
6095 INSN_UID (insn))
6096 && REG_P (SET_DEST (set))
6097 /* We must not unconditionally set a scratch reg chosen
6098 for a nested if-converted block if its incoming
6099 value from the TEST block (or the result of the THEN
6100 branch) could/should propagate to the JOIN block.
6101 It suffices to test whether the register is live at
6102 the JOIN point: if it's live there, we can infer
6103 that we set it in the former JOIN block of the
6104 nested if-converted block (otherwise it wouldn't
6105 have been available as a scratch register), and it
6106 is either propagated through or set in the other
6107 conditional block. It's probably not worth trying
6108 to catch the latter case, and it could actually
6109 limit scheduling of the combined block quite
6110 severely. */
6111 && ce_info->join_bb
6112 && ! (REGNO_REG_SET_P (df_get_live_in (ce_info->join_bb),
6113 REGNO (SET_DEST (set))))
6114 /* Similarly, we must not unconditionally set a reg
6115 used as scratch in the THEN branch if the same reg
6116 is live in the ELSE branch. */
6117 && (! ce_info->else_bb
6118 || BLOCK_FOR_INSN (insn) == ce_info->else_bb
6119 || ! (REGNO_REG_SET_P (df_get_live_in (ce_info->else_bb),
6120 REGNO (SET_DEST (set))))))
6121 pattern = set;
6123 else if (mode == QImode || mode == HImode || mode == SImode
6124 || mode == SFmode)
6126 int changed_p = FALSE;
6128 /* Check for just loading up a constant */
6129 if (CONSTANT_P (src) && integer_register_operand (dest, mode))
6131 src = frv_ifcvt_load_value (src, insn);
6132 if (!src)
6133 goto fail;
6135 changed_p = TRUE;
6138 /* See if we need to fix up stores */
6139 if (GET_CODE (dest) == MEM)
6141 rtx new_mem = frv_ifcvt_rewrite_mem (dest, mode, insn);
6143 if (!new_mem)
6144 goto fail;
6146 else if (new_mem != dest)
6148 changed_p = TRUE;
6149 dest = new_mem;
6153 /* See if we need to fix up loads */
6154 if (GET_CODE (src) == MEM)
6156 rtx new_mem = frv_ifcvt_rewrite_mem (src, mode, insn);
6158 if (!new_mem)
6159 goto fail;
6161 else if (new_mem != src)
6163 changed_p = TRUE;
6164 src = new_mem;
6168 /* If either src or destination changed, redo SET. */
6169 if (changed_p)
6170 COND_EXEC_CODE (pattern) = gen_rtx_SET (VOIDmode, dest, src);
6173 /* Rewrite a nested set cccr in terms of IF_THEN_ELSE. Also deal with
6174 rewriting the CC register to be the same as the paired CC/CR register
6175 for nested ifs. */
6176 else if (mode == CC_CCRmode && COMPARISON_P (src))
6178 int regno = REGNO (XEXP (src, 0));
6179 rtx if_else;
6181 if (ce_info->pass > 1
6182 && regno != (int)REGNO (frv_ifcvt.nested_cc_reg)
6183 && TEST_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite, regno))
6185 src = gen_rtx_fmt_ee (GET_CODE (src),
6186 CC_CCRmode,
6187 frv_ifcvt.nested_cc_reg,
6188 XEXP (src, 1));
6191 if_else = gen_rtx_IF_THEN_ELSE (CC_CCRmode, test, src, const0_rtx);
6192 pattern = gen_rtx_SET (VOIDmode, dest, if_else);
6195 /* Remap a nested compare instruction to use the paired CC/CR reg. */
6196 else if (ce_info->pass > 1
6197 && GET_CODE (dest) == REG
6198 && CC_P (REGNO (dest))
6199 && REGNO (dest) != REGNO (frv_ifcvt.nested_cc_reg)
6200 && TEST_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite,
6201 REGNO (dest))
6202 && GET_CODE (src) == COMPARE)
6204 PUT_MODE (frv_ifcvt.nested_cc_reg, GET_MODE (dest));
6205 COND_EXEC_CODE (pattern)
6206 = gen_rtx_SET (VOIDmode, frv_ifcvt.nested_cc_reg, copy_rtx (src));
6210 if (TARGET_DEBUG_COND_EXEC)
6212 rtx orig_pattern = PATTERN (insn);
6214 PATTERN (insn) = pattern;
6215 fprintf (stderr,
6216 "\n:::::::::: frv_ifcvt_modify_insn: pass = %d, insn after modification:\n",
6217 ce_info->pass);
6219 debug_rtx (insn);
6220 PATTERN (insn) = orig_pattern;
6223 return pattern;
6225 fail:
6226 if (TARGET_DEBUG_COND_EXEC)
6228 rtx orig_pattern = PATTERN (insn);
6230 PATTERN (insn) = orig_ce_pattern;
6231 fprintf (stderr,
6232 "\n:::::::::: frv_ifcvt_modify_insn: pass = %d, insn could not be modified:\n",
6233 ce_info->pass);
6235 debug_rtx (insn);
6236 PATTERN (insn) = orig_pattern;
6239 return NULL_RTX;
6243 /* A C expression to perform any final machine dependent modifications in
6244 converting code to conditional execution in the code described by the
6245 conditional if information CE_INFO. */
6247 void
6248 frv_ifcvt_modify_final (ce_if_block_t *ce_info ATTRIBUTE_UNUSED)
6250 rtx existing_insn;
6251 rtx check_insn;
6252 rtx p = frv_ifcvt.added_insns_list;
6253 int i;
6255 /* Loop inserting the check insns. The last check insn is the first test,
6256 and is the appropriate place to insert constants. */
6257 gcc_assert (p);
6261 rtx check_and_insert_insns = XEXP (p, 0);
6262 rtx old_p = p;
6264 check_insn = XEXP (check_and_insert_insns, 0);
6265 existing_insn = XEXP (check_and_insert_insns, 1);
6266 p = XEXP (p, 1);
6268 /* The jump bit is used to say that the new insn is to be inserted BEFORE
6269 the existing insn, otherwise it is to be inserted AFTER. */
6270 if (check_and_insert_insns->jump)
6272 emit_insn_before (check_insn, existing_insn);
6273 check_and_insert_insns->jump = 0;
6275 else
6276 emit_insn_after (check_insn, existing_insn);
6278 free_EXPR_LIST_node (check_and_insert_insns);
6279 free_EXPR_LIST_node (old_p);
6281 while (p != NULL_RTX);
6283 /* Load up any constants needed into temp gprs */
6284 for (i = 0; i < frv_ifcvt.cur_scratch_regs; i++)
6286 rtx insn = emit_insn_before (frv_ifcvt.scratch_regs[i], existing_insn);
6287 if (! frv_ifcvt.scratch_insns_bitmap)
6288 frv_ifcvt.scratch_insns_bitmap = BITMAP_ALLOC (NULL);
6289 bitmap_set_bit (frv_ifcvt.scratch_insns_bitmap, INSN_UID (insn));
6290 frv_ifcvt.scratch_regs[i] = NULL_RTX;
6293 frv_ifcvt.added_insns_list = NULL_RTX;
6294 frv_ifcvt.cur_scratch_regs = 0;
6298 /* A C expression to cancel any machine dependent modifications in converting
6299 code to conditional execution in the code described by the conditional if
6300 information CE_INFO. */
6302 void
6303 frv_ifcvt_modify_cancel (ce_if_block_t *ce_info ATTRIBUTE_UNUSED)
6305 int i;
6306 rtx p = frv_ifcvt.added_insns_list;
6308 /* Loop freeing up the EXPR_LIST's allocated. */
6309 while (p != NULL_RTX)
6311 rtx check_and_jump = XEXP (p, 0);
6312 rtx old_p = p;
6314 p = XEXP (p, 1);
6315 free_EXPR_LIST_node (check_and_jump);
6316 free_EXPR_LIST_node (old_p);
6319 /* Release any temporary gprs allocated. */
6320 for (i = 0; i < frv_ifcvt.cur_scratch_regs; i++)
6321 frv_ifcvt.scratch_regs[i] = NULL_RTX;
6323 frv_ifcvt.added_insns_list = NULL_RTX;
6324 frv_ifcvt.cur_scratch_regs = 0;
6325 return;
6328 /* A C expression for the size in bytes of the trampoline, as an integer.
6329 The template is:
6331 setlo #0, <jmp_reg>
6332 setlo #0, <static_chain>
6333 sethi #0, <jmp_reg>
6334 sethi #0, <static_chain>
6335 jmpl @(gr0,<jmp_reg>) */
6338 frv_trampoline_size (void)
6340 if (TARGET_FDPIC)
6341 /* Allocate room for the function descriptor and the lddi
6342 instruction. */
6343 return 8 + 6 * 4;
6344 return 5 /* instructions */ * 4 /* instruction size. */;
6348 /* A C statement to initialize the variable parts of a trampoline. ADDR is an
6349 RTX for the address of the trampoline; FNADDR is an RTX for the address of
6350 the nested function; STATIC_CHAIN is an RTX for the static chain value that
6351 should be passed to the function when it is called.
6353 The template is:
6355 setlo #0, <jmp_reg>
6356 setlo #0, <static_chain>
6357 sethi #0, <jmp_reg>
6358 sethi #0, <static_chain>
6359 jmpl @(gr0,<jmp_reg>) */
6361 static void
6362 frv_trampoline_init (rtx m_tramp, tree fndecl, rtx static_chain)
6364 rtx addr = XEXP (m_tramp, 0);
6365 rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
6366 rtx sc_reg = force_reg (Pmode, static_chain);
6368 emit_library_call (gen_rtx_SYMBOL_REF (SImode, "__trampoline_setup"),
6369 FALSE, VOIDmode, 4,
6370 addr, Pmode,
6371 GEN_INT (frv_trampoline_size ()), SImode,
6372 fnaddr, Pmode,
6373 sc_reg, Pmode);
6377 /* Many machines have some registers that cannot be copied directly to or from
6378 memory or even from other types of registers. An example is the `MQ'
6379 register, which on most machines, can only be copied to or from general
6380 registers, but not memory. Some machines allow copying all registers to and
6381 from memory, but require a scratch register for stores to some memory
6382 locations (e.g., those with symbolic address on the RT, and those with
6383 certain symbolic address on the SPARC when compiling PIC). In some cases,
6384 both an intermediate and a scratch register are required.
6386 You should define these macros to indicate to the reload phase that it may
6387 need to allocate at least one register for a reload in addition to the
6388 register to contain the data. Specifically, if copying X to a register
6389 RCLASS in MODE requires an intermediate register, you should define
6390 `SECONDARY_INPUT_RELOAD_CLASS' to return the largest register class all of
6391 whose registers can be used as intermediate registers or scratch registers.
6393 If copying a register RCLASS in MODE to X requires an intermediate or scratch
6394 register, `SECONDARY_OUTPUT_RELOAD_CLASS' should be defined to return the
6395 largest register class required. If the requirements for input and output
6396 reloads are the same, the macro `SECONDARY_RELOAD_CLASS' should be used
6397 instead of defining both macros identically.
6399 The values returned by these macros are often `GENERAL_REGS'. Return
6400 `NO_REGS' if no spare register is needed; i.e., if X can be directly copied
6401 to or from a register of RCLASS in MODE without requiring a scratch register.
6402 Do not define this macro if it would always return `NO_REGS'.
6404 If a scratch register is required (either with or without an intermediate
6405 register), you should define patterns for `reload_inM' or `reload_outM', as
6406 required.. These patterns, which will normally be implemented with a
6407 `define_expand', should be similar to the `movM' patterns, except that
6408 operand 2 is the scratch register.
6410 Define constraints for the reload register and scratch register that contain
6411 a single register class. If the original reload register (whose class is
6412 RCLASS) can meet the constraint given in the pattern, the value returned by
6413 these macros is used for the class of the scratch register. Otherwise, two
6414 additional reload registers are required. Their classes are obtained from
6415 the constraints in the insn pattern.
6417 X might be a pseudo-register or a `subreg' of a pseudo-register, which could
6418 either be in a hard register or in memory. Use `true_regnum' to find out;
6419 it will return -1 if the pseudo is in memory and the hard register number if
6420 it is in a register.
6422 These macros should not be used in the case where a particular class of
6423 registers can only be copied to memory and not to another class of
6424 registers. In that case, secondary reload registers are not needed and
6425 would not be helpful. Instead, a stack location must be used to perform the
6426 copy and the `movM' pattern should use memory as an intermediate storage.
6427 This case often occurs between floating-point and general registers. */
6429 enum reg_class
6430 frv_secondary_reload_class (enum reg_class rclass,
6431 enum machine_mode mode ATTRIBUTE_UNUSED,
6432 rtx x)
6434 enum reg_class ret;
6436 switch (rclass)
6438 default:
6439 ret = NO_REGS;
6440 break;
6442 /* Accumulators/Accumulator guard registers need to go through floating
6443 point registers. */
6444 case QUAD_REGS:
6445 case EVEN_REGS:
6446 case GPR_REGS:
6447 ret = NO_REGS;
6448 if (x && GET_CODE (x) == REG)
6450 int regno = REGNO (x);
6452 if (ACC_P (regno) || ACCG_P (regno))
6453 ret = FPR_REGS;
6455 break;
6457 /* Nonzero constants should be loaded into an FPR through a GPR. */
6458 case QUAD_FPR_REGS:
6459 case FEVEN_REGS:
6460 case FPR_REGS:
6461 if (x && CONSTANT_P (x) && !ZERO_P (x))
6462 ret = GPR_REGS;
6463 else
6464 ret = NO_REGS;
6465 break;
6467 /* All of these types need gpr registers. */
6468 case ICC_REGS:
6469 case FCC_REGS:
6470 case CC_REGS:
6471 case ICR_REGS:
6472 case FCR_REGS:
6473 case CR_REGS:
6474 case LCR_REG:
6475 case LR_REG:
6476 ret = GPR_REGS;
6477 break;
6479 /* The accumulators need fpr registers. */
6480 case ACC_REGS:
6481 case EVEN_ACC_REGS:
6482 case QUAD_ACC_REGS:
6483 case ACCG_REGS:
6484 ret = FPR_REGS;
6485 break;
6488 return ret;
6491 /* This hook exists to catch the case where secondary_reload_class() is
6492 called from init_reg_autoinc() in regclass.c - before the reload optabs
6493 have been initialised. */
6495 static reg_class_t
6496 frv_secondary_reload (bool in_p, rtx x, reg_class_t reload_class_i,
6497 enum machine_mode reload_mode,
6498 secondary_reload_info * sri)
6500 enum reg_class rclass = NO_REGS;
6501 enum reg_class reload_class = (enum reg_class) reload_class_i;
6503 if (sri->prev_sri && sri->prev_sri->t_icode != CODE_FOR_nothing)
6505 sri->icode = sri->prev_sri->t_icode;
6506 return NO_REGS;
6509 rclass = frv_secondary_reload_class (reload_class, reload_mode, x);
6511 if (rclass != NO_REGS)
6513 enum insn_code icode = (in_p ? reload_in_optab[(int) reload_mode]
6514 : reload_out_optab[(int) reload_mode]);
6515 if (icode == 0)
6517 /* This happens when then the reload_[in|out]_optabs have
6518 not been initialised. */
6519 sri->t_icode = CODE_FOR_nothing;
6520 return rclass;
6524 /* Fall back to the default secondary reload handler. */
6525 return default_secondary_reload (in_p, x, reload_class, reload_mode, sri);
6529 /* A C expression whose value is nonzero if pseudos that have been assigned to
6530 registers of class RCLASS would likely be spilled because registers of RCLASS
6531 are needed for spill registers.
6533 The default value of this macro returns 1 if RCLASS has exactly one register
6534 and zero otherwise. On most machines, this default should be used. Only
6535 define this macro to some other expression if pseudo allocated by
6536 `local-alloc.c' end up in memory because their hard registers were needed
6537 for spill registers. If this macro returns nonzero for those classes, those
6538 pseudos will only be allocated by `global.c', which knows how to reallocate
6539 the pseudo to another register. If there would not be another register
6540 available for reallocation, you should not change the definition of this
6541 macro since the only effect of such a definition would be to slow down
6542 register allocation. */
6545 frv_class_likely_spilled_p (enum reg_class rclass)
6547 switch (rclass)
6549 default:
6550 break;
6552 case GR8_REGS:
6553 case GR9_REGS:
6554 case GR89_REGS:
6555 case FDPIC_FPTR_REGS:
6556 case FDPIC_REGS:
6557 case ICC_REGS:
6558 case FCC_REGS:
6559 case CC_REGS:
6560 case ICR_REGS:
6561 case FCR_REGS:
6562 case CR_REGS:
6563 case LCR_REG:
6564 case LR_REG:
6565 case SPR_REGS:
6566 case QUAD_ACC_REGS:
6567 case EVEN_ACC_REGS:
6568 case ACC_REGS:
6569 case ACCG_REGS:
6570 return TRUE;
6573 return FALSE;
6577 /* An expression for the alignment of a structure field FIELD if the
6578 alignment computed in the usual way is COMPUTED. GCC uses this
6579 value instead of the value in `BIGGEST_ALIGNMENT' or
6580 `BIGGEST_FIELD_ALIGNMENT', if defined, for structure fields only. */
6582 /* The definition type of the bit field data is either char, short, long or
6583 long long. The maximum bit size is the number of bits of its own type.
6585 The bit field data is assigned to a storage unit that has an adequate size
6586 for bit field data retention and is located at the smallest address.
6588 Consecutive bit field data are packed at consecutive bits having the same
6589 storage unit, with regard to the type, beginning with the MSB and continuing
6590 toward the LSB.
6592 If a field to be assigned lies over a bit field type boundary, its
6593 assignment is completed by aligning it with a boundary suitable for the
6594 type.
6596 When a bit field having a bit length of 0 is declared, it is forcibly
6597 assigned to the next storage unit.
6599 e.g)
6600 struct {
6601 int a:2;
6602 int b:6;
6603 char c:4;
6604 int d:10;
6605 int :0;
6606 int f:2;
6607 } x;
6609 +0 +1 +2 +3
6610 &x 00000000 00000000 00000000 00000000
6611 MLM----L
6613 &x+4 00000000 00000000 00000000 00000000
6614 M--L
6616 &x+8 00000000 00000000 00000000 00000000
6617 M----------L
6619 &x+12 00000000 00000000 00000000 00000000
6625 frv_adjust_field_align (tree field, int computed)
6627 /* Make sure that the bitfield is not wider than the type. */
6628 if (DECL_BIT_FIELD (field)
6629 && !DECL_ARTIFICIAL (field))
6631 tree parent = DECL_CONTEXT (field);
6632 tree prev = NULL_TREE;
6633 tree cur;
6635 for (cur = TYPE_FIELDS (parent); cur && cur != field; cur = TREE_CHAIN (cur))
6637 if (TREE_CODE (cur) != FIELD_DECL)
6638 continue;
6640 prev = cur;
6643 gcc_assert (cur);
6645 /* If this isn't a :0 field and if the previous element is a bitfield
6646 also, see if the type is different, if so, we will need to align the
6647 bit-field to the next boundary. */
6648 if (prev
6649 && ! DECL_PACKED (field)
6650 && ! integer_zerop (DECL_SIZE (field))
6651 && DECL_BIT_FIELD_TYPE (field) != DECL_BIT_FIELD_TYPE (prev))
6653 int prev_align = TYPE_ALIGN (TREE_TYPE (prev));
6654 int cur_align = TYPE_ALIGN (TREE_TYPE (field));
6655 computed = (prev_align > cur_align) ? prev_align : cur_align;
6659 return computed;
6663 /* A C expression that is nonzero if it is permissible to store a value of mode
6664 MODE in hard register number REGNO (or in several registers starting with
6665 that one). For a machine where all registers are equivalent, a suitable
6666 definition is
6668 #define HARD_REGNO_MODE_OK(REGNO, MODE) 1
6670 It is not necessary for this macro to check for the numbers of fixed
6671 registers, because the allocation mechanism considers them to be always
6672 occupied.
6674 On some machines, double-precision values must be kept in even/odd register
6675 pairs. The way to implement that is to define this macro to reject odd
6676 register numbers for such modes.
6678 The minimum requirement for a mode to be OK in a register is that the
6679 `movMODE' instruction pattern support moves between the register and any
6680 other hard register for which the mode is OK; and that moving a value into
6681 the register and back out not alter it.
6683 Since the same instruction used to move `SImode' will work for all narrower
6684 integer modes, it is not necessary on any machine for `HARD_REGNO_MODE_OK'
6685 to distinguish between these modes, provided you define patterns `movhi',
6686 etc., to take advantage of this. This is useful because of the interaction
6687 between `HARD_REGNO_MODE_OK' and `MODES_TIEABLE_P'; it is very desirable for
6688 all integer modes to be tieable.
6690 Many machines have special registers for floating point arithmetic. Often
6691 people assume that floating point machine modes are allowed only in floating
6692 point registers. This is not true. Any registers that can hold integers
6693 can safely *hold* a floating point machine mode, whether or not floating
6694 arithmetic can be done on it in those registers. Integer move instructions
6695 can be used to move the values.
6697 On some machines, though, the converse is true: fixed-point machine modes
6698 may not go in floating registers. This is true if the floating registers
6699 normalize any value stored in them, because storing a non-floating value
6700 there would garble it. In this case, `HARD_REGNO_MODE_OK' should reject
6701 fixed-point machine modes in floating registers. But if the floating
6702 registers do not automatically normalize, if you can store any bit pattern
6703 in one and retrieve it unchanged without a trap, then any machine mode may
6704 go in a floating register, so you can define this macro to say so.
6706 The primary significance of special floating registers is rather that they
6707 are the registers acceptable in floating point arithmetic instructions.
6708 However, this is of no concern to `HARD_REGNO_MODE_OK'. You handle it by
6709 writing the proper constraints for those instructions.
6711 On some machines, the floating registers are especially slow to access, so
6712 that it is better to store a value in a stack frame than in such a register
6713 if floating point arithmetic is not being done. As long as the floating
6714 registers are not in class `GENERAL_REGS', they will not be used unless some
6715 pattern's constraint asks for one. */
6718 frv_hard_regno_mode_ok (int regno, enum machine_mode mode)
6720 int base;
6721 int mask;
6723 switch (mode)
6725 case CCmode:
6726 case CC_UNSmode:
6727 case CC_NZmode:
6728 return ICC_P (regno) || GPR_P (regno);
6730 case CC_CCRmode:
6731 return CR_P (regno) || GPR_P (regno);
6733 case CC_FPmode:
6734 return FCC_P (regno) || GPR_P (regno);
6736 default:
6737 break;
6740 /* Set BASE to the first register in REGNO's class. Set MASK to the
6741 bits that must be clear in (REGNO - BASE) for the register to be
6742 well-aligned. */
6743 if (INTEGRAL_MODE_P (mode) || FLOAT_MODE_P (mode) || VECTOR_MODE_P (mode))
6745 if (ACCG_P (regno))
6747 /* ACCGs store one byte. Two-byte quantities must start in
6748 even-numbered registers, four-byte ones in registers whose
6749 numbers are divisible by four, and so on. */
6750 base = ACCG_FIRST;
6751 mask = GET_MODE_SIZE (mode) - 1;
6753 else
6755 /* The other registers store one word. */
6756 if (GPR_P (regno) || regno == AP_FIRST)
6757 base = GPR_FIRST;
6759 else if (FPR_P (regno))
6760 base = FPR_FIRST;
6762 else if (ACC_P (regno))
6763 base = ACC_FIRST;
6765 else if (SPR_P (regno))
6766 return mode == SImode;
6768 /* Fill in the table. */
6769 else
6770 return 0;
6772 /* Anything smaller than an SI is OK in any word-sized register. */
6773 if (GET_MODE_SIZE (mode) < 4)
6774 return 1;
6776 mask = (GET_MODE_SIZE (mode) / 4) - 1;
6778 return (((regno - base) & mask) == 0);
6781 return 0;
6785 /* A C expression for the number of consecutive hard registers, starting at
6786 register number REGNO, required to hold a value of mode MODE.
6788 On a machine where all registers are exactly one word, a suitable definition
6789 of this macro is
6791 #define HARD_REGNO_NREGS(REGNO, MODE) \
6792 ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \
6793 / UNITS_PER_WORD)) */
6795 /* On the FRV, make the CC_FP mode take 3 words in the integer registers, so
6796 that we can build the appropriate instructions to properly reload the
6797 values. Also, make the byte-sized accumulator guards use one guard
6798 for each byte. */
6801 frv_hard_regno_nregs (int regno, enum machine_mode mode)
6803 if (ACCG_P (regno))
6804 return GET_MODE_SIZE (mode);
6805 else
6806 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6810 /* A C expression for the maximum number of consecutive registers of
6811 class RCLASS needed to hold a value of mode MODE.
6813 This is closely related to the macro `HARD_REGNO_NREGS'. In fact, the value
6814 of the macro `CLASS_MAX_NREGS (RCLASS, MODE)' should be the maximum value of
6815 `HARD_REGNO_NREGS (REGNO, MODE)' for all REGNO values in the class RCLASS.
6817 This macro helps control the handling of multiple-word values in
6818 the reload pass.
6820 This declaration is required. */
6823 frv_class_max_nregs (enum reg_class rclass, enum machine_mode mode)
6825 if (rclass == ACCG_REGS)
6826 /* An N-byte value requires N accumulator guards. */
6827 return GET_MODE_SIZE (mode);
6828 else
6829 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6833 /* A C expression that is nonzero if X is a legitimate constant for an
6834 immediate operand on the target machine. You can assume that X satisfies
6835 `CONSTANT_P', so you need not check this. In fact, `1' is a suitable
6836 definition for this macro on machines where anything `CONSTANT_P' is valid. */
6839 frv_legitimate_constant_p (rtx x)
6841 enum machine_mode mode = GET_MODE (x);
6843 /* frv_cannot_force_const_mem always returns true for FDPIC. This
6844 means that the move expanders will be expected to deal with most
6845 kinds of constant, regardless of what we return here.
6847 However, among its other duties, LEGITIMATE_CONSTANT_P decides whether
6848 a constant can be entered into reg_equiv_constant[]. If we return true,
6849 reload can create new instances of the constant whenever it likes.
6851 The idea is therefore to accept as many constants as possible (to give
6852 reload more freedom) while rejecting constants that can only be created
6853 at certain times. In particular, anything with a symbolic component will
6854 require use of the pseudo FDPIC register, which is only available before
6855 reload. */
6856 if (TARGET_FDPIC)
6857 return LEGITIMATE_PIC_OPERAND_P (x);
6859 /* All of the integer constants are ok. */
6860 if (GET_CODE (x) != CONST_DOUBLE)
6861 return TRUE;
6863 /* double integer constants are ok. */
6864 if (mode == VOIDmode || mode == DImode)
6865 return TRUE;
6867 /* 0 is always ok. */
6868 if (x == CONST0_RTX (mode))
6869 return TRUE;
6871 /* If floating point is just emulated, allow any constant, since it will be
6872 constructed in the GPRs. */
6873 if (!TARGET_HAS_FPRS)
6874 return TRUE;
6876 if (mode == DFmode && !TARGET_DOUBLE)
6877 return TRUE;
6879 /* Otherwise store the constant away and do a load. */
6880 return FALSE;
6883 /* Implement SELECT_CC_MODE. Choose CC_FP for floating-point comparisons,
6884 CC_NZ for comparisons against zero in which a single Z or N flag test
6885 is enough, CC_UNS for other unsigned comparisons, and CC for other
6886 signed comparisons. */
6888 enum machine_mode
6889 frv_select_cc_mode (enum rtx_code code, rtx x, rtx y)
6891 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
6892 return CC_FPmode;
6894 switch (code)
6896 case EQ:
6897 case NE:
6898 case LT:
6899 case GE:
6900 return y == const0_rtx ? CC_NZmode : CCmode;
6902 case GTU:
6903 case GEU:
6904 case LTU:
6905 case LEU:
6906 return y == const0_rtx ? CC_NZmode : CC_UNSmode;
6908 default:
6909 return CCmode;
6913 /* A C expression for the cost of moving data from a register in class FROM to
6914 one in class TO. The classes are expressed using the enumeration values
6915 such as `GENERAL_REGS'. A value of 4 is the default; other values are
6916 interpreted relative to that.
6918 It is not required that the cost always equal 2 when FROM is the same as TO;
6919 on some machines it is expensive to move between registers if they are not
6920 general registers.
6922 If reload sees an insn consisting of a single `set' between two hard
6923 registers, and if `REGISTER_MOVE_COST' applied to their classes returns a
6924 value of 2, reload does not check to ensure that the constraints of the insn
6925 are met. Setting a cost of other than 2 will allow reload to verify that
6926 the constraints are met. You should do this if the `movM' pattern's
6927 constraints do not allow such copying. */
6929 #define HIGH_COST 40
6930 #define MEDIUM_COST 3
6931 #define LOW_COST 1
6934 frv_register_move_cost (enum reg_class from, enum reg_class to)
6936 switch (from)
6938 default:
6939 break;
6941 case QUAD_REGS:
6942 case EVEN_REGS:
6943 case GPR_REGS:
6944 switch (to)
6946 default:
6947 break;
6949 case QUAD_REGS:
6950 case EVEN_REGS:
6951 case GPR_REGS:
6952 return LOW_COST;
6954 case FEVEN_REGS:
6955 case FPR_REGS:
6956 return LOW_COST;
6958 case LCR_REG:
6959 case LR_REG:
6960 case SPR_REGS:
6961 return LOW_COST;
6964 case FEVEN_REGS:
6965 case FPR_REGS:
6966 switch (to)
6968 default:
6969 break;
6971 case QUAD_REGS:
6972 case EVEN_REGS:
6973 case GPR_REGS:
6974 case ACC_REGS:
6975 case EVEN_ACC_REGS:
6976 case QUAD_ACC_REGS:
6977 case ACCG_REGS:
6978 return MEDIUM_COST;
6980 case FEVEN_REGS:
6981 case FPR_REGS:
6982 return LOW_COST;
6985 case LCR_REG:
6986 case LR_REG:
6987 case SPR_REGS:
6988 switch (to)
6990 default:
6991 break;
6993 case QUAD_REGS:
6994 case EVEN_REGS:
6995 case GPR_REGS:
6996 return MEDIUM_COST;
6999 case ACC_REGS:
7000 case EVEN_ACC_REGS:
7001 case QUAD_ACC_REGS:
7002 case ACCG_REGS:
7003 switch (to)
7005 default:
7006 break;
7008 case FEVEN_REGS:
7009 case FPR_REGS:
7010 return MEDIUM_COST;
7015 return HIGH_COST;
7018 /* Implementation of TARGET_ASM_INTEGER. In the FRV case we need to
7019 use ".picptr" to generate safe relocations for PIC code. We also
7020 need a fixup entry for aligned (non-debugging) code. */
7022 static bool
7023 frv_assemble_integer (rtx value, unsigned int size, int aligned_p)
7025 if ((flag_pic || TARGET_FDPIC) && size == UNITS_PER_WORD)
7027 if (GET_CODE (value) == CONST
7028 || GET_CODE (value) == SYMBOL_REF
7029 || GET_CODE (value) == LABEL_REF)
7031 if (TARGET_FDPIC && GET_CODE (value) == SYMBOL_REF
7032 && SYMBOL_REF_FUNCTION_P (value))
7034 fputs ("\t.picptr\tfuncdesc(", asm_out_file);
7035 output_addr_const (asm_out_file, value);
7036 fputs (")\n", asm_out_file);
7037 return true;
7039 else if (TARGET_FDPIC && GET_CODE (value) == CONST
7040 && frv_function_symbol_referenced_p (value))
7041 return false;
7042 if (aligned_p && !TARGET_FDPIC)
7044 static int label_num = 0;
7045 char buf[256];
7046 const char *p;
7048 ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", label_num++);
7049 p = (* targetm.strip_name_encoding) (buf);
7051 fprintf (asm_out_file, "%s:\n", p);
7052 fprintf (asm_out_file, "%s\n", FIXUP_SECTION_ASM_OP);
7053 fprintf (asm_out_file, "\t.picptr\t%s\n", p);
7054 fprintf (asm_out_file, "\t.previous\n");
7056 assemble_integer_with_op ("\t.picptr\t", value);
7057 return true;
7059 if (!aligned_p)
7061 /* We've set the unaligned SI op to NULL, so we always have to
7062 handle the unaligned case here. */
7063 assemble_integer_with_op ("\t.4byte\t", value);
7064 return true;
7067 return default_assemble_integer (value, size, aligned_p);
7070 /* Function to set up the backend function structure. */
7072 static struct machine_function *
7073 frv_init_machine_status (void)
7075 return ggc_alloc_cleared_machine_function ();
7078 /* Implement TARGET_SCHED_ISSUE_RATE. */
7081 frv_issue_rate (void)
7083 if (!TARGET_PACK)
7084 return 1;
7086 switch (frv_cpu_type)
7088 default:
7089 case FRV_CPU_FR300:
7090 case FRV_CPU_SIMPLE:
7091 return 1;
7093 case FRV_CPU_FR400:
7094 case FRV_CPU_FR405:
7095 case FRV_CPU_FR450:
7096 return 2;
7098 case FRV_CPU_GENERIC:
7099 case FRV_CPU_FR500:
7100 case FRV_CPU_TOMCAT:
7101 return 4;
7103 case FRV_CPU_FR550:
7104 return 8;
7108 /* A for_each_rtx callback. If X refers to an accumulator, return
7109 ACC_GROUP_ODD if the bit 2 of the register number is set and
7110 ACC_GROUP_EVEN if it is clear. Return 0 (ACC_GROUP_NONE)
7111 otherwise. */
7113 static int
7114 frv_acc_group_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
7116 if (REG_P (*x))
7118 if (ACC_P (REGNO (*x)))
7119 return (REGNO (*x) - ACC_FIRST) & 4 ? ACC_GROUP_ODD : ACC_GROUP_EVEN;
7120 if (ACCG_P (REGNO (*x)))
7121 return (REGNO (*x) - ACCG_FIRST) & 4 ? ACC_GROUP_ODD : ACC_GROUP_EVEN;
7123 return 0;
7126 /* Return the value of INSN's acc_group attribute. */
7129 frv_acc_group (rtx insn)
7131 /* This distinction only applies to the FR550 packing constraints. */
7132 if (frv_cpu_type != FRV_CPU_FR550)
7133 return ACC_GROUP_NONE;
7134 return for_each_rtx (&PATTERN (insn), frv_acc_group_1, 0);
7137 /* Return the index of the DFA unit in FRV_UNIT_NAMES[] that instruction
7138 INSN will try to claim first. Since this value depends only on the
7139 type attribute, we can cache the results in FRV_TYPE_TO_UNIT[]. */
7141 static unsigned int
7142 frv_insn_unit (rtx insn)
7144 enum attr_type type;
7146 type = get_attr_type (insn);
7147 if (frv_type_to_unit[type] == ARRAY_SIZE (frv_unit_codes))
7149 /* We haven't seen this type of instruction before. */
7150 state_t state;
7151 unsigned int unit;
7153 /* Issue the instruction on its own to see which unit it prefers. */
7154 state = alloca (state_size ());
7155 state_reset (state);
7156 state_transition (state, insn);
7158 /* Find out which unit was taken. */
7159 for (unit = 0; unit < ARRAY_SIZE (frv_unit_codes); unit++)
7160 if (cpu_unit_reservation_p (state, frv_unit_codes[unit]))
7161 break;
7163 gcc_assert (unit != ARRAY_SIZE (frv_unit_codes));
7165 frv_type_to_unit[type] = unit;
7167 return frv_type_to_unit[type];
7170 /* Return true if INSN issues to a branch unit. */
7172 static bool
7173 frv_issues_to_branch_unit_p (rtx insn)
7175 return frv_unit_groups[frv_insn_unit (insn)] == GROUP_B;
7178 /* The current state of the packing pass, implemented by frv_pack_insns. */
7179 static struct {
7180 /* The state of the pipeline DFA. */
7181 state_t dfa_state;
7183 /* Which hardware registers are set within the current packet,
7184 and the conditions under which they are set. */
7185 regstate_t regstate[FIRST_PSEUDO_REGISTER];
7187 /* The memory locations that have been modified so far in this
7188 packet. MEM is the memref and COND is the regstate_t condition
7189 under which it is set. */
7190 struct {
7191 rtx mem;
7192 regstate_t cond;
7193 } mems[2];
7195 /* The number of valid entries in MEMS. The value is larger than
7196 ARRAY_SIZE (mems) if there were too many mems to record. */
7197 unsigned int num_mems;
7199 /* The maximum number of instructions that can be packed together. */
7200 unsigned int issue_rate;
7202 /* The instructions in the packet, partitioned into groups. */
7203 struct frv_packet_group {
7204 /* How many instructions in the packet belong to this group. */
7205 unsigned int num_insns;
7207 /* A list of the instructions that belong to this group, in the order
7208 they appear in the rtl stream. */
7209 rtx insns[ARRAY_SIZE (frv_unit_codes)];
7211 /* The contents of INSNS after they have been sorted into the correct
7212 assembly-language order. Element X issues to unit X. The list may
7213 contain extra nops. */
7214 rtx sorted[ARRAY_SIZE (frv_unit_codes)];
7216 /* The member of frv_nops[] to use in sorted[]. */
7217 rtx nop;
7218 } groups[NUM_GROUPS];
7220 /* The instructions that make up the current packet. */
7221 rtx insns[ARRAY_SIZE (frv_unit_codes)];
7222 unsigned int num_insns;
7223 } frv_packet;
7225 /* Return the regstate_t flags for the given COND_EXEC condition.
7226 Abort if the condition isn't in the right form. */
7228 static int
7229 frv_cond_flags (rtx cond)
7231 gcc_assert ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
7232 && GET_CODE (XEXP (cond, 0)) == REG
7233 && CR_P (REGNO (XEXP (cond, 0)))
7234 && XEXP (cond, 1) == const0_rtx);
7235 return ((REGNO (XEXP (cond, 0)) - CR_FIRST)
7236 | (GET_CODE (cond) == NE
7237 ? REGSTATE_IF_TRUE
7238 : REGSTATE_IF_FALSE));
7242 /* Return true if something accessed under condition COND2 can
7243 conflict with something written under condition COND1. */
7245 static bool
7246 frv_regstate_conflict_p (regstate_t cond1, regstate_t cond2)
7248 /* If either reference was unconditional, we have a conflict. */
7249 if ((cond1 & REGSTATE_IF_EITHER) == 0
7250 || (cond2 & REGSTATE_IF_EITHER) == 0)
7251 return true;
7253 /* The references might conflict if they were controlled by
7254 different CRs. */
7255 if ((cond1 & REGSTATE_CC_MASK) != (cond2 & REGSTATE_CC_MASK))
7256 return true;
7258 /* They definitely conflict if they are controlled by the
7259 same condition. */
7260 if ((cond1 & cond2 & REGSTATE_IF_EITHER) != 0)
7261 return true;
7263 return false;
7267 /* A for_each_rtx callback. Return 1 if *X depends on an instruction in
7268 the current packet. DATA points to a regstate_t that describes the
7269 condition under which *X might be set or used. */
7271 static int
7272 frv_registers_conflict_p_1 (rtx *x, void *data)
7274 unsigned int regno, i;
7275 regstate_t cond;
7277 cond = *(regstate_t *) data;
7279 if (GET_CODE (*x) == REG)
7280 FOR_EACH_REGNO (regno, *x)
7281 if ((frv_packet.regstate[regno] & REGSTATE_MODIFIED) != 0)
7282 if (frv_regstate_conflict_p (frv_packet.regstate[regno], cond))
7283 return 1;
7285 if (GET_CODE (*x) == MEM)
7287 /* If we ran out of memory slots, assume a conflict. */
7288 if (frv_packet.num_mems > ARRAY_SIZE (frv_packet.mems))
7289 return 1;
7291 /* Check for output or true dependencies with earlier MEMs. */
7292 for (i = 0; i < frv_packet.num_mems; i++)
7293 if (frv_regstate_conflict_p (frv_packet.mems[i].cond, cond))
7295 if (true_dependence (frv_packet.mems[i].mem, VOIDmode,
7296 *x, rtx_varies_p))
7297 return 1;
7299 if (output_dependence (frv_packet.mems[i].mem, *x))
7300 return 1;
7304 /* The return values of calls aren't significant: they describe
7305 the effect of the call as a whole, not of the insn itself. */
7306 if (GET_CODE (*x) == SET && GET_CODE (SET_SRC (*x)) == CALL)
7308 if (for_each_rtx (&SET_SRC (*x), frv_registers_conflict_p_1, data))
7309 return 1;
7310 return -1;
7313 /* Check subexpressions. */
7314 return 0;
7318 /* Return true if something in X might depend on an instruction
7319 in the current packet. */
7321 static bool
7322 frv_registers_conflict_p (rtx x)
7324 regstate_t flags;
7326 flags = 0;
7327 if (GET_CODE (x) == COND_EXEC)
7329 if (for_each_rtx (&XEXP (x, 0), frv_registers_conflict_p_1, &flags))
7330 return true;
7332 flags |= frv_cond_flags (XEXP (x, 0));
7333 x = XEXP (x, 1);
7335 return for_each_rtx (&x, frv_registers_conflict_p_1, &flags);
7339 /* A note_stores callback. DATA points to the regstate_t condition
7340 under which X is modified. Update FRV_PACKET accordingly. */
7342 static void
7343 frv_registers_update_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
7345 unsigned int regno;
7347 if (GET_CODE (x) == REG)
7348 FOR_EACH_REGNO (regno, x)
7349 frv_packet.regstate[regno] |= *(regstate_t *) data;
7351 if (GET_CODE (x) == MEM)
7353 if (frv_packet.num_mems < ARRAY_SIZE (frv_packet.mems))
7355 frv_packet.mems[frv_packet.num_mems].mem = x;
7356 frv_packet.mems[frv_packet.num_mems].cond = *(regstate_t *) data;
7358 frv_packet.num_mems++;
7363 /* Update the register state information for an instruction whose
7364 body is X. */
7366 static void
7367 frv_registers_update (rtx x)
7369 regstate_t flags;
7371 flags = REGSTATE_MODIFIED;
7372 if (GET_CODE (x) == COND_EXEC)
7374 flags |= frv_cond_flags (XEXP (x, 0));
7375 x = XEXP (x, 1);
7377 note_stores (x, frv_registers_update_1, &flags);
7381 /* Initialize frv_packet for the start of a new packet. */
7383 static void
7384 frv_start_packet (void)
7386 enum frv_insn_group group;
7388 memset (frv_packet.regstate, 0, sizeof (frv_packet.regstate));
7389 frv_packet.num_mems = 0;
7390 frv_packet.num_insns = 0;
7391 for (group = 0; group < NUM_GROUPS; group++)
7392 frv_packet.groups[group].num_insns = 0;
7396 /* Likewise for the start of a new basic block. */
7398 static void
7399 frv_start_packet_block (void)
7401 state_reset (frv_packet.dfa_state);
7402 frv_start_packet ();
7406 /* Finish the current packet, if any, and start a new one. Call
7407 HANDLE_PACKET with FRV_PACKET describing the completed packet. */
7409 static void
7410 frv_finish_packet (void (*handle_packet) (void))
7412 if (frv_packet.num_insns > 0)
7414 handle_packet ();
7415 state_transition (frv_packet.dfa_state, 0);
7416 frv_start_packet ();
7421 /* Return true if INSN can be added to the current packet. Update
7422 the DFA state on success. */
7424 static bool
7425 frv_pack_insn_p (rtx insn)
7427 /* See if the packet is already as long as it can be. */
7428 if (frv_packet.num_insns == frv_packet.issue_rate)
7429 return false;
7431 /* If the scheduler thought that an instruction should start a packet,
7432 it's usually a good idea to believe it. It knows much more about
7433 the latencies than we do.
7435 There are some exceptions though:
7437 - Conditional instructions are scheduled on the assumption that
7438 they will be executed. This is usually a good thing, since it
7439 tends to avoid unnecessary stalls in the conditional code.
7440 But we want to pack conditional instructions as tightly as
7441 possible, in order to optimize the case where they aren't
7442 executed.
7444 - The scheduler will always put branches on their own, even
7445 if there's no real dependency.
7447 - There's no point putting a call in its own packet unless
7448 we have to. */
7449 if (frv_packet.num_insns > 0
7450 && GET_CODE (insn) == INSN
7451 && GET_MODE (insn) == TImode
7452 && GET_CODE (PATTERN (insn)) != COND_EXEC)
7453 return false;
7455 /* Check for register conflicts. Don't do this for setlo since any
7456 conflict will be with the partnering sethi, with which it can
7457 be packed. */
7458 if (get_attr_type (insn) != TYPE_SETLO)
7459 if (frv_registers_conflict_p (PATTERN (insn)))
7460 return false;
7462 return state_transition (frv_packet.dfa_state, insn) < 0;
7466 /* Add instruction INSN to the current packet. */
7468 static void
7469 frv_add_insn_to_packet (rtx insn)
7471 struct frv_packet_group *packet_group;
7473 packet_group = &frv_packet.groups[frv_unit_groups[frv_insn_unit (insn)]];
7474 packet_group->insns[packet_group->num_insns++] = insn;
7475 frv_packet.insns[frv_packet.num_insns++] = insn;
7477 frv_registers_update (PATTERN (insn));
7481 /* Insert INSN (a member of frv_nops[]) into the current packet. If the
7482 packet ends in a branch or call, insert the nop before it, otherwise
7483 add to the end. */
7485 static void
7486 frv_insert_nop_in_packet (rtx insn)
7488 struct frv_packet_group *packet_group;
7489 rtx last;
7491 packet_group = &frv_packet.groups[frv_unit_groups[frv_insn_unit (insn)]];
7492 last = frv_packet.insns[frv_packet.num_insns - 1];
7493 if (GET_CODE (last) != INSN)
7495 insn = emit_insn_before (PATTERN (insn), last);
7496 frv_packet.insns[frv_packet.num_insns - 1] = insn;
7497 frv_packet.insns[frv_packet.num_insns++] = last;
7499 else
7501 insn = emit_insn_after (PATTERN (insn), last);
7502 frv_packet.insns[frv_packet.num_insns++] = insn;
7504 packet_group->insns[packet_group->num_insns++] = insn;
7508 /* If packing is enabled, divide the instructions into packets and
7509 return true. Call HANDLE_PACKET for each complete packet. */
7511 static bool
7512 frv_for_each_packet (void (*handle_packet) (void))
7514 rtx insn, next_insn;
7516 frv_packet.issue_rate = frv_issue_rate ();
7518 /* Early exit if we don't want to pack insns. */
7519 if (!optimize
7520 || !flag_schedule_insns_after_reload
7521 || !TARGET_VLIW_BRANCH
7522 || frv_packet.issue_rate == 1)
7523 return false;
7525 /* Set up the initial packing state. */
7526 dfa_start ();
7527 frv_packet.dfa_state = alloca (state_size ());
7529 frv_start_packet_block ();
7530 for (insn = get_insns (); insn != 0; insn = next_insn)
7532 enum rtx_code code;
7533 bool eh_insn_p;
7535 code = GET_CODE (insn);
7536 next_insn = NEXT_INSN (insn);
7538 if (code == CODE_LABEL)
7540 frv_finish_packet (handle_packet);
7541 frv_start_packet_block ();
7544 if (INSN_P (insn))
7545 switch (GET_CODE (PATTERN (insn)))
7547 case USE:
7548 case CLOBBER:
7549 case ADDR_VEC:
7550 case ADDR_DIFF_VEC:
7551 break;
7553 default:
7554 /* Calls mustn't be packed on a TOMCAT. */
7555 if (GET_CODE (insn) == CALL_INSN && frv_cpu_type == FRV_CPU_TOMCAT)
7556 frv_finish_packet (handle_packet);
7558 /* Since the last instruction in a packet determines the EH
7559 region, any exception-throwing instruction must come at
7560 the end of reordered packet. Insns that issue to a
7561 branch unit are bound to come last; for others it's
7562 too hard to predict. */
7563 eh_insn_p = (find_reg_note (insn, REG_EH_REGION, NULL) != NULL);
7564 if (eh_insn_p && !frv_issues_to_branch_unit_p (insn))
7565 frv_finish_packet (handle_packet);
7567 /* Finish the current packet if we can't add INSN to it.
7568 Simulate cycles until INSN is ready to issue. */
7569 if (!frv_pack_insn_p (insn))
7571 frv_finish_packet (handle_packet);
7572 while (!frv_pack_insn_p (insn))
7573 state_transition (frv_packet.dfa_state, 0);
7576 /* Add the instruction to the packet. */
7577 frv_add_insn_to_packet (insn);
7579 /* Calls and jumps end a packet, as do insns that throw
7580 an exception. */
7581 if (code == CALL_INSN || code == JUMP_INSN || eh_insn_p)
7582 frv_finish_packet (handle_packet);
7583 break;
7586 frv_finish_packet (handle_packet);
7587 dfa_finish ();
7588 return true;
7591 /* Subroutine of frv_sort_insn_group. We are trying to sort
7592 frv_packet.groups[GROUP].sorted[0...NUM_INSNS-1] into assembly
7593 language order. We have already picked a new position for
7594 frv_packet.groups[GROUP].sorted[X] if bit X of ISSUED is set.
7595 These instructions will occupy elements [0, LOWER_SLOT) and
7596 [UPPER_SLOT, NUM_INSNS) of the final (sorted) array. STATE is
7597 the DFA state after issuing these instructions.
7599 Try filling elements [LOWER_SLOT, UPPER_SLOT) with every permutation
7600 of the unused instructions. Return true if one such permutation gives
7601 a valid ordering, leaving the successful permutation in sorted[].
7602 Do not modify sorted[] until a valid permutation is found. */
7604 static bool
7605 frv_sort_insn_group_1 (enum frv_insn_group group,
7606 unsigned int lower_slot, unsigned int upper_slot,
7607 unsigned int issued, unsigned int num_insns,
7608 state_t state)
7610 struct frv_packet_group *packet_group;
7611 unsigned int i;
7612 state_t test_state;
7613 size_t dfa_size;
7614 rtx insn;
7616 /* Early success if we've filled all the slots. */
7617 if (lower_slot == upper_slot)
7618 return true;
7620 packet_group = &frv_packet.groups[group];
7621 dfa_size = state_size ();
7622 test_state = alloca (dfa_size);
7624 /* Try issuing each unused instruction. */
7625 for (i = num_insns - 1; i + 1 != 0; i--)
7626 if (~issued & (1 << i))
7628 insn = packet_group->sorted[i];
7629 memcpy (test_state, state, dfa_size);
7630 if (state_transition (test_state, insn) < 0
7631 && cpu_unit_reservation_p (test_state,
7632 NTH_UNIT (group, upper_slot - 1))
7633 && frv_sort_insn_group_1 (group, lower_slot, upper_slot - 1,
7634 issued | (1 << i), num_insns,
7635 test_state))
7637 packet_group->sorted[upper_slot - 1] = insn;
7638 return true;
7642 return false;
7645 /* Compare two instructions by their frv_insn_unit. */
7647 static int
7648 frv_compare_insns (const void *first, const void *second)
7650 const rtx *const insn1 = (rtx const *) first,
7651 *const insn2 = (rtx const *) second;
7652 return frv_insn_unit (*insn1) - frv_insn_unit (*insn2);
7655 /* Copy frv_packet.groups[GROUP].insns[] to frv_packet.groups[GROUP].sorted[]
7656 and sort it into assembly language order. See frv.md for a description of
7657 the algorithm. */
7659 static void
7660 frv_sort_insn_group (enum frv_insn_group group)
7662 struct frv_packet_group *packet_group;
7663 unsigned int first, i, nop, max_unit, num_slots;
7664 state_t state, test_state;
7665 size_t dfa_size;
7667 packet_group = &frv_packet.groups[group];
7669 /* Assume no nop is needed. */
7670 packet_group->nop = 0;
7672 if (packet_group->num_insns == 0)
7673 return;
7675 /* Copy insns[] to sorted[]. */
7676 memcpy (packet_group->sorted, packet_group->insns,
7677 sizeof (rtx) * packet_group->num_insns);
7679 /* Sort sorted[] by the unit that each insn tries to take first. */
7680 if (packet_group->num_insns > 1)
7681 qsort (packet_group->sorted, packet_group->num_insns,
7682 sizeof (rtx), frv_compare_insns);
7684 /* That's always enough for branch and control insns. */
7685 if (group == GROUP_B || group == GROUP_C)
7686 return;
7688 dfa_size = state_size ();
7689 state = alloca (dfa_size);
7690 test_state = alloca (dfa_size);
7692 /* Find the highest FIRST such that sorted[0...FIRST-1] can issue
7693 consecutively and such that the DFA takes unit X when sorted[X]
7694 is added. Set STATE to the new DFA state. */
7695 state_reset (test_state);
7696 for (first = 0; first < packet_group->num_insns; first++)
7698 memcpy (state, test_state, dfa_size);
7699 if (state_transition (test_state, packet_group->sorted[first]) >= 0
7700 || !cpu_unit_reservation_p (test_state, NTH_UNIT (group, first)))
7701 break;
7704 /* If all the instructions issued in ascending order, we're done. */
7705 if (first == packet_group->num_insns)
7706 return;
7708 /* Add nops to the end of sorted[] and try each permutation until
7709 we find one that works. */
7710 for (nop = 0; nop < frv_num_nops; nop++)
7712 max_unit = frv_insn_unit (frv_nops[nop]);
7713 if (frv_unit_groups[max_unit] == group)
7715 packet_group->nop = frv_nops[nop];
7716 num_slots = UNIT_NUMBER (max_unit) + 1;
7717 for (i = packet_group->num_insns; i < num_slots; i++)
7718 packet_group->sorted[i] = frv_nops[nop];
7719 if (frv_sort_insn_group_1 (group, first, num_slots,
7720 (1 << first) - 1, num_slots, state))
7721 return;
7724 gcc_unreachable ();
7727 /* Sort the current packet into assembly-language order. Set packing
7728 flags as appropriate. */
7730 static void
7731 frv_reorder_packet (void)
7733 unsigned int cursor[NUM_GROUPS];
7734 rtx insns[ARRAY_SIZE (frv_unit_groups)];
7735 unsigned int unit, to, from;
7736 enum frv_insn_group group;
7737 struct frv_packet_group *packet_group;
7739 /* First sort each group individually. */
7740 for (group = 0; group < NUM_GROUPS; group++)
7742 cursor[group] = 0;
7743 frv_sort_insn_group (group);
7746 /* Go through the unit template and try add an instruction from
7747 that unit's group. */
7748 to = 0;
7749 for (unit = 0; unit < ARRAY_SIZE (frv_unit_groups); unit++)
7751 group = frv_unit_groups[unit];
7752 packet_group = &frv_packet.groups[group];
7753 if (cursor[group] < packet_group->num_insns)
7755 /* frv_reorg should have added nops for us. */
7756 gcc_assert (packet_group->sorted[cursor[group]]
7757 != packet_group->nop);
7758 insns[to++] = packet_group->sorted[cursor[group]++];
7762 gcc_assert (to == frv_packet.num_insns);
7764 /* Clear the last instruction's packing flag, thus marking the end of
7765 a packet. Reorder the other instructions relative to it. */
7766 CLEAR_PACKING_FLAG (insns[to - 1]);
7767 for (from = 0; from < to - 1; from++)
7769 remove_insn (insns[from]);
7770 add_insn_before (insns[from], insns[to - 1], NULL);
7771 SET_PACKING_FLAG (insns[from]);
7776 /* Divide instructions into packets. Reorder the contents of each
7777 packet so that they are in the correct assembly-language order.
7779 Since this pass can change the raw meaning of the rtl stream, it must
7780 only be called at the last minute, just before the instructions are
7781 written out. */
7783 static void
7784 frv_pack_insns (void)
7786 if (frv_for_each_packet (frv_reorder_packet))
7787 frv_insn_packing_flag = 0;
7788 else
7789 frv_insn_packing_flag = -1;
7792 /* See whether we need to add nops to group GROUP in order to
7793 make a valid packet. */
7795 static void
7796 frv_fill_unused_units (enum frv_insn_group group)
7798 unsigned int non_nops, nops, i;
7799 struct frv_packet_group *packet_group;
7801 packet_group = &frv_packet.groups[group];
7803 /* Sort the instructions into assembly-language order.
7804 Use nops to fill slots that are otherwise unused. */
7805 frv_sort_insn_group (group);
7807 /* See how many nops are needed before the final useful instruction. */
7808 i = nops = 0;
7809 for (non_nops = 0; non_nops < packet_group->num_insns; non_nops++)
7810 while (packet_group->sorted[i++] == packet_group->nop)
7811 nops++;
7813 /* Insert that many nops into the instruction stream. */
7814 while (nops-- > 0)
7815 frv_insert_nop_in_packet (packet_group->nop);
7818 /* Return true if accesses IO1 and IO2 refer to the same doubleword. */
7820 static bool
7821 frv_same_doubleword_p (const struct frv_io *io1, const struct frv_io *io2)
7823 if (io1->const_address != 0 && io2->const_address != 0)
7824 return io1->const_address == io2->const_address;
7826 if (io1->var_address != 0 && io2->var_address != 0)
7827 return rtx_equal_p (io1->var_address, io2->var_address);
7829 return false;
7832 /* Return true if operations IO1 and IO2 are guaranteed to complete
7833 in order. */
7835 static bool
7836 frv_io_fixed_order_p (const struct frv_io *io1, const struct frv_io *io2)
7838 /* The order of writes is always preserved. */
7839 if (io1->type == FRV_IO_WRITE && io2->type == FRV_IO_WRITE)
7840 return true;
7842 /* The order of reads isn't preserved. */
7843 if (io1->type != FRV_IO_WRITE && io2->type != FRV_IO_WRITE)
7844 return false;
7846 /* One operation is a write and the other is (or could be) a read.
7847 The order is only guaranteed if the accesses are to the same
7848 doubleword. */
7849 return frv_same_doubleword_p (io1, io2);
7852 /* Generalize I/O operation X so that it covers both X and Y. */
7854 static void
7855 frv_io_union (struct frv_io *x, const struct frv_io *y)
7857 if (x->type != y->type)
7858 x->type = FRV_IO_UNKNOWN;
7859 if (!frv_same_doubleword_p (x, y))
7861 x->const_address = 0;
7862 x->var_address = 0;
7866 /* Fill IO with information about the load or store associated with
7867 membar instruction INSN. */
7869 static void
7870 frv_extract_membar (struct frv_io *io, rtx insn)
7872 extract_insn (insn);
7873 io->type = INTVAL (recog_data.operand[2]);
7874 io->const_address = INTVAL (recog_data.operand[1]);
7875 io->var_address = XEXP (recog_data.operand[0], 0);
7878 /* A note_stores callback for which DATA points to an rtx. Nullify *DATA
7879 if X is a register and *DATA depends on X. */
7881 static void
7882 frv_io_check_address (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
7884 rtx *other = (rtx *) data;
7886 if (REG_P (x) && *other != 0 && reg_overlap_mentioned_p (x, *other))
7887 *other = 0;
7890 /* A note_stores callback for which DATA points to a HARD_REG_SET.
7891 Remove every modified register from the set. */
7893 static void
7894 frv_io_handle_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
7896 HARD_REG_SET *set = (HARD_REG_SET *) data;
7897 unsigned int regno;
7899 if (REG_P (x))
7900 FOR_EACH_REGNO (regno, x)
7901 CLEAR_HARD_REG_BIT (*set, regno);
7904 /* A for_each_rtx callback for which DATA points to a HARD_REG_SET.
7905 Add every register in *X to the set. */
7907 static int
7908 frv_io_handle_use_1 (rtx *x, void *data)
7910 HARD_REG_SET *set = (HARD_REG_SET *) data;
7911 unsigned int regno;
7913 if (REG_P (*x))
7914 FOR_EACH_REGNO (regno, *x)
7915 SET_HARD_REG_BIT (*set, regno);
7917 return 0;
7920 /* A note_stores callback that applies frv_io_handle_use_1 to an
7921 entire rhs value. */
7923 static void
7924 frv_io_handle_use (rtx *x, void *data)
7926 for_each_rtx (x, frv_io_handle_use_1, data);
7929 /* Go through block BB looking for membars to remove. There are two
7930 cases where intra-block analysis is enough:
7932 - a membar is redundant if it occurs between two consecutive I/O
7933 operations and if those operations are guaranteed to complete
7934 in order.
7936 - a membar for a __builtin_read is redundant if the result is
7937 used before the next I/O operation is issued.
7939 If the last membar in the block could not be removed, and there
7940 are guaranteed to be no I/O operations between that membar and
7941 the end of the block, store the membar in *LAST_MEMBAR, otherwise
7942 store null.
7944 Describe the block's first I/O operation in *NEXT_IO. Describe
7945 an unknown operation if the block doesn't do any I/O. */
7947 static void
7948 frv_optimize_membar_local (basic_block bb, struct frv_io *next_io,
7949 rtx *last_membar)
7951 HARD_REG_SET used_regs;
7952 rtx next_membar, set, insn;
7953 bool next_is_end_p;
7955 /* NEXT_IO is the next I/O operation to be performed after the current
7956 instruction. It starts off as being an unknown operation. */
7957 memset (next_io, 0, sizeof (*next_io));
7959 /* NEXT_IS_END_P is true if NEXT_IO describes the end of the block. */
7960 next_is_end_p = true;
7962 /* If the current instruction is a __builtin_read or __builtin_write,
7963 NEXT_MEMBAR is the membar instruction associated with it. NEXT_MEMBAR
7964 is null if the membar has already been deleted.
7966 Note that the initialization here should only be needed to
7967 suppress warnings. */
7968 next_membar = 0;
7970 /* USED_REGS is the set of registers that are used before the
7971 next I/O instruction. */
7972 CLEAR_HARD_REG_SET (used_regs);
7974 for (insn = BB_END (bb); insn != BB_HEAD (bb); insn = PREV_INSN (insn))
7975 if (GET_CODE (insn) == CALL_INSN)
7977 /* We can't predict what a call will do to volatile memory. */
7978 memset (next_io, 0, sizeof (struct frv_io));
7979 next_is_end_p = false;
7980 CLEAR_HARD_REG_SET (used_regs);
7982 else if (INSN_P (insn))
7983 switch (recog_memoized (insn))
7985 case CODE_FOR_optional_membar_qi:
7986 case CODE_FOR_optional_membar_hi:
7987 case CODE_FOR_optional_membar_si:
7988 case CODE_FOR_optional_membar_di:
7989 next_membar = insn;
7990 if (next_is_end_p)
7992 /* Local information isn't enough to decide whether this
7993 membar is needed. Stash it away for later. */
7994 *last_membar = insn;
7995 frv_extract_membar (next_io, insn);
7996 next_is_end_p = false;
7998 else
8000 /* Check whether the I/O operation before INSN could be
8001 reordered with one described by NEXT_IO. If it can't,
8002 INSN will not be needed. */
8003 struct frv_io prev_io;
8005 frv_extract_membar (&prev_io, insn);
8006 if (frv_io_fixed_order_p (&prev_io, next_io))
8008 if (dump_file)
8009 fprintf (dump_file,
8010 ";; [Local] Removing membar %d since order"
8011 " of accesses is guaranteed\n",
8012 INSN_UID (next_membar));
8014 insn = NEXT_INSN (insn);
8015 delete_insn (next_membar);
8016 next_membar = 0;
8018 *next_io = prev_io;
8020 break;
8022 default:
8023 /* Invalidate NEXT_IO's address if it depends on something that
8024 is clobbered by INSN. */
8025 if (next_io->var_address)
8026 note_stores (PATTERN (insn), frv_io_check_address,
8027 &next_io->var_address);
8029 /* If the next membar is associated with a __builtin_read,
8030 see if INSN reads from that address. If it does, and if
8031 the destination register is used before the next I/O access,
8032 there is no need for the membar. */
8033 set = PATTERN (insn);
8034 if (next_io->type == FRV_IO_READ
8035 && next_io->var_address != 0
8036 && next_membar != 0
8037 && GET_CODE (set) == SET
8038 && GET_CODE (SET_DEST (set)) == REG
8039 && TEST_HARD_REG_BIT (used_regs, REGNO (SET_DEST (set))))
8041 rtx src;
8043 src = SET_SRC (set);
8044 if (GET_CODE (src) == ZERO_EXTEND)
8045 src = XEXP (src, 0);
8047 if (GET_CODE (src) == MEM
8048 && rtx_equal_p (XEXP (src, 0), next_io->var_address))
8050 if (dump_file)
8051 fprintf (dump_file,
8052 ";; [Local] Removing membar %d since the target"
8053 " of %d is used before the I/O operation\n",
8054 INSN_UID (next_membar), INSN_UID (insn));
8056 if (next_membar == *last_membar)
8057 *last_membar = 0;
8059 delete_insn (next_membar);
8060 next_membar = 0;
8064 /* If INSN has volatile references, forget about any registers
8065 that are used after it. Otherwise forget about uses that
8066 are (or might be) defined by INSN. */
8067 if (volatile_refs_p (PATTERN (insn)))
8068 CLEAR_HARD_REG_SET (used_regs);
8069 else
8070 note_stores (PATTERN (insn), frv_io_handle_set, &used_regs);
8072 note_uses (&PATTERN (insn), frv_io_handle_use, &used_regs);
8073 break;
8077 /* See if MEMBAR, the last membar instruction in BB, can be removed.
8078 FIRST_IO[X] describes the first operation performed by basic block X. */
8080 static void
8081 frv_optimize_membar_global (basic_block bb, struct frv_io *first_io,
8082 rtx membar)
8084 struct frv_io this_io, next_io;
8085 edge succ;
8086 edge_iterator ei;
8088 /* We need to keep the membar if there is an edge to the exit block. */
8089 FOR_EACH_EDGE (succ, ei, bb->succs)
8090 /* for (succ = bb->succ; succ != 0; succ = succ->succ_next) */
8091 if (succ->dest == EXIT_BLOCK_PTR)
8092 return;
8094 /* Work out the union of all successor blocks. */
8095 ei = ei_start (bb->succs);
8096 ei_cond (ei, &succ);
8097 /* next_io = first_io[bb->succ->dest->index]; */
8098 next_io = first_io[succ->dest->index];
8099 ei = ei_start (bb->succs);
8100 if (ei_cond (ei, &succ))
8102 for (ei_next (&ei); ei_cond (ei, &succ); ei_next (&ei))
8103 /*for (succ = bb->succ->succ_next; succ != 0; succ = succ->succ_next)*/
8104 frv_io_union (&next_io, &first_io[succ->dest->index]);
8106 else
8107 gcc_unreachable ();
8109 frv_extract_membar (&this_io, membar);
8110 if (frv_io_fixed_order_p (&this_io, &next_io))
8112 if (dump_file)
8113 fprintf (dump_file,
8114 ";; [Global] Removing membar %d since order of accesses"
8115 " is guaranteed\n", INSN_UID (membar));
8117 delete_insn (membar);
8121 /* Remove redundant membars from the current function. */
8123 static void
8124 frv_optimize_membar (void)
8126 basic_block bb;
8127 struct frv_io *first_io;
8128 rtx *last_membar;
8130 compute_bb_for_insn ();
8131 first_io = XCNEWVEC (struct frv_io, last_basic_block);
8132 last_membar = XCNEWVEC (rtx, last_basic_block);
8134 FOR_EACH_BB (bb)
8135 frv_optimize_membar_local (bb, &first_io[bb->index],
8136 &last_membar[bb->index]);
8138 FOR_EACH_BB (bb)
8139 if (last_membar[bb->index] != 0)
8140 frv_optimize_membar_global (bb, first_io, last_membar[bb->index]);
8142 free (first_io);
8143 free (last_membar);
8146 /* Used by frv_reorg to keep track of the current packet's address. */
8147 static unsigned int frv_packet_address;
8149 /* If the current packet falls through to a label, try to pad the packet
8150 with nops in order to fit the label's alignment requirements. */
8152 static void
8153 frv_align_label (void)
8155 unsigned int alignment, target, nop;
8156 rtx x, last, barrier, label;
8158 /* Walk forward to the start of the next packet. Set ALIGNMENT to the
8159 maximum alignment of that packet, LABEL to the last label between
8160 the packets, and BARRIER to the last barrier. */
8161 last = frv_packet.insns[frv_packet.num_insns - 1];
8162 label = barrier = 0;
8163 alignment = 4;
8164 for (x = NEXT_INSN (last); x != 0 && !INSN_P (x); x = NEXT_INSN (x))
8166 if (LABEL_P (x))
8168 unsigned int subalign = 1 << label_to_alignment (x);
8169 alignment = MAX (alignment, subalign);
8170 label = x;
8172 if (BARRIER_P (x))
8173 barrier = x;
8176 /* If -malign-labels, and the packet falls through to an unaligned
8177 label, try introducing a nop to align that label to 8 bytes. */
8178 if (TARGET_ALIGN_LABELS
8179 && label != 0
8180 && barrier == 0
8181 && frv_packet.num_insns < frv_packet.issue_rate)
8182 alignment = MAX (alignment, 8);
8184 /* Advance the address to the end of the current packet. */
8185 frv_packet_address += frv_packet.num_insns * 4;
8187 /* Work out the target address, after alignment. */
8188 target = (frv_packet_address + alignment - 1) & -alignment;
8190 /* If the packet falls through to the label, try to find an efficient
8191 padding sequence. */
8192 if (barrier == 0)
8194 /* First try adding nops to the current packet. */
8195 for (nop = 0; nop < frv_num_nops; nop++)
8196 while (frv_packet_address < target && frv_pack_insn_p (frv_nops[nop]))
8198 frv_insert_nop_in_packet (frv_nops[nop]);
8199 frv_packet_address += 4;
8202 /* If we still haven't reached the target, add some new packets that
8203 contain only nops. If there are two types of nop, insert an
8204 alternating sequence of frv_nops[0] and frv_nops[1], which will
8205 lead to packets like:
8207 nop.p
8208 mnop.p/fnop.p
8209 nop.p
8210 mnop/fnop
8212 etc. Just emit frv_nops[0] if that's the only nop we have. */
8213 last = frv_packet.insns[frv_packet.num_insns - 1];
8214 nop = 0;
8215 while (frv_packet_address < target)
8217 last = emit_insn_after (PATTERN (frv_nops[nop]), last);
8218 frv_packet_address += 4;
8219 if (frv_num_nops > 1)
8220 nop ^= 1;
8224 frv_packet_address = target;
8227 /* Subroutine of frv_reorg, called after each packet has been constructed
8228 in frv_packet. */
8230 static void
8231 frv_reorg_packet (void)
8233 frv_fill_unused_units (GROUP_I);
8234 frv_fill_unused_units (GROUP_FM);
8235 frv_align_label ();
8238 /* Add an instruction with pattern NOP to frv_nops[]. */
8240 static void
8241 frv_register_nop (rtx nop)
8243 nop = make_insn_raw (nop);
8244 NEXT_INSN (nop) = 0;
8245 PREV_INSN (nop) = 0;
8246 frv_nops[frv_num_nops++] = nop;
8249 /* Implement TARGET_MACHINE_DEPENDENT_REORG. Divide the instructions
8250 into packets and check whether we need to insert nops in order to
8251 fulfill the processor's issue requirements. Also, if the user has
8252 requested a certain alignment for a label, try to meet that alignment
8253 by inserting nops in the previous packet. */
8255 static void
8256 frv_reorg (void)
8258 if (optimize > 0 && TARGET_OPTIMIZE_MEMBAR && cfun->machine->has_membar_p)
8259 frv_optimize_membar ();
8261 frv_num_nops = 0;
8262 frv_register_nop (gen_nop ());
8263 if (TARGET_MEDIA)
8264 frv_register_nop (gen_mnop ());
8265 if (TARGET_HARD_FLOAT)
8266 frv_register_nop (gen_fnop ());
8268 /* Estimate the length of each branch. Although this may change after
8269 we've inserted nops, it will only do so in big functions. */
8270 shorten_branches (get_insns ());
8272 frv_packet_address = 0;
8273 frv_for_each_packet (frv_reorg_packet);
8276 #define def_builtin(name, type, code) \
8277 add_builtin_function ((name), (type), (code), BUILT_IN_MD, NULL, NULL)
8279 struct builtin_description
8281 enum insn_code icode;
8282 const char *name;
8283 enum frv_builtins code;
8284 enum rtx_code comparison;
8285 unsigned int flag;
8288 /* Media intrinsics that take a single, constant argument. */
8290 static struct builtin_description bdesc_set[] =
8292 { CODE_FOR_mhdsets, "__MHDSETS", FRV_BUILTIN_MHDSETS, 0, 0 }
8295 /* Media intrinsics that take just one argument. */
8297 static struct builtin_description bdesc_1arg[] =
8299 { CODE_FOR_mnot, "__MNOT", FRV_BUILTIN_MNOT, 0, 0 },
8300 { CODE_FOR_munpackh, "__MUNPACKH", FRV_BUILTIN_MUNPACKH, 0, 0 },
8301 { CODE_FOR_mbtoh, "__MBTOH", FRV_BUILTIN_MBTOH, 0, 0 },
8302 { CODE_FOR_mhtob, "__MHTOB", FRV_BUILTIN_MHTOB, 0, 0 },
8303 { CODE_FOR_mabshs, "__MABSHS", FRV_BUILTIN_MABSHS, 0, 0 },
8304 { CODE_FOR_scutss, "__SCUTSS", FRV_BUILTIN_SCUTSS, 0, 0 }
8307 /* Media intrinsics that take two arguments. */
8309 static struct builtin_description bdesc_2arg[] =
8311 { CODE_FOR_mand, "__MAND", FRV_BUILTIN_MAND, 0, 0 },
8312 { CODE_FOR_mor, "__MOR", FRV_BUILTIN_MOR, 0, 0 },
8313 { CODE_FOR_mxor, "__MXOR", FRV_BUILTIN_MXOR, 0, 0 },
8314 { CODE_FOR_maveh, "__MAVEH", FRV_BUILTIN_MAVEH, 0, 0 },
8315 { CODE_FOR_msaths, "__MSATHS", FRV_BUILTIN_MSATHS, 0, 0 },
8316 { CODE_FOR_msathu, "__MSATHU", FRV_BUILTIN_MSATHU, 0, 0 },
8317 { CODE_FOR_maddhss, "__MADDHSS", FRV_BUILTIN_MADDHSS, 0, 0 },
8318 { CODE_FOR_maddhus, "__MADDHUS", FRV_BUILTIN_MADDHUS, 0, 0 },
8319 { CODE_FOR_msubhss, "__MSUBHSS", FRV_BUILTIN_MSUBHSS, 0, 0 },
8320 { CODE_FOR_msubhus, "__MSUBHUS", FRV_BUILTIN_MSUBHUS, 0, 0 },
8321 { CODE_FOR_mqaddhss, "__MQADDHSS", FRV_BUILTIN_MQADDHSS, 0, 0 },
8322 { CODE_FOR_mqaddhus, "__MQADDHUS", FRV_BUILTIN_MQADDHUS, 0, 0 },
8323 { CODE_FOR_mqsubhss, "__MQSUBHSS", FRV_BUILTIN_MQSUBHSS, 0, 0 },
8324 { CODE_FOR_mqsubhus, "__MQSUBHUS", FRV_BUILTIN_MQSUBHUS, 0, 0 },
8325 { CODE_FOR_mpackh, "__MPACKH", FRV_BUILTIN_MPACKH, 0, 0 },
8326 { CODE_FOR_mcop1, "__Mcop1", FRV_BUILTIN_MCOP1, 0, 0 },
8327 { CODE_FOR_mcop2, "__Mcop2", FRV_BUILTIN_MCOP2, 0, 0 },
8328 { CODE_FOR_mwcut, "__MWCUT", FRV_BUILTIN_MWCUT, 0, 0 },
8329 { CODE_FOR_mqsaths, "__MQSATHS", FRV_BUILTIN_MQSATHS, 0, 0 },
8330 { CODE_FOR_mqlclrhs, "__MQLCLRHS", FRV_BUILTIN_MQLCLRHS, 0, 0 },
8331 { CODE_FOR_mqlmths, "__MQLMTHS", FRV_BUILTIN_MQLMTHS, 0, 0 },
8332 { CODE_FOR_smul, "__SMUL", FRV_BUILTIN_SMUL, 0, 0 },
8333 { CODE_FOR_umul, "__UMUL", FRV_BUILTIN_UMUL, 0, 0 },
8334 { CODE_FOR_addss, "__ADDSS", FRV_BUILTIN_ADDSS, 0, 0 },
8335 { CODE_FOR_subss, "__SUBSS", FRV_BUILTIN_SUBSS, 0, 0 },
8336 { CODE_FOR_slass, "__SLASS", FRV_BUILTIN_SLASS, 0, 0 },
8337 { CODE_FOR_scan, "__SCAN", FRV_BUILTIN_SCAN, 0, 0 }
8340 /* Integer intrinsics that take two arguments and have no return value. */
8342 static struct builtin_description bdesc_int_void2arg[] =
8344 { CODE_FOR_smass, "__SMASS", FRV_BUILTIN_SMASS, 0, 0 },
8345 { CODE_FOR_smsss, "__SMSSS", FRV_BUILTIN_SMSSS, 0, 0 },
8346 { CODE_FOR_smu, "__SMU", FRV_BUILTIN_SMU, 0, 0 }
8349 static struct builtin_description bdesc_prefetches[] =
8351 { CODE_FOR_frv_prefetch0, "__data_prefetch0", FRV_BUILTIN_PREFETCH0, 0, 0 },
8352 { CODE_FOR_frv_prefetch, "__data_prefetch", FRV_BUILTIN_PREFETCH, 0, 0 }
8355 /* Media intrinsics that take two arguments, the first being an ACC number. */
8357 static struct builtin_description bdesc_cut[] =
8359 { CODE_FOR_mcut, "__MCUT", FRV_BUILTIN_MCUT, 0, 0 },
8360 { CODE_FOR_mcutss, "__MCUTSS", FRV_BUILTIN_MCUTSS, 0, 0 },
8361 { CODE_FOR_mdcutssi, "__MDCUTSSI", FRV_BUILTIN_MDCUTSSI, 0, 0 }
8364 /* Two-argument media intrinsics with an immediate second argument. */
8366 static struct builtin_description bdesc_2argimm[] =
8368 { CODE_FOR_mrotli, "__MROTLI", FRV_BUILTIN_MROTLI, 0, 0 },
8369 { CODE_FOR_mrotri, "__MROTRI", FRV_BUILTIN_MROTRI, 0, 0 },
8370 { CODE_FOR_msllhi, "__MSLLHI", FRV_BUILTIN_MSLLHI, 0, 0 },
8371 { CODE_FOR_msrlhi, "__MSRLHI", FRV_BUILTIN_MSRLHI, 0, 0 },
8372 { CODE_FOR_msrahi, "__MSRAHI", FRV_BUILTIN_MSRAHI, 0, 0 },
8373 { CODE_FOR_mexpdhw, "__MEXPDHW", FRV_BUILTIN_MEXPDHW, 0, 0 },
8374 { CODE_FOR_mexpdhd, "__MEXPDHD", FRV_BUILTIN_MEXPDHD, 0, 0 },
8375 { CODE_FOR_mdrotli, "__MDROTLI", FRV_BUILTIN_MDROTLI, 0, 0 },
8376 { CODE_FOR_mcplhi, "__MCPLHI", FRV_BUILTIN_MCPLHI, 0, 0 },
8377 { CODE_FOR_mcpli, "__MCPLI", FRV_BUILTIN_MCPLI, 0, 0 },
8378 { CODE_FOR_mhsetlos, "__MHSETLOS", FRV_BUILTIN_MHSETLOS, 0, 0 },
8379 { CODE_FOR_mhsetloh, "__MHSETLOH", FRV_BUILTIN_MHSETLOH, 0, 0 },
8380 { CODE_FOR_mhsethis, "__MHSETHIS", FRV_BUILTIN_MHSETHIS, 0, 0 },
8381 { CODE_FOR_mhsethih, "__MHSETHIH", FRV_BUILTIN_MHSETHIH, 0, 0 },
8382 { CODE_FOR_mhdseth, "__MHDSETH", FRV_BUILTIN_MHDSETH, 0, 0 },
8383 { CODE_FOR_mqsllhi, "__MQSLLHI", FRV_BUILTIN_MQSLLHI, 0, 0 },
8384 { CODE_FOR_mqsrahi, "__MQSRAHI", FRV_BUILTIN_MQSRAHI, 0, 0 }
8387 /* Media intrinsics that take two arguments and return void, the first argument
8388 being a pointer to 4 words in memory. */
8390 static struct builtin_description bdesc_void2arg[] =
8392 { CODE_FOR_mdunpackh, "__MDUNPACKH", FRV_BUILTIN_MDUNPACKH, 0, 0 },
8393 { CODE_FOR_mbtohe, "__MBTOHE", FRV_BUILTIN_MBTOHE, 0, 0 },
8396 /* Media intrinsics that take three arguments, the first being a const_int that
8397 denotes an accumulator, and that return void. */
8399 static struct builtin_description bdesc_void3arg[] =
8401 { CODE_FOR_mcpxrs, "__MCPXRS", FRV_BUILTIN_MCPXRS, 0, 0 },
8402 { CODE_FOR_mcpxru, "__MCPXRU", FRV_BUILTIN_MCPXRU, 0, 0 },
8403 { CODE_FOR_mcpxis, "__MCPXIS", FRV_BUILTIN_MCPXIS, 0, 0 },
8404 { CODE_FOR_mcpxiu, "__MCPXIU", FRV_BUILTIN_MCPXIU, 0, 0 },
8405 { CODE_FOR_mmulhs, "__MMULHS", FRV_BUILTIN_MMULHS, 0, 0 },
8406 { CODE_FOR_mmulhu, "__MMULHU", FRV_BUILTIN_MMULHU, 0, 0 },
8407 { CODE_FOR_mmulxhs, "__MMULXHS", FRV_BUILTIN_MMULXHS, 0, 0 },
8408 { CODE_FOR_mmulxhu, "__MMULXHU", FRV_BUILTIN_MMULXHU, 0, 0 },
8409 { CODE_FOR_mmachs, "__MMACHS", FRV_BUILTIN_MMACHS, 0, 0 },
8410 { CODE_FOR_mmachu, "__MMACHU", FRV_BUILTIN_MMACHU, 0, 0 },
8411 { CODE_FOR_mmrdhs, "__MMRDHS", FRV_BUILTIN_MMRDHS, 0, 0 },
8412 { CODE_FOR_mmrdhu, "__MMRDHU", FRV_BUILTIN_MMRDHU, 0, 0 },
8413 { CODE_FOR_mqcpxrs, "__MQCPXRS", FRV_BUILTIN_MQCPXRS, 0, 0 },
8414 { CODE_FOR_mqcpxru, "__MQCPXRU", FRV_BUILTIN_MQCPXRU, 0, 0 },
8415 { CODE_FOR_mqcpxis, "__MQCPXIS", FRV_BUILTIN_MQCPXIS, 0, 0 },
8416 { CODE_FOR_mqcpxiu, "__MQCPXIU", FRV_BUILTIN_MQCPXIU, 0, 0 },
8417 { CODE_FOR_mqmulhs, "__MQMULHS", FRV_BUILTIN_MQMULHS, 0, 0 },
8418 { CODE_FOR_mqmulhu, "__MQMULHU", FRV_BUILTIN_MQMULHU, 0, 0 },
8419 { CODE_FOR_mqmulxhs, "__MQMULXHS", FRV_BUILTIN_MQMULXHS, 0, 0 },
8420 { CODE_FOR_mqmulxhu, "__MQMULXHU", FRV_BUILTIN_MQMULXHU, 0, 0 },
8421 { CODE_FOR_mqmachs, "__MQMACHS", FRV_BUILTIN_MQMACHS, 0, 0 },
8422 { CODE_FOR_mqmachu, "__MQMACHU", FRV_BUILTIN_MQMACHU, 0, 0 },
8423 { CODE_FOR_mqxmachs, "__MQXMACHS", FRV_BUILTIN_MQXMACHS, 0, 0 },
8424 { CODE_FOR_mqxmacxhs, "__MQXMACXHS", FRV_BUILTIN_MQXMACXHS, 0, 0 },
8425 { CODE_FOR_mqmacxhs, "__MQMACXHS", FRV_BUILTIN_MQMACXHS, 0, 0 }
8428 /* Media intrinsics that take two accumulator numbers as argument and
8429 return void. */
8431 static struct builtin_description bdesc_voidacc[] =
8433 { CODE_FOR_maddaccs, "__MADDACCS", FRV_BUILTIN_MADDACCS, 0, 0 },
8434 { CODE_FOR_msubaccs, "__MSUBACCS", FRV_BUILTIN_MSUBACCS, 0, 0 },
8435 { CODE_FOR_masaccs, "__MASACCS", FRV_BUILTIN_MASACCS, 0, 0 },
8436 { CODE_FOR_mdaddaccs, "__MDADDACCS", FRV_BUILTIN_MDADDACCS, 0, 0 },
8437 { CODE_FOR_mdsubaccs, "__MDSUBACCS", FRV_BUILTIN_MDSUBACCS, 0, 0 },
8438 { CODE_FOR_mdasaccs, "__MDASACCS", FRV_BUILTIN_MDASACCS, 0, 0 }
8441 /* Intrinsics that load a value and then issue a MEMBAR. The load is
8442 a normal move and the ICODE is for the membar. */
8444 static struct builtin_description bdesc_loads[] =
8446 { CODE_FOR_optional_membar_qi, "__builtin_read8",
8447 FRV_BUILTIN_READ8, 0, 0 },
8448 { CODE_FOR_optional_membar_hi, "__builtin_read16",
8449 FRV_BUILTIN_READ16, 0, 0 },
8450 { CODE_FOR_optional_membar_si, "__builtin_read32",
8451 FRV_BUILTIN_READ32, 0, 0 },
8452 { CODE_FOR_optional_membar_di, "__builtin_read64",
8453 FRV_BUILTIN_READ64, 0, 0 }
8456 /* Likewise stores. */
8458 static struct builtin_description bdesc_stores[] =
8460 { CODE_FOR_optional_membar_qi, "__builtin_write8",
8461 FRV_BUILTIN_WRITE8, 0, 0 },
8462 { CODE_FOR_optional_membar_hi, "__builtin_write16",
8463 FRV_BUILTIN_WRITE16, 0, 0 },
8464 { CODE_FOR_optional_membar_si, "__builtin_write32",
8465 FRV_BUILTIN_WRITE32, 0, 0 },
8466 { CODE_FOR_optional_membar_di, "__builtin_write64",
8467 FRV_BUILTIN_WRITE64, 0, 0 },
8470 /* Initialize media builtins. */
8472 static void
8473 frv_init_builtins (void)
8475 tree endlink = void_list_node;
8476 tree accumulator = integer_type_node;
8477 tree integer = integer_type_node;
8478 tree voidt = void_type_node;
8479 tree uhalf = short_unsigned_type_node;
8480 tree sword1 = long_integer_type_node;
8481 tree uword1 = long_unsigned_type_node;
8482 tree sword2 = long_long_integer_type_node;
8483 tree uword2 = long_long_unsigned_type_node;
8484 tree uword4 = build_pointer_type (uword1);
8485 tree vptr = build_pointer_type (build_type_variant (void_type_node, 0, 1));
8486 tree ubyte = unsigned_char_type_node;
8487 tree iacc = integer_type_node;
8489 #define UNARY(RET, T1) \
8490 build_function_type (RET, tree_cons (NULL_TREE, T1, endlink))
8492 #define BINARY(RET, T1, T2) \
8493 build_function_type (RET, tree_cons (NULL_TREE, T1, \
8494 tree_cons (NULL_TREE, T2, endlink)))
8496 #define TRINARY(RET, T1, T2, T3) \
8497 build_function_type (RET, tree_cons (NULL_TREE, T1, \
8498 tree_cons (NULL_TREE, T2, \
8499 tree_cons (NULL_TREE, T3, endlink))))
8501 #define QUAD(RET, T1, T2, T3, T4) \
8502 build_function_type (RET, tree_cons (NULL_TREE, T1, \
8503 tree_cons (NULL_TREE, T2, \
8504 tree_cons (NULL_TREE, T3, \
8505 tree_cons (NULL_TREE, T4, endlink)))))
8507 tree void_ftype_void = build_function_type (voidt, endlink);
8509 tree void_ftype_acc = UNARY (voidt, accumulator);
8510 tree void_ftype_uw4_uw1 = BINARY (voidt, uword4, uword1);
8511 tree void_ftype_uw4_uw2 = BINARY (voidt, uword4, uword2);
8512 tree void_ftype_acc_uw1 = BINARY (voidt, accumulator, uword1);
8513 tree void_ftype_acc_acc = BINARY (voidt, accumulator, accumulator);
8514 tree void_ftype_acc_uw1_uw1 = TRINARY (voidt, accumulator, uword1, uword1);
8515 tree void_ftype_acc_sw1_sw1 = TRINARY (voidt, accumulator, sword1, sword1);
8516 tree void_ftype_acc_uw2_uw2 = TRINARY (voidt, accumulator, uword2, uword2);
8517 tree void_ftype_acc_sw2_sw2 = TRINARY (voidt, accumulator, sword2, sword2);
8519 tree uw1_ftype_uw1 = UNARY (uword1, uword1);
8520 tree uw1_ftype_sw1 = UNARY (uword1, sword1);
8521 tree uw1_ftype_uw2 = UNARY (uword1, uword2);
8522 tree uw1_ftype_acc = UNARY (uword1, accumulator);
8523 tree uw1_ftype_uh_uh = BINARY (uword1, uhalf, uhalf);
8524 tree uw1_ftype_uw1_uw1 = BINARY (uword1, uword1, uword1);
8525 tree uw1_ftype_uw1_int = BINARY (uword1, uword1, integer);
8526 tree uw1_ftype_acc_uw1 = BINARY (uword1, accumulator, uword1);
8527 tree uw1_ftype_acc_sw1 = BINARY (uword1, accumulator, sword1);
8528 tree uw1_ftype_uw2_uw1 = BINARY (uword1, uword2, uword1);
8529 tree uw1_ftype_uw2_int = BINARY (uword1, uword2, integer);
8531 tree sw1_ftype_int = UNARY (sword1, integer);
8532 tree sw1_ftype_sw1_sw1 = BINARY (sword1, sword1, sword1);
8533 tree sw1_ftype_sw1_int = BINARY (sword1, sword1, integer);
8535 tree uw2_ftype_uw1 = UNARY (uword2, uword1);
8536 tree uw2_ftype_uw1_int = BINARY (uword2, uword1, integer);
8537 tree uw2_ftype_uw2_uw2 = BINARY (uword2, uword2, uword2);
8538 tree uw2_ftype_uw2_int = BINARY (uword2, uword2, integer);
8539 tree uw2_ftype_acc_int = BINARY (uword2, accumulator, integer);
8540 tree uw2_ftype_uh_uh_uh_uh = QUAD (uword2, uhalf, uhalf, uhalf, uhalf);
8542 tree sw2_ftype_sw2_sw2 = BINARY (sword2, sword2, sword2);
8543 tree sw2_ftype_sw2_int = BINARY (sword2, sword2, integer);
8544 tree uw2_ftype_uw1_uw1 = BINARY (uword2, uword1, uword1);
8545 tree sw2_ftype_sw1_sw1 = BINARY (sword2, sword1, sword1);
8546 tree void_ftype_sw1_sw1 = BINARY (voidt, sword1, sword1);
8547 tree void_ftype_iacc_sw2 = BINARY (voidt, iacc, sword2);
8548 tree void_ftype_iacc_sw1 = BINARY (voidt, iacc, sword1);
8549 tree sw1_ftype_sw1 = UNARY (sword1, sword1);
8550 tree sw2_ftype_iacc = UNARY (sword2, iacc);
8551 tree sw1_ftype_iacc = UNARY (sword1, iacc);
8552 tree void_ftype_ptr = UNARY (voidt, const_ptr_type_node);
8553 tree uw1_ftype_vptr = UNARY (uword1, vptr);
8554 tree uw2_ftype_vptr = UNARY (uword2, vptr);
8555 tree void_ftype_vptr_ub = BINARY (voidt, vptr, ubyte);
8556 tree void_ftype_vptr_uh = BINARY (voidt, vptr, uhalf);
8557 tree void_ftype_vptr_uw1 = BINARY (voidt, vptr, uword1);
8558 tree void_ftype_vptr_uw2 = BINARY (voidt, vptr, uword2);
8560 def_builtin ("__MAND", uw1_ftype_uw1_uw1, FRV_BUILTIN_MAND);
8561 def_builtin ("__MOR", uw1_ftype_uw1_uw1, FRV_BUILTIN_MOR);
8562 def_builtin ("__MXOR", uw1_ftype_uw1_uw1, FRV_BUILTIN_MXOR);
8563 def_builtin ("__MNOT", uw1_ftype_uw1, FRV_BUILTIN_MNOT);
8564 def_builtin ("__MROTLI", uw1_ftype_uw1_int, FRV_BUILTIN_MROTLI);
8565 def_builtin ("__MROTRI", uw1_ftype_uw1_int, FRV_BUILTIN_MROTRI);
8566 def_builtin ("__MWCUT", uw1_ftype_uw2_uw1, FRV_BUILTIN_MWCUT);
8567 def_builtin ("__MAVEH", uw1_ftype_uw1_uw1, FRV_BUILTIN_MAVEH);
8568 def_builtin ("__MSLLHI", uw1_ftype_uw1_int, FRV_BUILTIN_MSLLHI);
8569 def_builtin ("__MSRLHI", uw1_ftype_uw1_int, FRV_BUILTIN_MSRLHI);
8570 def_builtin ("__MSRAHI", sw1_ftype_sw1_int, FRV_BUILTIN_MSRAHI);
8571 def_builtin ("__MSATHS", sw1_ftype_sw1_sw1, FRV_BUILTIN_MSATHS);
8572 def_builtin ("__MSATHU", uw1_ftype_uw1_uw1, FRV_BUILTIN_MSATHU);
8573 def_builtin ("__MADDHSS", sw1_ftype_sw1_sw1, FRV_BUILTIN_MADDHSS);
8574 def_builtin ("__MADDHUS", uw1_ftype_uw1_uw1, FRV_BUILTIN_MADDHUS);
8575 def_builtin ("__MSUBHSS", sw1_ftype_sw1_sw1, FRV_BUILTIN_MSUBHSS);
8576 def_builtin ("__MSUBHUS", uw1_ftype_uw1_uw1, FRV_BUILTIN_MSUBHUS);
8577 def_builtin ("__MMULHS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MMULHS);
8578 def_builtin ("__MMULHU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MMULHU);
8579 def_builtin ("__MMULXHS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MMULXHS);
8580 def_builtin ("__MMULXHU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MMULXHU);
8581 def_builtin ("__MMACHS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MMACHS);
8582 def_builtin ("__MMACHU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MMACHU);
8583 def_builtin ("__MMRDHS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MMRDHS);
8584 def_builtin ("__MMRDHU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MMRDHU);
8585 def_builtin ("__MQADDHSS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQADDHSS);
8586 def_builtin ("__MQADDHUS", uw2_ftype_uw2_uw2, FRV_BUILTIN_MQADDHUS);
8587 def_builtin ("__MQSUBHSS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQSUBHSS);
8588 def_builtin ("__MQSUBHUS", uw2_ftype_uw2_uw2, FRV_BUILTIN_MQSUBHUS);
8589 def_builtin ("__MQMULHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQMULHS);
8590 def_builtin ("__MQMULHU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQMULHU);
8591 def_builtin ("__MQMULXHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQMULXHS);
8592 def_builtin ("__MQMULXHU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQMULXHU);
8593 def_builtin ("__MQMACHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQMACHS);
8594 def_builtin ("__MQMACHU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQMACHU);
8595 def_builtin ("__MCPXRS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MCPXRS);
8596 def_builtin ("__MCPXRU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MCPXRU);
8597 def_builtin ("__MCPXIS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MCPXIS);
8598 def_builtin ("__MCPXIU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MCPXIU);
8599 def_builtin ("__MQCPXRS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQCPXRS);
8600 def_builtin ("__MQCPXRU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQCPXRU);
8601 def_builtin ("__MQCPXIS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQCPXIS);
8602 def_builtin ("__MQCPXIU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQCPXIU);
8603 def_builtin ("__MCUT", uw1_ftype_acc_uw1, FRV_BUILTIN_MCUT);
8604 def_builtin ("__MCUTSS", uw1_ftype_acc_sw1, FRV_BUILTIN_MCUTSS);
8605 def_builtin ("__MEXPDHW", uw1_ftype_uw1_int, FRV_BUILTIN_MEXPDHW);
8606 def_builtin ("__MEXPDHD", uw2_ftype_uw1_int, FRV_BUILTIN_MEXPDHD);
8607 def_builtin ("__MPACKH", uw1_ftype_uh_uh, FRV_BUILTIN_MPACKH);
8608 def_builtin ("__MUNPACKH", uw2_ftype_uw1, FRV_BUILTIN_MUNPACKH);
8609 def_builtin ("__MDPACKH", uw2_ftype_uh_uh_uh_uh, FRV_BUILTIN_MDPACKH);
8610 def_builtin ("__MDUNPACKH", void_ftype_uw4_uw2, FRV_BUILTIN_MDUNPACKH);
8611 def_builtin ("__MBTOH", uw2_ftype_uw1, FRV_BUILTIN_MBTOH);
8612 def_builtin ("__MHTOB", uw1_ftype_uw2, FRV_BUILTIN_MHTOB);
8613 def_builtin ("__MBTOHE", void_ftype_uw4_uw1, FRV_BUILTIN_MBTOHE);
8614 def_builtin ("__MCLRACC", void_ftype_acc, FRV_BUILTIN_MCLRACC);
8615 def_builtin ("__MCLRACCA", void_ftype_void, FRV_BUILTIN_MCLRACCA);
8616 def_builtin ("__MRDACC", uw1_ftype_acc, FRV_BUILTIN_MRDACC);
8617 def_builtin ("__MRDACCG", uw1_ftype_acc, FRV_BUILTIN_MRDACCG);
8618 def_builtin ("__MWTACC", void_ftype_acc_uw1, FRV_BUILTIN_MWTACC);
8619 def_builtin ("__MWTACCG", void_ftype_acc_uw1, FRV_BUILTIN_MWTACCG);
8620 def_builtin ("__Mcop1", uw1_ftype_uw1_uw1, FRV_BUILTIN_MCOP1);
8621 def_builtin ("__Mcop2", uw1_ftype_uw1_uw1, FRV_BUILTIN_MCOP2);
8622 def_builtin ("__MTRAP", void_ftype_void, FRV_BUILTIN_MTRAP);
8623 def_builtin ("__MQXMACHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQXMACHS);
8624 def_builtin ("__MQXMACXHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQXMACXHS);
8625 def_builtin ("__MQMACXHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQMACXHS);
8626 def_builtin ("__MADDACCS", void_ftype_acc_acc, FRV_BUILTIN_MADDACCS);
8627 def_builtin ("__MSUBACCS", void_ftype_acc_acc, FRV_BUILTIN_MSUBACCS);
8628 def_builtin ("__MASACCS", void_ftype_acc_acc, FRV_BUILTIN_MASACCS);
8629 def_builtin ("__MDADDACCS", void_ftype_acc_acc, FRV_BUILTIN_MDADDACCS);
8630 def_builtin ("__MDSUBACCS", void_ftype_acc_acc, FRV_BUILTIN_MDSUBACCS);
8631 def_builtin ("__MDASACCS", void_ftype_acc_acc, FRV_BUILTIN_MDASACCS);
8632 def_builtin ("__MABSHS", uw1_ftype_sw1, FRV_BUILTIN_MABSHS);
8633 def_builtin ("__MDROTLI", uw2_ftype_uw2_int, FRV_BUILTIN_MDROTLI);
8634 def_builtin ("__MCPLHI", uw1_ftype_uw2_int, FRV_BUILTIN_MCPLHI);
8635 def_builtin ("__MCPLI", uw1_ftype_uw2_int, FRV_BUILTIN_MCPLI);
8636 def_builtin ("__MDCUTSSI", uw2_ftype_acc_int, FRV_BUILTIN_MDCUTSSI);
8637 def_builtin ("__MQSATHS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQSATHS);
8638 def_builtin ("__MHSETLOS", sw1_ftype_sw1_int, FRV_BUILTIN_MHSETLOS);
8639 def_builtin ("__MHSETHIS", sw1_ftype_sw1_int, FRV_BUILTIN_MHSETHIS);
8640 def_builtin ("__MHDSETS", sw1_ftype_int, FRV_BUILTIN_MHDSETS);
8641 def_builtin ("__MHSETLOH", uw1_ftype_uw1_int, FRV_BUILTIN_MHSETLOH);
8642 def_builtin ("__MHSETHIH", uw1_ftype_uw1_int, FRV_BUILTIN_MHSETHIH);
8643 def_builtin ("__MHDSETH", uw1_ftype_uw1_int, FRV_BUILTIN_MHDSETH);
8644 def_builtin ("__MQLCLRHS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQLCLRHS);
8645 def_builtin ("__MQLMTHS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQLMTHS);
8646 def_builtin ("__MQSLLHI", uw2_ftype_uw2_int, FRV_BUILTIN_MQSLLHI);
8647 def_builtin ("__MQSRAHI", sw2_ftype_sw2_int, FRV_BUILTIN_MQSRAHI);
8648 def_builtin ("__SMUL", sw2_ftype_sw1_sw1, FRV_BUILTIN_SMUL);
8649 def_builtin ("__UMUL", uw2_ftype_uw1_uw1, FRV_BUILTIN_UMUL);
8650 def_builtin ("__SMASS", void_ftype_sw1_sw1, FRV_BUILTIN_SMASS);
8651 def_builtin ("__SMSSS", void_ftype_sw1_sw1, FRV_BUILTIN_SMSSS);
8652 def_builtin ("__SMU", void_ftype_sw1_sw1, FRV_BUILTIN_SMU);
8653 def_builtin ("__ADDSS", sw1_ftype_sw1_sw1, FRV_BUILTIN_ADDSS);
8654 def_builtin ("__SUBSS", sw1_ftype_sw1_sw1, FRV_BUILTIN_SUBSS);
8655 def_builtin ("__SLASS", sw1_ftype_sw1_sw1, FRV_BUILTIN_SLASS);
8656 def_builtin ("__SCAN", sw1_ftype_sw1_sw1, FRV_BUILTIN_SCAN);
8657 def_builtin ("__SCUTSS", sw1_ftype_sw1, FRV_BUILTIN_SCUTSS);
8658 def_builtin ("__IACCreadll", sw2_ftype_iacc, FRV_BUILTIN_IACCreadll);
8659 def_builtin ("__IACCreadl", sw1_ftype_iacc, FRV_BUILTIN_IACCreadl);
8660 def_builtin ("__IACCsetll", void_ftype_iacc_sw2, FRV_BUILTIN_IACCsetll);
8661 def_builtin ("__IACCsetl", void_ftype_iacc_sw1, FRV_BUILTIN_IACCsetl);
8662 def_builtin ("__data_prefetch0", void_ftype_ptr, FRV_BUILTIN_PREFETCH0);
8663 def_builtin ("__data_prefetch", void_ftype_ptr, FRV_BUILTIN_PREFETCH);
8664 def_builtin ("__builtin_read8", uw1_ftype_vptr, FRV_BUILTIN_READ8);
8665 def_builtin ("__builtin_read16", uw1_ftype_vptr, FRV_BUILTIN_READ16);
8666 def_builtin ("__builtin_read32", uw1_ftype_vptr, FRV_BUILTIN_READ32);
8667 def_builtin ("__builtin_read64", uw2_ftype_vptr, FRV_BUILTIN_READ64);
8669 def_builtin ("__builtin_write8", void_ftype_vptr_ub, FRV_BUILTIN_WRITE8);
8670 def_builtin ("__builtin_write16", void_ftype_vptr_uh, FRV_BUILTIN_WRITE16);
8671 def_builtin ("__builtin_write32", void_ftype_vptr_uw1, FRV_BUILTIN_WRITE32);
8672 def_builtin ("__builtin_write64", void_ftype_vptr_uw2, FRV_BUILTIN_WRITE64);
8674 #undef UNARY
8675 #undef BINARY
8676 #undef TRINARY
8677 #undef QUAD
8680 /* Set the names for various arithmetic operations according to the
8681 FRV ABI. */
8682 static void
8683 frv_init_libfuncs (void)
8685 set_optab_libfunc (smod_optab, SImode, "__modi");
8686 set_optab_libfunc (umod_optab, SImode, "__umodi");
8688 set_optab_libfunc (add_optab, DImode, "__addll");
8689 set_optab_libfunc (sub_optab, DImode, "__subll");
8690 set_optab_libfunc (smul_optab, DImode, "__mulll");
8691 set_optab_libfunc (sdiv_optab, DImode, "__divll");
8692 set_optab_libfunc (smod_optab, DImode, "__modll");
8693 set_optab_libfunc (umod_optab, DImode, "__umodll");
8694 set_optab_libfunc (and_optab, DImode, "__andll");
8695 set_optab_libfunc (ior_optab, DImode, "__orll");
8696 set_optab_libfunc (xor_optab, DImode, "__xorll");
8697 set_optab_libfunc (one_cmpl_optab, DImode, "__notll");
8699 set_optab_libfunc (add_optab, SFmode, "__addf");
8700 set_optab_libfunc (sub_optab, SFmode, "__subf");
8701 set_optab_libfunc (smul_optab, SFmode, "__mulf");
8702 set_optab_libfunc (sdiv_optab, SFmode, "__divf");
8704 set_optab_libfunc (add_optab, DFmode, "__addd");
8705 set_optab_libfunc (sub_optab, DFmode, "__subd");
8706 set_optab_libfunc (smul_optab, DFmode, "__muld");
8707 set_optab_libfunc (sdiv_optab, DFmode, "__divd");
8709 set_conv_libfunc (sext_optab, DFmode, SFmode, "__ftod");
8710 set_conv_libfunc (trunc_optab, SFmode, DFmode, "__dtof");
8712 set_conv_libfunc (sfix_optab, SImode, SFmode, "__ftoi");
8713 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftoll");
8714 set_conv_libfunc (sfix_optab, SImode, DFmode, "__dtoi");
8715 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtoll");
8717 set_conv_libfunc (ufix_optab, SImode, SFmode, "__ftoui");
8718 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoull");
8719 set_conv_libfunc (ufix_optab, SImode, DFmode, "__dtoui");
8720 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoull");
8722 set_conv_libfunc (sfloat_optab, SFmode, SImode, "__itof");
8723 set_conv_libfunc (sfloat_optab, SFmode, DImode, "__lltof");
8724 set_conv_libfunc (sfloat_optab, DFmode, SImode, "__itod");
8725 set_conv_libfunc (sfloat_optab, DFmode, DImode, "__lltod");
8728 /* Convert an integer constant to an accumulator register. ICODE is the
8729 code of the target instruction, OPNUM is the number of the
8730 accumulator operand and OPVAL is the constant integer. Try both
8731 ACC and ACCG registers; only report an error if neither fit the
8732 instruction. */
8734 static rtx
8735 frv_int_to_acc (enum insn_code icode, int opnum, rtx opval)
8737 rtx reg;
8738 int i;
8740 /* ACCs and ACCGs are implicit global registers if media intrinsics
8741 are being used. We set up this lazily to avoid creating lots of
8742 unnecessary call_insn rtl in non-media code. */
8743 for (i = 0; i <= ACC_MASK; i++)
8744 if ((i & ACC_MASK) == i)
8745 global_regs[i + ACC_FIRST] = global_regs[i + ACCG_FIRST] = 1;
8747 if (GET_CODE (opval) != CONST_INT)
8749 error ("accumulator is not a constant integer");
8750 return NULL_RTX;
8752 if ((INTVAL (opval) & ~ACC_MASK) != 0)
8754 error ("accumulator number is out of bounds");
8755 return NULL_RTX;
8758 reg = gen_rtx_REG (insn_data[icode].operand[opnum].mode,
8759 ACC_FIRST + INTVAL (opval));
8760 if (! (*insn_data[icode].operand[opnum].predicate) (reg, VOIDmode))
8761 SET_REGNO (reg, ACCG_FIRST + INTVAL (opval));
8763 if (! (*insn_data[icode].operand[opnum].predicate) (reg, VOIDmode))
8765 error ("inappropriate accumulator for %qs", insn_data[icode].name);
8766 return NULL_RTX;
8768 return reg;
8771 /* If an ACC rtx has mode MODE, return the mode that the matching ACCG
8772 should have. */
8774 static enum machine_mode
8775 frv_matching_accg_mode (enum machine_mode mode)
8777 switch (mode)
8779 case V4SImode:
8780 return V4QImode;
8782 case DImode:
8783 return HImode;
8785 case SImode:
8786 return QImode;
8788 default:
8789 gcc_unreachable ();
8793 /* Given that a __builtin_read or __builtin_write function is accessing
8794 address ADDRESS, return the value that should be used as operand 1
8795 of the membar. */
8797 static rtx
8798 frv_io_address_cookie (rtx address)
8800 return (GET_CODE (address) == CONST_INT
8801 ? GEN_INT (INTVAL (address) / 8 * 8)
8802 : const0_rtx);
8805 /* Return the accumulator guard that should be paired with accumulator
8806 register ACC. The mode of the returned register is in the same
8807 class as ACC, but is four times smaller. */
8810 frv_matching_accg_for_acc (rtx acc)
8812 return gen_rtx_REG (frv_matching_accg_mode (GET_MODE (acc)),
8813 REGNO (acc) - ACC_FIRST + ACCG_FIRST);
8816 /* Read the requested argument from the call EXP given by INDEX.
8817 Return the value as an rtx. */
8819 static rtx
8820 frv_read_argument (tree exp, unsigned int index)
8822 return expand_expr (CALL_EXPR_ARG (exp, index),
8823 NULL_RTX, VOIDmode, 0);
8826 /* Like frv_read_argument, but interpret the argument as the number
8827 of an IACC register and return a (reg:MODE ...) rtx for it. */
8829 static rtx
8830 frv_read_iacc_argument (enum machine_mode mode, tree call,
8831 unsigned int index)
8833 int i, regno;
8834 rtx op;
8836 op = frv_read_argument (call, index);
8837 if (GET_CODE (op) != CONST_INT
8838 || INTVAL (op) < 0
8839 || INTVAL (op) > IACC_LAST - IACC_FIRST
8840 || ((INTVAL (op) * 4) & (GET_MODE_SIZE (mode) - 1)) != 0)
8842 error ("invalid IACC argument");
8843 op = const0_rtx;
8846 /* IACCs are implicit global registers. We set up this lazily to
8847 avoid creating lots of unnecessary call_insn rtl when IACCs aren't
8848 being used. */
8849 regno = INTVAL (op) + IACC_FIRST;
8850 for (i = 0; i < HARD_REGNO_NREGS (regno, mode); i++)
8851 global_regs[regno + i] = 1;
8853 return gen_rtx_REG (mode, regno);
8856 /* Return true if OPVAL can be used for operand OPNUM of instruction ICODE.
8857 The instruction should require a constant operand of some sort. The
8858 function prints an error if OPVAL is not valid. */
8860 static int
8861 frv_check_constant_argument (enum insn_code icode, int opnum, rtx opval)
8863 if (GET_CODE (opval) != CONST_INT)
8865 error ("%qs expects a constant argument", insn_data[icode].name);
8866 return FALSE;
8868 if (! (*insn_data[icode].operand[opnum].predicate) (opval, VOIDmode))
8870 error ("constant argument out of range for %qs", insn_data[icode].name);
8871 return FALSE;
8873 return TRUE;
8876 /* Return a legitimate rtx for instruction ICODE's return value. Use TARGET
8877 if it's not null, has the right mode, and satisfies operand 0's
8878 predicate. */
8880 static rtx
8881 frv_legitimize_target (enum insn_code icode, rtx target)
8883 enum machine_mode mode = insn_data[icode].operand[0].mode;
8885 if (! target
8886 || GET_MODE (target) != mode
8887 || ! (*insn_data[icode].operand[0].predicate) (target, mode))
8888 return gen_reg_rtx (mode);
8889 else
8890 return target;
8893 /* Given that ARG is being passed as operand OPNUM to instruction ICODE,
8894 check whether ARG satisfies the operand's constraints. If it doesn't,
8895 copy ARG to a temporary register and return that. Otherwise return ARG
8896 itself. */
8898 static rtx
8899 frv_legitimize_argument (enum insn_code icode, int opnum, rtx arg)
8901 enum machine_mode mode = insn_data[icode].operand[opnum].mode;
8903 if ((*insn_data[icode].operand[opnum].predicate) (arg, mode))
8904 return arg;
8905 else
8906 return copy_to_mode_reg (mode, arg);
8909 /* Return a volatile memory reference of mode MODE whose address is ARG. */
8911 static rtx
8912 frv_volatile_memref (enum machine_mode mode, rtx arg)
8914 rtx mem;
8916 mem = gen_rtx_MEM (mode, memory_address (mode, arg));
8917 MEM_VOLATILE_P (mem) = 1;
8918 return mem;
8921 /* Expand builtins that take a single, constant argument. At the moment,
8922 only MHDSETS falls into this category. */
8924 static rtx
8925 frv_expand_set_builtin (enum insn_code icode, tree call, rtx target)
8927 rtx pat;
8928 rtx op0 = frv_read_argument (call, 0);
8930 if (! frv_check_constant_argument (icode, 1, op0))
8931 return NULL_RTX;
8933 target = frv_legitimize_target (icode, target);
8934 pat = GEN_FCN (icode) (target, op0);
8935 if (! pat)
8936 return NULL_RTX;
8938 emit_insn (pat);
8939 return target;
8942 /* Expand builtins that take one operand. */
8944 static rtx
8945 frv_expand_unop_builtin (enum insn_code icode, tree call, rtx target)
8947 rtx pat;
8948 rtx op0 = frv_read_argument (call, 0);
8950 target = frv_legitimize_target (icode, target);
8951 op0 = frv_legitimize_argument (icode, 1, op0);
8952 pat = GEN_FCN (icode) (target, op0);
8953 if (! pat)
8954 return NULL_RTX;
8956 emit_insn (pat);
8957 return target;
8960 /* Expand builtins that take two operands. */
8962 static rtx
8963 frv_expand_binop_builtin (enum insn_code icode, tree call, rtx target)
8965 rtx pat;
8966 rtx op0 = frv_read_argument (call, 0);
8967 rtx op1 = frv_read_argument (call, 1);
8969 target = frv_legitimize_target (icode, target);
8970 op0 = frv_legitimize_argument (icode, 1, op0);
8971 op1 = frv_legitimize_argument (icode, 2, op1);
8972 pat = GEN_FCN (icode) (target, op0, op1);
8973 if (! pat)
8974 return NULL_RTX;
8976 emit_insn (pat);
8977 return target;
8980 /* Expand cut-style builtins, which take two operands and an implicit ACCG
8981 one. */
8983 static rtx
8984 frv_expand_cut_builtin (enum insn_code icode, tree call, rtx target)
8986 rtx pat;
8987 rtx op0 = frv_read_argument (call, 0);
8988 rtx op1 = frv_read_argument (call, 1);
8989 rtx op2;
8991 target = frv_legitimize_target (icode, target);
8992 op0 = frv_int_to_acc (icode, 1, op0);
8993 if (! op0)
8994 return NULL_RTX;
8996 if (icode == CODE_FOR_mdcutssi || GET_CODE (op1) == CONST_INT)
8998 if (! frv_check_constant_argument (icode, 2, op1))
8999 return NULL_RTX;
9001 else
9002 op1 = frv_legitimize_argument (icode, 2, op1);
9004 op2 = frv_matching_accg_for_acc (op0);
9005 pat = GEN_FCN (icode) (target, op0, op1, op2);
9006 if (! pat)
9007 return NULL_RTX;
9009 emit_insn (pat);
9010 return target;
9013 /* Expand builtins that take two operands and the second is immediate. */
9015 static rtx
9016 frv_expand_binopimm_builtin (enum insn_code icode, tree call, rtx target)
9018 rtx pat;
9019 rtx op0 = frv_read_argument (call, 0);
9020 rtx op1 = frv_read_argument (call, 1);
9022 if (! frv_check_constant_argument (icode, 2, op1))
9023 return NULL_RTX;
9025 target = frv_legitimize_target (icode, target);
9026 op0 = frv_legitimize_argument (icode, 1, op0);
9027 pat = GEN_FCN (icode) (target, op0, op1);
9028 if (! pat)
9029 return NULL_RTX;
9031 emit_insn (pat);
9032 return target;
9035 /* Expand builtins that take two operands, the first operand being a pointer to
9036 ints and return void. */
9038 static rtx
9039 frv_expand_voidbinop_builtin (enum insn_code icode, tree call)
9041 rtx pat;
9042 rtx op0 = frv_read_argument (call, 0);
9043 rtx op1 = frv_read_argument (call, 1);
9044 enum machine_mode mode0 = insn_data[icode].operand[0].mode;
9045 rtx addr;
9047 if (GET_CODE (op0) != MEM)
9049 rtx reg = op0;
9051 if (! offsettable_address_p (0, mode0, op0))
9053 reg = gen_reg_rtx (Pmode);
9054 emit_insn (gen_rtx_SET (VOIDmode, reg, op0));
9057 op0 = gen_rtx_MEM (SImode, reg);
9060 addr = XEXP (op0, 0);
9061 if (! offsettable_address_p (0, mode0, addr))
9062 addr = copy_to_mode_reg (Pmode, op0);
9064 op0 = change_address (op0, V4SImode, addr);
9065 op1 = frv_legitimize_argument (icode, 1, op1);
9066 pat = GEN_FCN (icode) (op0, op1);
9067 if (! pat)
9068 return 0;
9070 emit_insn (pat);
9071 return 0;
9074 /* Expand builtins that take two long operands and return void. */
9076 static rtx
9077 frv_expand_int_void2arg (enum insn_code icode, tree call)
9079 rtx pat;
9080 rtx op0 = frv_read_argument (call, 0);
9081 rtx op1 = frv_read_argument (call, 1);
9083 op0 = frv_legitimize_argument (icode, 1, op0);
9084 op1 = frv_legitimize_argument (icode, 1, op1);
9085 pat = GEN_FCN (icode) (op0, op1);
9086 if (! pat)
9087 return NULL_RTX;
9089 emit_insn (pat);
9090 return NULL_RTX;
9093 /* Expand prefetch builtins. These take a single address as argument. */
9095 static rtx
9096 frv_expand_prefetches (enum insn_code icode, tree call)
9098 rtx pat;
9099 rtx op0 = frv_read_argument (call, 0);
9101 pat = GEN_FCN (icode) (force_reg (Pmode, op0));
9102 if (! pat)
9103 return 0;
9105 emit_insn (pat);
9106 return 0;
9109 /* Expand builtins that take three operands and return void. The first
9110 argument must be a constant that describes a pair or quad accumulators. A
9111 fourth argument is created that is the accumulator guard register that
9112 corresponds to the accumulator. */
9114 static rtx
9115 frv_expand_voidtriop_builtin (enum insn_code icode, tree call)
9117 rtx pat;
9118 rtx op0 = frv_read_argument (call, 0);
9119 rtx op1 = frv_read_argument (call, 1);
9120 rtx op2 = frv_read_argument (call, 2);
9121 rtx op3;
9123 op0 = frv_int_to_acc (icode, 0, op0);
9124 if (! op0)
9125 return NULL_RTX;
9127 op1 = frv_legitimize_argument (icode, 1, op1);
9128 op2 = frv_legitimize_argument (icode, 2, op2);
9129 op3 = frv_matching_accg_for_acc (op0);
9130 pat = GEN_FCN (icode) (op0, op1, op2, op3);
9131 if (! pat)
9132 return NULL_RTX;
9134 emit_insn (pat);
9135 return NULL_RTX;
9138 /* Expand builtins that perform accumulator-to-accumulator operations.
9139 These builtins take two accumulator numbers as argument and return
9140 void. */
9142 static rtx
9143 frv_expand_voidaccop_builtin (enum insn_code icode, tree call)
9145 rtx pat;
9146 rtx op0 = frv_read_argument (call, 0);
9147 rtx op1 = frv_read_argument (call, 1);
9148 rtx op2;
9149 rtx op3;
9151 op0 = frv_int_to_acc (icode, 0, op0);
9152 if (! op0)
9153 return NULL_RTX;
9155 op1 = frv_int_to_acc (icode, 1, op1);
9156 if (! op1)
9157 return NULL_RTX;
9159 op2 = frv_matching_accg_for_acc (op0);
9160 op3 = frv_matching_accg_for_acc (op1);
9161 pat = GEN_FCN (icode) (op0, op1, op2, op3);
9162 if (! pat)
9163 return NULL_RTX;
9165 emit_insn (pat);
9166 return NULL_RTX;
9169 /* Expand a __builtin_read* function. ICODE is the instruction code for the
9170 membar and TARGET_MODE is the mode that the loaded value should have. */
9172 static rtx
9173 frv_expand_load_builtin (enum insn_code icode, enum machine_mode target_mode,
9174 tree call, rtx target)
9176 rtx op0 = frv_read_argument (call, 0);
9177 rtx cookie = frv_io_address_cookie (op0);
9179 if (target == 0 || !REG_P (target))
9180 target = gen_reg_rtx (target_mode);
9181 op0 = frv_volatile_memref (insn_data[icode].operand[0].mode, op0);
9182 convert_move (target, op0, 1);
9183 emit_insn (GEN_FCN (icode) (copy_rtx (op0), cookie, GEN_INT (FRV_IO_READ)));
9184 cfun->machine->has_membar_p = 1;
9185 return target;
9188 /* Likewise __builtin_write* functions. */
9190 static rtx
9191 frv_expand_store_builtin (enum insn_code icode, tree call)
9193 rtx op0 = frv_read_argument (call, 0);
9194 rtx op1 = frv_read_argument (call, 1);
9195 rtx cookie = frv_io_address_cookie (op0);
9197 op0 = frv_volatile_memref (insn_data[icode].operand[0].mode, op0);
9198 convert_move (op0, force_reg (insn_data[icode].operand[0].mode, op1), 1);
9199 emit_insn (GEN_FCN (icode) (copy_rtx (op0), cookie, GEN_INT (FRV_IO_WRITE)));
9200 cfun->machine->has_membar_p = 1;
9201 return NULL_RTX;
9204 /* Expand the MDPACKH builtin. It takes four unsigned short arguments and
9205 each argument forms one word of the two double-word input registers.
9206 CALL is the tree for the call and TARGET, if nonnull, suggests a good place
9207 to put the return value. */
9209 static rtx
9210 frv_expand_mdpackh_builtin (tree call, rtx target)
9212 enum insn_code icode = CODE_FOR_mdpackh;
9213 rtx pat, op0, op1;
9214 rtx arg1 = frv_read_argument (call, 0);
9215 rtx arg2 = frv_read_argument (call, 1);
9216 rtx arg3 = frv_read_argument (call, 2);
9217 rtx arg4 = frv_read_argument (call, 3);
9219 target = frv_legitimize_target (icode, target);
9220 op0 = gen_reg_rtx (DImode);
9221 op1 = gen_reg_rtx (DImode);
9223 /* The high half of each word is not explicitly initialized, so indicate
9224 that the input operands are not live before this point. */
9225 emit_clobber (op0);
9226 emit_clobber (op1);
9228 /* Move each argument into the low half of its associated input word. */
9229 emit_move_insn (simplify_gen_subreg (HImode, op0, DImode, 2), arg1);
9230 emit_move_insn (simplify_gen_subreg (HImode, op0, DImode, 6), arg2);
9231 emit_move_insn (simplify_gen_subreg (HImode, op1, DImode, 2), arg3);
9232 emit_move_insn (simplify_gen_subreg (HImode, op1, DImode, 6), arg4);
9234 pat = GEN_FCN (icode) (target, op0, op1);
9235 if (! pat)
9236 return NULL_RTX;
9238 emit_insn (pat);
9239 return target;
9242 /* Expand the MCLRACC builtin. This builtin takes a single accumulator
9243 number as argument. */
9245 static rtx
9246 frv_expand_mclracc_builtin (tree call)
9248 enum insn_code icode = CODE_FOR_mclracc;
9249 rtx pat;
9250 rtx op0 = frv_read_argument (call, 0);
9252 op0 = frv_int_to_acc (icode, 0, op0);
9253 if (! op0)
9254 return NULL_RTX;
9256 pat = GEN_FCN (icode) (op0);
9257 if (pat)
9258 emit_insn (pat);
9260 return NULL_RTX;
9263 /* Expand builtins that take no arguments. */
9265 static rtx
9266 frv_expand_noargs_builtin (enum insn_code icode)
9268 rtx pat = GEN_FCN (icode) (const0_rtx);
9269 if (pat)
9270 emit_insn (pat);
9272 return NULL_RTX;
9275 /* Expand MRDACC and MRDACCG. These builtins take a single accumulator
9276 number or accumulator guard number as argument and return an SI integer. */
9278 static rtx
9279 frv_expand_mrdacc_builtin (enum insn_code icode, tree call)
9281 rtx pat;
9282 rtx target = gen_reg_rtx (SImode);
9283 rtx op0 = frv_read_argument (call, 0);
9285 op0 = frv_int_to_acc (icode, 1, op0);
9286 if (! op0)
9287 return NULL_RTX;
9289 pat = GEN_FCN (icode) (target, op0);
9290 if (! pat)
9291 return NULL_RTX;
9293 emit_insn (pat);
9294 return target;
9297 /* Expand MWTACC and MWTACCG. These builtins take an accumulator or
9298 accumulator guard as their first argument and an SImode value as their
9299 second. */
9301 static rtx
9302 frv_expand_mwtacc_builtin (enum insn_code icode, tree call)
9304 rtx pat;
9305 rtx op0 = frv_read_argument (call, 0);
9306 rtx op1 = frv_read_argument (call, 1);
9308 op0 = frv_int_to_acc (icode, 0, op0);
9309 if (! op0)
9310 return NULL_RTX;
9312 op1 = frv_legitimize_argument (icode, 1, op1);
9313 pat = GEN_FCN (icode) (op0, op1);
9314 if (pat)
9315 emit_insn (pat);
9317 return NULL_RTX;
9320 /* Emit a move from SRC to DEST in SImode chunks. This can be used
9321 to move DImode values into and out of IACC0. */
9323 static void
9324 frv_split_iacc_move (rtx dest, rtx src)
9326 enum machine_mode inner;
9327 int i;
9329 inner = GET_MODE (dest);
9330 for (i = 0; i < GET_MODE_SIZE (inner); i += GET_MODE_SIZE (SImode))
9331 emit_move_insn (simplify_gen_subreg (SImode, dest, inner, i),
9332 simplify_gen_subreg (SImode, src, inner, i));
9335 /* Expand builtins. */
9337 static rtx
9338 frv_expand_builtin (tree exp,
9339 rtx target,
9340 rtx subtarget ATTRIBUTE_UNUSED,
9341 enum machine_mode mode ATTRIBUTE_UNUSED,
9342 int ignore ATTRIBUTE_UNUSED)
9344 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
9345 unsigned fcode = (unsigned)DECL_FUNCTION_CODE (fndecl);
9346 unsigned i;
9347 struct builtin_description *d;
9349 if (fcode < FRV_BUILTIN_FIRST_NONMEDIA && !TARGET_MEDIA)
9351 error ("media functions are not available unless -mmedia is used");
9352 return NULL_RTX;
9355 switch (fcode)
9357 case FRV_BUILTIN_MCOP1:
9358 case FRV_BUILTIN_MCOP2:
9359 case FRV_BUILTIN_MDUNPACKH:
9360 case FRV_BUILTIN_MBTOHE:
9361 if (! TARGET_MEDIA_REV1)
9363 error ("this media function is only available on the fr500");
9364 return NULL_RTX;
9366 break;
9368 case FRV_BUILTIN_MQXMACHS:
9369 case FRV_BUILTIN_MQXMACXHS:
9370 case FRV_BUILTIN_MQMACXHS:
9371 case FRV_BUILTIN_MADDACCS:
9372 case FRV_BUILTIN_MSUBACCS:
9373 case FRV_BUILTIN_MASACCS:
9374 case FRV_BUILTIN_MDADDACCS:
9375 case FRV_BUILTIN_MDSUBACCS:
9376 case FRV_BUILTIN_MDASACCS:
9377 case FRV_BUILTIN_MABSHS:
9378 case FRV_BUILTIN_MDROTLI:
9379 case FRV_BUILTIN_MCPLHI:
9380 case FRV_BUILTIN_MCPLI:
9381 case FRV_BUILTIN_MDCUTSSI:
9382 case FRV_BUILTIN_MQSATHS:
9383 case FRV_BUILTIN_MHSETLOS:
9384 case FRV_BUILTIN_MHSETLOH:
9385 case FRV_BUILTIN_MHSETHIS:
9386 case FRV_BUILTIN_MHSETHIH:
9387 case FRV_BUILTIN_MHDSETS:
9388 case FRV_BUILTIN_MHDSETH:
9389 if (! TARGET_MEDIA_REV2)
9391 error ("this media function is only available on the fr400"
9392 " and fr550");
9393 return NULL_RTX;
9395 break;
9397 case FRV_BUILTIN_SMASS:
9398 case FRV_BUILTIN_SMSSS:
9399 case FRV_BUILTIN_SMU:
9400 case FRV_BUILTIN_ADDSS:
9401 case FRV_BUILTIN_SUBSS:
9402 case FRV_BUILTIN_SLASS:
9403 case FRV_BUILTIN_SCUTSS:
9404 case FRV_BUILTIN_IACCreadll:
9405 case FRV_BUILTIN_IACCreadl:
9406 case FRV_BUILTIN_IACCsetll:
9407 case FRV_BUILTIN_IACCsetl:
9408 if (!TARGET_FR405_BUILTINS)
9410 error ("this builtin function is only available"
9411 " on the fr405 and fr450");
9412 return NULL_RTX;
9414 break;
9416 case FRV_BUILTIN_PREFETCH:
9417 if (!TARGET_FR500_FR550_BUILTINS)
9419 error ("this builtin function is only available on the fr500"
9420 " and fr550");
9421 return NULL_RTX;
9423 break;
9425 case FRV_BUILTIN_MQLCLRHS:
9426 case FRV_BUILTIN_MQLMTHS:
9427 case FRV_BUILTIN_MQSLLHI:
9428 case FRV_BUILTIN_MQSRAHI:
9429 if (!TARGET_MEDIA_FR450)
9431 error ("this builtin function is only available on the fr450");
9432 return NULL_RTX;
9434 break;
9436 default:
9437 break;
9440 /* Expand unique builtins. */
9442 switch (fcode)
9444 case FRV_BUILTIN_MTRAP:
9445 return frv_expand_noargs_builtin (CODE_FOR_mtrap);
9447 case FRV_BUILTIN_MCLRACC:
9448 return frv_expand_mclracc_builtin (exp);
9450 case FRV_BUILTIN_MCLRACCA:
9451 if (TARGET_ACC_8)
9452 return frv_expand_noargs_builtin (CODE_FOR_mclracca8);
9453 else
9454 return frv_expand_noargs_builtin (CODE_FOR_mclracca4);
9456 case FRV_BUILTIN_MRDACC:
9457 return frv_expand_mrdacc_builtin (CODE_FOR_mrdacc, exp);
9459 case FRV_BUILTIN_MRDACCG:
9460 return frv_expand_mrdacc_builtin (CODE_FOR_mrdaccg, exp);
9462 case FRV_BUILTIN_MWTACC:
9463 return frv_expand_mwtacc_builtin (CODE_FOR_mwtacc, exp);
9465 case FRV_BUILTIN_MWTACCG:
9466 return frv_expand_mwtacc_builtin (CODE_FOR_mwtaccg, exp);
9468 case FRV_BUILTIN_MDPACKH:
9469 return frv_expand_mdpackh_builtin (exp, target);
9471 case FRV_BUILTIN_IACCreadll:
9473 rtx src = frv_read_iacc_argument (DImode, exp, 0);
9474 if (target == 0 || !REG_P (target))
9475 target = gen_reg_rtx (DImode);
9476 frv_split_iacc_move (target, src);
9477 return target;
9480 case FRV_BUILTIN_IACCreadl:
9481 return frv_read_iacc_argument (SImode, exp, 0);
9483 case FRV_BUILTIN_IACCsetll:
9485 rtx dest = frv_read_iacc_argument (DImode, exp, 0);
9486 rtx src = frv_read_argument (exp, 1);
9487 frv_split_iacc_move (dest, force_reg (DImode, src));
9488 return 0;
9491 case FRV_BUILTIN_IACCsetl:
9493 rtx dest = frv_read_iacc_argument (SImode, exp, 0);
9494 rtx src = frv_read_argument (exp, 1);
9495 emit_move_insn (dest, force_reg (SImode, src));
9496 return 0;
9499 default:
9500 break;
9503 /* Expand groups of builtins. */
9505 for (i = 0, d = bdesc_set; i < ARRAY_SIZE (bdesc_set); i++, d++)
9506 if (d->code == fcode)
9507 return frv_expand_set_builtin (d->icode, exp, target);
9509 for (i = 0, d = bdesc_1arg; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
9510 if (d->code == fcode)
9511 return frv_expand_unop_builtin (d->icode, exp, target);
9513 for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
9514 if (d->code == fcode)
9515 return frv_expand_binop_builtin (d->icode, exp, target);
9517 for (i = 0, d = bdesc_cut; i < ARRAY_SIZE (bdesc_cut); i++, d++)
9518 if (d->code == fcode)
9519 return frv_expand_cut_builtin (d->icode, exp, target);
9521 for (i = 0, d = bdesc_2argimm; i < ARRAY_SIZE (bdesc_2argimm); i++, d++)
9522 if (d->code == fcode)
9523 return frv_expand_binopimm_builtin (d->icode, exp, target);
9525 for (i = 0, d = bdesc_void2arg; i < ARRAY_SIZE (bdesc_void2arg); i++, d++)
9526 if (d->code == fcode)
9527 return frv_expand_voidbinop_builtin (d->icode, exp);
9529 for (i = 0, d = bdesc_void3arg; i < ARRAY_SIZE (bdesc_void3arg); i++, d++)
9530 if (d->code == fcode)
9531 return frv_expand_voidtriop_builtin (d->icode, exp);
9533 for (i = 0, d = bdesc_voidacc; i < ARRAY_SIZE (bdesc_voidacc); i++, d++)
9534 if (d->code == fcode)
9535 return frv_expand_voidaccop_builtin (d->icode, exp);
9537 for (i = 0, d = bdesc_int_void2arg;
9538 i < ARRAY_SIZE (bdesc_int_void2arg); i++, d++)
9539 if (d->code == fcode)
9540 return frv_expand_int_void2arg (d->icode, exp);
9542 for (i = 0, d = bdesc_prefetches;
9543 i < ARRAY_SIZE (bdesc_prefetches); i++, d++)
9544 if (d->code == fcode)
9545 return frv_expand_prefetches (d->icode, exp);
9547 for (i = 0, d = bdesc_loads; i < ARRAY_SIZE (bdesc_loads); i++, d++)
9548 if (d->code == fcode)
9549 return frv_expand_load_builtin (d->icode, TYPE_MODE (TREE_TYPE (exp)),
9550 exp, target);
9552 for (i = 0, d = bdesc_stores; i < ARRAY_SIZE (bdesc_stores); i++, d++)
9553 if (d->code == fcode)
9554 return frv_expand_store_builtin (d->icode, exp);
9556 return 0;
9559 static bool
9560 frv_in_small_data_p (const_tree decl)
9562 HOST_WIDE_INT size;
9563 const_tree section_name;
9565 /* Don't apply the -G flag to internal compiler structures. We
9566 should leave such structures in the main data section, partly
9567 for efficiency and partly because the size of some of them
9568 (such as C++ typeinfos) is not known until later. */
9569 if (TREE_CODE (decl) != VAR_DECL || DECL_ARTIFICIAL (decl))
9570 return false;
9572 /* If we already know which section the decl should be in, see if
9573 it's a small data section. */
9574 section_name = DECL_SECTION_NAME (decl);
9575 if (section_name)
9577 gcc_assert (TREE_CODE (section_name) == STRING_CST);
9578 if (frv_string_begins_with (section_name, ".sdata"))
9579 return true;
9580 if (frv_string_begins_with (section_name, ".sbss"))
9581 return true;
9582 return false;
9585 size = int_size_in_bytes (TREE_TYPE (decl));
9586 if (size > 0 && (unsigned HOST_WIDE_INT) size <= g_switch_value)
9587 return true;
9589 return false;
9592 static bool
9593 frv_rtx_costs (rtx x,
9594 int code ATTRIBUTE_UNUSED,
9595 int outer_code ATTRIBUTE_UNUSED,
9596 int *total,
9597 bool speed ATTRIBUTE_UNUSED)
9599 if (outer_code == MEM)
9601 /* Don't differentiate between memory addresses. All the ones
9602 we accept have equal cost. */
9603 *total = COSTS_N_INSNS (0);
9604 return true;
9607 switch (code)
9609 case CONST_INT:
9610 /* Make 12-bit integers really cheap. */
9611 if (IN_RANGE_P (INTVAL (x), -2048, 2047))
9613 *total = 0;
9614 return true;
9616 /* Fall through. */
9618 case CONST:
9619 case LABEL_REF:
9620 case SYMBOL_REF:
9621 case CONST_DOUBLE:
9622 *total = COSTS_N_INSNS (2);
9623 return true;
9625 case PLUS:
9626 case MINUS:
9627 case AND:
9628 case IOR:
9629 case XOR:
9630 case ASHIFT:
9631 case ASHIFTRT:
9632 case LSHIFTRT:
9633 case NOT:
9634 case NEG:
9635 case COMPARE:
9636 if (GET_MODE (x) == SImode)
9637 *total = COSTS_N_INSNS (1);
9638 else if (GET_MODE (x) == DImode)
9639 *total = COSTS_N_INSNS (2);
9640 else
9641 *total = COSTS_N_INSNS (3);
9642 return true;
9644 case MULT:
9645 if (GET_MODE (x) == SImode)
9646 *total = COSTS_N_INSNS (2);
9647 else
9648 *total = COSTS_N_INSNS (6); /* guess */
9649 return true;
9651 case DIV:
9652 case UDIV:
9653 case MOD:
9654 case UMOD:
9655 *total = COSTS_N_INSNS (18);
9656 return true;
9658 case MEM:
9659 *total = COSTS_N_INSNS (3);
9660 return true;
9662 default:
9663 return false;
9667 static void
9668 frv_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
9670 switch_to_section (ctors_section);
9671 assemble_align (POINTER_SIZE);
9672 if (TARGET_FDPIC)
9674 int ok = frv_assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
9676 gcc_assert (ok);
9677 return;
9679 assemble_integer_with_op ("\t.picptr\t", symbol);
9682 static void
9683 frv_asm_out_destructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
9685 switch_to_section (dtors_section);
9686 assemble_align (POINTER_SIZE);
9687 if (TARGET_FDPIC)
9689 int ok = frv_assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
9691 gcc_assert (ok);
9692 return;
9694 assemble_integer_with_op ("\t.picptr\t", symbol);
9697 /* Worker function for TARGET_STRUCT_VALUE_RTX. */
9699 static rtx
9700 frv_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
9701 int incoming ATTRIBUTE_UNUSED)
9703 return gen_rtx_REG (Pmode, FRV_STRUCT_VALUE_REGNUM);
9706 #define TLS_BIAS (2048 - 16)
9708 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
9709 We need to emit DTP-relative relocations. */
9711 static void
9712 frv_output_dwarf_dtprel (FILE *file, int size, rtx x)
9714 gcc_assert (size == 4);
9715 fputs ("\t.picptr\ttlsmoff(", file);
9716 /* We want the unbiased TLS offset, so add the bias to the
9717 expression, such that the implicit biasing cancels out. */
9718 output_addr_const (file, plus_constant (x, TLS_BIAS));
9719 fputs (")", file);
9722 #include "gt-frv.h"