[ARM] Honor FeatureD16 in the assembler and disassembler
[oota-llvm.git] / lib / Target / ARM / Disassembler / ARMDisassembler.cpp
index b85b7eba79475402bd6757848be04f8c77b8129b..1d1b8dad0023924e5426e71bd5c11951199af899 100644 (file)
@@ -1017,7 +1017,11 @@ static const uint16_t DPRDecoderTable[] = {
 
 static DecodeStatus DecodeDPRRegisterClass(MCInst &Inst, unsigned RegNo,
                                    uint64_t Address, const void *Decoder) {
-  if (RegNo > 31)
+  uint64_t featureBits = ((const MCDisassembler*)Decoder)->getSubtargetInfo()
+                                                          .getFeatureBits();
+  bool hasD16 = featureBits & ARM::FeatureD16;
+
+  if (RegNo > 31 || (hasD16 && RegNo > 15))
     return MCDisassembler::Fail;
 
   unsigned Register = DPRDecoderTable[RegNo];