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