1  /* Copyright (C) 1988-2023 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 */