Home | History | Annotate | Line # | Download | only in gcn
gcn.h revision 1.1
      1  1.1  mrg /* Copyright (C) 2016-2019 Free Software Foundation, Inc.
      2  1.1  mrg 
      3  1.1  mrg    This file is free software; you can redistribute it and/or modify it under
      4  1.1  mrg    the terms of the GNU General Public License as published by the Free
      5  1.1  mrg    Software Foundation; either version 3 of the License, or (at your option)
      6  1.1  mrg    any later version.
      7  1.1  mrg 
      8  1.1  mrg    This file is distributed in the hope that it will be useful, but WITHOUT
      9  1.1  mrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     10  1.1  mrg    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     11  1.1  mrg    for more details.
     12  1.1  mrg 
     13  1.1  mrg    You should have received a copy of the GNU General Public License
     14  1.1  mrg    along with GCC; see the file COPYING3.  If not see
     15  1.1  mrg    <http://www.gnu.org/licenses/>.  */
     16  1.1  mrg 
     17  1.1  mrg #include "config/gcn/gcn-opts.h"
     18  1.1  mrg 
     19  1.1  mrg #define TARGET_CPU_CPP_BUILTINS()	\
     20  1.1  mrg   do					\
     21  1.1  mrg     {					\
     22  1.1  mrg       builtin_define ("__AMDGCN__");	\
     23  1.1  mrg       if (TARGET_GCN3)			\
     24  1.1  mrg 	builtin_define ("__GCN3__");	\
     25  1.1  mrg       else if (TARGET_GCN5)		\
     26  1.1  mrg 	builtin_define ("__GCN5__");	\
     27  1.1  mrg     }					\
     28  1.1  mrg   while(0)
     29  1.1  mrg 
     30  1.1  mrg /* Support for a compile-time default architecture and tuning.
     31  1.1  mrg    The rules are:
     32  1.1  mrg    --with-arch is ignored if -march is specified.
     33  1.1  mrg    --with-tune is ignored if -mtune is specified.  */
     34  1.1  mrg #define OPTION_DEFAULT_SPECS		    \
     35  1.1  mrg   {"arch", "%{!march=*:-march=%(VALUE)}" }, \
     36  1.1  mrg   {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }
     37  1.1  mrg 
     38  1.1  mrg /* Default target_flags if no switches specified.  */
     39  1.1  mrg #ifndef TARGET_DEFAULT
     40  1.1  mrg #define TARGET_DEFAULT 0
     41  1.1  mrg #endif
     42  1.1  mrg 
     43  1.1  mrg 
     44  1.1  mrg /* Storage Layout */
     46  1.1  mrg #define BITS_BIG_ENDIAN  0
     47  1.1  mrg #define BYTES_BIG_ENDIAN 0
     48  1.1  mrg #define WORDS_BIG_ENDIAN 0
     49  1.1  mrg 
     50  1.1  mrg #define BITS_PER_WORD 32
     51  1.1  mrg #define UNITS_PER_WORD (BITS_PER_WORD/BITS_PER_UNIT)
     52  1.1  mrg #define LIBGCC2_UNITS_PER_WORD 4
     53  1.1  mrg 
     54  1.1  mrg #define POINTER_SIZE	     64
     55  1.1  mrg #define PARM_BOUNDARY	     64
     56  1.1  mrg #define STACK_BOUNDARY	     64
     57  1.1  mrg #define FUNCTION_BOUNDARY    32
     58  1.1  mrg #define BIGGEST_ALIGNMENT    64
     59  1.1  mrg #define EMPTY_FIELD_BOUNDARY 32
     60  1.1  mrg #define MAX_FIXED_MODE_SIZE  64
     61  1.1  mrg #define MAX_REGS_PER_ADDRESS 2
     62  1.1  mrg #define STACK_SIZE_MODE      DImode
     63  1.1  mrg #define Pmode		     DImode
     64  1.1  mrg #define CASE_VECTOR_MODE     DImode
     65  1.1  mrg #define FUNCTION_MODE	     QImode
     66  1.1  mrg 
     67  1.1  mrg #define DATA_ALIGNMENT(TYPE,ALIGN) ((ALIGN) > 128 ? (ALIGN) : 128)
     68  1.1  mrg #define LOCAL_ALIGNMENT(TYPE,ALIGN) ((ALIGN) > 64 ? (ALIGN) : 64)
     69  1.1  mrg #define STACK_SLOT_ALIGNMENT(TYPE,MODE,ALIGN) ((ALIGN) > 64 ? (ALIGN) : 64)
     70  1.1  mrg #define STRICT_ALIGNMENT 1
     71  1.1  mrg 
     72  1.1  mrg /* Type Layout: match what x86_64 does.  */
     73  1.1  mrg #define INT_TYPE_SIZE		  32
     74  1.1  mrg #define LONG_TYPE_SIZE		  64
     75  1.1  mrg #define LONG_LONG_TYPE_SIZE	  64
     76  1.1  mrg #define FLOAT_TYPE_SIZE		  32
     77  1.1  mrg #define DOUBLE_TYPE_SIZE	  64
     78  1.1  mrg #define LONG_DOUBLE_TYPE_SIZE	  64
     79  1.1  mrg #define DEFAULT_SIGNED_CHAR	  1
     80  1.1  mrg #define PCC_BITFIELD_TYPE_MATTERS 1
     81  1.1  mrg 
     82  1.1  mrg /* Frame Layout */
     83  1.1  mrg #define FRAME_GROWS_DOWNWARD	     0
     84  1.1  mrg #define ARGS_GROW_DOWNWARD	     1
     85  1.1  mrg #define STACK_POINTER_OFFSET	     0
     86  1.1  mrg #define FIRST_PARM_OFFSET(FNDECL)    0
     87  1.1  mrg #define DYNAMIC_CHAIN_ADDRESS(FP)    plus_constant (Pmode, (FP), -16)
     88  1.1  mrg #define INCOMING_RETURN_ADDR_RTX     gen_rtx_REG (Pmode, LINK_REGNUM)
     89  1.1  mrg #define STACK_DYNAMIC_OFFSET(FNDECL) (-crtl->outgoing_args_size)
     90  1.1  mrg #define ACCUMULATE_OUTGOING_ARGS     1
     91  1.1  mrg #define RETURN_ADDR_RTX(COUNT,FRAMEADDR) \
     92  1.1  mrg   ((COUNT) == 0 ? get_hard_reg_initial_val (Pmode, LINK_REGNUM) : NULL_RTX)
     93  1.1  mrg 
     94  1.1  mrg /* Register Basics */
     96  1.1  mrg #define FIRST_SGPR_REG	    0
     97  1.1  mrg #define SGPR_REGNO(N)	    ((N)+FIRST_SGPR_REG)
     98  1.1  mrg #define LAST_SGPR_REG	    101
     99  1.1  mrg 
    100  1.1  mrg #define FLAT_SCRATCH_REG    102
    101  1.1  mrg #define FLAT_SCRATCH_LO_REG 102
    102  1.1  mrg #define FLAT_SCRATCH_HI_REG 103
    103  1.1  mrg #define XNACK_MASK_REG	    104
    104  1.1  mrg #define XNACK_MASK_LO_REG   104
    105  1.1  mrg #define XNACK_MASK_HI_REG   105
    106  1.1  mrg #define VCC_LO_REG	    106
    107  1.1  mrg #define VCC_HI_REG	    107
    108  1.1  mrg #define VCCZ_REG	    108
    109  1.1  mrg #define TBA_REG		    109
    110  1.1  mrg #define TBA_LO_REG	    109
    111  1.1  mrg #define TBA_HI_REG	    110
    112  1.1  mrg #define TMA_REG		    111
    113  1.1  mrg #define TMA_LO_REG	    111
    114  1.1  mrg #define TMA_HI_REG	    112
    115  1.1  mrg #define TTMP0_REG	    113
    116  1.1  mrg #define TTMP11_REG	    124
    117  1.1  mrg #define M0_REG		    125
    118  1.1  mrg #define EXEC_REG	    126
    119  1.1  mrg #define EXEC_LO_REG	    126
    120  1.1  mrg #define EXEC_HI_REG	    127
    121  1.1  mrg #define EXECZ_REG	    128
    122  1.1  mrg #define SCC_REG		    129
    123  1.1  mrg /* 132-159 are reserved to simplify masks.  */
    124  1.1  mrg #define FIRST_VGPR_REG	    160
    125  1.1  mrg #define VGPR_REGNO(N)	    ((N)+FIRST_VGPR_REG)
    126  1.1  mrg #define LAST_VGPR_REG	    415
    127  1.1  mrg 
    128  1.1  mrg /* Frame Registers, and other registers */
    129  1.1  mrg 
    130  1.1  mrg #define HARD_FRAME_POINTER_REGNUM 14
    131  1.1  mrg #define STACK_POINTER_REGNUM	  16
    132  1.1  mrg #define LINK_REGNUM		  18
    133  1.1  mrg #define EXEC_SAVE_REG		  20
    134  1.1  mrg #define CC_SAVE_REG		  22
    135  1.1  mrg #define RETURN_VALUE_REG	  24	/* Must be divisible by 4.  */
    136  1.1  mrg #define STATIC_CHAIN_REGNUM	  30
    137  1.1  mrg #define WORK_ITEM_ID_Z_REG	  162
    138  1.1  mrg #define SOFT_ARG_REG		  416
    139  1.1  mrg #define FRAME_POINTER_REGNUM	  418
    140  1.1  mrg #define FIRST_PSEUDO_REGISTER	  420
    141  1.1  mrg 
    142  1.1  mrg #define FIRST_PARM_REG 24
    143  1.1  mrg #define NUM_PARM_REGS  6
    144  1.1  mrg 
    145  1.1  mrg /* There is no arg pointer.  Just choose random fixed register that does
    146  1.1  mrg    not intefere with anything.  */
    147  1.1  mrg #define ARG_POINTER_REGNUM SOFT_ARG_REG
    148  1.1  mrg 
    149  1.1  mrg #define HARD_FRAME_POINTER_IS_ARG_POINTER   0
    150  1.1  mrg #define HARD_FRAME_POINTER_IS_FRAME_POINTER 0
    151  1.1  mrg 
    152  1.1  mrg #define SGPR_OR_VGPR_REGNO_P(N) ((N)>=FIRST_VGPR_REG && (N) <= LAST_SGPR_REG)
    153  1.1  mrg #define SGPR_REGNO_P(N)		((N) <= LAST_SGPR_REG)
    154  1.1  mrg #define VGPR_REGNO_P(N)		((N)>=FIRST_VGPR_REG && (N) <= LAST_VGPR_REG)
    155  1.1  mrg #define SSRC_REGNO_P(N)		((N) <= SCC_REG && (N) != VCCZ_REG)
    156  1.1  mrg #define SDST_REGNO_P(N)		((N) <= EXEC_HI_REG && (N) != VCCZ_REG)
    157  1.1  mrg #define CC_REG_P(X)		(REG_P (X) && CC_REGNO_P (REGNO (X)))
    158  1.1  mrg #define CC_REGNO_P(X)		((X) == SCC_REG || (X) == VCC_REG)
    159  1.1  mrg #define FUNCTION_ARG_REGNO_P(N) \
    160  1.1  mrg   ((N) >= FIRST_PARM_REG && (N) < (FIRST_PARM_REG + NUM_PARM_REGS))
    161  1.1  mrg 
    162  1.1  mrg 
    163  1.1  mrg #define FIXED_REGISTERS {			    \
    165  1.1  mrg     /* Scalars.  */				    \
    166  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,		    \
    167  1.1  mrg /*		fp    sp    lr.  */		    \
    168  1.1  mrg     0, 0, 0, 0, 1, 1, 1, 1, 0, 0,		    \
    169  1.1  mrg /*  exec_save, cc_save */			    \
    170  1.1  mrg     1, 1, 1, 1, 0, 0, 0, 0, 0, 0,		    \
    171  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,		    \
    172  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,		    \
    173  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,		    \
    174  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,		    \
    175  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,		    \
    176  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,		    \
    177  1.1  mrg     0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,		    \
    178  1.1  mrg     /* Special regs and padding.  */		    \
    179  1.1  mrg /*  flat  xnack vcc	 tba   tma   ttmp */	    \
    180  1.1  mrg     1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
    181  1.1  mrg /*			 m0 exec     scc */	    \
    182  1.1  mrg     1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, \
    183  1.1  mrg     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
    184  1.1  mrg     1, 1, 1, 1, 1, 1, 1, 1, 1, 1,		    \
    185  1.1  mrg     /* VGRPs */					    \
    186  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    187  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    188  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    189  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    190  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    191  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    192  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    193  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    194  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    195  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    196  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    197  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    198  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    199  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    200  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    201  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    202  1.1  mrg     /* Other registers.  */			    \
    203  1.1  mrg     1, 1, 1, 1					    \
    204  1.1  mrg }
    205  1.1  mrg 
    206  1.1  mrg #define CALL_USED_REGISTERS {			    \
    207  1.1  mrg     /* Scalars.  */				    \
    208  1.1  mrg     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 		    \
    209  1.1  mrg     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 		    \
    210  1.1  mrg     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 		    \
    211  1.1  mrg     1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 		    \
    212  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 		    \
    213  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 		    \
    214  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 		    \
    215  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 		    \
    216  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 		    \
    217  1.1  mrg     0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,		    \
    218  1.1  mrg     /* Special regs and padding.  */		    \
    219  1.1  mrg     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
    220  1.1  mrg     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
    221  1.1  mrg     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
    222  1.1  mrg     1, 1, 1, 1, 1, 1, 1, 1, 1, 1,		    \
    223  1.1  mrg     /* VGRPs */					    \
    224  1.1  mrg     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
    225  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    226  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    227  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    228  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    229  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    230  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    231  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    232  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    233  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    234  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    235  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    236  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    237  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    238  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    239  1.1  mrg     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
    240  1.1  mrg     /* Other registers.  */			    \
    241  1.1  mrg     1, 1, 1, 1					    \
    242  1.1  mrg }
    243  1.1  mrg 
    244  1.1  mrg 
    245  1.1  mrg #define HARD_REGNO_RENAME_OK(FROM, TO) \
    247  1.1  mrg   gcn_hard_regno_rename_ok (FROM, TO)
    248  1.1  mrg 
    249  1.1  mrg #define HARD_REGNO_CALLER_SAVE_MODE(HARDREG, NREGS, MODE) \
    250  1.1  mrg   gcn_hard_regno_caller_save_mode ((HARDREG), (NREGS), (MODE))
    251  1.1  mrg 
    252  1.1  mrg /* Register Classes */
    253  1.1  mrg 
    254  1.1  mrg enum reg_class
    255  1.1  mrg {
    256  1.1  mrg   NO_REGS,
    257  1.1  mrg 
    258  1.1  mrg   /* SCC */
    259  1.1  mrg   SCC_CONDITIONAL_REG,
    260  1.1  mrg 
    261  1.1  mrg   /* VCCZ */
    262  1.1  mrg   VCCZ_CONDITIONAL_REG,
    263  1.1  mrg 
    264  1.1  mrg   /* VCC */
    265  1.1  mrg   VCC_CONDITIONAL_REG,
    266  1.1  mrg 
    267  1.1  mrg   /* EXECZ */
    268  1.1  mrg   EXECZ_CONDITIONAL_REG,
    269  1.1  mrg 
    270  1.1  mrg   /* SCC VCCZ EXECZ */
    271  1.1  mrg   ALL_CONDITIONAL_REGS,
    272  1.1  mrg 
    273  1.1  mrg   /* EXEC */
    274  1.1  mrg   EXEC_MASK_REG,
    275  1.1  mrg 
    276  1.1  mrg   /* SGPR0-101 */
    277  1.1  mrg   SGPR_REGS,
    278  1.1  mrg 
    279  1.1  mrg   /* SGPR0-101 EXEC_LO/EXEC_HI */
    280  1.1  mrg   SGPR_EXEC_REGS,
    281  1.1  mrg 
    282  1.1  mrg   /* SGPR0-101, FLAT_SCRATCH_LO/HI, VCC LO/HI, TBA LO/HI, TMA LO/HI, TTMP0-11,
    283  1.1  mrg      M0, VCCZ, SCC
    284  1.1  mrg      (EXEC_LO/HI, EXECZ excluded to prevent compiler misuse.)  */
    285  1.1  mrg   SGPR_VOP_SRC_REGS,
    286  1.1  mrg 
    287  1.1  mrg   /* SGPR0-101, FLAT_SCRATCH_LO/HI, XNACK_MASK_LO/HI, VCC LO/HI, TBA LO/HI
    288  1.1  mrg      TMA LO/HI, TTMP0-11 */
    289  1.1  mrg   SGPR_MEM_SRC_REGS,
    290  1.1  mrg 
    291  1.1  mrg   /* SGPR0-101, FLAT_SCRATCH_LO/HI, XNACK_MASK_LO/HI, VCC LO/HI, TBA LO/HI
    292  1.1  mrg      TMA LO/HI, TTMP0-11, M0, EXEC LO/HI */
    293  1.1  mrg   SGPR_DST_REGS,
    294  1.1  mrg 
    295  1.1  mrg   /* SGPR0-101, FLAT_SCRATCH_LO/HI, XNACK_MASK_LO/HI, VCC LO/HI, TBA LO/HI
    296  1.1  mrg      TMA LO/HI, TTMP0-11 */
    297  1.1  mrg   SGPR_SRC_REGS,
    298  1.1  mrg   GENERAL_REGS,
    299  1.1  mrg   VGPR_REGS,
    300  1.1  mrg   ALL_GPR_REGS,
    301  1.1  mrg   SRCDST_REGS,
    302  1.1  mrg   AFP_REGS,
    303  1.1  mrg   ALL_REGS,
    304  1.1  mrg   LIM_REG_CLASSES
    305  1.1  mrg };
    306  1.1  mrg 
    307  1.1  mrg #define N_REG_CLASSES (int) LIM_REG_CLASSES
    308  1.1  mrg 
    309  1.1  mrg #define REG_CLASS_NAMES     \
    310  1.1  mrg {  "NO_REGS",		    \
    311  1.1  mrg    "SCC_CONDITIONAL_REG",   \
    312  1.1  mrg    "VCCZ_CONDITIONAL_REG",  \
    313  1.1  mrg    "VCC_CONDITIONAL_REG",   \
    314  1.1  mrg    "EXECZ_CONDITIONAL_REG", \
    315  1.1  mrg    "ALL_CONDITIONAL_REGS",  \
    316  1.1  mrg    "EXEC_MASK_REG",	    \
    317  1.1  mrg    "SGPR_REGS",		    \
    318  1.1  mrg    "SGPR_EXEC_REGS",	    \
    319  1.1  mrg    "SGPR_VOP3A_SRC_REGS",   \
    320  1.1  mrg    "SGPR_MEM_SRC_REGS",     \
    321  1.1  mrg    "SGPR_DST_REGS",	    \
    322  1.1  mrg    "SGPR_SRC_REGS",	    \
    323  1.1  mrg    "GENERAL_REGS",	    \
    324  1.1  mrg    "VGPR_REGS",		    \
    325  1.1  mrg    "ALL_GPR_REGS",	    \
    326  1.1  mrg    "SRCDST_REGS",	    \
    327  1.1  mrg    "AFP_REGS",		    \
    328  1.1  mrg    "ALL_REGS"		    \
    329  1.1  mrg }
    330  1.1  mrg 
    331  1.1  mrg #define NAMED_REG_MASK(N)  (1<<((N)-3*32))
    332  1.1  mrg #define NAMED_REG_MASK2(N) (1<<((N)-4*32))
    333  1.1  mrg 
    334  1.1  mrg #define REG_CLASS_CONTENTS {						   \
    335  1.1  mrg     /* NO_REGS.  */							   \
    336  1.1  mrg     {0, 0, 0, 0,							   \
    337  1.1  mrg      0, 0, 0, 0,							   \
    338  1.1  mrg      0, 0, 0, 0, 0, 0},							   \
    339  1.1  mrg     /* SCC_CONDITIONAL_REG.  */						   \
    340  1.1  mrg     {0, 0, 0, 0,							   \
    341  1.1  mrg      NAMED_REG_MASK2 (SCC_REG), 0, 0, 0,				   \
    342  1.1  mrg      0, 0, 0, 0, 0},							   \
    343  1.1  mrg     /* VCCZ_CONDITIONAL_REG.  */					   \
    344  1.1  mrg     {0, 0, 0, NAMED_REG_MASK (VCCZ_REG),				   \
    345  1.1  mrg      0, 0, 0, 0,							   \
    346  1.1  mrg      0, 0, 0, 0, 0, 0},							   \
    347  1.1  mrg     /* VCC_CONDITIONAL_REG.  */						   \
    348  1.1  mrg     {0, 0, 0, NAMED_REG_MASK (VCC_LO_REG)|NAMED_REG_MASK (VCC_HI_REG),	   \
    349  1.1  mrg      0, 0, 0, 0,							   \
    350  1.1  mrg      0, 0, 0, 0, 0, 0},							   \
    351  1.1  mrg     /* EXECZ_CONDITIONAL_REG.  */					   \
    352  1.1  mrg     {0, 0, 0, 0,							   \
    353  1.1  mrg      NAMED_REG_MASK2 (EXECZ_REG), 0, 0, 0,				   \
    354  1.1  mrg      0, 0, 0, 0, 0},							   \
    355  1.1  mrg     /* ALL_CONDITIONAL_REGS.  */					   \
    356  1.1  mrg     {0, 0, 0, NAMED_REG_MASK (VCCZ_REG),				   \
    357  1.1  mrg      NAMED_REG_MASK2 (EXECZ_REG) | NAMED_REG_MASK2 (SCC_REG), 0, 0, 0,	   \
    358  1.1  mrg      0, 0, 0, 0, 0, 0},							   \
    359  1.1  mrg     /* EXEC_MASK_REG.  */						   \
    360  1.1  mrg     {0, 0, 0, NAMED_REG_MASK (EXEC_LO_REG) | NAMED_REG_MASK (EXEC_HI_REG), \
    361  1.1  mrg      0, 0, 0, 0,							   \
    362  1.1  mrg      0, 0, 0, 0, 0, 0},							   \
    363  1.1  mrg     /* SGPR_REGS.  */							   \
    364  1.1  mrg     {0xffffffff, 0xffffffff, 0xffffffff, 0xf1,				   \
    365  1.1  mrg      0, 0, 0, 0,							   \
    366  1.1  mrg      0, 0, 0, 0, 0, 0},							   \
    367  1.1  mrg     /* SGPR_EXEC_REGS.	*/						   \
    368  1.1  mrg     {0xffffffff, 0xffffffff, 0xffffffff,				   \
    369  1.1  mrg       0xf1 | NAMED_REG_MASK (EXEC_LO_REG) | NAMED_REG_MASK (EXEC_HI_REG),  \
    370  1.1  mrg      0, 0, 0, 0,							   \
    371  1.1  mrg      0, 0, 0, 0, 0, 0},							   \
    372  1.1  mrg     /* SGPR_VOP_SRC_REGS.  */						   \
    373  1.1  mrg     {0xffffffff, 0xffffffff, 0xffffffff,				   \
    374  1.1  mrg       0xffffffff							   \
    375  1.1  mrg        -NAMED_REG_MASK (EXEC_LO_REG)					   \
    376  1.1  mrg        -NAMED_REG_MASK (EXEC_HI_REG),					   \
    377  1.1  mrg      NAMED_REG_MASK2 (SCC_REG), 0, 0, 0,				   \
    378  1.1  mrg      0, 0, 0, 0, 0, 0},							   \
    379  1.1  mrg     /* SGPR_MEM_SRC_REGS.  */						   \
    380  1.1  mrg     {0xffffffff, 0xffffffff, 0xffffffff,				   \
    381  1.1  mrg      0xffffffff-NAMED_REG_MASK (VCCZ_REG)-NAMED_REG_MASK (M0_REG)	   \
    382  1.1  mrg      -NAMED_REG_MASK (EXEC_LO_REG)-NAMED_REG_MASK (EXEC_HI_REG),	   \
    383  1.1  mrg      0, 0, 0, 0,							   \
    384  1.1  mrg      0, 0, 0, 0, 0, 0},							   \
    385  1.1  mrg     /* SGPR_DST_REGS.  */						   \
    386  1.1  mrg     {0xffffffff, 0xffffffff, 0xffffffff,				   \
    387  1.1  mrg      0xffffffff-NAMED_REG_MASK (VCCZ_REG),				   \
    388  1.1  mrg      0, 0, 0, 0,							   \
    389  1.1  mrg      0, 0, 0, 0, 0, 0},							   \
    390  1.1  mrg     /* SGPR_SRC_REGS.  */						   \
    391  1.1  mrg     {0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,			   \
    392  1.1  mrg      NAMED_REG_MASK2 (EXECZ_REG) | NAMED_REG_MASK2 (SCC_REG), 0, 0, 0,	   \
    393  1.1  mrg      0, 0, 0, 0, 0, 0},							   \
    394  1.1  mrg     /* GENERAL_REGS.  */						   \
    395  1.1  mrg     {0xffffffff, 0xffffffff, 0xffffffff, 0xf1,				   \
    396  1.1  mrg      0, 0, 0, 0,							   \
    397  1.1  mrg      0, 0, 0, 0, 0, 0},							   \
    398  1.1  mrg     /* VGPR_REGS.  */							   \
    399  1.1  mrg     {0, 0, 0, 0,							   \
    400  1.1  mrg      0,		 0xffffffff, 0xffffffff, 0xffffffff,			   \
    401  1.1  mrg      0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0},	   \
    402  1.1  mrg     /* ALL_GPR_REGS.  */						   \
    403  1.1  mrg     {0xffffffff, 0xffffffff, 0xffffffff, 0xf1,				   \
    404  1.1  mrg      0,		 0xffffffff, 0xffffffff, 0xffffffff,			   \
    405  1.1  mrg      0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0},	   \
    406  1.1  mrg     /* SRCDST_REGS.  */							   \
    407  1.1  mrg     {0xffffffff, 0xffffffff, 0xffffffff,				   \
    408  1.1  mrg      0xffffffff-NAMED_REG_MASK (VCCZ_REG),				   \
    409  1.1  mrg      0,		 0xffffffff, 0xffffffff, 0xffffffff,			   \
    410  1.1  mrg      0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0},	   \
    411  1.1  mrg     /* AFP_REGS.  */							   \
    412  1.1  mrg     {0, 0, 0, 0,							   \
    413  1.1  mrg      0, 0, 0, 0,							   \
    414  1.1  mrg      0, 0, 0, 0, 0, 0xf},						   \
    415  1.1  mrg     /* ALL_REGS.  */							   \
    416  1.1  mrg     {0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,			   \
    417  1.1  mrg      0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,			   \
    418  1.1  mrg      0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0 }}
    419  1.1  mrg 
    420  1.1  mrg #define REGNO_REG_CLASS(REGNO) gcn_regno_reg_class (REGNO)
    421  1.1  mrg #define MODE_CODE_BASE_REG_CLASS(MODE, AS, OUTER, INDEX) \
    422  1.1  mrg 	 gcn_mode_code_base_reg_class (MODE, AS, OUTER, INDEX)
    423  1.1  mrg #define REGNO_MODE_CODE_OK_FOR_BASE_P(NUM, MODE, AS, OUTER, INDEX) \
    424  1.1  mrg 	 gcn_regno_mode_code_ok_for_base_p (NUM, MODE, AS, OUTER, INDEX)
    425  1.1  mrg #define INDEX_REG_CLASS VGPR_REGS
    426  1.1  mrg #define REGNO_OK_FOR_INDEX_P(regno) regno_ok_for_index_p (regno)
    427  1.1  mrg 
    428  1.1  mrg 
    429  1.1  mrg /* Address spaces.  */
    431  1.1  mrg enum gcn_address_spaces
    432  1.1  mrg {
    433  1.1  mrg   ADDR_SPACE_DEFAULT = 0,
    434  1.1  mrg   ADDR_SPACE_FLAT,
    435  1.1  mrg   ADDR_SPACE_SCALAR_FLAT,
    436  1.1  mrg   ADDR_SPACE_FLAT_SCRATCH,
    437  1.1  mrg   ADDR_SPACE_LDS,
    438  1.1  mrg   ADDR_SPACE_GDS,
    439  1.1  mrg   ADDR_SPACE_SCRATCH,
    440  1.1  mrg   ADDR_SPACE_GLOBAL
    441  1.1  mrg };
    442  1.1  mrg #define REGISTER_TARGET_PRAGMAS() do {                               \
    443  1.1  mrg   c_register_addr_space ("__flat", ADDR_SPACE_FLAT);                 \
    444  1.1  mrg   c_register_addr_space ("__flat_scratch", ADDR_SPACE_FLAT_SCRATCH); \
    445  1.1  mrg   c_register_addr_space ("__scalar_flat", ADDR_SPACE_SCALAR_FLAT);   \
    446  1.1  mrg   c_register_addr_space ("__lds", ADDR_SPACE_LDS);                   \
    447  1.1  mrg   c_register_addr_space ("__gds", ADDR_SPACE_GDS);                   \
    448  1.1  mrg   c_register_addr_space ("__global", ADDR_SPACE_GLOBAL);             \
    449  1.1  mrg } while (0);
    450  1.1  mrg 
    451  1.1  mrg #define STACK_ADDR_SPACE \
    452  1.1  mrg   (TARGET_GCN5_PLUS ? ADDR_SPACE_GLOBAL : ADDR_SPACE_FLAT)
    453  1.1  mrg #define DEFAULT_ADDR_SPACE \
    454  1.1  mrg   ((cfun && cfun->machine && !cfun->machine->use_flat_addressing) \
    455  1.1  mrg    ? ADDR_SPACE_GLOBAL : ADDR_SPACE_FLAT)
    456  1.1  mrg #define AS_SCALAR_FLAT_P(AS)   ((AS) == ADDR_SPACE_SCALAR_FLAT)
    457  1.1  mrg #define AS_FLAT_SCRATCH_P(AS)  ((AS) == ADDR_SPACE_FLAT_SCRATCH)
    458  1.1  mrg #define AS_FLAT_P(AS)	       ((AS) == ADDR_SPACE_FLAT \
    459  1.1  mrg 				|| ((AS) == ADDR_SPACE_DEFAULT \
    460  1.1  mrg 				    && DEFAULT_ADDR_SPACE == ADDR_SPACE_FLAT))
    461  1.1  mrg #define AS_LDS_P(AS)	       ((AS) == ADDR_SPACE_LDS)
    462  1.1  mrg #define AS_GDS_P(AS)	       ((AS) == ADDR_SPACE_GDS)
    463  1.1  mrg #define AS_SCRATCH_P(AS)       ((AS) == ADDR_SPACE_SCRATCH)
    464  1.1  mrg #define AS_GLOBAL_P(AS)        ((AS) == ADDR_SPACE_GLOBAL \
    465  1.1  mrg 				|| ((AS) == ADDR_SPACE_DEFAULT \
    466  1.1  mrg 				    && DEFAULT_ADDR_SPACE == ADDR_SPACE_GLOBAL))
    467  1.1  mrg #define AS_ANY_FLAT_P(AS)      (AS_FLAT_SCRATCH_P (AS) || AS_FLAT_P (AS))
    468  1.1  mrg #define AS_ANY_DS_P(AS)	       (AS_LDS_P (AS) || AS_GDS_P (AS))
    469  1.1  mrg 
    470  1.1  mrg 
    471  1.1  mrg /* Instruction Output */
    473  1.1  mrg #define REGISTER_NAMES							    \
    474  1.1  mrg    {"s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",	    \
    475  1.1  mrg     "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20",   \
    476  1.1  mrg     "s21", "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30",   \
    477  1.1  mrg     "s31", "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39", "s40",   \
    478  1.1  mrg     "s41", "s42", "s43", "s44", "s45", "s46", "s47", "s48", "s49", "s50",   \
    479  1.1  mrg     "s51", "s52", "s53", "s54", "s55", "s56", "s57", "s58", "s59", "s60",   \
    480  1.1  mrg     "s61", "s62", "s63", "s64", "s65", "s66", "s67", "s68", "s69", "s70",   \
    481  1.1  mrg     "s71", "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79", "s80",   \
    482  1.1  mrg     "s81", "s82", "s83", "s84", "s85", "s86", "s87", "s88", "s89", "s90",   \
    483  1.1  mrg     "s91", "s92", "s93", "s94", "s95", "s96", "s97", "s98", "s99",	    \
    484  1.1  mrg     "s100", "s101",							    \
    485  1.1  mrg     "flat_scratch_lo", "flat_scratch_hi", "xnack_mask_lo", "xnack_mask_hi", \
    486  1.1  mrg     "vcc_lo", "vcc_hi", "vccz", "tba_lo", "tba_hi", "tma_lo", "tma_hi",     \
    487  1.1  mrg     "ttmp0", "ttmp1", "ttmp2", "ttmp3", "ttmp4", "ttmp5", "ttmp6", "ttmp7", \
    488  1.1  mrg     "ttmp8", "ttmp9", "ttmp10", "ttmp11", "m0", "exec_lo", "exec_hi",	    \
    489  1.1  mrg     "execz", "scc",							    \
    490  1.1  mrg     "res130", "res131", "res132", "res133", "res134", "res135", "res136",   \
    491  1.1  mrg     "res137", "res138", "res139", "res140", "res141", "res142", "res143",   \
    492  1.1  mrg     "res144", "res145", "res146", "res147", "res148", "res149", "res150",   \
    493  1.1  mrg     "res151", "res152", "res153", "res154", "res155", "res156", "res157",   \
    494  1.1  mrg     "res158", "res159",							    \
    495  1.1  mrg     "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",	    \
    496  1.1  mrg     "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20",   \
    497  1.1  mrg     "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30",   \
    498  1.1  mrg     "v31", "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39", "v40",   \
    499  1.1  mrg     "v41", "v42", "v43", "v44", "v45", "v46", "v47", "v48", "v49", "v50",   \
    500  1.1  mrg     "v51", "v52", "v53", "v54", "v55", "v56", "v57", "v58", "v59", "v60",   \
    501  1.1  mrg     "v61", "v62", "v63", "v64", "v65", "v66", "v67", "v68", "v69", "v70",   \
    502  1.1  mrg     "v71", "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79", "v80",   \
    503  1.1  mrg     "v81", "v82", "v83", "v84", "v85", "v86", "v87", "v88", "v89", "v90",   \
    504  1.1  mrg     "v91", "v92", "v93", "v94", "v95", "v96", "v97", "v98", "v99", "v100",  \
    505  1.1  mrg     "v101", "v102", "v103", "v104", "v105", "v106", "v107", "v108", "v109", \
    506  1.1  mrg     "v110", "v111", "v112", "v113", "v114", "v115", "v116", "v117", "v118", \
    507  1.1  mrg     "v119", "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127", \
    508  1.1  mrg     "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135", "v136", \
    509  1.1  mrg     "v137", "v138", "v139", "v140", "v141", "v142", "v143", "v144", "v145", \
    510  1.1  mrg     "v146", "v147", "v148", "v149", "v150", "v151", "v152", "v153", "v154", \
    511  1.1  mrg     "v155", "v156", "v157", "v158", "v159", "v160", "v161", "v162", "v163", \
    512  1.1  mrg     "v164", "v165", "v166", "v167", "v168", "v169", "v170", "v171", "v172", \
    513  1.1  mrg     "v173", "v174", "v175", "v176", "v177", "v178", "v179", "v180", "v181", \
    514  1.1  mrg     "v182", "v183", "v184", "v185", "v186", "v187", "v188", "v189", "v190", \
    515  1.1  mrg     "v191", "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199", \
    516  1.1  mrg     "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207", "v208", \
    517  1.1  mrg     "v209", "v210", "v211", "v212", "v213", "v214", "v215", "v216", "v217", \
    518  1.1  mrg     "v218", "v219", "v220", "v221", "v222", "v223", "v224", "v225", "v226", \
    519  1.1  mrg     "v227", "v228", "v229", "v230", "v231", "v232", "v233", "v234", "v235", \
    520  1.1  mrg     "v236", "v237", "v238", "v239", "v240", "v241", "v242", "v243", "v244", \
    521  1.1  mrg     "v245", "v246", "v247", "v248", "v249", "v250", "v251", "v252", "v253", \
    522  1.1  mrg     "v254", "v255",							    \
    523  1.1  mrg     "?ap0", "?ap1", "?fp0", "?fp1" }
    524  1.1  mrg 
    525  1.1  mrg #define PRINT_OPERAND(FILE, X, CODE)  print_operand(FILE, X, CODE)
    526  1.1  mrg #define PRINT_OPERAND_ADDRESS(FILE, ADDR)  print_operand_address (FILE, ADDR)
    527  1.1  mrg #define PRINT_OPERAND_PUNCT_VALID_P(CODE) (CODE == '^')
    528  1.1  mrg 
    529  1.1  mrg 
    530  1.1  mrg /* Register Arguments */
    532  1.1  mrg 
    533  1.1  mrg #ifndef USED_FOR_TARGET
    534  1.1  mrg 
    535  1.1  mrg #define GCN_KERNEL_ARG_TYPES 19
    536  1.1  mrg struct GTY(()) gcn_kernel_args
    537  1.1  mrg {
    538  1.1  mrg   long requested;
    539  1.1  mrg   int reg[GCN_KERNEL_ARG_TYPES];
    540  1.1  mrg   int order[GCN_KERNEL_ARG_TYPES];
    541  1.1  mrg   int nargs, nsgprs;
    542  1.1  mrg };
    543  1.1  mrg 
    544  1.1  mrg typedef struct gcn_args
    545  1.1  mrg {
    546  1.1  mrg   /* True if this isn't a kernel (HSA runtime entrypoint).  */
    547  1.1  mrg   bool normal_function;
    548  1.1  mrg   tree fntype;
    549  1.1  mrg   struct gcn_kernel_args args;
    550  1.1  mrg   int num;
    551  1.1  mrg   int offset;
    552  1.1  mrg   int alignment;
    553  1.1  mrg } CUMULATIVE_ARGS;
    554  1.1  mrg #endif
    555  1.1  mrg 
    556  1.1  mrg #define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,FNDECL,N_NAMED_ARGS) \
    557  1.1  mrg   gcn_init_cumulative_args (&(CUM), (FNTYPE), (LIBNAME), (FNDECL),   \
    558  1.1  mrg 			    (N_NAMED_ARGS) != -1)
    559  1.1  mrg 
    560  1.1  mrg 
    561  1.1  mrg #ifndef USED_FOR_TARGET
    563  1.1  mrg 
    564  1.1  mrg #include "hash-table.h"
    565  1.1  mrg #include "hash-map.h"
    566  1.1  mrg #include "vec.h"
    567  1.1  mrg 
    568  1.1  mrg struct GTY(()) machine_function
    569  1.1  mrg {
    570  1.1  mrg   struct gcn_kernel_args args;
    571  1.1  mrg   int kernarg_segment_alignment;
    572  1.1  mrg   int kernarg_segment_byte_size;
    573  1.1  mrg   /* Frame layout info for normal functions.  */
    574  1.1  mrg   bool normal_function;
    575  1.1  mrg   bool need_frame_pointer;
    576  1.1  mrg   bool lr_needs_saving;
    577  1.1  mrg   HOST_WIDE_INT outgoing_args_size;
    578  1.1  mrg   HOST_WIDE_INT pretend_size;
    579  1.1  mrg   HOST_WIDE_INT local_vars;
    580  1.1  mrg   HOST_WIDE_INT callee_saves;
    581  1.1  mrg 
    582  1.1  mrg   unsigned lds_allocated;
    583  1.1  mrg   hash_map<tree, int> *lds_allocs;
    584  1.1  mrg 
    585  1.1  mrg   vec<tree, va_gc> *reduc_decls;
    586  1.1  mrg 
    587  1.1  mrg   bool use_flat_addressing;
    588  1.1  mrg };
    589  1.1  mrg #endif
    590  1.1  mrg 
    591  1.1  mrg 
    592  1.1  mrg /* Codes for all the GCN builtins.  */
    594  1.1  mrg 
    595  1.1  mrg enum gcn_builtin_codes
    596  1.1  mrg {
    597  1.1  mrg #define DEF_BUILTIN(fcode, icode, name, type, params, expander) \
    598  1.1  mrg   GCN_BUILTIN_ ## fcode,
    599  1.1  mrg #define DEF_BUILTIN_BINOP_INT_FP(fcode, ic, name)	\
    600  1.1  mrg   GCN_BUILTIN_ ## fcode ## _V64SI,			\
    601  1.1  mrg   GCN_BUILTIN_ ## fcode ## _V64SI_unspec,
    602  1.1  mrg #include "gcn-builtins.def"
    603  1.1  mrg #undef DEF_BUILTIN
    604  1.1  mrg #undef DEF_BUILTIN_BINOP_INT_FP
    605  1.1  mrg   GCN_BUILTIN_MAX
    606  1.1  mrg };
    607  1.1  mrg 
    608  1.1  mrg 
    609  1.1  mrg /* Misc */
    611  1.1  mrg 
    612  1.1  mrg /* We can load/store 128-bit quantities, but having this larger than
    613  1.1  mrg    MAX_FIXED_MODE_SIZE (which we want to be 64 bits) causes problems.  */
    614  1.1  mrg #define MOVE_MAX 8
    615  1.1  mrg 
    616  1.1  mrg #define AVOID_CCMODE_COPIES 1
    617  1.1  mrg #define SLOW_BYTE_ACCESS 0
    618  1.1  mrg #define WORD_REGISTER_OPERATIONS 1
    619  1.1  mrg 
    620  1.1  mrg /* Definitions for register eliminations.
    621  1.1  mrg 
    622  1.1  mrg    This is an array of structures.  Each structure initializes one pair
    623  1.1  mrg    of eliminable registers.  The "from" register number is given first,
    624  1.1  mrg    followed by "to".  Eliminations of the same "from" register are listed
    625  1.1  mrg    in order of preference.  */
    626  1.1  mrg 
    627  1.1  mrg #define ELIMINABLE_REGS					\
    628  1.1  mrg {{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM },		\
    629  1.1  mrg  { ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM },	\
    630  1.1  mrg  { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM },	\
    631  1.1  mrg  { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM }}
    632  1.1  mrg 
    633  1.1  mrg /* Define the offset between two registers, one to be eliminated, and the
    634  1.1  mrg    other its replacement, at the start of a routine.  */
    635  1.1  mrg 
    636  1.1  mrg #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET)	\
    637  1.1  mrg   ((OFFSET) = gcn_initial_elimination_offset ((FROM), (TO)))
    638  1.1  mrg 
    639  1.1  mrg 
    640  1.1  mrg /* Define this macro if it is advisable to hold scalars in registers
    641  1.1  mrg    in a wider mode than that declared by the program.  In such cases,
    642  1.1  mrg    the value is constrained to be within the bounds of the declared
    643  1.1  mrg    type, but kept valid in the wider mode.  The signedness of the
    644  1.1  mrg    extension may differ from that of the type.  */
    645  1.1  mrg 
    646  1.1  mrg #define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE)			\
    647  1.1  mrg   if (GET_MODE_CLASS (MODE) == MODE_INT				\
    648  1.1  mrg       && (TYPE == NULL || TREE_CODE (TYPE) != VECTOR_TYPE)	\
    649  1.1  mrg       && GET_MODE_SIZE (MODE) < UNITS_PER_WORD)			\
    650  1.1  mrg     {								\
    651  1.1  mrg       (MODE) = SImode;						\
    652  1.1  mrg     }
    653  1.1  mrg 
    654  1.1  mrg /* This needs to match gcn_function_value.  */
    655  1.1  mrg #define LIBCALL_VALUE(MODE) gen_rtx_REG (MODE, SGPR_REGNO (RETURN_VALUE_REG))
    656  1.1  mrg 
    657  1.1  mrg 
    658  1.1  mrg /* Costs.  */
    660  1.1  mrg 
    661  1.1  mrg /* Branches are to be dicouraged when theres an alternative.
    662  1.1  mrg    FIXME: This number is plucked from the air.  */
    663           #define BRANCH_COST(SPEED_P, PREDICABLE_P) 10
    664           
    665           
    666           /* Profiling */
    668           #define FUNCTION_PROFILER(FILE, LABELNO)
    669           #define NO_PROFILE_COUNTERS 1
    670           #define PROFILE_BEFORE_PROLOGUE 0
    671           
    672           /* Trampolines */
    673           #define TRAMPOLINE_SIZE 36
    674           #define TRAMPOLINE_ALIGNMENT 64
    675