xref: /aosp_15_r20/external/llvm/lib/Target/Hexagon/HexagonInstrInfoV3.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//=- HexagonInstrInfoV3.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 V3 instructions in TableGen format.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdef callv3 : SDNode<"HexagonISD::CALLv3", SDT_SPCall,
15*9880d681SAndroid Build Coastguard Worker           [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue, SDNPVariadic]>;
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdef callv3nr : SDNode<"HexagonISD::CALLv3nr", SDT_SPCall,
18*9880d681SAndroid Build Coastguard Worker           [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue, SDNPVariadic]>;
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
21*9880d681SAndroid Build Coastguard Worker// J +
22*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
23*9880d681SAndroid Build Coastguard Worker// Call subroutine.
24*9880d681SAndroid Build Coastguard Workerlet isCall = 1, hasSideEffects = 1, isPredicable = 1,
25*9880d681SAndroid Build Coastguard Worker    isExtended = 0, isExtendable = 1, opExtendable = 0,
26*9880d681SAndroid Build Coastguard Worker    isExtentSigned = 1, opExtentBits = 24, opExtentAlign = 2 in
27*9880d681SAndroid Build Coastguard Workerclass T_Call<bit CSR, string ExtStr>
28*9880d681SAndroid Build Coastguard Worker  : JInst<(outs), (ins calltarget:$dst),
29*9880d681SAndroid Build Coastguard Worker      "call " # ExtStr # "$dst", [], "", J_tc_2early_SLOT23> {
30*9880d681SAndroid Build Coastguard Worker  let BaseOpcode = "call";
31*9880d681SAndroid Build Coastguard Worker  bits<24> dst;
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker  let Defs = !if (CSR, VolatileV3.Regs, []);
34*9880d681SAndroid Build Coastguard Worker  let IClass = 0b0101;
35*9880d681SAndroid Build Coastguard Worker  let Inst{27-25} = 0b101;
36*9880d681SAndroid Build Coastguard Worker  let Inst{24-16,13-1} = dst{23-2};
37*9880d681SAndroid Build Coastguard Worker  let Inst{0} = 0b0;
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerlet isCall = 1, hasSideEffects = 1, isPredicated = 1,
41*9880d681SAndroid Build Coastguard Worker    isExtended = 0, isExtendable = 1, opExtendable = 1,
42*9880d681SAndroid Build Coastguard Worker    isExtentSigned = 1, opExtentBits = 17, opExtentAlign = 2 in
43*9880d681SAndroid Build Coastguard Workerclass T_CallPred<bit CSR, bit IfTrue, string ExtStr>
44*9880d681SAndroid Build Coastguard Worker  : JInst<(outs), (ins PredRegs:$Pu, calltarget:$dst),
45*9880d681SAndroid Build Coastguard Worker      CondStr<"$Pu", IfTrue, 0>.S # "call " # ExtStr # "$dst",
46*9880d681SAndroid Build Coastguard Worker      [], "", J_tc_2early_SLOT23> {
47*9880d681SAndroid Build Coastguard Worker  let BaseOpcode = "call";
48*9880d681SAndroid Build Coastguard Worker  let isPredicatedFalse = !if(IfTrue,0,1);
49*9880d681SAndroid Build Coastguard Worker  bits<2> Pu;
50*9880d681SAndroid Build Coastguard Worker  bits<17> dst;
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker  let Defs = !if (CSR, VolatileV3.Regs, []);
53*9880d681SAndroid Build Coastguard Worker  let IClass = 0b0101;
54*9880d681SAndroid Build Coastguard Worker  let Inst{27-24} = 0b1101;
55*9880d681SAndroid Build Coastguard Worker  let Inst{23-22,20-16,13,7-1} = dst{16-2};
56*9880d681SAndroid Build Coastguard Worker  let Inst{21} = !if(IfTrue,0,1);
57*9880d681SAndroid Build Coastguard Worker  let Inst{11} = 0b0;
58*9880d681SAndroid Build Coastguard Worker  let Inst{9-8} = Pu;
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workermulticlass T_Calls<bit CSR, string ExtStr> {
62*9880d681SAndroid Build Coastguard Worker  def NAME : T_Call<CSR, ExtStr>;
63*9880d681SAndroid Build Coastguard Worker  def t    : T_CallPred<CSR, 1, ExtStr>;
64*9880d681SAndroid Build Coastguard Worker  def f    : T_CallPred<CSR, 0, ExtStr>;
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdefm J2_call: T_Calls<1, "">, PredRel;
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, isCall = 1, hasSideEffects = 1, Defs = VolatileV3.Regs in
70*9880d681SAndroid Build Coastguard Workerdef CALLv3nr :  T_Call<1, "">, PredRel;
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, isCall = 1, hasSideEffects = 1, Defs = [PC, R31, R6, R7, P0] in
73*9880d681SAndroid Build Coastguard Workerdef CALLstk :  T_Call<0, "">, PredRel;
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
76*9880d681SAndroid Build Coastguard Worker// J -
77*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
81*9880d681SAndroid Build Coastguard Worker// JR +
82*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
83*9880d681SAndroid Build Coastguard Worker// Call subroutine from register.
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, Defs = VolatileV3.Regs in {
86*9880d681SAndroid Build Coastguard Worker  def CALLRv3nr : JUMPR_MISC_CALLR<0, 1>; // Call, no return.
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
90*9880d681SAndroid Build Coastguard Worker// JR -
91*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
94*9880d681SAndroid Build Coastguard Worker// ALU64/ALU +
95*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF], Itinerary = ALU64_tc_2_SLOT23 in
98*9880d681SAndroid Build Coastguard Workerdef A2_addpsat : T_ALU64_arith<"add", 0b011, 0b101, 1, 0, 1>;
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerclass T_ALU64_addsp_hl<string suffix, bits<3> MinOp>
101*9880d681SAndroid Build Coastguard Worker  : T_ALU64_rr<"add", suffix, 0b0011, 0b011, MinOp, 0, 0, "">;
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdef A2_addspl : T_ALU64_addsp_hl<":raw:lo", 0b110>;
104*9880d681SAndroid Build Coastguard Workerdef A2_addsph : T_ALU64_addsp_hl<":raw:hi", 0b111>;
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, isAsmParserOnly = 1 in
107*9880d681SAndroid Build Coastguard Workerdef A2_addsp : ALU64_rr<(outs DoubleRegs:$Rd),
108*9880d681SAndroid Build Coastguard Worker  (ins IntRegs:$Rs, DoubleRegs:$Rt), "$Rd = add($Rs, $Rt)",
109*9880d681SAndroid Build Coastguard Worker  [(set (i64 DoubleRegs:$Rd), (i64 (add (i64 (sext (i32 IntRegs:$Rs))),
110*9880d681SAndroid Build Coastguard Worker                                        (i64 DoubleRegs:$Rt))))],
111*9880d681SAndroid Build Coastguard Worker  "", ALU64_tc_1_SLOT23>;
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in
115*9880d681SAndroid Build Coastguard Workerclass T_XTYPE_MIN_MAX_P<bit isMax, bit isUnsigned>
116*9880d681SAndroid Build Coastguard Worker  : ALU64Inst<(outs DoubleRegs:$Rd), (ins DoubleRegs:$Rt, DoubleRegs:$Rs),
117*9880d681SAndroid Build Coastguard Worker  "$Rd = "#!if(isMax,"max","min")#!if(isUnsigned,"u","")
118*9880d681SAndroid Build Coastguard Worker          #"($Rt, $Rs)", [], "", ALU64_tc_2_SLOT23> {
119*9880d681SAndroid Build Coastguard Worker  bits<5> Rd;
120*9880d681SAndroid Build Coastguard Worker  bits<5> Rs;
121*9880d681SAndroid Build Coastguard Worker  bits<5> Rt;
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker  let IClass = 0b1101;
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker  let Inst{27-23} = 0b00111;
126*9880d681SAndroid Build Coastguard Worker  let Inst{22-21} = !if(isMax, 0b10, 0b01);
127*9880d681SAndroid Build Coastguard Worker  let Inst{20-16} = !if(isMax, Rt, Rs);
128*9880d681SAndroid Build Coastguard Worker  let Inst{12-8} = !if(isMax, Rs, Rt);
129*9880d681SAndroid Build Coastguard Worker  let Inst{7} = 0b1;
130*9880d681SAndroid Build Coastguard Worker  let Inst{6} = !if(isMax, 0b0, 0b1);
131*9880d681SAndroid Build Coastguard Worker  let Inst{5} = isUnsigned;
132*9880d681SAndroid Build Coastguard Worker  let Inst{4-0} = Rd;
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdef A2_minp  : T_XTYPE_MIN_MAX_P<0, 0>;
136*9880d681SAndroid Build Coastguard Workerdef A2_minup : T_XTYPE_MIN_MAX_P<0, 1>;
137*9880d681SAndroid Build Coastguard Workerdef A2_maxp  : T_XTYPE_MIN_MAX_P<1, 0>;
138*9880d681SAndroid Build Coastguard Workerdef A2_maxup : T_XTYPE_MIN_MAX_P<1, 1>;
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workermulticlass MinMax_pats_p<PatFrag Op, InstHexagon Inst, InstHexagon SwapInst> {
141*9880d681SAndroid Build Coastguard Worker  defm: T_MinMax_pats<Op, DoubleRegs, i64, Inst, SwapInst>;
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 200 in {
145*9880d681SAndroid Build Coastguard Worker  defm: MinMax_pats_p<setge,  A2_maxp,  A2_minp>;
146*9880d681SAndroid Build Coastguard Worker  defm: MinMax_pats_p<setgt,  A2_maxp,  A2_minp>;
147*9880d681SAndroid Build Coastguard Worker  defm: MinMax_pats_p<setle,  A2_minp,  A2_maxp>;
148*9880d681SAndroid Build Coastguard Worker  defm: MinMax_pats_p<setlt,  A2_minp,  A2_maxp>;
149*9880d681SAndroid Build Coastguard Worker  defm: MinMax_pats_p<setuge, A2_maxup, A2_minup>;
150*9880d681SAndroid Build Coastguard Worker  defm: MinMax_pats_p<setugt, A2_maxup, A2_minup>;
151*9880d681SAndroid Build Coastguard Worker  defm: MinMax_pats_p<setule, A2_minup, A2_maxup>;
152*9880d681SAndroid Build Coastguard Worker  defm: MinMax_pats_p<setult, A2_minup, A2_maxup>;
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
156*9880d681SAndroid Build Coastguard Worker// ALU64/ALU -
157*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker//def : Pat <(brcond (i1 (seteq (i32 IntRegs:$src1), 0)), bb:$offset),
163*9880d681SAndroid Build Coastguard Worker//      (JMP_RegEzt (i32 IntRegs:$src1), bb:$offset)>;
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker//def : Pat <(brcond (i1 (setne (i32 IntRegs:$src1), 0)), bb:$offset),
166*9880d681SAndroid Build Coastguard Worker//      (JMP_RegNzt (i32 IntRegs:$src1), bb:$offset)>;
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker//def : Pat <(brcond (i1 (setle (i32 IntRegs:$src1), 0)), bb:$offset),
169*9880d681SAndroid Build Coastguard Worker//      (JMP_RegLezt (i32 IntRegs:$src1), bb:$offset)>;
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker//def : Pat <(brcond (i1 (setge (i32 IntRegs:$src1), 0)), bb:$offset),
172*9880d681SAndroid Build Coastguard Worker//      (JMP_RegGezt (i32 IntRegs:$src1), bb:$offset)>;
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker//def : Pat <(brcond (i1 (setgt (i32 IntRegs:$src1), -1)), bb:$offset),
175*9880d681SAndroid Build Coastguard Worker//      (JMP_RegGezt (i32 IntRegs:$src1), bb:$offset)>;
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker// Map call instruction
178*9880d681SAndroid Build Coastguard Workerdef : Pat<(callv3 (i32 IntRegs:$dst)),
179*9880d681SAndroid Build Coastguard Worker      (J2_callr (i32 IntRegs:$dst))>;
180*9880d681SAndroid Build Coastguard Workerdef : Pat<(callv3 tglobaladdr:$dst),
181*9880d681SAndroid Build Coastguard Worker      (J2_call tglobaladdr:$dst)>;
182*9880d681SAndroid Build Coastguard Workerdef : Pat<(callv3 texternalsym:$dst),
183*9880d681SAndroid Build Coastguard Worker      (J2_call texternalsym:$dst)>;
184*9880d681SAndroid Build Coastguard Workerdef : Pat<(callv3 tglobaltlsaddr:$dst),
185*9880d681SAndroid Build Coastguard Worker      (J2_call tglobaltlsaddr:$dst)>;
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Workerdef : Pat<(callv3nr (i32 IntRegs:$dst)),
188*9880d681SAndroid Build Coastguard Worker      (CALLRv3nr (i32 IntRegs:$dst))>;
189*9880d681SAndroid Build Coastguard Workerdef : Pat<(callv3nr tglobaladdr:$dst),
190*9880d681SAndroid Build Coastguard Worker      (CALLv3nr tglobaladdr:$dst)>;
191*9880d681SAndroid Build Coastguard Workerdef : Pat<(callv3nr texternalsym:$dst),
192*9880d681SAndroid Build Coastguard Worker      (CALLv3nr texternalsym:$dst)>;
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
195*9880d681SAndroid Build Coastguard Worker// :raw form of vrcmpys:hi/lo insns
196*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
197*9880d681SAndroid Build Coastguard Worker// Vector reduce complex multiply by scalar.
198*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF], hasSideEffects = 0 in
199*9880d681SAndroid Build Coastguard Workerclass T_vrcmpRaw<string HiLo, bits<3>MajOp>:
200*9880d681SAndroid Build Coastguard Worker  MInst<(outs DoubleRegs:$Rdd),
201*9880d681SAndroid Build Coastguard Worker         (ins DoubleRegs:$Rss, DoubleRegs:$Rtt),
202*9880d681SAndroid Build Coastguard Worker         "$Rdd = vrcmpys($Rss, $Rtt):<<1:sat:raw:"#HiLo, []> {
203*9880d681SAndroid Build Coastguard Worker    bits<5> Rdd;
204*9880d681SAndroid Build Coastguard Worker    bits<5> Rss;
205*9880d681SAndroid Build Coastguard Worker    bits<5> Rtt;
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker    let IClass = 0b1110;
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker    let Inst{27-24} = 0b1000;
210*9880d681SAndroid Build Coastguard Worker    let Inst{23-21} = MajOp;
211*9880d681SAndroid Build Coastguard Worker    let Inst{20-16} = Rss;
212*9880d681SAndroid Build Coastguard Worker    let Inst{12-8}  = Rtt;
213*9880d681SAndroid Build Coastguard Worker    let Inst{7-5}   = 0b100;
214*9880d681SAndroid Build Coastguard Worker    let Inst{4-0}   = Rdd;
215*9880d681SAndroid Build Coastguard Worker}
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpys_s1_h: T_vrcmpRaw<"hi", 0b101>;
218*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpys_s1_l: T_vrcmpRaw<"lo", 0b111>;
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker// Assembler mapped to M2_vrcmpys_s1_h or M2_vrcmpys_s1_l
221*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, isAsmParserOnly = 1 in
222*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpys_s1
223*9880d681SAndroid Build Coastguard Worker : MInst<(outs DoubleRegs:$Rdd), (ins DoubleRegs:$Rss, IntRegs:$Rt),
224*9880d681SAndroid Build Coastguard Worker "$Rdd=vrcmpys($Rss,$Rt):<<1:sat">;
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Worker// Vector reduce complex multiply by scalar with accumulation.
227*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF], hasSideEffects = 0 in
228*9880d681SAndroid Build Coastguard Workerclass T_vrcmpys_acc<string HiLo, bits<3>MajOp>:
229*9880d681SAndroid Build Coastguard Worker  MInst <(outs DoubleRegs:$Rxx),
230*9880d681SAndroid Build Coastguard Worker         (ins DoubleRegs:$_src_, DoubleRegs:$Rss, DoubleRegs:$Rtt),
231*9880d681SAndroid Build Coastguard Worker  "$Rxx += vrcmpys($Rss, $Rtt):<<1:sat:raw:"#HiLo, [],
232*9880d681SAndroid Build Coastguard Worker  "$Rxx = $_src_"> {
233*9880d681SAndroid Build Coastguard Worker    bits<5> Rxx;
234*9880d681SAndroid Build Coastguard Worker    bits<5> Rss;
235*9880d681SAndroid Build Coastguard Worker    bits<5> Rtt;
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker    let IClass = 0b1110;
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker    let Inst{27-24} = 0b1010;
240*9880d681SAndroid Build Coastguard Worker    let Inst{23-21} = MajOp;
241*9880d681SAndroid Build Coastguard Worker    let Inst{20-16} = Rss;
242*9880d681SAndroid Build Coastguard Worker    let Inst{12-8}  = Rtt;
243*9880d681SAndroid Build Coastguard Worker    let Inst{7-5}   = 0b100;
244*9880d681SAndroid Build Coastguard Worker    let Inst{4-0}   = Rxx;
245*9880d681SAndroid Build Coastguard Worker  }
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpys_acc_s1_h: T_vrcmpys_acc<"hi", 0b101>;
248*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpys_acc_s1_l: T_vrcmpys_acc<"lo", 0b111>;
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker// Assembler mapped to M2_vrcmpys_acc_s1_h or M2_vrcmpys_acc_s1_l
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Workerlet isAsmParserOnly = 1 in
253*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpys_acc_s1
254*9880d681SAndroid Build Coastguard Worker  : MInst <(outs DoubleRegs:$dst),
255*9880d681SAndroid Build Coastguard Worker           (ins DoubleRegs:$dst2, DoubleRegs:$src1, IntRegs:$src2),
256*9880d681SAndroid Build Coastguard Worker           "$dst += vrcmpys($src1, $src2):<<1:sat", [],
257*9880d681SAndroid Build Coastguard Worker           "$dst2 = $dst">;
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpys_s1rp_h : T_MType_vrcmpy <"vrcmpys", 0b101, 0b110, 1>;
260*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpys_s1rp_l : T_MType_vrcmpy <"vrcmpys", 0b101, 0b111, 0>;
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker// Assembler mapped to M2_vrcmpys_s1rp_h or M2_vrcmpys_s1rp_l
263*9880d681SAndroid Build Coastguard Workerlet isAsmParserOnly = 1 in
264*9880d681SAndroid Build Coastguard Workerdef M2_vrcmpys_s1rp
265*9880d681SAndroid Build Coastguard Worker  : MInst <(outs IntRegs:$Rd), (ins DoubleRegs:$Rss, IntRegs:$Rt),
266*9880d681SAndroid Build Coastguard Worker  "$Rd=vrcmpys($Rss,$Rt):<<1:rnd:sat">;
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker// S2_cabacdecbin: Cabac decode bin.
270*9880d681SAndroid Build Coastguard Workerlet Defs = [P0], isPredicateLate = 1, Itinerary = S_3op_tc_1_SLOT23 in
271*9880d681SAndroid Build Coastguard Workerdef S2_cabacdecbin : T_S3op_64 < "decbin", 0b11, 0b110, 0>;
272