[LoongArch 1/6] Add triples loongarch{32,64} for the upcoming LoongArch target

This is the first patch to incrementally add an MC layer for LoongArch to LLVM.
This patch also adds unit testcases for these new triples.

RFC for adding this new backend:
https://lists.llvm.org/pipermail/llvm-dev/2021-December/154371.html

Differential revision: https://reviews.llvm.org/D115857
This commit is contained in:
Lu Weining 2022-02-10 09:09:32 +00:00 committed by Renato Golin
parent fe0bf7d469
commit 42fd2bfc90
5 changed files with 83 additions and 0 deletions

View File

@ -153,6 +153,10 @@ E: sabre@nondot.org
W: http://nondot.org/~sabre/
D: Everything not covered by someone else
N: Weining Lu
E: luweining@loongson.cn
D: LoongArch backend (lib/Target/LoongArch/*)
N: David Majnemer
E: david.majnemer@gmail.com
D: IR Constant Folder, InstCombine

View File

@ -107,6 +107,11 @@ C-SKY
* `C-SKY Architecture User Guide <https://github.com/c-sky/csky-doc/blob/master/CSKY%20Architecture%20user_guide.pdf>`_
* `C-SKY V2 ABI <https://github.com/c-sky/csky-doc/blob/master/C-SKY_V2_CPU_Applications_Binary_Interface_Standards_Manual.pdf>`_
LoongArch
---------
* `LoongArch Reference Manual - Volume 1: Basic Architecture <https://loongson.github.io/LoongArch-Documentation/LoongArch-Vol1-EN.html>`_
* `LoongArch ELF ABI specification <https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html>`_
SPARC
-----

View File

@ -57,6 +57,8 @@ public:
bpfeb, // eBPF or extended BPF or 64-bit BPF (big endian)
csky, // CSKY: csky
hexagon, // Hexagon: hexagon
loongarch32, // LoongArch (32-bit): loongarch32
loongarch64, // LoongArch (64-bit): loongarch64
m68k, // M68k: Motorola 680x0 family
mips, // MIPS: mips, mipsallegrex, mipsr6
mipsel, // MIPSEL: mipsel, mipsallegrexe, mipsr6el
@ -774,6 +776,11 @@ public:
: PointerWidth == 64;
}
/// Tests whether the target is LoongArch (32- and 64-bit).
bool isLoongArch() const {
return getArch() == Triple::loongarch32 || getArch() == Triple::loongarch64;
}
/// Tests whether the target is MIPS 32-bit (little and big endian).
bool isMIPS32() const {
return getArch() == Triple::mips || getArch() == Triple::mipsel;

View File

@ -44,6 +44,8 @@ StringRef Triple::getArchTypeName(ArchType Kind) {
case lanai: return "lanai";
case le32: return "le32";
case le64: return "le64";
case loongarch32: return "loongarch32";
case loongarch64: return "loongarch64";
case m68k: return "m68k";
case mips64: return "mips64";
case mips64el: return "mips64el";
@ -164,6 +166,9 @@ StringRef Triple::getArchTypePrefix(ArchType Kind) {
case ve: return "ve";
case csky: return "csky";
case loongarch32:
case loongarch64: return "loongarch";
}
}
@ -340,6 +345,8 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
.Case("renderscript64", renderscript64)
.Case("ve", ve)
.Case("csky", csky)
.Case("loongarch32", loongarch32)
.Case("loongarch64", loongarch64)
.Default(UnknownArch);
}
@ -475,6 +482,8 @@ static Triple::ArchType parseArch(StringRef ArchName) {
.Case("wasm32", Triple::wasm32)
.Case("wasm64", Triple::wasm64)
.Case("csky", Triple::csky)
.Case("loongarch32", Triple::loongarch32)
.Case("loongarch64", Triple::loongarch64)
.Default(Triple::UnknownArch);
// Some architectures require special parsing logic just to compute the
@ -731,6 +740,8 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
case Triple::lanai:
case Triple::le32:
case Triple::le64:
case Triple::loongarch32:
case Triple::loongarch64:
case Triple::m68k:
case Triple::mips64:
case Triple::mips64el:
@ -1290,6 +1301,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
case llvm::Triple::kalimba:
case llvm::Triple::lanai:
case llvm::Triple::le32:
case llvm::Triple::loongarch32:
case llvm::Triple::m68k:
case llvm::Triple::mips:
case llvm::Triple::mipsel:
@ -1321,6 +1333,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
case llvm::Triple::bpfel:
case llvm::Triple::hsail64:
case llvm::Triple::le64:
case llvm::Triple::loongarch64:
case llvm::Triple::mips64:
case llvm::Triple::mips64el:
case llvm::Triple::nvptx64:
@ -1377,6 +1390,7 @@ Triple Triple::get32BitArchVariant() const {
case Triple::kalimba:
case Triple::lanai:
case Triple::le32:
case Triple::loongarch32:
case Triple::m68k:
case Triple::mips:
case Triple::mipsel:
@ -1406,6 +1420,7 @@ Triple Triple::get32BitArchVariant() const {
case Triple::amdil64: T.setArch(Triple::amdil); break;
case Triple::hsail64: T.setArch(Triple::hsail); break;
case Triple::le64: T.setArch(Triple::le32); break;
case Triple::loongarch64: T.setArch(Triple::loongarch32); break;
case Triple::mips64:
T.setArch(Triple::mips, getSubArch());
break;
@ -1455,6 +1470,7 @@ Triple Triple::get64BitArchVariant() const {
case Triple::bpfel:
case Triple::hsail64:
case Triple::le64:
case Triple::loongarch64:
case Triple::mips64:
case Triple::mips64el:
case Triple::nvptx64:
@ -1478,6 +1494,7 @@ Triple Triple::get64BitArchVariant() const {
case Triple::armeb: T.setArch(Triple::aarch64_be); break;
case Triple::hsail: T.setArch(Triple::hsail64); break;
case Triple::le32: T.setArch(Triple::le64); break;
case Triple::loongarch32: T.setArch(Triple::loongarch64); break;
case Triple::mips:
T.setArch(Triple::mips64, getSubArch());
break;
@ -1517,6 +1534,8 @@ Triple Triple::getBigEndianArchVariant() const {
case Triple::kalimba:
case Triple::le32:
case Triple::le64:
case Triple::loongarch32:
case Triple::loongarch64:
case Triple::msp430:
case Triple::nvptx64:
case Triple::nvptx:
@ -1617,6 +1636,8 @@ bool Triple::isLittleEndian() const {
case Triple::kalimba:
case Triple::le32:
case Triple::le64:
case Triple::loongarch32:
case Triple::loongarch64:
case Triple::mips64el:
case Triple::mipsel:
case Triple::msp430:

View File

@ -354,6 +354,18 @@ TEST(TripleTest, ParsedIDs) {
EXPECT_EQ(Triple::Linux, T.getOS());
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
T = Triple("loongarch32-unknown-unknown");
EXPECT_EQ(Triple::loongarch32, T.getArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
EXPECT_EQ(Triple::UnknownOS, T.getOS());
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
T = Triple("loongarch64-unknown-linux");
EXPECT_EQ(Triple::loongarch64, T.getArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
EXPECT_EQ(Triple::Linux, T.getOS());
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
T = Triple("riscv32-unknown-unknown");
EXPECT_EQ(Triple::riscv32, T.getArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
@ -949,6 +961,18 @@ TEST(TripleTest, BitWidthPredicates) {
EXPECT_TRUE(T.isArch32Bit());
EXPECT_FALSE(T.isArch64Bit());
EXPECT_TRUE(T.isCSKY());
T.setArch(Triple::loongarch32);
EXPECT_FALSE(T.isArch16Bit());
EXPECT_TRUE(T.isArch32Bit());
EXPECT_FALSE(T.isArch64Bit());
EXPECT_TRUE(T.isLoongArch());
T.setArch(Triple::loongarch64);
EXPECT_FALSE(T.isArch16Bit());
EXPECT_FALSE(T.isArch32Bit());
EXPECT_TRUE(T.isArch64Bit());
EXPECT_TRUE(T.isLoongArch());
}
TEST(TripleTest, BitWidthArchVariants) {
@ -1092,6 +1116,14 @@ TEST(TripleTest, BitWidthArchVariants) {
EXPECT_EQ(Triple::csky, T.get32BitArchVariant().getArch());
EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
T.setArch(Triple::loongarch32);
EXPECT_EQ(Triple::loongarch32, T.get32BitArchVariant().getArch());
EXPECT_EQ(Triple::loongarch64, T.get64BitArchVariant().getArch());
T.setArch(Triple::loongarch64);
EXPECT_EQ(Triple::loongarch32, T.get32BitArchVariant().getArch());
EXPECT_EQ(Triple::loongarch64, T.get64BitArchVariant().getArch());
T.setArch(Triple::thumbeb);
EXPECT_EQ(Triple::thumbeb, T.get32BitArchVariant().getArch());
EXPECT_EQ(Triple::aarch64_be, T.get64BitArchVariant().getArch());
@ -1269,6 +1301,16 @@ TEST(TripleTest, EndianArchVariants) {
T.setArch(Triple::csky);
EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
EXPECT_EQ(Triple::csky, T.getLittleEndianArchVariant().getArch());
T.setArch(Triple::loongarch32);
EXPECT_TRUE(T.isLittleEndian());
EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
EXPECT_EQ(Triple::loongarch32, T.getLittleEndianArchVariant().getArch());
T.setArch(Triple::loongarch64);
EXPECT_TRUE(T.isLittleEndian());
EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
EXPECT_EQ(Triple::loongarch64, T.getLittleEndianArchVariant().getArch());
}
TEST(TripleTest, getOSVersion) {
@ -1485,6 +1527,10 @@ TEST(TripleTest, FileFormat) {
EXPECT_EQ(Triple::ELF, Triple("csky-unknown-unknown").getObjectFormat());
EXPECT_EQ(Triple::ELF, Triple("csky-unknown-linux").getObjectFormat());
EXPECT_EQ(Triple::ELF,
Triple("loongarch32-unknown-unknown").getObjectFormat());
EXPECT_EQ(Triple::ELF, Triple("loongarch64-unknown-linux").getObjectFormat());
Triple MSVCNormalized(Triple::normalize("i686-pc-windows-msvc-elf"));
EXPECT_EQ(Triple::ELF, MSVCNormalized.getObjectFormat());