• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1//==- HexagonSystemInst.td - System Instructions for Hexagon -*- tablegen -*-==//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the Hexagon instructions in TableGen format.
11//
12//===----------------------------------------------------------------------===//
13
14//===----------------------------------------------------------------------===//
15//                     Cache manipulation instructions.
16//===----------------------------------------------------------------------===//
17let mayStore = 1 in
18class ST_MISC_CACHEOP<dag outs, dag ins,
19              string asmstr, list<dag> pattern = [],
20              bits<3> amode, bits<3> type, bits<1> un>
21  : ST0Inst<outs, ins, asmstr, pattern, "", ST_tc_ld_SLOT0> {
22
23    bits<5> Rs;
24    bits<5> Rt;
25    bits<5> Rd;
26    let Inst{31-28} = 0b1010;
27    let Inst{27-25} = amode;
28    let Inst{24-22} = type;
29    let Inst{21}    = un;
30    let Inst{20-16} = Rs;
31    let Inst{12-8}  = Rt;
32    let Inst{4-0}   = Rd;
33}
34
35let mayStore = 1 in
36class ST_MISC_CACHEOP_SYS<dag outs, dag ins,
37              string asmstr, list<dag> pattern = [],
38              bits<3> amode, bits<3> type, bits<1> un>
39  : SYSInst<outs, ins, asmstr, pattern, ""> {
40
41    bits<5> Rs;
42    bits<5> Rt;
43    bits<5> Rd;
44    let Inst{31-28} = 0b1010;
45    let Inst{27-25} = amode;
46    let Inst{24-22} = type;
47    let Inst{21}    = un;
48    let Inst{20-16} = Rs;
49    let Inst{12-8}  = Rt;
50    let Inst{4-0}   = Rd;
51}
52
53
54let isSolo = 1, Rs = 0, Rt = 0, Rd = 0 in {
55def Y2_syncht: ST_MISC_CACHEOP <(outs), (ins),
56    "syncht" , [], 0b100, 0b001, 0b0>;
57}
58
59let Rt = 0, Rd = 0 in {
60let isSoloAin1 = 1 in {
61  def Y2_dccleana: ST_MISC_CACHEOP <(outs), (ins IntRegs:$Rs),
62      "dccleana($Rs)", [], 0b000, 0b000, 0b0>;
63  def Y2_dcinva: ST_MISC_CACHEOP <(outs), (ins IntRegs:$Rs),
64      "dcinva($Rs)", [], 0b000, 0b000, 0b1>;
65  def Y2_dccleaninva: ST_MISC_CACHEOP <(outs), (ins IntRegs:$Rs),
66      "dccleaninva($Rs)", [], 0b000, 0b001, 0b0>;
67  }
68}
69
70let isSoloAX = 1, hasSideEffects = 1, Rd = 0 in {
71  def Y4_l2fetch: ST_MISC_CACHEOP_SYS<(outs), (ins IntRegs:$Rs, IntRegs:$Rt),
72      "l2fetch($Rs, $Rt)", [], 0b011, 0b000, 0b0>;
73  def Y5_l2fetch: ST_MISC_CACHEOP_SYS<(outs), (ins IntRegs:$Rs, DoubleRegs:$Rt),
74      "l2fetch($Rs, $Rt)", [], 0b011, 0b010, 0b0>;
75}
76
77let hasSideEffects = 0, isSolo = 1 in
78class Y2_INVALIDATE_CACHE<string mnemonic, bit MajOp>
79  : JRInst <
80  (outs), (ins IntRegs:$Rs),
81  #mnemonic#"($Rs)" > {
82    bits<5> Rs;
83
84    let IClass = 0b0101;
85    let Inst{27-21} = 0b0110110;
86    let Inst{20-16} = Rs;
87    let Inst{13-12} = 0b00;
88    let Inst{11} = MajOp;
89  }
90// Instruction cache invalidate
91def Y2_icinva : Y2_INVALIDATE_CACHE<"icinva", 0b0>;
92
93// Zero an aligned 32-byte cacheline.
94let isSoloAin1 = 1 in
95def Y2_dczeroa: ST0Inst <(outs), (ins IntRegs:$Rs),
96  "dczeroa($Rs)"> {
97    bits<5> Rs;
98    let IClass = 0b1010;
99    let Inst{27-21} = 0b0000110;
100    let Inst{13} = 0b0;
101    let Inst{20-16} = Rs;
102  }
103
104// Memory synchronization.
105let hasSideEffects = 0, isSolo = 1 in
106def Y2_isync: JRInst <(outs), (ins),
107  "isync"> {
108    let IClass = 0b0101;
109    let Inst{27-16} = 0b011111000000;
110    let Inst{13} = 0b0;
111    let Inst{9-0} = 0b0000000010;
112  }
113
114//===----------------------------------------------------------------------===//
115//                     System/User instructions.
116//===----------------------------------------------------------------------===//
117// traps and pause
118let hasSideEffects = 0, isSolo = 1 in
119class J2_MISC_TRAP_PAUSE<string mnemonic, bits<2> MajOp>
120  : JRInst
121  <(outs), (ins u8Imm:$u8),
122   #mnemonic#"(#$u8)"> {
123    bits<8> u8;
124
125    let IClass = 0b0101;
126    let Inst{27-24} = 0b0100;
127    let Inst{23-22} = MajOp;
128    let Inst{12-8} = u8{7-3};
129    let Inst{4-2} = u8{2-0};
130  }
131def J2_trap0 : J2_MISC_TRAP_PAUSE<"trap0", 0b00>;
132def J2_trap1 : J2_MISC_TRAP_PAUSE<"trap1", 0b10>;
133def J2_pause : J2_MISC_TRAP_PAUSE<"pause", 0b01>;
134
135