[llvm] r236713 - [mips] Add the SoftFloat MipsSubtarget feature.

Toma Tabacu toma.tabacu at imgtec.com
Thu May 7 03:29:53 PDT 2015


Author: tomatabacu
Date: Thu May  7 05:29:52 2015
New Revision: 236713

URL: http://llvm.org/viewvc/llvm-project?rev=236713&view=rev
Log:
[mips] Add the SoftFloat MipsSubtarget feature.

Summary: This will enable the IAS to reject floating point instructions if soft-float is enabled.

Reviewers: dsanders, echristo

Reviewed By: dsanders

Subscribers: jfb, llvm-commits, mpf

Differential Revision: http://reviews.llvm.org/D9053

Added:
    llvm/trunk/test/MC/Mips/target-soft-float.s
Modified:
    llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
    llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.cpp
    llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.h
    llvm/trunk/lib/Target/Mips/Mips.td
    llvm/trunk/lib/Target/Mips/Mips16ISelLowering.cpp
    llvm/trunk/lib/Target/Mips/Mips32r6InstrInfo.td
    llvm/trunk/lib/Target/Mips/MipsCondMov.td
    llvm/trunk/lib/Target/Mips/MipsInstrFPU.td
    llvm/trunk/lib/Target/Mips/MipsSubtarget.cpp
    llvm/trunk/lib/Target/Mips/MipsSubtarget.h
    llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp

Modified: llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp?rev=236713&r1=236712&r2=236713&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp (original)
+++ llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp Thu May  7 05:29:52 2015
@@ -433,8 +433,10 @@ public:
   bool inMips16Mode() const {
     return STI.getFeatureBits() & Mips::FeatureMips16;
   }
-  // TODO: see how can we get this info.
-  bool abiUsesSoftFloat() const { return false; }
+
+  bool abiUsesSoftFloat() const {
+    return (STI.getFeatureBits() & Mips::FeatureSoftFloat);
+  }
 
   /// Warn if RegIndex is the same as the current AT.
   void warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc);

Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.cpp?rev=236713&r1=236712&r2=236713&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.cpp Thu May  7 05:29:52 2015
@@ -15,6 +15,8 @@ uint8_t MipsABIFlagsSection::getFpABIVal
   switch (FpABI) {
   case FpABIKind::ANY:
     return Val_GNU_MIPS_ABI_FP_ANY;
+  case FpABIKind::SOFT:
+    return Val_GNU_MIPS_ABI_FP_SOFT;
   case FpABIKind::XX:
     return Val_GNU_MIPS_ABI_FP_XX;
   case FpABIKind::S32:

Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.h?rev=236713&r1=236712&r2=236713&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.h (original)
+++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.h Thu May  7 05:29:52 2015
@@ -68,6 +68,7 @@ struct MipsABIFlagsSection {
   enum Val_GNU_MIPS_ABI {
     Val_GNU_MIPS_ABI_FP_ANY = 0,
     Val_GNU_MIPS_ABI_FP_DOUBLE = 1,
+    Val_GNU_MIPS_ABI_FP_SOFT = 3,
     Val_GNU_MIPS_ABI_FP_XX = 5,
     Val_GNU_MIPS_ABI_FP_64 = 6,
     Val_GNU_MIPS_ABI_FP_64A = 7
@@ -77,8 +78,8 @@ struct MipsABIFlagsSection {
     AFL_FLAGS1_ODDSPREG = 1
   };
 
-  // Internal representation of the values used in .module fp=value
-  enum class FpABIKind { ANY, XX, S32, S64 };
+  // Internal representation of the fp_abi related values used in .module.
+  enum class FpABIKind { ANY, XX, S32, S64, SOFT };
 
   // Version of flags structure.
   uint16_t Version;
@@ -217,7 +218,9 @@ public:
     Is32BitABI = P.isABI_O32();
 
     FpABI = FpABIKind::ANY;
-    if (P.isABI_N32() || P.isABI_N64())
+    if (P.abiUsesSoftFloat())
+      FpABI = FpABIKind::SOFT;
+    else if (P.isABI_N32() || P.isABI_N64())
       FpABI = FpABIKind::S64;
     else if (P.isABI_O32()) {
       if (P.isABI_FPXX())

Modified: llvm/trunk/lib/Target/Mips/Mips.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/Mips.td?rev=236713&r1=236712&r2=236713&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/Mips.td (original)
+++ llvm/trunk/lib/Target/Mips/Mips.td Thu May  7 05:29:52 2015
@@ -28,12 +28,15 @@ class PredicateControl {
   list<Predicate> FGRPredicates = [];
   // Predicates for the instruction group membership such as ISA's and ASE's
   list<Predicate> InsnPredicates = [];
+  // Predicate for marking the instruction as usable in hard-float mode only.
+  list<Predicate> HardFloatPredicate = [];
   // Predicates for anything else
   list<Predicate> AdditionalPredicates = [];
   list<Predicate> Predicates = !listconcat(EncodingPredicates,
                                            GPRPredicates,
                                            FGRPredicates,
                                            InsnPredicates,
+                                           HardFloatPredicate,
                                            AdditionalPredicates);
 }
 
@@ -69,6 +72,8 @@ def FeatureNaN2008     : SubtargetFeatur
                                 "IEEE 754-2008 NaN encoding">;
 def FeatureSingleFloat : SubtargetFeature<"single-float", "IsSingleFloat",
                                 "true", "Only supports single precision float">;
+def FeatureSoftFloat   : SubtargetFeature<"soft-float", "IsSoftFloat", "true",
+                                "Does not support floating point instructions">;
 def FeatureNoOddSPReg  : SubtargetFeature<"nooddspreg", "UseOddSPReg", "false",
                               "Disable odd numbered single-precision "
                               "registers">;

Modified: llvm/trunk/lib/Target/Mips/Mips16ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/Mips16ISelLowering.cpp?rev=236713&r1=236712&r2=236713&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/Mips16ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/Mips/Mips16ISelLowering.cpp Thu May  7 05:29:52 2015
@@ -127,7 +127,7 @@ Mips16TargetLowering::Mips16TargetLoweri
   // Set up the register classes
   addRegisterClass(MVT::i32, &Mips::CPU16RegsRegClass);
 
-  if (!TM.Options.UseSoftFloat)
+  if (!Subtarget.abiUsesSoftFloat())
     setMips16HardFloatLibCalls();
 
   setOperationAction(ISD::ATOMIC_FENCE,       MVT::Other, Expand);

Modified: llvm/trunk/lib/Target/Mips/Mips32r6InstrInfo.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/Mips32r6InstrInfo.td?rev=236713&r1=236712&r2=236713&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/Mips32r6InstrInfo.td (original)
+++ llvm/trunk/lib/Target/Mips/Mips32r6InstrInfo.td Thu May  7 05:29:52 2015
@@ -188,52 +188,52 @@ multiclass CMP_CC_M <FIELD_CMP_FORMAT Fo
                      RegisterOperand FGROpnd>{
   def CMP_F_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_AF>,
                     CMP_CONDN_DESC_BASE<"af", Typestr, FGROpnd>,
-                    ISA_MIPS32R6;
+                    ISA_MIPS32R6, HARDFLOAT;
   def CMP_UN_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_UN>,
                      CMP_CONDN_DESC_BASE<"un", Typestr, FGROpnd, setuo>,
-                     ISA_MIPS32R6;
+                     ISA_MIPS32R6, HARDFLOAT;
   def CMP_EQ_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_EQ>,
                      CMP_CONDN_DESC_BASE<"eq", Typestr, FGROpnd, setoeq>,
-                     ISA_MIPS32R6;
+                     ISA_MIPS32R6, HARDFLOAT;
   def CMP_UEQ_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_UEQ>,
                       CMP_CONDN_DESC_BASE<"ueq", Typestr, FGROpnd, setueq>,
-                      ISA_MIPS32R6;
+                      ISA_MIPS32R6, HARDFLOAT;
   def CMP_LT_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_LT>,
                      CMP_CONDN_DESC_BASE<"lt", Typestr, FGROpnd, setolt>,
-                     ISA_MIPS32R6;
+                     ISA_MIPS32R6, HARDFLOAT;
   def CMP_ULT_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_ULT>,
                       CMP_CONDN_DESC_BASE<"ult", Typestr, FGROpnd, setult>,
-                      ISA_MIPS32R6;
+                      ISA_MIPS32R6, HARDFLOAT;
   def CMP_LE_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_LE>,
                      CMP_CONDN_DESC_BASE<"le", Typestr, FGROpnd, setole>,
-                     ISA_MIPS32R6;
+                     ISA_MIPS32R6, HARDFLOAT;
   def CMP_ULE_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_ULE>,
                       CMP_CONDN_DESC_BASE<"ule", Typestr, FGROpnd, setule>,
-                      ISA_MIPS32R6;
+                      ISA_MIPS32R6, HARDFLOAT;
   def CMP_SAF_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_SAF>,
                       CMP_CONDN_DESC_BASE<"saf", Typestr, FGROpnd>,
-                      ISA_MIPS32R6;
+                      ISA_MIPS32R6, HARDFLOAT;
   def CMP_SUN_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_SUN>,
                       CMP_CONDN_DESC_BASE<"sun", Typestr, FGROpnd>,
-                      ISA_MIPS32R6;
+                      ISA_MIPS32R6, HARDFLOAT;
   def CMP_SEQ_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_SEQ>,
                       CMP_CONDN_DESC_BASE<"seq", Typestr, FGROpnd>,
-                      ISA_MIPS32R6;
+                      ISA_MIPS32R6, HARDFLOAT;
   def CMP_SUEQ_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_SUEQ>,
                        CMP_CONDN_DESC_BASE<"sueq", Typestr, FGROpnd>,
-                       ISA_MIPS32R6;
+                       ISA_MIPS32R6, HARDFLOAT;
   def CMP_SLT_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_SLT>,
                       CMP_CONDN_DESC_BASE<"slt", Typestr, FGROpnd>,
-                      ISA_MIPS32R6;
+                      ISA_MIPS32R6, HARDFLOAT;
   def CMP_SULT_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_SULT>,
                        CMP_CONDN_DESC_BASE<"sult", Typestr, FGROpnd>,
-                       ISA_MIPS32R6;
+                       ISA_MIPS32R6, HARDFLOAT;
   def CMP_SLE_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_SLE>,
                       CMP_CONDN_DESC_BASE<"sle", Typestr, FGROpnd>,
-                      ISA_MIPS32R6;
+                      ISA_MIPS32R6, HARDFLOAT;
   def CMP_SULE_#NAME : COP1_CMP_CONDN_FM<Format, FIELD_CMP_COND_SULE>,
                        CMP_CONDN_DESC_BASE<"sule", Typestr, FGROpnd>,
-                       ISA_MIPS32R6;
+                       ISA_MIPS32R6, HARDFLOAT;
 }
 
 //===----------------------------------------------------------------------===//
@@ -651,8 +651,8 @@ def AUI : AUI_ENC, AUI_DESC, ISA_MIPS32R
 def AUIPC : AUIPC_ENC, AUIPC_DESC, ISA_MIPS32R6;
 def BAL : BAL_ENC, BAL_DESC, ISA_MIPS32R6;
 def BALC : R6MMR6Rel, BALC_ENC, BALC_DESC, ISA_MIPS32R6;
-def BC1EQZ : BC1EQZ_ENC, BC1EQZ_DESC, ISA_MIPS32R6;
-def BC1NEZ : BC1NEZ_ENC, BC1NEZ_DESC, ISA_MIPS32R6;
+def BC1EQZ : BC1EQZ_ENC, BC1EQZ_DESC, ISA_MIPS32R6, HARDFLOAT;
+def BC1NEZ : BC1NEZ_ENC, BC1NEZ_DESC, ISA_MIPS32R6, HARDFLOAT;
 def BC2EQZ : BC2EQZ_ENC, BC2EQZ_DESC, ISA_MIPS32R6;
 def BC2NEZ : BC2NEZ_ENC, BC2NEZ_DESC, ISA_MIPS32R6;
 def BC : R6MMR6Rel, BC_ENC, BC_DESC, ISA_MIPS32R6;
@@ -678,8 +678,8 @@ def BNEZC : BNEZC_ENC, BNEZC_DESC, ISA_M
 def BNVC : BNVC_ENC, BNVC_DESC, ISA_MIPS32R6;
 def BOVC : BOVC_ENC, BOVC_DESC, ISA_MIPS32R6;
 def CACHE_R6 : R6MMR6Rel, CACHE_ENC, CACHE_DESC, ISA_MIPS32R6;
-def CLASS_D : CLASS_D_ENC, CLASS_D_DESC, ISA_MIPS32R6;
-def CLASS_S : CLASS_S_ENC, CLASS_S_DESC, ISA_MIPS32R6;
+def CLASS_D : CLASS_D_ENC, CLASS_D_DESC, ISA_MIPS32R6, HARDFLOAT;
+def CLASS_S : CLASS_S_ENC, CLASS_S_DESC, ISA_MIPS32R6, HARDFLOAT;
 def CLO_R6 : CLO_R6_ENC, CLO_R6_DESC, ISA_MIPS32R6;
 def CLZ_R6 : CLZ_R6_ENC, CLZ_R6_DESC, ISA_MIPS32R6;
 defm S : CMP_CC_M<FIELD_CMP_FORMAT_S, "s", FGR32Opnd>;
@@ -695,39 +695,39 @@ def LSA_R6 : LSA_R6_ENC, LSA_R6_DESC, IS
 def LWC2_R6 : LWC2_R6_ENC, LWC2_R6_DESC, ISA_MIPS32R6;
 def LWPC : LWPC_ENC, LWPC_DESC, ISA_MIPS32R6;
 def LWUPC : LWUPC_ENC, LWUPC_DESC, ISA_MIPS32R6;
-def MADDF_S : MADDF_S_ENC, MADDF_S_DESC, ISA_MIPS32R6;
-def MADDF_D : MADDF_D_ENC, MADDF_D_DESC, ISA_MIPS32R6;
-def MAXA_D : MAXA_D_ENC, MAXA_D_DESC, ISA_MIPS32R6;
-def MAXA_S : MAXA_S_ENC, MAXA_S_DESC, ISA_MIPS32R6;
-def MAX_D : MAX_D_ENC, MAX_D_DESC, ISA_MIPS32R6;
-def MAX_S : MAX_S_ENC, MAX_S_DESC, ISA_MIPS32R6;
-def MINA_D : MINA_D_ENC, MINA_D_DESC, ISA_MIPS32R6;
-def MINA_S : MINA_S_ENC, MINA_S_DESC, ISA_MIPS32R6;
-def MIN_D : MIN_D_ENC, MIN_D_DESC, ISA_MIPS32R6;
-def MIN_S : MIN_S_ENC, MIN_S_DESC, ISA_MIPS32R6;
+def MADDF_S : MADDF_S_ENC, MADDF_S_DESC, ISA_MIPS32R6, HARDFLOAT;
+def MADDF_D : MADDF_D_ENC, MADDF_D_DESC, ISA_MIPS32R6, HARDFLOAT;
+def MAXA_D  : MAXA_D_ENC, MAXA_D_DESC, ISA_MIPS32R6, HARDFLOAT;
+def MAXA_S  : MAXA_S_ENC, MAXA_S_DESC, ISA_MIPS32R6, HARDFLOAT;
+def MAX_D   : MAX_D_ENC, MAX_D_DESC, ISA_MIPS32R6, HARDFLOAT;
+def MAX_S   : MAX_S_ENC, MAX_S_DESC, ISA_MIPS32R6, HARDFLOAT;
+def MINA_D  : MINA_D_ENC, MINA_D_DESC, ISA_MIPS32R6, HARDFLOAT;
+def MINA_S  : MINA_S_ENC, MINA_S_DESC, ISA_MIPS32R6, HARDFLOAT;
+def MIN_D   : MIN_D_ENC, MIN_D_DESC, ISA_MIPS32R6, HARDFLOAT;
+def MIN_S   : MIN_S_ENC, MIN_S_DESC, ISA_MIPS32R6, HARDFLOAT;
 def MOD : MOD_ENC, MOD_DESC, ISA_MIPS32R6;
 def MODU : MODU_ENC, MODU_DESC, ISA_MIPS32R6;
-def MSUBF_S : MSUBF_S_ENC, MSUBF_S_DESC, ISA_MIPS32R6;
-def MSUBF_D : MSUBF_D_ENC, MSUBF_D_DESC, ISA_MIPS32R6;
+def MSUBF_S : MSUBF_S_ENC, MSUBF_S_DESC, ISA_MIPS32R6, HARDFLOAT;
+def MSUBF_D : MSUBF_D_ENC, MSUBF_D_DESC, ISA_MIPS32R6, HARDFLOAT;
 def MUH    : R6MMR6Rel, MUH_ENC, MUH_DESC, ISA_MIPS32R6;
 def MUHU   : R6MMR6Rel, MUHU_ENC, MUHU_DESC, ISA_MIPS32R6;
 def MUL_R6 : R6MMR6Rel, MUL_R6_ENC, MUL_R6_DESC, ISA_MIPS32R6;
 def MULU   : R6MMR6Rel, MULU_ENC, MULU_DESC, ISA_MIPS32R6;
 def NAL; // BAL with rd=0
 def PREF_R6 : R6MMR6Rel, PREF_ENC, PREF_DESC, ISA_MIPS32R6;
-def RINT_D : RINT_D_ENC, RINT_D_DESC, ISA_MIPS32R6;
-def RINT_S : RINT_S_ENC, RINT_S_DESC, ISA_MIPS32R6;
+def RINT_D : RINT_D_ENC, RINT_D_DESC, ISA_MIPS32R6, HARDFLOAT;
+def RINT_S : RINT_S_ENC, RINT_S_DESC, ISA_MIPS32R6, HARDFLOAT;
 def SC_R6 : SC_R6_ENC, SC_R6_DESC, ISA_MIPS32R6;
 def SDBBP_R6 : SDBBP_R6_ENC, SDBBP_R6_DESC, ISA_MIPS32R6;
 def SDC2_R6 : SDC2_R6_ENC, SDC2_R6_DESC, ISA_MIPS32R6;
 def SELEQZ : SELEQZ_ENC, SELEQZ_DESC, ISA_MIPS32R6, GPR_32;
-def SELEQZ_D : SELEQZ_D_ENC, SELEQZ_D_DESC, ISA_MIPS32R6;
-def SELEQZ_S : SELEQZ_S_ENC, SELEQZ_S_DESC, ISA_MIPS32R6;
+def SELEQZ_D : SELEQZ_D_ENC, SELEQZ_D_DESC, ISA_MIPS32R6, HARDFLOAT;
+def SELEQZ_S : SELEQZ_S_ENC, SELEQZ_S_DESC, ISA_MIPS32R6, HARDFLOAT;
 def SELNEZ : SELNEZ_ENC, SELNEZ_DESC, ISA_MIPS32R6, GPR_32;
-def SELNEZ_D : SELNEZ_D_ENC, SELNEZ_D_DESC, ISA_MIPS32R6;
-def SELNEZ_S : SELNEZ_S_ENC, SELNEZ_S_DESC, ISA_MIPS32R6;
-def SEL_D : SEL_D_ENC, SEL_D_DESC, ISA_MIPS32R6;
-def SEL_S : SEL_S_ENC, SEL_S_DESC, ISA_MIPS32R6;
+def SELNEZ_D : SELNEZ_D_ENC, SELNEZ_D_DESC, ISA_MIPS32R6, HARDFLOAT;
+def SELNEZ_S : SELNEZ_S_ENC, SELNEZ_S_DESC, ISA_MIPS32R6, HARDFLOAT;
+def SEL_D    : SEL_D_ENC, SEL_D_DESC, ISA_MIPS32R6, HARDFLOAT;
+def SEL_S    : SEL_S_ENC, SEL_S_DESC, ISA_MIPS32R6, HARDFLOAT;
 def SWC2_R6 : SWC2_R6_ENC, SWC2_R6_DESC, ISA_MIPS32R6;
 
 //===----------------------------------------------------------------------===//

Modified: llvm/trunk/lib/Target/Mips/MipsCondMov.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsCondMov.td?rev=236713&r1=236712&r2=236713&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsCondMov.td (original)
+++ llvm/trunk/lib/Target/Mips/MipsCondMov.td Thu May  7 05:29:52 2015
@@ -27,7 +27,8 @@ class CMov_I_I_FT<string opstr, Register
 class CMov_I_F_FT<string opstr, RegisterOperand CRC, RegisterOperand DRC,
                   InstrItinClass Itin> :
   InstSE<(outs DRC:$fd), (ins DRC:$fs, CRC:$rt, DRC:$F),
-         !strconcat(opstr, "\t$fd, $fs, $rt"), [], Itin, FrmFR, opstr> {
+         !strconcat(opstr, "\t$fd, $fs, $rt"), [], Itin, FrmFR, opstr>,
+  HARDFLOAT {
   let Constraints = "$F = $fd";
 }
 
@@ -37,7 +38,7 @@ class CMov_F_I_FT<string opstr, Register
   InstSE<(outs RC:$rd), (ins RC:$rs, FCCRegsOpnd:$fcc, RC:$F),
          !strconcat(opstr, "\t$rd, $rs, $fcc"),
          [(set RC:$rd, (OpNode RC:$rs, FCCRegsOpnd:$fcc, RC:$F))],
-         Itin, FrmFR, opstr> {
+         Itin, FrmFR, opstr>, HARDFLOAT {
   let Constraints = "$F = $rd";
 }
 
@@ -47,7 +48,7 @@ class CMov_F_F_FT<string opstr, Register
   InstSE<(outs RC:$fd), (ins RC:$fs, FCCRegsOpnd:$fcc, RC:$F),
          !strconcat(opstr, "\t$fd, $fs, $fcc"),
          [(set RC:$fd, (OpNode RC:$fs, FCCRegsOpnd:$fcc, RC:$F))],
-         Itin, FrmFR, opstr> {
+         Itin, FrmFR, opstr>, HARDFLOAT {
   let Constraints = "$F = $fd";
 }
 

Modified: llvm/trunk/lib/Target/Mips/MipsInstrFPU.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsInstrFPU.td?rev=236713&r1=236712&r2=236713&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsInstrFPU.td (original)
+++ llvm/trunk/lib/Target/Mips/MipsInstrFPU.td Thu May  7 05:29:52 2015
@@ -65,6 +65,8 @@ def IsSingleFloat    : Predicate<"Subtar
                        AssemblerPredicate<"FeatureSingleFloat">;
 def IsNotSingleFloat : Predicate<"!Subtarget->isSingleFloat()">,
                        AssemblerPredicate<"!FeatureSingleFloat">;
+def IsNotSoftFloat   : Predicate<"!Subtarget->abiUsesSoftFloat()">,
+                       AssemblerPredicate<"!FeatureSoftFloat">;
 
 //===----------------------------------------------------------------------===//
 // Mips FGR size adjectives.
@@ -73,6 +75,7 @@ def IsNotSingleFloat : Predicate<"!Subta
 
 class FGR_32 { list<Predicate> FGRPredicates = [NotFP64bit]; }
 class FGR_64 { list<Predicate> FGRPredicates = [IsFP64bit]; }
+class HARDFLOAT { list<Predicate> HardFloatPredicate = [IsNotSoftFloat]; }
 
 //===----------------------------------------------------------------------===//
 
@@ -98,12 +101,12 @@ def fpimm0neg : PatLeaf<(fpimm), [{
 //
 // Only S32 and D32 are supported right now.
 //===----------------------------------------------------------------------===//
-
 class ADDS_FT<string opstr, RegisterOperand RC, InstrItinClass Itin, bit IsComm,
               SDPatternOperator OpNode= null_frag> :
   InstSE<(outs RC:$fd), (ins RC:$fs, RC:$ft),
          !strconcat(opstr, "\t$fd, $fs, $ft"),
-         [(set RC:$fd, (OpNode RC:$fs, RC:$ft))], Itin, FrmFR, opstr> {
+         [(set RC:$fd, (OpNode RC:$fs, RC:$ft))], Itin, FrmFR, opstr>,
+  HARDFLOAT {
   let isCommutable = IsComm;
 }
 
@@ -122,6 +125,7 @@ class ABSS_FT<string opstr, RegisterOper
               InstrItinClass Itin, SDPatternOperator OpNode= null_frag> :
   InstSE<(outs DstRC:$fd), (ins SrcRC:$fs), !strconcat(opstr, "\t$fd, $fs"),
          [(set DstRC:$fd, (OpNode SrcRC:$fs))], Itin, FrmFR, opstr>,
+  HARDFLOAT,
   NeverHasSideEffects;
 
 multiclass ABSS_M<string opstr, InstrItinClass Itin,
@@ -146,17 +150,17 @@ multiclass ROUND_M<string opstr, InstrIt
 class MFC1_FT<string opstr, RegisterOperand DstRC, RegisterOperand SrcRC,
               InstrItinClass Itin, SDPatternOperator OpNode= null_frag> :
   InstSE<(outs DstRC:$rt), (ins SrcRC:$fs), !strconcat(opstr, "\t$rt, $fs"),
-         [(set DstRC:$rt, (OpNode SrcRC:$fs))], Itin, FrmFR, opstr>;
+         [(set DstRC:$rt, (OpNode SrcRC:$fs))], Itin, FrmFR, opstr>, HARDFLOAT;
 
 class MTC1_FT<string opstr, RegisterOperand DstRC, RegisterOperand SrcRC,
               InstrItinClass Itin, SDPatternOperator OpNode= null_frag> :
   InstSE<(outs DstRC:$fs), (ins SrcRC:$rt), !strconcat(opstr, "\t$rt, $fs"),
-         [(set DstRC:$fs, (OpNode SrcRC:$rt))], Itin, FrmFR, opstr>;
+         [(set DstRC:$fs, (OpNode SrcRC:$rt))], Itin, FrmFR, opstr>, HARDFLOAT;
 
 class MTC1_64_FT<string opstr, RegisterOperand DstRC, RegisterOperand SrcRC,
                  InstrItinClass Itin> :
   InstSE<(outs DstRC:$fs), (ins DstRC:$fs_in, SrcRC:$rt),
-         !strconcat(opstr, "\t$rt, $fs"), [], Itin, FrmFR, opstr> {
+         !strconcat(opstr, "\t$rt, $fs"), [], Itin, FrmFR, opstr>, HARDFLOAT {
   // $fs_in is part of a white lie to work around a widespread bug in the FPU
   // implementation. See expandBuildPairF64 for details.
   let Constraints = "$fs = $fs_in";
@@ -165,7 +169,8 @@ class MTC1_64_FT<string opstr, RegisterO
 class LW_FT<string opstr, RegisterOperand RC, InstrItinClass Itin,
             SDPatternOperator OpNode= null_frag> :
   InstSE<(outs RC:$rt), (ins mem:$addr), !strconcat(opstr, "\t$rt, $addr"),
-         [(set RC:$rt, (OpNode addrDefault:$addr))], Itin, FrmFI, opstr> {
+         [(set RC:$rt, (OpNode addrDefault:$addr))], Itin, FrmFI, opstr>,
+  HARDFLOAT {
   let DecoderMethod = "DecodeFMem";
   let mayLoad = 1;
 }
@@ -173,7 +178,7 @@ class LW_FT<string opstr, RegisterOperan
 class SW_FT<string opstr, RegisterOperand RC, InstrItinClass Itin,
             SDPatternOperator OpNode= null_frag> :
   InstSE<(outs), (ins RC:$rt, mem:$addr), !strconcat(opstr, "\t$rt, $addr"),
-         [(OpNode RC:$rt, addrDefault:$addr)], Itin, FrmFI, opstr> {
+         [(OpNode RC:$rt, addrDefault:$addr)], Itin, FrmFI, opstr>, HARDFLOAT {
   let DecoderMethod = "DecodeFMem";
   let mayStore = 1;
 }
@@ -183,21 +188,21 @@ class MADDS_FT<string opstr, RegisterOpe
   InstSE<(outs RC:$fd), (ins RC:$fr, RC:$fs, RC:$ft),
          !strconcat(opstr, "\t$fd, $fr, $fs, $ft"),
          [(set RC:$fd, (OpNode (fmul RC:$fs, RC:$ft), RC:$fr))], Itin,
-         FrmFR, opstr>;
+         FrmFR, opstr>, HARDFLOAT;
 
 class NMADDS_FT<string opstr, RegisterOperand RC, InstrItinClass Itin,
                 SDPatternOperator OpNode = null_frag> :
   InstSE<(outs RC:$fd), (ins RC:$fr, RC:$fs, RC:$ft),
          !strconcat(opstr, "\t$fd, $fr, $fs, $ft"),
          [(set RC:$fd, (fsub fpimm0, (OpNode (fmul RC:$fs, RC:$ft), RC:$fr)))],
-         Itin, FrmFR, opstr>;
+         Itin, FrmFR, opstr>, HARDFLOAT;
 
 class LWXC1_FT<string opstr, RegisterOperand DRC,
                InstrItinClass Itin, SDPatternOperator OpNode = null_frag> :
   InstSE<(outs DRC:$fd), (ins PtrRC:$base, PtrRC:$index),
          !strconcat(opstr, "\t$fd, ${index}(${base})"),
          [(set DRC:$fd, (OpNode (add iPTR:$base, iPTR:$index)))], Itin,
-         FrmFI, opstr> {
+         FrmFI, opstr>, HARDFLOAT {
   let AddedComplexity = 20;
 }
 
@@ -206,7 +211,7 @@ class SWXC1_FT<string opstr, RegisterOpe
   InstSE<(outs), (ins DRC:$fs, PtrRC:$base, PtrRC:$index),
          !strconcat(opstr, "\t$fs, ${index}(${base})"),
          [(OpNode DRC:$fs, (add iPTR:$base, iPTR:$index))], Itin,
-         FrmFI, opstr> {
+         FrmFI, opstr>, HARDFLOAT {
   let AddedComplexity = 20;
 }
 
@@ -215,7 +220,7 @@ class BC1F_FT<string opstr, DAGOperand o
   InstSE<(outs), (ins FCCRegsOpnd:$fcc, opnd:$offset),
          !strconcat(opstr, "\t$fcc, $offset"),
          [(MipsFPBrcond Op, FCCRegsOpnd:$fcc, bb:$offset)], Itin,
-         FrmFI, opstr> {
+         FrmFI, opstr>, HARDFLOAT {
   let isBranch = 1;
   let isTerminator = 1;
   let hasDelaySlot = DelaySlot;
@@ -227,7 +232,7 @@ class CEQS_FT<string typestr, RegisterCl
   InstSE<(outs), (ins RC:$fs, RC:$ft, condcode:$cond),
          !strconcat("c.$cond.", typestr, "\t$fs, $ft"),
          [(OpNode RC:$fs, RC:$ft, imm:$cond)], Itin, FrmFR,
-         !strconcat("c.$cond.", typestr)> {
+         !strconcat("c.$cond.", typestr)>, HARDFLOAT {
   let Defs = [FCC0];
   let isCodeGenOnly = 1;
 }
@@ -236,7 +241,7 @@ class C_COND_FT<string CondStr, string T
                 InstrItinClass itin>  :
    InstSE<(outs), (ins RC:$fs, RC:$ft),
           !strconcat("c.", CondStr, ".", Typestr, "\t$fs, $ft"), [], itin,
-          FrmFR>;
+          FrmFR>, HARDFLOAT;
 
 multiclass C_COND_M<string TypeStr, RegisterOperand RC, bits<5> fmt,
                     InstrItinClass itin> {
@@ -533,9 +538,9 @@ class BuildPairF64Base<RegisterOperand R
            [(set RO:$dst, (MipsBuildPairF64 GPR32Opnd:$lo, GPR32Opnd:$hi))]>;
 
 def BuildPairF64 : BuildPairF64Base<AFGR64Opnd>,
-                   AdditionalRequires<[NotFP64bit]>;
+                   AdditionalRequires<[NotFP64bit]>, HARDFLOAT;
 def BuildPairF64_64 : BuildPairF64Base<FGR64Opnd>,
-                      AdditionalRequires<[IsFP64bit]>;
+                      AdditionalRequires<[IsFP64bit]>, HARDFLOAT;
 
 // This pseudo instr gets expanded into 2 mfc1 instrs after register
 // allocation.
@@ -546,21 +551,21 @@ class ExtractElementF64Base<RegisterOper
            [(set GPR32Opnd:$dst, (MipsExtractElementF64 RO:$src, imm:$n))]>;
 
 def ExtractElementF64 : ExtractElementF64Base<AFGR64Opnd>,
-                        AdditionalRequires<[NotFP64bit]>;
+                        AdditionalRequires<[NotFP64bit]>, HARDFLOAT;
 def ExtractElementF64_64 : ExtractElementF64Base<FGR64Opnd>,
-                           AdditionalRequires<[IsFP64bit]>;
+                           AdditionalRequires<[IsFP64bit]>, HARDFLOAT;
 
 //===----------------------------------------------------------------------===//
 // InstAliases.
 //===----------------------------------------------------------------------===//
 def : MipsInstAlias<"bc1t $offset", (BC1T FCC0, brtarget:$offset)>,
-      ISA_MIPS1_NOT_32R6_64R6;
+      ISA_MIPS1_NOT_32R6_64R6, HARDFLOAT;
 def : MipsInstAlias<"bc1tl $offset", (BC1TL FCC0, brtarget:$offset)>,
-      ISA_MIPS2_NOT_32R6_64R6;
+      ISA_MIPS2_NOT_32R6_64R6, HARDFLOAT;
 def : MipsInstAlias<"bc1f $offset", (BC1F FCC0, brtarget:$offset)>,
-      ISA_MIPS1_NOT_32R6_64R6;
+      ISA_MIPS1_NOT_32R6_64R6, HARDFLOAT;
 def : MipsInstAlias<"bc1fl $offset", (BC1FL FCC0, brtarget:$offset)>,
-      ISA_MIPS2_NOT_32R6_64R6;
+      ISA_MIPS2_NOT_32R6_64R6, HARDFLOAT;
 
 //===----------------------------------------------------------------------===//
 // Floating Point Patterns

Modified: llvm/trunk/lib/Target/Mips/MipsSubtarget.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsSubtarget.cpp?rev=236713&r1=236712&r2=236713&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsSubtarget.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MipsSubtarget.cpp Thu May  7 05:29:52 2015
@@ -63,11 +63,11 @@ MipsSubtarget::MipsSubtarget(const std::
                              const std::string &FS, bool little,
                              const MipsTargetMachine &TM)
     : MipsGenSubtargetInfo(TT, CPU, FS), MipsArchVersion(MipsDefault),
-      IsLittle(little), IsSingleFloat(false), IsFPXX(false), NoABICalls(false),
-      IsFP64bit(false), UseOddSPReg(true), IsNaN2008bit(false),
-      IsGP64bit(false), HasVFPU(false), HasCnMips(false), HasMips3_32(false),
-      HasMips3_32r2(false), HasMips4_32(false), HasMips4_32r2(false),
-      HasMips5_32r2(false), InMips16Mode(false),
+      IsLittle(little), IsSoftFloat(false), IsSingleFloat(false), IsFPXX(false),
+      NoABICalls(false), IsFP64bit(false), UseOddSPReg(true),
+      IsNaN2008bit(false), IsGP64bit(false), HasVFPU(false), HasCnMips(false),
+      HasMips3_32(false), HasMips3_32r2(false), HasMips4_32(false),
+      HasMips4_32r2(false), HasMips5_32r2(false), InMips16Mode(false),
       InMips16HardFloat(Mips16HardFloat), InMicroMipsMode(false), HasDSP(false),
       HasDSPR2(false), AllowMixed16_32(Mixed16_32 | Mips_Os16), Os16(Mips_Os16),
       HasMSA(false), TM(TM), TargetTriple(TT), TSInfo(*TM.getDataLayout()),
@@ -148,16 +148,12 @@ MipsSubtarget::initializeSubtargetDepend
   // Initialize scheduling itinerary for the specified CPU.
   InstrItins = getInstrItineraryForCPU(CPUName);
 
-  if (InMips16Mode && !TM.Options.UseSoftFloat)
+  if (InMips16Mode && !IsSoftFloat)
     InMips16HardFloat = true;
 
   return *this;
 }
 
-bool MipsSubtarget::abiUsesSoftFloat() const {
-  return TM.Options.UseSoftFloat && !InMips16HardFloat;
-}
-
 bool MipsSubtarget::useConstantIslands() {
   DEBUG(dbgs() << "use constant islands " << Mips16ConstantIslands << "\n");
   return Mips16ConstantIslands;

Modified: llvm/trunk/lib/Target/Mips/MipsSubtarget.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsSubtarget.h?rev=236713&r1=236712&r2=236713&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsSubtarget.h (original)
+++ llvm/trunk/lib/Target/Mips/MipsSubtarget.h Thu May  7 05:29:52 2015
@@ -48,6 +48,9 @@ class MipsSubtarget : public MipsGenSubt
   // IsLittle - The target is Little Endian
   bool IsLittle;
 
+  // IsSoftFloat - The target does not support any floating point instructions.
+  bool IsSoftFloat;
+
   // IsSingleFloat - The target only supports single precision float
   // point operations. This enable the target to use all 32 32-bit
   // floating point registers instead of only using even ones.
@@ -233,7 +236,9 @@ public:
 
   bool hasStandardEncoding() const { return !inMips16Mode(); }
 
-  bool abiUsesSoftFloat() const;
+  bool abiUsesSoftFloat() const {
+    return IsSoftFloat && !InMips16HardFloat;
+  }
 
   bool enableLongBranchPass() const {
     return hasStandardEncoding() || allowMixed16_32();

Modified: llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp?rev=236713&r1=236712&r2=236713&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp Thu May  7 05:29:52 2015
@@ -139,9 +139,7 @@ MipsTargetMachine::getSubtargetImpl(cons
 
   // FIXME: This is related to the code below to reset the target options,
   // we need to know whether or not the soft float flag is set on the
-  // function before we can generate a subtarget. We also need to use
-  // it as a key for the subtarget since that can be the only difference
-  // between two functions.
+  // function, so we can enable it as a subtarget feature.
   Attribute SFAttr = F.getFnAttribute("use-soft-float");
   bool softFloat = !SFAttr.hasAttribute(Attribute::None)
                        ? SFAttr.getValueAsString() == "true"
@@ -151,9 +149,10 @@ MipsTargetMachine::getSubtargetImpl(cons
     FS += FS.empty() ? "+mips16" : ",+mips16";
   else if (hasNoMips16Attr)
     FS += FS.empty() ? "-mips16" : ",-mips16";
+  if (softFloat)
+    FS += FS.empty() ? "+soft-float" : ",+soft-float";
 
-  auto &I = SubtargetMap[CPU + FS + (softFloat ? "use-soft-float=true"
-                                               : "use-soft-float=false")];
+  auto &I = SubtargetMap[CPU + FS];
   if (!I) {
     // This needs to be done before we create a new subtarget since any
     // creation will depend on the TM and the code generation flags on the

Added: llvm/trunk/test/MC/Mips/target-soft-float.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/target-soft-float.s?rev=236713&view=auto
==============================================================================
--- llvm/trunk/test/MC/Mips/target-soft-float.s (added)
+++ llvm/trunk/test/MC/Mips/target-soft-float.s Thu May  7 05:29:52 2015
@@ -0,0 +1,331 @@
+# RUN: not llvm-mc %s -triple=mips-unknown-linux -mcpu=mips32 -mattr=+soft-float 2>&1 |\
+# RUN:   FileCheck %s --check-prefix=32
+# RUN: not llvm-mc %s -triple=mips-unknown-linux -mcpu=mips64 -mattr=+soft-float 2>&1 |\
+# RUN:   FileCheck %s --check-prefix=64
+# RUN: not llvm-mc %s -triple=mips-unknown-linux -mcpu=mips32r2 -mattr=+soft-float 2>&1 |\
+# RUN:   FileCheck %s --check-prefix=R2
+# RUN: not llvm-mc %s -triple=mips-unknown-linux -mcpu=mips32r6 -mattr=+soft-float 2>&1 |\
+# RUN:   FileCheck %s --check-prefix=R6
+
+foo:
+  dmfc1      $7, $f2
+  # 64: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  dmtc1      $6, $f2
+  # 64: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+
+  ceil.l.d   $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  ceil.l.s   $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cvt.d.l    $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cvt.l.d    $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cvt.l.s    $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cvt.s.l    $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  floor.l.d  $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  floor.l.s  $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  ldxc1      $f2, $4($6)
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  luxc1      $f2, $4($6)
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  lwxc1      $f2, $4($6)
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  mfhc1      $7, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  msub.s     $f2, $f2, $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  mthc1      $7, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  nmadd.s    $f2, $f2, $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  nmsub.s    $f2, $f2, $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  round.l.s  $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  sdxc1      $f2, $4($6)
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  suxc1      $f2, $4($6)
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  swxc1      $f2, $4($6)
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  trunc.l.d  $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  trunc.l.s  $f2, $f2
+  # R2: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+
+  bc1eqz     $f2, 123
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  bc1nez     $f2, 456
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  class.d    $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  class.s    $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.af.d   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.af.s   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.eq.d   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.eq.s   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.le.d   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.le.s   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.lt.d   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.lt.s   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.saf.d  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.saf.s  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.seq.d  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.seq.s  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.sle.d  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.sle.s  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.slt.d  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.slt.s  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.sueq.d $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.sueq.s $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.sule.d $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.sule.s $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.sult.d $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.sult.s $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.sun.d  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.sun.s  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.ueq.d  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.ueq.s  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.ule.d  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.ule.s  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.ult.d  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.ult.s  $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.un.d   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cmp.un.s   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  maddf.d    $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  maddf.s    $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  max.d      $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  max.s      $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  maxa.d     $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  maxa.s     $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  min.d      $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  min.s      $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  mina.d     $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  mina.s     $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  msubf.d    $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  msubf.s    $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  rint.d     $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  rint.s     $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  sel.d      $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  sel.s      $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  seleqz.d   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  seleqz.s   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  selnez.d   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  selnez.s   $f2, $f2, $f2
+  # R6: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+
+  abs.d      $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  abs.s      $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  add.d      $f2, $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  add.s      $f2, $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.eq.d     $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.eq.s     $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.f.d      $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.f.s      $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.le.d     $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.le.s     $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.lt.d     $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.lt.s     $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.nge.d    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.nge.s    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ngl.d    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ngl.s    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ngle.d   $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ngle.s   $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ngt.d    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ngt.s    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ole.d    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ole.s    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.olt.d    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.olt.s    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.seq.d    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.seq.s    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.sf.d     $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.sf.s     $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ueq.d    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ueq.s    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ule.d    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ule.s    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ult.d    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.ult.s    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.un.d     $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  c.un.s     $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  ceil.w.d   $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  ceil.w.s   $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cvt.d.s    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cvt.d.w    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cvt.s.d    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cvt.s.w    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cvt.w.d    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  cvt.w.s    $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  div.d      $f2, $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  div.s      $f2, $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  floor.w.d  $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  floor.w.s  $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  ldc1       $f2, 16($7)
+  # FIXME: LDC1 is correctly rejected but the wrong error message is emitted.
+  # 32: :[[@LINE-2]]:19: error: invalid operand for instruction
+  lwc1       $f2, 16($7)
+  # FIXME: LWC1 is correctly rejected but the wrong error message is emitted.
+  # 32: :[[@LINE-2]]:19: error: invalid operand for instruction
+  madd.s     $f2, $f2, $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  mfc1       $7, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  mov.d      $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  mov.s      $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  movf.d     $f2, $f2, $fcc2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  movf.s     $f2, $f2, $fcc5
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  movn.d     $f2, $f2, $6
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  movn.s     $f2, $f2, $6
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  movt.d     $f2, $f2, $fcc0
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  movt.s     $f2, $f2, $fcc1
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  movz.d     $f2, $f2, $6
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  movz.s     $f2, $f2, $6
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  mtc1       $7, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  mul.d      $f2, $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  mul.s      $f2, $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  neg.d      $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  neg.s      $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  round.w.d  $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  round.w.s  $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  sdc1       $f2, 16($7)
+  # FIXME: SDC1 is correctly rejected but the wrong error message is emitted.
+  # 32: :[[@LINE-2]]:19: error: invalid operand for instruction
+  sqrt.d     $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  sqrt.s     $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  sub.d      $f2, $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  sub.s      $f2, $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  swc1       $f2, 16($7)
+  # FIXME: SWC1 is correctly rejected but the wrong error message is emitted.
+  # 32: :[[@LINE-2]]:19: error: invalid operand for instruction
+  trunc.w.d  $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled
+  trunc.w.s  $f2, $f2
+  # 32: :[[@LINE-1]]:3: error: instruction requires a CPU feature not currently enabled





More information about the llvm-commits mailing list