[llvm] dbbf8ff - [M68k] Add `TRAP`, `TRAPV`, `BKPT`, `ILLEGAL` instructions
Min-Yih Hsu via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 4 16:45:50 PDT 2023
Author: Ian Douglas Scott
Date: 2023-04-04T16:45:14-07:00
New Revision: dbbf8ff839e919c090737c3df114fbc7e3623270
URL: https://github.com/llvm/llvm-project/commit/dbbf8ff839e919c090737c3df114fbc7e3623270
DIFF: https://github.com/llvm/llvm-project/commit/dbbf8ff839e919c090737c3df114fbc7e3623270.diff
LOG: [M68k] Add `TRAP`, `TRAPV`, `BKPT`, `ILLEGAL` instructions
This makes it possible to use TRAP to make Linux system calls using
inline assembly for instance.
Differential Revision: https://reviews.llvm.org/D147102
Added:
llvm/test/MC/Disassembler/M68k/trap-break.txt
llvm/test/MC/M68k/Control/trap-break.s
Modified:
llvm/lib/Target/M68k/AsmParser/M68kAsmParser.cpp
llvm/lib/Target/M68k/M68kInstrControl.td
Removed:
################################################################################
diff --git a/llvm/lib/Target/M68k/AsmParser/M68kAsmParser.cpp b/llvm/lib/Target/M68k/AsmParser/M68kAsmParser.cpp
index 80af08e737e74..59fa782829fde 100644
--- a/llvm/lib/Target/M68k/AsmParser/M68kAsmParser.cpp
+++ b/llvm/lib/Target/M68k/AsmParser/M68kAsmParser.cpp
@@ -177,6 +177,11 @@ class M68kOperand : public MCParsedAsmOperand {
static std::unique_ptr<M68kOperand> createImm(const MCExpr *Expr, SMLoc Start,
SMLoc End);
+ // Imm for TRAP instruction
+ bool isTrapImm() const;
+ // Imm for BKPT instruction
+ bool isBkptImm() const;
+
// MoveMask
bool isMoveMask() const;
void addMoveMaskOperands(MCInst &Inst, unsigned N) const;
@@ -351,6 +356,22 @@ std::unique_ptr<M68kOperand> M68kOperand::createImm(const MCExpr *Expr,
return Op;
}
+bool M68kOperand::isTrapImm() const {
+ int64_t Value;
+ if (!isImm() || !Expr->evaluateAsAbsolute(Value))
+ return false;
+
+ return isUInt<4>(Value);
+}
+
+bool M68kOperand::isBkptImm() const {
+ int64_t Value;
+ if (!isImm() || !Expr->evaluateAsAbsolute(Value))
+ return false;
+
+ return isUInt<3>(Value);
+}
+
// MoveMask
bool M68kOperand::isMoveMask() const {
if (!isMemOp())
diff --git a/llvm/lib/Target/M68k/M68kInstrControl.td b/llvm/lib/Target/M68k/M68kInstrControl.td
index 060e0af80f80e..2bdbb824e2f2d 100644
--- a/llvm/lib/Target/M68k/M68kInstrControl.td
+++ b/llvm/lib/Target/M68k/M68kInstrControl.td
@@ -351,3 +351,41 @@ def : Pat<(sub MxDRD8:$op, (i8 (MxSetCC_C MxCONDcs, CCR))),
(ADDX8dd MxDRD8:$op, (MOV8di 0))>;
def : Pat<(sub MxXRD32:$op, (i32 (MxSetCC_C MxCONDcs, CCR))),
(ADDX32dd MxDRD32:$op, (MOV32ri 0))>;
+
+//===------------===//
+// Trap / Breakpoint
+//===------------===//
+
+let RenderMethod = "addImmOperands", ParserMethod = "parseImm" in {
+ def MxTrapImm : AsmOperandClass {
+ let Name = "MxTrapImm";
+ let PredicateMethod = "isTrapImm";
+ }
+
+ def MxBkptImm : AsmOperandClass {
+ let Name = "MxBkptImm";
+ let PredicateMethod = "isBkptImm";
+ }
+}
+
+let ParserMatchClass = MxTrapImm in
+def MxTrapimm : MxOp<i8, MxSize8, "i">;
+
+let ParserMatchClass = MxBkptImm in
+def MxBkptimm : MxOp<i8, MxSize8, "i">;
+
+def TRAP : MxInst<(outs), (ins MxTrapimm:$vect), "trap\t$vect", []> {
+ let Inst = (descend 0b0100, 0b1110, 0b0100, (operand "$vect", 4));
+}
+
+def TRAPV : MxInst<(outs), (ins), "trapv", []> {
+ let Inst = (descend 0b0100, 0b1110, 0b0111, 0b0110);
+}
+
+def BKPT : MxInst<(outs), (ins MxBkptimm:$vect), "bkpt\t$vect", []> {
+ let Inst = (descend 0b0100, 0b1000, 0b0100, 0b1 , (operand "$vect", 3));
+}
+
+def ILLEGAL : MxInst<(outs), (ins), "illegal", []> {
+ let Inst = (descend 0b0100, 0b1010, 0b1111, 0b1100);
+}
diff --git a/llvm/test/MC/Disassembler/M68k/trap-break.txt b/llvm/test/MC/Disassembler/M68k/trap-break.txt
new file mode 100644
index 0000000000000..f767b154031ce
--- /dev/null
+++ b/llvm/test/MC/Disassembler/M68k/trap-break.txt
@@ -0,0 +1,11 @@
+# RUN: llvm-mc -disassemble -triple m68k %s | FileCheck %s
+
+; CHECK: trap #13
+0x4e 0x4d
+# CHECK: bkpt #7
+0x48 0x4f
+# CHECK: trapv
+0x4e 0x76
+# CHECK: illegal
+0x4a 0xfc
+
diff --git a/llvm/test/MC/M68k/Control/trap-break.s b/llvm/test/MC/M68k/Control/trap-break.s
new file mode 100644
index 0000000000000..8a98bb1de7409
--- /dev/null
+++ b/llvm/test/MC/M68k/Control/trap-break.s
@@ -0,0 +1,14 @@
+; RUN: llvm-mc -triple=m68k -show-encoding %s | FileCheck %s
+
+; CHECK: trap #13
+; CHECK-SAME: encoding: [0x4e,0x4d]
+trap #13
+; CHECK: bkpt #7
+; CHECK-SAME: encoding: [0x48,0x4f]
+bkpt #7
+; CHECK: trapv
+; CHECK-SAME: encoding: [0x4e,0x76]
+trapv
+; CHECK: illegal
+; CHECK-SAME: encoding: [0x4a,0xfc]
+illegal
More information about the llvm-commits
mailing list