OSDN Git Service

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