1 /* Copyright (C) 1988-2022 Free Software Foundation, Inc. 2 3 This file is part of GCC. 4 5 GCC is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3, or (at your option) 8 any later version. 9 10 GCC is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with GCC; see the file COPYING3. If not see 17 <http://www.gnu.org/licenses/>. */ 18 19 #ifndef GCC_I386_BUILTINS_H 20 #define GCC_I386_BUILTINS_H 21 22 /* The following file contains several enumerations and data structures 23 built from the definitions in i386-builtin-types.def. */ 24 25 #include "i386-builtin-types.inc" 26 27 /* Codes for all the SSE/MMX builtins. Builtins not mentioned in any 28 bdesc_* arrays below should come first, then builtins for each bdesc_* 29 array in ascending order, so that we can use direct array accesses. */ 30 enum ix86_builtins 31 { 32 IX86_BUILTIN_MASKMOVQ, 33 IX86_BUILTIN_LDMXCSR, 34 IX86_BUILTIN_STMXCSR, 35 IX86_BUILTIN_MASKMOVDQU, 36 IX86_BUILTIN_PSLLDQ128, 37 IX86_BUILTIN_CLFLUSH, 38 IX86_BUILTIN_MONITOR, 39 IX86_BUILTIN_MWAIT, 40 IX86_BUILTIN_UMONITOR, 41 IX86_BUILTIN_UMWAIT, 42 IX86_BUILTIN_TPAUSE, 43 IX86_BUILTIN_TESTUI, 44 IX86_BUILTIN_CLZERO, 45 IX86_BUILTIN_CLDEMOTE, 46 IX86_BUILTIN_VEC_INIT_V2SI, 47 IX86_BUILTIN_VEC_INIT_V4HI, 48 IX86_BUILTIN_VEC_INIT_V8QI, 49 IX86_BUILTIN_VEC_EXT_V2DF, 50 IX86_BUILTIN_VEC_EXT_V2DI, 51 IX86_BUILTIN_VEC_EXT_V4SF, 52 IX86_BUILTIN_VEC_EXT_V4SI, 53 IX86_BUILTIN_VEC_EXT_V8HI, 54 IX86_BUILTIN_VEC_EXT_V2SI, 55 IX86_BUILTIN_VEC_EXT_V4HI, 56 IX86_BUILTIN_VEC_EXT_V16QI, 57 IX86_BUILTIN_VEC_SET_V2DI, 58 IX86_BUILTIN_VEC_SET_V4SF, 59 IX86_BUILTIN_VEC_SET_V4SI, 60 IX86_BUILTIN_VEC_SET_V8HI, 61 IX86_BUILTIN_VEC_SET_V4HI, 62 IX86_BUILTIN_VEC_SET_V16QI, 63 IX86_BUILTIN_GATHERSIV2DF, 64 IX86_BUILTIN_GATHERSIV4DF, 65 IX86_BUILTIN_GATHERDIV2DF, 66 IX86_BUILTIN_GATHERDIV4DF, 67 IX86_BUILTIN_GATHERSIV4SF, 68 IX86_BUILTIN_GATHERSIV8SF, 69 IX86_BUILTIN_GATHERDIV4SF, 70 IX86_BUILTIN_GATHERDIV8SF, 71 IX86_BUILTIN_GATHERSIV2DI, 72 IX86_BUILTIN_GATHERSIV4DI, 73 IX86_BUILTIN_GATHERDIV2DI, 74 IX86_BUILTIN_GATHERDIV4DI, 75 IX86_BUILTIN_GATHERSIV4SI, 76 IX86_BUILTIN_GATHERSIV8SI, 77 IX86_BUILTIN_GATHERDIV4SI, 78 IX86_BUILTIN_GATHERDIV8SI, 79 IX86_BUILTIN_GATHER3SIV8SF, 80 IX86_BUILTIN_GATHER3SIV4SF, 81 IX86_BUILTIN_GATHER3SIV4DF, 82 IX86_BUILTIN_GATHER3SIV2DF, 83 IX86_BUILTIN_GATHER3DIV8SF, 84 IX86_BUILTIN_GATHER3DIV4SF, 85 IX86_BUILTIN_GATHER3DIV4DF, 86 IX86_BUILTIN_GATHER3DIV2DF, 87 IX86_BUILTIN_GATHER3SIV8SI, 88 IX86_BUILTIN_GATHER3SIV4SI, 89 IX86_BUILTIN_GATHER3SIV4DI, 90 IX86_BUILTIN_GATHER3SIV2DI, 91 IX86_BUILTIN_GATHER3DIV8SI, 92 IX86_BUILTIN_GATHER3DIV4SI, 93 IX86_BUILTIN_GATHER3DIV4DI, 94 IX86_BUILTIN_GATHER3DIV2DI, 95 IX86_BUILTIN_SCATTERSIV8SF, 96 IX86_BUILTIN_SCATTERSIV4SF, 97 IX86_BUILTIN_SCATTERSIV4DF, 98 IX86_BUILTIN_SCATTERSIV2DF, 99 IX86_BUILTIN_SCATTERDIV8SF, 100 IX86_BUILTIN_SCATTERDIV4SF, 101 IX86_BUILTIN_SCATTERDIV4DF, 102 IX86_BUILTIN_SCATTERDIV2DF, 103 IX86_BUILTIN_SCATTERSIV8SI, 104 IX86_BUILTIN_SCATTERSIV4SI, 105 IX86_BUILTIN_SCATTERSIV4DI, 106 IX86_BUILTIN_SCATTERSIV2DI, 107 IX86_BUILTIN_SCATTERDIV8SI, 108 IX86_BUILTIN_SCATTERDIV4SI, 109 IX86_BUILTIN_SCATTERDIV4DI, 110 IX86_BUILTIN_SCATTERDIV2DI, 111 /* Alternate 4 and 8 element gather/scatter for the vectorizer 112 where all operands are 32-byte or 64-byte wide respectively. */ 113 IX86_BUILTIN_GATHERALTSIV4DF, 114 IX86_BUILTIN_GATHERALTDIV8SF, 115 IX86_BUILTIN_GATHERALTSIV4DI, 116 IX86_BUILTIN_GATHERALTDIV8SI, 117 IX86_BUILTIN_GATHER3ALTDIV16SF, 118 IX86_BUILTIN_GATHER3ALTDIV16SI, 119 IX86_BUILTIN_GATHER3ALTSIV4DF, 120 IX86_BUILTIN_GATHER3ALTDIV8SF, 121 IX86_BUILTIN_GATHER3ALTSIV4DI, 122 IX86_BUILTIN_GATHER3ALTDIV8SI, 123 IX86_BUILTIN_GATHER3ALTSIV8DF, 124 IX86_BUILTIN_GATHER3ALTSIV8DI, 125 IX86_BUILTIN_GATHER3DIV16SF, 126 IX86_BUILTIN_GATHER3DIV16SI, 127 IX86_BUILTIN_GATHER3DIV8DF, 128 IX86_BUILTIN_GATHER3DIV8DI, 129 IX86_BUILTIN_GATHER3SIV16SF, 130 IX86_BUILTIN_GATHER3SIV16SI, 131 IX86_BUILTIN_GATHER3SIV8DF, 132 IX86_BUILTIN_GATHER3SIV8DI, 133 IX86_BUILTIN_SCATTERALTSIV8DF, 134 IX86_BUILTIN_SCATTERALTDIV16SF, 135 IX86_BUILTIN_SCATTERALTSIV8DI, 136 IX86_BUILTIN_SCATTERALTDIV16SI, 137 IX86_BUILTIN_SCATTERALTSIV4DF, 138 IX86_BUILTIN_SCATTERALTDIV8SF, 139 IX86_BUILTIN_SCATTERALTSIV4DI, 140 IX86_BUILTIN_SCATTERALTDIV8SI, 141 IX86_BUILTIN_SCATTERALTSIV2DF, 142 IX86_BUILTIN_SCATTERALTDIV4SF, 143 IX86_BUILTIN_SCATTERALTSIV2DI, 144 IX86_BUILTIN_SCATTERALTDIV4SI, 145 IX86_BUILTIN_SCATTERDIV16SF, 146 IX86_BUILTIN_SCATTERDIV16SI, 147 IX86_BUILTIN_SCATTERDIV8DF, 148 IX86_BUILTIN_SCATTERDIV8DI, 149 IX86_BUILTIN_SCATTERSIV16SF, 150 IX86_BUILTIN_SCATTERSIV16SI, 151 IX86_BUILTIN_SCATTERSIV8DF, 152 IX86_BUILTIN_SCATTERSIV8DI, 153 IX86_BUILTIN_GATHERPFQPD, 154 IX86_BUILTIN_GATHERPFDPS, 155 IX86_BUILTIN_GATHERPFDPD, 156 IX86_BUILTIN_GATHERPFQPS, 157 IX86_BUILTIN_SCATTERPFDPD, 158 IX86_BUILTIN_SCATTERPFDPS, 159 IX86_BUILTIN_SCATTERPFQPD, 160 IX86_BUILTIN_SCATTERPFQPS, 161 IX86_BUILTIN_CLWB, 162 IX86_BUILTIN_CLFLUSHOPT, 163 IX86_BUILTIN_INFQ, 164 IX86_BUILTIN_HUGE_VALQ, 165 IX86_BUILTIN_NANQ, 166 IX86_BUILTIN_NANSQ, 167 IX86_BUILTIN_XABORT, 168 IX86_BUILTIN_ADDCARRYX32, 169 IX86_BUILTIN_ADDCARRYX64, 170 IX86_BUILTIN_SBB32, 171 IX86_BUILTIN_SBB64, 172 IX86_BUILTIN_RDRAND16_STEP, 173 IX86_BUILTIN_RDRAND32_STEP, 174 IX86_BUILTIN_RDRAND64_STEP, 175 IX86_BUILTIN_RDSEED16_STEP, 176 IX86_BUILTIN_RDSEED32_STEP, 177 IX86_BUILTIN_RDSEED64_STEP, 178 IX86_BUILTIN_MONITORX, 179 IX86_BUILTIN_MWAITX, 180 IX86_BUILTIN_CFSTRING, 181 IX86_BUILTIN_CPU_INIT, 182 IX86_BUILTIN_CPU_IS, 183 IX86_BUILTIN_CPU_SUPPORTS, 184 IX86_BUILTIN_READ_FLAGS, 185 IX86_BUILTIN_WRITE_FLAGS, 186 187 /* All the remaining builtins are tracked in bdesc_* arrays in 188 i386-builtin.def. Don't add any IX86_BUILTIN_* enumerators after 189 this point. */ 190 #define BDESC(mask, mask2, icode, name, code, comparison, flag) \ 191 code, 192 #define BDESC_FIRST(kind, kindu, mask, mask2, icode, name, code, comparison, flag) \ 193 code, \ 194 IX86_BUILTIN__BDESC_##kindu##_FIRST = code, 195 #define BDESC_END(kind, next_kind) 196 197 #include "i386-builtin.def" 198 199 #undef BDESC 200 #undef BDESC_FIRST 201 #undef BDESC_END 202 203 IX86_BUILTIN_MAX, 204 205 IX86_BUILTIN__BDESC_MAX_FIRST = IX86_BUILTIN_MAX, 206 207 /* Now just the aliases for bdesc_* start/end. */ 208 #define BDESC(mask, mask2, icode, name, code, comparison, flag) 209 #define BDESC_FIRST(kind, kindu, mask, mask2, icode, name, code, comparison, flag) 210 #define BDESC_END(kind, next_kind) \ 211 IX86_BUILTIN__BDESC_##kind##_LAST \ 212 = IX86_BUILTIN__BDESC_##next_kind##_FIRST - 1, 213 214 #include "i386-builtin.def" 215 216 #undef BDESC 217 #undef BDESC_FIRST 218 #undef BDESC_END 219 220 /* Just to make sure there is no comma after the last enumerator. */ 221 IX86_BUILTIN__BDESC_MAX_LAST = IX86_BUILTIN__BDESC_MAX_FIRST 222 }; 223 224 /* Table of all of the builtin functions that are possible with different ISA's 225 but are waiting to be built until a function is declared to use that 226 ISA. */ 227 struct builtin_isa { 228 HOST_WIDE_INT isa; /* isa_flags this builtin is defined for */ 229 HOST_WIDE_INT isa2; /* additional isa_flags this builtin is defined for */ 230 const char *name; /* function name */ 231 enum ix86_builtin_func_type tcode; /* type to use in the declaration */ 232 unsigned char const_p:1; /* true if the declaration is constant */ 233 unsigned char pure_p:1; /* true if the declaration has pure attribute */ 234 bool set_and_not_built_p; 235 }; 236 237 /* Bits for builtin_description.flag. */ 238 239 struct builtin_description 240 { 241 const HOST_WIDE_INT mask; 242 const HOST_WIDE_INT mask2; 243 const enum insn_code icode; 244 const char *const name; 245 const enum ix86_builtins code; 246 const enum rtx_code comparison; 247 const int flag; 248 }; 249 250 #define MULTI_ARG_4_DF2_DI_I V2DF_FTYPE_V2DF_V2DF_V2DI_INT 251 #define MULTI_ARG_4_DF2_DI_I1 V4DF_FTYPE_V4DF_V4DF_V4DI_INT 252 #define MULTI_ARG_4_SF2_SI_I V4SF_FTYPE_V4SF_V4SF_V4SI_INT 253 #define MULTI_ARG_4_SF2_SI_I1 V8SF_FTYPE_V8SF_V8SF_V8SI_INT 254 #define MULTI_ARG_3_SF V4SF_FTYPE_V4SF_V4SF_V4SF 255 #define MULTI_ARG_3_DF V2DF_FTYPE_V2DF_V2DF_V2DF 256 #define MULTI_ARG_3_SF2 V8SF_FTYPE_V8SF_V8SF_V8SF 257 #define MULTI_ARG_3_DF2 V4DF_FTYPE_V4DF_V4DF_V4DF 258 #define MULTI_ARG_3_DI V2DI_FTYPE_V2DI_V2DI_V2DI 259 #define MULTI_ARG_3_SI V4SI_FTYPE_V4SI_V4SI_V4SI 260 #define MULTI_ARG_3_SI_DI V4SI_FTYPE_V4SI_V4SI_V2DI 261 #define MULTI_ARG_3_HI V8HI_FTYPE_V8HI_V8HI_V8HI 262 #define MULTI_ARG_3_HI_SI V8HI_FTYPE_V8HI_V8HI_V4SI 263 #define MULTI_ARG_3_QI V16QI_FTYPE_V16QI_V16QI_V16QI 264 #define MULTI_ARG_3_DI2 V4DI_FTYPE_V4DI_V4DI_V4DI 265 #define MULTI_ARG_3_SI2 V8SI_FTYPE_V8SI_V8SI_V8SI 266 #define MULTI_ARG_3_HI2 V16HI_FTYPE_V16HI_V16HI_V16HI 267 #define MULTI_ARG_3_QI2 V32QI_FTYPE_V32QI_V32QI_V32QI 268 #define MULTI_ARG_2_SF V4SF_FTYPE_V4SF_V4SF 269 #define MULTI_ARG_2_DF V2DF_FTYPE_V2DF_V2DF 270 #define MULTI_ARG_2_DI V2DI_FTYPE_V2DI_V2DI 271 #define MULTI_ARG_2_SI V4SI_FTYPE_V4SI_V4SI 272 #define MULTI_ARG_2_HI V8HI_FTYPE_V8HI_V8HI 273 #define MULTI_ARG_2_QI V16QI_FTYPE_V16QI_V16QI 274 #define MULTI_ARG_2_DI_IMM V2DI_FTYPE_V2DI_SI 275 #define MULTI_ARG_2_SI_IMM V4SI_FTYPE_V4SI_SI 276 #define MULTI_ARG_2_HI_IMM V8HI_FTYPE_V8HI_SI 277 #define MULTI_ARG_2_QI_IMM V16QI_FTYPE_V16QI_SI 278 #define MULTI_ARG_2_DI_CMP V2DI_FTYPE_V2DI_V2DI_CMP 279 #define MULTI_ARG_2_SI_CMP V4SI_FTYPE_V4SI_V4SI_CMP 280 #define MULTI_ARG_2_HI_CMP V8HI_FTYPE_V8HI_V8HI_CMP 281 #define MULTI_ARG_2_QI_CMP V16QI_FTYPE_V16QI_V16QI_CMP 282 #define MULTI_ARG_2_SF_TF V4SF_FTYPE_V4SF_V4SF_TF 283 #define MULTI_ARG_2_DF_TF V2DF_FTYPE_V2DF_V2DF_TF 284 #define MULTI_ARG_2_DI_TF V2DI_FTYPE_V2DI_V2DI_TF 285 #define MULTI_ARG_2_SI_TF V4SI_FTYPE_V4SI_V4SI_TF 286 #define MULTI_ARG_2_HI_TF V8HI_FTYPE_V8HI_V8HI_TF 287 #define MULTI_ARG_2_QI_TF V16QI_FTYPE_V16QI_V16QI_TF 288 #define MULTI_ARG_1_SF V4SF_FTYPE_V4SF 289 #define MULTI_ARG_1_DF V2DF_FTYPE_V2DF 290 #define MULTI_ARG_1_SF2 V8SF_FTYPE_V8SF 291 #define MULTI_ARG_1_DF2 V4DF_FTYPE_V4DF 292 #define MULTI_ARG_1_DI V2DI_FTYPE_V2DI 293 #define MULTI_ARG_1_SI V4SI_FTYPE_V4SI 294 #define MULTI_ARG_1_HI V8HI_FTYPE_V8HI 295 #define MULTI_ARG_1_QI V16QI_FTYPE_V16QI 296 #define MULTI_ARG_1_SI_DI V2DI_FTYPE_V4SI 297 #define MULTI_ARG_1_HI_DI V2DI_FTYPE_V8HI 298 #define MULTI_ARG_1_HI_SI V4SI_FTYPE_V8HI 299 #define MULTI_ARG_1_QI_DI V2DI_FTYPE_V16QI 300 #define MULTI_ARG_1_QI_SI V4SI_FTYPE_V16QI 301 #define MULTI_ARG_1_QI_HI V8HI_FTYPE_V16QI 302 303 #define BDESC(mask, mask2, icode, name, code, comparison, flag) \ 304 { mask, mask2, icode, name, code, comparison, flag }, 305 #define BDESC_FIRST(kind, kindu, mask, mask2, icode, name, code, comparison, flag) \ 306 static const struct builtin_description bdesc_##kind[] = \ 307 { \ 308 BDESC (mask, mask2, icode, name, code, comparison, flag) 309 #define BDESC_END(kind, next_kind) \ 310 }; 311 312 #include "i386-builtin.def" 313 314 extern builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX]; 315 316 tree ix86_builtin_vectorized_function (unsigned int fn, tree type_out, 317 tree type_in); 318 void ix86_init_builtins (void); 319 tree ix86_vectorize_builtin_gather (const_tree mem_vectype, 320 const_tree index_type, int scale); 321 tree ix86_builtin_decl (unsigned code, bool); 322 tree ix86_builtin_reciprocal (tree fndecl); 323 unsigned int get_builtin_code_for_version (tree decl, tree *predicate_list); 324 tree fold_builtin_cpu (tree fndecl, tree *args); 325 tree get_ix86_builtin (enum ix86_builtins c); 326 327 #endif /* GCC_I386_BUILTINS_H */ 328