OpenCores
URL https://opencores.org/ocsvn/hf-risc/hf-risc/trunk

Subversion Repositories hf-risc

[/] [hf-risc/] [trunk/] [tools/] [riscv-gnu-toolchain-master/] [gcc/] [gcc/] [config/] [riscv/] [riscv.h] - Blame information for rev 13

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 13 serginhofr
/* Definition of RISC-V target for GNU compiler.
2
   Copyright (C) 2011-2014 Free Software Foundation, Inc.
3
   Contributed by Andrew Waterman (waterman@cs.berkeley.edu) at UC Berkeley.
4
   Based on MIPS target for GNU compiler.
5
 
6
This file is part of GCC.
7
 
8
GCC is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 3, or (at your option)
11
any later version.
12
 
13
GCC is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
GNU General Public License for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING3.  If not see
20
<http://www.gnu.org/licenses/>.  */
21
 
22
/* TARGET_HARD_FLOAT and TARGET_SOFT_FLOAT reflect whether the FPU is
23
   directly accessible, while the command-line options select
24
   TARGET_HARD_FLOAT_ABI and TARGET_SOFT_FLOAT_ABI to reflect the ABI
25
   in use.  */
26
#define TARGET_HARD_FLOAT TARGET_HARD_FLOAT_ABI
27
#define TARGET_SOFT_FLOAT TARGET_SOFT_FLOAT_ABI
28
 
29
/* Target CPU builtins.  */
30
#define TARGET_CPU_CPP_BUILTINS()                                       \
31
  do                                                                    \
32
    {                                                                   \
33
      builtin_assert ("machine=riscv");                                 \
34
                                                                        \
35
      builtin_assert ("cpu=riscv");                                     \
36
      builtin_define ("__riscv__");                                     \
37
      builtin_define ("__riscv");                                       \
38
      builtin_define ("_riscv");                                        \
39
      builtin_define ("__riscv");                                       \
40
                                                                        \
41
      if (TARGET_64BIT)                                                 \
42
        {                                                               \
43
          builtin_define ("__riscv64");                                 \
44
          builtin_define ("_RISCV_SIM=_ABI64");                         \
45
        }                                                               \
46
      else                                                              \
47
        builtin_define ("_RISCV_SIM=_ABI32");                           \
48
                                                                        \
49
      builtin_define ("_ABI32=1");                                      \
50
      builtin_define ("_ABI64=3");                                      \
51
                                                                        \
52
                                                                        \
53
      builtin_define_with_int_value ("_RISCV_SZINT", INT_TYPE_SIZE);    \
54
      builtin_define_with_int_value ("_RISCV_SZLONG", LONG_TYPE_SIZE);  \
55
      builtin_define_with_int_value ("_RISCV_SZPTR", POINTER_SIZE);     \
56
      builtin_define_with_int_value ("_RISCV_FPSET", 32);               \
57
                                                                        \
58
      if (TARGET_RVC)                                                   \
59
        builtin_define ("__riscv_compressed");                          \
60
                                                                        \
61
      if (TARGET_ATOMIC)                                                \
62
        builtin_define ("__riscv_atomic");                              \
63
                                                                        \
64
      /* These defines reflect the ABI in use, not whether the          \
65
         FPU is directly accessible.  */                                \
66
      if (TARGET_HARD_FLOAT_ABI) {                                      \
67
        builtin_define ("__riscv_hard_float");                          \
68
        if (TARGET_FDIV) {                                              \
69
          builtin_define ("__riscv_fdiv");                              \
70
          builtin_define ("__riscv_fsqrt");                             \
71
        }                                                               \
72
      } else                                                            \
73
        builtin_define ("__riscv_soft_float");                          \
74
                                                                        \
75
      /* The base RISC-V ISA is always little-endian. */                \
76
      builtin_define_std ("RISCVEL");                                   \
77
      builtin_define ("_RISCVEL");                                      \
78
                                                                        \
79
      /* Macros dependent on the C dialect.  */                         \
80
      if (preprocessing_asm_p ())                                       \
81
        {                                                               \
82
          builtin_define_std ("LANGUAGE_ASSEMBLY");                     \
83
          builtin_define ("_LANGUAGE_ASSEMBLY");                        \
84
        }                                                               \
85
      else if (c_dialect_cxx ())                                        \
86
        {                                                               \
87
          builtin_define ("_LANGUAGE_C_PLUS_PLUS");                     \
88
          builtin_define ("__LANGUAGE_C_PLUS_PLUS");                    \
89
          builtin_define ("__LANGUAGE_C_PLUS_PLUS__");                  \
90
        }                                                               \
91
      else                                                              \
92
        {                                                               \
93
          builtin_define_std ("LANGUAGE_C");                            \
94
          builtin_define ("_LANGUAGE_C");                               \
95
        }                                                               \
96
      if (c_dialect_objc ())                                            \
97
        {                                                               \
98
          builtin_define ("_LANGUAGE_OBJECTIVE_C");                     \
99
          builtin_define ("__LANGUAGE_OBJECTIVE_C");                    \
100
          /* Bizarre, but needed at least for Irix.  */                 \
101
          builtin_define_std ("LANGUAGE_C");                            \
102
          builtin_define ("_LANGUAGE_C");                               \
103
        }                                                               \
104
      if (riscv_cmodel == CM_MEDANY)                                    \
105
        builtin_define ("_RISCV_CMODEL_MEDANY");                        \
106
    }                                                                   \
107
  while (0)
108
 
109
/* Default target_flags if no switches are specified  */
110
 
111
#ifndef TARGET_DEFAULT
112
#define TARGET_DEFAULT 0
113
#endif
114
 
115
#ifndef RISCV_ARCH_STRING_DEFAULT
116
#define RISCV_ARCH_STRING_DEFAULT "IMAFD"
117
#endif
118
 
119
#ifndef RISCV_TUNE_STRING_DEFAULT
120
#define RISCV_TUNE_STRING_DEFAULT "rocket"
121
#endif
122
 
123
#ifndef TARGET_64BIT_DEFAULT
124
#define TARGET_64BIT_DEFAULT 1
125
#endif
126
 
127
#if TARGET_64BIT_DEFAULT
128
# define MULTILIB_ARCH_DEFAULT "m64"
129
# define OPT_ARCH64 "!m32"
130
# define OPT_ARCH32 "m32"
131
#else
132
# define MULTILIB_ARCH_DEFAULT "m32"
133
# define OPT_ARCH64 "m64"
134
# define OPT_ARCH32 "!m64"
135
#endif
136
 
137
#ifndef MULTILIB_DEFAULTS
138
#define MULTILIB_DEFAULTS \
139
    { MULTILIB_ARCH_DEFAULT }
140
#endif
141
 
142
 
143
/* Support for a compile-time default CPU, et cetera.  The rules are:
144
   --with-arch is ignored if -march is specified.
145
   --with-tune is ignored if -mtune is specified.
146
   --with-float is ignored if -mhard-float or -msoft-float are specified. */
147
#define OPTION_DEFAULT_SPECS \
148
  {"arch", "%{!march=*:-march=%(VALUE)}"},                         \
149
  {"arch_32", "%{" OPT_ARCH32 ":%{m32}}" }, \
150
  {"arch_64", "%{" OPT_ARCH64 ":%{m64}}" }, \
151
  {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \
152
  {"float", "%{!msoft-float:%{!mhard-float:-m%(VALUE)-float}}" }, \
153
 
154
#define DRIVER_SELF_SPECS ""
155
 
156
#ifdef IN_LIBGCC2
157
#undef TARGET_64BIT
158
/* Make this compile time constant for libgcc2 */
159
#ifdef __riscv64
160
#define TARGET_64BIT            1
161
#else
162
#define TARGET_64BIT            0
163
#endif
164
#endif /* IN_LIBGCC2 */
165
 
166
/* Tell collect what flags to pass to nm.  */
167
#ifndef NM_FLAGS
168
#define NM_FLAGS "-Bn"
169
#endif
170
 
171
#undef ASM_SPEC
172
#define ASM_SPEC "\
173
%(subtarget_asm_debugging_spec) \
174
%{m32} %{m64} %{!m32:%{!m64: %(asm_abi_default_spec)}} \
175
%{mrvc} %{mno-rvc} \
176
%{msoft-float} %{mhard-float} \
177
%{fPIC|fpic|fPIE|fpie:-fpic} \
178
%{march=*} \
179
%(subtarget_asm_spec)"
180
 
181
/* Extra switches sometimes passed to the linker.  */
182
 
183
#ifndef LINK_SPEC
184
#define LINK_SPEC "\
185
%{!T:-dT riscv.ld} \
186
%{m64:-melf64lriscv} \
187
%{m32:-melf32lriscv} \
188
%{shared}"
189
#endif  /* LINK_SPEC defined */
190
 
191
/* This macro defines names of additional specifications to put in the specs
192
   that can be used in various specifications like CC1_SPEC.  Its definition
193
   is an initializer with a subgrouping for each command option.
194
 
195
   Each subgrouping contains a string constant, that defines the
196
   specification name, and a string constant that used by the GCC driver
197
   program.
198
 
199
   Do not define this macro if it does not need to do anything.  */
200
 
201
#define EXTRA_SPECS                                                     \
202
  { "asm_abi_default_spec", "-" MULTILIB_ARCH_DEFAULT },                \
203
  SUBTARGET_EXTRA_SPECS
204
 
205
#ifndef SUBTARGET_EXTRA_SPECS
206
#define SUBTARGET_EXTRA_SPECS
207
#endif
208
 
209
#define TARGET_DEFAULT_CMODEL CM_MEDLOW
210
 
211
/* By default, turn on GDB extensions.  */
212
#define DEFAULT_GDB_EXTENSIONS 1
213
 
214
#define LOCAL_LABEL_PREFIX      "."
215
#define USER_LABEL_PREFIX       ""
216
 
217
#define DWARF2_DEBUGGING_INFO 1
218
#define DWARF2_ASM_LINE_DEBUG_INFO 0
219
 
220
/* The mapping from gcc register number to DWARF 2 CFA column number.  */
221
#define DWARF_FRAME_REGNUM(REGNO) \
222
  (GP_REG_P (REGNO) || FP_REG_P (REGNO) ? REGNO : INVALID_REGNUM)
223
 
224
/* The DWARF 2 CFA column which tracks the return address.  */
225
#define DWARF_FRAME_RETURN_COLUMN RETURN_ADDR_REGNUM
226
 
227
/* Don't emit .cfi_sections, as it does not work */
228
#undef HAVE_GAS_CFI_SECTIONS_DIRECTIVE
229
#define HAVE_GAS_CFI_SECTIONS_DIRECTIVE 0
230
 
231
/* Before the prologue, RA lives in r31.  */
232
#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (VOIDmode, RETURN_ADDR_REGNUM)
233
 
234
/* Describe how we implement __builtin_eh_return.  */
235
#define EH_RETURN_DATA_REGNO(N) \
236
  ((N) < 4 ? (N) + GP_ARG_FIRST : INVALID_REGNUM)
237
 
238
#define EH_RETURN_STACKADJ_RTX  gen_rtx_REG (Pmode, GP_ARG_FIRST + 4)
239
 
240
/* Target machine storage layout */
241
 
242
#define BITS_BIG_ENDIAN 0
243
#define BYTES_BIG_ENDIAN 0
244
#define WORDS_BIG_ENDIAN 0
245
 
246
#define MAX_BITS_PER_WORD 64
247
 
248
/* Width of a word, in units (bytes).  */
249
#define UNITS_PER_WORD (TARGET_64BIT ? 8 : 4)
250
#ifndef IN_LIBGCC2
251
#define MIN_UNITS_PER_WORD 4
252
#endif
253
 
254
/* We currently require both or neither of the `F' and `D' extensions. */
255
#define UNITS_PER_FPREG 8
256
 
257
/* If FP regs aren't wide enough for a given FP argument, it is passed in
258
   integer registers. */
259
#define MIN_FPRS_PER_FMT 1
260
 
261
/* The largest size of value that can be held in floating-point
262
   registers and moved with a single instruction.  */
263
#define UNITS_PER_HWFPVALUE \
264
  (TARGET_SOFT_FLOAT_ABI ? 0 : UNITS_PER_FPREG)
265
 
266
/* The largest size of value that can be held in floating-point
267
   registers.  */
268
#define UNITS_PER_FPVALUE                       \
269
  (TARGET_SOFT_FLOAT_ABI ? 0                    \
270
   : LONG_DOUBLE_TYPE_SIZE / BITS_PER_UNIT)
271
 
272
/* The number of bytes in a double.  */
273
#define UNITS_PER_DOUBLE (TYPE_PRECISION (double_type_node) / BITS_PER_UNIT)
274
 
275
/* Set the sizes of the core types.  */
276
#define SHORT_TYPE_SIZE 16
277
#define INT_TYPE_SIZE 32
278
#define LONG_TYPE_SIZE (TARGET_64BIT ? 64 : 32)
279
#define LONG_LONG_TYPE_SIZE 64
280
 
281
#define FLOAT_TYPE_SIZE 32
282
#define DOUBLE_TYPE_SIZE 64
283
/* XXX The ABI says long doubles are IEEE-754-2008 float128s. */
284
#define LONG_DOUBLE_TYPE_SIZE 64
285
 
286
#ifdef IN_LIBGCC2
287
# define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
288
#endif
289
 
290
/* Allocation boundary (in *bits*) for storing arguments in argument list.  */
291
#define PARM_BOUNDARY BITS_PER_WORD
292
 
293
/* Allocation boundary (in *bits*) for the code of a function.  */
294
#define FUNCTION_BOUNDARY (TARGET_RVC ? 16 : 32)
295
 
296
/* There is no point aligning anything to a rounder boundary than this.  */
297
#define BIGGEST_ALIGNMENT 128
298
 
299
/* All accesses must be aligned.  */
300
#define STRICT_ALIGNMENT 1
301
 
302
/* Define this if you wish to imitate the way many other C compilers
303
   handle alignment of bitfields and the structures that contain
304
   them.
305
 
306
   The behavior is that the type written for a bit-field (`int',
307
   `short', or other integer type) imposes an alignment for the
308
   entire structure, as if the structure really did contain an
309
   ordinary field of that type.  In addition, the bit-field is placed
310
   within the structure so that it would fit within such a field,
311
   not crossing a boundary for it.
312
 
313
   Thus, on most machines, a bit-field whose type is written as `int'
314
   would not cross a four-byte boundary, and would force four-byte
315
   alignment for the whole structure.  (The alignment used may not
316
   be four bytes; it is controlled by the other alignment
317
   parameters.)
318
 
319
   If the macro is defined, its definition should be a C expression;
320
   a nonzero value for the expression enables this behavior.  */
321
 
322
#define PCC_BITFIELD_TYPE_MATTERS 1
323
 
324
/* If defined, a C expression to compute the alignment given to a
325
   constant that is being placed in memory.  CONSTANT is the constant
326
   and ALIGN is the alignment that the object would ordinarily have.
327
   The value of this macro is used instead of that alignment to align
328
   the object.
329
 
330
   If this macro is not defined, then ALIGN is used.
331
 
332
   The typical use of this macro is to increase alignment for string
333
   constants to be word aligned so that `strcpy' calls that copy
334
   constants can be done inline.  */
335
 
336
#define CONSTANT_ALIGNMENT(EXP, ALIGN)                                  \
337
  ((TREE_CODE (EXP) == STRING_CST  || TREE_CODE (EXP) == CONSTRUCTOR)   \
338
   && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
339
 
340
/* If defined, a C expression to compute the alignment for a static
341
   variable.  TYPE is the data type, and ALIGN is the alignment that
342
   the object would ordinarily have.  The value of this macro is used
343
   instead of that alignment to align the object.
344
 
345
   If this macro is not defined, then ALIGN is used.
346
 
347
   One use of this macro is to increase alignment of medium-size
348
   data to make it all fit in fewer cache lines.  Another is to
349
   cause character arrays to be word-aligned so that `strcpy' calls
350
   that copy constants to character arrays can be done inline.  */
351
 
352
#undef DATA_ALIGNMENT
353
#define DATA_ALIGNMENT(TYPE, ALIGN)                                     \
354
  ((((ALIGN) < BITS_PER_WORD)                                           \
355
    && (TREE_CODE (TYPE) == ARRAY_TYPE                                  \
356
        || TREE_CODE (TYPE) == UNION_TYPE                               \
357
        || TREE_CODE (TYPE) == RECORD_TYPE)) ? BITS_PER_WORD : (ALIGN))
358
 
359
/* We need this for the same reason as DATA_ALIGNMENT, namely to cause
360
   character arrays to be word-aligned so that `strcpy' calls that copy
361
   constants to character arrays can be done inline, and 'strcmp' can be
362
   optimised to use word loads. */
363
#define LOCAL_ALIGNMENT(TYPE, ALIGN) \
364
  DATA_ALIGNMENT (TYPE, ALIGN)
365
 
366
/* Define if operations between registers always perform the operation
367
   on the full register even if a narrower mode is specified.  */
368
#define WORD_REGISTER_OPERATIONS
369
 
370
/* When in 64-bit mode, move insns will sign extend SImode and CCmode
371
   moves.  All other references are zero extended.  */
372
#define LOAD_EXTEND_OP(MODE) \
373
  (TARGET_64BIT && ((MODE) == SImode || (MODE) == CCmode) \
374
   ? SIGN_EXTEND : ZERO_EXTEND)
375
 
376
/* Define this macro if it is advisable to hold scalars in registers
377
   in a wider mode than that declared by the program.  In such cases,
378
   the value is constrained to be within the bounds of the declared
379
   type, but kept valid in the wider mode.  The signedness of the
380
   extension may differ from that of the type.  */
381
 
382
#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE)     \
383
  if (GET_MODE_CLASS (MODE) == MODE_INT         \
384
      && GET_MODE_SIZE (MODE) < 4)              \
385
    {                                           \
386
      (MODE) = Pmode;                           \
387
    }
388
 
389
/* Pmode is always the same as ptr_mode, but not always the same as word_mode.
390
   Extensions of pointers to word_mode must be signed.  */
391
#define POINTERS_EXTEND_UNSIGNED false
392
 
393
/* RV32 double-precision FP <-> integer moves go through memory */
394
#define SECONDARY_MEMORY_NEEDED(CLASS1,CLASS2,MODE) \
395
 (!TARGET_64BIT && GET_MODE_SIZE (MODE) == 8 && \
396
   (((CLASS1) == FP_REGS && (CLASS2) != FP_REGS) \
397
   || ((CLASS2) == FP_REGS && (CLASS1) != FP_REGS)))
398
 
399
/* Define if loading short immediate values into registers sign extends.  */
400
#define SHORT_IMMEDIATES_SIGN_EXTEND
401
 
402
/* Standard register usage.  */
403
 
404
/* Number of hardware registers.  We have:
405
 
406
   - 32 integer registers
407
   - 32 floating point registers
408
   - 32 vector integer registers
409
   - 32 vector floating point registers
410
   - 2 fake registers:
411
        - ARG_POINTER_REGNUM
412
        - FRAME_POINTER_REGNUM */
413
 
414
#define FIRST_PSEUDO_REGISTER 66
415
 
416
/* x0, sp, gp, and tp are fixed. */
417
 
418
#define FIXED_REGISTERS                                                 \
419
{ /* General registers.  */                                             \
420
  1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                       \
421
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                       \
422
  /* Floating-point registers.  */                                      \
423
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                       \
424
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                       \
425
  /* Others.  */                                                        \
426
  1, 1 \
427
}
428
 
429
 
430
/* a0-a7, t0-a6, fa0-fa7, and ft0-ft11 are volatile across calls.
431
   The call RTLs themselves clobber ra.  */
432
 
433
#define CALL_USED_REGISTERS                                             \
434
{ /* General registers.  */                                             \
435
  1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,                       \
436
  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,                       \
437
  /* Floating-point registers.  */                                      \
438
  1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,                       \
439
  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,                       \
440
  /* Others.  */                                                        \
441
  1, 1 \
442
}
443
 
444
#define CALL_REALLY_USED_REGISTERS                                      \
445
{ /* General registers.  */                                             \
446
  1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,                       \
447
  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,                       \
448
  /* Floating-point registers.  */                                      \
449
  1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,                       \
450
  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,                       \
451
  /* Others.  */                                                        \
452
  1, 1 \
453
}
454
 
455
/* Internal macros to classify an ISA register's type. */
456
 
457
#define GP_REG_FIRST 0
458
#define GP_REG_LAST  31
459
#define GP_REG_NUM   (GP_REG_LAST - GP_REG_FIRST + 1)
460
 
461
#define FP_REG_FIRST 32
462
#define FP_REG_LAST  63
463
#define FP_REG_NUM   (FP_REG_LAST - FP_REG_FIRST + 1)
464
 
465
/* The DWARF 2 CFA column which tracks the return address from a
466
   signal handler context.  This means that to maintain backwards
467
   compatibility, no hard register can be assigned this column if it
468
   would need to be handled by the DWARF unwinder.  */
469
#define DWARF_ALT_FRAME_RETURN_COLUMN 64
470
 
471
#define GP_REG_P(REGNO) \
472
  ((unsigned int) ((int) (REGNO) - GP_REG_FIRST) < GP_REG_NUM)
473
#define FP_REG_P(REGNO)  \
474
  ((unsigned int) ((int) (REGNO) - FP_REG_FIRST) < FP_REG_NUM)
475
 
476
#define FP_REG_RTX_P(X) (REG_P (X) && FP_REG_P (REGNO (X)))
477
 
478
/* Return coprocessor number from register number.  */
479
 
480
#define COPNUM_AS_CHAR_FROM_REGNUM(REGNO)                               \
481
  (COP0_REG_P (REGNO) ? '0' : COP2_REG_P (REGNO) ? '2'                  \
482
   : COP3_REG_P (REGNO) ? '3' : '?')
483
 
484
 
485
#define HARD_REGNO_NREGS(REGNO, MODE) riscv_hard_regno_nregs (REGNO, MODE)
486
 
487
#define HARD_REGNO_MODE_OK(REGNO, MODE)                                 \
488
  riscv_hard_regno_mode_ok[ (int)(MODE) ][ (REGNO) ]
489
 
490
#define MODES_TIEABLE_P(MODE1, MODE2)                                   \
491
  ((MODE1) == (MODE2) || (GET_MODE_CLASS (MODE1) == MODE_INT            \
492
                          && GET_MODE_CLASS (MODE2) == MODE_INT))
493
 
494
/* Use s0 as the frame pointer if it is so requested. */
495
#define HARD_FRAME_POINTER_REGNUM 8
496
#define STACK_POINTER_REGNUM 2
497
#define THREAD_POINTER_REGNUM 4
498
 
499
/* These two registers don't really exist: they get eliminated to either
500
   the stack or hard frame pointer.  */
501
#define ARG_POINTER_REGNUM 64
502
#define FRAME_POINTER_REGNUM 65
503
 
504
#define HARD_FRAME_POINTER_IS_FRAME_POINTER 0
505
#define HARD_FRAME_POINTER_IS_ARG_POINTER 0
506
 
507
/* Register in which static-chain is passed to a function.  */
508
#define STATIC_CHAIN_REGNUM GP_TEMP_FIRST
509
 
510
/* Registers used as temporaries in prologue/epilogue code.
511
 
512
   The prologue registers mustn't conflict with any
513
   incoming arguments, the static chain pointer, or the frame pointer.
514
   The epilogue temporary mustn't conflict with the return registers,
515
   the frame pointer, the EH stack adjustment, or the EH data registers. */
516
 
517
#define RISCV_PROLOGUE_TEMP_REGNUM (GP_TEMP_FIRST + 1)
518
#define RISCV_EPILOGUE_TEMP_REGNUM RISCV_PROLOGUE_TEMP_REGNUM
519
 
520
#define RISCV_PROLOGUE_TEMP(MODE) gen_rtx_REG (MODE, RISCV_PROLOGUE_TEMP_REGNUM)
521
#define RISCV_EPILOGUE_TEMP(MODE) gen_rtx_REG (MODE, RISCV_EPILOGUE_TEMP_REGNUM)
522
 
523
#define FUNCTION_PROFILER(STREAM, LABELNO)      \
524
{                                               \
525
    sorry ("profiler support for RISC-V");      \
526
}
527
 
528
/* Define this macro if it is as good or better to call a constant
529
   function address than to call an address kept in a register.  */
530
#define NO_FUNCTION_CSE 1
531
 
532
/* Define the classes of registers for register constraints in the
533
   machine description.  Also define ranges of constants.
534
 
535
   One of the classes must always be named ALL_REGS and include all hard regs.
536
   If there is more than one class, another class must be named NO_REGS
537
   and contain no registers.
538
 
539
   The name GENERAL_REGS must be the name of a class (or an alias for
540
   another name such as ALL_REGS).  This is the class of registers
541
   that is allowed by "g" or "r" in a register constraint.
542
   Also, registers outside this class are allocated only when
543
   instructions express preferences for them.
544
 
545
   The classes must be numbered in nondecreasing order; that is,
546
   a larger-numbered class must never be contained completely
547
   in a smaller-numbered class.
548
 
549
   For any two classes, it is very desirable that there be another
550
   class that represents their union.  */
551
 
552
enum reg_class
553
{
554
  NO_REGS,                      /* no registers in set */
555
  T_REGS,                       /* registers used by indirect sibcalls */
556
  JALR_REGS,                    /* registers used by indirect calls */
557
  GR_REGS,                      /* integer registers */
558
  FP_REGS,                      /* floating point registers */
559
  FRAME_REGS,                   /* $arg and $frame */
560
  ALL_REGS,                     /* all registers */
561
  LIM_REG_CLASSES               /* max value + 1 */
562
};
563
 
564
#define N_REG_CLASSES (int) LIM_REG_CLASSES
565
 
566
#define GENERAL_REGS GR_REGS
567
 
568
/* An initializer containing the names of the register classes as C
569
   string constants.  These names are used in writing some of the
570
   debugging dumps.  */
571
 
572
#define REG_CLASS_NAMES                                                 \
573
{                                                                       \
574
  "NO_REGS",                                                            \
575
  "T_REGS",                                                             \
576
  "JALR_REGS",                                                          \
577
  "GR_REGS",                                                            \
578
  "FP_REGS",                                                            \
579
  "FRAME_REGS",                                                         \
580
  "ALL_REGS"                                                            \
581
}
582
 
583
/* An initializer containing the contents of the register classes,
584
   as integers which are bit masks.  The Nth integer specifies the
585
   contents of class N.  The way the integer MASK is interpreted is
586
   that register R is in the class if `MASK & (1 << R)' is 1.
587
 
588
   When the machine has more than 32 registers, an integer does not
589
   suffice.  Then the integers are replaced by sub-initializers,
590
   braced groupings containing several integers.  Each
591
   sub-initializer must be suitable as an initializer for the type
592
   `HARD_REG_SET' which is defined in `hard-reg-set.h'.  */
593
 
594
#define REG_CLASS_CONTENTS                                                                      \
595
{                                                                                               \
596
  { 0x00000000, 0x00000000, 0x00000000 },       /* NO_REGS */           \
597
  { 0xf0000040, 0x00000000, 0x00000000 },       /* T_REGS */            \
598
  { 0xffffff40, 0x00000000, 0x00000000 },       /* JALR_REGS */         \
599
  { 0xffffffff, 0x00000000, 0x00000000 },       /* GR_REGS */           \
600
  { 0x00000000, 0xffffffff, 0x00000000 },       /* FP_REGS */           \
601
  { 0x00000000, 0x00000000, 0x00000003 },       /* FRAME_REGS */        \
602
  { 0xffffffff, 0xffffffff, 0x00000003 }        /* ALL_REGS */          \
603
}
604
 
605
/* A C expression whose value is a register class containing hard
606
   register REGNO.  In general there is more that one such class;
607
   choose a class which is "minimal", meaning that no smaller class
608
   also contains the register.  */
609
 
610
#define REGNO_REG_CLASS(REGNO) riscv_regno_to_class[ (REGNO) ]
611
 
612
/* A macro whose definition is the name of the class to which a
613
   valid base register must belong.  A base register is one used in
614
   an address which is the register value plus a displacement.  */
615
 
616
#define BASE_REG_CLASS GR_REGS
617
 
618
/* A macro whose definition is the name of the class to which a
619
   valid index register must belong.  An index register is one used
620
   in an address where its value is either multiplied by a scale
621
   factor or added to another register (as well as added to a
622
   displacement).  */
623
 
624
#define INDEX_REG_CLASS NO_REGS
625
 
626
/* We generally want to put call-clobbered registers ahead of
627
   call-saved ones.  (IRA expects this.)  */
628
 
629
#define REG_ALLOC_ORDER                                                 \
630
{ \
631
  /* Call-clobbered GPRs.  */                                           \
632
  15, 14, 13, 12, 11, 10, 16, 17, 6, 28, 29, 30, 31, 5, 7, 1,           \
633
  /* Call-saved GPRs.  */                                               \
634
  8, 9, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,                         \
635
  /* GPRs that can never be exposed to the register allocator.  */      \
636
  0, 2, 3, 4,                                                           \
637
  /* Call-clobbered FPRs.  */                                           \
638
  47, 46, 45, 44, 43, 42, 32, 33, 34, 35, 36, 37, 38, 39, 48, 49,       \
639
  60, 61, 62, 63,                                                       \
640
  /* Call-saved FPRs.  */                                               \
641
  40, 41, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,                       \
642
  /* None of the remaining classes have defined call-saved              \
643
     registers.  */                                                     \
644
  64, 65                                                                \
645
}
646
 
647
/* True if VALUE is a signed 16-bit number.  */
648
 
649
#define SMALL_OPERAND(VALUE) \
650
  ((unsigned HOST_WIDE_INT) (VALUE) + IMM_REACH/2 < IMM_REACH)
651
 
652
/* True if VALUE can be loaded into a register using LUI.  */
653
 
654
#define LUI_OPERAND(VALUE)                                              \
655
  (((VALUE) | ((1UL<<31) - IMM_REACH)) == ((1UL<<31) - IMM_REACH)       \
656
   || ((VALUE) | ((1UL<<31) - IMM_REACH)) + IMM_REACH == 0)
657
 
658
/* Return a value X with the low 16 bits clear, and such that
659
   VALUE - X is a signed 16-bit value.  */
660
 
661
#define SMALL_INT(X) SMALL_OPERAND (INTVAL (X))
662
#define LUI_INT(X) LUI_OPERAND (INTVAL (X))
663
 
664
/* The HI and LO registers can only be reloaded via the general
665
   registers.  Condition code registers can only be loaded to the
666
   general registers, and from the floating point registers.  */
667
 
668
#define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X)                    \
669
  riscv_secondary_reload_class (CLASS, MODE, X, true)
670
#define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X)                   \
671
  riscv_secondary_reload_class (CLASS, MODE, X, false)
672
 
673
/* Return the maximum number of consecutive registers
674
   needed to represent mode MODE in a register of class CLASS.  */
675
 
676
#define CLASS_MAX_NREGS(CLASS, MODE) riscv_class_max_nregs (CLASS, MODE)
677
 
678
/* It is undefined to interpret an FP register in a different format than
679
   that which it was created to be. */
680
 
681
#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \
682
  reg_classes_intersect_p (FP_REGS, CLASS)
683
 
684
/* Stack layout; function entry, exit and calling.  */
685
 
686
#define STACK_GROWS_DOWNWARD
687
 
688
#define FRAME_GROWS_DOWNWARD 1
689
 
690
#define STARTING_FRAME_OFFSET 0
691
 
692
#define RETURN_ADDR_RTX riscv_return_addr
693
 
694
#define ELIMINABLE_REGS                                                 \
695
{{ ARG_POINTER_REGNUM,   STACK_POINTER_REGNUM},                         \
696
 { ARG_POINTER_REGNUM,   HARD_FRAME_POINTER_REGNUM},                    \
697
 { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM},                         \
698
 { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}}                            \
699
 
700
#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
701
  (OFFSET) = riscv_initial_elimination_offset (FROM, TO)
702
 
703
/* Allocate stack space for arguments at the beginning of each function.  */
704
#define ACCUMULATE_OUTGOING_ARGS 1
705
 
706
/* The argument pointer always points to the first argument.  */
707
#define FIRST_PARM_OFFSET(FNDECL) 0
708
 
709
#define REG_PARM_STACK_SPACE(FNDECL) 0
710
 
711
/* Define this if it is the responsibility of the caller to
712
   allocate the area reserved for arguments passed in registers.
713
   If `ACCUMULATE_OUTGOING_ARGS' is also defined, the only effect
714
   of this macro is to determine whether the space is included in
715
   `crtl->outgoing_args_size'.  */
716
#define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 1
717
 
718
#define STACK_BOUNDARY 128
719
 
720
/* Symbolic macros for the registers used to return integer and floating
721
   point values.  */
722
 
723
#define GP_RETURN GP_ARG_FIRST
724
#define FP_RETURN ((TARGET_SOFT_FLOAT) ? GP_RETURN : FP_ARG_FIRST)
725
 
726
#define MAX_ARGS_IN_REGISTERS 8
727
 
728
/* Symbolic macros for the first/last argument registers.  */
729
 
730
#define GP_ARG_FIRST (GP_REG_FIRST + 10)
731
#define GP_ARG_LAST  (GP_ARG_FIRST + MAX_ARGS_IN_REGISTERS - 1)
732
#define GP_TEMP_FIRST (GP_REG_FIRST + 5)
733
#define FP_ARG_FIRST (FP_REG_FIRST + 10)
734
#define FP_ARG_LAST  (FP_ARG_FIRST + MAX_ARGS_IN_REGISTERS - 1)
735
 
736
#define CALLEE_SAVED_REG_NUMBER(REGNO)                  \
737
  ((REGNO) >= 8 && (REGNO) <= 9 ? (REGNO) - 8 :         \
738
   (REGNO) >= 18 && (REGNO) <= 27 ? (REGNO) - 16 : -1)
739
 
740
#define LIBCALL_VALUE(MODE) \
741
  riscv_function_value (NULL_TREE, NULL_TREE, MODE)
742
 
743
#define FUNCTION_VALUE(VALTYPE, FUNC) \
744
  riscv_function_value (VALTYPE, FUNC, VOIDmode)
745
 
746
#define FUNCTION_VALUE_REGNO_P(N) ((N) == GP_RETURN || (N) == FP_RETURN)
747
 
748
/* 1 if N is a possible register number for function argument passing.
749
   We have no FP argument registers when soft-float.  When FP registers
750
   are 32 bits, we can't directly reference the odd numbered ones.  */
751
 
752
/* Accept arguments in a0-a7 and/or fa0-fa7. */
753
#define FUNCTION_ARG_REGNO_P(N)                                 \
754
  (IN_RANGE((N), GP_ARG_FIRST, GP_ARG_LAST)                     \
755
   || IN_RANGE((N), FP_ARG_FIRST, FP_ARG_LAST))
756
 
757
/* The ABI views the arguments as a structure, of which the first 8
758
   words go in registers and the rest go on the stack.  If I < 8, N, the Ith
759
   word might go in the Ith integer argument register or the Ith
760
   floating-point argument register. */
761
 
762
typedef struct {
763
  /* Number of integer registers used so far, up to MAX_ARGS_IN_REGISTERS. */
764
  unsigned int num_gprs;
765
 
766
  /* Number of words passed on the stack.  */
767
  unsigned int stack_words;
768
} CUMULATIVE_ARGS;
769
 
770
/* Initialize a variable CUM of type CUMULATIVE_ARGS
771
   for a call to a function whose data type is FNTYPE.
772
   For a library call, FNTYPE is 0.  */
773
 
774
#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \
775
  memset (&(CUM), 0, sizeof (CUM))
776
 
777
#define EPILOGUE_USES(REGNO)    ((REGNO) == RETURN_ADDR_REGNUM)
778
 
779
/* ABI requires 16-byte alignment, even on ven on RV32. */
780
#define RISCV_STACK_ALIGN(LOC) (((LOC) + 15) & -16)
781
 
782
#define NO_PROFILE_COUNTERS 1
783
 
784
/* Define this macro if the code for function profiling should come
785
   before the function prologue.  Normally, the profiling code comes
786
   after.  */
787
 
788
/* #define PROFILE_BEFORE_PROLOGUE */
789
 
790
/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
791
   the stack pointer does not matter.  The value is tested only in
792
   functions that have frame pointers.
793
   No definition is equivalent to always zero.  */
794
 
795
#define EXIT_IGNORE_STACK 1
796
 
797
 
798
/* Trampolines are a block of code followed by two pointers.  */
799
 
800
#define TRAMPOLINE_CODE_SIZE 16
801
#define TRAMPOLINE_SIZE (TRAMPOLINE_CODE_SIZE + POINTER_SIZE * 2)
802
#define TRAMPOLINE_ALIGNMENT POINTER_SIZE
803
 
804
/* Addressing modes, and classification of registers for them.  */
805
 
806
#define REGNO_OK_FOR_INDEX_P(REGNO) 0
807
#define REGNO_MODE_OK_FOR_BASE_P(REGNO, MODE) \
808
  riscv_regno_mode_ok_for_base_p (REGNO, MODE, 1)
809
 
810
/* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
811
   and check its validity for a certain class.
812
   We have two alternate definitions for each of them.
813
   The usual definition accepts all pseudo regs; the other rejects them all.
814
   The symbol REG_OK_STRICT causes the latter definition to be used.
815
 
816
   Most source files want to accept pseudo regs in the hope that
817
   they will get allocated to the class that the insn wants them to be in.
818
   Some source files that are used after register allocation
819
   need to be strict.  */
820
 
821
#ifndef REG_OK_STRICT
822
#define REG_MODE_OK_FOR_BASE_P(X, MODE) \
823
  riscv_regno_mode_ok_for_base_p (REGNO (X), MODE, 0)
824
#else
825
#define REG_MODE_OK_FOR_BASE_P(X, MODE) \
826
  riscv_regno_mode_ok_for_base_p (REGNO (X), MODE, 1)
827
#endif
828
 
829
#define REG_OK_FOR_INDEX_P(X) 0
830
 
831
 
832
/* Maximum number of registers that can appear in a valid memory address.  */
833
 
834
#define MAX_REGS_PER_ADDRESS 1
835
 
836
#define CONSTANT_ADDRESS_P(X) \
837
  (CONSTANT_P (X) && memory_address_p (SImode, X))
838
 
839
/* This handles the magic '..CURRENT_FUNCTION' symbol, which means
840
   'the start of the function that this code is output in'.  */
841
 
842
#define ASM_OUTPUT_LABELREF(FILE,NAME)  \
843
  if (strcmp (NAME, "..CURRENT_FUNCTION") == 0)                         \
844
    asm_fprintf ((FILE), "%U%s",                                        \
845
                 XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \
846
  else                                                                  \
847
    asm_fprintf ((FILE), "%U%s", (NAME))
848
 
849
/* This flag marks functions that cannot be lazily bound.  */
850
#define SYMBOL_FLAG_BIND_NOW (SYMBOL_FLAG_MACH_DEP << 1)
851
#define SYMBOL_REF_BIND_NOW_P(RTX) \
852
  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_BIND_NOW) != 0)
853
 
854
#define JUMP_TABLES_IN_TEXT_SECTION 0
855
#define CASE_VECTOR_MODE SImode
856
#define CASE_VECTOR_PC_RELATIVE (riscv_cmodel != CM_MEDLOW)
857
 
858
/* Define this as 1 if `char' should by default be signed; else as 0.  */
859
#define DEFAULT_SIGNED_CHAR 0
860
 
861
/* Consider using fld/fsd to move 8 bytes at a time for RV32IFD. */
862
#define MOVE_MAX UNITS_PER_WORD
863
#define MAX_MOVE_MAX 8
864
 
865
#define SLOW_BYTE_ACCESS 0
866
 
867
#define SHIFT_COUNT_TRUNCATED 1
868
 
869
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
870
   is done just by pretending it is already truncated.  */
871
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) \
872
  (TARGET_64BIT ? ((INPREC) <= 32 || (OUTPREC) < 32) : 1)
873
 
874
/* Specify the machine mode that pointers have.
875
   After generation of rtl, the compiler makes no further distinction
876
   between pointers and any other objects of this machine mode.  */
877
 
878
#ifndef Pmode
879
#define Pmode (TARGET_64BIT ? DImode : SImode)
880
#endif
881
 
882
/* Give call MEMs SImode since it is the "most permissive" mode
883
   for both 32-bit and 64-bit targets.  */
884
 
885
#define FUNCTION_MODE SImode
886
 
887
/* A C expression for the cost of a branch instruction.  A value of 2
888
   seems to minimize code size.  */
889
 
890
#define BRANCH_COST(speed_p, predictable_p) \
891
  ((!(speed_p) || (predictable_p)) ? 2 : riscv_branch_cost)
892
 
893
#define LOGICAL_OP_NON_SHORT_CIRCUIT 0
894
 
895
/* Control the assembler format that we output.  */
896
 
897
/* Output to assembler file text saying following lines
898
   may contain character constants, extra white space, comments, etc.  */
899
 
900
#ifndef ASM_APP_ON
901
#define ASM_APP_ON " #APP\n"
902
#endif
903
 
904
/* Output to assembler file text saying following lines
905
   no longer contain unusual constructs.  */
906
 
907
#ifndef ASM_APP_OFF
908
#define ASM_APP_OFF " #NO_APP\n"
909
#endif
910
 
911
#define REGISTER_NAMES                                          \
912
{ "zero","ra",  "sp",  "gp",  "tp",  "t0",  "t1",  "t2",        \
913
  "s0",  "s1",  "a0",  "a1",  "a2",  "a3",  "a4",  "a5",        \
914
  "a6",  "a7",  "s2",  "s3",  "s4",  "s5",  "s6",  "s7",        \
915
  "s8",  "s9",  "s10", "s11", "t3",  "t4",  "t5",  "t6",        \
916
  "ft0", "ft1", "ft2", "ft3", "ft4", "ft5", "ft6", "ft7",       \
917
  "fs0", "fs1", "fa0", "fa1", "fa2", "fa3", "fa4", "fa5",       \
918
  "fa6", "fa7", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7",       \
919
  "fs8", "fs9", "fs10","fs11","ft8", "ft9", "ft10","ft11",      \
920
  "arg", "frame", }
921
 
922
#define ADDITIONAL_REGISTER_NAMES                                       \
923
{                                                                       \
924
  { "x0",        0 + GP_REG_FIRST },                                     \
925
  { "x1",        1 + GP_REG_FIRST },                                    \
926
  { "x2",        2 + GP_REG_FIRST },                                    \
927
  { "x3",        3 + GP_REG_FIRST },                                    \
928
  { "x4",        4 + GP_REG_FIRST },                                    \
929
  { "x5",        5 + GP_REG_FIRST },                                    \
930
  { "x6",        6 + GP_REG_FIRST },                                    \
931
  { "x7",        7 + GP_REG_FIRST },                                    \
932
  { "x8",        8 + GP_REG_FIRST },                                    \
933
  { "x9",        9 + GP_REG_FIRST },                                    \
934
  { "x10",      10 + GP_REG_FIRST },                                    \
935
  { "x11",      11 + GP_REG_FIRST },                                    \
936
  { "x12",      12 + GP_REG_FIRST },                                    \
937
  { "x13",      13 + GP_REG_FIRST },                                    \
938
  { "x14",      14 + GP_REG_FIRST },                                    \
939
  { "x15",      15 + GP_REG_FIRST },                                    \
940
  { "x16",      16 + GP_REG_FIRST },                                    \
941
  { "x17",      17 + GP_REG_FIRST },                                    \
942
  { "x18",      18 + GP_REG_FIRST },                                    \
943
  { "x19",      19 + GP_REG_FIRST },                                    \
944
  { "x20",      20 + GP_REG_FIRST },                                    \
945
  { "x21",      21 + GP_REG_FIRST },                                    \
946
  { "x22",      22 + GP_REG_FIRST },                                    \
947
  { "x23",      23 + GP_REG_FIRST },                                    \
948
  { "x24",      24 + GP_REG_FIRST },                                    \
949
  { "x25",      25 + GP_REG_FIRST },                                    \
950
  { "x26",      26 + GP_REG_FIRST },                                    \
951
  { "x27",      27 + GP_REG_FIRST },                                    \
952
  { "x28",      28 + GP_REG_FIRST },                                    \
953
  { "x29",      29 + GP_REG_FIRST },                                    \
954
  { "x30",      30 + GP_REG_FIRST },                                    \
955
  { "x31",      31 + GP_REG_FIRST },                                    \
956
  { "f0",        0 + FP_REG_FIRST },                                     \
957
  { "f1",        1 + FP_REG_FIRST },                                    \
958
  { "f2",        2 + FP_REG_FIRST },                                    \
959
  { "f3",        3 + FP_REG_FIRST },                                    \
960
  { "f4",        4 + FP_REG_FIRST },                                    \
961
  { "f5",        5 + FP_REG_FIRST },                                    \
962
  { "f6",        6 + FP_REG_FIRST },                                    \
963
  { "f7",        7 + FP_REG_FIRST },                                    \
964
  { "f8",        8 + FP_REG_FIRST },                                    \
965
  { "f9",        9 + FP_REG_FIRST },                                    \
966
  { "f10",      10 + FP_REG_FIRST },                                    \
967
  { "f11",      11 + FP_REG_FIRST },                                    \
968
  { "f12",      12 + FP_REG_FIRST },                                    \
969
  { "f13",      13 + FP_REG_FIRST },                                    \
970
  { "f14",      14 + FP_REG_FIRST },                                    \
971
  { "f15",      15 + FP_REG_FIRST },                                    \
972
  { "f16",      16 + FP_REG_FIRST },                                    \
973
  { "f17",      17 + FP_REG_FIRST },                                    \
974
  { "f18",      18 + FP_REG_FIRST },                                    \
975
  { "f19",      19 + FP_REG_FIRST },                                    \
976
  { "f20",      20 + FP_REG_FIRST },                                    \
977
  { "f21",      21 + FP_REG_FIRST },                                    \
978
  { "f22",      22 + FP_REG_FIRST },                                    \
979
  { "f23",      23 + FP_REG_FIRST },                                    \
980
  { "f24",      24 + FP_REG_FIRST },                                    \
981
  { "f25",      25 + FP_REG_FIRST },                                    \
982
  { "f26",      26 + FP_REG_FIRST },                                    \
983
  { "f27",      27 + FP_REG_FIRST },                                    \
984
  { "f28",      28 + FP_REG_FIRST },                                    \
985
  { "f29",      29 + FP_REG_FIRST },                                    \
986
  { "f30",      30 + FP_REG_FIRST },                                    \
987
  { "f31",      31 + FP_REG_FIRST },                                    \
988
}
989
 
990
/* Globalizing directive for a label.  */
991
#define GLOBAL_ASM_OP "\t.globl\t"
992
 
993
/* This is how to store into the string LABEL
994
   the symbol_ref name of an internal numbered label where
995
   PREFIX is the class of label and NUM is the number within the class.
996
   This is suitable for output with `assemble_name'.  */
997
 
998
#undef ASM_GENERATE_INTERNAL_LABEL
999
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)                   \
1000
  sprintf ((LABEL), "*%s%s%ld", (LOCAL_LABEL_PREFIX), (PREFIX), (long)(NUM))
1001
 
1002
/* This is how to output an element of a case-vector that is absolute.  */
1003
 
1004
#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE)                          \
1005
  fprintf (STREAM, "\t.word\t%sL%d\n", LOCAL_LABEL_PREFIX, VALUE)
1006
 
1007
/* This is how to output an element of a PIC case-vector. */
1008
 
1009
#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL)              \
1010
  fprintf (STREAM, "\t.word\t%sL%d-%sL%d\n",                            \
1011
           LOCAL_LABEL_PREFIX, VALUE, LOCAL_LABEL_PREFIX, REL)
1012
 
1013
/* This is how to output an assembler line
1014
   that says to advance the location counter
1015
   to a multiple of 2**LOG bytes.  */
1016
 
1017
#define ASM_OUTPUT_ALIGN(STREAM,LOG)                                    \
1018
  fprintf (STREAM, "\t.align\t%d\n", (LOG))
1019
 
1020
/* Define the strings to put out for each section in the object file.  */
1021
#define TEXT_SECTION_ASM_OP     "\t.text"       /* instructions */
1022
#define DATA_SECTION_ASM_OP     "\t.data"       /* large data */
1023
#define READONLY_DATA_SECTION_ASM_OP    "\t.section\t.rodata"
1024
#define BSS_SECTION_ASM_OP      "\t.bss"
1025
#define SBSS_SECTION_ASM_OP     "\t.section\t.sbss,\"aw\",@nobits"
1026
#define SDATA_SECTION_ASM_OP    "\t.section\t.sdata,\"aw\",@progbits"
1027
 
1028
#define ASM_OUTPUT_REG_PUSH(STREAM,REGNO)                               \
1029
do                                                                      \
1030
  {                                                                     \
1031
    fprintf (STREAM, "\taddi\t%s,%s,-8\n\t%s\t%s,0(%s)\n",              \
1032
             reg_names[STACK_POINTER_REGNUM],                           \
1033
             reg_names[STACK_POINTER_REGNUM],                           \
1034
             TARGET_64BIT ? "sd" : "sw",                                \
1035
             reg_names[REGNO],                                          \
1036
             reg_names[STACK_POINTER_REGNUM]);                          \
1037
  }                                                                     \
1038
while (0)
1039
 
1040
#define ASM_OUTPUT_REG_POP(STREAM,REGNO)                                \
1041
do                                                                      \
1042
  {                                                                     \
1043
    fprintf (STREAM, "\t%s\t%s,0(%s)\n\taddi\t%s,%s,8\n",               \
1044
             TARGET_64BIT ? "ld" : "lw",                                \
1045
             reg_names[REGNO],                                          \
1046
             reg_names[STACK_POINTER_REGNUM],                           \
1047
             reg_names[STACK_POINTER_REGNUM],                           \
1048
             reg_names[STACK_POINTER_REGNUM]);                          \
1049
  }                                                                     \
1050
while (0)
1051
 
1052
#define ASM_COMMENT_START "#"
1053
 
1054
#undef SIZE_TYPE
1055
#define SIZE_TYPE (POINTER_SIZE == 64 ? "long unsigned int" : "unsigned int")
1056
 
1057
#undef PTRDIFF_TYPE
1058
#define PTRDIFF_TYPE (POINTER_SIZE == 64 ? "long int" : "int")
1059
 
1060
/* The maximum number of bytes that can be copied by one iteration of
1061
   a movmemsi loop; see riscv_block_move_loop.  */
1062
#define RISCV_MAX_MOVE_BYTES_PER_LOOP_ITER (UNITS_PER_WORD * 4)
1063
 
1064
/* The maximum number of bytes that can be copied by a straight-line
1065
   implementation of movmemsi; see riscv_block_move_straight.  We want
1066
   to make sure that any loop-based implementation will iterate at
1067
   least twice.  */
1068
#define RISCV_MAX_MOVE_BYTES_STRAIGHT (RISCV_MAX_MOVE_BYTES_PER_LOOP_ITER * 2)
1069
 
1070
/* The base cost of a memcpy call, for MOVE_RATIO and friends. */
1071
 
1072
#define RISCV_CALL_RATIO 6
1073
 
1074
/* Any loop-based implementation of movmemsi will have at least
1075
   RISCV_MAX_MOVE_BYTES_STRAIGHT / UNITS_PER_WORD memory-to-memory
1076
   moves, so allow individual copies of fewer elements.
1077
 
1078
   When movmemsi is not available, use a value approximating
1079
   the length of a memcpy call sequence, so that move_by_pieces
1080
   will generate inline code if it is shorter than a function call.
1081
   Since move_by_pieces_ninsns counts memory-to-memory moves, but
1082
   we'll have to generate a load/store pair for each, halve the
1083
   value of RISCV_CALL_RATIO to take that into account.  */
1084
 
1085
#define MOVE_RATIO(speed)                               \
1086
  (HAVE_movmemsi                                        \
1087
   ? RISCV_MAX_MOVE_BYTES_STRAIGHT / MOVE_MAX           \
1088
   : RISCV_CALL_RATIO / 2)
1089
 
1090
/* For CLEAR_RATIO, when optimizing for size, give a better estimate
1091
   of the length of a memset call, but use the default otherwise.  */
1092
 
1093
#define CLEAR_RATIO(speed)\
1094
  ((speed) ? 15 : RISCV_CALL_RATIO)
1095
 
1096
/* This is similar to CLEAR_RATIO, but for a non-zero constant, so when
1097
   optimizing for size adjust the ratio to account for the overhead of
1098
   loading the constant and replicating it across the word.  */
1099
 
1100
#define SET_RATIO(speed) \
1101
  ((speed) ? 15 : RISCV_CALL_RATIO - 2)
1102
 
1103
#ifndef HAVE_AS_TLS
1104
#define HAVE_AS_TLS 0
1105
#endif
1106
 
1107
#ifndef USED_FOR_TARGET
1108
 
1109
extern const enum reg_class riscv_regno_to_class[];
1110
extern bool riscv_hard_regno_mode_ok[][FIRST_PSEUDO_REGISTER];
1111
extern const char* riscv_hi_relocs[];
1112
#endif
1113
 
1114
#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
1115
  (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4)
1116
 
1117
/* ISA constants needed for code generation.  */
1118
#define OPCODE_LW    0x2003
1119
#define OPCODE_LD    0x3003
1120
#define OPCODE_AUIPC 0x17
1121
#define OPCODE_JALR  0x67
1122
#define SHIFT_RD  7
1123
#define SHIFT_RS1 15
1124
#define SHIFT_IMM 20
1125
#define IMM_BITS 12
1126
 
1127
#define IMM_REACH (1LL << IMM_BITS)
1128
#define CONST_HIGH_PART(VALUE) (((VALUE) + (IMM_REACH/2)) & ~(IMM_REACH-1))
1129
#define CONST_LOW_PART(VALUE) ((VALUE) - CONST_HIGH_PART (VALUE))

powered by: WebSVN 2.1.0

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