summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64
diff options
context:
space:
mode:
authorSander de Smalen <sander.desmalen@arm.com>2018-07-04 12:58:46 +0000
committerSander de Smalen <sander.desmalen@arm.com>2018-07-04 12:58:46 +0000
commitab2b0530d934fbacd6b9bf1dde240b948869b886 (patch)
treedab9cfd558e4377b934986ced1fc8d230a6cb73b /llvm/lib/Target/AArch64
parente945fad2509396a9ad3b677b27fb4f4b6bb2633e (diff)
downloadbcm5719-llvm-ab2b0530d934fbacd6b9bf1dde240b948869b886.tar.gz
bcm5719-llvm-ab2b0530d934fbacd6b9bf1dde240b948869b886.zip
[AArch64][SVE] Asm: Support for instructions to set/read FFR.
Includes instructions to read the First-Faulting Register (FFR): - RDFFR (unpredicated) rdffr p0.b - RDFFR (predicated) rdffr p0.b, p0/z - RDFFRS (predicated, sets condition flags) rdffr p0.b, p0/z Includes instructions to set/write the FFR: - SETFFR (no arguments, sets the FFR to all true) setffr - WRFFR (unpredicated) wrffr p0.b llvm-svn: 336267
Diffstat (limited to 'llvm/lib/Target/AArch64')
-rw-r--r--llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td7
-rw-r--r--llvm/lib/Target/AArch64/SVEInstrFormats.td54
2 files changed, 61 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
index a3be890f874..7269e1e1983 100644
--- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
@@ -12,6 +12,13 @@
//===----------------------------------------------------------------------===//
let Predicates = [HasSVE] in {
+
+ def RDFFR_PPz : sve_int_rdffr_pred<0b0, "rdffr">;
+ def RDFFRS_PPz : sve_int_rdffr_pred<0b1, "rdffrs">;
+ def RDFFR_P : sve_int_rdffr_unpred<"rdffr">;
+ def SETFFR : sve_int_setffr<"setffr">;
+ def WRFFR : sve_int_wrffr<"wrffr">;
+
defm ADD_ZZZ : sve_int_bin_cons_arit_0<0b000, "add">;
defm SUB_ZZZ : sve_int_bin_cons_arit_0<0b001, "sub">;
defm SQADD_ZZZ : sve_int_bin_cons_arit_0<0b100, "sqadd">;
diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td
index 09e6f462a06..81687a0ba10 100644
--- a/llvm/lib/Target/AArch64/SVEInstrFormats.td
+++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td
@@ -2092,6 +2092,60 @@ multiclass sve_int_perm_bin_perm_pp<bits<3> opc, string asm> {
def _D : sve_int_perm_bin_perm_pp<opc, 0b11, asm, PPR64>;
}
+class sve_int_rdffr_pred<bit s, string asm>
+: I<(outs PPR8:$Pd), (ins PPRAny:$Pg),
+ asm, "\t$Pd, $Pg/z",
+ "",
+ []>, Sched<[]> {
+ bits<4> Pd;
+ bits<4> Pg;
+ let Inst{31-23} = 0b001001010;
+ let Inst{22} = s;
+ let Inst{21-9} = 0b0110001111000;
+ let Inst{8-5} = Pg;
+ let Inst{4} = 0;
+ let Inst{3-0} = Pd;
+
+ let Defs = !if(!eq (s, 1), [NZCV], []);
+ let Uses = [FFR];
+}
+
+class sve_int_rdffr_unpred<string asm> : I<
+ (outs PPR8:$Pd), (ins),
+ asm, "\t$Pd",
+ "",
+ []>, Sched<[]> {
+ bits<4> Pd;
+ let Inst{31-4} = 0b0010010100011001111100000000;
+ let Inst{3-0} = Pd;
+
+ let Uses = [FFR];
+}
+
+class sve_int_wrffr<string asm>
+: I<(outs), (ins PPR8:$Pn),
+ asm, "\t$Pn",
+ "",
+ []>, Sched<[]> {
+ bits<4> Pn;
+ let Inst{31-9} = 0b00100101001010001001000;
+ let Inst{8-5} = Pn;
+ let Inst{4-0} = 0b00000;
+
+ let hasSideEffects = 1;
+ let Defs = [FFR];
+}
+
+class sve_int_setffr<string asm>
+: I<(outs), (ins),
+ asm, "",
+ "",
+ []>, Sched<[]> {
+ let Inst{31-0} = 0b00100101001011001001000000000000;
+
+ let hasSideEffects = 1;
+ let Defs = [FFR];
+}
//===----------------------------------------------------------------------===//
// SVE Permute Vector - Predicated Group
OpenPOWER on IntegriCloud