summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Target/ARM64/ARM64InstrFormats.td16
-rw-r--r--lib/Target/ARM64/ARM64InstrInfo.td5
-rw-r--r--lib/Target/ARM64/InstPrinter/ARM64InstPrinter.cpp11
-rw-r--r--test/MC/Disassembler/ARM64/system.txt2
4 files changed, 12 insertions, 22 deletions
diff --git a/lib/Target/ARM64/ARM64InstrFormats.td b/lib/Target/ARM64/ARM64InstrFormats.td
index 378b698909..ee82419371 100644
--- a/lib/Target/ARM64/ARM64InstrFormats.td
+++ b/lib/Target/ARM64/ARM64InstrFormats.td
@@ -774,22 +774,6 @@ def sys_cr_op : Operand<i32> {
let ParserMatchClass = SysCRAsmOperand;
}
-class SystemI<bit L, string asm>
- : SimpleSystemI<L,
- (ins imm0_7:$op1, sys_cr_op:$Cn, sys_cr_op:$Cm, imm0_7:$op2),
- asm, "\t$op1, $Cn, $Cm, $op2">,
- Sched<[WriteSys]> {
- bits<3> op1;
- bits<4> Cn;
- bits<4> Cm;
- bits<3> op2;
- let Inst{20-19} = 0b01;
- let Inst{18-16} = op1;
- let Inst{15-12} = Cn;
- let Inst{11-8} = Cm;
- let Inst{7-5} = op2;
-}
-
class SystemXtI<bit L, string asm>
: RtSystemI<L, (outs),
(ins imm0_7:$op1, sys_cr_op:$Cn, sys_cr_op:$Cm, imm0_7:$op2, GPR64:$Rt),
diff --git a/lib/Target/ARM64/ARM64InstrInfo.td b/lib/Target/ARM64/ARM64InstrInfo.td
index b3baf94d41..7d319dd61e 100644
--- a/lib/Target/ARM64/ARM64InstrInfo.td
+++ b/lib/Target/ARM64/ARM64InstrInfo.td
@@ -332,10 +332,13 @@ def MSRcpsr: MSRcpsrI;
def : Pat<(ARM64threadpointer), (MRS 0xde82)>;
// Generic system instructions
-def SYS : SystemI<0, "sys">;
def SYSxt : SystemXtI<0, "sys">;
def SYSLxt : SystemLXtI<1, "sysl">;
+def : InstAlias<"sys $op1, $Cn, $Cm, $op2",
+ (SYSxt imm0_7:$op1, sys_cr_op:$Cn,
+ sys_cr_op:$Cm, imm0_7:$op2, XZR)>;
+
//===----------------------------------------------------------------------===//
// Move immediate instructions.
//===----------------------------------------------------------------------===//
diff --git a/lib/Target/ARM64/InstPrinter/ARM64InstPrinter.cpp b/lib/Target/ARM64/InstPrinter/ARM64InstPrinter.cpp
index 82beb6bbeb..8c0e6fa917 100644
--- a/lib/Target/ARM64/InstPrinter/ARM64InstPrinter.cpp
+++ b/lib/Target/ARM64/InstPrinter/ARM64InstPrinter.cpp
@@ -56,7 +56,7 @@ void ARM64InstPrinter::printInst(const MCInst *MI, raw_ostream &O,
unsigned Opcode = MI->getOpcode();
- if (Opcode == ARM64::SYS || Opcode == ARM64::SYSxt)
+ if (Opcode == ARM64::SYSxt)
if (printSysAlias(MI, O)) {
printAnnotation(O, Annot);
return;
@@ -750,8 +750,7 @@ void ARM64AppleInstPrinter::printInst(const MCInst *MI, raw_ostream &O,
bool ARM64InstPrinter::printSysAlias(const MCInst *MI, raw_ostream &O) {
#ifndef NDEBUG
unsigned Opcode = MI->getOpcode();
- assert((Opcode == ARM64::SYS || Opcode == ARM64::SYSxt) &&
- "Invalid opcode for SYS alias!");
+ assert(Opcode == ARM64::SYSxt && "Invalid opcode for SYS alias!");
#endif
const char *Asm = 0;
@@ -961,9 +960,11 @@ bool ARM64InstPrinter::printSysAlias(const MCInst *MI, raw_ostream &O) {
}
if (Asm) {
+ unsigned Reg = MI->getOperand(4).getReg();
+
O << '\t' << Asm;
- if (MI->getNumOperands() == 5)
- O << ", " << getRegisterName(MI->getOperand(4).getReg());
+ if (StringRef(Asm).lower().find("all") == StringRef::npos)
+ O << ", " << getRegisterName(Reg);
}
return Asm != 0;
diff --git a/test/MC/Disassembler/ARM64/system.txt b/test/MC/Disassembler/ARM64/system.txt
index 53b4a6cd69..9027a60dd3 100644
--- a/test/MC/Disassembler/ARM64/system.txt
+++ b/test/MC/Disassembler/ARM64/system.txt
@@ -32,6 +32,8 @@
# CHECK: dmb osh
0x9f 0x37 0x03 0xd5
# CHECK: dsb nsh
+ 0x3f 0x76 0x08 0xd5
+# CHECK: dc ivac
#-----------------------------------------------------------------------------
# Generic system instructions