Skip to content

Commit dd0fc25

Browse files
authored
[Mips] Fix mcpu flag with i6400/i6500 (#161330)
The compiler is missing cases where it checks mips64r6 but not i6400/i6500 causing wrong defines to be generated
1 parent e3f22d9 commit dd0fc25

File tree

4 files changed

+30
-4
lines changed

4 files changed

+30
-4
lines changed

clang/lib/Basic/Targets/Mips.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ unsigned MipsTargetInfo::getISARev() const {
7272
.Cases("mips32r2", "mips64r2", "octeon", "octeon+", 2)
7373
.Cases("mips32r3", "mips64r3", 3)
7474
.Cases("mips32r5", "mips64r5", "p5600", 5)
75-
.Cases("mips32r6", "mips64r6", 6)
75+
.Cases("mips32r6", "mips64r6", "i6400", "i6500", 6)
7676
.Default(0);
7777
}
7878

@@ -270,8 +270,9 @@ bool MipsTargetInfo::validateTarget(DiagnosticsEngine &Diags) const {
270270
return false;
271271
}
272272
// Mips revision 6 and -mfp32 are incompatible
273-
if (FPMode != FP64 && FPMode != FPXX && (CPU == "mips32r6" ||
274-
CPU == "mips64r6")) {
273+
if (FPMode != FP64 && FPMode != FPXX &&
274+
(CPU == "mips32r6" || CPU == "mips64r6" || CPU == "i6400" ||
275+
CPU == "i6500")) {
275276
Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfp32" << CPU;
276277
return false;
277278
}

clang/lib/Basic/Targets/Mips.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ class LLVM_LIBRARY_VISIBILITY MipsTargetInfo : public TargetInfo {
8383
}
8484

8585
bool isIEEE754_2008Default() const {
86-
return CPU == "mips32r6" || CPU == "mips64r6";
86+
return CPU == "mips32r6" || CPU == "mips64r6" || CPU == "i6400" ||
87+
CPU == "i6500";
8788
}
8889

8990
enum FPModeEnum getDefaultFPMode() const {

clang/lib/Driver/ToolChains/Arch/Mips.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,8 @@ bool mips::hasCompactBranches(StringRef &CPU) {
442442
return llvm::StringSwitch<bool>(CPU)
443443
.Case("mips32r6", true)
444444
.Case("mips64r6", true)
445+
.Case("i6400", true)
446+
.Case("i6500", true)
445447
.Default(false);
446448
}
447449

clang/test/Preprocessor/init-mips.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1649,6 +1649,28 @@
16491649
// MIPS-ARCH-OCTEONP:#define __OCTEON__ 1
16501650
// MIPS-ARCH-OCTEONP:#define __mips_isa_rev 2
16511651

1652+
// RUN: %clang_cc1 -E -dM -ffreestanding -triple=mips64-none-none \
1653+
// RUN: -target-cpu i6400 < /dev/null \
1654+
// RUN: | FileCheck -match-full-lines -check-prefix MIPS-ARCH-I6400 %s
1655+
//
1656+
// MIPS-ARCH-I6400:#define _MIPS_ARCH "i6400"
1657+
// MIPS-ARCH-I6400:#define _MIPS_ARCH_I6400 1
1658+
// MIPS-ARCH-I6400:#define _MIPS_ISA _MIPS_ISA_MIPS64
1659+
// MIPS-ARCH-I6400:#define __mips_abs2008 1
1660+
// MIPS-ARCH-I6400:#define __mips_isa_rev 6
1661+
// MIPS-ARCH-I6400:#define __mips_nan2008 1
1662+
1663+
// RUN: %clang_cc1 -E -dM -ffreestanding -triple=mips64-none-none \
1664+
// RUN: -target-cpu i6500 < /dev/null \
1665+
// RUN: | FileCheck -match-full-lines -check-prefix MIPS-ARCH-I6500 %s
1666+
//
1667+
// MIPS-ARCH-I6500:#define _MIPS_ARCH "i6500"
1668+
// MIPS-ARCH-I6500:#define _MIPS_ARCH_I6500 1
1669+
// MIPS-ARCH-I6500:#define _MIPS_ISA _MIPS_ISA_MIPS64
1670+
// MIPS-ARCH-I6500:#define __mips_abs2008 1
1671+
// MIPS-ARCH-I6500:#define __mips_isa_rev 6
1672+
// MIPS-ARCH-I6500:#define __mips_nan2008 1
1673+
16521674
// Check MIPS float ABI macros
16531675
//
16541676
// RUN: %clang_cc1 -E -dM -ffreestanding \

0 commit comments

Comments
 (0)