diff --git a/lib/Target/Mips/Mips.td b/lib/Target/Mips/Mips.td index 6ea6013bc85..2fbcb39213a 100644 --- a/lib/Target/Mips/Mips.td +++ b/lib/Target/Mips/Mips.td @@ -85,20 +85,34 @@ def FeatureBitCount : SubtargetFeature<"bitcount", "HasBitCount", "true", "Enable 'count leading bits' instructions.">; def FeatureFPIdx : SubtargetFeature<"fpidx", "HasFPIdx", "true", "Enable 'FP indexed load/store' instructions.">; +def FeatureMips1 : SubtargetFeature<"mips1", "MipsArchVersion", "Mips1", + "Mips I ISA Support [highly experimental]">; +def FeatureMips2 : SubtargetFeature<"mips2", "MipsArchVersion", "Mips2", + "Mips II ISA Support [highly experimental]", + [FeatureMips1]>; def FeatureMips32 : SubtargetFeature<"mips32", "MipsArchVersion", "Mips32", "Mips32 ISA Support", - [FeatureCondMov, FeatureBitCount]>; + [FeatureMips2, FeatureCondMov, + FeatureBitCount]>; def FeatureMips32r2 : SubtargetFeature<"mips32r2", "MipsArchVersion", "Mips32r2", "Mips32r2 ISA Support", [FeatureMips32, FeatureSEInReg, FeatureSwap, FeatureFPIdx]>; +// FIXME: Need to check whether FPIdx belongs in the MIPS-III or MIPS-IV Implies +// list but for now it doesn't matter since FPIdx isn't actually attached +// to any instructions. +def FeatureMips3 : SubtargetFeature<"mips3", "MipsArchVersion", "Mips3", + "MIPS III ISA Support [highly experimental]", + [FeatureMips2, FeatureGP64Bit, FeatureFP64Bit]>; def FeatureMips4 : SubtargetFeature<"mips4", "MipsArchVersion", "Mips4", "MIPS IV ISA Support", - [FeatureGP64Bit, FeatureFP64Bit, FeatureFPIdx, - FeatureCondMov]>; + [FeatureMips3, FeatureFPIdx, FeatureCondMov]>; +def FeatureMips5 : SubtargetFeature<"mips5", "MipsArchVersion", "Mips5", + "MIPS V ISA Support [highly experimental]", + [FeatureMips4]>; def FeatureMips64 : SubtargetFeature<"mips64", "MipsArchVersion", "Mips64", "Mips64 ISA Support", - [FeatureMips4, FeatureMips32, FeatureFPIdx]>; + [FeatureMips5, FeatureMips32, FeatureFPIdx]>; def FeatureMips64r2 : SubtargetFeature<"mips64r2", "MipsArchVersion", "Mips64r2", "Mips64r2 ISA Support", [FeatureMips64, FeatureMips32r2]>; @@ -126,9 +140,14 @@ def FeatureCnMips : SubtargetFeature<"cnmips", "HasCnMips", class Proc Features> : Processor; +def : Proc<"mips1", [FeatureMips1, FeatureO32]>; +def : Proc<"mips2", [FeatureMips2, FeatureO32]>; def : Proc<"mips32", [FeatureMips32, FeatureO32]>; def : Proc<"mips32r2", [FeatureMips32r2, FeatureO32]>; + +def : Proc<"mips3", [FeatureMips3, FeatureN64]>; def : Proc<"mips4", [FeatureMips4, FeatureN64]>; +def : Proc<"mips5", [FeatureMips5, FeatureN64]>; def : Proc<"mips64", [FeatureMips64, FeatureN64]>; def : Proc<"mips64r2", [FeatureMips64r2, FeatureN64]>; def : Proc<"mips16", [FeatureMips16, FeatureO32]>; diff --git a/lib/Target/Mips/MipsSubtarget.cpp b/lib/Target/Mips/MipsSubtarget.cpp index 02228da65c2..6675ad42aab 100644 --- a/lib/Target/Mips/MipsSubtarget.cpp +++ b/lib/Target/Mips/MipsSubtarget.cpp @@ -107,6 +107,19 @@ MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU, // Initialize scheduling itinerary for the specified CPU. InstrItins = getInstrItineraryForCPU(CPUName); + // Don't even attempt to generate code for MIPS-I, MIPS-II, MIPS-III, and + // MIPS-V. They have not been tested and currently exist for the integrated + // assembler only. + if (MipsArchVersion == Mips1) + report_fatal_error("Code generation for MIPS-I is not implemented", false); + if (MipsArchVersion == Mips2) + report_fatal_error("Code generation for MIPS-II is not implemented", false); + if (MipsArchVersion == Mips3) + report_fatal_error("Code generation for MIPS-III is not implemented", + false); + if (MipsArchVersion == Mips5) + report_fatal_error("Code generation for MIPS-V is not implemented", false); + // Assert exactly one ABI was chosen. assert(MipsABI != UnknownABI); assert((((getFeatureBits() & Mips::FeatureO32) != 0) + diff --git a/lib/Target/Mips/MipsSubtarget.h b/lib/Target/Mips/MipsSubtarget.h index 3c70f825e1f..666e9397483 100644 --- a/lib/Target/Mips/MipsSubtarget.h +++ b/lib/Target/Mips/MipsSubtarget.h @@ -37,7 +37,8 @@ public: }; protected: - enum MipsArchEnum { Mips32, Mips32r2, Mips4, Mips64, Mips64r2 }; + enum MipsArchEnum { Mips1, Mips2, Mips32, Mips32r2, Mips3, Mips4, Mips5, + Mips64, Mips64r2 }; // Mips architecture version MipsArchEnum MipsArchVersion; diff --git a/test/MC/Mips/mips1/valid-xfail.s b/test/MC/Mips/mips1/valid-xfail.s index 2ffeaa968b4..784338cc371 100644 --- a/test/MC/Mips/mips1/valid-xfail.s +++ b/test/MC/Mips/mips1/valid-xfail.s @@ -2,8 +2,7 @@ # they aren't implemented yet). # This test is set up to XPASS if any instruction generates an encoding. # -# FIXME: Test MIPS-I instead of MIPS32 -# RUN: not llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips32 | not FileCheck %s +# RUN: not llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips1 | not FileCheck %s # CHECK-NOT: encoding # XFAIL: * diff --git a/test/MC/Mips/mips1/valid.s b/test/MC/Mips/mips1/valid.s index 925ee7637d1..4ad74acb537 100644 --- a/test/MC/Mips/mips1/valid.s +++ b/test/MC/Mips/mips1/valid.s @@ -1,7 +1,6 @@ # Instructions that are valid # -# FIXME: Test MIPS-I instead of MIPS32 -# RUN: llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips32 | FileCheck %s +# RUN: llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips1 | FileCheck %s .set noat abs.d $f7,$f25 # CHECK: encoding: diff --git a/test/MC/Mips/mips2/valid-xfail.s b/test/MC/Mips/mips2/valid-xfail.s index 2f82f5c96f9..e8b8666da6e 100644 --- a/test/MC/Mips/mips2/valid-xfail.s +++ b/test/MC/Mips/mips2/valid-xfail.s @@ -2,8 +2,7 @@ # they aren't implemented yet). # This test is set up to XPASS if any instruction generates an encoding. # -# FIXME: Test MIPS-II instead of MIPS32 -# RUN: not llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips32 | not FileCheck %s +# RUN: not llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips2 | not FileCheck %s # CHECK-NOT: encoding # XFAIL: * diff --git a/test/MC/Mips/mips2/valid.s b/test/MC/Mips/mips2/valid.s index 96e55a59787..dc4a8b6ea91 100644 --- a/test/MC/Mips/mips2/valid.s +++ b/test/MC/Mips/mips2/valid.s @@ -1,7 +1,6 @@ # Instructions that are valid # -# FIXME: Test MIPS-II instead of MIPS32 -# RUN: llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips32 | FileCheck %s +# RUN: llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips2 | FileCheck %s .set noat abs.d $f7,$f25 # CHECK: encoding diff --git a/test/MC/Mips/mips3/valid-xfail.s b/test/MC/Mips/mips3/valid-xfail.s index 42fa09f20a2..329dde12a24 100644 --- a/test/MC/Mips/mips3/valid-xfail.s +++ b/test/MC/Mips/mips3/valid-xfail.s @@ -2,8 +2,7 @@ # they aren't implemented yet). # This test is set up to XPASS if any instruction generates an encoding. # -# FIXME: Test MIPS-III instead of MIPS-IV -# RUN: not llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips4 | not FileCheck %s +# RUN: not llvm-mc %s -triple=mips-unknown-linux -show-encoding -mcpu=mips3 | not FileCheck %s # CHECK-NOT: encoding # XFAIL: * diff --git a/test/MC/Mips/mips3/valid.s b/test/MC/Mips/mips3/valid.s index 79443923ad6..68f97038d4a 100644 --- a/test/MC/Mips/mips3/valid.s +++ b/test/MC/Mips/mips3/valid.s @@ -1,7 +1,6 @@ # Instructions that are valid # -# FIXME: Test MIPS-III instead of MIPS-IV -# RUN: llvm-mc %s -triple=mips64-unknown-linux -show-encoding -mcpu=mips4 | FileCheck %s +# RUN: llvm-mc %s -triple=mips64-unknown-linux -show-encoding -mcpu=mips3 | FileCheck %s .set noat abs.d $f7,$f25 # CHECK: encoding diff --git a/test/MC/Mips/mips5/valid-xfail.s b/test/MC/Mips/mips5/valid-xfail.s index 85d961b47a3..3c211d6c05d 100644 --- a/test/MC/Mips/mips5/valid-xfail.s +++ b/test/MC/Mips/mips5/valid-xfail.s @@ -2,8 +2,7 @@ # they aren't implemented yet). # This test is set up to XPASS if any instruction generates an encoding. # -# FIXME: Test MIPS-V instead of MIPS64 -# RUN: not llvm-mc %s -triple=mips64-unknown-linux -show-encoding -mcpu=mips64 | not FileCheck %s +# RUN: not llvm-mc %s -triple=mips64-unknown-linux -show-encoding -mcpu=mips5 | not FileCheck %s # CHECK-NOT: encoding # XFAIL: * diff --git a/test/MC/Mips/mips5/valid.s b/test/MC/Mips/mips5/valid.s index 94be22929f2..f82181fd7c8 100644 --- a/test/MC/Mips/mips5/valid.s +++ b/test/MC/Mips/mips5/valid.s @@ -1,7 +1,6 @@ # Instructions that are valid # -# FIXME: Test MIPS-V instead of MIPS64 -# RUN: llvm-mc %s -triple=mips64-unknown-linux -show-encoding -mcpu=mips64 | FileCheck %s +# RUN: llvm-mc %s -triple=mips64-unknown-linux -show-encoding -mcpu=mips5 | FileCheck %s .set noat abs.d $f7,$f25 # CHECK: encoding