[llvm] c29426f - [RISCV][Disassembler] Reject GPR pairs with x16-x31 under RVE (#229166)

via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 5 12:49:05 PDT 2026


Author: Craig Topper
Date: 2026-10-05T19:48:57Z
New Revision: c29426f07918afbd9ab786b09404e8a5e5923efe

URL: https://github.com/llvm/llvm-project/commit/c29426f07918afbd9ab786b09404e8a5e5923efe
DIFF: https://github.com/llvm/llvm-project/commit/c29426f07918afbd9ab786b09404e8a5e5923efe.diff

LOG: [RISCV][Disassembler] Reject GPR pairs with x16-x31 under RVE (#229166)

GPR pairs used by instructions like Zilsd ld/sd must use registers
accessible under RVE. Registers x16-x31 are not available with RVE, so
DecodeGPRPairRegisterClass should fail decoding when RVE is enabled and
the register number is in that range.

Co-authored-by: Claude Sonnet 5 <noreply at anthropic.com>

Added: 
    llvm/test/MC/Disassembler/RISCV/rve-invalid-gpr-pair.txt

Modified: 
    llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
index e7a28ee3943f92..076c74a40a7f55 100644
--- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
+++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
@@ -190,6 +190,10 @@ static DecodeStatus DecodeGPRPairRegisterClass(MCInst &Inst, uint32_t RegNo,
   if (RegNo >= 32 || RegNo % 2)
     return MCDisassembler::Fail;
 
+  bool IsRVE = Decoder->getSubtargetInfo().hasFeature(RISCV::FeatureStdExtE);
+  if (IsRVE && RegNo >= 16)
+    return MCDisassembler::Fail;
+
   const RISCVDisassembler *Dis =
       static_cast<const RISCVDisassembler *>(Decoder);
   const MCRegisterInfo *RI = Dis->getContext().getRegisterInfo();

diff  --git a/llvm/test/MC/Disassembler/RISCV/rve-invalid-gpr-pair.txt b/llvm/test/MC/Disassembler/RISCV/rve-invalid-gpr-pair.txt
new file mode 100644
index 00000000000000..f72a3b6d8fb88d
--- /dev/null
+++ b/llvm/test/MC/Disassembler/RISCV/rve-invalid-gpr-pair.txt
@@ -0,0 +1,33 @@
+# RUN: not llvm-mc -disassemble -triple=riscv32 -mattr=+e,+zilsd -M no-aliases %s 2>%t.err \
+# RUN:   | FileCheck %s --check-prefixes=CHECK,RVE
+# RUN: FileCheck %s --check-prefix=RVE-ERR < %t.err
+# RUN: llvm-mc -disassemble -triple=riscv32 -mattr=+zilsd -M no-aliases %s \
+# RUN:   | FileCheck %s --check-prefixes=CHECK,RVI
+
+# GPR pairs using registers x16-x31 are not valid with RVE.
+
+[0x03,0x37,0x05,0x00]
+# CHECK: ld a4, 0(a0)
+
+[0x03,0x38,0x05,0x00]
+# RVE-ERR: :[[@LINE-1]]:2: warning: invalid instruction encoding
+# RVE-NOT: ld a6, 0(a0)
+# RVI: ld a6, 0(a0)
+
+[0x03,0x3f,0x05,0x00]
+# RVE-ERR: :[[@LINE-1]]:2: warning: invalid instruction encoding
+# RVE-NOT: ld t5, 0(a0)
+# RVI: ld t5, 0(a0)
+
+[0x23,0x30,0xe5,0x00]
+# CHECK: sd a4, 0(a0)
+
+[0x23,0x30,0x05,0x01]
+# RVE-ERR: :[[@LINE-1]]:2: warning: invalid instruction encoding
+# RVE-NOT: sd a6, 0(a0)
+# RVI: sd a6, 0(a0)
+
+[0x23,0x30,0xe5,0x01]
+# RVE-ERR: :[[@LINE-1]]:2: warning: invalid instruction encoding
+# RVE-NOT: sd t5, 0(a0)
+# RVI: sd t5, 0(a0)


        


More information about the llvm-commits mailing list