mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-28 06:24:57 +00:00
First ARMTargetParser FIXME, conservatively changing the way we parse CPUs in the back-end. Still not perfect, with a lot of special cases, but moving towards a more generic solution. Moving all logic to the target parser made some unwritten assumptions about architectures in Clang to break. I've added a lot of architectures required by Clang, and default to CPUs that Clang believes it should (and I agree). I've also added a lot of unit tests, with the correct CPU for each architecture, and Clang seems to be working correctly, too. It also became clear that using "unsigned ID" as the argument for the get methods makes it hard to know what ID, so I also changed the argument names to match the enum type names. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237797 91177308-0d34-0410-b5e6-96231b3b80d8
126 lines
3.0 KiB
C++
126 lines
3.0 KiB
C++
//===-- TargetParser - Parser for target features ---------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements a target parser to recognise hardware features such as
|
|
// FPU/CPU/ARCH names as well as specific support such as HDIV, etc.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_SUPPORT_TARGETPARSER_H
|
|
#define LLVM_SUPPORT_TARGETPARSER_H
|
|
|
|
namespace llvm {
|
|
class StringRef;
|
|
|
|
// Target specific information into their own namespaces. These should be
|
|
// generated from TableGen because the information is already there, and there
|
|
// is where new information about targets will be added.
|
|
// FIXME: To TableGen this we need to make some table generated files available
|
|
// even if the back-end is not compiled with LLVM, plus we need to create a new
|
|
// back-end to TableGen to create these clean tables.
|
|
namespace ARM {
|
|
// FPU names.
|
|
enum FPUKind {
|
|
FK_INVALID = 0,
|
|
FK_VFP,
|
|
FK_VFPV2,
|
|
FK_VFPV3,
|
|
FK_VFPV3_D16,
|
|
FK_VFPV4,
|
|
FK_VFPV4_D16,
|
|
FK_FPV5_D16,
|
|
FK_FP_ARMV8,
|
|
FK_NEON,
|
|
FK_NEON_VFPV4,
|
|
FK_NEON_FP_ARMV8,
|
|
FK_CRYPTO_NEON_FP_ARMV8,
|
|
FK_SOFTVFP,
|
|
FK_LAST
|
|
};
|
|
|
|
// Arch names.
|
|
enum ArchKind {
|
|
AK_INVALID = 0,
|
|
AK_ARMV2,
|
|
AK_ARMV2A,
|
|
AK_ARMV3,
|
|
AK_ARMV3M,
|
|
AK_ARMV4,
|
|
AK_ARMV4T,
|
|
AK_ARMV5,
|
|
AK_ARMV5T,
|
|
AK_ARMV5TE,
|
|
AK_ARMV6,
|
|
AK_ARMV6J,
|
|
AK_ARMV6K,
|
|
AK_ARMV6T2,
|
|
AK_ARMV6Z,
|
|
AK_ARMV6ZK,
|
|
AK_ARMV6M,
|
|
AK_ARMV7,
|
|
AK_ARMV7A,
|
|
AK_ARMV7R,
|
|
AK_ARMV7M,
|
|
AK_ARMV8A,
|
|
AK_ARMV8_1A,
|
|
// Non-standard Arch names.
|
|
AK_IWMMXT,
|
|
AK_IWMMXT2,
|
|
AK_XSCALE,
|
|
AK_ARMV5E,
|
|
AK_ARMV5TEJ,
|
|
AK_ARMV6SM,
|
|
AK_ARMV7L,
|
|
AK_ARMV7S,
|
|
AK_ARMV7EM,
|
|
AK_LAST
|
|
};
|
|
|
|
// Arch extension modifiers for CPUs.
|
|
enum ArchExtKind {
|
|
AEK_INVALID = 0,
|
|
AEK_CRC,
|
|
AEK_CRYPTO,
|
|
AEK_FP,
|
|
AEK_HWDIV,
|
|
AEK_MP,
|
|
AEK_SEC,
|
|
AEK_VIRT,
|
|
AEK_LAST
|
|
};
|
|
|
|
} // namespace ARM
|
|
|
|
// Target Parsers, one per architecture.
|
|
class ARMTargetParser {
|
|
static StringRef getFPUSynonym(StringRef FPU);
|
|
static StringRef getArchSynonym(StringRef Arch);
|
|
|
|
public:
|
|
static StringRef getCanonicalArchName(StringRef Arch);
|
|
|
|
// Information by ID
|
|
static const char * getFPUName(unsigned FPUKind);
|
|
static const char * getArchName(unsigned ArchKind);
|
|
static unsigned getArchDefaultCPUArch(unsigned ArchKind);
|
|
static const char * getArchDefaultCPUName(unsigned ArchKind);
|
|
static const char * getArchExtName(unsigned ArchExtKind);
|
|
static const char * getDefaultCPU(StringRef Arch);
|
|
|
|
// Parser
|
|
static unsigned parseFPU(StringRef FPU);
|
|
static unsigned parseArch(StringRef Arch);
|
|
static unsigned parseArchExt(StringRef ArchExt);
|
|
static unsigned parseCPUArch(StringRef CPU);
|
|
};
|
|
|
|
} // namespace llvm
|
|
|
|
#endif
|