1 //===--- TargetBuiltins.h - Target specific builtin IDs ---------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// Enumerates target-specific builtins in their own namespaces within 11 /// namespace ::clang. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CLANG_BASIC_TARGETBUILTINS_H 16 #define LLVM_CLANG_BASIC_TARGETBUILTINS_H 17 18 #include <algorithm> 19 #include <stdint.h> 20 #include "clang/Basic/Builtins.h" 21 #include "llvm/Support/MathExtras.h" 22 #undef PPC 23 24 namespace clang { 25 26 namespace NEON { 27 enum { 28 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 29 #define GET_NEON_BUILTIN_ENUMERATORS 30 #include "clang/Basic/arm_neon.inc" 31 FirstFp16Builtin, 32 LastNeonBuiltin = FirstFp16Builtin - 1, 33 #include "clang/Basic/arm_fp16.inc" 34 #undef GET_NEON_BUILTIN_ENUMERATORS 35 FirstTSBuiltin 36 }; 37 } 38 39 /// ARM builtins 40 namespace ARM { 41 enum { 42 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 43 LastNEONBuiltin = NEON::FirstTSBuiltin - 1, 44 #define GET_MVE_BUILTIN_ENUMERATORS 45 #include "clang/Basic/arm_mve_builtins.inc" 46 #undef GET_MVE_BUILTIN_ENUMERATORS 47 FirstCDEBuiltin, 48 LastMVEBuiltin = FirstCDEBuiltin - 1, 49 #define GET_CDE_BUILTIN_ENUMERATORS 50 #include "clang/Basic/arm_cde_builtins.inc" 51 #undef GET_CDE_BUILTIN_ENUMERATORS 52 FirstARMBuiltin, 53 LastCDEBuiltin = FirstARMBuiltin - 1, 54 #define BUILTIN(ID, TYPE, ATTRS) BI##ID, 55 #include "clang/Basic/BuiltinsARM.def" 56 LastTSBuiltin 57 }; 58 } 59 60 namespace SVE { 61 enum { 62 LastNEONBuiltin = NEON::FirstTSBuiltin - 1, 63 #define GET_SVE_BUILTIN_ENUMERATORS 64 #include "clang/Basic/arm_sve_builtins.inc" 65 #undef GET_SVE_BUILTIN_ENUMERATORS 66 FirstNeonBridgeBuiltin, 67 LastSveBuiltin = FirstNeonBridgeBuiltin - 1, 68 #define GET_SVE_BUILTINS 69 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID, 70 #include "clang/Basic/BuiltinsAArch64NeonSVEBridge.def" 71 #undef TARGET_BUILTIN 72 #undef GET_SVE_BUILTINS 73 FirstTSBuiltin, 74 }; 75 } 76 77 namespace SME { 78 enum { 79 LastSVEBuiltin = SVE::FirstTSBuiltin - 1, 80 #define GET_SME_BUILTIN_ENUMERATORS 81 #include "clang/Basic/arm_sme_builtins.inc" 82 #undef GET_SME_BUILTIN_ENUMERATORS 83 FirstTSBuiltin, 84 }; 85 } 86 87 /// AArch64 builtins 88 namespace AArch64 { 89 enum { 90 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 91 LastNEONBuiltin = NEON::FirstTSBuiltin - 1, 92 FirstSVEBuiltin = NEON::FirstTSBuiltin, 93 LastSVEBuiltin = SVE::FirstTSBuiltin - 1, 94 FirstSMEBuiltin = SVE::FirstTSBuiltin, 95 LastSMEBuiltin = SME::FirstTSBuiltin - 1, 96 #define BUILTIN(ID, TYPE, ATTRS) BI##ID, 97 #include "clang/Basic/BuiltinsAArch64.def" 98 LastTSBuiltin 99 }; 100 } 101 102 /// BPF builtins 103 namespace BPF { 104 enum { 105 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 106 #define GET_BUILTIN_ENUMERATORS 107 #include "clang/Basic/BuiltinsBPF.inc" 108 #undef GET_BUILTIN_ENUMERATORS 109 LastTSBuiltin 110 }; 111 } 112 113 /// PPC builtins 114 namespace PPC { 115 enum { 116 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1, 117 #define BUILTIN(ID, TYPE, ATTRS) BI##ID, 118 #include "clang/Basic/BuiltinsPPC.def" 119 LastTSBuiltin 120 }; 121 } 122 123 /// NVPTX builtins 124 namespace NVPTX { 125 enum { 126 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 127 #define GET_BUILTIN_ENUMERATORS 128 #include "clang/Basic/BuiltinsNVPTX.inc" 129 #undef GET_BUILTIN_ENUMERATORS 130 LastTSBuiltin 131 }; 132 } 133 134 /// AMDGPU builtins 135 namespace AMDGPU { 136 enum { 137 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 138 #define BUILTIN(ID, TYPE, ATTRS) BI##ID, 139 #include "clang/Basic/BuiltinsAMDGPU.def" 140 LastTSBuiltin 141 }; 142 } 143 144 /// DirectX builtins 145 namespace DirectX { 146 enum { 147 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 148 #define GET_BUILTIN_ENUMERATORS 149 #include "clang/Basic/BuiltinsDirectX.inc" 150 #undef GET_BUILTIN_ENUMERATORS 151 LastTSBuiltin 152 }; 153 } // namespace DirectX 154 155 /// SPIRV builtins 156 namespace SPIRV { 157 enum { 158 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 159 #define GET_BUILTIN_ENUMERATORS 160 #include "clang/Basic/BuiltinsSPIRVCommon.inc" 161 #undef GET_BUILTIN_ENUMERATORS 162 FirstVKBuiltin, 163 LastCoreBuiltin = FirstVKBuiltin - 1, 164 #define GET_BUILTIN_ENUMERATORS 165 #include "clang/Basic/BuiltinsSPIRVVK.inc" 166 #undef GET_BUILTIN_ENUMERATORS 167 FirstCLBuiltin, 168 LastVKBuiltin = FirstCLBuiltin - 1, 169 #define GET_BUILTIN_ENUMERATORS 170 #include "clang/Basic/BuiltinsSPIRVCL.inc" 171 #undef GET_BUILTIN_ENUMERATORS 172 LastTSBuiltin 173 }; 174 } // namespace SPIRV 175 176 /// X86 builtins 177 namespace X86 { 178 enum { 179 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 180 #define GET_BUILTIN_ENUMERATORS 181 #include "clang/Basic/BuiltinsX86.inc" 182 #undef GET_BUILTIN_ENUMERATORS 183 FirstX86_64Builtin, 184 LastX86CommonBuiltin = FirstX86_64Builtin - 1, 185 #define GET_BUILTIN_ENUMERATORS 186 #include "clang/Basic/BuiltinsX86_64.inc" 187 #undef GET_BUILTIN_ENUMERATORS 188 LastTSBuiltin 189 }; 190 } 191 192 /// VE builtins 193 namespace VE { 194 enum { 195 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 196 #define BUILTIN(ID, TYPE, ATTRS) BI##ID, 197 #include "clang/Basic/BuiltinsVE.def" 198 LastTSBuiltin 199 }; 200 } 201 202 namespace RISCVVector { 203 enum { 204 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 205 #define GET_RISCVV_BUILTIN_ENUMERATORS 206 #include "clang/Basic/riscv_vector_builtins.inc" 207 FirstSiFiveBuiltin, 208 LastRVVBuiltin = FirstSiFiveBuiltin - 1, 209 #include "clang/Basic/riscv_sifive_vector_builtins.inc" 210 FirstAndesBuiltin, 211 LastSiFiveBuiltin = FirstAndesBuiltin - 1, 212 #include "clang/Basic/riscv_andes_vector_builtins.inc" 213 #undef GET_RISCVV_BUILTIN_ENUMERATORS 214 FirstTSBuiltin, 215 }; 216 } 217 218 /// RISCV builtins 219 namespace RISCV { 220 enum { 221 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 222 FirstRVVBuiltin = clang::Builtin::FirstTSBuiltin, 223 LastRVVBuiltin = RISCVVector::FirstTSBuiltin - 1, 224 #define GET_BUILTIN_ENUMERATORS 225 #include "clang/Basic/BuiltinsRISCV.inc" 226 #undef GET_BUILTIN_ENUMERATORS 227 LastTSBuiltin 228 }; 229 } // namespace RISCV 230 231 /// LoongArch builtins 232 namespace LoongArch { 233 enum { 234 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 235 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID, 236 #include "clang/Basic/BuiltinsLoongArchBase.def" 237 FirstLSXBuiltin, 238 LastBaseBuiltin = FirstLSXBuiltin - 1, 239 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID, 240 #include "clang/Basic/BuiltinsLoongArchLSX.def" 241 FirstLASXBuiltin, 242 LastLSXBuiltin = FirstLASXBuiltin - 1, 243 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID, 244 #include "clang/Basic/BuiltinsLoongArchLASX.def" 245 LastTSBuiltin 246 }; 247 } // namespace LoongArch 248 249 /// Flags to identify the types for overloaded Neon builtins. 250 /// 251 /// These must be kept in sync with the flags in utils/TableGen/NeonEmitter.h. 252 class NeonTypeFlags { 253 enum { 254 EltTypeMask = 0xf, 255 UnsignedFlag = 0x10, 256 QuadFlag = 0x20 257 }; 258 uint32_t Flags; 259 260 public: 261 enum EltType { 262 Int8, 263 Int16, 264 Int32, 265 Int64, 266 Poly8, 267 Poly16, 268 Poly64, 269 Poly128, 270 Float16, 271 Float32, 272 Float64, 273 BFloat16, 274 MFloat8 275 }; 276 NeonTypeFlags(unsigned F)277 NeonTypeFlags(unsigned F) : Flags(F) {} NeonTypeFlags(EltType ET,bool IsUnsigned,bool IsQuad)278 NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad) : Flags(ET) { 279 if (IsUnsigned) 280 Flags |= UnsignedFlag; 281 if (IsQuad) 282 Flags |= QuadFlag; 283 } 284 getEltType()285 EltType getEltType() const { return (EltType)(Flags & EltTypeMask); } isPoly()286 bool isPoly() const { 287 EltType ET = getEltType(); 288 return ET == Poly8 || ET == Poly16 || ET == Poly64; 289 } isFloatingPoint()290 bool isFloatingPoint() const { 291 EltType ET = getEltType(); 292 return ET == Float16 || ET == Float32 || ET == Float64 || ET == BFloat16; 293 } isUnsigned()294 bool isUnsigned() const { return (Flags & UnsignedFlag) != 0; } isQuad()295 bool isQuad() const { return (Flags & QuadFlag) != 0; } getEltSizeInBits()296 unsigned getEltSizeInBits() const { 297 switch (getEltType()) { 298 case Int8: 299 case Poly8: 300 case MFloat8: 301 return 8; 302 case Int16: 303 case Float16: 304 case Poly16: 305 case BFloat16: 306 return 16; 307 case Int32: 308 case Float32: 309 return 32; 310 case Int64: 311 case Float64: 312 case Poly64: 313 return 64; 314 case Poly128: 315 return 128; 316 } 317 llvm_unreachable("Invalid NeonTypeFlag!"); 318 } 319 }; 320 321 // Shared between SVE/SME and NEON 322 enum ImmCheckType { 323 #define LLVM_GET_ARM_INTRIN_IMMCHECKTYPES 324 #include "clang/Basic/arm_immcheck_types.inc" 325 #undef LLVM_GET_ARM_INTRIN_IMMCHECKTYPES 326 }; 327 328 /// Flags to identify the types for overloaded SVE builtins. 329 class SVETypeFlags { 330 uint64_t Flags; 331 unsigned EltTypeShift; 332 unsigned MemEltTypeShift; 333 unsigned MergeTypeShift; 334 unsigned SplatOperandMaskShift; 335 336 public: 337 #define LLVM_GET_SVE_TYPEFLAGS 338 #include "clang/Basic/arm_sve_typeflags.inc" 339 #undef LLVM_GET_SVE_TYPEFLAGS 340 341 enum EltType { 342 #define LLVM_GET_SVE_ELTTYPES 343 #include "clang/Basic/arm_sve_typeflags.inc" 344 #undef LLVM_GET_SVE_ELTTYPES 345 }; 346 347 enum MemEltType { 348 #define LLVM_GET_SVE_MEMELTTYPES 349 #include "clang/Basic/arm_sve_typeflags.inc" 350 #undef LLVM_GET_SVE_MEMELTTYPES 351 }; 352 353 enum MergeType { 354 #define LLVM_GET_SVE_MERGETYPES 355 #include "clang/Basic/arm_sve_typeflags.inc" 356 #undef LLVM_GET_SVE_MERGETYPES 357 }; 358 SVETypeFlags(uint64_t F)359 SVETypeFlags(uint64_t F) : Flags(F) { 360 EltTypeShift = llvm::countr_zero(EltTypeMask); 361 MemEltTypeShift = llvm::countr_zero(MemEltTypeMask); 362 MergeTypeShift = llvm::countr_zero(MergeTypeMask); 363 SplatOperandMaskShift = llvm::countr_zero(SplatOperandMask); 364 } 365 getEltType()366 EltType getEltType() const { 367 return (EltType)((Flags & EltTypeMask) >> EltTypeShift); 368 } 369 getMemEltType()370 MemEltType getMemEltType() const { 371 return (MemEltType)((Flags & MemEltTypeMask) >> MemEltTypeShift); 372 } 373 getMergeType()374 MergeType getMergeType() const { 375 return (MergeType)((Flags & MergeTypeMask) >> MergeTypeShift); 376 } 377 getSplatOperand()378 unsigned getSplatOperand() const { 379 return ((Flags & SplatOperandMask) >> SplatOperandMaskShift) - 1; 380 } 381 hasSplatOperand()382 bool hasSplatOperand() const { 383 return Flags & SplatOperandMask; 384 } 385 isLoad()386 bool isLoad() const { return Flags & IsLoad; } isStore()387 bool isStore() const { return Flags & IsStore; } isGatherLoad()388 bool isGatherLoad() const { return Flags & IsGatherLoad; } isScatterStore()389 bool isScatterStore() const { return Flags & IsScatterStore; } isStructLoad()390 bool isStructLoad() const { return Flags & IsStructLoad; } isStructStore()391 bool isStructStore() const { return Flags & IsStructStore; } isZExtReturn()392 bool isZExtReturn() const { return Flags & IsZExtReturn; } isByteIndexed()393 bool isByteIndexed() const { return Flags & IsByteIndexed; } isOverloadNone()394 bool isOverloadNone() const { return Flags & IsOverloadNone; } isOverloadWhileOrMultiVecCvt()395 bool isOverloadWhileOrMultiVecCvt() const { 396 return Flags & IsOverloadWhileOrMultiVecCvt; 397 } isOverloadDefault()398 bool isOverloadDefault() const { return !(Flags & OverloadKindMask); } isOverloadWhileRW()399 bool isOverloadWhileRW() const { return Flags & IsOverloadWhileRW; } isOverloadCvt()400 bool isOverloadCvt() const { return Flags & IsOverloadCvt; } isPrefetch()401 bool isPrefetch() const { return Flags & IsPrefetch; } isReverseCompare()402 bool isReverseCompare() const { return Flags & ReverseCompare; } isAppendSVALL()403 bool isAppendSVALL() const { return Flags & IsAppendSVALL; } isInsertOp1SVALL()404 bool isInsertOp1SVALL() const { return Flags & IsInsertOp1SVALL; } isGatherPrefetch()405 bool isGatherPrefetch() const { return Flags & IsGatherPrefetch; } isReverseUSDOT()406 bool isReverseUSDOT() const { return Flags & ReverseUSDOT; } isReverseMergeAnyBinOp()407 bool isReverseMergeAnyBinOp() const { return Flags & ReverseMergeAnyBinOp; } isReverseMergeAnyAccOp()408 bool isReverseMergeAnyAccOp() const { return Flags & ReverseMergeAnyAccOp; } isUndef()409 bool isUndef() const { return Flags & IsUndef; } isTupleCreate()410 bool isTupleCreate() const { return Flags & IsTupleCreate; } isTupleGet()411 bool isTupleGet() const { return Flags & IsTupleGet; } isTupleSet()412 bool isTupleSet() const { return Flags & IsTupleSet; } isReadZA()413 bool isReadZA() const { return Flags & IsReadZA; } isWriteZA()414 bool isWriteZA() const { return Flags & IsWriteZA; } setsFPMR()415 bool setsFPMR() const { return Flags & SetsFPMR; } isReductionQV()416 bool isReductionQV() const { return Flags & IsReductionQV; } getBits()417 uint64_t getBits() const { return Flags; } isFlagSet(uint64_t Flag)418 bool isFlagSet(uint64_t Flag) const { return Flags & Flag; } 419 }; 420 421 /// Hexagon builtins 422 namespace Hexagon { 423 enum { 424 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, 425 #define GET_BUILTIN_ENUMERATORS 426 #include "clang/Basic/BuiltinsHexagon.inc" 427 #undef GET_BUILTIN_ENUMERATORS 428 LastTSBuiltin 429 }; 430 } 431 432 /// MIPS builtins 433 namespace Mips { 434 enum { 435 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1, 436 #define BUILTIN(ID, TYPE, ATTRS) BI##ID, 437 #include "clang/Basic/BuiltinsMips.def" 438 LastTSBuiltin 439 }; 440 } 441 442 /// XCore builtins 443 namespace XCore { 444 enum { 445 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1, 446 #define BUILTIN(ID, TYPE, ATTRS) BI##ID, 447 #include "clang/Basic/BuiltinsXCore.def" 448 LastTSBuiltin 449 }; 450 } 451 452 /// SystemZ builtins 453 namespace SystemZ { 454 enum { 455 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1, 456 #define BUILTIN(ID, TYPE, ATTRS) BI##ID, 457 #include "clang/Basic/BuiltinsSystemZ.def" 458 LastTSBuiltin 459 }; 460 } 461 462 /// WebAssembly builtins 463 namespace WebAssembly { 464 enum { 465 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1, 466 #define BUILTIN(ID, TYPE, ATTRS) BI##ID, 467 #include "clang/Basic/BuiltinsWebAssembly.def" 468 LastTSBuiltin 469 }; 470 } 471 472 static constexpr uint64_t LargestBuiltinID = std::max<uint64_t>( 473 {ARM::LastTSBuiltin, AArch64::LastTSBuiltin, BPF::LastTSBuiltin, 474 PPC::LastTSBuiltin, NVPTX::LastTSBuiltin, AMDGPU::LastTSBuiltin, 475 X86::LastTSBuiltin, VE::LastTSBuiltin, RISCV::LastTSBuiltin, 476 Hexagon::LastTSBuiltin, Mips::LastTSBuiltin, XCore::LastTSBuiltin, 477 SystemZ::LastTSBuiltin, WebAssembly::LastTSBuiltin}); 478 479 } // end namespace clang. 480 481 #endif 482