Index: lib/Target/Mips/AsmParser/MipsAsmParser.cpp =================================================================== --- lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -314,23 +314,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: @@ -356,11 +356,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); @@ -3552,7 +3552,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; @@ -3600,7 +3602,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.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