[clang] [llvm] [MIPS] Add MIPS i6400 and i6500 processors (PR #130587)
Mallikarjuna Gouda via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 12 03:08:58 PDT 2025
https://github.com/mgoudar updated https://github.com/llvm/llvm-project/pull/130587
>From 4f9c5b5b844a61b760a3462994c7736542c14ca4 Mon Sep 17 00:00:00 2001
From: Mallikarjuna Gouda <mgouda at mips.com>
Date: Mon, 10 Mar 2025 15:42:39 +0530
Subject: [PATCH 1/4] [MIPS] Add MIPS i6400 and i6500 processors
The i6400 and i6500 are high performance multi-core microprocessors
from MIPS that provide best in class power efficiency for use in
system-on-chip (SoC) applications. i6400 and i6500 implements
Release 6 of the MIPS64 Instruction Set Architecture with full
hardware multithreading and hardware virtualization support.
Scheduling model shall be added in separate commit/PR.
---
clang/lib/Basic/Targets/Mips.cpp | 4 +++-
clang/lib/Driver/ToolChains/Arch/Mips.cpp | 4 ++++
clang/lib/Driver/ToolChains/Gnu.cpp | 4 +++-
clang/test/Driver/mips-abi.c | 24 +++++++++++++++++++++++
llvm/docs/ReleaseNotes.md | 2 ++
llvm/lib/Target/Mips/Mips.td | 10 ++++++++++
llvm/lib/Target/Mips/MipsSubtarget.h | 2 +-
7 files changed, 47 insertions(+), 3 deletions(-)
diff --git a/clang/lib/Basic/Targets/Mips.cpp b/clang/lib/Basic/Targets/Mips.cpp
index 866be53c8a363..08f9e3c29d1ed 100644
--- a/clang/lib/Basic/Targets/Mips.cpp
+++ b/clang/lib/Basic/Targets/Mips.cpp
@@ -47,6 +47,8 @@ bool MipsTargetInfo::processorSupportsGPR64() const {
.Case("mips64r6", true)
.Case("octeon", true)
.Case("octeon+", true)
+ .Case("i6400", true)
+ .Case("i6500", true)
.Default(false);
}
@@ -54,7 +56,7 @@ static constexpr llvm::StringLiteral ValidCPUNames[] = {
{"mips1"}, {"mips2"}, {"mips3"}, {"mips4"}, {"mips5"},
{"mips32"}, {"mips32r2"}, {"mips32r3"}, {"mips32r5"}, {"mips32r6"},
{"mips64"}, {"mips64r2"}, {"mips64r3"}, {"mips64r5"}, {"mips64r6"},
- {"octeon"}, {"octeon+"}, {"p5600"}};
+ {"octeon"}, {"octeon+"}, {"p5600"}, {"i6400"}, {"i6500"}};
bool MipsTargetInfo::isValidCPUName(StringRef Name) const {
return llvm::is_contained(ValidCPUNames, Name);
diff --git a/clang/lib/Driver/ToolChains/Arch/Mips.cpp b/clang/lib/Driver/ToolChains/Arch/Mips.cpp
index ca0745fc2b32d..9c817f238524c 100644
--- a/clang/lib/Driver/ToolChains/Arch/Mips.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/Mips.cpp
@@ -104,6 +104,8 @@ void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
.Case("mips64r6", "n64")
.Case("octeon", "n64")
.Case("p5600", "o32")
+ .Case("i6400", "n64")
+ .Case("i6500", "n64")
.Default("");
}
@@ -514,5 +516,7 @@ bool mips::supportsIndirectJumpHazardBarrier(StringRef &CPU) {
.Case("mips64r6", true)
.Case("octeon", true)
.Case("p5600", true)
+ .Case("i6400", true)
+ .Case("i6500", true)
.Default(false);
}
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
index f56eeda3cb5f6..68c288f516fba 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -1501,7 +1501,9 @@ bool clang::driver::findMIPSMultilibs(const Driver &D,
CPUName == "mips64r5" || CPUName == "octeon" ||
CPUName == "octeon+",
"-march=mips64r2", Flags);
- addMultilibFlag(CPUName == "mips64r6", "-march=mips64r6", Flags);
+ addMultilibFlag(CPUName == "mips64r6" || CPUName == "i6400" ||
+ CPUName == "i6500",
+ "-march=mips64r6", Flags);
addMultilibFlag(isMicroMips(Args), "-mmicromips", Flags);
addMultilibFlag(tools::mips::isUCLibc(Args), "-muclibc", Flags);
addMultilibFlag(tools::mips::isNaN2008(D, Args, TargetTriple), "-mnan=2008",
diff --git a/clang/test/Driver/mips-abi.c b/clang/test/Driver/mips-abi.c
index 06570b50928a1..9a2180c516a61 100644
--- a/clang/test/Driver/mips-abi.c
+++ b/clang/test/Driver/mips-abi.c
@@ -121,6 +121,30 @@
// MIPS-ARCH-P5600-N64: error: ABI 'n64' is not supported on CPU 'p5600'
//
// RUN: %clang --target=mips-linux-gnu -### -c %s \
+// RUN: -march=i6400 2>&1 \
+// RUN: | FileCheck -check-prefix=MIPS-ARCH-I6400 %s
+// MIPS-ARCH-I6400: "-target-cpu" "i6400"
+// MIPS-ARCH-I6400: "-target-abi" "o32"
+//
+// RUN: %clang --target=mips-linux-gnu -### -c %s \
+// RUN: -march=i6400 -mabi=64 2>&1 \
+// RUN: | FileCheck -check-prefix=MIPS-ARCH-I6400-N64 %s
+// MIPS-ARCH-I6400-N64: "-target-cpu" "i6400"
+// MIPS-ARCH-I6400-N64: "-target-abi" "n64"
+//
+// RUN: %clang --target=mips-linux-gnu -### -c %s \
+// RUN: -march=i6500 2>&1 \
+// RUN: | FileCheck -check-prefix=MIPS-ARCH-I6500 %s
+// MIPS-ARCH-I6500: "-target-cpu" "i6500"
+// MIPS-ARCH-I6500: "-target-abi" "o32"
+//
+// RUN: %clang --target=mips-linux-gnu -### -c %s \
+// RUN: -march=i6500 -mabi=64 2>&1 \
+// RUN: | FileCheck -check-prefix=MIPS-ARCH-I6500-N64 %s
+// MIPS-ARCH-I6500-N64: "-target-cpu" "i6500"
+// MIPS-ARCH-I6500-N64: "-target-abi" "n64"
+//
+// RUN: %clang --target=mips-linux-gnu -### -c %s \
// RUN: -march=mips64 2>&1 \
// RUN: | FileCheck -check-prefix=MIPS-ARCH-3264 %s
// MIPS-ARCH-3264: "-target-cpu" "mips64"
diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index d7a80ae93aa34..d23019785e33d 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -101,6 +101,8 @@ Changes to the LoongArch Backend
Changes to the MIPS Backend
---------------------------
+* `-mcpu=i6400` and `-mcpu=i6500` was added.
+
Changes to the PowerPC Backend
------------------------------
diff --git a/llvm/lib/Target/Mips/Mips.td b/llvm/lib/Target/Mips/Mips.td
index 923e0c9cdde75..15e510ee263bc 100644
--- a/llvm/lib/Target/Mips/Mips.td
+++ b/llvm/lib/Target/Mips/Mips.td
@@ -238,6 +238,14 @@ def ImplP5600 : SubtargetFeature<"p5600", "ProcImpl",
"MipsSubtarget::CPU::P5600",
"The P5600 Processor", [FeatureMips32r5]>;
+def ImplI6400
+ : SubtargetFeature<"i6400", "ProcImpl", "MipsSubtarget::CPU::I6400",
+ "The I6400 Processor", [FeatureMips64r6]>;
+
+def ImplI6500
+ : SubtargetFeature<"i6500", "ProcImpl", "MipsSubtarget::CPU::I6400",
+ "The I6500 Processor", [FeatureMips64r6]>;
+
class Proc<string Name, list<SubtargetFeature> Features>
: ProcessorModel<Name, MipsGenericModel, Features>;
@@ -261,6 +269,8 @@ def : Proc<"mips64r6", [FeatureMips64r6]>;
def : Proc<"octeon", [FeatureMips64r2, FeatureCnMips]>;
def : Proc<"octeon+", [FeatureMips64r2, FeatureCnMips, FeatureCnMipsP]>;
def : ProcessorModel<"p5600", MipsP5600Model, [ImplP5600]>;
+def : ProcessorModel<"i6400", NoSchedModel, [ImplI6400]>;
+def : ProcessorModel<"i6500", NoSchedModel, [ImplI6500]>;
def MipsAsmParser : AsmParser {
let ShouldEmitMatchRegisterName = 0;
diff --git a/llvm/lib/Target/Mips/MipsSubtarget.h b/llvm/lib/Target/Mips/MipsSubtarget.h
index 85cf45d4702ae..0c75597d3decf 100644
--- a/llvm/lib/Target/Mips/MipsSubtarget.h
+++ b/llvm/lib/Target/Mips/MipsSubtarget.h
@@ -43,7 +43,7 @@ class MipsSubtarget : public MipsGenSubtargetInfo {
Mips3, Mips4, Mips5, Mips64, Mips64r2, Mips64r3, Mips64r5, Mips64r6
};
- enum class CPU { P5600 };
+ enum class CPU { P5600, I6400 };
// Used to avoid printing dsp warnings multiple times.
static bool DspWarningPrinted;
>From 73338e19048d60bb84b53517b0f5c757cb7a3fa5 Mon Sep 17 00:00:00 2001
From: Mallikarjuna Gouda <mgouda at mips.com>
Date: Mon, 10 Mar 2025 21:55:03 +0530
Subject: [PATCH 2/4] [MIPS] Add comments to MipsSubTarget.h changes
I6400 and I6500 are based on MIPS64R6 ISA. I6500 is just
multi-cluster version of I6400. Hence defined single subtarget
I6400
---
llvm/lib/Target/Mips/MipsSubtarget.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/llvm/lib/Target/Mips/MipsSubtarget.h b/llvm/lib/Target/Mips/MipsSubtarget.h
index 0c75597d3decf..9516f3f12a2af 100644
--- a/llvm/lib/Target/Mips/MipsSubtarget.h
+++ b/llvm/lib/Target/Mips/MipsSubtarget.h
@@ -43,6 +43,8 @@ class MipsSubtarget : public MipsGenSubtargetInfo {
Mips3, Mips4, Mips5, Mips64, Mips64r2, Mips64r3, Mips64r5, Mips64r6
};
+ // I6400 and I6500 are based on same MIPS64R6 ISA. Hence we define single
+ // subtarget I6400 for subtarget feature use in Mips.td.
enum class CPU { P5600, I6400 };
// Used to avoid printing dsp warnings multiple times.
>From 97e5e91a75ee6f245f2930de0da714e6a1309658 Mon Sep 17 00:00:00 2001
From: Mallikarjuna Gouda <mgouda at mips.com>
Date: Wed, 12 Mar 2025 12:56:26 +0530
Subject: [PATCH 3/4] [MIPS] Use single SubTargetFeature for both i6400 and
i6500
i6500 is multicluster version of i6400. Both use same CPU.
Hence use same SubTargetFeature for both cpu definitions.
Updated ReleaseNotes.md
---
llvm/docs/ReleaseNotes.md | 2 +-
llvm/lib/Target/Mips/Mips.td | 9 +++------
llvm/lib/Target/Mips/MipsSubtarget.h | 2 --
3 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index d23019785e33d..d9cc577f22fae 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -101,7 +101,7 @@ Changes to the LoongArch Backend
Changes to the MIPS Backend
---------------------------
-* `-mcpu=i6400` and `-mcpu=i6500` was added.
+* `-mcpu=i6400` and `-mcpu=i6500` were added.
Changes to the PowerPC Backend
------------------------------
diff --git a/llvm/lib/Target/Mips/Mips.td b/llvm/lib/Target/Mips/Mips.td
index 15e510ee263bc..f76d7a4a8c1b6 100644
--- a/llvm/lib/Target/Mips/Mips.td
+++ b/llvm/lib/Target/Mips/Mips.td
@@ -238,13 +238,10 @@ def ImplP5600 : SubtargetFeature<"p5600", "ProcImpl",
"MipsSubtarget::CPU::P5600",
"The P5600 Processor", [FeatureMips32r5]>;
+// I6500 is multicluster version of I6400. Both are based on same CPU.
def ImplI6400
: SubtargetFeature<"i6400", "ProcImpl", "MipsSubtarget::CPU::I6400",
- "The I6400 Processor", [FeatureMips64r6]>;
-
-def ImplI6500
- : SubtargetFeature<"i6500", "ProcImpl", "MipsSubtarget::CPU::I6400",
- "The I6500 Processor", [FeatureMips64r6]>;
+ "MIPS I6400/I6500 Processors", [FeatureMips64r6]>;
class Proc<string Name, list<SubtargetFeature> Features>
: ProcessorModel<Name, MipsGenericModel, Features>;
@@ -270,7 +267,7 @@ def : Proc<"octeon", [FeatureMips64r2, FeatureCnMips]>;
def : Proc<"octeon+", [FeatureMips64r2, FeatureCnMips, FeatureCnMipsP]>;
def : ProcessorModel<"p5600", MipsP5600Model, [ImplP5600]>;
def : ProcessorModel<"i6400", NoSchedModel, [ImplI6400]>;
-def : ProcessorModel<"i6500", NoSchedModel, [ImplI6500]>;
+def : ProcessorModel<"i6500", NoSchedModel, [ImplI6400]>;
def MipsAsmParser : AsmParser {
let ShouldEmitMatchRegisterName = 0;
diff --git a/llvm/lib/Target/Mips/MipsSubtarget.h b/llvm/lib/Target/Mips/MipsSubtarget.h
index 9516f3f12a2af..0c75597d3decf 100644
--- a/llvm/lib/Target/Mips/MipsSubtarget.h
+++ b/llvm/lib/Target/Mips/MipsSubtarget.h
@@ -43,8 +43,6 @@ class MipsSubtarget : public MipsGenSubtargetInfo {
Mips3, Mips4, Mips5, Mips64, Mips64r2, Mips64r3, Mips64r5, Mips64r6
};
- // I6400 and I6500 are based on same MIPS64R6 ISA. Hence we define single
- // subtarget I6400 for subtarget feature use in Mips.td.
enum class CPU { P5600, I6400 };
// Used to avoid printing dsp warnings multiple times.
>From e7442a7d339717d543d8d743070871b3c31ec2b3 Mon Sep 17 00:00:00 2001
From: Mallikarjuna Gouda <mgouda at mips.com>
Date: Wed, 12 Mar 2025 15:38:03 +0530
Subject: [PATCH 4/4] [MIPS] Update comments in Mips.td
---
llvm/lib/Target/Mips/Mips.td | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Target/Mips/Mips.td b/llvm/lib/Target/Mips/Mips.td
index f76d7a4a8c1b6..9159d11fd486f 100644
--- a/llvm/lib/Target/Mips/Mips.td
+++ b/llvm/lib/Target/Mips/Mips.td
@@ -238,7 +238,8 @@ def ImplP5600 : SubtargetFeature<"p5600", "ProcImpl",
"MipsSubtarget::CPU::P5600",
"The P5600 Processor", [FeatureMips32r5]>;
-// I6500 is multicluster version of I6400. Both are based on same CPU.
+// The I6500 is the multi-cluster version of the I6400. Both are based on the
+// same CPU architecture.
def ImplI6400
: SubtargetFeature<"i6400", "ProcImpl", "MipsSubtarget::CPU::I6400",
"MIPS I6400/I6500 Processors", [FeatureMips64r6]>;
More information about the cfe-commits
mailing list