[llvm] [LLVM][AArch64] Add register classes for Armv9.6 assembly (PR #111717)

via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 11 08:14:44 PDT 2024


================
@@ -355,13 +362,43 @@ DecodeGPR64x8ClassRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address,
   return Success;
 }
 
+template <unsigned Min, unsigned Max>
+static DecodeStatus DecodeZPRMul2_MinMax(MCInst &Inst, unsigned RegNo,
+                                         uint64_t Address,
+                                         const MCDisassembler *Decoder) {
+  unsigned Reg = RegNo * 2 + Min;
+  if (Reg < Min || Reg > Max || (Reg & 1))
+    return Fail;
+  unsigned Register =
+      AArch64MCRegisterClasses[AArch64::ZPRRegClassID].getRegister(Reg);
+  Inst.addOperand(MCOperand::createReg(Register));
+  return Success;
+}
+
+template <unsigned Min, unsigned Max>
 static DecodeStatus DecodeZPR2Mul2RegisterClass(MCInst &Inst, unsigned RegNo,
                                                 uint64_t Address,
                                                 const void *Decoder) {
-  if (RegNo * 2 > 30)
+  if ((RegNo * 2) + Min > Max)
+    return Fail;
+  unsigned Register =
+      AArch64MCRegisterClasses[AArch64::ZPR2RegClassID].getRegister(RegNo * 2 +
+                                                                    Min);
+  Inst.addOperand(MCOperand::createReg(Register));
+  return Success;
+}
+
+// Zk Is the name of the control vector register Z20-Z23 or Z28-Z31, encoded in
+// the "K:Zk" fields. Z20-Z23 = 000, 001,010, 011  and Z28-Z31 = 100, 101, 110,
+// 111
+static DecodeStatus DecodeZK(MCInst &Inst, unsigned RegNo, uint64_t Address,
+                             const MCDisassembler *Decoder) {
+  //  (Z28 => RegNo = 4) Z28 = 4 => Z28 + 24 = 28
----------------
Lukacma wrote:

This comment got me confused. Maybe something like this would make it clearer? 

`//  RegNo = 4 => Z28 = 28 (4 + 24)`

https://github.com/llvm/llvm-project/pull/111717


More information about the llvm-commits mailing list