OSDN Git Service

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