xref: /aosp_15_r20/external/llvm/lib/Target/Hexagon/HexagonInstrInfoVector.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===- HexagonInstrInfoVector.td - Hexagon Vector Patterns -*- 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 Vector instructions in TableGen format.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdef V2I1:  PatLeaf<(v2i1  PredRegs:$R)>;
15*9880d681SAndroid Build Coastguard Workerdef V4I1:  PatLeaf<(v4i1  PredRegs:$R)>;
16*9880d681SAndroid Build Coastguard Workerdef V8I1:  PatLeaf<(v8i1  PredRegs:$R)>;
17*9880d681SAndroid Build Coastguard Workerdef V4I8:  PatLeaf<(v4i8  IntRegs:$R)>;
18*9880d681SAndroid Build Coastguard Workerdef V2I16: PatLeaf<(v2i16 IntRegs:$R)>;
19*9880d681SAndroid Build Coastguard Workerdef V8I8:  PatLeaf<(v8i8  DoubleRegs:$R)>;
20*9880d681SAndroid Build Coastguard Workerdef V4I16: PatLeaf<(v4i16 DoubleRegs:$R)>;
21*9880d681SAndroid Build Coastguard Workerdef V2I32: PatLeaf<(v2i32 DoubleRegs:$R)>;
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workermulticlass bitconvert_32<ValueType a, ValueType b> {
25*9880d681SAndroid Build Coastguard Worker  def : Pat <(b (bitconvert (a IntRegs:$src))),
26*9880d681SAndroid Build Coastguard Worker             (b IntRegs:$src)>;
27*9880d681SAndroid Build Coastguard Worker  def : Pat <(a (bitconvert (b IntRegs:$src))),
28*9880d681SAndroid Build Coastguard Worker             (a IntRegs:$src)>;
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workermulticlass bitconvert_64<ValueType a, ValueType b> {
32*9880d681SAndroid Build Coastguard Worker  def : Pat <(b (bitconvert (a DoubleRegs:$src))),
33*9880d681SAndroid Build Coastguard Worker             (b DoubleRegs:$src)>;
34*9880d681SAndroid Build Coastguard Worker  def : Pat <(a (bitconvert (b DoubleRegs:$src))),
35*9880d681SAndroid Build Coastguard Worker             (a DoubleRegs:$src)>;
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker// Bit convert vector types to integers.
39*9880d681SAndroid Build Coastguard Workerdefm : bitconvert_32<v4i8,  i32>;
40*9880d681SAndroid Build Coastguard Workerdefm : bitconvert_32<v2i16, i32>;
41*9880d681SAndroid Build Coastguard Workerdefm : bitconvert_64<v8i8,  i64>;
42*9880d681SAndroid Build Coastguard Workerdefm : bitconvert_64<v4i16, i64>;
43*9880d681SAndroid Build Coastguard Workerdefm : bitconvert_64<v2i32, i64>;
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker// Vector shift support. Vector shifting in Hexagon is rather different
46*9880d681SAndroid Build Coastguard Worker// from internal representation of LLVM.
47*9880d681SAndroid Build Coastguard Worker// LLVM assumes all shifts (in vector case) will have the form
48*9880d681SAndroid Build Coastguard Worker// <VT> = SHL/SRA/SRL <VT> by <VT>
49*9880d681SAndroid Build Coastguard Worker// while Hexagon has the following format:
50*9880d681SAndroid Build Coastguard Worker// <VT> = SHL/SRA/SRL <VT> by <IT/i32>
51*9880d681SAndroid Build Coastguard Worker// As a result, special care is needed to guarantee correctness and
52*9880d681SAndroid Build Coastguard Worker// performance.
53*9880d681SAndroid Build Coastguard Workerclass vshift_v4i16<SDNode Op, string Str, bits<3>MajOp, bits<3>MinOp>
54*9880d681SAndroid Build Coastguard Worker  : S_2OpInstImm<Str, MajOp, MinOp, u4Imm,
55*9880d681SAndroid Build Coastguard Worker      [(set (v4i16 DoubleRegs:$dst),
56*9880d681SAndroid Build Coastguard Worker            (Op (v4i16 DoubleRegs:$src1), u4ImmPred:$src2))]> {
57*9880d681SAndroid Build Coastguard Worker  bits<4> src2;
58*9880d681SAndroid Build Coastguard Worker  let Inst{11-8} = src2;
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerclass vshift_v2i32<SDNode Op, string Str, bits<3>MajOp, bits<3>MinOp>
62*9880d681SAndroid Build Coastguard Worker  : S_2OpInstImm<Str, MajOp, MinOp, u5Imm,
63*9880d681SAndroid Build Coastguard Worker      [(set (v2i32 DoubleRegs:$dst),
64*9880d681SAndroid Build Coastguard Worker            (Op (v2i32 DoubleRegs:$src1), u5ImmPred:$src2))]> {
65*9880d681SAndroid Build Coastguard Worker  bits<5> src2;
66*9880d681SAndroid Build Coastguard Worker  let Inst{12-8} = src2;
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (add (v2i16 IntRegs:$src1), (v2i16 IntRegs:$src2))),
70*9880d681SAndroid Build Coastguard Worker          (A2_svaddh IntRegs:$src1, IntRegs:$src2)>;
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i16 (sub (v2i16 IntRegs:$src1), (v2i16 IntRegs:$src2))),
73*9880d681SAndroid Build Coastguard Worker          (A2_svsubh IntRegs:$src1, IntRegs:$src2)>;
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdef S2_asr_i_vw : vshift_v2i32<sra, "vasrw", 0b010, 0b000>;
76*9880d681SAndroid Build Coastguard Workerdef S2_lsr_i_vw : vshift_v2i32<srl, "vlsrw", 0b010, 0b001>;
77*9880d681SAndroid Build Coastguard Workerdef S2_asl_i_vw : vshift_v2i32<shl, "vaslw", 0b010, 0b010>;
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdef S2_asr_i_vh : vshift_v4i16<sra, "vasrh", 0b100, 0b000>;
80*9880d681SAndroid Build Coastguard Workerdef S2_lsr_i_vh : vshift_v4i16<srl, "vlsrh", 0b100, 0b001>;
81*9880d681SAndroid Build Coastguard Workerdef S2_asl_i_vh : vshift_v4i16<shl, "vaslh", 0b100, 0b010>;
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workerdef HexagonVSPLATB: SDNode<"HexagonISD::VSPLATB", SDTUnaryOp>;
85*9880d681SAndroid Build Coastguard Workerdef HexagonVSPLATH: SDNode<"HexagonISD::VSPLATH", SDTUnaryOp>;
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker// Replicate the low 8-bits from 32-bits input register into each of the
88*9880d681SAndroid Build Coastguard Worker// four bytes of 32-bits destination register.
89*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8  (HexagonVSPLATB I32:$Rs)), (S2_vsplatrb I32:$Rs)>;
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker// Replicate the low 16-bits from 32-bits input register into each of the
92*9880d681SAndroid Build Coastguard Worker// four halfwords of 64-bits destination register.
93*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (HexagonVSPLATH I32:$Rs)), (S2_vsplatrh I32:$Rs)>;
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerclass VArith_pat <InstHexagon MI, SDNode Op, PatFrag Type>
97*9880d681SAndroid Build Coastguard Worker  : Pat <(Op Type:$Rss, Type:$Rtt),
98*9880d681SAndroid Build Coastguard Worker         (MI Type:$Rss, Type:$Rtt)>;
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_vaddub, add, V8I8>;
101*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_vaddh,  add, V4I16>;
102*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_vaddw,  add, V2I32>;
103*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_vsubub, sub, V8I8>;
104*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_vsubh,  sub, V4I16>;
105*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_vsubw,  sub, V2I32>;
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_and,    and, V2I16>;
108*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_xor,    xor, V2I16>;
109*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_or,     or,  V2I16>;
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_andp,   and, V8I8>;
112*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_andp,   and, V4I16>;
113*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_andp,   and, V2I32>;
114*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_orp,    or,  V8I8>;
115*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_orp,    or,  V4I16>;
116*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_orp,    or,  V2I32>;
117*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_xorp,   xor, V8I8>;
118*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_xorp,   xor, V4I16>;
119*9880d681SAndroid Build Coastguard Workerdef: VArith_pat <A2_xorp,   xor, V2I32>;
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (sra V2I32:$b, (i64 (HexagonCOMBINE (i32 u5ImmPred:$c),
122*9880d681SAndroid Build Coastguard Worker                                                    (i32 u5ImmPred:$c))))),
123*9880d681SAndroid Build Coastguard Worker         (S2_asr_i_vw V2I32:$b, imm:$c)>;
124*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (srl V2I32:$b, (i64 (HexagonCOMBINE (i32 u5ImmPred:$c),
125*9880d681SAndroid Build Coastguard Worker                                                    (i32 u5ImmPred:$c))))),
126*9880d681SAndroid Build Coastguard Worker         (S2_lsr_i_vw V2I32:$b, imm:$c)>;
127*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (shl V2I32:$b, (i64 (HexagonCOMBINE (i32 u5ImmPred:$c),
128*9880d681SAndroid Build Coastguard Worker                                                    (i32 u5ImmPred:$c))))),
129*9880d681SAndroid Build Coastguard Worker         (S2_asl_i_vw V2I32:$b, imm:$c)>;
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (sra V4I16:$b, (v4i16 (HexagonVSPLATH (i32 (u4ImmPred:$c)))))),
132*9880d681SAndroid Build Coastguard Worker         (S2_asr_i_vh V4I16:$b, imm:$c)>;
133*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (srl V4I16:$b, (v4i16 (HexagonVSPLATH (i32 (u4ImmPred:$c)))))),
134*9880d681SAndroid Build Coastguard Worker         (S2_lsr_i_vh V4I16:$b, imm:$c)>;
135*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (shl V4I16:$b, (v4i16 (HexagonVSPLATH (i32 (u4ImmPred:$c)))))),
136*9880d681SAndroid Build Coastguard Worker         (S2_asl_i_vh V4I16:$b, imm:$c)>;
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdef SDTHexagon_v2i32_v2i32_i32 : SDTypeProfile<1, 2,
140*9880d681SAndroid Build Coastguard Worker  [SDTCisSameAs<0, 1>, SDTCisVT<0, v2i32>, SDTCisInt<2>]>;
141*9880d681SAndroid Build Coastguard Workerdef SDTHexagon_v4i16_v4i16_i32 : SDTypeProfile<1, 2,
142*9880d681SAndroid Build Coastguard Worker  [SDTCisSameAs<0, 1>, SDTCisVT<0, v4i16>, SDTCisInt<2>]>;
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerdef HexagonVSRAW: SDNode<"HexagonISD::VSRAW", SDTHexagon_v2i32_v2i32_i32>;
145*9880d681SAndroid Build Coastguard Workerdef HexagonVSRAH: SDNode<"HexagonISD::VSRAH", SDTHexagon_v4i16_v4i16_i32>;
146*9880d681SAndroid Build Coastguard Workerdef HexagonVSRLW: SDNode<"HexagonISD::VSRLW", SDTHexagon_v2i32_v2i32_i32>;
147*9880d681SAndroid Build Coastguard Workerdef HexagonVSRLH: SDNode<"HexagonISD::VSRLH", SDTHexagon_v4i16_v4i16_i32>;
148*9880d681SAndroid Build Coastguard Workerdef HexagonVSHLW: SDNode<"HexagonISD::VSHLW", SDTHexagon_v2i32_v2i32_i32>;
149*9880d681SAndroid Build Coastguard Workerdef HexagonVSHLH: SDNode<"HexagonISD::VSHLH", SDTHexagon_v4i16_v4i16_i32>;
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (HexagonVSRAW V2I32:$Rs, u5ImmPred:$u5)),
152*9880d681SAndroid Build Coastguard Worker         (S2_asr_i_vw V2I32:$Rs, imm:$u5)>;
153*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (HexagonVSRAH V4I16:$Rs, u4ImmPred:$u4)),
154*9880d681SAndroid Build Coastguard Worker         (S2_asr_i_vh V4I16:$Rs, imm:$u4)>;
155*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (HexagonVSRLW V2I32:$Rs, u5ImmPred:$u5)),
156*9880d681SAndroid Build Coastguard Worker         (S2_lsr_i_vw V2I32:$Rs, imm:$u5)>;
157*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (HexagonVSRLH V4I16:$Rs, u4ImmPred:$u4)),
158*9880d681SAndroid Build Coastguard Worker         (S2_lsr_i_vh V4I16:$Rs, imm:$u4)>;
159*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (HexagonVSHLW V2I32:$Rs, u5ImmPred:$u5)),
160*9880d681SAndroid Build Coastguard Worker         (S2_asl_i_vw V2I32:$Rs, imm:$u5)>;
161*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (HexagonVSHLH V4I16:$Rs, u4ImmPred:$u4)),
162*9880d681SAndroid Build Coastguard Worker         (S2_asl_i_vh V4I16:$Rs, imm:$u4)>;
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker// Vector shift words by register
165*9880d681SAndroid Build Coastguard Workerdef S2_asr_r_vw : T_S3op_shiftVect < "vasrw", 0b00, 0b00>;
166*9880d681SAndroid Build Coastguard Workerdef S2_lsr_r_vw : T_S3op_shiftVect < "vlsrw", 0b00, 0b01>;
167*9880d681SAndroid Build Coastguard Workerdef S2_asl_r_vw : T_S3op_shiftVect < "vaslw", 0b00, 0b10>;
168*9880d681SAndroid Build Coastguard Workerdef S2_lsl_r_vw : T_S3op_shiftVect < "vlslw", 0b00, 0b11>;
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker// Vector shift halfwords by register
171*9880d681SAndroid Build Coastguard Workerdef S2_asr_r_vh : T_S3op_shiftVect < "vasrh", 0b01, 0b00>;
172*9880d681SAndroid Build Coastguard Workerdef S2_lsr_r_vh : T_S3op_shiftVect < "vlsrh", 0b01, 0b01>;
173*9880d681SAndroid Build Coastguard Workerdef S2_asl_r_vh : T_S3op_shiftVect < "vaslh", 0b01, 0b10>;
174*9880d681SAndroid Build Coastguard Workerdef S2_lsl_r_vh : T_S3op_shiftVect < "vlslh", 0b01, 0b11>;
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerclass vshift_rr_pat<InstHexagon MI, SDNode Op, PatFrag Value>
177*9880d681SAndroid Build Coastguard Worker  : Pat <(Op Value:$Rs, I32:$Rt),
178*9880d681SAndroid Build Coastguard Worker         (MI Value:$Rs, I32:$Rt)>;
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Workerdef: vshift_rr_pat <S2_asr_r_vw, HexagonVSRAW, V2I32>;
181*9880d681SAndroid Build Coastguard Workerdef: vshift_rr_pat <S2_asr_r_vh, HexagonVSRAH, V4I16>;
182*9880d681SAndroid Build Coastguard Workerdef: vshift_rr_pat <S2_lsr_r_vw, HexagonVSRLW, V2I32>;
183*9880d681SAndroid Build Coastguard Workerdef: vshift_rr_pat <S2_lsr_r_vh, HexagonVSRLH, V4I16>;
184*9880d681SAndroid Build Coastguard Workerdef: vshift_rr_pat <S2_asl_r_vw, HexagonVSHLW, V2I32>;
185*9880d681SAndroid Build Coastguard Workerdef: vshift_rr_pat <S2_asl_r_vh, HexagonVSHLH, V4I16>;
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerdef SDTHexagonVecCompare_v8i8 : SDTypeProfile<1, 2,
189*9880d681SAndroid Build Coastguard Worker  [SDTCisSameAs<1, 2>, SDTCisVT<0, i1>, SDTCisVT<1, v8i8>]>;
190*9880d681SAndroid Build Coastguard Workerdef SDTHexagonVecCompare_v4i16 : SDTypeProfile<1, 2,
191*9880d681SAndroid Build Coastguard Worker  [SDTCisSameAs<1, 2>, SDTCisVT<0, i1>, SDTCisVT<1, v4i16>]>;
192*9880d681SAndroid Build Coastguard Workerdef SDTHexagonVecCompare_v2i32 : SDTypeProfile<1, 2,
193*9880d681SAndroid Build Coastguard Worker  [SDTCisSameAs<1, 2>, SDTCisVT<0, i1>, SDTCisVT<1, v2i32>]>;
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPBEQ:  SDNode<"HexagonISD::VCMPBEQ",  SDTHexagonVecCompare_v8i8>;
196*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPBGT:  SDNode<"HexagonISD::VCMPBGT",  SDTHexagonVecCompare_v8i8>;
197*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPBGTU: SDNode<"HexagonISD::VCMPBGTU", SDTHexagonVecCompare_v8i8>;
198*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPHEQ:  SDNode<"HexagonISD::VCMPHEQ",  SDTHexagonVecCompare_v4i16>;
199*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPHGT:  SDNode<"HexagonISD::VCMPHGT",  SDTHexagonVecCompare_v4i16>;
200*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPHGTU: SDNode<"HexagonISD::VCMPHGTU", SDTHexagonVecCompare_v4i16>;
201*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPWEQ:  SDNode<"HexagonISD::VCMPWEQ",  SDTHexagonVecCompare_v2i32>;
202*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPWGT:  SDNode<"HexagonISD::VCMPWGT",  SDTHexagonVecCompare_v2i32>;
203*9880d681SAndroid Build Coastguard Workerdef HexagonVCMPWGTU: SDNode<"HexagonISD::VCMPWGTU", SDTHexagonVecCompare_v2i32>;
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Workerclass vcmp_i1_pat<InstHexagon MI, SDNode Op, PatFrag Value>
207*9880d681SAndroid Build Coastguard Worker  : Pat <(i1 (Op Value:$Rs, Value:$Rt)),
208*9880d681SAndroid Build Coastguard Worker         (MI Value:$Rs, Value:$Rt)>;
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmpbeq,  HexagonVCMPBEQ,  V8I8>;
211*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A4_vcmpbgt,  HexagonVCMPBGT,  V8I8>;
212*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmpbgtu, HexagonVCMPBGTU, V8I8>;
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmpheq,  HexagonVCMPHEQ,  V4I16>;
215*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmphgt,  HexagonVCMPHGT,  V4I16>;
216*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmphgtu, HexagonVCMPHGTU, V4I16>;
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmpweq,  HexagonVCMPWEQ,  V2I32>;
219*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmpwgt,  HexagonVCMPWGT,  V2I32>;
220*9880d681SAndroid Build Coastguard Workerdef: vcmp_i1_pat<A2_vcmpwgtu, HexagonVCMPWGTU, V2I32>;
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Workerclass vcmp_vi1_pat<InstHexagon MI, PatFrag Op, PatFrag InVal, ValueType OutTy>
224*9880d681SAndroid Build Coastguard Worker  : Pat <(OutTy (Op InVal:$Rs, InVal:$Rt)),
225*9880d681SAndroid Build Coastguard Worker         (MI InVal:$Rs, InVal:$Rt)>;
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Workerdef: vcmp_vi1_pat<A2_vcmpweq,  seteq,  V2I32, v2i1>;
228*9880d681SAndroid Build Coastguard Workerdef: vcmp_vi1_pat<A2_vcmpwgt,  setgt,  V2I32, v2i1>;
229*9880d681SAndroid Build Coastguard Workerdef: vcmp_vi1_pat<A2_vcmpwgtu, setugt, V2I32, v2i1>;
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Workerdef: vcmp_vi1_pat<A2_vcmpheq,  seteq,  V4I16, v4i1>;
232*9880d681SAndroid Build Coastguard Workerdef: vcmp_vi1_pat<A2_vcmphgt,  setgt,  V4I16, v4i1>;
233*9880d681SAndroid Build Coastguard Workerdef: vcmp_vi1_pat<A2_vcmphgtu, setugt, V4I16, v4i1>;
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Worker// Hexagon doesn't have a vector multiply with C semantics.
237*9880d681SAndroid Build Coastguard Worker// Instead, generate a pseudo instruction that gets expaneded into two
238*9880d681SAndroid Build Coastguard Worker// scalar MPYI instructions.
239*9880d681SAndroid Build Coastguard Worker// This is expanded by ExpandPostRAPseudos.
240*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1 in
241*9880d681SAndroid Build Coastguard Workerdef VMULW : PseudoM<(outs DoubleRegs:$Rd),
242*9880d681SAndroid Build Coastguard Worker      (ins DoubleRegs:$Rs, DoubleRegs:$Rt),
243*9880d681SAndroid Build Coastguard Worker      ".error \"Should never try to emit VMULW\"",
244*9880d681SAndroid Build Coastguard Worker      [(set V2I32:$Rd, (mul V2I32:$Rs, V2I32:$Rt))]>;
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1 in
247*9880d681SAndroid Build Coastguard Workerdef VMULW_ACC : PseudoM<(outs DoubleRegs:$Rd),
248*9880d681SAndroid Build Coastguard Worker      (ins DoubleRegs:$Rx, DoubleRegs:$Rs, DoubleRegs:$Rt),
249*9880d681SAndroid Build Coastguard Worker      ".error \"Should never try to emit VMULW_ACC\"",
250*9880d681SAndroid Build Coastguard Worker      [(set V2I32:$Rd, (add V2I32:$Rx, (mul V2I32:$Rs, V2I32:$Rt)))],
251*9880d681SAndroid Build Coastguard Worker      "$Rd = $Rx">;
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Worker// Adds two v4i8: Hexagon does not have an insn for this one, so we
254*9880d681SAndroid Build Coastguard Worker// use the double add v8i8, and use only the low part of the result.
255*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (add (v4i8 IntRegs:$Rs), (v4i8 IntRegs:$Rt))),
256*9880d681SAndroid Build Coastguard Worker         (LoReg (A2_vaddub (Zext64 $Rs), (Zext64 $Rt)))>;
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker// Subtract two v4i8: Hexagon does not have an insn for this one, so we
259*9880d681SAndroid Build Coastguard Worker// use the double sub v8i8, and use only the low part of the result.
260*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (sub (v4i8 IntRegs:$Rs), (v4i8 IntRegs:$Rt))),
261*9880d681SAndroid Build Coastguard Worker         (LoReg (A2_vsubub (Zext64 $Rs), (Zext64 $Rt)))>;
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Worker//
264*9880d681SAndroid Build Coastguard Worker// No 32 bit vector mux.
265*9880d681SAndroid Build Coastguard Worker//
266*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (select I1:$Pu, V4I8:$Rs, V4I8:$Rt)),
267*9880d681SAndroid Build Coastguard Worker         (LoReg (C2_vmux I1:$Pu, (Zext64 $Rs), (Zext64 $Rt)))>;
268*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i16 (select I1:$Pu, V2I16:$Rs, V2I16:$Rt)),
269*9880d681SAndroid Build Coastguard Worker         (LoReg (C2_vmux I1:$Pu, (Zext64 $Rs), (Zext64 $Rt)))>;
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker//
272*9880d681SAndroid Build Coastguard Worker// 64-bit vector mux.
273*9880d681SAndroid Build Coastguard Worker//
274*9880d681SAndroid Build Coastguard Workerdef: Pat<(v8i8 (vselect V8I1:$Pu, V8I8:$Rs, V8I8:$Rt)),
275*9880d681SAndroid Build Coastguard Worker         (C2_vmux V8I1:$Pu, V8I8:$Rs, V8I8:$Rt)>;
276*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (vselect V4I1:$Pu, V4I16:$Rs, V4I16:$Rt)),
277*9880d681SAndroid Build Coastguard Worker         (C2_vmux V4I1:$Pu, V4I16:$Rs, V4I16:$Rt)>;
278*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (vselect V2I1:$Pu, V2I32:$Rs, V2I32:$Rt)),
279*9880d681SAndroid Build Coastguard Worker         (C2_vmux V2I1:$Pu, V2I32:$Rs, V2I32:$Rt)>;
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker//
282*9880d681SAndroid Build Coastguard Worker// No 32 bit vector compare.
283*9880d681SAndroid Build Coastguard Worker//
284*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (seteq V4I8:$Rs, V4I8:$Rt)),
285*9880d681SAndroid Build Coastguard Worker         (A2_vcmpbeq (Zext64 $Rs), (Zext64 $Rt))>;
286*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setgt V4I8:$Rs, V4I8:$Rt)),
287*9880d681SAndroid Build Coastguard Worker         (A4_vcmpbgt (Zext64 $Rs), (Zext64 $Rt))>;
288*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setugt V4I8:$Rs, V4I8:$Rt)),
289*9880d681SAndroid Build Coastguard Worker         (A2_vcmpbgtu (Zext64 $Rs), (Zext64 $Rt))>;
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (seteq V2I16:$Rs, V2I16:$Rt)),
292*9880d681SAndroid Build Coastguard Worker         (A2_vcmpheq (Zext64 $Rs), (Zext64 $Rt))>;
293*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setgt V2I16:$Rs, V2I16:$Rt)),
294*9880d681SAndroid Build Coastguard Worker         (A2_vcmphgt (Zext64 $Rs), (Zext64 $Rt))>;
295*9880d681SAndroid Build Coastguard Workerdef: Pat<(i1 (setugt V2I16:$Rs, V2I16:$Rt)),
296*9880d681SAndroid Build Coastguard Worker         (A2_vcmphgtu (Zext64 $Rs), (Zext64 $Rt))>;
297*9880d681SAndroid Build Coastguard Worker
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Workerclass InvertCmp_pat<InstHexagon InvMI, PatFrag CmpOp, PatFrag Value,
300*9880d681SAndroid Build Coastguard Worker                    ValueType CmpTy>
301*9880d681SAndroid Build Coastguard Worker  : Pat<(CmpTy (CmpOp Value:$Rs, Value:$Rt)),
302*9880d681SAndroid Build Coastguard Worker        (InvMI Value:$Rt, Value:$Rs)>;
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard Worker// Map from a compare operation to the corresponding instruction with the
305*9880d681SAndroid Build Coastguard Worker// order of operands reversed, e.g.  x > y --> cmp.lt(y,x).
306*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A4_vcmpbgt,  setlt,  V8I8,  i1>;
307*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A4_vcmpbgt,  setlt,  V8I8,  v8i1>;
308*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmphgt,  setlt,  V4I16, i1>;
309*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmphgt,  setlt,  V4I16, v4i1>;
310*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmpwgt,  setlt,  V2I32, i1>;
311*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmpwgt,  setlt,  V2I32, v2i1>;
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmpbgtu, setult, V8I8,  i1>;
314*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmpbgtu, setult, V8I8,  v8i1>;
315*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmphgtu, setult, V4I16, i1>;
316*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmphgtu, setult, V4I16, v4i1>;
317*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmpwgtu, setult, V2I32, i1>;
318*9880d681SAndroid Build Coastguard Workerdef: InvertCmp_pat<A2_vcmpwgtu, setult, V2I32, v2i1>;
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Worker// Map from vcmpne(Rss) -> !vcmpew(Rss).
321*9880d681SAndroid Build Coastguard Worker// rs != rt -> !(rs == rt).
322*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i1 (setne V2I32:$Rs, V2I32:$Rt)),
323*9880d681SAndroid Build Coastguard Worker         (C2_not (v2i1 (A2_vcmpbeq V2I32:$Rs, V2I32:$Rt)))>;
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Worker// Truncate: from vector B copy all 'E'ven 'B'yte elements:
327*9880d681SAndroid Build Coastguard Worker// A[0] = B[0];  A[1] = B[2];  A[2] = B[4];  A[3] = B[6];
328*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (trunc V4I16:$Rs)),
329*9880d681SAndroid Build Coastguard Worker         (S2_vtrunehb V4I16:$Rs)>;
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Worker// Truncate: from vector B copy all 'O'dd 'B'yte elements:
332*9880d681SAndroid Build Coastguard Worker// A[0] = B[1];  A[1] = B[3];  A[2] = B[5];  A[3] = B[7];
333*9880d681SAndroid Build Coastguard Worker// S2_vtrunohb
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker// Truncate: from vectors B and C copy all 'E'ven 'H'alf-word elements:
336*9880d681SAndroid Build Coastguard Worker// A[0] = B[0];  A[1] = B[2];  A[2] = C[0];  A[3] = C[2];
337*9880d681SAndroid Build Coastguard Worker// S2_vtruneh
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i16 (trunc V2I32:$Rs)),
340*9880d681SAndroid Build Coastguard Worker         (LoReg (S2_packhl (HiReg $Rs), (LoReg $Rs)))>;
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Workerdef HexagonVSXTBH : SDNode<"HexagonISD::VSXTBH", SDTUnaryOp>;
344*9880d681SAndroid Build Coastguard Workerdef HexagonVSXTBW : SDNode<"HexagonISD::VSXTBW", SDTUnaryOp>;
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (HexagonVSXTBH I32:$Rs)), (S2_vsxtbh I32:$Rs)>;
347*9880d681SAndroid Build Coastguard Workerdef: Pat<(i64 (HexagonVSXTBW I32:$Rs)), (S2_vsxthw I32:$Rs)>;
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (zext   V4I8:$Rs)),  (S2_vzxtbh V4I8:$Rs)>;
350*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (zext   V2I16:$Rs)), (S2_vzxthw V2I16:$Rs)>;
351*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (anyext V4I8:$Rs)),  (S2_vzxtbh V4I8:$Rs)>;
352*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (anyext V2I16:$Rs)), (S2_vzxthw V2I16:$Rs)>;
353*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (sext   V4I8:$Rs)),  (S2_vsxtbh V4I8:$Rs)>;
354*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (sext   V2I16:$Rs)), (S2_vsxthw V2I16:$Rs)>;
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Worker// Sign extends a v2i8 into a v2i32.
357*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (sext_inreg V2I32:$Rs, v2i8)),
358*9880d681SAndroid Build Coastguard Worker         (A2_combinew (A2_sxtb (HiReg $Rs)), (A2_sxtb (LoReg $Rs)))>;
359*9880d681SAndroid Build Coastguard Worker
360*9880d681SAndroid Build Coastguard Worker// Sign extends a v2i16 into a v2i32.
361*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (sext_inreg V2I32:$Rs, v2i16)),
362*9880d681SAndroid Build Coastguard Worker         (A2_combinew (A2_sxth (HiReg $Rs)), (A2_sxth (LoReg $Rs)))>;
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Worker// Multiplies two v2i16 and returns a v2i32.  We are using here the
366*9880d681SAndroid Build Coastguard Worker// saturating multiply, as hexagon does not provide a non saturating
367*9880d681SAndroid Build Coastguard Worker// vector multiply, and saturation does not impact the result that is
368*9880d681SAndroid Build Coastguard Worker// in double precision of the operands.
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Worker// Multiplies two v2i16 vectors: as Hexagon does not have a multiply
371*9880d681SAndroid Build Coastguard Worker// with the C semantics for this one, this pattern uses the half word
372*9880d681SAndroid Build Coastguard Worker// multiply vmpyh that takes two v2i16 and returns a v2i32.  This is
373*9880d681SAndroid Build Coastguard Worker// then truncated to fit this back into a v2i16 and to simulate the
374*9880d681SAndroid Build Coastguard Worker// wrap around semantics for unsigned in C.
375*9880d681SAndroid Build Coastguard Workerdef vmpyh: OutPatFrag<(ops node:$Rs, node:$Rt),
376*9880d681SAndroid Build Coastguard Worker                      (M2_vmpy2s_s0 (i32 $Rs), (i32 $Rt))>;
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i16 (mul V2I16:$Rs, V2I16:$Rt)),
379*9880d681SAndroid Build Coastguard Worker         (LoReg (S2_vtrunewh (v2i32 (A2_combineii 0, 0)),
380*9880d681SAndroid Build Coastguard Worker                             (v2i32 (vmpyh V2I16:$Rs, V2I16:$Rt))))>;
381*9880d681SAndroid Build Coastguard Worker
382*9880d681SAndroid Build Coastguard Worker// Multiplies two v4i16 vectors.
383*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i16 (mul V4I16:$Rs, V4I16:$Rt)),
384*9880d681SAndroid Build Coastguard Worker         (S2_vtrunewh (vmpyh (HiReg $Rs), (HiReg $Rt)),
385*9880d681SAndroid Build Coastguard Worker                      (vmpyh (LoReg $Rs), (LoReg $Rt)))>;
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Workerdef VMPYB_no_V5: OutPatFrag<(ops node:$Rs, node:$Rt),
388*9880d681SAndroid Build Coastguard Worker  (S2_vtrunewh (vmpyh (HiReg (S2_vsxtbh $Rs)), (HiReg (S2_vsxtbh $Rt))),
389*9880d681SAndroid Build Coastguard Worker               (vmpyh (LoReg (S2_vsxtbh $Rs)), (LoReg (S2_vsxtbh $Rt))))>;
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Worker// Multiplies two v4i8 vectors.
392*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (mul V4I8:$Rs, V4I8:$Rt)),
393*9880d681SAndroid Build Coastguard Worker         (S2_vtrunehb (M5_vmpybsu V4I8:$Rs, V4I8:$Rt))>,
394*9880d681SAndroid Build Coastguard Worker     Requires<[HasV5T]>;
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Workerdef: Pat<(v4i8 (mul V4I8:$Rs, V4I8:$Rt)),
397*9880d681SAndroid Build Coastguard Worker         (S2_vtrunehb (VMPYB_no_V5 V4I8:$Rs, V4I8:$Rt))>;
398*9880d681SAndroid Build Coastguard Worker
399*9880d681SAndroid Build Coastguard Worker// Multiplies two v8i8 vectors.
400*9880d681SAndroid Build Coastguard Workerdef: Pat<(v8i8 (mul V8I8:$Rs, V8I8:$Rt)),
401*9880d681SAndroid Build Coastguard Worker         (A2_combinew (S2_vtrunehb (M5_vmpybsu (HiReg $Rs), (HiReg $Rt))),
402*9880d681SAndroid Build Coastguard Worker                      (S2_vtrunehb (M5_vmpybsu (LoReg $Rs), (LoReg $Rt))))>,
403*9880d681SAndroid Build Coastguard Worker     Requires<[HasV5T]>;
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Workerdef: Pat<(v8i8 (mul V8I8:$Rs, V8I8:$Rt)),
406*9880d681SAndroid Build Coastguard Worker         (A2_combinew (S2_vtrunehb (VMPYB_no_V5 (HiReg $Rs), (HiReg $Rt))),
407*9880d681SAndroid Build Coastguard Worker                      (S2_vtrunehb (VMPYB_no_V5 (LoReg $Rs), (LoReg $Rt))))>;
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Worker
410*9880d681SAndroid Build Coastguard Workerclass shuffler<SDNode Op, string Str>
411*9880d681SAndroid Build Coastguard Worker  : SInst<(outs DoubleRegs:$a), (ins DoubleRegs:$b, DoubleRegs:$c),
412*9880d681SAndroid Build Coastguard Worker      "$a = " # Str # "($b, $c)",
413*9880d681SAndroid Build Coastguard Worker      [(set (i64 DoubleRegs:$a),
414*9880d681SAndroid Build Coastguard Worker            (i64 (Op (i64 DoubleRegs:$b), (i64 DoubleRegs:$c))))],
415*9880d681SAndroid Build Coastguard Worker      "", S_3op_tc_1_SLOT23>;
416*9880d681SAndroid Build Coastguard Worker
417*9880d681SAndroid Build Coastguard Workerdef SDTHexagonBinOp64 : SDTypeProfile<1, 2,
418*9880d681SAndroid Build Coastguard Worker  [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisVT<0, i64>]>;
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Workerdef HexagonSHUFFEB: SDNode<"HexagonISD::SHUFFEB", SDTHexagonBinOp64>;
421*9880d681SAndroid Build Coastguard Workerdef HexagonSHUFFEH: SDNode<"HexagonISD::SHUFFEH", SDTHexagonBinOp64>;
422*9880d681SAndroid Build Coastguard Workerdef HexagonSHUFFOB: SDNode<"HexagonISD::SHUFFOB", SDTHexagonBinOp64>;
423*9880d681SAndroid Build Coastguard Workerdef HexagonSHUFFOH: SDNode<"HexagonISD::SHUFFOH", SDTHexagonBinOp64>;
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Workerclass ShufflePat<InstHexagon MI, SDNode Op>
426*9880d681SAndroid Build Coastguard Worker  : Pat<(i64 (Op DoubleRegs:$src1, DoubleRegs:$src2)),
427*9880d681SAndroid Build Coastguard Worker        (i64 (MI DoubleRegs:$src1, DoubleRegs:$src2))>;
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Worker// Shuffles even bytes for i=0..3: A[2*i].b = C[2*i].b; A[2*i+1].b = B[2*i].b
430*9880d681SAndroid Build Coastguard Workerdef: ShufflePat<S2_shuffeb, HexagonSHUFFEB>;
431*9880d681SAndroid Build Coastguard Worker
432*9880d681SAndroid Build Coastguard Worker// Shuffles odd bytes for i=0..3: A[2*i].b = C[2*i+1].b; A[2*i+1].b = B[2*i+1].b
433*9880d681SAndroid Build Coastguard Workerdef: ShufflePat<S2_shuffob, HexagonSHUFFOB>;
434*9880d681SAndroid Build Coastguard Worker
435*9880d681SAndroid Build Coastguard Worker// Shuffles even half for i=0,1: A[2*i].h = C[2*i].h; A[2*i+1].h = B[2*i].h
436*9880d681SAndroid Build Coastguard Workerdef: ShufflePat<S2_shuffeh, HexagonSHUFFEH>;
437*9880d681SAndroid Build Coastguard Worker
438*9880d681SAndroid Build Coastguard Worker// Shuffles odd half for i=0,1: A[2*i].h = C[2*i+1].h; A[2*i+1].h = B[2*i+1].h
439*9880d681SAndroid Build Coastguard Workerdef: ShufflePat<S2_shuffoh, HexagonSHUFFOH>;
440*9880d681SAndroid Build Coastguard Worker
441*9880d681SAndroid Build Coastguard Worker
442*9880d681SAndroid Build Coastguard Worker// Truncated store from v4i16 to v4i8.
443*9880d681SAndroid Build Coastguard Workerdef truncstorev4i8: PatFrag<(ops node:$val, node:$ptr),
444*9880d681SAndroid Build Coastguard Worker                            (truncstore node:$val, node:$ptr),
445*9880d681SAndroid Build Coastguard Worker    [{ return cast<StoreSDNode>(N)->getMemoryVT() == MVT::v4i8; }]>;
446*9880d681SAndroid Build Coastguard Worker
447*9880d681SAndroid Build Coastguard Worker// Truncated store from v2i32 to v2i16.
448*9880d681SAndroid Build Coastguard Workerdef truncstorev2i16: PatFrag<(ops node:$val, node:$ptr),
449*9880d681SAndroid Build Coastguard Worker                             (truncstore node:$val, node:$ptr),
450*9880d681SAndroid Build Coastguard Worker    [{ return cast<StoreSDNode>(N)->getMemoryVT() == MVT::v2i16; }]>;
451*9880d681SAndroid Build Coastguard Worker
452*9880d681SAndroid Build Coastguard Workerdef: Pat<(truncstorev2i16 V2I32:$Rs, I32:$Rt),
453*9880d681SAndroid Build Coastguard Worker         (S2_storeri_io I32:$Rt, 0, (LoReg (S2_packhl (HiReg $Rs),
454*9880d681SAndroid Build Coastguard Worker                                                      (LoReg $Rs))))>;
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Workerdef: Pat<(truncstorev4i8 V4I16:$Rs, I32:$Rt),
457*9880d681SAndroid Build Coastguard Worker         (S2_storeri_io I32:$Rt, 0, (S2_vtrunehb V4I16:$Rs))>;
458*9880d681SAndroid Build Coastguard Worker
459*9880d681SAndroid Build Coastguard Worker
460*9880d681SAndroid Build Coastguard Worker// Zero and sign extended load from v2i8 into v2i16.
461*9880d681SAndroid Build Coastguard Workerdef zextloadv2i8: PatFrag<(ops node:$ptr), (zextload node:$ptr),
462*9880d681SAndroid Build Coastguard Worker    [{ return cast<LoadSDNode>(N)->getMemoryVT() == MVT::v2i8; }]>;
463*9880d681SAndroid Build Coastguard Worker
464*9880d681SAndroid Build Coastguard Workerdef sextloadv2i8: PatFrag<(ops node:$ptr), (sextload node:$ptr),
465*9880d681SAndroid Build Coastguard Worker    [{ return cast<LoadSDNode>(N)->getMemoryVT() == MVT::v2i8; }]>;
466*9880d681SAndroid Build Coastguard Worker
467*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i16 (zextloadv2i8 I32:$Rs)),
468*9880d681SAndroid Build Coastguard Worker         (LoReg (v4i16 (S2_vzxtbh (L2_loadruh_io I32:$Rs, 0))))>;
469*9880d681SAndroid Build Coastguard Worker
470*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i16 (sextloadv2i8 I32:$Rs)),
471*9880d681SAndroid Build Coastguard Worker         (LoReg (v4i16 (S2_vsxtbh (L2_loadrh_io I32:$Rs, 0))))>;
472*9880d681SAndroid Build Coastguard Worker
473*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (zextloadv2i8 I32:$Rs)),
474*9880d681SAndroid Build Coastguard Worker         (S2_vzxthw (LoReg (v4i16 (S2_vzxtbh (L2_loadruh_io I32:$Rs, 0)))))>;
475*9880d681SAndroid Build Coastguard Worker
476*9880d681SAndroid Build Coastguard Workerdef: Pat<(v2i32 (sextloadv2i8 I32:$Rs)),
477*9880d681SAndroid Build Coastguard Worker         (S2_vsxthw (LoReg (v4i16 (S2_vsxtbh (L2_loadrh_io I32:$Rs, 0)))))>;
478