Index: include/llvm/MC/MCSubtargetInfo.h =================================================================== --- include/llvm/MC/MCSubtargetInfo.h +++ include/llvm/MC/MCSubtargetInfo.h @@ -73,7 +73,9 @@ /// setFeatureBits - Set the feature bits. /// - void setFeatureBits(FeatureBitset& FeatureBits_) { FeatureBits = FeatureBits_; } + void setFeatureBits(const FeatureBitset &FeatureBits_) { + FeatureBits = FeatureBits_; + } /// InitMCProcessorInfo - Set or change the CPU (optionally supplemented with /// feature string). Recompute feature bits and scheduling model. Index: lib/Target/Mips/AsmParser/MipsAsmParser.cpp =================================================================== --- lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -43,7 +43,7 @@ namespace { class MipsAssemblerOptions { public: - MipsAssemblerOptions(uint64_t Features_) : + MipsAssemblerOptions(const FeatureBitset &Features_) : ATReg(1), Reorder(true), Macro(true), Features(Features_) {} MipsAssemblerOptions(const MipsAssemblerOptions *Opts) { @@ -70,8 +70,8 @@ void setMacro() { Macro = true; } void setNoMacro() { Macro = false; } - uint64_t getFeatures() const { return Features; } - void setFeatures(uint64_t Features_) { Features = Features_; } + const FeatureBitset &getFeatures() const { return Features; } + void setFeatures(const FeatureBitset &Features_) { Features = Features_; } // Set of features that are either architecture features or referenced // by them (e.g.: FeatureNaN2008 implied by FeatureMips32r6). @@ -84,7 +84,7 @@ unsigned ATReg; bool Reorder; bool Macro; - uint64_t Features; + FeatureBitset Features; }; } @@ -327,23 +327,23 @@ STI.setFeatureBits(FeatureBits); setAvailableFeatures( ComputeAvailableFeatures(STI.ToggleFeature(ArchFeature))); - AssemblerOptions.back()->setFeatures(getAvailableFeatures()); + AssemblerOptions.back()->setFeatures(STI.getFeatureBits()); } void setFeatureBits(uint64_t Feature, StringRef FeatureString) { if (!(STI.getFeatureBits()[Feature])) { setAvailableFeatures( ComputeAvailableFeatures(STI.ToggleFeature(FeatureString))); + AssemblerOptions.back()->setFeatures(STI.getFeatureBits()); } - AssemblerOptions.back()->setFeatures(getAvailableFeatures()); } void clearFeatureBits(uint64_t Feature, StringRef FeatureString) { if (STI.getFeatureBits()[Feature]) { setAvailableFeatures( ComputeAvailableFeatures(STI.ToggleFeature(FeatureString))); + AssemblerOptions.back()->setFeatures(STI.getFeatureBits()); } - AssemblerOptions.back()->setFeatures(getAvailableFeatures()); } public: @@ -369,11 +369,11 @@ // Remember the initial assembler options. The user can not modify these. AssemblerOptions.push_back( - make_unique(getAvailableFeatures())); + make_unique(STI.getFeatureBits())); // Create an assembler options environment for the user to modify. AssemblerOptions.push_back( - make_unique(getAvailableFeatures())); + make_unique(STI.getFeatureBits())); getTargetStreamer().updateABIInfo(*this); @@ -3603,7 +3603,9 @@ return reportParseError(Loc, ".set pop with no .set push"); AssemblerOptions.pop_back(); - setAvailableFeatures(AssemblerOptions.back()->getFeatures()); + setAvailableFeatures( + ComputeAvailableFeatures(AssemblerOptions.back()->getFeatures())); + STI.setFeatureBits(AssemblerOptions.back()->getFeatures()); getTargetStreamer().emitDirectiveSetPop(); return false; @@ -3673,7 +3675,9 @@ return reportParseError("unexpected token, expected end of statement"); // Reset assembler options to their initial values. - setAvailableFeatures(AssemblerOptions.front()->getFeatures()); + setAvailableFeatures( + ComputeAvailableFeatures(AssemblerOptions.front()->getFeatures())); + STI.setFeatureBits(AssemblerOptions.front()->getFeatures()); AssemblerOptions.back()->setFeatures(AssemblerOptions.front()->getFeatures()); getTargetStreamer().emitDirectiveSetMips0(); Index: test/MC/Mips/set-push-pop-directives-bad.s =================================================================== --- test/MC/Mips/set-push-pop-directives-bad.s +++ test/MC/Mips/set-push-pop-directives-bad.s @@ -12,3 +12,12 @@ # CHECK: :[[@LINE-1]]:19: error: unexpected token, expected end of statement .set pop bar # CHECK: :[[@LINE-1]]:18: error: unexpected token, expected end of statement + + .set hardfloat + .set push + .set softfloat + add.s $f2, $f2, $f2 +# CHECK: :[[@LINE-1]]:9: error: instruction requires a CPU feature not currently enabled + .set pop + add.s $f2, $f2, $f2 +# CHECK-NOT: :[[@LINE-1]]:9: error: instruction requires a CPU feature not currently enabled Index: test/MC/Mips/set-push-pop-directives.s =================================================================== --- test/MC/Mips/set-push-pop-directives.s +++ test/MC/Mips/set-push-pop-directives.s @@ -51,3 +51,20 @@ # CHECK: b 1336 # CHECK: nop # CHECK: addvi.b $w15, $w13, 18 + + .set push + .set dsp + lbux $7, $10($11) + .set pop + + .set push + .set dsp + lbux $7, $10($11) +# CHECK-NOT: :[[@LINE-1]]:5: error: instruction requires a CPU feature not currently enabled + .set pop + + .set push + .set dsp + lbux $7, $10($11) +# CHECK-NOT: :[[@LINE-1]]:5: error: instruction requires a CPU feature not currently enabled + .set pop