summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2016-01-06 14:22:22 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2016-01-06 14:22:22 +0000
commit2d0418e842e1635aaff4a642320dfa8fbf7669fd (patch)
treea98941b8168f4f69d7790b5e34125039eef4c85d
parentb5846ce7152683def6e97bb1362bfaa511a98c86 (diff)
downloadbcm5719-llvm-2d0418e842e1635aaff4a642320dfa8fbf7669fd.tar.gz
bcm5719-llvm-2d0418e842e1635aaff4a642320dfa8fbf7669fd.zip
[Hexagon] Add system instructions for cache manipulation
llvm-svn: 256936
-rw-r--r--llvm/lib/Target/Hexagon/HexagonInstrInfo.td2
-rw-r--r--llvm/lib/Target/Hexagon/HexagonSystemInst.td113
2 files changed, 115 insertions, 0 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.td b/llvm/lib/Target/Hexagon/HexagonInstrInfo.td
index 5cfeba720d9..421403f4972 100644
--- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.td
+++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.td
@@ -5807,3 +5807,5 @@ include "HexagonInstrInfoV60.td"
include "HexagonInstrInfoVector.td"
include "HexagonInstrAlias.td"
+include "HexagonSystemInst.td"
+
diff --git a/llvm/lib/Target/Hexagon/HexagonSystemInst.td b/llvm/lib/Target/Hexagon/HexagonSystemInst.td
new file mode 100644
index 00000000000..784686a437a
--- /dev/null
+++ b/llvm/lib/Target/Hexagon/HexagonSystemInst.td
@@ -0,0 +1,113 @@
+//==- HexagonSystemInst.td - System Instructions for Hexagon -*- tablegen -*-==//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file describes the Hexagon instructions in TableGen format.
+//
+//===----------------------------------------------------------------------===//
+
+//===----------------------------------------------------------------------===//
+// Cache manipulation instructions.
+//===----------------------------------------------------------------------===//
+let mayStore = 1 in
+class ST_MISC_CACHEOP<dag outs, dag ins,
+ string asmstr, list<dag> pattern = [],
+ bits<3> amode, bits<3> type, bits<1> un>
+ : ST0Inst<outs, ins, asmstr, pattern, "", ST_tc_ld_SLOT0> {
+
+ bits<5> Rs;
+ bits<5> Rt;
+ bits<5> Rd;
+ let Inst{31-28} = 0b1010;
+ let Inst{27-25} = amode;
+ let Inst{24-22} = type;
+ let Inst{21} = un;
+ let Inst{20-16} = Rs;
+ let Inst{12-8} = Rt;
+ let Inst{4-0} = Rd;
+}
+
+let mayStore = 1 in
+class ST_MISC_CACHEOP_SYS<dag outs, dag ins,
+ string asmstr, list<dag> pattern = [],
+ bits<3> amode, bits<3> type, bits<1> un>
+ : SYSInst<outs, ins, asmstr, pattern, ""> {
+
+ bits<5> Rs;
+ bits<5> Rt;
+ bits<5> Rd;
+ let Inst{31-28} = 0b1010;
+ let Inst{27-25} = amode;
+ let Inst{24-22} = type;
+ let Inst{21} = un;
+ let Inst{20-16} = Rs;
+ let Inst{12-8} = Rt;
+ let Inst{4-0} = Rd;
+}
+
+
+let isSolo = 1, Rs = 0, Rt = 0, Rd = 0 in {
+def Y2_syncht: ST_MISC_CACHEOP <(outs), (ins),
+ "syncht" , [], 0b100, 0b001, 0b0>;
+}
+
+let Rt = 0, Rd = 0 in {
+let isSoloAin1 = 1 in {
+ def Y2_dccleana: ST_MISC_CACHEOP <(outs), (ins IntRegs:$Rs),
+ "dccleana($Rs)", [], 0b000, 0b000, 0b0>;
+ def Y2_dcinva: ST_MISC_CACHEOP <(outs), (ins IntRegs:$Rs),
+ "dcinva($Rs)", [], 0b000, 0b000, 0b1>;
+ def Y2_dccleaninva: ST_MISC_CACHEOP <(outs), (ins IntRegs:$Rs),
+ "dccleaninva($Rs)", [], 0b000, 0b001, 0b0>;
+ }
+}
+
+let isSoloAX = 1, hasSideEffects = 1, Rd = 0 in {
+ def Y4_l2fetch: ST_MISC_CACHEOP_SYS<(outs), (ins IntRegs:$Rs, IntRegs:$Rt),
+ "l2fetch($Rs, $Rt)", [], 0b011, 0b000, 0b0>;
+ def Y5_l2fetch: ST_MISC_CACHEOP_SYS<(outs), (ins IntRegs:$Rs, DoubleRegs:$Rt),
+ "l2fetch($Rs, $Rt)", [], 0b011, 0b010, 0b0>;
+}
+
+let hasSideEffects = 0, isSolo = 1 in
+class Y2_INVALIDATE_CACHE<string mnemonic, bit MajOp>
+ : JRInst <
+ (outs), (ins IntRegs:$Rs),
+ #mnemonic#"($Rs)" > {
+ bits<5> Rs;
+
+ let IClass = 0b0101;
+ let Inst{27-21} = 0b0110110;
+ let Inst{20-16} = Rs;
+ let Inst{13-12} = 0b00;
+ let Inst{11} = MajOp;
+ }
+// Instruction cache invalidate
+def Y2_icinva : Y2_INVALIDATE_CACHE<"icinva", 0b0>;
+
+// Zero an aligned 32-byte cacheline.
+let isSoloAin1 = 1 in
+def Y2_dczeroa: ST0Inst <(outs), (ins IntRegs:$Rs),
+ "dczeroa($Rs)"> {
+ bits<5> Rs;
+ let IClass = 0b1010;
+ let Inst{27-21} = 0b0000110;
+ let Inst{13} = 0b0;
+ let Inst{20-16} = Rs;
+ }
+
+// Memory synchronization.
+let hasSideEffects = 0, isSolo = 1 in
+def Y2_isync: JRInst <(outs), (ins),
+ "isync"> {
+ let IClass = 0b0101;
+ let Inst{27-16} = 0b011111000000;
+ let Inst{13} = 0b0;
+ let Inst{9-0} = 0b0000000010;
+ }
+
OpenPOWER on IntegriCloud