[Hexagon] Resubmission of 220427
[oota-llvm.git] / lib / Target / Hexagon / Disassembler / HexagonDisassembler.cpp
index 24dbf2a16b9217e384e1adf476e381065bec8749..b709c835acfcf0b77ef62d241fd61bf1f8a737ea 100644 (file)
@@ -48,6 +48,40 @@ public:
 };\r
 }\r
 \r
+static const uint16_t IntRegDecoderTable[] = {\r
+    Hexagon::R0,  Hexagon::R1,  Hexagon::R2,  Hexagon::R3,  Hexagon::R4,\r
+    Hexagon::R5,  Hexagon::R6,  Hexagon::R7,  Hexagon::R8,  Hexagon::R9,\r
+    Hexagon::R10, Hexagon::R11, Hexagon::R12, Hexagon::R13, Hexagon::R14,\r
+    Hexagon::R15, Hexagon::R16, Hexagon::R17, Hexagon::R18, Hexagon::R19,\r
+    Hexagon::R20, Hexagon::R21, Hexagon::R22, Hexagon::R23, Hexagon::R24,\r
+    Hexagon::R25, Hexagon::R26, Hexagon::R27, Hexagon::R28, Hexagon::R29,\r
+    Hexagon::R30, Hexagon::R31};\r
+\r
+static const uint16_t PredRegDecoderTable[] = {Hexagon::P0, Hexagon::P1,\r
+                                               Hexagon::P2, Hexagon::P3};\r
+\r
+static DecodeStatus DecodeIntRegsRegisterClass(MCInst &Inst, unsigned RegNo,\r
+                                               uint64_t /*Address*/,\r
+                                               void const *Decoder) {\r
+  if (RegNo > 31)\r
+    return MCDisassembler::Fail;\r
+\r
+  unsigned Register = IntRegDecoderTable[RegNo];\r
+  Inst.addOperand(MCOperand::CreateReg(Register));\r
+  return MCDisassembler::Success;\r
+}\r
+\r
+static DecodeStatus DecodePredRegsRegisterClass(MCInst &Inst, unsigned RegNo,\r
+                                                uint64_t /*Address*/,\r
+                                                void const *Decoder) {\r
+  if (RegNo > 3)\r
+    return MCDisassembler::Fail;\r
+\r
+  unsigned Register = PredRegDecoderTable[RegNo];\r
+  Inst.addOperand(MCOperand::CreateReg(Register));\r
+  return MCDisassembler::Success;\r
+}\r
+\r
 #include "HexagonGenDisassemblerTables.inc"\r
 \r
 static MCDisassembler *createHexagonDisassembler(Target const &T,\r