2016-09-10 Bernd Edlinger <bernd.edlinger@hotmail.de>
[official-gcc.git] / gcc / config / frv / frv.c
blob4bfa8273aa31e87f4012a12b7555177938c7ac05
1 /* Copyright (C) 1997-2016 Free Software Foundation, Inc.
2 Contributed by Red Hat, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "target.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "df.h"
28 #include "tm_p.h"
29 #include "stringpool.h"
30 #include "optabs.h"
31 #include "regs.h"
32 #include "emit-rtl.h"
33 #include "recog.h"
34 #include "diagnostic-core.h"
35 #include "fold-const.h"
36 #include "varasm.h"
37 #include "stor-layout.h"
38 #include "output.h"
39 #include "insn-attr.h"
40 #include "explow.h"
41 #include "expr.h"
42 #include "cfgrtl.h"
43 #include "langhooks.h"
44 #include "dumpfile.h"
45 #include "builtins.h"
46 #include "ifcvt.h"
47 #include "rtl-iter.h"
49 /* This file should be included last. */
50 #include "target-def.h"
52 #ifndef FRV_INLINE
53 #define FRV_INLINE inline
54 #endif
56 /* The maximum number of distinct NOP patterns. There are three:
57 nop, fnop and mnop. */
58 #define NUM_NOP_PATTERNS 3
60 /* Classification of instructions and units: integer, floating-point/media,
61 branch and control. */
62 enum frv_insn_group { GROUP_I, GROUP_FM, GROUP_B, GROUP_C, NUM_GROUPS };
64 /* The DFA names of the units, in packet order. */
65 static const char *const frv_unit_names[] =
67 "c",
68 "i0", "f0",
69 "i1", "f1",
70 "i2", "f2",
71 "i3", "f3",
72 "b0", "b1"
75 /* The classification of each unit in frv_unit_names[]. */
76 static const enum frv_insn_group frv_unit_groups[ARRAY_SIZE (frv_unit_names)] =
78 GROUP_C,
79 GROUP_I, GROUP_FM,
80 GROUP_I, GROUP_FM,
81 GROUP_I, GROUP_FM,
82 GROUP_I, GROUP_FM,
83 GROUP_B, GROUP_B
86 /* Return the DFA unit code associated with the Nth unit of integer
87 or floating-point group GROUP, */
88 #define NTH_UNIT(GROUP, N) frv_unit_codes[(GROUP) + (N) * 2 + 1]
90 /* Return the number of integer or floating-point unit UNIT
91 (1 for I1, 2 for F2, etc.). */
92 #define UNIT_NUMBER(UNIT) (((UNIT) - 1) / 2)
94 /* The DFA unit number for each unit in frv_unit_names[]. */
95 static int frv_unit_codes[ARRAY_SIZE (frv_unit_names)];
97 /* FRV_TYPE_TO_UNIT[T] is the last unit in frv_unit_names[] that can issue
98 an instruction of type T. The value is ARRAY_SIZE (frv_unit_names) if
99 no instruction of type T has been seen. */
100 static unsigned int frv_type_to_unit[TYPE_UNKNOWN + 1];
102 /* An array of dummy nop INSNs, one for each type of nop that the
103 target supports. */
104 static GTY(()) rtx_insn *frv_nops[NUM_NOP_PATTERNS];
106 /* The number of nop instructions in frv_nops[]. */
107 static unsigned int frv_num_nops;
109 /* The type of access. FRV_IO_UNKNOWN means the access can be either
110 a read or a write. */
111 enum frv_io_type { FRV_IO_UNKNOWN, FRV_IO_READ, FRV_IO_WRITE };
113 /* Information about one __builtin_read or __builtin_write access, or
114 the combination of several such accesses. The most general value
115 is all-zeros (an unknown access to an unknown address). */
116 struct frv_io {
117 enum frv_io_type 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 /* Cached value of frv_stack_info. */
255 static frv_stack_t *frv_stack_cache = (frv_stack_t *)0;
257 /* Forward references */
259 static void frv_option_override (void);
260 static bool frv_legitimate_address_p (machine_mode, rtx, bool);
261 static int frv_default_flags_for_cpu (void);
262 static int frv_string_begins_with (const char *, const char *);
263 static FRV_INLINE bool frv_small_data_reloc_p (rtx, int);
264 static void frv_print_operand (FILE *, rtx, int);
265 static void frv_print_operand_address (FILE *, machine_mode, rtx);
266 static bool frv_print_operand_punct_valid_p (unsigned char code);
267 static void frv_print_operand_memory_reference_reg
268 (FILE *, rtx);
269 static void frv_print_operand_memory_reference (FILE *, rtx, int);
270 static int frv_print_operand_jump_hint (rtx_insn *);
271 static const char *comparison_string (enum rtx_code, rtx);
272 static rtx frv_function_value (const_tree, const_tree,
273 bool);
274 static rtx frv_libcall_value (machine_mode,
275 const_rtx);
276 static FRV_INLINE int frv_regno_ok_for_base_p (int, int);
277 static rtx single_set_pattern (rtx);
278 static int frv_function_contains_far_jump (void);
279 static rtx frv_alloc_temp_reg (frv_tmp_reg_t *,
280 enum reg_class,
281 machine_mode,
282 int, int);
283 static rtx frv_frame_offset_rtx (int);
284 static rtx frv_frame_mem (machine_mode, rtx, int);
285 static rtx frv_dwarf_store (rtx, int);
286 static void frv_frame_insn (rtx, rtx);
287 static void frv_frame_access (frv_frame_accessor_t*,
288 rtx, int);
289 static void frv_frame_access_multi (frv_frame_accessor_t*,
290 frv_stack_t *, int);
291 static void frv_frame_access_standard_regs (enum frv_stack_op,
292 frv_stack_t *);
293 static struct machine_function *frv_init_machine_status (void);
294 static rtx frv_int_to_acc (enum insn_code, int, rtx);
295 static machine_mode frv_matching_accg_mode (machine_mode);
296 static rtx frv_read_argument (tree, unsigned int);
297 static rtx frv_read_iacc_argument (machine_mode, tree, unsigned int);
298 static int frv_check_constant_argument (enum insn_code, int, rtx);
299 static rtx frv_legitimize_target (enum insn_code, rtx);
300 static rtx frv_legitimize_argument (enum insn_code, int, rtx);
301 static rtx frv_legitimize_tls_address (rtx, enum tls_model);
302 static rtx frv_legitimize_address (rtx, rtx, machine_mode);
303 static rtx frv_expand_set_builtin (enum insn_code, tree, rtx);
304 static rtx frv_expand_unop_builtin (enum insn_code, tree, rtx);
305 static rtx frv_expand_binop_builtin (enum insn_code, tree, rtx);
306 static rtx frv_expand_cut_builtin (enum insn_code, tree, rtx);
307 static rtx frv_expand_binopimm_builtin (enum insn_code, tree, rtx);
308 static rtx frv_expand_voidbinop_builtin (enum insn_code, tree);
309 static rtx frv_expand_int_void2arg (enum insn_code, tree);
310 static rtx frv_expand_prefetches (enum insn_code, tree);
311 static rtx frv_expand_voidtriop_builtin (enum insn_code, tree);
312 static rtx frv_expand_voidaccop_builtin (enum insn_code, tree);
313 static rtx frv_expand_mclracc_builtin (tree);
314 static rtx frv_expand_mrdacc_builtin (enum insn_code, tree);
315 static rtx frv_expand_mwtacc_builtin (enum insn_code, tree);
316 static rtx frv_expand_noargs_builtin (enum insn_code);
317 static void frv_split_iacc_move (rtx, rtx);
318 static rtx frv_emit_comparison (enum rtx_code, rtx, rtx);
319 static void frv_ifcvt_add_insn (rtx, rtx, int);
320 static rtx frv_ifcvt_rewrite_mem (rtx, machine_mode, rtx);
321 static rtx frv_ifcvt_load_value (rtx, rtx);
322 static unsigned int frv_insn_unit (rtx_insn *);
323 static bool frv_issues_to_branch_unit_p (rtx_insn *);
324 static int frv_cond_flags (rtx);
325 static bool frv_regstate_conflict_p (regstate_t, regstate_t);
326 static bool frv_registers_conflict_p (rtx);
327 static void frv_registers_update_1 (rtx, const_rtx, void *);
328 static void frv_registers_update (rtx);
329 static void frv_start_packet (void);
330 static void frv_start_packet_block (void);
331 static void frv_finish_packet (void (*) (void));
332 static bool frv_pack_insn_p (rtx_insn *);
333 static void frv_add_insn_to_packet (rtx_insn *);
334 static void frv_insert_nop_in_packet (rtx_insn *);
335 static bool frv_for_each_packet (void (*) (void));
336 static bool frv_sort_insn_group_1 (enum frv_insn_group,
337 unsigned int, unsigned int,
338 unsigned int, unsigned int,
339 state_t);
340 static int frv_compare_insns (const void *, const void *);
341 static void frv_sort_insn_group (enum frv_insn_group);
342 static void frv_reorder_packet (void);
343 static void frv_fill_unused_units (enum frv_insn_group);
344 static void frv_align_label (void);
345 static void frv_reorg_packet (void);
346 static void frv_register_nop (rtx);
347 static void frv_reorg (void);
348 static void frv_pack_insns (void);
349 static void frv_function_prologue (FILE *, HOST_WIDE_INT);
350 static void frv_function_epilogue (FILE *, HOST_WIDE_INT);
351 static bool frv_assemble_integer (rtx, unsigned, int);
352 static void frv_init_builtins (void);
353 static rtx frv_expand_builtin (tree, rtx, rtx, machine_mode, int);
354 static void frv_init_libfuncs (void);
355 static bool frv_in_small_data_p (const_tree);
356 static void frv_asm_output_mi_thunk
357 (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_INT, tree);
358 static void frv_setup_incoming_varargs (cumulative_args_t,
359 machine_mode,
360 tree, int *, int);
361 static rtx frv_expand_builtin_saveregs (void);
362 static void frv_expand_builtin_va_start (tree, rtx);
363 static bool frv_rtx_costs (rtx, machine_mode, int, int,
364 int*, bool);
365 static int frv_register_move_cost (machine_mode,
366 reg_class_t, reg_class_t);
367 static int frv_memory_move_cost (machine_mode,
368 reg_class_t, bool);
369 static void frv_asm_out_constructor (rtx, int);
370 static void frv_asm_out_destructor (rtx, int);
371 static bool frv_function_symbol_referenced_p (rtx);
372 static bool frv_legitimate_constant_p (machine_mode, rtx);
373 static bool frv_cannot_force_const_mem (machine_mode, rtx);
374 static const char *unspec_got_name (int);
375 static void frv_output_const_unspec (FILE *,
376 const struct frv_unspec *);
377 static bool frv_function_ok_for_sibcall (tree, tree);
378 static rtx frv_struct_value_rtx (tree, int);
379 static bool frv_must_pass_in_stack (machine_mode mode, const_tree type);
380 static int frv_arg_partial_bytes (cumulative_args_t, machine_mode,
381 tree, bool);
382 static rtx frv_function_arg (cumulative_args_t, machine_mode,
383 const_tree, bool);
384 static rtx frv_function_incoming_arg (cumulative_args_t, machine_mode,
385 const_tree, bool);
386 static void frv_function_arg_advance (cumulative_args_t, machine_mode,
387 const_tree, bool);
388 static unsigned int frv_function_arg_boundary (machine_mode,
389 const_tree);
390 static void frv_output_dwarf_dtprel (FILE *, int, rtx)
391 ATTRIBUTE_UNUSED;
392 static reg_class_t frv_secondary_reload (bool, rtx, reg_class_t,
393 machine_mode,
394 secondary_reload_info *);
395 static bool frv_frame_pointer_required (void);
396 static bool frv_can_eliminate (const int, const int);
397 static void frv_conditional_register_usage (void);
398 static void frv_trampoline_init (rtx, tree, rtx);
399 static bool frv_class_likely_spilled_p (reg_class_t);
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_OPTION_OVERRIDE
415 #define TARGET_OPTION_OVERRIDE frv_option_override
416 #undef TARGET_INIT_BUILTINS
417 #define TARGET_INIT_BUILTINS frv_init_builtins
418 #undef TARGET_EXPAND_BUILTIN
419 #define TARGET_EXPAND_BUILTIN frv_expand_builtin
420 #undef TARGET_INIT_LIBFUNCS
421 #define TARGET_INIT_LIBFUNCS frv_init_libfuncs
422 #undef TARGET_IN_SMALL_DATA_P
423 #define TARGET_IN_SMALL_DATA_P frv_in_small_data_p
424 #undef TARGET_REGISTER_MOVE_COST
425 #define TARGET_REGISTER_MOVE_COST frv_register_move_cost
426 #undef TARGET_MEMORY_MOVE_COST
427 #define TARGET_MEMORY_MOVE_COST frv_memory_move_cost
428 #undef TARGET_RTX_COSTS
429 #define TARGET_RTX_COSTS frv_rtx_costs
430 #undef TARGET_ASM_CONSTRUCTOR
431 #define TARGET_ASM_CONSTRUCTOR frv_asm_out_constructor
432 #undef TARGET_ASM_DESTRUCTOR
433 #define TARGET_ASM_DESTRUCTOR frv_asm_out_destructor
435 #undef TARGET_ASM_OUTPUT_MI_THUNK
436 #define TARGET_ASM_OUTPUT_MI_THUNK frv_asm_output_mi_thunk
437 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
438 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
440 #undef TARGET_SCHED_ISSUE_RATE
441 #define TARGET_SCHED_ISSUE_RATE frv_issue_rate
443 #undef TARGET_LEGITIMIZE_ADDRESS
444 #define TARGET_LEGITIMIZE_ADDRESS frv_legitimize_address
446 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
447 #define TARGET_FUNCTION_OK_FOR_SIBCALL frv_function_ok_for_sibcall
448 #undef TARGET_LEGITIMATE_CONSTANT_P
449 #define TARGET_LEGITIMATE_CONSTANT_P frv_legitimate_constant_p
450 #undef TARGET_CANNOT_FORCE_CONST_MEM
451 #define TARGET_CANNOT_FORCE_CONST_MEM frv_cannot_force_const_mem
453 #undef TARGET_HAVE_TLS
454 #define TARGET_HAVE_TLS HAVE_AS_TLS
456 #undef TARGET_STRUCT_VALUE_RTX
457 #define TARGET_STRUCT_VALUE_RTX frv_struct_value_rtx
458 #undef TARGET_MUST_PASS_IN_STACK
459 #define TARGET_MUST_PASS_IN_STACK frv_must_pass_in_stack
460 #undef TARGET_PASS_BY_REFERENCE
461 #define TARGET_PASS_BY_REFERENCE hook_pass_by_reference_must_pass_in_stack
462 #undef TARGET_ARG_PARTIAL_BYTES
463 #define TARGET_ARG_PARTIAL_BYTES frv_arg_partial_bytes
464 #undef TARGET_FUNCTION_ARG
465 #define TARGET_FUNCTION_ARG frv_function_arg
466 #undef TARGET_FUNCTION_INCOMING_ARG
467 #define TARGET_FUNCTION_INCOMING_ARG frv_function_incoming_arg
468 #undef TARGET_FUNCTION_ARG_ADVANCE
469 #define TARGET_FUNCTION_ARG_ADVANCE frv_function_arg_advance
470 #undef TARGET_FUNCTION_ARG_BOUNDARY
471 #define TARGET_FUNCTION_ARG_BOUNDARY frv_function_arg_boundary
473 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
474 #define TARGET_EXPAND_BUILTIN_SAVEREGS frv_expand_builtin_saveregs
475 #undef TARGET_SETUP_INCOMING_VARARGS
476 #define TARGET_SETUP_INCOMING_VARARGS frv_setup_incoming_varargs
477 #undef TARGET_MACHINE_DEPENDENT_REORG
478 #define TARGET_MACHINE_DEPENDENT_REORG frv_reorg
480 #undef TARGET_EXPAND_BUILTIN_VA_START
481 #define TARGET_EXPAND_BUILTIN_VA_START frv_expand_builtin_va_start
483 #if HAVE_AS_TLS
484 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
485 #define TARGET_ASM_OUTPUT_DWARF_DTPREL frv_output_dwarf_dtprel
486 #endif
488 #undef TARGET_CLASS_LIKELY_SPILLED_P
489 #define TARGET_CLASS_LIKELY_SPILLED_P frv_class_likely_spilled_p
491 #undef TARGET_SECONDARY_RELOAD
492 #define TARGET_SECONDARY_RELOAD frv_secondary_reload
494 #undef TARGET_LEGITIMATE_ADDRESS_P
495 #define TARGET_LEGITIMATE_ADDRESS_P frv_legitimate_address_p
497 #undef TARGET_FRAME_POINTER_REQUIRED
498 #define TARGET_FRAME_POINTER_REQUIRED frv_frame_pointer_required
500 #undef TARGET_CAN_ELIMINATE
501 #define TARGET_CAN_ELIMINATE frv_can_eliminate
503 #undef TARGET_CONDITIONAL_REGISTER_USAGE
504 #define TARGET_CONDITIONAL_REGISTER_USAGE frv_conditional_register_usage
506 #undef TARGET_TRAMPOLINE_INIT
507 #define TARGET_TRAMPOLINE_INIT frv_trampoline_init
509 #undef TARGET_FUNCTION_VALUE
510 #define TARGET_FUNCTION_VALUE frv_function_value
511 #undef TARGET_LIBCALL_VALUE
512 #define TARGET_LIBCALL_VALUE frv_libcall_value
514 struct gcc_target targetm = TARGET_INITIALIZER;
516 #define FRV_SYMBOL_REF_TLS_P(RTX) \
517 (GET_CODE (RTX) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (RTX) != 0)
520 /* Any function call that satisfies the machine-independent
521 requirements is eligible on FR-V. */
523 static bool
524 frv_function_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED,
525 tree exp ATTRIBUTE_UNUSED)
527 return true;
530 /* Return true if SYMBOL is a small data symbol and relocation RELOC
531 can be used to access it directly in a load or store. */
533 static FRV_INLINE bool
534 frv_small_data_reloc_p (rtx symbol, int reloc)
536 return (GET_CODE (symbol) == SYMBOL_REF
537 && SYMBOL_REF_SMALL_P (symbol)
538 && (!TARGET_FDPIC || flag_pic == 1)
539 && (reloc == R_FRV_GOTOFF12 || reloc == R_FRV_GPREL12));
542 /* Return true if X is a valid relocation unspec. If it is, fill in UNSPEC
543 appropriately. */
545 bool
546 frv_const_unspec_p (rtx x, struct frv_unspec *unspec)
548 if (GET_CODE (x) == CONST)
550 unspec->offset = 0;
551 x = XEXP (x, 0);
552 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
554 unspec->offset += INTVAL (XEXP (x, 1));
555 x = XEXP (x, 0);
557 if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_GOT)
559 unspec->symbol = XVECEXP (x, 0, 0);
560 unspec->reloc = INTVAL (XVECEXP (x, 0, 1));
562 if (unspec->offset == 0)
563 return true;
565 if (frv_small_data_reloc_p (unspec->symbol, unspec->reloc)
566 && unspec->offset > 0
567 && unspec->offset < g_switch_value)
568 return true;
571 return false;
574 /* Decide whether we can force certain constants to memory. If we
575 decide we can't, the caller should be able to cope with it in
576 another way.
578 We never allow constants to be forced into memory for TARGET_FDPIC.
579 This is necessary for several reasons:
581 1. Since frv_legitimate_constant_p rejects constant pool addresses, the
582 target-independent code will try to force them into the constant
583 pool, thus leading to infinite recursion.
585 2. We can never introduce new constant pool references during reload.
586 Any such reference would require use of the pseudo FDPIC register.
588 3. We can't represent a constant added to a function pointer (which is
589 not the same as a pointer to a function+constant).
591 4. In many cases, it's more efficient to calculate the constant in-line. */
593 static bool
594 frv_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED,
595 rtx x ATTRIBUTE_UNUSED)
597 return TARGET_FDPIC;
600 static int
601 frv_default_flags_for_cpu (void)
603 switch (frv_cpu_type)
605 case FRV_CPU_GENERIC:
606 return MASK_DEFAULT_FRV;
608 case FRV_CPU_FR550:
609 return MASK_DEFAULT_FR550;
611 case FRV_CPU_FR500:
612 case FRV_CPU_TOMCAT:
613 return MASK_DEFAULT_FR500;
615 case FRV_CPU_FR450:
616 return MASK_DEFAULT_FR450;
618 case FRV_CPU_FR405:
619 case FRV_CPU_FR400:
620 return MASK_DEFAULT_FR400;
622 case FRV_CPU_FR300:
623 case FRV_CPU_SIMPLE:
624 return MASK_DEFAULT_SIMPLE;
626 default:
627 gcc_unreachable ();
631 /* Implement TARGET_OPTION_OVERRIDE. */
633 static void
634 frv_option_override (void)
636 int regno;
637 unsigned int i;
639 target_flags |= (frv_default_flags_for_cpu () & ~target_flags_explicit);
641 /* -mlibrary-pic sets -fPIC and -G0 and also suppresses warnings from the
642 linker about linking pic and non-pic code. */
643 if (TARGET_LIBPIC)
645 if (!flag_pic) /* -fPIC */
646 flag_pic = 2;
648 if (!global_options_set.x_g_switch_value) /* -G0 */
650 g_switch_value = 0;
654 /* A C expression whose value is a register class containing hard
655 register REGNO. In general there is more than one such class;
656 choose a class which is "minimal", meaning that no smaller class
657 also contains the register. */
659 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
661 enum reg_class rclass;
663 if (GPR_P (regno))
665 int gpr_reg = regno - GPR_FIRST;
667 if (gpr_reg == GR8_REG)
668 rclass = GR8_REGS;
670 else if (gpr_reg == GR9_REG)
671 rclass = GR9_REGS;
673 else if (gpr_reg == GR14_REG)
674 rclass = FDPIC_FPTR_REGS;
676 else if (gpr_reg == FDPIC_REGNO)
677 rclass = FDPIC_REGS;
679 else if ((gpr_reg & 3) == 0)
680 rclass = QUAD_REGS;
682 else if ((gpr_reg & 1) == 0)
683 rclass = EVEN_REGS;
685 else
686 rclass = GPR_REGS;
689 else if (FPR_P (regno))
691 int fpr_reg = regno - GPR_FIRST;
692 if ((fpr_reg & 3) == 0)
693 rclass = QUAD_FPR_REGS;
695 else if ((fpr_reg & 1) == 0)
696 rclass = FEVEN_REGS;
698 else
699 rclass = FPR_REGS;
702 else if (regno == LR_REGNO)
703 rclass = LR_REG;
705 else if (regno == LCR_REGNO)
706 rclass = LCR_REG;
708 else if (ICC_P (regno))
709 rclass = ICC_REGS;
711 else if (FCC_P (regno))
712 rclass = FCC_REGS;
714 else if (ICR_P (regno))
715 rclass = ICR_REGS;
717 else if (FCR_P (regno))
718 rclass = FCR_REGS;
720 else if (ACC_P (regno))
722 int r = regno - ACC_FIRST;
723 if ((r & 3) == 0)
724 rclass = QUAD_ACC_REGS;
725 else if ((r & 1) == 0)
726 rclass = EVEN_ACC_REGS;
727 else
728 rclass = ACC_REGS;
731 else if (ACCG_P (regno))
732 rclass = ACCG_REGS;
734 else
735 rclass = NO_REGS;
737 regno_reg_class[regno] = rclass;
740 /* Check for small data option */
741 if (!global_options_set.x_g_switch_value && !TARGET_LIBPIC)
742 g_switch_value = SDATA_DEFAULT_SIZE;
744 /* There is no single unaligned SI op for PIC code. Sometimes we
745 need to use ".4byte" and sometimes we need to use ".picptr".
746 See frv_assemble_integer for details. */
747 if (flag_pic || TARGET_FDPIC)
748 targetm.asm_out.unaligned_op.si = 0;
750 if ((target_flags_explicit & MASK_LINKED_FP) == 0)
751 target_flags |= MASK_LINKED_FP;
753 if ((target_flags_explicit & MASK_OPTIMIZE_MEMBAR) == 0)
754 target_flags |= MASK_OPTIMIZE_MEMBAR;
756 for (i = 0; i < ARRAY_SIZE (frv_unit_names); i++)
757 frv_unit_codes[i] = get_cpu_unit_code (frv_unit_names[i]);
759 for (i = 0; i < ARRAY_SIZE (frv_type_to_unit); i++)
760 frv_type_to_unit[i] = ARRAY_SIZE (frv_unit_codes);
762 init_machine_status = frv_init_machine_status;
766 /* Return true if NAME (a STRING_CST node) begins with PREFIX. */
768 static int
769 frv_string_begins_with (const char *name, const char *prefix)
771 const int prefix_len = strlen (prefix);
773 /* Remember: NAME's length includes the null terminator. */
774 return (strncmp (name, prefix, prefix_len) == 0);
777 /* Implement TARGET_CONDITIONAL_REGISTER_USAGE. */
779 static void
780 frv_conditional_register_usage (void)
782 int i;
784 for (i = GPR_FIRST + NUM_GPRS; i <= GPR_LAST; i++)
785 fixed_regs[i] = call_used_regs[i] = 1;
787 for (i = FPR_FIRST + NUM_FPRS; i <= FPR_LAST; i++)
788 fixed_regs[i] = call_used_regs[i] = 1;
790 /* Reserve the registers used for conditional execution. At present, we need
791 1 ICC and 1 ICR register. */
792 fixed_regs[ICC_TEMP] = call_used_regs[ICC_TEMP] = 1;
793 fixed_regs[ICR_TEMP] = call_used_regs[ICR_TEMP] = 1;
795 if (TARGET_FIXED_CC)
797 fixed_regs[ICC_FIRST] = call_used_regs[ICC_FIRST] = 1;
798 fixed_regs[FCC_FIRST] = call_used_regs[FCC_FIRST] = 1;
799 fixed_regs[ICR_FIRST] = call_used_regs[ICR_FIRST] = 1;
800 fixed_regs[FCR_FIRST] = call_used_regs[FCR_FIRST] = 1;
803 if (TARGET_FDPIC)
804 fixed_regs[GPR_FIRST + 16] = fixed_regs[GPR_FIRST + 17] =
805 call_used_regs[GPR_FIRST + 16] = call_used_regs[GPR_FIRST + 17] = 0;
807 #if 0
808 /* If -fpic, SDA_BASE_REG is the PIC register. */
809 if (g_switch_value == 0 && !flag_pic)
810 fixed_regs[SDA_BASE_REG] = call_used_regs[SDA_BASE_REG] = 0;
812 if (!flag_pic)
813 fixed_regs[PIC_REGNO] = call_used_regs[PIC_REGNO] = 0;
814 #endif
819 * Compute the stack frame layout
821 * Register setup:
822 * +---------------+-----------------------+-----------------------+
823 * |Register |type |caller-save/callee-save|
824 * +---------------+-----------------------+-----------------------+
825 * |GR0 |Zero register | - |
826 * |GR1 |Stack pointer(SP) | - |
827 * |GR2 |Frame pointer(FP) | - |
828 * |GR3 |Hidden parameter | caller save |
829 * |GR4-GR7 | - | caller save |
830 * |GR8-GR13 |Argument register | caller save |
831 * |GR14-GR15 | - | caller save |
832 * |GR16-GR31 | - | callee save |
833 * |GR32-GR47 | - | caller save |
834 * |GR48-GR63 | - | callee save |
835 * |FR0-FR15 | - | caller save |
836 * |FR16-FR31 | - | callee save |
837 * |FR32-FR47 | - | caller save |
838 * |FR48-FR63 | - | callee save |
839 * +---------------+-----------------------+-----------------------+
841 * Stack frame setup:
842 * Low
843 * SP-> |-----------------------------------|
844 * | Argument area |
845 * |-----------------------------------|
846 * | Register save area |
847 * |-----------------------------------|
848 * | Local variable save area |
849 * FP-> |-----------------------------------|
850 * | Old FP |
851 * |-----------------------------------|
852 * | Hidden parameter save area |
853 * |-----------------------------------|
854 * | Return address(LR) storage area |
855 * |-----------------------------------|
856 * | Padding for alignment |
857 * |-----------------------------------|
858 * | Register argument area |
859 * OLD SP-> |-----------------------------------|
860 * | Parameter area |
861 * |-----------------------------------|
862 * High
864 * Argument area/Parameter area:
866 * When a function is called, this area is used for argument transfer. When
867 * the argument is set up by the caller function, this area is referred to as
868 * the argument area. When the argument is referenced by the callee function,
869 * this area is referred to as the parameter area. The area is allocated when
870 * all arguments cannot be placed on the argument register at the time of
871 * argument transfer.
873 * Register save area:
875 * This is a register save area that must be guaranteed for the caller
876 * function. This area is not secured when the register save operation is not
877 * needed.
879 * Local variable save area:
881 * This is the area for local variables and temporary variables.
883 * Old FP:
885 * This area stores the FP value of the caller function.
887 * Hidden parameter save area:
889 * This area stores the start address of the return value storage
890 * area for a struct/union return function.
891 * When a struct/union is used as the return value, the caller
892 * function stores the return value storage area start address in
893 * register GR3 and passes it to the caller function.
894 * The callee function interprets the address stored in the GR3
895 * as the return value storage area start address.
896 * When register GR3 needs to be saved into memory, the callee
897 * function saves it in the hidden parameter save area. This
898 * area is not secured when the save operation is not needed.
900 * Return address(LR) storage area:
902 * This area saves the LR. The LR stores the address of a return to the caller
903 * function for the purpose of function calling.
905 * Argument register area:
907 * This area saves the argument register. This area is not secured when the
908 * save operation is not needed.
910 * Argument:
912 * Arguments, the count of which equals the count of argument registers (6
913 * words), are positioned in registers GR8 to GR13 and delivered to the callee
914 * function. When a struct/union return function is called, the return value
915 * area address is stored in register GR3. Arguments not placed in the
916 * argument registers will be stored in the stack argument area for transfer
917 * purposes. When an 8-byte type argument is to be delivered using registers,
918 * it is divided into two and placed in two registers for transfer. When
919 * argument registers must be saved to memory, the callee function secures an
920 * argument register save area in the stack. In this case, a continuous
921 * argument register save area must be established in the parameter area. The
922 * argument register save area must be allocated as needed to cover the size of
923 * the argument register to be saved. If the function has a variable count of
924 * arguments, it saves all argument registers in the argument register save
925 * area.
927 * Argument Extension Format:
929 * When an argument is to be stored in the stack, its type is converted to an
930 * extended type in accordance with the individual argument type. The argument
931 * is freed by the caller function after the return from the callee function is
932 * made.
934 * +-----------------------+---------------+------------------------+
935 * | Argument Type |Extended Type |Stack Storage Size(byte)|
936 * +-----------------------+---------------+------------------------+
937 * |char |int | 4 |
938 * |signed char |int | 4 |
939 * |unsigned char |int | 4 |
940 * |[signed] short int |int | 4 |
941 * |unsigned short int |int | 4 |
942 * |[signed] int |No extension | 4 |
943 * |unsigned int |No extension | 4 |
944 * |[signed] long int |No extension | 4 |
945 * |unsigned long int |No extension | 4 |
946 * |[signed] long long int |No extension | 8 |
947 * |unsigned long long int |No extension | 8 |
948 * |float |double | 8 |
949 * |double |No extension | 8 |
950 * |long double |No extension | 8 |
951 * |pointer |No extension | 4 |
952 * |struct/union |- | 4 (*1) |
953 * +-----------------------+---------------+------------------------+
955 * When a struct/union is to be delivered as an argument, the caller copies it
956 * to the local variable area and delivers the address of that area.
958 * Return Value:
960 * +-------------------------------+----------------------+
961 * |Return Value Type |Return Value Interface|
962 * +-------------------------------+----------------------+
963 * |void |None |
964 * |[signed|unsigned] char |GR8 |
965 * |[signed|unsigned] short int |GR8 |
966 * |[signed|unsigned] int |GR8 |
967 * |[signed|unsigned] long int |GR8 |
968 * |pointer |GR8 |
969 * |[signed|unsigned] long long int|GR8 & GR9 |
970 * |float |GR8 |
971 * |double |GR8 & GR9 |
972 * |long double |GR8 & GR9 |
973 * |struct/union |(*1) |
974 * +-------------------------------+----------------------+
976 * When a struct/union is used as the return value, the caller function stores
977 * the start address of the return value storage area into GR3 and then passes
978 * it to the callee function. The callee function interprets GR3 as the start
979 * address of the return value storage area. When this address needs to be
980 * saved in memory, the callee function secures the hidden parameter save area
981 * and saves the address in that area.
984 frv_stack_t *
985 frv_stack_info (void)
987 static frv_stack_t info, zero_info;
988 frv_stack_t *info_ptr = &info;
989 tree fndecl = current_function_decl;
990 int varargs_p = 0;
991 tree cur_arg;
992 tree next_arg;
993 int range;
994 int alignment;
995 int offset;
997 /* If we've already calculated the values and reload is complete,
998 just return now. */
999 if (frv_stack_cache)
1000 return frv_stack_cache;
1002 /* Zero all fields. */
1003 info = zero_info;
1005 /* Set up the register range information. */
1006 info_ptr->regs[STACK_REGS_GPR].name = "gpr";
1007 info_ptr->regs[STACK_REGS_GPR].first = LAST_ARG_REGNUM + 1;
1008 info_ptr->regs[STACK_REGS_GPR].last = GPR_LAST;
1009 info_ptr->regs[STACK_REGS_GPR].dword_p = TRUE;
1011 info_ptr->regs[STACK_REGS_FPR].name = "fpr";
1012 info_ptr->regs[STACK_REGS_FPR].first = FPR_FIRST;
1013 info_ptr->regs[STACK_REGS_FPR].last = FPR_LAST;
1014 info_ptr->regs[STACK_REGS_FPR].dword_p = TRUE;
1016 info_ptr->regs[STACK_REGS_LR].name = "lr";
1017 info_ptr->regs[STACK_REGS_LR].first = LR_REGNO;
1018 info_ptr->regs[STACK_REGS_LR].last = LR_REGNO;
1019 info_ptr->regs[STACK_REGS_LR].special_p = 1;
1021 info_ptr->regs[STACK_REGS_CC].name = "cc";
1022 info_ptr->regs[STACK_REGS_CC].first = CC_FIRST;
1023 info_ptr->regs[STACK_REGS_CC].last = CC_LAST;
1024 info_ptr->regs[STACK_REGS_CC].field_p = TRUE;
1026 info_ptr->regs[STACK_REGS_LCR].name = "lcr";
1027 info_ptr->regs[STACK_REGS_LCR].first = LCR_REGNO;
1028 info_ptr->regs[STACK_REGS_LCR].last = LCR_REGNO;
1030 info_ptr->regs[STACK_REGS_STDARG].name = "stdarg";
1031 info_ptr->regs[STACK_REGS_STDARG].first = FIRST_ARG_REGNUM;
1032 info_ptr->regs[STACK_REGS_STDARG].last = LAST_ARG_REGNUM;
1033 info_ptr->regs[STACK_REGS_STDARG].dword_p = 1;
1034 info_ptr->regs[STACK_REGS_STDARG].special_p = 1;
1036 info_ptr->regs[STACK_REGS_STRUCT].name = "struct";
1037 info_ptr->regs[STACK_REGS_STRUCT].first = FRV_STRUCT_VALUE_REGNUM;
1038 info_ptr->regs[STACK_REGS_STRUCT].last = FRV_STRUCT_VALUE_REGNUM;
1039 info_ptr->regs[STACK_REGS_STRUCT].special_p = 1;
1041 info_ptr->regs[STACK_REGS_FP].name = "fp";
1042 info_ptr->regs[STACK_REGS_FP].first = FRAME_POINTER_REGNUM;
1043 info_ptr->regs[STACK_REGS_FP].last = FRAME_POINTER_REGNUM;
1044 info_ptr->regs[STACK_REGS_FP].special_p = 1;
1046 /* Determine if this is a stdarg function. If so, allocate space to store
1047 the 6 arguments. */
1048 if (cfun->stdarg)
1049 varargs_p = 1;
1051 else
1053 /* Find the last argument, and see if it is __builtin_va_alist. */
1054 for (cur_arg = DECL_ARGUMENTS (fndecl); cur_arg != (tree)0; cur_arg = next_arg)
1056 next_arg = DECL_CHAIN (cur_arg);
1057 if (next_arg == (tree)0)
1059 if (DECL_NAME (cur_arg)
1060 && !strcmp (IDENTIFIER_POINTER (DECL_NAME (cur_arg)), "__builtin_va_alist"))
1061 varargs_p = 1;
1063 break;
1068 /* Iterate over all of the register ranges. */
1069 for (range = 0; range < STACK_REGS_MAX; range++)
1071 frv_stack_regs_t *reg_ptr = &(info_ptr->regs[range]);
1072 int first = reg_ptr->first;
1073 int last = reg_ptr->last;
1074 int size_1word = 0;
1075 int size_2words = 0;
1076 int regno;
1078 /* Calculate which registers need to be saved & save area size. */
1079 switch (range)
1081 default:
1082 for (regno = first; regno <= last; regno++)
1084 if ((df_regs_ever_live_p (regno) && !call_used_regs[regno])
1085 || (crtl->calls_eh_return
1086 && (regno >= FIRST_EH_REGNUM && regno <= LAST_EH_REGNUM))
1087 || (!TARGET_FDPIC && flag_pic
1088 && crtl->uses_pic_offset_table && regno == PIC_REGNO))
1090 info_ptr->save_p[regno] = REG_SAVE_1WORD;
1091 size_1word += UNITS_PER_WORD;
1094 break;
1096 /* Calculate whether we need to create a frame after everything else
1097 has been processed. */
1098 case STACK_REGS_FP:
1099 break;
1101 case STACK_REGS_LR:
1102 if (df_regs_ever_live_p (LR_REGNO)
1103 || profile_flag
1104 /* This is set for __builtin_return_address, etc. */
1105 || cfun->machine->frame_needed
1106 || (TARGET_LINKED_FP && frame_pointer_needed)
1107 || (!TARGET_FDPIC && flag_pic
1108 && crtl->uses_pic_offset_table))
1110 info_ptr->save_p[LR_REGNO] = REG_SAVE_1WORD;
1111 size_1word += UNITS_PER_WORD;
1113 break;
1115 case STACK_REGS_STDARG:
1116 if (varargs_p)
1118 /* If this is a stdarg function with a non varardic
1119 argument split between registers and the stack,
1120 adjust the saved registers downward. */
1121 last -= (ADDR_ALIGN (crtl->args.pretend_args_size, UNITS_PER_WORD)
1122 / UNITS_PER_WORD);
1124 for (regno = first; regno <= last; regno++)
1126 info_ptr->save_p[regno] = REG_SAVE_1WORD;
1127 size_1word += UNITS_PER_WORD;
1130 info_ptr->stdarg_size = size_1word;
1132 break;
1134 case STACK_REGS_STRUCT:
1135 if (cfun->returns_struct)
1137 info_ptr->save_p[FRV_STRUCT_VALUE_REGNUM] = REG_SAVE_1WORD;
1138 size_1word += UNITS_PER_WORD;
1140 break;
1144 if (size_1word)
1146 /* If this is a field, it only takes one word. */
1147 if (reg_ptr->field_p)
1148 size_1word = UNITS_PER_WORD;
1150 /* Determine which register pairs can be saved together. */
1151 else if (reg_ptr->dword_p && TARGET_DWORD)
1153 for (regno = first; regno < last; regno += 2)
1155 if (info_ptr->save_p[regno] && info_ptr->save_p[regno+1])
1157 size_2words += 2 * UNITS_PER_WORD;
1158 size_1word -= 2 * UNITS_PER_WORD;
1159 info_ptr->save_p[regno] = REG_SAVE_2WORDS;
1160 info_ptr->save_p[regno+1] = REG_SAVE_NO_SAVE;
1165 reg_ptr->size_1word = size_1word;
1166 reg_ptr->size_2words = size_2words;
1168 if (! reg_ptr->special_p)
1170 info_ptr->regs_size_1word += size_1word;
1171 info_ptr->regs_size_2words += size_2words;
1176 /* Set up the sizes of each field in the frame body, making the sizes
1177 of each be divisible by the size of a dword if dword operations might
1178 be used, or the size of a word otherwise. */
1179 alignment = (TARGET_DWORD? 2 * UNITS_PER_WORD : UNITS_PER_WORD);
1181 info_ptr->parameter_size = ADDR_ALIGN (crtl->outgoing_args_size, alignment);
1182 info_ptr->regs_size = ADDR_ALIGN (info_ptr->regs_size_2words
1183 + info_ptr->regs_size_1word,
1184 alignment);
1185 info_ptr->vars_size = ADDR_ALIGN (get_frame_size (), alignment);
1187 info_ptr->pretend_size = crtl->args.pretend_args_size;
1189 /* Work out the size of the frame, excluding the header. Both the frame
1190 body and register parameter area will be dword-aligned. */
1191 info_ptr->total_size
1192 = (ADDR_ALIGN (info_ptr->parameter_size
1193 + info_ptr->regs_size
1194 + info_ptr->vars_size,
1195 2 * UNITS_PER_WORD)
1196 + ADDR_ALIGN (info_ptr->pretend_size
1197 + info_ptr->stdarg_size,
1198 2 * UNITS_PER_WORD));
1200 /* See if we need to create a frame at all, if so add header area. */
1201 if (info_ptr->total_size > 0
1202 || frame_pointer_needed
1203 || info_ptr->regs[STACK_REGS_LR].size_1word > 0
1204 || info_ptr->regs[STACK_REGS_STRUCT].size_1word > 0)
1206 offset = info_ptr->parameter_size;
1207 info_ptr->header_size = 4 * UNITS_PER_WORD;
1208 info_ptr->total_size += 4 * UNITS_PER_WORD;
1210 /* Calculate the offsets to save normal register pairs. */
1211 for (range = 0; range < STACK_REGS_MAX; range++)
1213 frv_stack_regs_t *reg_ptr = &(info_ptr->regs[range]);
1214 if (! reg_ptr->special_p)
1216 int first = reg_ptr->first;
1217 int last = reg_ptr->last;
1218 int regno;
1220 for (regno = first; regno <= last; regno++)
1221 if (info_ptr->save_p[regno] == REG_SAVE_2WORDS
1222 && regno != FRAME_POINTER_REGNUM
1223 && (regno < FIRST_ARG_REGNUM
1224 || regno > LAST_ARG_REGNUM))
1226 info_ptr->reg_offset[regno] = offset;
1227 offset += 2 * UNITS_PER_WORD;
1232 /* Calculate the offsets to save normal single registers. */
1233 for (range = 0; range < STACK_REGS_MAX; range++)
1235 frv_stack_regs_t *reg_ptr = &(info_ptr->regs[range]);
1236 if (! reg_ptr->special_p)
1238 int first = reg_ptr->first;
1239 int last = reg_ptr->last;
1240 int regno;
1242 for (regno = first; regno <= last; regno++)
1243 if (info_ptr->save_p[regno] == REG_SAVE_1WORD
1244 && regno != FRAME_POINTER_REGNUM
1245 && (regno < FIRST_ARG_REGNUM
1246 || regno > LAST_ARG_REGNUM))
1248 info_ptr->reg_offset[regno] = offset;
1249 offset += UNITS_PER_WORD;
1254 /* Calculate the offset to save the local variables at. */
1255 offset = ADDR_ALIGN (offset, alignment);
1256 if (info_ptr->vars_size)
1258 info_ptr->vars_offset = offset;
1259 offset += info_ptr->vars_size;
1262 /* Align header to a dword-boundary. */
1263 offset = ADDR_ALIGN (offset, 2 * UNITS_PER_WORD);
1265 /* Calculate the offsets in the fixed frame. */
1266 info_ptr->save_p[FRAME_POINTER_REGNUM] = REG_SAVE_1WORD;
1267 info_ptr->reg_offset[FRAME_POINTER_REGNUM] = offset;
1268 info_ptr->regs[STACK_REGS_FP].size_1word = UNITS_PER_WORD;
1270 info_ptr->save_p[LR_REGNO] = REG_SAVE_1WORD;
1271 info_ptr->reg_offset[LR_REGNO] = offset + 2*UNITS_PER_WORD;
1272 info_ptr->regs[STACK_REGS_LR].size_1word = UNITS_PER_WORD;
1274 if (cfun->returns_struct)
1276 info_ptr->save_p[FRV_STRUCT_VALUE_REGNUM] = REG_SAVE_1WORD;
1277 info_ptr->reg_offset[FRV_STRUCT_VALUE_REGNUM] = offset + UNITS_PER_WORD;
1278 info_ptr->regs[STACK_REGS_STRUCT].size_1word = UNITS_PER_WORD;
1281 /* Calculate the offsets to store the arguments passed in registers
1282 for stdarg functions. The register pairs are first and the single
1283 register if any is last. The register save area starts on a
1284 dword-boundary. */
1285 if (info_ptr->stdarg_size)
1287 int first = info_ptr->regs[STACK_REGS_STDARG].first;
1288 int last = info_ptr->regs[STACK_REGS_STDARG].last;
1289 int regno;
1291 /* Skip the header. */
1292 offset += 4 * UNITS_PER_WORD;
1293 for (regno = first; regno <= last; regno++)
1295 if (info_ptr->save_p[regno] == REG_SAVE_2WORDS)
1297 info_ptr->reg_offset[regno] = offset;
1298 offset += 2 * UNITS_PER_WORD;
1300 else if (info_ptr->save_p[regno] == REG_SAVE_1WORD)
1302 info_ptr->reg_offset[regno] = offset;
1303 offset += UNITS_PER_WORD;
1309 if (reload_completed)
1310 frv_stack_cache = info_ptr;
1312 return info_ptr;
1316 /* Print the information about the frv stack offsets, etc. when debugging. */
1318 void
1319 frv_debug_stack (frv_stack_t *info)
1321 int range;
1323 if (!info)
1324 info = frv_stack_info ();
1326 fprintf (stderr, "\nStack information for function %s:\n",
1327 ((current_function_decl && DECL_NAME (current_function_decl))
1328 ? IDENTIFIER_POINTER (DECL_NAME (current_function_decl))
1329 : "<unknown>"));
1331 fprintf (stderr, "\ttotal_size\t= %6d\n", info->total_size);
1332 fprintf (stderr, "\tvars_size\t= %6d\n", info->vars_size);
1333 fprintf (stderr, "\tparam_size\t= %6d\n", info->parameter_size);
1334 fprintf (stderr, "\tregs_size\t= %6d, 1w = %3d, 2w = %3d\n",
1335 info->regs_size, info->regs_size_1word, info->regs_size_2words);
1337 fprintf (stderr, "\theader_size\t= %6d\n", info->header_size);
1338 fprintf (stderr, "\tpretend_size\t= %6d\n", info->pretend_size);
1339 fprintf (stderr, "\tvars_offset\t= %6d\n", info->vars_offset);
1340 fprintf (stderr, "\tregs_offset\t= %6d\n", info->regs_offset);
1342 for (range = 0; range < STACK_REGS_MAX; range++)
1344 frv_stack_regs_t *regs = &(info->regs[range]);
1345 if ((regs->size_1word + regs->size_2words) > 0)
1347 int first = regs->first;
1348 int last = regs->last;
1349 int regno;
1351 fprintf (stderr, "\t%s\tsize\t= %6d, 1w = %3d, 2w = %3d, save =",
1352 regs->name, regs->size_1word + regs->size_2words,
1353 regs->size_1word, regs->size_2words);
1355 for (regno = first; regno <= last; regno++)
1357 if (info->save_p[regno] == REG_SAVE_1WORD)
1358 fprintf (stderr, " %s (%d)", reg_names[regno],
1359 info->reg_offset[regno]);
1361 else if (info->save_p[regno] == REG_SAVE_2WORDS)
1362 fprintf (stderr, " %s-%s (%d)", reg_names[regno],
1363 reg_names[regno+1], info->reg_offset[regno]);
1366 fputc ('\n', stderr);
1370 fflush (stderr);
1376 /* Used during final to control the packing of insns. The value is
1377 1 if the current instruction should be packed with the next one,
1378 0 if it shouldn't or -1 if packing is disabled altogether. */
1380 static int frv_insn_packing_flag;
1382 /* True if the current function contains a far jump. */
1384 static int
1385 frv_function_contains_far_jump (void)
1387 rtx_insn *insn = get_insns ();
1388 while (insn != NULL
1389 && !(JUMP_P (insn)
1390 && get_attr_far_jump (insn) == FAR_JUMP_YES))
1391 insn = NEXT_INSN (insn);
1392 return (insn != NULL);
1395 /* For the FRV, this function makes sure that a function with far jumps
1396 will return correctly. It also does the VLIW packing. */
1398 static void
1399 frv_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
1401 rtx_insn *insn, *next, *last_call;
1403 /* If no frame was created, check whether the function uses a call
1404 instruction to implement a far jump. If so, save the link in gr3 and
1405 replace all returns to LR with returns to GR3. GR3 is used because it
1406 is call-clobbered, because is not available to the register allocator,
1407 and because all functions that take a hidden argument pointer will have
1408 a stack frame. */
1409 if (frv_stack_info ()->total_size == 0 && frv_function_contains_far_jump ())
1411 rtx_insn *insn;
1413 /* Just to check that the above comment is true. */
1414 gcc_assert (!df_regs_ever_live_p (GPR_FIRST + 3));
1416 /* Generate the instruction that saves the link register. */
1417 fprintf (file, "\tmovsg lr,gr3\n");
1419 /* Replace the LR with GR3 in *return_internal patterns. The insn
1420 will now return using jmpl @(gr3,0) rather than bralr. We cannot
1421 simply emit a different assembly directive because bralr and jmpl
1422 execute in different units. */
1423 for (insn = get_insns(); insn != NULL; insn = NEXT_INSN (insn))
1424 if (JUMP_P (insn))
1426 rtx pattern = PATTERN (insn);
1427 if (GET_CODE (pattern) == PARALLEL
1428 && XVECLEN (pattern, 0) >= 2
1429 && GET_CODE (XVECEXP (pattern, 0, 0)) == RETURN
1430 && GET_CODE (XVECEXP (pattern, 0, 1)) == USE)
1432 rtx address = XEXP (XVECEXP (pattern, 0, 1), 0);
1433 if (GET_CODE (address) == REG && REGNO (address) == LR_REGNO)
1434 SET_REGNO (address, GPR_FIRST + 3);
1439 frv_pack_insns ();
1441 /* Allow the garbage collector to free the nops created by frv_reorg. */
1442 memset (frv_nops, 0, sizeof (frv_nops));
1444 /* Locate CALL_ARG_LOCATION notes that have been misplaced
1445 and move them back to where they should be located. */
1446 last_call = NULL;
1447 for (insn = get_insns (); insn; insn = next)
1449 next = NEXT_INSN (insn);
1450 if (CALL_P (insn)
1451 || (INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE
1452 && CALL_P (XVECEXP (PATTERN (insn), 0, 0))))
1453 last_call = insn;
1455 if (!NOTE_P (insn) || NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION)
1456 continue;
1458 if (NEXT_INSN (last_call) == insn)
1459 continue;
1461 SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
1462 SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
1463 SET_PREV_INSN (insn) = last_call;
1464 SET_NEXT_INSN (insn) = NEXT_INSN (last_call);
1465 SET_PREV_INSN (NEXT_INSN (insn)) = insn;
1466 SET_NEXT_INSN (PREV_INSN (insn)) = insn;
1467 last_call = insn;
1472 /* Return the next available temporary register in a given class. */
1474 static rtx
1475 frv_alloc_temp_reg (
1476 frv_tmp_reg_t *info, /* which registers are available */
1477 enum reg_class rclass, /* register class desired */
1478 machine_mode mode, /* mode to allocate register with */
1479 int mark_as_used, /* register not available after allocation */
1480 int no_abort) /* return NULL instead of aborting */
1482 int regno = info->next_reg[ (int)rclass ];
1483 int orig_regno = regno;
1484 HARD_REG_SET *reg_in_class = &reg_class_contents[ (int)rclass ];
1485 int i, nr;
1487 for (;;)
1489 if (TEST_HARD_REG_BIT (*reg_in_class, regno)
1490 && TEST_HARD_REG_BIT (info->regs, regno))
1491 break;
1493 if (++regno >= FIRST_PSEUDO_REGISTER)
1494 regno = 0;
1495 if (regno == orig_regno)
1497 gcc_assert (no_abort);
1498 return NULL_RTX;
1502 nr = HARD_REGNO_NREGS (regno, mode);
1503 info->next_reg[ (int)rclass ] = regno + nr;
1505 if (mark_as_used)
1506 for (i = 0; i < nr; i++)
1507 CLEAR_HARD_REG_BIT (info->regs, regno+i);
1509 return gen_rtx_REG (mode, regno);
1513 /* Return an rtx with the value OFFSET, which will either be a register or a
1514 signed 12-bit integer. It can be used as the second operand in an "add"
1515 instruction, or as the index in a load or store.
1517 The function returns a constant rtx if OFFSET is small enough, otherwise
1518 it loads the constant into register OFFSET_REGNO and returns that. */
1519 static rtx
1520 frv_frame_offset_rtx (int offset)
1522 rtx offset_rtx = GEN_INT (offset);
1523 if (IN_RANGE (offset, -2048, 2047))
1524 return offset_rtx;
1525 else
1527 rtx reg_rtx = gen_rtx_REG (SImode, OFFSET_REGNO);
1528 if (IN_RANGE (offset, -32768, 32767))
1529 emit_insn (gen_movsi (reg_rtx, offset_rtx));
1530 else
1532 emit_insn (gen_movsi_high (reg_rtx, offset_rtx));
1533 emit_insn (gen_movsi_lo_sum (reg_rtx, offset_rtx));
1535 return reg_rtx;
1539 /* Generate (mem:MODE (plus:Pmode BASE (frv_frame_offset OFFSET)))). The
1540 prologue and epilogue uses such expressions to access the stack. */
1541 static rtx
1542 frv_frame_mem (machine_mode mode, rtx base, int offset)
1544 return gen_rtx_MEM (mode, gen_rtx_PLUS (Pmode,
1545 base,
1546 frv_frame_offset_rtx (offset)));
1549 /* Generate a frame-related expression:
1551 (set REG (mem (plus (sp) (const_int OFFSET)))).
1553 Such expressions are used in FRAME_RELATED_EXPR notes for more complex
1554 instructions. Marking the expressions as frame-related is superfluous if
1555 the note contains just a single set. But if the note contains a PARALLEL
1556 or SEQUENCE that has several sets, each set must be individually marked
1557 as frame-related. */
1558 static rtx
1559 frv_dwarf_store (rtx reg, int offset)
1561 rtx set = gen_rtx_SET (gen_rtx_MEM (GET_MODE (reg),
1562 plus_constant (Pmode, stack_pointer_rtx,
1563 offset)),
1564 reg);
1565 RTX_FRAME_RELATED_P (set) = 1;
1566 return set;
1569 /* Emit a frame-related instruction whose pattern is PATTERN. The
1570 instruction is the last in a sequence that cumulatively performs the
1571 operation described by DWARF_PATTERN. The instruction is marked as
1572 frame-related and has a REG_FRAME_RELATED_EXPR note containing
1573 DWARF_PATTERN. */
1574 static void
1575 frv_frame_insn (rtx pattern, rtx dwarf_pattern)
1577 rtx insn = emit_insn (pattern);
1578 RTX_FRAME_RELATED_P (insn) = 1;
1579 REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
1580 dwarf_pattern,
1581 REG_NOTES (insn));
1584 /* Emit instructions that transfer REG to or from the memory location (sp +
1585 STACK_OFFSET). The register is stored in memory if ACCESSOR->OP is
1586 FRV_STORE and loaded if it is FRV_LOAD. Only the prologue uses this
1587 function to store registers and only the epilogue uses it to load them.
1589 The caller sets up ACCESSOR so that BASE is equal to (sp + BASE_OFFSET).
1590 The generated instruction will use BASE as its base register. BASE may
1591 simply be the stack pointer, but if several accesses are being made to a
1592 region far away from the stack pointer, it may be more efficient to set
1593 up a temporary instead.
1595 Store instructions will be frame-related and will be annotated with the
1596 overall effect of the store. Load instructions will be followed by a
1597 (use) to prevent later optimizations from zapping them.
1599 The function takes care of the moves to and from SPRs, using TEMP_REGNO
1600 as a temporary in such cases. */
1601 static void
1602 frv_frame_access (frv_frame_accessor_t *accessor, rtx reg, int stack_offset)
1604 machine_mode mode = GET_MODE (reg);
1605 rtx mem = frv_frame_mem (mode,
1606 accessor->base,
1607 stack_offset - accessor->base_offset);
1609 if (accessor->op == FRV_LOAD)
1611 if (SPR_P (REGNO (reg)))
1613 rtx temp = gen_rtx_REG (mode, TEMP_REGNO);
1614 emit_insn (gen_rtx_SET (temp, mem));
1615 emit_insn (gen_rtx_SET (reg, temp));
1617 else
1619 /* We cannot use reg+reg addressing for DImode access. */
1620 if (mode == DImode
1621 && GET_CODE (XEXP (mem, 0)) == PLUS
1622 && GET_CODE (XEXP (XEXP (mem, 0), 0)) == REG
1623 && GET_CODE (XEXP (XEXP (mem, 0), 1)) == REG)
1625 rtx temp = gen_rtx_REG (SImode, TEMP_REGNO);
1627 emit_move_insn (temp,
1628 gen_rtx_PLUS (SImode, XEXP (XEXP (mem, 0), 0),
1629 XEXP (XEXP (mem, 0), 1)));
1630 mem = gen_rtx_MEM (DImode, temp);
1632 emit_insn (gen_rtx_SET (reg, mem));
1634 emit_use (reg);
1636 else
1638 if (SPR_P (REGNO (reg)))
1640 rtx temp = gen_rtx_REG (mode, TEMP_REGNO);
1641 emit_insn (gen_rtx_SET (temp, reg));
1642 frv_frame_insn (gen_rtx_SET (mem, temp),
1643 frv_dwarf_store (reg, stack_offset));
1645 else if (mode == DImode)
1647 /* For DImode saves, the dwarf2 version needs to be a SEQUENCE
1648 with a separate save for each register. */
1649 rtx reg1 = gen_rtx_REG (SImode, REGNO (reg));
1650 rtx reg2 = gen_rtx_REG (SImode, REGNO (reg) + 1);
1651 rtx set1 = frv_dwarf_store (reg1, stack_offset);
1652 rtx set2 = frv_dwarf_store (reg2, stack_offset + 4);
1654 /* Also we cannot use reg+reg addressing. */
1655 if (GET_CODE (XEXP (mem, 0)) == PLUS
1656 && GET_CODE (XEXP (XEXP (mem, 0), 0)) == REG
1657 && GET_CODE (XEXP (XEXP (mem, 0), 1)) == REG)
1659 rtx temp = gen_rtx_REG (SImode, TEMP_REGNO);
1660 emit_move_insn (temp,
1661 gen_rtx_PLUS (SImode, XEXP (XEXP (mem, 0), 0),
1662 XEXP (XEXP (mem, 0), 1)));
1663 mem = gen_rtx_MEM (DImode, temp);
1666 frv_frame_insn (gen_rtx_SET (mem, reg),
1667 gen_rtx_PARALLEL (VOIDmode,
1668 gen_rtvec (2, set1, set2)));
1670 else
1671 frv_frame_insn (gen_rtx_SET (mem, reg),
1672 frv_dwarf_store (reg, stack_offset));
1676 /* A function that uses frv_frame_access to transfer a group of registers to
1677 or from the stack. ACCESSOR is passed directly to frv_frame_access, INFO
1678 is the stack information generated by frv_stack_info, and REG_SET is the
1679 number of the register set to transfer. */
1680 static void
1681 frv_frame_access_multi (frv_frame_accessor_t *accessor,
1682 frv_stack_t *info,
1683 int reg_set)
1685 frv_stack_regs_t *regs_info;
1686 int regno;
1688 regs_info = &info->regs[reg_set];
1689 for (regno = regs_info->first; regno <= regs_info->last; regno++)
1690 if (info->save_p[regno])
1691 frv_frame_access (accessor,
1692 info->save_p[regno] == REG_SAVE_2WORDS
1693 ? gen_rtx_REG (DImode, regno)
1694 : gen_rtx_REG (SImode, regno),
1695 info->reg_offset[regno]);
1698 /* Save or restore callee-saved registers that are kept outside the frame
1699 header. The function saves the registers if OP is FRV_STORE and restores
1700 them if OP is FRV_LOAD. INFO is the stack information generated by
1701 frv_stack_info. */
1702 static void
1703 frv_frame_access_standard_regs (enum frv_stack_op op, frv_stack_t *info)
1705 frv_frame_accessor_t accessor;
1707 accessor.op = op;
1708 accessor.base = stack_pointer_rtx;
1709 accessor.base_offset = 0;
1710 frv_frame_access_multi (&accessor, info, STACK_REGS_GPR);
1711 frv_frame_access_multi (&accessor, info, STACK_REGS_FPR);
1712 frv_frame_access_multi (&accessor, info, STACK_REGS_LCR);
1716 /* Called after register allocation to add any instructions needed for the
1717 prologue. Using a prologue insn is favored compared to putting all of the
1718 instructions in the TARGET_ASM_FUNCTION_PROLOGUE target hook, since
1719 it allows the scheduler to intermix instructions with the saves of
1720 the caller saved registers. In some cases, it might be necessary
1721 to emit a barrier instruction as the last insn to prevent such
1722 scheduling.
1724 Also any insns generated here should have RTX_FRAME_RELATED_P(insn) = 1
1725 so that the debug info generation code can handle them properly. */
1726 void
1727 frv_expand_prologue (void)
1729 frv_stack_t *info = frv_stack_info ();
1730 rtx sp = stack_pointer_rtx;
1731 rtx fp = frame_pointer_rtx;
1732 frv_frame_accessor_t accessor;
1734 if (TARGET_DEBUG_STACK)
1735 frv_debug_stack (info);
1737 if (flag_stack_usage_info)
1738 current_function_static_stack_size = info->total_size;
1740 if (info->total_size == 0)
1741 return;
1743 /* We're interested in three areas of the frame here:
1745 A: the register save area
1746 B: the old FP
1747 C: the header after B
1749 If the frame pointer isn't used, we'll have to set up A, B and C
1750 using the stack pointer. If the frame pointer is used, we'll access
1751 them as follows:
1753 A: set up using sp
1754 B: set up using sp or a temporary (see below)
1755 C: set up using fp
1757 We set up B using the stack pointer if the frame is small enough.
1758 Otherwise, it's more efficient to copy the old stack pointer into a
1759 temporary and use that.
1761 Note that it's important to make sure the prologue and epilogue use the
1762 same registers to access A and C, since doing otherwise will confuse
1763 the aliasing code. */
1765 /* Set up ACCESSOR for accessing region B above. If the frame pointer
1766 isn't used, the same method will serve for C. */
1767 accessor.op = FRV_STORE;
1768 if (frame_pointer_needed && info->total_size > 2048)
1770 accessor.base = gen_rtx_REG (Pmode, OLD_SP_REGNO);
1771 accessor.base_offset = info->total_size;
1772 emit_insn (gen_movsi (accessor.base, sp));
1774 else
1776 accessor.base = stack_pointer_rtx;
1777 accessor.base_offset = 0;
1780 /* Allocate the stack space. */
1782 rtx asm_offset = frv_frame_offset_rtx (-info->total_size);
1783 rtx dwarf_offset = GEN_INT (-info->total_size);
1785 frv_frame_insn (gen_stack_adjust (sp, sp, asm_offset),
1786 gen_rtx_SET (sp, gen_rtx_PLUS (Pmode, sp, dwarf_offset)));
1789 /* If the frame pointer is needed, store the old one at (sp + FP_OFFSET)
1790 and point the new one to that location. */
1791 if (frame_pointer_needed)
1793 int fp_offset = info->reg_offset[FRAME_POINTER_REGNUM];
1795 /* ASM_SRC and DWARF_SRC both point to the frame header. ASM_SRC is
1796 based on ACCESSOR.BASE but DWARF_SRC is always based on the stack
1797 pointer. */
1798 rtx asm_src = plus_constant (Pmode, accessor.base,
1799 fp_offset - accessor.base_offset);
1800 rtx dwarf_src = plus_constant (Pmode, sp, fp_offset);
1802 /* Store the old frame pointer at (sp + FP_OFFSET). */
1803 frv_frame_access (&accessor, fp, fp_offset);
1805 /* Set up the new frame pointer. */
1806 frv_frame_insn (gen_rtx_SET (fp, asm_src),
1807 gen_rtx_SET (fp, dwarf_src));
1809 /* Access region C from the frame pointer. */
1810 accessor.base = fp;
1811 accessor.base_offset = fp_offset;
1814 /* Set up region C. */
1815 frv_frame_access_multi (&accessor, info, STACK_REGS_STRUCT);
1816 frv_frame_access_multi (&accessor, info, STACK_REGS_LR);
1817 frv_frame_access_multi (&accessor, info, STACK_REGS_STDARG);
1819 /* Set up region A. */
1820 frv_frame_access_standard_regs (FRV_STORE, info);
1822 /* If this is a varargs/stdarg function, issue a blockage to prevent the
1823 scheduler from moving loads before the stores saving the registers. */
1824 if (info->stdarg_size > 0)
1825 emit_insn (gen_blockage ());
1827 /* Set up pic register/small data register for this function. */
1828 if (!TARGET_FDPIC && flag_pic && crtl->uses_pic_offset_table)
1829 emit_insn (gen_pic_prologue (gen_rtx_REG (Pmode, PIC_REGNO),
1830 gen_rtx_REG (Pmode, LR_REGNO),
1831 gen_rtx_REG (SImode, OFFSET_REGNO)));
1835 /* Under frv, all of the work is done via frv_expand_epilogue, but
1836 this function provides a convenient place to do cleanup. */
1838 static void
1839 frv_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
1840 HOST_WIDE_INT size ATTRIBUTE_UNUSED)
1842 frv_stack_cache = (frv_stack_t *)0;
1844 /* Zap last used registers for conditional execution. */
1845 memset (&frv_ifcvt.tmp_reg, 0, sizeof (frv_ifcvt.tmp_reg));
1847 /* Release the bitmap of created insns. */
1848 BITMAP_FREE (frv_ifcvt.scratch_insns_bitmap);
1852 /* Called after register allocation to add any instructions needed for the
1853 epilogue. Using an epilogue insn is favored compared to putting all of the
1854 instructions in the TARGET_ASM_FUNCTION_PROLOGUE target hook, since
1855 it allows the scheduler to intermix instructions with the saves of
1856 the caller saved registers. In some cases, it might be necessary
1857 to emit a barrier instruction as the last insn to prevent such
1858 scheduling. */
1860 void
1861 frv_expand_epilogue (bool emit_return)
1863 frv_stack_t *info = frv_stack_info ();
1864 rtx fp = frame_pointer_rtx;
1865 rtx sp = stack_pointer_rtx;
1866 rtx return_addr;
1867 int fp_offset;
1869 fp_offset = info->reg_offset[FRAME_POINTER_REGNUM];
1871 /* Restore the stack pointer to its original value if alloca or the like
1872 is used. */
1873 if (! crtl->sp_is_unchanging)
1874 emit_insn (gen_addsi3 (sp, fp, frv_frame_offset_rtx (-fp_offset)));
1876 /* Restore the callee-saved registers that were used in this function. */
1877 frv_frame_access_standard_regs (FRV_LOAD, info);
1879 /* Set RETURN_ADDR to the address we should return to. Set it to NULL if
1880 no return instruction should be emitted. */
1881 if (info->save_p[LR_REGNO])
1883 int lr_offset;
1884 rtx mem;
1886 /* Use the same method to access the link register's slot as we did in
1887 the prologue. In other words, use the frame pointer if available,
1888 otherwise use the stack pointer.
1890 LR_OFFSET is the offset of the link register's slot from the start
1891 of the frame and MEM is a memory rtx for it. */
1892 lr_offset = info->reg_offset[LR_REGNO];
1893 if (frame_pointer_needed)
1894 mem = frv_frame_mem (Pmode, fp, lr_offset - fp_offset);
1895 else
1896 mem = frv_frame_mem (Pmode, sp, lr_offset);
1898 /* Load the old link register into a GPR. */
1899 return_addr = gen_rtx_REG (Pmode, TEMP_REGNO);
1900 emit_insn (gen_rtx_SET (return_addr, mem));
1902 else
1903 return_addr = gen_rtx_REG (Pmode, LR_REGNO);
1905 /* Restore the old frame pointer. Emit a USE afterwards to make sure
1906 the load is preserved. */
1907 if (frame_pointer_needed)
1909 emit_insn (gen_rtx_SET (fp, gen_rtx_MEM (Pmode, fp)));
1910 emit_use (fp);
1913 /* Deallocate the stack frame. */
1914 if (info->total_size != 0)
1916 rtx offset = frv_frame_offset_rtx (info->total_size);
1917 emit_insn (gen_stack_adjust (sp, sp, offset));
1920 /* If this function uses eh_return, add the final stack adjustment now. */
1921 if (crtl->calls_eh_return)
1922 emit_insn (gen_stack_adjust (sp, sp, EH_RETURN_STACKADJ_RTX));
1924 if (emit_return)
1925 emit_jump_insn (gen_epilogue_return (return_addr));
1926 else
1928 rtx lr = return_addr;
1930 if (REGNO (return_addr) != LR_REGNO)
1932 lr = gen_rtx_REG (Pmode, LR_REGNO);
1933 emit_move_insn (lr, return_addr);
1936 emit_use (lr);
1941 /* Worker function for TARGET_ASM_OUTPUT_MI_THUNK. */
1943 static void
1944 frv_asm_output_mi_thunk (FILE *file,
1945 tree thunk_fndecl ATTRIBUTE_UNUSED,
1946 HOST_WIDE_INT delta,
1947 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED,
1948 tree function)
1950 const char *name_func = XSTR (XEXP (DECL_RTL (function), 0), 0);
1951 const char *name_arg0 = reg_names[FIRST_ARG_REGNUM];
1952 const char *name_jmp = reg_names[JUMP_REGNO];
1953 const char *parallel = (frv_issue_rate () > 1 ? ".p" : "");
1955 /* Do the add using an addi if possible. */
1956 if (IN_RANGE (delta, -2048, 2047))
1957 fprintf (file, "\taddi %s,#%d,%s\n", name_arg0, (int) delta, name_arg0);
1958 else
1960 const char *const name_add = reg_names[TEMP_REGNO];
1961 fprintf (file, "\tsethi%s #hi(" HOST_WIDE_INT_PRINT_DEC "),%s\n",
1962 parallel, delta, name_add);
1963 fprintf (file, "\tsetlo #lo(" HOST_WIDE_INT_PRINT_DEC "),%s\n",
1964 delta, name_add);
1965 fprintf (file, "\tadd %s,%s,%s\n", name_add, name_arg0, name_arg0);
1968 if (TARGET_FDPIC)
1970 const char *name_pic = reg_names[FDPIC_REGNO];
1971 name_jmp = reg_names[FDPIC_FPTR_REGNO];
1973 if (flag_pic != 1)
1975 fprintf (file, "\tsethi%s #gotofffuncdeschi(", parallel);
1976 assemble_name (file, name_func);
1977 fprintf (file, "),%s\n", name_jmp);
1979 fprintf (file, "\tsetlo #gotofffuncdesclo(");
1980 assemble_name (file, name_func);
1981 fprintf (file, "),%s\n", name_jmp);
1983 fprintf (file, "\tldd @(%s,%s), %s\n", name_jmp, name_pic, name_jmp);
1985 else
1987 fprintf (file, "\tlddo @(%s,#gotofffuncdesc12(", name_pic);
1988 assemble_name (file, name_func);
1989 fprintf (file, "\t)), %s\n", name_jmp);
1992 else if (!flag_pic)
1994 fprintf (file, "\tsethi%s #hi(", parallel);
1995 assemble_name (file, name_func);
1996 fprintf (file, "),%s\n", name_jmp);
1998 fprintf (file, "\tsetlo #lo(");
1999 assemble_name (file, name_func);
2000 fprintf (file, "),%s\n", name_jmp);
2002 else
2004 /* Use JUMP_REGNO as a temporary PIC register. */
2005 const char *name_lr = reg_names[LR_REGNO];
2006 const char *name_gppic = name_jmp;
2007 const char *name_tmp = reg_names[TEMP_REGNO];
2009 fprintf (file, "\tmovsg %s,%s\n", name_lr, name_tmp);
2010 fprintf (file, "\tcall 1f\n");
2011 fprintf (file, "1:\tmovsg %s,%s\n", name_lr, name_gppic);
2012 fprintf (file, "\tmovgs %s,%s\n", name_tmp, name_lr);
2013 fprintf (file, "\tsethi%s #gprelhi(1b),%s\n", parallel, name_tmp);
2014 fprintf (file, "\tsetlo #gprello(1b),%s\n", name_tmp);
2015 fprintf (file, "\tsub %s,%s,%s\n", name_gppic, name_tmp, name_gppic);
2017 fprintf (file, "\tsethi%s #gprelhi(", parallel);
2018 assemble_name (file, name_func);
2019 fprintf (file, "),%s\n", name_tmp);
2021 fprintf (file, "\tsetlo #gprello(");
2022 assemble_name (file, name_func);
2023 fprintf (file, "),%s\n", name_tmp);
2025 fprintf (file, "\tadd %s,%s,%s\n", name_gppic, name_tmp, name_jmp);
2028 /* Jump to the function address. */
2029 fprintf (file, "\tjmpl @(%s,%s)\n", name_jmp, reg_names[GPR_FIRST+0]);
2034 /* On frv, create a frame whenever we need to create stack. */
2036 static bool
2037 frv_frame_pointer_required (void)
2039 /* If we forgoing the usual linkage requirements, we only need
2040 a frame pointer if the stack pointer might change. */
2041 if (!TARGET_LINKED_FP)
2042 return !crtl->sp_is_unchanging;
2044 if (! crtl->is_leaf)
2045 return true;
2047 if (get_frame_size () != 0)
2048 return true;
2050 if (cfun->stdarg)
2051 return true;
2053 if (!crtl->sp_is_unchanging)
2054 return true;
2056 if (!TARGET_FDPIC && flag_pic && crtl->uses_pic_offset_table)
2057 return true;
2059 if (profile_flag)
2060 return true;
2062 if (cfun->machine->frame_needed)
2063 return true;
2065 return false;
2069 /* Worker function for TARGET_CAN_ELIMINATE. */
2071 bool
2072 frv_can_eliminate (const int from, const int to)
2074 return (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM
2075 ? ! frame_pointer_needed
2076 : true);
2079 /* This function returns the initial difference between the specified
2080 pair of registers. */
2082 /* See frv_stack_info for more details on the frv stack frame. */
2085 frv_initial_elimination_offset (int from, int to)
2087 frv_stack_t *info = frv_stack_info ();
2088 int ret = 0;
2090 if (to == STACK_POINTER_REGNUM && from == ARG_POINTER_REGNUM)
2091 ret = info->total_size - info->pretend_size;
2093 else if (to == STACK_POINTER_REGNUM && from == FRAME_POINTER_REGNUM)
2094 ret = info->reg_offset[FRAME_POINTER_REGNUM];
2096 else if (to == FRAME_POINTER_REGNUM && from == ARG_POINTER_REGNUM)
2097 ret = (info->total_size
2098 - info->reg_offset[FRAME_POINTER_REGNUM]
2099 - info->pretend_size);
2101 else
2102 gcc_unreachable ();
2104 if (TARGET_DEBUG_STACK)
2105 fprintf (stderr, "Eliminate %s to %s by adding %d\n",
2106 reg_names [from], reg_names[to], ret);
2108 return ret;
2112 /* Worker function for TARGET_SETUP_INCOMING_VARARGS. */
2114 static void
2115 frv_setup_incoming_varargs (cumulative_args_t cum_v,
2116 machine_mode mode,
2117 tree type ATTRIBUTE_UNUSED,
2118 int *pretend_size,
2119 int second_time)
2121 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
2123 if (TARGET_DEBUG_ARG)
2124 fprintf (stderr,
2125 "setup_vararg: words = %2d, mode = %4s, pretend_size = %d, second_time = %d\n",
2126 *cum, GET_MODE_NAME (mode), *pretend_size, second_time);
2130 /* Worker function for TARGET_EXPAND_BUILTIN_SAVEREGS. */
2132 static rtx
2133 frv_expand_builtin_saveregs (void)
2135 int offset = UNITS_PER_WORD * FRV_NUM_ARG_REGS;
2137 if (TARGET_DEBUG_ARG)
2138 fprintf (stderr, "expand_builtin_saveregs: offset from ap = %d\n",
2139 offset);
2141 return gen_rtx_PLUS (Pmode, virtual_incoming_args_rtx, GEN_INT (- offset));
2145 /* Expand __builtin_va_start to do the va_start macro. */
2147 static void
2148 frv_expand_builtin_va_start (tree valist, rtx nextarg)
2150 tree t;
2151 int num = crtl->args.info - FIRST_ARG_REGNUM - FRV_NUM_ARG_REGS;
2153 nextarg = gen_rtx_PLUS (Pmode, virtual_incoming_args_rtx,
2154 GEN_INT (UNITS_PER_WORD * num));
2156 if (TARGET_DEBUG_ARG)
2158 fprintf (stderr, "va_start: args_info = %d, num = %d\n",
2159 crtl->args.info, num);
2161 debug_rtx (nextarg);
2164 t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist,
2165 fold_convert (TREE_TYPE (valist),
2166 make_tree (sizetype, nextarg)));
2167 TREE_SIDE_EFFECTS (t) = 1;
2169 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
2173 /* Expand a block move operation, and return 1 if successful. Return 0
2174 if we should let the compiler generate normal code.
2176 operands[0] is the destination
2177 operands[1] is the source
2178 operands[2] is the length
2179 operands[3] is the alignment */
2181 /* Maximum number of loads to do before doing the stores */
2182 #ifndef MAX_MOVE_REG
2183 #define MAX_MOVE_REG 4
2184 #endif
2186 /* Maximum number of total loads to do. */
2187 #ifndef TOTAL_MOVE_REG
2188 #define TOTAL_MOVE_REG 8
2189 #endif
2192 frv_expand_block_move (rtx operands[])
2194 rtx orig_dest = operands[0];
2195 rtx orig_src = operands[1];
2196 rtx bytes_rtx = operands[2];
2197 rtx align_rtx = operands[3];
2198 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
2199 int align;
2200 int bytes;
2201 int offset;
2202 int num_reg;
2203 int i;
2204 rtx src_reg;
2205 rtx dest_reg;
2206 rtx src_addr;
2207 rtx dest_addr;
2208 rtx src_mem;
2209 rtx dest_mem;
2210 rtx tmp_reg;
2211 rtx stores[MAX_MOVE_REG];
2212 int move_bytes;
2213 machine_mode mode;
2215 /* If this is not a fixed size move, just call memcpy. */
2216 if (! constp)
2217 return FALSE;
2219 /* This should be a fixed size alignment. */
2220 gcc_assert (GET_CODE (align_rtx) == CONST_INT);
2222 align = INTVAL (align_rtx);
2224 /* Anything to move? */
2225 bytes = INTVAL (bytes_rtx);
2226 if (bytes <= 0)
2227 return TRUE;
2229 /* Don't support real large moves. */
2230 if (bytes > TOTAL_MOVE_REG*align)
2231 return FALSE;
2233 /* Move the address into scratch registers. */
2234 dest_reg = copy_addr_to_reg (XEXP (orig_dest, 0));
2235 src_reg = copy_addr_to_reg (XEXP (orig_src, 0));
2237 num_reg = offset = 0;
2238 for ( ; bytes > 0; (bytes -= move_bytes), (offset += move_bytes))
2240 /* Calculate the correct offset for src/dest. */
2241 if (offset == 0)
2243 src_addr = src_reg;
2244 dest_addr = dest_reg;
2246 else
2248 src_addr = plus_constant (Pmode, src_reg, offset);
2249 dest_addr = plus_constant (Pmode, dest_reg, offset);
2252 /* Generate the appropriate load and store, saving the stores
2253 for later. */
2254 if (bytes >= 4 && align >= 4)
2255 mode = SImode;
2256 else if (bytes >= 2 && align >= 2)
2257 mode = HImode;
2258 else
2259 mode = QImode;
2261 move_bytes = GET_MODE_SIZE (mode);
2262 tmp_reg = gen_reg_rtx (mode);
2263 src_mem = change_address (orig_src, mode, src_addr);
2264 dest_mem = change_address (orig_dest, mode, dest_addr);
2265 emit_insn (gen_rtx_SET (tmp_reg, src_mem));
2266 stores[num_reg++] = gen_rtx_SET (dest_mem, tmp_reg);
2268 if (num_reg >= MAX_MOVE_REG)
2270 for (i = 0; i < num_reg; i++)
2271 emit_insn (stores[i]);
2272 num_reg = 0;
2276 for (i = 0; i < num_reg; i++)
2277 emit_insn (stores[i]);
2279 return TRUE;
2283 /* Expand a block clear operation, and return 1 if successful. Return 0
2284 if we should let the compiler generate normal code.
2286 operands[0] is the destination
2287 operands[1] is the length
2288 operands[3] is the alignment */
2291 frv_expand_block_clear (rtx operands[])
2293 rtx orig_dest = operands[0];
2294 rtx bytes_rtx = operands[1];
2295 rtx align_rtx = operands[3];
2296 int constp = (GET_CODE (bytes_rtx) == CONST_INT);
2297 int align;
2298 int bytes;
2299 int offset;
2300 rtx dest_reg;
2301 rtx dest_addr;
2302 rtx dest_mem;
2303 int clear_bytes;
2304 machine_mode mode;
2306 /* If this is not a fixed size move, just call memcpy. */
2307 if (! constp)
2308 return FALSE;
2310 /* This should be a fixed size alignment. */
2311 gcc_assert (GET_CODE (align_rtx) == CONST_INT);
2313 align = INTVAL (align_rtx);
2315 /* Anything to move? */
2316 bytes = INTVAL (bytes_rtx);
2317 if (bytes <= 0)
2318 return TRUE;
2320 /* Don't support real large clears. */
2321 if (bytes > TOTAL_MOVE_REG*align)
2322 return FALSE;
2324 /* Move the address into a scratch register. */
2325 dest_reg = copy_addr_to_reg (XEXP (orig_dest, 0));
2327 offset = 0;
2328 for ( ; bytes > 0; (bytes -= clear_bytes), (offset += clear_bytes))
2330 /* Calculate the correct offset for src/dest. */
2331 dest_addr = ((offset == 0)
2332 ? dest_reg
2333 : plus_constant (Pmode, dest_reg, offset));
2335 /* Generate the appropriate store of gr0. */
2336 if (bytes >= 4 && align >= 4)
2337 mode = SImode;
2338 else if (bytes >= 2 && align >= 2)
2339 mode = HImode;
2340 else
2341 mode = QImode;
2343 clear_bytes = GET_MODE_SIZE (mode);
2344 dest_mem = change_address (orig_dest, mode, dest_addr);
2345 emit_insn (gen_rtx_SET (dest_mem, const0_rtx));
2348 return TRUE;
2352 /* The following variable is used to output modifiers of assembler
2353 code of the current output insn. */
2355 static rtx *frv_insn_operands;
2357 /* The following function is used to add assembler insn code suffix .p
2358 if it is necessary. */
2360 const char *
2361 frv_asm_output_opcode (FILE *f, const char *ptr)
2363 int c;
2365 if (frv_insn_packing_flag <= 0)
2366 return ptr;
2368 for (; *ptr && *ptr != ' ' && *ptr != '\t';)
2370 c = *ptr++;
2371 if (c == '%' && ((*ptr >= 'a' && *ptr <= 'z')
2372 || (*ptr >= 'A' && *ptr <= 'Z')))
2374 int letter = *ptr++;
2376 c = atoi (ptr);
2377 frv_print_operand (f, frv_insn_operands [c], letter);
2378 while ((c = *ptr) >= '0' && c <= '9')
2379 ptr++;
2381 else
2382 fputc (c, f);
2385 fprintf (f, ".p");
2387 return ptr;
2390 /* Set up the packing bit for the current output insn. Note that this
2391 function is not called for asm insns. */
2393 void
2394 frv_final_prescan_insn (rtx_insn *insn, rtx *opvec,
2395 int noperands ATTRIBUTE_UNUSED)
2397 if (INSN_P (insn))
2399 if (frv_insn_packing_flag >= 0)
2401 frv_insn_operands = opvec;
2402 frv_insn_packing_flag = PACKING_FLAG_P (insn);
2404 else if (recog_memoized (insn) >= 0
2405 && get_attr_acc_group (insn) == ACC_GROUP_ODD)
2406 /* Packing optimizations have been disabled, but INSN can only
2407 be issued in M1. Insert an mnop in M0. */
2408 fprintf (asm_out_file, "\tmnop.p\n");
2414 /* A C expression whose value is RTL representing the address in a stack frame
2415 where the pointer to the caller's frame is stored. Assume that FRAMEADDR is
2416 an RTL expression for the address of the stack frame itself.
2418 If you don't define this macro, the default is to return the value of
2419 FRAMEADDR--that is, the stack frame address is also the address of the stack
2420 word that points to the previous frame. */
2422 /* The default is correct, but we need to make sure the frame gets created. */
2424 frv_dynamic_chain_address (rtx frame)
2426 cfun->machine->frame_needed = 1;
2427 return frame;
2431 /* A C expression whose value is RTL representing the value of the return
2432 address for the frame COUNT steps up from the current frame, after the
2433 prologue. FRAMEADDR is the frame pointer of the COUNT frame, or the frame
2434 pointer of the COUNT - 1 frame if `RETURN_ADDR_IN_PREVIOUS_FRAME' is
2435 defined.
2437 The value of the expression must always be the correct address when COUNT is
2438 zero, but may be `NULL_RTX' if there is not way to determine the return
2439 address of other frames. */
2442 frv_return_addr_rtx (int count, rtx frame)
2444 if (count != 0)
2445 return const0_rtx;
2446 cfun->machine->frame_needed = 1;
2447 return gen_rtx_MEM (Pmode, plus_constant (Pmode, frame, 8));
2450 /* Given a memory reference MEMREF, interpret the referenced memory as
2451 an array of MODE values, and return a reference to the element
2452 specified by INDEX. Assume that any pre-modification implicit in
2453 MEMREF has already happened.
2455 MEMREF must be a legitimate operand for modes larger than SImode.
2456 frv_legitimate_address_p forbids register+register addresses, which
2457 this function cannot handle. */
2459 frv_index_memory (rtx memref, machine_mode mode, int index)
2461 rtx base = XEXP (memref, 0);
2462 if (GET_CODE (base) == PRE_MODIFY)
2463 base = XEXP (base, 0);
2464 return change_address (memref, mode,
2465 plus_constant (Pmode, base,
2466 index * GET_MODE_SIZE (mode)));
2470 /* Print a memory address as an operand to reference that memory location. */
2471 static void
2472 frv_print_operand_address (FILE * stream, machine_mode /* mode */, rtx x)
2474 if (GET_CODE (x) == MEM)
2475 x = XEXP (x, 0);
2477 switch (GET_CODE (x))
2479 case REG:
2480 fputs (reg_names [ REGNO (x)], stream);
2481 return;
2483 case CONST_INT:
2484 fprintf (stream, "%ld", (long) INTVAL (x));
2485 return;
2487 case SYMBOL_REF:
2488 assemble_name (stream, XSTR (x, 0));
2489 return;
2491 case LABEL_REF:
2492 case CONST:
2493 output_addr_const (stream, x);
2494 return;
2496 case PLUS:
2497 /* Poorly constructed asm statements can trigger this alternative.
2498 See gcc/testsuite/gcc.dg/asm-4.c for an example. */
2499 frv_print_operand_memory_reference (stream, x, 0);
2500 return;
2502 default:
2503 break;
2506 fatal_insn ("bad insn to frv_print_operand_address:", x);
2510 static void
2511 frv_print_operand_memory_reference_reg (FILE * stream, rtx x)
2513 int regno = true_regnum (x);
2514 if (GPR_P (regno))
2515 fputs (reg_names[regno], stream);
2516 else
2517 fatal_insn ("bad register to frv_print_operand_memory_reference_reg:", x);
2520 /* Print a memory reference suitable for the ld/st instructions. */
2522 static void
2523 frv_print_operand_memory_reference (FILE * stream, rtx x, int addr_offset)
2525 struct frv_unspec unspec;
2526 rtx x0 = NULL_RTX;
2527 rtx x1 = NULL_RTX;
2529 switch (GET_CODE (x))
2531 case SUBREG:
2532 case REG:
2533 x0 = x;
2534 break;
2536 case PRE_MODIFY: /* (pre_modify (reg) (plus (reg) (reg))) */
2537 x0 = XEXP (x, 0);
2538 x1 = XEXP (XEXP (x, 1), 1);
2539 break;
2541 case CONST_INT:
2542 x1 = x;
2543 break;
2545 case PLUS:
2546 x0 = XEXP (x, 0);
2547 x1 = XEXP (x, 1);
2548 if (GET_CODE (x0) == CONST_INT)
2550 x0 = XEXP (x, 1);
2551 x1 = XEXP (x, 0);
2553 break;
2555 default:
2556 fatal_insn ("bad insn to frv_print_operand_memory_reference:", x);
2557 break;
2561 if (addr_offset)
2563 if (!x1)
2564 x1 = const0_rtx;
2565 else if (GET_CODE (x1) != CONST_INT)
2566 fatal_insn ("bad insn to frv_print_operand_memory_reference:", x);
2569 fputs ("@(", stream);
2570 if (!x0)
2571 fputs (reg_names[GPR_R0], stream);
2572 else if (GET_CODE (x0) == REG || GET_CODE (x0) == SUBREG)
2573 frv_print_operand_memory_reference_reg (stream, x0);
2574 else
2575 fatal_insn ("bad insn to frv_print_operand_memory_reference:", x);
2577 fputs (",", stream);
2578 if (!x1)
2579 fputs (reg_names [GPR_R0], stream);
2581 else
2583 switch (GET_CODE (x1))
2585 case SUBREG:
2586 case REG:
2587 frv_print_operand_memory_reference_reg (stream, x1);
2588 break;
2590 case CONST_INT:
2591 fprintf (stream, "%ld", (long) (INTVAL (x1) + addr_offset));
2592 break;
2594 case CONST:
2595 if (!frv_const_unspec_p (x1, &unspec))
2596 fatal_insn ("bad insn to frv_print_operand_memory_reference:", x1);
2597 frv_output_const_unspec (stream, &unspec);
2598 break;
2600 default:
2601 fatal_insn ("bad insn to frv_print_operand_memory_reference:", x);
2605 fputs (")", stream);
2609 /* Return 2 for likely branches and 0 for non-likely branches */
2611 #define FRV_JUMP_LIKELY 2
2612 #define FRV_JUMP_NOT_LIKELY 0
2614 static int
2615 frv_print_operand_jump_hint (rtx_insn *insn)
2617 rtx note;
2618 rtx labelref;
2619 int ret;
2620 int prob = -1;
2621 enum { UNKNOWN, BACKWARD, FORWARD } jump_type = UNKNOWN;
2623 gcc_assert (JUMP_P (insn));
2625 /* Assume any non-conditional jump is likely. */
2626 if (! any_condjump_p (insn))
2627 ret = FRV_JUMP_LIKELY;
2629 else
2631 labelref = condjump_label (insn);
2632 if (labelref)
2634 rtx label = XEXP (labelref, 0);
2635 jump_type = (insn_current_address > INSN_ADDRESSES (INSN_UID (label))
2636 ? BACKWARD
2637 : FORWARD);
2640 note = find_reg_note (insn, REG_BR_PROB, 0);
2641 if (!note)
2642 ret = ((jump_type == BACKWARD) ? FRV_JUMP_LIKELY : FRV_JUMP_NOT_LIKELY);
2644 else
2646 prob = XINT (note, 0);
2647 ret = ((prob >= (REG_BR_PROB_BASE / 2))
2648 ? FRV_JUMP_LIKELY
2649 : FRV_JUMP_NOT_LIKELY);
2653 #if 0
2654 if (TARGET_DEBUG)
2656 char *direction;
2658 switch (jump_type)
2660 default:
2661 case UNKNOWN: direction = "unknown jump direction"; break;
2662 case BACKWARD: direction = "jump backward"; break;
2663 case FORWARD: direction = "jump forward"; break;
2666 fprintf (stderr,
2667 "%s: uid %ld, %s, probability = %d, max prob. = %d, hint = %d\n",
2668 IDENTIFIER_POINTER (DECL_NAME (current_function_decl)),
2669 (long)INSN_UID (insn), direction, prob,
2670 REG_BR_PROB_BASE, ret);
2672 #endif
2674 return ret;
2678 /* Return the comparison operator to use for CODE given that the ICC
2679 register is OP0. */
2681 static const char *
2682 comparison_string (enum rtx_code code, rtx op0)
2684 bool is_nz_p = GET_MODE (op0) == CC_NZmode;
2685 switch (code)
2687 default: output_operand_lossage ("bad condition code");
2688 case EQ: return "eq";
2689 case NE: return "ne";
2690 case LT: return is_nz_p ? "n" : "lt";
2691 case LE: return "le";
2692 case GT: return "gt";
2693 case GE: return is_nz_p ? "p" : "ge";
2694 case LTU: return is_nz_p ? "no" : "c";
2695 case LEU: return is_nz_p ? "eq" : "ls";
2696 case GTU: return is_nz_p ? "ne" : "hi";
2697 case GEU: return is_nz_p ? "ra" : "nc";
2701 /* Print an operand to an assembler instruction.
2703 `%' followed by a letter and a digit says to output an operand in an
2704 alternate fashion. Four letters have standard, built-in meanings
2705 described below. The hook `TARGET_PRINT_OPERAND' can define
2706 additional letters with nonstandard meanings.
2708 `%cDIGIT' can be used to substitute an operand that is a constant value
2709 without the syntax that normally indicates an immediate operand.
2711 `%nDIGIT' is like `%cDIGIT' except that the value of the constant is negated
2712 before printing.
2714 `%aDIGIT' can be used to substitute an operand as if it were a memory
2715 reference, with the actual operand treated as the address. This may be
2716 useful when outputting a "load address" instruction, because often the
2717 assembler syntax for such an instruction requires you to write the operand
2718 as if it were a memory reference.
2720 `%lDIGIT' is used to substitute a `label_ref' into a jump instruction.
2722 `%=' outputs a number which is unique to each instruction in the entire
2723 compilation. This is useful for making local labels to be referred to more
2724 than once in a single template that generates multiple assembler
2725 instructions.
2727 `%' followed by a punctuation character specifies a substitution that
2728 does not use an operand. Only one case is standard: `%%' outputs a
2729 `%' into the assembler code. Other nonstandard cases can be defined
2730 in the `TARGET_PRINT_OPERAND' hook. You must also define which
2731 punctuation characters are valid with the
2732 `TARGET_PRINT_OPERAND_PUNCT_VALID_P' hook. */
2734 static void
2735 frv_print_operand (FILE * file, rtx x, int code)
2737 struct frv_unspec unspec;
2738 HOST_WIDE_INT value;
2739 int offset;
2741 if (code != 0 && !ISALPHA (code))
2742 value = 0;
2744 else if (GET_CODE (x) == CONST_INT)
2745 value = INTVAL (x);
2747 else if (GET_CODE (x) == CONST_DOUBLE)
2749 if (GET_MODE (x) == SFmode)
2751 long l;
2753 REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), l);
2754 value = l;
2757 else if (GET_MODE (x) == VOIDmode)
2758 value = CONST_DOUBLE_LOW (x);
2760 else
2761 fatal_insn ("bad insn in frv_print_operand, bad const_double", x);
2764 else
2765 value = 0;
2767 switch (code)
2770 case '.':
2771 /* Output r0. */
2772 fputs (reg_names[GPR_R0], file);
2773 break;
2775 case '#':
2776 fprintf (file, "%d", frv_print_operand_jump_hint (current_output_insn));
2777 break;
2779 case '@':
2780 /* Output small data area base register (gr16). */
2781 fputs (reg_names[SDA_BASE_REG], file);
2782 break;
2784 case '~':
2785 /* Output pic register (gr17). */
2786 fputs (reg_names[PIC_REGNO], file);
2787 break;
2789 case '*':
2790 /* Output the temporary integer CCR register. */
2791 fputs (reg_names[ICR_TEMP], file);
2792 break;
2794 case '&':
2795 /* Output the temporary integer CC register. */
2796 fputs (reg_names[ICC_TEMP], file);
2797 break;
2799 /* case 'a': print an address. */
2801 case 'C':
2802 /* Print appropriate test for integer branch false operation. */
2803 fputs (comparison_string (reverse_condition (GET_CODE (x)),
2804 XEXP (x, 0)), file);
2805 break;
2807 case 'c':
2808 /* Print appropriate test for integer branch true operation. */
2809 fputs (comparison_string (GET_CODE (x), XEXP (x, 0)), file);
2810 break;
2812 case 'e':
2813 /* Print 1 for a NE and 0 for an EQ to give the final argument
2814 for a conditional instruction. */
2815 if (GET_CODE (x) == NE)
2816 fputs ("1", file);
2818 else if (GET_CODE (x) == EQ)
2819 fputs ("0", file);
2821 else
2822 fatal_insn ("bad insn to frv_print_operand, 'e' modifier:", x);
2823 break;
2825 case 'F':
2826 /* Print appropriate test for floating point branch false operation. */
2827 switch (GET_CODE (x))
2829 default:
2830 fatal_insn ("bad insn to frv_print_operand, 'F' modifier:", x);
2832 case EQ: fputs ("ne", file); break;
2833 case NE: fputs ("eq", file); break;
2834 case LT: fputs ("uge", file); break;
2835 case LE: fputs ("ug", file); break;
2836 case GT: fputs ("ule", file); break;
2837 case GE: fputs ("ul", file); break;
2839 break;
2841 case 'f':
2842 /* Print appropriate test for floating point branch true operation. */
2843 switch (GET_CODE (x))
2845 default:
2846 fatal_insn ("bad insn to frv_print_operand, 'f' modifier:", x);
2848 case EQ: fputs ("eq", file); break;
2849 case NE: fputs ("ne", file); break;
2850 case LT: fputs ("lt", file); break;
2851 case LE: fputs ("le", file); break;
2852 case GT: fputs ("gt", file); break;
2853 case GE: fputs ("ge", file); break;
2855 break;
2857 case 'g':
2858 /* Print appropriate GOT function. */
2859 if (GET_CODE (x) != CONST_INT)
2860 fatal_insn ("bad insn to frv_print_operand, 'g' modifier:", x);
2861 fputs (unspec_got_name (INTVAL (x)), file);
2862 break;
2864 case 'I':
2865 /* Print 'i' if the operand is a constant, or is a memory reference that
2866 adds a constant. */
2867 if (GET_CODE (x) == MEM)
2868 x = ((GET_CODE (XEXP (x, 0)) == PLUS)
2869 ? XEXP (XEXP (x, 0), 1)
2870 : XEXP (x, 0));
2871 else if (GET_CODE (x) == PLUS)
2872 x = XEXP (x, 1);
2874 switch (GET_CODE (x))
2876 default:
2877 break;
2879 case CONST_INT:
2880 case SYMBOL_REF:
2881 case CONST:
2882 fputs ("i", file);
2883 break;
2885 break;
2887 case 'i':
2888 /* For jump instructions, print 'i' if the operand is a constant or
2889 is an expression that adds a constant. */
2890 if (GET_CODE (x) == CONST_INT)
2891 fputs ("i", file);
2893 else
2895 if (GET_CODE (x) == CONST_INT
2896 || (GET_CODE (x) == PLUS
2897 && (GET_CODE (XEXP (x, 1)) == CONST_INT
2898 || GET_CODE (XEXP (x, 0)) == CONST_INT)))
2899 fputs ("i", file);
2901 break;
2903 case 'L':
2904 /* Print the lower register of a double word register pair */
2905 if (GET_CODE (x) == REG)
2906 fputs (reg_names[ REGNO (x)+1 ], file);
2907 else
2908 fatal_insn ("bad insn to frv_print_operand, 'L' modifier:", x);
2909 break;
2911 /* case 'l': print a LABEL_REF. */
2913 case 'M':
2914 case 'N':
2915 /* Print a memory reference for ld/st/jmp, %N prints a memory reference
2916 for the second word of double memory operations. */
2917 offset = (code == 'M') ? 0 : UNITS_PER_WORD;
2918 switch (GET_CODE (x))
2920 default:
2921 fatal_insn ("bad insn to frv_print_operand, 'M/N' modifier:", x);
2923 case MEM:
2924 frv_print_operand_memory_reference (file, XEXP (x, 0), offset);
2925 break;
2927 case REG:
2928 case SUBREG:
2929 case CONST_INT:
2930 case PLUS:
2931 case SYMBOL_REF:
2932 frv_print_operand_memory_reference (file, x, offset);
2933 break;
2935 break;
2937 case 'O':
2938 /* Print the opcode of a command. */
2939 switch (GET_CODE (x))
2941 default:
2942 fatal_insn ("bad insn to frv_print_operand, 'O' modifier:", x);
2944 case PLUS: fputs ("add", file); break;
2945 case MINUS: fputs ("sub", file); break;
2946 case AND: fputs ("and", file); break;
2947 case IOR: fputs ("or", file); break;
2948 case XOR: fputs ("xor", file); break;
2949 case ASHIFT: fputs ("sll", file); break;
2950 case ASHIFTRT: fputs ("sra", file); break;
2951 case LSHIFTRT: fputs ("srl", file); break;
2953 break;
2955 /* case 'n': negate and print a constant int. */
2957 case 'P':
2958 /* Print PIC label using operand as the number. */
2959 if (GET_CODE (x) != CONST_INT)
2960 fatal_insn ("bad insn to frv_print_operand, P modifier:", x);
2962 fprintf (file, ".LCF%ld", (long)INTVAL (x));
2963 break;
2965 case 'U':
2966 /* Print 'u' if the operand is a update load/store. */
2967 if (GET_CODE (x) == MEM && GET_CODE (XEXP (x, 0)) == PRE_MODIFY)
2968 fputs ("u", file);
2969 break;
2971 case 'z':
2972 /* If value is 0, print gr0, otherwise it must be a register. */
2973 if (GET_CODE (x) == CONST_INT && INTVAL (x) == 0)
2974 fputs (reg_names[GPR_R0], file);
2976 else if (GET_CODE (x) == REG)
2977 fputs (reg_names [REGNO (x)], file);
2979 else
2980 fatal_insn ("bad insn in frv_print_operand, z case", x);
2981 break;
2983 case 'x':
2984 /* Print constant in hex. */
2985 if (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE)
2987 fprintf (file, "%s0x%.4lx", IMMEDIATE_PREFIX, (long) value);
2988 break;
2991 /* Fall through. */
2993 case '\0':
2994 if (GET_CODE (x) == REG)
2995 fputs (reg_names [REGNO (x)], file);
2997 else if (GET_CODE (x) == CONST_INT
2998 || GET_CODE (x) == CONST_DOUBLE)
2999 fprintf (file, "%s%ld", IMMEDIATE_PREFIX, (long) value);
3001 else if (frv_const_unspec_p (x, &unspec))
3002 frv_output_const_unspec (file, &unspec);
3004 else if (GET_CODE (x) == MEM)
3005 frv_print_operand_address (file, GET_MODE (x), XEXP (x, 0));
3007 else if (CONSTANT_ADDRESS_P (x))
3008 frv_print_operand_address (file, VOIDmode, x);
3010 else
3011 fatal_insn ("bad insn in frv_print_operand, 0 case", x);
3013 break;
3015 default:
3016 fatal_insn ("frv_print_operand: unknown code", x);
3017 break;
3020 return;
3023 static bool
3024 frv_print_operand_punct_valid_p (unsigned char code)
3026 return (code == '.' || code == '#' || code == '@' || code == '~'
3027 || code == '*' || code == '&');
3031 /* A C statement (sans semicolon) for initializing the variable CUM for the
3032 state at the beginning of the argument list. The variable has type
3033 `CUMULATIVE_ARGS'. The value of FNTYPE is the tree node for the data type
3034 of the function which will receive the args, or 0 if the args are to a
3035 compiler support library function. The value of INDIRECT is nonzero when
3036 processing an indirect call, for example a call through a function pointer.
3037 The value of INDIRECT is zero for a call to an explicitly named function, a
3038 library function call, or when `INIT_CUMULATIVE_ARGS' is used to find
3039 arguments for the function being compiled.
3041 When processing a call to a compiler support library function, LIBNAME
3042 identifies which one. It is a `symbol_ref' rtx which contains the name of
3043 the function, as a string. LIBNAME is 0 when an ordinary C function call is
3044 being processed. Thus, each time this macro is called, either LIBNAME or
3045 FNTYPE is nonzero, but never both of them at once. */
3047 void
3048 frv_init_cumulative_args (CUMULATIVE_ARGS *cum,
3049 tree fntype,
3050 rtx libname,
3051 tree fndecl,
3052 int incoming)
3054 *cum = FIRST_ARG_REGNUM;
3056 if (TARGET_DEBUG_ARG)
3058 fprintf (stderr, "\ninit_cumulative_args:");
3059 if (!fndecl && fntype)
3060 fputs (" indirect", stderr);
3062 if (incoming)
3063 fputs (" incoming", stderr);
3065 if (fntype)
3067 tree ret_type = TREE_TYPE (fntype);
3068 fprintf (stderr, " return=%s,",
3069 get_tree_code_name (TREE_CODE (ret_type)));
3072 if (libname && GET_CODE (libname) == SYMBOL_REF)
3073 fprintf (stderr, " libname=%s", XSTR (libname, 0));
3075 if (cfun->returns_struct)
3076 fprintf (stderr, " return-struct");
3078 putc ('\n', stderr);
3083 /* Return true if we should pass an argument on the stack rather than
3084 in registers. */
3086 static bool
3087 frv_must_pass_in_stack (machine_mode mode, const_tree type)
3089 if (mode == BLKmode)
3090 return true;
3091 if (type == NULL)
3092 return false;
3093 return AGGREGATE_TYPE_P (type);
3096 /* If defined, a C expression that gives the alignment boundary, in bits, of an
3097 argument with the specified mode and type. If it is not defined,
3098 `PARM_BOUNDARY' is used for all arguments. */
3100 static unsigned int
3101 frv_function_arg_boundary (machine_mode mode ATTRIBUTE_UNUSED,
3102 const_tree type ATTRIBUTE_UNUSED)
3104 return BITS_PER_WORD;
3107 static rtx
3108 frv_function_arg_1 (cumulative_args_t cum_v, machine_mode mode,
3109 const_tree type ATTRIBUTE_UNUSED, bool named,
3110 bool incoming ATTRIBUTE_UNUSED)
3112 const CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
3114 machine_mode xmode = (mode == BLKmode) ? SImode : mode;
3115 int arg_num = *cum;
3116 rtx ret;
3117 const char *debstr;
3119 /* Return a marker for use in the call instruction. */
3120 if (xmode == VOIDmode)
3122 ret = const0_rtx;
3123 debstr = "<0>";
3126 else if (arg_num <= LAST_ARG_REGNUM)
3128 ret = gen_rtx_REG (xmode, arg_num);
3129 debstr = reg_names[arg_num];
3132 else
3134 ret = NULL_RTX;
3135 debstr = "memory";
3138 if (TARGET_DEBUG_ARG)
3139 fprintf (stderr,
3140 "function_arg: words = %2d, mode = %4s, named = %d, size = %3d, arg = %s\n",
3141 arg_num, GET_MODE_NAME (mode), named, GET_MODE_SIZE (mode), debstr);
3143 return ret;
3146 static rtx
3147 frv_function_arg (cumulative_args_t cum, machine_mode mode,
3148 const_tree type, bool named)
3150 return frv_function_arg_1 (cum, mode, type, named, false);
3153 static rtx
3154 frv_function_incoming_arg (cumulative_args_t cum, machine_mode mode,
3155 const_tree type, bool named)
3157 return frv_function_arg_1 (cum, mode, type, named, true);
3161 /* A C statement (sans semicolon) to update the summarizer variable CUM to
3162 advance past an argument in the argument list. The values MODE, TYPE and
3163 NAMED describe that argument. Once this is done, the variable CUM is
3164 suitable for analyzing the *following* argument with `FUNCTION_ARG', etc.
3166 This macro need not do anything if the argument in question was passed on
3167 the stack. The compiler knows how to track the amount of stack space used
3168 for arguments without any special help. */
3170 static void
3171 frv_function_arg_advance (cumulative_args_t cum_v,
3172 machine_mode mode,
3173 const_tree type ATTRIBUTE_UNUSED,
3174 bool named)
3176 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
3178 machine_mode xmode = (mode == BLKmode) ? SImode : mode;
3179 int bytes = GET_MODE_SIZE (xmode);
3180 int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3181 int arg_num = *cum;
3183 *cum = arg_num + words;
3185 if (TARGET_DEBUG_ARG)
3186 fprintf (stderr,
3187 "function_adv: words = %2d, mode = %4s, named = %d, size = %3d\n",
3188 arg_num, GET_MODE_NAME (mode), named, words * UNITS_PER_WORD);
3192 /* A C expression for the number of words, at the beginning of an argument,
3193 must be put in registers. The value must be zero for arguments that are
3194 passed entirely in registers or that are entirely pushed on the stack.
3196 On some machines, certain arguments must be passed partially in registers
3197 and partially in memory. On these machines, typically the first N words of
3198 arguments are passed in registers, and the rest on the stack. If a
3199 multi-word argument (a `double' or a structure) crosses that boundary, its
3200 first few words must be passed in registers and the rest must be pushed.
3201 This macro tells the compiler when this occurs, and how many of the words
3202 should go in registers.
3204 `FUNCTION_ARG' for these arguments should return the first register to be
3205 used by the caller for this argument; likewise `FUNCTION_INCOMING_ARG', for
3206 the called function. */
3208 static int
3209 frv_arg_partial_bytes (cumulative_args_t cum, machine_mode mode,
3210 tree type ATTRIBUTE_UNUSED, bool named ATTRIBUTE_UNUSED)
3213 machine_mode xmode = (mode == BLKmode) ? SImode : mode;
3214 int bytes = GET_MODE_SIZE (xmode);
3215 int words = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3216 int arg_num = *get_cumulative_args (cum);
3217 int ret;
3219 ret = ((arg_num <= LAST_ARG_REGNUM && arg_num + words > LAST_ARG_REGNUM+1)
3220 ? LAST_ARG_REGNUM - arg_num + 1
3221 : 0);
3222 ret *= UNITS_PER_WORD;
3224 if (TARGET_DEBUG_ARG && ret)
3225 fprintf (stderr, "frv_arg_partial_bytes: %d\n", ret);
3227 return ret;
3231 /* Implements TARGET_FUNCTION_VALUE. */
3233 static rtx
3234 frv_function_value (const_tree valtype,
3235 const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
3236 bool outgoing ATTRIBUTE_UNUSED)
3238 return gen_rtx_REG (TYPE_MODE (valtype), RETURN_VALUE_REGNUM);
3242 /* Implements TARGET_LIBCALL_VALUE. */
3244 static rtx
3245 frv_libcall_value (machine_mode mode,
3246 const_rtx fun ATTRIBUTE_UNUSED)
3248 return gen_rtx_REG (mode, RETURN_VALUE_REGNUM);
3252 /* Implements FUNCTION_VALUE_REGNO_P. */
3254 bool
3255 frv_function_value_regno_p (const unsigned int regno)
3257 return (regno == RETURN_VALUE_REGNUM);
3260 /* Return true if a register is ok to use as a base or index register. */
3262 static FRV_INLINE int
3263 frv_regno_ok_for_base_p (int regno, int strict_p)
3265 if (GPR_P (regno))
3266 return TRUE;
3268 if (strict_p)
3269 return (reg_renumber[regno] >= 0 && GPR_P (reg_renumber[regno]));
3271 if (regno == ARG_POINTER_REGNUM)
3272 return TRUE;
3274 return (regno >= FIRST_PSEUDO_REGISTER);
3278 /* A C compound statement with a conditional `goto LABEL;' executed if X (an
3279 RTX) is a legitimate memory address on the target machine for a memory
3280 operand of mode MODE.
3282 It usually pays to define several simpler macros to serve as subroutines for
3283 this one. Otherwise it may be too complicated to understand.
3285 This macro must exist in two variants: a strict variant and a non-strict
3286 one. The strict variant is used in the reload pass. It must be defined so
3287 that any pseudo-register that has not been allocated a hard register is
3288 considered a memory reference. In contexts where some kind of register is
3289 required, a pseudo-register with no hard register must be rejected.
3291 The non-strict variant is used in other passes. It must be defined to
3292 accept all pseudo-registers in every context where some kind of register is
3293 required.
3295 Compiler source files that want to use the strict variant of this macro
3296 define the macro `REG_OK_STRICT'. You should use an `#ifdef REG_OK_STRICT'
3297 conditional to define the strict variant in that case and the non-strict
3298 variant otherwise.
3300 Normally, constant addresses which are the sum of a `symbol_ref' and an
3301 integer are stored inside a `const' RTX to mark them as constant.
3302 Therefore, there is no need to recognize such sums specifically as
3303 legitimate addresses. Normally you would simply recognize any `const' as
3304 legitimate.
3306 Usually `TARGET_PRINT_OPERAND_ADDRESS' is not prepared to handle
3307 constant sums that are not marked with `const'. It assumes that a
3308 naked `plus' indicates indexing. If so, then you *must* reject such
3309 naked constant sums as illegitimate addresses, so that none of them
3310 will be given to `TARGET_PRINT_OPERAND_ADDRESS'. */
3313 frv_legitimate_address_p_1 (machine_mode mode,
3314 rtx x,
3315 int strict_p,
3316 int condexec_p,
3317 int allow_double_reg_p)
3319 rtx x0, x1;
3320 int ret = 0;
3321 HOST_WIDE_INT value;
3322 unsigned regno0;
3324 if (FRV_SYMBOL_REF_TLS_P (x))
3325 return 0;
3327 switch (GET_CODE (x))
3329 default:
3330 break;
3332 case SUBREG:
3333 x = SUBREG_REG (x);
3334 if (GET_CODE (x) != REG)
3335 break;
3337 /* Fall through. */
3339 case REG:
3340 ret = frv_regno_ok_for_base_p (REGNO (x), strict_p);
3341 break;
3343 case PRE_MODIFY:
3344 x0 = XEXP (x, 0);
3345 x1 = XEXP (x, 1);
3346 if (GET_CODE (x0) != REG
3347 || ! frv_regno_ok_for_base_p (REGNO (x0), strict_p)
3348 || GET_CODE (x1) != PLUS
3349 || ! rtx_equal_p (x0, XEXP (x1, 0))
3350 || GET_CODE (XEXP (x1, 1)) != REG
3351 || ! frv_regno_ok_for_base_p (REGNO (XEXP (x1, 1)), strict_p))
3352 break;
3354 ret = 1;
3355 break;
3357 case CONST_INT:
3358 /* 12-bit immediate */
3359 if (condexec_p)
3360 ret = FALSE;
3361 else
3363 ret = IN_RANGE (INTVAL (x), -2048, 2047);
3365 /* If we can't use load/store double operations, make sure we can
3366 address the second word. */
3367 if (ret && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
3368 ret = IN_RANGE (INTVAL (x) + GET_MODE_SIZE (mode) - 1,
3369 -2048, 2047);
3371 break;
3373 case PLUS:
3374 x0 = XEXP (x, 0);
3375 x1 = XEXP (x, 1);
3377 if (GET_CODE (x0) == SUBREG)
3378 x0 = SUBREG_REG (x0);
3380 if (GET_CODE (x0) != REG)
3381 break;
3383 regno0 = REGNO (x0);
3384 if (!frv_regno_ok_for_base_p (regno0, strict_p))
3385 break;
3387 switch (GET_CODE (x1))
3389 default:
3390 break;
3392 case SUBREG:
3393 x1 = SUBREG_REG (x1);
3394 if (GET_CODE (x1) != REG)
3395 break;
3397 /* Fall through. */
3399 case REG:
3400 /* Do not allow reg+reg addressing for modes > 1 word if we
3401 can't depend on having move double instructions. */
3402 if (!allow_double_reg_p && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
3403 ret = FALSE;
3404 else
3405 ret = frv_regno_ok_for_base_p (REGNO (x1), strict_p);
3406 break;
3408 case CONST_INT:
3409 /* 12-bit immediate */
3410 if (condexec_p)
3411 ret = FALSE;
3412 else
3414 value = INTVAL (x1);
3415 ret = IN_RANGE (value, -2048, 2047);
3417 /* If we can't use load/store double operations, make sure we can
3418 address the second word. */
3419 if (ret && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
3420 ret = IN_RANGE (value + GET_MODE_SIZE (mode) - 1, -2048, 2047);
3422 break;
3424 case CONST:
3425 if (!condexec_p && got12_operand (x1, VOIDmode))
3426 ret = TRUE;
3427 break;
3430 break;
3433 if (TARGET_DEBUG_ADDR)
3435 fprintf (stderr, "\n========== legitimate_address_p, mode = %s, result = %d, addresses are %sstrict%s\n",
3436 GET_MODE_NAME (mode), ret, (strict_p) ? "" : "not ",
3437 (condexec_p) ? ", inside conditional code" : "");
3438 debug_rtx (x);
3441 return ret;
3444 bool
3445 frv_legitimate_address_p (machine_mode mode, rtx x, bool strict_p)
3447 return frv_legitimate_address_p_1 (mode, x, strict_p, FALSE, FALSE);
3450 /* Given an ADDR, generate code to inline the PLT. */
3451 static rtx
3452 gen_inlined_tls_plt (rtx addr)
3454 rtx retval, dest;
3455 rtx picreg = get_hard_reg_initial_val (Pmode, FDPIC_REG);
3458 dest = gen_reg_rtx (DImode);
3460 if (flag_pic == 1)
3463 -fpic version:
3465 lddi.p @(gr15, #gottlsdesc12(ADDR)), gr8
3466 calll #gettlsoff(ADDR)@(gr8, gr0)
3468 emit_insn (gen_tls_lddi (dest, addr, picreg));
3470 else
3473 -fPIC version:
3475 sethi.p #gottlsdeschi(ADDR), gr8
3476 setlo #gottlsdesclo(ADDR), gr8
3477 ldd #tlsdesc(ADDR)@(gr15, gr8), gr8
3478 calll #gettlsoff(ADDR)@(gr8, gr0)
3480 rtx reguse = gen_reg_rtx (Pmode);
3481 emit_insn (gen_tlsoff_hilo (reguse, addr, GEN_INT (R_FRV_GOTTLSDESCHI)));
3482 emit_insn (gen_tls_tlsdesc_ldd (dest, picreg, reguse, addr));
3485 retval = gen_reg_rtx (Pmode);
3486 emit_insn (gen_tls_indirect_call (retval, addr, dest, picreg));
3487 return retval;
3490 /* Emit a TLSMOFF or TLSMOFF12 offset, depending on -mTLS. Returns
3491 the destination address. */
3492 static rtx
3493 gen_tlsmoff (rtx addr, rtx reg)
3495 rtx dest = gen_reg_rtx (Pmode);
3497 if (TARGET_BIG_TLS)
3499 /* sethi.p #tlsmoffhi(x), grA
3500 setlo #tlsmofflo(x), grA
3502 dest = gen_reg_rtx (Pmode);
3503 emit_insn (gen_tlsoff_hilo (dest, addr,
3504 GEN_INT (R_FRV_TLSMOFFHI)));
3505 dest = gen_rtx_PLUS (Pmode, dest, reg);
3507 else
3509 /* addi grB, #tlsmoff12(x), grC
3510 -or-
3511 ld/st @(grB, #tlsmoff12(x)), grC
3513 dest = gen_reg_rtx (Pmode);
3514 emit_insn (gen_symGOTOFF2reg_i (dest, addr, reg,
3515 GEN_INT (R_FRV_TLSMOFF12)));
3517 return dest;
3520 /* Generate code for a TLS address. */
3521 static rtx
3522 frv_legitimize_tls_address (rtx addr, enum tls_model model)
3524 rtx dest, tp = gen_rtx_REG (Pmode, 29);
3525 rtx picreg = get_hard_reg_initial_val (Pmode, 15);
3527 switch (model)
3529 case TLS_MODEL_INITIAL_EXEC:
3530 if (flag_pic == 1)
3532 /* -fpic version.
3533 ldi @(gr15, #gottlsoff12(x)), gr5
3535 dest = gen_reg_rtx (Pmode);
3536 emit_insn (gen_tls_load_gottlsoff12 (dest, addr, picreg));
3537 dest = gen_rtx_PLUS (Pmode, tp, dest);
3539 else
3541 /* -fPIC or anything else.
3543 sethi.p #gottlsoffhi(x), gr14
3544 setlo #gottlsofflo(x), gr14
3545 ld #tlsoff(x)@(gr15, gr14), gr9
3547 rtx tmp = gen_reg_rtx (Pmode);
3548 dest = gen_reg_rtx (Pmode);
3549 emit_insn (gen_tlsoff_hilo (tmp, addr,
3550 GEN_INT (R_FRV_GOTTLSOFF_HI)));
3552 emit_insn (gen_tls_tlsoff_ld (dest, picreg, tmp, addr));
3553 dest = gen_rtx_PLUS (Pmode, tp, dest);
3555 break;
3556 case TLS_MODEL_LOCAL_DYNAMIC:
3558 rtx reg, retval;
3560 if (TARGET_INLINE_PLT)
3561 retval = gen_inlined_tls_plt (GEN_INT (0));
3562 else
3564 /* call #gettlsoff(0) */
3565 retval = gen_reg_rtx (Pmode);
3566 emit_insn (gen_call_gettlsoff (retval, GEN_INT (0), picreg));
3569 reg = gen_reg_rtx (Pmode);
3570 emit_insn (gen_rtx_SET (reg, gen_rtx_PLUS (Pmode, retval, tp)));
3572 dest = gen_tlsmoff (addr, reg);
3575 dest = gen_reg_rtx (Pmode);
3576 emit_insn (gen_tlsoff_hilo (dest, addr,
3577 GEN_INT (R_FRV_TLSMOFFHI)));
3578 dest = gen_rtx_PLUS (Pmode, dest, reg);
3580 break;
3582 case TLS_MODEL_LOCAL_EXEC:
3583 dest = gen_tlsmoff (addr, gen_rtx_REG (Pmode, 29));
3584 break;
3585 case TLS_MODEL_GLOBAL_DYNAMIC:
3587 rtx retval;
3589 if (TARGET_INLINE_PLT)
3590 retval = gen_inlined_tls_plt (addr);
3591 else
3593 /* call #gettlsoff(x) */
3594 retval = gen_reg_rtx (Pmode);
3595 emit_insn (gen_call_gettlsoff (retval, addr, picreg));
3597 dest = gen_rtx_PLUS (Pmode, retval, tp);
3598 break;
3600 default:
3601 gcc_unreachable ();
3604 return dest;
3608 frv_legitimize_address (rtx x,
3609 rtx oldx ATTRIBUTE_UNUSED,
3610 machine_mode mode ATTRIBUTE_UNUSED)
3612 if (GET_CODE (x) == SYMBOL_REF)
3614 enum tls_model model = SYMBOL_REF_TLS_MODEL (x);
3615 if (model != 0)
3616 return frv_legitimize_tls_address (x, model);
3619 return x;
3622 /* Test whether a local function descriptor is canonical, i.e.,
3623 whether we can use FUNCDESC_GOTOFF to compute the address of the
3624 function. */
3626 static bool
3627 frv_local_funcdesc_p (rtx fnx)
3629 tree fn;
3630 enum symbol_visibility vis;
3631 bool ret;
3633 if (! SYMBOL_REF_LOCAL_P (fnx))
3634 return FALSE;
3636 fn = SYMBOL_REF_DECL (fnx);
3638 if (! fn)
3639 return FALSE;
3641 vis = DECL_VISIBILITY (fn);
3643 if (vis == VISIBILITY_PROTECTED)
3644 /* Private function descriptors for protected functions are not
3645 canonical. Temporarily change the visibility to global. */
3646 vis = VISIBILITY_DEFAULT;
3647 else if (flag_shlib)
3648 /* If we're already compiling for a shared library (that, unlike
3649 executables, can't assume that the existence of a definition
3650 implies local binding), we can skip the re-testing. */
3651 return TRUE;
3653 ret = default_binds_local_p_1 (fn, flag_pic);
3655 DECL_VISIBILITY (fn) = vis;
3657 return ret;
3660 /* Load the _gp symbol into DEST. SRC is supposed to be the FDPIC
3661 register. */
3664 frv_gen_GPsym2reg (rtx dest, rtx src)
3666 tree gp = get_identifier ("_gp");
3667 rtx gp_sym = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (gp));
3669 return gen_symGOT2reg (dest, gp_sym, src, GEN_INT (R_FRV_GOT12));
3672 static const char *
3673 unspec_got_name (int i)
3675 switch (i)
3677 case R_FRV_GOT12: return "got12";
3678 case R_FRV_GOTHI: return "gothi";
3679 case R_FRV_GOTLO: return "gotlo";
3680 case R_FRV_FUNCDESC: return "funcdesc";
3681 case R_FRV_FUNCDESC_GOT12: return "gotfuncdesc12";
3682 case R_FRV_FUNCDESC_GOTHI: return "gotfuncdeschi";
3683 case R_FRV_FUNCDESC_GOTLO: return "gotfuncdesclo";
3684 case R_FRV_FUNCDESC_VALUE: return "funcdescvalue";
3685 case R_FRV_FUNCDESC_GOTOFF12: return "gotofffuncdesc12";
3686 case R_FRV_FUNCDESC_GOTOFFHI: return "gotofffuncdeschi";
3687 case R_FRV_FUNCDESC_GOTOFFLO: return "gotofffuncdesclo";
3688 case R_FRV_GOTOFF12: return "gotoff12";
3689 case R_FRV_GOTOFFHI: return "gotoffhi";
3690 case R_FRV_GOTOFFLO: return "gotofflo";
3691 case R_FRV_GPREL12: return "gprel12";
3692 case R_FRV_GPRELHI: return "gprelhi";
3693 case R_FRV_GPRELLO: return "gprello";
3694 case R_FRV_GOTTLSOFF_HI: return "gottlsoffhi";
3695 case R_FRV_GOTTLSOFF_LO: return "gottlsofflo";
3696 case R_FRV_TLSMOFFHI: return "tlsmoffhi";
3697 case R_FRV_TLSMOFFLO: return "tlsmofflo";
3698 case R_FRV_TLSMOFF12: return "tlsmoff12";
3699 case R_FRV_TLSDESCHI: return "tlsdeschi";
3700 case R_FRV_TLSDESCLO: return "tlsdesclo";
3701 case R_FRV_GOTTLSDESCHI: return "gottlsdeschi";
3702 case R_FRV_GOTTLSDESCLO: return "gottlsdesclo";
3703 default: gcc_unreachable ();
3707 /* Write the assembler syntax for UNSPEC to STREAM. Note that any offset
3708 is added inside the relocation operator. */
3710 static void
3711 frv_output_const_unspec (FILE *stream, const struct frv_unspec *unspec)
3713 fprintf (stream, "#%s(", unspec_got_name (unspec->reloc));
3714 output_addr_const (stream, plus_constant (Pmode, unspec->symbol,
3715 unspec->offset));
3716 fputs (")", stream);
3719 /* Implement FIND_BASE_TERM. See whether ORIG_X represents #gprel12(foo)
3720 or #gotoff12(foo) for some small data symbol foo. If so, return foo,
3721 otherwise return ORIG_X. */
3724 frv_find_base_term (rtx x)
3726 struct frv_unspec unspec;
3728 if (frv_const_unspec_p (x, &unspec)
3729 && frv_small_data_reloc_p (unspec.symbol, unspec.reloc))
3730 return plus_constant (Pmode, unspec.symbol, unspec.offset);
3732 return x;
3735 /* Return 1 if operand is a valid FRV address. CONDEXEC_P is true if
3736 the operand is used by a predicated instruction. */
3739 frv_legitimate_memory_operand (rtx op, machine_mode mode, int condexec_p)
3741 return ((GET_MODE (op) == mode || mode == VOIDmode)
3742 && GET_CODE (op) == MEM
3743 && frv_legitimate_address_p_1 (mode, XEXP (op, 0),
3744 reload_completed, condexec_p, FALSE));
3747 void
3748 frv_expand_fdpic_call (rtx *operands, bool ret_value, bool sibcall)
3750 rtx lr = gen_rtx_REG (Pmode, LR_REGNO);
3751 rtx picreg = get_hard_reg_initial_val (SImode, FDPIC_REG);
3752 rtx c, rvrtx=0;
3753 rtx addr;
3755 if (ret_value)
3757 rvrtx = operands[0];
3758 operands ++;
3761 addr = XEXP (operands[0], 0);
3763 /* Inline PLTs if we're optimizing for speed. We'd like to inline
3764 any calls that would involve a PLT, but can't tell, since we
3765 don't know whether an extern function is going to be provided by
3766 a separate translation unit or imported from a separate module.
3767 When compiling for shared libraries, if the function has default
3768 visibility, we assume it's overridable, so we inline the PLT, but
3769 for executables, we don't really have a way to make a good
3770 decision: a function is as likely to be imported from a shared
3771 library as it is to be defined in the executable itself. We
3772 assume executables will get global functions defined locally,
3773 whereas shared libraries will have them potentially overridden,
3774 so we only inline PLTs when compiling for shared libraries.
3776 In order to mark a function as local to a shared library, any
3777 non-default visibility attribute suffices. Unfortunately,
3778 there's no simple way to tag a function declaration as ``in a
3779 different module'', which we could then use to trigger PLT
3780 inlining on executables. There's -minline-plt, but it affects
3781 all external functions, so one would have to also mark function
3782 declarations available in the same module with non-default
3783 visibility, which is advantageous in itself. */
3784 if (GET_CODE (addr) == SYMBOL_REF
3785 && ((!SYMBOL_REF_LOCAL_P (addr) && TARGET_INLINE_PLT)
3786 || sibcall))
3788 rtx x, dest;
3789 dest = gen_reg_rtx (SImode);
3790 if (flag_pic != 1)
3791 x = gen_symGOTOFF2reg_hilo (dest, addr, OUR_FDPIC_REG,
3792 GEN_INT (R_FRV_FUNCDESC_GOTOFF12));
3793 else
3794 x = gen_symGOTOFF2reg (dest, addr, OUR_FDPIC_REG,
3795 GEN_INT (R_FRV_FUNCDESC_GOTOFF12));
3796 emit_insn (x);
3797 crtl->uses_pic_offset_table = TRUE;
3798 addr = dest;
3800 else if (GET_CODE (addr) == SYMBOL_REF)
3802 /* These are always either local, or handled through a local
3803 PLT. */
3804 if (ret_value)
3805 c = gen_call_value_fdpicsi (rvrtx, addr, operands[1],
3806 operands[2], picreg, lr);
3807 else
3808 c = gen_call_fdpicsi (addr, operands[1], operands[2], picreg, lr);
3809 emit_call_insn (c);
3810 return;
3812 else if (! ldd_address_operand (addr, Pmode))
3813 addr = force_reg (Pmode, addr);
3815 picreg = gen_reg_rtx (DImode);
3816 emit_insn (gen_movdi_ldd (picreg, addr));
3818 if (sibcall && ret_value)
3819 c = gen_sibcall_value_fdpicdi (rvrtx, picreg, const0_rtx);
3820 else if (sibcall)
3821 c = gen_sibcall_fdpicdi (picreg, const0_rtx);
3822 else if (ret_value)
3823 c = gen_call_value_fdpicdi (rvrtx, picreg, const0_rtx, lr);
3824 else
3825 c = gen_call_fdpicdi (picreg, const0_rtx, lr);
3826 emit_call_insn (c);
3829 /* Look for a SYMBOL_REF of a function in an rtx. We always want to
3830 process these separately from any offsets, such that we add any
3831 offsets to the function descriptor (the actual pointer), not to the
3832 function address. */
3834 static bool
3835 frv_function_symbol_referenced_p (rtx x)
3837 const char *format;
3838 int length;
3839 int j;
3841 if (GET_CODE (x) == SYMBOL_REF)
3842 return SYMBOL_REF_FUNCTION_P (x);
3844 length = GET_RTX_LENGTH (GET_CODE (x));
3845 format = GET_RTX_FORMAT (GET_CODE (x));
3847 for (j = 0; j < length; ++j)
3849 switch (format[j])
3851 case 'e':
3852 if (frv_function_symbol_referenced_p (XEXP (x, j)))
3853 return TRUE;
3854 break;
3856 case 'V':
3857 case 'E':
3858 if (XVEC (x, j) != 0)
3860 int k;
3861 for (k = 0; k < XVECLEN (x, j); ++k)
3862 if (frv_function_symbol_referenced_p (XVECEXP (x, j, k)))
3863 return TRUE;
3865 break;
3867 default:
3868 /* Nothing to do. */
3869 break;
3873 return FALSE;
3876 /* Return true if the memory operand is one that can be conditionally
3877 executed. */
3880 condexec_memory_operand (rtx op, machine_mode mode)
3882 machine_mode op_mode = GET_MODE (op);
3883 rtx addr;
3885 if (mode != VOIDmode && op_mode != mode)
3886 return FALSE;
3888 switch (op_mode)
3890 default:
3891 return FALSE;
3893 case QImode:
3894 case HImode:
3895 case SImode:
3896 case SFmode:
3897 break;
3900 if (GET_CODE (op) != MEM)
3901 return FALSE;
3903 addr = XEXP (op, 0);
3904 return frv_legitimate_address_p_1 (mode, addr, reload_completed, TRUE, FALSE);
3907 /* Return true if the bare return instruction can be used outside of the
3908 epilog code. For frv, we only do it if there was no stack allocation. */
3911 direct_return_p (void)
3913 frv_stack_t *info;
3915 if (!reload_completed)
3916 return FALSE;
3918 info = frv_stack_info ();
3919 return (info->total_size == 0);
3923 void
3924 frv_emit_move (machine_mode mode, rtx dest, rtx src)
3926 if (GET_CODE (src) == SYMBOL_REF)
3928 enum tls_model model = SYMBOL_REF_TLS_MODEL (src);
3929 if (model != 0)
3930 src = frv_legitimize_tls_address (src, model);
3933 switch (mode)
3935 case SImode:
3936 if (frv_emit_movsi (dest, src))
3937 return;
3938 break;
3940 case QImode:
3941 case HImode:
3942 case DImode:
3943 case SFmode:
3944 case DFmode:
3945 if (!reload_in_progress
3946 && !reload_completed
3947 && !register_operand (dest, mode)
3948 && !reg_or_0_operand (src, mode))
3949 src = copy_to_mode_reg (mode, src);
3950 break;
3952 default:
3953 gcc_unreachable ();
3956 emit_insn (gen_rtx_SET (dest, src));
3959 /* Emit code to handle a MOVSI, adding in the small data register or pic
3960 register if needed to load up addresses. Return TRUE if the appropriate
3961 instructions are emitted. */
3964 frv_emit_movsi (rtx dest, rtx src)
3966 int base_regno = -1;
3967 int unspec = 0;
3968 rtx sym = src;
3969 struct frv_unspec old_unspec;
3971 if (!reload_in_progress
3972 && !reload_completed
3973 && !register_operand (dest, SImode)
3974 && (!reg_or_0_operand (src, SImode)
3975 /* Virtual registers will almost always be replaced by an
3976 add instruction, so expose this to CSE by copying to
3977 an intermediate register. */
3978 || (GET_CODE (src) == REG
3979 && IN_RANGE (REGNO (src),
3980 FIRST_VIRTUAL_REGISTER,
3981 LAST_VIRTUAL_POINTER_REGISTER))))
3983 emit_insn (gen_rtx_SET (dest, copy_to_mode_reg (SImode, src)));
3984 return TRUE;
3987 /* Explicitly add in the PIC or small data register if needed. */
3988 switch (GET_CODE (src))
3990 default:
3991 break;
3993 case LABEL_REF:
3994 handle_label:
3995 if (TARGET_FDPIC)
3997 /* Using GPREL12, we use a single GOT entry for all symbols
3998 in read-only sections, but trade sequences such as:
4000 sethi #gothi(label), gr#
4001 setlo #gotlo(label), gr#
4002 ld @(gr15,gr#), gr#
4006 ld @(gr15,#got12(_gp)), gr#
4007 sethi #gprelhi(label), gr##
4008 setlo #gprello(label), gr##
4009 add gr#, gr##, gr##
4011 We may often be able to share gr# for multiple
4012 computations of GPREL addresses, and we may often fold
4013 the final add into the pair of registers of a load or
4014 store instruction, so it's often profitable. Even when
4015 optimizing for size, we're trading a GOT entry for an
4016 additional instruction, which trades GOT space
4017 (read-write) for code size (read-only, shareable), as
4018 long as the symbol is not used in more than two different
4019 locations.
4021 With -fpie/-fpic, we'd be trading a single load for a
4022 sequence of 4 instructions, because the offset of the
4023 label can't be assumed to be addressable with 12 bits, so
4024 we don't do this. */
4025 if (TARGET_GPREL_RO)
4026 unspec = R_FRV_GPREL12;
4027 else
4028 unspec = R_FRV_GOT12;
4030 else if (flag_pic)
4031 base_regno = PIC_REGNO;
4033 break;
4035 case CONST:
4036 if (frv_const_unspec_p (src, &old_unspec))
4037 break;
4039 if (TARGET_FDPIC && frv_function_symbol_referenced_p (XEXP (src, 0)))
4041 handle_whatever:
4042 src = force_reg (GET_MODE (XEXP (src, 0)), XEXP (src, 0));
4043 emit_move_insn (dest, src);
4044 return TRUE;
4046 else
4048 sym = XEXP (sym, 0);
4049 if (GET_CODE (sym) == PLUS
4050 && GET_CODE (XEXP (sym, 0)) == SYMBOL_REF
4051 && GET_CODE (XEXP (sym, 1)) == CONST_INT)
4052 sym = XEXP (sym, 0);
4053 if (GET_CODE (sym) == SYMBOL_REF)
4054 goto handle_sym;
4055 else if (GET_CODE (sym) == LABEL_REF)
4056 goto handle_label;
4057 else
4058 goto handle_whatever;
4060 break;
4062 case SYMBOL_REF:
4063 handle_sym:
4064 if (TARGET_FDPIC)
4066 enum tls_model model = SYMBOL_REF_TLS_MODEL (sym);
4068 if (model != 0)
4070 src = frv_legitimize_tls_address (src, model);
4071 emit_move_insn (dest, src);
4072 return TRUE;
4075 if (SYMBOL_REF_FUNCTION_P (sym))
4077 if (frv_local_funcdesc_p (sym))
4078 unspec = R_FRV_FUNCDESC_GOTOFF12;
4079 else
4080 unspec = R_FRV_FUNCDESC_GOT12;
4082 else
4084 if (CONSTANT_POOL_ADDRESS_P (sym))
4085 switch (GET_CODE (get_pool_constant (sym)))
4087 case CONST:
4088 case SYMBOL_REF:
4089 case LABEL_REF:
4090 if (flag_pic)
4092 unspec = R_FRV_GOTOFF12;
4093 break;
4095 /* Fall through. */
4096 default:
4097 if (TARGET_GPREL_RO)
4098 unspec = R_FRV_GPREL12;
4099 else
4100 unspec = R_FRV_GOT12;
4101 break;
4103 else if (SYMBOL_REF_LOCAL_P (sym)
4104 && !SYMBOL_REF_EXTERNAL_P (sym)
4105 && SYMBOL_REF_DECL (sym)
4106 && (!DECL_P (SYMBOL_REF_DECL (sym))
4107 || !DECL_COMMON (SYMBOL_REF_DECL (sym))))
4109 tree decl = SYMBOL_REF_DECL (sym);
4110 tree init = TREE_CODE (decl) == VAR_DECL
4111 ? DECL_INITIAL (decl)
4112 : TREE_CODE (decl) == CONSTRUCTOR
4113 ? decl : 0;
4114 int reloc = 0;
4115 bool named_section, readonly;
4117 if (init && init != error_mark_node)
4118 reloc = compute_reloc_for_constant (init);
4120 named_section = TREE_CODE (decl) == VAR_DECL
4121 && lookup_attribute ("section", DECL_ATTRIBUTES (decl));
4122 readonly = decl_readonly_section (decl, reloc);
4124 if (named_section)
4125 unspec = R_FRV_GOT12;
4126 else if (!readonly)
4127 unspec = R_FRV_GOTOFF12;
4128 else if (readonly && TARGET_GPREL_RO)
4129 unspec = R_FRV_GPREL12;
4130 else
4131 unspec = R_FRV_GOT12;
4133 else
4134 unspec = R_FRV_GOT12;
4138 else if (SYMBOL_REF_SMALL_P (sym))
4139 base_regno = SDA_BASE_REG;
4141 else if (flag_pic)
4142 base_regno = PIC_REGNO;
4144 break;
4147 if (base_regno >= 0)
4149 if (GET_CODE (sym) == SYMBOL_REF && SYMBOL_REF_SMALL_P (sym))
4150 emit_insn (gen_symGOTOFF2reg (dest, src,
4151 gen_rtx_REG (Pmode, base_regno),
4152 GEN_INT (R_FRV_GPREL12)));
4153 else
4154 emit_insn (gen_symGOTOFF2reg_hilo (dest, src,
4155 gen_rtx_REG (Pmode, base_regno),
4156 GEN_INT (R_FRV_GPREL12)));
4157 if (base_regno == PIC_REGNO)
4158 crtl->uses_pic_offset_table = TRUE;
4159 return TRUE;
4162 if (unspec)
4164 rtx x;
4166 /* Since OUR_FDPIC_REG is a pseudo register, we can't safely introduce
4167 new uses of it once reload has begun. */
4168 gcc_assert (!reload_in_progress && !reload_completed);
4170 switch (unspec)
4172 case R_FRV_GOTOFF12:
4173 if (!frv_small_data_reloc_p (sym, unspec))
4174 x = gen_symGOTOFF2reg_hilo (dest, src, OUR_FDPIC_REG,
4175 GEN_INT (unspec));
4176 else
4177 x = gen_symGOTOFF2reg (dest, src, OUR_FDPIC_REG, GEN_INT (unspec));
4178 break;
4179 case R_FRV_GPREL12:
4180 if (!frv_small_data_reloc_p (sym, unspec))
4181 x = gen_symGPREL2reg_hilo (dest, src, OUR_FDPIC_REG,
4182 GEN_INT (unspec));
4183 else
4184 x = gen_symGPREL2reg (dest, src, OUR_FDPIC_REG, GEN_INT (unspec));
4185 break;
4186 case R_FRV_FUNCDESC_GOTOFF12:
4187 if (flag_pic != 1)
4188 x = gen_symGOTOFF2reg_hilo (dest, src, OUR_FDPIC_REG,
4189 GEN_INT (unspec));
4190 else
4191 x = gen_symGOTOFF2reg (dest, src, OUR_FDPIC_REG, GEN_INT (unspec));
4192 break;
4193 default:
4194 if (flag_pic != 1)
4195 x = gen_symGOT2reg_hilo (dest, src, OUR_FDPIC_REG,
4196 GEN_INT (unspec));
4197 else
4198 x = gen_symGOT2reg (dest, src, OUR_FDPIC_REG, GEN_INT (unspec));
4199 break;
4201 emit_insn (x);
4202 crtl->uses_pic_offset_table = TRUE;
4203 return TRUE;
4207 return FALSE;
4211 /* Return a string to output a single word move. */
4213 const char *
4214 output_move_single (rtx operands[], rtx insn)
4216 rtx dest = operands[0];
4217 rtx src = operands[1];
4219 if (GET_CODE (dest) == REG)
4221 int dest_regno = REGNO (dest);
4222 machine_mode mode = GET_MODE (dest);
4224 if (GPR_P (dest_regno))
4226 if (GET_CODE (src) == REG)
4228 /* gpr <- some sort of register */
4229 int src_regno = REGNO (src);
4231 if (GPR_P (src_regno))
4232 return "mov %1, %0";
4234 else if (FPR_P (src_regno))
4235 return "movfg %1, %0";
4237 else if (SPR_P (src_regno))
4238 return "movsg %1, %0";
4241 else if (GET_CODE (src) == MEM)
4243 /* gpr <- memory */
4244 switch (mode)
4246 default:
4247 break;
4249 case QImode:
4250 return "ldsb%I1%U1 %M1,%0";
4252 case HImode:
4253 return "ldsh%I1%U1 %M1,%0";
4255 case SImode:
4256 case SFmode:
4257 return "ld%I1%U1 %M1, %0";
4261 else if (GET_CODE (src) == CONST_INT
4262 || GET_CODE (src) == CONST_DOUBLE)
4264 /* gpr <- integer/floating constant */
4265 HOST_WIDE_INT value;
4267 if (GET_CODE (src) == CONST_INT)
4268 value = INTVAL (src);
4270 else if (mode == SFmode)
4272 long l;
4274 REAL_VALUE_TO_TARGET_SINGLE
4275 (*CONST_DOUBLE_REAL_VALUE (src), l);
4276 value = l;
4279 else
4280 value = CONST_DOUBLE_LOW (src);
4282 if (IN_RANGE (value, -32768, 32767))
4283 return "setlos %1, %0";
4285 return "#";
4288 else if (GET_CODE (src) == SYMBOL_REF
4289 || GET_CODE (src) == LABEL_REF
4290 || GET_CODE (src) == CONST)
4292 return "#";
4296 else if (FPR_P (dest_regno))
4298 if (GET_CODE (src) == REG)
4300 /* fpr <- some sort of register */
4301 int src_regno = REGNO (src);
4303 if (GPR_P (src_regno))
4304 return "movgf %1, %0";
4306 else if (FPR_P (src_regno))
4308 if (TARGET_HARD_FLOAT)
4309 return "fmovs %1, %0";
4310 else
4311 return "mor %1, %1, %0";
4315 else if (GET_CODE (src) == MEM)
4317 /* fpr <- memory */
4318 switch (mode)
4320 default:
4321 break;
4323 case QImode:
4324 return "ldbf%I1%U1 %M1,%0";
4326 case HImode:
4327 return "ldhf%I1%U1 %M1,%0";
4329 case SImode:
4330 case SFmode:
4331 return "ldf%I1%U1 %M1, %0";
4335 else if (ZERO_P (src))
4336 return "movgf %., %0";
4339 else if (SPR_P (dest_regno))
4341 if (GET_CODE (src) == REG)
4343 /* spr <- some sort of register */
4344 int src_regno = REGNO (src);
4346 if (GPR_P (src_regno))
4347 return "movgs %1, %0";
4349 else if (ZERO_P (src))
4350 return "movgs %., %0";
4354 else if (GET_CODE (dest) == MEM)
4356 if (GET_CODE (src) == REG)
4358 int src_regno = REGNO (src);
4359 machine_mode mode = GET_MODE (dest);
4361 if (GPR_P (src_regno))
4363 switch (mode)
4365 default:
4366 break;
4368 case QImode:
4369 return "stb%I0%U0 %1, %M0";
4371 case HImode:
4372 return "sth%I0%U0 %1, %M0";
4374 case SImode:
4375 case SFmode:
4376 return "st%I0%U0 %1, %M0";
4380 else if (FPR_P (src_regno))
4382 switch (mode)
4384 default:
4385 break;
4387 case QImode:
4388 return "stbf%I0%U0 %1, %M0";
4390 case HImode:
4391 return "sthf%I0%U0 %1, %M0";
4393 case SImode:
4394 case SFmode:
4395 return "stf%I0%U0 %1, %M0";
4400 else if (ZERO_P (src))
4402 switch (GET_MODE (dest))
4404 default:
4405 break;
4407 case QImode:
4408 return "stb%I0%U0 %., %M0";
4410 case HImode:
4411 return "sth%I0%U0 %., %M0";
4413 case SImode:
4414 case SFmode:
4415 return "st%I0%U0 %., %M0";
4420 fatal_insn ("bad output_move_single operand", insn);
4421 return "";
4425 /* Return a string to output a double word move. */
4427 const char *
4428 output_move_double (rtx operands[], rtx insn)
4430 rtx dest = operands[0];
4431 rtx src = operands[1];
4432 machine_mode mode = GET_MODE (dest);
4434 if (GET_CODE (dest) == REG)
4436 int dest_regno = REGNO (dest);
4438 if (GPR_P (dest_regno))
4440 if (GET_CODE (src) == REG)
4442 /* gpr <- some sort of register */
4443 int src_regno = REGNO (src);
4445 if (GPR_P (src_regno))
4446 return "#";
4448 else if (FPR_P (src_regno))
4450 if (((dest_regno - GPR_FIRST) & 1) == 0
4451 && ((src_regno - FPR_FIRST) & 1) == 0)
4452 return "movfgd %1, %0";
4454 return "#";
4458 else if (GET_CODE (src) == MEM)
4460 /* gpr <- memory */
4461 if (dbl_memory_one_insn_operand (src, mode))
4462 return "ldd%I1%U1 %M1, %0";
4464 return "#";
4467 else if (GET_CODE (src) == CONST_INT
4468 || GET_CODE (src) == CONST_DOUBLE)
4469 return "#";
4472 else if (FPR_P (dest_regno))
4474 if (GET_CODE (src) == REG)
4476 /* fpr <- some sort of register */
4477 int src_regno = REGNO (src);
4479 if (GPR_P (src_regno))
4481 if (((dest_regno - FPR_FIRST) & 1) == 0
4482 && ((src_regno - GPR_FIRST) & 1) == 0)
4483 return "movgfd %1, %0";
4485 return "#";
4488 else if (FPR_P (src_regno))
4490 if (TARGET_DOUBLE
4491 && ((dest_regno - FPR_FIRST) & 1) == 0
4492 && ((src_regno - FPR_FIRST) & 1) == 0)
4493 return "fmovd %1, %0";
4495 return "#";
4499 else if (GET_CODE (src) == MEM)
4501 /* fpr <- memory */
4502 if (dbl_memory_one_insn_operand (src, mode))
4503 return "lddf%I1%U1 %M1, %0";
4505 return "#";
4508 else if (ZERO_P (src))
4509 return "#";
4513 else if (GET_CODE (dest) == MEM)
4515 if (GET_CODE (src) == REG)
4517 int src_regno = REGNO (src);
4519 if (GPR_P (src_regno))
4521 if (((src_regno - GPR_FIRST) & 1) == 0
4522 && dbl_memory_one_insn_operand (dest, mode))
4523 return "std%I0%U0 %1, %M0";
4525 return "#";
4528 if (FPR_P (src_regno))
4530 if (((src_regno - FPR_FIRST) & 1) == 0
4531 && dbl_memory_one_insn_operand (dest, mode))
4532 return "stdf%I0%U0 %1, %M0";
4534 return "#";
4538 else if (ZERO_P (src))
4540 if (dbl_memory_one_insn_operand (dest, mode))
4541 return "std%I0%U0 %., %M0";
4543 return "#";
4547 fatal_insn ("bad output_move_double operand", insn);
4548 return "";
4552 /* Return a string to output a single word conditional move.
4553 Operand0 -- EQ/NE of ccr register and 0
4554 Operand1 -- CCR register
4555 Operand2 -- destination
4556 Operand3 -- source */
4558 const char *
4559 output_condmove_single (rtx operands[], rtx insn)
4561 rtx dest = operands[2];
4562 rtx src = operands[3];
4564 if (GET_CODE (dest) == REG)
4566 int dest_regno = REGNO (dest);
4567 machine_mode mode = GET_MODE (dest);
4569 if (GPR_P (dest_regno))
4571 if (GET_CODE (src) == REG)
4573 /* gpr <- some sort of register */
4574 int src_regno = REGNO (src);
4576 if (GPR_P (src_regno))
4577 return "cmov %z3, %2, %1, %e0";
4579 else if (FPR_P (src_regno))
4580 return "cmovfg %3, %2, %1, %e0";
4583 else if (GET_CODE (src) == MEM)
4585 /* gpr <- memory */
4586 switch (mode)
4588 default:
4589 break;
4591 case QImode:
4592 return "cldsb%I3%U3 %M3, %2, %1, %e0";
4594 case HImode:
4595 return "cldsh%I3%U3 %M3, %2, %1, %e0";
4597 case SImode:
4598 case SFmode:
4599 return "cld%I3%U3 %M3, %2, %1, %e0";
4603 else if (ZERO_P (src))
4604 return "cmov %., %2, %1, %e0";
4607 else if (FPR_P (dest_regno))
4609 if (GET_CODE (src) == REG)
4611 /* fpr <- some sort of register */
4612 int src_regno = REGNO (src);
4614 if (GPR_P (src_regno))
4615 return "cmovgf %3, %2, %1, %e0";
4617 else if (FPR_P (src_regno))
4619 if (TARGET_HARD_FLOAT)
4620 return "cfmovs %3,%2,%1,%e0";
4621 else
4622 return "cmor %3, %3, %2, %1, %e0";
4626 else if (GET_CODE (src) == MEM)
4628 /* fpr <- memory */
4629 if (mode == SImode || mode == SFmode)
4630 return "cldf%I3%U3 %M3, %2, %1, %e0";
4633 else if (ZERO_P (src))
4634 return "cmovgf %., %2, %1, %e0";
4638 else if (GET_CODE (dest) == MEM)
4640 if (GET_CODE (src) == REG)
4642 int src_regno = REGNO (src);
4643 machine_mode mode = GET_MODE (dest);
4645 if (GPR_P (src_regno))
4647 switch (mode)
4649 default:
4650 break;
4652 case QImode:
4653 return "cstb%I2%U2 %3, %M2, %1, %e0";
4655 case HImode:
4656 return "csth%I2%U2 %3, %M2, %1, %e0";
4658 case SImode:
4659 case SFmode:
4660 return "cst%I2%U2 %3, %M2, %1, %e0";
4664 else if (FPR_P (src_regno) && (mode == SImode || mode == SFmode))
4665 return "cstf%I2%U2 %3, %M2, %1, %e0";
4668 else if (ZERO_P (src))
4670 machine_mode mode = GET_MODE (dest);
4671 switch (mode)
4673 default:
4674 break;
4676 case QImode:
4677 return "cstb%I2%U2 %., %M2, %1, %e0";
4679 case HImode:
4680 return "csth%I2%U2 %., %M2, %1, %e0";
4682 case SImode:
4683 case SFmode:
4684 return "cst%I2%U2 %., %M2, %1, %e0";
4689 fatal_insn ("bad output_condmove_single operand", insn);
4690 return "";
4694 /* Emit the appropriate code to do a comparison, returning the register the
4695 comparison was done it. */
4697 static rtx
4698 frv_emit_comparison (enum rtx_code test, rtx op0, rtx op1)
4700 machine_mode cc_mode;
4701 rtx cc_reg;
4703 /* Floating point doesn't have comparison against a constant. */
4704 if (GET_MODE (op0) == CC_FPmode && GET_CODE (op1) != REG)
4705 op1 = force_reg (GET_MODE (op0), op1);
4707 /* Possibly disable using anything but a fixed register in order to work
4708 around cse moving comparisons past function calls. */
4709 cc_mode = SELECT_CC_MODE (test, op0, op1);
4710 cc_reg = ((TARGET_ALLOC_CC)
4711 ? gen_reg_rtx (cc_mode)
4712 : gen_rtx_REG (cc_mode,
4713 (cc_mode == CC_FPmode) ? FCC_FIRST : ICC_FIRST));
4715 emit_insn (gen_rtx_SET (cc_reg, gen_rtx_COMPARE (cc_mode, op0, op1)));
4717 return cc_reg;
4721 /* Emit code for a conditional branch.
4722 XXX: I originally wanted to add a clobber of a CCR register to use in
4723 conditional execution, but that confuses the rest of the compiler. */
4726 frv_emit_cond_branch (rtx operands[])
4728 rtx test_rtx;
4729 rtx label_ref;
4730 rtx if_else;
4731 enum rtx_code test = GET_CODE (operands[0]);
4732 rtx cc_reg = frv_emit_comparison (test, operands[1], operands[2]);
4733 machine_mode cc_mode = GET_MODE (cc_reg);
4735 /* Branches generate:
4736 (set (pc)
4737 (if_then_else (<test>, <cc_reg>, (const_int 0))
4738 (label_ref <branch_label>)
4739 (pc))) */
4740 label_ref = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
4741 test_rtx = gen_rtx_fmt_ee (test, cc_mode, cc_reg, const0_rtx);
4742 if_else = gen_rtx_IF_THEN_ELSE (cc_mode, test_rtx, label_ref, pc_rtx);
4743 emit_jump_insn (gen_rtx_SET (pc_rtx, if_else));
4744 return TRUE;
4748 /* Emit code to set a gpr to 1/0 based on a comparison. */
4751 frv_emit_scc (rtx operands[])
4753 rtx set;
4754 rtx test_rtx;
4755 rtx clobber;
4756 rtx cr_reg;
4757 enum rtx_code test = GET_CODE (operands[1]);
4758 rtx cc_reg = frv_emit_comparison (test, operands[2], operands[3]);
4760 /* SCC instructions generate:
4761 (parallel [(set <target> (<test>, <cc_reg>, (const_int 0))
4762 (clobber (<ccr_reg>))]) */
4763 test_rtx = gen_rtx_fmt_ee (test, SImode, cc_reg, const0_rtx);
4764 set = gen_rtx_SET (operands[0], test_rtx);
4766 cr_reg = ((TARGET_ALLOC_CC)
4767 ? gen_reg_rtx (CC_CCRmode)
4768 : gen_rtx_REG (CC_CCRmode,
4769 ((GET_MODE (cc_reg) == CC_FPmode)
4770 ? FCR_FIRST
4771 : ICR_FIRST)));
4773 clobber = gen_rtx_CLOBBER (VOIDmode, cr_reg);
4774 emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber)));
4775 return TRUE;
4779 /* Split a SCC instruction into component parts, returning a SEQUENCE to hold
4780 the separate insns. */
4783 frv_split_scc (rtx dest, rtx test, rtx cc_reg, rtx cr_reg, HOST_WIDE_INT value)
4785 rtx ret;
4787 start_sequence ();
4789 /* Set the appropriate CCR bit. */
4790 emit_insn (gen_rtx_SET (cr_reg,
4791 gen_rtx_fmt_ee (GET_CODE (test),
4792 GET_MODE (cr_reg),
4793 cc_reg,
4794 const0_rtx)));
4796 /* Move the value into the destination. */
4797 emit_move_insn (dest, GEN_INT (value));
4799 /* Move 0 into the destination if the test failed */
4800 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
4801 gen_rtx_EQ (GET_MODE (cr_reg),
4802 cr_reg,
4803 const0_rtx),
4804 gen_rtx_SET (dest, const0_rtx)));
4806 /* Finish up, return sequence. */
4807 ret = get_insns ();
4808 end_sequence ();
4809 return ret;
4813 /* Emit the code for a conditional move, return TRUE if we could do the
4814 move. */
4817 frv_emit_cond_move (rtx dest, rtx test_rtx, rtx src1, rtx src2)
4819 rtx set;
4820 rtx clobber_cc;
4821 rtx test2;
4822 rtx cr_reg;
4823 rtx if_rtx;
4824 enum rtx_code test = GET_CODE (test_rtx);
4825 rtx cc_reg = frv_emit_comparison (test,
4826 XEXP (test_rtx, 0), XEXP (test_rtx, 1));
4827 machine_mode cc_mode = GET_MODE (cc_reg);
4829 /* Conditional move instructions generate:
4830 (parallel [(set <target>
4831 (if_then_else (<test> <cc_reg> (const_int 0))
4832 <src1>
4833 <src2>))
4834 (clobber (<ccr_reg>))]) */
4836 /* Handle various cases of conditional move involving two constants. */
4837 if (GET_CODE (src1) == CONST_INT && GET_CODE (src2) == CONST_INT)
4839 HOST_WIDE_INT value1 = INTVAL (src1);
4840 HOST_WIDE_INT value2 = INTVAL (src2);
4842 /* Having 0 as one of the constants can be done by loading the other
4843 constant, and optionally moving in gr0. */
4844 if (value1 == 0 || value2 == 0)
4847 /* If the first value is within an addi range and also the difference
4848 between the two fits in an addi's range, load up the difference, then
4849 conditionally move in 0, and then unconditionally add the first
4850 value. */
4851 else if (IN_RANGE (value1, -2048, 2047)
4852 && IN_RANGE (value2 - value1, -2048, 2047))
4855 /* If neither condition holds, just force the constant into a
4856 register. */
4857 else
4859 src1 = force_reg (GET_MODE (dest), src1);
4860 src2 = force_reg (GET_MODE (dest), src2);
4864 /* If one value is a register, insure the other value is either 0 or a
4865 register. */
4866 else
4868 if (GET_CODE (src1) == CONST_INT && INTVAL (src1) != 0)
4869 src1 = force_reg (GET_MODE (dest), src1);
4871 if (GET_CODE (src2) == CONST_INT && INTVAL (src2) != 0)
4872 src2 = force_reg (GET_MODE (dest), src2);
4875 test2 = gen_rtx_fmt_ee (test, cc_mode, cc_reg, const0_rtx);
4876 if_rtx = gen_rtx_IF_THEN_ELSE (GET_MODE (dest), test2, src1, src2);
4878 set = gen_rtx_SET (dest, if_rtx);
4880 cr_reg = ((TARGET_ALLOC_CC)
4881 ? gen_reg_rtx (CC_CCRmode)
4882 : gen_rtx_REG (CC_CCRmode,
4883 (cc_mode == CC_FPmode) ? FCR_FIRST : ICR_FIRST));
4885 clobber_cc = gen_rtx_CLOBBER (VOIDmode, cr_reg);
4886 emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber_cc)));
4887 return TRUE;
4891 /* Split a conditional move into constituent parts, returning a SEQUENCE
4892 containing all of the insns. */
4895 frv_split_cond_move (rtx operands[])
4897 rtx dest = operands[0];
4898 rtx test = operands[1];
4899 rtx cc_reg = operands[2];
4900 rtx src1 = operands[3];
4901 rtx src2 = operands[4];
4902 rtx cr_reg = operands[5];
4903 rtx ret;
4904 machine_mode cr_mode = GET_MODE (cr_reg);
4906 start_sequence ();
4908 /* Set the appropriate CCR bit. */
4909 emit_insn (gen_rtx_SET (cr_reg,
4910 gen_rtx_fmt_ee (GET_CODE (test),
4911 GET_MODE (cr_reg),
4912 cc_reg,
4913 const0_rtx)));
4915 /* Handle various cases of conditional move involving two constants. */
4916 if (GET_CODE (src1) == CONST_INT && GET_CODE (src2) == CONST_INT)
4918 HOST_WIDE_INT value1 = INTVAL (src1);
4919 HOST_WIDE_INT value2 = INTVAL (src2);
4921 /* Having 0 as one of the constants can be done by loading the other
4922 constant, and optionally moving in gr0. */
4923 if (value1 == 0)
4925 emit_move_insn (dest, src2);
4926 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
4927 gen_rtx_NE (cr_mode, cr_reg,
4928 const0_rtx),
4929 gen_rtx_SET (dest, src1)));
4932 else if (value2 == 0)
4934 emit_move_insn (dest, src1);
4935 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
4936 gen_rtx_EQ (cr_mode, cr_reg,
4937 const0_rtx),
4938 gen_rtx_SET (dest, src2)));
4941 /* If the first value is within an addi range and also the difference
4942 between the two fits in an addi's range, load up the difference, then
4943 conditionally move in 0, and then unconditionally add the first
4944 value. */
4945 else if (IN_RANGE (value1, -2048, 2047)
4946 && IN_RANGE (value2 - value1, -2048, 2047))
4948 rtx dest_si = ((GET_MODE (dest) == SImode)
4949 ? dest
4950 : gen_rtx_SUBREG (SImode, dest, 0));
4952 emit_move_insn (dest_si, GEN_INT (value2 - value1));
4953 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
4954 gen_rtx_NE (cr_mode, cr_reg,
4955 const0_rtx),
4956 gen_rtx_SET (dest_si, const0_rtx)));
4957 emit_insn (gen_addsi3 (dest_si, dest_si, src1));
4960 else
4961 gcc_unreachable ();
4963 else
4965 /* Emit the conditional move for the test being true if needed. */
4966 if (! rtx_equal_p (dest, src1))
4967 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
4968 gen_rtx_NE (cr_mode, cr_reg, const0_rtx),
4969 gen_rtx_SET (dest, src1)));
4971 /* Emit the conditional move for the test being false if needed. */
4972 if (! rtx_equal_p (dest, src2))
4973 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
4974 gen_rtx_EQ (cr_mode, cr_reg, const0_rtx),
4975 gen_rtx_SET (dest, src2)));
4978 /* Finish up, return sequence. */
4979 ret = get_insns ();
4980 end_sequence ();
4981 return ret;
4985 /* Split (set DEST SOURCE), where DEST is a double register and SOURCE is a
4986 memory location that is not known to be dword-aligned. */
4987 void
4988 frv_split_double_load (rtx dest, rtx source)
4990 int regno = REGNO (dest);
4991 rtx dest1 = gen_highpart (SImode, dest);
4992 rtx dest2 = gen_lowpart (SImode, dest);
4993 rtx address = XEXP (source, 0);
4995 /* If the address is pre-modified, load the lower-numbered register
4996 first, then load the other register using an integer offset from
4997 the modified base register. This order should always be safe,
4998 since the pre-modification cannot affect the same registers as the
4999 load does.
5001 The situation for other loads is more complicated. Loading one
5002 of the registers could affect the value of ADDRESS, so we must
5003 be careful which order we do them in. */
5004 if (GET_CODE (address) == PRE_MODIFY
5005 || ! refers_to_regno_p (regno, address))
5007 /* It is safe to load the lower-numbered register first. */
5008 emit_move_insn (dest1, change_address (source, SImode, NULL));
5009 emit_move_insn (dest2, frv_index_memory (source, SImode, 1));
5011 else
5013 /* ADDRESS is not pre-modified and the address depends on the
5014 lower-numbered register. Load the higher-numbered register
5015 first. */
5016 emit_move_insn (dest2, frv_index_memory (source, SImode, 1));
5017 emit_move_insn (dest1, change_address (source, SImode, NULL));
5021 /* Split (set DEST SOURCE), where DEST refers to a dword memory location
5022 and SOURCE is either a double register or the constant zero. */
5023 void
5024 frv_split_double_store (rtx dest, rtx source)
5026 rtx dest1 = change_address (dest, SImode, NULL);
5027 rtx dest2 = frv_index_memory (dest, SImode, 1);
5028 if (ZERO_P (source))
5030 emit_move_insn (dest1, CONST0_RTX (SImode));
5031 emit_move_insn (dest2, CONST0_RTX (SImode));
5033 else
5035 emit_move_insn (dest1, gen_highpart (SImode, source));
5036 emit_move_insn (dest2, gen_lowpart (SImode, source));
5041 /* Split a min/max operation returning a SEQUENCE containing all of the
5042 insns. */
5045 frv_split_minmax (rtx operands[])
5047 rtx dest = operands[0];
5048 rtx minmax = operands[1];
5049 rtx src1 = operands[2];
5050 rtx src2 = operands[3];
5051 rtx cc_reg = operands[4];
5052 rtx cr_reg = operands[5];
5053 rtx ret;
5054 enum rtx_code test_code;
5055 machine_mode cr_mode = GET_MODE (cr_reg);
5057 start_sequence ();
5059 /* Figure out which test to use. */
5060 switch (GET_CODE (minmax))
5062 default:
5063 gcc_unreachable ();
5065 case SMIN: test_code = LT; break;
5066 case SMAX: test_code = GT; break;
5067 case UMIN: test_code = LTU; break;
5068 case UMAX: test_code = GTU; break;
5071 /* Issue the compare instruction. */
5072 emit_insn (gen_rtx_SET (cc_reg, gen_rtx_COMPARE (GET_MODE (cc_reg),
5073 src1, src2)));
5075 /* Set the appropriate CCR bit. */
5076 emit_insn (gen_rtx_SET (cr_reg, gen_rtx_fmt_ee (test_code,
5077 GET_MODE (cr_reg),
5078 cc_reg,
5079 const0_rtx)));
5081 /* If are taking the min/max of a nonzero constant, load that first, and
5082 then do a conditional move of the other value. */
5083 if (GET_CODE (src2) == CONST_INT && INTVAL (src2) != 0)
5085 gcc_assert (!rtx_equal_p (dest, src1));
5087 emit_move_insn (dest, src2);
5088 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5089 gen_rtx_NE (cr_mode, cr_reg, const0_rtx),
5090 gen_rtx_SET (dest, src1)));
5093 /* Otherwise, do each half of the move. */
5094 else
5096 /* Emit the conditional move for the test being true if needed. */
5097 if (! rtx_equal_p (dest, src1))
5098 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5099 gen_rtx_NE (cr_mode, cr_reg, const0_rtx),
5100 gen_rtx_SET (dest, src1)));
5102 /* Emit the conditional move for the test being false if needed. */
5103 if (! rtx_equal_p (dest, src2))
5104 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5105 gen_rtx_EQ (cr_mode, cr_reg, const0_rtx),
5106 gen_rtx_SET (dest, src2)));
5109 /* Finish up, return sequence. */
5110 ret = get_insns ();
5111 end_sequence ();
5112 return ret;
5116 /* Split an integer abs operation returning a SEQUENCE containing all of the
5117 insns. */
5120 frv_split_abs (rtx operands[])
5122 rtx dest = operands[0];
5123 rtx src = operands[1];
5124 rtx cc_reg = operands[2];
5125 rtx cr_reg = operands[3];
5126 rtx ret;
5128 start_sequence ();
5130 /* Issue the compare < 0 instruction. */
5131 emit_insn (gen_rtx_SET (cc_reg, gen_rtx_COMPARE (CCmode, src, const0_rtx)));
5133 /* Set the appropriate CCR bit. */
5134 emit_insn (gen_rtx_SET (cr_reg, gen_rtx_fmt_ee (LT, CC_CCRmode,
5135 cc_reg, const0_rtx)));
5137 /* Emit the conditional negate if the value is negative. */
5138 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5139 gen_rtx_NE (CC_CCRmode, cr_reg, const0_rtx),
5140 gen_negsi2 (dest, src)));
5142 /* Emit the conditional move for the test being false if needed. */
5143 if (! rtx_equal_p (dest, src))
5144 emit_insn (gen_rtx_COND_EXEC (VOIDmode,
5145 gen_rtx_EQ (CC_CCRmode, cr_reg, const0_rtx),
5146 gen_rtx_SET (dest, src)));
5148 /* Finish up, return sequence. */
5149 ret = get_insns ();
5150 end_sequence ();
5151 return ret;
5155 /* Initialize machine-specific if-conversion data.
5156 On the FR-V, we don't have any extra fields per se, but it is useful hook to
5157 initialize the static storage. */
5158 void
5159 frv_ifcvt_machdep_init (void *ce_info ATTRIBUTE_UNUSED)
5161 frv_ifcvt.added_insns_list = NULL_RTX;
5162 frv_ifcvt.cur_scratch_regs = 0;
5163 frv_ifcvt.num_nested_cond_exec = 0;
5164 frv_ifcvt.cr_reg = NULL_RTX;
5165 frv_ifcvt.nested_cc_reg = NULL_RTX;
5166 frv_ifcvt.extra_int_cr = NULL_RTX;
5167 frv_ifcvt.extra_fp_cr = NULL_RTX;
5168 frv_ifcvt.last_nested_if_cr = NULL_RTX;
5172 /* Internal function to add a potential insn to the list of insns to be inserted
5173 if the conditional execution conversion is successful. */
5175 static void
5176 frv_ifcvt_add_insn (rtx pattern, rtx insn, int before_p)
5178 rtx link = alloc_EXPR_LIST (VOIDmode, pattern, insn);
5180 link->jump = before_p; /* Mark to add this before or after insn. */
5181 frv_ifcvt.added_insns_list = alloc_EXPR_LIST (VOIDmode, link,
5182 frv_ifcvt.added_insns_list);
5184 if (TARGET_DEBUG_COND_EXEC)
5186 fprintf (stderr,
5187 "\n:::::::::: frv_ifcvt_add_insn: add the following %s insn %d:\n",
5188 (before_p) ? "before" : "after",
5189 (int)INSN_UID (insn));
5191 debug_rtx (pattern);
5196 /* A C expression to modify the code described by the conditional if
5197 information CE_INFO, possibly updating the tests in TRUE_EXPR, and
5198 FALSE_EXPR for converting if-then and if-then-else code to conditional
5199 instructions. Set either TRUE_EXPR or FALSE_EXPR to a null pointer if the
5200 tests cannot be converted. */
5202 void
5203 frv_ifcvt_modify_tests (ce_if_block *ce_info, rtx *p_true, rtx *p_false)
5205 basic_block test_bb = ce_info->test_bb; /* test basic block */
5206 basic_block then_bb = ce_info->then_bb; /* THEN */
5207 basic_block else_bb = ce_info->else_bb; /* ELSE or NULL */
5208 basic_block join_bb = ce_info->join_bb; /* join block or NULL */
5209 rtx true_expr = *p_true;
5210 rtx cr;
5211 rtx cc;
5212 rtx nested_cc;
5213 machine_mode mode = GET_MODE (true_expr);
5214 int j;
5215 basic_block *bb;
5216 int num_bb;
5217 frv_tmp_reg_t *tmp_reg = &frv_ifcvt.tmp_reg;
5218 rtx check_insn;
5219 rtx sub_cond_exec_reg;
5220 enum rtx_code code;
5221 enum rtx_code code_true;
5222 enum rtx_code code_false;
5223 enum reg_class cc_class;
5224 enum reg_class cr_class;
5225 int cc_first;
5226 int cc_last;
5227 reg_set_iterator rsi;
5229 /* Make sure we are only dealing with hard registers. Also honor the
5230 -mno-cond-exec switch, and -mno-nested-cond-exec switches if
5231 applicable. */
5232 if (!reload_completed || !TARGET_COND_EXEC
5233 || (!TARGET_NESTED_CE && ce_info->pass > 1))
5234 goto fail;
5236 /* Figure out which registers we can allocate for our own purposes. Only
5237 consider registers that are not preserved across function calls and are
5238 not fixed. However, allow the ICC/ICR temporary registers to be allocated
5239 if we did not need to use them in reloading other registers. */
5240 memset (&tmp_reg->regs, 0, sizeof (tmp_reg->regs));
5241 COPY_HARD_REG_SET (tmp_reg->regs, call_used_reg_set);
5242 AND_COMPL_HARD_REG_SET (tmp_reg->regs, fixed_reg_set);
5243 SET_HARD_REG_BIT (tmp_reg->regs, ICC_TEMP);
5244 SET_HARD_REG_BIT (tmp_reg->regs, ICR_TEMP);
5246 /* If this is a nested IF, we need to discover whether the CC registers that
5247 are set/used inside of the block are used anywhere else. If not, we can
5248 change them to be the CC register that is paired with the CR register that
5249 controls the outermost IF block. */
5250 if (ce_info->pass > 1)
5252 CLEAR_HARD_REG_SET (frv_ifcvt.nested_cc_ok_rewrite);
5253 for (j = CC_FIRST; j <= CC_LAST; j++)
5254 if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
5256 if (REGNO_REG_SET_P (df_get_live_in (then_bb), j))
5257 continue;
5259 if (else_bb
5260 && REGNO_REG_SET_P (df_get_live_in (else_bb), j))
5261 continue;
5263 if (join_bb
5264 && REGNO_REG_SET_P (df_get_live_in (join_bb), j))
5265 continue;
5267 SET_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite, j);
5271 for (j = 0; j < frv_ifcvt.cur_scratch_regs; j++)
5272 frv_ifcvt.scratch_regs[j] = NULL_RTX;
5274 frv_ifcvt.added_insns_list = NULL_RTX;
5275 frv_ifcvt.cur_scratch_regs = 0;
5277 bb = (basic_block *) alloca ((2 + ce_info->num_multiple_test_blocks)
5278 * sizeof (basic_block));
5280 if (join_bb)
5282 unsigned int regno;
5284 /* Remove anything live at the beginning of the join block from being
5285 available for allocation. */
5286 EXECUTE_IF_SET_IN_REG_SET (df_get_live_in (join_bb), 0, regno, rsi)
5288 if (regno < FIRST_PSEUDO_REGISTER)
5289 CLEAR_HARD_REG_BIT (tmp_reg->regs, regno);
5293 /* Add in all of the blocks in multiple &&/|| blocks to be scanned. */
5294 num_bb = 0;
5295 if (ce_info->num_multiple_test_blocks)
5297 basic_block multiple_test_bb = ce_info->last_test_bb;
5299 while (multiple_test_bb != test_bb)
5301 bb[num_bb++] = multiple_test_bb;
5302 multiple_test_bb = EDGE_PRED (multiple_test_bb, 0)->src;
5306 /* Add in the THEN and ELSE blocks to be scanned. */
5307 bb[num_bb++] = then_bb;
5308 if (else_bb)
5309 bb[num_bb++] = else_bb;
5311 sub_cond_exec_reg = NULL_RTX;
5312 frv_ifcvt.num_nested_cond_exec = 0;
5314 /* Scan all of the blocks for registers that must not be allocated. */
5315 for (j = 0; j < num_bb; j++)
5317 rtx_insn *last_insn = BB_END (bb[j]);
5318 rtx_insn *insn = BB_HEAD (bb[j]);
5319 unsigned int regno;
5321 if (dump_file)
5322 fprintf (dump_file, "Scanning %s block %d, start %d, end %d\n",
5323 (bb[j] == else_bb) ? "else" : ((bb[j] == then_bb) ? "then" : "test"),
5324 (int) bb[j]->index,
5325 (int) INSN_UID (BB_HEAD (bb[j])),
5326 (int) INSN_UID (BB_END (bb[j])));
5328 /* Anything live at the beginning of the block is obviously unavailable
5329 for allocation. */
5330 EXECUTE_IF_SET_IN_REG_SET (df_get_live_in (bb[j]), 0, regno, rsi)
5332 if (regno < FIRST_PSEUDO_REGISTER)
5333 CLEAR_HARD_REG_BIT (tmp_reg->regs, regno);
5336 /* Loop through the insns in the block. */
5337 for (;;)
5339 /* Mark any new registers that are created as being unavailable for
5340 allocation. Also see if the CC register used in nested IFs can be
5341 reallocated. */
5342 if (INSN_P (insn))
5344 rtx pattern;
5345 rtx set;
5346 int skip_nested_if = FALSE;
5347 HARD_REG_SET mentioned_regs;
5349 CLEAR_HARD_REG_SET (mentioned_regs);
5350 find_all_hard_regs (PATTERN (insn), &mentioned_regs);
5351 AND_COMPL_HARD_REG_SET (tmp_reg->regs, mentioned_regs);
5353 pattern = PATTERN (insn);
5354 if (GET_CODE (pattern) == COND_EXEC)
5356 rtx reg = XEXP (COND_EXEC_TEST (pattern), 0);
5358 if (reg != sub_cond_exec_reg)
5360 sub_cond_exec_reg = reg;
5361 frv_ifcvt.num_nested_cond_exec++;
5365 set = single_set_pattern (pattern);
5366 if (set)
5368 rtx dest = SET_DEST (set);
5369 rtx src = SET_SRC (set);
5371 if (GET_CODE (dest) == REG)
5373 int regno = REGNO (dest);
5374 enum rtx_code src_code = GET_CODE (src);
5376 if (CC_P (regno) && src_code == COMPARE)
5377 skip_nested_if = TRUE;
5379 else if (CR_P (regno)
5380 && (src_code == IF_THEN_ELSE
5381 || COMPARISON_P (src)))
5382 skip_nested_if = TRUE;
5386 if (! skip_nested_if)
5387 AND_COMPL_HARD_REG_SET (frv_ifcvt.nested_cc_ok_rewrite,
5388 mentioned_regs);
5391 if (insn == last_insn)
5392 break;
5394 insn = NEXT_INSN (insn);
5398 /* If this is a nested if, rewrite the CC registers that are available to
5399 include the ones that can be rewritten, to increase the chance of being
5400 able to allocate a paired CC/CR register combination. */
5401 if (ce_info->pass > 1)
5403 for (j = CC_FIRST; j <= CC_LAST; j++)
5404 if (TEST_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite, j))
5405 SET_HARD_REG_BIT (tmp_reg->regs, j);
5406 else
5407 CLEAR_HARD_REG_BIT (tmp_reg->regs, j);
5410 if (dump_file)
5412 int num_gprs = 0;
5413 fprintf (dump_file, "Available GPRs: ");
5415 for (j = GPR_FIRST; j <= GPR_LAST; j++)
5416 if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
5418 fprintf (dump_file, " %d [%s]", j, reg_names[j]);
5419 if (++num_gprs > GPR_TEMP_NUM+2)
5420 break;
5423 fprintf (dump_file, "%s\nAvailable CRs: ",
5424 (num_gprs > GPR_TEMP_NUM+2) ? " ..." : "");
5426 for (j = CR_FIRST; j <= CR_LAST; j++)
5427 if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
5428 fprintf (dump_file, " %d [%s]", j, reg_names[j]);
5430 fputs ("\n", dump_file);
5432 if (ce_info->pass > 1)
5434 fprintf (dump_file, "Modifiable CCs: ");
5435 for (j = CC_FIRST; j <= CC_LAST; j++)
5436 if (TEST_HARD_REG_BIT (tmp_reg->regs, j))
5437 fprintf (dump_file, " %d [%s]", j, reg_names[j]);
5439 fprintf (dump_file, "\n%d nested COND_EXEC statements\n",
5440 frv_ifcvt.num_nested_cond_exec);
5444 /* Allocate the appropriate temporary condition code register. Try to
5445 allocate the ICR/FCR register that corresponds to the ICC/FCC register so
5446 that conditional cmp's can be done. */
5447 if (mode == CCmode || mode == CC_UNSmode || mode == CC_NZmode)
5449 cr_class = ICR_REGS;
5450 cc_class = ICC_REGS;
5451 cc_first = ICC_FIRST;
5452 cc_last = ICC_LAST;
5454 else if (mode == CC_FPmode)
5456 cr_class = FCR_REGS;
5457 cc_class = FCC_REGS;
5458 cc_first = FCC_FIRST;
5459 cc_last = FCC_LAST;
5461 else
5463 cc_first = cc_last = 0;
5464 cr_class = cc_class = NO_REGS;
5467 cc = XEXP (true_expr, 0);
5468 nested_cc = cr = NULL_RTX;
5469 if (cc_class != NO_REGS)
5471 /* For nested IFs and &&/||, see if we can find a CC and CR register pair
5472 so we can execute a csubcc/caddcc/cfcmps instruction. */
5473 int cc_regno;
5475 for (cc_regno = cc_first; cc_regno <= cc_last; cc_regno++)
5477 int cr_regno = cc_regno - CC_FIRST + CR_FIRST;
5479 if (TEST_HARD_REG_BIT (frv_ifcvt.tmp_reg.regs, cc_regno)
5480 && TEST_HARD_REG_BIT (frv_ifcvt.tmp_reg.regs, cr_regno))
5482 frv_ifcvt.tmp_reg.next_reg[ (int)cr_class ] = cr_regno;
5483 cr = frv_alloc_temp_reg (tmp_reg, cr_class, CC_CCRmode, TRUE,
5484 TRUE);
5486 frv_ifcvt.tmp_reg.next_reg[ (int)cc_class ] = cc_regno;
5487 nested_cc = frv_alloc_temp_reg (tmp_reg, cc_class, CCmode,
5488 TRUE, TRUE);
5489 break;
5494 if (! cr)
5496 if (dump_file)
5497 fprintf (dump_file, "Could not allocate a CR temporary register\n");
5499 goto fail;
5502 if (dump_file)
5503 fprintf (dump_file,
5504 "Will use %s for conditional execution, %s for nested comparisons\n",
5505 reg_names[ REGNO (cr)],
5506 (nested_cc) ? reg_names[ REGNO (nested_cc) ] : "<none>");
5508 /* Set the CCR bit. Note for integer tests, we reverse the condition so that
5509 in an IF-THEN-ELSE sequence, we are testing the TRUE case against the CCR
5510 bit being true. We don't do this for floating point, because of NaNs. */
5511 code = GET_CODE (true_expr);
5512 if (GET_MODE (cc) != CC_FPmode)
5514 code = reverse_condition (code);
5515 code_true = EQ;
5516 code_false = NE;
5518 else
5520 code_true = NE;
5521 code_false = EQ;
5524 check_insn = gen_rtx_SET (cr, gen_rtx_fmt_ee (code, CC_CCRmode,
5525 cc, const0_rtx));
5527 /* Record the check insn to be inserted later. */
5528 frv_ifcvt_add_insn (check_insn, BB_END (test_bb), TRUE);
5530 /* Update the tests. */
5531 frv_ifcvt.cr_reg = cr;
5532 frv_ifcvt.nested_cc_reg = nested_cc;
5533 *p_true = gen_rtx_fmt_ee (code_true, CC_CCRmode, cr, const0_rtx);
5534 *p_false = gen_rtx_fmt_ee (code_false, CC_CCRmode, cr, const0_rtx);
5535 return;
5537 /* Fail, don't do this conditional execution. */
5538 fail:
5539 *p_true = NULL_RTX;
5540 *p_false = NULL_RTX;
5541 if (dump_file)
5542 fprintf (dump_file, "Disabling this conditional execution.\n");
5544 return;
5548 /* A C expression to modify the code described by the conditional if
5549 information CE_INFO, for the basic block BB, possibly updating the tests in
5550 TRUE_EXPR, and FALSE_EXPR for converting the && and || parts of if-then or
5551 if-then-else code to conditional instructions. Set either TRUE_EXPR or
5552 FALSE_EXPR to a null pointer if the tests cannot be converted. */
5554 /* p_true and p_false are given expressions of the form:
5556 (and (eq:CC_CCR (reg:CC_CCR)
5557 (const_int 0))
5558 (eq:CC (reg:CC)
5559 (const_int 0))) */
5561 void
5562 frv_ifcvt_modify_multiple_tests (ce_if_block *ce_info,
5563 basic_block bb,
5564 rtx *p_true,
5565 rtx *p_false)
5567 rtx old_true = XEXP (*p_true, 0);
5568 rtx old_false = XEXP (*p_false, 0);
5569 rtx true_expr = XEXP (*p_true, 1);
5570 rtx false_expr = XEXP (*p_false, 1);
5571 rtx test_expr;
5572 rtx old_test;
5573 rtx cr = XEXP (old_true, 0);
5574 rtx check_insn;
5575 rtx new_cr = NULL_RTX;
5576 rtx *p_new_cr = (rtx *)0;
5577 rtx if_else;
5578 rtx compare;
5579 rtx cc;
5580 enum reg_class cr_class;
5581 machine_mode mode = GET_MODE (true_expr);
5582 rtx (*logical_func)(rtx, rtx, rtx);
5584 if (TARGET_DEBUG_COND_EXEC)
5586 fprintf (stderr,
5587 "\n:::::::::: frv_ifcvt_modify_multiple_tests, before modification for %s\ntrue insn:\n",
5588 ce_info->and_and_p ? "&&" : "||");
5590 debug_rtx (*p_true);
5592 fputs ("\nfalse insn:\n", stderr);
5593 debug_rtx (*p_false);
5596 if (!TARGET_MULTI_CE)
5597 goto fail;
5599 if (GET_CODE (cr) != REG)
5600 goto fail;
5602 if (mode == CCmode || mode == CC_UNSmode || mode == CC_NZmode)
5604 cr_class = ICR_REGS;
5605 p_new_cr = &frv_ifcvt.extra_int_cr;
5607 else if (mode == CC_FPmode)
5609 cr_class = FCR_REGS;
5610 p_new_cr = &frv_ifcvt.extra_fp_cr;
5612 else
5613 goto fail;
5615 /* Allocate a temp CR, reusing a previously allocated temp CR if we have 3 or
5616 more &&/|| tests. */
5617 new_cr = *p_new_cr;
5618 if (! new_cr)
5620 new_cr = *p_new_cr = frv_alloc_temp_reg (&frv_ifcvt.tmp_reg, cr_class,
5621 CC_CCRmode, TRUE, TRUE);
5622 if (! new_cr)
5623 goto fail;
5626 if (ce_info->and_and_p)
5628 old_test = old_false;
5629 test_expr = true_expr;
5630 logical_func = (GET_CODE (old_true) == EQ) ? gen_andcr : gen_andncr;
5631 *p_true = gen_rtx_NE (CC_CCRmode, cr, const0_rtx);
5632 *p_false = gen_rtx_EQ (CC_CCRmode, cr, const0_rtx);
5634 else
5636 old_test = old_false;
5637 test_expr = false_expr;
5638 logical_func = (GET_CODE (old_false) == EQ) ? gen_orcr : gen_orncr;
5639 *p_true = gen_rtx_EQ (CC_CCRmode, cr, const0_rtx);
5640 *p_false = gen_rtx_NE (CC_CCRmode, cr, const0_rtx);
5643 /* First add the andcr/andncr/orcr/orncr, which will be added after the
5644 conditional check instruction, due to frv_ifcvt_add_insn being a LIFO
5645 stack. */
5646 frv_ifcvt_add_insn ((*logical_func) (cr, cr, new_cr), BB_END (bb), TRUE);
5648 /* Now add the conditional check insn. */
5649 cc = XEXP (test_expr, 0);
5650 compare = gen_rtx_fmt_ee (GET_CODE (test_expr), CC_CCRmode, cc, const0_rtx);
5651 if_else = gen_rtx_IF_THEN_ELSE (CC_CCRmode, old_test, compare, const0_rtx);
5653 check_insn = gen_rtx_SET (new_cr, if_else);
5655 /* Add the new check insn to the list of check insns that need to be
5656 inserted. */
5657 frv_ifcvt_add_insn (check_insn, BB_END (bb), TRUE);
5659 if (TARGET_DEBUG_COND_EXEC)
5661 fputs ("\n:::::::::: frv_ifcvt_modify_multiple_tests, after modification\ntrue insn:\n",
5662 stderr);
5664 debug_rtx (*p_true);
5666 fputs ("\nfalse insn:\n", stderr);
5667 debug_rtx (*p_false);
5670 return;
5672 fail:
5673 *p_true = *p_false = NULL_RTX;
5675 /* If we allocated a CR register, release it. */
5676 if (new_cr)
5678 CLEAR_HARD_REG_BIT (frv_ifcvt.tmp_reg.regs, REGNO (new_cr));
5679 *p_new_cr = NULL_RTX;
5682 if (TARGET_DEBUG_COND_EXEC)
5683 fputs ("\n:::::::::: frv_ifcvt_modify_multiple_tests, failed.\n", stderr);
5685 return;
5689 /* Return a register which will be loaded with a value if an IF block is
5690 converted to conditional execution. This is used to rewrite instructions
5691 that use constants to ones that just use registers. */
5693 static rtx
5694 frv_ifcvt_load_value (rtx value, rtx insn ATTRIBUTE_UNUSED)
5696 int num_alloc = frv_ifcvt.cur_scratch_regs;
5697 int i;
5698 rtx reg;
5700 /* We know gr0 == 0, so replace any errant uses. */
5701 if (value == const0_rtx)
5702 return gen_rtx_REG (SImode, GPR_FIRST);
5704 /* First search all registers currently loaded to see if we have an
5705 applicable constant. */
5706 if (CONSTANT_P (value)
5707 || (GET_CODE (value) == REG && REGNO (value) == LR_REGNO))
5709 for (i = 0; i < num_alloc; i++)
5711 if (rtx_equal_p (SET_SRC (frv_ifcvt.scratch_regs[i]), value))
5712 return SET_DEST (frv_ifcvt.scratch_regs[i]);
5716 /* Have we exhausted the number of registers available? */
5717 if (num_alloc >= GPR_TEMP_NUM)
5719 if (dump_file)
5720 fprintf (dump_file, "Too many temporary registers allocated\n");
5722 return NULL_RTX;
5725 /* Allocate the new register. */
5726 reg = frv_alloc_temp_reg (&frv_ifcvt.tmp_reg, GPR_REGS, SImode, TRUE, TRUE);
5727 if (! reg)
5729 if (dump_file)
5730 fputs ("Could not find a scratch register\n", dump_file);
5732 return NULL_RTX;
5735 frv_ifcvt.cur_scratch_regs++;
5736 frv_ifcvt.scratch_regs[num_alloc] = gen_rtx_SET (reg, value);
5738 if (dump_file)
5740 if (GET_CODE (value) == CONST_INT)
5741 fprintf (dump_file, "Register %s will hold %ld\n",
5742 reg_names[ REGNO (reg)], (long)INTVAL (value));
5744 else if (GET_CODE (value) == REG && REGNO (value) == LR_REGNO)
5745 fprintf (dump_file, "Register %s will hold LR\n",
5746 reg_names[ REGNO (reg)]);
5748 else
5749 fprintf (dump_file, "Register %s will hold a saved value\n",
5750 reg_names[ REGNO (reg)]);
5753 return reg;
5757 /* Update a MEM used in conditional code that might contain an offset to put
5758 the offset into a scratch register, so that the conditional load/store
5759 operations can be used. This function returns the original pointer if the
5760 MEM is valid to use in conditional code, NULL if we can't load up the offset
5761 into a temporary register, or the new MEM if we were successful. */
5763 static rtx
5764 frv_ifcvt_rewrite_mem (rtx mem, machine_mode mode, rtx insn)
5766 rtx addr = XEXP (mem, 0);
5768 if (!frv_legitimate_address_p_1 (mode, addr, reload_completed, TRUE, FALSE))
5770 if (GET_CODE (addr) == PLUS)
5772 rtx addr_op0 = XEXP (addr, 0);
5773 rtx addr_op1 = XEXP (addr, 1);
5775 if (GET_CODE (addr_op0) == REG && CONSTANT_P (addr_op1))
5777 rtx reg = frv_ifcvt_load_value (addr_op1, insn);
5778 if (!reg)
5779 return NULL_RTX;
5781 addr = gen_rtx_PLUS (Pmode, addr_op0, reg);
5784 else
5785 return NULL_RTX;
5788 else if (CONSTANT_P (addr))
5789 addr = frv_ifcvt_load_value (addr, insn);
5791 else
5792 return NULL_RTX;
5794 if (addr == NULL_RTX)
5795 return NULL_RTX;
5797 else if (XEXP (mem, 0) != addr)
5798 return change_address (mem, mode, addr);
5801 return mem;
5805 /* Given a PATTERN, return a SET expression if this PATTERN has only a single
5806 SET, possibly conditionally executed. It may also have CLOBBERs, USEs. */
5808 static rtx
5809 single_set_pattern (rtx pattern)
5811 rtx set;
5812 int i;
5814 if (GET_CODE (pattern) == COND_EXEC)
5815 pattern = COND_EXEC_CODE (pattern);
5817 if (GET_CODE (pattern) == SET)
5818 return pattern;
5820 else if (GET_CODE (pattern) == PARALLEL)
5822 for (i = 0, set = 0; i < XVECLEN (pattern, 0); i++)
5824 rtx sub = XVECEXP (pattern, 0, i);
5826 switch (GET_CODE (sub))
5828 case USE:
5829 case CLOBBER:
5830 break;
5832 case SET:
5833 if (set)
5834 return 0;
5835 else
5836 set = sub;
5837 break;
5839 default:
5840 return 0;
5843 return set;
5846 return 0;
5850 /* A C expression to modify the code described by the conditional if
5851 information CE_INFO with the new PATTERN in INSN. If PATTERN is a null
5852 pointer after the IFCVT_MODIFY_INSN macro executes, it is assumed that that
5853 insn cannot be converted to be executed conditionally. */
5856 frv_ifcvt_modify_insn (ce_if_block *ce_info,
5857 rtx pattern,
5858 rtx insn)
5860 rtx orig_ce_pattern = pattern;
5861 rtx set;
5862 rtx op0;
5863 rtx op1;
5864 rtx test;
5866 gcc_assert (GET_CODE (pattern) == COND_EXEC);
5868 test = COND_EXEC_TEST (pattern);
5869 if (GET_CODE (test) == AND)
5871 rtx cr = frv_ifcvt.cr_reg;
5872 rtx test_reg;
5874 op0 = XEXP (test, 0);
5875 if (! rtx_equal_p (cr, XEXP (op0, 0)))
5876 goto fail;
5878 op1 = XEXP (test, 1);
5879 test_reg = XEXP (op1, 0);
5880 if (GET_CODE (test_reg) != REG)
5881 goto fail;
5883 /* Is this the first nested if block in this sequence? If so, generate
5884 an andcr or andncr. */
5885 if (! frv_ifcvt.last_nested_if_cr)
5887 rtx and_op;
5889 frv_ifcvt.last_nested_if_cr = test_reg;
5890 if (GET_CODE (op0) == NE)
5891 and_op = gen_andcr (test_reg, cr, test_reg);
5892 else
5893 and_op = gen_andncr (test_reg, cr, test_reg);
5895 frv_ifcvt_add_insn (and_op, insn, TRUE);
5898 /* If this isn't the first statement in the nested if sequence, see if we
5899 are dealing with the same register. */
5900 else if (! rtx_equal_p (test_reg, frv_ifcvt.last_nested_if_cr))
5901 goto fail;
5903 COND_EXEC_TEST (pattern) = test = op1;
5906 /* If this isn't a nested if, reset state variables. */
5907 else
5909 frv_ifcvt.last_nested_if_cr = NULL_RTX;
5912 set = single_set_pattern (pattern);
5913 if (set)
5915 rtx dest = SET_DEST (set);
5916 rtx src = SET_SRC (set);
5917 machine_mode mode = GET_MODE (dest);
5919 /* Check for normal binary operators. */
5920 if (mode == SImode && ARITHMETIC_P (src))
5922 op0 = XEXP (src, 0);
5923 op1 = XEXP (src, 1);
5925 if (integer_register_operand (op0, SImode) && CONSTANT_P (op1))
5927 op1 = frv_ifcvt_load_value (op1, insn);
5928 if (op1)
5929 COND_EXEC_CODE (pattern)
5930 = gen_rtx_SET (dest, gen_rtx_fmt_ee (GET_CODE (src),
5931 GET_MODE (src),
5932 op0, op1));
5933 else
5934 goto fail;
5938 /* For multiply by a constant, we need to handle the sign extending
5939 correctly. Add a USE of the value after the multiply to prevent flow
5940 from cratering because only one register out of the two were used. */
5941 else if (mode == DImode && GET_CODE (src) == MULT)
5943 op0 = XEXP (src, 0);
5944 op1 = XEXP (src, 1);
5945 if (GET_CODE (op0) == SIGN_EXTEND && GET_CODE (op1) == CONST_INT)
5947 op1 = frv_ifcvt_load_value (op1, insn);
5948 if (op1)
5950 op1 = gen_rtx_SIGN_EXTEND (DImode, op1);
5951 COND_EXEC_CODE (pattern)
5952 = gen_rtx_SET (dest, gen_rtx_MULT (DImode, op0, op1));
5954 else
5955 goto fail;
5958 frv_ifcvt_add_insn (gen_use (dest), insn, FALSE);
5961 /* If we are just loading a constant created for a nested conditional
5962 execution statement, just load the constant without any conditional
5963 execution, since we know that the constant will not interfere with any
5964 other registers. */
5965 else if (frv_ifcvt.scratch_insns_bitmap
5966 && bitmap_bit_p (frv_ifcvt.scratch_insns_bitmap,
5967 INSN_UID (insn))
5968 && REG_P (SET_DEST (set))
5969 /* We must not unconditionally set a scratch reg chosen
5970 for a nested if-converted block if its incoming
5971 value from the TEST block (or the result of the THEN
5972 branch) could/should propagate to the JOIN block.
5973 It suffices to test whether the register is live at
5974 the JOIN point: if it's live there, we can infer
5975 that we set it in the former JOIN block of the
5976 nested if-converted block (otherwise it wouldn't
5977 have been available as a scratch register), and it
5978 is either propagated through or set in the other
5979 conditional block. It's probably not worth trying
5980 to catch the latter case, and it could actually
5981 limit scheduling of the combined block quite
5982 severely. */
5983 && ce_info->join_bb
5984 && ! (REGNO_REG_SET_P (df_get_live_in (ce_info->join_bb),
5985 REGNO (SET_DEST (set))))
5986 /* Similarly, we must not unconditionally set a reg
5987 used as scratch in the THEN branch if the same reg
5988 is live in the ELSE branch. */
5989 && (! ce_info->else_bb
5990 || BLOCK_FOR_INSN (insn) == ce_info->else_bb
5991 || ! (REGNO_REG_SET_P (df_get_live_in (ce_info->else_bb),
5992 REGNO (SET_DEST (set))))))
5993 pattern = set;
5995 else if (mode == QImode || mode == HImode || mode == SImode
5996 || mode == SFmode)
5998 int changed_p = FALSE;
6000 /* Check for just loading up a constant */
6001 if (CONSTANT_P (src) && integer_register_operand (dest, mode))
6003 src = frv_ifcvt_load_value (src, insn);
6004 if (!src)
6005 goto fail;
6007 changed_p = TRUE;
6010 /* See if we need to fix up stores */
6011 if (GET_CODE (dest) == MEM)
6013 rtx new_mem = frv_ifcvt_rewrite_mem (dest, mode, insn);
6015 if (!new_mem)
6016 goto fail;
6018 else if (new_mem != dest)
6020 changed_p = TRUE;
6021 dest = new_mem;
6025 /* See if we need to fix up loads */
6026 if (GET_CODE (src) == MEM)
6028 rtx new_mem = frv_ifcvt_rewrite_mem (src, mode, insn);
6030 if (!new_mem)
6031 goto fail;
6033 else if (new_mem != src)
6035 changed_p = TRUE;
6036 src = new_mem;
6040 /* If either src or destination changed, redo SET. */
6041 if (changed_p)
6042 COND_EXEC_CODE (pattern) = gen_rtx_SET (dest, src);
6045 /* Rewrite a nested set cccr in terms of IF_THEN_ELSE. Also deal with
6046 rewriting the CC register to be the same as the paired CC/CR register
6047 for nested ifs. */
6048 else if (mode == CC_CCRmode && COMPARISON_P (src))
6050 int regno = REGNO (XEXP (src, 0));
6051 rtx if_else;
6053 if (ce_info->pass > 1
6054 && regno != (int)REGNO (frv_ifcvt.nested_cc_reg)
6055 && TEST_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite, regno))
6057 src = gen_rtx_fmt_ee (GET_CODE (src),
6058 CC_CCRmode,
6059 frv_ifcvt.nested_cc_reg,
6060 XEXP (src, 1));
6063 if_else = gen_rtx_IF_THEN_ELSE (CC_CCRmode, test, src, const0_rtx);
6064 pattern = gen_rtx_SET (dest, if_else);
6067 /* Remap a nested compare instruction to use the paired CC/CR reg. */
6068 else if (ce_info->pass > 1
6069 && GET_CODE (dest) == REG
6070 && CC_P (REGNO (dest))
6071 && REGNO (dest) != REGNO (frv_ifcvt.nested_cc_reg)
6072 && TEST_HARD_REG_BIT (frv_ifcvt.nested_cc_ok_rewrite,
6073 REGNO (dest))
6074 && GET_CODE (src) == COMPARE)
6076 PUT_MODE (frv_ifcvt.nested_cc_reg, GET_MODE (dest));
6077 COND_EXEC_CODE (pattern)
6078 = gen_rtx_SET (frv_ifcvt.nested_cc_reg, copy_rtx (src));
6082 if (TARGET_DEBUG_COND_EXEC)
6084 rtx orig_pattern = PATTERN (insn);
6086 PATTERN (insn) = pattern;
6087 fprintf (stderr,
6088 "\n:::::::::: frv_ifcvt_modify_insn: pass = %d, insn after modification:\n",
6089 ce_info->pass);
6091 debug_rtx (insn);
6092 PATTERN (insn) = orig_pattern;
6095 return pattern;
6097 fail:
6098 if (TARGET_DEBUG_COND_EXEC)
6100 rtx orig_pattern = PATTERN (insn);
6102 PATTERN (insn) = orig_ce_pattern;
6103 fprintf (stderr,
6104 "\n:::::::::: frv_ifcvt_modify_insn: pass = %d, insn could not be modified:\n",
6105 ce_info->pass);
6107 debug_rtx (insn);
6108 PATTERN (insn) = orig_pattern;
6111 return NULL_RTX;
6115 /* A C expression to perform any final machine dependent modifications in
6116 converting code to conditional execution in the code described by the
6117 conditional if information CE_INFO. */
6119 void
6120 frv_ifcvt_modify_final (ce_if_block *ce_info ATTRIBUTE_UNUSED)
6122 rtx existing_insn;
6123 rtx check_insn;
6124 rtx p = frv_ifcvt.added_insns_list;
6125 int i;
6127 /* Loop inserting the check insns. The last check insn is the first test,
6128 and is the appropriate place to insert constants. */
6129 gcc_assert (p);
6133 rtx check_and_insert_insns = XEXP (p, 0);
6134 rtx old_p = p;
6136 check_insn = XEXP (check_and_insert_insns, 0);
6137 existing_insn = XEXP (check_and_insert_insns, 1);
6138 p = XEXP (p, 1);
6140 /* The jump bit is used to say that the new insn is to be inserted BEFORE
6141 the existing insn, otherwise it is to be inserted AFTER. */
6142 if (check_and_insert_insns->jump)
6144 emit_insn_before (check_insn, existing_insn);
6145 check_and_insert_insns->jump = 0;
6147 else
6148 emit_insn_after (check_insn, existing_insn);
6150 free_EXPR_LIST_node (check_and_insert_insns);
6151 free_EXPR_LIST_node (old_p);
6153 while (p != NULL_RTX);
6155 /* Load up any constants needed into temp gprs */
6156 for (i = 0; i < frv_ifcvt.cur_scratch_regs; i++)
6158 rtx insn = emit_insn_before (frv_ifcvt.scratch_regs[i], existing_insn);
6159 if (! frv_ifcvt.scratch_insns_bitmap)
6160 frv_ifcvt.scratch_insns_bitmap = BITMAP_ALLOC (NULL);
6161 bitmap_set_bit (frv_ifcvt.scratch_insns_bitmap, INSN_UID (insn));
6162 frv_ifcvt.scratch_regs[i] = NULL_RTX;
6165 frv_ifcvt.added_insns_list = NULL_RTX;
6166 frv_ifcvt.cur_scratch_regs = 0;
6170 /* A C expression to cancel any machine dependent modifications in converting
6171 code to conditional execution in the code described by the conditional if
6172 information CE_INFO. */
6174 void
6175 frv_ifcvt_modify_cancel (ce_if_block *ce_info ATTRIBUTE_UNUSED)
6177 int i;
6178 rtx p = frv_ifcvt.added_insns_list;
6180 /* Loop freeing up the EXPR_LIST's allocated. */
6181 while (p != NULL_RTX)
6183 rtx check_and_jump = XEXP (p, 0);
6184 rtx old_p = p;
6186 p = XEXP (p, 1);
6187 free_EXPR_LIST_node (check_and_jump);
6188 free_EXPR_LIST_node (old_p);
6191 /* Release any temporary gprs allocated. */
6192 for (i = 0; i < frv_ifcvt.cur_scratch_regs; i++)
6193 frv_ifcvt.scratch_regs[i] = NULL_RTX;
6195 frv_ifcvt.added_insns_list = NULL_RTX;
6196 frv_ifcvt.cur_scratch_regs = 0;
6197 return;
6200 /* A C expression for the size in bytes of the trampoline, as an integer.
6201 The template is:
6203 setlo #0, <jmp_reg>
6204 setlo #0, <static_chain>
6205 sethi #0, <jmp_reg>
6206 sethi #0, <static_chain>
6207 jmpl @(gr0,<jmp_reg>) */
6210 frv_trampoline_size (void)
6212 if (TARGET_FDPIC)
6213 /* Allocate room for the function descriptor and the lddi
6214 instruction. */
6215 return 8 + 6 * 4;
6216 return 5 /* instructions */ * 4 /* instruction size. */;
6220 /* A C statement to initialize the variable parts of a trampoline. ADDR is an
6221 RTX for the address of the trampoline; FNADDR is an RTX for the address of
6222 the nested function; STATIC_CHAIN is an RTX for the static chain value that
6223 should be passed to the function when it is called.
6225 The template is:
6227 setlo #0, <jmp_reg>
6228 setlo #0, <static_chain>
6229 sethi #0, <jmp_reg>
6230 sethi #0, <static_chain>
6231 jmpl @(gr0,<jmp_reg>) */
6233 static void
6234 frv_trampoline_init (rtx m_tramp, tree fndecl, rtx static_chain)
6236 rtx addr = XEXP (m_tramp, 0);
6237 rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
6238 rtx sc_reg = force_reg (Pmode, static_chain);
6240 emit_library_call (gen_rtx_SYMBOL_REF (SImode, "__trampoline_setup"),
6241 LCT_NORMAL, VOIDmode, 4,
6242 addr, Pmode,
6243 GEN_INT (frv_trampoline_size ()), SImode,
6244 fnaddr, Pmode,
6245 sc_reg, Pmode);
6249 /* Many machines have some registers that cannot be copied directly to or from
6250 memory or even from other types of registers. An example is the `MQ'
6251 register, which on most machines, can only be copied to or from general
6252 registers, but not memory. Some machines allow copying all registers to and
6253 from memory, but require a scratch register for stores to some memory
6254 locations (e.g., those with symbolic address on the RT, and those with
6255 certain symbolic address on the SPARC when compiling PIC). In some cases,
6256 both an intermediate and a scratch register are required.
6258 You should define these macros to indicate to the reload phase that it may
6259 need to allocate at least one register for a reload in addition to the
6260 register to contain the data. Specifically, if copying X to a register
6261 RCLASS in MODE requires an intermediate register, you should define
6262 `SECONDARY_INPUT_RELOAD_CLASS' to return the largest register class all of
6263 whose registers can be used as intermediate registers or scratch registers.
6265 If copying a register RCLASS in MODE to X requires an intermediate or scratch
6266 register, `SECONDARY_OUTPUT_RELOAD_CLASS' should be defined to return the
6267 largest register class required. If the requirements for input and output
6268 reloads are the same, the macro `SECONDARY_RELOAD_CLASS' should be used
6269 instead of defining both macros identically.
6271 The values returned by these macros are often `GENERAL_REGS'. Return
6272 `NO_REGS' if no spare register is needed; i.e., if X can be directly copied
6273 to or from a register of RCLASS in MODE without requiring a scratch register.
6274 Do not define this macro if it would always return `NO_REGS'.
6276 If a scratch register is required (either with or without an intermediate
6277 register), you should define patterns for `reload_inM' or `reload_outM', as
6278 required.. These patterns, which will normally be implemented with a
6279 `define_expand', should be similar to the `movM' patterns, except that
6280 operand 2 is the scratch register.
6282 Define constraints for the reload register and scratch register that contain
6283 a single register class. If the original reload register (whose class is
6284 RCLASS) can meet the constraint given in the pattern, the value returned by
6285 these macros is used for the class of the scratch register. Otherwise, two
6286 additional reload registers are required. Their classes are obtained from
6287 the constraints in the insn pattern.
6289 X might be a pseudo-register or a `subreg' of a pseudo-register, which could
6290 either be in a hard register or in memory. Use `true_regnum' to find out;
6291 it will return -1 if the pseudo is in memory and the hard register number if
6292 it is in a register.
6294 These macros should not be used in the case where a particular class of
6295 registers can only be copied to memory and not to another class of
6296 registers. In that case, secondary reload registers are not needed and
6297 would not be helpful. Instead, a stack location must be used to perform the
6298 copy and the `movM' pattern should use memory as an intermediate storage.
6299 This case often occurs between floating-point and general registers. */
6301 enum reg_class
6302 frv_secondary_reload_class (enum reg_class rclass,
6303 machine_mode mode ATTRIBUTE_UNUSED,
6304 rtx x)
6306 enum reg_class ret;
6308 switch (rclass)
6310 default:
6311 ret = NO_REGS;
6312 break;
6314 /* Accumulators/Accumulator guard registers need to go through floating
6315 point registers. */
6316 case QUAD_REGS:
6317 case GPR_REGS:
6318 ret = NO_REGS;
6319 if (x && GET_CODE (x) == REG)
6321 int regno = REGNO (x);
6323 if (ACC_P (regno) || ACCG_P (regno))
6324 ret = FPR_REGS;
6326 break;
6328 /* Nonzero constants should be loaded into an FPR through a GPR. */
6329 case QUAD_FPR_REGS:
6330 if (x && CONSTANT_P (x) && !ZERO_P (x))
6331 ret = GPR_REGS;
6332 else
6333 ret = NO_REGS;
6334 break;
6336 /* All of these types need gpr registers. */
6337 case ICC_REGS:
6338 case FCC_REGS:
6339 case CC_REGS:
6340 case ICR_REGS:
6341 case FCR_REGS:
6342 case CR_REGS:
6343 case LCR_REG:
6344 case LR_REG:
6345 ret = GPR_REGS;
6346 break;
6348 /* The accumulators need fpr registers. */
6349 case QUAD_ACC_REGS:
6350 case ACCG_REGS:
6351 ret = FPR_REGS;
6352 break;
6355 return ret;
6358 /* This hook exists to catch the case where secondary_reload_class() is
6359 called from init_reg_autoinc() in regclass.c - before the reload optabs
6360 have been initialised. */
6362 static reg_class_t
6363 frv_secondary_reload (bool in_p, rtx x, reg_class_t reload_class_i,
6364 machine_mode reload_mode,
6365 secondary_reload_info * sri)
6367 enum reg_class rclass = NO_REGS;
6368 enum reg_class reload_class = (enum reg_class) reload_class_i;
6370 if (sri->prev_sri && sri->prev_sri->t_icode != CODE_FOR_nothing)
6372 sri->icode = sri->prev_sri->t_icode;
6373 return NO_REGS;
6376 rclass = frv_secondary_reload_class (reload_class, reload_mode, x);
6378 if (rclass != NO_REGS)
6380 enum insn_code icode
6381 = direct_optab_handler (in_p ? reload_in_optab : reload_out_optab,
6382 reload_mode);
6383 if (icode == 0)
6385 /* This happens when then the reload_[in|out]_optabs have
6386 not been initialised. */
6387 sri->t_icode = CODE_FOR_nothing;
6388 return rclass;
6392 /* Fall back to the default secondary reload handler. */
6393 return default_secondary_reload (in_p, x, reload_class, reload_mode, sri);
6397 /* Worker function for TARGET_CLASS_LIKELY_SPILLED_P. */
6399 static bool
6400 frv_class_likely_spilled_p (reg_class_t rclass)
6402 switch (rclass)
6404 default:
6405 break;
6407 case GR8_REGS:
6408 case GR9_REGS:
6409 case GR89_REGS:
6410 case FDPIC_FPTR_REGS:
6411 case FDPIC_REGS:
6412 case ICC_REGS:
6413 case FCC_REGS:
6414 case CC_REGS:
6415 case ICR_REGS:
6416 case FCR_REGS:
6417 case CR_REGS:
6418 case LCR_REG:
6419 case LR_REG:
6420 case SPR_REGS:
6421 case QUAD_ACC_REGS:
6422 case ACCG_REGS:
6423 return true;
6426 return false;
6430 /* An expression for the alignment of a structure field FIELD if the
6431 alignment computed in the usual way is COMPUTED. GCC uses this
6432 value instead of the value in `BIGGEST_ALIGNMENT' or
6433 `BIGGEST_FIELD_ALIGNMENT', if defined, for structure fields only. */
6435 /* The definition type of the bit field data is either char, short, long or
6436 long long. The maximum bit size is the number of bits of its own type.
6438 The bit field data is assigned to a storage unit that has an adequate size
6439 for bit field data retention and is located at the smallest address.
6441 Consecutive bit field data are packed at consecutive bits having the same
6442 storage unit, with regard to the type, beginning with the MSB and continuing
6443 toward the LSB.
6445 If a field to be assigned lies over a bit field type boundary, its
6446 assignment is completed by aligning it with a boundary suitable for the
6447 type.
6449 When a bit field having a bit length of 0 is declared, it is forcibly
6450 assigned to the next storage unit.
6452 e.g)
6453 struct {
6454 int a:2;
6455 int b:6;
6456 char c:4;
6457 int d:10;
6458 int :0;
6459 int f:2;
6460 } x;
6462 +0 +1 +2 +3
6463 &x 00000000 00000000 00000000 00000000
6464 MLM----L
6466 &x+4 00000000 00000000 00000000 00000000
6467 M--L
6469 &x+8 00000000 00000000 00000000 00000000
6470 M----------L
6472 &x+12 00000000 00000000 00000000 00000000
6478 frv_adjust_field_align (tree field, int computed)
6480 /* Make sure that the bitfield is not wider than the type. */
6481 if (DECL_BIT_FIELD (field)
6482 && !DECL_ARTIFICIAL (field))
6484 tree parent = DECL_CONTEXT (field);
6485 tree prev = NULL_TREE;
6486 tree cur;
6488 for (cur = TYPE_FIELDS (parent); cur && cur != field; cur = DECL_CHAIN (cur))
6490 if (TREE_CODE (cur) != FIELD_DECL)
6491 continue;
6493 prev = cur;
6496 gcc_assert (cur);
6498 /* If this isn't a :0 field and if the previous element is a bitfield
6499 also, see if the type is different, if so, we will need to align the
6500 bit-field to the next boundary. */
6501 if (prev
6502 && ! DECL_PACKED (field)
6503 && ! integer_zerop (DECL_SIZE (field))
6504 && DECL_BIT_FIELD_TYPE (field) != DECL_BIT_FIELD_TYPE (prev))
6506 int prev_align = TYPE_ALIGN (TREE_TYPE (prev));
6507 int cur_align = TYPE_ALIGN (TREE_TYPE (field));
6508 computed = (prev_align > cur_align) ? prev_align : cur_align;
6512 return computed;
6516 /* A C expression that is nonzero if it is permissible to store a value of mode
6517 MODE in hard register number REGNO (or in several registers starting with
6518 that one). For a machine where all registers are equivalent, a suitable
6519 definition is
6521 #define HARD_REGNO_MODE_OK(REGNO, MODE) 1
6523 It is not necessary for this macro to check for the numbers of fixed
6524 registers, because the allocation mechanism considers them to be always
6525 occupied.
6527 On some machines, double-precision values must be kept in even/odd register
6528 pairs. The way to implement that is to define this macro to reject odd
6529 register numbers for such modes.
6531 The minimum requirement for a mode to be OK in a register is that the
6532 `movMODE' instruction pattern support moves between the register and any
6533 other hard register for which the mode is OK; and that moving a value into
6534 the register and back out not alter it.
6536 Since the same instruction used to move `SImode' will work for all narrower
6537 integer modes, it is not necessary on any machine for `HARD_REGNO_MODE_OK'
6538 to distinguish between these modes, provided you define patterns `movhi',
6539 etc., to take advantage of this. This is useful because of the interaction
6540 between `HARD_REGNO_MODE_OK' and `MODES_TIEABLE_P'; it is very desirable for
6541 all integer modes to be tieable.
6543 Many machines have special registers for floating point arithmetic. Often
6544 people assume that floating point machine modes are allowed only in floating
6545 point registers. This is not true. Any registers that can hold integers
6546 can safely *hold* a floating point machine mode, whether or not floating
6547 arithmetic can be done on it in those registers. Integer move instructions
6548 can be used to move the values.
6550 On some machines, though, the converse is true: fixed-point machine modes
6551 may not go in floating registers. This is true if the floating registers
6552 normalize any value stored in them, because storing a non-floating value
6553 there would garble it. In this case, `HARD_REGNO_MODE_OK' should reject
6554 fixed-point machine modes in floating registers. But if the floating
6555 registers do not automatically normalize, if you can store any bit pattern
6556 in one and retrieve it unchanged without a trap, then any machine mode may
6557 go in a floating register, so you can define this macro to say so.
6559 The primary significance of special floating registers is rather that they
6560 are the registers acceptable in floating point arithmetic instructions.
6561 However, this is of no concern to `HARD_REGNO_MODE_OK'. You handle it by
6562 writing the proper constraints for those instructions.
6564 On some machines, the floating registers are especially slow to access, so
6565 that it is better to store a value in a stack frame than in such a register
6566 if floating point arithmetic is not being done. As long as the floating
6567 registers are not in class `GENERAL_REGS', they will not be used unless some
6568 pattern's constraint asks for one. */
6571 frv_hard_regno_mode_ok (int regno, machine_mode mode)
6573 int base;
6574 int mask;
6576 switch (mode)
6578 case CCmode:
6579 case CC_UNSmode:
6580 case CC_NZmode:
6581 return ICC_P (regno) || GPR_P (regno);
6583 case CC_CCRmode:
6584 return CR_P (regno) || GPR_P (regno);
6586 case CC_FPmode:
6587 return FCC_P (regno) || GPR_P (regno);
6589 default:
6590 break;
6593 /* Set BASE to the first register in REGNO's class. Set MASK to the
6594 bits that must be clear in (REGNO - BASE) for the register to be
6595 well-aligned. */
6596 if (INTEGRAL_MODE_P (mode) || FLOAT_MODE_P (mode) || VECTOR_MODE_P (mode))
6598 if (ACCG_P (regno))
6600 /* ACCGs store one byte. Two-byte quantities must start in
6601 even-numbered registers, four-byte ones in registers whose
6602 numbers are divisible by four, and so on. */
6603 base = ACCG_FIRST;
6604 mask = GET_MODE_SIZE (mode) - 1;
6606 else
6608 /* The other registers store one word. */
6609 if (GPR_P (regno) || regno == AP_FIRST)
6610 base = GPR_FIRST;
6612 else if (FPR_P (regno))
6613 base = FPR_FIRST;
6615 else if (ACC_P (regno))
6616 base = ACC_FIRST;
6618 else if (SPR_P (regno))
6619 return mode == SImode;
6621 /* Fill in the table. */
6622 else
6623 return 0;
6625 /* Anything smaller than an SI is OK in any word-sized register. */
6626 if (GET_MODE_SIZE (mode) < 4)
6627 return 1;
6629 mask = (GET_MODE_SIZE (mode) / 4) - 1;
6631 return (((regno - base) & mask) == 0);
6634 return 0;
6638 /* A C expression for the number of consecutive hard registers, starting at
6639 register number REGNO, required to hold a value of mode MODE.
6641 On a machine where all registers are exactly one word, a suitable definition
6642 of this macro is
6644 #define HARD_REGNO_NREGS(REGNO, MODE) \
6645 ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \
6646 / UNITS_PER_WORD)) */
6648 /* On the FRV, make the CC_FP mode take 3 words in the integer registers, so
6649 that we can build the appropriate instructions to properly reload the
6650 values. Also, make the byte-sized accumulator guards use one guard
6651 for each byte. */
6654 frv_hard_regno_nregs (int regno, machine_mode mode)
6656 if (ACCG_P (regno))
6657 return GET_MODE_SIZE (mode);
6658 else
6659 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6663 /* A C expression for the maximum number of consecutive registers of
6664 class RCLASS needed to hold a value of mode MODE.
6666 This is closely related to the macro `HARD_REGNO_NREGS'. In fact, the value
6667 of the macro `CLASS_MAX_NREGS (RCLASS, MODE)' should be the maximum value of
6668 `HARD_REGNO_NREGS (REGNO, MODE)' for all REGNO values in the class RCLASS.
6670 This macro helps control the handling of multiple-word values in
6671 the reload pass.
6673 This declaration is required. */
6676 frv_class_max_nregs (enum reg_class rclass, machine_mode mode)
6678 if (rclass == ACCG_REGS)
6679 /* An N-byte value requires N accumulator guards. */
6680 return GET_MODE_SIZE (mode);
6681 else
6682 return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6686 /* A C expression that is nonzero if X is a legitimate constant for an
6687 immediate operand on the target machine. You can assume that X satisfies
6688 `CONSTANT_P', so you need not check this. In fact, `1' is a suitable
6689 definition for this macro on machines where anything `CONSTANT_P' is valid. */
6691 static bool
6692 frv_legitimate_constant_p (machine_mode mode, rtx x)
6694 /* frv_cannot_force_const_mem always returns true for FDPIC. This
6695 means that the move expanders will be expected to deal with most
6696 kinds of constant, regardless of what we return here.
6698 However, among its other duties, frv_legitimate_constant_p decides whether
6699 a constant can be entered into reg_equiv_constant[]. If we return true,
6700 reload can create new instances of the constant whenever it likes.
6702 The idea is therefore to accept as many constants as possible (to give
6703 reload more freedom) while rejecting constants that can only be created
6704 at certain times. In particular, anything with a symbolic component will
6705 require use of the pseudo FDPIC register, which is only available before
6706 reload. */
6707 if (TARGET_FDPIC)
6708 return LEGITIMATE_PIC_OPERAND_P (x);
6710 /* All of the integer constants are ok. */
6711 if (GET_CODE (x) != CONST_DOUBLE)
6712 return TRUE;
6714 /* double integer constants are ok. */
6715 if (GET_MODE (x) == VOIDmode || mode == DImode)
6716 return TRUE;
6718 /* 0 is always ok. */
6719 if (x == CONST0_RTX (mode))
6720 return TRUE;
6722 /* If floating point is just emulated, allow any constant, since it will be
6723 constructed in the GPRs. */
6724 if (!TARGET_HAS_FPRS)
6725 return TRUE;
6727 if (mode == DFmode && !TARGET_DOUBLE)
6728 return TRUE;
6730 /* Otherwise store the constant away and do a load. */
6731 return FALSE;
6734 /* Implement SELECT_CC_MODE. Choose CC_FP for floating-point comparisons,
6735 CC_NZ for comparisons against zero in which a single Z or N flag test
6736 is enough, CC_UNS for other unsigned comparisons, and CC for other
6737 signed comparisons. */
6739 machine_mode
6740 frv_select_cc_mode (enum rtx_code code, rtx x, rtx y)
6742 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
6743 return CC_FPmode;
6745 switch (code)
6747 case EQ:
6748 case NE:
6749 case LT:
6750 case GE:
6751 return y == const0_rtx ? CC_NZmode : CCmode;
6753 case GTU:
6754 case GEU:
6755 case LTU:
6756 case LEU:
6757 return y == const0_rtx ? CC_NZmode : CC_UNSmode;
6759 default:
6760 return CCmode;
6765 /* Worker function for TARGET_REGISTER_MOVE_COST. */
6767 #define HIGH_COST 40
6768 #define MEDIUM_COST 3
6769 #define LOW_COST 1
6771 static int
6772 frv_register_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
6773 reg_class_t from, reg_class_t to)
6775 switch (from)
6777 default:
6778 break;
6780 case QUAD_REGS:
6781 case GPR_REGS:
6782 case GR8_REGS:
6783 case GR9_REGS:
6784 case GR89_REGS:
6785 case FDPIC_REGS:
6786 case FDPIC_FPTR_REGS:
6787 case FDPIC_CALL_REGS:
6789 switch (to)
6791 default:
6792 break;
6794 case QUAD_REGS:
6795 case GPR_REGS:
6796 case GR8_REGS:
6797 case GR9_REGS:
6798 case GR89_REGS:
6799 case FDPIC_REGS:
6800 case FDPIC_FPTR_REGS:
6801 case FDPIC_CALL_REGS:
6803 return LOW_COST;
6805 case FPR_REGS:
6806 return LOW_COST;
6808 case LCR_REG:
6809 case LR_REG:
6810 case SPR_REGS:
6811 return LOW_COST;
6814 case QUAD_FPR_REGS:
6815 switch (to)
6817 default:
6818 break;
6820 case QUAD_REGS:
6821 case GPR_REGS:
6822 case GR8_REGS:
6823 case GR9_REGS:
6824 case GR89_REGS:
6825 case FDPIC_REGS:
6826 case FDPIC_FPTR_REGS:
6827 case FDPIC_CALL_REGS:
6829 case QUAD_ACC_REGS:
6830 case ACCG_REGS:
6831 return MEDIUM_COST;
6833 case QUAD_FPR_REGS:
6834 return LOW_COST;
6837 case LCR_REG:
6838 case LR_REG:
6839 case SPR_REGS:
6840 switch (to)
6842 default:
6843 break;
6845 case QUAD_REGS:
6846 case GPR_REGS:
6847 case GR8_REGS:
6848 case GR9_REGS:
6849 case GR89_REGS:
6850 case FDPIC_REGS:
6851 case FDPIC_FPTR_REGS:
6852 case FDPIC_CALL_REGS:
6854 return MEDIUM_COST;
6857 case QUAD_ACC_REGS:
6858 case ACCG_REGS:
6859 switch (to)
6861 default:
6862 break;
6864 case QUAD_FPR_REGS:
6865 return MEDIUM_COST;
6870 return HIGH_COST;
6873 /* Worker function for TARGET_MEMORY_MOVE_COST. */
6875 static int
6876 frv_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
6877 reg_class_t rclass ATTRIBUTE_UNUSED,
6878 bool in ATTRIBUTE_UNUSED)
6880 return 4;
6884 /* Implementation of TARGET_ASM_INTEGER. In the FRV case we need to
6885 use ".picptr" to generate safe relocations for PIC code. We also
6886 need a fixup entry for aligned (non-debugging) code. */
6888 static bool
6889 frv_assemble_integer (rtx value, unsigned int size, int aligned_p)
6891 if ((flag_pic || TARGET_FDPIC) && size == UNITS_PER_WORD)
6893 if (GET_CODE (value) == CONST
6894 || GET_CODE (value) == SYMBOL_REF
6895 || GET_CODE (value) == LABEL_REF)
6897 if (TARGET_FDPIC && GET_CODE (value) == SYMBOL_REF
6898 && SYMBOL_REF_FUNCTION_P (value))
6900 fputs ("\t.picptr\tfuncdesc(", asm_out_file);
6901 output_addr_const (asm_out_file, value);
6902 fputs (")\n", asm_out_file);
6903 return true;
6905 else if (TARGET_FDPIC && GET_CODE (value) == CONST
6906 && frv_function_symbol_referenced_p (value))
6907 return false;
6908 if (aligned_p && !TARGET_FDPIC)
6910 static int label_num = 0;
6911 char buf[256];
6912 const char *p;
6914 ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", label_num++);
6915 p = (* targetm.strip_name_encoding) (buf);
6917 fprintf (asm_out_file, "%s:\n", p);
6918 fprintf (asm_out_file, "%s\n", FIXUP_SECTION_ASM_OP);
6919 fprintf (asm_out_file, "\t.picptr\t%s\n", p);
6920 fprintf (asm_out_file, "\t.previous\n");
6922 assemble_integer_with_op ("\t.picptr\t", value);
6923 return true;
6925 if (!aligned_p)
6927 /* We've set the unaligned SI op to NULL, so we always have to
6928 handle the unaligned case here. */
6929 assemble_integer_with_op ("\t.4byte\t", value);
6930 return true;
6933 return default_assemble_integer (value, size, aligned_p);
6936 /* Function to set up the backend function structure. */
6938 static struct machine_function *
6939 frv_init_machine_status (void)
6941 return ggc_cleared_alloc<machine_function> ();
6944 /* Implement TARGET_SCHED_ISSUE_RATE. */
6947 frv_issue_rate (void)
6949 if (!TARGET_PACK)
6950 return 1;
6952 switch (frv_cpu_type)
6954 default:
6955 case FRV_CPU_FR300:
6956 case FRV_CPU_SIMPLE:
6957 return 1;
6959 case FRV_CPU_FR400:
6960 case FRV_CPU_FR405:
6961 case FRV_CPU_FR450:
6962 return 2;
6964 case FRV_CPU_GENERIC:
6965 case FRV_CPU_FR500:
6966 case FRV_CPU_TOMCAT:
6967 return 4;
6969 case FRV_CPU_FR550:
6970 return 8;
6974 /* Return the value of INSN's acc_group attribute. */
6977 frv_acc_group (rtx insn)
6979 /* This distinction only applies to the FR550 packing constraints. */
6980 if (frv_cpu_type == FRV_CPU_FR550)
6982 subrtx_iterator::array_type array;
6983 FOR_EACH_SUBRTX (iter, array, PATTERN (insn), NONCONST)
6984 if (REG_P (*iter))
6986 unsigned int regno = REGNO (*iter);
6987 /* If REGNO refers to an accumulator, return ACC_GROUP_ODD if
6988 the bit 2 of the register number is set and ACC_GROUP_EVEN if
6989 it is clear. */
6990 if (ACC_P (regno))
6991 return (regno - ACC_FIRST) & 4 ? ACC_GROUP_ODD : ACC_GROUP_EVEN;
6992 if (ACCG_P (regno))
6993 return (regno - ACCG_FIRST) & 4 ? ACC_GROUP_ODD : ACC_GROUP_EVEN;
6996 return ACC_GROUP_NONE;
6999 /* Return the index of the DFA unit in FRV_UNIT_NAMES[] that instruction
7000 INSN will try to claim first. Since this value depends only on the
7001 type attribute, we can cache the results in FRV_TYPE_TO_UNIT[]. */
7003 static unsigned int
7004 frv_insn_unit (rtx_insn *insn)
7006 enum attr_type type;
7008 type = get_attr_type (insn);
7009 if (frv_type_to_unit[type] == ARRAY_SIZE (frv_unit_codes))
7011 /* We haven't seen this type of instruction before. */
7012 state_t state;
7013 unsigned int unit;
7015 /* Issue the instruction on its own to see which unit it prefers. */
7016 state = alloca (state_size ());
7017 state_reset (state);
7018 state_transition (state, insn);
7020 /* Find out which unit was taken. */
7021 for (unit = 0; unit < ARRAY_SIZE (frv_unit_codes); unit++)
7022 if (cpu_unit_reservation_p (state, frv_unit_codes[unit]))
7023 break;
7025 gcc_assert (unit != ARRAY_SIZE (frv_unit_codes));
7027 frv_type_to_unit[type] = unit;
7029 return frv_type_to_unit[type];
7032 /* Return true if INSN issues to a branch unit. */
7034 static bool
7035 frv_issues_to_branch_unit_p (rtx_insn *insn)
7037 return frv_unit_groups[frv_insn_unit (insn)] == GROUP_B;
7040 /* The instructions in the packet, partitioned into groups. */
7041 struct frv_packet_group {
7042 /* How many instructions in the packet belong to this group. */
7043 unsigned int num_insns;
7045 /* A list of the instructions that belong to this group, in the order
7046 they appear in the rtl stream. */
7047 rtx_insn *insns[ARRAY_SIZE (frv_unit_codes)];
7049 /* The contents of INSNS after they have been sorted into the correct
7050 assembly-language order. Element X issues to unit X. The list may
7051 contain extra nops. */
7052 rtx_insn *sorted[ARRAY_SIZE (frv_unit_codes)];
7054 /* The member of frv_nops[] to use in sorted[]. */
7055 rtx_insn *nop;
7058 /* The current state of the packing pass, implemented by frv_pack_insns. */
7059 static struct {
7060 /* The state of the pipeline DFA. */
7061 state_t dfa_state;
7063 /* Which hardware registers are set within the current packet,
7064 and the conditions under which they are set. */
7065 regstate_t regstate[FIRST_PSEUDO_REGISTER];
7067 /* The memory locations that have been modified so far in this
7068 packet. MEM is the memref and COND is the regstate_t condition
7069 under which it is set. */
7070 struct {
7071 rtx mem;
7072 regstate_t cond;
7073 } mems[2];
7075 /* The number of valid entries in MEMS. The value is larger than
7076 ARRAY_SIZE (mems) if there were too many mems to record. */
7077 unsigned int num_mems;
7079 /* The maximum number of instructions that can be packed together. */
7080 unsigned int issue_rate;
7082 /* The instructions in the packet, partitioned into groups. */
7083 struct frv_packet_group groups[NUM_GROUPS];
7085 /* The instructions that make up the current packet. */
7086 rtx_insn *insns[ARRAY_SIZE (frv_unit_codes)];
7087 unsigned int num_insns;
7088 } frv_packet;
7090 /* Return the regstate_t flags for the given COND_EXEC condition.
7091 Abort if the condition isn't in the right form. */
7093 static int
7094 frv_cond_flags (rtx cond)
7096 gcc_assert ((GET_CODE (cond) == EQ || GET_CODE (cond) == NE)
7097 && GET_CODE (XEXP (cond, 0)) == REG
7098 && CR_P (REGNO (XEXP (cond, 0)))
7099 && XEXP (cond, 1) == const0_rtx);
7100 return ((REGNO (XEXP (cond, 0)) - CR_FIRST)
7101 | (GET_CODE (cond) == NE
7102 ? REGSTATE_IF_TRUE
7103 : REGSTATE_IF_FALSE));
7107 /* Return true if something accessed under condition COND2 can
7108 conflict with something written under condition COND1. */
7110 static bool
7111 frv_regstate_conflict_p (regstate_t cond1, regstate_t cond2)
7113 /* If either reference was unconditional, we have a conflict. */
7114 if ((cond1 & REGSTATE_IF_EITHER) == 0
7115 || (cond2 & REGSTATE_IF_EITHER) == 0)
7116 return true;
7118 /* The references might conflict if they were controlled by
7119 different CRs. */
7120 if ((cond1 & REGSTATE_CC_MASK) != (cond2 & REGSTATE_CC_MASK))
7121 return true;
7123 /* They definitely conflict if they are controlled by the
7124 same condition. */
7125 if ((cond1 & cond2 & REGSTATE_IF_EITHER) != 0)
7126 return true;
7128 return false;
7132 /* Return true if an instruction with pattern PAT depends on an
7133 instruction in the current packet. COND describes the condition
7134 under which PAT might be set or used. */
7136 static bool
7137 frv_registers_conflict_p_1 (rtx pat, regstate_t cond)
7139 subrtx_var_iterator::array_type array;
7140 FOR_EACH_SUBRTX_VAR (iter, array, pat, NONCONST)
7142 rtx x = *iter;
7143 if (GET_CODE (x) == REG)
7145 unsigned int regno;
7146 FOR_EACH_REGNO (regno, x)
7147 if ((frv_packet.regstate[regno] & REGSTATE_MODIFIED) != 0)
7148 if (frv_regstate_conflict_p (frv_packet.regstate[regno], cond))
7149 return true;
7151 else if (GET_CODE (x) == MEM)
7153 /* If we ran out of memory slots, assume a conflict. */
7154 if (frv_packet.num_mems > ARRAY_SIZE (frv_packet.mems))
7155 return 1;
7157 /* Check for output or true dependencies with earlier MEMs. */
7158 for (unsigned int i = 0; i < frv_packet.num_mems; i++)
7159 if (frv_regstate_conflict_p (frv_packet.mems[i].cond, cond))
7161 if (true_dependence (frv_packet.mems[i].mem, VOIDmode, x))
7162 return true;
7164 if (output_dependence (frv_packet.mems[i].mem, x))
7165 return true;
7169 /* The return values of calls aren't significant: they describe
7170 the effect of the call as a whole, not of the insn itself. */
7171 else if (GET_CODE (x) == SET && GET_CODE (SET_SRC (x)) == CALL)
7172 iter.substitute (SET_SRC (x));
7174 return false;
7178 /* Return true if something in X might depend on an instruction
7179 in the current packet. */
7181 static bool
7182 frv_registers_conflict_p (rtx x)
7184 regstate_t flags;
7186 flags = 0;
7187 if (GET_CODE (x) == COND_EXEC)
7189 if (frv_registers_conflict_p_1 (XEXP (x, 0), flags))
7190 return true;
7192 flags |= frv_cond_flags (XEXP (x, 0));
7193 x = XEXP (x, 1);
7195 return frv_registers_conflict_p_1 (x, flags);
7199 /* A note_stores callback. DATA points to the regstate_t condition
7200 under which X is modified. Update FRV_PACKET accordingly. */
7202 static void
7203 frv_registers_update_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
7205 unsigned int regno;
7207 if (GET_CODE (x) == REG)
7208 FOR_EACH_REGNO (regno, x)
7209 frv_packet.regstate[regno] |= *(regstate_t *) data;
7211 if (GET_CODE (x) == MEM)
7213 if (frv_packet.num_mems < ARRAY_SIZE (frv_packet.mems))
7215 frv_packet.mems[frv_packet.num_mems].mem = x;
7216 frv_packet.mems[frv_packet.num_mems].cond = *(regstate_t *) data;
7218 frv_packet.num_mems++;
7223 /* Update the register state information for an instruction whose
7224 body is X. */
7226 static void
7227 frv_registers_update (rtx x)
7229 regstate_t flags;
7231 flags = REGSTATE_MODIFIED;
7232 if (GET_CODE (x) == COND_EXEC)
7234 flags |= frv_cond_flags (XEXP (x, 0));
7235 x = XEXP (x, 1);
7237 note_stores (x, frv_registers_update_1, &flags);
7241 /* Initialize frv_packet for the start of a new packet. */
7243 static void
7244 frv_start_packet (void)
7246 enum frv_insn_group group;
7248 memset (frv_packet.regstate, 0, sizeof (frv_packet.regstate));
7249 frv_packet.num_mems = 0;
7250 frv_packet.num_insns = 0;
7251 for (group = GROUP_I; group < NUM_GROUPS;
7252 group = (enum frv_insn_group) (group + 1))
7253 frv_packet.groups[group].num_insns = 0;
7257 /* Likewise for the start of a new basic block. */
7259 static void
7260 frv_start_packet_block (void)
7262 state_reset (frv_packet.dfa_state);
7263 frv_start_packet ();
7267 /* Finish the current packet, if any, and start a new one. Call
7268 HANDLE_PACKET with FRV_PACKET describing the completed packet. */
7270 static void
7271 frv_finish_packet (void (*handle_packet) (void))
7273 if (frv_packet.num_insns > 0)
7275 handle_packet ();
7276 state_transition (frv_packet.dfa_state, 0);
7277 frv_start_packet ();
7282 /* Return true if INSN can be added to the current packet. Update
7283 the DFA state on success. */
7285 static bool
7286 frv_pack_insn_p (rtx_insn *insn)
7288 /* See if the packet is already as long as it can be. */
7289 if (frv_packet.num_insns == frv_packet.issue_rate)
7290 return false;
7292 /* If the scheduler thought that an instruction should start a packet,
7293 it's usually a good idea to believe it. It knows much more about
7294 the latencies than we do.
7296 There are some exceptions though:
7298 - Conditional instructions are scheduled on the assumption that
7299 they will be executed. This is usually a good thing, since it
7300 tends to avoid unnecessary stalls in the conditional code.
7301 But we want to pack conditional instructions as tightly as
7302 possible, in order to optimize the case where they aren't
7303 executed.
7305 - The scheduler will always put branches on their own, even
7306 if there's no real dependency.
7308 - There's no point putting a call in its own packet unless
7309 we have to. */
7310 if (frv_packet.num_insns > 0
7311 && NONJUMP_INSN_P (insn)
7312 && GET_MODE (insn) == TImode
7313 && GET_CODE (PATTERN (insn)) != COND_EXEC)
7314 return false;
7316 /* Check for register conflicts. Don't do this for setlo since any
7317 conflict will be with the partnering sethi, with which it can
7318 be packed. */
7319 if (get_attr_type (insn) != TYPE_SETLO)
7320 if (frv_registers_conflict_p (PATTERN (insn)))
7321 return false;
7323 return state_transition (frv_packet.dfa_state, insn) < 0;
7327 /* Add instruction INSN to the current packet. */
7329 static void
7330 frv_add_insn_to_packet (rtx_insn *insn)
7332 struct frv_packet_group *packet_group;
7334 packet_group = &frv_packet.groups[frv_unit_groups[frv_insn_unit (insn)]];
7335 packet_group->insns[packet_group->num_insns++] = insn;
7336 frv_packet.insns[frv_packet.num_insns++] = insn;
7338 frv_registers_update (PATTERN (insn));
7342 /* Insert INSN (a member of frv_nops[]) into the current packet. If the
7343 packet ends in a branch or call, insert the nop before it, otherwise
7344 add to the end. */
7346 static void
7347 frv_insert_nop_in_packet (rtx_insn *insn)
7349 struct frv_packet_group *packet_group;
7350 rtx_insn *last;
7352 packet_group = &frv_packet.groups[frv_unit_groups[frv_insn_unit (insn)]];
7353 last = frv_packet.insns[frv_packet.num_insns - 1];
7354 if (! NONJUMP_INSN_P (last))
7356 insn = emit_insn_before (PATTERN (insn), last);
7357 frv_packet.insns[frv_packet.num_insns - 1] = insn;
7358 frv_packet.insns[frv_packet.num_insns++] = last;
7360 else
7362 insn = emit_insn_after (PATTERN (insn), last);
7363 frv_packet.insns[frv_packet.num_insns++] = insn;
7365 packet_group->insns[packet_group->num_insns++] = insn;
7369 /* If packing is enabled, divide the instructions into packets and
7370 return true. Call HANDLE_PACKET for each complete packet. */
7372 static bool
7373 frv_for_each_packet (void (*handle_packet) (void))
7375 rtx_insn *insn, *next_insn;
7377 frv_packet.issue_rate = frv_issue_rate ();
7379 /* Early exit if we don't want to pack insns. */
7380 if (!optimize
7381 || !flag_schedule_insns_after_reload
7382 || !TARGET_VLIW_BRANCH
7383 || frv_packet.issue_rate == 1)
7384 return false;
7386 /* Set up the initial packing state. */
7387 dfa_start ();
7388 frv_packet.dfa_state = alloca (state_size ());
7390 frv_start_packet_block ();
7391 for (insn = get_insns (); insn != 0; insn = next_insn)
7393 enum rtx_code code;
7394 bool eh_insn_p;
7396 code = GET_CODE (insn);
7397 next_insn = NEXT_INSN (insn);
7399 if (code == CODE_LABEL)
7401 frv_finish_packet (handle_packet);
7402 frv_start_packet_block ();
7405 if (INSN_P (insn))
7406 switch (GET_CODE (PATTERN (insn)))
7408 case USE:
7409 case CLOBBER:
7410 break;
7412 default:
7413 /* Calls mustn't be packed on a TOMCAT. */
7414 if (CALL_P (insn) && frv_cpu_type == FRV_CPU_TOMCAT)
7415 frv_finish_packet (handle_packet);
7417 /* Since the last instruction in a packet determines the EH
7418 region, any exception-throwing instruction must come at
7419 the end of reordered packet. Insns that issue to a
7420 branch unit are bound to come last; for others it's
7421 too hard to predict. */
7422 eh_insn_p = (find_reg_note (insn, REG_EH_REGION, NULL) != NULL);
7423 if (eh_insn_p && !frv_issues_to_branch_unit_p (insn))
7424 frv_finish_packet (handle_packet);
7426 /* Finish the current packet if we can't add INSN to it.
7427 Simulate cycles until INSN is ready to issue. */
7428 if (!frv_pack_insn_p (insn))
7430 frv_finish_packet (handle_packet);
7431 while (!frv_pack_insn_p (insn))
7432 state_transition (frv_packet.dfa_state, 0);
7435 /* Add the instruction to the packet. */
7436 frv_add_insn_to_packet (insn);
7438 /* Calls and jumps end a packet, as do insns that throw
7439 an exception. */
7440 if (code == CALL_INSN || code == JUMP_INSN || eh_insn_p)
7441 frv_finish_packet (handle_packet);
7442 break;
7445 frv_finish_packet (handle_packet);
7446 dfa_finish ();
7447 return true;
7450 /* Subroutine of frv_sort_insn_group. We are trying to sort
7451 frv_packet.groups[GROUP].sorted[0...NUM_INSNS-1] into assembly
7452 language order. We have already picked a new position for
7453 frv_packet.groups[GROUP].sorted[X] if bit X of ISSUED is set.
7454 These instructions will occupy elements [0, LOWER_SLOT) and
7455 [UPPER_SLOT, NUM_INSNS) of the final (sorted) array. STATE is
7456 the DFA state after issuing these instructions.
7458 Try filling elements [LOWER_SLOT, UPPER_SLOT) with every permutation
7459 of the unused instructions. Return true if one such permutation gives
7460 a valid ordering, leaving the successful permutation in sorted[].
7461 Do not modify sorted[] until a valid permutation is found. */
7463 static bool
7464 frv_sort_insn_group_1 (enum frv_insn_group group,
7465 unsigned int lower_slot, unsigned int upper_slot,
7466 unsigned int issued, unsigned int num_insns,
7467 state_t state)
7469 struct frv_packet_group *packet_group;
7470 unsigned int i;
7471 state_t test_state;
7472 size_t dfa_size;
7473 rtx_insn *insn;
7475 /* Early success if we've filled all the slots. */
7476 if (lower_slot == upper_slot)
7477 return true;
7479 packet_group = &frv_packet.groups[group];
7480 dfa_size = state_size ();
7481 test_state = alloca (dfa_size);
7483 /* Try issuing each unused instruction. */
7484 for (i = num_insns - 1; i + 1 != 0; i--)
7485 if (~issued & (1 << i))
7487 insn = packet_group->sorted[i];
7488 memcpy (test_state, state, dfa_size);
7489 if (state_transition (test_state, insn) < 0
7490 && cpu_unit_reservation_p (test_state,
7491 NTH_UNIT (group, upper_slot - 1))
7492 && frv_sort_insn_group_1 (group, lower_slot, upper_slot - 1,
7493 issued | (1 << i), num_insns,
7494 test_state))
7496 packet_group->sorted[upper_slot - 1] = insn;
7497 return true;
7501 return false;
7504 /* Compare two instructions by their frv_insn_unit. */
7506 static int
7507 frv_compare_insns (const void *first, const void *second)
7509 rtx_insn * const *insn1 = (rtx_insn * const *) first;
7510 rtx_insn * const *insn2 = (rtx_insn * const *) second;
7511 return frv_insn_unit (*insn1) - frv_insn_unit (*insn2);
7514 /* Copy frv_packet.groups[GROUP].insns[] to frv_packet.groups[GROUP].sorted[]
7515 and sort it into assembly language order. See frv.md for a description of
7516 the algorithm. */
7518 static void
7519 frv_sort_insn_group (enum frv_insn_group group)
7521 struct frv_packet_group *packet_group;
7522 unsigned int first, i, nop, max_unit, num_slots;
7523 state_t state, test_state;
7524 size_t dfa_size;
7526 packet_group = &frv_packet.groups[group];
7528 /* Assume no nop is needed. */
7529 packet_group->nop = 0;
7531 if (packet_group->num_insns == 0)
7532 return;
7534 /* Copy insns[] to sorted[]. */
7535 memcpy (packet_group->sorted, packet_group->insns,
7536 sizeof (rtx) * packet_group->num_insns);
7538 /* Sort sorted[] by the unit that each insn tries to take first. */
7539 if (packet_group->num_insns > 1)
7540 qsort (packet_group->sorted, packet_group->num_insns,
7541 sizeof (rtx), frv_compare_insns);
7543 /* That's always enough for branch and control insns. */
7544 if (group == GROUP_B || group == GROUP_C)
7545 return;
7547 dfa_size = state_size ();
7548 state = alloca (dfa_size);
7549 test_state = alloca (dfa_size);
7551 /* Find the highest FIRST such that sorted[0...FIRST-1] can issue
7552 consecutively and such that the DFA takes unit X when sorted[X]
7553 is added. Set STATE to the new DFA state. */
7554 state_reset (test_state);
7555 for (first = 0; first < packet_group->num_insns; first++)
7557 memcpy (state, test_state, dfa_size);
7558 if (state_transition (test_state, packet_group->sorted[first]) >= 0
7559 || !cpu_unit_reservation_p (test_state, NTH_UNIT (group, first)))
7560 break;
7563 /* If all the instructions issued in ascending order, we're done. */
7564 if (first == packet_group->num_insns)
7565 return;
7567 /* Add nops to the end of sorted[] and try each permutation until
7568 we find one that works. */
7569 for (nop = 0; nop < frv_num_nops; nop++)
7571 max_unit = frv_insn_unit (frv_nops[nop]);
7572 if (frv_unit_groups[max_unit] == group)
7574 packet_group->nop = frv_nops[nop];
7575 num_slots = UNIT_NUMBER (max_unit) + 1;
7576 for (i = packet_group->num_insns; i < num_slots; i++)
7577 packet_group->sorted[i] = frv_nops[nop];
7578 if (frv_sort_insn_group_1 (group, first, num_slots,
7579 (1 << first) - 1, num_slots, state))
7580 return;
7583 gcc_unreachable ();
7586 /* Sort the current packet into assembly-language order. Set packing
7587 flags as appropriate. */
7589 static void
7590 frv_reorder_packet (void)
7592 unsigned int cursor[NUM_GROUPS];
7593 rtx insns[ARRAY_SIZE (frv_unit_groups)];
7594 unsigned int unit, to, from;
7595 enum frv_insn_group group;
7596 struct frv_packet_group *packet_group;
7598 /* First sort each group individually. */
7599 for (group = GROUP_I; group < NUM_GROUPS;
7600 group = (enum frv_insn_group) (group + 1))
7602 cursor[group] = 0;
7603 frv_sort_insn_group (group);
7606 /* Go through the unit template and try add an instruction from
7607 that unit's group. */
7608 to = 0;
7609 for (unit = 0; unit < ARRAY_SIZE (frv_unit_groups); unit++)
7611 group = frv_unit_groups[unit];
7612 packet_group = &frv_packet.groups[group];
7613 if (cursor[group] < packet_group->num_insns)
7615 /* frv_reorg should have added nops for us. */
7616 gcc_assert (packet_group->sorted[cursor[group]]
7617 != packet_group->nop);
7618 insns[to++] = packet_group->sorted[cursor[group]++];
7622 gcc_assert (to == frv_packet.num_insns);
7624 /* Clear the last instruction's packing flag, thus marking the end of
7625 a packet. Reorder the other instructions relative to it. */
7626 CLEAR_PACKING_FLAG (insns[to - 1]);
7627 for (from = 0; from < to - 1; from++)
7629 remove_insn (insns[from]);
7630 add_insn_before (insns[from], insns[to - 1], NULL);
7631 SET_PACKING_FLAG (insns[from]);
7636 /* Divide instructions into packets. Reorder the contents of each
7637 packet so that they are in the correct assembly-language order.
7639 Since this pass can change the raw meaning of the rtl stream, it must
7640 only be called at the last minute, just before the instructions are
7641 written out. */
7643 static void
7644 frv_pack_insns (void)
7646 if (frv_for_each_packet (frv_reorder_packet))
7647 frv_insn_packing_flag = 0;
7648 else
7649 frv_insn_packing_flag = -1;
7652 /* See whether we need to add nops to group GROUP in order to
7653 make a valid packet. */
7655 static void
7656 frv_fill_unused_units (enum frv_insn_group group)
7658 unsigned int non_nops, nops, i;
7659 struct frv_packet_group *packet_group;
7661 packet_group = &frv_packet.groups[group];
7663 /* Sort the instructions into assembly-language order.
7664 Use nops to fill slots that are otherwise unused. */
7665 frv_sort_insn_group (group);
7667 /* See how many nops are needed before the final useful instruction. */
7668 i = nops = 0;
7669 for (non_nops = 0; non_nops < packet_group->num_insns; non_nops++)
7670 while (packet_group->sorted[i++] == packet_group->nop)
7671 nops++;
7673 /* Insert that many nops into the instruction stream. */
7674 while (nops-- > 0)
7675 frv_insert_nop_in_packet (packet_group->nop);
7678 /* Return true if accesses IO1 and IO2 refer to the same doubleword. */
7680 static bool
7681 frv_same_doubleword_p (const struct frv_io *io1, const struct frv_io *io2)
7683 if (io1->const_address != 0 && io2->const_address != 0)
7684 return io1->const_address == io2->const_address;
7686 if (io1->var_address != 0 && io2->var_address != 0)
7687 return rtx_equal_p (io1->var_address, io2->var_address);
7689 return false;
7692 /* Return true if operations IO1 and IO2 are guaranteed to complete
7693 in order. */
7695 static bool
7696 frv_io_fixed_order_p (const struct frv_io *io1, const struct frv_io *io2)
7698 /* The order of writes is always preserved. */
7699 if (io1->type == FRV_IO_WRITE && io2->type == FRV_IO_WRITE)
7700 return true;
7702 /* The order of reads isn't preserved. */
7703 if (io1->type != FRV_IO_WRITE && io2->type != FRV_IO_WRITE)
7704 return false;
7706 /* One operation is a write and the other is (or could be) a read.
7707 The order is only guaranteed if the accesses are to the same
7708 doubleword. */
7709 return frv_same_doubleword_p (io1, io2);
7712 /* Generalize I/O operation X so that it covers both X and Y. */
7714 static void
7715 frv_io_union (struct frv_io *x, const struct frv_io *y)
7717 if (x->type != y->type)
7718 x->type = FRV_IO_UNKNOWN;
7719 if (!frv_same_doubleword_p (x, y))
7721 x->const_address = 0;
7722 x->var_address = 0;
7726 /* Fill IO with information about the load or store associated with
7727 membar instruction INSN. */
7729 static void
7730 frv_extract_membar (struct frv_io *io, rtx_insn *insn)
7732 extract_insn (insn);
7733 io->type = (enum frv_io_type) INTVAL (recog_data.operand[2]);
7734 io->const_address = INTVAL (recog_data.operand[1]);
7735 io->var_address = XEXP (recog_data.operand[0], 0);
7738 /* A note_stores callback for which DATA points to an rtx. Nullify *DATA
7739 if X is a register and *DATA depends on X. */
7741 static void
7742 frv_io_check_address (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
7744 rtx *other = (rtx *) data;
7746 if (REG_P (x) && *other != 0 && reg_overlap_mentioned_p (x, *other))
7747 *other = 0;
7750 /* A note_stores callback for which DATA points to a HARD_REG_SET.
7751 Remove every modified register from the set. */
7753 static void
7754 frv_io_handle_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
7756 HARD_REG_SET *set = (HARD_REG_SET *) data;
7757 unsigned int regno;
7759 if (REG_P (x))
7760 FOR_EACH_REGNO (regno, x)
7761 CLEAR_HARD_REG_BIT (*set, regno);
7764 /* A note_uses callback that adds all registers in *X to hard register
7765 set *DATA. */
7767 static void
7768 frv_io_handle_use (rtx *x, void *data)
7770 find_all_hard_regs (*x, (HARD_REG_SET *) data);
7773 /* Go through block BB looking for membars to remove. There are two
7774 cases where intra-block analysis is enough:
7776 - a membar is redundant if it occurs between two consecutive I/O
7777 operations and if those operations are guaranteed to complete
7778 in order.
7780 - a membar for a __builtin_read is redundant if the result is
7781 used before the next I/O operation is issued.
7783 If the last membar in the block could not be removed, and there
7784 are guaranteed to be no I/O operations between that membar and
7785 the end of the block, store the membar in *LAST_MEMBAR, otherwise
7786 store null.
7788 Describe the block's first I/O operation in *NEXT_IO. Describe
7789 an unknown operation if the block doesn't do any I/O. */
7791 static void
7792 frv_optimize_membar_local (basic_block bb, struct frv_io *next_io,
7793 rtx_insn **last_membar)
7795 HARD_REG_SET used_regs;
7796 rtx next_membar, set;
7797 rtx_insn *insn;
7798 bool next_is_end_p;
7800 /* NEXT_IO is the next I/O operation to be performed after the current
7801 instruction. It starts off as being an unknown operation. */
7802 memset (next_io, 0, sizeof (*next_io));
7804 /* NEXT_IS_END_P is true if NEXT_IO describes the end of the block. */
7805 next_is_end_p = true;
7807 /* If the current instruction is a __builtin_read or __builtin_write,
7808 NEXT_MEMBAR is the membar instruction associated with it. NEXT_MEMBAR
7809 is null if the membar has already been deleted.
7811 Note that the initialization here should only be needed to
7812 suppress warnings. */
7813 next_membar = 0;
7815 /* USED_REGS is the set of registers that are used before the
7816 next I/O instruction. */
7817 CLEAR_HARD_REG_SET (used_regs);
7819 for (insn = BB_END (bb); insn != BB_HEAD (bb); insn = PREV_INSN (insn))
7820 if (CALL_P (insn))
7822 /* We can't predict what a call will do to volatile memory. */
7823 memset (next_io, 0, sizeof (struct frv_io));
7824 next_is_end_p = false;
7825 CLEAR_HARD_REG_SET (used_regs);
7827 else if (INSN_P (insn))
7828 switch (recog_memoized (insn))
7830 case CODE_FOR_optional_membar_qi:
7831 case CODE_FOR_optional_membar_hi:
7832 case CODE_FOR_optional_membar_si:
7833 case CODE_FOR_optional_membar_di:
7834 next_membar = insn;
7835 if (next_is_end_p)
7837 /* Local information isn't enough to decide whether this
7838 membar is needed. Stash it away for later. */
7839 *last_membar = insn;
7840 frv_extract_membar (next_io, insn);
7841 next_is_end_p = false;
7843 else
7845 /* Check whether the I/O operation before INSN could be
7846 reordered with one described by NEXT_IO. If it can't,
7847 INSN will not be needed. */
7848 struct frv_io prev_io;
7850 frv_extract_membar (&prev_io, insn);
7851 if (frv_io_fixed_order_p (&prev_io, next_io))
7853 if (dump_file)
7854 fprintf (dump_file,
7855 ";; [Local] Removing membar %d since order"
7856 " of accesses is guaranteed\n",
7857 INSN_UID (next_membar));
7859 insn = NEXT_INSN (insn);
7860 delete_insn (next_membar);
7861 next_membar = 0;
7863 *next_io = prev_io;
7865 break;
7867 default:
7868 /* Invalidate NEXT_IO's address if it depends on something that
7869 is clobbered by INSN. */
7870 if (next_io->var_address)
7871 note_stores (PATTERN (insn), frv_io_check_address,
7872 &next_io->var_address);
7874 /* If the next membar is associated with a __builtin_read,
7875 see if INSN reads from that address. If it does, and if
7876 the destination register is used before the next I/O access,
7877 there is no need for the membar. */
7878 set = PATTERN (insn);
7879 if (next_io->type == FRV_IO_READ
7880 && next_io->var_address != 0
7881 && next_membar != 0
7882 && GET_CODE (set) == SET
7883 && GET_CODE (SET_DEST (set)) == REG
7884 && TEST_HARD_REG_BIT (used_regs, REGNO (SET_DEST (set))))
7886 rtx src;
7888 src = SET_SRC (set);
7889 if (GET_CODE (src) == ZERO_EXTEND)
7890 src = XEXP (src, 0);
7892 if (GET_CODE (src) == MEM
7893 && rtx_equal_p (XEXP (src, 0), next_io->var_address))
7895 if (dump_file)
7896 fprintf (dump_file,
7897 ";; [Local] Removing membar %d since the target"
7898 " of %d is used before the I/O operation\n",
7899 INSN_UID (next_membar), INSN_UID (insn));
7901 if (next_membar == *last_membar)
7902 *last_membar = 0;
7904 delete_insn (next_membar);
7905 next_membar = 0;
7909 /* If INSN has volatile references, forget about any registers
7910 that are used after it. Otherwise forget about uses that
7911 are (or might be) defined by INSN. */
7912 if (volatile_refs_p (PATTERN (insn)))
7913 CLEAR_HARD_REG_SET (used_regs);
7914 else
7915 note_stores (PATTERN (insn), frv_io_handle_set, &used_regs);
7917 note_uses (&PATTERN (insn), frv_io_handle_use, &used_regs);
7918 break;
7922 /* See if MEMBAR, the last membar instruction in BB, can be removed.
7923 FIRST_IO[X] describes the first operation performed by basic block X. */
7925 static void
7926 frv_optimize_membar_global (basic_block bb, struct frv_io *first_io,
7927 rtx_insn *membar)
7929 struct frv_io this_io, next_io;
7930 edge succ;
7931 edge_iterator ei;
7933 /* We need to keep the membar if there is an edge to the exit block. */
7934 FOR_EACH_EDGE (succ, ei, bb->succs)
7935 /* for (succ = bb->succ; succ != 0; succ = succ->succ_next) */
7936 if (succ->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
7937 return;
7939 /* Work out the union of all successor blocks. */
7940 ei = ei_start (bb->succs);
7941 ei_cond (ei, &succ);
7942 /* next_io = first_io[bb->succ->dest->index]; */
7943 next_io = first_io[succ->dest->index];
7944 ei = ei_start (bb->succs);
7945 if (ei_cond (ei, &succ))
7947 for (ei_next (&ei); ei_cond (ei, &succ); ei_next (&ei))
7948 /*for (succ = bb->succ->succ_next; succ != 0; succ = succ->succ_next)*/
7949 frv_io_union (&next_io, &first_io[succ->dest->index]);
7951 else
7952 gcc_unreachable ();
7954 frv_extract_membar (&this_io, membar);
7955 if (frv_io_fixed_order_p (&this_io, &next_io))
7957 if (dump_file)
7958 fprintf (dump_file,
7959 ";; [Global] Removing membar %d since order of accesses"
7960 " is guaranteed\n", INSN_UID (membar));
7962 delete_insn (membar);
7966 /* Remove redundant membars from the current function. */
7968 static void
7969 frv_optimize_membar (void)
7971 basic_block bb;
7972 struct frv_io *first_io;
7973 rtx_insn **last_membar;
7975 compute_bb_for_insn ();
7976 first_io = XCNEWVEC (struct frv_io, last_basic_block_for_fn (cfun));
7977 last_membar = XCNEWVEC (rtx_insn *, last_basic_block_for_fn (cfun));
7979 FOR_EACH_BB_FN (bb, cfun)
7980 frv_optimize_membar_local (bb, &first_io[bb->index],
7981 &last_membar[bb->index]);
7983 FOR_EACH_BB_FN (bb, cfun)
7984 if (last_membar[bb->index] != 0)
7985 frv_optimize_membar_global (bb, first_io, last_membar[bb->index]);
7987 free (first_io);
7988 free (last_membar);
7991 /* Used by frv_reorg to keep track of the current packet's address. */
7992 static unsigned int frv_packet_address;
7994 /* If the current packet falls through to a label, try to pad the packet
7995 with nops in order to fit the label's alignment requirements. */
7997 static void
7998 frv_align_label (void)
8000 unsigned int alignment, target, nop;
8001 rtx_insn *x, *last, *barrier, *label;
8003 /* Walk forward to the start of the next packet. Set ALIGNMENT to the
8004 maximum alignment of that packet, LABEL to the last label between
8005 the packets, and BARRIER to the last barrier. */
8006 last = frv_packet.insns[frv_packet.num_insns - 1];
8007 label = barrier = 0;
8008 alignment = 4;
8009 for (x = NEXT_INSN (last); x != 0 && !INSN_P (x); x = NEXT_INSN (x))
8011 if (LABEL_P (x))
8013 unsigned int subalign = 1 << label_to_alignment (x);
8014 alignment = MAX (alignment, subalign);
8015 label = x;
8017 if (BARRIER_P (x))
8018 barrier = x;
8021 /* If -malign-labels, and the packet falls through to an unaligned
8022 label, try introducing a nop to align that label to 8 bytes. */
8023 if (TARGET_ALIGN_LABELS
8024 && label != 0
8025 && barrier == 0
8026 && frv_packet.num_insns < frv_packet.issue_rate)
8027 alignment = MAX (alignment, 8);
8029 /* Advance the address to the end of the current packet. */
8030 frv_packet_address += frv_packet.num_insns * 4;
8032 /* Work out the target address, after alignment. */
8033 target = (frv_packet_address + alignment - 1) & -alignment;
8035 /* If the packet falls through to the label, try to find an efficient
8036 padding sequence. */
8037 if (barrier == 0)
8039 /* First try adding nops to the current packet. */
8040 for (nop = 0; nop < frv_num_nops; nop++)
8041 while (frv_packet_address < target && frv_pack_insn_p (frv_nops[nop]))
8043 frv_insert_nop_in_packet (frv_nops[nop]);
8044 frv_packet_address += 4;
8047 /* If we still haven't reached the target, add some new packets that
8048 contain only nops. If there are two types of nop, insert an
8049 alternating sequence of frv_nops[0] and frv_nops[1], which will
8050 lead to packets like:
8052 nop.p
8053 mnop.p/fnop.p
8054 nop.p
8055 mnop/fnop
8057 etc. Just emit frv_nops[0] if that's the only nop we have. */
8058 last = frv_packet.insns[frv_packet.num_insns - 1];
8059 nop = 0;
8060 while (frv_packet_address < target)
8062 last = emit_insn_after (PATTERN (frv_nops[nop]), last);
8063 frv_packet_address += 4;
8064 if (frv_num_nops > 1)
8065 nop ^= 1;
8069 frv_packet_address = target;
8072 /* Subroutine of frv_reorg, called after each packet has been constructed
8073 in frv_packet. */
8075 static void
8076 frv_reorg_packet (void)
8078 frv_fill_unused_units (GROUP_I);
8079 frv_fill_unused_units (GROUP_FM);
8080 frv_align_label ();
8083 /* Add an instruction with pattern NOP to frv_nops[]. */
8085 static void
8086 frv_register_nop (rtx nop)
8088 rtx_insn *nop_insn = make_insn_raw (nop);
8089 SET_NEXT_INSN (nop_insn) = 0;
8090 SET_PREV_INSN (nop_insn) = 0;
8091 frv_nops[frv_num_nops++] = nop_insn;
8094 /* Implement TARGET_MACHINE_DEPENDENT_REORG. Divide the instructions
8095 into packets and check whether we need to insert nops in order to
8096 fulfill the processor's issue requirements. Also, if the user has
8097 requested a certain alignment for a label, try to meet that alignment
8098 by inserting nops in the previous packet. */
8100 static void
8101 frv_reorg (void)
8103 if (optimize > 0 && TARGET_OPTIMIZE_MEMBAR && cfun->machine->has_membar_p)
8104 frv_optimize_membar ();
8106 frv_num_nops = 0;
8107 frv_register_nop (gen_nop ());
8108 if (TARGET_MEDIA)
8109 frv_register_nop (gen_mnop ());
8110 if (TARGET_HARD_FLOAT)
8111 frv_register_nop (gen_fnop ());
8113 /* Estimate the length of each branch. Although this may change after
8114 we've inserted nops, it will only do so in big functions. */
8115 shorten_branches (get_insns ());
8117 frv_packet_address = 0;
8118 frv_for_each_packet (frv_reorg_packet);
8121 #define def_builtin(name, type, code) \
8122 add_builtin_function ((name), (type), (code), BUILT_IN_MD, NULL, NULL)
8124 struct builtin_description
8126 enum insn_code icode;
8127 const char *name;
8128 enum frv_builtins code;
8129 enum rtx_code comparison;
8130 unsigned int flag;
8133 /* Media intrinsics that take a single, constant argument. */
8135 static struct builtin_description bdesc_set[] =
8137 { CODE_FOR_mhdsets, "__MHDSETS", FRV_BUILTIN_MHDSETS, UNKNOWN, 0 }
8140 /* Media intrinsics that take just one argument. */
8142 static struct builtin_description bdesc_1arg[] =
8144 { CODE_FOR_mnot, "__MNOT", FRV_BUILTIN_MNOT, UNKNOWN, 0 },
8145 { CODE_FOR_munpackh, "__MUNPACKH", FRV_BUILTIN_MUNPACKH, UNKNOWN, 0 },
8146 { CODE_FOR_mbtoh, "__MBTOH", FRV_BUILTIN_MBTOH, UNKNOWN, 0 },
8147 { CODE_FOR_mhtob, "__MHTOB", FRV_BUILTIN_MHTOB, UNKNOWN, 0},
8148 { CODE_FOR_mabshs, "__MABSHS", FRV_BUILTIN_MABSHS, UNKNOWN, 0 },
8149 { CODE_FOR_scutss, "__SCUTSS", FRV_BUILTIN_SCUTSS, UNKNOWN, 0 }
8152 /* Media intrinsics that take two arguments. */
8154 static struct builtin_description bdesc_2arg[] =
8156 { CODE_FOR_mand, "__MAND", FRV_BUILTIN_MAND, UNKNOWN, 0},
8157 { CODE_FOR_mor, "__MOR", FRV_BUILTIN_MOR, UNKNOWN, 0},
8158 { CODE_FOR_mxor, "__MXOR", FRV_BUILTIN_MXOR, UNKNOWN, 0},
8159 { CODE_FOR_maveh, "__MAVEH", FRV_BUILTIN_MAVEH, UNKNOWN, 0},
8160 { CODE_FOR_msaths, "__MSATHS", FRV_BUILTIN_MSATHS, UNKNOWN, 0},
8161 { CODE_FOR_msathu, "__MSATHU", FRV_BUILTIN_MSATHU, UNKNOWN, 0},
8162 { CODE_FOR_maddhss, "__MADDHSS", FRV_BUILTIN_MADDHSS, UNKNOWN, 0},
8163 { CODE_FOR_maddhus, "__MADDHUS", FRV_BUILTIN_MADDHUS, UNKNOWN, 0},
8164 { CODE_FOR_msubhss, "__MSUBHSS", FRV_BUILTIN_MSUBHSS, UNKNOWN, 0},
8165 { CODE_FOR_msubhus, "__MSUBHUS", FRV_BUILTIN_MSUBHUS, UNKNOWN, 0},
8166 { CODE_FOR_mqaddhss, "__MQADDHSS", FRV_BUILTIN_MQADDHSS, UNKNOWN, 0},
8167 { CODE_FOR_mqaddhus, "__MQADDHUS", FRV_BUILTIN_MQADDHUS, UNKNOWN, 0},
8168 { CODE_FOR_mqsubhss, "__MQSUBHSS", FRV_BUILTIN_MQSUBHSS, UNKNOWN, 0},
8169 { CODE_FOR_mqsubhus, "__MQSUBHUS", FRV_BUILTIN_MQSUBHUS, UNKNOWN, 0},
8170 { CODE_FOR_mpackh, "__MPACKH", FRV_BUILTIN_MPACKH, UNKNOWN, 0},
8171 { CODE_FOR_mcop1, "__Mcop1", FRV_BUILTIN_MCOP1, UNKNOWN, 0},
8172 { CODE_FOR_mcop2, "__Mcop2", FRV_BUILTIN_MCOP2, UNKNOWN, 0},
8173 { CODE_FOR_mwcut, "__MWCUT", FRV_BUILTIN_MWCUT, UNKNOWN, 0},
8174 { CODE_FOR_mqsaths, "__MQSATHS", FRV_BUILTIN_MQSATHS, UNKNOWN, 0},
8175 { CODE_FOR_mqlclrhs, "__MQLCLRHS", FRV_BUILTIN_MQLCLRHS, UNKNOWN, 0},
8176 { CODE_FOR_mqlmths, "__MQLMTHS", FRV_BUILTIN_MQLMTHS, UNKNOWN, 0},
8177 { CODE_FOR_smul, "__SMUL", FRV_BUILTIN_SMUL, UNKNOWN, 0},
8178 { CODE_FOR_umul, "__UMUL", FRV_BUILTIN_UMUL, UNKNOWN, 0},
8179 { CODE_FOR_addss, "__ADDSS", FRV_BUILTIN_ADDSS, UNKNOWN, 0},
8180 { CODE_FOR_subss, "__SUBSS", FRV_BUILTIN_SUBSS, UNKNOWN, 0},
8181 { CODE_FOR_slass, "__SLASS", FRV_BUILTIN_SLASS, UNKNOWN, 0},
8182 { CODE_FOR_scan, "__SCAN", FRV_BUILTIN_SCAN, UNKNOWN, 0}
8185 /* Integer intrinsics that take two arguments and have no return value. */
8187 static struct builtin_description bdesc_int_void2arg[] =
8189 { CODE_FOR_smass, "__SMASS", FRV_BUILTIN_SMASS, UNKNOWN, 0},
8190 { CODE_FOR_smsss, "__SMSSS", FRV_BUILTIN_SMSSS, UNKNOWN, 0},
8191 { CODE_FOR_smu, "__SMU", FRV_BUILTIN_SMU, UNKNOWN, 0}
8194 static struct builtin_description bdesc_prefetches[] =
8196 { CODE_FOR_frv_prefetch0, "__data_prefetch0", FRV_BUILTIN_PREFETCH0, UNKNOWN,
8198 { CODE_FOR_frv_prefetch, "__data_prefetch", FRV_BUILTIN_PREFETCH, UNKNOWN, 0}
8201 /* Media intrinsics that take two arguments, the first being an ACC number. */
8203 static struct builtin_description bdesc_cut[] =
8205 { CODE_FOR_mcut, "__MCUT", FRV_BUILTIN_MCUT, UNKNOWN, 0},
8206 { CODE_FOR_mcutss, "__MCUTSS", FRV_BUILTIN_MCUTSS, UNKNOWN, 0},
8207 { CODE_FOR_mdcutssi, "__MDCUTSSI", FRV_BUILTIN_MDCUTSSI, UNKNOWN, 0}
8210 /* Two-argument media intrinsics with an immediate second argument. */
8212 static struct builtin_description bdesc_2argimm[] =
8214 { CODE_FOR_mrotli, "__MROTLI", FRV_BUILTIN_MROTLI, UNKNOWN, 0},
8215 { CODE_FOR_mrotri, "__MROTRI", FRV_BUILTIN_MROTRI, UNKNOWN, 0},
8216 { CODE_FOR_msllhi, "__MSLLHI", FRV_BUILTIN_MSLLHI, UNKNOWN, 0},
8217 { CODE_FOR_msrlhi, "__MSRLHI", FRV_BUILTIN_MSRLHI, UNKNOWN, 0},
8218 { CODE_FOR_msrahi, "__MSRAHI", FRV_BUILTIN_MSRAHI, UNKNOWN, 0},
8219 { CODE_FOR_mexpdhw, "__MEXPDHW", FRV_BUILTIN_MEXPDHW, UNKNOWN, 0},
8220 { CODE_FOR_mexpdhd, "__MEXPDHD", FRV_BUILTIN_MEXPDHD, UNKNOWN, 0},
8221 { CODE_FOR_mdrotli, "__MDROTLI", FRV_BUILTIN_MDROTLI, UNKNOWN, 0},
8222 { CODE_FOR_mcplhi, "__MCPLHI", FRV_BUILTIN_MCPLHI, UNKNOWN, 0},
8223 { CODE_FOR_mcpli, "__MCPLI", FRV_BUILTIN_MCPLI, UNKNOWN, 0},
8224 { CODE_FOR_mhsetlos, "__MHSETLOS", FRV_BUILTIN_MHSETLOS, UNKNOWN, 0},
8225 { CODE_FOR_mhsetloh, "__MHSETLOH", FRV_BUILTIN_MHSETLOH, UNKNOWN, 0},
8226 { CODE_FOR_mhsethis, "__MHSETHIS", FRV_BUILTIN_MHSETHIS, UNKNOWN, 0},
8227 { CODE_FOR_mhsethih, "__MHSETHIH", FRV_BUILTIN_MHSETHIH, UNKNOWN, 0},
8228 { CODE_FOR_mhdseth, "__MHDSETH", FRV_BUILTIN_MHDSETH, UNKNOWN, 0},
8229 { CODE_FOR_mqsllhi, "__MQSLLHI", FRV_BUILTIN_MQSLLHI, UNKNOWN, 0},
8230 { CODE_FOR_mqsrahi, "__MQSRAHI", FRV_BUILTIN_MQSRAHI, UNKNOWN, 0}
8233 /* Media intrinsics that take two arguments and return void, the first argument
8234 being a pointer to 4 words in memory. */
8236 static struct builtin_description bdesc_void2arg[] =
8238 { CODE_FOR_mdunpackh, "__MDUNPACKH", FRV_BUILTIN_MDUNPACKH, UNKNOWN, 0},
8239 { CODE_FOR_mbtohe, "__MBTOHE", FRV_BUILTIN_MBTOHE, UNKNOWN, 0},
8242 /* Media intrinsics that take three arguments, the first being a const_int that
8243 denotes an accumulator, and that return void. */
8245 static struct builtin_description bdesc_void3arg[] =
8247 { CODE_FOR_mcpxrs, "__MCPXRS", FRV_BUILTIN_MCPXRS, UNKNOWN, 0},
8248 { CODE_FOR_mcpxru, "__MCPXRU", FRV_BUILTIN_MCPXRU, UNKNOWN, 0},
8249 { CODE_FOR_mcpxis, "__MCPXIS", FRV_BUILTIN_MCPXIS, UNKNOWN, 0},
8250 { CODE_FOR_mcpxiu, "__MCPXIU", FRV_BUILTIN_MCPXIU, UNKNOWN, 0},
8251 { CODE_FOR_mmulhs, "__MMULHS", FRV_BUILTIN_MMULHS, UNKNOWN, 0},
8252 { CODE_FOR_mmulhu, "__MMULHU", FRV_BUILTIN_MMULHU, UNKNOWN, 0},
8253 { CODE_FOR_mmulxhs, "__MMULXHS", FRV_BUILTIN_MMULXHS, UNKNOWN, 0},
8254 { CODE_FOR_mmulxhu, "__MMULXHU", FRV_BUILTIN_MMULXHU, UNKNOWN, 0},
8255 { CODE_FOR_mmachs, "__MMACHS", FRV_BUILTIN_MMACHS, UNKNOWN, 0},
8256 { CODE_FOR_mmachu, "__MMACHU", FRV_BUILTIN_MMACHU, UNKNOWN, 0},
8257 { CODE_FOR_mmrdhs, "__MMRDHS", FRV_BUILTIN_MMRDHS, UNKNOWN, 0},
8258 { CODE_FOR_mmrdhu, "__MMRDHU", FRV_BUILTIN_MMRDHU, UNKNOWN, 0},
8259 { CODE_FOR_mqcpxrs, "__MQCPXRS", FRV_BUILTIN_MQCPXRS, UNKNOWN, 0},
8260 { CODE_FOR_mqcpxru, "__MQCPXRU", FRV_BUILTIN_MQCPXRU, UNKNOWN, 0},
8261 { CODE_FOR_mqcpxis, "__MQCPXIS", FRV_BUILTIN_MQCPXIS, UNKNOWN, 0},
8262 { CODE_FOR_mqcpxiu, "__MQCPXIU", FRV_BUILTIN_MQCPXIU, UNKNOWN, 0},
8263 { CODE_FOR_mqmulhs, "__MQMULHS", FRV_BUILTIN_MQMULHS, UNKNOWN, 0},
8264 { CODE_FOR_mqmulhu, "__MQMULHU", FRV_BUILTIN_MQMULHU, UNKNOWN, 0},
8265 { CODE_FOR_mqmulxhs, "__MQMULXHS", FRV_BUILTIN_MQMULXHS, UNKNOWN, 0},
8266 { CODE_FOR_mqmulxhu, "__MQMULXHU", FRV_BUILTIN_MQMULXHU, UNKNOWN, 0},
8267 { CODE_FOR_mqmachs, "__MQMACHS", FRV_BUILTIN_MQMACHS, UNKNOWN, 0},
8268 { CODE_FOR_mqmachu, "__MQMACHU", FRV_BUILTIN_MQMACHU, UNKNOWN, 0},
8269 { CODE_FOR_mqxmachs, "__MQXMACHS", FRV_BUILTIN_MQXMACHS, UNKNOWN, 0},
8270 { CODE_FOR_mqxmacxhs, "__MQXMACXHS", FRV_BUILTIN_MQXMACXHS, UNKNOWN, 0},
8271 { CODE_FOR_mqmacxhs, "__MQMACXHS", FRV_BUILTIN_MQMACXHS, UNKNOWN, 0}
8274 /* Media intrinsics that take two accumulator numbers as argument and
8275 return void. */
8277 static struct builtin_description bdesc_voidacc[] =
8279 { CODE_FOR_maddaccs, "__MADDACCS", FRV_BUILTIN_MADDACCS, UNKNOWN, 0},
8280 { CODE_FOR_msubaccs, "__MSUBACCS", FRV_BUILTIN_MSUBACCS, UNKNOWN, 0},
8281 { CODE_FOR_masaccs, "__MASACCS", FRV_BUILTIN_MASACCS, UNKNOWN, 0},
8282 { CODE_FOR_mdaddaccs, "__MDADDACCS", FRV_BUILTIN_MDADDACCS, UNKNOWN, 0},
8283 { CODE_FOR_mdsubaccs, "__MDSUBACCS", FRV_BUILTIN_MDSUBACCS, UNKNOWN, 0},
8284 { CODE_FOR_mdasaccs, "__MDASACCS", FRV_BUILTIN_MDASACCS, UNKNOWN, 0}
8287 /* Intrinsics that load a value and then issue a MEMBAR. The load is
8288 a normal move and the ICODE is for the membar. */
8290 static struct builtin_description bdesc_loads[] =
8292 { CODE_FOR_optional_membar_qi, "__builtin_read8",
8293 FRV_BUILTIN_READ8, UNKNOWN, 0},
8294 { CODE_FOR_optional_membar_hi, "__builtin_read16",
8295 FRV_BUILTIN_READ16, UNKNOWN, 0},
8296 { CODE_FOR_optional_membar_si, "__builtin_read32",
8297 FRV_BUILTIN_READ32, UNKNOWN, 0},
8298 { CODE_FOR_optional_membar_di, "__builtin_read64",
8299 FRV_BUILTIN_READ64, UNKNOWN, 0}
8302 /* Likewise stores. */
8304 static struct builtin_description bdesc_stores[] =
8306 { CODE_FOR_optional_membar_qi, "__builtin_write8",
8307 FRV_BUILTIN_WRITE8, UNKNOWN, 0},
8308 { CODE_FOR_optional_membar_hi, "__builtin_write16",
8309 FRV_BUILTIN_WRITE16, UNKNOWN, 0},
8310 { CODE_FOR_optional_membar_si, "__builtin_write32",
8311 FRV_BUILTIN_WRITE32, UNKNOWN, 0},
8312 { CODE_FOR_optional_membar_di, "__builtin_write64",
8313 FRV_BUILTIN_WRITE64, UNKNOWN, 0},
8316 /* Initialize media builtins. */
8318 static void
8319 frv_init_builtins (void)
8321 tree accumulator = integer_type_node;
8322 tree integer = integer_type_node;
8323 tree voidt = void_type_node;
8324 tree uhalf = short_unsigned_type_node;
8325 tree sword1 = long_integer_type_node;
8326 tree uword1 = long_unsigned_type_node;
8327 tree sword2 = long_long_integer_type_node;
8328 tree uword2 = long_long_unsigned_type_node;
8329 tree uword4 = build_pointer_type (uword1);
8330 tree vptr = build_pointer_type (build_type_variant (void_type_node, 0, 1));
8331 tree ubyte = unsigned_char_type_node;
8332 tree iacc = integer_type_node;
8334 #define UNARY(RET, T1) \
8335 build_function_type_list (RET, T1, NULL_TREE)
8337 #define BINARY(RET, T1, T2) \
8338 build_function_type_list (RET, T1, T2, NULL_TREE)
8340 #define TRINARY(RET, T1, T2, T3) \
8341 build_function_type_list (RET, T1, T2, T3, NULL_TREE)
8343 #define QUAD(RET, T1, T2, T3, T4) \
8344 build_function_type_list (RET, T1, T2, T3, T4, NULL_TREE)
8346 tree void_ftype_void = build_function_type_list (voidt, NULL_TREE);
8348 tree void_ftype_acc = UNARY (voidt, accumulator);
8349 tree void_ftype_uw4_uw1 = BINARY (voidt, uword4, uword1);
8350 tree void_ftype_uw4_uw2 = BINARY (voidt, uword4, uword2);
8351 tree void_ftype_acc_uw1 = BINARY (voidt, accumulator, uword1);
8352 tree void_ftype_acc_acc = BINARY (voidt, accumulator, accumulator);
8353 tree void_ftype_acc_uw1_uw1 = TRINARY (voidt, accumulator, uword1, uword1);
8354 tree void_ftype_acc_sw1_sw1 = TRINARY (voidt, accumulator, sword1, sword1);
8355 tree void_ftype_acc_uw2_uw2 = TRINARY (voidt, accumulator, uword2, uword2);
8356 tree void_ftype_acc_sw2_sw2 = TRINARY (voidt, accumulator, sword2, sword2);
8358 tree uw1_ftype_uw1 = UNARY (uword1, uword1);
8359 tree uw1_ftype_sw1 = UNARY (uword1, sword1);
8360 tree uw1_ftype_uw2 = UNARY (uword1, uword2);
8361 tree uw1_ftype_acc = UNARY (uword1, accumulator);
8362 tree uw1_ftype_uh_uh = BINARY (uword1, uhalf, uhalf);
8363 tree uw1_ftype_uw1_uw1 = BINARY (uword1, uword1, uword1);
8364 tree uw1_ftype_uw1_int = BINARY (uword1, uword1, integer);
8365 tree uw1_ftype_acc_uw1 = BINARY (uword1, accumulator, uword1);
8366 tree uw1_ftype_acc_sw1 = BINARY (uword1, accumulator, sword1);
8367 tree uw1_ftype_uw2_uw1 = BINARY (uword1, uword2, uword1);
8368 tree uw1_ftype_uw2_int = BINARY (uword1, uword2, integer);
8370 tree sw1_ftype_int = UNARY (sword1, integer);
8371 tree sw1_ftype_sw1_sw1 = BINARY (sword1, sword1, sword1);
8372 tree sw1_ftype_sw1_int = BINARY (sword1, sword1, integer);
8374 tree uw2_ftype_uw1 = UNARY (uword2, uword1);
8375 tree uw2_ftype_uw1_int = BINARY (uword2, uword1, integer);
8376 tree uw2_ftype_uw2_uw2 = BINARY (uword2, uword2, uword2);
8377 tree uw2_ftype_uw2_int = BINARY (uword2, uword2, integer);
8378 tree uw2_ftype_acc_int = BINARY (uword2, accumulator, integer);
8379 tree uw2_ftype_uh_uh_uh_uh = QUAD (uword2, uhalf, uhalf, uhalf, uhalf);
8381 tree sw2_ftype_sw2_sw2 = BINARY (sword2, sword2, sword2);
8382 tree sw2_ftype_sw2_int = BINARY (sword2, sword2, integer);
8383 tree uw2_ftype_uw1_uw1 = BINARY (uword2, uword1, uword1);
8384 tree sw2_ftype_sw1_sw1 = BINARY (sword2, sword1, sword1);
8385 tree void_ftype_sw1_sw1 = BINARY (voidt, sword1, sword1);
8386 tree void_ftype_iacc_sw2 = BINARY (voidt, iacc, sword2);
8387 tree void_ftype_iacc_sw1 = BINARY (voidt, iacc, sword1);
8388 tree sw1_ftype_sw1 = UNARY (sword1, sword1);
8389 tree sw2_ftype_iacc = UNARY (sword2, iacc);
8390 tree sw1_ftype_iacc = UNARY (sword1, iacc);
8391 tree void_ftype_ptr = UNARY (voidt, const_ptr_type_node);
8392 tree uw1_ftype_vptr = UNARY (uword1, vptr);
8393 tree uw2_ftype_vptr = UNARY (uword2, vptr);
8394 tree void_ftype_vptr_ub = BINARY (voidt, vptr, ubyte);
8395 tree void_ftype_vptr_uh = BINARY (voidt, vptr, uhalf);
8396 tree void_ftype_vptr_uw1 = BINARY (voidt, vptr, uword1);
8397 tree void_ftype_vptr_uw2 = BINARY (voidt, vptr, uword2);
8399 def_builtin ("__MAND", uw1_ftype_uw1_uw1, FRV_BUILTIN_MAND);
8400 def_builtin ("__MOR", uw1_ftype_uw1_uw1, FRV_BUILTIN_MOR);
8401 def_builtin ("__MXOR", uw1_ftype_uw1_uw1, FRV_BUILTIN_MXOR);
8402 def_builtin ("__MNOT", uw1_ftype_uw1, FRV_BUILTIN_MNOT);
8403 def_builtin ("__MROTLI", uw1_ftype_uw1_int, FRV_BUILTIN_MROTLI);
8404 def_builtin ("__MROTRI", uw1_ftype_uw1_int, FRV_BUILTIN_MROTRI);
8405 def_builtin ("__MWCUT", uw1_ftype_uw2_uw1, FRV_BUILTIN_MWCUT);
8406 def_builtin ("__MAVEH", uw1_ftype_uw1_uw1, FRV_BUILTIN_MAVEH);
8407 def_builtin ("__MSLLHI", uw1_ftype_uw1_int, FRV_BUILTIN_MSLLHI);
8408 def_builtin ("__MSRLHI", uw1_ftype_uw1_int, FRV_BUILTIN_MSRLHI);
8409 def_builtin ("__MSRAHI", sw1_ftype_sw1_int, FRV_BUILTIN_MSRAHI);
8410 def_builtin ("__MSATHS", sw1_ftype_sw1_sw1, FRV_BUILTIN_MSATHS);
8411 def_builtin ("__MSATHU", uw1_ftype_uw1_uw1, FRV_BUILTIN_MSATHU);
8412 def_builtin ("__MADDHSS", sw1_ftype_sw1_sw1, FRV_BUILTIN_MADDHSS);
8413 def_builtin ("__MADDHUS", uw1_ftype_uw1_uw1, FRV_BUILTIN_MADDHUS);
8414 def_builtin ("__MSUBHSS", sw1_ftype_sw1_sw1, FRV_BUILTIN_MSUBHSS);
8415 def_builtin ("__MSUBHUS", uw1_ftype_uw1_uw1, FRV_BUILTIN_MSUBHUS);
8416 def_builtin ("__MMULHS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MMULHS);
8417 def_builtin ("__MMULHU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MMULHU);
8418 def_builtin ("__MMULXHS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MMULXHS);
8419 def_builtin ("__MMULXHU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MMULXHU);
8420 def_builtin ("__MMACHS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MMACHS);
8421 def_builtin ("__MMACHU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MMACHU);
8422 def_builtin ("__MMRDHS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MMRDHS);
8423 def_builtin ("__MMRDHU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MMRDHU);
8424 def_builtin ("__MQADDHSS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQADDHSS);
8425 def_builtin ("__MQADDHUS", uw2_ftype_uw2_uw2, FRV_BUILTIN_MQADDHUS);
8426 def_builtin ("__MQSUBHSS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQSUBHSS);
8427 def_builtin ("__MQSUBHUS", uw2_ftype_uw2_uw2, FRV_BUILTIN_MQSUBHUS);
8428 def_builtin ("__MQMULHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQMULHS);
8429 def_builtin ("__MQMULHU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQMULHU);
8430 def_builtin ("__MQMULXHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQMULXHS);
8431 def_builtin ("__MQMULXHU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQMULXHU);
8432 def_builtin ("__MQMACHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQMACHS);
8433 def_builtin ("__MQMACHU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQMACHU);
8434 def_builtin ("__MCPXRS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MCPXRS);
8435 def_builtin ("__MCPXRU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MCPXRU);
8436 def_builtin ("__MCPXIS", void_ftype_acc_sw1_sw1, FRV_BUILTIN_MCPXIS);
8437 def_builtin ("__MCPXIU", void_ftype_acc_uw1_uw1, FRV_BUILTIN_MCPXIU);
8438 def_builtin ("__MQCPXRS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQCPXRS);
8439 def_builtin ("__MQCPXRU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQCPXRU);
8440 def_builtin ("__MQCPXIS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQCPXIS);
8441 def_builtin ("__MQCPXIU", void_ftype_acc_uw2_uw2, FRV_BUILTIN_MQCPXIU);
8442 def_builtin ("__MCUT", uw1_ftype_acc_uw1, FRV_BUILTIN_MCUT);
8443 def_builtin ("__MCUTSS", uw1_ftype_acc_sw1, FRV_BUILTIN_MCUTSS);
8444 def_builtin ("__MEXPDHW", uw1_ftype_uw1_int, FRV_BUILTIN_MEXPDHW);
8445 def_builtin ("__MEXPDHD", uw2_ftype_uw1_int, FRV_BUILTIN_MEXPDHD);
8446 def_builtin ("__MPACKH", uw1_ftype_uh_uh, FRV_BUILTIN_MPACKH);
8447 def_builtin ("__MUNPACKH", uw2_ftype_uw1, FRV_BUILTIN_MUNPACKH);
8448 def_builtin ("__MDPACKH", uw2_ftype_uh_uh_uh_uh, FRV_BUILTIN_MDPACKH);
8449 def_builtin ("__MDUNPACKH", void_ftype_uw4_uw2, FRV_BUILTIN_MDUNPACKH);
8450 def_builtin ("__MBTOH", uw2_ftype_uw1, FRV_BUILTIN_MBTOH);
8451 def_builtin ("__MHTOB", uw1_ftype_uw2, FRV_BUILTIN_MHTOB);
8452 def_builtin ("__MBTOHE", void_ftype_uw4_uw1, FRV_BUILTIN_MBTOHE);
8453 def_builtin ("__MCLRACC", void_ftype_acc, FRV_BUILTIN_MCLRACC);
8454 def_builtin ("__MCLRACCA", void_ftype_void, FRV_BUILTIN_MCLRACCA);
8455 def_builtin ("__MRDACC", uw1_ftype_acc, FRV_BUILTIN_MRDACC);
8456 def_builtin ("__MRDACCG", uw1_ftype_acc, FRV_BUILTIN_MRDACCG);
8457 def_builtin ("__MWTACC", void_ftype_acc_uw1, FRV_BUILTIN_MWTACC);
8458 def_builtin ("__MWTACCG", void_ftype_acc_uw1, FRV_BUILTIN_MWTACCG);
8459 def_builtin ("__Mcop1", uw1_ftype_uw1_uw1, FRV_BUILTIN_MCOP1);
8460 def_builtin ("__Mcop2", uw1_ftype_uw1_uw1, FRV_BUILTIN_MCOP2);
8461 def_builtin ("__MTRAP", void_ftype_void, FRV_BUILTIN_MTRAP);
8462 def_builtin ("__MQXMACHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQXMACHS);
8463 def_builtin ("__MQXMACXHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQXMACXHS);
8464 def_builtin ("__MQMACXHS", void_ftype_acc_sw2_sw2, FRV_BUILTIN_MQMACXHS);
8465 def_builtin ("__MADDACCS", void_ftype_acc_acc, FRV_BUILTIN_MADDACCS);
8466 def_builtin ("__MSUBACCS", void_ftype_acc_acc, FRV_BUILTIN_MSUBACCS);
8467 def_builtin ("__MASACCS", void_ftype_acc_acc, FRV_BUILTIN_MASACCS);
8468 def_builtin ("__MDADDACCS", void_ftype_acc_acc, FRV_BUILTIN_MDADDACCS);
8469 def_builtin ("__MDSUBACCS", void_ftype_acc_acc, FRV_BUILTIN_MDSUBACCS);
8470 def_builtin ("__MDASACCS", void_ftype_acc_acc, FRV_BUILTIN_MDASACCS);
8471 def_builtin ("__MABSHS", uw1_ftype_sw1, FRV_BUILTIN_MABSHS);
8472 def_builtin ("__MDROTLI", uw2_ftype_uw2_int, FRV_BUILTIN_MDROTLI);
8473 def_builtin ("__MCPLHI", uw1_ftype_uw2_int, FRV_BUILTIN_MCPLHI);
8474 def_builtin ("__MCPLI", uw1_ftype_uw2_int, FRV_BUILTIN_MCPLI);
8475 def_builtin ("__MDCUTSSI", uw2_ftype_acc_int, FRV_BUILTIN_MDCUTSSI);
8476 def_builtin ("__MQSATHS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQSATHS);
8477 def_builtin ("__MHSETLOS", sw1_ftype_sw1_int, FRV_BUILTIN_MHSETLOS);
8478 def_builtin ("__MHSETHIS", sw1_ftype_sw1_int, FRV_BUILTIN_MHSETHIS);
8479 def_builtin ("__MHDSETS", sw1_ftype_int, FRV_BUILTIN_MHDSETS);
8480 def_builtin ("__MHSETLOH", uw1_ftype_uw1_int, FRV_BUILTIN_MHSETLOH);
8481 def_builtin ("__MHSETHIH", uw1_ftype_uw1_int, FRV_BUILTIN_MHSETHIH);
8482 def_builtin ("__MHDSETH", uw1_ftype_uw1_int, FRV_BUILTIN_MHDSETH);
8483 def_builtin ("__MQLCLRHS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQLCLRHS);
8484 def_builtin ("__MQLMTHS", sw2_ftype_sw2_sw2, FRV_BUILTIN_MQLMTHS);
8485 def_builtin ("__MQSLLHI", uw2_ftype_uw2_int, FRV_BUILTIN_MQSLLHI);
8486 def_builtin ("__MQSRAHI", sw2_ftype_sw2_int, FRV_BUILTIN_MQSRAHI);
8487 def_builtin ("__SMUL", sw2_ftype_sw1_sw1, FRV_BUILTIN_SMUL);
8488 def_builtin ("__UMUL", uw2_ftype_uw1_uw1, FRV_BUILTIN_UMUL);
8489 def_builtin ("__SMASS", void_ftype_sw1_sw1, FRV_BUILTIN_SMASS);
8490 def_builtin ("__SMSSS", void_ftype_sw1_sw1, FRV_BUILTIN_SMSSS);
8491 def_builtin ("__SMU", void_ftype_sw1_sw1, FRV_BUILTIN_SMU);
8492 def_builtin ("__ADDSS", sw1_ftype_sw1_sw1, FRV_BUILTIN_ADDSS);
8493 def_builtin ("__SUBSS", sw1_ftype_sw1_sw1, FRV_BUILTIN_SUBSS);
8494 def_builtin ("__SLASS", sw1_ftype_sw1_sw1, FRV_BUILTIN_SLASS);
8495 def_builtin ("__SCAN", sw1_ftype_sw1_sw1, FRV_BUILTIN_SCAN);
8496 def_builtin ("__SCUTSS", sw1_ftype_sw1, FRV_BUILTIN_SCUTSS);
8497 def_builtin ("__IACCreadll", sw2_ftype_iacc, FRV_BUILTIN_IACCreadll);
8498 def_builtin ("__IACCreadl", sw1_ftype_iacc, FRV_BUILTIN_IACCreadl);
8499 def_builtin ("__IACCsetll", void_ftype_iacc_sw2, FRV_BUILTIN_IACCsetll);
8500 def_builtin ("__IACCsetl", void_ftype_iacc_sw1, FRV_BUILTIN_IACCsetl);
8501 def_builtin ("__data_prefetch0", void_ftype_ptr, FRV_BUILTIN_PREFETCH0);
8502 def_builtin ("__data_prefetch", void_ftype_ptr, FRV_BUILTIN_PREFETCH);
8503 def_builtin ("__builtin_read8", uw1_ftype_vptr, FRV_BUILTIN_READ8);
8504 def_builtin ("__builtin_read16", uw1_ftype_vptr, FRV_BUILTIN_READ16);
8505 def_builtin ("__builtin_read32", uw1_ftype_vptr, FRV_BUILTIN_READ32);
8506 def_builtin ("__builtin_read64", uw2_ftype_vptr, FRV_BUILTIN_READ64);
8508 def_builtin ("__builtin_write8", void_ftype_vptr_ub, FRV_BUILTIN_WRITE8);
8509 def_builtin ("__builtin_write16", void_ftype_vptr_uh, FRV_BUILTIN_WRITE16);
8510 def_builtin ("__builtin_write32", void_ftype_vptr_uw1, FRV_BUILTIN_WRITE32);
8511 def_builtin ("__builtin_write64", void_ftype_vptr_uw2, FRV_BUILTIN_WRITE64);
8513 #undef UNARY
8514 #undef BINARY
8515 #undef TRINARY
8516 #undef QUAD
8519 /* Set the names for various arithmetic operations according to the
8520 FRV ABI. */
8521 static void
8522 frv_init_libfuncs (void)
8524 set_optab_libfunc (smod_optab, SImode, "__modi");
8525 set_optab_libfunc (umod_optab, SImode, "__umodi");
8527 set_optab_libfunc (add_optab, DImode, "__addll");
8528 set_optab_libfunc (sub_optab, DImode, "__subll");
8529 set_optab_libfunc (smul_optab, DImode, "__mulll");
8530 set_optab_libfunc (sdiv_optab, DImode, "__divll");
8531 set_optab_libfunc (smod_optab, DImode, "__modll");
8532 set_optab_libfunc (umod_optab, DImode, "__umodll");
8533 set_optab_libfunc (and_optab, DImode, "__andll");
8534 set_optab_libfunc (ior_optab, DImode, "__orll");
8535 set_optab_libfunc (xor_optab, DImode, "__xorll");
8536 set_optab_libfunc (one_cmpl_optab, DImode, "__notll");
8538 set_optab_libfunc (add_optab, SFmode, "__addf");
8539 set_optab_libfunc (sub_optab, SFmode, "__subf");
8540 set_optab_libfunc (smul_optab, SFmode, "__mulf");
8541 set_optab_libfunc (sdiv_optab, SFmode, "__divf");
8543 set_optab_libfunc (add_optab, DFmode, "__addd");
8544 set_optab_libfunc (sub_optab, DFmode, "__subd");
8545 set_optab_libfunc (smul_optab, DFmode, "__muld");
8546 set_optab_libfunc (sdiv_optab, DFmode, "__divd");
8548 set_conv_libfunc (sext_optab, DFmode, SFmode, "__ftod");
8549 set_conv_libfunc (trunc_optab, SFmode, DFmode, "__dtof");
8551 set_conv_libfunc (sfix_optab, SImode, SFmode, "__ftoi");
8552 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftoll");
8553 set_conv_libfunc (sfix_optab, SImode, DFmode, "__dtoi");
8554 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtoll");
8556 set_conv_libfunc (ufix_optab, SImode, SFmode, "__ftoui");
8557 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoull");
8558 set_conv_libfunc (ufix_optab, SImode, DFmode, "__dtoui");
8559 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoull");
8561 set_conv_libfunc (sfloat_optab, SFmode, SImode, "__itof");
8562 set_conv_libfunc (sfloat_optab, SFmode, DImode, "__lltof");
8563 set_conv_libfunc (sfloat_optab, DFmode, SImode, "__itod");
8564 set_conv_libfunc (sfloat_optab, DFmode, DImode, "__lltod");
8567 /* Convert an integer constant to an accumulator register. ICODE is the
8568 code of the target instruction, OPNUM is the number of the
8569 accumulator operand and OPVAL is the constant integer. Try both
8570 ACC and ACCG registers; only report an error if neither fit the
8571 instruction. */
8573 static rtx
8574 frv_int_to_acc (enum insn_code icode, int opnum, rtx opval)
8576 rtx reg;
8577 int i;
8579 /* ACCs and ACCGs are implicit global registers if media intrinsics
8580 are being used. We set up this lazily to avoid creating lots of
8581 unnecessary call_insn rtl in non-media code. */
8582 for (i = 0; i <= ACC_MASK; i++)
8583 if ((i & ACC_MASK) == i)
8584 global_regs[i + ACC_FIRST] = global_regs[i + ACCG_FIRST] = 1;
8586 if (GET_CODE (opval) != CONST_INT)
8588 error ("accumulator is not a constant integer");
8589 return NULL_RTX;
8591 if ((INTVAL (opval) & ~ACC_MASK) != 0)
8593 error ("accumulator number is out of bounds");
8594 return NULL_RTX;
8597 reg = gen_rtx_REG (insn_data[icode].operand[opnum].mode,
8598 ACC_FIRST + INTVAL (opval));
8599 if (! (*insn_data[icode].operand[opnum].predicate) (reg, VOIDmode))
8600 SET_REGNO (reg, ACCG_FIRST + INTVAL (opval));
8602 if (! (*insn_data[icode].operand[opnum].predicate) (reg, VOIDmode))
8604 error ("inappropriate accumulator for %qs", insn_data[icode].name);
8605 return NULL_RTX;
8607 return reg;
8610 /* If an ACC rtx has mode MODE, return the mode that the matching ACCG
8611 should have. */
8613 static machine_mode
8614 frv_matching_accg_mode (machine_mode mode)
8616 switch (mode)
8618 case V4SImode:
8619 return V4QImode;
8621 case DImode:
8622 return HImode;
8624 case SImode:
8625 return QImode;
8627 default:
8628 gcc_unreachable ();
8632 /* Given that a __builtin_read or __builtin_write function is accessing
8633 address ADDRESS, return the value that should be used as operand 1
8634 of the membar. */
8636 static rtx
8637 frv_io_address_cookie (rtx address)
8639 return (GET_CODE (address) == CONST_INT
8640 ? GEN_INT (INTVAL (address) / 8 * 8)
8641 : const0_rtx);
8644 /* Return the accumulator guard that should be paired with accumulator
8645 register ACC. The mode of the returned register is in the same
8646 class as ACC, but is four times smaller. */
8649 frv_matching_accg_for_acc (rtx acc)
8651 return gen_rtx_REG (frv_matching_accg_mode (GET_MODE (acc)),
8652 REGNO (acc) - ACC_FIRST + ACCG_FIRST);
8655 /* Read the requested argument from the call EXP given by INDEX.
8656 Return the value as an rtx. */
8658 static rtx
8659 frv_read_argument (tree exp, unsigned int index)
8661 return expand_normal (CALL_EXPR_ARG (exp, index));
8664 /* Like frv_read_argument, but interpret the argument as the number
8665 of an IACC register and return a (reg:MODE ...) rtx for it. */
8667 static rtx
8668 frv_read_iacc_argument (machine_mode mode, tree call,
8669 unsigned int index)
8671 int i, regno;
8672 rtx op;
8674 op = frv_read_argument (call, index);
8675 if (GET_CODE (op) != CONST_INT
8676 || INTVAL (op) < 0
8677 || INTVAL (op) > IACC_LAST - IACC_FIRST
8678 || ((INTVAL (op) * 4) & (GET_MODE_SIZE (mode) - 1)) != 0)
8680 error ("invalid IACC argument");
8681 op = const0_rtx;
8684 /* IACCs are implicit global registers. We set up this lazily to
8685 avoid creating lots of unnecessary call_insn rtl when IACCs aren't
8686 being used. */
8687 regno = INTVAL (op) + IACC_FIRST;
8688 for (i = 0; i < HARD_REGNO_NREGS (regno, mode); i++)
8689 global_regs[regno + i] = 1;
8691 return gen_rtx_REG (mode, regno);
8694 /* Return true if OPVAL can be used for operand OPNUM of instruction ICODE.
8695 The instruction should require a constant operand of some sort. The
8696 function prints an error if OPVAL is not valid. */
8698 static int
8699 frv_check_constant_argument (enum insn_code icode, int opnum, rtx opval)
8701 if (GET_CODE (opval) != CONST_INT)
8703 error ("%qs expects a constant argument", insn_data[icode].name);
8704 return FALSE;
8706 if (! (*insn_data[icode].operand[opnum].predicate) (opval, VOIDmode))
8708 error ("constant argument out of range for %qs", insn_data[icode].name);
8709 return FALSE;
8711 return TRUE;
8714 /* Return a legitimate rtx for instruction ICODE's return value. Use TARGET
8715 if it's not null, has the right mode, and satisfies operand 0's
8716 predicate. */
8718 static rtx
8719 frv_legitimize_target (enum insn_code icode, rtx target)
8721 machine_mode mode = insn_data[icode].operand[0].mode;
8723 if (! target
8724 || GET_MODE (target) != mode
8725 || ! (*insn_data[icode].operand[0].predicate) (target, mode))
8726 return gen_reg_rtx (mode);
8727 else
8728 return target;
8731 /* Given that ARG is being passed as operand OPNUM to instruction ICODE,
8732 check whether ARG satisfies the operand's constraints. If it doesn't,
8733 copy ARG to a temporary register and return that. Otherwise return ARG
8734 itself. */
8736 static rtx
8737 frv_legitimize_argument (enum insn_code icode, int opnum, rtx arg)
8739 machine_mode mode = insn_data[icode].operand[opnum].mode;
8741 if ((*insn_data[icode].operand[opnum].predicate) (arg, mode))
8742 return arg;
8743 else
8744 return copy_to_mode_reg (mode, arg);
8747 /* Return a volatile memory reference of mode MODE whose address is ARG. */
8749 static rtx
8750 frv_volatile_memref (machine_mode mode, rtx arg)
8752 rtx mem;
8754 mem = gen_rtx_MEM (mode, memory_address (mode, arg));
8755 MEM_VOLATILE_P (mem) = 1;
8756 return mem;
8759 /* Expand builtins that take a single, constant argument. At the moment,
8760 only MHDSETS falls into this category. */
8762 static rtx
8763 frv_expand_set_builtin (enum insn_code icode, tree call, rtx target)
8765 rtx pat;
8766 rtx op0 = frv_read_argument (call, 0);
8768 if (! frv_check_constant_argument (icode, 1, op0))
8769 return NULL_RTX;
8771 target = frv_legitimize_target (icode, target);
8772 pat = GEN_FCN (icode) (target, op0);
8773 if (! pat)
8774 return NULL_RTX;
8776 emit_insn (pat);
8777 return target;
8780 /* Expand builtins that take one operand. */
8782 static rtx
8783 frv_expand_unop_builtin (enum insn_code icode, tree call, rtx target)
8785 rtx pat;
8786 rtx op0 = frv_read_argument (call, 0);
8788 target = frv_legitimize_target (icode, target);
8789 op0 = frv_legitimize_argument (icode, 1, op0);
8790 pat = GEN_FCN (icode) (target, op0);
8791 if (! pat)
8792 return NULL_RTX;
8794 emit_insn (pat);
8795 return target;
8798 /* Expand builtins that take two operands. */
8800 static rtx
8801 frv_expand_binop_builtin (enum insn_code icode, tree call, rtx target)
8803 rtx pat;
8804 rtx op0 = frv_read_argument (call, 0);
8805 rtx op1 = frv_read_argument (call, 1);
8807 target = frv_legitimize_target (icode, target);
8808 op0 = frv_legitimize_argument (icode, 1, op0);
8809 op1 = frv_legitimize_argument (icode, 2, op1);
8810 pat = GEN_FCN (icode) (target, op0, op1);
8811 if (! pat)
8812 return NULL_RTX;
8814 emit_insn (pat);
8815 return target;
8818 /* Expand cut-style builtins, which take two operands and an implicit ACCG
8819 one. */
8821 static rtx
8822 frv_expand_cut_builtin (enum insn_code icode, tree call, rtx target)
8824 rtx pat;
8825 rtx op0 = frv_read_argument (call, 0);
8826 rtx op1 = frv_read_argument (call, 1);
8827 rtx op2;
8829 target = frv_legitimize_target (icode, target);
8830 op0 = frv_int_to_acc (icode, 1, op0);
8831 if (! op0)
8832 return NULL_RTX;
8834 if (icode == CODE_FOR_mdcutssi || GET_CODE (op1) == CONST_INT)
8836 if (! frv_check_constant_argument (icode, 2, op1))
8837 return NULL_RTX;
8839 else
8840 op1 = frv_legitimize_argument (icode, 2, op1);
8842 op2 = frv_matching_accg_for_acc (op0);
8843 pat = GEN_FCN (icode) (target, op0, op1, op2);
8844 if (! pat)
8845 return NULL_RTX;
8847 emit_insn (pat);
8848 return target;
8851 /* Expand builtins that take two operands and the second is immediate. */
8853 static rtx
8854 frv_expand_binopimm_builtin (enum insn_code icode, tree call, rtx target)
8856 rtx pat;
8857 rtx op0 = frv_read_argument (call, 0);
8858 rtx op1 = frv_read_argument (call, 1);
8860 if (! frv_check_constant_argument (icode, 2, op1))
8861 return NULL_RTX;
8863 target = frv_legitimize_target (icode, target);
8864 op0 = frv_legitimize_argument (icode, 1, op0);
8865 pat = GEN_FCN (icode) (target, op0, op1);
8866 if (! pat)
8867 return NULL_RTX;
8869 emit_insn (pat);
8870 return target;
8873 /* Expand builtins that take two operands, the first operand being a pointer to
8874 ints and return void. */
8876 static rtx
8877 frv_expand_voidbinop_builtin (enum insn_code icode, tree call)
8879 rtx pat;
8880 rtx op0 = frv_read_argument (call, 0);
8881 rtx op1 = frv_read_argument (call, 1);
8882 machine_mode mode0 = insn_data[icode].operand[0].mode;
8883 rtx addr;
8885 if (GET_CODE (op0) != MEM)
8887 rtx reg = op0;
8889 if (! offsettable_address_p (0, mode0, op0))
8891 reg = gen_reg_rtx (Pmode);
8892 emit_insn (gen_rtx_SET (reg, op0));
8895 op0 = gen_rtx_MEM (SImode, reg);
8898 addr = XEXP (op0, 0);
8899 if (! offsettable_address_p (0, mode0, addr))
8900 addr = copy_to_mode_reg (Pmode, op0);
8902 op0 = change_address (op0, V4SImode, addr);
8903 op1 = frv_legitimize_argument (icode, 1, op1);
8904 pat = GEN_FCN (icode) (op0, op1);
8905 if (! pat)
8906 return 0;
8908 emit_insn (pat);
8909 return 0;
8912 /* Expand builtins that take two long operands and return void. */
8914 static rtx
8915 frv_expand_int_void2arg (enum insn_code icode, tree call)
8917 rtx pat;
8918 rtx op0 = frv_read_argument (call, 0);
8919 rtx op1 = frv_read_argument (call, 1);
8921 op0 = frv_legitimize_argument (icode, 1, op0);
8922 op1 = frv_legitimize_argument (icode, 1, op1);
8923 pat = GEN_FCN (icode) (op0, op1);
8924 if (! pat)
8925 return NULL_RTX;
8927 emit_insn (pat);
8928 return NULL_RTX;
8931 /* Expand prefetch builtins. These take a single address as argument. */
8933 static rtx
8934 frv_expand_prefetches (enum insn_code icode, tree call)
8936 rtx pat;
8937 rtx op0 = frv_read_argument (call, 0);
8939 pat = GEN_FCN (icode) (force_reg (Pmode, op0));
8940 if (! pat)
8941 return 0;
8943 emit_insn (pat);
8944 return 0;
8947 /* Expand builtins that take three operands and return void. The first
8948 argument must be a constant that describes a pair or quad accumulators. A
8949 fourth argument is created that is the accumulator guard register that
8950 corresponds to the accumulator. */
8952 static rtx
8953 frv_expand_voidtriop_builtin (enum insn_code icode, tree call)
8955 rtx pat;
8956 rtx op0 = frv_read_argument (call, 0);
8957 rtx op1 = frv_read_argument (call, 1);
8958 rtx op2 = frv_read_argument (call, 2);
8959 rtx op3;
8961 op0 = frv_int_to_acc (icode, 0, op0);
8962 if (! op0)
8963 return NULL_RTX;
8965 op1 = frv_legitimize_argument (icode, 1, op1);
8966 op2 = frv_legitimize_argument (icode, 2, op2);
8967 op3 = frv_matching_accg_for_acc (op0);
8968 pat = GEN_FCN (icode) (op0, op1, op2, op3);
8969 if (! pat)
8970 return NULL_RTX;
8972 emit_insn (pat);
8973 return NULL_RTX;
8976 /* Expand builtins that perform accumulator-to-accumulator operations.
8977 These builtins take two accumulator numbers as argument and return
8978 void. */
8980 static rtx
8981 frv_expand_voidaccop_builtin (enum insn_code icode, tree call)
8983 rtx pat;
8984 rtx op0 = frv_read_argument (call, 0);
8985 rtx op1 = frv_read_argument (call, 1);
8986 rtx op2;
8987 rtx op3;
8989 op0 = frv_int_to_acc (icode, 0, op0);
8990 if (! op0)
8991 return NULL_RTX;
8993 op1 = frv_int_to_acc (icode, 1, op1);
8994 if (! op1)
8995 return NULL_RTX;
8997 op2 = frv_matching_accg_for_acc (op0);
8998 op3 = frv_matching_accg_for_acc (op1);
8999 pat = GEN_FCN (icode) (op0, op1, op2, op3);
9000 if (! pat)
9001 return NULL_RTX;
9003 emit_insn (pat);
9004 return NULL_RTX;
9007 /* Expand a __builtin_read* function. ICODE is the instruction code for the
9008 membar and TARGET_MODE is the mode that the loaded value should have. */
9010 static rtx
9011 frv_expand_load_builtin (enum insn_code icode, machine_mode target_mode,
9012 tree call, rtx target)
9014 rtx op0 = frv_read_argument (call, 0);
9015 rtx cookie = frv_io_address_cookie (op0);
9017 if (target == 0 || !REG_P (target))
9018 target = gen_reg_rtx (target_mode);
9019 op0 = frv_volatile_memref (insn_data[icode].operand[0].mode, op0);
9020 convert_move (target, op0, 1);
9021 emit_insn (GEN_FCN (icode) (copy_rtx (op0), cookie, GEN_INT (FRV_IO_READ)));
9022 cfun->machine->has_membar_p = 1;
9023 return target;
9026 /* Likewise __builtin_write* functions. */
9028 static rtx
9029 frv_expand_store_builtin (enum insn_code icode, tree call)
9031 rtx op0 = frv_read_argument (call, 0);
9032 rtx op1 = frv_read_argument (call, 1);
9033 rtx cookie = frv_io_address_cookie (op0);
9035 op0 = frv_volatile_memref (insn_data[icode].operand[0].mode, op0);
9036 convert_move (op0, force_reg (insn_data[icode].operand[0].mode, op1), 1);
9037 emit_insn (GEN_FCN (icode) (copy_rtx (op0), cookie, GEN_INT (FRV_IO_WRITE)));
9038 cfun->machine->has_membar_p = 1;
9039 return NULL_RTX;
9042 /* Expand the MDPACKH builtin. It takes four unsigned short arguments and
9043 each argument forms one word of the two double-word input registers.
9044 CALL is the tree for the call and TARGET, if nonnull, suggests a good place
9045 to put the return value. */
9047 static rtx
9048 frv_expand_mdpackh_builtin (tree call, rtx target)
9050 enum insn_code icode = CODE_FOR_mdpackh;
9051 rtx pat, op0, op1;
9052 rtx arg1 = frv_read_argument (call, 0);
9053 rtx arg2 = frv_read_argument (call, 1);
9054 rtx arg3 = frv_read_argument (call, 2);
9055 rtx arg4 = frv_read_argument (call, 3);
9057 target = frv_legitimize_target (icode, target);
9058 op0 = gen_reg_rtx (DImode);
9059 op1 = gen_reg_rtx (DImode);
9061 /* The high half of each word is not explicitly initialized, so indicate
9062 that the input operands are not live before this point. */
9063 emit_clobber (op0);
9064 emit_clobber (op1);
9066 /* Move each argument into the low half of its associated input word. */
9067 emit_move_insn (simplify_gen_subreg (HImode, op0, DImode, 2), arg1);
9068 emit_move_insn (simplify_gen_subreg (HImode, op0, DImode, 6), arg2);
9069 emit_move_insn (simplify_gen_subreg (HImode, op1, DImode, 2), arg3);
9070 emit_move_insn (simplify_gen_subreg (HImode, op1, DImode, 6), arg4);
9072 pat = GEN_FCN (icode) (target, op0, op1);
9073 if (! pat)
9074 return NULL_RTX;
9076 emit_insn (pat);
9077 return target;
9080 /* Expand the MCLRACC builtin. This builtin takes a single accumulator
9081 number as argument. */
9083 static rtx
9084 frv_expand_mclracc_builtin (tree call)
9086 enum insn_code icode = CODE_FOR_mclracc;
9087 rtx pat;
9088 rtx op0 = frv_read_argument (call, 0);
9090 op0 = frv_int_to_acc (icode, 0, op0);
9091 if (! op0)
9092 return NULL_RTX;
9094 pat = GEN_FCN (icode) (op0);
9095 if (pat)
9096 emit_insn (pat);
9098 return NULL_RTX;
9101 /* Expand builtins that take no arguments. */
9103 static rtx
9104 frv_expand_noargs_builtin (enum insn_code icode)
9106 rtx pat = GEN_FCN (icode) (const0_rtx);
9107 if (pat)
9108 emit_insn (pat);
9110 return NULL_RTX;
9113 /* Expand MRDACC and MRDACCG. These builtins take a single accumulator
9114 number or accumulator guard number as argument and return an SI integer. */
9116 static rtx
9117 frv_expand_mrdacc_builtin (enum insn_code icode, tree call)
9119 rtx pat;
9120 rtx target = gen_reg_rtx (SImode);
9121 rtx op0 = frv_read_argument (call, 0);
9123 op0 = frv_int_to_acc (icode, 1, op0);
9124 if (! op0)
9125 return NULL_RTX;
9127 pat = GEN_FCN (icode) (target, op0);
9128 if (! pat)
9129 return NULL_RTX;
9131 emit_insn (pat);
9132 return target;
9135 /* Expand MWTACC and MWTACCG. These builtins take an accumulator or
9136 accumulator guard as their first argument and an SImode value as their
9137 second. */
9139 static rtx
9140 frv_expand_mwtacc_builtin (enum insn_code icode, tree call)
9142 rtx pat;
9143 rtx op0 = frv_read_argument (call, 0);
9144 rtx op1 = frv_read_argument (call, 1);
9146 op0 = frv_int_to_acc (icode, 0, op0);
9147 if (! op0)
9148 return NULL_RTX;
9150 op1 = frv_legitimize_argument (icode, 1, op1);
9151 pat = GEN_FCN (icode) (op0, op1);
9152 if (pat)
9153 emit_insn (pat);
9155 return NULL_RTX;
9158 /* Emit a move from SRC to DEST in SImode chunks. This can be used
9159 to move DImode values into and out of IACC0. */
9161 static void
9162 frv_split_iacc_move (rtx dest, rtx src)
9164 machine_mode inner;
9165 int i;
9167 inner = GET_MODE (dest);
9168 for (i = 0; i < GET_MODE_SIZE (inner); i += GET_MODE_SIZE (SImode))
9169 emit_move_insn (simplify_gen_subreg (SImode, dest, inner, i),
9170 simplify_gen_subreg (SImode, src, inner, i));
9173 /* Expand builtins. */
9175 static rtx
9176 frv_expand_builtin (tree exp,
9177 rtx target,
9178 rtx subtarget ATTRIBUTE_UNUSED,
9179 machine_mode mode ATTRIBUTE_UNUSED,
9180 int ignore ATTRIBUTE_UNUSED)
9182 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
9183 unsigned fcode = (unsigned)DECL_FUNCTION_CODE (fndecl);
9184 unsigned i;
9185 struct builtin_description *d;
9187 if (fcode < FRV_BUILTIN_FIRST_NONMEDIA && !TARGET_MEDIA)
9189 error ("media functions are not available unless -mmedia is used");
9190 return NULL_RTX;
9193 switch (fcode)
9195 case FRV_BUILTIN_MCOP1:
9196 case FRV_BUILTIN_MCOP2:
9197 case FRV_BUILTIN_MDUNPACKH:
9198 case FRV_BUILTIN_MBTOHE:
9199 if (! TARGET_MEDIA_REV1)
9201 error ("this media function is only available on the fr500");
9202 return NULL_RTX;
9204 break;
9206 case FRV_BUILTIN_MQXMACHS:
9207 case FRV_BUILTIN_MQXMACXHS:
9208 case FRV_BUILTIN_MQMACXHS:
9209 case FRV_BUILTIN_MADDACCS:
9210 case FRV_BUILTIN_MSUBACCS:
9211 case FRV_BUILTIN_MASACCS:
9212 case FRV_BUILTIN_MDADDACCS:
9213 case FRV_BUILTIN_MDSUBACCS:
9214 case FRV_BUILTIN_MDASACCS:
9215 case FRV_BUILTIN_MABSHS:
9216 case FRV_BUILTIN_MDROTLI:
9217 case FRV_BUILTIN_MCPLHI:
9218 case FRV_BUILTIN_MCPLI:
9219 case FRV_BUILTIN_MDCUTSSI:
9220 case FRV_BUILTIN_MQSATHS:
9221 case FRV_BUILTIN_MHSETLOS:
9222 case FRV_BUILTIN_MHSETLOH:
9223 case FRV_BUILTIN_MHSETHIS:
9224 case FRV_BUILTIN_MHSETHIH:
9225 case FRV_BUILTIN_MHDSETS:
9226 case FRV_BUILTIN_MHDSETH:
9227 if (! TARGET_MEDIA_REV2)
9229 error ("this media function is only available on the fr400"
9230 " and fr550");
9231 return NULL_RTX;
9233 break;
9235 case FRV_BUILTIN_SMASS:
9236 case FRV_BUILTIN_SMSSS:
9237 case FRV_BUILTIN_SMU:
9238 case FRV_BUILTIN_ADDSS:
9239 case FRV_BUILTIN_SUBSS:
9240 case FRV_BUILTIN_SLASS:
9241 case FRV_BUILTIN_SCUTSS:
9242 case FRV_BUILTIN_IACCreadll:
9243 case FRV_BUILTIN_IACCreadl:
9244 case FRV_BUILTIN_IACCsetll:
9245 case FRV_BUILTIN_IACCsetl:
9246 if (!TARGET_FR405_BUILTINS)
9248 error ("this builtin function is only available"
9249 " on the fr405 and fr450");
9250 return NULL_RTX;
9252 break;
9254 case FRV_BUILTIN_PREFETCH:
9255 if (!TARGET_FR500_FR550_BUILTINS)
9257 error ("this builtin function is only available on the fr500"
9258 " and fr550");
9259 return NULL_RTX;
9261 break;
9263 case FRV_BUILTIN_MQLCLRHS:
9264 case FRV_BUILTIN_MQLMTHS:
9265 case FRV_BUILTIN_MQSLLHI:
9266 case FRV_BUILTIN_MQSRAHI:
9267 if (!TARGET_MEDIA_FR450)
9269 error ("this builtin function is only available on the fr450");
9270 return NULL_RTX;
9272 break;
9274 default:
9275 break;
9278 /* Expand unique builtins. */
9280 switch (fcode)
9282 case FRV_BUILTIN_MTRAP:
9283 return frv_expand_noargs_builtin (CODE_FOR_mtrap);
9285 case FRV_BUILTIN_MCLRACC:
9286 return frv_expand_mclracc_builtin (exp);
9288 case FRV_BUILTIN_MCLRACCA:
9289 if (TARGET_ACC_8)
9290 return frv_expand_noargs_builtin (CODE_FOR_mclracca8);
9291 else
9292 return frv_expand_noargs_builtin (CODE_FOR_mclracca4);
9294 case FRV_BUILTIN_MRDACC:
9295 return frv_expand_mrdacc_builtin (CODE_FOR_mrdacc, exp);
9297 case FRV_BUILTIN_MRDACCG:
9298 return frv_expand_mrdacc_builtin (CODE_FOR_mrdaccg, exp);
9300 case FRV_BUILTIN_MWTACC:
9301 return frv_expand_mwtacc_builtin (CODE_FOR_mwtacc, exp);
9303 case FRV_BUILTIN_MWTACCG:
9304 return frv_expand_mwtacc_builtin (CODE_FOR_mwtaccg, exp);
9306 case FRV_BUILTIN_MDPACKH:
9307 return frv_expand_mdpackh_builtin (exp, target);
9309 case FRV_BUILTIN_IACCreadll:
9311 rtx src = frv_read_iacc_argument (DImode, exp, 0);
9312 if (target == 0 || !REG_P (target))
9313 target = gen_reg_rtx (DImode);
9314 frv_split_iacc_move (target, src);
9315 return target;
9318 case FRV_BUILTIN_IACCreadl:
9319 return frv_read_iacc_argument (SImode, exp, 0);
9321 case FRV_BUILTIN_IACCsetll:
9323 rtx dest = frv_read_iacc_argument (DImode, exp, 0);
9324 rtx src = frv_read_argument (exp, 1);
9325 frv_split_iacc_move (dest, force_reg (DImode, src));
9326 return 0;
9329 case FRV_BUILTIN_IACCsetl:
9331 rtx dest = frv_read_iacc_argument (SImode, exp, 0);
9332 rtx src = frv_read_argument (exp, 1);
9333 emit_move_insn (dest, force_reg (SImode, src));
9334 return 0;
9337 default:
9338 break;
9341 /* Expand groups of builtins. */
9343 for (i = 0, d = bdesc_set; i < ARRAY_SIZE (bdesc_set); i++, d++)
9344 if (d->code == fcode)
9345 return frv_expand_set_builtin (d->icode, exp, target);
9347 for (i = 0, d = bdesc_1arg; i < ARRAY_SIZE (bdesc_1arg); i++, d++)
9348 if (d->code == fcode)
9349 return frv_expand_unop_builtin (d->icode, exp, target);
9351 for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
9352 if (d->code == fcode)
9353 return frv_expand_binop_builtin (d->icode, exp, target);
9355 for (i = 0, d = bdesc_cut; i < ARRAY_SIZE (bdesc_cut); i++, d++)
9356 if (d->code == fcode)
9357 return frv_expand_cut_builtin (d->icode, exp, target);
9359 for (i = 0, d = bdesc_2argimm; i < ARRAY_SIZE (bdesc_2argimm); i++, d++)
9360 if (d->code == fcode)
9361 return frv_expand_binopimm_builtin (d->icode, exp, target);
9363 for (i = 0, d = bdesc_void2arg; i < ARRAY_SIZE (bdesc_void2arg); i++, d++)
9364 if (d->code == fcode)
9365 return frv_expand_voidbinop_builtin (d->icode, exp);
9367 for (i = 0, d = bdesc_void3arg; i < ARRAY_SIZE (bdesc_void3arg); i++, d++)
9368 if (d->code == fcode)
9369 return frv_expand_voidtriop_builtin (d->icode, exp);
9371 for (i = 0, d = bdesc_voidacc; i < ARRAY_SIZE (bdesc_voidacc); i++, d++)
9372 if (d->code == fcode)
9373 return frv_expand_voidaccop_builtin (d->icode, exp);
9375 for (i = 0, d = bdesc_int_void2arg;
9376 i < ARRAY_SIZE (bdesc_int_void2arg); i++, d++)
9377 if (d->code == fcode)
9378 return frv_expand_int_void2arg (d->icode, exp);
9380 for (i = 0, d = bdesc_prefetches;
9381 i < ARRAY_SIZE (bdesc_prefetches); i++, d++)
9382 if (d->code == fcode)
9383 return frv_expand_prefetches (d->icode, exp);
9385 for (i = 0, d = bdesc_loads; i < ARRAY_SIZE (bdesc_loads); i++, d++)
9386 if (d->code == fcode)
9387 return frv_expand_load_builtin (d->icode, TYPE_MODE (TREE_TYPE (exp)),
9388 exp, target);
9390 for (i = 0, d = bdesc_stores; i < ARRAY_SIZE (bdesc_stores); i++, d++)
9391 if (d->code == fcode)
9392 return frv_expand_store_builtin (d->icode, exp);
9394 return 0;
9397 static bool
9398 frv_in_small_data_p (const_tree decl)
9400 HOST_WIDE_INT size;
9401 const char *section_name;
9403 /* Don't apply the -G flag to internal compiler structures. We
9404 should leave such structures in the main data section, partly
9405 for efficiency and partly because the size of some of them
9406 (such as C++ typeinfos) is not known until later. */
9407 if (TREE_CODE (decl) != VAR_DECL || DECL_ARTIFICIAL (decl))
9408 return false;
9410 /* If we already know which section the decl should be in, see if
9411 it's a small data section. */
9412 section_name = DECL_SECTION_NAME (decl);
9413 if (section_name)
9415 if (frv_string_begins_with (section_name, ".sdata"))
9416 return true;
9417 if (frv_string_begins_with (section_name, ".sbss"))
9418 return true;
9419 return false;
9422 size = int_size_in_bytes (TREE_TYPE (decl));
9423 if (size > 0 && size <= g_switch_value)
9424 return true;
9426 return false;
9429 static bool
9430 frv_rtx_costs (rtx x,
9431 machine_mode mode,
9432 int outer_code,
9433 int opno ATTRIBUTE_UNUSED,
9434 int *total,
9435 bool speed ATTRIBUTE_UNUSED)
9437 int code = GET_CODE (x);
9439 if (outer_code == MEM)
9441 /* Don't differentiate between memory addresses. All the ones
9442 we accept have equal cost. */
9443 *total = COSTS_N_INSNS (0);
9444 return true;
9447 switch (code)
9449 case CONST_INT:
9450 /* Make 12-bit integers really cheap. */
9451 if (IN_RANGE (INTVAL (x), -2048, 2047))
9453 *total = 0;
9454 return true;
9456 /* Fall through. */
9458 case CONST:
9459 case LABEL_REF:
9460 case SYMBOL_REF:
9461 case CONST_DOUBLE:
9462 *total = COSTS_N_INSNS (2);
9463 return true;
9465 case PLUS:
9466 case MINUS:
9467 case AND:
9468 case IOR:
9469 case XOR:
9470 case ASHIFT:
9471 case ASHIFTRT:
9472 case LSHIFTRT:
9473 case NOT:
9474 case NEG:
9475 case COMPARE:
9476 if (mode == SImode)
9477 *total = COSTS_N_INSNS (1);
9478 else if (mode == DImode)
9479 *total = COSTS_N_INSNS (2);
9480 else
9481 *total = COSTS_N_INSNS (3);
9482 return true;
9484 case MULT:
9485 if (mode == SImode)
9486 *total = COSTS_N_INSNS (2);
9487 else
9488 *total = COSTS_N_INSNS (6); /* guess */
9489 return true;
9491 case DIV:
9492 case UDIV:
9493 case MOD:
9494 case UMOD:
9495 *total = COSTS_N_INSNS (18);
9496 return true;
9498 case MEM:
9499 *total = COSTS_N_INSNS (3);
9500 return true;
9502 default:
9503 return false;
9507 static void
9508 frv_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
9510 switch_to_section (ctors_section);
9511 assemble_align (POINTER_SIZE);
9512 if (TARGET_FDPIC)
9514 int ok = frv_assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
9516 gcc_assert (ok);
9517 return;
9519 assemble_integer_with_op ("\t.picptr\t", symbol);
9522 static void
9523 frv_asm_out_destructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
9525 switch_to_section (dtors_section);
9526 assemble_align (POINTER_SIZE);
9527 if (TARGET_FDPIC)
9529 int ok = frv_assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, 1);
9531 gcc_assert (ok);
9532 return;
9534 assemble_integer_with_op ("\t.picptr\t", symbol);
9537 /* Worker function for TARGET_STRUCT_VALUE_RTX. */
9539 static rtx
9540 frv_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
9541 int incoming ATTRIBUTE_UNUSED)
9543 return gen_rtx_REG (Pmode, FRV_STRUCT_VALUE_REGNUM);
9546 #define TLS_BIAS (2048 - 16)
9548 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
9549 We need to emit DTP-relative relocations. */
9551 static void
9552 frv_output_dwarf_dtprel (FILE *file, int size, rtx x)
9554 gcc_assert (size == 4);
9555 fputs ("\t.picptr\ttlsmoff(", file);
9556 /* We want the unbiased TLS offset, so add the bias to the
9557 expression, such that the implicit biasing cancels out. */
9558 output_addr_const (file, plus_constant (Pmode, x, TLS_BIAS));
9559 fputs (")", file);
9562 #include "gt-frv.h"