summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorOliver Stannard <oliver.stannard@arm.com>2018-09-27 09:11:27 +0000
committerOliver Stannard <oliver.stannard@arm.com>2018-09-27 09:11:27 +0000
commit31af178f4a2a001ce064202db9072f3f6a8b4497 (patch)
tree002b691b3382829888877e726073ee4413ab9fd5 /llvm/lib/Target
parente58c45a695f39004710b6ce940d489fee800dbd3 (diff)
downloadbcm5719-llvm-31af178f4a2a001ce064202db9072f3f6a8b4497.tar.gz
bcm5719-llvm-31af178f4a2a001ce064202db9072f3f6a8b4497.zip
[AArch64][v8.5A] Add PSTATE manipulation instructions XAFlag and AXFlag
These new instructions manipluate the NZCV bits, to convert between the regular Arm floating-point comare format and an alternative format. Patch by Pablo Barrio! Differential revision: https://reviews.llvm.org/D52473 llvm-svn: 343187
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/AArch64/AArch64.td5
-rw-r--r--llvm/lib/Target/AArch64/AArch64InstrInfo.td22
-rw-r--r--llvm/lib/Target/AArch64/AArch64Subtarget.h4
-rw-r--r--llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp7
4 files changed, 35 insertions, 3 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64.td b/llvm/lib/Target/AArch64/AArch64.td
index fc3900bd939..592c7e07b94 100644
--- a/llvm/lib/Target/AArch64/AArch64.td
+++ b/llvm/lib/Target/AArch64/AArch64.td
@@ -204,6 +204,9 @@ def FeatureAggressiveFMA :
"true",
"Enable Aggressive FMA for floating-point.">;
+def FeatureAltFPCmp : SubtargetFeature<"altnzcv", "HasAlternativeNZCV", "true",
+ "Enable alternative NZCV format for floating point comparisons">;
+
//===----------------------------------------------------------------------===//
// Architectures.
//
@@ -221,7 +224,7 @@ def HasV8_4aOps : SubtargetFeature<"v8.4a", "HasV8_4aOps", "true",
"Support ARM v8.4a instructions", [HasV8_3aOps, FeatureDotProd]>;
def HasV8_5aOps : SubtargetFeature<"v8.5a", "HasV8_5aOps", "true",
- "Support ARM v8.5a instructions", [HasV8_4aOps]>;
+ "Support ARM v8.5a instructions", [HasV8_4aOps, FeatureAltFPCmp]>;
//===----------------------------------------------------------------------===//
// Register File Description
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
index 97418985b8a..83bec32da79 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td
@@ -62,7 +62,8 @@ def HasSVE : Predicate<"Subtarget->hasSVE()">,
AssemblerPredicate<"FeatureSVE", "sve">;
def HasRCPC : Predicate<"Subtarget->hasRCPC()">,
AssemblerPredicate<"FeatureRCPC", "rcpc">;
-
+def HasAltNZCV : Predicate<"Subtarget->hasAlternativeNZCV()">,
+ AssemblerPredicate<"FeatureAltFPCmp", "altnzcv">;
def IsLE : Predicate<"Subtarget->isLittleEndian()">;
def IsBE : Predicate<"!Subtarget->isLittleEndian()">;
def UseAlternateSExtLoadCVTF32
@@ -608,6 +609,25 @@ def RMIF : FlagRotate<(ins GPR64:$Rn, uimm6:$imm, imm0_15:$mask), "rmif",
"{\t$Rn, $imm, $mask}">;
} // HasV8_4a
+// v8.5 flag manipulation instructions
+let Predicates = [HasAltNZCV], Uses = [NZCV], Defs = [NZCV] in {
+
+def XAFLAG : PstateWriteSimple<(ins), "xaflag", "">, Sched<[WriteSys]> {
+ let Inst{18-16} = 0b000;
+ let Inst{11-8} = 0b0000;
+ let Unpredictable{11-8} = 0b1111;
+ let Inst{7-5} = 0b001;
+}
+
+def AXFLAG : PstateWriteSimple<(ins), "axflag", "">, Sched<[WriteSys]> {
+ let Inst{18-16} = 0b000;
+ let Inst{11-8} = 0b0000;
+ let Unpredictable{11-8} = 0b1111;
+ let Inst{7-5} = 0b010;
+}
+
+} // HasAltNZCV
+
def : InstAlias<"clrex", (CLREX 0xf)>;
def : InstAlias<"isb", (ISB 0xf)>;
diff --git a/llvm/lib/Target/AArch64/AArch64Subtarget.h b/llvm/lib/Target/AArch64/AArch64Subtarget.h
index 992d211dba0..bf60a0fd269 100644
--- a/llvm/lib/Target/AArch64/AArch64Subtarget.h
+++ b/llvm/lib/Target/AArch64/AArch64Subtarget.h
@@ -94,6 +94,9 @@ protected:
bool HasRCPC = false;
bool HasAggressiveFMA = false;
+ // Armv8.5-A Extensions
+ bool HasAlternativeNZCV = false;
+
// HasZeroCycleRegMove - Has zero-cycle register mov instructions.
bool HasZeroCycleRegMove = false;
@@ -306,6 +309,7 @@ public:
bool hasSVE() const { return HasSVE; }
bool hasRCPC() const { return HasRCPC; }
bool hasAggressiveFMA() const { return HasAggressiveFMA; }
+ bool hasAlternativeNZCV() const { return HasAlternativeNZCV; }
bool isLittleEndian() const { return IsLittle; }
diff --git a/llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp b/llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp
index f73670788f8..d2f672643b8 100644
--- a/llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp
+++ b/llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp
@@ -1712,9 +1712,14 @@ static DecodeStatus DecodeSystemPStateInstruction(MCInst &Inst, uint32_t insn,
uint64_t op1 = fieldFromInstruction(insn, 16, 3);
uint64_t op2 = fieldFromInstruction(insn, 5, 3);
uint64_t crm = fieldFromInstruction(insn, 8, 4);
-
uint64_t pstate_field = (op1 << 3) | op2;
+ switch (pstate_field) {
+ case 0x01: // XAFlag
+ case 0x02: // AXFlag
+ return Fail;
+ }
+
if ((pstate_field == AArch64PState::PAN ||
pstate_field == AArch64PState::UAO) && crm > 1)
return Fail;
OpenPOWER on IntegriCloud