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