[llvm] 8b66604 - [RISCV] Remap mop.rr.7 and mop.r.28 to sspush/sspopchk/ssrdp in the assembler. (#223894)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 15 22:00:56 PDT 2026
Author: Craig Topper
Date: 2026-09-15T22:00:50-07:00
New Revision: 8b66604bb8e699820c7f1fd06a43a3c6ed2cac76
URL: https://github.com/llvm/llvm-project/commit/8b66604bb8e699820c7f1fd06a43a3c6ed2cac76
DIFF: https://github.com/llvm/llvm-project/commit/8b66604bb8e699820c7f1fd06a43a3c6ed2cac76.diff
LOG: [RISCV] Remap mop.rr.7 and mop.r.28 to sspush/sspopchk/ssrdp in the assembler. (#223894)
This makes llvm-mc output match llvm-objdump. And is more consistent
with the InstAliases we use c.mop.
Added:
Modified:
llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
llvm/test/MC/RISCV/zicfiss-valid.s
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
index 4f1f3cbfb9b26..66902368a3234 100644
--- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
+++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
@@ -4434,6 +4434,36 @@ bool RISCVAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc,
switch (Inst.getOpcode()) {
default:
break;
+ case RISCV::MOP_RR_7: {
+ // Remap mop.rr.7 x0, x0, x1/x5 to sspush x1/x5.
+ if (Inst.getOperand(0).getReg() == RISCV::X0 &&
+ Inst.getOperand(1).getReg() == RISCV::X0 &&
+ (Inst.getOperand(2).getReg() == RISCV::X1 ||
+ Inst.getOperand(2).getReg() == RISCV::X5)) {
+ emitToStreamer(
+ Out, MCInstBuilder(RISCV::SSPUSH).addOperand(Inst.getOperand(2)));
+ return false;
+ }
+ break;
+ }
+ case RISCV::MOP_R_28: {
+ // Remap mop.r.28 x0, x1/x5 to sspopchk x1/x5.
+ if (Inst.getOperand(0).getReg() == RISCV::X0 &&
+ (Inst.getOperand(1).getReg() == RISCV::X1 ||
+ Inst.getOperand(1).getReg() == RISCV::X5)) {
+ emitToStreamer(
+ Out, MCInstBuilder(RISCV::SSPOPCHK).addOperand(Inst.getOperand(1)));
+ return false;
+ }
+ // Remap mop.r.28 rN, x0 to ssrdp rN.
+ if (Inst.getOperand(0).getReg() != RISCV::X0 &&
+ Inst.getOperand(1).getReg() == RISCV::X0) {
+ emitToStreamer(
+ Out, MCInstBuilder(RISCV::SSRDP).addOperand(Inst.getOperand(0)));
+ return false;
+ }
+ break;
+ }
case RISCV::PseudoC_ADDI_NOP: {
if (Inst.getOperand(2).getImm() == 0)
emitToStreamer(Out, MCInstBuilder(RISCV::C_NOP));
diff --git a/llvm/test/MC/RISCV/zicfiss-valid.s b/llvm/test/MC/RISCV/zicfiss-valid.s
index 7e7f29761e9a8..2cfea489ad72b 100644
--- a/llvm/test/MC/RISCV/zicfiss-valid.s
+++ b/llvm/test/MC/RISCV/zicfiss-valid.s
@@ -1,13 +1,13 @@
# RUN: llvm-mc %s -triple=riscv32 -mattr=+a,+zicfiss -M no-aliases -show-encoding \
# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+a,+zicfiss < %s \
-# RUN: | llvm-objdump --mattr=+a,+experimental-zicfiss -M no-aliases -d -r - \
-# RUN: | FileCheck --check-prefixes=CHECK-OBJ,CHECK-ASM-AND-OBJ %s
+# RUN: | llvm-objdump --mattr=+a,+zicfiss -M no-aliases -d -r - \
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ %s
# RUN: llvm-mc %s -triple=riscv64 -defsym=RV64=1 -mattr=+a,+zicfiss -M no-aliases -show-encoding \
# RUN: | FileCheck -check-prefixes=CHECK-ASM-RV64,CHECK-ASM,CHECK-ASM-AND-OBJ-RV64,CHECK-ASM-AND-OBJ %s
# RUN: llvm-mc -filetype=obj -triple=riscv64 -defsym=RV64=1 -mattr=+a,+zicfiss < %s \
# RUN: | llvm-objdump --mattr=+a,+zicfiss -M no-aliases -d -r - \
-# RUN: | FileCheck --check-prefixes=CHECK-OBJ,CHECK-ASM-AND-OBJ-RV64,CHECK-ASM-AND-OBJ %s
+# RUN: | FileCheck --check-prefixes=CHECK-ASM-AND-OBJ-RV64,CHECK-ASM-AND-OBJ %s
#
# Zicfiss MOP-based instructions (sspopchk, ssrdp, sspush) only require Zimop,
# not Zicfiss. SSAMOSWAP still requires Zicfiss.
@@ -71,38 +71,32 @@ ssrdp ra
# assembly printer prints the mnemonic that was matched, while the
# disassembler still prefers the more specific sspopchk/ssrdp/sspush).
-# CHECK-ASM: mop.r.28 zero, ra
-# CHECK-OBJ: sspopchk ra
+# CHECK-ASM-AND-OBJ: sspopchk ra
# CHECK-ASM: encoding: [0x73,0xc0,0xc0,0xcd]
# CHECK-NO-EXT: error: instruction requires the following: 'Zimop' (May-Be-Operations)
mop.r.28 x0, x1
-# CHECK-ASM: mop.r.28 zero, t0
-# CHECK-OBJ: sspopchk t0
+# CHECK-ASM-AND-OBJ: sspopchk t0
# CHECK-ASM: encoding: [0x73,0xc0,0xc2,0xcd]
# CHECK-NO-EXT: error: instruction requires the following: 'Zimop' (May-Be-Operations)
mop.r.28 x0, x5
-# CHECK-ASM: mop.r.28 ra, zero
-# CHECK-OBJ: ssrdp ra
+# CHECK-ASM-AND-OBJ: ssrdp ra
# CHECK-ASM: encoding: [0xf3,0x40,0xc0,0xcd]
# CHECK-NO-EXT: error: instruction requires the following: 'Zimop' (May-Be-Operations)
mop.r.28 x1, x0
-# CHECK-ASM: mop.r.28 t0, zero
-# CHECK-OBJ: ssrdp t0
+# CHECK-ASM-AND-OBJ: ssrdp t0
# CHECK-ASM: encoding: [0xf3,0x42,0xc0,0xcd]
# CHECK-NO-EXT: error: instruction requires the following: 'Zimop' (May-Be-Operations)
mop.r.28 x5, x0
-# CHECK-ASM: mop.rr.7 zero, zero, ra
-# CHECK-OBJ: sspush ra
+# CHECK-ASM-AND-OBJ: sspush ra
# CHECK-ASM: encoding: [0x73,0x40,0x10,0xce]
# CHECK-NO-EXT: error: instruction requires the following: 'Zimop' (May-Be-Operations)
mop.rr.7 x0, x0, x1
-# CHECK-ASM: mop.rr.7 zero, zero, t0
-# CHECK-OBJ: sspush t0
+# CHECK-ASM-AND-OBJ: sspush t0
# CHECK-ASM: encoding: [0x73,0x40,0x50,0xce]
# CHECK-NO-EXT: error: instruction requires the following: 'Zimop' (May-Be-Operations)
mop.rr.7 x0, x0, x5
More information about the llvm-commits
mailing list