1bdd1243dSDimitry Andric //==-- LoongArch64TargetParser - Parser for LoongArch64 features --*- C++ -*-=// 2bdd1243dSDimitry Andric // 3bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6bdd1243dSDimitry Andric // 7bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 8bdd1243dSDimitry Andric // 9bdd1243dSDimitry Andric // This file implements a target parser to recognise LoongArch hardware features 10bdd1243dSDimitry Andric // such as CPU/ARCH and extension names. 11bdd1243dSDimitry Andric // 12bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 13bdd1243dSDimitry Andric 14bdd1243dSDimitry Andric #ifndef LLVM_TARGETPARSER_LOONGARCHTARGETPARSER_H 15bdd1243dSDimitry Andric #define LLVM_TARGETPARSER_LOONGARCHTARGETPARSER_H 16bdd1243dSDimitry Andric 17bdd1243dSDimitry Andric #include "llvm/TargetParser/Triple.h" 18bdd1243dSDimitry Andric #include <vector> 19bdd1243dSDimitry Andric 20bdd1243dSDimitry Andric namespace llvm { 21bdd1243dSDimitry Andric class StringRef; 22bdd1243dSDimitry Andric 23bdd1243dSDimitry Andric namespace LoongArch { 24bdd1243dSDimitry Andric 25bdd1243dSDimitry Andric enum FeatureKind : uint32_t { 26bdd1243dSDimitry Andric // 64-bit ISA is available. 27bdd1243dSDimitry Andric FK_64BIT = 1 << 1, 28bdd1243dSDimitry Andric 29bdd1243dSDimitry Andric // Single-precision floating-point instructions are available. 30bdd1243dSDimitry Andric FK_FP32 = 1 << 2, 31bdd1243dSDimitry Andric 32bdd1243dSDimitry Andric // Double-precision floating-point instructions are available. 33bdd1243dSDimitry Andric FK_FP64 = 1 << 3, 34bdd1243dSDimitry Andric 35bdd1243dSDimitry Andric // Loongson SIMD Extension is available. 36bdd1243dSDimitry Andric FK_LSX = 1 << 4, 37bdd1243dSDimitry Andric 38bdd1243dSDimitry Andric // Loongson Advanced SIMD Extension is available. 39bdd1243dSDimitry Andric FK_LASX = 1 << 5, 40bdd1243dSDimitry Andric 41bdd1243dSDimitry Andric // Loongson Binary Translation Extension is available. 42bdd1243dSDimitry Andric FK_LBT = 1 << 6, 43bdd1243dSDimitry Andric 44bdd1243dSDimitry Andric // Loongson Virtualization Extension is available. 45bdd1243dSDimitry Andric FK_LVZ = 1 << 7, 4606c3fb27SDimitry Andric 4706c3fb27SDimitry Andric // Allow memory accesses to be unaligned. 4806c3fb27SDimitry Andric FK_UAL = 1 << 8, 49*0fca6ea1SDimitry Andric 50*0fca6ea1SDimitry Andric // Floating-point approximate reciprocal instructions are available. 51*0fca6ea1SDimitry Andric FK_FRECIPE = 1 << 9, 52bdd1243dSDimitry Andric }; 53bdd1243dSDimitry Andric 54bdd1243dSDimitry Andric struct FeatureInfo { 55bdd1243dSDimitry Andric StringRef Name; 56bdd1243dSDimitry Andric FeatureKind Kind; 57bdd1243dSDimitry Andric }; 58bdd1243dSDimitry Andric 59bdd1243dSDimitry Andric enum class ArchKind { 60bdd1243dSDimitry Andric #define LOONGARCH_ARCH(NAME, KIND, FEATURES) KIND, 61bdd1243dSDimitry Andric #include "LoongArchTargetParser.def" 62bdd1243dSDimitry Andric }; 63bdd1243dSDimitry Andric 64bdd1243dSDimitry Andric struct ArchInfo { 65bdd1243dSDimitry Andric StringRef Name; 66bdd1243dSDimitry Andric ArchKind Kind; 67bdd1243dSDimitry Andric uint32_t Features; 68bdd1243dSDimitry Andric }; 69bdd1243dSDimitry Andric 7006c3fb27SDimitry Andric bool isValidArchName(StringRef Arch); 71bdd1243dSDimitry Andric bool getArchFeatures(StringRef Arch, std::vector<StringRef> &Features); 728a4dda33SDimitry Andric bool isValidCPUName(StringRef TuneCPU); 738a4dda33SDimitry Andric void fillValidCPUList(SmallVectorImpl<StringRef> &Values); 748a4dda33SDimitry Andric StringRef getDefaultArch(bool Is64Bit); 75bdd1243dSDimitry Andric 76bdd1243dSDimitry Andric } // namespace LoongArch 77bdd1243dSDimitry Andric 78bdd1243dSDimitry Andric } // namespace llvm 79bdd1243dSDimitry Andric 808a4dda33SDimitry Andric #endif // LLVM_TARGETPARSER_LOONGARCHTARGETPARSER_H 81