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