aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp
diff options
context:
space:
mode:
authorTies Stuij <ties.stuij@arm.com>2021-11-30 09:09:59 +0000
committerZeno <zeno@Zenos-MacBook-Pro.local>2021-11-30 09:28:18 +0000
commit5cff77c23f43130887b566dd0fe237e1c482e23b (patch)
tree56a05f172d9f06adbaf5652125a3e931c225429f /llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp
parentae1ea0bead75f4c7a4c965dfa40b5f3b78b60364 (diff)
downloadllvm-5cff77c23f43130887b566dd0fe237e1c482e23b.zip
llvm-5cff77c23f43130887b566dd0fe237e1c482e23b.tar.gz
llvm-5cff77c23f43130887b566dd0fe237e1c482e23b.tar.bz2
[clang][ARM] PACBTI-M assembly support
Introduce assembly support for Armv8.1-M PACBTI extension. This is an optional extension in v8.1-M. There are 10 new system registers and 5 new instructions, all predicated on the feature. The attribute for llvm-mc is called "pacbti". For armclang, an architecture extension also called "pacbti" was created. This patch is part of a series that adds support for the PACBTI-M extension of the Armv8.1-M architecture, as detailed here: https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/armv8-1-m-pointer-authentication-and-branch-target-identification-extension The PACBTI-M specification can be found in the Armv8-M Architecture Reference Manual: https://developer.arm.com/documentation/ddi0553/latest The following people contributed to this patch: - Victor Campos - Ties Stuij Reviewed By: labrinea Differential Revision: https://reviews.llvm.org/D112420
Diffstat (limited to 'llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp')
-rw-r--r--llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp67
1 files changed, 65 insertions, 2 deletions
diff --git a/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp b/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp
index 9caef9f..c3df7dc 100644
--- a/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp
+++ b/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp
@@ -185,8 +185,11 @@ static DecodeStatus DecodetGPREvenRegisterClass(MCInst &Inst, unsigned RegNo,
static DecodeStatus
DecodeGPRwithAPSR_NZCVnospRegisterClass(MCInst &Inst, unsigned RegNo,
uint64_t Address, const void *Decoder);
-static DecodeStatus DecodeGPRnopcRegisterClass(MCInst &Inst,
- unsigned RegNo, uint64_t Address,
+static DecodeStatus DecodeGPRnopcRegisterClass(MCInst &Inst, unsigned RegNo,
+ uint64_t Address,
+ const void *Decoder);
+static DecodeStatus DecodeGPRnospRegisterClass(MCInst &Inst, unsigned RegNo,
+ uint64_t Address,
const void *Decoder);
static DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst &Inst,
unsigned RegNo, uint64_t Address,
@@ -287,6 +290,9 @@ static DecodeStatus DecodeSETPANInstruction(MCInst &Inst, unsigned Insn,
uint64_t Address, const void *Decoder);
static DecodeStatus DecodeT2CPSInstruction(MCInst &Inst, unsigned Insn,
uint64_t Address, const void *Decoder);
+static DecodeStatus DecodeT2HintSpaceInstruction(MCInst &Inst, unsigned Insn,
+ uint64_t Address,
+ const void *Decoder);
static DecodeStatus DecodeAddrModeImm12Operand(MCInst &Inst, unsigned Val,
uint64_t Address, const void *Decoder);
static DecodeStatus DecodeAddrMode5Operand(MCInst &Inst, unsigned Val,
@@ -1172,6 +1178,19 @@ DecodeGPRnopcRegisterClass(MCInst &Inst, unsigned RegNo,
return S;
}
+static DecodeStatus DecodeGPRnospRegisterClass(MCInst &Inst, unsigned RegNo,
+ uint64_t Address,
+ const void *Decoder) {
+ DecodeStatus S = MCDisassembler::Success;
+
+ if (RegNo == 13)
+ S = MCDisassembler::SoftFail;
+
+ Check(S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
+
+ return S;
+}
+
static DecodeStatus
DecodeGPRwithAPSRRegisterClass(MCInst &Inst, unsigned RegNo,
uint64_t Address, const void *Decoder) {
@@ -2441,6 +2460,31 @@ static DecodeStatus DecodeT2CPSInstruction(MCInst &Inst, unsigned Insn,
return S;
}
+static DecodeStatus DecodeT2HintSpaceInstruction(MCInst &Inst, unsigned Insn,
+ uint64_t Address,
+ const void *Decoder) {
+ unsigned imm = fieldFromInstruction(Insn, 0, 8);
+
+ unsigned Opcode = ARM::t2HINT;
+
+ if (imm == 0x0D) {
+ Opcode = ARM::t2PACBTI;
+ } else if (imm == 0x1D) {
+ Opcode = ARM::t2PAC;
+ } else if (imm == 0x2D) {
+ Opcode = ARM::t2AUT;
+ } else if (imm == 0x0F) {
+ Opcode = ARM::t2BTI;
+ }
+
+ Inst.setOpcode(Opcode);
+ if (Opcode == ARM::t2HINT) {
+ Inst.addOperand(MCOperand::createImm(imm));
+ }
+
+ return MCDisassembler::Success;
+}
+
static DecodeStatus DecodeT2MOVTWInstruction(MCInst &Inst, unsigned Insn,
uint64_t Address, const void *Decoder) {
DecodeStatus S = MCDisassembler::Success;
@@ -4726,6 +4770,25 @@ static DecodeStatus DecodeMSRMask(MCInst &Inst, unsigned Val,
if (!(FeatureBits[ARM::Feature8MSecExt]))
return MCDisassembler::Fail;
break;
+ case 0x20: // pac_key_p_0
+ case 0x21: // pac_key_p_1
+ case 0x22: // pac_key_p_2
+ case 0x23: // pac_key_p_3
+ case 0x24: // pac_key_u_0
+ case 0x25: // pac_key_u_1
+ case 0x26: // pac_key_u_2
+ case 0x27: // pac_key_u_3
+ case 0xa0: // pac_key_p_0_ns
+ case 0xa1: // pac_key_p_1_ns
+ case 0xa2: // pac_key_p_2_ns
+ case 0xa3: // pac_key_p_3_ns
+ case 0xa4: // pac_key_u_0_ns
+ case 0xa5: // pac_key_u_1_ns
+ case 0xa6: // pac_key_u_2_ns
+ case 0xa7: // pac_key_u_3_ns
+ if (!(FeatureBits[ARM::FeaturePACBTI]))
+ return MCDisassembler::Fail;
+ break;
default:
// Architecturally defined as unpredictable
S = MCDisassembler::SoftFail;