OSDN Git Service

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