forked from OSchip/llvm-project
[AArch64] Adding a TargetParser for AArch64
There's already a ARMTargetParser,now adding a similar one for aarch64. so we can use it to do ARCH/CPU/FPU parsing in clang and llvm, instead of string comparison. Patch by Jojo Ma. llvm-svn: 270687
This commit is contained in:
parent
eebc4af0ed
commit
dfc5d1ffab
|
@ -0,0 +1,63 @@
|
|||
//===- AARCH64TargetParser.def - AARCH64 target parsing defines ---------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file provides defines to build up the AARCH64 target parser's logic.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// NOTE: NO INCLUDE GUARD DESIRED!
|
||||
|
||||
#ifndef AARCH64_ARCH
|
||||
#define AARCH64_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, ARCH_BASE_EXT)
|
||||
#endif
|
||||
AARCH64_ARCH("armv8-a", AK_ARMV8A, "8-A", "v8", ARMBuildAttrs::CPUArch::v8_A,
|
||||
FK_CRYPTO_NEON_FP_ARMV8, (AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
|
||||
AArch64::AEK_SIMD | AArch64::AEK_FP16 | AArch64::AEK_PROFILE))
|
||||
AARCH64_ARCH("armv8.1-a", AK_ARMV8_1A, "8.1-A", "v8.1a", ARMBuildAttrs::CPUArch::v8_A,
|
||||
FK_CRYPTO_NEON_FP_ARMV8, (AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
|
||||
AArch64::AEK_SIMD | AArch64::AEK_FP16 | AArch64::AEK_PROFILE))
|
||||
AARCH64_ARCH("armv8.2-a", AK_ARMV8_2A, "8.2-A", "v8.2a", ARMBuildAttrs::CPUArch::v8_A,
|
||||
FK_CRYPTO_NEON_FP_ARMV8, (AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
|
||||
AArch64::AEK_SIMD | AArch64::AEK_FP16 | AArch64::AEK_PROFILE))
|
||||
#undef AARCH64_ARCH
|
||||
|
||||
#ifndef AARCH64_ARCH_EXT_NAME
|
||||
#define AARCH64_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE)
|
||||
#endif
|
||||
// FIXME: This would be nicer were it tablegen
|
||||
AARCH64_ARCH_EXT_NAME("invalid", AArch64::AEK_INVALID, nullptr, nullptr)
|
||||
AARCH64_ARCH_EXT_NAME("none", AArch64::AEK_NONE, nullptr, nullptr)
|
||||
AARCH64_ARCH_EXT_NAME("crc", AArch64::AEK_CRC, "+crc", "-crc")
|
||||
AARCH64_ARCH_EXT_NAME("crypto", AArch64::AEK_CRYPTO, "+crypto","-crypto")
|
||||
AARCH64_ARCH_EXT_NAME("fp", AArch64::AEK_FP, "+fp-armv8", "-fp-armv8")
|
||||
AARCH64_ARCH_EXT_NAME("simd", AArch64::AEK_SIMD, "+neon", "-neon")
|
||||
AARCH64_ARCH_EXT_NAME("fp16", AArch64::AEK_FP16, "+fullfp16", "-fullfp16")
|
||||
AARCH64_ARCH_EXT_NAME("profile", AArch64::AEK_PROFILE, "+spe", "-spe")
|
||||
#undef AARCH64_ARCH_EXT_NAME
|
||||
|
||||
#ifndef AARCH64_CPU_NAME
|
||||
#define AARCH64_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT)
|
||||
#endif
|
||||
AARCH64_CPU_NAME("cortex-a35", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false,
|
||||
(AArch64::AEK_SIMD | AArch64::AEK_CRC | AArch64::AEK_CRYPTO))
|
||||
AARCH64_CPU_NAME("cortex-a53", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, true,
|
||||
( AArch64::AEK_SIMD | AArch64::AEK_CRC | AArch64::AEK_CRYPTO))
|
||||
AARCH64_CPU_NAME("cortex-a57", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false,
|
||||
(AArch64::AEK_SIMD | AArch64::AEK_CRC | AArch64::AEK_CRYPTO))
|
||||
AARCH64_CPU_NAME("cortex-a72", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false,
|
||||
(AArch64::AEK_SIMD | AArch64::AEK_CRC | AArch64::AEK_CRYPTO))
|
||||
AARCH64_CPU_NAME("cyclone", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false,
|
||||
(AArch64::AEK_SIMD | AArch64::AEK_CRYPTO))
|
||||
AARCH64_CPU_NAME("exynos-m1", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false,
|
||||
(AArch64::AEK_SIMD | AArch64::AEK_CRC | AArch64::AEK_CRYPTO))
|
||||
AARCH64_CPU_NAME("kryo", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false,
|
||||
(AArch64::AEK_SIMD | AArch64::AEK_CRC | AArch64::AEK_CRYPTO))
|
||||
// Invalid CPU
|
||||
AARCH64_CPU_NAME("invalid", AK_INVALID, FK_INVALID, true, AArch64::AEK_INVALID)
|
||||
#undef AARCH64_CPU_NAME
|
|
@ -45,188 +45,188 @@ ARM_FPU("softvfp", FK_SOFTVFP, FV_NONE, NS_None, FR_None)
|
|||
#define ARM_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, ARCH_BASE_EXT)
|
||||
#endif
|
||||
ARM_ARCH("invalid", AK_INVALID, nullptr, nullptr,
|
||||
ARMBuildAttrs::CPUArch::Pre_v4, FK_NONE, AEK_NONE)
|
||||
ARMBuildAttrs::CPUArch::Pre_v4, FK_NONE, ARM::AEK_NONE)
|
||||
ARM_ARCH("armv2", AK_ARMV2, "2", "v2", ARMBuildAttrs::CPUArch::Pre_v4,
|
||||
FK_NONE, AEK_NONE)
|
||||
FK_NONE, ARM::AEK_NONE)
|
||||
ARM_ARCH("armv2a", AK_ARMV2A, "2A", "v2a", ARMBuildAttrs::CPUArch::Pre_v4,
|
||||
FK_NONE, AEK_NONE)
|
||||
FK_NONE, ARM::AEK_NONE)
|
||||
ARM_ARCH("armv3", AK_ARMV3, "3", "v3", ARMBuildAttrs::CPUArch::Pre_v4,
|
||||
FK_NONE, AEK_NONE)
|
||||
FK_NONE, ARM::AEK_NONE)
|
||||
ARM_ARCH("armv3m", AK_ARMV3M, "3M", "v3m", ARMBuildAttrs::CPUArch::Pre_v4,
|
||||
FK_NONE, AEK_NONE)
|
||||
FK_NONE, ARM::AEK_NONE)
|
||||
ARM_ARCH("armv4", AK_ARMV4, "4", "v4", ARMBuildAttrs::CPUArch::v4,
|
||||
FK_NONE, AEK_NONE)
|
||||
FK_NONE, ARM::AEK_NONE)
|
||||
ARM_ARCH("armv4t", AK_ARMV4T, "4T", "v4t", ARMBuildAttrs::CPUArch::v4T,
|
||||
FK_NONE, AEK_NONE)
|
||||
FK_NONE, ARM::AEK_NONE)
|
||||
ARM_ARCH("armv5t", AK_ARMV5T, "5T", "v5", ARMBuildAttrs::CPUArch::v5T,
|
||||
FK_NONE, AEK_NONE)
|
||||
FK_NONE, ARM::AEK_NONE)
|
||||
ARM_ARCH("armv5te", AK_ARMV5TE, "5TE", "v5e", ARMBuildAttrs::CPUArch::v5TE,
|
||||
FK_NONE, AEK_DSP)
|
||||
FK_NONE, ARM::AEK_DSP)
|
||||
ARM_ARCH("armv5tej", AK_ARMV5TEJ, "5TEJ", "v5e", ARMBuildAttrs::CPUArch::v5TEJ,
|
||||
FK_NONE, AEK_DSP)
|
||||
FK_NONE, ARM::AEK_DSP)
|
||||
ARM_ARCH("armv6", AK_ARMV6, "6", "v6", ARMBuildAttrs::CPUArch::v6,
|
||||
FK_VFPV2, AEK_DSP)
|
||||
FK_VFPV2, ARM::AEK_DSP)
|
||||
ARM_ARCH("armv6k", AK_ARMV6K, "6K", "v6k", ARMBuildAttrs::CPUArch::v6K,
|
||||
FK_VFPV2, AEK_DSP)
|
||||
FK_VFPV2, ARM::AEK_DSP)
|
||||
ARM_ARCH("armv6t2", AK_ARMV6T2, "6T2", "v6t2", ARMBuildAttrs::CPUArch::v6T2,
|
||||
FK_NONE, AEK_DSP)
|
||||
FK_NONE, ARM::AEK_DSP)
|
||||
ARM_ARCH("armv6kz", AK_ARMV6KZ, "6KZ", "v6kz", ARMBuildAttrs::CPUArch::v6KZ,
|
||||
FK_VFPV2, (AEK_SEC | AEK_DSP))
|
||||
FK_VFPV2, (ARM::AEK_SEC | ARM::AEK_DSP))
|
||||
ARM_ARCH("armv6-m", AK_ARMV6M, "6-M", "v6m", ARMBuildAttrs::CPUArch::v6_M,
|
||||
FK_NONE, AEK_NONE)
|
||||
FK_NONE, ARM::AEK_NONE)
|
||||
ARM_ARCH("armv7-a", AK_ARMV7A, "7-A", "v7", ARMBuildAttrs::CPUArch::v7,
|
||||
FK_NEON, AEK_DSP)
|
||||
FK_NEON, ARM::AEK_DSP)
|
||||
ARM_ARCH("armv7-r", AK_ARMV7R, "7-R", "v7r", ARMBuildAttrs::CPUArch::v7,
|
||||
FK_NONE, (AEK_HWDIV | AEK_DSP))
|
||||
FK_NONE, (ARM::AEK_HWDIV | ARM::AEK_DSP))
|
||||
ARM_ARCH("armv7-m", AK_ARMV7M, "7-M", "v7m", ARMBuildAttrs::CPUArch::v7,
|
||||
FK_NONE, AEK_HWDIV)
|
||||
FK_NONE, ARM::AEK_HWDIV)
|
||||
ARM_ARCH("armv7e-m", AK_ARMV7EM, "7E-M", "v7em", ARMBuildAttrs::CPUArch::v7E_M,
|
||||
FK_NONE, (AEK_HWDIV | AEK_DSP))
|
||||
FK_NONE, (ARM::AEK_HWDIV | ARM::AEK_DSP))
|
||||
ARM_ARCH("armv8-a", AK_ARMV8A, "8-A", "v8", ARMBuildAttrs::CPUArch::v8_A,
|
||||
FK_CRYPTO_NEON_FP_ARMV8, (AEK_SEC | AEK_MP | AEK_VIRT | AEK_HWDIVARM |
|
||||
AEK_HWDIV | AEK_DSP | AEK_CRC))
|
||||
FK_CRYPTO_NEON_FP_ARMV8, (ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP | ARM::AEK_CRC))
|
||||
ARM_ARCH("armv8.1-a", AK_ARMV8_1A, "8.1-A", "v8.1a", ARMBuildAttrs::CPUArch::v8_A,
|
||||
FK_CRYPTO_NEON_FP_ARMV8, (AEK_SEC | AEK_MP | AEK_VIRT | AEK_HWDIVARM |
|
||||
AEK_HWDIV | AEK_DSP | AEK_CRC))
|
||||
FK_CRYPTO_NEON_FP_ARMV8, (ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP | ARM::AEK_CRC))
|
||||
ARM_ARCH("armv8.2-a", AK_ARMV8_2A, "8.2-A", "v8.2a", ARMBuildAttrs::CPUArch::v8_A,
|
||||
FK_CRYPTO_NEON_FP_ARMV8, (AEK_SEC | AEK_MP | AEK_VIRT | AEK_HWDIVARM |
|
||||
AEK_HWDIV | AEK_DSP | AEK_CRC))
|
||||
FK_CRYPTO_NEON_FP_ARMV8, (ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
|
||||
ARM::AEK_HWDIV | ARM::AEK_DSP | ARM::AEK_CRC))
|
||||
ARM_ARCH("armv8-m.base", AK_ARMV8MBaseline, "8-M.Baseline", "v8m.base",
|
||||
ARMBuildAttrs::CPUArch::v8_M_Base, FK_NONE, AEK_HWDIV)
|
||||
ARMBuildAttrs::CPUArch::v8_M_Base, FK_NONE, ARM::AEK_HWDIV)
|
||||
ARM_ARCH("armv8-m.main", AK_ARMV8MMainline, "8-M.Mainline", "v8m.main",
|
||||
ARMBuildAttrs::CPUArch::v8_M_Main, FK_FPV5_D16, AEK_HWDIV)
|
||||
ARMBuildAttrs::CPUArch::v8_M_Main, FK_FPV5_D16, ARM::AEK_HWDIV)
|
||||
// Non-standard Arch names.
|
||||
ARM_ARCH("iwmmxt", AK_IWMMXT, "iwmmxt", "", ARMBuildAttrs::CPUArch::v5TE,
|
||||
FK_NONE, AEK_NONE)
|
||||
FK_NONE, ARM::AEK_NONE)
|
||||
ARM_ARCH("iwmmxt2", AK_IWMMXT2, "iwmmxt2", "", ARMBuildAttrs::CPUArch::v5TE,
|
||||
FK_NONE, AEK_NONE)
|
||||
FK_NONE, ARM::AEK_NONE)
|
||||
ARM_ARCH("xscale", AK_XSCALE, "xscale", "v5e", ARMBuildAttrs::CPUArch::v5TE,
|
||||
FK_NONE, AEK_NONE)
|
||||
FK_NONE, ARM::AEK_NONE)
|
||||
ARM_ARCH("armv7s", AK_ARMV7S, "7-S", "v7s", ARMBuildAttrs::CPUArch::v7,
|
||||
FK_NEON_VFPV4, AEK_DSP)
|
||||
FK_NEON_VFPV4, ARM::AEK_DSP)
|
||||
ARM_ARCH("armv7k", AK_ARMV7K, "7-K", "v7k", ARMBuildAttrs::CPUArch::v7,
|
||||
FK_NONE, AEK_DSP)
|
||||
FK_NONE, ARM::AEK_DSP)
|
||||
#undef ARM_ARCH
|
||||
|
||||
#ifndef ARM_ARCH_EXT_NAME
|
||||
#define ARM_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE)
|
||||
#endif
|
||||
// FIXME: This would be nicer were it tablegen
|
||||
ARM_ARCH_EXT_NAME("invalid", AEK_INVALID, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("none", AEK_NONE, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("crc", AEK_CRC, "+crc", "-crc")
|
||||
ARM_ARCH_EXT_NAME("crypto", AEK_CRYPTO, "+crypto","-crypto")
|
||||
ARM_ARCH_EXT_NAME("dsp", AEK_DSP, "+dsp", "-dsp")
|
||||
ARM_ARCH_EXT_NAME("fp", AEK_FP, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("idiv", (AEK_HWDIVARM | AEK_HWDIV), nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("mp", AEK_MP, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("simd", AEK_SIMD, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("sec", AEK_SEC, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("virt", AEK_VIRT, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("fp16", AEK_FP16, "+fullfp16", "-fullfp16")
|
||||
ARM_ARCH_EXT_NAME("os", AEK_OS, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("iwmmxt", AEK_IWMMXT, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("iwmmxt2", AEK_IWMMXT2, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("maverick", AEK_MAVERICK, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("xscale", AEK_XSCALE, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("invalid", ARM::AEK_INVALID, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("none", ARM::AEK_NONE, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("crc", ARM::AEK_CRC, "+crc", "-crc")
|
||||
ARM_ARCH_EXT_NAME("crypto", ARM::AEK_CRYPTO, "+crypto","-crypto")
|
||||
ARM_ARCH_EXT_NAME("dsp", ARM::AEK_DSP, "+dsp", "-dsp")
|
||||
ARM_ARCH_EXT_NAME("fp", ARM::AEK_FP, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("idiv", (ARM::AEK_HWDIVARM | ARM::AEK_HWDIV), nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("mp", ARM::AEK_MP, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("simd", ARM::AEK_SIMD, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("sec", ARM::AEK_SEC, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("virt", ARM::AEK_VIRT, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("fp16", ARM::AEK_FP16, "+fullfp16", "-fullfp16")
|
||||
ARM_ARCH_EXT_NAME("os", ARM::AEK_OS, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("iwmmxt", ARM::AEK_IWMMXT, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("iwmmxt2", ARM::AEK_IWMMXT2, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("maverick", ARM::AEK_MAVERICK, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("xscale", ARM::AEK_XSCALE, nullptr, nullptr)
|
||||
#undef ARM_ARCH_EXT_NAME
|
||||
|
||||
#ifndef ARM_HW_DIV_NAME
|
||||
#define ARM_HW_DIV_NAME(NAME, ID)
|
||||
#endif
|
||||
ARM_HW_DIV_NAME("invalid", AEK_INVALID)
|
||||
ARM_HW_DIV_NAME("none", AEK_NONE)
|
||||
ARM_HW_DIV_NAME("thumb", AEK_HWDIV)
|
||||
ARM_HW_DIV_NAME("arm", AEK_HWDIVARM)
|
||||
ARM_HW_DIV_NAME("arm,thumb", (AEK_HWDIVARM | AEK_HWDIV))
|
||||
ARM_HW_DIV_NAME("invalid", ARM::AEK_INVALID)
|
||||
ARM_HW_DIV_NAME("none", ARM::AEK_NONE)
|
||||
ARM_HW_DIV_NAME("thumb", ARM::AEK_HWDIV)
|
||||
ARM_HW_DIV_NAME("arm", ARM::AEK_HWDIVARM)
|
||||
ARM_HW_DIV_NAME("arm,thumb", (ARM::AEK_HWDIVARM | ARM::AEK_HWDIV))
|
||||
#undef ARM_HW_DIV_NAME
|
||||
|
||||
#ifndef ARM_CPU_NAME
|
||||
#define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT)
|
||||
#endif
|
||||
ARM_CPU_NAME("arm2", AK_ARMV2, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("arm3", AK_ARMV2A, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("arm6", AK_ARMV3, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("arm7m", AK_ARMV3M, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("arm8", AK_ARMV4, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm810", AK_ARMV4, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("strongarm", AK_ARMV4, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("strongarm110", AK_ARMV4, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("strongarm1100", AK_ARMV4, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("strongarm1110", AK_ARMV4, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm7tdmi", AK_ARMV4T, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("arm7tdmi-s", AK_ARMV4T, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm710t", AK_ARMV4T, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm720t", AK_ARMV4T, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm9", AK_ARMV4T, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm9tdmi", AK_ARMV4T, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm920", AK_ARMV4T, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm920t", AK_ARMV4T, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm922t", AK_ARMV4T, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm9312", AK_ARMV4T, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm940t", AK_ARMV4T, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("ep9312", AK_ARMV4T, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm10tdmi", AK_ARMV5T, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("arm1020t", AK_ARMV5T, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm9e", AK_ARMV5TE, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm946e-s", AK_ARMV5TE, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm966e-s", AK_ARMV5TE, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm968e-s", AK_ARMV5TE, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm10e", AK_ARMV5TE, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm1020e", AK_ARMV5TE, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm1022e", AK_ARMV5TE, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("arm926ej-s", AK_ARMV5TEJ, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("arm1136j-s", AK_ARMV6, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm1136jf-s", AK_ARMV6, FK_VFPV2, true, AEK_NONE)
|
||||
ARM_CPU_NAME("arm1136jz-s", AK_ARMV6, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm1176j-s", AK_ARMV6K, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("arm1176jz-s", AK_ARMV6KZ, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("mpcore", AK_ARMV6K, FK_VFPV2, false, AEK_NONE)
|
||||
ARM_CPU_NAME("mpcorenovfp", AK_ARMV6K, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("arm1176jzf-s", AK_ARMV6KZ, FK_VFPV2, true, AEK_NONE)
|
||||
ARM_CPU_NAME("arm1156t2-s", AK_ARMV6T2, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("arm1156t2f-s", AK_ARMV6T2, FK_VFPV2, false, AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-m0", AK_ARMV6M, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-m0plus", AK_ARMV6M, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-m1", AK_ARMV6M, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("sc000", AK_ARMV6M, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-a5", AK_ARMV7A, FK_NEON_VFPV4, false, (AEK_SEC | AEK_MP))
|
||||
ARM_CPU_NAME("arm2", AK_ARMV2, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm3", AK_ARMV2A, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm6", AK_ARMV3, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm7m", AK_ARMV3M, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm8", AK_ARMV4, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm810", AK_ARMV4, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("strongarm", AK_ARMV4, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("strongarm110", AK_ARMV4, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("strongarm1100", AK_ARMV4, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("strongarm1110", AK_ARMV4, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm7tdmi", AK_ARMV4T, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm7tdmi-s", AK_ARMV4T, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm710t", AK_ARMV4T, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm720t", AK_ARMV4T, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm9", AK_ARMV4T, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm9tdmi", AK_ARMV4T, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm920", AK_ARMV4T, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm920t", AK_ARMV4T, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm922t", AK_ARMV4T, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm9312", AK_ARMV4T, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm940t", AK_ARMV4T, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("ep9312", AK_ARMV4T, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm10tdmi", AK_ARMV5T, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm1020t", AK_ARMV5T, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm9e", AK_ARMV5TE, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm946e-s", AK_ARMV5TE, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm966e-s", AK_ARMV5TE, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm968e-s", AK_ARMV5TE, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm10e", AK_ARMV5TE, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm1020e", AK_ARMV5TE, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm1022e", AK_ARMV5TE, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm926ej-s", AK_ARMV5TEJ, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm1136j-s", AK_ARMV6, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm1136jf-s", AK_ARMV6, FK_VFPV2, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm1136jz-s", AK_ARMV6, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm1176j-s", AK_ARMV6K, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm1176jz-s", AK_ARMV6KZ, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("mpcore", AK_ARMV6K, FK_VFPV2, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("mpcorenovfp", AK_ARMV6K, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm1176jzf-s", AK_ARMV6KZ, FK_VFPV2, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm1156t2-s", AK_ARMV6T2, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("arm1156t2f-s", AK_ARMV6T2, FK_VFPV2, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-m0", AK_ARMV6M, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-m0plus", AK_ARMV6M, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-m1", AK_ARMV6M, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("sc000", AK_ARMV6M, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-a5", AK_ARMV7A, FK_NEON_VFPV4, false, (ARM::AEK_SEC | ARM::AEK_MP))
|
||||
ARM_CPU_NAME("cortex-a7", AK_ARMV7A, FK_NEON_VFPV4, false,
|
||||
(AEK_SEC | AEK_MP | AEK_VIRT | AEK_HWDIVARM | AEK_HWDIV))
|
||||
ARM_CPU_NAME("cortex-a8", AK_ARMV7A, FK_NEON, true, AEK_SEC)
|
||||
ARM_CPU_NAME("cortex-a9", AK_ARMV7A, FK_NEON_FP16, false, (AEK_SEC | AEK_MP))
|
||||
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM | ARM::AEK_HWDIV))
|
||||
ARM_CPU_NAME("cortex-a8", AK_ARMV7A, FK_NEON, true, ARM::AEK_SEC)
|
||||
ARM_CPU_NAME("cortex-a9", AK_ARMV7A, FK_NEON_FP16, false, (ARM::AEK_SEC | ARM::AEK_MP))
|
||||
ARM_CPU_NAME("cortex-a12", AK_ARMV7A, FK_NEON_VFPV4, false,
|
||||
(AEK_SEC | AEK_MP | AEK_VIRT | AEK_HWDIVARM | AEK_HWDIV))
|
||||
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM | ARM::AEK_HWDIV))
|
||||
ARM_CPU_NAME("cortex-a15", AK_ARMV7A, FK_NEON_VFPV4, false,
|
||||
(AEK_SEC | AEK_MP | AEK_VIRT | AEK_HWDIVARM | AEK_HWDIV))
|
||||
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM | ARM::AEK_HWDIV))
|
||||
ARM_CPU_NAME("cortex-a17", AK_ARMV7A, FK_NEON_VFPV4, false,
|
||||
(AEK_SEC | AEK_MP | AEK_VIRT | AEK_HWDIVARM | AEK_HWDIV))
|
||||
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM | ARM::AEK_HWDIV))
|
||||
ARM_CPU_NAME("krait", AK_ARMV7A, FK_NEON_VFPV4, false,
|
||||
(AEK_HWDIVARM | AEK_HWDIV))
|
||||
ARM_CPU_NAME("cortex-r4", AK_ARMV7R, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-r4f", AK_ARMV7R, FK_VFPV3_D16, false, AEK_NONE)
|
||||
(ARM::AEK_HWDIVARM | ARM::AEK_HWDIV))
|
||||
ARM_CPU_NAME("cortex-r4", AK_ARMV7R, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-r4f", AK_ARMV7R, FK_VFPV3_D16, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-r5", AK_ARMV7R, FK_VFPV3_D16, false,
|
||||
(AEK_MP | AEK_HWDIVARM))
|
||||
(ARM::AEK_MP | ARM::AEK_HWDIVARM))
|
||||
ARM_CPU_NAME("cortex-r7", AK_ARMV7R, FK_VFPV3_D16_FP16, false,
|
||||
(AEK_MP | AEK_HWDIVARM))
|
||||
(ARM::AEK_MP | ARM::AEK_HWDIVARM))
|
||||
ARM_CPU_NAME("cortex-r8", AK_ARMV7R, FK_VFPV3_D16_FP16, false,
|
||||
(AEK_MP | AEK_HWDIVARM))
|
||||
ARM_CPU_NAME("sc300", AK_ARMV7M, FK_NONE, false, AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-m3", AK_ARMV7M, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-m4", AK_ARMV7EM, FK_FPV4_SP_D16, true, AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-m7", AK_ARMV7EM, FK_FPV5_D16, false, AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-a32", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, AEK_CRC)
|
||||
ARM_CPU_NAME("cortex-a35", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, AEK_CRC)
|
||||
ARM_CPU_NAME("cortex-a53", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, true, AEK_CRC)
|
||||
ARM_CPU_NAME("cortex-a57", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, AEK_CRC)
|
||||
ARM_CPU_NAME("cortex-a72", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, AEK_CRC)
|
||||
ARM_CPU_NAME("cyclone", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, AEK_CRC)
|
||||
ARM_CPU_NAME("exynos-m1", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, AEK_CRC)
|
||||
(ARM::AEK_MP | ARM::AEK_HWDIVARM))
|
||||
ARM_CPU_NAME("sc300", AK_ARMV7M, FK_NONE, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-m3", AK_ARMV7M, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-m4", AK_ARMV7EM, FK_FPV4_SP_D16, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-m7", AK_ARMV7EM, FK_FPV5_D16, false, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("cortex-a32", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, ARM::AEK_CRC)
|
||||
ARM_CPU_NAME("cortex-a35", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, ARM::AEK_CRC)
|
||||
ARM_CPU_NAME("cortex-a53", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, true, ARM::AEK_CRC)
|
||||
ARM_CPU_NAME("cortex-a57", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, ARM::AEK_CRC)
|
||||
ARM_CPU_NAME("cortex-a72", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, ARM::AEK_CRC)
|
||||
ARM_CPU_NAME("cyclone", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, ARM::AEK_CRC)
|
||||
ARM_CPU_NAME("exynos-m1", AK_ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, ARM::AEK_CRC)
|
||||
// Non-standard Arch names.
|
||||
ARM_CPU_NAME("iwmmxt", AK_IWMMXT, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("xscale", AK_XSCALE, FK_NONE, true, AEK_NONE)
|
||||
ARM_CPU_NAME("iwmmxt", AK_IWMMXT, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("xscale", AK_XSCALE, FK_NONE, true, ARM::AEK_NONE)
|
||||
ARM_CPU_NAME("swift", AK_ARMV7S, FK_NEON_VFPV4, true,
|
||||
(AEK_HWDIVARM | AEK_HWDIV))
|
||||
(ARM::AEK_HWDIVARM | ARM::AEK_HWDIV))
|
||||
// Invalid CPU
|
||||
ARM_CPU_NAME("invalid", AK_INVALID, FK_INVALID, true, AEK_INVALID)
|
||||
ARM_CPU_NAME("invalid", AK_INVALID, FK_INVALID, true, ARM::AEK_INVALID)
|
||||
#undef ARM_CPU_NAME
|
||||
|
|
|
@ -140,6 +140,60 @@ unsigned parseArchProfile(StringRef Arch);
|
|||
unsigned parseArchVersion(StringRef Arch);
|
||||
|
||||
} // namespace ARM
|
||||
|
||||
// FIXME:This should be made into class design,to avoid dupplication.
|
||||
namespace AArch64 {
|
||||
|
||||
// Arch extension modifiers for CPUs.
|
||||
enum ArchExtKind : unsigned {
|
||||
AEK_INVALID = 0x0,
|
||||
AEK_NONE = 0x1,
|
||||
AEK_CRC = 0x2,
|
||||
AEK_CRYPTO = 0x4,
|
||||
AEK_FP = 0x8,
|
||||
AEK_SIMD = 0x10,
|
||||
AEK_FP16 = 0x20,
|
||||
AEK_PROFILE = 0x40
|
||||
};
|
||||
|
||||
StringRef getCanonicalArchName(StringRef Arch);
|
||||
|
||||
// Information by ID
|
||||
StringRef getFPUName(unsigned FPUKind);
|
||||
unsigned getFPUVersion(unsigned FPUKind);
|
||||
unsigned getFPUNeonSupportLevel(unsigned FPUKind);
|
||||
unsigned getFPURestriction(unsigned FPUKind);
|
||||
|
||||
// FIXME: These should be moved to TargetTuple once it exists
|
||||
bool getFPUFeatures(unsigned FPUKind, std::vector<const char *> &Features);
|
||||
bool getExtensionFeatures(unsigned Extensions,
|
||||
std::vector<const char*> &Features);
|
||||
bool getArchFeatures(unsigned ArchKind, std::vector<const char *> &Features);
|
||||
|
||||
StringRef getArchName(unsigned ArchKind);
|
||||
unsigned getArchAttr(unsigned ArchKind);
|
||||
StringRef getCPUAttr(unsigned ArchKind);
|
||||
StringRef getSubArch(unsigned ArchKind);
|
||||
StringRef getArchExtName(unsigned ArchExtKind);
|
||||
const char *getArchExtFeature(StringRef ArchExt);
|
||||
unsigned checkArchVersion(StringRef Arch);
|
||||
|
||||
// Information by Name
|
||||
unsigned getDefaultFPU(StringRef CPU, unsigned ArchKind);
|
||||
unsigned getDefaultExtensions(StringRef CPU, unsigned ArchKind);
|
||||
StringRef getDefaultCPU(StringRef Arch);
|
||||
|
||||
// Parser
|
||||
unsigned parseFPU(StringRef FPU);
|
||||
unsigned parseArch(StringRef Arch);
|
||||
unsigned parseArchExt(StringRef ArchExt);
|
||||
unsigned parseCPUArch(StringRef CPU);
|
||||
unsigned parseArchISA(StringRef Arch);
|
||||
unsigned parseArchEndian(StringRef Arch);
|
||||
unsigned parseArchProfile(StringRef Arch);
|
||||
unsigned parseArchVersion(StringRef Arch);
|
||||
|
||||
} // namespace AArch64
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
using namespace llvm;
|
||||
using namespace ARM;
|
||||
using namespace AArch64;
|
||||
|
||||
namespace {
|
||||
|
||||
|
@ -75,6 +76,11 @@ static const struct {
|
|||
{NAME, sizeof(NAME) - 1, CPU_ATTR, sizeof(CPU_ATTR) - 1, SUB_ARCH, \
|
||||
sizeof(SUB_ARCH) - 1, ARCH_FPU, ARCH_BASE_EXT, ID, ARCH_ATTR},
|
||||
#include "llvm/Support/ARMTargetParser.def"
|
||||
},AArch64ARCHNames[] = {
|
||||
#define AARCH64_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, ARCH_BASE_EXT) \
|
||||
{NAME, sizeof(NAME) - 1, CPU_ATTR, sizeof(CPU_ATTR) - 1, SUB_ARCH, \
|
||||
sizeof(SUB_ARCH) - 1, ARCH_FPU, ARCH_BASE_EXT, ID, ARCH_ATTR},
|
||||
#include "llvm/Support/AArch64TargetParser.def"
|
||||
};
|
||||
|
||||
// List of Arch Extension names.
|
||||
|
@ -91,6 +97,10 @@ static const struct {
|
|||
#define ARM_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE) \
|
||||
{ NAME, sizeof(NAME) - 1, ID, FEATURE, NEGFEATURE },
|
||||
#include "llvm/Support/ARMTargetParser.def"
|
||||
},AArch64ARCHExtNames[] = {
|
||||
#define AARCH64_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE) \
|
||||
{ NAME, sizeof(NAME) - 1, ID, FEATURE, NEGFEATURE },
|
||||
#include "llvm/Support/AArch64TargetParser.def"
|
||||
};
|
||||
|
||||
// List of HWDiv names (use getHWDivSynonym) and which architectural
|
||||
|
@ -124,6 +134,10 @@ static const struct {
|
|||
#define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \
|
||||
{ NAME, sizeof(NAME) - 1, ID, IS_DEFAULT, DEFAULT_EXT },
|
||||
#include "llvm/Support/ARMTargetParser.def"
|
||||
},AArch64CPUNames[] = {
|
||||
#define AARCH64_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \
|
||||
{ NAME, sizeof(NAME) - 1, ID, IS_DEFAULT, DEFAULT_EXT },
|
||||
#include "llvm/Support/AArch64TargetParser.def"
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
@ -369,6 +383,153 @@ StringRef llvm::ARM::getDefaultCPU(StringRef Arch) {
|
|||
return "generic";
|
||||
}
|
||||
|
||||
StringRef llvm::AArch64::getFPUName(unsigned FPUKind) {
|
||||
return ARM::getFPUName(FPUKind);
|
||||
}
|
||||
|
||||
unsigned llvm::AArch64::getFPUVersion(unsigned FPUKind) {
|
||||
return ARM::getFPUVersion(FPUKind);
|
||||
}
|
||||
|
||||
unsigned llvm::AArch64::getFPUNeonSupportLevel(unsigned FPUKind) {
|
||||
return ARM::getFPUNeonSupportLevel( FPUKind);
|
||||
}
|
||||
|
||||
unsigned llvm::AArch64::getFPURestriction(unsigned FPUKind) {
|
||||
return ARM::getFPURestriction(FPUKind);
|
||||
}
|
||||
|
||||
unsigned llvm::AArch64::getDefaultFPU(StringRef CPU, unsigned ArchKind) {
|
||||
if (CPU == "generic")
|
||||
return AArch64ARCHNames[ArchKind].DefaultFPU;
|
||||
|
||||
return StringSwitch<unsigned>(CPU)
|
||||
#define AARCH64_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \
|
||||
.Case(NAME, DEFAULT_FPU)
|
||||
#include "llvm/Support/AArch64TargetParser.def"
|
||||
.Default(ARM::FK_INVALID);
|
||||
}
|
||||
|
||||
unsigned llvm::AArch64::getDefaultExtensions(StringRef CPU, unsigned ArchKind) {
|
||||
if (CPU == "generic")
|
||||
return AArch64ARCHNames[ArchKind].ArchBaseExtensions;
|
||||
|
||||
return StringSwitch<unsigned>(CPU)
|
||||
#define AARCH64_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \
|
||||
.Case(NAME, AArch64ARCHNames[ID].ArchBaseExtensions | DEFAULT_EXT)
|
||||
#include "llvm/Support/AArch64TargetParser.def"
|
||||
.Default(AArch64::AEK_INVALID);
|
||||
}
|
||||
|
||||
bool llvm::AArch64::getExtensionFeatures(unsigned Extensions,
|
||||
std::vector<const char *> &Features) {
|
||||
|
||||
if (Extensions == AArch64::AEK_INVALID)
|
||||
return false;
|
||||
|
||||
if (Extensions & AArch64::AEK_FP)
|
||||
Features.push_back("+fp-armv8");
|
||||
if (Extensions & AArch64::AEK_SIMD)
|
||||
Features.push_back("+neon");
|
||||
if (Extensions & AArch64::AEK_CRC)
|
||||
Features.push_back("+crc");
|
||||
if (Extensions & AArch64::AEK_CRYPTO)
|
||||
Features.push_back("+crypto");
|
||||
if (Extensions & AArch64::AEK_FP16)
|
||||
Features.push_back("+fullfp16");
|
||||
if (Extensions & AArch64::AEK_PROFILE)
|
||||
Features.push_back("+spe");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool llvm::AArch64::getFPUFeatures(unsigned FPUKind,
|
||||
std::vector<const char *> &Features) {
|
||||
return ARM::getFPUFeatures(FPUKind, Features);
|
||||
}
|
||||
|
||||
bool llvm::AArch64::getArchFeatures(unsigned ArchKind,
|
||||
std::vector<const char *> &Features) {
|
||||
if (ArchKind == ARM::AK_INVALID || ArchKind >= ARM::AK_LAST)
|
||||
return false;
|
||||
|
||||
if (ArchKind == ARM::AK_ARMV8_1A)
|
||||
Features.push_back("+v8.1a");
|
||||
if (ArchKind == ARM::AK_ARMV8_2A)
|
||||
Features.push_back("+v8.2a");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
StringRef llvm::AArch64::getArchName(unsigned ArchKind) {
|
||||
if (ArchKind >= ARM::AK_LAST)
|
||||
return StringRef();
|
||||
return AArch64ARCHNames[ArchKind].getName();
|
||||
}
|
||||
|
||||
StringRef llvm::AArch64::getCPUAttr(unsigned ArchKind) {
|
||||
if (ArchKind == ARM::AK_INVALID || ArchKind >= ARM::AK_LAST)
|
||||
return StringRef();
|
||||
return AArch64ARCHNames[ArchKind].getCPUAttr();
|
||||
}
|
||||
|
||||
StringRef llvm::AArch64::getSubArch(unsigned ArchKind) {
|
||||
if (ArchKind == ARM::AK_INVALID || ArchKind >= ARM::AK_LAST)
|
||||
return StringRef();
|
||||
return AArch64ARCHNames[ArchKind].getSubArch();
|
||||
}
|
||||
|
||||
unsigned llvm::AArch64::getArchAttr(unsigned ArchKind) {
|
||||
if (ArchKind >= ARM::AK_LAST)
|
||||
return ARMBuildAttrs::CPUArch::v8_A;
|
||||
return AArch64ARCHNames[ArchKind].ArchAttr;
|
||||
}
|
||||
|
||||
StringRef llvm::AArch64::getArchExtName(unsigned AArchExtKind) {
|
||||
for (const auto AE : AArch64ARCHExtNames) {
|
||||
if (AArchExtKind == AE.ID)
|
||||
return AE.getName();
|
||||
}
|
||||
return StringRef();
|
||||
}
|
||||
|
||||
const char *llvm::AArch64::getArchExtFeature(StringRef ArchExt) {
|
||||
if (ArchExt.startswith("no")) {
|
||||
StringRef ArchExtBase(ArchExt.substr(2));
|
||||
for (const auto AE : AArch64ARCHExtNames) {
|
||||
if (AE.NegFeature && ArchExtBase == AE.getName())
|
||||
return AE.NegFeature;
|
||||
}
|
||||
}
|
||||
for (const auto AE : AArch64ARCHExtNames) {
|
||||
if (AE.Feature && ArchExt == AE.getName())
|
||||
return AE.Feature;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
StringRef llvm::AArch64::getDefaultCPU(StringRef Arch) {
|
||||
unsigned AK = parseArch(Arch);
|
||||
if (AK == ARM::AK_INVALID)
|
||||
return StringRef();
|
||||
|
||||
// Look for multiple AKs to find the default for pair AK+Name.
|
||||
for (const auto CPU : AArch64CPUNames) {
|
||||
if (CPU.ArchID == AK && CPU.Default)
|
||||
return CPU.getName();
|
||||
}
|
||||
|
||||
// If we can't find a default then target the architecture instead
|
||||
return "generic";
|
||||
}
|
||||
|
||||
unsigned llvm::AArch64::checkArchVersion(StringRef Arch) {
|
||||
if (Arch[0] == 'v' && std::isdigit(Arch[1]))
|
||||
return (Arch[1] - 48);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// Parsers
|
||||
// ======================================================= //
|
||||
|
@ -607,3 +768,61 @@ unsigned llvm::ARM::parseArchVersion(StringRef Arch) {
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
StringRef llvm::AArch64::getCanonicalArchName(StringRef Arch) {
|
||||
return ARM::getCanonicalArchName(Arch);
|
||||
}
|
||||
|
||||
unsigned llvm::AArch64::parseFPU(StringRef FPU) {
|
||||
return ARM::parseFPU(FPU);
|
||||
}
|
||||
|
||||
// Allows partial match, ex. "v8a" matches "armv8a".
|
||||
unsigned llvm::AArch64::parseArch(StringRef Arch) {
|
||||
Arch = getCanonicalArchName(Arch);
|
||||
if (checkArchVersion(Arch) < 8)
|
||||
return ARM::AK_INVALID;
|
||||
|
||||
StringRef Syn = getArchSynonym(Arch);
|
||||
for (const auto A : AArch64ARCHNames) {
|
||||
if (A.getName().endswith(Syn))
|
||||
return A.ID;
|
||||
}
|
||||
return ARM::AK_INVALID;
|
||||
}
|
||||
|
||||
unsigned llvm::AArch64::parseArchExt(StringRef ArchExt) {
|
||||
for (const auto A : AArch64ARCHExtNames) {
|
||||
if (ArchExt == A.getName())
|
||||
return A.ID;
|
||||
}
|
||||
return AArch64::AEK_INVALID;
|
||||
}
|
||||
|
||||
unsigned llvm::AArch64::parseCPUArch(StringRef CPU) {
|
||||
for (const auto C : AArch64CPUNames) {
|
||||
if (CPU == C.getName())
|
||||
return C.ArchID;
|
||||
}
|
||||
return ARM::AK_INVALID;
|
||||
}
|
||||
|
||||
// ARM, Thumb, AArch64
|
||||
unsigned llvm::AArch64::parseArchISA(StringRef Arch) {
|
||||
return ARM::parseArchISA(Arch);
|
||||
}
|
||||
|
||||
// Little/Big endian
|
||||
unsigned llvm::AArch64::parseArchEndian(StringRef Arch) {
|
||||
return ARM::parseArchEndian(Arch);
|
||||
}
|
||||
|
||||
// Profile A/R/M
|
||||
unsigned llvm::AArch64::parseArchProfile(StringRef Arch) {
|
||||
return ARM::parseArchProfile(Arch);
|
||||
}
|
||||
|
||||
// Version number (ex. v8 = 8).
|
||||
unsigned llvm::AArch64::parseArchVersion(StringRef Arch) {
|
||||
return ARM::parseArchVersion(Arch);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue