Skip to content

Commit bfd3ea3

Browse files
committed
[ARM] Add support for Cortex-M7, FPv5-SP and FPv5-DP
The Cortex-M7 has 3 options for its FPU: none, FPv5-SP-D16 and FPv5-DP-D16. FPv5 has the same instructions as FP-ARMv8, so it can be modeled using the same target feature, and all double-precision operations are already disabled by the fp-only-sp target features. llvm-svn: 218748
1 parent 37e4daa commit bfd3ea3

File tree

6 files changed

+44
-5
lines changed

6 files changed

+44
-5
lines changed

clang/lib/Basic/Targets.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3917,7 +3917,7 @@ class ARMTargetInfo : public TargetInfo {
39173917
ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
39183918
Features["hwdiv"] = true;
39193919
Features["hwdiv-arm"] = true;
3920-
} else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3920+
} else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
39213921
Features["hwdiv"] = true;
39223922
}
39233923
}
@@ -4017,7 +4017,7 @@ class ARMTargetInfo : public TargetInfo {
40174017
.Case("swift", "7S")
40184018
.Case("cyclone", "8A")
40194019
.Case("cortex-m3", "7M")
4020-
.Case("cortex-m4", "7EM")
4020+
.Cases("cortex-m4", "cortex-m7", "7EM")
40214021
.Case("cortex-m0", "6M")
40224022
.Cases("cortex-a53", "cortex-a57", "8A")
40234023
.Default(nullptr);
@@ -4027,7 +4027,7 @@ class ARMTargetInfo : public TargetInfo {
40274027
.Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
40284028
.Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
40294029
.Cases("cortex-a53", "cortex-a57", "A")
4030-
.Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
4030+
.Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
40314031
.Cases("cortex-r4", "cortex-r5", "R")
40324032
.Default("");
40334033
}

clang/lib/Driver/ToolChains.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ static const char *GetArmArchForMCpu(StringRef Value) {
137137
.Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "armv7")
138138
.Cases("cortex-r4", "cortex-r5", "armv7r")
139139
.Case("cortex-m3", "armv7m")
140-
.Case("cortex-m4", "armv7em")
140+
.Cases("cortex-m4", "cortex-m7", "armv7em")
141141
.Case("swift", "armv7s")
142142
.Default(nullptr);
143143
}

clang/lib/Driver/Tools.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,18 @@ static void getARMFPUFeatures(const Driver &D, const Arg *A,
544544
Features.push_back("+d16");
545545
Features.push_back("+fp-only-sp");
546546
Features.push_back("-neon");
547+
} else if (FPU == "fp5-sp-d16" || FPU == "fpv5-sp-d16") {
548+
Features.push_back("+fp-armv8");
549+
Features.push_back("+fp-only-sp");
550+
Features.push_back("+d16");
551+
Features.push_back("-neon");
552+
Features.push_back("-crypto");
553+
} else if (FPU == "fp5-dp-d16" || FPU == "fpv5-dp-d16" ||
554+
FPU == "fp5-d16" || FPU == "fpv5-d16") {
555+
Features.push_back("+fp-armv8");
556+
Features.push_back("+d16");
557+
Features.push_back("-neon");
558+
Features.push_back("-crypto");
547559
} else if (FPU == "fp-armv8") {
548560
Features.push_back("+fp-armv8");
549561
Features.push_back("-neon");
@@ -5340,7 +5352,7 @@ const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
53405352
.Cases("cortex-r4", "cortex-r5", "v7r")
53415353
.Case("cortex-m0", "v6m")
53425354
.Case("cortex-m3", "v7m")
5343-
.Case("cortex-m4", "v7em")
5355+
.Cases("cortex-m4", "cortex-m7", "v7em")
53445356
.Case("swift", "v7s")
53455357
.Case("cyclone", "v8")
53465358
.Cases("cortex-a53", "cortex-a57", "v8")

clang/test/Driver/arm-cortex-cpus.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,11 +231,15 @@
231231
// CHECK-BE-CPUV7M: "-cc1"{{.*}} "-triple" "thumbebv7m-{{.*}}
232232

233233
// RUN: %clang -target arm-linux-gnueabi -mcpu=cortex-m4 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-CPUV7EM %s
234+
// RUN: %clang -target arm-linux-gnueabi -mcpu=cortex-m7 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-CPUV7EM %s
234235
// RUN: %clang -target arm-linux-gnueabi -mcpu=cortex-m4 -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-CPUV7EM %s
236+
// RUN: %clang -target arm-linux-gnueabi -mcpu=cortex-m7 -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-CPUV7EM %s
235237
// CHECK-CPUV7EM: "-cc1"{{.*}} "-triple" "thumbv7em-{{.*}}
236238

237239
// RUN: %clang -target armeb-linux-gnueabi -mcpu=cortex-m4 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-CPUV7EM %s
240+
// RUN: %clang -target armeb-linux-gnueabi -mcpu=cortex-m7 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-CPUV7EM %s
238241
// RUN: %clang -target arm-linux-gnueabi -mcpu=cortex-m4 -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-CPUV7EM %s
242+
// RUN: %clang -target arm-linux-gnueabi -mcpu=cortex-m7 -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-CPUV7EM %s
239243
// CHECK-BE-CPUV7EM: "-cc1"{{.*}} "-triple" "thumbebv7em-{{.*}}
240244

241245
// RUN: %clang -target arm-linux-gnueabi -mcpu=cortex-r4 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-CPUV7R %s

clang/test/Driver/arm-mfpu.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,25 @@
6363
// CHECK-FP4-SP-D16: "-target-feature" "+fp-only-sp"
6464
// CHECK-FP4-SP-D16: "-target-feature" "-neon"
6565

66+
// RUN: %clang -target arm-linux-eabi -mfpu=fp5-sp-d16 %s -### -o %t.o 2>&1 \
67+
// RUN: | FileCheck --check-prefix=CHECK-FP5-SP-D16 %s
68+
// RUN: %clang -target arm-linux-eabi -mfpu=fpv5-sp-d16 %s -### -o %t.o 2>&1 \
69+
// RUN: | FileCheck --check-prefix=CHECK-FP5-SP-D16 %s
70+
// CHECK-FP5-SP-D16: "-target-feature" "+fp-armv8"
71+
// CHECK-FP5-SP-D16: "-target-feature" "+fp-only-sp"
72+
// CHECK-FP5-SP-D16: "-target-feature" "+d16"
73+
// CHECK-FP5-SP-D16: "-target-feature" "-neon"
74+
// CHECK-FP5-SP-D16: "-target-feature" "-crypto"
75+
76+
// RUN: %clang -target arm-linux-eabi -mfpu=fp5-dp-d16 %s -### -o %t.o 2>&1 \
77+
// RUN: | FileCheck --check-prefix=CHECK-FP5-DP-D16 %s
78+
// RUN: %clang -target arm-linux-eabi -mfpu=fpv5-dp-d16 %s -### -o %t.o 2>&1 \
79+
// RUN: | FileCheck --check-prefix=CHECK-FP5-DP-D16 %s
80+
// CHECK-FP5-DP-D16: "-target-feature" "+fp-armv8"
81+
// CHECK-FP5-DP-D16: "-target-feature" "+d16"
82+
// CHECK-FP5-DP-D16: "-target-feature" "-neon"
83+
// CHECK-FP5-DP-D16: "-target-feature" "-crypto"
84+
6685
// RUN: %clang -target arm-linux-eabi -mfpu=neon %s -### -o %t.o 2>&1 \
6786
// RUN: | FileCheck --check-prefix=CHECK-NEON %s
6887
// CHECK-NEON: "-target-feature" "+neon"

clang/test/Preprocessor/arm-target-features.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,10 @@
240240
// RUN: %clang -target armv7 -mthumb -mcpu=cortex-m4 -x c -E -dM %s -o - | FileCheck --check-prefix=M4-THUMB %s
241241
// M4-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
242242

243+
// Test whether predefines are as expected when targeting cortex-m7.
244+
// RUN: %clang -target armv7 -mthumb -mcpu=cortex-m7 -x c -E -dM %s -o - | FileCheck --check-prefix=M7-THUMB %s
245+
// M7-THUMB:#define __ARM_ARCH_EXT_IDIV__ 1
246+
243247
// Test whether predefines are as expected when targeting krait.
244248
// RUN: %clang -target armv7 -mcpu=krait -x c -E -dM %s -o - | FileCheck --check-prefix=KRAIT-ARM %s
245249
// KRAIT-ARM:#define __ARM_ARCH_EXT_IDIV__ 1

0 commit comments

Comments
 (0)