Skip to content

Commit 760df47

Browse files
committed
[ARM] Replace fp-only-sp and d16 with fp64 and d32.
Those two subtarget features were awkward because their semantics are reversed: each one indicates the _lack_ of support for something in the architecture, rather than the presence. As a consequence, you don't get the behavior you want if you combine two sets of feature bits. Each SubtargetFeature for an FP architecture version now comes in four versions, one for each combination of those options. So you can still say (for example) '+vfp2' in a feature string and it will mean what it's always meant, but there's a new string '+vfp2d16sp' meaning the version without those extra options. A lot of this change is just mechanically replacing positive checks for the old features with negative checks for the new ones. But one more interesting change is that I've rearranged getFPUFeatures() so that the main FPU feature is appended to the output list *before* rather than after the features derived from the Restriction field, so that -fp64 and -d32 can override defaults added by the main feature. Reviewers: dmgreen, samparker, SjoerdMeijer Subscribers: srhines, javed.absar, eraman, kristof.beyls, hiraditya, zzheng, Petar.Avramovic, cfe-commits, llvm-commits Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D60691 llvm-svn: 361845
1 parent 448a79d commit 760df47

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+353
-302
lines changed

clang/lib/Basic/Targets/ARM.cpp

+8-10
Original file line numberDiff line numberDiff line change
@@ -400,28 +400,27 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
400400
HasFloat16 = true;
401401

402402
// This does not diagnose illegal cases like having both
403-
// "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
404-
uint32_t HW_FP_remove = 0;
403+
// "+vfpv2" and "+vfpv3" or having "+neon" and "-fp64".
405404
for (const auto &Feature : Features) {
406405
if (Feature == "+soft-float") {
407406
SoftFloat = true;
408407
} else if (Feature == "+soft-float-abi") {
409408
SoftFloatABI = true;
410409
} else if (Feature == "+vfp2") {
411410
FPU |= VFP2FPU;
412-
HW_FP |= HW_FP_SP | HW_FP_DP;
411+
HW_FP |= HW_FP_SP;
413412
} else if (Feature == "+vfp3") {
414413
FPU |= VFP3FPU;
415-
HW_FP |= HW_FP_SP | HW_FP_DP;
414+
HW_FP |= HW_FP_SP;
416415
} else if (Feature == "+vfp4") {
417416
FPU |= VFP4FPU;
418-
HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
417+
HW_FP |= HW_FP_SP | HW_FP_HP;
419418
} else if (Feature == "+fp-armv8") {
420419
FPU |= FPARMV8;
421-
HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
420+
HW_FP |= HW_FP_SP | HW_FP_HP;
422421
} else if (Feature == "+neon") {
423422
FPU |= NeonFPU;
424-
HW_FP |= HW_FP_SP | HW_FP_DP;
423+
HW_FP |= HW_FP_SP;
425424
} else if (Feature == "+hwdiv") {
426425
HWDiv |= HWDivThumb;
427426
} else if (Feature == "+hwdiv-arm") {
@@ -432,8 +431,8 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
432431
Crypto = 1;
433432
} else if (Feature == "+dsp") {
434433
DSP = 1;
435-
} else if (Feature == "+fp-only-sp") {
436-
HW_FP_remove |= HW_FP_DP;
434+
} else if (Feature == "+fp64") {
435+
HW_FP |= HW_FP_DP;
437436
} else if (Feature == "+8msecext") {
438437
if (CPUProfile != "M" || ArchVersion != 8) {
439438
Diags.Report(diag::err_target_unsupported_mcmse) << CPU;
@@ -449,7 +448,6 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
449448
DotProd = true;
450449
}
451450
}
452-
HW_FP &= ~HW_FP_remove;
453451

454452
switch (ArchVersion) {
455453
case 6:

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

+14-14
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
// REQUIRES: arm-registered-target
22

33
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabihf -target-cpu cortex-a8 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3
4-
// CHECK-VFP3: "target-features"="+armv7-a,+dsp,+neon,+thumb-mode,+vfp3"
4+
// CHECK-VFP3: "target-features"="+armv7-a,+d32,+dsp,+fp64,+neon,+thumb-mode,+vfp3"
55

66

77
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabihf -target-cpu cortex-a5 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4
8-
// CHECK-VFP4: "target-features"="+armv7-a,+dsp,+neon,+thumb-mode,+vfp4"
8+
// CHECK-VFP4: "target-features"="+armv7-a,+d32,+dsp,+fp64,+neon,+thumb-mode,+vfp4"
99

1010

1111
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabihf -target-cpu cortex-a7 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-DIV
1212
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-a12 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-DIV
1313
// RUN: %clang_cc1 -triple thumbv7s-linux-gnueabi -target-cpu swift -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-DIV-2
1414
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabihf -target-cpu krait -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-DIV
15-
// CHECK-VFP4-DIV: "target-features"="+armv7-a,+dsp,+hwdiv,+hwdiv-arm,+neon,+thumb-mode,+vfp4"
16-
// CHECK-VFP4-DIV-2: "target-features"="+armv7s,+dsp,+hwdiv,+hwdiv-arm,+neon,+thumb-mode,+vfp4"
15+
// CHECK-VFP4-DIV: "target-features"="+armv7-a,+d32,+dsp,+fp64,+hwdiv,+hwdiv-arm,+neon,+thumb-mode,+vfp4"
16+
// CHECK-VFP4-DIV-2: "target-features"="+armv7s,+d32,+dsp,+fp64,+hwdiv,+hwdiv-arm,+neon,+thumb-mode,+vfp4"
1717

1818
// RUN: %clang_cc1 -triple armv7-linux-gnueabihf -target-cpu cortex-a15 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-DIV-ARM
1919
// RUN: %clang_cc1 -triple armv7-linux-gnueabihf -target-cpu cortex-a17 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-DIV-ARM
20-
// CHECK-VFP4-DIV-ARM: "target-features"="+armv7-a,+dsp,+hwdiv,+hwdiv-arm,+neon,+vfp4,-thumb-mode"
20+
// CHECK-VFP4-DIV-ARM: "target-features"="+armv7-a,+d32,+dsp,+fp64,+hwdiv,+hwdiv-arm,+neon,+vfp4,-thumb-mode"
2121

2222
// RUN: %clang_cc1 -triple thumbv7s-apple-ios7.0 -target-cpu cyclone -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8
2323
// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu cortex-a32 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8
@@ -28,34 +28,34 @@
2828
// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu exynos-m1 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8
2929
// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu exynos-m2 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8
3030
// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu exynos-m3 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8
31-
// CHECK-BASIC-V8: "target-features"="+armv8-a,+crc,+crypto,+dsp,+fp-armv8,+hwdiv,+hwdiv-arm,+neon,+thumb-mode"
31+
// CHECK-BASIC-V8: "target-features"="+armv8-a,+crc,+crypto,+d32,+dsp,+fp-armv8,+fp64,+hwdiv,+hwdiv-arm,+neon,+thumb-mode"
3232

3333
// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu exynos-m4 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V82
3434
// RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu exynos-m5 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V82
35-
// CHECK-BASIC-V82: "target-features"="+armv8.2-a,+crc,+crypto,+dotprod,+dsp,+fp-armv8,+hwdiv,+hwdiv-arm,+neon,+ras,+thumb-mode"
35+
// CHECK-BASIC-V82: "target-features"="+armv8.2-a,+crc,+crypto,+d32,+dotprod,+dsp,+fp-armv8,+fp64,+hwdiv,+hwdiv-arm,+neon,+ras,+thumb-mode"
3636

3737
// RUN: %clang_cc1 -triple armv8-linux-gnueabi -target-cpu cortex-a53 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-BASIC-V8-ARM
38-
// CHECK-BASIC-V8-ARM: "target-features"="+armv8-a,+crc,+crypto,+dsp,+fp-armv8,+hwdiv,+hwdiv-arm,+neon,-thumb-mode"
38+
// CHECK-BASIC-V8-ARM: "target-features"="+armv8-a,+crc,+crypto,+d32,+dsp,+fp-armv8,+fp64,+hwdiv,+hwdiv-arm,+neon,-thumb-mode"
3939

4040
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-r5 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3-D16-DIV
41-
// CHECK-VFP3-D16-DIV: "target-features"="+armv7-r,+d16,+dsp,+hwdiv,+hwdiv-arm,+thumb-mode,+vfp3"
41+
// CHECK-VFP3-D16-DIV: "target-features"="+armv7-r,+dsp,+fp64,+hwdiv,+hwdiv-arm,+thumb-mode,+vfp3"
4242

4343

4444
// RUN: %clang_cc1 -triple armv7-linux-gnueabi -target-cpu cortex-r4f -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3-D16-THUMB-DIV
45-
// CHECK-VFP3-D16-THUMB-DIV: "target-features"="+armv7-r,+d16,+dsp,+hwdiv,+vfp3,-thumb-mode"
45+
// CHECK-VFP3-D16-THUMB-DIV: "target-features"="+armv7-r,+dsp,+fp64,+hwdiv,+vfp3,-thumb-mode"
4646

4747

4848
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-r7 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3-D16-FP16-DIV
4949
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-r8 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP3-D16-FP16-DIV
50-
// CHECK-VFP3-D16-FP16-DIV: "target-features"="+armv7-r,+d16,+dsp,+fp16,+hwdiv,+hwdiv-arm,+thumb-mode,+vfp3"
50+
// CHECK-VFP3-D16-FP16-DIV: "target-features"="+armv7-r,+dsp,+fp16,+fp64,+hwdiv,+hwdiv-arm,+thumb-mode,+vfp3"
5151

5252

5353
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-m4 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP4-D16-SP-THUMB-DIV
54-
// CHECK-VFP4-D16-SP-THUMB-DIV: "target-features"="+armv7e-m,+d16,+dsp,+fp-only-sp,+hwdiv,+thumb-mode,+vfp4"
54+
// CHECK-VFP4-D16-SP-THUMB-DIV: "target-features"="+armv7e-m,+dsp,+hwdiv,+thumb-mode,+vfp4"
5555

5656

5757
// RUN: %clang_cc1 -triple thumbv7-linux-gnueabi -target-cpu cortex-m7 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-VFP5-D16-THUMB-DIV
58-
// CHECK-VFP5-D16-THUMB-DIV: "target-features"="+armv7e-m,+d16,+dsp,+fp-armv8,+hwdiv,+thumb-mode"
58+
// CHECK-VFP5-D16-THUMB-DIV: "target-features"="+armv7e-m,+dsp,+fp-armv8,+fp64,+hwdiv,+thumb-mode"
5959

6060

6161
// RUN: %clang_cc1 -triple armv7-linux-gnueabi -target-cpu cortex-r4 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-THUMB-DIV
@@ -107,6 +107,6 @@
107107
// CHECK-ARMV8M-M23-LINUX: "target-features"="+armv8-m.base,+hwdiv,+thumb-mode"
108108

109109
// RUN: %clang_cc1 -triple thumb-linux-gnueabi -target-cpu cortex-m33 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-ARMV8M-MAIN-LINUX
110-
// CHECK-ARMV8M-MAIN-LINUX: "target-features"="+armv8-m.main,+d16,+dsp,+fp-armv8,+fp-only-sp,+hwdiv,+thumb-mode"
110+
// CHECK-ARMV8M-MAIN-LINUX: "target-features"="+armv8-m.main,+dsp,+fp-armv8,+hwdiv,+thumb-mode"
111111

112112
void foo() {}

clang/test/Driver/arm-mfpu.c

+24-25
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
// CHECK-DEFAULT: "-target-feature" "+soft-float-abi"
77
// CHECK-DEFAULT-NOT: "-target-feature" "+vfp2"
88
// CHECK-DEFAULT-NOT: "-target-feature" "+vfp3"
9-
// CHECK-DEFAULT-NOT: "-target-feature" "+d16"
109
// CHECK-DEFAULT-NOT: "-target-feature" "+neon"
1110

1211
// RUN: %clang -target arm-linux-eabi -mfpu=fpa %s -### -o %t.o 2>&1 \
@@ -64,12 +63,12 @@
6463
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-3 %s
6564
// CHECK-VFP3-FP16-NOT: "-target-feature" "+soft-float"
6665
// CHECK-VFP3-FP16: "-target-feature" "+soft-float-abi"
67-
// CHECK-VFP3-FP16: "-target-feature" "-fp-only-sp"
68-
// CHECK-VFP3-FP16: "-target-feature" "-d16"
6966
// CHECK-VFP3-FP16: "-target-feature" "+vfp3"
7067
// CHECK-VFP3-FP16: "-target-feature" "+fp16"
7168
// CHECK-VFP3-FP16: "-target-feature" "-vfp4"
7269
// CHECK-VFP3-FP16: "-target-feature" "-fp-armv8"
70+
// CHECK-VFP3-FP16: "-target-feature" "+fp64"
71+
// CHECK-VFP3-FP16: "-target-feature" "+d32"
7372
// CHECK-VFP3-FP16: "-target-feature" "-neon"
7473
// CHECK-VFP3-FP16: "-target-feature" "-crypto"
7574

@@ -81,11 +80,11 @@
8180
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-3 %s
8281
// CHECK-VFP3-D16-NOT: "-target-feature" "+soft-float"
8382
// CHECK-VFP3-D16: "-target-feature" "+soft-float-abi"
84-
// CHECK-VFP3-D16: "-target-feature" "-fp-only-sp"
85-
// CHECK-VFP3-D16: "-target-feature" "+d16"
8683
// CHECK-VFP3-D16: "-target-feature" "+vfp3"
8784
// CHECK-VFP3-D16: "-target-feature" "-vfp4"
8885
// CHECK-VFP3-D16: "-target-feature" "-fp-armv8"
86+
// CHECK-VFP3-D16: "-target-feature" "+fp64"
87+
// CHECK-VFP3-D16-NOT: "-target-feature" "+d32"
8988
// CHECK-VFP3-D16: "-target-feature" "-neon"
9089

9190
// RUN: %clang -target arm-linux-eabi -mfpu=vfpv3-d16-fp16 %s -### -o %t.o 2>&1 \
@@ -94,12 +93,12 @@
9493
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-3 %s
9594
// CHECK-VFP3-D16-FP16-NOT: "-target-feature" "+soft-float"
9695
// CHECK-VFP3-D16-FP16: "-target-feature" "+soft-float-abi"
97-
// CHECK-VFP3-D16-FP16: "-target-feature" "-fp-only-sp"
98-
// CHECK-VFP3-D16-FP16: "-target-feature" "+d16"
9996
// CHECK-VFP3-D16-FP16: "-target-feature" "+vfp3"
10097
// CHECK-VFP3-D16-FP16: "-target-feature" "+fp16"
10198
// CHECK-VFP3-D16-FP16: "-target-feature" "-vfp4"
10299
// CHECK-VFP3-D16-FP16: "-target-feature" "-fp-armv8"
100+
// CHECK-VFP3-D16-FP16: "-target-feature" "+fp64"
101+
// CHECK-VFP3-D16-FP16-NOT: "-target-feature" "+d32"
103102
// CHECK-VFP3-D16-FP16: "-target-feature" "-neon"
104103
// CHECK-VFP3-D16-FP16: "-target-feature" "-crypto"
105104

@@ -109,8 +108,8 @@
109108
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-3 %s
110109
// CHECK-VFP3XD-NOT: "-target-feature" "+soft-float"
111110
// CHECK-VFP3XD: "-target-feature" "+soft-float-abi"
112-
// CHECK-VFP3XD: "-target-feature" "+fp-only-sp"
113-
// CHECK-VFP3XD: "-target-feature" "+d16"
111+
// CHECK-VFP3XD-NOT: "-target-feature" "+fp64"
112+
// CHECK-VFP3XD-NOT: "-target-feature" "+d32"
114113
// CHECK-VFP3XD: "-target-feature" "+vfp3"
115114
// CHECK-VFP3XD: "-target-feature" "-fp16"
116115
// CHECK-VFP3XD: "-target-feature" "-vfp4"
@@ -124,12 +123,12 @@
124123
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-3 %s
125124
// CHECK-VFP3XD-FP16-NOT: "-target-feature" "+soft-float"
126125
// CHECK-VFP3XD-FP16: "-target-feature" "+soft-float-abi"
127-
// CHECK-VFP3XD-FP16: "-target-feature" "+fp-only-sp"
128-
// CHECK-VFP3XD-FP16: "-target-feature" "+d16"
129126
// CHECK-VFP3XD-FP16: "-target-feature" "+vfp3"
130127
// CHECK-VFP3XD-FP16: "-target-feature" "+fp16"
131128
// CHECK-VFP3XD-FP16: "-target-feature" "-vfp4"
132129
// CHECK-VFP3XD-FP16: "-target-feature" "-fp-armv8"
130+
// CHECK-VFP3XD-FP16-NOT: "-target-feature" "+fp64"
131+
// CHECK-VFP3XD-FP16-NOT: "-target-feature" "+d32"
133132
// CHECK-VFP3XD-FP16: "-target-feature" "-neon"
134133
// CHECK-VFP3XD-FP16: "-target-feature" "-crypto"
135134

@@ -160,10 +159,10 @@
160159
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-4 %s
161160
// CHECK-VFP4-D16-NOT: "-target-feature" "+soft-float"
162161
// CHECK-VFP4-D16: "-target-feature" "+soft-float-abi"
163-
// CHECK-VFP4-D16: "-target-feature" "-fp-only-sp"
164-
// CHECK-VFP4-D16: "-target-feature" "+d16"
165162
// CHECK-VFP4-D16: "-target-feature" "+vfp4"
166163
// CHECK-VFP4-D16: "-target-feature" "-fp-armv8"
164+
// CHECK-VFP4-D16: "-target-feature" "+fp64"
165+
// CHECK-VFP4-D16-NOT: "-target-feature" "+d32"
167166
// CHECK-VFP4-D16: "-target-feature" "-neon"
168167

169168
// RUN: %clang -target arm-linux-eabi -mfpu=fp4-sp-d16 %s -### -o %t.o 2>&1 \
@@ -174,10 +173,10 @@
174173
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-4 %s
175174
// CHECK-FP4-SP-D16-NOT: "-target-feature" "+soft-float"
176175
// CHECK-FP4-SP-D16: "-target-feature" "+soft-float-abi"
177-
// CHECK-FP4-SP-D16: "-target-feature" "+fp-only-sp"
178-
// CHECK-FP4-SP-D16: "-target-feature" "+d16"
179176
// CHECK-FP4-SP-D16: "-target-feature" "+vfp4"
180177
// CHECK-FP4-SP-D16: "-target-feature" "-fp-armv8"
178+
// CHECK-FP4-SP-D16-NOT: "-target-feature" "+fp64"
179+
// CHECK-FP4-SP-D16-NOT: "-target-feature" "+d32"
181180
// CHECK-FP4-SP-D16: "-target-feature" "-neon"
182181

183182
// RUN: %clang -target arm-linux-eabi -mfpu=fp5-sp-d16 %s -### -o %t.o 2>&1 \
@@ -188,10 +187,10 @@
188187
// RUN: 2>&1 | FileCheck --check-prefix=CHECK-SOFT-ABI-FP %s
189188
// CHECK-FP5-SP-D16-NOT: "-target-feature" "+soft-float"
190189
// CHECK-FP5-SP-D16: "-target-feature" "+soft-float-abi"
191-
// CHECK-FP5-SP-D16: "-target-feature" "+fp-only-sp"
192-
// CHECK-FP5-SP-D16: "-target-feature" "+d16"
193190
// CHECK-FP5-SP-D16: "-target-feature" "+fp-armv8"
194191
// CHECK-FP5-SP-D16: "-target-feature" "-neon"
192+
// CHECK-FP5-SP-D16-NOT: "-target-feature" "+fp64"
193+
// CHECK-FP5-SP-D16-NOT: "-target-feature" "+d32"
195194
// CHECK-FP5-SP-D16: "-target-feature" "-crypto"
196195

197196
// RUN: %clang -target arm-linux-eabi -mfpu=fp5-dp-d16 %s -### -o %t.o 2>&1 \
@@ -202,9 +201,9 @@
202201
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-5 %s
203202
// CHECK-FP5-DP-D16-NOT: "-target-feature" "+soft-float"
204203
// CHECK-FP5-DP-D16: "-target-feature" "+soft-float-abi"
205-
// CHECK-FP5-DP-D16: "-target-feature" "-fp-only-sp"
206-
// CHECK-FP5-DP-D16: "-target-feature" "+d16"
207204
// CHECK-FP5-DP-D16: "-target-feature" "+fp-armv8"
205+
// CHECK-FP5-DP-D16: "-target-feature" "+fp64"
206+
// CHECK-FP5-DP-D16-NOT: "-target-feature" "+d32"
208207
// CHECK-FP5-DP-D16: "-target-feature" "-neon"
209208
// CHECK-FP5-DP-D16: "-target-feature" "-crypto"
210209
// CHECK-SOFT-ABI-FP-5: "-target-feature" "+soft-float"
@@ -236,12 +235,12 @@
236235
// RUN: | FileCheck --check-prefix=CHECK-SOFT-ABI-FP-6 %s
237236
// CHECK-NEON-FP16-NOT: "-target-feature" "+soft-float"
238237
// CHECK-NEON-FP16: "-target-feature" "+soft-float-abi"
239-
// CHECK-NEON-FP16: "-target-feature" "-fp-only-sp"
240-
// CHECK-NEON-FP16: "-target-feature" "-d16"
241238
// CHECK-NEON-FP16: "-target-feature" "+vfp3"
242239
// CHECK-NEON-FP16: "-target-feature" "+fp16"
243240
// CHECK-NEON-FP16: "-target-feature" "-vfp4"
244241
// CHECK-NEON-FP16: "-target-feature" "-fp-armv8"
242+
// CHECK-NEON-FP16: "-target-feature" "+fp64"
243+
// CHECK-NEON-FP16: "-target-feature" "+d32"
245244
// CHECK-NEON-FP16: "-target-feature" "+neon"
246245
// CHECK-NEON-FP16: "-target-feature" "-crypto"
247246

@@ -319,12 +318,12 @@
319318
// RUN: | FileCheck --check-prefix=CHECK-NO-FP %s
320319
// CHECK-NO-FP-NOT: "-target-feature" "+soft-float"
321320
// CHECK-NO-FP: "-target-feature" "+soft-float-abi"
322-
// CHECK-NO-FP: "-target-feature" "-fp-only-sp"
323-
// CHECK-NO-FP: "-target-feature" "-d16"
324321
// CHECK-NO-FP: "-target-feature" "-vfp2"
325322
// CHECK-NO-FP: "-target-feature" "-vfp3"
326323
// CHECK-NO-FP: "-target-feature" "-vfp4"
327324
// CHECK-NO-FP: "-target-feature" "-fp-armv8"
325+
// CHECK-NO-FP-NOT: "-target-feature" "+fp64"
326+
// CHECK-NO-FP-NOT: "-target-feature" "+d32"
328327
// CHECK-NO-FP: "-target-feature" "-neon"
329328
// CHECK-NO-FP: "-target-feature" "-crypto"
330329

@@ -369,7 +368,7 @@
369368
// RUN: | FileCheck --check-prefix=CHECK-ARM5-ANDROID-FP-DEFAULT %s
370369
// CHECK-ARM5-ANDROID-FP-DEFAULT: "-target-feature" "+soft-float"
371370
// CHECK-ARM5-ANDROID-FP-DEFAULT: "-target-feature" "+soft-float-abi"
372-
// CHECK-ARM5-ANDROID-FP-DEFAULT-NOT: "-target-feature" "+d16"
371+
// CHECK-ARM5-ANDROID-FP-DEFAULT-NOT: "-target-feature" "+d32"
373372
// CHECK-ARM5-ANDROID-FP-DEFAULT-NOT: "-target-feature" "+vfp3"
374373
// CHECK-ARM5-ANDROID-FP-DEFAULT-NOT: "-target-feature" "+vfp4"
375374
// CHECK-ARM5-ANDROID-FP-DEFAULT-NOT: "-target-feature" "+fp-armv8"
@@ -390,7 +389,7 @@
390389
// RUN: | FileCheck --check-prefix=CHECK-ARM7-ANDROID-FP-D16 %s
391390
// CHECK-ARM7-ANDROID-FP-D16-NOT: "-target-feature" "+soft-float"
392391
// CHECK-ARM7-ANDROID-FP-D16: "-target-feature" "+soft-float-abi"
393-
// CHECK-ARM7-ANDROID-FP-D16: "-target-feature" "+d16"
392+
// CHECK-ARM7-ANDROID-FP-D16-NOT: "-target-feature" "+d32"
394393
// CHECK-ARM7-ANDROID-FP-D16: "-target-feature" "+vfp3"
395394
// CHECK-ARM7-ANDROID-FP-D16-NOT: "-target-feature" "+vfp4"
396395
// CHECK-ARM7-ANDROID-FP-D16-NOT: "-target-feature" "+fp-armv8"

llvm/include/llvm/MC/MCSubtargetInfo.h

+4
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@ class MCSubtargetInfo {
141141
/// all feature bits implied by the flag.
142142
FeatureBitset ApplyFeatureFlag(StringRef FS);
143143

144+
/// Set/clear additional feature bits, including all other bits they imply.
145+
FeatureBitset SetFeatureBitsTransitively(const FeatureBitset& FB);
146+
FeatureBitset ClearFeatureBitsTransitively(const FeatureBitset &FB);
147+
144148
/// Check whether the subtarget features are enabled/disabled as per
145149
/// the provided string, ignoring all other features.
146150
bool checkFeatures(StringRef FS) const;

llvm/lib/MC/MCSubtargetInfo.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,23 @@ FeatureBitset MCSubtargetInfo::ToggleFeature(const FeatureBitset &FB) {
195195
return FeatureBits;
196196
}
197197

198+
FeatureBitset MCSubtargetInfo::SetFeatureBitsTransitively(
199+
const FeatureBitset &FB) {
200+
SetImpliedBits(FeatureBits, FB, ProcFeatures);
201+
return FeatureBits;
202+
}
203+
204+
FeatureBitset MCSubtargetInfo::ClearFeatureBitsTransitively(
205+
const FeatureBitset &FB) {
206+
for (unsigned I = 0, E = FB.size(); I < E; I++) {
207+
if (FB[I]) {
208+
FeatureBits.reset(I);
209+
ClearImpliedBits(FeatureBits, I, ProcFeatures);
210+
}
211+
}
212+
return FeatureBits;
213+
}
214+
198215
FeatureBitset MCSubtargetInfo::ToggleFeature(StringRef Feature) {
199216
// Find feature in table.
200217
const SubtargetFeatureKV *FeatureEntry =

llvm/lib/Object/ELFObjectFile.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -194,9 +194,9 @@ SubtargetFeatures ELFObjectFileBase::getARMFeatures() const {
194194
default:
195195
break;
196196
case ARMBuildAttrs::Not_Allowed:
197-
Features.AddFeature("vfp2", false);
198-
Features.AddFeature("vfp3", false);
199-
Features.AddFeature("vfp4", false);
197+
Features.AddFeature("vfp2d16sp", false);
198+
Features.AddFeature("vfp3d16sp", false);
199+
Features.AddFeature("vfp4d16sp", false);
200200
break;
201201
case ARMBuildAttrs::AllowFPv2:
202202
Features.AddFeature("vfp2");

0 commit comments

Comments
 (0)