OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.2.2/] [gcc/] [config/] [frv/] [frv.c] - Blame information for rev 307

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.