xref: /aosp_15_r20/external/llvm/lib/Target/Hexagon/HexagonIsetDx.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//=- HexagonIsetDx.td - Target Desc. for Hexagon Target -*- 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 duplex instructions.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker// SA1_combine1i: Combines.
15*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0 in
16*9880d681SAndroid Build Coastguard Workerdef V4_SA1_combine1i: SUBInst <
17*9880d681SAndroid Build Coastguard Worker  (outs DoubleRegs:$Rdd),
18*9880d681SAndroid Build Coastguard Worker  (ins u2Imm:$u2),
19*9880d681SAndroid Build Coastguard Worker  "$Rdd = combine(#1, #$u2)"> {
20*9880d681SAndroid Build Coastguard Worker    bits<3> Rdd;
21*9880d681SAndroid Build Coastguard Worker    bits<2> u2;
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker    let Inst{12-10} = 0b111;
24*9880d681SAndroid Build Coastguard Worker    let Inst{8} = 0b0;
25*9880d681SAndroid Build Coastguard Worker    let Inst{4-3} = 0b01;
26*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = Rdd;
27*9880d681SAndroid Build Coastguard Worker    let Inst{6-5} = u2;
28*9880d681SAndroid Build Coastguard Worker  }
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker// SL2_jumpr31_f: Indirect conditional jump if false.
31*9880d681SAndroid Build Coastguard Worker// SL2_jumpr31_f -> SL2_jumpr31_fnew
32*9880d681SAndroid Build Coastguard Workerlet Defs = [PC], Uses = [P0, R31], isCodeGenOnly = 1, isPredicated = 1, isPredicatedFalse = 1, isBranch = 1, isIndirectBranch = 1, hasSideEffects = 0 in
33*9880d681SAndroid Build Coastguard Workerdef V4_SL2_jumpr31_f: SUBInst <
34*9880d681SAndroid Build Coastguard Worker  (outs ),
35*9880d681SAndroid Build Coastguard Worker  (ins ),
36*9880d681SAndroid Build Coastguard Worker  "if (!p0) jumpr r31"> {
37*9880d681SAndroid Build Coastguard Worker    let Inst{12-6} = 0b1111111;
38*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = 0b101;
39*9880d681SAndroid Build Coastguard Worker  }
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker// SL2_deallocframe: Deallocate stack frame.
42*9880d681SAndroid Build Coastguard Workerlet Defs = [R31, R29, R30], Uses = [R30], isCodeGenOnly = 1, mayLoad = 1, accessSize = DoubleWordAccess in
43*9880d681SAndroid Build Coastguard Workerdef V4_SL2_deallocframe: SUBInst <
44*9880d681SAndroid Build Coastguard Worker  (outs ),
45*9880d681SAndroid Build Coastguard Worker  (ins ),
46*9880d681SAndroid Build Coastguard Worker  "deallocframe"> {
47*9880d681SAndroid Build Coastguard Worker    let Inst{12-6} = 0b1111100;
48*9880d681SAndroid Build Coastguard Worker    let Inst{2} = 0b0;
49*9880d681SAndroid Build Coastguard Worker  }
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker// SL2_return_f: Deallocate stack frame and return.
52*9880d681SAndroid Build Coastguard Worker// SL2_return_f -> SL2_return_fnew
53*9880d681SAndroid Build Coastguard Workerlet Defs = [PC, R31, R29, R30], Uses = [R30, P0], isCodeGenOnly = 1, isPredicated = 1, isPredicatedFalse = 1, mayLoad = 1, accessSize = DoubleWordAccess, isBranch = 1, isIndirectBranch = 1 in
54*9880d681SAndroid Build Coastguard Workerdef V4_SL2_return_f: SUBInst <
55*9880d681SAndroid Build Coastguard Worker  (outs ),
56*9880d681SAndroid Build Coastguard Worker  (ins ),
57*9880d681SAndroid Build Coastguard Worker  "if (!p0) dealloc_return"> {
58*9880d681SAndroid Build Coastguard Worker    let Inst{12-6} = 0b1111101;
59*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = 0b101;
60*9880d681SAndroid Build Coastguard Worker  }
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker// SA1_combine3i: Combines.
63*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0 in
64*9880d681SAndroid Build Coastguard Workerdef V4_SA1_combine3i: SUBInst <
65*9880d681SAndroid Build Coastguard Worker  (outs DoubleRegs:$Rdd),
66*9880d681SAndroid Build Coastguard Worker  (ins u2Imm:$u2),
67*9880d681SAndroid Build Coastguard Worker  "$Rdd = combine(#3, #$u2)"> {
68*9880d681SAndroid Build Coastguard Worker    bits<3> Rdd;
69*9880d681SAndroid Build Coastguard Worker    bits<2> u2;
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker    let Inst{12-10} = 0b111;
72*9880d681SAndroid Build Coastguard Worker    let Inst{8} = 0b0;
73*9880d681SAndroid Build Coastguard Worker    let Inst{4-3} = 0b11;
74*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = Rdd;
75*9880d681SAndroid Build Coastguard Worker    let Inst{6-5} = u2;
76*9880d681SAndroid Build Coastguard Worker  }
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker// SS2_storebi0: Store byte.
79*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, mayStore = 1, accessSize = ByteAccess in
80*9880d681SAndroid Build Coastguard Workerdef V4_SS2_storebi0: SUBInst <
81*9880d681SAndroid Build Coastguard Worker  (outs ),
82*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u4_0Imm:$u4_0),
83*9880d681SAndroid Build Coastguard Worker  "memb($Rs + #$u4_0)=#0"> {
84*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
85*9880d681SAndroid Build Coastguard Worker    bits<4> u4_0;
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b10010;
88*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
89*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = u4_0;
90*9880d681SAndroid Build Coastguard Worker  }
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker// SA1_clrtnew: Clear if true.
93*9880d681SAndroid Build Coastguard Workerlet Uses = [P0], isCodeGenOnly = 1, isPredicated = 1, isPredicatedNew = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
94*9880d681SAndroid Build Coastguard Workerdef V4_SA1_clrtnew: SUBInst <
95*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
96*9880d681SAndroid Build Coastguard Worker  (ins ),
97*9880d681SAndroid Build Coastguard Worker  "if (p0.new) $Rd = #0"> {
98*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker    let Inst{12-9} = 0b1101;
101*9880d681SAndroid Build Coastguard Worker    let Inst{6-4} = 0b100;
102*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
103*9880d681SAndroid Build Coastguard Worker  }
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker// SL2_loadruh_io: Load half.
106*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, mayLoad = 1, accessSize = HalfWordAccess, hasNewValue = 1, opNewValue = 0 in
107*9880d681SAndroid Build Coastguard Workerdef V4_SL2_loadruh_io: SUBInst <
108*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
109*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u3_1Imm:$u3_1),
110*9880d681SAndroid Build Coastguard Worker  "$Rd = memuh($Rs + #$u3_1)"> {
111*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
112*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
113*9880d681SAndroid Build Coastguard Worker    bits<4> u3_1;
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker    let Inst{12-11} = 0b01;
116*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
117*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
118*9880d681SAndroid Build Coastguard Worker    let Inst{10-8} = u3_1{3-1};
119*9880d681SAndroid Build Coastguard Worker  }
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker// SL2_jumpr31_tnew: Indirect conditional jump if true.
122*9880d681SAndroid Build Coastguard Workerlet Defs = [PC], Uses = [P0, R31], isCodeGenOnly = 1, isPredicated = 1, isPredicatedNew = 1, isBranch = 1, isIndirectBranch = 1, hasSideEffects = 0 in
123*9880d681SAndroid Build Coastguard Workerdef V4_SL2_jumpr31_tnew: SUBInst <
124*9880d681SAndroid Build Coastguard Worker  (outs ),
125*9880d681SAndroid Build Coastguard Worker  (ins ),
126*9880d681SAndroid Build Coastguard Worker  "if (p0.new) jumpr:nt r31"> {
127*9880d681SAndroid Build Coastguard Worker    let Inst{12-6} = 0b1111111;
128*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = 0b110;
129*9880d681SAndroid Build Coastguard Worker  }
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker// SA1_addi: Add.
132*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0, isExtendable = 1, isExtentSigned = 1, opExtentBits = 7, opExtendable = 2 in
133*9880d681SAndroid Build Coastguard Workerdef V4_SA1_addi: SUBInst <
134*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rx),
135*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$_src_, s7Ext:$s7),
136*9880d681SAndroid Build Coastguard Worker  "$Rx = add($_src_, #$s7)" ,
137*9880d681SAndroid Build Coastguard Worker  [] ,
138*9880d681SAndroid Build Coastguard Worker  "$_src_ = $Rx"> {
139*9880d681SAndroid Build Coastguard Worker    bits<4> Rx;
140*9880d681SAndroid Build Coastguard Worker    bits<7> s7;
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker    let Inst{12-11} = 0b00;
143*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rx;
144*9880d681SAndroid Build Coastguard Worker    let Inst{10-4} = s7;
145*9880d681SAndroid Build Coastguard Worker  }
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker// SL1_loadrub_io: Load byte.
148*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, mayLoad = 1, accessSize = ByteAccess, hasNewValue = 1, opNewValue = 0 in
149*9880d681SAndroid Build Coastguard Workerdef V4_SL1_loadrub_io: SUBInst <
150*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
151*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u4_0Imm:$u4_0),
152*9880d681SAndroid Build Coastguard Worker  "$Rd = memub($Rs + #$u4_0)"> {
153*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
154*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
155*9880d681SAndroid Build Coastguard Worker    bits<4> u4_0;
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker    let Inst{12} = 0b1;
158*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
159*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
160*9880d681SAndroid Build Coastguard Worker    let Inst{11-8} = u4_0;
161*9880d681SAndroid Build Coastguard Worker  }
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker// SL1_loadri_io: Load word.
164*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, mayLoad = 1, accessSize = WordAccess, hasNewValue = 1, opNewValue = 0 in
165*9880d681SAndroid Build Coastguard Workerdef V4_SL1_loadri_io: SUBInst <
166*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
167*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u4_2Imm:$u4_2),
168*9880d681SAndroid Build Coastguard Worker  "$Rd = memw($Rs + #$u4_2)"> {
169*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
170*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
171*9880d681SAndroid Build Coastguard Worker    bits<6> u4_2;
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker    let Inst{12} = 0b0;
174*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
175*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
176*9880d681SAndroid Build Coastguard Worker    let Inst{11-8} = u4_2{5-2};
177*9880d681SAndroid Build Coastguard Worker  }
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker// SA1_cmpeqi: Compareimmed.
180*9880d681SAndroid Build Coastguard Workerlet Defs = [P0], isCodeGenOnly = 1, hasSideEffects = 0 in
181*9880d681SAndroid Build Coastguard Workerdef V4_SA1_cmpeqi: SUBInst <
182*9880d681SAndroid Build Coastguard Worker  (outs ),
183*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u2Imm:$u2),
184*9880d681SAndroid Build Coastguard Worker  "p0 = cmp.eq($Rs, #$u2)"> {
185*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
186*9880d681SAndroid Build Coastguard Worker    bits<2> u2;
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b11001;
189*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
190*9880d681SAndroid Build Coastguard Worker    let Inst{1-0} = u2;
191*9880d681SAndroid Build Coastguard Worker  }
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Worker// SA1_combinerz: Combines.
194*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0 in
195*9880d681SAndroid Build Coastguard Workerdef V4_SA1_combinerz: SUBInst <
196*9880d681SAndroid Build Coastguard Worker  (outs DoubleRegs:$Rdd),
197*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs),
198*9880d681SAndroid Build Coastguard Worker  "$Rdd = combine($Rs, #0)"> {
199*9880d681SAndroid Build Coastguard Worker    bits<3> Rdd;
200*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker    let Inst{12-10} = 0b111;
203*9880d681SAndroid Build Coastguard Worker    let Inst{8} = 0b1;
204*9880d681SAndroid Build Coastguard Worker    let Inst{3} = 0b1;
205*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = Rdd;
206*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
207*9880d681SAndroid Build Coastguard Worker  }
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker// SL2_return_t: Deallocate stack frame and return.
210*9880d681SAndroid Build Coastguard Worker// SL2_return_t -> SL2_return_tnew
211*9880d681SAndroid Build Coastguard Workerlet Defs = [PC, R31, R29, R30], Uses = [R30, P0], isCodeGenOnly = 1, isPredicated = 1, mayLoad = 1, accessSize = DoubleWordAccess, isBranch = 1, isIndirectBranch = 1 in
212*9880d681SAndroid Build Coastguard Workerdef V4_SL2_return_t: SUBInst <
213*9880d681SAndroid Build Coastguard Worker  (outs ),
214*9880d681SAndroid Build Coastguard Worker  (ins ),
215*9880d681SAndroid Build Coastguard Worker  "if (p0) dealloc_return"> {
216*9880d681SAndroid Build Coastguard Worker    let Inst{12-6} = 0b1111101;
217*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = 0b100;
218*9880d681SAndroid Build Coastguard Worker  }
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker// SS2_allocframe: Allocate stack frame.
221*9880d681SAndroid Build Coastguard Workerlet Defs = [R29, R30], Uses = [R30, R31, R29], isCodeGenOnly = 1, mayStore = 1, accessSize = DoubleWordAccess in
222*9880d681SAndroid Build Coastguard Workerdef V4_SS2_allocframe: SUBInst <
223*9880d681SAndroid Build Coastguard Worker  (outs ),
224*9880d681SAndroid Build Coastguard Worker  (ins u5_3Imm:$u5_3),
225*9880d681SAndroid Build Coastguard Worker  "allocframe(#$u5_3)"> {
226*9880d681SAndroid Build Coastguard Worker    bits<8> u5_3;
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker    let Inst{12-9} = 0b1110;
229*9880d681SAndroid Build Coastguard Worker    let Inst{8-4} = u5_3{7-3};
230*9880d681SAndroid Build Coastguard Worker  }
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker// SS2_storeh_io: Store half.
233*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, mayStore = 1, accessSize = HalfWordAccess in
234*9880d681SAndroid Build Coastguard Workerdef V4_SS2_storeh_io: SUBInst <
235*9880d681SAndroid Build Coastguard Worker  (outs ),
236*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u3_1Imm:$u3_1, IntRegs:$Rt),
237*9880d681SAndroid Build Coastguard Worker  "memh($Rs + #$u3_1) = $Rt"> {
238*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
239*9880d681SAndroid Build Coastguard Worker    bits<4> u3_1;
240*9880d681SAndroid Build Coastguard Worker    bits<4> Rt;
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Worker    let Inst{12-11} = 0b00;
243*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
244*9880d681SAndroid Build Coastguard Worker    let Inst{10-8} = u3_1{3-1};
245*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rt;
246*9880d681SAndroid Build Coastguard Worker  }
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Worker// SS2_storewi0: Store word.
249*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, mayStore = 1, accessSize = WordAccess in
250*9880d681SAndroid Build Coastguard Workerdef V4_SS2_storewi0: SUBInst <
251*9880d681SAndroid Build Coastguard Worker  (outs ),
252*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u4_2Imm:$u4_2),
253*9880d681SAndroid Build Coastguard Worker  "memw($Rs + #$u4_2)=#0"> {
254*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
255*9880d681SAndroid Build Coastguard Worker    bits<6> u4_2;
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b10000;
258*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
259*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = u4_2{5-2};
260*9880d681SAndroid Build Coastguard Worker  }
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker// SS2_storewi1: Store word.
263*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, mayStore = 1, accessSize = WordAccess in
264*9880d681SAndroid Build Coastguard Workerdef V4_SS2_storewi1: SUBInst <
265*9880d681SAndroid Build Coastguard Worker  (outs ),
266*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u4_2Imm:$u4_2),
267*9880d681SAndroid Build Coastguard Worker  "memw($Rs + #$u4_2)=#1"> {
268*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
269*9880d681SAndroid Build Coastguard Worker    bits<6> u4_2;
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b10001;
272*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
273*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = u4_2{5-2};
274*9880d681SAndroid Build Coastguard Worker  }
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Worker// SL2_jumpr31: Indirect conditional jump if true.
277*9880d681SAndroid Build Coastguard Workerlet Defs = [PC], Uses = [R31], isCodeGenOnly = 1, isBranch = 1, isIndirectBranch = 1, hasSideEffects = 0 in
278*9880d681SAndroid Build Coastguard Workerdef V4_SL2_jumpr31: SUBInst <
279*9880d681SAndroid Build Coastguard Worker  (outs ),
280*9880d681SAndroid Build Coastguard Worker  (ins ),
281*9880d681SAndroid Build Coastguard Worker  "jumpr r31"> {
282*9880d681SAndroid Build Coastguard Worker    let Inst{12-6} = 0b1111111;
283*9880d681SAndroid Build Coastguard Worker    let Inst{2} = 0b0;
284*9880d681SAndroid Build Coastguard Worker  }
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker// SA1_combinezr: Combines.
287*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0 in
288*9880d681SAndroid Build Coastguard Workerdef V4_SA1_combinezr: SUBInst <
289*9880d681SAndroid Build Coastguard Worker  (outs DoubleRegs:$Rdd),
290*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs),
291*9880d681SAndroid Build Coastguard Worker  "$Rdd = combine(#0, $Rs)"> {
292*9880d681SAndroid Build Coastguard Worker    bits<3> Rdd;
293*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Worker    let Inst{12-10} = 0b111;
296*9880d681SAndroid Build Coastguard Worker    let Inst{8} = 0b1;
297*9880d681SAndroid Build Coastguard Worker    let Inst{3} = 0b0;
298*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = Rdd;
299*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
300*9880d681SAndroid Build Coastguard Worker  }
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker// SL2_loadrh_io: Load half.
303*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, mayLoad = 1, accessSize = HalfWordAccess, hasNewValue = 1, opNewValue = 0 in
304*9880d681SAndroid Build Coastguard Workerdef V4_SL2_loadrh_io: SUBInst <
305*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
306*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u3_1Imm:$u3_1),
307*9880d681SAndroid Build Coastguard Worker  "$Rd = memh($Rs + #$u3_1)"> {
308*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
309*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
310*9880d681SAndroid Build Coastguard Worker    bits<4> u3_1;
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Worker    let Inst{12-11} = 0b00;
313*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
314*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
315*9880d681SAndroid Build Coastguard Worker    let Inst{10-8} = u3_1{3-1};
316*9880d681SAndroid Build Coastguard Worker  }
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker// SA1_addrx: Add.
319*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
320*9880d681SAndroid Build Coastguard Workerdef V4_SA1_addrx: SUBInst <
321*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rx),
322*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$_src_, IntRegs:$Rs),
323*9880d681SAndroid Build Coastguard Worker  "$Rx = add($_src_, $Rs)" ,
324*9880d681SAndroid Build Coastguard Worker  [] ,
325*9880d681SAndroid Build Coastguard Worker  "$_src_ = $Rx"> {
326*9880d681SAndroid Build Coastguard Worker    bits<4> Rx;
327*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b11000;
330*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rx;
331*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
332*9880d681SAndroid Build Coastguard Worker  }
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker// SA1_setin1: Set to -1.
335*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
336*9880d681SAndroid Build Coastguard Workerdef V4_SA1_setin1: SUBInst <
337*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
338*9880d681SAndroid Build Coastguard Worker  (ins ),
339*9880d681SAndroid Build Coastguard Worker  "$Rd = #-1"> {
340*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Worker    let Inst{12-9} = 0b1101;
343*9880d681SAndroid Build Coastguard Worker    let Inst{6} = 0b0;
344*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
345*9880d681SAndroid Build Coastguard Worker  }
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Worker// SA1_sxth: Sxth.
348*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
349*9880d681SAndroid Build Coastguard Workerdef V4_SA1_sxth: SUBInst <
350*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
351*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs),
352*9880d681SAndroid Build Coastguard Worker  "$Rd = sxth($Rs)"> {
353*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
354*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b10100;
357*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
358*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
359*9880d681SAndroid Build Coastguard Worker  }
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Worker// SA1_combine0i: Combines.
362*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0 in
363*9880d681SAndroid Build Coastguard Workerdef V4_SA1_combine0i: SUBInst <
364*9880d681SAndroid Build Coastguard Worker  (outs DoubleRegs:$Rdd),
365*9880d681SAndroid Build Coastguard Worker  (ins u2Imm:$u2),
366*9880d681SAndroid Build Coastguard Worker  "$Rdd = combine(#0, #$u2)"> {
367*9880d681SAndroid Build Coastguard Worker    bits<3> Rdd;
368*9880d681SAndroid Build Coastguard Worker    bits<2> u2;
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Worker    let Inst{12-10} = 0b111;
371*9880d681SAndroid Build Coastguard Worker    let Inst{8} = 0b0;
372*9880d681SAndroid Build Coastguard Worker    let Inst{4-3} = 0b00;
373*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = Rdd;
374*9880d681SAndroid Build Coastguard Worker    let Inst{6-5} = u2;
375*9880d681SAndroid Build Coastguard Worker  }
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard Worker// SA1_combine2i: Combines.
378*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0 in
379*9880d681SAndroid Build Coastguard Workerdef V4_SA1_combine2i: SUBInst <
380*9880d681SAndroid Build Coastguard Worker  (outs DoubleRegs:$Rdd),
381*9880d681SAndroid Build Coastguard Worker  (ins u2Imm:$u2),
382*9880d681SAndroid Build Coastguard Worker  "$Rdd = combine(#2, #$u2)"> {
383*9880d681SAndroid Build Coastguard Worker    bits<3> Rdd;
384*9880d681SAndroid Build Coastguard Worker    bits<2> u2;
385*9880d681SAndroid Build Coastguard Worker
386*9880d681SAndroid Build Coastguard Worker    let Inst{12-10} = 0b111;
387*9880d681SAndroid Build Coastguard Worker    let Inst{8} = 0b0;
388*9880d681SAndroid Build Coastguard Worker    let Inst{4-3} = 0b10;
389*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = Rdd;
390*9880d681SAndroid Build Coastguard Worker    let Inst{6-5} = u2;
391*9880d681SAndroid Build Coastguard Worker  }
392*9880d681SAndroid Build Coastguard Worker
393*9880d681SAndroid Build Coastguard Worker// SA1_sxtb: Sxtb.
394*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
395*9880d681SAndroid Build Coastguard Workerdef V4_SA1_sxtb: SUBInst <
396*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
397*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs),
398*9880d681SAndroid Build Coastguard Worker  "$Rd = sxtb($Rs)"> {
399*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
400*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b10101;
403*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
404*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
405*9880d681SAndroid Build Coastguard Worker  }
406*9880d681SAndroid Build Coastguard Worker
407*9880d681SAndroid Build Coastguard Worker// SA1_clrf: Clear if false.
408*9880d681SAndroid Build Coastguard Worker// SA1_clrf -> SA1_clrfnew
409*9880d681SAndroid Build Coastguard Workerlet Uses = [P0], isCodeGenOnly = 1, isPredicated = 1, isPredicatedFalse = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
410*9880d681SAndroid Build Coastguard Workerdef V4_SA1_clrf: SUBInst <
411*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
412*9880d681SAndroid Build Coastguard Worker  (ins ),
413*9880d681SAndroid Build Coastguard Worker  "if (!p0) $Rd = #0"> {
414*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
415*9880d681SAndroid Build Coastguard Worker
416*9880d681SAndroid Build Coastguard Worker    let Inst{12-9} = 0b1101;
417*9880d681SAndroid Build Coastguard Worker    let Inst{6-4} = 0b111;
418*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
419*9880d681SAndroid Build Coastguard Worker  }
420*9880d681SAndroid Build Coastguard Worker
421*9880d681SAndroid Build Coastguard Worker// SL2_loadrb_io: Load byte.
422*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, mayLoad = 1, accessSize = ByteAccess, hasNewValue = 1, opNewValue = 0 in
423*9880d681SAndroid Build Coastguard Workerdef V4_SL2_loadrb_io: SUBInst <
424*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
425*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u3_0Imm:$u3_0),
426*9880d681SAndroid Build Coastguard Worker  "$Rd = memb($Rs + #$u3_0)"> {
427*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
428*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
429*9880d681SAndroid Build Coastguard Worker    bits<3> u3_0;
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Worker    let Inst{12-11} = 0b10;
432*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
433*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
434*9880d681SAndroid Build Coastguard Worker    let Inst{10-8} = u3_0;
435*9880d681SAndroid Build Coastguard Worker  }
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard Worker// SA1_tfr: Tfr.
438*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
439*9880d681SAndroid Build Coastguard Workerdef V4_SA1_tfr: SUBInst <
440*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
441*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs),
442*9880d681SAndroid Build Coastguard Worker  "$Rd = $Rs"> {
443*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
444*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
445*9880d681SAndroid Build Coastguard Worker
446*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b10000;
447*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
448*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
449*9880d681SAndroid Build Coastguard Worker  }
450*9880d681SAndroid Build Coastguard Worker
451*9880d681SAndroid Build Coastguard Worker// SL2_loadrd_sp: Load dword.
452*9880d681SAndroid Build Coastguard Workerlet Uses = [R29], isCodeGenOnly = 1, mayLoad = 1, accessSize = DoubleWordAccess in
453*9880d681SAndroid Build Coastguard Workerdef V4_SL2_loadrd_sp: SUBInst <
454*9880d681SAndroid Build Coastguard Worker  (outs DoubleRegs:$Rdd),
455*9880d681SAndroid Build Coastguard Worker  (ins u5_3Imm:$u5_3),
456*9880d681SAndroid Build Coastguard Worker  "$Rdd = memd(r29 + #$u5_3)"> {
457*9880d681SAndroid Build Coastguard Worker    bits<3> Rdd;
458*9880d681SAndroid Build Coastguard Worker    bits<8> u5_3;
459*9880d681SAndroid Build Coastguard Worker
460*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b11110;
461*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = Rdd;
462*9880d681SAndroid Build Coastguard Worker    let Inst{7-3} = u5_3{7-3};
463*9880d681SAndroid Build Coastguard Worker  }
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Worker// SA1_and1: And #1.
466*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
467*9880d681SAndroid Build Coastguard Workerdef V4_SA1_and1: SUBInst <
468*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
469*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs),
470*9880d681SAndroid Build Coastguard Worker  "$Rd = and($Rs, #1)"> {
471*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
472*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
473*9880d681SAndroid Build Coastguard Worker
474*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b10010;
475*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
476*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
477*9880d681SAndroid Build Coastguard Worker  }
478*9880d681SAndroid Build Coastguard Worker
479*9880d681SAndroid Build Coastguard Worker// SS2_storebi1: Store byte.
480*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, mayStore = 1, accessSize = ByteAccess in
481*9880d681SAndroid Build Coastguard Workerdef V4_SS2_storebi1: SUBInst <
482*9880d681SAndroid Build Coastguard Worker  (outs ),
483*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u4_0Imm:$u4_0),
484*9880d681SAndroid Build Coastguard Worker  "memb($Rs + #$u4_0)=#1"> {
485*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
486*9880d681SAndroid Build Coastguard Worker    bits<4> u4_0;
487*9880d681SAndroid Build Coastguard Worker
488*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b10011;
489*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
490*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = u4_0;
491*9880d681SAndroid Build Coastguard Worker  }
492*9880d681SAndroid Build Coastguard Worker
493*9880d681SAndroid Build Coastguard Worker// SA1_inc: Inc.
494*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
495*9880d681SAndroid Build Coastguard Workerdef V4_SA1_inc: SUBInst <
496*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
497*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs),
498*9880d681SAndroid Build Coastguard Worker  "$Rd = add($Rs, #1)"> {
499*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
500*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
501*9880d681SAndroid Build Coastguard Worker
502*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b10001;
503*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
504*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
505*9880d681SAndroid Build Coastguard Worker  }
506*9880d681SAndroid Build Coastguard Worker
507*9880d681SAndroid Build Coastguard Worker// SS2_stored_sp: Store dword.
508*9880d681SAndroid Build Coastguard Workerlet Uses = [R29], isCodeGenOnly = 1, mayStore = 1, accessSize = DoubleWordAccess in
509*9880d681SAndroid Build Coastguard Workerdef V4_SS2_stored_sp: SUBInst <
510*9880d681SAndroid Build Coastguard Worker  (outs ),
511*9880d681SAndroid Build Coastguard Worker  (ins s6_3Imm:$s6_3, DoubleRegs:$Rtt),
512*9880d681SAndroid Build Coastguard Worker  "memd(r29 + #$s6_3) = $Rtt"> {
513*9880d681SAndroid Build Coastguard Worker    bits<9> s6_3;
514*9880d681SAndroid Build Coastguard Worker    bits<3> Rtt;
515*9880d681SAndroid Build Coastguard Worker
516*9880d681SAndroid Build Coastguard Worker    let Inst{12-9} = 0b0101;
517*9880d681SAndroid Build Coastguard Worker    let Inst{8-3} = s6_3{8-3};
518*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = Rtt;
519*9880d681SAndroid Build Coastguard Worker  }
520*9880d681SAndroid Build Coastguard Worker
521*9880d681SAndroid Build Coastguard Worker// SS2_storew_sp: Store word.
522*9880d681SAndroid Build Coastguard Workerlet Uses = [R29], isCodeGenOnly = 1, mayStore = 1, accessSize = WordAccess in
523*9880d681SAndroid Build Coastguard Workerdef V4_SS2_storew_sp: SUBInst <
524*9880d681SAndroid Build Coastguard Worker  (outs ),
525*9880d681SAndroid Build Coastguard Worker  (ins u5_2Imm:$u5_2, IntRegs:$Rt),
526*9880d681SAndroid Build Coastguard Worker  "memw(r29 + #$u5_2) = $Rt"> {
527*9880d681SAndroid Build Coastguard Worker    bits<7> u5_2;
528*9880d681SAndroid Build Coastguard Worker    bits<4> Rt;
529*9880d681SAndroid Build Coastguard Worker
530*9880d681SAndroid Build Coastguard Worker    let Inst{12-9} = 0b0100;
531*9880d681SAndroid Build Coastguard Worker    let Inst{8-4} = u5_2{6-2};
532*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rt;
533*9880d681SAndroid Build Coastguard Worker  }
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Worker// SL2_jumpr31_fnew: Indirect conditional jump if false.
536*9880d681SAndroid Build Coastguard Workerlet Defs = [PC], Uses = [P0, R31], isCodeGenOnly = 1, isPredicated = 1, isPredicatedFalse = 1, isPredicatedNew = 1, isBranch = 1, isIndirectBranch = 1, hasSideEffects = 0 in
537*9880d681SAndroid Build Coastguard Workerdef V4_SL2_jumpr31_fnew: SUBInst <
538*9880d681SAndroid Build Coastguard Worker  (outs ),
539*9880d681SAndroid Build Coastguard Worker  (ins ),
540*9880d681SAndroid Build Coastguard Worker  "if (!p0.new) jumpr:nt r31"> {
541*9880d681SAndroid Build Coastguard Worker    let Inst{12-6} = 0b1111111;
542*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = 0b111;
543*9880d681SAndroid Build Coastguard Worker  }
544*9880d681SAndroid Build Coastguard Worker
545*9880d681SAndroid Build Coastguard Worker// SA1_clrt: Clear if true.
546*9880d681SAndroid Build Coastguard Worker// SA1_clrt -> SA1_clrtnew
547*9880d681SAndroid Build Coastguard Workerlet Uses = [P0], isCodeGenOnly = 1, isPredicated = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
548*9880d681SAndroid Build Coastguard Workerdef V4_SA1_clrt: SUBInst <
549*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
550*9880d681SAndroid Build Coastguard Worker  (ins ),
551*9880d681SAndroid Build Coastguard Worker  "if (p0) $Rd = #0"> {
552*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
553*9880d681SAndroid Build Coastguard Worker
554*9880d681SAndroid Build Coastguard Worker    let Inst{12-9} = 0b1101;
555*9880d681SAndroid Build Coastguard Worker    let Inst{6-4} = 0b110;
556*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
557*9880d681SAndroid Build Coastguard Worker  }
558*9880d681SAndroid Build Coastguard Worker
559*9880d681SAndroid Build Coastguard Worker// SL2_return: Deallocate stack frame and return.
560*9880d681SAndroid Build Coastguard Workerlet Defs = [PC, R31, R29, R30], Uses = [R30], isCodeGenOnly = 1, mayLoad = 1, accessSize = DoubleWordAccess, isBranch = 1, isIndirectBranch = 1 in
561*9880d681SAndroid Build Coastguard Workerdef V4_SL2_return: SUBInst <
562*9880d681SAndroid Build Coastguard Worker  (outs ),
563*9880d681SAndroid Build Coastguard Worker  (ins ),
564*9880d681SAndroid Build Coastguard Worker  "dealloc_return"> {
565*9880d681SAndroid Build Coastguard Worker    let Inst{12-6} = 0b1111101;
566*9880d681SAndroid Build Coastguard Worker    let Inst{2} = 0b0;
567*9880d681SAndroid Build Coastguard Worker  }
568*9880d681SAndroid Build Coastguard Worker
569*9880d681SAndroid Build Coastguard Worker// SA1_dec: Dec.
570*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
571*9880d681SAndroid Build Coastguard Workerdef V4_SA1_dec: SUBInst <
572*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
573*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs),
574*9880d681SAndroid Build Coastguard Worker  "$Rd = add($Rs,#-1)"> {
575*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
576*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
577*9880d681SAndroid Build Coastguard Worker
578*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b10011;
579*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
580*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
581*9880d681SAndroid Build Coastguard Worker  }
582*9880d681SAndroid Build Coastguard Worker
583*9880d681SAndroid Build Coastguard Worker// SA1_seti: Set immed.
584*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0, isExtendable = 1, isExtentSigned = 0, opExtentBits = 6, opExtendable = 1 in
585*9880d681SAndroid Build Coastguard Workerdef V4_SA1_seti: SUBInst <
586*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
587*9880d681SAndroid Build Coastguard Worker  (ins u6Ext:$u6),
588*9880d681SAndroid Build Coastguard Worker  "$Rd = #$u6"> {
589*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
590*9880d681SAndroid Build Coastguard Worker    bits<6> u6;
591*9880d681SAndroid Build Coastguard Worker
592*9880d681SAndroid Build Coastguard Worker    let Inst{12-10} = 0b010;
593*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
594*9880d681SAndroid Build Coastguard Worker    let Inst{9-4} = u6;
595*9880d681SAndroid Build Coastguard Worker  }
596*9880d681SAndroid Build Coastguard Worker
597*9880d681SAndroid Build Coastguard Worker// SL2_jumpr31_t: Indirect conditional jump if true.
598*9880d681SAndroid Build Coastguard Worker// SL2_jumpr31_t -> SL2_jumpr31_tnew
599*9880d681SAndroid Build Coastguard Workerlet Defs = [PC], Uses = [P0, R31], isCodeGenOnly = 1, isPredicated = 1, isBranch = 1, isIndirectBranch = 1, hasSideEffects = 0 in
600*9880d681SAndroid Build Coastguard Workerdef V4_SL2_jumpr31_t: SUBInst <
601*9880d681SAndroid Build Coastguard Worker  (outs ),
602*9880d681SAndroid Build Coastguard Worker  (ins ),
603*9880d681SAndroid Build Coastguard Worker  "if (p0) jumpr r31"> {
604*9880d681SAndroid Build Coastguard Worker    let Inst{12-6} = 0b1111111;
605*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = 0b100;
606*9880d681SAndroid Build Coastguard Worker  }
607*9880d681SAndroid Build Coastguard Worker
608*9880d681SAndroid Build Coastguard Worker// SA1_clrfnew: Clear if false.
609*9880d681SAndroid Build Coastguard Workerlet Uses = [P0], isCodeGenOnly = 1, isPredicated = 1, isPredicatedFalse = 1, isPredicatedNew = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
610*9880d681SAndroid Build Coastguard Workerdef V4_SA1_clrfnew: SUBInst <
611*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
612*9880d681SAndroid Build Coastguard Worker  (ins ),
613*9880d681SAndroid Build Coastguard Worker  "if (!p0.new) $Rd = #0"> {
614*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
615*9880d681SAndroid Build Coastguard Worker
616*9880d681SAndroid Build Coastguard Worker    let Inst{12-9} = 0b1101;
617*9880d681SAndroid Build Coastguard Worker    let Inst{6-4} = 0b101;
618*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
619*9880d681SAndroid Build Coastguard Worker  }
620*9880d681SAndroid Build Coastguard Worker
621*9880d681SAndroid Build Coastguard Worker// SS1_storew_io: Store word.
622*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, mayStore = 1, accessSize = WordAccess in
623*9880d681SAndroid Build Coastguard Workerdef V4_SS1_storew_io: SUBInst <
624*9880d681SAndroid Build Coastguard Worker  (outs ),
625*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u4_2Imm:$u4_2, IntRegs:$Rt),
626*9880d681SAndroid Build Coastguard Worker  "memw($Rs + #$u4_2) = $Rt"> {
627*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
628*9880d681SAndroid Build Coastguard Worker    bits<6> u4_2;
629*9880d681SAndroid Build Coastguard Worker    bits<4> Rt;
630*9880d681SAndroid Build Coastguard Worker
631*9880d681SAndroid Build Coastguard Worker    let Inst{12} = 0b0;
632*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
633*9880d681SAndroid Build Coastguard Worker    let Inst{11-8} = u4_2{5-2};
634*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rt;
635*9880d681SAndroid Build Coastguard Worker  }
636*9880d681SAndroid Build Coastguard Worker
637*9880d681SAndroid Build Coastguard Worker// SA1_zxtb: Zxtb.
638*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
639*9880d681SAndroid Build Coastguard Workerdef V4_SA1_zxtb: SUBInst <
640*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
641*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs),
642*9880d681SAndroid Build Coastguard Worker  "$Rd = and($Rs, #255)"> {
643*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
644*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
645*9880d681SAndroid Build Coastguard Worker
646*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b10111;
647*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
648*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
649*9880d681SAndroid Build Coastguard Worker  }
650*9880d681SAndroid Build Coastguard Worker
651*9880d681SAndroid Build Coastguard Worker// SA1_addsp: Add.
652*9880d681SAndroid Build Coastguard Workerlet Uses = [R29], isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
653*9880d681SAndroid Build Coastguard Workerdef V4_SA1_addsp: SUBInst <
654*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
655*9880d681SAndroid Build Coastguard Worker  (ins u6_2Imm:$u6_2),
656*9880d681SAndroid Build Coastguard Worker  "$Rd = add(r29, #$u6_2)"> {
657*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
658*9880d681SAndroid Build Coastguard Worker    bits<8> u6_2;
659*9880d681SAndroid Build Coastguard Worker
660*9880d681SAndroid Build Coastguard Worker    let Inst{12-10} = 0b011;
661*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
662*9880d681SAndroid Build Coastguard Worker    let Inst{9-4} = u6_2{7-2};
663*9880d681SAndroid Build Coastguard Worker  }
664*9880d681SAndroid Build Coastguard Worker
665*9880d681SAndroid Build Coastguard Worker// SL2_loadri_sp: Load word.
666*9880d681SAndroid Build Coastguard Workerlet Uses = [R29], isCodeGenOnly = 1, mayLoad = 1, accessSize = WordAccess, hasNewValue = 1, opNewValue = 0 in
667*9880d681SAndroid Build Coastguard Workerdef V4_SL2_loadri_sp: SUBInst <
668*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
669*9880d681SAndroid Build Coastguard Worker  (ins u5_2Imm:$u5_2),
670*9880d681SAndroid Build Coastguard Worker  "$Rd = memw(r29 + #$u5_2)"> {
671*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
672*9880d681SAndroid Build Coastguard Worker    bits<7> u5_2;
673*9880d681SAndroid Build Coastguard Worker
674*9880d681SAndroid Build Coastguard Worker    let Inst{12-9} = 0b1110;
675*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
676*9880d681SAndroid Build Coastguard Worker    let Inst{8-4} = u5_2{6-2};
677*9880d681SAndroid Build Coastguard Worker  }
678*9880d681SAndroid Build Coastguard Worker
679*9880d681SAndroid Build Coastguard Worker// SS1_storeb_io: Store byte.
680*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, mayStore = 1, accessSize = ByteAccess in
681*9880d681SAndroid Build Coastguard Workerdef V4_SS1_storeb_io: SUBInst <
682*9880d681SAndroid Build Coastguard Worker  (outs ),
683*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, u4_0Imm:$u4_0, IntRegs:$Rt),
684*9880d681SAndroid Build Coastguard Worker  "memb($Rs + #$u4_0) = $Rt"> {
685*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
686*9880d681SAndroid Build Coastguard Worker    bits<4> u4_0;
687*9880d681SAndroid Build Coastguard Worker    bits<4> Rt;
688*9880d681SAndroid Build Coastguard Worker
689*9880d681SAndroid Build Coastguard Worker    let Inst{12} = 0b1;
690*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
691*9880d681SAndroid Build Coastguard Worker    let Inst{11-8} = u4_0;
692*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rt;
693*9880d681SAndroid Build Coastguard Worker  }
694*9880d681SAndroid Build Coastguard Worker
695*9880d681SAndroid Build Coastguard Worker// SL2_return_tnew: Deallocate stack frame and return.
696*9880d681SAndroid Build Coastguard Workerlet Defs = [PC, R31, R29, R30], Uses = [R30, P0], isCodeGenOnly = 1, isPredicated = 1, isPredicatedNew = 1, mayLoad = 1, accessSize = DoubleWordAccess, isBranch = 1, isIndirectBranch = 1 in
697*9880d681SAndroid Build Coastguard Workerdef V4_SL2_return_tnew: SUBInst <
698*9880d681SAndroid Build Coastguard Worker  (outs ),
699*9880d681SAndroid Build Coastguard Worker  (ins ),
700*9880d681SAndroid Build Coastguard Worker  "if (p0.new) dealloc_return:nt"> {
701*9880d681SAndroid Build Coastguard Worker    let Inst{12-6} = 0b1111101;
702*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = 0b110;
703*9880d681SAndroid Build Coastguard Worker  }
704*9880d681SAndroid Build Coastguard Worker
705*9880d681SAndroid Build Coastguard Worker// SL2_return_fnew: Deallocate stack frame and return.
706*9880d681SAndroid Build Coastguard Workerlet Defs = [PC, R31, R29, R30], Uses = [R30, P0], isCodeGenOnly = 1, isPredicated = 1, isPredicatedFalse = 1, isPredicatedNew = 1, mayLoad = 1, accessSize = DoubleWordAccess, isBranch = 1, isIndirectBranch = 1 in
707*9880d681SAndroid Build Coastguard Workerdef V4_SL2_return_fnew: SUBInst <
708*9880d681SAndroid Build Coastguard Worker  (outs ),
709*9880d681SAndroid Build Coastguard Worker  (ins ),
710*9880d681SAndroid Build Coastguard Worker  "if (!p0.new) dealloc_return:nt"> {
711*9880d681SAndroid Build Coastguard Worker    let Inst{12-6} = 0b1111101;
712*9880d681SAndroid Build Coastguard Worker    let Inst{2-0} = 0b111;
713*9880d681SAndroid Build Coastguard Worker  }
714*9880d681SAndroid Build Coastguard Worker
715*9880d681SAndroid Build Coastguard Worker// SA1_zxth: Zxth.
716*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
717*9880d681SAndroid Build Coastguard Workerdef V4_SA1_zxth: SUBInst <
718*9880d681SAndroid Build Coastguard Worker  (outs IntRegs:$Rd),
719*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs),
720*9880d681SAndroid Build Coastguard Worker  "$Rd = zxth($Rs)"> {
721*9880d681SAndroid Build Coastguard Worker    bits<4> Rd;
722*9880d681SAndroid Build Coastguard Worker    bits<4> Rs;
723*9880d681SAndroid Build Coastguard Worker
724*9880d681SAndroid Build Coastguard Worker    let Inst{12-8} = 0b10110;
725*9880d681SAndroid Build Coastguard Worker    let Inst{3-0} = Rd;
726*9880d681SAndroid Build Coastguard Worker    let Inst{7-4} = Rs;
727*9880d681SAndroid Build Coastguard Worker  }
728*9880d681SAndroid Build Coastguard Worker
729