xref: /aosp_15_r20/external/llvm/lib/Target/AArch64/AArch64InstrInfo.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//=- AArch64InstrInfo.td - Describe the AArch64 Instructions -*- 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// AArch64 Instruction definitions.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
15*9880d681SAndroid Build Coastguard Worker// ARM Instruction Predicate Definitions.
16*9880d681SAndroid Build Coastguard Worker//
17*9880d681SAndroid Build Coastguard Workerdef HasV8_1a         : Predicate<"Subtarget->hasV8_1aOps()">,
18*9880d681SAndroid Build Coastguard Worker                                 AssemblerPredicate<"HasV8_1aOps", "armv8.1a">;
19*9880d681SAndroid Build Coastguard Workerdef HasV8_2a         : Predicate<"Subtarget->hasV8_2aOps()">,
20*9880d681SAndroid Build Coastguard Worker                                 AssemblerPredicate<"HasV8_2aOps", "armv8.2a">;
21*9880d681SAndroid Build Coastguard Workerdef HasFPARMv8       : Predicate<"Subtarget->hasFPARMv8()">,
22*9880d681SAndroid Build Coastguard Worker                               AssemblerPredicate<"FeatureFPARMv8", "fp-armv8">;
23*9880d681SAndroid Build Coastguard Workerdef HasNEON          : Predicate<"Subtarget->hasNEON()">,
24*9880d681SAndroid Build Coastguard Worker                                 AssemblerPredicate<"FeatureNEON", "neon">;
25*9880d681SAndroid Build Coastguard Workerdef HasCrypto        : Predicate<"Subtarget->hasCrypto()">,
26*9880d681SAndroid Build Coastguard Worker                                 AssemblerPredicate<"FeatureCrypto", "crypto">;
27*9880d681SAndroid Build Coastguard Workerdef HasCRC           : Predicate<"Subtarget->hasCRC()">,
28*9880d681SAndroid Build Coastguard Worker                                 AssemblerPredicate<"FeatureCRC", "crc">;
29*9880d681SAndroid Build Coastguard Workerdef HasRAS           : Predicate<"Subtarget->hasRAS()">,
30*9880d681SAndroid Build Coastguard Worker                                 AssemblerPredicate<"FeatureRAS", "ras">;
31*9880d681SAndroid Build Coastguard Workerdef HasPerfMon       : Predicate<"Subtarget->hasPerfMon()">;
32*9880d681SAndroid Build Coastguard Workerdef HasFullFP16      : Predicate<"Subtarget->hasFullFP16()">,
33*9880d681SAndroid Build Coastguard Worker                                 AssemblerPredicate<"FeatureFullFP16", "fullfp16">;
34*9880d681SAndroid Build Coastguard Workerdef HasSPE           : Predicate<"Subtarget->hasSPE()">,
35*9880d681SAndroid Build Coastguard Worker                                 AssemblerPredicate<"FeatureSPE", "spe">;
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdef IsLE             : Predicate<"Subtarget->isLittleEndian()">;
38*9880d681SAndroid Build Coastguard Workerdef IsBE             : Predicate<"!Subtarget->isLittleEndian()">;
39*9880d681SAndroid Build Coastguard Workerdef UseAlternateSExtLoadCVTF32
40*9880d681SAndroid Build Coastguard Worker    : Predicate<"Subtarget->useAlternateSExtLoadCVTF32Pattern()">;
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
43*9880d681SAndroid Build Coastguard Worker// AArch64-specific DAG Nodes.
44*9880d681SAndroid Build Coastguard Worker//
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker// SDTBinaryArithWithFlagsOut - RES1, FLAGS = op LHS, RHS
47*9880d681SAndroid Build Coastguard Workerdef SDTBinaryArithWithFlagsOut : SDTypeProfile<2, 2,
48*9880d681SAndroid Build Coastguard Worker                                              [SDTCisSameAs<0, 2>,
49*9880d681SAndroid Build Coastguard Worker                                               SDTCisSameAs<0, 3>,
50*9880d681SAndroid Build Coastguard Worker                                               SDTCisInt<0>, SDTCisVT<1, i32>]>;
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker// SDTBinaryArithWithFlagsIn - RES1, FLAGS = op LHS, RHS, FLAGS
53*9880d681SAndroid Build Coastguard Workerdef SDTBinaryArithWithFlagsIn : SDTypeProfile<1, 3,
54*9880d681SAndroid Build Coastguard Worker                                            [SDTCisSameAs<0, 1>,
55*9880d681SAndroid Build Coastguard Worker                                             SDTCisSameAs<0, 2>,
56*9880d681SAndroid Build Coastguard Worker                                             SDTCisInt<0>,
57*9880d681SAndroid Build Coastguard Worker                                             SDTCisVT<3, i32>]>;
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker// SDTBinaryArithWithFlagsInOut - RES1, FLAGS = op LHS, RHS, FLAGS
60*9880d681SAndroid Build Coastguard Workerdef SDTBinaryArithWithFlagsInOut : SDTypeProfile<2, 3,
61*9880d681SAndroid Build Coastguard Worker                                            [SDTCisSameAs<0, 2>,
62*9880d681SAndroid Build Coastguard Worker                                             SDTCisSameAs<0, 3>,
63*9880d681SAndroid Build Coastguard Worker                                             SDTCisInt<0>,
64*9880d681SAndroid Build Coastguard Worker                                             SDTCisVT<1, i32>,
65*9880d681SAndroid Build Coastguard Worker                                             SDTCisVT<4, i32>]>;
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64Brcond  : SDTypeProfile<0, 3,
68*9880d681SAndroid Build Coastguard Worker                                     [SDTCisVT<0, OtherVT>, SDTCisVT<1, i32>,
69*9880d681SAndroid Build Coastguard Worker                                      SDTCisVT<2, i32>]>;
70*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64cbz : SDTypeProfile<0, 2, [SDTCisInt<0>, SDTCisVT<1, OtherVT>]>;
71*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64tbz : SDTypeProfile<0, 3, [SDTCisInt<0>, SDTCisInt<1>,
72*9880d681SAndroid Build Coastguard Worker                                        SDTCisVT<2, OtherVT>]>;
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64CSel  : SDTypeProfile<1, 4,
76*9880d681SAndroid Build Coastguard Worker                                   [SDTCisSameAs<0, 1>,
77*9880d681SAndroid Build Coastguard Worker                                    SDTCisSameAs<0, 2>,
78*9880d681SAndroid Build Coastguard Worker                                    SDTCisInt<3>,
79*9880d681SAndroid Build Coastguard Worker                                    SDTCisVT<4, i32>]>;
80*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64CCMP : SDTypeProfile<1, 5,
81*9880d681SAndroid Build Coastguard Worker                                    [SDTCisVT<0, i32>,
82*9880d681SAndroid Build Coastguard Worker                                     SDTCisInt<1>,
83*9880d681SAndroid Build Coastguard Worker                                     SDTCisSameAs<1, 2>,
84*9880d681SAndroid Build Coastguard Worker                                     SDTCisInt<3>,
85*9880d681SAndroid Build Coastguard Worker                                     SDTCisInt<4>,
86*9880d681SAndroid Build Coastguard Worker                                     SDTCisVT<5, i32>]>;
87*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64FCCMP : SDTypeProfile<1, 5,
88*9880d681SAndroid Build Coastguard Worker                                     [SDTCisVT<0, i32>,
89*9880d681SAndroid Build Coastguard Worker                                      SDTCisFP<1>,
90*9880d681SAndroid Build Coastguard Worker                                      SDTCisSameAs<1, 2>,
91*9880d681SAndroid Build Coastguard Worker                                      SDTCisInt<3>,
92*9880d681SAndroid Build Coastguard Worker                                      SDTCisInt<4>,
93*9880d681SAndroid Build Coastguard Worker                                      SDTCisVT<5, i32>]>;
94*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64FCmp   : SDTypeProfile<0, 2,
95*9880d681SAndroid Build Coastguard Worker                                   [SDTCisFP<0>,
96*9880d681SAndroid Build Coastguard Worker                                    SDTCisSameAs<0, 1>]>;
97*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64Dup   : SDTypeProfile<1, 1, [SDTCisVec<0>]>;
98*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64DupLane   : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisInt<2>]>;
99*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64Zip   : SDTypeProfile<1, 2, [SDTCisVec<0>,
100*9880d681SAndroid Build Coastguard Worker                                          SDTCisSameAs<0, 1>,
101*9880d681SAndroid Build Coastguard Worker                                          SDTCisSameAs<0, 2>]>;
102*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64MOVIedit : SDTypeProfile<1, 1, [SDTCisInt<1>]>;
103*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64MOVIshift : SDTypeProfile<1, 2, [SDTCisInt<1>, SDTCisInt<2>]>;
104*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64vecimm : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>,
105*9880d681SAndroid Build Coastguard Worker                                           SDTCisInt<2>, SDTCisInt<3>]>;
106*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64UnaryVec: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisSameAs<0,1>]>;
107*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64ExtVec: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>,
108*9880d681SAndroid Build Coastguard Worker                                          SDTCisSameAs<0,2>, SDTCisInt<3>]>;
109*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64vshift : SDTypeProfile<1, 2, [SDTCisSameAs<0,1>, SDTCisInt<2>]>;
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64unvec : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisSameAs<0,1>]>;
112*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64fcmpz : SDTypeProfile<1, 1, []>;
113*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64fcmp  : SDTypeProfile<1, 2, [SDTCisSameAs<1,2>]>;
114*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64binvec : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>,
115*9880d681SAndroid Build Coastguard Worker                                           SDTCisSameAs<0,2>]>;
116*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64trivec : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>,
117*9880d681SAndroid Build Coastguard Worker                                           SDTCisSameAs<0,2>,
118*9880d681SAndroid Build Coastguard Worker                                           SDTCisSameAs<0,3>]>;
119*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64TCRET : SDTypeProfile<0, 2, [SDTCisPtrTy<0>]>;
120*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64PREFETCH : SDTypeProfile<0, 2, [SDTCisVT<0, i32>, SDTCisPtrTy<1>]>;
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64ITOF  : SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisSameAs<0,1>]>;
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64TLSDescCall : SDTypeProfile<0, -2, [SDTCisPtrTy<0>,
125*9880d681SAndroid Build Coastguard Worker                                                 SDTCisPtrTy<1>]>;
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker// Generates the general dynamic sequences, i.e.
128*9880d681SAndroid Build Coastguard Worker//  adrp  x0, :tlsdesc:var
129*9880d681SAndroid Build Coastguard Worker//  ldr   x1, [x0, #:tlsdesc_lo12:var]
130*9880d681SAndroid Build Coastguard Worker//  add   x0, x0, #:tlsdesc_lo12:var
131*9880d681SAndroid Build Coastguard Worker//  .tlsdesccall var
132*9880d681SAndroid Build Coastguard Worker//  blr   x1
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker// (the TPIDR_EL0 offset is put directly in X0, hence no "result" here)
135*9880d681SAndroid Build Coastguard Worker// number of operands (the variable)
136*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64TLSDescCallSeq : SDTypeProfile<0,1,
137*9880d681SAndroid Build Coastguard Worker                                          [SDTCisPtrTy<0>]>;
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64WrapperLarge : SDTypeProfile<1, 4,
140*9880d681SAndroid Build Coastguard Worker                                        [SDTCisVT<0, i64>, SDTCisVT<1, i32>,
141*9880d681SAndroid Build Coastguard Worker                                         SDTCisSameAs<1, 2>, SDTCisSameAs<1, 3>,
142*9880d681SAndroid Build Coastguard Worker                                         SDTCisSameAs<1, 4>]>;
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker// Node definitions.
146*9880d681SAndroid Build Coastguard Workerdef AArch64adrp          : SDNode<"AArch64ISD::ADRP", SDTIntUnaryOp, []>;
147*9880d681SAndroid Build Coastguard Workerdef AArch64addlow        : SDNode<"AArch64ISD::ADDlow", SDTIntBinOp, []>;
148*9880d681SAndroid Build Coastguard Workerdef AArch64LOADgot       : SDNode<"AArch64ISD::LOADgot", SDTIntUnaryOp>;
149*9880d681SAndroid Build Coastguard Workerdef AArch64callseq_start : SDNode<"ISD::CALLSEQ_START",
150*9880d681SAndroid Build Coastguard Worker                                SDCallSeqStart<[ SDTCisVT<0, i32> ]>,
151*9880d681SAndroid Build Coastguard Worker                                [SDNPHasChain, SDNPOutGlue]>;
152*9880d681SAndroid Build Coastguard Workerdef AArch64callseq_end   : SDNode<"ISD::CALLSEQ_END",
153*9880d681SAndroid Build Coastguard Worker                                SDCallSeqEnd<[ SDTCisVT<0, i32>,
154*9880d681SAndroid Build Coastguard Worker                                               SDTCisVT<1, i32> ]>,
155*9880d681SAndroid Build Coastguard Worker                                [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
156*9880d681SAndroid Build Coastguard Workerdef AArch64call          : SDNode<"AArch64ISD::CALL",
157*9880d681SAndroid Build Coastguard Worker                                SDTypeProfile<0, -1, [SDTCisPtrTy<0>]>,
158*9880d681SAndroid Build Coastguard Worker                                [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
159*9880d681SAndroid Build Coastguard Worker                                 SDNPVariadic]>;
160*9880d681SAndroid Build Coastguard Workerdef AArch64brcond        : SDNode<"AArch64ISD::BRCOND", SDT_AArch64Brcond,
161*9880d681SAndroid Build Coastguard Worker                                [SDNPHasChain]>;
162*9880d681SAndroid Build Coastguard Workerdef AArch64cbz           : SDNode<"AArch64ISD::CBZ", SDT_AArch64cbz,
163*9880d681SAndroid Build Coastguard Worker                                [SDNPHasChain]>;
164*9880d681SAndroid Build Coastguard Workerdef AArch64cbnz           : SDNode<"AArch64ISD::CBNZ", SDT_AArch64cbz,
165*9880d681SAndroid Build Coastguard Worker                                [SDNPHasChain]>;
166*9880d681SAndroid Build Coastguard Workerdef AArch64tbz           : SDNode<"AArch64ISD::TBZ", SDT_AArch64tbz,
167*9880d681SAndroid Build Coastguard Worker                                [SDNPHasChain]>;
168*9880d681SAndroid Build Coastguard Workerdef AArch64tbnz           : SDNode<"AArch64ISD::TBNZ", SDT_AArch64tbz,
169*9880d681SAndroid Build Coastguard Worker                                [SDNPHasChain]>;
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerdef AArch64csel          : SDNode<"AArch64ISD::CSEL", SDT_AArch64CSel>;
173*9880d681SAndroid Build Coastguard Workerdef AArch64csinv         : SDNode<"AArch64ISD::CSINV", SDT_AArch64CSel>;
174*9880d681SAndroid Build Coastguard Workerdef AArch64csneg         : SDNode<"AArch64ISD::CSNEG", SDT_AArch64CSel>;
175*9880d681SAndroid Build Coastguard Workerdef AArch64csinc         : SDNode<"AArch64ISD::CSINC", SDT_AArch64CSel>;
176*9880d681SAndroid Build Coastguard Workerdef AArch64retflag       : SDNode<"AArch64ISD::RET_FLAG", SDTNone,
177*9880d681SAndroid Build Coastguard Worker                                [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
178*9880d681SAndroid Build Coastguard Workerdef AArch64adc       : SDNode<"AArch64ISD::ADC",  SDTBinaryArithWithFlagsIn >;
179*9880d681SAndroid Build Coastguard Workerdef AArch64sbc       : SDNode<"AArch64ISD::SBC",  SDTBinaryArithWithFlagsIn>;
180*9880d681SAndroid Build Coastguard Workerdef AArch64add_flag  : SDNode<"AArch64ISD::ADDS",  SDTBinaryArithWithFlagsOut,
181*9880d681SAndroid Build Coastguard Worker                            [SDNPCommutative]>;
182*9880d681SAndroid Build Coastguard Workerdef AArch64sub_flag  : SDNode<"AArch64ISD::SUBS",  SDTBinaryArithWithFlagsOut>;
183*9880d681SAndroid Build Coastguard Workerdef AArch64and_flag  : SDNode<"AArch64ISD::ANDS",  SDTBinaryArithWithFlagsOut,
184*9880d681SAndroid Build Coastguard Worker                            [SDNPCommutative]>;
185*9880d681SAndroid Build Coastguard Workerdef AArch64adc_flag  : SDNode<"AArch64ISD::ADCS",  SDTBinaryArithWithFlagsInOut>;
186*9880d681SAndroid Build Coastguard Workerdef AArch64sbc_flag  : SDNode<"AArch64ISD::SBCS",  SDTBinaryArithWithFlagsInOut>;
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerdef AArch64ccmp      : SDNode<"AArch64ISD::CCMP",  SDT_AArch64CCMP>;
189*9880d681SAndroid Build Coastguard Workerdef AArch64ccmn      : SDNode<"AArch64ISD::CCMN",  SDT_AArch64CCMP>;
190*9880d681SAndroid Build Coastguard Workerdef AArch64fccmp     : SDNode<"AArch64ISD::FCCMP", SDT_AArch64FCCMP>;
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerdef AArch64threadpointer : SDNode<"AArch64ISD::THREAD_POINTER", SDTPtrLeaf>;
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workerdef AArch64fcmp      : SDNode<"AArch64ISD::FCMP", SDT_AArch64FCmp>;
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Workerdef AArch64dup       : SDNode<"AArch64ISD::DUP", SDT_AArch64Dup>;
197*9880d681SAndroid Build Coastguard Workerdef AArch64duplane8  : SDNode<"AArch64ISD::DUPLANE8", SDT_AArch64DupLane>;
198*9880d681SAndroid Build Coastguard Workerdef AArch64duplane16 : SDNode<"AArch64ISD::DUPLANE16", SDT_AArch64DupLane>;
199*9880d681SAndroid Build Coastguard Workerdef AArch64duplane32 : SDNode<"AArch64ISD::DUPLANE32", SDT_AArch64DupLane>;
200*9880d681SAndroid Build Coastguard Workerdef AArch64duplane64 : SDNode<"AArch64ISD::DUPLANE64", SDT_AArch64DupLane>;
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Workerdef AArch64zip1      : SDNode<"AArch64ISD::ZIP1", SDT_AArch64Zip>;
203*9880d681SAndroid Build Coastguard Workerdef AArch64zip2      : SDNode<"AArch64ISD::ZIP2", SDT_AArch64Zip>;
204*9880d681SAndroid Build Coastguard Workerdef AArch64uzp1      : SDNode<"AArch64ISD::UZP1", SDT_AArch64Zip>;
205*9880d681SAndroid Build Coastguard Workerdef AArch64uzp2      : SDNode<"AArch64ISD::UZP2", SDT_AArch64Zip>;
206*9880d681SAndroid Build Coastguard Workerdef AArch64trn1      : SDNode<"AArch64ISD::TRN1", SDT_AArch64Zip>;
207*9880d681SAndroid Build Coastguard Workerdef AArch64trn2      : SDNode<"AArch64ISD::TRN2", SDT_AArch64Zip>;
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdef AArch64movi_edit : SDNode<"AArch64ISD::MOVIedit", SDT_AArch64MOVIedit>;
210*9880d681SAndroid Build Coastguard Workerdef AArch64movi_shift : SDNode<"AArch64ISD::MOVIshift", SDT_AArch64MOVIshift>;
211*9880d681SAndroid Build Coastguard Workerdef AArch64movi_msl : SDNode<"AArch64ISD::MOVImsl", SDT_AArch64MOVIshift>;
212*9880d681SAndroid Build Coastguard Workerdef AArch64mvni_shift : SDNode<"AArch64ISD::MVNIshift", SDT_AArch64MOVIshift>;
213*9880d681SAndroid Build Coastguard Workerdef AArch64mvni_msl : SDNode<"AArch64ISD::MVNImsl", SDT_AArch64MOVIshift>;
214*9880d681SAndroid Build Coastguard Workerdef AArch64movi : SDNode<"AArch64ISD::MOVI", SDT_AArch64MOVIedit>;
215*9880d681SAndroid Build Coastguard Workerdef AArch64fmov : SDNode<"AArch64ISD::FMOV", SDT_AArch64MOVIedit>;
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Workerdef AArch64rev16 : SDNode<"AArch64ISD::REV16", SDT_AArch64UnaryVec>;
218*9880d681SAndroid Build Coastguard Workerdef AArch64rev32 : SDNode<"AArch64ISD::REV32", SDT_AArch64UnaryVec>;
219*9880d681SAndroid Build Coastguard Workerdef AArch64rev64 : SDNode<"AArch64ISD::REV64", SDT_AArch64UnaryVec>;
220*9880d681SAndroid Build Coastguard Workerdef AArch64ext : SDNode<"AArch64ISD::EXT", SDT_AArch64ExtVec>;
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Workerdef AArch64vashr : SDNode<"AArch64ISD::VASHR", SDT_AArch64vshift>;
223*9880d681SAndroid Build Coastguard Workerdef AArch64vlshr : SDNode<"AArch64ISD::VLSHR", SDT_AArch64vshift>;
224*9880d681SAndroid Build Coastguard Workerdef AArch64vshl : SDNode<"AArch64ISD::VSHL", SDT_AArch64vshift>;
225*9880d681SAndroid Build Coastguard Workerdef AArch64sqshli : SDNode<"AArch64ISD::SQSHL_I", SDT_AArch64vshift>;
226*9880d681SAndroid Build Coastguard Workerdef AArch64uqshli : SDNode<"AArch64ISD::UQSHL_I", SDT_AArch64vshift>;
227*9880d681SAndroid Build Coastguard Workerdef AArch64sqshlui : SDNode<"AArch64ISD::SQSHLU_I", SDT_AArch64vshift>;
228*9880d681SAndroid Build Coastguard Workerdef AArch64srshri : SDNode<"AArch64ISD::SRSHR_I", SDT_AArch64vshift>;
229*9880d681SAndroid Build Coastguard Workerdef AArch64urshri : SDNode<"AArch64ISD::URSHR_I", SDT_AArch64vshift>;
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Workerdef AArch64not: SDNode<"AArch64ISD::NOT", SDT_AArch64unvec>;
232*9880d681SAndroid Build Coastguard Workerdef AArch64bit: SDNode<"AArch64ISD::BIT", SDT_AArch64trivec>;
233*9880d681SAndroid Build Coastguard Workerdef AArch64bsl: SDNode<"AArch64ISD::BSL", SDT_AArch64trivec>;
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Workerdef AArch64cmeq: SDNode<"AArch64ISD::CMEQ", SDT_AArch64binvec>;
236*9880d681SAndroid Build Coastguard Workerdef AArch64cmge: SDNode<"AArch64ISD::CMGE", SDT_AArch64binvec>;
237*9880d681SAndroid Build Coastguard Workerdef AArch64cmgt: SDNode<"AArch64ISD::CMGT", SDT_AArch64binvec>;
238*9880d681SAndroid Build Coastguard Workerdef AArch64cmhi: SDNode<"AArch64ISD::CMHI", SDT_AArch64binvec>;
239*9880d681SAndroid Build Coastguard Workerdef AArch64cmhs: SDNode<"AArch64ISD::CMHS", SDT_AArch64binvec>;
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Workerdef AArch64fcmeq: SDNode<"AArch64ISD::FCMEQ", SDT_AArch64fcmp>;
242*9880d681SAndroid Build Coastguard Workerdef AArch64fcmge: SDNode<"AArch64ISD::FCMGE", SDT_AArch64fcmp>;
243*9880d681SAndroid Build Coastguard Workerdef AArch64fcmgt: SDNode<"AArch64ISD::FCMGT", SDT_AArch64fcmp>;
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Workerdef AArch64cmeqz: SDNode<"AArch64ISD::CMEQz", SDT_AArch64unvec>;
246*9880d681SAndroid Build Coastguard Workerdef AArch64cmgez: SDNode<"AArch64ISD::CMGEz", SDT_AArch64unvec>;
247*9880d681SAndroid Build Coastguard Workerdef AArch64cmgtz: SDNode<"AArch64ISD::CMGTz", SDT_AArch64unvec>;
248*9880d681SAndroid Build Coastguard Workerdef AArch64cmlez: SDNode<"AArch64ISD::CMLEz", SDT_AArch64unvec>;
249*9880d681SAndroid Build Coastguard Workerdef AArch64cmltz: SDNode<"AArch64ISD::CMLTz", SDT_AArch64unvec>;
250*9880d681SAndroid Build Coastguard Workerdef AArch64cmtst : PatFrag<(ops node:$LHS, node:$RHS),
251*9880d681SAndroid Build Coastguard Worker                        (AArch64not (AArch64cmeqz (and node:$LHS, node:$RHS)))>;
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerdef AArch64fcmeqz: SDNode<"AArch64ISD::FCMEQz", SDT_AArch64fcmpz>;
254*9880d681SAndroid Build Coastguard Workerdef AArch64fcmgez: SDNode<"AArch64ISD::FCMGEz", SDT_AArch64fcmpz>;
255*9880d681SAndroid Build Coastguard Workerdef AArch64fcmgtz: SDNode<"AArch64ISD::FCMGTz", SDT_AArch64fcmpz>;
256*9880d681SAndroid Build Coastguard Workerdef AArch64fcmlez: SDNode<"AArch64ISD::FCMLEz", SDT_AArch64fcmpz>;
257*9880d681SAndroid Build Coastguard Workerdef AArch64fcmltz: SDNode<"AArch64ISD::FCMLTz", SDT_AArch64fcmpz>;
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerdef AArch64bici: SDNode<"AArch64ISD::BICi", SDT_AArch64vecimm>;
260*9880d681SAndroid Build Coastguard Workerdef AArch64orri: SDNode<"AArch64ISD::ORRi", SDT_AArch64vecimm>;
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Workerdef AArch64neg : SDNode<"AArch64ISD::NEG", SDT_AArch64unvec>;
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Workerdef AArch64tcret: SDNode<"AArch64ISD::TC_RETURN", SDT_AArch64TCRET,
265*9880d681SAndroid Build Coastguard Worker                  [SDNPHasChain,  SDNPOptInGlue, SDNPVariadic]>;
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Workerdef AArch64Prefetch        : SDNode<"AArch64ISD::PREFETCH", SDT_AArch64PREFETCH,
268*9880d681SAndroid Build Coastguard Worker                               [SDNPHasChain, SDNPSideEffect]>;
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Workerdef AArch64sitof: SDNode<"AArch64ISD::SITOF", SDT_AArch64ITOF>;
271*9880d681SAndroid Build Coastguard Workerdef AArch64uitof: SDNode<"AArch64ISD::UITOF", SDT_AArch64ITOF>;
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Workerdef AArch64tlsdesc_callseq : SDNode<"AArch64ISD::TLSDESC_CALLSEQ",
274*9880d681SAndroid Build Coastguard Worker                                    SDT_AArch64TLSDescCallSeq,
275*9880d681SAndroid Build Coastguard Worker                                    [SDNPInGlue, SDNPOutGlue, SDNPHasChain,
276*9880d681SAndroid Build Coastguard Worker                                     SDNPVariadic]>;
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Worker
279*9880d681SAndroid Build Coastguard Workerdef AArch64WrapperLarge : SDNode<"AArch64ISD::WrapperLarge",
280*9880d681SAndroid Build Coastguard Worker                                 SDT_AArch64WrapperLarge>;
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Workerdef AArch64NvCast : SDNode<"AArch64ISD::NVCAST", SDTUnaryOp>;
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Workerdef SDT_AArch64mull : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisInt<1>,
285*9880d681SAndroid Build Coastguard Worker                                    SDTCisSameAs<1, 2>]>;
286*9880d681SAndroid Build Coastguard Workerdef AArch64smull    : SDNode<"AArch64ISD::SMULL", SDT_AArch64mull>;
287*9880d681SAndroid Build Coastguard Workerdef AArch64umull    : SDNode<"AArch64ISD::UMULL", SDT_AArch64mull>;
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Workerdef AArch64frecpe   : SDNode<"AArch64ISD::FRECPE", SDTFPUnaryOp>;
290*9880d681SAndroid Build Coastguard Workerdef AArch64frsqrte  : SDNode<"AArch64ISD::FRSQRTE", SDTFPUnaryOp>;
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Workerdef AArch64saddv    : SDNode<"AArch64ISD::SADDV", SDT_AArch64UnaryVec>;
293*9880d681SAndroid Build Coastguard Workerdef AArch64uaddv    : SDNode<"AArch64ISD::UADDV", SDT_AArch64UnaryVec>;
294*9880d681SAndroid Build Coastguard Workerdef AArch64sminv    : SDNode<"AArch64ISD::SMINV", SDT_AArch64UnaryVec>;
295*9880d681SAndroid Build Coastguard Workerdef AArch64uminv    : SDNode<"AArch64ISD::UMINV", SDT_AArch64UnaryVec>;
296*9880d681SAndroid Build Coastguard Workerdef AArch64smaxv    : SDNode<"AArch64ISD::SMAXV", SDT_AArch64UnaryVec>;
297*9880d681SAndroid Build Coastguard Workerdef AArch64umaxv    : SDNode<"AArch64ISD::UMAXV", SDT_AArch64UnaryVec>;
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Worker// AArch64 Instruction Predicate Definitions.
304*9880d681SAndroid Build Coastguard Workerdef IsDarwin  : Predicate<"Subtarget->isTargetDarwin()">;
305*9880d681SAndroid Build Coastguard Workerdef IsNotDarwin: Predicate<"!Subtarget->isTargetDarwin()">;
306*9880d681SAndroid Build Coastguard Workerdef ForCodeSize   : Predicate<"ForCodeSize">;
307*9880d681SAndroid Build Coastguard Workerdef NotForCodeSize   : Predicate<"!ForCodeSize">;
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Workerinclude "AArch64InstrFormats.td"
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
314*9880d681SAndroid Build Coastguard Worker// Miscellaneous instructions.
315*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard Workerlet Defs = [SP], Uses = [SP], hasSideEffects = 1, isCodeGenOnly = 1 in {
318*9880d681SAndroid Build Coastguard Worker// We set Sched to empty list because we expect these instructions to simply get
319*9880d681SAndroid Build Coastguard Worker// removed in most cases.
320*9880d681SAndroid Build Coastguard Workerdef ADJCALLSTACKDOWN : Pseudo<(outs), (ins i32imm:$amt),
321*9880d681SAndroid Build Coastguard Worker                              [(AArch64callseq_start timm:$amt)]>, Sched<[]>;
322*9880d681SAndroid Build Coastguard Workerdef ADJCALLSTACKUP : Pseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2),
323*9880d681SAndroid Build Coastguard Worker                            [(AArch64callseq_end timm:$amt1, timm:$amt2)]>,
324*9880d681SAndroid Build Coastguard Worker                            Sched<[]>;
325*9880d681SAndroid Build Coastguard Worker} // Defs = [SP], Uses = [SP], hasSideEffects = 1, isCodeGenOnly = 1
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isCodeGenOnly = 1 in {
328*9880d681SAndroid Build Coastguard Worker// FIXME: The following pseudo instructions are only needed because remat
329*9880d681SAndroid Build Coastguard Worker// cannot handle multiple instructions.  When that changes, they can be
330*9880d681SAndroid Build Coastguard Worker// removed, along with the AArch64Wrapper node.
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in
333*9880d681SAndroid Build Coastguard Workerdef LOADgot : Pseudo<(outs GPR64:$dst), (ins i64imm:$addr),
334*9880d681SAndroid Build Coastguard Worker                     [(set GPR64:$dst, (AArch64LOADgot tglobaladdr:$addr))]>,
335*9880d681SAndroid Build Coastguard Worker              Sched<[WriteLDAdr]>;
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Worker// The MOVaddr instruction should match only when the add is not folded
338*9880d681SAndroid Build Coastguard Worker// into a load or store address.
339*9880d681SAndroid Build Coastguard Workerdef MOVaddr
340*9880d681SAndroid Build Coastguard Worker    : Pseudo<(outs GPR64:$dst), (ins i64imm:$hi, i64imm:$low),
341*9880d681SAndroid Build Coastguard Worker             [(set GPR64:$dst, (AArch64addlow (AArch64adrp tglobaladdr:$hi),
342*9880d681SAndroid Build Coastguard Worker                                            tglobaladdr:$low))]>,
343*9880d681SAndroid Build Coastguard Worker      Sched<[WriteAdrAdr]>;
344*9880d681SAndroid Build Coastguard Workerdef MOVaddrJT
345*9880d681SAndroid Build Coastguard Worker    : Pseudo<(outs GPR64:$dst), (ins i64imm:$hi, i64imm:$low),
346*9880d681SAndroid Build Coastguard Worker             [(set GPR64:$dst, (AArch64addlow (AArch64adrp tjumptable:$hi),
347*9880d681SAndroid Build Coastguard Worker                                             tjumptable:$low))]>,
348*9880d681SAndroid Build Coastguard Worker      Sched<[WriteAdrAdr]>;
349*9880d681SAndroid Build Coastguard Workerdef MOVaddrCP
350*9880d681SAndroid Build Coastguard Worker    : Pseudo<(outs GPR64:$dst), (ins i64imm:$hi, i64imm:$low),
351*9880d681SAndroid Build Coastguard Worker             [(set GPR64:$dst, (AArch64addlow (AArch64adrp tconstpool:$hi),
352*9880d681SAndroid Build Coastguard Worker                                             tconstpool:$low))]>,
353*9880d681SAndroid Build Coastguard Worker      Sched<[WriteAdrAdr]>;
354*9880d681SAndroid Build Coastguard Workerdef MOVaddrBA
355*9880d681SAndroid Build Coastguard Worker    : Pseudo<(outs GPR64:$dst), (ins i64imm:$hi, i64imm:$low),
356*9880d681SAndroid Build Coastguard Worker             [(set GPR64:$dst, (AArch64addlow (AArch64adrp tblockaddress:$hi),
357*9880d681SAndroid Build Coastguard Worker                                             tblockaddress:$low))]>,
358*9880d681SAndroid Build Coastguard Worker      Sched<[WriteAdrAdr]>;
359*9880d681SAndroid Build Coastguard Workerdef MOVaddrTLS
360*9880d681SAndroid Build Coastguard Worker    : Pseudo<(outs GPR64:$dst), (ins i64imm:$hi, i64imm:$low),
361*9880d681SAndroid Build Coastguard Worker             [(set GPR64:$dst, (AArch64addlow (AArch64adrp tglobaltlsaddr:$hi),
362*9880d681SAndroid Build Coastguard Worker                                            tglobaltlsaddr:$low))]>,
363*9880d681SAndroid Build Coastguard Worker      Sched<[WriteAdrAdr]>;
364*9880d681SAndroid Build Coastguard Workerdef MOVaddrEXT
365*9880d681SAndroid Build Coastguard Worker    : Pseudo<(outs GPR64:$dst), (ins i64imm:$hi, i64imm:$low),
366*9880d681SAndroid Build Coastguard Worker             [(set GPR64:$dst, (AArch64addlow (AArch64adrp texternalsym:$hi),
367*9880d681SAndroid Build Coastguard Worker                                            texternalsym:$low))]>,
368*9880d681SAndroid Build Coastguard Worker      Sched<[WriteAdrAdr]>;
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Worker} // isReMaterializable, isCodeGenOnly
371*9880d681SAndroid Build Coastguard Worker
372*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64LOADgot tglobaltlsaddr:$addr),
373*9880d681SAndroid Build Coastguard Worker          (LOADgot tglobaltlsaddr:$addr)>;
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64LOADgot texternalsym:$addr),
376*9880d681SAndroid Build Coastguard Worker          (LOADgot texternalsym:$addr)>;
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64LOADgot tconstpool:$addr),
379*9880d681SAndroid Build Coastguard Worker          (LOADgot tconstpool:$addr)>;
380*9880d681SAndroid Build Coastguard Worker
381*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
382*9880d681SAndroid Build Coastguard Worker// System instructions.
383*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Workerdef HINT : HintI<"hint">;
386*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"nop",  (HINT 0b000)>;
387*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"yield",(HINT 0b001)>;
388*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"wfe",  (HINT 0b010)>;
389*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"wfi",  (HINT 0b011)>;
390*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sev",  (HINT 0b100)>;
391*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sevl", (HINT 0b101)>;
392*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"esb",  (HINT 0b10000)>, Requires<[HasRAS]>;
393*9880d681SAndroid Build Coastguard Worker
394*9880d681SAndroid Build Coastguard Worker// v8.2a Statistical Profiling extension
395*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"psb $op",  (HINT psbhint_op:$op)>, Requires<[HasSPE]>;
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Worker// As far as LLVM is concerned this writes to the system's exclusive monitors.
398*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, mayStore = 1 in
399*9880d681SAndroid Build Coastguard Workerdef CLREX : CRmSystemI<imm0_15, 0b010, "clrex">;
400*9880d681SAndroid Build Coastguard Worker
401*9880d681SAndroid Build Coastguard Worker// NOTE: ideally, this would have mayStore = 0, mayLoad = 0, but we cannot
402*9880d681SAndroid Build Coastguard Worker// model patterns with sufficiently fine granularity.
403*9880d681SAndroid Build Coastguard Workerlet mayLoad = ?, mayStore = ? in {
404*9880d681SAndroid Build Coastguard Workerdef DMB   : CRmSystemI<barrier_op, 0b101, "dmb",
405*9880d681SAndroid Build Coastguard Worker                       [(int_aarch64_dmb (i32 imm32_0_15:$CRm))]>;
406*9880d681SAndroid Build Coastguard Worker
407*9880d681SAndroid Build Coastguard Workerdef DSB   : CRmSystemI<barrier_op, 0b100, "dsb",
408*9880d681SAndroid Build Coastguard Worker                       [(int_aarch64_dsb (i32 imm32_0_15:$CRm))]>;
409*9880d681SAndroid Build Coastguard Worker
410*9880d681SAndroid Build Coastguard Workerdef ISB   : CRmSystemI<barrier_op, 0b110, "isb",
411*9880d681SAndroid Build Coastguard Worker                       [(int_aarch64_isb (i32 imm32_0_15:$CRm))]>;
412*9880d681SAndroid Build Coastguard Worker}
413*9880d681SAndroid Build Coastguard Worker
414*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"clrex", (CLREX 0xf)>;
415*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"isb", (ISB 0xf)>;
416*9880d681SAndroid Build Coastguard Worker
417*9880d681SAndroid Build Coastguard Workerdef MRS    : MRSI;
418*9880d681SAndroid Build Coastguard Workerdef MSR    : MSRI;
419*9880d681SAndroid Build Coastguard Workerdef MSRpstateImm1 : MSRpstateImm0_1;
420*9880d681SAndroid Build Coastguard Workerdef MSRpstateImm4 : MSRpstateImm0_15;
421*9880d681SAndroid Build Coastguard Worker
422*9880d681SAndroid Build Coastguard Worker// The thread pointer (on Linux, at least, where this has been implemented) is
423*9880d681SAndroid Build Coastguard Worker// TPIDR_EL0.
424*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64threadpointer), (MRS 0xde82)>;
425*9880d681SAndroid Build Coastguard Worker
426*9880d681SAndroid Build Coastguard Worker// The cycle counter PMC register is PMCCNTR_EL0.
427*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasPerfMon] in
428*9880d681SAndroid Build Coastguard Workerdef : Pat<(readcyclecounter), (MRS 0xdce8)>;
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Worker// Generic system instructions
431*9880d681SAndroid Build Coastguard Workerdef SYSxt  : SystemXtI<0, "sys">;
432*9880d681SAndroid Build Coastguard Workerdef SYSLxt : SystemLXtI<1, "sysl">;
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sys $op1, $Cn, $Cm, $op2",
435*9880d681SAndroid Build Coastguard Worker                (SYSxt imm0_7:$op1, sys_cr_op:$Cn,
436*9880d681SAndroid Build Coastguard Worker                 sys_cr_op:$Cm, imm0_7:$op2, XZR)>;
437*9880d681SAndroid Build Coastguard Worker
438*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
439*9880d681SAndroid Build Coastguard Worker// Move immediate instructions.
440*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
441*9880d681SAndroid Build Coastguard Worker
442*9880d681SAndroid Build Coastguard Workerdefm MOVK : InsertImmediate<0b11, "movk">;
443*9880d681SAndroid Build Coastguard Workerdefm MOVN : MoveImmediate<0b00, "movn">;
444*9880d681SAndroid Build Coastguard Worker
445*9880d681SAndroid Build Coastguard Workerlet PostEncoderMethod = "fixMOVZ" in
446*9880d681SAndroid Build Coastguard Workerdefm MOVZ : MoveImmediate<0b10, "movz">;
447*9880d681SAndroid Build Coastguard Worker
448*9880d681SAndroid Build Coastguard Worker// First group of aliases covers an implicit "lsl #0".
449*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $dst, $imm", (MOVKWi GPR32:$dst, imm0_65535:$imm, 0)>;
450*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $dst, $imm", (MOVKXi GPR64:$dst, imm0_65535:$imm, 0)>;
451*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $dst, $imm", (MOVNWi GPR32:$dst, imm0_65535:$imm, 0)>;
452*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $dst, $imm", (MOVNXi GPR64:$dst, imm0_65535:$imm, 0)>;
453*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $dst, $imm", (MOVZWi GPR32:$dst, imm0_65535:$imm, 0)>;
454*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $dst, $imm", (MOVZXi GPR64:$dst, imm0_65535:$imm, 0)>;
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Worker// Next, we have various ELF relocations with the ":XYZ_g0:sym" syntax.
457*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movz_symbol_g3:$sym, 48)>;
458*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movz_symbol_g2:$sym, 32)>;
459*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movz_symbol_g1:$sym, 16)>;
460*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movz_symbol_g0:$sym, 0)>;
461*9880d681SAndroid Build Coastguard Worker
462*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movz_symbol_g3:$sym, 48)>;
463*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movz_symbol_g2:$sym, 32)>;
464*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movz_symbol_g1:$sym, 16)>;
465*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movz_symbol_g0:$sym, 0)>;
466*9880d681SAndroid Build Coastguard Worker
467*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g3:$sym, 48)>;
468*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g2:$sym, 32)>;
469*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g1:$sym, 16)>;
470*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g0:$sym, 0)>;
471*9880d681SAndroid Build Coastguard Worker
472*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $Rd, $sym", (MOVZWi GPR32:$Rd, movz_symbol_g1:$sym, 16)>;
473*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movz $Rd, $sym", (MOVZWi GPR32:$Rd, movz_symbol_g0:$sym, 0)>;
474*9880d681SAndroid Build Coastguard Worker
475*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $Rd, $sym", (MOVNWi GPR32:$Rd, movz_symbol_g1:$sym, 16)>;
476*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movn $Rd, $sym", (MOVNWi GPR32:$Rd, movz_symbol_g0:$sym, 0)>;
477*9880d681SAndroid Build Coastguard Worker
478*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $Rd, $sym", (MOVKWi GPR32:$Rd, movk_symbol_g1:$sym, 16)>;
479*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movk $Rd, $sym", (MOVKWi GPR32:$Rd, movk_symbol_g0:$sym, 0)>;
480*9880d681SAndroid Build Coastguard Worker
481*9880d681SAndroid Build Coastguard Worker// Final group of aliases covers true "mov $Rd, $imm" cases.
482*9880d681SAndroid Build Coastguard Workermulticlass movw_mov_alias<string basename,Instruction INST, RegisterClass GPR,
483*9880d681SAndroid Build Coastguard Worker                          int width, int shift> {
484*9880d681SAndroid Build Coastguard Worker  def _asmoperand : AsmOperandClass {
485*9880d681SAndroid Build Coastguard Worker    let Name = basename # width # "_lsl" # shift # "MovAlias";
486*9880d681SAndroid Build Coastguard Worker    let PredicateMethod = "is" # basename # "MovAlias<" # width # ", "
487*9880d681SAndroid Build Coastguard Worker                               # shift # ">";
488*9880d681SAndroid Build Coastguard Worker    let RenderMethod = "add" # basename # "MovAliasOperands<" # shift # ">";
489*9880d681SAndroid Build Coastguard Worker  }
490*9880d681SAndroid Build Coastguard Worker
491*9880d681SAndroid Build Coastguard Worker  def _movimm : Operand<i32> {
492*9880d681SAndroid Build Coastguard Worker    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_asmoperand");
493*9880d681SAndroid Build Coastguard Worker  }
494*9880d681SAndroid Build Coastguard Worker
495*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"mov $Rd, $imm",
496*9880d681SAndroid Build Coastguard Worker                  (INST GPR:$Rd, !cast<Operand>(NAME # "_movimm"):$imm, shift)>;
497*9880d681SAndroid Build Coastguard Worker}
498*9880d681SAndroid Build Coastguard Worker
499*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVZ", MOVZWi, GPR32, 32, 0>;
500*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVZ", MOVZWi, GPR32, 32, 16>;
501*9880d681SAndroid Build Coastguard Worker
502*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVZ", MOVZXi, GPR64, 64, 0>;
503*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVZ", MOVZXi, GPR64, 64, 16>;
504*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVZ", MOVZXi, GPR64, 64, 32>;
505*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVZ", MOVZXi, GPR64, 64, 48>;
506*9880d681SAndroid Build Coastguard Worker
507*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVN", MOVNWi, GPR32, 32, 0>;
508*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVN", MOVNWi, GPR32, 32, 16>;
509*9880d681SAndroid Build Coastguard Worker
510*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVN", MOVNXi, GPR64, 64, 0>;
511*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVN", MOVNXi, GPR64, 64, 16>;
512*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVN", MOVNXi, GPR64, 64, 32>;
513*9880d681SAndroid Build Coastguard Workerdefm : movw_mov_alias<"MOVN", MOVNXi, GPR64, 64, 48>;
514*9880d681SAndroid Build Coastguard Worker
515*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isCodeGenOnly = 1, isMoveImm = 1,
516*9880d681SAndroid Build Coastguard Worker    isAsCheapAsAMove = 1 in {
517*9880d681SAndroid Build Coastguard Worker// FIXME: The following pseudo instructions are only needed because remat
518*9880d681SAndroid Build Coastguard Worker// cannot handle multiple instructions.  When that changes, we can select
519*9880d681SAndroid Build Coastguard Worker// directly to the real instructions and get rid of these pseudos.
520*9880d681SAndroid Build Coastguard Worker
521*9880d681SAndroid Build Coastguard Workerdef MOVi32imm
522*9880d681SAndroid Build Coastguard Worker    : Pseudo<(outs GPR32:$dst), (ins i32imm:$src),
523*9880d681SAndroid Build Coastguard Worker             [(set GPR32:$dst, imm:$src)]>,
524*9880d681SAndroid Build Coastguard Worker      Sched<[WriteImm]>;
525*9880d681SAndroid Build Coastguard Workerdef MOVi64imm
526*9880d681SAndroid Build Coastguard Worker    : Pseudo<(outs GPR64:$dst), (ins i64imm:$src),
527*9880d681SAndroid Build Coastguard Worker             [(set GPR64:$dst, imm:$src)]>,
528*9880d681SAndroid Build Coastguard Worker      Sched<[WriteImm]>;
529*9880d681SAndroid Build Coastguard Worker} // isReMaterializable, isCodeGenOnly
530*9880d681SAndroid Build Coastguard Worker
531*9880d681SAndroid Build Coastguard Worker// If possible, we want to use MOVi32imm even for 64-bit moves. This gives the
532*9880d681SAndroid Build Coastguard Worker// eventual expansion code fewer bits to worry about getting right. Marshalling
533*9880d681SAndroid Build Coastguard Worker// the types is a little tricky though:
534*9880d681SAndroid Build Coastguard Workerdef i64imm_32bit : ImmLeaf<i64, [{
535*9880d681SAndroid Build Coastguard Worker  return (Imm & 0xffffffffULL) == static_cast<uint64_t>(Imm);
536*9880d681SAndroid Build Coastguard Worker}]>;
537*9880d681SAndroid Build Coastguard Worker
538*9880d681SAndroid Build Coastguard Workerdef s64imm_32bit : ImmLeaf<i64, [{
539*9880d681SAndroid Build Coastguard Worker  int64_t Imm64 = static_cast<int64_t>(Imm);
540*9880d681SAndroid Build Coastguard Worker  return Imm64 >= std::numeric_limits<int32_t>::min() &&
541*9880d681SAndroid Build Coastguard Worker         Imm64 <= std::numeric_limits<int32_t>::max();
542*9880d681SAndroid Build Coastguard Worker}]>;
543*9880d681SAndroid Build Coastguard Worker
544*9880d681SAndroid Build Coastguard Workerdef trunc_imm : SDNodeXForm<imm, [{
545*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(N->getZExtValue(), SDLoc(N), MVT::i32);
546*9880d681SAndroid Build Coastguard Worker}]>;
547*9880d681SAndroid Build Coastguard Worker
548*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 i64imm_32bit:$src),
549*9880d681SAndroid Build Coastguard Worker          (SUBREG_TO_REG (i64 0), (MOVi32imm (trunc_imm imm:$src)), sub_32)>;
550*9880d681SAndroid Build Coastguard Worker
551*9880d681SAndroid Build Coastguard Worker// Materialize FP constants via MOVi32imm/MOVi64imm (MachO large code model).
552*9880d681SAndroid Build Coastguard Workerdef bitcast_fpimm_to_i32 : SDNodeXForm<fpimm, [{
553*9880d681SAndroid Build Coastguard Workerreturn CurDAG->getTargetConstant(
554*9880d681SAndroid Build Coastguard Worker  N->getValueAPF().bitcastToAPInt().getZExtValue(), SDLoc(N), MVT::i32);
555*9880d681SAndroid Build Coastguard Worker}]>;
556*9880d681SAndroid Build Coastguard Worker
557*9880d681SAndroid Build Coastguard Workerdef bitcast_fpimm_to_i64 : SDNodeXForm<fpimm, [{
558*9880d681SAndroid Build Coastguard Workerreturn CurDAG->getTargetConstant(
559*9880d681SAndroid Build Coastguard Worker  N->getValueAPF().bitcastToAPInt().getZExtValue(), SDLoc(N), MVT::i64);
560*9880d681SAndroid Build Coastguard Worker}]>;
561*9880d681SAndroid Build Coastguard Worker
562*9880d681SAndroid Build Coastguard Worker
563*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 fpimm:$in),
564*9880d681SAndroid Build Coastguard Worker  (COPY_TO_REGCLASS (MOVi32imm (bitcast_fpimm_to_i32 f32:$in)), FPR32)>;
565*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 fpimm:$in),
566*9880d681SAndroid Build Coastguard Worker  (COPY_TO_REGCLASS (MOVi64imm (bitcast_fpimm_to_i64 f64:$in)), FPR64)>;
567*9880d681SAndroid Build Coastguard Worker
568*9880d681SAndroid Build Coastguard Worker
569*9880d681SAndroid Build Coastguard Worker// Deal with the various forms of (ELF) large addressing with MOVZ/MOVK
570*9880d681SAndroid Build Coastguard Worker// sequences.
571*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64WrapperLarge tglobaladdr:$g3, tglobaladdr:$g2,
572*9880d681SAndroid Build Coastguard Worker                             tglobaladdr:$g1, tglobaladdr:$g0),
573*9880d681SAndroid Build Coastguard Worker          (MOVKXi (MOVKXi (MOVKXi (MOVZXi tglobaladdr:$g3, 48),
574*9880d681SAndroid Build Coastguard Worker                                  tglobaladdr:$g2, 32),
575*9880d681SAndroid Build Coastguard Worker                          tglobaladdr:$g1, 16),
576*9880d681SAndroid Build Coastguard Worker                  tglobaladdr:$g0, 0)>;
577*9880d681SAndroid Build Coastguard Worker
578*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64WrapperLarge tblockaddress:$g3, tblockaddress:$g2,
579*9880d681SAndroid Build Coastguard Worker                             tblockaddress:$g1, tblockaddress:$g0),
580*9880d681SAndroid Build Coastguard Worker          (MOVKXi (MOVKXi (MOVKXi (MOVZXi tblockaddress:$g3, 48),
581*9880d681SAndroid Build Coastguard Worker                                  tblockaddress:$g2, 32),
582*9880d681SAndroid Build Coastguard Worker                          tblockaddress:$g1, 16),
583*9880d681SAndroid Build Coastguard Worker                  tblockaddress:$g0, 0)>;
584*9880d681SAndroid Build Coastguard Worker
585*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64WrapperLarge tconstpool:$g3, tconstpool:$g2,
586*9880d681SAndroid Build Coastguard Worker                             tconstpool:$g1, tconstpool:$g0),
587*9880d681SAndroid Build Coastguard Worker          (MOVKXi (MOVKXi (MOVKXi (MOVZXi tconstpool:$g3, 48),
588*9880d681SAndroid Build Coastguard Worker                                  tconstpool:$g2, 32),
589*9880d681SAndroid Build Coastguard Worker                          tconstpool:$g1, 16),
590*9880d681SAndroid Build Coastguard Worker                  tconstpool:$g0, 0)>;
591*9880d681SAndroid Build Coastguard Worker
592*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64WrapperLarge tjumptable:$g3, tjumptable:$g2,
593*9880d681SAndroid Build Coastguard Worker                             tjumptable:$g1, tjumptable:$g0),
594*9880d681SAndroid Build Coastguard Worker          (MOVKXi (MOVKXi (MOVKXi (MOVZXi tjumptable:$g3, 48),
595*9880d681SAndroid Build Coastguard Worker                                  tjumptable:$g2, 32),
596*9880d681SAndroid Build Coastguard Worker                          tjumptable:$g1, 16),
597*9880d681SAndroid Build Coastguard Worker                  tjumptable:$g0, 0)>;
598*9880d681SAndroid Build Coastguard Worker
599*9880d681SAndroid Build Coastguard Worker
600*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
601*9880d681SAndroid Build Coastguard Worker// Arithmetic instructions.
602*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
603*9880d681SAndroid Build Coastguard Worker
604*9880d681SAndroid Build Coastguard Worker// Add/subtract with carry.
605*9880d681SAndroid Build Coastguard Workerdefm ADC : AddSubCarry<0, "adc", "adcs", AArch64adc, AArch64adc_flag>;
606*9880d681SAndroid Build Coastguard Workerdefm SBC : AddSubCarry<1, "sbc", "sbcs", AArch64sbc, AArch64sbc_flag>;
607*9880d681SAndroid Build Coastguard Worker
608*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ngc $dst, $src",  (SBCWr  GPR32:$dst, WZR, GPR32:$src)>;
609*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ngc $dst, $src",  (SBCXr  GPR64:$dst, XZR, GPR64:$src)>;
610*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ngcs $dst, $src", (SBCSWr GPR32:$dst, WZR, GPR32:$src)>;
611*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ngcs $dst, $src", (SBCSXr GPR64:$dst, XZR, GPR64:$src)>;
612*9880d681SAndroid Build Coastguard Worker
613*9880d681SAndroid Build Coastguard Worker// Add/subtract
614*9880d681SAndroid Build Coastguard Workerdefm ADD : AddSub<0, "add", "sub", add>;
615*9880d681SAndroid Build Coastguard Workerdefm SUB : AddSub<1, "sub", "add">;
616*9880d681SAndroid Build Coastguard Worker
617*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $src",
618*9880d681SAndroid Build Coastguard Worker                (ADDWri GPR32sponly:$dst, GPR32sp:$src, 0, 0)>;
619*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $src",
620*9880d681SAndroid Build Coastguard Worker                (ADDWri GPR32sp:$dst, GPR32sponly:$src, 0, 0)>;
621*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $src",
622*9880d681SAndroid Build Coastguard Worker                (ADDXri GPR64sponly:$dst, GPR64sp:$src, 0, 0)>;
623*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $src",
624*9880d681SAndroid Build Coastguard Worker                (ADDXri GPR64sp:$dst, GPR64sponly:$src, 0, 0)>;
625*9880d681SAndroid Build Coastguard Worker
626*9880d681SAndroid Build Coastguard Workerdefm ADDS : AddSubS<0, "adds", AArch64add_flag, "cmn", "subs", "cmp">;
627*9880d681SAndroid Build Coastguard Workerdefm SUBS : AddSubS<1, "subs", AArch64sub_flag, "cmp", "adds", "cmn">;
628*9880d681SAndroid Build Coastguard Worker
629*9880d681SAndroid Build Coastguard Worker// Use SUBS instead of SUB to enable CSE between SUBS and SUB.
630*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR32sp:$Rn, addsub_shifted_imm32:$imm),
631*9880d681SAndroid Build Coastguard Worker          (SUBSWri GPR32sp:$Rn, addsub_shifted_imm32:$imm)>;
632*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR64sp:$Rn, addsub_shifted_imm64:$imm),
633*9880d681SAndroid Build Coastguard Worker          (SUBSXri GPR64sp:$Rn, addsub_shifted_imm64:$imm)>;
634*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR32:$Rn, GPR32:$Rm),
635*9880d681SAndroid Build Coastguard Worker          (SUBSWrr GPR32:$Rn, GPR32:$Rm)>;
636*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR64:$Rn, GPR64:$Rm),
637*9880d681SAndroid Build Coastguard Worker          (SUBSXrr GPR64:$Rn, GPR64:$Rm)>;
638*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR32:$Rn, arith_shifted_reg32:$Rm),
639*9880d681SAndroid Build Coastguard Worker          (SUBSWrs GPR32:$Rn, arith_shifted_reg32:$Rm)>;
640*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR64:$Rn, arith_shifted_reg64:$Rm),
641*9880d681SAndroid Build Coastguard Worker          (SUBSXrs GPR64:$Rn, arith_shifted_reg64:$Rm)>;
642*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 1 in {
643*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR32sp:$R2, arith_extended_reg32<i32>:$R3),
644*9880d681SAndroid Build Coastguard Worker          (SUBSWrx GPR32sp:$R2, arith_extended_reg32<i32>:$R3)>;
645*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR64sp:$R2, arith_extended_reg32to64<i64>:$R3),
646*9880d681SAndroid Build Coastguard Worker          (SUBSXrx GPR64sp:$R2, arith_extended_reg32to64<i64>:$R3)>;
647*9880d681SAndroid Build Coastguard Worker}
648*9880d681SAndroid Build Coastguard Worker
649*9880d681SAndroid Build Coastguard Worker// Because of the immediate format for add/sub-imm instructions, the
650*9880d681SAndroid Build Coastguard Worker// expression (add x, -1) must be transformed to (SUB{W,X}ri x, 1).
651*9880d681SAndroid Build Coastguard Worker//  These patterns capture that transformation.
652*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 1 in {
653*9880d681SAndroid Build Coastguard Workerdef : Pat<(add GPR32:$Rn, neg_addsub_shifted_imm32:$imm),
654*9880d681SAndroid Build Coastguard Worker          (SUBSWri GPR32:$Rn, neg_addsub_shifted_imm32:$imm)>;
655*9880d681SAndroid Build Coastguard Workerdef : Pat<(add GPR64:$Rn, neg_addsub_shifted_imm64:$imm),
656*9880d681SAndroid Build Coastguard Worker          (SUBSXri GPR64:$Rn, neg_addsub_shifted_imm64:$imm)>;
657*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR32:$Rn, neg_addsub_shifted_imm32:$imm),
658*9880d681SAndroid Build Coastguard Worker          (ADDWri GPR32:$Rn, neg_addsub_shifted_imm32:$imm)>;
659*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub GPR64:$Rn, neg_addsub_shifted_imm64:$imm),
660*9880d681SAndroid Build Coastguard Worker          (ADDXri GPR64:$Rn, neg_addsub_shifted_imm64:$imm)>;
661*9880d681SAndroid Build Coastguard Worker}
662*9880d681SAndroid Build Coastguard Worker
663*9880d681SAndroid Build Coastguard Worker// Because of the immediate format for add/sub-imm instructions, the
664*9880d681SAndroid Build Coastguard Worker// expression (add x, -1) must be transformed to (SUB{W,X}ri x, 1).
665*9880d681SAndroid Build Coastguard Worker//  These patterns capture that transformation.
666*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 1 in {
667*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64add_flag GPR32:$Rn, neg_addsub_shifted_imm32:$imm),
668*9880d681SAndroid Build Coastguard Worker          (SUBSWri GPR32:$Rn, neg_addsub_shifted_imm32:$imm)>;
669*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64add_flag GPR64:$Rn, neg_addsub_shifted_imm64:$imm),
670*9880d681SAndroid Build Coastguard Worker          (SUBSXri GPR64:$Rn, neg_addsub_shifted_imm64:$imm)>;
671*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64sub_flag GPR32:$Rn, neg_addsub_shifted_imm32:$imm),
672*9880d681SAndroid Build Coastguard Worker          (ADDSWri GPR32:$Rn, neg_addsub_shifted_imm32:$imm)>;
673*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64sub_flag GPR64:$Rn, neg_addsub_shifted_imm64:$imm),
674*9880d681SAndroid Build Coastguard Worker          (ADDSXri GPR64:$Rn, neg_addsub_shifted_imm64:$imm)>;
675*9880d681SAndroid Build Coastguard Worker}
676*9880d681SAndroid Build Coastguard Worker
677*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"neg $dst, $src", (SUBWrs GPR32:$dst, WZR, GPR32:$src, 0), 3>;
678*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"neg $dst, $src", (SUBXrs GPR64:$dst, XZR, GPR64:$src, 0), 3>;
679*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"neg $dst, $src$shift",
680*9880d681SAndroid Build Coastguard Worker                (SUBWrs GPR32:$dst, WZR, GPR32:$src, arith_shift32:$shift), 2>;
681*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"neg $dst, $src$shift",
682*9880d681SAndroid Build Coastguard Worker                (SUBXrs GPR64:$dst, XZR, GPR64:$src, arith_shift64:$shift), 2>;
683*9880d681SAndroid Build Coastguard Worker
684*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"negs $dst, $src", (SUBSWrs GPR32:$dst, WZR, GPR32:$src, 0), 3>;
685*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"negs $dst, $src", (SUBSXrs GPR64:$dst, XZR, GPR64:$src, 0), 3>;
686*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"negs $dst, $src$shift",
687*9880d681SAndroid Build Coastguard Worker                (SUBSWrs GPR32:$dst, WZR, GPR32:$src, arith_shift32:$shift), 2>;
688*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"negs $dst, $src$shift",
689*9880d681SAndroid Build Coastguard Worker                (SUBSXrs GPR64:$dst, XZR, GPR64:$src, arith_shift64:$shift), 2>;
690*9880d681SAndroid Build Coastguard Worker
691*9880d681SAndroid Build Coastguard Worker
692*9880d681SAndroid Build Coastguard Worker// Unsigned/Signed divide
693*9880d681SAndroid Build Coastguard Workerdefm UDIV : Div<0, "udiv", udiv>;
694*9880d681SAndroid Build Coastguard Workerdefm SDIV : Div<1, "sdiv", sdiv>;
695*9880d681SAndroid Build Coastguard Worker
696*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_udiv GPR32:$Rn, GPR32:$Rm), (UDIVWr $Rn, $Rm)>;
697*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_udiv GPR64:$Rn, GPR64:$Rm), (UDIVXr $Rn, $Rm)>;
698*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_sdiv GPR32:$Rn, GPR32:$Rm), (SDIVWr $Rn, $Rm)>;
699*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_sdiv GPR64:$Rn, GPR64:$Rm), (SDIVXr $Rn, $Rm)>;
700*9880d681SAndroid Build Coastguard Worker
701*9880d681SAndroid Build Coastguard Worker// Variable shift
702*9880d681SAndroid Build Coastguard Workerdefm ASRV : Shift<0b10, "asr", sra>;
703*9880d681SAndroid Build Coastguard Workerdefm LSLV : Shift<0b00, "lsl", shl>;
704*9880d681SAndroid Build Coastguard Workerdefm LSRV : Shift<0b01, "lsr", srl>;
705*9880d681SAndroid Build Coastguard Workerdefm RORV : Shift<0b11, "ror", rotr>;
706*9880d681SAndroid Build Coastguard Worker
707*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"asrv", ASRVWr, GPR32>;
708*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"asrv", ASRVXr, GPR64>;
709*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"lslv", LSLVWr, GPR32>;
710*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"lslv", LSLVXr, GPR64>;
711*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"lsrv", LSRVWr, GPR32>;
712*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"lsrv", LSRVXr, GPR64>;
713*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"rorv", RORVWr, GPR32>;
714*9880d681SAndroid Build Coastguard Workerdef : ShiftAlias<"rorv", RORVXr, GPR64>;
715*9880d681SAndroid Build Coastguard Worker
716*9880d681SAndroid Build Coastguard Worker// Multiply-add
717*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 7 in {
718*9880d681SAndroid Build Coastguard Workerdefm MADD : MulAccum<0, "madd", add>;
719*9880d681SAndroid Build Coastguard Workerdefm MSUB : MulAccum<1, "msub", sub>;
720*9880d681SAndroid Build Coastguard Worker
721*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (mul GPR32:$Rn, GPR32:$Rm)),
722*9880d681SAndroid Build Coastguard Worker          (MADDWrrr GPR32:$Rn, GPR32:$Rm, WZR)>;
723*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul GPR64:$Rn, GPR64:$Rm)),
724*9880d681SAndroid Build Coastguard Worker          (MADDXrrr GPR64:$Rn, GPR64:$Rm, XZR)>;
725*9880d681SAndroid Build Coastguard Worker
726*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (ineg (mul GPR32:$Rn, GPR32:$Rm))),
727*9880d681SAndroid Build Coastguard Worker          (MSUBWrrr GPR32:$Rn, GPR32:$Rm, WZR)>;
728*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (ineg (mul GPR64:$Rn, GPR64:$Rm))),
729*9880d681SAndroid Build Coastguard Worker          (MSUBXrrr GPR64:$Rn, GPR64:$Rm, XZR)>;
730*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (mul (ineg GPR32:$Rn), GPR32:$Rm)),
731*9880d681SAndroid Build Coastguard Worker          (MSUBWrrr GPR32:$Rn, GPR32:$Rm, WZR)>;
732*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul (ineg GPR64:$Rn), GPR64:$Rm)),
733*9880d681SAndroid Build Coastguard Worker          (MSUBXrrr GPR64:$Rn, GPR64:$Rm, XZR)>;
734*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 7
735*9880d681SAndroid Build Coastguard Worker
736*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 5 in {
737*9880d681SAndroid Build Coastguard Workerdef SMADDLrrr : WideMulAccum<0, 0b001, "smaddl", add, sext>;
738*9880d681SAndroid Build Coastguard Workerdef SMSUBLrrr : WideMulAccum<1, 0b001, "smsubl", sub, sext>;
739*9880d681SAndroid Build Coastguard Workerdef UMADDLrrr : WideMulAccum<0, 0b101, "umaddl", add, zext>;
740*9880d681SAndroid Build Coastguard Workerdef UMSUBLrrr : WideMulAccum<1, 0b101, "umsubl", sub, zext>;
741*9880d681SAndroid Build Coastguard Worker
742*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul (sext GPR32:$Rn), (sext GPR32:$Rm))),
743*9880d681SAndroid Build Coastguard Worker          (SMADDLrrr GPR32:$Rn, GPR32:$Rm, XZR)>;
744*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul (zext GPR32:$Rn), (zext GPR32:$Rm))),
745*9880d681SAndroid Build Coastguard Worker          (UMADDLrrr GPR32:$Rn, GPR32:$Rm, XZR)>;
746*9880d681SAndroid Build Coastguard Worker
747*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (ineg (mul (sext GPR32:$Rn), (sext GPR32:$Rm)))),
748*9880d681SAndroid Build Coastguard Worker          (SMSUBLrrr GPR32:$Rn, GPR32:$Rm, XZR)>;
749*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (ineg (mul (zext GPR32:$Rn), (zext GPR32:$Rm)))),
750*9880d681SAndroid Build Coastguard Worker          (UMSUBLrrr GPR32:$Rn, GPR32:$Rm, XZR)>;
751*9880d681SAndroid Build Coastguard Worker
752*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul (sext GPR32:$Rn), (s64imm_32bit:$C))),
753*9880d681SAndroid Build Coastguard Worker          (SMADDLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), XZR)>;
754*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul (zext GPR32:$Rn), (i64imm_32bit:$C))),
755*9880d681SAndroid Build Coastguard Worker          (UMADDLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), XZR)>;
756*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (mul (sext_inreg GPR64:$Rn, i32), (s64imm_32bit:$C))),
757*9880d681SAndroid Build Coastguard Worker          (SMADDLrrr (i32 (EXTRACT_SUBREG GPR64:$Rn, sub_32)),
758*9880d681SAndroid Build Coastguard Worker                     (MOVi32imm (trunc_imm imm:$C)), XZR)>;
759*9880d681SAndroid Build Coastguard Worker
760*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (ineg (mul (sext GPR32:$Rn), (s64imm_32bit:$C)))),
761*9880d681SAndroid Build Coastguard Worker          (SMSUBLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), XZR)>;
762*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (ineg (mul (zext GPR32:$Rn), (i64imm_32bit:$C)))),
763*9880d681SAndroid Build Coastguard Worker          (UMSUBLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), XZR)>;
764*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (ineg (mul (sext_inreg GPR64:$Rn, i32), (s64imm_32bit:$C)))),
765*9880d681SAndroid Build Coastguard Worker          (SMSUBLrrr (i32 (EXTRACT_SUBREG GPR64:$Rn, sub_32)),
766*9880d681SAndroid Build Coastguard Worker                     (MOVi32imm (trunc_imm imm:$C)), XZR)>;
767*9880d681SAndroid Build Coastguard Worker
768*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (add (mul (sext GPR32:$Rn), (s64imm_32bit:$C)), GPR64:$Ra)),
769*9880d681SAndroid Build Coastguard Worker          (SMADDLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>;
770*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (add (mul (zext GPR32:$Rn), (i64imm_32bit:$C)), GPR64:$Ra)),
771*9880d681SAndroid Build Coastguard Worker          (UMADDLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>;
772*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (add (mul (sext_inreg GPR64:$Rn, i32), (s64imm_32bit:$C)),
773*9880d681SAndroid Build Coastguard Worker                    GPR64:$Ra)),
774*9880d681SAndroid Build Coastguard Worker          (SMADDLrrr (i32 (EXTRACT_SUBREG GPR64:$Rn, sub_32)),
775*9880d681SAndroid Build Coastguard Worker                     (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>;
776*9880d681SAndroid Build Coastguard Worker
777*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sub GPR64:$Ra, (mul (sext GPR32:$Rn), (s64imm_32bit:$C)))),
778*9880d681SAndroid Build Coastguard Worker          (SMSUBLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>;
779*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sub GPR64:$Ra, (mul (zext GPR32:$Rn), (i64imm_32bit:$C)))),
780*9880d681SAndroid Build Coastguard Worker          (UMSUBLrrr GPR32:$Rn, (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>;
781*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sub GPR64:$Ra, (mul (sext_inreg GPR64:$Rn, i32),
782*9880d681SAndroid Build Coastguard Worker                                    (s64imm_32bit:$C)))),
783*9880d681SAndroid Build Coastguard Worker          (SMSUBLrrr (i32 (EXTRACT_SUBREG GPR64:$Rn, sub_32)),
784*9880d681SAndroid Build Coastguard Worker                     (MOVi32imm (trunc_imm imm:$C)), GPR64:$Ra)>;
785*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 5
786*9880d681SAndroid Build Coastguard Worker
787*9880d681SAndroid Build Coastguard Workerdef : MulAccumWAlias<"mul", MADDWrrr>;
788*9880d681SAndroid Build Coastguard Workerdef : MulAccumXAlias<"mul", MADDXrrr>;
789*9880d681SAndroid Build Coastguard Workerdef : MulAccumWAlias<"mneg", MSUBWrrr>;
790*9880d681SAndroid Build Coastguard Workerdef : MulAccumXAlias<"mneg", MSUBXrrr>;
791*9880d681SAndroid Build Coastguard Workerdef : WideMulAccumAlias<"smull", SMADDLrrr>;
792*9880d681SAndroid Build Coastguard Workerdef : WideMulAccumAlias<"smnegl", SMSUBLrrr>;
793*9880d681SAndroid Build Coastguard Workerdef : WideMulAccumAlias<"umull", UMADDLrrr>;
794*9880d681SAndroid Build Coastguard Workerdef : WideMulAccumAlias<"umnegl", UMSUBLrrr>;
795*9880d681SAndroid Build Coastguard Worker
796*9880d681SAndroid Build Coastguard Worker// Multiply-high
797*9880d681SAndroid Build Coastguard Workerdef SMULHrr : MulHi<0b010, "smulh", mulhs>;
798*9880d681SAndroid Build Coastguard Workerdef UMULHrr : MulHi<0b110, "umulh", mulhu>;
799*9880d681SAndroid Build Coastguard Worker
800*9880d681SAndroid Build Coastguard Worker// CRC32
801*9880d681SAndroid Build Coastguard Workerdef CRC32Brr : BaseCRC32<0, 0b00, 0, GPR32, int_aarch64_crc32b, "crc32b">;
802*9880d681SAndroid Build Coastguard Workerdef CRC32Hrr : BaseCRC32<0, 0b01, 0, GPR32, int_aarch64_crc32h, "crc32h">;
803*9880d681SAndroid Build Coastguard Workerdef CRC32Wrr : BaseCRC32<0, 0b10, 0, GPR32, int_aarch64_crc32w, "crc32w">;
804*9880d681SAndroid Build Coastguard Workerdef CRC32Xrr : BaseCRC32<1, 0b11, 0, GPR64, int_aarch64_crc32x, "crc32x">;
805*9880d681SAndroid Build Coastguard Worker
806*9880d681SAndroid Build Coastguard Workerdef CRC32CBrr : BaseCRC32<0, 0b00, 1, GPR32, int_aarch64_crc32cb, "crc32cb">;
807*9880d681SAndroid Build Coastguard Workerdef CRC32CHrr : BaseCRC32<0, 0b01, 1, GPR32, int_aarch64_crc32ch, "crc32ch">;
808*9880d681SAndroid Build Coastguard Workerdef CRC32CWrr : BaseCRC32<0, 0b10, 1, GPR32, int_aarch64_crc32cw, "crc32cw">;
809*9880d681SAndroid Build Coastguard Workerdef CRC32CXrr : BaseCRC32<1, 0b11, 1, GPR64, int_aarch64_crc32cx, "crc32cx">;
810*9880d681SAndroid Build Coastguard Worker
811*9880d681SAndroid Build Coastguard Worker// v8.1 atomic CAS
812*9880d681SAndroid Build Coastguard Workerdefm CAS   : CompareAndSwap<0, 0, "">;
813*9880d681SAndroid Build Coastguard Workerdefm CASA  : CompareAndSwap<1, 0, "a">;
814*9880d681SAndroid Build Coastguard Workerdefm CASL  : CompareAndSwap<0, 1, "l">;
815*9880d681SAndroid Build Coastguard Workerdefm CASAL : CompareAndSwap<1, 1, "al">;
816*9880d681SAndroid Build Coastguard Worker
817*9880d681SAndroid Build Coastguard Worker// v8.1 atomic CASP
818*9880d681SAndroid Build Coastguard Workerdefm CASP   : CompareAndSwapPair<0, 0, "">;
819*9880d681SAndroid Build Coastguard Workerdefm CASPA  : CompareAndSwapPair<1, 0, "a">;
820*9880d681SAndroid Build Coastguard Workerdefm CASPL  : CompareAndSwapPair<0, 1, "l">;
821*9880d681SAndroid Build Coastguard Workerdefm CASPAL : CompareAndSwapPair<1, 1, "al">;
822*9880d681SAndroid Build Coastguard Worker
823*9880d681SAndroid Build Coastguard Worker// v8.1 atomic SWP
824*9880d681SAndroid Build Coastguard Workerdefm SWP   : Swap<0, 0, "">;
825*9880d681SAndroid Build Coastguard Workerdefm SWPA  : Swap<1, 0, "a">;
826*9880d681SAndroid Build Coastguard Workerdefm SWPL  : Swap<0, 1, "l">;
827*9880d681SAndroid Build Coastguard Workerdefm SWPAL : Swap<1, 1, "al">;
828*9880d681SAndroid Build Coastguard Worker
829*9880d681SAndroid Build Coastguard Worker// v8.1 atomic LD<OP>(register). Performs load and then ST<OP>(register)
830*9880d681SAndroid Build Coastguard Workerdefm LDADD   : LDOPregister<0b000, "add", 0, 0, "">;
831*9880d681SAndroid Build Coastguard Workerdefm LDADDA  : LDOPregister<0b000, "add", 1, 0, "a">;
832*9880d681SAndroid Build Coastguard Workerdefm LDADDL  : LDOPregister<0b000, "add", 0, 1, "l">;
833*9880d681SAndroid Build Coastguard Workerdefm LDADDAL : LDOPregister<0b000, "add", 1, 1, "al">;
834*9880d681SAndroid Build Coastguard Worker
835*9880d681SAndroid Build Coastguard Workerdefm LDCLR   : LDOPregister<0b001, "clr", 0, 0, "">;
836*9880d681SAndroid Build Coastguard Workerdefm LDCLRA  : LDOPregister<0b001, "clr", 1, 0, "a">;
837*9880d681SAndroid Build Coastguard Workerdefm LDCLRL  : LDOPregister<0b001, "clr", 0, 1, "l">;
838*9880d681SAndroid Build Coastguard Workerdefm LDCLRAL : LDOPregister<0b001, "clr", 1, 1, "al">;
839*9880d681SAndroid Build Coastguard Worker
840*9880d681SAndroid Build Coastguard Workerdefm LDEOR   : LDOPregister<0b010, "eor", 0, 0, "">;
841*9880d681SAndroid Build Coastguard Workerdefm LDEORA  : LDOPregister<0b010, "eor", 1, 0, "a">;
842*9880d681SAndroid Build Coastguard Workerdefm LDEORL  : LDOPregister<0b010, "eor", 0, 1, "l">;
843*9880d681SAndroid Build Coastguard Workerdefm LDEORAL : LDOPregister<0b010, "eor", 1, 1, "al">;
844*9880d681SAndroid Build Coastguard Worker
845*9880d681SAndroid Build Coastguard Workerdefm LDSET   : LDOPregister<0b011, "set", 0, 0, "">;
846*9880d681SAndroid Build Coastguard Workerdefm LDSETA  : LDOPregister<0b011, "set", 1, 0, "a">;
847*9880d681SAndroid Build Coastguard Workerdefm LDSETL  : LDOPregister<0b011, "set", 0, 1, "l">;
848*9880d681SAndroid Build Coastguard Workerdefm LDSETAL : LDOPregister<0b011, "set", 1, 1, "al">;
849*9880d681SAndroid Build Coastguard Worker
850*9880d681SAndroid Build Coastguard Workerdefm LDSMAX   : LDOPregister<0b100, "smax", 0, 0, "">;
851*9880d681SAndroid Build Coastguard Workerdefm LDSMAXA  : LDOPregister<0b100, "smax", 1, 0, "a">;
852*9880d681SAndroid Build Coastguard Workerdefm LDSMAXL  : LDOPregister<0b100, "smax", 0, 1, "l">;
853*9880d681SAndroid Build Coastguard Workerdefm LDSMAXAL : LDOPregister<0b100, "smax", 1, 1, "al">;
854*9880d681SAndroid Build Coastguard Worker
855*9880d681SAndroid Build Coastguard Workerdefm LDSMIN   : LDOPregister<0b101, "smin", 0, 0, "">;
856*9880d681SAndroid Build Coastguard Workerdefm LDSMINA  : LDOPregister<0b101, "smin", 1, 0, "a">;
857*9880d681SAndroid Build Coastguard Workerdefm LDSMINL  : LDOPregister<0b101, "smin", 0, 1, "l">;
858*9880d681SAndroid Build Coastguard Workerdefm LDSMINAL : LDOPregister<0b101, "smin", 1, 1, "al">;
859*9880d681SAndroid Build Coastguard Worker
860*9880d681SAndroid Build Coastguard Workerdefm LDUMAX   : LDOPregister<0b110, "umax", 0, 0, "">;
861*9880d681SAndroid Build Coastguard Workerdefm LDUMAXA  : LDOPregister<0b110, "umax", 1, 0, "a">;
862*9880d681SAndroid Build Coastguard Workerdefm LDUMAXL  : LDOPregister<0b110, "umax", 0, 1, "l">;
863*9880d681SAndroid Build Coastguard Workerdefm LDUMAXAL : LDOPregister<0b110, "umax", 1, 1, "al">;
864*9880d681SAndroid Build Coastguard Worker
865*9880d681SAndroid Build Coastguard Workerdefm LDUMIN   : LDOPregister<0b111, "umin", 0, 0, "">;
866*9880d681SAndroid Build Coastguard Workerdefm LDUMINA  : LDOPregister<0b111, "umin", 1, 0, "a">;
867*9880d681SAndroid Build Coastguard Workerdefm LDUMINL  : LDOPregister<0b111, "umin", 0, 1, "l">;
868*9880d681SAndroid Build Coastguard Workerdefm LDUMINAL : LDOPregister<0b111, "umin", 1, 1, "al">;
869*9880d681SAndroid Build Coastguard Worker
870*9880d681SAndroid Build Coastguard Worker// v8.1 atomic ST<OP>(register) as aliases to "LD<OP>(register) when Rt=xZR"
871*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stadd","LDADD">; // STADDx
872*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stclr","LDCLR">; // STCLRx
873*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"steor","LDEOR">; // STEORx
874*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stset","LDSET">; // STSETx
875*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stsmax","LDSMAX">;// STSMAXx
876*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stsmin","LDSMIN">;// STSMINx
877*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stumax","LDUMAX">;// STUMAXx
878*9880d681SAndroid Build Coastguard Workerdefm : STOPregister<"stumin","LDUMIN">;// STUMINx
879*9880d681SAndroid Build Coastguard Worker
880*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
881*9880d681SAndroid Build Coastguard Worker// Logical instructions.
882*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
883*9880d681SAndroid Build Coastguard Worker
884*9880d681SAndroid Build Coastguard Worker// (immediate)
885*9880d681SAndroid Build Coastguard Workerdefm ANDS : LogicalImmS<0b11, "ands", AArch64and_flag, "bics">;
886*9880d681SAndroid Build Coastguard Workerdefm AND  : LogicalImm<0b00, "and", and, "bic">;
887*9880d681SAndroid Build Coastguard Workerdefm EOR  : LogicalImm<0b10, "eor", xor, "eon">;
888*9880d681SAndroid Build Coastguard Workerdefm ORR  : LogicalImm<0b01, "orr", or, "orn">;
889*9880d681SAndroid Build Coastguard Worker
890*9880d681SAndroid Build Coastguard Worker// FIXME: these aliases *are* canonical sometimes (when movz can't be
891*9880d681SAndroid Build Coastguard Worker// used). Actually, it seems to be working right now, but putting logical_immXX
892*9880d681SAndroid Build Coastguard Worker// here is a bit dodgy on the AsmParser side too.
893*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $imm", (ORRWri GPR32sp:$dst, WZR,
894*9880d681SAndroid Build Coastguard Worker                                          logical_imm32:$imm), 0>;
895*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $imm", (ORRXri GPR64sp:$dst, XZR,
896*9880d681SAndroid Build Coastguard Worker                                          logical_imm64:$imm), 0>;
897*9880d681SAndroid Build Coastguard Worker
898*9880d681SAndroid Build Coastguard Worker
899*9880d681SAndroid Build Coastguard Worker// (register)
900*9880d681SAndroid Build Coastguard Workerdefm ANDS : LogicalRegS<0b11, 0, "ands", AArch64and_flag>;
901*9880d681SAndroid Build Coastguard Workerdefm BICS : LogicalRegS<0b11, 1, "bics",
902*9880d681SAndroid Build Coastguard Worker                        BinOpFrag<(AArch64and_flag node:$LHS, (not node:$RHS))>>;
903*9880d681SAndroid Build Coastguard Workerdefm AND  : LogicalReg<0b00, 0, "and", and>;
904*9880d681SAndroid Build Coastguard Workerdefm BIC  : LogicalReg<0b00, 1, "bic",
905*9880d681SAndroid Build Coastguard Worker                       BinOpFrag<(and node:$LHS, (not node:$RHS))>>;
906*9880d681SAndroid Build Coastguard Workerdefm EON  : LogicalReg<0b10, 1, "eon",
907*9880d681SAndroid Build Coastguard Worker                       BinOpFrag<(not (xor node:$LHS, node:$RHS))>>;
908*9880d681SAndroid Build Coastguard Workerdefm EOR  : LogicalReg<0b10, 0, "eor", xor>;
909*9880d681SAndroid Build Coastguard Workerdefm ORN  : LogicalReg<0b01, 1, "orn",
910*9880d681SAndroid Build Coastguard Worker                       BinOpFrag<(or node:$LHS, (not node:$RHS))>>;
911*9880d681SAndroid Build Coastguard Workerdefm ORR  : LogicalReg<0b01, 0, "orr", or>;
912*9880d681SAndroid Build Coastguard Worker
913*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $src", (ORRWrs GPR32:$dst, WZR, GPR32:$src, 0), 2>;
914*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov $dst, $src", (ORRXrs GPR64:$dst, XZR, GPR64:$src, 0), 2>;
915*9880d681SAndroid Build Coastguard Worker
916*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvn $Wd, $Wm", (ORNWrs GPR32:$Wd, WZR, GPR32:$Wm, 0), 3>;
917*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvn $Xd, $Xm", (ORNXrs GPR64:$Xd, XZR, GPR64:$Xm, 0), 3>;
918*9880d681SAndroid Build Coastguard Worker
919*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvn $Wd, $Wm$sh",
920*9880d681SAndroid Build Coastguard Worker                (ORNWrs GPR32:$Wd, WZR, GPR32:$Wm, logical_shift32:$sh), 2>;
921*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvn $Xd, $Xm$sh",
922*9880d681SAndroid Build Coastguard Worker                (ORNXrs GPR64:$Xd, XZR, GPR64:$Xm, logical_shift64:$sh), 2>;
923*9880d681SAndroid Build Coastguard Worker
924*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tst $src1, $src2",
925*9880d681SAndroid Build Coastguard Worker                (ANDSWri WZR, GPR32:$src1, logical_imm32:$src2), 2>;
926*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tst $src1, $src2",
927*9880d681SAndroid Build Coastguard Worker                (ANDSXri XZR, GPR64:$src1, logical_imm64:$src2), 2>;
928*9880d681SAndroid Build Coastguard Worker
929*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tst $src1, $src2",
930*9880d681SAndroid Build Coastguard Worker                        (ANDSWrs WZR, GPR32:$src1, GPR32:$src2, 0), 3>;
931*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tst $src1, $src2",
932*9880d681SAndroid Build Coastguard Worker                        (ANDSXrs XZR, GPR64:$src1, GPR64:$src2, 0), 3>;
933*9880d681SAndroid Build Coastguard Worker
934*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tst $src1, $src2$sh",
935*9880d681SAndroid Build Coastguard Worker               (ANDSWrs WZR, GPR32:$src1, GPR32:$src2, logical_shift32:$sh), 2>;
936*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tst $src1, $src2$sh",
937*9880d681SAndroid Build Coastguard Worker               (ANDSXrs XZR, GPR64:$src1, GPR64:$src2, logical_shift64:$sh), 2>;
938*9880d681SAndroid Build Coastguard Worker
939*9880d681SAndroid Build Coastguard Worker
940*9880d681SAndroid Build Coastguard Workerdef : Pat<(not GPR32:$Wm), (ORNWrr WZR, GPR32:$Wm)>;
941*9880d681SAndroid Build Coastguard Workerdef : Pat<(not GPR64:$Xm), (ORNXrr XZR, GPR64:$Xm)>;
942*9880d681SAndroid Build Coastguard Worker
943*9880d681SAndroid Build Coastguard Worker
944*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
945*9880d681SAndroid Build Coastguard Worker// One operand data processing instructions.
946*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
947*9880d681SAndroid Build Coastguard Worker
948*9880d681SAndroid Build Coastguard Workerdefm CLS    : OneOperandData<0b101, "cls">;
949*9880d681SAndroid Build Coastguard Workerdefm CLZ    : OneOperandData<0b100, "clz", ctlz>;
950*9880d681SAndroid Build Coastguard Workerdefm RBIT   : OneOperandData<0b000, "rbit">;
951*9880d681SAndroid Build Coastguard Worker
952*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_rbit GPR32:$Rn), (RBITWr $Rn)>;
953*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_rbit GPR64:$Rn), (RBITXr $Rn)>;
954*9880d681SAndroid Build Coastguard Worker
955*9880d681SAndroid Build Coastguard Workerdef  REV16Wr : OneWRegData<0b001, "rev16",
956*9880d681SAndroid Build Coastguard Worker                                  UnOpFrag<(rotr (bswap node:$LHS), (i64 16))>>;
957*9880d681SAndroid Build Coastguard Workerdef  REV16Xr : OneXRegData<0b001, "rev16", null_frag>;
958*9880d681SAndroid Build Coastguard Worker
959*9880d681SAndroid Build Coastguard Workerdef : Pat<(cttz GPR32:$Rn),
960*9880d681SAndroid Build Coastguard Worker          (CLZWr (RBITWr GPR32:$Rn))>;
961*9880d681SAndroid Build Coastguard Workerdef : Pat<(cttz GPR64:$Rn),
962*9880d681SAndroid Build Coastguard Worker          (CLZXr (RBITXr GPR64:$Rn))>;
963*9880d681SAndroid Build Coastguard Workerdef : Pat<(ctlz (or (shl (xor (sra GPR32:$Rn, (i64 31)), GPR32:$Rn), (i64 1)),
964*9880d681SAndroid Build Coastguard Worker                (i32 1))),
965*9880d681SAndroid Build Coastguard Worker          (CLSWr GPR32:$Rn)>;
966*9880d681SAndroid Build Coastguard Workerdef : Pat<(ctlz (or (shl (xor (sra GPR64:$Rn, (i64 63)), GPR64:$Rn), (i64 1)),
967*9880d681SAndroid Build Coastguard Worker                (i64 1))),
968*9880d681SAndroid Build Coastguard Worker          (CLSXr GPR64:$Rn)>;
969*9880d681SAndroid Build Coastguard Worker
970*9880d681SAndroid Build Coastguard Worker// Unlike the other one operand instructions, the instructions with the "rev"
971*9880d681SAndroid Build Coastguard Worker// mnemonic do *not* just different in the size bit, but actually use different
972*9880d681SAndroid Build Coastguard Worker// opcode bits for the different sizes.
973*9880d681SAndroid Build Coastguard Workerdef REVWr   : OneWRegData<0b010, "rev", bswap>;
974*9880d681SAndroid Build Coastguard Workerdef REVXr   : OneXRegData<0b011, "rev", bswap>;
975*9880d681SAndroid Build Coastguard Workerdef REV32Xr : OneXRegData<0b010, "rev32",
976*9880d681SAndroid Build Coastguard Worker                                 UnOpFrag<(rotr (bswap node:$LHS), (i64 32))>>;
977*9880d681SAndroid Build Coastguard Worker
978*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"rev64 $Rd, $Rn", (REVXr GPR64:$Rd, GPR64:$Rn), 0>;
979*9880d681SAndroid Build Coastguard Worker
980*9880d681SAndroid Build Coastguard Worker// The bswap commutes with the rotr so we want a pattern for both possible
981*9880d681SAndroid Build Coastguard Worker// orders.
982*9880d681SAndroid Build Coastguard Workerdef : Pat<(bswap (rotr GPR32:$Rn, (i64 16))), (REV16Wr GPR32:$Rn)>;
983*9880d681SAndroid Build Coastguard Workerdef : Pat<(bswap (rotr GPR64:$Rn, (i64 32))), (REV32Xr GPR64:$Rn)>;
984*9880d681SAndroid Build Coastguard Worker
985*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
986*9880d681SAndroid Build Coastguard Worker// Bitfield immediate extraction instruction.
987*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
988*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in
989*9880d681SAndroid Build Coastguard Workerdefm EXTR : ExtractImm<"extr">;
990*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ror $dst, $src, $shift",
991*9880d681SAndroid Build Coastguard Worker            (EXTRWrri GPR32:$dst, GPR32:$src, GPR32:$src, imm0_31:$shift)>;
992*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ror $dst, $src, $shift",
993*9880d681SAndroid Build Coastguard Worker            (EXTRXrri GPR64:$dst, GPR64:$src, GPR64:$src, imm0_63:$shift)>;
994*9880d681SAndroid Build Coastguard Worker
995*9880d681SAndroid Build Coastguard Workerdef : Pat<(rotr GPR32:$Rn, (i64 imm0_31:$imm)),
996*9880d681SAndroid Build Coastguard Worker          (EXTRWrri GPR32:$Rn, GPR32:$Rn, imm0_31:$imm)>;
997*9880d681SAndroid Build Coastguard Workerdef : Pat<(rotr GPR64:$Rn, (i64 imm0_63:$imm)),
998*9880d681SAndroid Build Coastguard Worker          (EXTRXrri GPR64:$Rn, GPR64:$Rn, imm0_63:$imm)>;
999*9880d681SAndroid Build Coastguard Worker
1000*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1001*9880d681SAndroid Build Coastguard Worker// Other bitfield immediate instructions.
1002*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1003*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in {
1004*9880d681SAndroid Build Coastguard Workerdefm BFM  : BitfieldImmWith2RegArgs<0b01, "bfm">;
1005*9880d681SAndroid Build Coastguard Workerdefm SBFM : BitfieldImm<0b00, "sbfm">;
1006*9880d681SAndroid Build Coastguard Workerdefm UBFM : BitfieldImm<0b10, "ubfm">;
1007*9880d681SAndroid Build Coastguard Worker}
1008*9880d681SAndroid Build Coastguard Worker
1009*9880d681SAndroid Build Coastguard Workerdef i32shift_a : Operand<i64>, SDNodeXForm<imm, [{
1010*9880d681SAndroid Build Coastguard Worker  uint64_t enc = (32 - N->getZExtValue()) & 0x1f;
1011*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64);
1012*9880d681SAndroid Build Coastguard Worker}]>;
1013*9880d681SAndroid Build Coastguard Worker
1014*9880d681SAndroid Build Coastguard Workerdef i32shift_b : Operand<i64>, SDNodeXForm<imm, [{
1015*9880d681SAndroid Build Coastguard Worker  uint64_t enc = 31 - N->getZExtValue();
1016*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64);
1017*9880d681SAndroid Build Coastguard Worker}]>;
1018*9880d681SAndroid Build Coastguard Worker
1019*9880d681SAndroid Build Coastguard Worker// min(7, 31 - shift_amt)
1020*9880d681SAndroid Build Coastguard Workerdef i32shift_sext_i8 : Operand<i64>, SDNodeXForm<imm, [{
1021*9880d681SAndroid Build Coastguard Worker  uint64_t enc = 31 - N->getZExtValue();
1022*9880d681SAndroid Build Coastguard Worker  enc = enc > 7 ? 7 : enc;
1023*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64);
1024*9880d681SAndroid Build Coastguard Worker}]>;
1025*9880d681SAndroid Build Coastguard Worker
1026*9880d681SAndroid Build Coastguard Worker// min(15, 31 - shift_amt)
1027*9880d681SAndroid Build Coastguard Workerdef i32shift_sext_i16 : Operand<i64>, SDNodeXForm<imm, [{
1028*9880d681SAndroid Build Coastguard Worker  uint64_t enc = 31 - N->getZExtValue();
1029*9880d681SAndroid Build Coastguard Worker  enc = enc > 15 ? 15 : enc;
1030*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64);
1031*9880d681SAndroid Build Coastguard Worker}]>;
1032*9880d681SAndroid Build Coastguard Worker
1033*9880d681SAndroid Build Coastguard Workerdef i64shift_a : Operand<i64>, SDNodeXForm<imm, [{
1034*9880d681SAndroid Build Coastguard Worker  uint64_t enc = (64 - N->getZExtValue()) & 0x3f;
1035*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64);
1036*9880d681SAndroid Build Coastguard Worker}]>;
1037*9880d681SAndroid Build Coastguard Worker
1038*9880d681SAndroid Build Coastguard Workerdef i64shift_b : Operand<i64>, SDNodeXForm<imm, [{
1039*9880d681SAndroid Build Coastguard Worker  uint64_t enc = 63 - N->getZExtValue();
1040*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64);
1041*9880d681SAndroid Build Coastguard Worker}]>;
1042*9880d681SAndroid Build Coastguard Worker
1043*9880d681SAndroid Build Coastguard Worker// min(7, 63 - shift_amt)
1044*9880d681SAndroid Build Coastguard Workerdef i64shift_sext_i8 : Operand<i64>, SDNodeXForm<imm, [{
1045*9880d681SAndroid Build Coastguard Worker  uint64_t enc = 63 - N->getZExtValue();
1046*9880d681SAndroid Build Coastguard Worker  enc = enc > 7 ? 7 : enc;
1047*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64);
1048*9880d681SAndroid Build Coastguard Worker}]>;
1049*9880d681SAndroid Build Coastguard Worker
1050*9880d681SAndroid Build Coastguard Worker// min(15, 63 - shift_amt)
1051*9880d681SAndroid Build Coastguard Workerdef i64shift_sext_i16 : Operand<i64>, SDNodeXForm<imm, [{
1052*9880d681SAndroid Build Coastguard Worker  uint64_t enc = 63 - N->getZExtValue();
1053*9880d681SAndroid Build Coastguard Worker  enc = enc > 15 ? 15 : enc;
1054*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64);
1055*9880d681SAndroid Build Coastguard Worker}]>;
1056*9880d681SAndroid Build Coastguard Worker
1057*9880d681SAndroid Build Coastguard Worker// min(31, 63 - shift_amt)
1058*9880d681SAndroid Build Coastguard Workerdef i64shift_sext_i32 : Operand<i64>, SDNodeXForm<imm, [{
1059*9880d681SAndroid Build Coastguard Worker  uint64_t enc = 63 - N->getZExtValue();
1060*9880d681SAndroid Build Coastguard Worker  enc = enc > 31 ? 31 : enc;
1061*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i64);
1062*9880d681SAndroid Build Coastguard Worker}]>;
1063*9880d681SAndroid Build Coastguard Worker
1064*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl GPR32:$Rn, (i64 imm0_31:$imm)),
1065*9880d681SAndroid Build Coastguard Worker          (UBFMWri GPR32:$Rn, (i64 (i32shift_a imm0_31:$imm)),
1066*9880d681SAndroid Build Coastguard Worker                              (i64 (i32shift_b imm0_31:$imm)))>;
1067*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl GPR64:$Rn, (i64 imm0_63:$imm)),
1068*9880d681SAndroid Build Coastguard Worker          (UBFMXri GPR64:$Rn, (i64 (i64shift_a imm0_63:$imm)),
1069*9880d681SAndroid Build Coastguard Worker                              (i64 (i64shift_b imm0_63:$imm)))>;
1070*9880d681SAndroid Build Coastguard Worker
1071*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in {
1072*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra GPR32:$Rn, (i64 imm0_31:$imm)),
1073*9880d681SAndroid Build Coastguard Worker          (SBFMWri GPR32:$Rn, imm0_31:$imm, 31)>;
1074*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra GPR64:$Rn, (i64 imm0_63:$imm)),
1075*9880d681SAndroid Build Coastguard Worker          (SBFMXri GPR64:$Rn, imm0_63:$imm, 63)>;
1076*9880d681SAndroid Build Coastguard Worker}
1077*9880d681SAndroid Build Coastguard Worker
1078*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"asr $dst, $src, $shift",
1079*9880d681SAndroid Build Coastguard Worker                (SBFMWri GPR32:$dst, GPR32:$src, imm0_31:$shift, 31)>;
1080*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"asr $dst, $src, $shift",
1081*9880d681SAndroid Build Coastguard Worker                (SBFMXri GPR64:$dst, GPR64:$src, imm0_63:$shift, 63)>;
1082*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtb $dst, $src", (SBFMWri GPR32:$dst, GPR32:$src, 0, 7)>;
1083*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtb $dst, $src", (SBFMXri GPR64:$dst, GPR64:$src, 0, 7)>;
1084*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxth $dst, $src", (SBFMWri GPR32:$dst, GPR32:$src, 0, 15)>;
1085*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxth $dst, $src", (SBFMXri GPR64:$dst, GPR64:$src, 0, 15)>;
1086*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtw $dst, $src", (SBFMXri GPR64:$dst, GPR64:$src, 0, 31)>;
1087*9880d681SAndroid Build Coastguard Worker
1088*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl GPR32:$Rn, (i64 imm0_31:$imm)),
1089*9880d681SAndroid Build Coastguard Worker          (UBFMWri GPR32:$Rn, imm0_31:$imm, 31)>;
1090*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl GPR64:$Rn, (i64 imm0_63:$imm)),
1091*9880d681SAndroid Build Coastguard Worker          (UBFMXri GPR64:$Rn, imm0_63:$imm, 63)>;
1092*9880d681SAndroid Build Coastguard Worker
1093*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"lsr $dst, $src, $shift",
1094*9880d681SAndroid Build Coastguard Worker                (UBFMWri GPR32:$dst, GPR32:$src, imm0_31:$shift, 31)>;
1095*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"lsr $dst, $src, $shift",
1096*9880d681SAndroid Build Coastguard Worker                (UBFMXri GPR64:$dst, GPR64:$src, imm0_63:$shift, 63)>;
1097*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtb $dst, $src", (UBFMWri GPR32:$dst, GPR32:$src, 0, 7)>;
1098*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtb $dst, $src", (UBFMXri GPR64:$dst, GPR64:$src, 0, 7)>;
1099*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxth $dst, $src", (UBFMWri GPR32:$dst, GPR32:$src, 0, 15)>;
1100*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxth $dst, $src", (UBFMXri GPR64:$dst, GPR64:$src, 0, 15)>;
1101*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtw $dst, $src", (UBFMXri GPR64:$dst, GPR64:$src, 0, 31)>;
1102*9880d681SAndroid Build Coastguard Worker
1103*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1104*9880d681SAndroid Build Coastguard Worker// Conditional comparison instructions.
1105*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1106*9880d681SAndroid Build Coastguard Workerdefm CCMN : CondComparison<0, "ccmn", AArch64ccmn>;
1107*9880d681SAndroid Build Coastguard Workerdefm CCMP : CondComparison<1, "ccmp", AArch64ccmp>;
1108*9880d681SAndroid Build Coastguard Worker
1109*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1110*9880d681SAndroid Build Coastguard Worker// Conditional select instructions.
1111*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1112*9880d681SAndroid Build Coastguard Workerdefm CSEL  : CondSelect<0, 0b00, "csel">;
1113*9880d681SAndroid Build Coastguard Worker
1114*9880d681SAndroid Build Coastguard Workerdef inc : PatFrag<(ops node:$in), (add node:$in, 1)>;
1115*9880d681SAndroid Build Coastguard Workerdefm CSINC : CondSelectOp<0, 0b01, "csinc", inc>;
1116*9880d681SAndroid Build Coastguard Workerdefm CSINV : CondSelectOp<1, 0b00, "csinv", not>;
1117*9880d681SAndroid Build Coastguard Workerdefm CSNEG : CondSelectOp<1, 0b01, "csneg", ineg>;
1118*9880d681SAndroid Build Coastguard Worker
1119*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csinv GPR32:$tval, GPR32:$fval, (i32 imm:$cc), NZCV),
1120*9880d681SAndroid Build Coastguard Worker          (CSINVWr GPR32:$tval, GPR32:$fval, (i32 imm:$cc))>;
1121*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csinv GPR64:$tval, GPR64:$fval, (i32 imm:$cc), NZCV),
1122*9880d681SAndroid Build Coastguard Worker          (CSINVXr GPR64:$tval, GPR64:$fval, (i32 imm:$cc))>;
1123*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csneg GPR32:$tval, GPR32:$fval, (i32 imm:$cc), NZCV),
1124*9880d681SAndroid Build Coastguard Worker          (CSNEGWr GPR32:$tval, GPR32:$fval, (i32 imm:$cc))>;
1125*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csneg GPR64:$tval, GPR64:$fval, (i32 imm:$cc), NZCV),
1126*9880d681SAndroid Build Coastguard Worker          (CSNEGXr GPR64:$tval, GPR64:$fval, (i32 imm:$cc))>;
1127*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csinc GPR32:$tval, GPR32:$fval, (i32 imm:$cc), NZCV),
1128*9880d681SAndroid Build Coastguard Worker          (CSINCWr GPR32:$tval, GPR32:$fval, (i32 imm:$cc))>;
1129*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csinc GPR64:$tval, GPR64:$fval, (i32 imm:$cc), NZCV),
1130*9880d681SAndroid Build Coastguard Worker          (CSINCXr GPR64:$tval, GPR64:$fval, (i32 imm:$cc))>;
1131*9880d681SAndroid Build Coastguard Worker
1132*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel (i32 0), (i32 1), (i32 imm:$cc), NZCV),
1133*9880d681SAndroid Build Coastguard Worker          (CSINCWr WZR, WZR, (i32 imm:$cc))>;
1134*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel (i64 0), (i64 1), (i32 imm:$cc), NZCV),
1135*9880d681SAndroid Build Coastguard Worker          (CSINCXr XZR, XZR, (i32 imm:$cc))>;
1136*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel (i32 0), (i32 -1), (i32 imm:$cc), NZCV),
1137*9880d681SAndroid Build Coastguard Worker          (CSINVWr WZR, WZR, (i32 imm:$cc))>;
1138*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel (i64 0), (i64 -1), (i32 imm:$cc), NZCV),
1139*9880d681SAndroid Build Coastguard Worker          (CSINVXr XZR, XZR, (i32 imm:$cc))>;
1140*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel GPR32:$tval, (i32 -1), (i32 imm:$cc), NZCV),
1141*9880d681SAndroid Build Coastguard Worker          (CSINVWr GPR32:$tval, WZR, (i32 imm:$cc))>;
1142*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel GPR64:$tval, (i64 -1), (i32 imm:$cc), NZCV),
1143*9880d681SAndroid Build Coastguard Worker          (CSINVXr GPR64:$tval, XZR, (i32 imm:$cc))>;
1144*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel (i32 -1), GPR32:$fval, (i32 imm:$cc), NZCV),
1145*9880d681SAndroid Build Coastguard Worker          (CSINVWr GPR32:$fval, WZR, (i32 (inv_cond_XFORM imm:$cc)))>;
1146*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64csel (i64 -1), GPR64:$fval, (i32 imm:$cc), NZCV),
1147*9880d681SAndroid Build Coastguard Worker          (CSINVXr GPR64:$fval, XZR, (i32 (inv_cond_XFORM imm:$cc)))>;
1148*9880d681SAndroid Build Coastguard Worker
1149*9880d681SAndroid Build Coastguard Worker// The inverse of the condition code from the alias instruction is what is used
1150*9880d681SAndroid Build Coastguard Worker// in the aliased instruction. The parser all ready inverts the condition code
1151*9880d681SAndroid Build Coastguard Worker// for these aliases.
1152*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cset $dst, $cc",
1153*9880d681SAndroid Build Coastguard Worker                (CSINCWr GPR32:$dst, WZR, WZR, inv_ccode:$cc)>;
1154*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cset $dst, $cc",
1155*9880d681SAndroid Build Coastguard Worker                (CSINCXr GPR64:$dst, XZR, XZR, inv_ccode:$cc)>;
1156*9880d681SAndroid Build Coastguard Worker
1157*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"csetm $dst, $cc",
1158*9880d681SAndroid Build Coastguard Worker                (CSINVWr GPR32:$dst, WZR, WZR, inv_ccode:$cc)>;
1159*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"csetm $dst, $cc",
1160*9880d681SAndroid Build Coastguard Worker                (CSINVXr GPR64:$dst, XZR, XZR, inv_ccode:$cc)>;
1161*9880d681SAndroid Build Coastguard Worker
1162*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cinc $dst, $src, $cc",
1163*9880d681SAndroid Build Coastguard Worker                (CSINCWr GPR32:$dst, GPR32:$src, GPR32:$src, inv_ccode:$cc)>;
1164*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cinc $dst, $src, $cc",
1165*9880d681SAndroid Build Coastguard Worker                (CSINCXr GPR64:$dst, GPR64:$src, GPR64:$src, inv_ccode:$cc)>;
1166*9880d681SAndroid Build Coastguard Worker
1167*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cinv $dst, $src, $cc",
1168*9880d681SAndroid Build Coastguard Worker                (CSINVWr GPR32:$dst, GPR32:$src, GPR32:$src, inv_ccode:$cc)>;
1169*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cinv $dst, $src, $cc",
1170*9880d681SAndroid Build Coastguard Worker                (CSINVXr GPR64:$dst, GPR64:$src, GPR64:$src, inv_ccode:$cc)>;
1171*9880d681SAndroid Build Coastguard Worker
1172*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cneg $dst, $src, $cc",
1173*9880d681SAndroid Build Coastguard Worker                (CSNEGWr GPR32:$dst, GPR32:$src, GPR32:$src, inv_ccode:$cc)>;
1174*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cneg $dst, $src, $cc",
1175*9880d681SAndroid Build Coastguard Worker                (CSNEGXr GPR64:$dst, GPR64:$src, GPR64:$src, inv_ccode:$cc)>;
1176*9880d681SAndroid Build Coastguard Worker
1177*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1178*9880d681SAndroid Build Coastguard Worker// PC-relative instructions.
1179*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1180*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1 in {
1181*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, mayStore = 0, mayLoad = 0 in {
1182*9880d681SAndroid Build Coastguard Workerdef ADR  : ADRI<0, "adr", adrlabel, []>;
1183*9880d681SAndroid Build Coastguard Worker} // hasSideEffects = 0
1184*9880d681SAndroid Build Coastguard Worker
1185*9880d681SAndroid Build Coastguard Workerdef ADRP : ADRI<1, "adrp", adrplabel,
1186*9880d681SAndroid Build Coastguard Worker                [(set GPR64:$Xd, (AArch64adrp tglobaladdr:$label))]>;
1187*9880d681SAndroid Build Coastguard Worker} // isReMaterializable = 1
1188*9880d681SAndroid Build Coastguard Worker
1189*9880d681SAndroid Build Coastguard Worker// page address of a constant pool entry, block address
1190*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64adrp tconstpool:$cp), (ADRP tconstpool:$cp)>;
1191*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64adrp tblockaddress:$cp), (ADRP tblockaddress:$cp)>;
1192*9880d681SAndroid Build Coastguard Worker
1193*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1194*9880d681SAndroid Build Coastguard Worker// Unconditional branch (register) instructions.
1195*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1196*9880d681SAndroid Build Coastguard Worker
1197*9880d681SAndroid Build Coastguard Workerlet isReturn = 1, isTerminator = 1, isBarrier = 1 in {
1198*9880d681SAndroid Build Coastguard Workerdef RET  : BranchReg<0b0010, "ret", []>;
1199*9880d681SAndroid Build Coastguard Workerdef DRPS : SpecialReturn<0b0101, "drps">;
1200*9880d681SAndroid Build Coastguard Workerdef ERET : SpecialReturn<0b0100, "eret">;
1201*9880d681SAndroid Build Coastguard Worker} // isReturn = 1, isTerminator = 1, isBarrier = 1
1202*9880d681SAndroid Build Coastguard Worker
1203*9880d681SAndroid Build Coastguard Worker// Default to the LR register.
1204*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ret", (RET LR)>;
1205*9880d681SAndroid Build Coastguard Worker
1206*9880d681SAndroid Build Coastguard Workerlet isCall = 1, Defs = [LR], Uses = [SP] in {
1207*9880d681SAndroid Build Coastguard Workerdef BLR : BranchReg<0b0001, "blr", [(AArch64call GPR64:$Rn)]>;
1208*9880d681SAndroid Build Coastguard Worker} // isCall
1209*9880d681SAndroid Build Coastguard Worker
1210*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
1211*9880d681SAndroid Build Coastguard Workerdef BR  : BranchReg<0b0000, "br", [(brind GPR64:$Rn)]>;
1212*9880d681SAndroid Build Coastguard Worker} // isBranch, isTerminator, isBarrier, isIndirectBranch
1213*9880d681SAndroid Build Coastguard Worker
1214*9880d681SAndroid Build Coastguard Worker// Create a separate pseudo-instruction for codegen to use so that we don't
1215*9880d681SAndroid Build Coastguard Worker// flag lr as used in every function. It'll be restored before the RET by the
1216*9880d681SAndroid Build Coastguard Worker// epilogue if it's legitimately used.
1217*9880d681SAndroid Build Coastguard Workerdef RET_ReallyLR : Pseudo<(outs), (ins), [(AArch64retflag)]>,
1218*9880d681SAndroid Build Coastguard Worker                   Sched<[WriteBrReg]> {
1219*9880d681SAndroid Build Coastguard Worker  let isTerminator = 1;
1220*9880d681SAndroid Build Coastguard Worker  let isBarrier = 1;
1221*9880d681SAndroid Build Coastguard Worker  let isReturn = 1;
1222*9880d681SAndroid Build Coastguard Worker}
1223*9880d681SAndroid Build Coastguard Worker
1224*9880d681SAndroid Build Coastguard Worker// This is a directive-like pseudo-instruction. The purpose is to insert an
1225*9880d681SAndroid Build Coastguard Worker// R_AARCH64_TLSDESC_CALL relocation at the offset of the following instruction
1226*9880d681SAndroid Build Coastguard Worker// (which in the usual case is a BLR).
1227*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1 in
1228*9880d681SAndroid Build Coastguard Workerdef TLSDESCCALL : Pseudo<(outs), (ins i64imm:$sym), []>, Sched<[]> {
1229*9880d681SAndroid Build Coastguard Worker  let AsmString = ".tlsdesccall $sym";
1230*9880d681SAndroid Build Coastguard Worker}
1231*9880d681SAndroid Build Coastguard Worker
1232*9880d681SAndroid Build Coastguard Worker// FIXME: maybe the scratch register used shouldn't be fixed to X1?
1233*9880d681SAndroid Build Coastguard Worker// FIXME: can "hasSideEffects be dropped?
1234*9880d681SAndroid Build Coastguard Workerlet isCall = 1, Defs = [LR, X0, X1], hasSideEffects = 1,
1235*9880d681SAndroid Build Coastguard Worker    isCodeGenOnly = 1 in
1236*9880d681SAndroid Build Coastguard Workerdef TLSDESC_CALLSEQ
1237*9880d681SAndroid Build Coastguard Worker    : Pseudo<(outs), (ins i64imm:$sym),
1238*9880d681SAndroid Build Coastguard Worker             [(AArch64tlsdesc_callseq tglobaltlsaddr:$sym)]>,
1239*9880d681SAndroid Build Coastguard Worker      Sched<[WriteI, WriteLD, WriteI, WriteBrReg]>;
1240*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64tlsdesc_callseq texternalsym:$sym),
1241*9880d681SAndroid Build Coastguard Worker          (TLSDESC_CALLSEQ texternalsym:$sym)>;
1242*9880d681SAndroid Build Coastguard Worker
1243*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1244*9880d681SAndroid Build Coastguard Worker// Conditional branch (immediate) instruction.
1245*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1246*9880d681SAndroid Build Coastguard Workerdef Bcc : BranchCond;
1247*9880d681SAndroid Build Coastguard Worker
1248*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1249*9880d681SAndroid Build Coastguard Worker// Compare-and-branch instructions.
1250*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1251*9880d681SAndroid Build Coastguard Workerdefm CBZ  : CmpBranch<0, "cbz", AArch64cbz>;
1252*9880d681SAndroid Build Coastguard Workerdefm CBNZ : CmpBranch<1, "cbnz", AArch64cbnz>;
1253*9880d681SAndroid Build Coastguard Worker
1254*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1255*9880d681SAndroid Build Coastguard Worker// Test-bit-and-branch instructions.
1256*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1257*9880d681SAndroid Build Coastguard Workerdefm TBZ  : TestBranch<0, "tbz", AArch64tbz>;
1258*9880d681SAndroid Build Coastguard Workerdefm TBNZ : TestBranch<1, "tbnz", AArch64tbnz>;
1259*9880d681SAndroid Build Coastguard Worker
1260*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1261*9880d681SAndroid Build Coastguard Worker// Unconditional branch (immediate) instructions.
1262*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1263*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1, isBarrier = 1 in {
1264*9880d681SAndroid Build Coastguard Workerdef B  : BranchImm<0, "b", [(br bb:$addr)]>;
1265*9880d681SAndroid Build Coastguard Worker} // isBranch, isTerminator, isBarrier
1266*9880d681SAndroid Build Coastguard Worker
1267*9880d681SAndroid Build Coastguard Workerlet isCall = 1, Defs = [LR], Uses = [SP] in {
1268*9880d681SAndroid Build Coastguard Workerdef BL : CallImm<1, "bl", [(AArch64call tglobaladdr:$addr)]>;
1269*9880d681SAndroid Build Coastguard Worker} // isCall
1270*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64call texternalsym:$func), (BL texternalsym:$func)>;
1271*9880d681SAndroid Build Coastguard Worker
1272*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1273*9880d681SAndroid Build Coastguard Worker// Exception generation instructions.
1274*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1275*9880d681SAndroid Build Coastguard Workerdef BRK   : ExceptionGeneration<0b001, 0b00, "brk">;
1276*9880d681SAndroid Build Coastguard Workerdef DCPS1 : ExceptionGeneration<0b101, 0b01, "dcps1">;
1277*9880d681SAndroid Build Coastguard Workerdef DCPS2 : ExceptionGeneration<0b101, 0b10, "dcps2">;
1278*9880d681SAndroid Build Coastguard Workerdef DCPS3 : ExceptionGeneration<0b101, 0b11, "dcps3">;
1279*9880d681SAndroid Build Coastguard Workerdef HLT   : ExceptionGeneration<0b010, 0b00, "hlt">;
1280*9880d681SAndroid Build Coastguard Workerdef HVC   : ExceptionGeneration<0b000, 0b10, "hvc">;
1281*9880d681SAndroid Build Coastguard Workerdef SMC   : ExceptionGeneration<0b000, 0b11, "smc">;
1282*9880d681SAndroid Build Coastguard Workerdef SVC   : ExceptionGeneration<0b000, 0b01, "svc">;
1283*9880d681SAndroid Build Coastguard Worker
1284*9880d681SAndroid Build Coastguard Worker// DCPSn defaults to an immediate operand of zero if unspecified.
1285*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"dcps1", (DCPS1 0)>;
1286*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"dcps2", (DCPS2 0)>;
1287*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"dcps3", (DCPS3 0)>;
1288*9880d681SAndroid Build Coastguard Worker
1289*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1290*9880d681SAndroid Build Coastguard Worker// Load instructions.
1291*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1292*9880d681SAndroid Build Coastguard Worker
1293*9880d681SAndroid Build Coastguard Worker// Pair (indexed, offset)
1294*9880d681SAndroid Build Coastguard Workerdefm LDPW : LoadPairOffset<0b00, 0, GPR32, simm7s4, "ldp">;
1295*9880d681SAndroid Build Coastguard Workerdefm LDPX : LoadPairOffset<0b10, 0, GPR64, simm7s8, "ldp">;
1296*9880d681SAndroid Build Coastguard Workerdefm LDPS : LoadPairOffset<0b00, 1, FPR32, simm7s4, "ldp">;
1297*9880d681SAndroid Build Coastguard Workerdefm LDPD : LoadPairOffset<0b01, 1, FPR64, simm7s8, "ldp">;
1298*9880d681SAndroid Build Coastguard Workerdefm LDPQ : LoadPairOffset<0b10, 1, FPR128, simm7s16, "ldp">;
1299*9880d681SAndroid Build Coastguard Worker
1300*9880d681SAndroid Build Coastguard Workerdefm LDPSW : LoadPairOffset<0b01, 0, GPR64, simm7s4, "ldpsw">;
1301*9880d681SAndroid Build Coastguard Worker
1302*9880d681SAndroid Build Coastguard Worker// Pair (pre-indexed)
1303*9880d681SAndroid Build Coastguard Workerdef LDPWpre : LoadPairPreIdx<0b00, 0, GPR32, simm7s4, "ldp">;
1304*9880d681SAndroid Build Coastguard Workerdef LDPXpre : LoadPairPreIdx<0b10, 0, GPR64, simm7s8, "ldp">;
1305*9880d681SAndroid Build Coastguard Workerdef LDPSpre : LoadPairPreIdx<0b00, 1, FPR32, simm7s4, "ldp">;
1306*9880d681SAndroid Build Coastguard Workerdef LDPDpre : LoadPairPreIdx<0b01, 1, FPR64, simm7s8, "ldp">;
1307*9880d681SAndroid Build Coastguard Workerdef LDPQpre : LoadPairPreIdx<0b10, 1, FPR128, simm7s16, "ldp">;
1308*9880d681SAndroid Build Coastguard Worker
1309*9880d681SAndroid Build Coastguard Workerdef LDPSWpre : LoadPairPreIdx<0b01, 0, GPR64, simm7s4, "ldpsw">;
1310*9880d681SAndroid Build Coastguard Worker
1311*9880d681SAndroid Build Coastguard Worker// Pair (post-indexed)
1312*9880d681SAndroid Build Coastguard Workerdef LDPWpost : LoadPairPostIdx<0b00, 0, GPR32, simm7s4, "ldp">;
1313*9880d681SAndroid Build Coastguard Workerdef LDPXpost : LoadPairPostIdx<0b10, 0, GPR64, simm7s8, "ldp">;
1314*9880d681SAndroid Build Coastguard Workerdef LDPSpost : LoadPairPostIdx<0b00, 1, FPR32, simm7s4, "ldp">;
1315*9880d681SAndroid Build Coastguard Workerdef LDPDpost : LoadPairPostIdx<0b01, 1, FPR64, simm7s8, "ldp">;
1316*9880d681SAndroid Build Coastguard Workerdef LDPQpost : LoadPairPostIdx<0b10, 1, FPR128, simm7s16, "ldp">;
1317*9880d681SAndroid Build Coastguard Worker
1318*9880d681SAndroid Build Coastguard Workerdef LDPSWpost : LoadPairPostIdx<0b01, 0, GPR64, simm7s4, "ldpsw">;
1319*9880d681SAndroid Build Coastguard Worker
1320*9880d681SAndroid Build Coastguard Worker
1321*9880d681SAndroid Build Coastguard Worker// Pair (no allocate)
1322*9880d681SAndroid Build Coastguard Workerdefm LDNPW : LoadPairNoAlloc<0b00, 0, GPR32, simm7s4, "ldnp">;
1323*9880d681SAndroid Build Coastguard Workerdefm LDNPX : LoadPairNoAlloc<0b10, 0, GPR64, simm7s8, "ldnp">;
1324*9880d681SAndroid Build Coastguard Workerdefm LDNPS : LoadPairNoAlloc<0b00, 1, FPR32, simm7s4, "ldnp">;
1325*9880d681SAndroid Build Coastguard Workerdefm LDNPD : LoadPairNoAlloc<0b01, 1, FPR64, simm7s8, "ldnp">;
1326*9880d681SAndroid Build Coastguard Workerdefm LDNPQ : LoadPairNoAlloc<0b10, 1, FPR128, simm7s16, "ldnp">;
1327*9880d681SAndroid Build Coastguard Worker
1328*9880d681SAndroid Build Coastguard Worker//---
1329*9880d681SAndroid Build Coastguard Worker// (register offset)
1330*9880d681SAndroid Build Coastguard Worker//---
1331*9880d681SAndroid Build Coastguard Worker
1332*9880d681SAndroid Build Coastguard Worker// Integer
1333*9880d681SAndroid Build Coastguard Workerdefm LDRBB : Load8RO<0b00,  0, 0b01, GPR32, "ldrb", i32, zextloadi8>;
1334*9880d681SAndroid Build Coastguard Workerdefm LDRHH : Load16RO<0b01, 0, 0b01, GPR32, "ldrh", i32, zextloadi16>;
1335*9880d681SAndroid Build Coastguard Workerdefm LDRW  : Load32RO<0b10, 0, 0b01, GPR32, "ldr", i32, load>;
1336*9880d681SAndroid Build Coastguard Workerdefm LDRX  : Load64RO<0b11, 0, 0b01, GPR64, "ldr", i64, load>;
1337*9880d681SAndroid Build Coastguard Worker
1338*9880d681SAndroid Build Coastguard Worker// Floating-point
1339*9880d681SAndroid Build Coastguard Workerdefm LDRB : Load8RO<0b00,   1, 0b01, FPR8,   "ldr", untyped, load>;
1340*9880d681SAndroid Build Coastguard Workerdefm LDRH : Load16RO<0b01,  1, 0b01, FPR16,  "ldr", f16, load>;
1341*9880d681SAndroid Build Coastguard Workerdefm LDRS : Load32RO<0b10,  1, 0b01, FPR32,  "ldr", f32, load>;
1342*9880d681SAndroid Build Coastguard Workerdefm LDRD : Load64RO<0b11,  1, 0b01, FPR64,  "ldr", f64, load>;
1343*9880d681SAndroid Build Coastguard Workerdefm LDRQ : Load128RO<0b00, 1, 0b11, FPR128, "ldr", f128, load>;
1344*9880d681SAndroid Build Coastguard Worker
1345*9880d681SAndroid Build Coastguard Worker// Load sign-extended half-word
1346*9880d681SAndroid Build Coastguard Workerdefm LDRSHW : Load16RO<0b01, 0, 0b11, GPR32, "ldrsh", i32, sextloadi16>;
1347*9880d681SAndroid Build Coastguard Workerdefm LDRSHX : Load16RO<0b01, 0, 0b10, GPR64, "ldrsh", i64, sextloadi16>;
1348*9880d681SAndroid Build Coastguard Worker
1349*9880d681SAndroid Build Coastguard Worker// Load sign-extended byte
1350*9880d681SAndroid Build Coastguard Workerdefm LDRSBW : Load8RO<0b00, 0, 0b11, GPR32, "ldrsb", i32, sextloadi8>;
1351*9880d681SAndroid Build Coastguard Workerdefm LDRSBX : Load8RO<0b00, 0, 0b10, GPR64, "ldrsb", i64, sextloadi8>;
1352*9880d681SAndroid Build Coastguard Worker
1353*9880d681SAndroid Build Coastguard Worker// Load sign-extended word
1354*9880d681SAndroid Build Coastguard Workerdefm LDRSW  : Load32RO<0b10, 0, 0b10, GPR64, "ldrsw", i64, sextloadi32>;
1355*9880d681SAndroid Build Coastguard Worker
1356*9880d681SAndroid Build Coastguard Worker// Pre-fetch.
1357*9880d681SAndroid Build Coastguard Workerdefm PRFM : PrefetchRO<0b11, 0, 0b10, "prfm">;
1358*9880d681SAndroid Build Coastguard Worker
1359*9880d681SAndroid Build Coastguard Worker// For regular load, we do not have any alignment requirement.
1360*9880d681SAndroid Build Coastguard Worker// Thus, it is safe to directly map the vector loads with interesting
1361*9880d681SAndroid Build Coastguard Worker// addressing modes.
1362*9880d681SAndroid Build Coastguard Worker// FIXME: We could do the same for bitconvert to floating point vectors.
1363*9880d681SAndroid Build Coastguard Workermulticlass ScalToVecROLoadPat<ROAddrMode ro, SDPatternOperator loadop,
1364*9880d681SAndroid Build Coastguard Worker                              ValueType ScalTy, ValueType VecTy,
1365*9880d681SAndroid Build Coastguard Worker                              Instruction LOADW, Instruction LOADX,
1366*9880d681SAndroid Build Coastguard Worker                              SubRegIndex sub> {
1367*9880d681SAndroid Build Coastguard Worker  def : Pat<(VecTy (scalar_to_vector (ScalTy
1368*9880d681SAndroid Build Coastguard Worker              (loadop (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$offset))))),
1369*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (VecTy (IMPLICIT_DEF)),
1370*9880d681SAndroid Build Coastguard Worker                           (LOADW GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$offset),
1371*9880d681SAndroid Build Coastguard Worker                           sub)>;
1372*9880d681SAndroid Build Coastguard Worker
1373*9880d681SAndroid Build Coastguard Worker  def : Pat<(VecTy (scalar_to_vector (ScalTy
1374*9880d681SAndroid Build Coastguard Worker              (loadop (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$offset))))),
1375*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (VecTy (IMPLICIT_DEF)),
1376*9880d681SAndroid Build Coastguard Worker                           (LOADX GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$offset),
1377*9880d681SAndroid Build Coastguard Worker                           sub)>;
1378*9880d681SAndroid Build Coastguard Worker}
1379*9880d681SAndroid Build Coastguard Worker
1380*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in {
1381*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro8,  extloadi8,  i32, v8i8,  LDRBroW, LDRBroX, bsub>;
1382*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro8,  extloadi8,  i32, v16i8, LDRBroW, LDRBroX, bsub>;
1383*9880d681SAndroid Build Coastguard Worker
1384*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro16, extloadi16, i32, v4i16, LDRHroW, LDRHroX, hsub>;
1385*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro16, extloadi16, i32, v8i16, LDRHroW, LDRHroX, hsub>;
1386*9880d681SAndroid Build Coastguard Worker
1387*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro16, load,       i32, v4f16, LDRHroW, LDRHroX, hsub>;
1388*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro16, load,       i32, v8f16, LDRHroW, LDRHroX, hsub>;
1389*9880d681SAndroid Build Coastguard Worker
1390*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro32, load,       i32, v2i32, LDRSroW, LDRSroX, ssub>;
1391*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro32, load,       i32, v4i32, LDRSroW, LDRSroX, ssub>;
1392*9880d681SAndroid Build Coastguard Worker
1393*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro32, load,       f32, v2f32, LDRSroW, LDRSroX, ssub>;
1394*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro32, load,       f32, v4f32, LDRSroW, LDRSroX, ssub>;
1395*9880d681SAndroid Build Coastguard Worker
1396*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro64, load,       i64, v2i64, LDRDroW, LDRDroX, dsub>;
1397*9880d681SAndroid Build Coastguard Worker
1398*9880d681SAndroid Build Coastguard Workerdefm : ScalToVecROLoadPat<ro64, load,       f64, v2f64, LDRDroW, LDRDroX, dsub>;
1399*9880d681SAndroid Build Coastguard Worker
1400*9880d681SAndroid Build Coastguard Worker
1401*9880d681SAndroid Build Coastguard Workerdef : Pat <(v1i64 (scalar_to_vector (i64
1402*9880d681SAndroid Build Coastguard Worker                      (load (ro_Windexed64 GPR64sp:$Rn, GPR32:$Rm,
1403*9880d681SAndroid Build Coastguard Worker                                           ro_Wextend64:$extend))))),
1404*9880d681SAndroid Build Coastguard Worker           (LDRDroW GPR64sp:$Rn, GPR32:$Rm, ro_Wextend64:$extend)>;
1405*9880d681SAndroid Build Coastguard Worker
1406*9880d681SAndroid Build Coastguard Workerdef : Pat <(v1i64 (scalar_to_vector (i64
1407*9880d681SAndroid Build Coastguard Worker                      (load (ro_Xindexed64 GPR64sp:$Rn, GPR64:$Rm,
1408*9880d681SAndroid Build Coastguard Worker                                           ro_Xextend64:$extend))))),
1409*9880d681SAndroid Build Coastguard Worker           (LDRDroX GPR64sp:$Rn, GPR64:$Rm, ro_Xextend64:$extend)>;
1410*9880d681SAndroid Build Coastguard Worker}
1411*9880d681SAndroid Build Coastguard Worker
1412*9880d681SAndroid Build Coastguard Worker// Match all load 64 bits width whose type is compatible with FPR64
1413*9880d681SAndroid Build Coastguard Workermulticlass VecROLoadPat<ROAddrMode ro, ValueType VecTy,
1414*9880d681SAndroid Build Coastguard Worker                        Instruction LOADW, Instruction LOADX> {
1415*9880d681SAndroid Build Coastguard Worker
1416*9880d681SAndroid Build Coastguard Worker  def : Pat<(VecTy (load (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend))),
1417*9880d681SAndroid Build Coastguard Worker            (LOADW GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)>;
1418*9880d681SAndroid Build Coastguard Worker
1419*9880d681SAndroid Build Coastguard Worker  def : Pat<(VecTy (load (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend))),
1420*9880d681SAndroid Build Coastguard Worker            (LOADX GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)>;
1421*9880d681SAndroid Build Coastguard Worker}
1422*9880d681SAndroid Build Coastguard Worker
1423*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in {
1424*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
1425*9880d681SAndroid Build Coastguard Worker  // We must do vector loads with LD1 in big-endian.
1426*9880d681SAndroid Build Coastguard Worker  defm : VecROLoadPat<ro64, v2i32, LDRDroW, LDRDroX>;
1427*9880d681SAndroid Build Coastguard Worker  defm : VecROLoadPat<ro64, v2f32, LDRDroW, LDRDroX>;
1428*9880d681SAndroid Build Coastguard Worker  defm : VecROLoadPat<ro64, v8i8,  LDRDroW, LDRDroX>;
1429*9880d681SAndroid Build Coastguard Worker  defm : VecROLoadPat<ro64, v4i16, LDRDroW, LDRDroX>;
1430*9880d681SAndroid Build Coastguard Worker  defm : VecROLoadPat<ro64, v4f16, LDRDroW, LDRDroX>;
1431*9880d681SAndroid Build Coastguard Worker}
1432*9880d681SAndroid Build Coastguard Worker
1433*9880d681SAndroid Build Coastguard Workerdefm : VecROLoadPat<ro64, v1i64,  LDRDroW, LDRDroX>;
1434*9880d681SAndroid Build Coastguard Workerdefm : VecROLoadPat<ro64, v1f64,  LDRDroW, LDRDroX>;
1435*9880d681SAndroid Build Coastguard Worker
1436*9880d681SAndroid Build Coastguard Worker// Match all load 128 bits width whose type is compatible with FPR128
1437*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
1438*9880d681SAndroid Build Coastguard Worker  // We must do vector loads with LD1 in big-endian.
1439*9880d681SAndroid Build Coastguard Worker  defm : VecROLoadPat<ro128, v2i64,  LDRQroW, LDRQroX>;
1440*9880d681SAndroid Build Coastguard Worker  defm : VecROLoadPat<ro128, v2f64,  LDRQroW, LDRQroX>;
1441*9880d681SAndroid Build Coastguard Worker  defm : VecROLoadPat<ro128, v4i32,  LDRQroW, LDRQroX>;
1442*9880d681SAndroid Build Coastguard Worker  defm : VecROLoadPat<ro128, v4f32,  LDRQroW, LDRQroX>;
1443*9880d681SAndroid Build Coastguard Worker  defm : VecROLoadPat<ro128, v8i16,  LDRQroW, LDRQroX>;
1444*9880d681SAndroid Build Coastguard Worker  defm : VecROLoadPat<ro128, v8f16,  LDRQroW, LDRQroX>;
1445*9880d681SAndroid Build Coastguard Worker  defm : VecROLoadPat<ro128, v16i8,  LDRQroW, LDRQroX>;
1446*9880d681SAndroid Build Coastguard Worker}
1447*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 10
1448*9880d681SAndroid Build Coastguard Worker
1449*9880d681SAndroid Build Coastguard Worker// zextload -> i64
1450*9880d681SAndroid Build Coastguard Workermulticlass ExtLoadTo64ROPat<ROAddrMode ro, SDPatternOperator loadop,
1451*9880d681SAndroid Build Coastguard Worker                            Instruction INSTW, Instruction INSTX> {
1452*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (loadop (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend))),
1453*9880d681SAndroid Build Coastguard Worker            (SUBREG_TO_REG (i64 0),
1454*9880d681SAndroid Build Coastguard Worker                           (INSTW GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend),
1455*9880d681SAndroid Build Coastguard Worker                           sub_32)>;
1456*9880d681SAndroid Build Coastguard Worker
1457*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (loadop (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend))),
1458*9880d681SAndroid Build Coastguard Worker            (SUBREG_TO_REG (i64 0),
1459*9880d681SAndroid Build Coastguard Worker                           (INSTX GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend),
1460*9880d681SAndroid Build Coastguard Worker                           sub_32)>;
1461*9880d681SAndroid Build Coastguard Worker}
1462*9880d681SAndroid Build Coastguard Worker
1463*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in {
1464*9880d681SAndroid Build Coastguard Worker  defm : ExtLoadTo64ROPat<ro8,  zextloadi8,  LDRBBroW, LDRBBroX>;
1465*9880d681SAndroid Build Coastguard Worker  defm : ExtLoadTo64ROPat<ro16, zextloadi16, LDRHHroW, LDRHHroX>;
1466*9880d681SAndroid Build Coastguard Worker  defm : ExtLoadTo64ROPat<ro32, zextloadi32, LDRWroW,  LDRWroX>;
1467*9880d681SAndroid Build Coastguard Worker
1468*9880d681SAndroid Build Coastguard Worker  // zextloadi1 -> zextloadi8
1469*9880d681SAndroid Build Coastguard Worker  defm : ExtLoadTo64ROPat<ro8,  zextloadi1,  LDRBBroW, LDRBBroX>;
1470*9880d681SAndroid Build Coastguard Worker
1471*9880d681SAndroid Build Coastguard Worker  // extload -> zextload
1472*9880d681SAndroid Build Coastguard Worker  defm : ExtLoadTo64ROPat<ro8,  extloadi8,   LDRBBroW, LDRBBroX>;
1473*9880d681SAndroid Build Coastguard Worker  defm : ExtLoadTo64ROPat<ro16, extloadi16,  LDRHHroW, LDRHHroX>;
1474*9880d681SAndroid Build Coastguard Worker  defm : ExtLoadTo64ROPat<ro32, extloadi32,  LDRWroW,  LDRWroX>;
1475*9880d681SAndroid Build Coastguard Worker
1476*9880d681SAndroid Build Coastguard Worker  // extloadi1 -> zextloadi8
1477*9880d681SAndroid Build Coastguard Worker  defm : ExtLoadTo64ROPat<ro8,  extloadi1,   LDRBBroW, LDRBBroX>;
1478*9880d681SAndroid Build Coastguard Worker}
1479*9880d681SAndroid Build Coastguard Worker
1480*9880d681SAndroid Build Coastguard Worker
1481*9880d681SAndroid Build Coastguard Worker// zextload -> i64
1482*9880d681SAndroid Build Coastguard Workermulticlass ExtLoadTo32ROPat<ROAddrMode ro, SDPatternOperator loadop,
1483*9880d681SAndroid Build Coastguard Worker                            Instruction INSTW, Instruction INSTX> {
1484*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (loadop (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend))),
1485*9880d681SAndroid Build Coastguard Worker            (INSTW GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)>;
1486*9880d681SAndroid Build Coastguard Worker
1487*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (loadop (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend))),
1488*9880d681SAndroid Build Coastguard Worker            (INSTX GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)>;
1489*9880d681SAndroid Build Coastguard Worker
1490*9880d681SAndroid Build Coastguard Worker}
1491*9880d681SAndroid Build Coastguard Worker
1492*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in {
1493*9880d681SAndroid Build Coastguard Worker  // extload -> zextload
1494*9880d681SAndroid Build Coastguard Worker  defm : ExtLoadTo32ROPat<ro8,  extloadi8,   LDRBBroW, LDRBBroX>;
1495*9880d681SAndroid Build Coastguard Worker  defm : ExtLoadTo32ROPat<ro16, extloadi16,  LDRHHroW, LDRHHroX>;
1496*9880d681SAndroid Build Coastguard Worker  defm : ExtLoadTo32ROPat<ro32, extloadi32,  LDRWroW,  LDRWroX>;
1497*9880d681SAndroid Build Coastguard Worker
1498*9880d681SAndroid Build Coastguard Worker  // zextloadi1 -> zextloadi8
1499*9880d681SAndroid Build Coastguard Worker  defm : ExtLoadTo32ROPat<ro8, zextloadi1, LDRBBroW, LDRBBroX>;
1500*9880d681SAndroid Build Coastguard Worker}
1501*9880d681SAndroid Build Coastguard Worker
1502*9880d681SAndroid Build Coastguard Worker//---
1503*9880d681SAndroid Build Coastguard Worker// (unsigned immediate)
1504*9880d681SAndroid Build Coastguard Worker//---
1505*9880d681SAndroid Build Coastguard Workerdefm LDRX : LoadUI<0b11, 0, 0b01, GPR64, uimm12s8, "ldr",
1506*9880d681SAndroid Build Coastguard Worker                   [(set GPR64:$Rt,
1507*9880d681SAndroid Build Coastguard Worker                         (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)))]>;
1508*9880d681SAndroid Build Coastguard Workerdefm LDRW : LoadUI<0b10, 0, 0b01, GPR32, uimm12s4, "ldr",
1509*9880d681SAndroid Build Coastguard Worker                   [(set GPR32:$Rt,
1510*9880d681SAndroid Build Coastguard Worker                         (load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset)))]>;
1511*9880d681SAndroid Build Coastguard Workerdefm LDRB : LoadUI<0b00, 1, 0b01, FPR8, uimm12s1, "ldr",
1512*9880d681SAndroid Build Coastguard Worker                   [(set FPR8:$Rt,
1513*9880d681SAndroid Build Coastguard Worker                         (load (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset)))]>;
1514*9880d681SAndroid Build Coastguard Workerdefm LDRH : LoadUI<0b01, 1, 0b01, FPR16, uimm12s2, "ldr",
1515*9880d681SAndroid Build Coastguard Worker                   [(set (f16 FPR16:$Rt),
1516*9880d681SAndroid Build Coastguard Worker                         (load (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset)))]>;
1517*9880d681SAndroid Build Coastguard Workerdefm LDRS : LoadUI<0b10, 1, 0b01, FPR32, uimm12s4, "ldr",
1518*9880d681SAndroid Build Coastguard Worker                   [(set (f32 FPR32:$Rt),
1519*9880d681SAndroid Build Coastguard Worker                         (load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset)))]>;
1520*9880d681SAndroid Build Coastguard Workerdefm LDRD : LoadUI<0b11, 1, 0b01, FPR64, uimm12s8, "ldr",
1521*9880d681SAndroid Build Coastguard Worker                   [(set (f64 FPR64:$Rt),
1522*9880d681SAndroid Build Coastguard Worker                         (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)))]>;
1523*9880d681SAndroid Build Coastguard Workerdefm LDRQ : LoadUI<0b00, 1, 0b11, FPR128, uimm12s16, "ldr",
1524*9880d681SAndroid Build Coastguard Worker                 [(set (f128 FPR128:$Rt),
1525*9880d681SAndroid Build Coastguard Worker                       (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)))]>;
1526*9880d681SAndroid Build Coastguard Worker
1527*9880d681SAndroid Build Coastguard Worker// For regular load, we do not have any alignment requirement.
1528*9880d681SAndroid Build Coastguard Worker// Thus, it is safe to directly map the vector loads with interesting
1529*9880d681SAndroid Build Coastguard Worker// addressing modes.
1530*9880d681SAndroid Build Coastguard Worker// FIXME: We could do the same for bitconvert to floating point vectors.
1531*9880d681SAndroid Build Coastguard Workerdef : Pat <(v8i8 (scalar_to_vector (i32
1532*9880d681SAndroid Build Coastguard Worker               (extloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))))),
1533*9880d681SAndroid Build Coastguard Worker           (INSERT_SUBREG (v8i8 (IMPLICIT_DEF)),
1534*9880d681SAndroid Build Coastguard Worker                          (LDRBui GPR64sp:$Rn, uimm12s1:$offset), bsub)>;
1535*9880d681SAndroid Build Coastguard Workerdef : Pat <(v16i8 (scalar_to_vector (i32
1536*9880d681SAndroid Build Coastguard Worker               (extloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))))),
1537*9880d681SAndroid Build Coastguard Worker           (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
1538*9880d681SAndroid Build Coastguard Worker                          (LDRBui GPR64sp:$Rn, uimm12s1:$offset), bsub)>;
1539*9880d681SAndroid Build Coastguard Workerdef : Pat <(v4i16 (scalar_to_vector (i32
1540*9880d681SAndroid Build Coastguard Worker               (extloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))))),
1541*9880d681SAndroid Build Coastguard Worker           (INSERT_SUBREG (v4i16 (IMPLICIT_DEF)),
1542*9880d681SAndroid Build Coastguard Worker                          (LDRHui GPR64sp:$Rn, uimm12s2:$offset), hsub)>;
1543*9880d681SAndroid Build Coastguard Workerdef : Pat <(v8i16 (scalar_to_vector (i32
1544*9880d681SAndroid Build Coastguard Worker               (extloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))))),
1545*9880d681SAndroid Build Coastguard Worker           (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)),
1546*9880d681SAndroid Build Coastguard Worker                          (LDRHui GPR64sp:$Rn, uimm12s2:$offset), hsub)>;
1547*9880d681SAndroid Build Coastguard Workerdef : Pat <(v2i32 (scalar_to_vector (i32
1548*9880d681SAndroid Build Coastguard Worker               (load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))))),
1549*9880d681SAndroid Build Coastguard Worker           (INSERT_SUBREG (v2i32 (IMPLICIT_DEF)),
1550*9880d681SAndroid Build Coastguard Worker                          (LDRSui GPR64sp:$Rn, uimm12s4:$offset), ssub)>;
1551*9880d681SAndroid Build Coastguard Workerdef : Pat <(v4i32 (scalar_to_vector (i32
1552*9880d681SAndroid Build Coastguard Worker               (load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))))),
1553*9880d681SAndroid Build Coastguard Worker           (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)),
1554*9880d681SAndroid Build Coastguard Worker                          (LDRSui GPR64sp:$Rn, uimm12s4:$offset), ssub)>;
1555*9880d681SAndroid Build Coastguard Workerdef : Pat <(v1i64 (scalar_to_vector (i64
1556*9880d681SAndroid Build Coastguard Worker               (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))))),
1557*9880d681SAndroid Build Coastguard Worker           (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>;
1558*9880d681SAndroid Build Coastguard Workerdef : Pat <(v2i64 (scalar_to_vector (i64
1559*9880d681SAndroid Build Coastguard Worker               (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))))),
1560*9880d681SAndroid Build Coastguard Worker           (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
1561*9880d681SAndroid Build Coastguard Worker                          (LDRDui GPR64sp:$Rn, uimm12s8:$offset), dsub)>;
1562*9880d681SAndroid Build Coastguard Worker
1563*9880d681SAndroid Build Coastguard Worker// Match all load 64 bits width whose type is compatible with FPR64
1564*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
1565*9880d681SAndroid Build Coastguard Worker  // We must use LD1 to perform vector loads in big-endian.
1566*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2f32 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))),
1567*9880d681SAndroid Build Coastguard Worker            (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>;
1568*9880d681SAndroid Build Coastguard Worker  def : Pat<(v8i8 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))),
1569*9880d681SAndroid Build Coastguard Worker            (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>;
1570*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i16 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))),
1571*9880d681SAndroid Build Coastguard Worker            (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>;
1572*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2i32 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))),
1573*9880d681SAndroid Build Coastguard Worker            (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>;
1574*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f16 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))),
1575*9880d681SAndroid Build Coastguard Worker            (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>;
1576*9880d681SAndroid Build Coastguard Worker}
1577*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))),
1578*9880d681SAndroid Build Coastguard Worker          (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>;
1579*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (load (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))),
1580*9880d681SAndroid Build Coastguard Worker          (LDRDui GPR64sp:$Rn, uimm12s8:$offset)>;
1581*9880d681SAndroid Build Coastguard Worker
1582*9880d681SAndroid Build Coastguard Worker// Match all load 128 bits width whose type is compatible with FPR128
1583*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
1584*9880d681SAndroid Build Coastguard Worker  // We must use LD1 to perform vector loads in big-endian.
1585*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))),
1586*9880d681SAndroid Build Coastguard Worker            (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>;
1587*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2f64 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))),
1588*9880d681SAndroid Build Coastguard Worker            (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>;
1589*9880d681SAndroid Build Coastguard Worker  def : Pat<(v16i8 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))),
1590*9880d681SAndroid Build Coastguard Worker            (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>;
1591*9880d681SAndroid Build Coastguard Worker  def : Pat<(v8i16 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))),
1592*9880d681SAndroid Build Coastguard Worker            (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>;
1593*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))),
1594*9880d681SAndroid Build Coastguard Worker            (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>;
1595*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2i64 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))),
1596*9880d681SAndroid Build Coastguard Worker            (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>;
1597*9880d681SAndroid Build Coastguard Worker  def : Pat<(v8f16 (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))),
1598*9880d681SAndroid Build Coastguard Worker            (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>;
1599*9880d681SAndroid Build Coastguard Worker}
1600*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128  (load (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset))),
1601*9880d681SAndroid Build Coastguard Worker          (LDRQui GPR64sp:$Rn, uimm12s16:$offset)>;
1602*9880d681SAndroid Build Coastguard Worker
1603*9880d681SAndroid Build Coastguard Workerdefm LDRHH : LoadUI<0b01, 0, 0b01, GPR32, uimm12s2, "ldrh",
1604*9880d681SAndroid Build Coastguard Worker                    [(set GPR32:$Rt,
1605*9880d681SAndroid Build Coastguard Worker                          (zextloadi16 (am_indexed16 GPR64sp:$Rn,
1606*9880d681SAndroid Build Coastguard Worker                                                     uimm12s2:$offset)))]>;
1607*9880d681SAndroid Build Coastguard Workerdefm LDRBB : LoadUI<0b00, 0, 0b01, GPR32, uimm12s1, "ldrb",
1608*9880d681SAndroid Build Coastguard Worker                    [(set GPR32:$Rt,
1609*9880d681SAndroid Build Coastguard Worker                          (zextloadi8 (am_indexed8 GPR64sp:$Rn,
1610*9880d681SAndroid Build Coastguard Worker                                                   uimm12s1:$offset)))]>;
1611*9880d681SAndroid Build Coastguard Worker// zextload -> i64
1612*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))),
1613*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDRBBui GPR64sp:$Rn, uimm12s1:$offset), sub_32)>;
1614*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))),
1615*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDRHHui GPR64sp:$Rn, uimm12s2:$offset), sub_32)>;
1616*9880d681SAndroid Build Coastguard Worker
1617*9880d681SAndroid Build Coastguard Worker// zextloadi1 -> zextloadi8
1618*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (zextloadi1 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))),
1619*9880d681SAndroid Build Coastguard Worker          (LDRBBui GPR64sp:$Rn, uimm12s1:$offset)>;
1620*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi1 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))),
1621*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDRBBui GPR64sp:$Rn, uimm12s1:$offset), sub_32)>;
1622*9880d681SAndroid Build Coastguard Worker
1623*9880d681SAndroid Build Coastguard Worker// extload -> zextload
1624*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (extloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))),
1625*9880d681SAndroid Build Coastguard Worker          (LDRHHui GPR64sp:$Rn, uimm12s2:$offset)>;
1626*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (extloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))),
1627*9880d681SAndroid Build Coastguard Worker          (LDRBBui GPR64sp:$Rn, uimm12s1:$offset)>;
1628*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (extloadi1 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))),
1629*9880d681SAndroid Build Coastguard Worker          (LDRBBui GPR64sp:$Rn, uimm12s1:$offset)>;
1630*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi32 (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))),
1631*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDRWui GPR64sp:$Rn, uimm12s4:$offset), sub_32)>;
1632*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))),
1633*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDRHHui GPR64sp:$Rn, uimm12s2:$offset), sub_32)>;
1634*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))),
1635*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDRBBui GPR64sp:$Rn, uimm12s1:$offset), sub_32)>;
1636*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi1 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))),
1637*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDRBBui GPR64sp:$Rn, uimm12s1:$offset), sub_32)>;
1638*9880d681SAndroid Build Coastguard Worker
1639*9880d681SAndroid Build Coastguard Worker// load sign-extended half-word
1640*9880d681SAndroid Build Coastguard Workerdefm LDRSHW : LoadUI<0b01, 0, 0b11, GPR32, uimm12s2, "ldrsh",
1641*9880d681SAndroid Build Coastguard Worker                     [(set GPR32:$Rt,
1642*9880d681SAndroid Build Coastguard Worker                           (sextloadi16 (am_indexed16 GPR64sp:$Rn,
1643*9880d681SAndroid Build Coastguard Worker                                                      uimm12s2:$offset)))]>;
1644*9880d681SAndroid Build Coastguard Workerdefm LDRSHX : LoadUI<0b01, 0, 0b10, GPR64, uimm12s2, "ldrsh",
1645*9880d681SAndroid Build Coastguard Worker                     [(set GPR64:$Rt,
1646*9880d681SAndroid Build Coastguard Worker                           (sextloadi16 (am_indexed16 GPR64sp:$Rn,
1647*9880d681SAndroid Build Coastguard Worker                                                      uimm12s2:$offset)))]>;
1648*9880d681SAndroid Build Coastguard Worker
1649*9880d681SAndroid Build Coastguard Worker// load sign-extended byte
1650*9880d681SAndroid Build Coastguard Workerdefm LDRSBW : LoadUI<0b00, 0, 0b11, GPR32, uimm12s1, "ldrsb",
1651*9880d681SAndroid Build Coastguard Worker                     [(set GPR32:$Rt,
1652*9880d681SAndroid Build Coastguard Worker                           (sextloadi8 (am_indexed8 GPR64sp:$Rn,
1653*9880d681SAndroid Build Coastguard Worker                                                    uimm12s1:$offset)))]>;
1654*9880d681SAndroid Build Coastguard Workerdefm LDRSBX : LoadUI<0b00, 0, 0b10, GPR64, uimm12s1, "ldrsb",
1655*9880d681SAndroid Build Coastguard Worker                     [(set GPR64:$Rt,
1656*9880d681SAndroid Build Coastguard Worker                           (sextloadi8 (am_indexed8 GPR64sp:$Rn,
1657*9880d681SAndroid Build Coastguard Worker                                                    uimm12s1:$offset)))]>;
1658*9880d681SAndroid Build Coastguard Worker
1659*9880d681SAndroid Build Coastguard Worker// load sign-extended word
1660*9880d681SAndroid Build Coastguard Workerdefm LDRSW  : LoadUI<0b10, 0, 0b10, GPR64, uimm12s4, "ldrsw",
1661*9880d681SAndroid Build Coastguard Worker                     [(set GPR64:$Rt,
1662*9880d681SAndroid Build Coastguard Worker                           (sextloadi32 (am_indexed32 GPR64sp:$Rn,
1663*9880d681SAndroid Build Coastguard Worker                                                      uimm12s4:$offset)))]>;
1664*9880d681SAndroid Build Coastguard Worker
1665*9880d681SAndroid Build Coastguard Worker// load zero-extended word
1666*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi32 (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))),
1667*9880d681SAndroid Build Coastguard Worker      (SUBREG_TO_REG (i64 0), (LDRWui GPR64sp:$Rn, uimm12s4:$offset), sub_32)>;
1668*9880d681SAndroid Build Coastguard Worker
1669*9880d681SAndroid Build Coastguard Worker// Pre-fetch.
1670*9880d681SAndroid Build Coastguard Workerdef PRFMui : PrefetchUI<0b11, 0, 0b10, "prfm",
1671*9880d681SAndroid Build Coastguard Worker                        [(AArch64Prefetch imm:$Rt,
1672*9880d681SAndroid Build Coastguard Worker                                        (am_indexed64 GPR64sp:$Rn,
1673*9880d681SAndroid Build Coastguard Worker                                                      uimm12s8:$offset))]>;
1674*9880d681SAndroid Build Coastguard Worker
1675*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"prfm $Rt, [$Rn]", (PRFMui prfop:$Rt, GPR64sp:$Rn, 0)>;
1676*9880d681SAndroid Build Coastguard Worker
1677*9880d681SAndroid Build Coastguard Worker//---
1678*9880d681SAndroid Build Coastguard Worker// (literal)
1679*9880d681SAndroid Build Coastguard Workerdef LDRWl : LoadLiteral<0b00, 0, GPR32, "ldr">;
1680*9880d681SAndroid Build Coastguard Workerdef LDRXl : LoadLiteral<0b01, 0, GPR64, "ldr">;
1681*9880d681SAndroid Build Coastguard Workerdef LDRSl : LoadLiteral<0b00, 1, FPR32, "ldr">;
1682*9880d681SAndroid Build Coastguard Workerdef LDRDl : LoadLiteral<0b01, 1, FPR64, "ldr">;
1683*9880d681SAndroid Build Coastguard Workerdef LDRQl : LoadLiteral<0b10, 1, FPR128, "ldr">;
1684*9880d681SAndroid Build Coastguard Worker
1685*9880d681SAndroid Build Coastguard Worker// load sign-extended word
1686*9880d681SAndroid Build Coastguard Workerdef LDRSWl : LoadLiteral<0b10, 0, GPR64, "ldrsw">;
1687*9880d681SAndroid Build Coastguard Worker
1688*9880d681SAndroid Build Coastguard Worker// prefetch
1689*9880d681SAndroid Build Coastguard Workerdef PRFMl : PrefetchLiteral<0b11, 0, "prfm", []>;
1690*9880d681SAndroid Build Coastguard Worker//                   [(AArch64Prefetch imm:$Rt, tglobaladdr:$label)]>;
1691*9880d681SAndroid Build Coastguard Worker
1692*9880d681SAndroid Build Coastguard Worker//---
1693*9880d681SAndroid Build Coastguard Worker// (unscaled immediate)
1694*9880d681SAndroid Build Coastguard Workerdefm LDURX : LoadUnscaled<0b11, 0, 0b01, GPR64, "ldur",
1695*9880d681SAndroid Build Coastguard Worker                    [(set GPR64:$Rt,
1696*9880d681SAndroid Build Coastguard Worker                          (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset)))]>;
1697*9880d681SAndroid Build Coastguard Workerdefm LDURW : LoadUnscaled<0b10, 0, 0b01, GPR32, "ldur",
1698*9880d681SAndroid Build Coastguard Worker                    [(set GPR32:$Rt,
1699*9880d681SAndroid Build Coastguard Worker                          (load (am_unscaled32 GPR64sp:$Rn, simm9:$offset)))]>;
1700*9880d681SAndroid Build Coastguard Workerdefm LDURB : LoadUnscaled<0b00, 1, 0b01, FPR8, "ldur",
1701*9880d681SAndroid Build Coastguard Worker                    [(set FPR8:$Rt,
1702*9880d681SAndroid Build Coastguard Worker                          (load (am_unscaled8 GPR64sp:$Rn, simm9:$offset)))]>;
1703*9880d681SAndroid Build Coastguard Workerdefm LDURH : LoadUnscaled<0b01, 1, 0b01, FPR16, "ldur",
1704*9880d681SAndroid Build Coastguard Worker                    [(set FPR16:$Rt,
1705*9880d681SAndroid Build Coastguard Worker                          (load (am_unscaled16 GPR64sp:$Rn, simm9:$offset)))]>;
1706*9880d681SAndroid Build Coastguard Workerdefm LDURS : LoadUnscaled<0b10, 1, 0b01, FPR32, "ldur",
1707*9880d681SAndroid Build Coastguard Worker                    [(set (f32 FPR32:$Rt),
1708*9880d681SAndroid Build Coastguard Worker                          (load (am_unscaled32 GPR64sp:$Rn, simm9:$offset)))]>;
1709*9880d681SAndroid Build Coastguard Workerdefm LDURD : LoadUnscaled<0b11, 1, 0b01, FPR64, "ldur",
1710*9880d681SAndroid Build Coastguard Worker                    [(set (f64 FPR64:$Rt),
1711*9880d681SAndroid Build Coastguard Worker                          (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset)))]>;
1712*9880d681SAndroid Build Coastguard Workerdefm LDURQ : LoadUnscaled<0b00, 1, 0b11, FPR128, "ldur",
1713*9880d681SAndroid Build Coastguard Worker                    [(set (f128 FPR128:$Rt),
1714*9880d681SAndroid Build Coastguard Worker                          (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset)))]>;
1715*9880d681SAndroid Build Coastguard Worker
1716*9880d681SAndroid Build Coastguard Workerdefm LDURHH
1717*9880d681SAndroid Build Coastguard Worker    : LoadUnscaled<0b01, 0, 0b01, GPR32, "ldurh",
1718*9880d681SAndroid Build Coastguard Worker             [(set GPR32:$Rt,
1719*9880d681SAndroid Build Coastguard Worker                    (zextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset)))]>;
1720*9880d681SAndroid Build Coastguard Workerdefm LDURBB
1721*9880d681SAndroid Build Coastguard Worker    : LoadUnscaled<0b00, 0, 0b01, GPR32, "ldurb",
1722*9880d681SAndroid Build Coastguard Worker             [(set GPR32:$Rt,
1723*9880d681SAndroid Build Coastguard Worker                    (zextloadi8 (am_unscaled16 GPR64sp:$Rn, simm9:$offset)))]>;
1724*9880d681SAndroid Build Coastguard Worker
1725*9880d681SAndroid Build Coastguard Worker// Match all load 64 bits width whose type is compatible with FPR64
1726*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
1727*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2f32 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))),
1728*9880d681SAndroid Build Coastguard Worker            (LDURDi GPR64sp:$Rn, simm9:$offset)>;
1729*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2i32 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))),
1730*9880d681SAndroid Build Coastguard Worker            (LDURDi GPR64sp:$Rn, simm9:$offset)>;
1731*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i16 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))),
1732*9880d681SAndroid Build Coastguard Worker            (LDURDi GPR64sp:$Rn, simm9:$offset)>;
1733*9880d681SAndroid Build Coastguard Worker  def : Pat<(v8i8 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))),
1734*9880d681SAndroid Build Coastguard Worker            (LDURDi GPR64sp:$Rn, simm9:$offset)>;
1735*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f16 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))),
1736*9880d681SAndroid Build Coastguard Worker            (LDURDi GPR64sp:$Rn, simm9:$offset)>;
1737*9880d681SAndroid Build Coastguard Worker}
1738*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))),
1739*9880d681SAndroid Build Coastguard Worker          (LDURDi GPR64sp:$Rn, simm9:$offset)>;
1740*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))),
1741*9880d681SAndroid Build Coastguard Worker          (LDURDi GPR64sp:$Rn, simm9:$offset)>;
1742*9880d681SAndroid Build Coastguard Worker
1743*9880d681SAndroid Build Coastguard Worker// Match all load 128 bits width whose type is compatible with FPR128
1744*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
1745*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2f64 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))),
1746*9880d681SAndroid Build Coastguard Worker            (LDURQi GPR64sp:$Rn, simm9:$offset)>;
1747*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2i64 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))),
1748*9880d681SAndroid Build Coastguard Worker            (LDURQi GPR64sp:$Rn, simm9:$offset)>;
1749*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))),
1750*9880d681SAndroid Build Coastguard Worker            (LDURQi GPR64sp:$Rn, simm9:$offset)>;
1751*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))),
1752*9880d681SAndroid Build Coastguard Worker            (LDURQi GPR64sp:$Rn, simm9:$offset)>;
1753*9880d681SAndroid Build Coastguard Worker  def : Pat<(v8i16 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))),
1754*9880d681SAndroid Build Coastguard Worker            (LDURQi GPR64sp:$Rn, simm9:$offset)>;
1755*9880d681SAndroid Build Coastguard Worker  def : Pat<(v16i8 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))),
1756*9880d681SAndroid Build Coastguard Worker            (LDURQi GPR64sp:$Rn, simm9:$offset)>;
1757*9880d681SAndroid Build Coastguard Worker  def : Pat<(v8f16 (load (am_unscaled128 GPR64sp:$Rn, simm9:$offset))),
1758*9880d681SAndroid Build Coastguard Worker            (LDURQi GPR64sp:$Rn, simm9:$offset)>;
1759*9880d681SAndroid Build Coastguard Worker}
1760*9880d681SAndroid Build Coastguard Worker
1761*9880d681SAndroid Build Coastguard Worker//  anyext -> zext
1762*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (extloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))),
1763*9880d681SAndroid Build Coastguard Worker          (LDURHHi GPR64sp:$Rn, simm9:$offset)>;
1764*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (extloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))),
1765*9880d681SAndroid Build Coastguard Worker          (LDURBBi GPR64sp:$Rn, simm9:$offset)>;
1766*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (extloadi1 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))),
1767*9880d681SAndroid Build Coastguard Worker          (LDURBBi GPR64sp:$Rn, simm9:$offset)>;
1768*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi32 (am_unscaled32 GPR64sp:$Rn, simm9:$offset))),
1769*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDURWi GPR64sp:$Rn, simm9:$offset), sub_32)>;
1770*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))),
1771*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDURHHi GPR64sp:$Rn, simm9:$offset), sub_32)>;
1772*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))),
1773*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDURBBi GPR64sp:$Rn, simm9:$offset), sub_32)>;
1774*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (extloadi1 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))),
1775*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDURBBi GPR64sp:$Rn, simm9:$offset), sub_32)>;
1776*9880d681SAndroid Build Coastguard Worker// unscaled zext
1777*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (zextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))),
1778*9880d681SAndroid Build Coastguard Worker          (LDURHHi GPR64sp:$Rn, simm9:$offset)>;
1779*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (zextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))),
1780*9880d681SAndroid Build Coastguard Worker          (LDURBBi GPR64sp:$Rn, simm9:$offset)>;
1781*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (zextloadi1 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))),
1782*9880d681SAndroid Build Coastguard Worker          (LDURBBi GPR64sp:$Rn, simm9:$offset)>;
1783*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi32 (am_unscaled32 GPR64sp:$Rn, simm9:$offset))),
1784*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDURWi GPR64sp:$Rn, simm9:$offset), sub_32)>;
1785*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))),
1786*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDURHHi GPR64sp:$Rn, simm9:$offset), sub_32)>;
1787*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))),
1788*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDURBBi GPR64sp:$Rn, simm9:$offset), sub_32)>;
1789*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi1 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))),
1790*9880d681SAndroid Build Coastguard Worker    (SUBREG_TO_REG (i64 0), (LDURBBi GPR64sp:$Rn, simm9:$offset), sub_32)>;
1791*9880d681SAndroid Build Coastguard Worker
1792*9880d681SAndroid Build Coastguard Worker
1793*9880d681SAndroid Build Coastguard Worker//---
1794*9880d681SAndroid Build Coastguard Worker// LDR mnemonics fall back to LDUR for negative or unaligned offsets.
1795*9880d681SAndroid Build Coastguard Worker
1796*9880d681SAndroid Build Coastguard Worker// Define new assembler match classes as we want to only match these when
1797*9880d681SAndroid Build Coastguard Worker// the don't otherwise match the scaled addressing mode for LDR/STR. Don't
1798*9880d681SAndroid Build Coastguard Worker// associate a DiagnosticType either, as we want the diagnostic for the
1799*9880d681SAndroid Build Coastguard Worker// canonical form (the scaled operand) to take precedence.
1800*9880d681SAndroid Build Coastguard Workerclass SImm9OffsetOperand<int Width> : AsmOperandClass {
1801*9880d681SAndroid Build Coastguard Worker  let Name = "SImm9OffsetFB" # Width;
1802*9880d681SAndroid Build Coastguard Worker  let PredicateMethod = "isSImm9OffsetFB<" # Width # ">";
1803*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addImmOperands";
1804*9880d681SAndroid Build Coastguard Worker}
1805*9880d681SAndroid Build Coastguard Worker
1806*9880d681SAndroid Build Coastguard Workerdef SImm9OffsetFB8Operand : SImm9OffsetOperand<8>;
1807*9880d681SAndroid Build Coastguard Workerdef SImm9OffsetFB16Operand : SImm9OffsetOperand<16>;
1808*9880d681SAndroid Build Coastguard Workerdef SImm9OffsetFB32Operand : SImm9OffsetOperand<32>;
1809*9880d681SAndroid Build Coastguard Workerdef SImm9OffsetFB64Operand : SImm9OffsetOperand<64>;
1810*9880d681SAndroid Build Coastguard Workerdef SImm9OffsetFB128Operand : SImm9OffsetOperand<128>;
1811*9880d681SAndroid Build Coastguard Worker
1812*9880d681SAndroid Build Coastguard Workerdef simm9_offset_fb8 : Operand<i64> {
1813*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = SImm9OffsetFB8Operand;
1814*9880d681SAndroid Build Coastguard Worker}
1815*9880d681SAndroid Build Coastguard Workerdef simm9_offset_fb16 : Operand<i64> {
1816*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = SImm9OffsetFB16Operand;
1817*9880d681SAndroid Build Coastguard Worker}
1818*9880d681SAndroid Build Coastguard Workerdef simm9_offset_fb32 : Operand<i64> {
1819*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = SImm9OffsetFB32Operand;
1820*9880d681SAndroid Build Coastguard Worker}
1821*9880d681SAndroid Build Coastguard Workerdef simm9_offset_fb64 : Operand<i64> {
1822*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = SImm9OffsetFB64Operand;
1823*9880d681SAndroid Build Coastguard Worker}
1824*9880d681SAndroid Build Coastguard Workerdef simm9_offset_fb128 : Operand<i64> {
1825*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = SImm9OffsetFB128Operand;
1826*9880d681SAndroid Build Coastguard Worker}
1827*9880d681SAndroid Build Coastguard Worker
1828*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]",
1829*9880d681SAndroid Build Coastguard Worker                (LDURXi GPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb64:$offset), 0>;
1830*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]",
1831*9880d681SAndroid Build Coastguard Worker                (LDURWi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb32:$offset), 0>;
1832*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]",
1833*9880d681SAndroid Build Coastguard Worker                (LDURBi FPR8:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>;
1834*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]",
1835*9880d681SAndroid Build Coastguard Worker                (LDURHi FPR16:$Rt, GPR64sp:$Rn, simm9_offset_fb16:$offset), 0>;
1836*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]",
1837*9880d681SAndroid Build Coastguard Worker                (LDURSi FPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb32:$offset), 0>;
1838*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]",
1839*9880d681SAndroid Build Coastguard Worker                (LDURDi FPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb64:$offset), 0>;
1840*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldr $Rt, [$Rn, $offset]",
1841*9880d681SAndroid Build Coastguard Worker               (LDURQi FPR128:$Rt, GPR64sp:$Rn, simm9_offset_fb128:$offset), 0>;
1842*9880d681SAndroid Build Coastguard Worker
1843*9880d681SAndroid Build Coastguard Worker// zextload -> i64
1844*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))),
1845*9880d681SAndroid Build Coastguard Worker  (SUBREG_TO_REG (i64 0), (LDURBBi GPR64sp:$Rn, simm9:$offset), sub_32)>;
1846*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))),
1847*9880d681SAndroid Build Coastguard Worker  (SUBREG_TO_REG (i64 0), (LDURHHi GPR64sp:$Rn, simm9:$offset), sub_32)>;
1848*9880d681SAndroid Build Coastguard Worker
1849*9880d681SAndroid Build Coastguard Worker// load sign-extended half-word
1850*9880d681SAndroid Build Coastguard Workerdefm LDURSHW
1851*9880d681SAndroid Build Coastguard Worker    : LoadUnscaled<0b01, 0, 0b11, GPR32, "ldursh",
1852*9880d681SAndroid Build Coastguard Worker               [(set GPR32:$Rt,
1853*9880d681SAndroid Build Coastguard Worker                    (sextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset)))]>;
1854*9880d681SAndroid Build Coastguard Workerdefm LDURSHX
1855*9880d681SAndroid Build Coastguard Worker    : LoadUnscaled<0b01, 0, 0b10, GPR64, "ldursh",
1856*9880d681SAndroid Build Coastguard Worker              [(set GPR64:$Rt,
1857*9880d681SAndroid Build Coastguard Worker                    (sextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset)))]>;
1858*9880d681SAndroid Build Coastguard Worker
1859*9880d681SAndroid Build Coastguard Worker// load sign-extended byte
1860*9880d681SAndroid Build Coastguard Workerdefm LDURSBW
1861*9880d681SAndroid Build Coastguard Worker    : LoadUnscaled<0b00, 0, 0b11, GPR32, "ldursb",
1862*9880d681SAndroid Build Coastguard Worker                [(set GPR32:$Rt,
1863*9880d681SAndroid Build Coastguard Worker                      (sextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset)))]>;
1864*9880d681SAndroid Build Coastguard Workerdefm LDURSBX
1865*9880d681SAndroid Build Coastguard Worker    : LoadUnscaled<0b00, 0, 0b10, GPR64, "ldursb",
1866*9880d681SAndroid Build Coastguard Worker                [(set GPR64:$Rt,
1867*9880d681SAndroid Build Coastguard Worker                      (sextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset)))]>;
1868*9880d681SAndroid Build Coastguard Worker
1869*9880d681SAndroid Build Coastguard Worker// load sign-extended word
1870*9880d681SAndroid Build Coastguard Workerdefm LDURSW
1871*9880d681SAndroid Build Coastguard Worker    : LoadUnscaled<0b10, 0, 0b10, GPR64, "ldursw",
1872*9880d681SAndroid Build Coastguard Worker              [(set GPR64:$Rt,
1873*9880d681SAndroid Build Coastguard Worker                    (sextloadi32 (am_unscaled32 GPR64sp:$Rn, simm9:$offset)))]>;
1874*9880d681SAndroid Build Coastguard Worker
1875*9880d681SAndroid Build Coastguard Worker// zero and sign extending aliases from generic LDR* mnemonics to LDUR*.
1876*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrb $Rt, [$Rn, $offset]",
1877*9880d681SAndroid Build Coastguard Worker                (LDURBBi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>;
1878*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrh $Rt, [$Rn, $offset]",
1879*9880d681SAndroid Build Coastguard Worker                (LDURHHi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb16:$offset), 0>;
1880*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrsb $Rt, [$Rn, $offset]",
1881*9880d681SAndroid Build Coastguard Worker                (LDURSBWi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>;
1882*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrsb $Rt, [$Rn, $offset]",
1883*9880d681SAndroid Build Coastguard Worker                (LDURSBXi GPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>;
1884*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrsh $Rt, [$Rn, $offset]",
1885*9880d681SAndroid Build Coastguard Worker                (LDURSHWi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb16:$offset), 0>;
1886*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrsh $Rt, [$Rn, $offset]",
1887*9880d681SAndroid Build Coastguard Worker                (LDURSHXi GPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb16:$offset), 0>;
1888*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ldrsw $Rt, [$Rn, $offset]",
1889*9880d681SAndroid Build Coastguard Worker                (LDURSWi GPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb32:$offset), 0>;
1890*9880d681SAndroid Build Coastguard Worker
1891*9880d681SAndroid Build Coastguard Worker// Pre-fetch.
1892*9880d681SAndroid Build Coastguard Workerdefm PRFUM : PrefetchUnscaled<0b11, 0, 0b10, "prfum",
1893*9880d681SAndroid Build Coastguard Worker                  [(AArch64Prefetch imm:$Rt,
1894*9880d681SAndroid Build Coastguard Worker                                  (am_unscaled64 GPR64sp:$Rn, simm9:$offset))]>;
1895*9880d681SAndroid Build Coastguard Worker
1896*9880d681SAndroid Build Coastguard Worker//---
1897*9880d681SAndroid Build Coastguard Worker// (unscaled immediate, unprivileged)
1898*9880d681SAndroid Build Coastguard Workerdefm LDTRX : LoadUnprivileged<0b11, 0, 0b01, GPR64, "ldtr">;
1899*9880d681SAndroid Build Coastguard Workerdefm LDTRW : LoadUnprivileged<0b10, 0, 0b01, GPR32, "ldtr">;
1900*9880d681SAndroid Build Coastguard Worker
1901*9880d681SAndroid Build Coastguard Workerdefm LDTRH : LoadUnprivileged<0b01, 0, 0b01, GPR32, "ldtrh">;
1902*9880d681SAndroid Build Coastguard Workerdefm LDTRB : LoadUnprivileged<0b00, 0, 0b01, GPR32, "ldtrb">;
1903*9880d681SAndroid Build Coastguard Worker
1904*9880d681SAndroid Build Coastguard Worker// load sign-extended half-word
1905*9880d681SAndroid Build Coastguard Workerdefm LDTRSHW : LoadUnprivileged<0b01, 0, 0b11, GPR32, "ldtrsh">;
1906*9880d681SAndroid Build Coastguard Workerdefm LDTRSHX : LoadUnprivileged<0b01, 0, 0b10, GPR64, "ldtrsh">;
1907*9880d681SAndroid Build Coastguard Worker
1908*9880d681SAndroid Build Coastguard Worker// load sign-extended byte
1909*9880d681SAndroid Build Coastguard Workerdefm LDTRSBW : LoadUnprivileged<0b00, 0, 0b11, GPR32, "ldtrsb">;
1910*9880d681SAndroid Build Coastguard Workerdefm LDTRSBX : LoadUnprivileged<0b00, 0, 0b10, GPR64, "ldtrsb">;
1911*9880d681SAndroid Build Coastguard Worker
1912*9880d681SAndroid Build Coastguard Worker// load sign-extended word
1913*9880d681SAndroid Build Coastguard Workerdefm LDTRSW  : LoadUnprivileged<0b10, 0, 0b10, GPR64, "ldtrsw">;
1914*9880d681SAndroid Build Coastguard Worker
1915*9880d681SAndroid Build Coastguard Worker//---
1916*9880d681SAndroid Build Coastguard Worker// (immediate pre-indexed)
1917*9880d681SAndroid Build Coastguard Workerdef LDRWpre : LoadPreIdx<0b10, 0, 0b01, GPR32, "ldr">;
1918*9880d681SAndroid Build Coastguard Workerdef LDRXpre : LoadPreIdx<0b11, 0, 0b01, GPR64, "ldr">;
1919*9880d681SAndroid Build Coastguard Workerdef LDRBpre : LoadPreIdx<0b00, 1, 0b01, FPR8,  "ldr">;
1920*9880d681SAndroid Build Coastguard Workerdef LDRHpre : LoadPreIdx<0b01, 1, 0b01, FPR16, "ldr">;
1921*9880d681SAndroid Build Coastguard Workerdef LDRSpre : LoadPreIdx<0b10, 1, 0b01, FPR32, "ldr">;
1922*9880d681SAndroid Build Coastguard Workerdef LDRDpre : LoadPreIdx<0b11, 1, 0b01, FPR64, "ldr">;
1923*9880d681SAndroid Build Coastguard Workerdef LDRQpre : LoadPreIdx<0b00, 1, 0b11, FPR128, "ldr">;
1924*9880d681SAndroid Build Coastguard Worker
1925*9880d681SAndroid Build Coastguard Worker// load sign-extended half-word
1926*9880d681SAndroid Build Coastguard Workerdef LDRSHWpre : LoadPreIdx<0b01, 0, 0b11, GPR32, "ldrsh">;
1927*9880d681SAndroid Build Coastguard Workerdef LDRSHXpre : LoadPreIdx<0b01, 0, 0b10, GPR64, "ldrsh">;
1928*9880d681SAndroid Build Coastguard Worker
1929*9880d681SAndroid Build Coastguard Worker// load sign-extended byte
1930*9880d681SAndroid Build Coastguard Workerdef LDRSBWpre : LoadPreIdx<0b00, 0, 0b11, GPR32, "ldrsb">;
1931*9880d681SAndroid Build Coastguard Workerdef LDRSBXpre : LoadPreIdx<0b00, 0, 0b10, GPR64, "ldrsb">;
1932*9880d681SAndroid Build Coastguard Worker
1933*9880d681SAndroid Build Coastguard Worker// load zero-extended byte
1934*9880d681SAndroid Build Coastguard Workerdef LDRBBpre : LoadPreIdx<0b00, 0, 0b01, GPR32, "ldrb">;
1935*9880d681SAndroid Build Coastguard Workerdef LDRHHpre : LoadPreIdx<0b01, 0, 0b01, GPR32, "ldrh">;
1936*9880d681SAndroid Build Coastguard Worker
1937*9880d681SAndroid Build Coastguard Worker// load sign-extended word
1938*9880d681SAndroid Build Coastguard Workerdef LDRSWpre : LoadPreIdx<0b10, 0, 0b10, GPR64, "ldrsw">;
1939*9880d681SAndroid Build Coastguard Worker
1940*9880d681SAndroid Build Coastguard Worker//---
1941*9880d681SAndroid Build Coastguard Worker// (immediate post-indexed)
1942*9880d681SAndroid Build Coastguard Workerdef LDRWpost : LoadPostIdx<0b10, 0, 0b01, GPR32, "ldr">;
1943*9880d681SAndroid Build Coastguard Workerdef LDRXpost : LoadPostIdx<0b11, 0, 0b01, GPR64, "ldr">;
1944*9880d681SAndroid Build Coastguard Workerdef LDRBpost : LoadPostIdx<0b00, 1, 0b01, FPR8,  "ldr">;
1945*9880d681SAndroid Build Coastguard Workerdef LDRHpost : LoadPostIdx<0b01, 1, 0b01, FPR16, "ldr">;
1946*9880d681SAndroid Build Coastguard Workerdef LDRSpost : LoadPostIdx<0b10, 1, 0b01, FPR32, "ldr">;
1947*9880d681SAndroid Build Coastguard Workerdef LDRDpost : LoadPostIdx<0b11, 1, 0b01, FPR64, "ldr">;
1948*9880d681SAndroid Build Coastguard Workerdef LDRQpost : LoadPostIdx<0b00, 1, 0b11, FPR128, "ldr">;
1949*9880d681SAndroid Build Coastguard Worker
1950*9880d681SAndroid Build Coastguard Worker// load sign-extended half-word
1951*9880d681SAndroid Build Coastguard Workerdef LDRSHWpost : LoadPostIdx<0b01, 0, 0b11, GPR32, "ldrsh">;
1952*9880d681SAndroid Build Coastguard Workerdef LDRSHXpost : LoadPostIdx<0b01, 0, 0b10, GPR64, "ldrsh">;
1953*9880d681SAndroid Build Coastguard Worker
1954*9880d681SAndroid Build Coastguard Worker// load sign-extended byte
1955*9880d681SAndroid Build Coastguard Workerdef LDRSBWpost : LoadPostIdx<0b00, 0, 0b11, GPR32, "ldrsb">;
1956*9880d681SAndroid Build Coastguard Workerdef LDRSBXpost : LoadPostIdx<0b00, 0, 0b10, GPR64, "ldrsb">;
1957*9880d681SAndroid Build Coastguard Worker
1958*9880d681SAndroid Build Coastguard Worker// load zero-extended byte
1959*9880d681SAndroid Build Coastguard Workerdef LDRBBpost : LoadPostIdx<0b00, 0, 0b01, GPR32, "ldrb">;
1960*9880d681SAndroid Build Coastguard Workerdef LDRHHpost : LoadPostIdx<0b01, 0, 0b01, GPR32, "ldrh">;
1961*9880d681SAndroid Build Coastguard Worker
1962*9880d681SAndroid Build Coastguard Worker// load sign-extended word
1963*9880d681SAndroid Build Coastguard Workerdef LDRSWpost : LoadPostIdx<0b10, 0, 0b10, GPR64, "ldrsw">;
1964*9880d681SAndroid Build Coastguard Worker
1965*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1966*9880d681SAndroid Build Coastguard Worker// Store instructions.
1967*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1968*9880d681SAndroid Build Coastguard Worker
1969*9880d681SAndroid Build Coastguard Worker// Pair (indexed, offset)
1970*9880d681SAndroid Build Coastguard Worker// FIXME: Use dedicated range-checked addressing mode operand here.
1971*9880d681SAndroid Build Coastguard Workerdefm STPW : StorePairOffset<0b00, 0, GPR32, simm7s4, "stp">;
1972*9880d681SAndroid Build Coastguard Workerdefm STPX : StorePairOffset<0b10, 0, GPR64, simm7s8, "stp">;
1973*9880d681SAndroid Build Coastguard Workerdefm STPS : StorePairOffset<0b00, 1, FPR32, simm7s4, "stp">;
1974*9880d681SAndroid Build Coastguard Workerdefm STPD : StorePairOffset<0b01, 1, FPR64, simm7s8, "stp">;
1975*9880d681SAndroid Build Coastguard Workerdefm STPQ : StorePairOffset<0b10, 1, FPR128, simm7s16, "stp">;
1976*9880d681SAndroid Build Coastguard Worker
1977*9880d681SAndroid Build Coastguard Worker// Pair (pre-indexed)
1978*9880d681SAndroid Build Coastguard Workerdef STPWpre : StorePairPreIdx<0b00, 0, GPR32, simm7s4, "stp">;
1979*9880d681SAndroid Build Coastguard Workerdef STPXpre : StorePairPreIdx<0b10, 0, GPR64, simm7s8, "stp">;
1980*9880d681SAndroid Build Coastguard Workerdef STPSpre : StorePairPreIdx<0b00, 1, FPR32, simm7s4, "stp">;
1981*9880d681SAndroid Build Coastguard Workerdef STPDpre : StorePairPreIdx<0b01, 1, FPR64, simm7s8, "stp">;
1982*9880d681SAndroid Build Coastguard Workerdef STPQpre : StorePairPreIdx<0b10, 1, FPR128, simm7s16, "stp">;
1983*9880d681SAndroid Build Coastguard Worker
1984*9880d681SAndroid Build Coastguard Worker// Pair (pre-indexed)
1985*9880d681SAndroid Build Coastguard Workerdef STPWpost : StorePairPostIdx<0b00, 0, GPR32, simm7s4, "stp">;
1986*9880d681SAndroid Build Coastguard Workerdef STPXpost : StorePairPostIdx<0b10, 0, GPR64, simm7s8, "stp">;
1987*9880d681SAndroid Build Coastguard Workerdef STPSpost : StorePairPostIdx<0b00, 1, FPR32, simm7s4, "stp">;
1988*9880d681SAndroid Build Coastguard Workerdef STPDpost : StorePairPostIdx<0b01, 1, FPR64, simm7s8, "stp">;
1989*9880d681SAndroid Build Coastguard Workerdef STPQpost : StorePairPostIdx<0b10, 1, FPR128, simm7s16, "stp">;
1990*9880d681SAndroid Build Coastguard Worker
1991*9880d681SAndroid Build Coastguard Worker// Pair (no allocate)
1992*9880d681SAndroid Build Coastguard Workerdefm STNPW : StorePairNoAlloc<0b00, 0, GPR32, simm7s4, "stnp">;
1993*9880d681SAndroid Build Coastguard Workerdefm STNPX : StorePairNoAlloc<0b10, 0, GPR64, simm7s8, "stnp">;
1994*9880d681SAndroid Build Coastguard Workerdefm STNPS : StorePairNoAlloc<0b00, 1, FPR32, simm7s4, "stnp">;
1995*9880d681SAndroid Build Coastguard Workerdefm STNPD : StorePairNoAlloc<0b01, 1, FPR64, simm7s8, "stnp">;
1996*9880d681SAndroid Build Coastguard Workerdefm STNPQ : StorePairNoAlloc<0b10, 1, FPR128, simm7s16, "stnp">;
1997*9880d681SAndroid Build Coastguard Worker
1998*9880d681SAndroid Build Coastguard Worker//---
1999*9880d681SAndroid Build Coastguard Worker// (Register offset)
2000*9880d681SAndroid Build Coastguard Worker
2001*9880d681SAndroid Build Coastguard Worker// Integer
2002*9880d681SAndroid Build Coastguard Workerdefm STRBB : Store8RO< 0b00, 0, 0b00, GPR32, "strb", i32, truncstorei8>;
2003*9880d681SAndroid Build Coastguard Workerdefm STRHH : Store16RO<0b01, 0, 0b00, GPR32, "strh", i32, truncstorei16>;
2004*9880d681SAndroid Build Coastguard Workerdefm STRW  : Store32RO<0b10, 0, 0b00, GPR32, "str",  i32, store>;
2005*9880d681SAndroid Build Coastguard Workerdefm STRX  : Store64RO<0b11, 0, 0b00, GPR64, "str",  i64, store>;
2006*9880d681SAndroid Build Coastguard Worker
2007*9880d681SAndroid Build Coastguard Worker
2008*9880d681SAndroid Build Coastguard Worker// Floating-point
2009*9880d681SAndroid Build Coastguard Workerdefm STRB : Store8RO< 0b00,  1, 0b00, FPR8,   "str", untyped, store>;
2010*9880d681SAndroid Build Coastguard Workerdefm STRH : Store16RO<0b01,  1, 0b00, FPR16,  "str", f16,     store>;
2011*9880d681SAndroid Build Coastguard Workerdefm STRS : Store32RO<0b10,  1, 0b00, FPR32,  "str", f32,     store>;
2012*9880d681SAndroid Build Coastguard Workerdefm STRD : Store64RO<0b11,  1, 0b00, FPR64,  "str", f64,     store>;
2013*9880d681SAndroid Build Coastguard Workerdefm STRQ : Store128RO<0b00, 1, 0b10, FPR128, "str", f128,    store>;
2014*9880d681SAndroid Build Coastguard Worker
2015*9880d681SAndroid Build Coastguard Workermulticlass TruncStoreFrom64ROPat<ROAddrMode ro, SDPatternOperator storeop,
2016*9880d681SAndroid Build Coastguard Worker                                 Instruction STRW, Instruction STRX> {
2017*9880d681SAndroid Build Coastguard Worker
2018*9880d681SAndroid Build Coastguard Worker  def : Pat<(storeop GPR64:$Rt,
2019*9880d681SAndroid Build Coastguard Worker                     (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)),
2020*9880d681SAndroid Build Coastguard Worker            (STRW (EXTRACT_SUBREG GPR64:$Rt, sub_32),
2021*9880d681SAndroid Build Coastguard Worker                  GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)>;
2022*9880d681SAndroid Build Coastguard Worker
2023*9880d681SAndroid Build Coastguard Worker  def : Pat<(storeop GPR64:$Rt,
2024*9880d681SAndroid Build Coastguard Worker                     (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)),
2025*9880d681SAndroid Build Coastguard Worker            (STRX (EXTRACT_SUBREG GPR64:$Rt, sub_32),
2026*9880d681SAndroid Build Coastguard Worker                  GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)>;
2027*9880d681SAndroid Build Coastguard Worker}
2028*9880d681SAndroid Build Coastguard Worker
2029*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in {
2030*9880d681SAndroid Build Coastguard Worker  // truncstore i64
2031*9880d681SAndroid Build Coastguard Worker  defm : TruncStoreFrom64ROPat<ro8,  truncstorei8,  STRBBroW, STRBBroX>;
2032*9880d681SAndroid Build Coastguard Worker  defm : TruncStoreFrom64ROPat<ro16, truncstorei16, STRHHroW, STRHHroX>;
2033*9880d681SAndroid Build Coastguard Worker  defm : TruncStoreFrom64ROPat<ro32, truncstorei32, STRWroW,  STRWroX>;
2034*9880d681SAndroid Build Coastguard Worker}
2035*9880d681SAndroid Build Coastguard Worker
2036*9880d681SAndroid Build Coastguard Workermulticlass VecROStorePat<ROAddrMode ro, ValueType VecTy, RegisterClass FPR,
2037*9880d681SAndroid Build Coastguard Worker                         Instruction STRW, Instruction STRX> {
2038*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (VecTy FPR:$Rt),
2039*9880d681SAndroid Build Coastguard Worker                   (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)),
2040*9880d681SAndroid Build Coastguard Worker            (STRW FPR:$Rt, GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)>;
2041*9880d681SAndroid Build Coastguard Worker
2042*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (VecTy FPR:$Rt),
2043*9880d681SAndroid Build Coastguard Worker                   (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)),
2044*9880d681SAndroid Build Coastguard Worker            (STRX FPR:$Rt, GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)>;
2045*9880d681SAndroid Build Coastguard Worker}
2046*9880d681SAndroid Build Coastguard Worker
2047*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in {
2048*9880d681SAndroid Build Coastguard Worker// Match all store 64 bits width whose type is compatible with FPR64
2049*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
2050*9880d681SAndroid Build Coastguard Worker  // We must use ST1 to store vectors in big-endian.
2051*9880d681SAndroid Build Coastguard Worker  defm : VecROStorePat<ro64, v2i32, FPR64, STRDroW, STRDroX>;
2052*9880d681SAndroid Build Coastguard Worker  defm : VecROStorePat<ro64, v2f32, FPR64, STRDroW, STRDroX>;
2053*9880d681SAndroid Build Coastguard Worker  defm : VecROStorePat<ro64, v4i16, FPR64, STRDroW, STRDroX>;
2054*9880d681SAndroid Build Coastguard Worker  defm : VecROStorePat<ro64, v8i8, FPR64, STRDroW, STRDroX>;
2055*9880d681SAndroid Build Coastguard Worker  defm : VecROStorePat<ro64, v4f16, FPR64, STRDroW, STRDroX>;
2056*9880d681SAndroid Build Coastguard Worker}
2057*9880d681SAndroid Build Coastguard Worker
2058*9880d681SAndroid Build Coastguard Workerdefm : VecROStorePat<ro64, v1i64, FPR64, STRDroW, STRDroX>;
2059*9880d681SAndroid Build Coastguard Workerdefm : VecROStorePat<ro64, v1f64, FPR64, STRDroW, STRDroX>;
2060*9880d681SAndroid Build Coastguard Worker
2061*9880d681SAndroid Build Coastguard Worker// Match all store 128 bits width whose type is compatible with FPR128
2062*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
2063*9880d681SAndroid Build Coastguard Worker  // We must use ST1 to store vectors in big-endian.
2064*9880d681SAndroid Build Coastguard Worker  defm : VecROStorePat<ro128, v2i64, FPR128, STRQroW, STRQroX>;
2065*9880d681SAndroid Build Coastguard Worker  defm : VecROStorePat<ro128, v2f64, FPR128, STRQroW, STRQroX>;
2066*9880d681SAndroid Build Coastguard Worker  defm : VecROStorePat<ro128, v4i32, FPR128, STRQroW, STRQroX>;
2067*9880d681SAndroid Build Coastguard Worker  defm : VecROStorePat<ro128, v4f32, FPR128, STRQroW, STRQroX>;
2068*9880d681SAndroid Build Coastguard Worker  defm : VecROStorePat<ro128, v8i16, FPR128, STRQroW, STRQroX>;
2069*9880d681SAndroid Build Coastguard Worker  defm : VecROStorePat<ro128, v16i8, FPR128, STRQroW, STRQroX>;
2070*9880d681SAndroid Build Coastguard Worker  defm : VecROStorePat<ro128, v8f16, FPR128, STRQroW, STRQroX>;
2071*9880d681SAndroid Build Coastguard Worker}
2072*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 10
2073*9880d681SAndroid Build Coastguard Worker
2074*9880d681SAndroid Build Coastguard Worker// Match stores from lane 0 to the appropriate subreg's store.
2075*9880d681SAndroid Build Coastguard Workermulticlass VecROStoreLane0Pat<ROAddrMode ro, SDPatternOperator storeop,
2076*9880d681SAndroid Build Coastguard Worker                              ValueType VecTy, ValueType STy,
2077*9880d681SAndroid Build Coastguard Worker                              SubRegIndex SubRegIdx,
2078*9880d681SAndroid Build Coastguard Worker                              Instruction STRW, Instruction STRX> {
2079*9880d681SAndroid Build Coastguard Worker
2080*9880d681SAndroid Build Coastguard Worker  def : Pat<(storeop (STy (vector_extract (VecTy VecListOne128:$Vt), 0)),
2081*9880d681SAndroid Build Coastguard Worker                     (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)),
2082*9880d681SAndroid Build Coastguard Worker            (STRW (EXTRACT_SUBREG VecListOne128:$Vt, SubRegIdx),
2083*9880d681SAndroid Build Coastguard Worker                  GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)>;
2084*9880d681SAndroid Build Coastguard Worker
2085*9880d681SAndroid Build Coastguard Worker  def : Pat<(storeop (STy (vector_extract (VecTy VecListOne128:$Vt), 0)),
2086*9880d681SAndroid Build Coastguard Worker                     (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)),
2087*9880d681SAndroid Build Coastguard Worker            (STRX (EXTRACT_SUBREG VecListOne128:$Vt, SubRegIdx),
2088*9880d681SAndroid Build Coastguard Worker                  GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)>;
2089*9880d681SAndroid Build Coastguard Worker}
2090*9880d681SAndroid Build Coastguard Worker
2091*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 19 in {
2092*9880d681SAndroid Build Coastguard Worker  defm : VecROStoreLane0Pat<ro16, truncstorei16, v8i16, i32, hsub, STRHroW, STRHroX>;
2093*9880d681SAndroid Build Coastguard Worker  defm : VecROStoreLane0Pat<ro16,      store   , v8i16, i16, hsub, STRHroW, STRHroX>;
2094*9880d681SAndroid Build Coastguard Worker  defm : VecROStoreLane0Pat<ro32, truncstorei32, v4i32, i32, ssub, STRSroW, STRSroX>;
2095*9880d681SAndroid Build Coastguard Worker  defm : VecROStoreLane0Pat<ro32,      store   , v4i32, i32, ssub, STRSroW, STRSroX>;
2096*9880d681SAndroid Build Coastguard Worker  defm : VecROStoreLane0Pat<ro32,      store   , v4f32, f32, ssub, STRSroW, STRSroX>;
2097*9880d681SAndroid Build Coastguard Worker  defm : VecROStoreLane0Pat<ro64,      store   , v2i64, i64, dsub, STRDroW, STRDroX>;
2098*9880d681SAndroid Build Coastguard Worker  defm : VecROStoreLane0Pat<ro64,      store   , v2f64, f64, dsub, STRDroW, STRDroX>;
2099*9880d681SAndroid Build Coastguard Worker}
2100*9880d681SAndroid Build Coastguard Worker
2101*9880d681SAndroid Build Coastguard Worker//---
2102*9880d681SAndroid Build Coastguard Worker// (unsigned immediate)
2103*9880d681SAndroid Build Coastguard Workerdefm STRX : StoreUI<0b11, 0, 0b00, GPR64, uimm12s8, "str",
2104*9880d681SAndroid Build Coastguard Worker                   [(store GPR64:$Rt,
2105*9880d681SAndroid Build Coastguard Worker                            (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))]>;
2106*9880d681SAndroid Build Coastguard Workerdefm STRW : StoreUI<0b10, 0, 0b00, GPR32, uimm12s4, "str",
2107*9880d681SAndroid Build Coastguard Worker                    [(store GPR32:$Rt,
2108*9880d681SAndroid Build Coastguard Worker                            (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))]>;
2109*9880d681SAndroid Build Coastguard Workerdefm STRB : StoreUI<0b00, 1, 0b00, FPR8, uimm12s1, "str",
2110*9880d681SAndroid Build Coastguard Worker                    [(store FPR8:$Rt,
2111*9880d681SAndroid Build Coastguard Worker                            (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))]>;
2112*9880d681SAndroid Build Coastguard Workerdefm STRH : StoreUI<0b01, 1, 0b00, FPR16, uimm12s2, "str",
2113*9880d681SAndroid Build Coastguard Worker                    [(store (f16 FPR16:$Rt),
2114*9880d681SAndroid Build Coastguard Worker                            (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))]>;
2115*9880d681SAndroid Build Coastguard Workerdefm STRS : StoreUI<0b10, 1, 0b00, FPR32, uimm12s4, "str",
2116*9880d681SAndroid Build Coastguard Worker                    [(store (f32 FPR32:$Rt),
2117*9880d681SAndroid Build Coastguard Worker                            (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))]>;
2118*9880d681SAndroid Build Coastguard Workerdefm STRD : StoreUI<0b11, 1, 0b00, FPR64, uimm12s8, "str",
2119*9880d681SAndroid Build Coastguard Worker                    [(store (f64 FPR64:$Rt),
2120*9880d681SAndroid Build Coastguard Worker                            (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset))]>;
2121*9880d681SAndroid Build Coastguard Workerdefm STRQ : StoreUI<0b00, 1, 0b10, FPR128, uimm12s16, "str", []>;
2122*9880d681SAndroid Build Coastguard Worker
2123*9880d681SAndroid Build Coastguard Workerdefm STRHH : StoreUI<0b01, 0, 0b00, GPR32, uimm12s2, "strh",
2124*9880d681SAndroid Build Coastguard Worker                     [(truncstorei16 GPR32:$Rt,
2125*9880d681SAndroid Build Coastguard Worker                                     (am_indexed16 GPR64sp:$Rn,
2126*9880d681SAndroid Build Coastguard Worker                                                   uimm12s2:$offset))]>;
2127*9880d681SAndroid Build Coastguard Workerdefm STRBB : StoreUI<0b00, 0, 0b00, GPR32, uimm12s1,  "strb",
2128*9880d681SAndroid Build Coastguard Worker                     [(truncstorei8 GPR32:$Rt,
2129*9880d681SAndroid Build Coastguard Worker                                    (am_indexed8 GPR64sp:$Rn,
2130*9880d681SAndroid Build Coastguard Worker                                                 uimm12s1:$offset))]>;
2131*9880d681SAndroid Build Coastguard Worker
2132*9880d681SAndroid Build Coastguard Worker// Match all store 64 bits width whose type is compatible with FPR64
2133*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 10 in {
2134*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
2135*9880d681SAndroid Build Coastguard Worker  // We must use ST1 to store vectors in big-endian.
2136*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v2f32 FPR64:$Rt),
2137*9880d681SAndroid Build Coastguard Worker                   (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)),
2138*9880d681SAndroid Build Coastguard Worker            (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>;
2139*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v8i8 FPR64:$Rt),
2140*9880d681SAndroid Build Coastguard Worker                   (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)),
2141*9880d681SAndroid Build Coastguard Worker            (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>;
2142*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v4i16 FPR64:$Rt),
2143*9880d681SAndroid Build Coastguard Worker                   (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)),
2144*9880d681SAndroid Build Coastguard Worker            (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>;
2145*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v2i32 FPR64:$Rt),
2146*9880d681SAndroid Build Coastguard Worker                   (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)),
2147*9880d681SAndroid Build Coastguard Worker            (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>;
2148*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v4f16 FPR64:$Rt),
2149*9880d681SAndroid Build Coastguard Worker                   (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)),
2150*9880d681SAndroid Build Coastguard Worker            (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>;
2151*9880d681SAndroid Build Coastguard Worker}
2152*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (v1f64 FPR64:$Rt),
2153*9880d681SAndroid Build Coastguard Worker                 (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)),
2154*9880d681SAndroid Build Coastguard Worker          (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>;
2155*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (v1i64 FPR64:$Rt),
2156*9880d681SAndroid Build Coastguard Worker                 (am_indexed64 GPR64sp:$Rn, uimm12s8:$offset)),
2157*9880d681SAndroid Build Coastguard Worker          (STRDui FPR64:$Rt, GPR64sp:$Rn, uimm12s8:$offset)>;
2158*9880d681SAndroid Build Coastguard Worker
2159*9880d681SAndroid Build Coastguard Worker// Match all store 128 bits width whose type is compatible with FPR128
2160*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
2161*9880d681SAndroid Build Coastguard Worker  // We must use ST1 to store vectors in big-endian.
2162*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v4f32 FPR128:$Rt),
2163*9880d681SAndroid Build Coastguard Worker                   (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)),
2164*9880d681SAndroid Build Coastguard Worker            (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>;
2165*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v2f64 FPR128:$Rt),
2166*9880d681SAndroid Build Coastguard Worker                   (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)),
2167*9880d681SAndroid Build Coastguard Worker            (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>;
2168*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v16i8 FPR128:$Rt),
2169*9880d681SAndroid Build Coastguard Worker                   (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)),
2170*9880d681SAndroid Build Coastguard Worker            (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>;
2171*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v8i16 FPR128:$Rt),
2172*9880d681SAndroid Build Coastguard Worker                   (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)),
2173*9880d681SAndroid Build Coastguard Worker            (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>;
2174*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v4i32 FPR128:$Rt),
2175*9880d681SAndroid Build Coastguard Worker                   (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)),
2176*9880d681SAndroid Build Coastguard Worker            (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>;
2177*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v2i64 FPR128:$Rt),
2178*9880d681SAndroid Build Coastguard Worker                   (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)),
2179*9880d681SAndroid Build Coastguard Worker            (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>;
2180*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v8f16 FPR128:$Rt),
2181*9880d681SAndroid Build Coastguard Worker                   (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)),
2182*9880d681SAndroid Build Coastguard Worker            (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>;
2183*9880d681SAndroid Build Coastguard Worker}
2184*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (f128  FPR128:$Rt),
2185*9880d681SAndroid Build Coastguard Worker                 (am_indexed128 GPR64sp:$Rn, uimm12s16:$offset)),
2186*9880d681SAndroid Build Coastguard Worker          (STRQui FPR128:$Rt, GPR64sp:$Rn, uimm12s16:$offset)>;
2187*9880d681SAndroid Build Coastguard Worker
2188*9880d681SAndroid Build Coastguard Worker// truncstore i64
2189*9880d681SAndroid Build Coastguard Workerdef : Pat<(truncstorei32 GPR64:$Rt,
2190*9880d681SAndroid Build Coastguard Worker                         (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset)),
2191*9880d681SAndroid Build Coastguard Worker  (STRWui (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, uimm12s4:$offset)>;
2192*9880d681SAndroid Build Coastguard Workerdef : Pat<(truncstorei16 GPR64:$Rt,
2193*9880d681SAndroid Build Coastguard Worker                         (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset)),
2194*9880d681SAndroid Build Coastguard Worker  (STRHHui (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, uimm12s2:$offset)>;
2195*9880d681SAndroid Build Coastguard Workerdef : Pat<(truncstorei8 GPR64:$Rt, (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset)),
2196*9880d681SAndroid Build Coastguard Worker  (STRBBui (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, uimm12s1:$offset)>;
2197*9880d681SAndroid Build Coastguard Worker
2198*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 10
2199*9880d681SAndroid Build Coastguard Worker
2200*9880d681SAndroid Build Coastguard Worker//---
2201*9880d681SAndroid Build Coastguard Worker// (unscaled immediate)
2202*9880d681SAndroid Build Coastguard Workerdefm STURX : StoreUnscaled<0b11, 0, 0b00, GPR64, "stur",
2203*9880d681SAndroid Build Coastguard Worker                         [(store GPR64:$Rt,
2204*9880d681SAndroid Build Coastguard Worker                                 (am_unscaled64 GPR64sp:$Rn, simm9:$offset))]>;
2205*9880d681SAndroid Build Coastguard Workerdefm STURW : StoreUnscaled<0b10, 0, 0b00, GPR32, "stur",
2206*9880d681SAndroid Build Coastguard Worker                         [(store GPR32:$Rt,
2207*9880d681SAndroid Build Coastguard Worker                                 (am_unscaled32 GPR64sp:$Rn, simm9:$offset))]>;
2208*9880d681SAndroid Build Coastguard Workerdefm STURB : StoreUnscaled<0b00, 1, 0b00, FPR8, "stur",
2209*9880d681SAndroid Build Coastguard Worker                         [(store FPR8:$Rt,
2210*9880d681SAndroid Build Coastguard Worker                                 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))]>;
2211*9880d681SAndroid Build Coastguard Workerdefm STURH : StoreUnscaled<0b01, 1, 0b00, FPR16, "stur",
2212*9880d681SAndroid Build Coastguard Worker                         [(store (f16 FPR16:$Rt),
2213*9880d681SAndroid Build Coastguard Worker                                 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))]>;
2214*9880d681SAndroid Build Coastguard Workerdefm STURS : StoreUnscaled<0b10, 1, 0b00, FPR32, "stur",
2215*9880d681SAndroid Build Coastguard Worker                         [(store (f32 FPR32:$Rt),
2216*9880d681SAndroid Build Coastguard Worker                                 (am_unscaled32 GPR64sp:$Rn, simm9:$offset))]>;
2217*9880d681SAndroid Build Coastguard Workerdefm STURD : StoreUnscaled<0b11, 1, 0b00, FPR64, "stur",
2218*9880d681SAndroid Build Coastguard Worker                         [(store (f64 FPR64:$Rt),
2219*9880d681SAndroid Build Coastguard Worker                                 (am_unscaled64 GPR64sp:$Rn, simm9:$offset))]>;
2220*9880d681SAndroid Build Coastguard Workerdefm STURQ : StoreUnscaled<0b00, 1, 0b10, FPR128, "stur",
2221*9880d681SAndroid Build Coastguard Worker                         [(store (f128 FPR128:$Rt),
2222*9880d681SAndroid Build Coastguard Worker                                 (am_unscaled128 GPR64sp:$Rn, simm9:$offset))]>;
2223*9880d681SAndroid Build Coastguard Workerdefm STURHH : StoreUnscaled<0b01, 0, 0b00, GPR32, "sturh",
2224*9880d681SAndroid Build Coastguard Worker                         [(truncstorei16 GPR32:$Rt,
2225*9880d681SAndroid Build Coastguard Worker                                 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))]>;
2226*9880d681SAndroid Build Coastguard Workerdefm STURBB : StoreUnscaled<0b00, 0, 0b00, GPR32, "sturb",
2227*9880d681SAndroid Build Coastguard Worker                         [(truncstorei8 GPR32:$Rt,
2228*9880d681SAndroid Build Coastguard Worker                                  (am_unscaled8 GPR64sp:$Rn, simm9:$offset))]>;
2229*9880d681SAndroid Build Coastguard Worker
2230*9880d681SAndroid Build Coastguard Worker// Match all store 64 bits width whose type is compatible with FPR64
2231*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
2232*9880d681SAndroid Build Coastguard Worker  // We must use ST1 to store vectors in big-endian.
2233*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v2f32 FPR64:$Rt),
2234*9880d681SAndroid Build Coastguard Worker                   (am_unscaled64 GPR64sp:$Rn, simm9:$offset)),
2235*9880d681SAndroid Build Coastguard Worker            (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2236*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v8i8 FPR64:$Rt),
2237*9880d681SAndroid Build Coastguard Worker                   (am_unscaled64 GPR64sp:$Rn, simm9:$offset)),
2238*9880d681SAndroid Build Coastguard Worker            (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2239*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v4i16 FPR64:$Rt),
2240*9880d681SAndroid Build Coastguard Worker                   (am_unscaled64 GPR64sp:$Rn, simm9:$offset)),
2241*9880d681SAndroid Build Coastguard Worker            (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2242*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v2i32 FPR64:$Rt),
2243*9880d681SAndroid Build Coastguard Worker                   (am_unscaled64 GPR64sp:$Rn, simm9:$offset)),
2244*9880d681SAndroid Build Coastguard Worker            (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2245*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v4f16 FPR64:$Rt),
2246*9880d681SAndroid Build Coastguard Worker                   (am_unscaled64 GPR64sp:$Rn, simm9:$offset)),
2247*9880d681SAndroid Build Coastguard Worker            (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2248*9880d681SAndroid Build Coastguard Worker}
2249*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (v1f64 FPR64:$Rt), (am_unscaled64 GPR64sp:$Rn, simm9:$offset)),
2250*9880d681SAndroid Build Coastguard Worker          (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2251*9880d681SAndroid Build Coastguard Workerdef : Pat<(store (v1i64 FPR64:$Rt), (am_unscaled64 GPR64sp:$Rn, simm9:$offset)),
2252*9880d681SAndroid Build Coastguard Worker          (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2253*9880d681SAndroid Build Coastguard Worker
2254*9880d681SAndroid Build Coastguard Worker// Match all store 128 bits width whose type is compatible with FPR128
2255*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
2256*9880d681SAndroid Build Coastguard Worker  // We must use ST1 to store vectors in big-endian.
2257*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v4f32 FPR128:$Rt),
2258*9880d681SAndroid Build Coastguard Worker                   (am_unscaled128 GPR64sp:$Rn, simm9:$offset)),
2259*9880d681SAndroid Build Coastguard Worker            (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2260*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v2f64 FPR128:$Rt),
2261*9880d681SAndroid Build Coastguard Worker                   (am_unscaled128 GPR64sp:$Rn, simm9:$offset)),
2262*9880d681SAndroid Build Coastguard Worker            (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2263*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v16i8 FPR128:$Rt),
2264*9880d681SAndroid Build Coastguard Worker                   (am_unscaled128 GPR64sp:$Rn, simm9:$offset)),
2265*9880d681SAndroid Build Coastguard Worker            (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2266*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v8i16 FPR128:$Rt),
2267*9880d681SAndroid Build Coastguard Worker                   (am_unscaled128 GPR64sp:$Rn, simm9:$offset)),
2268*9880d681SAndroid Build Coastguard Worker            (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2269*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v4i32 FPR128:$Rt),
2270*9880d681SAndroid Build Coastguard Worker                   (am_unscaled128 GPR64sp:$Rn, simm9:$offset)),
2271*9880d681SAndroid Build Coastguard Worker            (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2272*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v2i64 FPR128:$Rt),
2273*9880d681SAndroid Build Coastguard Worker                   (am_unscaled128 GPR64sp:$Rn, simm9:$offset)),
2274*9880d681SAndroid Build Coastguard Worker            (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2275*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v2f64 FPR128:$Rt),
2276*9880d681SAndroid Build Coastguard Worker                   (am_unscaled128 GPR64sp:$Rn, simm9:$offset)),
2277*9880d681SAndroid Build Coastguard Worker            (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2278*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (v8f16 FPR128:$Rt),
2279*9880d681SAndroid Build Coastguard Worker                   (am_unscaled128 GPR64sp:$Rn, simm9:$offset)),
2280*9880d681SAndroid Build Coastguard Worker            (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9:$offset)>;
2281*9880d681SAndroid Build Coastguard Worker}
2282*9880d681SAndroid Build Coastguard Worker
2283*9880d681SAndroid Build Coastguard Worker// unscaled i64 truncating stores
2284*9880d681SAndroid Build Coastguard Workerdef : Pat<(truncstorei32 GPR64:$Rt, (am_unscaled32 GPR64sp:$Rn, simm9:$offset)),
2285*9880d681SAndroid Build Coastguard Worker  (STURWi (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, simm9:$offset)>;
2286*9880d681SAndroid Build Coastguard Workerdef : Pat<(truncstorei16 GPR64:$Rt, (am_unscaled16 GPR64sp:$Rn, simm9:$offset)),
2287*9880d681SAndroid Build Coastguard Worker  (STURHHi (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, simm9:$offset)>;
2288*9880d681SAndroid Build Coastguard Workerdef : Pat<(truncstorei8 GPR64:$Rt, (am_unscaled8 GPR64sp:$Rn, simm9:$offset)),
2289*9880d681SAndroid Build Coastguard Worker  (STURBBi (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, simm9:$offset)>;
2290*9880d681SAndroid Build Coastguard Worker
2291*9880d681SAndroid Build Coastguard Worker//---
2292*9880d681SAndroid Build Coastguard Worker// STR mnemonics fall back to STUR for negative or unaligned offsets.
2293*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]",
2294*9880d681SAndroid Build Coastguard Worker                (STURXi GPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb64:$offset), 0>;
2295*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]",
2296*9880d681SAndroid Build Coastguard Worker                (STURWi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb32:$offset), 0>;
2297*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]",
2298*9880d681SAndroid Build Coastguard Worker                (STURBi FPR8:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>;
2299*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]",
2300*9880d681SAndroid Build Coastguard Worker                (STURHi FPR16:$Rt, GPR64sp:$Rn, simm9_offset_fb16:$offset), 0>;
2301*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]",
2302*9880d681SAndroid Build Coastguard Worker                (STURSi FPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb32:$offset), 0>;
2303*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]",
2304*9880d681SAndroid Build Coastguard Worker                (STURDi FPR64:$Rt, GPR64sp:$Rn, simm9_offset_fb64:$offset), 0>;
2305*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"str $Rt, [$Rn, $offset]",
2306*9880d681SAndroid Build Coastguard Worker                (STURQi FPR128:$Rt, GPR64sp:$Rn, simm9_offset_fb128:$offset), 0>;
2307*9880d681SAndroid Build Coastguard Worker
2308*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"strb $Rt, [$Rn, $offset]",
2309*9880d681SAndroid Build Coastguard Worker                (STURBBi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb8:$offset), 0>;
2310*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"strh $Rt, [$Rn, $offset]",
2311*9880d681SAndroid Build Coastguard Worker                (STURHHi GPR32:$Rt, GPR64sp:$Rn, simm9_offset_fb16:$offset), 0>;
2312*9880d681SAndroid Build Coastguard Worker
2313*9880d681SAndroid Build Coastguard Worker//---
2314*9880d681SAndroid Build Coastguard Worker// (unscaled immediate, unprivileged)
2315*9880d681SAndroid Build Coastguard Workerdefm STTRW : StoreUnprivileged<0b10, 0, 0b00, GPR32, "sttr">;
2316*9880d681SAndroid Build Coastguard Workerdefm STTRX : StoreUnprivileged<0b11, 0, 0b00, GPR64, "sttr">;
2317*9880d681SAndroid Build Coastguard Worker
2318*9880d681SAndroid Build Coastguard Workerdefm STTRH : StoreUnprivileged<0b01, 0, 0b00, GPR32, "sttrh">;
2319*9880d681SAndroid Build Coastguard Workerdefm STTRB : StoreUnprivileged<0b00, 0, 0b00, GPR32, "sttrb">;
2320*9880d681SAndroid Build Coastguard Worker
2321*9880d681SAndroid Build Coastguard Worker//---
2322*9880d681SAndroid Build Coastguard Worker// (immediate pre-indexed)
2323*9880d681SAndroid Build Coastguard Workerdef STRWpre : StorePreIdx<0b10, 0, 0b00, GPR32, "str",  pre_store, i32>;
2324*9880d681SAndroid Build Coastguard Workerdef STRXpre : StorePreIdx<0b11, 0, 0b00, GPR64, "str",  pre_store, i64>;
2325*9880d681SAndroid Build Coastguard Workerdef STRBpre : StorePreIdx<0b00, 1, 0b00, FPR8,  "str",  pre_store, untyped>;
2326*9880d681SAndroid Build Coastguard Workerdef STRHpre : StorePreIdx<0b01, 1, 0b00, FPR16, "str",  pre_store, f16>;
2327*9880d681SAndroid Build Coastguard Workerdef STRSpre : StorePreIdx<0b10, 1, 0b00, FPR32, "str",  pre_store, f32>;
2328*9880d681SAndroid Build Coastguard Workerdef STRDpre : StorePreIdx<0b11, 1, 0b00, FPR64, "str",  pre_store, f64>;
2329*9880d681SAndroid Build Coastguard Workerdef STRQpre : StorePreIdx<0b00, 1, 0b10, FPR128, "str", pre_store, f128>;
2330*9880d681SAndroid Build Coastguard Worker
2331*9880d681SAndroid Build Coastguard Workerdef STRBBpre : StorePreIdx<0b00, 0, 0b00, GPR32, "strb", pre_truncsti8,  i32>;
2332*9880d681SAndroid Build Coastguard Workerdef STRHHpre : StorePreIdx<0b01, 0, 0b00, GPR32, "strh", pre_truncsti16, i32>;
2333*9880d681SAndroid Build Coastguard Worker
2334*9880d681SAndroid Build Coastguard Worker// truncstore i64
2335*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_truncsti32 GPR64:$Rt, GPR64sp:$addr, simm9:$off),
2336*9880d681SAndroid Build Coastguard Worker  (STRWpre (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$addr,
2337*9880d681SAndroid Build Coastguard Worker           simm9:$off)>;
2338*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_truncsti16 GPR64:$Rt, GPR64sp:$addr, simm9:$off),
2339*9880d681SAndroid Build Coastguard Worker  (STRHHpre (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$addr,
2340*9880d681SAndroid Build Coastguard Worker            simm9:$off)>;
2341*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_truncsti8 GPR64:$Rt, GPR64sp:$addr, simm9:$off),
2342*9880d681SAndroid Build Coastguard Worker  (STRBBpre (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$addr,
2343*9880d681SAndroid Build Coastguard Worker            simm9:$off)>;
2344*9880d681SAndroid Build Coastguard Worker
2345*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v8i8 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2346*9880d681SAndroid Build Coastguard Worker          (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2347*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v4i16 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2348*9880d681SAndroid Build Coastguard Worker          (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2349*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v2i32 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2350*9880d681SAndroid Build Coastguard Worker          (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2351*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v2f32 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2352*9880d681SAndroid Build Coastguard Worker          (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2353*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v1i64 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2354*9880d681SAndroid Build Coastguard Worker          (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2355*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v1f64 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2356*9880d681SAndroid Build Coastguard Worker          (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2357*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v4f16 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2358*9880d681SAndroid Build Coastguard Worker          (STRDpre FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2359*9880d681SAndroid Build Coastguard Worker
2360*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v16i8 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2361*9880d681SAndroid Build Coastguard Worker          (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2362*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v8i16 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2363*9880d681SAndroid Build Coastguard Worker          (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2364*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v4i32 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2365*9880d681SAndroid Build Coastguard Worker          (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2366*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v4f32 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2367*9880d681SAndroid Build Coastguard Worker          (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2368*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v2i64 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2369*9880d681SAndroid Build Coastguard Worker          (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2370*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v2f64 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2371*9880d681SAndroid Build Coastguard Worker          (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2372*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store (v8f16 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2373*9880d681SAndroid Build Coastguard Worker          (STRQpre FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2374*9880d681SAndroid Build Coastguard Worker
2375*9880d681SAndroid Build Coastguard Worker//---
2376*9880d681SAndroid Build Coastguard Worker// (immediate post-indexed)
2377*9880d681SAndroid Build Coastguard Workerdef STRWpost : StorePostIdx<0b10, 0, 0b00, GPR32,  "str", post_store, i32>;
2378*9880d681SAndroid Build Coastguard Workerdef STRXpost : StorePostIdx<0b11, 0, 0b00, GPR64,  "str", post_store, i64>;
2379*9880d681SAndroid Build Coastguard Workerdef STRBpost : StorePostIdx<0b00, 1, 0b00, FPR8,   "str", post_store, untyped>;
2380*9880d681SAndroid Build Coastguard Workerdef STRHpost : StorePostIdx<0b01, 1, 0b00, FPR16,  "str", post_store, f16>;
2381*9880d681SAndroid Build Coastguard Workerdef STRSpost : StorePostIdx<0b10, 1, 0b00, FPR32,  "str", post_store, f32>;
2382*9880d681SAndroid Build Coastguard Workerdef STRDpost : StorePostIdx<0b11, 1, 0b00, FPR64,  "str", post_store, f64>;
2383*9880d681SAndroid Build Coastguard Workerdef STRQpost : StorePostIdx<0b00, 1, 0b10, FPR128, "str", post_store, f128>;
2384*9880d681SAndroid Build Coastguard Worker
2385*9880d681SAndroid Build Coastguard Workerdef STRBBpost : StorePostIdx<0b00, 0, 0b00, GPR32, "strb", post_truncsti8, i32>;
2386*9880d681SAndroid Build Coastguard Workerdef STRHHpost : StorePostIdx<0b01, 0, 0b00, GPR32, "strh", post_truncsti16, i32>;
2387*9880d681SAndroid Build Coastguard Worker
2388*9880d681SAndroid Build Coastguard Worker// truncstore i64
2389*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_truncsti32 GPR64:$Rt, GPR64sp:$addr, simm9:$off),
2390*9880d681SAndroid Build Coastguard Worker  (STRWpost (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$addr,
2391*9880d681SAndroid Build Coastguard Worker            simm9:$off)>;
2392*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_truncsti16 GPR64:$Rt, GPR64sp:$addr, simm9:$off),
2393*9880d681SAndroid Build Coastguard Worker  (STRHHpost (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$addr,
2394*9880d681SAndroid Build Coastguard Worker             simm9:$off)>;
2395*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_truncsti8 GPR64:$Rt, GPR64sp:$addr, simm9:$off),
2396*9880d681SAndroid Build Coastguard Worker  (STRBBpost (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$addr,
2397*9880d681SAndroid Build Coastguard Worker             simm9:$off)>;
2398*9880d681SAndroid Build Coastguard Worker
2399*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v8i8 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2400*9880d681SAndroid Build Coastguard Worker          (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2401*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v4i16 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2402*9880d681SAndroid Build Coastguard Worker          (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2403*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v2i32 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2404*9880d681SAndroid Build Coastguard Worker          (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2405*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v2f32 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2406*9880d681SAndroid Build Coastguard Worker          (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2407*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v1i64 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2408*9880d681SAndroid Build Coastguard Worker          (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2409*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v1f64 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2410*9880d681SAndroid Build Coastguard Worker          (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2411*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v4f16 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
2412*9880d681SAndroid Build Coastguard Worker          (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
2413*9880d681SAndroid Build Coastguard Worker
2414*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v16i8 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2415*9880d681SAndroid Build Coastguard Worker          (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2416*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v8i16 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2417*9880d681SAndroid Build Coastguard Worker          (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2418*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v4i32 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2419*9880d681SAndroid Build Coastguard Worker          (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2420*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v4f32 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2421*9880d681SAndroid Build Coastguard Worker          (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2422*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v2i64 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2423*9880d681SAndroid Build Coastguard Worker          (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2424*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v2f64 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2425*9880d681SAndroid Build Coastguard Worker          (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2426*9880d681SAndroid Build Coastguard Workerdef : Pat<(post_store (v8f16 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
2427*9880d681SAndroid Build Coastguard Worker          (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
2428*9880d681SAndroid Build Coastguard Worker
2429*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2430*9880d681SAndroid Build Coastguard Worker// Load/store exclusive instructions.
2431*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2432*9880d681SAndroid Build Coastguard Worker
2433*9880d681SAndroid Build Coastguard Workerdef LDARW  : LoadAcquire   <0b10, 1, 1, 0, 1, GPR32, "ldar">;
2434*9880d681SAndroid Build Coastguard Workerdef LDARX  : LoadAcquire   <0b11, 1, 1, 0, 1, GPR64, "ldar">;
2435*9880d681SAndroid Build Coastguard Workerdef LDARB  : LoadAcquire   <0b00, 1, 1, 0, 1, GPR32, "ldarb">;
2436*9880d681SAndroid Build Coastguard Workerdef LDARH  : LoadAcquire   <0b01, 1, 1, 0, 1, GPR32, "ldarh">;
2437*9880d681SAndroid Build Coastguard Worker
2438*9880d681SAndroid Build Coastguard Workerdef LDAXRW : LoadExclusive <0b10, 0, 1, 0, 1, GPR32, "ldaxr">;
2439*9880d681SAndroid Build Coastguard Workerdef LDAXRX : LoadExclusive <0b11, 0, 1, 0, 1, GPR64, "ldaxr">;
2440*9880d681SAndroid Build Coastguard Workerdef LDAXRB : LoadExclusive <0b00, 0, 1, 0, 1, GPR32, "ldaxrb">;
2441*9880d681SAndroid Build Coastguard Workerdef LDAXRH : LoadExclusive <0b01, 0, 1, 0, 1, GPR32, "ldaxrh">;
2442*9880d681SAndroid Build Coastguard Worker
2443*9880d681SAndroid Build Coastguard Workerdef LDXRW  : LoadExclusive <0b10, 0, 1, 0, 0, GPR32, "ldxr">;
2444*9880d681SAndroid Build Coastguard Workerdef LDXRX  : LoadExclusive <0b11, 0, 1, 0, 0, GPR64, "ldxr">;
2445*9880d681SAndroid Build Coastguard Workerdef LDXRB  : LoadExclusive <0b00, 0, 1, 0, 0, GPR32, "ldxrb">;
2446*9880d681SAndroid Build Coastguard Workerdef LDXRH  : LoadExclusive <0b01, 0, 1, 0, 0, GPR32, "ldxrh">;
2447*9880d681SAndroid Build Coastguard Worker
2448*9880d681SAndroid Build Coastguard Workerdef STLRW  : StoreRelease  <0b10, 1, 0, 0, 1, GPR32, "stlr">;
2449*9880d681SAndroid Build Coastguard Workerdef STLRX  : StoreRelease  <0b11, 1, 0, 0, 1, GPR64, "stlr">;
2450*9880d681SAndroid Build Coastguard Workerdef STLRB  : StoreRelease  <0b00, 1, 0, 0, 1, GPR32, "stlrb">;
2451*9880d681SAndroid Build Coastguard Workerdef STLRH  : StoreRelease  <0b01, 1, 0, 0, 1, GPR32, "stlrh">;
2452*9880d681SAndroid Build Coastguard Worker
2453*9880d681SAndroid Build Coastguard Workerdef STLXRW : StoreExclusive<0b10, 0, 0, 0, 1, GPR32, "stlxr">;
2454*9880d681SAndroid Build Coastguard Workerdef STLXRX : StoreExclusive<0b11, 0, 0, 0, 1, GPR64, "stlxr">;
2455*9880d681SAndroid Build Coastguard Workerdef STLXRB : StoreExclusive<0b00, 0, 0, 0, 1, GPR32, "stlxrb">;
2456*9880d681SAndroid Build Coastguard Workerdef STLXRH : StoreExclusive<0b01, 0, 0, 0, 1, GPR32, "stlxrh">;
2457*9880d681SAndroid Build Coastguard Worker
2458*9880d681SAndroid Build Coastguard Workerdef STXRW  : StoreExclusive<0b10, 0, 0, 0, 0, GPR32, "stxr">;
2459*9880d681SAndroid Build Coastguard Workerdef STXRX  : StoreExclusive<0b11, 0, 0, 0, 0, GPR64, "stxr">;
2460*9880d681SAndroid Build Coastguard Workerdef STXRB  : StoreExclusive<0b00, 0, 0, 0, 0, GPR32, "stxrb">;
2461*9880d681SAndroid Build Coastguard Workerdef STXRH  : StoreExclusive<0b01, 0, 0, 0, 0, GPR32, "stxrh">;
2462*9880d681SAndroid Build Coastguard Worker
2463*9880d681SAndroid Build Coastguard Workerdef LDAXPW : LoadExclusivePair<0b10, 0, 1, 1, 1, GPR32, "ldaxp">;
2464*9880d681SAndroid Build Coastguard Workerdef LDAXPX : LoadExclusivePair<0b11, 0, 1, 1, 1, GPR64, "ldaxp">;
2465*9880d681SAndroid Build Coastguard Worker
2466*9880d681SAndroid Build Coastguard Workerdef LDXPW  : LoadExclusivePair<0b10, 0, 1, 1, 0, GPR32, "ldxp">;
2467*9880d681SAndroid Build Coastguard Workerdef LDXPX  : LoadExclusivePair<0b11, 0, 1, 1, 0, GPR64, "ldxp">;
2468*9880d681SAndroid Build Coastguard Worker
2469*9880d681SAndroid Build Coastguard Workerdef STLXPW : StoreExclusivePair<0b10, 0, 0, 1, 1, GPR32, "stlxp">;
2470*9880d681SAndroid Build Coastguard Workerdef STLXPX : StoreExclusivePair<0b11, 0, 0, 1, 1, GPR64, "stlxp">;
2471*9880d681SAndroid Build Coastguard Worker
2472*9880d681SAndroid Build Coastguard Workerdef STXPW  : StoreExclusivePair<0b10, 0, 0, 1, 0, GPR32, "stxp">;
2473*9880d681SAndroid Build Coastguard Workerdef STXPX  : StoreExclusivePair<0b11, 0, 0, 1, 0, GPR64, "stxp">;
2474*9880d681SAndroid Build Coastguard Worker
2475*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasV8_1a] in {
2476*9880d681SAndroid Build Coastguard Worker  // v8.1a "Limited Order Region" extension load-acquire instructions
2477*9880d681SAndroid Build Coastguard Worker  def LDLARW  : LoadAcquire   <0b10, 1, 1, 0, 0, GPR32, "ldlar">;
2478*9880d681SAndroid Build Coastguard Worker  def LDLARX  : LoadAcquire   <0b11, 1, 1, 0, 0, GPR64, "ldlar">;
2479*9880d681SAndroid Build Coastguard Worker  def LDLARB  : LoadAcquire   <0b00, 1, 1, 0, 0, GPR32, "ldlarb">;
2480*9880d681SAndroid Build Coastguard Worker  def LDLARH  : LoadAcquire   <0b01, 1, 1, 0, 0, GPR32, "ldlarh">;
2481*9880d681SAndroid Build Coastguard Worker
2482*9880d681SAndroid Build Coastguard Worker  // v8.1a "Limited Order Region" extension store-release instructions
2483*9880d681SAndroid Build Coastguard Worker  def STLLRW  : StoreRelease   <0b10, 1, 0, 0, 0, GPR32, "stllr">;
2484*9880d681SAndroid Build Coastguard Worker  def STLLRX  : StoreRelease   <0b11, 1, 0, 0, 0, GPR64, "stllr">;
2485*9880d681SAndroid Build Coastguard Worker  def STLLRB  : StoreRelease   <0b00, 1, 0, 0, 0, GPR32, "stllrb">;
2486*9880d681SAndroid Build Coastguard Worker  def STLLRH  : StoreRelease   <0b01, 1, 0, 0, 0, GPR32, "stllrh">;
2487*9880d681SAndroid Build Coastguard Worker}
2488*9880d681SAndroid Build Coastguard Worker
2489*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2490*9880d681SAndroid Build Coastguard Worker// Scaled floating point to integer conversion instructions.
2491*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2492*9880d681SAndroid Build Coastguard Worker
2493*9880d681SAndroid Build Coastguard Workerdefm FCVTAS : FPToIntegerUnscaled<0b00, 0b100, "fcvtas", int_aarch64_neon_fcvtas>;
2494*9880d681SAndroid Build Coastguard Workerdefm FCVTAU : FPToIntegerUnscaled<0b00, 0b101, "fcvtau", int_aarch64_neon_fcvtau>;
2495*9880d681SAndroid Build Coastguard Workerdefm FCVTMS : FPToIntegerUnscaled<0b10, 0b000, "fcvtms", int_aarch64_neon_fcvtms>;
2496*9880d681SAndroid Build Coastguard Workerdefm FCVTMU : FPToIntegerUnscaled<0b10, 0b001, "fcvtmu", int_aarch64_neon_fcvtmu>;
2497*9880d681SAndroid Build Coastguard Workerdefm FCVTNS : FPToIntegerUnscaled<0b00, 0b000, "fcvtns", int_aarch64_neon_fcvtns>;
2498*9880d681SAndroid Build Coastguard Workerdefm FCVTNU : FPToIntegerUnscaled<0b00, 0b001, "fcvtnu", int_aarch64_neon_fcvtnu>;
2499*9880d681SAndroid Build Coastguard Workerdefm FCVTPS : FPToIntegerUnscaled<0b01, 0b000, "fcvtps", int_aarch64_neon_fcvtps>;
2500*9880d681SAndroid Build Coastguard Workerdefm FCVTPU : FPToIntegerUnscaled<0b01, 0b001, "fcvtpu", int_aarch64_neon_fcvtpu>;
2501*9880d681SAndroid Build Coastguard Workerdefm FCVTZS : FPToIntegerUnscaled<0b11, 0b000, "fcvtzs", fp_to_sint>;
2502*9880d681SAndroid Build Coastguard Workerdefm FCVTZU : FPToIntegerUnscaled<0b11, 0b001, "fcvtzu", fp_to_uint>;
2503*9880d681SAndroid Build Coastguard Workerdefm FCVTZS : FPToIntegerScaled<0b11, 0b000, "fcvtzs", fp_to_sint>;
2504*9880d681SAndroid Build Coastguard Workerdefm FCVTZU : FPToIntegerScaled<0b11, 0b001, "fcvtzu", fp_to_uint>;
2505*9880d681SAndroid Build Coastguard Worker
2506*9880d681SAndroid Build Coastguard Workermulticlass FPToIntegerIntPats<Intrinsic round, string INST> {
2507*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (round f16:$Rn)), (!cast<Instruction>(INST # UWHr) $Rn)>;
2508*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (round f16:$Rn)), (!cast<Instruction>(INST # UXHr) $Rn)>;
2509*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (round f32:$Rn)), (!cast<Instruction>(INST # UWSr) $Rn)>;
2510*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (round f32:$Rn)), (!cast<Instruction>(INST # UXSr) $Rn)>;
2511*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (round f64:$Rn)), (!cast<Instruction>(INST # UWDr) $Rn)>;
2512*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (round f64:$Rn)), (!cast<Instruction>(INST # UXDr) $Rn)>;
2513*9880d681SAndroid Build Coastguard Worker
2514*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (round (fmul f16:$Rn, fixedpoint_f16_i32:$scale))),
2515*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(INST # SWHri) $Rn, $scale)>;
2516*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (round (fmul f16:$Rn, fixedpoint_f16_i64:$scale))),
2517*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(INST # SXHri) $Rn, $scale)>;
2518*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (round (fmul f32:$Rn, fixedpoint_f32_i32:$scale))),
2519*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(INST # SWSri) $Rn, $scale)>;
2520*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (round (fmul f32:$Rn, fixedpoint_f32_i64:$scale))),
2521*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(INST # SXSri) $Rn, $scale)>;
2522*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (round (fmul f64:$Rn, fixedpoint_f64_i32:$scale))),
2523*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(INST # SWDri) $Rn, $scale)>;
2524*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (round (fmul f64:$Rn, fixedpoint_f64_i64:$scale))),
2525*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(INST # SXDri) $Rn, $scale)>;
2526*9880d681SAndroid Build Coastguard Worker}
2527*9880d681SAndroid Build Coastguard Worker
2528*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerIntPats<int_aarch64_neon_fcvtzs, "FCVTZS">;
2529*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerIntPats<int_aarch64_neon_fcvtzu, "FCVTZU">;
2530*9880d681SAndroid Build Coastguard Worker
2531*9880d681SAndroid Build Coastguard Workermulticlass FPToIntegerPats<SDNode to_int, SDNode round, string INST> {
2532*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (to_int (round f32:$Rn))),
2533*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(INST # UWSr) f32:$Rn)>;
2534*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (to_int (round f32:$Rn))),
2535*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(INST # UXSr) f32:$Rn)>;
2536*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (to_int (round f64:$Rn))),
2537*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(INST # UWDr) f64:$Rn)>;
2538*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (to_int (round f64:$Rn))),
2539*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(INST # UXDr) f64:$Rn)>;
2540*9880d681SAndroid Build Coastguard Worker}
2541*9880d681SAndroid Build Coastguard Worker
2542*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_sint, fceil,  "FCVTPS">;
2543*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_uint, fceil,  "FCVTPU">;
2544*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_sint, ffloor, "FCVTMS">;
2545*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_uint, ffloor, "FCVTMU">;
2546*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_sint, ftrunc, "FCVTZS">;
2547*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_uint, ftrunc, "FCVTZU">;
2548*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_sint, frnd,   "FCVTAS">;
2549*9880d681SAndroid Build Coastguard Workerdefm : FPToIntegerPats<fp_to_uint, frnd,   "FCVTAU">;
2550*9880d681SAndroid Build Coastguard Worker
2551*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2552*9880d681SAndroid Build Coastguard Worker// Scaled integer to floating point conversion instructions.
2553*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2554*9880d681SAndroid Build Coastguard Worker
2555*9880d681SAndroid Build Coastguard Workerdefm SCVTF : IntegerToFP<0, "scvtf", sint_to_fp>;
2556*9880d681SAndroid Build Coastguard Workerdefm UCVTF : IntegerToFP<1, "ucvtf", uint_to_fp>;
2557*9880d681SAndroid Build Coastguard Worker
2558*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2559*9880d681SAndroid Build Coastguard Worker// Unscaled integer to floating point conversion instruction.
2560*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2561*9880d681SAndroid Build Coastguard Worker
2562*9880d681SAndroid Build Coastguard Workerdefm FMOV : UnscaledConversion<"fmov">;
2563*9880d681SAndroid Build Coastguard Worker
2564*9880d681SAndroid Build Coastguard Worker// Add pseudo ops for FMOV 0 so we can mark them as isReMaterializable
2565*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isCodeGenOnly = 1, isAsCheapAsAMove = 1 in {
2566*9880d681SAndroid Build Coastguard Workerdef FMOVS0 : Pseudo<(outs FPR32:$Rd), (ins), [(set f32:$Rd, (fpimm0))]>,
2567*9880d681SAndroid Build Coastguard Worker    Sched<[WriteF]>;
2568*9880d681SAndroid Build Coastguard Workerdef FMOVD0 : Pseudo<(outs FPR64:$Rd), (ins), [(set f64:$Rd, (fpimm0))]>,
2569*9880d681SAndroid Build Coastguard Worker    Sched<[WriteF]>;
2570*9880d681SAndroid Build Coastguard Worker}
2571*9880d681SAndroid Build Coastguard Worker
2572*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2573*9880d681SAndroid Build Coastguard Worker// Floating point conversion instruction.
2574*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2575*9880d681SAndroid Build Coastguard Worker
2576*9880d681SAndroid Build Coastguard Workerdefm FCVT : FPConversion<"fcvt">;
2577*9880d681SAndroid Build Coastguard Worker
2578*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2579*9880d681SAndroid Build Coastguard Worker// Floating point single operand instructions.
2580*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2581*9880d681SAndroid Build Coastguard Worker
2582*9880d681SAndroid Build Coastguard Workerdefm FABS   : SingleOperandFPData<0b0001, "fabs", fabs>;
2583*9880d681SAndroid Build Coastguard Workerdefm FMOV   : SingleOperandFPData<0b0000, "fmov">;
2584*9880d681SAndroid Build Coastguard Workerdefm FNEG   : SingleOperandFPData<0b0010, "fneg", fneg>;
2585*9880d681SAndroid Build Coastguard Workerdefm FRINTA : SingleOperandFPData<0b1100, "frinta", frnd>;
2586*9880d681SAndroid Build Coastguard Workerdefm FRINTI : SingleOperandFPData<0b1111, "frinti", fnearbyint>;
2587*9880d681SAndroid Build Coastguard Workerdefm FRINTM : SingleOperandFPData<0b1010, "frintm", ffloor>;
2588*9880d681SAndroid Build Coastguard Workerdefm FRINTN : SingleOperandFPData<0b1000, "frintn", int_aarch64_neon_frintn>;
2589*9880d681SAndroid Build Coastguard Workerdefm FRINTP : SingleOperandFPData<0b1001, "frintp", fceil>;
2590*9880d681SAndroid Build Coastguard Worker
2591*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (int_aarch64_neon_frintn (v1f64 FPR64:$Rn))),
2592*9880d681SAndroid Build Coastguard Worker          (FRINTNDr FPR64:$Rn)>;
2593*9880d681SAndroid Build Coastguard Worker
2594*9880d681SAndroid Build Coastguard Workerdefm FRINTX : SingleOperandFPData<0b1110, "frintx", frint>;
2595*9880d681SAndroid Build Coastguard Workerdefm FRINTZ : SingleOperandFPData<0b1011, "frintz", ftrunc>;
2596*9880d681SAndroid Build Coastguard Worker
2597*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteFDiv] in {
2598*9880d681SAndroid Build Coastguard Workerdefm FSQRT  : SingleOperandFPData<0b0011, "fsqrt", fsqrt>;
2599*9880d681SAndroid Build Coastguard Worker}
2600*9880d681SAndroid Build Coastguard Worker
2601*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2602*9880d681SAndroid Build Coastguard Worker// Floating point two operand instructions.
2603*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2604*9880d681SAndroid Build Coastguard Worker
2605*9880d681SAndroid Build Coastguard Workerdefm FADD   : TwoOperandFPData<0b0010, "fadd", fadd>;
2606*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteFDiv] in {
2607*9880d681SAndroid Build Coastguard Workerdefm FDIV   : TwoOperandFPData<0b0001, "fdiv", fdiv>;
2608*9880d681SAndroid Build Coastguard Worker}
2609*9880d681SAndroid Build Coastguard Workerdefm FMAXNM : TwoOperandFPData<0b0110, "fmaxnm", fmaxnum>;
2610*9880d681SAndroid Build Coastguard Workerdefm FMAX   : TwoOperandFPData<0b0100, "fmax", fmaxnan>;
2611*9880d681SAndroid Build Coastguard Workerdefm FMINNM : TwoOperandFPData<0b0111, "fminnm", fminnum>;
2612*9880d681SAndroid Build Coastguard Workerdefm FMIN   : TwoOperandFPData<0b0101, "fmin", fminnan>;
2613*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteFMul] in {
2614*9880d681SAndroid Build Coastguard Workerdefm FMUL   : TwoOperandFPData<0b0000, "fmul", fmul>;
2615*9880d681SAndroid Build Coastguard Workerdefm FNMUL  : TwoOperandFPDataNeg<0b1000, "fnmul", fmul>;
2616*9880d681SAndroid Build Coastguard Worker}
2617*9880d681SAndroid Build Coastguard Workerdefm FSUB   : TwoOperandFPData<0b0011, "fsub", fsub>;
2618*9880d681SAndroid Build Coastguard Worker
2619*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (fmaxnan (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))),
2620*9880d681SAndroid Build Coastguard Worker          (FMAXDrr FPR64:$Rn, FPR64:$Rm)>;
2621*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (fminnan (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))),
2622*9880d681SAndroid Build Coastguard Worker          (FMINDrr FPR64:$Rn, FPR64:$Rm)>;
2623*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (fmaxnum (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))),
2624*9880d681SAndroid Build Coastguard Worker          (FMAXNMDrr FPR64:$Rn, FPR64:$Rm)>;
2625*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (fminnum (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))),
2626*9880d681SAndroid Build Coastguard Worker          (FMINNMDrr FPR64:$Rn, FPR64:$Rm)>;
2627*9880d681SAndroid Build Coastguard Worker
2628*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2629*9880d681SAndroid Build Coastguard Worker// Floating point three operand instructions.
2630*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2631*9880d681SAndroid Build Coastguard Worker
2632*9880d681SAndroid Build Coastguard Workerdefm FMADD  : ThreeOperandFPData<0, 0, "fmadd", fma>;
2633*9880d681SAndroid Build Coastguard Workerdefm FMSUB  : ThreeOperandFPData<0, 1, "fmsub",
2634*9880d681SAndroid Build Coastguard Worker     TriOpFrag<(fma node:$LHS, (fneg node:$MHS), node:$RHS)> >;
2635*9880d681SAndroid Build Coastguard Workerdefm FNMADD : ThreeOperandFPData<1, 0, "fnmadd",
2636*9880d681SAndroid Build Coastguard Worker     TriOpFrag<(fneg (fma node:$LHS, node:$MHS, node:$RHS))> >;
2637*9880d681SAndroid Build Coastguard Workerdefm FNMSUB : ThreeOperandFPData<1, 1, "fnmsub",
2638*9880d681SAndroid Build Coastguard Worker     TriOpFrag<(fma node:$LHS, node:$MHS, (fneg node:$RHS))> >;
2639*9880d681SAndroid Build Coastguard Worker
2640*9880d681SAndroid Build Coastguard Worker// The following def pats catch the case where the LHS of an FMA is negated.
2641*9880d681SAndroid Build Coastguard Worker// The TriOpFrag above catches the case where the middle operand is negated.
2642*9880d681SAndroid Build Coastguard Worker
2643*9880d681SAndroid Build Coastguard Worker// N.b. FMSUB etc have the accumulator at the *end* of (outs), unlike
2644*9880d681SAndroid Build Coastguard Worker// the NEON variant.
2645*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (fma (fneg FPR32:$Rn), FPR32:$Rm, FPR32:$Ra)),
2646*9880d681SAndroid Build Coastguard Worker          (FMSUBSrrr FPR32:$Rn, FPR32:$Rm, FPR32:$Ra)>;
2647*9880d681SAndroid Build Coastguard Worker
2648*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fma (fneg FPR64:$Rn), FPR64:$Rm, FPR64:$Ra)),
2649*9880d681SAndroid Build Coastguard Worker          (FMSUBDrrr FPR64:$Rn, FPR64:$Rm, FPR64:$Ra)>;
2650*9880d681SAndroid Build Coastguard Worker
2651*9880d681SAndroid Build Coastguard Worker// We handled -(a + b*c) for FNMADD above, now it's time for "(-a) + (-b)*c" and
2652*9880d681SAndroid Build Coastguard Worker// "(-a) + b*(-c)".
2653*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (fma (fneg FPR32:$Rn), FPR32:$Rm, (fneg FPR32:$Ra))),
2654*9880d681SAndroid Build Coastguard Worker          (FNMADDSrrr FPR32:$Rn, FPR32:$Rm, FPR32:$Ra)>;
2655*9880d681SAndroid Build Coastguard Worker
2656*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fma (fneg FPR64:$Rn), FPR64:$Rm, (fneg FPR64:$Ra))),
2657*9880d681SAndroid Build Coastguard Worker          (FNMADDDrrr FPR64:$Rn, FPR64:$Rm, FPR64:$Ra)>;
2658*9880d681SAndroid Build Coastguard Worker
2659*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (fma FPR32:$Rn, (fneg FPR32:$Rm), (fneg FPR32:$Ra))),
2660*9880d681SAndroid Build Coastguard Worker          (FNMADDSrrr FPR32:$Rn, FPR32:$Rm, FPR32:$Ra)>;
2661*9880d681SAndroid Build Coastguard Worker
2662*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fma FPR64:$Rn, (fneg FPR64:$Rm), (fneg FPR64:$Ra))),
2663*9880d681SAndroid Build Coastguard Worker          (FNMADDDrrr FPR64:$Rn, FPR64:$Rm, FPR64:$Ra)>;
2664*9880d681SAndroid Build Coastguard Worker
2665*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2666*9880d681SAndroid Build Coastguard Worker// Floating point comparison instructions.
2667*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2668*9880d681SAndroid Build Coastguard Worker
2669*9880d681SAndroid Build Coastguard Workerdefm FCMPE : FPComparison<1, "fcmpe">;
2670*9880d681SAndroid Build Coastguard Workerdefm FCMP  : FPComparison<0, "fcmp", AArch64fcmp>;
2671*9880d681SAndroid Build Coastguard Worker
2672*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2673*9880d681SAndroid Build Coastguard Worker// Floating point conditional comparison instructions.
2674*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2675*9880d681SAndroid Build Coastguard Worker
2676*9880d681SAndroid Build Coastguard Workerdefm FCCMPE : FPCondComparison<1, "fccmpe">;
2677*9880d681SAndroid Build Coastguard Workerdefm FCCMP  : FPCondComparison<0, "fccmp", AArch64fccmp>;
2678*9880d681SAndroid Build Coastguard Worker
2679*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2680*9880d681SAndroid Build Coastguard Worker// Floating point conditional select instruction.
2681*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2682*9880d681SAndroid Build Coastguard Worker
2683*9880d681SAndroid Build Coastguard Workerdefm FCSEL : FPCondSelect<"fcsel">;
2684*9880d681SAndroid Build Coastguard Worker
2685*9880d681SAndroid Build Coastguard Worker// CSEL instructions providing f128 types need to be handled by a
2686*9880d681SAndroid Build Coastguard Worker// pseudo-instruction since the eventual code will need to introduce basic
2687*9880d681SAndroid Build Coastguard Worker// blocks and control flow.
2688*9880d681SAndroid Build Coastguard Workerdef F128CSEL : Pseudo<(outs FPR128:$Rd),
2689*9880d681SAndroid Build Coastguard Worker                      (ins FPR128:$Rn, FPR128:$Rm, ccode:$cond),
2690*9880d681SAndroid Build Coastguard Worker                      [(set (f128 FPR128:$Rd),
2691*9880d681SAndroid Build Coastguard Worker                            (AArch64csel FPR128:$Rn, FPR128:$Rm,
2692*9880d681SAndroid Build Coastguard Worker                                       (i32 imm:$cond), NZCV))]> {
2693*9880d681SAndroid Build Coastguard Worker  let Uses = [NZCV];
2694*9880d681SAndroid Build Coastguard Worker  let usesCustomInserter = 1;
2695*9880d681SAndroid Build Coastguard Worker  let hasNoSchedulingInfo = 1;
2696*9880d681SAndroid Build Coastguard Worker}
2697*9880d681SAndroid Build Coastguard Worker
2698*9880d681SAndroid Build Coastguard Worker
2699*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2700*9880d681SAndroid Build Coastguard Worker// Floating point immediate move.
2701*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2702*9880d681SAndroid Build Coastguard Worker
2703*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1 in {
2704*9880d681SAndroid Build Coastguard Workerdefm FMOV : FPMoveImmediate<"fmov">;
2705*9880d681SAndroid Build Coastguard Worker}
2706*9880d681SAndroid Build Coastguard Worker
2707*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2708*9880d681SAndroid Build Coastguard Worker// Advanced SIMD two vector instructions.
2709*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2710*9880d681SAndroid Build Coastguard Worker
2711*9880d681SAndroid Build Coastguard Workerdefm UABDL   : SIMDLongThreeVectorBHSabdl<1, 0b0111, "uabdl",
2712*9880d681SAndroid Build Coastguard Worker                                          int_aarch64_neon_uabd>;
2713*9880d681SAndroid Build Coastguard Worker// Match UABDL in log2-shuffle patterns.
2714*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v8i16 (AArch64vashr v8i16:$src, (i32 15))),
2715*9880d681SAndroid Build Coastguard Worker               (v8i16 (add (sub (zext (v8i8 V64:$opA)),
2716*9880d681SAndroid Build Coastguard Worker                                (zext (v8i8 V64:$opB))),
2717*9880d681SAndroid Build Coastguard Worker                           (AArch64vashr v8i16:$src, (i32 15))))),
2718*9880d681SAndroid Build Coastguard Worker          (UABDLv8i8_v8i16 V64:$opA, V64:$opB)>;
2719*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v8i16 (AArch64vashr v8i16:$src, (i32 15))),
2720*9880d681SAndroid Build Coastguard Worker               (v8i16 (add (sub (zext (extract_high_v16i8 V128:$opA)),
2721*9880d681SAndroid Build Coastguard Worker                                (zext (extract_high_v16i8 V128:$opB))),
2722*9880d681SAndroid Build Coastguard Worker                           (AArch64vashr v8i16:$src, (i32 15))))),
2723*9880d681SAndroid Build Coastguard Worker          (UABDLv16i8_v8i16 V128:$opA, V128:$opB)>;
2724*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v4i32 (AArch64vashr v4i32:$src, (i32 31))),
2725*9880d681SAndroid Build Coastguard Worker               (v4i32 (add (sub (zext (v4i16 V64:$opA)),
2726*9880d681SAndroid Build Coastguard Worker                                (zext (v4i16 V64:$opB))),
2727*9880d681SAndroid Build Coastguard Worker                           (AArch64vashr v4i32:$src, (i32 31))))),
2728*9880d681SAndroid Build Coastguard Worker          (UABDLv4i16_v4i32 V64:$opA, V64:$opB)>;
2729*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v4i32 (AArch64vashr v4i32:$src, (i32 31))),
2730*9880d681SAndroid Build Coastguard Worker               (v4i32 (add (sub (zext (extract_high_v8i16 V128:$opA)),
2731*9880d681SAndroid Build Coastguard Worker                                (zext (extract_high_v8i16 V128:$opB))),
2732*9880d681SAndroid Build Coastguard Worker                          (AArch64vashr v4i32:$src, (i32 31))))),
2733*9880d681SAndroid Build Coastguard Worker          (UABDLv8i16_v4i32 V128:$opA, V128:$opB)>;
2734*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v2i64 (AArch64vashr v2i64:$src, (i32 63))),
2735*9880d681SAndroid Build Coastguard Worker               (v2i64 (add (sub (zext (v2i32 V64:$opA)),
2736*9880d681SAndroid Build Coastguard Worker                                (zext (v2i32 V64:$opB))),
2737*9880d681SAndroid Build Coastguard Worker                           (AArch64vashr v2i64:$src, (i32 63))))),
2738*9880d681SAndroid Build Coastguard Worker          (UABDLv2i32_v2i64 V64:$opA, V64:$opB)>;
2739*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v2i64 (AArch64vashr v2i64:$src, (i32 63))),
2740*9880d681SAndroid Build Coastguard Worker               (v2i64 (add (sub (zext (extract_high_v4i32 V128:$opA)),
2741*9880d681SAndroid Build Coastguard Worker                                (zext (extract_high_v4i32 V128:$opB))),
2742*9880d681SAndroid Build Coastguard Worker                          (AArch64vashr v2i64:$src, (i32 63))))),
2743*9880d681SAndroid Build Coastguard Worker          (UABDLv4i32_v2i64 V128:$opA, V128:$opB)>;
2744*9880d681SAndroid Build Coastguard Worker
2745*9880d681SAndroid Build Coastguard Workerdefm ABS    : SIMDTwoVectorBHSD<0, 0b01011, "abs", int_aarch64_neon_abs>;
2746*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v8i8 (AArch64vashr V64:$src, (i32 7))),
2747*9880d681SAndroid Build Coastguard Worker               (v8i8 (add V64:$src, (AArch64vashr V64:$src, (i32 7))))),
2748*9880d681SAndroid Build Coastguard Worker          (ABSv8i8 V64:$src)>;
2749*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v4i16 (AArch64vashr V64:$src, (i32 15))),
2750*9880d681SAndroid Build Coastguard Worker               (v4i16 (add V64:$src, (AArch64vashr V64:$src, (i32 15))))),
2751*9880d681SAndroid Build Coastguard Worker          (ABSv4i16 V64:$src)>;
2752*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v2i32 (AArch64vashr V64:$src, (i32 31))),
2753*9880d681SAndroid Build Coastguard Worker               (v2i32 (add V64:$src, (AArch64vashr V64:$src, (i32 31))))),
2754*9880d681SAndroid Build Coastguard Worker          (ABSv2i32 V64:$src)>;
2755*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v16i8 (AArch64vashr V128:$src, (i32 7))),
2756*9880d681SAndroid Build Coastguard Worker               (v16i8 (add V128:$src, (AArch64vashr V128:$src, (i32 7))))),
2757*9880d681SAndroid Build Coastguard Worker          (ABSv16i8 V128:$src)>;
2758*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v8i16 (AArch64vashr V128:$src, (i32 15))),
2759*9880d681SAndroid Build Coastguard Worker               (v8i16 (add V128:$src, (AArch64vashr V128:$src, (i32 15))))),
2760*9880d681SAndroid Build Coastguard Worker          (ABSv8i16 V128:$src)>;
2761*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v4i32 (AArch64vashr V128:$src, (i32 31))),
2762*9880d681SAndroid Build Coastguard Worker               (v4i32 (add V128:$src, (AArch64vashr V128:$src, (i32 31))))),
2763*9880d681SAndroid Build Coastguard Worker          (ABSv4i32 V128:$src)>;
2764*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor (v2i64 (AArch64vashr V128:$src, (i32 63))),
2765*9880d681SAndroid Build Coastguard Worker               (v2i64 (add V128:$src, (AArch64vashr V128:$src, (i32 63))))),
2766*9880d681SAndroid Build Coastguard Worker          (ABSv2i64 V128:$src)>;
2767*9880d681SAndroid Build Coastguard Worker
2768*9880d681SAndroid Build Coastguard Workerdefm CLS    : SIMDTwoVectorBHS<0, 0b00100, "cls", int_aarch64_neon_cls>;
2769*9880d681SAndroid Build Coastguard Workerdefm CLZ    : SIMDTwoVectorBHS<1, 0b00100, "clz", ctlz>;
2770*9880d681SAndroid Build Coastguard Workerdefm CMEQ   : SIMDCmpTwoVector<0, 0b01001, "cmeq", AArch64cmeqz>;
2771*9880d681SAndroid Build Coastguard Workerdefm CMGE   : SIMDCmpTwoVector<1, 0b01000, "cmge", AArch64cmgez>;
2772*9880d681SAndroid Build Coastguard Workerdefm CMGT   : SIMDCmpTwoVector<0, 0b01000, "cmgt", AArch64cmgtz>;
2773*9880d681SAndroid Build Coastguard Workerdefm CMLE   : SIMDCmpTwoVector<1, 0b01001, "cmle", AArch64cmlez>;
2774*9880d681SAndroid Build Coastguard Workerdefm CMLT   : SIMDCmpTwoVector<0, 0b01010, "cmlt", AArch64cmltz>;
2775*9880d681SAndroid Build Coastguard Workerdefm CNT    : SIMDTwoVectorB<0, 0b00, 0b00101, "cnt", ctpop>;
2776*9880d681SAndroid Build Coastguard Workerdefm FABS   : SIMDTwoVectorFP<0, 1, 0b01111, "fabs", fabs>;
2777*9880d681SAndroid Build Coastguard Worker
2778*9880d681SAndroid Build Coastguard Workerdefm FCMEQ  : SIMDFPCmpTwoVector<0, 1, 0b01101, "fcmeq", AArch64fcmeqz>;
2779*9880d681SAndroid Build Coastguard Workerdefm FCMGE  : SIMDFPCmpTwoVector<1, 1, 0b01100, "fcmge", AArch64fcmgez>;
2780*9880d681SAndroid Build Coastguard Workerdefm FCMGT  : SIMDFPCmpTwoVector<0, 1, 0b01100, "fcmgt", AArch64fcmgtz>;
2781*9880d681SAndroid Build Coastguard Workerdefm FCMLE  : SIMDFPCmpTwoVector<1, 1, 0b01101, "fcmle", AArch64fcmlez>;
2782*9880d681SAndroid Build Coastguard Workerdefm FCMLT  : SIMDFPCmpTwoVector<0, 1, 0b01110, "fcmlt", AArch64fcmltz>;
2783*9880d681SAndroid Build Coastguard Workerdefm FCVTAS : SIMDTwoVectorFPToInt<0,0,0b11100, "fcvtas",int_aarch64_neon_fcvtas>;
2784*9880d681SAndroid Build Coastguard Workerdefm FCVTAU : SIMDTwoVectorFPToInt<1,0,0b11100, "fcvtau",int_aarch64_neon_fcvtau>;
2785*9880d681SAndroid Build Coastguard Workerdefm FCVTL  : SIMDFPWidenTwoVector<0, 0, 0b10111, "fcvtl">;
2786*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (int_aarch64_neon_vcvthf2fp (v4i16 V64:$Rn))),
2787*9880d681SAndroid Build Coastguard Worker          (FCVTLv4i16 V64:$Rn)>;
2788*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (int_aarch64_neon_vcvthf2fp (extract_subvector (v8i16 V128:$Rn),
2789*9880d681SAndroid Build Coastguard Worker                                                              (i64 4)))),
2790*9880d681SAndroid Build Coastguard Worker          (FCVTLv8i16 V128:$Rn)>;
2791*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (fextend (v2f32 V64:$Rn))), (FCVTLv2i32 V64:$Rn)>;
2792*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (fextend (v2f32 (extract_subvector (v4f32 V128:$Rn),
2793*9880d681SAndroid Build Coastguard Worker                                                    (i64 2))))),
2794*9880d681SAndroid Build Coastguard Worker          (FCVTLv4i32 V128:$Rn)>;
2795*9880d681SAndroid Build Coastguard Worker
2796*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (fextend (v4f16 V64:$Rn))), (FCVTLv4i16 V64:$Rn)>;
2797*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (fextend (v4f16 (extract_subvector (v8f16 V128:$Rn),
2798*9880d681SAndroid Build Coastguard Worker                                                    (i64 4))))),
2799*9880d681SAndroid Build Coastguard Worker          (FCVTLv8i16 V128:$Rn)>;
2800*9880d681SAndroid Build Coastguard Worker
2801*9880d681SAndroid Build Coastguard Workerdefm FCVTMS : SIMDTwoVectorFPToInt<0,0,0b11011, "fcvtms",int_aarch64_neon_fcvtms>;
2802*9880d681SAndroid Build Coastguard Workerdefm FCVTMU : SIMDTwoVectorFPToInt<1,0,0b11011, "fcvtmu",int_aarch64_neon_fcvtmu>;
2803*9880d681SAndroid Build Coastguard Workerdefm FCVTNS : SIMDTwoVectorFPToInt<0,0,0b11010, "fcvtns",int_aarch64_neon_fcvtns>;
2804*9880d681SAndroid Build Coastguard Workerdefm FCVTNU : SIMDTwoVectorFPToInt<1,0,0b11010, "fcvtnu",int_aarch64_neon_fcvtnu>;
2805*9880d681SAndroid Build Coastguard Workerdefm FCVTN  : SIMDFPNarrowTwoVector<0, 0, 0b10110, "fcvtn">;
2806*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (int_aarch64_neon_vcvtfp2hf (v4f32 V128:$Rn))),
2807*9880d681SAndroid Build Coastguard Worker          (FCVTNv4i16 V128:$Rn)>;
2808*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors V64:$Rd,
2809*9880d681SAndroid Build Coastguard Worker                          (v4i16 (int_aarch64_neon_vcvtfp2hf (v4f32 V128:$Rn)))),
2810*9880d681SAndroid Build Coastguard Worker          (FCVTNv8i16 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), V128:$Rn)>;
2811*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (fround (v2f64 V128:$Rn))), (FCVTNv2i32 V128:$Rn)>;
2812*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (fround (v4f32 V128:$Rn))), (FCVTNv4i16 V128:$Rn)>;
2813*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors V64:$Rd, (v2f32 (fround (v2f64 V128:$Rn)))),
2814*9880d681SAndroid Build Coastguard Worker          (FCVTNv4i32 (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), V128:$Rn)>;
2815*9880d681SAndroid Build Coastguard Workerdefm FCVTPS : SIMDTwoVectorFPToInt<0,1,0b11010, "fcvtps",int_aarch64_neon_fcvtps>;
2816*9880d681SAndroid Build Coastguard Workerdefm FCVTPU : SIMDTwoVectorFPToInt<1,1,0b11010, "fcvtpu",int_aarch64_neon_fcvtpu>;
2817*9880d681SAndroid Build Coastguard Workerdefm FCVTXN : SIMDFPInexactCvtTwoVector<1, 0, 0b10110, "fcvtxn",
2818*9880d681SAndroid Build Coastguard Worker                                        int_aarch64_neon_fcvtxn>;
2819*9880d681SAndroid Build Coastguard Workerdefm FCVTZS : SIMDTwoVectorFPToInt<0, 1, 0b11011, "fcvtzs", fp_to_sint>;
2820*9880d681SAndroid Build Coastguard Workerdefm FCVTZU : SIMDTwoVectorFPToInt<1, 1, 0b11011, "fcvtzu", fp_to_uint>;
2821*9880d681SAndroid Build Coastguard Worker
2822*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (int_aarch64_neon_fcvtzs v4f16:$Rn)), (FCVTZSv4f16 $Rn)>;
2823*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (int_aarch64_neon_fcvtzs v8f16:$Rn)), (FCVTZSv8f16 $Rn)>;
2824*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (int_aarch64_neon_fcvtzs v2f32:$Rn)), (FCVTZSv2f32 $Rn)>;
2825*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (int_aarch64_neon_fcvtzs v4f32:$Rn)), (FCVTZSv4f32 $Rn)>;
2826*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (int_aarch64_neon_fcvtzs v2f64:$Rn)), (FCVTZSv2f64 $Rn)>;
2827*9880d681SAndroid Build Coastguard Worker
2828*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (int_aarch64_neon_fcvtzu v4f16:$Rn)), (FCVTZUv4f16 $Rn)>;
2829*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (int_aarch64_neon_fcvtzu v8f16:$Rn)), (FCVTZUv8f16 $Rn)>;
2830*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (int_aarch64_neon_fcvtzu v2f32:$Rn)), (FCVTZUv2f32 $Rn)>;
2831*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (int_aarch64_neon_fcvtzu v4f32:$Rn)), (FCVTZUv4f32 $Rn)>;
2832*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (int_aarch64_neon_fcvtzu v2f64:$Rn)), (FCVTZUv2f64 $Rn)>;
2833*9880d681SAndroid Build Coastguard Worker
2834*9880d681SAndroid Build Coastguard Workerdefm FNEG   : SIMDTwoVectorFP<1, 1, 0b01111, "fneg", fneg>;
2835*9880d681SAndroid Build Coastguard Workerdefm FRECPE : SIMDTwoVectorFP<0, 1, 0b11101, "frecpe", int_aarch64_neon_frecpe>;
2836*9880d681SAndroid Build Coastguard Workerdefm FRINTA : SIMDTwoVectorFP<1, 0, 0b11000, "frinta", frnd>;
2837*9880d681SAndroid Build Coastguard Workerdefm FRINTI : SIMDTwoVectorFP<1, 1, 0b11001, "frinti", fnearbyint>;
2838*9880d681SAndroid Build Coastguard Workerdefm FRINTM : SIMDTwoVectorFP<0, 0, 0b11001, "frintm", ffloor>;
2839*9880d681SAndroid Build Coastguard Workerdefm FRINTN : SIMDTwoVectorFP<0, 0, 0b11000, "frintn", int_aarch64_neon_frintn>;
2840*9880d681SAndroid Build Coastguard Workerdefm FRINTP : SIMDTwoVectorFP<0, 1, 0b11000, "frintp", fceil>;
2841*9880d681SAndroid Build Coastguard Workerdefm FRINTX : SIMDTwoVectorFP<1, 0, 0b11001, "frintx", frint>;
2842*9880d681SAndroid Build Coastguard Workerdefm FRINTZ : SIMDTwoVectorFP<0, 1, 0b11001, "frintz", ftrunc>;
2843*9880d681SAndroid Build Coastguard Workerdefm FRSQRTE: SIMDTwoVectorFP<1, 1, 0b11101, "frsqrte", int_aarch64_neon_frsqrte>;
2844*9880d681SAndroid Build Coastguard Workerdefm FSQRT  : SIMDTwoVectorFP<1, 1, 0b11111, "fsqrt", fsqrt>;
2845*9880d681SAndroid Build Coastguard Workerdefm NEG    : SIMDTwoVectorBHSD<1, 0b01011, "neg",
2846*9880d681SAndroid Build Coastguard Worker                               UnOpFrag<(sub immAllZerosV, node:$LHS)> >;
2847*9880d681SAndroid Build Coastguard Workerdefm NOT    : SIMDTwoVectorB<1, 0b00, 0b00101, "not", vnot>;
2848*9880d681SAndroid Build Coastguard Worker// Aliases for MVN -> NOT.
2849*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvn{ $Vd.8b, $Vn.8b|.8b $Vd, $Vn}",
2850*9880d681SAndroid Build Coastguard Worker                (NOTv8i8 V64:$Vd, V64:$Vn)>;
2851*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvn{ $Vd.16b, $Vn.16b|.16b $Vd, $Vn}",
2852*9880d681SAndroid Build Coastguard Worker                (NOTv16i8 V128:$Vd, V128:$Vn)>;
2853*9880d681SAndroid Build Coastguard Worker
2854*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v8i8  V64:$Rn)),  (NEGv8i8  V64:$Rn)>;
2855*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v16i8 V128:$Rn)), (NEGv16i8 V128:$Rn)>;
2856*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v4i16 V64:$Rn)),  (NEGv4i16 V64:$Rn)>;
2857*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v8i16 V128:$Rn)), (NEGv8i16 V128:$Rn)>;
2858*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v2i32 V64:$Rn)),  (NEGv2i32 V64:$Rn)>;
2859*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v4i32 V128:$Rn)), (NEGv4i32 V128:$Rn)>;
2860*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v2i64 V128:$Rn)), (NEGv2i64 V128:$Rn)>;
2861*9880d681SAndroid Build Coastguard Worker
2862*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v8i8 V64:$Rn)),   (NOTv8i8  V64:$Rn)>;
2863*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v16i8 V128:$Rn)), (NOTv16i8 V128:$Rn)>;
2864*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v4i16 V64:$Rn)),  (NOTv8i8  V64:$Rn)>;
2865*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v8i16 V128:$Rn)), (NOTv16i8 V128:$Rn)>;
2866*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v2i32 V64:$Rn)),  (NOTv8i8  V64:$Rn)>;
2867*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v1i64 V64:$Rn)),  (NOTv8i8  V64:$Rn)>;
2868*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v4i32 V128:$Rn)), (NOTv16i8 V128:$Rn)>;
2869*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64not (v2i64 V128:$Rn)), (NOTv16i8 V128:$Rn)>;
2870*9880d681SAndroid Build Coastguard Worker
2871*9880d681SAndroid Build Coastguard Workerdef : Pat<(vnot (v4i16 V64:$Rn)),  (NOTv8i8  V64:$Rn)>;
2872*9880d681SAndroid Build Coastguard Workerdef : Pat<(vnot (v8i16 V128:$Rn)), (NOTv16i8 V128:$Rn)>;
2873*9880d681SAndroid Build Coastguard Workerdef : Pat<(vnot (v2i32 V64:$Rn)),  (NOTv8i8  V64:$Rn)>;
2874*9880d681SAndroid Build Coastguard Workerdef : Pat<(vnot (v4i32 V128:$Rn)), (NOTv16i8 V128:$Rn)>;
2875*9880d681SAndroid Build Coastguard Workerdef : Pat<(vnot (v2i64 V128:$Rn)), (NOTv16i8 V128:$Rn)>;
2876*9880d681SAndroid Build Coastguard Worker
2877*9880d681SAndroid Build Coastguard Workerdefm RBIT   : SIMDTwoVectorB<1, 0b01, 0b00101, "rbit", int_aarch64_neon_rbit>;
2878*9880d681SAndroid Build Coastguard Workerdefm REV16  : SIMDTwoVectorB<0, 0b00, 0b00001, "rev16", AArch64rev16>;
2879*9880d681SAndroid Build Coastguard Workerdefm REV32  : SIMDTwoVectorBH<1, 0b00000, "rev32", AArch64rev32>;
2880*9880d681SAndroid Build Coastguard Workerdefm REV64  : SIMDTwoVectorBHS<0, 0b00000, "rev64", AArch64rev64>;
2881*9880d681SAndroid Build Coastguard Workerdefm SADALP : SIMDLongTwoVectorTied<0, 0b00110, "sadalp",
2882*9880d681SAndroid Build Coastguard Worker       BinOpFrag<(add node:$LHS, (int_aarch64_neon_saddlp node:$RHS))> >;
2883*9880d681SAndroid Build Coastguard Workerdefm SADDLP : SIMDLongTwoVector<0, 0b00010, "saddlp", int_aarch64_neon_saddlp>;
2884*9880d681SAndroid Build Coastguard Workerdefm SCVTF  : SIMDTwoVectorIntToFP<0, 0, 0b11101, "scvtf", sint_to_fp>;
2885*9880d681SAndroid Build Coastguard Workerdefm SHLL   : SIMDVectorLShiftLongBySizeBHS;
2886*9880d681SAndroid Build Coastguard Workerdefm SQABS  : SIMDTwoVectorBHSD<0, 0b00111, "sqabs", int_aarch64_neon_sqabs>;
2887*9880d681SAndroid Build Coastguard Workerdefm SQNEG  : SIMDTwoVectorBHSD<1, 0b00111, "sqneg", int_aarch64_neon_sqneg>;
2888*9880d681SAndroid Build Coastguard Workerdefm SQXTN  : SIMDMixedTwoVector<0, 0b10100, "sqxtn", int_aarch64_neon_sqxtn>;
2889*9880d681SAndroid Build Coastguard Workerdefm SQXTUN : SIMDMixedTwoVector<1, 0b10010, "sqxtun", int_aarch64_neon_sqxtun>;
2890*9880d681SAndroid Build Coastguard Workerdefm SUQADD : SIMDTwoVectorBHSDTied<0, 0b00011, "suqadd",int_aarch64_neon_suqadd>;
2891*9880d681SAndroid Build Coastguard Workerdefm UADALP : SIMDLongTwoVectorTied<1, 0b00110, "uadalp",
2892*9880d681SAndroid Build Coastguard Worker       BinOpFrag<(add node:$LHS, (int_aarch64_neon_uaddlp node:$RHS))> >;
2893*9880d681SAndroid Build Coastguard Workerdefm UADDLP : SIMDLongTwoVector<1, 0b00010, "uaddlp",
2894*9880d681SAndroid Build Coastguard Worker                    int_aarch64_neon_uaddlp>;
2895*9880d681SAndroid Build Coastguard Workerdefm UCVTF  : SIMDTwoVectorIntToFP<1, 0, 0b11101, "ucvtf", uint_to_fp>;
2896*9880d681SAndroid Build Coastguard Workerdefm UQXTN  : SIMDMixedTwoVector<1, 0b10100, "uqxtn", int_aarch64_neon_uqxtn>;
2897*9880d681SAndroid Build Coastguard Workerdefm URECPE : SIMDTwoVectorS<0, 1, 0b11100, "urecpe", int_aarch64_neon_urecpe>;
2898*9880d681SAndroid Build Coastguard Workerdefm URSQRTE: SIMDTwoVectorS<1, 1, 0b11100, "ursqrte", int_aarch64_neon_ursqrte>;
2899*9880d681SAndroid Build Coastguard Workerdefm USQADD : SIMDTwoVectorBHSDTied<1, 0b00011, "usqadd",int_aarch64_neon_usqadd>;
2900*9880d681SAndroid Build Coastguard Workerdefm XTN    : SIMDMixedTwoVector<0, 0b10010, "xtn", trunc>;
2901*9880d681SAndroid Build Coastguard Worker
2902*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64rev32 V64:$Rn)), (REV32v4i16 V64:$Rn)>;
2903*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64rev64 V64:$Rn)), (REV64v4i16 V64:$Rn)>;
2904*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64rev32 V128:$Rn)), (REV32v8i16 V128:$Rn)>;
2905*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64rev64 V128:$Rn)), (REV64v8i16 V128:$Rn)>;
2906*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64rev64 V64:$Rn)), (REV64v2i32 V64:$Rn)>;
2907*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64rev64 V128:$Rn)), (REV64v4i32 V128:$Rn)>;
2908*9880d681SAndroid Build Coastguard Worker
2909*9880d681SAndroid Build Coastguard Worker// Patterns for vector long shift (by element width). These need to match all
2910*9880d681SAndroid Build Coastguard Worker// three of zext, sext and anyext so it's easier to pull the patterns out of the
2911*9880d681SAndroid Build Coastguard Worker// definition.
2912*9880d681SAndroid Build Coastguard Workermulticlass SIMDVectorLShiftLongBySizeBHSPats<SDPatternOperator ext> {
2913*9880d681SAndroid Build Coastguard Worker  def : Pat<(AArch64vshl (v8i16 (ext (v8i8 V64:$Rn))), (i32 8)),
2914*9880d681SAndroid Build Coastguard Worker            (SHLLv8i8 V64:$Rn)>;
2915*9880d681SAndroid Build Coastguard Worker  def : Pat<(AArch64vshl (v8i16 (ext (extract_high_v16i8 V128:$Rn))), (i32 8)),
2916*9880d681SAndroid Build Coastguard Worker            (SHLLv16i8 V128:$Rn)>;
2917*9880d681SAndroid Build Coastguard Worker  def : Pat<(AArch64vshl (v4i32 (ext (v4i16 V64:$Rn))), (i32 16)),
2918*9880d681SAndroid Build Coastguard Worker            (SHLLv4i16 V64:$Rn)>;
2919*9880d681SAndroid Build Coastguard Worker  def : Pat<(AArch64vshl (v4i32 (ext (extract_high_v8i16 V128:$Rn))), (i32 16)),
2920*9880d681SAndroid Build Coastguard Worker            (SHLLv8i16 V128:$Rn)>;
2921*9880d681SAndroid Build Coastguard Worker  def : Pat<(AArch64vshl (v2i64 (ext (v2i32 V64:$Rn))), (i32 32)),
2922*9880d681SAndroid Build Coastguard Worker            (SHLLv2i32 V64:$Rn)>;
2923*9880d681SAndroid Build Coastguard Worker  def : Pat<(AArch64vshl (v2i64 (ext (extract_high_v4i32 V128:$Rn))), (i32 32)),
2924*9880d681SAndroid Build Coastguard Worker            (SHLLv4i32 V128:$Rn)>;
2925*9880d681SAndroid Build Coastguard Worker}
2926*9880d681SAndroid Build Coastguard Worker
2927*9880d681SAndroid Build Coastguard Workerdefm : SIMDVectorLShiftLongBySizeBHSPats<anyext>;
2928*9880d681SAndroid Build Coastguard Workerdefm : SIMDVectorLShiftLongBySizeBHSPats<zext>;
2929*9880d681SAndroid Build Coastguard Workerdefm : SIMDVectorLShiftLongBySizeBHSPats<sext>;
2930*9880d681SAndroid Build Coastguard Worker
2931*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2932*9880d681SAndroid Build Coastguard Worker// Advanced SIMD three vector instructions.
2933*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2934*9880d681SAndroid Build Coastguard Worker
2935*9880d681SAndroid Build Coastguard Workerdefm ADD     : SIMDThreeSameVector<0, 0b10000, "add", add>;
2936*9880d681SAndroid Build Coastguard Workerdefm ADDP    : SIMDThreeSameVector<0, 0b10111, "addp", int_aarch64_neon_addp>;
2937*9880d681SAndroid Build Coastguard Workerdefm CMEQ    : SIMDThreeSameVector<1, 0b10001, "cmeq", AArch64cmeq>;
2938*9880d681SAndroid Build Coastguard Workerdefm CMGE    : SIMDThreeSameVector<0, 0b00111, "cmge", AArch64cmge>;
2939*9880d681SAndroid Build Coastguard Workerdefm CMGT    : SIMDThreeSameVector<0, 0b00110, "cmgt", AArch64cmgt>;
2940*9880d681SAndroid Build Coastguard Workerdefm CMHI    : SIMDThreeSameVector<1, 0b00110, "cmhi", AArch64cmhi>;
2941*9880d681SAndroid Build Coastguard Workerdefm CMHS    : SIMDThreeSameVector<1, 0b00111, "cmhs", AArch64cmhs>;
2942*9880d681SAndroid Build Coastguard Workerdefm CMTST   : SIMDThreeSameVector<0, 0b10001, "cmtst", AArch64cmtst>;
2943*9880d681SAndroid Build Coastguard Workerdefm FABD    : SIMDThreeSameVectorFP<1,1,0b010,"fabd", int_aarch64_neon_fabd>;
2944*9880d681SAndroid Build Coastguard Workerdefm FACGE   : SIMDThreeSameVectorFPCmp<1,0,0b101,"facge",int_aarch64_neon_facge>;
2945*9880d681SAndroid Build Coastguard Workerdefm FACGT   : SIMDThreeSameVectorFPCmp<1,1,0b101,"facgt",int_aarch64_neon_facgt>;
2946*9880d681SAndroid Build Coastguard Workerdefm FADDP   : SIMDThreeSameVectorFP<1,0,0b010,"faddp",int_aarch64_neon_addp>;
2947*9880d681SAndroid Build Coastguard Workerdefm FADD    : SIMDThreeSameVectorFP<0,0,0b010,"fadd", fadd>;
2948*9880d681SAndroid Build Coastguard Workerdefm FCMEQ   : SIMDThreeSameVectorFPCmp<0, 0, 0b100, "fcmeq", AArch64fcmeq>;
2949*9880d681SAndroid Build Coastguard Workerdefm FCMGE   : SIMDThreeSameVectorFPCmp<1, 0, 0b100, "fcmge", AArch64fcmge>;
2950*9880d681SAndroid Build Coastguard Workerdefm FCMGT   : SIMDThreeSameVectorFPCmp<1, 1, 0b100, "fcmgt", AArch64fcmgt>;
2951*9880d681SAndroid Build Coastguard Workerdefm FDIV    : SIMDThreeSameVectorFP<1,0,0b111,"fdiv", fdiv>;
2952*9880d681SAndroid Build Coastguard Workerdefm FMAXNMP : SIMDThreeSameVectorFP<1,0,0b000,"fmaxnmp", int_aarch64_neon_fmaxnmp>;
2953*9880d681SAndroid Build Coastguard Workerdefm FMAXNM  : SIMDThreeSameVectorFP<0,0,0b000,"fmaxnm", fmaxnum>;
2954*9880d681SAndroid Build Coastguard Workerdefm FMAXP   : SIMDThreeSameVectorFP<1,0,0b110,"fmaxp", int_aarch64_neon_fmaxp>;
2955*9880d681SAndroid Build Coastguard Workerdefm FMAX    : SIMDThreeSameVectorFP<0,0,0b110,"fmax", fmaxnan>;
2956*9880d681SAndroid Build Coastguard Workerdefm FMINNMP : SIMDThreeSameVectorFP<1,1,0b000,"fminnmp", int_aarch64_neon_fminnmp>;
2957*9880d681SAndroid Build Coastguard Workerdefm FMINNM  : SIMDThreeSameVectorFP<0,1,0b000,"fminnm", fminnum>;
2958*9880d681SAndroid Build Coastguard Workerdefm FMINP   : SIMDThreeSameVectorFP<1,1,0b110,"fminp", int_aarch64_neon_fminp>;
2959*9880d681SAndroid Build Coastguard Workerdefm FMIN    : SIMDThreeSameVectorFP<0,1,0b110,"fmin", fminnan>;
2960*9880d681SAndroid Build Coastguard Worker
2961*9880d681SAndroid Build Coastguard Worker// NOTE: The operands of the PatFrag are reordered on FMLA/FMLS because the
2962*9880d681SAndroid Build Coastguard Worker// instruction expects the addend first, while the fma intrinsic puts it last.
2963*9880d681SAndroid Build Coastguard Workerdefm FMLA     : SIMDThreeSameVectorFPTied<0, 0, 0b001, "fmla",
2964*9880d681SAndroid Build Coastguard Worker            TriOpFrag<(fma node:$RHS, node:$MHS, node:$LHS)> >;
2965*9880d681SAndroid Build Coastguard Workerdefm FMLS     : SIMDThreeSameVectorFPTied<0, 1, 0b001, "fmls",
2966*9880d681SAndroid Build Coastguard Worker            TriOpFrag<(fma node:$MHS, (fneg node:$RHS), node:$LHS)> >;
2967*9880d681SAndroid Build Coastguard Worker
2968*9880d681SAndroid Build Coastguard Worker// The following def pats catch the case where the LHS of an FMA is negated.
2969*9880d681SAndroid Build Coastguard Worker// The TriOpFrag above catches the case where the middle operand is negated.
2970*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (fma (fneg V64:$Rn), V64:$Rm, V64:$Rd)),
2971*9880d681SAndroid Build Coastguard Worker          (FMLSv2f32 V64:$Rd, V64:$Rn, V64:$Rm)>;
2972*9880d681SAndroid Build Coastguard Worker
2973*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (fma (fneg V128:$Rn), V128:$Rm, V128:$Rd)),
2974*9880d681SAndroid Build Coastguard Worker          (FMLSv4f32 V128:$Rd, V128:$Rn, V128:$Rm)>;
2975*9880d681SAndroid Build Coastguard Worker
2976*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (fma (fneg V128:$Rn), V128:$Rm, V128:$Rd)),
2977*9880d681SAndroid Build Coastguard Worker          (FMLSv2f64 V128:$Rd, V128:$Rn, V128:$Rm)>;
2978*9880d681SAndroid Build Coastguard Worker
2979*9880d681SAndroid Build Coastguard Workerdefm FMULX    : SIMDThreeSameVectorFP<0,0,0b011,"fmulx", int_aarch64_neon_fmulx>;
2980*9880d681SAndroid Build Coastguard Workerdefm FMUL     : SIMDThreeSameVectorFP<1,0,0b011,"fmul", fmul>;
2981*9880d681SAndroid Build Coastguard Workerdefm FRECPS   : SIMDThreeSameVectorFP<0,0,0b111,"frecps", int_aarch64_neon_frecps>;
2982*9880d681SAndroid Build Coastguard Workerdefm FRSQRTS  : SIMDThreeSameVectorFP<0,1,0b111,"frsqrts", int_aarch64_neon_frsqrts>;
2983*9880d681SAndroid Build Coastguard Workerdefm FSUB     : SIMDThreeSameVectorFP<0,1,0b010,"fsub", fsub>;
2984*9880d681SAndroid Build Coastguard Workerdefm MLA      : SIMDThreeSameVectorBHSTied<0, 0b10010, "mla",
2985*9880d681SAndroid Build Coastguard Worker                      TriOpFrag<(add node:$LHS, (mul node:$MHS, node:$RHS))> >;
2986*9880d681SAndroid Build Coastguard Workerdefm MLS      : SIMDThreeSameVectorBHSTied<1, 0b10010, "mls",
2987*9880d681SAndroid Build Coastguard Worker                      TriOpFrag<(sub node:$LHS, (mul node:$MHS, node:$RHS))> >;
2988*9880d681SAndroid Build Coastguard Workerdefm MUL      : SIMDThreeSameVectorBHS<0, 0b10011, "mul", mul>;
2989*9880d681SAndroid Build Coastguard Workerdefm PMUL     : SIMDThreeSameVectorB<1, 0b10011, "pmul", int_aarch64_neon_pmul>;
2990*9880d681SAndroid Build Coastguard Workerdefm SABA     : SIMDThreeSameVectorBHSTied<0, 0b01111, "saba",
2991*9880d681SAndroid Build Coastguard Worker      TriOpFrag<(add node:$LHS, (int_aarch64_neon_sabd node:$MHS, node:$RHS))> >;
2992*9880d681SAndroid Build Coastguard Workerdefm SABD     : SIMDThreeSameVectorBHS<0,0b01110,"sabd", int_aarch64_neon_sabd>;
2993*9880d681SAndroid Build Coastguard Workerdefm SHADD    : SIMDThreeSameVectorBHS<0,0b00000,"shadd", int_aarch64_neon_shadd>;
2994*9880d681SAndroid Build Coastguard Workerdefm SHSUB    : SIMDThreeSameVectorBHS<0,0b00100,"shsub", int_aarch64_neon_shsub>;
2995*9880d681SAndroid Build Coastguard Workerdefm SMAXP    : SIMDThreeSameVectorBHS<0,0b10100,"smaxp", int_aarch64_neon_smaxp>;
2996*9880d681SAndroid Build Coastguard Workerdefm SMAX     : SIMDThreeSameVectorBHS<0,0b01100,"smax", smax>;
2997*9880d681SAndroid Build Coastguard Workerdefm SMINP    : SIMDThreeSameVectorBHS<0,0b10101,"sminp", int_aarch64_neon_sminp>;
2998*9880d681SAndroid Build Coastguard Workerdefm SMIN     : SIMDThreeSameVectorBHS<0,0b01101,"smin", smin>;
2999*9880d681SAndroid Build Coastguard Workerdefm SQADD    : SIMDThreeSameVector<0,0b00001,"sqadd", int_aarch64_neon_sqadd>;
3000*9880d681SAndroid Build Coastguard Workerdefm SQDMULH  : SIMDThreeSameVectorHS<0,0b10110,"sqdmulh",int_aarch64_neon_sqdmulh>;
3001*9880d681SAndroid Build Coastguard Workerdefm SQRDMULH : SIMDThreeSameVectorHS<1,0b10110,"sqrdmulh",int_aarch64_neon_sqrdmulh>;
3002*9880d681SAndroid Build Coastguard Workerdefm SQRSHL   : SIMDThreeSameVector<0,0b01011,"sqrshl", int_aarch64_neon_sqrshl>;
3003*9880d681SAndroid Build Coastguard Workerdefm SQSHL    : SIMDThreeSameVector<0,0b01001,"sqshl", int_aarch64_neon_sqshl>;
3004*9880d681SAndroid Build Coastguard Workerdefm SQSUB    : SIMDThreeSameVector<0,0b00101,"sqsub", int_aarch64_neon_sqsub>;
3005*9880d681SAndroid Build Coastguard Workerdefm SRHADD   : SIMDThreeSameVectorBHS<0,0b00010,"srhadd",int_aarch64_neon_srhadd>;
3006*9880d681SAndroid Build Coastguard Workerdefm SRSHL    : SIMDThreeSameVector<0,0b01010,"srshl", int_aarch64_neon_srshl>;
3007*9880d681SAndroid Build Coastguard Workerdefm SSHL     : SIMDThreeSameVector<0,0b01000,"sshl", int_aarch64_neon_sshl>;
3008*9880d681SAndroid Build Coastguard Workerdefm SUB      : SIMDThreeSameVector<1,0b10000,"sub", sub>;
3009*9880d681SAndroid Build Coastguard Workerdefm UABA     : SIMDThreeSameVectorBHSTied<1, 0b01111, "uaba",
3010*9880d681SAndroid Build Coastguard Worker      TriOpFrag<(add node:$LHS, (int_aarch64_neon_uabd node:$MHS, node:$RHS))> >;
3011*9880d681SAndroid Build Coastguard Workerdefm UABD     : SIMDThreeSameVectorBHS<1,0b01110,"uabd", int_aarch64_neon_uabd>;
3012*9880d681SAndroid Build Coastguard Workerdefm UHADD    : SIMDThreeSameVectorBHS<1,0b00000,"uhadd", int_aarch64_neon_uhadd>;
3013*9880d681SAndroid Build Coastguard Workerdefm UHSUB    : SIMDThreeSameVectorBHS<1,0b00100,"uhsub", int_aarch64_neon_uhsub>;
3014*9880d681SAndroid Build Coastguard Workerdefm UMAXP    : SIMDThreeSameVectorBHS<1,0b10100,"umaxp", int_aarch64_neon_umaxp>;
3015*9880d681SAndroid Build Coastguard Workerdefm UMAX     : SIMDThreeSameVectorBHS<1,0b01100,"umax", umax>;
3016*9880d681SAndroid Build Coastguard Workerdefm UMINP    : SIMDThreeSameVectorBHS<1,0b10101,"uminp", int_aarch64_neon_uminp>;
3017*9880d681SAndroid Build Coastguard Workerdefm UMIN     : SIMDThreeSameVectorBHS<1,0b01101,"umin", umin>;
3018*9880d681SAndroid Build Coastguard Workerdefm UQADD    : SIMDThreeSameVector<1,0b00001,"uqadd", int_aarch64_neon_uqadd>;
3019*9880d681SAndroid Build Coastguard Workerdefm UQRSHL   : SIMDThreeSameVector<1,0b01011,"uqrshl", int_aarch64_neon_uqrshl>;
3020*9880d681SAndroid Build Coastguard Workerdefm UQSHL    : SIMDThreeSameVector<1,0b01001,"uqshl", int_aarch64_neon_uqshl>;
3021*9880d681SAndroid Build Coastguard Workerdefm UQSUB    : SIMDThreeSameVector<1,0b00101,"uqsub", int_aarch64_neon_uqsub>;
3022*9880d681SAndroid Build Coastguard Workerdefm URHADD   : SIMDThreeSameVectorBHS<1,0b00010,"urhadd", int_aarch64_neon_urhadd>;
3023*9880d681SAndroid Build Coastguard Workerdefm URSHL    : SIMDThreeSameVector<1,0b01010,"urshl", int_aarch64_neon_urshl>;
3024*9880d681SAndroid Build Coastguard Workerdefm USHL     : SIMDThreeSameVector<1,0b01000,"ushl", int_aarch64_neon_ushl>;
3025*9880d681SAndroid Build Coastguard Workerdefm SQRDMLAH : SIMDThreeSameVectorSQRDMLxHTiedHS<1,0b10000,"sqrdmlah",
3026*9880d681SAndroid Build Coastguard Worker                                                  int_aarch64_neon_sqadd>;
3027*9880d681SAndroid Build Coastguard Workerdefm SQRDMLSH : SIMDThreeSameVectorSQRDMLxHTiedHS<1,0b10001,"sqrdmlsh",
3028*9880d681SAndroid Build Coastguard Worker                                                    int_aarch64_neon_sqsub>;
3029*9880d681SAndroid Build Coastguard Worker
3030*9880d681SAndroid Build Coastguard Workerdefm AND : SIMDLogicalThreeVector<0, 0b00, "and", and>;
3031*9880d681SAndroid Build Coastguard Workerdefm BIC : SIMDLogicalThreeVector<0, 0b01, "bic",
3032*9880d681SAndroid Build Coastguard Worker                                  BinOpFrag<(and node:$LHS, (vnot node:$RHS))> >;
3033*9880d681SAndroid Build Coastguard Workerdefm BIF : SIMDLogicalThreeVector<1, 0b11, "bif">;
3034*9880d681SAndroid Build Coastguard Workerdefm BIT : SIMDLogicalThreeVectorTied<1, 0b10, "bit", AArch64bit>;
3035*9880d681SAndroid Build Coastguard Workerdefm BSL : SIMDLogicalThreeVectorTied<1, 0b01, "bsl",
3036*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(or (and node:$LHS, node:$MHS), (and (vnot node:$LHS), node:$RHS))>>;
3037*9880d681SAndroid Build Coastguard Workerdefm EOR : SIMDLogicalThreeVector<1, 0b00, "eor", xor>;
3038*9880d681SAndroid Build Coastguard Workerdefm ORN : SIMDLogicalThreeVector<0, 0b11, "orn",
3039*9880d681SAndroid Build Coastguard Worker                                  BinOpFrag<(or node:$LHS, (vnot node:$RHS))> >;
3040*9880d681SAndroid Build Coastguard Workerdefm ORR : SIMDLogicalThreeVector<0, 0b10, "orr", or>;
3041*9880d681SAndroid Build Coastguard Worker
3042*9880d681SAndroid Build Coastguard Worker
3043*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v8i8 V64:$Rd), V64:$Rn, V64:$Rm),
3044*9880d681SAndroid Build Coastguard Worker          (BSLv8i8 V64:$Rd, V64:$Rn, V64:$Rm)>;
3045*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v4i16 V64:$Rd), V64:$Rn, V64:$Rm),
3046*9880d681SAndroid Build Coastguard Worker          (BSLv8i8 V64:$Rd, V64:$Rn, V64:$Rm)>;
3047*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v2i32 V64:$Rd), V64:$Rn, V64:$Rm),
3048*9880d681SAndroid Build Coastguard Worker          (BSLv8i8 V64:$Rd, V64:$Rn, V64:$Rm)>;
3049*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v1i64 V64:$Rd), V64:$Rn, V64:$Rm),
3050*9880d681SAndroid Build Coastguard Worker          (BSLv8i8 V64:$Rd, V64:$Rn, V64:$Rm)>;
3051*9880d681SAndroid Build Coastguard Worker
3052*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v16i8 V128:$Rd), V128:$Rn, V128:$Rm),
3053*9880d681SAndroid Build Coastguard Worker          (BSLv16i8 V128:$Rd, V128:$Rn, V128:$Rm)>;
3054*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v8i16 V128:$Rd), V128:$Rn, V128:$Rm),
3055*9880d681SAndroid Build Coastguard Worker          (BSLv16i8 V128:$Rd, V128:$Rn, V128:$Rm)>;
3056*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v4i32 V128:$Rd), V128:$Rn, V128:$Rm),
3057*9880d681SAndroid Build Coastguard Worker          (BSLv16i8 V128:$Rd, V128:$Rn, V128:$Rm)>;
3058*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64bsl (v2i64 V128:$Rd), V128:$Rn, V128:$Rm),
3059*9880d681SAndroid Build Coastguard Worker          (BSLv16i8 V128:$Rd, V128:$Rn, V128:$Rm)>;
3060*9880d681SAndroid Build Coastguard Worker
3061*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.16b, $src.16b|.16b\t$dst, $src}",
3062*9880d681SAndroid Build Coastguard Worker                (ORRv16i8 V128:$dst, V128:$src, V128:$src), 1>;
3063*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.8h, $src.8h|.8h\t$dst, $src}",
3064*9880d681SAndroid Build Coastguard Worker                (ORRv16i8 V128:$dst, V128:$src, V128:$src), 0>;
3065*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.4s, $src.4s|.4s\t$dst, $src}",
3066*9880d681SAndroid Build Coastguard Worker                (ORRv16i8 V128:$dst, V128:$src, V128:$src), 0>;
3067*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.2d, $src.2d|.2d\t$dst, $src}",
3068*9880d681SAndroid Build Coastguard Worker                (ORRv16i8 V128:$dst, V128:$src, V128:$src), 0>;
3069*9880d681SAndroid Build Coastguard Worker
3070*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.8b, $src.8b|.8b\t$dst, $src}",
3071*9880d681SAndroid Build Coastguard Worker                (ORRv8i8 V64:$dst, V64:$src, V64:$src), 1>;
3072*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.4h, $src.4h|.4h\t$dst, $src}",
3073*9880d681SAndroid Build Coastguard Worker                (ORRv8i8 V64:$dst, V64:$src, V64:$src), 0>;
3074*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.2s, $src.2s|.2s\t$dst, $src}",
3075*9880d681SAndroid Build Coastguard Worker                (ORRv8i8 V64:$dst, V64:$src, V64:$src), 0>;
3076*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mov{\t$dst.1d, $src.1d|.1d\t$dst, $src}",
3077*9880d681SAndroid Build Coastguard Worker                (ORRv8i8 V64:$dst, V64:$src, V64:$src), 0>;
3078*9880d681SAndroid Build Coastguard Worker
3079*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.8b, $src1.8b, $src2.8b" #
3080*9880d681SAndroid Build Coastguard Worker                "|cmls.8b\t$dst, $src1, $src2}",
3081*9880d681SAndroid Build Coastguard Worker                (CMHSv8i8 V64:$dst, V64:$src2, V64:$src1), 0>;
3082*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.16b, $src1.16b, $src2.16b" #
3083*9880d681SAndroid Build Coastguard Worker                "|cmls.16b\t$dst, $src1, $src2}",
3084*9880d681SAndroid Build Coastguard Worker                (CMHSv16i8 V128:$dst, V128:$src2, V128:$src1), 0>;
3085*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.4h, $src1.4h, $src2.4h" #
3086*9880d681SAndroid Build Coastguard Worker                "|cmls.4h\t$dst, $src1, $src2}",
3087*9880d681SAndroid Build Coastguard Worker                (CMHSv4i16 V64:$dst, V64:$src2, V64:$src1), 0>;
3088*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.8h, $src1.8h, $src2.8h" #
3089*9880d681SAndroid Build Coastguard Worker                "|cmls.8h\t$dst, $src1, $src2}",
3090*9880d681SAndroid Build Coastguard Worker                (CMHSv8i16 V128:$dst, V128:$src2, V128:$src1), 0>;
3091*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.2s, $src1.2s, $src2.2s" #
3092*9880d681SAndroid Build Coastguard Worker                "|cmls.2s\t$dst, $src1, $src2}",
3093*9880d681SAndroid Build Coastguard Worker                (CMHSv2i32 V64:$dst, V64:$src2, V64:$src1), 0>;
3094*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.4s, $src1.4s, $src2.4s" #
3095*9880d681SAndroid Build Coastguard Worker                "|cmls.4s\t$dst, $src1, $src2}",
3096*9880d681SAndroid Build Coastguard Worker                (CMHSv4i32 V128:$dst, V128:$src2, V128:$src1), 0>;
3097*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmls\t$dst.2d, $src1.2d, $src2.2d" #
3098*9880d681SAndroid Build Coastguard Worker                "|cmls.2d\t$dst, $src1, $src2}",
3099*9880d681SAndroid Build Coastguard Worker                (CMHSv2i64 V128:$dst, V128:$src2, V128:$src1), 0>;
3100*9880d681SAndroid Build Coastguard Worker
3101*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.8b, $src1.8b, $src2.8b" #
3102*9880d681SAndroid Build Coastguard Worker                "|cmlo.8b\t$dst, $src1, $src2}",
3103*9880d681SAndroid Build Coastguard Worker                (CMHIv8i8 V64:$dst, V64:$src2, V64:$src1), 0>;
3104*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.16b, $src1.16b, $src2.16b" #
3105*9880d681SAndroid Build Coastguard Worker                "|cmlo.16b\t$dst, $src1, $src2}",
3106*9880d681SAndroid Build Coastguard Worker                (CMHIv16i8 V128:$dst, V128:$src2, V128:$src1), 0>;
3107*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.4h, $src1.4h, $src2.4h" #
3108*9880d681SAndroid Build Coastguard Worker                "|cmlo.4h\t$dst, $src1, $src2}",
3109*9880d681SAndroid Build Coastguard Worker                (CMHIv4i16 V64:$dst, V64:$src2, V64:$src1), 0>;
3110*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.8h, $src1.8h, $src2.8h" #
3111*9880d681SAndroid Build Coastguard Worker                "|cmlo.8h\t$dst, $src1, $src2}",
3112*9880d681SAndroid Build Coastguard Worker                (CMHIv8i16 V128:$dst, V128:$src2, V128:$src1), 0>;
3113*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.2s, $src1.2s, $src2.2s" #
3114*9880d681SAndroid Build Coastguard Worker                "|cmlo.2s\t$dst, $src1, $src2}",
3115*9880d681SAndroid Build Coastguard Worker                (CMHIv2i32 V64:$dst, V64:$src2, V64:$src1), 0>;
3116*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.4s, $src1.4s, $src2.4s" #
3117*9880d681SAndroid Build Coastguard Worker                "|cmlo.4s\t$dst, $src1, $src2}",
3118*9880d681SAndroid Build Coastguard Worker                (CMHIv4i32 V128:$dst, V128:$src2, V128:$src1), 0>;
3119*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlo\t$dst.2d, $src1.2d, $src2.2d" #
3120*9880d681SAndroid Build Coastguard Worker                "|cmlo.2d\t$dst, $src1, $src2}",
3121*9880d681SAndroid Build Coastguard Worker                (CMHIv2i64 V128:$dst, V128:$src2, V128:$src1), 0>;
3122*9880d681SAndroid Build Coastguard Worker
3123*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.8b, $src1.8b, $src2.8b" #
3124*9880d681SAndroid Build Coastguard Worker                "|cmle.8b\t$dst, $src1, $src2}",
3125*9880d681SAndroid Build Coastguard Worker                (CMGEv8i8 V64:$dst, V64:$src2, V64:$src1), 0>;
3126*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.16b, $src1.16b, $src2.16b" #
3127*9880d681SAndroid Build Coastguard Worker                "|cmle.16b\t$dst, $src1, $src2}",
3128*9880d681SAndroid Build Coastguard Worker                (CMGEv16i8 V128:$dst, V128:$src2, V128:$src1), 0>;
3129*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.4h, $src1.4h, $src2.4h" #
3130*9880d681SAndroid Build Coastguard Worker                "|cmle.4h\t$dst, $src1, $src2}",
3131*9880d681SAndroid Build Coastguard Worker                (CMGEv4i16 V64:$dst, V64:$src2, V64:$src1), 0>;
3132*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.8h, $src1.8h, $src2.8h" #
3133*9880d681SAndroid Build Coastguard Worker                "|cmle.8h\t$dst, $src1, $src2}",
3134*9880d681SAndroid Build Coastguard Worker                (CMGEv8i16 V128:$dst, V128:$src2, V128:$src1), 0>;
3135*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.2s, $src1.2s, $src2.2s" #
3136*9880d681SAndroid Build Coastguard Worker                "|cmle.2s\t$dst, $src1, $src2}",
3137*9880d681SAndroid Build Coastguard Worker                (CMGEv2i32 V64:$dst, V64:$src2, V64:$src1), 0>;
3138*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.4s, $src1.4s, $src2.4s" #
3139*9880d681SAndroid Build Coastguard Worker                "|cmle.4s\t$dst, $src1, $src2}",
3140*9880d681SAndroid Build Coastguard Worker                (CMGEv4i32 V128:$dst, V128:$src2, V128:$src1), 0>;
3141*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmle\t$dst.2d, $src1.2d, $src2.2d" #
3142*9880d681SAndroid Build Coastguard Worker                "|cmle.2d\t$dst, $src1, $src2}",
3143*9880d681SAndroid Build Coastguard Worker                (CMGEv2i64 V128:$dst, V128:$src2, V128:$src1), 0>;
3144*9880d681SAndroid Build Coastguard Worker
3145*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.8b, $src1.8b, $src2.8b" #
3146*9880d681SAndroid Build Coastguard Worker                "|cmlt.8b\t$dst, $src1, $src2}",
3147*9880d681SAndroid Build Coastguard Worker                (CMGTv8i8 V64:$dst, V64:$src2, V64:$src1), 0>;
3148*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.16b, $src1.16b, $src2.16b" #
3149*9880d681SAndroid Build Coastguard Worker                "|cmlt.16b\t$dst, $src1, $src2}",
3150*9880d681SAndroid Build Coastguard Worker                (CMGTv16i8 V128:$dst, V128:$src2, V128:$src1), 0>;
3151*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.4h, $src1.4h, $src2.4h" #
3152*9880d681SAndroid Build Coastguard Worker                "|cmlt.4h\t$dst, $src1, $src2}",
3153*9880d681SAndroid Build Coastguard Worker                (CMGTv4i16 V64:$dst, V64:$src2, V64:$src1), 0>;
3154*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.8h, $src1.8h, $src2.8h" #
3155*9880d681SAndroid Build Coastguard Worker                "|cmlt.8h\t$dst, $src1, $src2}",
3156*9880d681SAndroid Build Coastguard Worker                (CMGTv8i16 V128:$dst, V128:$src2, V128:$src1), 0>;
3157*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.2s, $src1.2s, $src2.2s" #
3158*9880d681SAndroid Build Coastguard Worker                "|cmlt.2s\t$dst, $src1, $src2}",
3159*9880d681SAndroid Build Coastguard Worker                (CMGTv2i32 V64:$dst, V64:$src2, V64:$src1), 0>;
3160*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.4s, $src1.4s, $src2.4s" #
3161*9880d681SAndroid Build Coastguard Worker                "|cmlt.4s\t$dst, $src1, $src2}",
3162*9880d681SAndroid Build Coastguard Worker                (CMGTv4i32 V128:$dst, V128:$src2, V128:$src1), 0>;
3163*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{cmlt\t$dst.2d, $src1.2d, $src2.2d" #
3164*9880d681SAndroid Build Coastguard Worker                "|cmlt.2d\t$dst, $src1, $src2}",
3165*9880d681SAndroid Build Coastguard Worker                (CMGTv2i64 V128:$dst, V128:$src2, V128:$src1), 0>;
3166*9880d681SAndroid Build Coastguard Worker
3167*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasNEON, HasFullFP16] in {
3168*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmle\t$dst.4h, $src1.4h, $src2.4h" #
3169*9880d681SAndroid Build Coastguard Worker                "|fcmle.4h\t$dst, $src1, $src2}",
3170*9880d681SAndroid Build Coastguard Worker                (FCMGEv4f16 V64:$dst, V64:$src2, V64:$src1), 0>;
3171*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmle\t$dst.8h, $src1.8h, $src2.8h" #
3172*9880d681SAndroid Build Coastguard Worker                "|fcmle.8h\t$dst, $src1, $src2}",
3173*9880d681SAndroid Build Coastguard Worker                (FCMGEv8f16 V128:$dst, V128:$src2, V128:$src1), 0>;
3174*9880d681SAndroid Build Coastguard Worker}
3175*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmle\t$dst.2s, $src1.2s, $src2.2s" #
3176*9880d681SAndroid Build Coastguard Worker                "|fcmle.2s\t$dst, $src1, $src2}",
3177*9880d681SAndroid Build Coastguard Worker                (FCMGEv2f32 V64:$dst, V64:$src2, V64:$src1), 0>;
3178*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmle\t$dst.4s, $src1.4s, $src2.4s" #
3179*9880d681SAndroid Build Coastguard Worker                "|fcmle.4s\t$dst, $src1, $src2}",
3180*9880d681SAndroid Build Coastguard Worker                (FCMGEv4f32 V128:$dst, V128:$src2, V128:$src1), 0>;
3181*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmle\t$dst.2d, $src1.2d, $src2.2d" #
3182*9880d681SAndroid Build Coastguard Worker                "|fcmle.2d\t$dst, $src1, $src2}",
3183*9880d681SAndroid Build Coastguard Worker                (FCMGEv2f64 V128:$dst, V128:$src2, V128:$src1), 0>;
3184*9880d681SAndroid Build Coastguard Worker
3185*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasNEON, HasFullFP16] in {
3186*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmlt\t$dst.4h, $src1.4h, $src2.4h" #
3187*9880d681SAndroid Build Coastguard Worker                "|fcmlt.4h\t$dst, $src1, $src2}",
3188*9880d681SAndroid Build Coastguard Worker                (FCMGTv4f16 V64:$dst, V64:$src2, V64:$src1), 0>;
3189*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmlt\t$dst.8h, $src1.8h, $src2.8h" #
3190*9880d681SAndroid Build Coastguard Worker                "|fcmlt.8h\t$dst, $src1, $src2}",
3191*9880d681SAndroid Build Coastguard Worker                (FCMGTv8f16 V128:$dst, V128:$src2, V128:$src1), 0>;
3192*9880d681SAndroid Build Coastguard Worker}
3193*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmlt\t$dst.2s, $src1.2s, $src2.2s" #
3194*9880d681SAndroid Build Coastguard Worker                "|fcmlt.2s\t$dst, $src1, $src2}",
3195*9880d681SAndroid Build Coastguard Worker                (FCMGTv2f32 V64:$dst, V64:$src2, V64:$src1), 0>;
3196*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmlt\t$dst.4s, $src1.4s, $src2.4s" #
3197*9880d681SAndroid Build Coastguard Worker                "|fcmlt.4s\t$dst, $src1, $src2}",
3198*9880d681SAndroid Build Coastguard Worker                (FCMGTv4f32 V128:$dst, V128:$src2, V128:$src1), 0>;
3199*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{fcmlt\t$dst.2d, $src1.2d, $src2.2d" #
3200*9880d681SAndroid Build Coastguard Worker                "|fcmlt.2d\t$dst, $src1, $src2}",
3201*9880d681SAndroid Build Coastguard Worker                (FCMGTv2f64 V128:$dst, V128:$src2, V128:$src1), 0>;
3202*9880d681SAndroid Build Coastguard Worker
3203*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasNEON, HasFullFP16] in {
3204*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{facle\t$dst.4h, $src1.4h, $src2.4h" #
3205*9880d681SAndroid Build Coastguard Worker                "|facle.4h\t$dst, $src1, $src2}",
3206*9880d681SAndroid Build Coastguard Worker                (FACGEv4f16 V64:$dst, V64:$src2, V64:$src1), 0>;
3207*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{facle\t$dst.8h, $src1.8h, $src2.8h" #
3208*9880d681SAndroid Build Coastguard Worker                "|facle.8h\t$dst, $src1, $src2}",
3209*9880d681SAndroid Build Coastguard Worker                (FACGEv8f16 V128:$dst, V128:$src2, V128:$src1), 0>;
3210*9880d681SAndroid Build Coastguard Worker}
3211*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{facle\t$dst.2s, $src1.2s, $src2.2s" #
3212*9880d681SAndroid Build Coastguard Worker                "|facle.2s\t$dst, $src1, $src2}",
3213*9880d681SAndroid Build Coastguard Worker                (FACGEv2f32 V64:$dst, V64:$src2, V64:$src1), 0>;
3214*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{facle\t$dst.4s, $src1.4s, $src2.4s" #
3215*9880d681SAndroid Build Coastguard Worker                "|facle.4s\t$dst, $src1, $src2}",
3216*9880d681SAndroid Build Coastguard Worker                (FACGEv4f32 V128:$dst, V128:$src2, V128:$src1), 0>;
3217*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{facle\t$dst.2d, $src1.2d, $src2.2d" #
3218*9880d681SAndroid Build Coastguard Worker                "|facle.2d\t$dst, $src1, $src2}",
3219*9880d681SAndroid Build Coastguard Worker                (FACGEv2f64 V128:$dst, V128:$src2, V128:$src1), 0>;
3220*9880d681SAndroid Build Coastguard Worker
3221*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasNEON, HasFullFP16] in {
3222*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{faclt\t$dst.4h, $src1.4h, $src2.4h" #
3223*9880d681SAndroid Build Coastguard Worker                "|faclt.4h\t$dst, $src1, $src2}",
3224*9880d681SAndroid Build Coastguard Worker                (FACGTv4f16 V64:$dst, V64:$src2, V64:$src1), 0>;
3225*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{faclt\t$dst.8h, $src1.8h, $src2.8h" #
3226*9880d681SAndroid Build Coastguard Worker                "|faclt.8h\t$dst, $src1, $src2}",
3227*9880d681SAndroid Build Coastguard Worker                (FACGTv8f16 V128:$dst, V128:$src2, V128:$src1), 0>;
3228*9880d681SAndroid Build Coastguard Worker}
3229*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{faclt\t$dst.2s, $src1.2s, $src2.2s" #
3230*9880d681SAndroid Build Coastguard Worker                "|faclt.2s\t$dst, $src1, $src2}",
3231*9880d681SAndroid Build Coastguard Worker                (FACGTv2f32 V64:$dst, V64:$src2, V64:$src1), 0>;
3232*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{faclt\t$dst.4s, $src1.4s, $src2.4s" #
3233*9880d681SAndroid Build Coastguard Worker                "|faclt.4s\t$dst, $src1, $src2}",
3234*9880d681SAndroid Build Coastguard Worker                (FACGTv4f32 V128:$dst, V128:$src2, V128:$src1), 0>;
3235*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"{faclt\t$dst.2d, $src1.2d, $src2.2d" #
3236*9880d681SAndroid Build Coastguard Worker                "|faclt.2d\t$dst, $src1, $src2}",
3237*9880d681SAndroid Build Coastguard Worker                (FACGTv2f64 V128:$dst, V128:$src2, V128:$src1), 0>;
3238*9880d681SAndroid Build Coastguard Worker
3239*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
3240*9880d681SAndroid Build Coastguard Worker// Advanced SIMD three scalar instructions.
3241*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
3242*9880d681SAndroid Build Coastguard Worker
3243*9880d681SAndroid Build Coastguard Workerdefm ADD      : SIMDThreeScalarD<0, 0b10000, "add", add>;
3244*9880d681SAndroid Build Coastguard Workerdefm CMEQ     : SIMDThreeScalarD<1, 0b10001, "cmeq", AArch64cmeq>;
3245*9880d681SAndroid Build Coastguard Workerdefm CMGE     : SIMDThreeScalarD<0, 0b00111, "cmge", AArch64cmge>;
3246*9880d681SAndroid Build Coastguard Workerdefm CMGT     : SIMDThreeScalarD<0, 0b00110, "cmgt", AArch64cmgt>;
3247*9880d681SAndroid Build Coastguard Workerdefm CMHI     : SIMDThreeScalarD<1, 0b00110, "cmhi", AArch64cmhi>;
3248*9880d681SAndroid Build Coastguard Workerdefm CMHS     : SIMDThreeScalarD<1, 0b00111, "cmhs", AArch64cmhs>;
3249*9880d681SAndroid Build Coastguard Workerdefm CMTST    : SIMDThreeScalarD<0, 0b10001, "cmtst", AArch64cmtst>;
3250*9880d681SAndroid Build Coastguard Workerdefm FABD     : SIMDFPThreeScalar<1, 1, 0b010, "fabd", int_aarch64_sisd_fabd>;
3251*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (int_aarch64_neon_fabd (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))),
3252*9880d681SAndroid Build Coastguard Worker          (FABD64 FPR64:$Rn, FPR64:$Rm)>;
3253*9880d681SAndroid Build Coastguard Workerdefm FACGE    : SIMDThreeScalarFPCmp<1, 0, 0b101, "facge",
3254*9880d681SAndroid Build Coastguard Worker                                     int_aarch64_neon_facge>;
3255*9880d681SAndroid Build Coastguard Workerdefm FACGT    : SIMDThreeScalarFPCmp<1, 1, 0b101, "facgt",
3256*9880d681SAndroid Build Coastguard Worker                                     int_aarch64_neon_facgt>;
3257*9880d681SAndroid Build Coastguard Workerdefm FCMEQ    : SIMDThreeScalarFPCmp<0, 0, 0b100, "fcmeq", AArch64fcmeq>;
3258*9880d681SAndroid Build Coastguard Workerdefm FCMGE    : SIMDThreeScalarFPCmp<1, 0, 0b100, "fcmge", AArch64fcmge>;
3259*9880d681SAndroid Build Coastguard Workerdefm FCMGT    : SIMDThreeScalarFPCmp<1, 1, 0b100, "fcmgt", AArch64fcmgt>;
3260*9880d681SAndroid Build Coastguard Workerdefm FMULX    : SIMDFPThreeScalar<0, 0, 0b011, "fmulx", int_aarch64_neon_fmulx>;
3261*9880d681SAndroid Build Coastguard Workerdefm FRECPS   : SIMDFPThreeScalar<0, 0, 0b111, "frecps", int_aarch64_neon_frecps>;
3262*9880d681SAndroid Build Coastguard Workerdefm FRSQRTS  : SIMDFPThreeScalar<0, 1, 0b111, "frsqrts", int_aarch64_neon_frsqrts>;
3263*9880d681SAndroid Build Coastguard Workerdefm SQADD    : SIMDThreeScalarBHSD<0, 0b00001, "sqadd", int_aarch64_neon_sqadd>;
3264*9880d681SAndroid Build Coastguard Workerdefm SQDMULH  : SIMDThreeScalarHS<  0, 0b10110, "sqdmulh", int_aarch64_neon_sqdmulh>;
3265*9880d681SAndroid Build Coastguard Workerdefm SQRDMULH : SIMDThreeScalarHS<  1, 0b10110, "sqrdmulh", int_aarch64_neon_sqrdmulh>;
3266*9880d681SAndroid Build Coastguard Workerdefm SQRSHL   : SIMDThreeScalarBHSD<0, 0b01011, "sqrshl",int_aarch64_neon_sqrshl>;
3267*9880d681SAndroid Build Coastguard Workerdefm SQSHL    : SIMDThreeScalarBHSD<0, 0b01001, "sqshl", int_aarch64_neon_sqshl>;
3268*9880d681SAndroid Build Coastguard Workerdefm SQSUB    : SIMDThreeScalarBHSD<0, 0b00101, "sqsub", int_aarch64_neon_sqsub>;
3269*9880d681SAndroid Build Coastguard Workerdefm SRSHL    : SIMDThreeScalarD<   0, 0b01010, "srshl", int_aarch64_neon_srshl>;
3270*9880d681SAndroid Build Coastguard Workerdefm SSHL     : SIMDThreeScalarD<   0, 0b01000, "sshl", int_aarch64_neon_sshl>;
3271*9880d681SAndroid Build Coastguard Workerdefm SUB      : SIMDThreeScalarD<   1, 0b10000, "sub", sub>;
3272*9880d681SAndroid Build Coastguard Workerdefm UQADD    : SIMDThreeScalarBHSD<1, 0b00001, "uqadd", int_aarch64_neon_uqadd>;
3273*9880d681SAndroid Build Coastguard Workerdefm UQRSHL   : SIMDThreeScalarBHSD<1, 0b01011, "uqrshl",int_aarch64_neon_uqrshl>;
3274*9880d681SAndroid Build Coastguard Workerdefm UQSHL    : SIMDThreeScalarBHSD<1, 0b01001, "uqshl", int_aarch64_neon_uqshl>;
3275*9880d681SAndroid Build Coastguard Workerdefm UQSUB    : SIMDThreeScalarBHSD<1, 0b00101, "uqsub", int_aarch64_neon_uqsub>;
3276*9880d681SAndroid Build Coastguard Workerdefm URSHL    : SIMDThreeScalarD<   1, 0b01010, "urshl", int_aarch64_neon_urshl>;
3277*9880d681SAndroid Build Coastguard Workerdefm USHL     : SIMDThreeScalarD<   1, 0b01000, "ushl", int_aarch64_neon_ushl>;
3278*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasV8_1a] in {
3279*9880d681SAndroid Build Coastguard Worker  defm SQRDMLAH : SIMDThreeScalarHSTied<1, 0, 0b10000, "sqrdmlah">;
3280*9880d681SAndroid Build Coastguard Worker  defm SQRDMLSH : SIMDThreeScalarHSTied<1, 0, 0b10001, "sqrdmlsh">;
3281*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (int_aarch64_neon_sqadd
3282*9880d681SAndroid Build Coastguard Worker                   (i32 FPR32:$Rd),
3283*9880d681SAndroid Build Coastguard Worker                   (i32 (int_aarch64_neon_sqrdmulh (i32 FPR32:$Rn),
3284*9880d681SAndroid Build Coastguard Worker                                                   (i32 FPR32:$Rm))))),
3285*9880d681SAndroid Build Coastguard Worker            (SQRDMLAHv1i32 FPR32:$Rd, FPR32:$Rn, FPR32:$Rm)>;
3286*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (int_aarch64_neon_sqsub
3287*9880d681SAndroid Build Coastguard Worker                   (i32 FPR32:$Rd),
3288*9880d681SAndroid Build Coastguard Worker                   (i32 (int_aarch64_neon_sqrdmulh (i32 FPR32:$Rn),
3289*9880d681SAndroid Build Coastguard Worker                                                   (i32 FPR32:$Rm))))),
3290*9880d681SAndroid Build Coastguard Worker            (SQRDMLSHv1i32 FPR32:$Rd, FPR32:$Rn, FPR32:$Rm)>;
3291*9880d681SAndroid Build Coastguard Worker}
3292*9880d681SAndroid Build Coastguard Worker
3293*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmls $dst, $src1, $src2",
3294*9880d681SAndroid Build Coastguard Worker                (CMHSv1i64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>;
3295*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmle $dst, $src1, $src2",
3296*9880d681SAndroid Build Coastguard Worker                (CMGEv1i64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>;
3297*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmlo $dst, $src1, $src2",
3298*9880d681SAndroid Build Coastguard Worker                (CMHIv1i64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>;
3299*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmlt $dst, $src1, $src2",
3300*9880d681SAndroid Build Coastguard Worker                (CMGTv1i64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>;
3301*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"fcmle $dst, $src1, $src2",
3302*9880d681SAndroid Build Coastguard Worker                (FCMGE32 FPR32:$dst, FPR32:$src2, FPR32:$src1), 0>;
3303*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"fcmle $dst, $src1, $src2",
3304*9880d681SAndroid Build Coastguard Worker                (FCMGE64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>;
3305*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"fcmlt $dst, $src1, $src2",
3306*9880d681SAndroid Build Coastguard Worker                (FCMGT32 FPR32:$dst, FPR32:$src2, FPR32:$src1), 0>;
3307*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"fcmlt $dst, $src1, $src2",
3308*9880d681SAndroid Build Coastguard Worker                (FCMGT64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>;
3309*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"facle $dst, $src1, $src2",
3310*9880d681SAndroid Build Coastguard Worker                (FACGE32 FPR32:$dst, FPR32:$src2, FPR32:$src1), 0>;
3311*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"facle $dst, $src1, $src2",
3312*9880d681SAndroid Build Coastguard Worker                (FACGE64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>;
3313*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"faclt $dst, $src1, $src2",
3314*9880d681SAndroid Build Coastguard Worker                (FACGT32 FPR32:$dst, FPR32:$src2, FPR32:$src1), 0>;
3315*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"faclt $dst, $src1, $src2",
3316*9880d681SAndroid Build Coastguard Worker                (FACGT64 FPR64:$dst, FPR64:$src2, FPR64:$src1), 0>;
3317*9880d681SAndroid Build Coastguard Worker
3318*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
3319*9880d681SAndroid Build Coastguard Worker// Advanced SIMD three scalar instructions (mixed operands).
3320*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
3321*9880d681SAndroid Build Coastguard Workerdefm SQDMULL  : SIMDThreeScalarMixedHS<0, 0b11010, "sqdmull",
3322*9880d681SAndroid Build Coastguard Worker                                       int_aarch64_neon_sqdmulls_scalar>;
3323*9880d681SAndroid Build Coastguard Workerdefm SQDMLAL  : SIMDThreeScalarMixedTiedHS<0, 0b10010, "sqdmlal">;
3324*9880d681SAndroid Build Coastguard Workerdefm SQDMLSL  : SIMDThreeScalarMixedTiedHS<0, 0b10110, "sqdmlsl">;
3325*9880d681SAndroid Build Coastguard Worker
3326*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_sqadd (i64 FPR64:$Rd),
3327*9880d681SAndroid Build Coastguard Worker                   (i64 (int_aarch64_neon_sqdmulls_scalar (i32 FPR32:$Rn),
3328*9880d681SAndroid Build Coastguard Worker                                                        (i32 FPR32:$Rm))))),
3329*9880d681SAndroid Build Coastguard Worker          (SQDMLALi32 FPR64:$Rd, FPR32:$Rn, FPR32:$Rm)>;
3330*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_sqsub (i64 FPR64:$Rd),
3331*9880d681SAndroid Build Coastguard Worker                   (i64 (int_aarch64_neon_sqdmulls_scalar (i32 FPR32:$Rn),
3332*9880d681SAndroid Build Coastguard Worker                                                        (i32 FPR32:$Rm))))),
3333*9880d681SAndroid Build Coastguard Worker          (SQDMLSLi32 FPR64:$Rd, FPR32:$Rn, FPR32:$Rm)>;
3334*9880d681SAndroid Build Coastguard Worker
3335*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
3336*9880d681SAndroid Build Coastguard Worker// Advanced SIMD two scalar instructions.
3337*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
3338*9880d681SAndroid Build Coastguard Worker
3339*9880d681SAndroid Build Coastguard Workerdefm ABS    : SIMDTwoScalarD<    0, 0b01011, "abs", int_aarch64_neon_abs>;
3340*9880d681SAndroid Build Coastguard Workerdefm CMEQ   : SIMDCmpTwoScalarD< 0, 0b01001, "cmeq", AArch64cmeqz>;
3341*9880d681SAndroid Build Coastguard Workerdefm CMGE   : SIMDCmpTwoScalarD< 1, 0b01000, "cmge", AArch64cmgez>;
3342*9880d681SAndroid Build Coastguard Workerdefm CMGT   : SIMDCmpTwoScalarD< 0, 0b01000, "cmgt", AArch64cmgtz>;
3343*9880d681SAndroid Build Coastguard Workerdefm CMLE   : SIMDCmpTwoScalarD< 1, 0b01001, "cmle", AArch64cmlez>;
3344*9880d681SAndroid Build Coastguard Workerdefm CMLT   : SIMDCmpTwoScalarD< 0, 0b01010, "cmlt", AArch64cmltz>;
3345*9880d681SAndroid Build Coastguard Workerdefm FCMEQ  : SIMDFPCmpTwoScalar<0, 1, 0b01101, "fcmeq", AArch64fcmeqz>;
3346*9880d681SAndroid Build Coastguard Workerdefm FCMGE  : SIMDFPCmpTwoScalar<1, 1, 0b01100, "fcmge", AArch64fcmgez>;
3347*9880d681SAndroid Build Coastguard Workerdefm FCMGT  : SIMDFPCmpTwoScalar<0, 1, 0b01100, "fcmgt", AArch64fcmgtz>;
3348*9880d681SAndroid Build Coastguard Workerdefm FCMLE  : SIMDFPCmpTwoScalar<1, 1, 0b01101, "fcmle", AArch64fcmlez>;
3349*9880d681SAndroid Build Coastguard Workerdefm FCMLT  : SIMDFPCmpTwoScalar<0, 1, 0b01110, "fcmlt", AArch64fcmltz>;
3350*9880d681SAndroid Build Coastguard Workerdefm FCVTAS : SIMDFPTwoScalar<   0, 0, 0b11100, "fcvtas">;
3351*9880d681SAndroid Build Coastguard Workerdefm FCVTAU : SIMDFPTwoScalar<   1, 0, 0b11100, "fcvtau">;
3352*9880d681SAndroid Build Coastguard Workerdefm FCVTMS : SIMDFPTwoScalar<   0, 0, 0b11011, "fcvtms">;
3353*9880d681SAndroid Build Coastguard Workerdefm FCVTMU : SIMDFPTwoScalar<   1, 0, 0b11011, "fcvtmu">;
3354*9880d681SAndroid Build Coastguard Workerdefm FCVTNS : SIMDFPTwoScalar<   0, 0, 0b11010, "fcvtns">;
3355*9880d681SAndroid Build Coastguard Workerdefm FCVTNU : SIMDFPTwoScalar<   1, 0, 0b11010, "fcvtnu">;
3356*9880d681SAndroid Build Coastguard Workerdefm FCVTPS : SIMDFPTwoScalar<   0, 1, 0b11010, "fcvtps">;
3357*9880d681SAndroid Build Coastguard Workerdefm FCVTPU : SIMDFPTwoScalar<   1, 1, 0b11010, "fcvtpu">;
3358*9880d681SAndroid Build Coastguard Workerdef  FCVTXNv1i64 : SIMDInexactCvtTwoScalar<0b10110, "fcvtxn">;
3359*9880d681SAndroid Build Coastguard Workerdefm FCVTZS : SIMDFPTwoScalar<   0, 1, 0b11011, "fcvtzs">;
3360*9880d681SAndroid Build Coastguard Workerdefm FCVTZU : SIMDFPTwoScalar<   1, 1, 0b11011, "fcvtzu">;
3361*9880d681SAndroid Build Coastguard Workerdefm FRECPE : SIMDFPTwoScalar<   0, 1, 0b11101, "frecpe">;
3362*9880d681SAndroid Build Coastguard Workerdefm FRECPX : SIMDFPTwoScalar<   0, 1, 0b11111, "frecpx">;
3363*9880d681SAndroid Build Coastguard Workerdefm FRSQRTE : SIMDFPTwoScalar<  1, 1, 0b11101, "frsqrte">;
3364*9880d681SAndroid Build Coastguard Workerdefm NEG    : SIMDTwoScalarD<    1, 0b01011, "neg",
3365*9880d681SAndroid Build Coastguard Worker                                 UnOpFrag<(sub immAllZerosV, node:$LHS)> >;
3366*9880d681SAndroid Build Coastguard Workerdefm SCVTF  : SIMDFPTwoScalarCVT<   0, 0, 0b11101, "scvtf", AArch64sitof>;
3367*9880d681SAndroid Build Coastguard Workerdefm SQABS  : SIMDTwoScalarBHSD< 0, 0b00111, "sqabs", int_aarch64_neon_sqabs>;
3368*9880d681SAndroid Build Coastguard Workerdefm SQNEG  : SIMDTwoScalarBHSD< 1, 0b00111, "sqneg", int_aarch64_neon_sqneg>;
3369*9880d681SAndroid Build Coastguard Workerdefm SQXTN  : SIMDTwoScalarMixedBHS< 0, 0b10100, "sqxtn", int_aarch64_neon_scalar_sqxtn>;
3370*9880d681SAndroid Build Coastguard Workerdefm SQXTUN : SIMDTwoScalarMixedBHS< 1, 0b10010, "sqxtun", int_aarch64_neon_scalar_sqxtun>;
3371*9880d681SAndroid Build Coastguard Workerdefm SUQADD : SIMDTwoScalarBHSDTied< 0, 0b00011, "suqadd",
3372*9880d681SAndroid Build Coastguard Worker                                     int_aarch64_neon_suqadd>;
3373*9880d681SAndroid Build Coastguard Workerdefm UCVTF  : SIMDFPTwoScalarCVT<   1, 0, 0b11101, "ucvtf", AArch64uitof>;
3374*9880d681SAndroid Build Coastguard Workerdefm UQXTN  : SIMDTwoScalarMixedBHS<1, 0b10100, "uqxtn", int_aarch64_neon_scalar_uqxtn>;
3375*9880d681SAndroid Build Coastguard Workerdefm USQADD : SIMDTwoScalarBHSDTied< 1, 0b00011, "usqadd",
3376*9880d681SAndroid Build Coastguard Worker                                    int_aarch64_neon_usqadd>;
3377*9880d681SAndroid Build Coastguard Worker
3378*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64neg (v1i64 V64:$Rn)), (NEGv1i64 V64:$Rn)>;
3379*9880d681SAndroid Build Coastguard Worker
3380*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtas (v1f64 FPR64:$Rn))),
3381*9880d681SAndroid Build Coastguard Worker          (FCVTASv1i64 FPR64:$Rn)>;
3382*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtau (v1f64 FPR64:$Rn))),
3383*9880d681SAndroid Build Coastguard Worker          (FCVTAUv1i64 FPR64:$Rn)>;
3384*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtms (v1f64 FPR64:$Rn))),
3385*9880d681SAndroid Build Coastguard Worker          (FCVTMSv1i64 FPR64:$Rn)>;
3386*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtmu (v1f64 FPR64:$Rn))),
3387*9880d681SAndroid Build Coastguard Worker          (FCVTMUv1i64 FPR64:$Rn)>;
3388*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtns (v1f64 FPR64:$Rn))),
3389*9880d681SAndroid Build Coastguard Worker          (FCVTNSv1i64 FPR64:$Rn)>;
3390*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtnu (v1f64 FPR64:$Rn))),
3391*9880d681SAndroid Build Coastguard Worker          (FCVTNUv1i64 FPR64:$Rn)>;
3392*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtps (v1f64 FPR64:$Rn))),
3393*9880d681SAndroid Build Coastguard Worker          (FCVTPSv1i64 FPR64:$Rn)>;
3394*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_fcvtpu (v1f64 FPR64:$Rn))),
3395*9880d681SAndroid Build Coastguard Worker          (FCVTPUv1i64 FPR64:$Rn)>;
3396*9880d681SAndroid Build Coastguard Worker
3397*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_frecpe (f32 FPR32:$Rn))),
3398*9880d681SAndroid Build Coastguard Worker          (FRECPEv1i32 FPR32:$Rn)>;
3399*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_frecpe (f64 FPR64:$Rn))),
3400*9880d681SAndroid Build Coastguard Worker          (FRECPEv1i64 FPR64:$Rn)>;
3401*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (int_aarch64_neon_frecpe (v1f64 FPR64:$Rn))),
3402*9880d681SAndroid Build Coastguard Worker          (FRECPEv1i64 FPR64:$Rn)>;
3403*9880d681SAndroid Build Coastguard Worker
3404*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (AArch64frecpe (f32 FPR32:$Rn))),
3405*9880d681SAndroid Build Coastguard Worker          (FRECPEv1i32 FPR32:$Rn)>;
3406*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64frecpe (v2f32 V64:$Rn))),
3407*9880d681SAndroid Build Coastguard Worker          (FRECPEv2f32 V64:$Rn)>;
3408*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64frecpe (v4f32 FPR128:$Rn))),
3409*9880d681SAndroid Build Coastguard Worker          (FRECPEv4f32 FPR128:$Rn)>;
3410*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (AArch64frecpe (f64 FPR64:$Rn))),
3411*9880d681SAndroid Build Coastguard Worker          (FRECPEv1i64 FPR64:$Rn)>;
3412*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (AArch64frecpe (v1f64 FPR64:$Rn))),
3413*9880d681SAndroid Build Coastguard Worker          (FRECPEv1i64 FPR64:$Rn)>;
3414*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64frecpe (v2f64 FPR128:$Rn))),
3415*9880d681SAndroid Build Coastguard Worker          (FRECPEv2f64 FPR128:$Rn)>;
3416*9880d681SAndroid Build Coastguard Worker
3417*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_frecpx (f32 FPR32:$Rn))),
3418*9880d681SAndroid Build Coastguard Worker          (FRECPXv1i32 FPR32:$Rn)>;
3419*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_frecpx (f64 FPR64:$Rn))),
3420*9880d681SAndroid Build Coastguard Worker          (FRECPXv1i64 FPR64:$Rn)>;
3421*9880d681SAndroid Build Coastguard Worker
3422*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_frsqrte (f32 FPR32:$Rn))),
3423*9880d681SAndroid Build Coastguard Worker          (FRSQRTEv1i32 FPR32:$Rn)>;
3424*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_frsqrte (f64 FPR64:$Rn))),
3425*9880d681SAndroid Build Coastguard Worker          (FRSQRTEv1i64 FPR64:$Rn)>;
3426*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (int_aarch64_neon_frsqrte (v1f64 FPR64:$Rn))),
3427*9880d681SAndroid Build Coastguard Worker          (FRSQRTEv1i64 FPR64:$Rn)>;
3428*9880d681SAndroid Build Coastguard Worker
3429*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (AArch64frsqrte (f32 FPR32:$Rn))),
3430*9880d681SAndroid Build Coastguard Worker          (FRSQRTEv1i32 FPR32:$Rn)>;
3431*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64frsqrte (v2f32 V64:$Rn))),
3432*9880d681SAndroid Build Coastguard Worker          (FRSQRTEv2f32 V64:$Rn)>;
3433*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64frsqrte (v4f32 FPR128:$Rn))),
3434*9880d681SAndroid Build Coastguard Worker          (FRSQRTEv4f32 FPR128:$Rn)>;
3435*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (AArch64frsqrte (f64 FPR64:$Rn))),
3436*9880d681SAndroid Build Coastguard Worker          (FRSQRTEv1i64 FPR64:$Rn)>;
3437*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (AArch64frsqrte (v1f64 FPR64:$Rn))),
3438*9880d681SAndroid Build Coastguard Worker          (FRSQRTEv1i64 FPR64:$Rn)>;
3439*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64frsqrte (v2f64 FPR128:$Rn))),
3440*9880d681SAndroid Build Coastguard Worker          (FRSQRTEv2f64 FPR128:$Rn)>;
3441*9880d681SAndroid Build Coastguard Worker
3442*9880d681SAndroid Build Coastguard Worker// If an integer is about to be converted to a floating point value,
3443*9880d681SAndroid Build Coastguard Worker// just load it on the floating point unit.
3444*9880d681SAndroid Build Coastguard Worker// Here are the patterns for 8 and 16-bits to float.
3445*9880d681SAndroid Build Coastguard Worker// 8-bits -> float.
3446*9880d681SAndroid Build Coastguard Workermulticlass UIntToFPROLoadPat<ValueType DstTy, ValueType SrcTy,
3447*9880d681SAndroid Build Coastguard Worker                             SDPatternOperator loadop, Instruction UCVTF,
3448*9880d681SAndroid Build Coastguard Worker                             ROAddrMode ro, Instruction LDRW, Instruction LDRX,
3449*9880d681SAndroid Build Coastguard Worker                             SubRegIndex sub> {
3450*9880d681SAndroid Build Coastguard Worker  def : Pat<(DstTy (uint_to_fp (SrcTy
3451*9880d681SAndroid Build Coastguard Worker                     (loadop (ro.Wpat GPR64sp:$Rn, GPR32:$Rm,
3452*9880d681SAndroid Build Coastguard Worker                                      ro.Wext:$extend))))),
3453*9880d681SAndroid Build Coastguard Worker           (UCVTF (INSERT_SUBREG (DstTy (IMPLICIT_DEF)),
3454*9880d681SAndroid Build Coastguard Worker                                 (LDRW GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend),
3455*9880d681SAndroid Build Coastguard Worker                                 sub))>;
3456*9880d681SAndroid Build Coastguard Worker
3457*9880d681SAndroid Build Coastguard Worker  def : Pat<(DstTy (uint_to_fp (SrcTy
3458*9880d681SAndroid Build Coastguard Worker                     (loadop (ro.Xpat GPR64sp:$Rn, GPR64:$Rm,
3459*9880d681SAndroid Build Coastguard Worker                                      ro.Wext:$extend))))),
3460*9880d681SAndroid Build Coastguard Worker           (UCVTF (INSERT_SUBREG (DstTy (IMPLICIT_DEF)),
3461*9880d681SAndroid Build Coastguard Worker                                 (LDRX GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend),
3462*9880d681SAndroid Build Coastguard Worker                                 sub))>;
3463*9880d681SAndroid Build Coastguard Worker}
3464*9880d681SAndroid Build Coastguard Worker
3465*9880d681SAndroid Build Coastguard Workerdefm : UIntToFPROLoadPat<f32, i32, zextloadi8,
3466*9880d681SAndroid Build Coastguard Worker                         UCVTFv1i32, ro8, LDRBroW, LDRBroX, bsub>;
3467*9880d681SAndroid Build Coastguard Workerdef : Pat <(f32 (uint_to_fp (i32
3468*9880d681SAndroid Build Coastguard Worker               (zextloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))))),
3469*9880d681SAndroid Build Coastguard Worker           (UCVTFv1i32 (INSERT_SUBREG (f32 (IMPLICIT_DEF)),
3470*9880d681SAndroid Build Coastguard Worker                          (LDRBui GPR64sp:$Rn, uimm12s1:$offset), bsub))>;
3471*9880d681SAndroid Build Coastguard Workerdef : Pat <(f32 (uint_to_fp (i32
3472*9880d681SAndroid Build Coastguard Worker                     (zextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))))),
3473*9880d681SAndroid Build Coastguard Worker           (UCVTFv1i32 (INSERT_SUBREG (f32 (IMPLICIT_DEF)),
3474*9880d681SAndroid Build Coastguard Worker                          (LDURBi GPR64sp:$Rn, simm9:$offset), bsub))>;
3475*9880d681SAndroid Build Coastguard Worker// 16-bits -> float.
3476*9880d681SAndroid Build Coastguard Workerdefm : UIntToFPROLoadPat<f32, i32, zextloadi16,
3477*9880d681SAndroid Build Coastguard Worker                         UCVTFv1i32, ro16, LDRHroW, LDRHroX, hsub>;
3478*9880d681SAndroid Build Coastguard Workerdef : Pat <(f32 (uint_to_fp (i32
3479*9880d681SAndroid Build Coastguard Worker                  (zextloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))))),
3480*9880d681SAndroid Build Coastguard Worker           (UCVTFv1i32 (INSERT_SUBREG (f32 (IMPLICIT_DEF)),
3481*9880d681SAndroid Build Coastguard Worker                          (LDRHui GPR64sp:$Rn, uimm12s2:$offset), hsub))>;
3482*9880d681SAndroid Build Coastguard Workerdef : Pat <(f32 (uint_to_fp (i32
3483*9880d681SAndroid Build Coastguard Worker                  (zextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))))),
3484*9880d681SAndroid Build Coastguard Worker           (UCVTFv1i32 (INSERT_SUBREG (f32 (IMPLICIT_DEF)),
3485*9880d681SAndroid Build Coastguard Worker                          (LDURHi GPR64sp:$Rn, simm9:$offset), hsub))>;
3486*9880d681SAndroid Build Coastguard Worker// 32-bits are handled in target specific dag combine:
3487*9880d681SAndroid Build Coastguard Worker// performIntToFpCombine.
3488*9880d681SAndroid Build Coastguard Worker// 64-bits integer to 32-bits floating point, not possible with
3489*9880d681SAndroid Build Coastguard Worker// UCVTF on floating point registers (both source and destination
3490*9880d681SAndroid Build Coastguard Worker// must have the same size).
3491*9880d681SAndroid Build Coastguard Worker
3492*9880d681SAndroid Build Coastguard Worker// Here are the patterns for 8, 16, 32, and 64-bits to double.
3493*9880d681SAndroid Build Coastguard Worker// 8-bits -> double.
3494*9880d681SAndroid Build Coastguard Workerdefm : UIntToFPROLoadPat<f64, i32, zextloadi8,
3495*9880d681SAndroid Build Coastguard Worker                         UCVTFv1i64, ro8, LDRBroW, LDRBroX, bsub>;
3496*9880d681SAndroid Build Coastguard Workerdef : Pat <(f64 (uint_to_fp (i32
3497*9880d681SAndroid Build Coastguard Worker                    (zextloadi8 (am_indexed8 GPR64sp:$Rn, uimm12s1:$offset))))),
3498*9880d681SAndroid Build Coastguard Worker           (UCVTFv1i64 (INSERT_SUBREG (f64 (IMPLICIT_DEF)),
3499*9880d681SAndroid Build Coastguard Worker                          (LDRBui GPR64sp:$Rn, uimm12s1:$offset), bsub))>;
3500*9880d681SAndroid Build Coastguard Workerdef : Pat <(f64 (uint_to_fp (i32
3501*9880d681SAndroid Build Coastguard Worker                  (zextloadi8 (am_unscaled8 GPR64sp:$Rn, simm9:$offset))))),
3502*9880d681SAndroid Build Coastguard Worker           (UCVTFv1i64 (INSERT_SUBREG (f64 (IMPLICIT_DEF)),
3503*9880d681SAndroid Build Coastguard Worker                          (LDURBi GPR64sp:$Rn, simm9:$offset), bsub))>;
3504*9880d681SAndroid Build Coastguard Worker// 16-bits -> double.
3505*9880d681SAndroid Build Coastguard Workerdefm : UIntToFPROLoadPat<f64, i32, zextloadi16,
3506*9880d681SAndroid Build Coastguard Worker                         UCVTFv1i64, ro16, LDRHroW, LDRHroX, hsub>;
3507*9880d681SAndroid Build Coastguard Workerdef : Pat <(f64 (uint_to_fp (i32
3508*9880d681SAndroid Build Coastguard Worker                  (zextloadi16 (am_indexed16 GPR64sp:$Rn, uimm12s2:$offset))))),
3509*9880d681SAndroid Build Coastguard Worker           (UCVTFv1i64 (INSERT_SUBREG (f64 (IMPLICIT_DEF)),
3510*9880d681SAndroid Build Coastguard Worker                          (LDRHui GPR64sp:$Rn, uimm12s2:$offset), hsub))>;
3511*9880d681SAndroid Build Coastguard Workerdef : Pat <(f64 (uint_to_fp (i32
3512*9880d681SAndroid Build Coastguard Worker                  (zextloadi16 (am_unscaled16 GPR64sp:$Rn, simm9:$offset))))),
3513*9880d681SAndroid Build Coastguard Worker           (UCVTFv1i64 (INSERT_SUBREG (f64 (IMPLICIT_DEF)),
3514*9880d681SAndroid Build Coastguard Worker                          (LDURHi GPR64sp:$Rn, simm9:$offset), hsub))>;
3515*9880d681SAndroid Build Coastguard Worker// 32-bits -> double.
3516*9880d681SAndroid Build Coastguard Workerdefm : UIntToFPROLoadPat<f64, i32, load,
3517*9880d681SAndroid Build Coastguard Worker                         UCVTFv1i64, ro32, LDRSroW, LDRSroX, ssub>;
3518*9880d681SAndroid Build Coastguard Workerdef : Pat <(f64 (uint_to_fp (i32
3519*9880d681SAndroid Build Coastguard Worker                  (load (am_indexed32 GPR64sp:$Rn, uimm12s4:$offset))))),
3520*9880d681SAndroid Build Coastguard Worker           (UCVTFv1i64 (INSERT_SUBREG (f64 (IMPLICIT_DEF)),
3521*9880d681SAndroid Build Coastguard Worker                          (LDRSui GPR64sp:$Rn, uimm12s4:$offset), ssub))>;
3522*9880d681SAndroid Build Coastguard Workerdef : Pat <(f64 (uint_to_fp (i32
3523*9880d681SAndroid Build Coastguard Worker                  (load (am_unscaled32 GPR64sp:$Rn, simm9:$offset))))),
3524*9880d681SAndroid Build Coastguard Worker           (UCVTFv1i64 (INSERT_SUBREG (f64 (IMPLICIT_DEF)),
3525*9880d681SAndroid Build Coastguard Worker                          (LDURSi GPR64sp:$Rn, simm9:$offset), ssub))>;
3526*9880d681SAndroid Build Coastguard Worker// 64-bits -> double are handled in target specific dag combine:
3527*9880d681SAndroid Build Coastguard Worker// performIntToFpCombine.
3528*9880d681SAndroid Build Coastguard Worker
3529*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
3530*9880d681SAndroid Build Coastguard Worker// Advanced SIMD three different-sized vector instructions.
3531*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
3532*9880d681SAndroid Build Coastguard Worker
3533*9880d681SAndroid Build Coastguard Workerdefm ADDHN  : SIMDNarrowThreeVectorBHS<0,0b0100,"addhn", int_aarch64_neon_addhn>;
3534*9880d681SAndroid Build Coastguard Workerdefm SUBHN  : SIMDNarrowThreeVectorBHS<0,0b0110,"subhn", int_aarch64_neon_subhn>;
3535*9880d681SAndroid Build Coastguard Workerdefm RADDHN : SIMDNarrowThreeVectorBHS<1,0b0100,"raddhn",int_aarch64_neon_raddhn>;
3536*9880d681SAndroid Build Coastguard Workerdefm RSUBHN : SIMDNarrowThreeVectorBHS<1,0b0110,"rsubhn",int_aarch64_neon_rsubhn>;
3537*9880d681SAndroid Build Coastguard Workerdefm PMULL  : SIMDDifferentThreeVectorBD<0,0b1110,"pmull",int_aarch64_neon_pmull>;
3538*9880d681SAndroid Build Coastguard Workerdefm SABAL  : SIMDLongThreeVectorTiedBHSabal<0,0b0101,"sabal",
3539*9880d681SAndroid Build Coastguard Worker                                             int_aarch64_neon_sabd>;
3540*9880d681SAndroid Build Coastguard Workerdefm SABDL   : SIMDLongThreeVectorBHSabdl<0, 0b0111, "sabdl",
3541*9880d681SAndroid Build Coastguard Worker                                          int_aarch64_neon_sabd>;
3542*9880d681SAndroid Build Coastguard Workerdefm SADDL   : SIMDLongThreeVectorBHS<   0, 0b0000, "saddl",
3543*9880d681SAndroid Build Coastguard Worker            BinOpFrag<(add (sext node:$LHS), (sext node:$RHS))>>;
3544*9880d681SAndroid Build Coastguard Workerdefm SADDW   : SIMDWideThreeVectorBHS<   0, 0b0001, "saddw",
3545*9880d681SAndroid Build Coastguard Worker                 BinOpFrag<(add node:$LHS, (sext node:$RHS))>>;
3546*9880d681SAndroid Build Coastguard Workerdefm SMLAL   : SIMDLongThreeVectorTiedBHS<0, 0b1000, "smlal",
3547*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(add node:$LHS, (int_aarch64_neon_smull node:$MHS, node:$RHS))>>;
3548*9880d681SAndroid Build Coastguard Workerdefm SMLSL   : SIMDLongThreeVectorTiedBHS<0, 0b1010, "smlsl",
3549*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(sub node:$LHS, (int_aarch64_neon_smull node:$MHS, node:$RHS))>>;
3550*9880d681SAndroid Build Coastguard Workerdefm SMULL   : SIMDLongThreeVectorBHS<0, 0b1100, "smull", int_aarch64_neon_smull>;
3551*9880d681SAndroid Build Coastguard Workerdefm SQDMLAL : SIMDLongThreeVectorSQDMLXTiedHS<0, 0b1001, "sqdmlal",
3552*9880d681SAndroid Build Coastguard Worker                                               int_aarch64_neon_sqadd>;
3553*9880d681SAndroid Build Coastguard Workerdefm SQDMLSL : SIMDLongThreeVectorSQDMLXTiedHS<0, 0b1011, "sqdmlsl",
3554*9880d681SAndroid Build Coastguard Worker                                               int_aarch64_neon_sqsub>;
3555*9880d681SAndroid Build Coastguard Workerdefm SQDMULL : SIMDLongThreeVectorHS<0, 0b1101, "sqdmull",
3556*9880d681SAndroid Build Coastguard Worker                                     int_aarch64_neon_sqdmull>;
3557*9880d681SAndroid Build Coastguard Workerdefm SSUBL   : SIMDLongThreeVectorBHS<0, 0b0010, "ssubl",
3558*9880d681SAndroid Build Coastguard Worker                 BinOpFrag<(sub (sext node:$LHS), (sext node:$RHS))>>;
3559*9880d681SAndroid Build Coastguard Workerdefm SSUBW   : SIMDWideThreeVectorBHS<0, 0b0011, "ssubw",
3560*9880d681SAndroid Build Coastguard Worker                 BinOpFrag<(sub node:$LHS, (sext node:$RHS))>>;
3561*9880d681SAndroid Build Coastguard Workerdefm UABAL   : SIMDLongThreeVectorTiedBHSabal<1, 0b0101, "uabal",
3562*9880d681SAndroid Build Coastguard Worker                                              int_aarch64_neon_uabd>;
3563*9880d681SAndroid Build Coastguard Workerdefm UADDL   : SIMDLongThreeVectorBHS<1, 0b0000, "uaddl",
3564*9880d681SAndroid Build Coastguard Worker                 BinOpFrag<(add (zext node:$LHS), (zext node:$RHS))>>;
3565*9880d681SAndroid Build Coastguard Workerdefm UADDW   : SIMDWideThreeVectorBHS<1, 0b0001, "uaddw",
3566*9880d681SAndroid Build Coastguard Worker                 BinOpFrag<(add node:$LHS, (zext node:$RHS))>>;
3567*9880d681SAndroid Build Coastguard Workerdefm UMLAL   : SIMDLongThreeVectorTiedBHS<1, 0b1000, "umlal",
3568*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(add node:$LHS, (int_aarch64_neon_umull node:$MHS, node:$RHS))>>;
3569*9880d681SAndroid Build Coastguard Workerdefm UMLSL   : SIMDLongThreeVectorTiedBHS<1, 0b1010, "umlsl",
3570*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(sub node:$LHS, (int_aarch64_neon_umull node:$MHS, node:$RHS))>>;
3571*9880d681SAndroid Build Coastguard Workerdefm UMULL   : SIMDLongThreeVectorBHS<1, 0b1100, "umull", int_aarch64_neon_umull>;
3572*9880d681SAndroid Build Coastguard Workerdefm USUBL   : SIMDLongThreeVectorBHS<1, 0b0010, "usubl",
3573*9880d681SAndroid Build Coastguard Worker                 BinOpFrag<(sub (zext node:$LHS), (zext node:$RHS))>>;
3574*9880d681SAndroid Build Coastguard Workerdefm USUBW   : SIMDWideThreeVectorBHS<   1, 0b0011, "usubw",
3575*9880d681SAndroid Build Coastguard Worker                 BinOpFrag<(sub node:$LHS, (zext node:$RHS))>>;
3576*9880d681SAndroid Build Coastguard Worker
3577*9880d681SAndroid Build Coastguard Worker// Additional patterns for SMULL and UMULL
3578*9880d681SAndroid Build Coastguard Workermulticlass Neon_mul_widen_patterns<SDPatternOperator opnode,
3579*9880d681SAndroid Build Coastguard Worker  Instruction INST8B, Instruction INST4H, Instruction INST2S> {
3580*9880d681SAndroid Build Coastguard Worker  def : Pat<(v8i16 (opnode (v8i8 V64:$Rn), (v8i8 V64:$Rm))),
3581*9880d681SAndroid Build Coastguard Worker            (INST8B V64:$Rn, V64:$Rm)>;
3582*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (opnode (v4i16 V64:$Rn), (v4i16 V64:$Rm))),
3583*9880d681SAndroid Build Coastguard Worker            (INST4H V64:$Rn, V64:$Rm)>;
3584*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2i64 (opnode (v2i32 V64:$Rn), (v2i32 V64:$Rm))),
3585*9880d681SAndroid Build Coastguard Worker            (INST2S V64:$Rn, V64:$Rm)>;
3586*9880d681SAndroid Build Coastguard Worker}
3587*9880d681SAndroid Build Coastguard Worker
3588*9880d681SAndroid Build Coastguard Workerdefm : Neon_mul_widen_patterns<AArch64smull, SMULLv8i8_v8i16,
3589*9880d681SAndroid Build Coastguard Worker  SMULLv4i16_v4i32, SMULLv2i32_v2i64>;
3590*9880d681SAndroid Build Coastguard Workerdefm : Neon_mul_widen_patterns<AArch64umull, UMULLv8i8_v8i16,
3591*9880d681SAndroid Build Coastguard Worker  UMULLv4i16_v4i32, UMULLv2i32_v2i64>;
3592*9880d681SAndroid Build Coastguard Worker
3593*9880d681SAndroid Build Coastguard Worker// Additional patterns for SMLAL/SMLSL and UMLAL/UMLSL
3594*9880d681SAndroid Build Coastguard Workermulticlass Neon_mulacc_widen_patterns<SDPatternOperator opnode,
3595*9880d681SAndroid Build Coastguard Worker  Instruction INST8B, Instruction INST4H, Instruction INST2S> {
3596*9880d681SAndroid Build Coastguard Worker  def : Pat<(v8i16 (opnode (v8i16 V128:$Rd), (v8i8 V64:$Rn), (v8i8 V64:$Rm))),
3597*9880d681SAndroid Build Coastguard Worker            (INST8B V128:$Rd, V64:$Rn, V64:$Rm)>;
3598*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4i32 (opnode (v4i32 V128:$Rd), (v4i16 V64:$Rn), (v4i16 V64:$Rm))),
3599*9880d681SAndroid Build Coastguard Worker            (INST4H V128:$Rd, V64:$Rn, V64:$Rm)>;
3600*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2i64 (opnode (v2i64 V128:$Rd), (v2i32 V64:$Rn), (v2i32 V64:$Rm))),
3601*9880d681SAndroid Build Coastguard Worker            (INST2S  V128:$Rd, V64:$Rn, V64:$Rm)>;
3602*9880d681SAndroid Build Coastguard Worker}
3603*9880d681SAndroid Build Coastguard Worker
3604*9880d681SAndroid Build Coastguard Workerdefm : Neon_mulacc_widen_patterns<
3605*9880d681SAndroid Build Coastguard Worker  TriOpFrag<(add node:$LHS, (AArch64smull node:$MHS, node:$RHS))>,
3606*9880d681SAndroid Build Coastguard Worker  SMLALv8i8_v8i16, SMLALv4i16_v4i32, SMLALv2i32_v2i64>;
3607*9880d681SAndroid Build Coastguard Workerdefm : Neon_mulacc_widen_patterns<
3608*9880d681SAndroid Build Coastguard Worker  TriOpFrag<(add node:$LHS, (AArch64umull node:$MHS, node:$RHS))>,
3609*9880d681SAndroid Build Coastguard Worker  UMLALv8i8_v8i16, UMLALv4i16_v4i32, UMLALv2i32_v2i64>;
3610*9880d681SAndroid Build Coastguard Workerdefm : Neon_mulacc_widen_patterns<
3611*9880d681SAndroid Build Coastguard Worker  TriOpFrag<(sub node:$LHS, (AArch64smull node:$MHS, node:$RHS))>,
3612*9880d681SAndroid Build Coastguard Worker  SMLSLv8i8_v8i16, SMLSLv4i16_v4i32, SMLSLv2i32_v2i64>;
3613*9880d681SAndroid Build Coastguard Workerdefm : Neon_mulacc_widen_patterns<
3614*9880d681SAndroid Build Coastguard Worker  TriOpFrag<(sub node:$LHS, (AArch64umull node:$MHS, node:$RHS))>,
3615*9880d681SAndroid Build Coastguard Worker  UMLSLv8i8_v8i16, UMLSLv4i16_v4i32, UMLSLv2i32_v2i64>;
3616*9880d681SAndroid Build Coastguard Worker
3617*9880d681SAndroid Build Coastguard Worker// Patterns for 64-bit pmull
3618*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_pmull64 V64:$Rn, V64:$Rm),
3619*9880d681SAndroid Build Coastguard Worker          (PMULLv1i64 V64:$Rn, V64:$Rm)>;
3620*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_pmull64 (extractelt (v2i64 V128:$Rn), (i64 1)),
3621*9880d681SAndroid Build Coastguard Worker                                    (extractelt (v2i64 V128:$Rm), (i64 1))),
3622*9880d681SAndroid Build Coastguard Worker          (PMULLv2i64 V128:$Rn, V128:$Rm)>;
3623*9880d681SAndroid Build Coastguard Worker
3624*9880d681SAndroid Build Coastguard Worker// CodeGen patterns for addhn and subhn instructions, which can actually be
3625*9880d681SAndroid Build Coastguard Worker// written in LLVM IR without too much difficulty.
3626*9880d681SAndroid Build Coastguard Worker
3627*9880d681SAndroid Build Coastguard Worker// ADDHN
3628*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (trunc (v8i16 (AArch64vlshr (add V128:$Rn, V128:$Rm), (i32 8))))),
3629*9880d681SAndroid Build Coastguard Worker          (ADDHNv8i16_v8i8 V128:$Rn, V128:$Rm)>;
3630*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (trunc (v4i32 (AArch64vlshr (add V128:$Rn, V128:$Rm),
3631*9880d681SAndroid Build Coastguard Worker                                           (i32 16))))),
3632*9880d681SAndroid Build Coastguard Worker          (ADDHNv4i32_v4i16 V128:$Rn, V128:$Rm)>;
3633*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (trunc (v2i64 (AArch64vlshr (add V128:$Rn, V128:$Rm),
3634*9880d681SAndroid Build Coastguard Worker                                           (i32 32))))),
3635*9880d681SAndroid Build Coastguard Worker          (ADDHNv2i64_v2i32 V128:$Rn, V128:$Rm)>;
3636*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors (v8i8 V64:$Rd),
3637*9880d681SAndroid Build Coastguard Worker                          (trunc (v8i16 (AArch64vlshr (add V128:$Rn, V128:$Rm),
3638*9880d681SAndroid Build Coastguard Worker                                                    (i32 8))))),
3639*9880d681SAndroid Build Coastguard Worker          (ADDHNv8i16_v16i8 (SUBREG_TO_REG (i32 0), V64:$Rd, dsub),
3640*9880d681SAndroid Build Coastguard Worker                            V128:$Rn, V128:$Rm)>;
3641*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors (v4i16 V64:$Rd),
3642*9880d681SAndroid Build Coastguard Worker                          (trunc (v4i32 (AArch64vlshr (add V128:$Rn, V128:$Rm),
3643*9880d681SAndroid Build Coastguard Worker                                                    (i32 16))))),
3644*9880d681SAndroid Build Coastguard Worker          (ADDHNv4i32_v8i16 (SUBREG_TO_REG (i32 0), V64:$Rd, dsub),
3645*9880d681SAndroid Build Coastguard Worker                            V128:$Rn, V128:$Rm)>;
3646*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors (v2i32 V64:$Rd),
3647*9880d681SAndroid Build Coastguard Worker                          (trunc (v2i64 (AArch64vlshr (add V128:$Rn, V128:$Rm),
3648*9880d681SAndroid Build Coastguard Worker                                                    (i32 32))))),
3649*9880d681SAndroid Build Coastguard Worker          (ADDHNv2i64_v4i32 (SUBREG_TO_REG (i32 0), V64:$Rd, dsub),
3650*9880d681SAndroid Build Coastguard Worker                            V128:$Rn, V128:$Rm)>;
3651*9880d681SAndroid Build Coastguard Worker
3652*9880d681SAndroid Build Coastguard Worker// SUBHN
3653*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (trunc (v8i16 (AArch64vlshr (sub V128:$Rn, V128:$Rm), (i32 8))))),
3654*9880d681SAndroid Build Coastguard Worker          (SUBHNv8i16_v8i8 V128:$Rn, V128:$Rm)>;
3655*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (trunc (v4i32 (AArch64vlshr (sub V128:$Rn, V128:$Rm),
3656*9880d681SAndroid Build Coastguard Worker                                           (i32 16))))),
3657*9880d681SAndroid Build Coastguard Worker          (SUBHNv4i32_v4i16 V128:$Rn, V128:$Rm)>;
3658*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (trunc (v2i64 (AArch64vlshr (sub V128:$Rn, V128:$Rm),
3659*9880d681SAndroid Build Coastguard Worker                                           (i32 32))))),
3660*9880d681SAndroid Build Coastguard Worker          (SUBHNv2i64_v2i32 V128:$Rn, V128:$Rm)>;
3661*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors (v8i8 V64:$Rd),
3662*9880d681SAndroid Build Coastguard Worker                          (trunc (v8i16 (AArch64vlshr (sub V128:$Rn, V128:$Rm),
3663*9880d681SAndroid Build Coastguard Worker                                                    (i32 8))))),
3664*9880d681SAndroid Build Coastguard Worker          (SUBHNv8i16_v16i8 (SUBREG_TO_REG (i32 0), V64:$Rd, dsub),
3665*9880d681SAndroid Build Coastguard Worker                            V128:$Rn, V128:$Rm)>;
3666*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors (v4i16 V64:$Rd),
3667*9880d681SAndroid Build Coastguard Worker                          (trunc (v4i32 (AArch64vlshr (sub V128:$Rn, V128:$Rm),
3668*9880d681SAndroid Build Coastguard Worker                                                    (i32 16))))),
3669*9880d681SAndroid Build Coastguard Worker          (SUBHNv4i32_v8i16 (SUBREG_TO_REG (i32 0), V64:$Rd, dsub),
3670*9880d681SAndroid Build Coastguard Worker                            V128:$Rn, V128:$Rm)>;
3671*9880d681SAndroid Build Coastguard Workerdef : Pat<(concat_vectors (v2i32 V64:$Rd),
3672*9880d681SAndroid Build Coastguard Worker                          (trunc (v2i64 (AArch64vlshr (sub V128:$Rn, V128:$Rm),
3673*9880d681SAndroid Build Coastguard Worker                                                    (i32 32))))),
3674*9880d681SAndroid Build Coastguard Worker          (SUBHNv2i64_v4i32 (SUBREG_TO_REG (i32 0), V64:$Rd, dsub),
3675*9880d681SAndroid Build Coastguard Worker                            V128:$Rn, V128:$Rm)>;
3676*9880d681SAndroid Build Coastguard Worker
3677*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
3678*9880d681SAndroid Build Coastguard Worker// AdvSIMD bitwise extract from vector instruction.
3679*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
3680*9880d681SAndroid Build Coastguard Worker
3681*9880d681SAndroid Build Coastguard Workerdefm EXT : SIMDBitwiseExtract<"ext">;
3682*9880d681SAndroid Build Coastguard Worker
3683*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64ext V64:$Rn, V64:$Rm, (i32 imm:$imm))),
3684*9880d681SAndroid Build Coastguard Worker          (EXTv8i8 V64:$Rn, V64:$Rm, imm:$imm)>;
3685*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64ext V128:$Rn, V128:$Rm, (i32 imm:$imm))),
3686*9880d681SAndroid Build Coastguard Worker          (EXTv16i8 V128:$Rn, V128:$Rm, imm:$imm)>;
3687*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64ext V64:$Rn, V64:$Rm, (i32 imm:$imm))),
3688*9880d681SAndroid Build Coastguard Worker          (EXTv8i8 V64:$Rn, V64:$Rm, imm:$imm)>;
3689*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64ext V64:$Rn, V64:$Rm, (i32 imm:$imm))),
3690*9880d681SAndroid Build Coastguard Worker          (EXTv8i8 V64:$Rn, V64:$Rm, imm:$imm)>;
3691*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64ext V128:$Rn, V128:$Rm, (i32 imm:$imm))),
3692*9880d681SAndroid Build Coastguard Worker          (EXTv16i8 V128:$Rn, V128:$Rm, imm:$imm)>;
3693*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64ext V128:$Rn, V128:$Rm, (i32 imm:$imm))),
3694*9880d681SAndroid Build Coastguard Worker          (EXTv16i8 V128:$Rn, V128:$Rm, imm:$imm)>;
3695*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64ext V128:$Rn, V128:$Rm, (i32 imm:$imm))),
3696*9880d681SAndroid Build Coastguard Worker          (EXTv16i8 V128:$Rn, V128:$Rm, imm:$imm)>;
3697*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64ext V128:$Rn, V128:$Rm, (i32 imm:$imm))),
3698*9880d681SAndroid Build Coastguard Worker          (EXTv16i8 V128:$Rn, V128:$Rm, imm:$imm)>;
3699*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64ext V64:$Rn, V64:$Rm, (i32 imm:$imm))),
3700*9880d681SAndroid Build Coastguard Worker          (EXTv8i8 V64:$Rn, V64:$Rm, imm:$imm)>;
3701*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64ext V128:$Rn, V128:$Rm, (i32 imm:$imm))),
3702*9880d681SAndroid Build Coastguard Worker          (EXTv16i8 V128:$Rn, V128:$Rm, imm:$imm)>;
3703*9880d681SAndroid Build Coastguard Worker
3704*9880d681SAndroid Build Coastguard Worker// We use EXT to handle extract_subvector to copy the upper 64-bits of a
3705*9880d681SAndroid Build Coastguard Worker// 128-bit vector.
3706*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (extract_subvector V128:$Rn, (i64 8))),
3707*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>;
3708*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (extract_subvector V128:$Rn, (i64 4))),
3709*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>;
3710*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (extract_subvector V128:$Rn, (i64 2))),
3711*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>;
3712*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (extract_subvector V128:$Rn, (i64 1))),
3713*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>;
3714*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (extract_subvector V128:$Rn, (i64 4))),
3715*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>;
3716*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (extract_subvector V128:$Rn, (i64 2))),
3717*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>;
3718*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (extract_subvector V128:$Rn, (i64 1))),
3719*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (EXTv16i8 V128:$Rn, V128:$Rn, 8), dsub)>;
3720*9880d681SAndroid Build Coastguard Worker
3721*9880d681SAndroid Build Coastguard Worker
3722*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
3723*9880d681SAndroid Build Coastguard Worker// AdvSIMD zip vector
3724*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
3725*9880d681SAndroid Build Coastguard Worker
3726*9880d681SAndroid Build Coastguard Workerdefm TRN1 : SIMDZipVector<0b010, "trn1", AArch64trn1>;
3727*9880d681SAndroid Build Coastguard Workerdefm TRN2 : SIMDZipVector<0b110, "trn2", AArch64trn2>;
3728*9880d681SAndroid Build Coastguard Workerdefm UZP1 : SIMDZipVector<0b001, "uzp1", AArch64uzp1>;
3729*9880d681SAndroid Build Coastguard Workerdefm UZP2 : SIMDZipVector<0b101, "uzp2", AArch64uzp2>;
3730*9880d681SAndroid Build Coastguard Workerdefm ZIP1 : SIMDZipVector<0b011, "zip1", AArch64zip1>;
3731*9880d681SAndroid Build Coastguard Workerdefm ZIP2 : SIMDZipVector<0b111, "zip2", AArch64zip2>;
3732*9880d681SAndroid Build Coastguard Worker
3733*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
3734*9880d681SAndroid Build Coastguard Worker// AdvSIMD TBL/TBX instructions
3735*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
3736*9880d681SAndroid Build Coastguard Worker
3737*9880d681SAndroid Build Coastguard Workerdefm TBL : SIMDTableLookup<    0, "tbl">;
3738*9880d681SAndroid Build Coastguard Workerdefm TBX : SIMDTableLookupTied<1, "tbx">;
3739*9880d681SAndroid Build Coastguard Worker
3740*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (int_aarch64_neon_tbl1 (v16i8 VecListOne128:$Rn), (v8i8 V64:$Ri))),
3741*9880d681SAndroid Build Coastguard Worker          (TBLv8i8One VecListOne128:$Rn, V64:$Ri)>;
3742*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (int_aarch64_neon_tbl1 (v16i8 V128:$Ri), (v16i8 V128:$Rn))),
3743*9880d681SAndroid Build Coastguard Worker          (TBLv16i8One V128:$Ri, V128:$Rn)>;
3744*9880d681SAndroid Build Coastguard Worker
3745*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (int_aarch64_neon_tbx1 (v8i8 V64:$Rd),
3746*9880d681SAndroid Build Coastguard Worker                  (v16i8 VecListOne128:$Rn), (v8i8 V64:$Ri))),
3747*9880d681SAndroid Build Coastguard Worker          (TBXv8i8One V64:$Rd, VecListOne128:$Rn, V64:$Ri)>;
3748*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (int_aarch64_neon_tbx1 (v16i8 V128:$Rd),
3749*9880d681SAndroid Build Coastguard Worker                   (v16i8 V128:$Ri), (v16i8 V128:$Rn))),
3750*9880d681SAndroid Build Coastguard Worker          (TBXv16i8One V128:$Rd, V128:$Ri, V128:$Rn)>;
3751*9880d681SAndroid Build Coastguard Worker
3752*9880d681SAndroid Build Coastguard Worker
3753*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
3754*9880d681SAndroid Build Coastguard Worker// AdvSIMD scalar CPY instruction
3755*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
3756*9880d681SAndroid Build Coastguard Worker
3757*9880d681SAndroid Build Coastguard Workerdefm CPY : SIMDScalarCPY<"cpy">;
3758*9880d681SAndroid Build Coastguard Worker
3759*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
3760*9880d681SAndroid Build Coastguard Worker// AdvSIMD scalar pairwise instructions
3761*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
3762*9880d681SAndroid Build Coastguard Worker
3763*9880d681SAndroid Build Coastguard Workerdefm ADDP    : SIMDPairwiseScalarD<0, 0b11011, "addp">;
3764*9880d681SAndroid Build Coastguard Workerdefm FADDP   : SIMDFPPairwiseScalar<0, 0b01101, "faddp">;
3765*9880d681SAndroid Build Coastguard Workerdefm FMAXNMP : SIMDFPPairwiseScalar<0, 0b01100, "fmaxnmp">;
3766*9880d681SAndroid Build Coastguard Workerdefm FMAXP   : SIMDFPPairwiseScalar<0, 0b01111, "fmaxp">;
3767*9880d681SAndroid Build Coastguard Workerdefm FMINNMP : SIMDFPPairwiseScalar<1, 0b01100, "fminnmp">;
3768*9880d681SAndroid Build Coastguard Workerdefm FMINP   : SIMDFPPairwiseScalar<1, 0b01111, "fminp">;
3769*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64saddv V128:$Rn)),
3770*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), (ADDPv2i64p V128:$Rn), dsub)>;
3771*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64uaddv V128:$Rn)),
3772*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), (ADDPv2i64p V128:$Rn), dsub)>;
3773*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_faddv (v2f32 V64:$Rn))),
3774*9880d681SAndroid Build Coastguard Worker          (FADDPv2i32p V64:$Rn)>;
3775*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_faddv (v4f32 V128:$Rn))),
3776*9880d681SAndroid Build Coastguard Worker          (FADDPv2i32p (EXTRACT_SUBREG (FADDPv4f32 V128:$Rn, V128:$Rn), dsub))>;
3777*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_faddv (v2f64 V128:$Rn))),
3778*9880d681SAndroid Build Coastguard Worker          (FADDPv2i64p V128:$Rn)>;
3779*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_fmaxnmv (v2f32 V64:$Rn))),
3780*9880d681SAndroid Build Coastguard Worker          (FMAXNMPv2i32p V64:$Rn)>;
3781*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_fmaxnmv (v2f64 V128:$Rn))),
3782*9880d681SAndroid Build Coastguard Worker          (FMAXNMPv2i64p V128:$Rn)>;
3783*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_fmaxv (v2f32 V64:$Rn))),
3784*9880d681SAndroid Build Coastguard Worker          (FMAXPv2i32p V64:$Rn)>;
3785*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_fmaxv (v2f64 V128:$Rn))),
3786*9880d681SAndroid Build Coastguard Worker          (FMAXPv2i64p V128:$Rn)>;
3787*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_fminnmv (v2f32 V64:$Rn))),
3788*9880d681SAndroid Build Coastguard Worker          (FMINNMPv2i32p V64:$Rn)>;
3789*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_fminnmv (v2f64 V128:$Rn))),
3790*9880d681SAndroid Build Coastguard Worker          (FMINNMPv2i64p V128:$Rn)>;
3791*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (int_aarch64_neon_fminv (v2f32 V64:$Rn))),
3792*9880d681SAndroid Build Coastguard Worker          (FMINPv2i32p V64:$Rn)>;
3793*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_fminv (v2f64 V128:$Rn))),
3794*9880d681SAndroid Build Coastguard Worker          (FMINPv2i64p V128:$Rn)>;
3795*9880d681SAndroid Build Coastguard Worker
3796*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
3797*9880d681SAndroid Build Coastguard Worker// AdvSIMD INS/DUP instructions
3798*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
3799*9880d681SAndroid Build Coastguard Worker
3800*9880d681SAndroid Build Coastguard Workerdef DUPv8i8gpr  : SIMDDupFromMain<0, {?,?,?,?,1}, ".8b", v8i8, V64, GPR32>;
3801*9880d681SAndroid Build Coastguard Workerdef DUPv16i8gpr : SIMDDupFromMain<1, {?,?,?,?,1}, ".16b", v16i8, V128, GPR32>;
3802*9880d681SAndroid Build Coastguard Workerdef DUPv4i16gpr : SIMDDupFromMain<0, {?,?,?,1,0}, ".4h", v4i16, V64, GPR32>;
3803*9880d681SAndroid Build Coastguard Workerdef DUPv8i16gpr : SIMDDupFromMain<1, {?,?,?,1,0}, ".8h", v8i16, V128, GPR32>;
3804*9880d681SAndroid Build Coastguard Workerdef DUPv2i32gpr : SIMDDupFromMain<0, {?,?,1,0,0}, ".2s", v2i32, V64, GPR32>;
3805*9880d681SAndroid Build Coastguard Workerdef DUPv4i32gpr : SIMDDupFromMain<1, {?,?,1,0,0}, ".4s", v4i32, V128, GPR32>;
3806*9880d681SAndroid Build Coastguard Workerdef DUPv2i64gpr : SIMDDupFromMain<1, {?,1,0,0,0}, ".2d", v2i64, V128, GPR64>;
3807*9880d681SAndroid Build Coastguard Worker
3808*9880d681SAndroid Build Coastguard Workerdef DUPv2i64lane : SIMDDup64FromElement;
3809*9880d681SAndroid Build Coastguard Workerdef DUPv2i32lane : SIMDDup32FromElement<0, ".2s", v2i32, V64>;
3810*9880d681SAndroid Build Coastguard Workerdef DUPv4i32lane : SIMDDup32FromElement<1, ".4s", v4i32, V128>;
3811*9880d681SAndroid Build Coastguard Workerdef DUPv4i16lane : SIMDDup16FromElement<0, ".4h", v4i16, V64>;
3812*9880d681SAndroid Build Coastguard Workerdef DUPv8i16lane : SIMDDup16FromElement<1, ".8h", v8i16, V128>;
3813*9880d681SAndroid Build Coastguard Workerdef DUPv8i8lane  : SIMDDup8FromElement <0, ".8b", v8i8, V64>;
3814*9880d681SAndroid Build Coastguard Workerdef DUPv16i8lane : SIMDDup8FromElement <1, ".16b", v16i8, V128>;
3815*9880d681SAndroid Build Coastguard Worker
3816*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64dup (f32 FPR32:$Rn))),
3817*9880d681SAndroid Build Coastguard Worker          (v2f32 (DUPv2i32lane
3818*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR32:$Rn, ssub),
3819*9880d681SAndroid Build Coastguard Worker            (i64 0)))>;
3820*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64dup (f32 FPR32:$Rn))),
3821*9880d681SAndroid Build Coastguard Worker          (v4f32 (DUPv4i32lane
3822*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR32:$Rn, ssub),
3823*9880d681SAndroid Build Coastguard Worker            (i64 0)))>;
3824*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64dup (f64 FPR64:$Rn))),
3825*9880d681SAndroid Build Coastguard Worker          (v2f64 (DUPv2i64lane
3826*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR64:$Rn, dsub),
3827*9880d681SAndroid Build Coastguard Worker            (i64 0)))>;
3828*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64dup (f16 FPR16:$Rn))),
3829*9880d681SAndroid Build Coastguard Worker          (v4f16 (DUPv4i16lane
3830*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)), FPR16:$Rn, hsub),
3831*9880d681SAndroid Build Coastguard Worker            (i64 0)))>;
3832*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64dup (f16 FPR16:$Rn))),
3833*9880d681SAndroid Build Coastguard Worker          (v8f16 (DUPv8i16lane
3834*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)), FPR16:$Rn, hsub),
3835*9880d681SAndroid Build Coastguard Worker            (i64 0)))>;
3836*9880d681SAndroid Build Coastguard Worker
3837*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64duplane16 (v8f16 V128:$Rn), VectorIndexH:$imm)),
3838*9880d681SAndroid Build Coastguard Worker          (DUPv4i16lane V128:$Rn, VectorIndexH:$imm)>;
3839*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64duplane16 (v8f16 V128:$Rn), VectorIndexH:$imm)),
3840*9880d681SAndroid Build Coastguard Worker          (DUPv8i16lane V128:$Rn, VectorIndexH:$imm)>;
3841*9880d681SAndroid Build Coastguard Worker
3842*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64duplane32 (v4f32 V128:$Rn), VectorIndexS:$imm)),
3843*9880d681SAndroid Build Coastguard Worker          (DUPv2i32lane V128:$Rn, VectorIndexS:$imm)>;
3844*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64duplane32 (v4f32 V128:$Rn), VectorIndexS:$imm)),
3845*9880d681SAndroid Build Coastguard Worker         (DUPv4i32lane V128:$Rn, VectorIndexS:$imm)>;
3846*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64duplane64 (v2f64 V128:$Rn), VectorIndexD:$imm)),
3847*9880d681SAndroid Build Coastguard Worker          (DUPv2i64lane V128:$Rn, VectorIndexD:$imm)>;
3848*9880d681SAndroid Build Coastguard Worker
3849*9880d681SAndroid Build Coastguard Worker// If there's an (AArch64dup (vector_extract ...) ...), we can use a duplane
3850*9880d681SAndroid Build Coastguard Worker// instruction even if the types don't match: we just have to remap the lane
3851*9880d681SAndroid Build Coastguard Worker// carefully. N.b. this trick only applies to truncations.
3852*9880d681SAndroid Build Coastguard Workerdef VecIndex_x2 : SDNodeXForm<imm, [{
3853*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(2 * N->getZExtValue(), SDLoc(N), MVT::i64);
3854*9880d681SAndroid Build Coastguard Worker}]>;
3855*9880d681SAndroid Build Coastguard Workerdef VecIndex_x4 : SDNodeXForm<imm, [{
3856*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(4 * N->getZExtValue(), SDLoc(N), MVT::i64);
3857*9880d681SAndroid Build Coastguard Worker}]>;
3858*9880d681SAndroid Build Coastguard Workerdef VecIndex_x8 : SDNodeXForm<imm, [{
3859*9880d681SAndroid Build Coastguard Worker  return CurDAG->getTargetConstant(8 * N->getZExtValue(), SDLoc(N), MVT::i64);
3860*9880d681SAndroid Build Coastguard Worker}]>;
3861*9880d681SAndroid Build Coastguard Worker
3862*9880d681SAndroid Build Coastguard Workermulticlass DUPWithTruncPats<ValueType ResVT, ValueType Src64VT,
3863*9880d681SAndroid Build Coastguard Worker                            ValueType Src128VT, ValueType ScalVT,
3864*9880d681SAndroid Build Coastguard Worker                            Instruction DUP, SDNodeXForm IdxXFORM> {
3865*9880d681SAndroid Build Coastguard Worker  def : Pat<(ResVT (AArch64dup (ScalVT (vector_extract (Src128VT V128:$Rn),
3866*9880d681SAndroid Build Coastguard Worker                                                     imm:$idx)))),
3867*9880d681SAndroid Build Coastguard Worker            (DUP V128:$Rn, (IdxXFORM imm:$idx))>;
3868*9880d681SAndroid Build Coastguard Worker
3869*9880d681SAndroid Build Coastguard Worker  def : Pat<(ResVT (AArch64dup (ScalVT (vector_extract (Src64VT V64:$Rn),
3870*9880d681SAndroid Build Coastguard Worker                                                     imm:$idx)))),
3871*9880d681SAndroid Build Coastguard Worker            (DUP (SUBREG_TO_REG (i64 0), V64:$Rn, dsub), (IdxXFORM imm:$idx))>;
3872*9880d681SAndroid Build Coastguard Worker}
3873*9880d681SAndroid Build Coastguard Worker
3874*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTruncPats<v8i8,   v4i16, v8i16, i32, DUPv8i8lane,  VecIndex_x2>;
3875*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTruncPats<v8i8,   v2i32, v4i32, i32, DUPv8i8lane,  VecIndex_x4>;
3876*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTruncPats<v4i16,  v2i32, v4i32, i32, DUPv4i16lane, VecIndex_x2>;
3877*9880d681SAndroid Build Coastguard Worker
3878*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTruncPats<v16i8,  v4i16, v8i16, i32, DUPv16i8lane, VecIndex_x2>;
3879*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTruncPats<v16i8,  v2i32, v4i32, i32, DUPv16i8lane, VecIndex_x4>;
3880*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTruncPats<v8i16,  v2i32, v4i32, i32, DUPv8i16lane, VecIndex_x2>;
3881*9880d681SAndroid Build Coastguard Worker
3882*9880d681SAndroid Build Coastguard Workermulticlass DUPWithTrunci64Pats<ValueType ResVT, Instruction DUP,
3883*9880d681SAndroid Build Coastguard Worker                               SDNodeXForm IdxXFORM> {
3884*9880d681SAndroid Build Coastguard Worker  def : Pat<(ResVT (AArch64dup (i32 (trunc (extractelt (v2i64 V128:$Rn),
3885*9880d681SAndroid Build Coastguard Worker                                                         imm:$idx))))),
3886*9880d681SAndroid Build Coastguard Worker            (DUP V128:$Rn, (IdxXFORM imm:$idx))>;
3887*9880d681SAndroid Build Coastguard Worker
3888*9880d681SAndroid Build Coastguard Worker  def : Pat<(ResVT (AArch64dup (i32 (trunc (extractelt (v1i64 V64:$Rn),
3889*9880d681SAndroid Build Coastguard Worker                                                       imm:$idx))))),
3890*9880d681SAndroid Build Coastguard Worker            (DUP (SUBREG_TO_REG (i64 0), V64:$Rn, dsub), (IdxXFORM imm:$idx))>;
3891*9880d681SAndroid Build Coastguard Worker}
3892*9880d681SAndroid Build Coastguard Worker
3893*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTrunci64Pats<v8i8,  DUPv8i8lane,   VecIndex_x8>;
3894*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTrunci64Pats<v4i16, DUPv4i16lane,  VecIndex_x4>;
3895*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTrunci64Pats<v2i32, DUPv2i32lane,  VecIndex_x2>;
3896*9880d681SAndroid Build Coastguard Worker
3897*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTrunci64Pats<v16i8, DUPv16i8lane, VecIndex_x8>;
3898*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTrunci64Pats<v8i16, DUPv8i16lane, VecIndex_x4>;
3899*9880d681SAndroid Build Coastguard Workerdefm : DUPWithTrunci64Pats<v4i32, DUPv4i32lane, VecIndex_x2>;
3900*9880d681SAndroid Build Coastguard Worker
3901*9880d681SAndroid Build Coastguard Worker// SMOV and UMOV definitions, with some extra patterns for convenience
3902*9880d681SAndroid Build Coastguard Workerdefm SMOV : SMov;
3903*9880d681SAndroid Build Coastguard Workerdefm UMOV : UMov;
3904*9880d681SAndroid Build Coastguard Worker
3905*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (vector_extract (v16i8 V128:$Rn), VectorIndexB:$idx), i8),
3906*9880d681SAndroid Build Coastguard Worker          (i32 (SMOVvi8to32 V128:$Rn, VectorIndexB:$idx))>;
3907*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (vector_extract (v16i8 V128:$Rn), VectorIndexB:$idx), i8),
3908*9880d681SAndroid Build Coastguard Worker          (i64 (SMOVvi8to64 V128:$Rn, VectorIndexB:$idx))>;
3909*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (vector_extract (v8i16 V128:$Rn), VectorIndexH:$idx),i16),
3910*9880d681SAndroid Build Coastguard Worker          (i32 (SMOVvi16to32 V128:$Rn, VectorIndexH:$idx))>;
3911*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (vector_extract (v8i16 V128:$Rn), VectorIndexH:$idx),i16),
3912*9880d681SAndroid Build Coastguard Worker          (i64 (SMOVvi16to64 V128:$Rn, VectorIndexH:$idx))>;
3913*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (vector_extract (v8i16 V128:$Rn), VectorIndexH:$idx),i16),
3914*9880d681SAndroid Build Coastguard Worker          (i32 (SMOVvi16to32 V128:$Rn, VectorIndexH:$idx))>;
3915*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext (i32 (vector_extract (v4i32 V128:$Rn), VectorIndexS:$idx))),
3916*9880d681SAndroid Build Coastguard Worker          (i64 (SMOVvi32to64 V128:$Rn, VectorIndexS:$idx))>;
3917*9880d681SAndroid Build Coastguard Worker
3918*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (i64 (anyext (i32 (vector_extract (v16i8 V128:$Rn),
3919*9880d681SAndroid Build Coastguard Worker            VectorIndexB:$idx)))), i8),
3920*9880d681SAndroid Build Coastguard Worker          (i64 (SMOVvi8to64 V128:$Rn, VectorIndexB:$idx))>;
3921*9880d681SAndroid Build Coastguard Workerdef : Pat<(sext_inreg (i64 (anyext (i32 (vector_extract (v8i16 V128:$Rn),
3922*9880d681SAndroid Build Coastguard Worker            VectorIndexH:$idx)))), i16),
3923*9880d681SAndroid Build Coastguard Worker          (i64 (SMOVvi16to64 V128:$Rn, VectorIndexH:$idx))>;
3924*9880d681SAndroid Build Coastguard Worker
3925*9880d681SAndroid Build Coastguard Worker// Extracting i8 or i16 elements will have the zero-extend transformed to
3926*9880d681SAndroid Build Coastguard Worker// an 'and' mask by type legalization since neither i8 nor i16 are legal types
3927*9880d681SAndroid Build Coastguard Worker// for AArch64. Match these patterns here since UMOV already zeroes out the high
3928*9880d681SAndroid Build Coastguard Worker// bits of the destination register.
3929*9880d681SAndroid Build Coastguard Workerdef : Pat<(and (vector_extract (v16i8 V128:$Rn), VectorIndexB:$idx),
3930*9880d681SAndroid Build Coastguard Worker               (i32 0xff)),
3931*9880d681SAndroid Build Coastguard Worker          (i32 (UMOVvi8 V128:$Rn, VectorIndexB:$idx))>;
3932*9880d681SAndroid Build Coastguard Workerdef : Pat<(and (vector_extract (v8i16 V128:$Rn), VectorIndexH:$idx),
3933*9880d681SAndroid Build Coastguard Worker               (i32 0xffff)),
3934*9880d681SAndroid Build Coastguard Worker          (i32 (UMOVvi16 V128:$Rn, VectorIndexH:$idx))>;
3935*9880d681SAndroid Build Coastguard Worker
3936*9880d681SAndroid Build Coastguard Workerdefm INS : SIMDIns;
3937*9880d681SAndroid Build Coastguard Worker
3938*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (scalar_to_vector GPR32:$Rn)),
3939*9880d681SAndroid Build Coastguard Worker          (SUBREG_TO_REG (i32 0),
3940*9880d681SAndroid Build Coastguard Worker                         (f32 (COPY_TO_REGCLASS GPR32:$Rn, FPR32)), ssub)>;
3941*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (scalar_to_vector GPR32:$Rn)),
3942*9880d681SAndroid Build Coastguard Worker          (SUBREG_TO_REG (i32 0),
3943*9880d681SAndroid Build Coastguard Worker                         (f32 (COPY_TO_REGCLASS GPR32:$Rn, FPR32)), ssub)>;
3944*9880d681SAndroid Build Coastguard Worker
3945*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (scalar_to_vector GPR32:$Rn)),
3946*9880d681SAndroid Build Coastguard Worker          (SUBREG_TO_REG (i32 0),
3947*9880d681SAndroid Build Coastguard Worker                         (f32 (COPY_TO_REGCLASS GPR32:$Rn, FPR32)), ssub)>;
3948*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (scalar_to_vector GPR32:$Rn)),
3949*9880d681SAndroid Build Coastguard Worker          (SUBREG_TO_REG (i32 0),
3950*9880d681SAndroid Build Coastguard Worker                         (f32 (COPY_TO_REGCLASS GPR32:$Rn, FPR32)), ssub)>;
3951*9880d681SAndroid Build Coastguard Worker
3952*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (scalar_to_vector (i32 FPR32:$Rn))),
3953*9880d681SAndroid Build Coastguard Worker            (v2i32 (INSERT_SUBREG (v2i32 (IMPLICIT_DEF)),
3954*9880d681SAndroid Build Coastguard Worker                                  (i32 FPR32:$Rn), ssub))>;
3955*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (scalar_to_vector (i32 FPR32:$Rn))),
3956*9880d681SAndroid Build Coastguard Worker            (v4i32 (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)),
3957*9880d681SAndroid Build Coastguard Worker                                  (i32 FPR32:$Rn), ssub))>;
3958*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (scalar_to_vector (i64 FPR64:$Rn))),
3959*9880d681SAndroid Build Coastguard Worker            (v2i64 (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
3960*9880d681SAndroid Build Coastguard Worker                                  (i64 FPR64:$Rn), dsub))>;
3961*9880d681SAndroid Build Coastguard Worker
3962*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (scalar_to_vector (f16 FPR16:$Rn))),
3963*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v4f16 (IMPLICIT_DEF)), FPR16:$Rn, hsub)>;
3964*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (scalar_to_vector (f16 FPR16:$Rn))),
3965*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v8f16 (IMPLICIT_DEF)), FPR16:$Rn, hsub)>;
3966*9880d681SAndroid Build Coastguard Worker
3967*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (scalar_to_vector (f32 FPR32:$Rn))),
3968*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), FPR32:$Rn, ssub)>;
3969*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (scalar_to_vector (f32 FPR32:$Rn))),
3970*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v2f32 (IMPLICIT_DEF)), FPR32:$Rn, ssub)>;
3971*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (scalar_to_vector (f64 FPR64:$Rn))),
3972*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), FPR64:$Rn, dsub)>;
3973*9880d681SAndroid Build Coastguard Worker
3974*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (vector_insert (v4f16 V64:$Rn),
3975*9880d681SAndroid Build Coastguard Worker            (f16 FPR16:$Rm), (i64 VectorIndexS:$imm))),
3976*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG
3977*9880d681SAndroid Build Coastguard Worker            (INSvi16lane
3978*9880d681SAndroid Build Coastguard Worker              (v8f16 (INSERT_SUBREG (v8f16 (IMPLICIT_DEF)), V64:$Rn, dsub)),
3979*9880d681SAndroid Build Coastguard Worker              VectorIndexS:$imm,
3980*9880d681SAndroid Build Coastguard Worker              (v8f16 (INSERT_SUBREG (v8f16 (IMPLICIT_DEF)), FPR16:$Rm, hsub)),
3981*9880d681SAndroid Build Coastguard Worker              (i64 0)),
3982*9880d681SAndroid Build Coastguard Worker            dsub)>;
3983*9880d681SAndroid Build Coastguard Worker
3984*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (vector_insert (v8f16 V128:$Rn),
3985*9880d681SAndroid Build Coastguard Worker            (f16 FPR16:$Rm), (i64 VectorIndexH:$imm))),
3986*9880d681SAndroid Build Coastguard Worker          (INSvi16lane
3987*9880d681SAndroid Build Coastguard Worker            V128:$Rn, VectorIndexH:$imm,
3988*9880d681SAndroid Build Coastguard Worker            (v8f16 (INSERT_SUBREG (v8f16 (IMPLICIT_DEF)), FPR16:$Rm, hsub)),
3989*9880d681SAndroid Build Coastguard Worker            (i64 0))>;
3990*9880d681SAndroid Build Coastguard Worker
3991*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (vector_insert (v2f32 V64:$Rn),
3992*9880d681SAndroid Build Coastguard Worker            (f32 FPR32:$Rm), (i64 VectorIndexS:$imm))),
3993*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG
3994*9880d681SAndroid Build Coastguard Worker            (INSvi32lane
3995*9880d681SAndroid Build Coastguard Worker              (v4f32 (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), V64:$Rn, dsub)),
3996*9880d681SAndroid Build Coastguard Worker              VectorIndexS:$imm,
3997*9880d681SAndroid Build Coastguard Worker              (v4f32 (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), FPR32:$Rm, ssub)),
3998*9880d681SAndroid Build Coastguard Worker              (i64 0)),
3999*9880d681SAndroid Build Coastguard Worker            dsub)>;
4000*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (vector_insert (v4f32 V128:$Rn),
4001*9880d681SAndroid Build Coastguard Worker            (f32 FPR32:$Rm), (i64 VectorIndexS:$imm))),
4002*9880d681SAndroid Build Coastguard Worker          (INSvi32lane
4003*9880d681SAndroid Build Coastguard Worker            V128:$Rn, VectorIndexS:$imm,
4004*9880d681SAndroid Build Coastguard Worker            (v4f32 (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), FPR32:$Rm, ssub)),
4005*9880d681SAndroid Build Coastguard Worker            (i64 0))>;
4006*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (vector_insert (v2f64 V128:$Rn),
4007*9880d681SAndroid Build Coastguard Worker            (f64 FPR64:$Rm), (i64 VectorIndexD:$imm))),
4008*9880d681SAndroid Build Coastguard Worker          (INSvi64lane
4009*9880d681SAndroid Build Coastguard Worker            V128:$Rn, VectorIndexD:$imm,
4010*9880d681SAndroid Build Coastguard Worker            (v2f64 (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), FPR64:$Rm, dsub)),
4011*9880d681SAndroid Build Coastguard Worker            (i64 0))>;
4012*9880d681SAndroid Build Coastguard Worker
4013*9880d681SAndroid Build Coastguard Worker// Copy an element at a constant index in one vector into a constant indexed
4014*9880d681SAndroid Build Coastguard Worker// element of another.
4015*9880d681SAndroid Build Coastguard Worker// FIXME refactor to a shared class/dev parameterized on vector type, vector
4016*9880d681SAndroid Build Coastguard Worker// index type and INS extension
4017*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (int_aarch64_neon_vcopy_lane
4018*9880d681SAndroid Build Coastguard Worker                   (v16i8 V128:$Vd), VectorIndexB:$idx, (v16i8 V128:$Vs),
4019*9880d681SAndroid Build Coastguard Worker                   VectorIndexB:$idx2)),
4020*9880d681SAndroid Build Coastguard Worker          (v16i8 (INSvi8lane
4021*9880d681SAndroid Build Coastguard Worker                   V128:$Vd, VectorIndexB:$idx, V128:$Vs, VectorIndexB:$idx2)
4022*9880d681SAndroid Build Coastguard Worker          )>;
4023*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (int_aarch64_neon_vcopy_lane
4024*9880d681SAndroid Build Coastguard Worker                   (v8i16 V128:$Vd), VectorIndexH:$idx, (v8i16 V128:$Vs),
4025*9880d681SAndroid Build Coastguard Worker                   VectorIndexH:$idx2)),
4026*9880d681SAndroid Build Coastguard Worker          (v8i16 (INSvi16lane
4027*9880d681SAndroid Build Coastguard Worker                   V128:$Vd, VectorIndexH:$idx, V128:$Vs, VectorIndexH:$idx2)
4028*9880d681SAndroid Build Coastguard Worker          )>;
4029*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (int_aarch64_neon_vcopy_lane
4030*9880d681SAndroid Build Coastguard Worker                   (v4i32 V128:$Vd), VectorIndexS:$idx, (v4i32 V128:$Vs),
4031*9880d681SAndroid Build Coastguard Worker                   VectorIndexS:$idx2)),
4032*9880d681SAndroid Build Coastguard Worker          (v4i32 (INSvi32lane
4033*9880d681SAndroid Build Coastguard Worker                   V128:$Vd, VectorIndexS:$idx, V128:$Vs, VectorIndexS:$idx2)
4034*9880d681SAndroid Build Coastguard Worker          )>;
4035*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (int_aarch64_neon_vcopy_lane
4036*9880d681SAndroid Build Coastguard Worker                   (v2i64 V128:$Vd), VectorIndexD:$idx, (v2i64 V128:$Vs),
4037*9880d681SAndroid Build Coastguard Worker                   VectorIndexD:$idx2)),
4038*9880d681SAndroid Build Coastguard Worker          (v2i64 (INSvi64lane
4039*9880d681SAndroid Build Coastguard Worker                   V128:$Vd, VectorIndexD:$idx, V128:$Vs, VectorIndexD:$idx2)
4040*9880d681SAndroid Build Coastguard Worker          )>;
4041*9880d681SAndroid Build Coastguard Worker
4042*9880d681SAndroid Build Coastguard Workermulticlass Neon_INS_elt_pattern<ValueType VT128, ValueType VT64,
4043*9880d681SAndroid Build Coastguard Worker                                ValueType VTScal, Instruction INS> {
4044*9880d681SAndroid Build Coastguard Worker  def : Pat<(VT128 (vector_insert V128:$src,
4045*9880d681SAndroid Build Coastguard Worker                        (VTScal (vector_extract (VT128 V128:$Rn), imm:$Immn)),
4046*9880d681SAndroid Build Coastguard Worker                        imm:$Immd)),
4047*9880d681SAndroid Build Coastguard Worker            (INS V128:$src, imm:$Immd, V128:$Rn, imm:$Immn)>;
4048*9880d681SAndroid Build Coastguard Worker
4049*9880d681SAndroid Build Coastguard Worker  def : Pat<(VT128 (vector_insert V128:$src,
4050*9880d681SAndroid Build Coastguard Worker                        (VTScal (vector_extract (VT64 V64:$Rn), imm:$Immn)),
4051*9880d681SAndroid Build Coastguard Worker                        imm:$Immd)),
4052*9880d681SAndroid Build Coastguard Worker            (INS V128:$src, imm:$Immd,
4053*9880d681SAndroid Build Coastguard Worker                 (SUBREG_TO_REG (i64 0), V64:$Rn, dsub), imm:$Immn)>;
4054*9880d681SAndroid Build Coastguard Worker
4055*9880d681SAndroid Build Coastguard Worker  def : Pat<(VT64 (vector_insert V64:$src,
4056*9880d681SAndroid Build Coastguard Worker                        (VTScal (vector_extract (VT128 V128:$Rn), imm:$Immn)),
4057*9880d681SAndroid Build Coastguard Worker                        imm:$Immd)),
4058*9880d681SAndroid Build Coastguard Worker            (EXTRACT_SUBREG (INS (SUBREG_TO_REG (i64 0), V64:$src, dsub),
4059*9880d681SAndroid Build Coastguard Worker                                 imm:$Immd, V128:$Rn, imm:$Immn),
4060*9880d681SAndroid Build Coastguard Worker                            dsub)>;
4061*9880d681SAndroid Build Coastguard Worker
4062*9880d681SAndroid Build Coastguard Worker  def : Pat<(VT64 (vector_insert V64:$src,
4063*9880d681SAndroid Build Coastguard Worker                        (VTScal (vector_extract (VT64 V64:$Rn), imm:$Immn)),
4064*9880d681SAndroid Build Coastguard Worker                        imm:$Immd)),
4065*9880d681SAndroid Build Coastguard Worker            (EXTRACT_SUBREG
4066*9880d681SAndroid Build Coastguard Worker                (INS (SUBREG_TO_REG (i64 0), V64:$src, dsub), imm:$Immd,
4067*9880d681SAndroid Build Coastguard Worker                     (SUBREG_TO_REG (i64 0), V64:$Rn, dsub), imm:$Immn),
4068*9880d681SAndroid Build Coastguard Worker                dsub)>;
4069*9880d681SAndroid Build Coastguard Worker}
4070*9880d681SAndroid Build Coastguard Worker
4071*9880d681SAndroid Build Coastguard Workerdefm : Neon_INS_elt_pattern<v8f16, v4f16, f16, INSvi16lane>;
4072*9880d681SAndroid Build Coastguard Workerdefm : Neon_INS_elt_pattern<v4f32, v2f32, f32, INSvi32lane>;
4073*9880d681SAndroid Build Coastguard Workerdefm : Neon_INS_elt_pattern<v2f64, v1f64, f64, INSvi64lane>;
4074*9880d681SAndroid Build Coastguard Worker
4075*9880d681SAndroid Build Coastguard Worker
4076*9880d681SAndroid Build Coastguard Worker// Floating point vector extractions are codegen'd as either a sequence of
4077*9880d681SAndroid Build Coastguard Worker// subregister extractions, or a MOV (aka CPY here, alias for DUP) if
4078*9880d681SAndroid Build Coastguard Worker// the lane number is anything other than zero.
4079*9880d681SAndroid Build Coastguard Workerdef : Pat<(vector_extract (v2f64 V128:$Rn), 0),
4080*9880d681SAndroid Build Coastguard Worker          (f64 (EXTRACT_SUBREG V128:$Rn, dsub))>;
4081*9880d681SAndroid Build Coastguard Workerdef : Pat<(vector_extract (v4f32 V128:$Rn), 0),
4082*9880d681SAndroid Build Coastguard Worker          (f32 (EXTRACT_SUBREG V128:$Rn, ssub))>;
4083*9880d681SAndroid Build Coastguard Workerdef : Pat<(vector_extract (v8f16 V128:$Rn), 0),
4084*9880d681SAndroid Build Coastguard Worker          (f16 (EXTRACT_SUBREG V128:$Rn, hsub))>;
4085*9880d681SAndroid Build Coastguard Worker
4086*9880d681SAndroid Build Coastguard Workerdef : Pat<(vector_extract (v2f64 V128:$Rn), VectorIndexD:$idx),
4087*9880d681SAndroid Build Coastguard Worker          (f64 (CPYi64 V128:$Rn, VectorIndexD:$idx))>;
4088*9880d681SAndroid Build Coastguard Workerdef : Pat<(vector_extract (v4f32 V128:$Rn), VectorIndexS:$idx),
4089*9880d681SAndroid Build Coastguard Worker          (f32 (CPYi32 V128:$Rn, VectorIndexS:$idx))>;
4090*9880d681SAndroid Build Coastguard Workerdef : Pat<(vector_extract (v8f16 V128:$Rn), VectorIndexH:$idx),
4091*9880d681SAndroid Build Coastguard Worker          (f16 (CPYi16 V128:$Rn, VectorIndexH:$idx))>;
4092*9880d681SAndroid Build Coastguard Worker
4093*9880d681SAndroid Build Coastguard Worker// All concat_vectors operations are canonicalised to act on i64 vectors for
4094*9880d681SAndroid Build Coastguard Worker// AArch64. In the general case we need an instruction, which had just as well be
4095*9880d681SAndroid Build Coastguard Worker// INS.
4096*9880d681SAndroid Build Coastguard Workerclass ConcatPat<ValueType DstTy, ValueType SrcTy>
4097*9880d681SAndroid Build Coastguard Worker  : Pat<(DstTy (concat_vectors (SrcTy V64:$Rd), V64:$Rn)),
4098*9880d681SAndroid Build Coastguard Worker        (INSvi64lane (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub), 1,
4099*9880d681SAndroid Build Coastguard Worker                     (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rn, dsub), 0)>;
4100*9880d681SAndroid Build Coastguard Worker
4101*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v2i64, v1i64>;
4102*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v2f64, v1f64>;
4103*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v4i32, v2i32>;
4104*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v4f32, v2f32>;
4105*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v8i16, v4i16>;
4106*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v8f16, v4f16>;
4107*9880d681SAndroid Build Coastguard Workerdef : ConcatPat<v16i8, v8i8>;
4108*9880d681SAndroid Build Coastguard Worker
4109*9880d681SAndroid Build Coastguard Worker// If the high lanes are undef, though, we can just ignore them:
4110*9880d681SAndroid Build Coastguard Workerclass ConcatUndefPat<ValueType DstTy, ValueType SrcTy>
4111*9880d681SAndroid Build Coastguard Worker  : Pat<(DstTy (concat_vectors (SrcTy V64:$Rn), undef)),
4112*9880d681SAndroid Build Coastguard Worker        (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rn, dsub)>;
4113*9880d681SAndroid Build Coastguard Worker
4114*9880d681SAndroid Build Coastguard Workerdef : ConcatUndefPat<v2i64, v1i64>;
4115*9880d681SAndroid Build Coastguard Workerdef : ConcatUndefPat<v2f64, v1f64>;
4116*9880d681SAndroid Build Coastguard Workerdef : ConcatUndefPat<v4i32, v2i32>;
4117*9880d681SAndroid Build Coastguard Workerdef : ConcatUndefPat<v4f32, v2f32>;
4118*9880d681SAndroid Build Coastguard Workerdef : ConcatUndefPat<v8i16, v4i16>;
4119*9880d681SAndroid Build Coastguard Workerdef : ConcatUndefPat<v16i8, v8i8>;
4120*9880d681SAndroid Build Coastguard Worker
4121*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
4122*9880d681SAndroid Build Coastguard Worker// AdvSIMD across lanes instructions
4123*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
4124*9880d681SAndroid Build Coastguard Worker
4125*9880d681SAndroid Build Coastguard Workerdefm ADDV    : SIMDAcrossLanesBHS<0, 0b11011, "addv">;
4126*9880d681SAndroid Build Coastguard Workerdefm SMAXV   : SIMDAcrossLanesBHS<0, 0b01010, "smaxv">;
4127*9880d681SAndroid Build Coastguard Workerdefm SMINV   : SIMDAcrossLanesBHS<0, 0b11010, "sminv">;
4128*9880d681SAndroid Build Coastguard Workerdefm UMAXV   : SIMDAcrossLanesBHS<1, 0b01010, "umaxv">;
4129*9880d681SAndroid Build Coastguard Workerdefm UMINV   : SIMDAcrossLanesBHS<1, 0b11010, "uminv">;
4130*9880d681SAndroid Build Coastguard Workerdefm SADDLV  : SIMDAcrossLanesHSD<0, 0b00011, "saddlv">;
4131*9880d681SAndroid Build Coastguard Workerdefm UADDLV  : SIMDAcrossLanesHSD<1, 0b00011, "uaddlv">;
4132*9880d681SAndroid Build Coastguard Workerdefm FMAXNMV : SIMDFPAcrossLanes<0b01100, 0, "fmaxnmv", int_aarch64_neon_fmaxnmv>;
4133*9880d681SAndroid Build Coastguard Workerdefm FMAXV   : SIMDFPAcrossLanes<0b01111, 0, "fmaxv", int_aarch64_neon_fmaxv>;
4134*9880d681SAndroid Build Coastguard Workerdefm FMINNMV : SIMDFPAcrossLanes<0b01100, 1, "fminnmv", int_aarch64_neon_fminnmv>;
4135*9880d681SAndroid Build Coastguard Workerdefm FMINV   : SIMDFPAcrossLanes<0b01111, 1, "fminv", int_aarch64_neon_fminv>;
4136*9880d681SAndroid Build Coastguard Worker
4137*9880d681SAndroid Build Coastguard Worker// Patterns for across-vector intrinsics, that have a node equivalent, that
4138*9880d681SAndroid Build Coastguard Worker// returns a vector (with only the low lane defined) instead of a scalar.
4139*9880d681SAndroid Build Coastguard Worker// In effect, opNode is the same as (scalar_to_vector (IntNode)).
4140*9880d681SAndroid Build Coastguard Workermulticlass SIMDAcrossLanesIntrinsic<string baseOpc,
4141*9880d681SAndroid Build Coastguard Worker                                    SDPatternOperator opNode> {
4142*9880d681SAndroid Build Coastguard Worker// If a lane instruction caught the vector_extract around opNode, we can
4143*9880d681SAndroid Build Coastguard Worker// directly match the latter to the instruction.
4144*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (opNode V64:$Rn)),
4145*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v8i8 (IMPLICIT_DEF)),
4146*9880d681SAndroid Build Coastguard Worker           (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), bsub)>;
4147*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (opNode V128:$Rn)),
4148*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4149*9880d681SAndroid Build Coastguard Worker           (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), bsub)>;
4150*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (opNode V64:$Rn)),
4151*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v4i16 (IMPLICIT_DEF)),
4152*9880d681SAndroid Build Coastguard Worker           (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), hsub)>;
4153*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (opNode V128:$Rn)),
4154*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)),
4155*9880d681SAndroid Build Coastguard Worker           (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), hsub)>;
4156*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (opNode V128:$Rn)),
4157*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)),
4158*9880d681SAndroid Build Coastguard Worker           (!cast<Instruction>(!strconcat(baseOpc, "v4i32v")) V128:$Rn), ssub)>;
4159*9880d681SAndroid Build Coastguard Worker
4160*9880d681SAndroid Build Coastguard Worker
4161*9880d681SAndroid Build Coastguard Worker// If none did, fallback to the explicit patterns, consuming the vector_extract.
4162*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (vector_extract (insert_subvector undef, (v8i8 (opNode V64:$Rn)),
4163*9880d681SAndroid Build Coastguard Worker            (i32 0)), (i64 0))),
4164*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (INSERT_SUBREG (v8i8 (IMPLICIT_DEF)),
4165*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn),
4166*9880d681SAndroid Build Coastguard Worker            bsub), ssub)>;
4167*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (vector_extract (v16i8 (opNode V128:$Rn)), (i64 0))),
4168*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4169*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn),
4170*9880d681SAndroid Build Coastguard Worker            bsub), ssub)>;
4171*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (vector_extract (insert_subvector undef,
4172*9880d681SAndroid Build Coastguard Worker            (v4i16 (opNode V64:$Rn)), (i32 0)), (i64 0))),
4173*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (INSERT_SUBREG (v4i16 (IMPLICIT_DEF)),
4174*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn),
4175*9880d681SAndroid Build Coastguard Worker            hsub), ssub)>;
4176*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (vector_extract (v8i16 (opNode V128:$Rn)), (i64 0))),
4177*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)),
4178*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn),
4179*9880d681SAndroid Build Coastguard Worker            hsub), ssub)>;
4180*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (vector_extract (v4i32 (opNode V128:$Rn)), (i64 0))),
4181*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)),
4182*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v4i32v")) V128:$Rn),
4183*9880d681SAndroid Build Coastguard Worker            ssub), ssub)>;
4184*9880d681SAndroid Build Coastguard Worker
4185*9880d681SAndroid Build Coastguard Worker}
4186*9880d681SAndroid Build Coastguard Worker
4187*9880d681SAndroid Build Coastguard Workermulticlass SIMDAcrossLanesSignedIntrinsic<string baseOpc,
4188*9880d681SAndroid Build Coastguard Worker                                          SDPatternOperator opNode>
4189*9880d681SAndroid Build Coastguard Worker    : SIMDAcrossLanesIntrinsic<baseOpc, opNode> {
4190*9880d681SAndroid Build Coastguard Worker// If there is a sign extension after this intrinsic, consume it as smov already
4191*9880d681SAndroid Build Coastguard Worker// performed it
4192*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg (i32 (vector_extract (insert_subvector undef,
4193*9880d681SAndroid Build Coastguard Worker            (opNode (v8i8 V64:$Rn)), (i32 0)), (i64 0))), i8)),
4194*9880d681SAndroid Build Coastguard Worker          (i32 (SMOVvi8to32
4195*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4196*9880d681SAndroid Build Coastguard Worker              (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), bsub),
4197*9880d681SAndroid Build Coastguard Worker            (i64 0)))>;
4198*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg (i32 (vector_extract
4199*9880d681SAndroid Build Coastguard Worker            (opNode (v16i8 V128:$Rn)), (i64 0))), i8)),
4200*9880d681SAndroid Build Coastguard Worker          (i32 (SMOVvi8to32
4201*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4202*9880d681SAndroid Build Coastguard Worker             (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), bsub),
4203*9880d681SAndroid Build Coastguard Worker            (i64 0)))>;
4204*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg (i32 (vector_extract (insert_subvector undef,
4205*9880d681SAndroid Build Coastguard Worker            (opNode (v4i16 V64:$Rn)), (i32 0)), (i64 0))), i16)),
4206*9880d681SAndroid Build Coastguard Worker          (i32 (SMOVvi16to32
4207*9880d681SAndroid Build Coastguard Worker           (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4208*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), hsub),
4209*9880d681SAndroid Build Coastguard Worker           (i64 0)))>;
4210*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg (i32 (vector_extract
4211*9880d681SAndroid Build Coastguard Worker            (opNode (v8i16 V128:$Rn)), (i64 0))), i16)),
4212*9880d681SAndroid Build Coastguard Worker          (i32 (SMOVvi16to32
4213*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4214*9880d681SAndroid Build Coastguard Worker             (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), hsub),
4215*9880d681SAndroid Build Coastguard Worker            (i64 0)))>;
4216*9880d681SAndroid Build Coastguard Worker}
4217*9880d681SAndroid Build Coastguard Worker
4218*9880d681SAndroid Build Coastguard Workermulticlass SIMDAcrossLanesUnsignedIntrinsic<string baseOpc,
4219*9880d681SAndroid Build Coastguard Worker                                            SDPatternOperator opNode>
4220*9880d681SAndroid Build Coastguard Worker    : SIMDAcrossLanesIntrinsic<baseOpc, opNode> {
4221*9880d681SAndroid Build Coastguard Worker// If there is a masking operation keeping only what has been actually
4222*9880d681SAndroid Build Coastguard Worker// generated, consume it.
4223*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (and (i32 (vector_extract (insert_subvector undef,
4224*9880d681SAndroid Build Coastguard Worker            (opNode (v8i8 V64:$Rn)), (i32 0)), (i64 0))), maski8_or_more)),
4225*9880d681SAndroid Build Coastguard Worker      (i32 (EXTRACT_SUBREG
4226*9880d681SAndroid Build Coastguard Worker        (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4227*9880d681SAndroid Build Coastguard Worker          (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), bsub),
4228*9880d681SAndroid Build Coastguard Worker        ssub))>;
4229*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (and (i32 (vector_extract (opNode (v16i8 V128:$Rn)), (i64 0))),
4230*9880d681SAndroid Build Coastguard Worker            maski8_or_more)),
4231*9880d681SAndroid Build Coastguard Worker        (i32 (EXTRACT_SUBREG
4232*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4233*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), bsub),
4234*9880d681SAndroid Build Coastguard Worker          ssub))>;
4235*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (and (i32 (vector_extract (insert_subvector undef,
4236*9880d681SAndroid Build Coastguard Worker            (opNode (v4i16 V64:$Rn)), (i32 0)), (i64 0))), maski16_or_more)),
4237*9880d681SAndroid Build Coastguard Worker          (i32 (EXTRACT_SUBREG
4238*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4239*9880d681SAndroid Build Coastguard Worker              (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), hsub),
4240*9880d681SAndroid Build Coastguard Worker            ssub))>;
4241*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (and (i32 (vector_extract (opNode (v8i16 V128:$Rn)), (i64 0))),
4242*9880d681SAndroid Build Coastguard Worker            maski16_or_more)),
4243*9880d681SAndroid Build Coastguard Worker        (i32 (EXTRACT_SUBREG
4244*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4245*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), hsub),
4246*9880d681SAndroid Build Coastguard Worker          ssub))>;
4247*9880d681SAndroid Build Coastguard Worker}
4248*9880d681SAndroid Build Coastguard Worker
4249*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesSignedIntrinsic<"ADDV",  AArch64saddv>;
4250*9880d681SAndroid Build Coastguard Worker// vaddv_[su]32 is special; -> ADDP Vd.2S,Vn.2S,Vm.2S; return Vd.s[0];Vn==Vm
4251*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64saddv (v2i32 V64:$Rn))),
4252*9880d681SAndroid Build Coastguard Worker          (ADDPv2i32 V64:$Rn, V64:$Rn)>;
4253*9880d681SAndroid Build Coastguard Worker
4254*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesUnsignedIntrinsic<"ADDV", AArch64uaddv>;
4255*9880d681SAndroid Build Coastguard Worker// vaddv_[su]32 is special; -> ADDP Vd.2S,Vn.2S,Vm.2S; return Vd.s[0];Vn==Vm
4256*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64uaddv (v2i32 V64:$Rn))),
4257*9880d681SAndroid Build Coastguard Worker          (ADDPv2i32 V64:$Rn, V64:$Rn)>;
4258*9880d681SAndroid Build Coastguard Worker
4259*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesSignedIntrinsic<"SMAXV", AArch64smaxv>;
4260*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64smaxv (v2i32 V64:$Rn))),
4261*9880d681SAndroid Build Coastguard Worker          (SMAXPv2i32 V64:$Rn, V64:$Rn)>;
4262*9880d681SAndroid Build Coastguard Worker
4263*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesSignedIntrinsic<"SMINV", AArch64sminv>;
4264*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64sminv (v2i32 V64:$Rn))),
4265*9880d681SAndroid Build Coastguard Worker          (SMINPv2i32 V64:$Rn, V64:$Rn)>;
4266*9880d681SAndroid Build Coastguard Worker
4267*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesUnsignedIntrinsic<"UMAXV", AArch64umaxv>;
4268*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64umaxv (v2i32 V64:$Rn))),
4269*9880d681SAndroid Build Coastguard Worker          (UMAXPv2i32 V64:$Rn, V64:$Rn)>;
4270*9880d681SAndroid Build Coastguard Worker
4271*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesUnsignedIntrinsic<"UMINV", AArch64uminv>;
4272*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64uminv (v2i32 V64:$Rn))),
4273*9880d681SAndroid Build Coastguard Worker          (UMINPv2i32 V64:$Rn, V64:$Rn)>;
4274*9880d681SAndroid Build Coastguard Worker
4275*9880d681SAndroid Build Coastguard Workermulticlass SIMDAcrossLanesSignedLongIntrinsic<string baseOpc, Intrinsic intOp> {
4276*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (intOp (v8i8 V64:$Rn))),
4277*9880d681SAndroid Build Coastguard Worker        (i32 (SMOVvi16to32
4278*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4279*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), hsub),
4280*9880d681SAndroid Build Coastguard Worker          (i64 0)))>;
4281*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (intOp (v16i8 V128:$Rn))),
4282*9880d681SAndroid Build Coastguard Worker        (i32 (SMOVvi16to32
4283*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4284*9880d681SAndroid Build Coastguard Worker           (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), hsub),
4285*9880d681SAndroid Build Coastguard Worker          (i64 0)))>;
4286*9880d681SAndroid Build Coastguard Worker
4287*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (intOp (v4i16 V64:$Rn))),
4288*9880d681SAndroid Build Coastguard Worker          (i32 (EXTRACT_SUBREG
4289*9880d681SAndroid Build Coastguard Worker           (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4290*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), ssub),
4291*9880d681SAndroid Build Coastguard Worker           ssub))>;
4292*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (intOp (v8i16 V128:$Rn))),
4293*9880d681SAndroid Build Coastguard Worker        (i32 (EXTRACT_SUBREG
4294*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4295*9880d681SAndroid Build Coastguard Worker           (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), ssub),
4296*9880d681SAndroid Build Coastguard Worker          ssub))>;
4297*9880d681SAndroid Build Coastguard Worker
4298*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (intOp (v4i32 V128:$Rn))),
4299*9880d681SAndroid Build Coastguard Worker        (i64 (EXTRACT_SUBREG
4300*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4301*9880d681SAndroid Build Coastguard Worker           (!cast<Instruction>(!strconcat(baseOpc, "v4i32v")) V128:$Rn), dsub),
4302*9880d681SAndroid Build Coastguard Worker          dsub))>;
4303*9880d681SAndroid Build Coastguard Worker}
4304*9880d681SAndroid Build Coastguard Worker
4305*9880d681SAndroid Build Coastguard Workermulticlass SIMDAcrossLanesUnsignedLongIntrinsic<string baseOpc,
4306*9880d681SAndroid Build Coastguard Worker                                                Intrinsic intOp> {
4307*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (intOp (v8i8 V64:$Rn))),
4308*9880d681SAndroid Build Coastguard Worker        (i32 (EXTRACT_SUBREG
4309*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4310*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), hsub),
4311*9880d681SAndroid Build Coastguard Worker          ssub))>;
4312*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (intOp (v16i8 V128:$Rn))),
4313*9880d681SAndroid Build Coastguard Worker        (i32 (EXTRACT_SUBREG
4314*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4315*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), hsub),
4316*9880d681SAndroid Build Coastguard Worker          ssub))>;
4317*9880d681SAndroid Build Coastguard Worker
4318*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (intOp (v4i16 V64:$Rn))),
4319*9880d681SAndroid Build Coastguard Worker          (i32 (EXTRACT_SUBREG
4320*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4321*9880d681SAndroid Build Coastguard Worker              (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), ssub),
4322*9880d681SAndroid Build Coastguard Worker            ssub))>;
4323*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (intOp (v8i16 V128:$Rn))),
4324*9880d681SAndroid Build Coastguard Worker        (i32 (EXTRACT_SUBREG
4325*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4326*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), ssub),
4327*9880d681SAndroid Build Coastguard Worker          ssub))>;
4328*9880d681SAndroid Build Coastguard Worker
4329*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (intOp (v4i32 V128:$Rn))),
4330*9880d681SAndroid Build Coastguard Worker        (i64 (EXTRACT_SUBREG
4331*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4332*9880d681SAndroid Build Coastguard Worker            (!cast<Instruction>(!strconcat(baseOpc, "v4i32v")) V128:$Rn), dsub),
4333*9880d681SAndroid Build Coastguard Worker          dsub))>;
4334*9880d681SAndroid Build Coastguard Worker}
4335*9880d681SAndroid Build Coastguard Worker
4336*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesSignedLongIntrinsic<"SADDLV", int_aarch64_neon_saddlv>;
4337*9880d681SAndroid Build Coastguard Workerdefm : SIMDAcrossLanesUnsignedLongIntrinsic<"UADDLV", int_aarch64_neon_uaddlv>;
4338*9880d681SAndroid Build Coastguard Worker
4339*9880d681SAndroid Build Coastguard Worker// The vaddlv_s32 intrinsic gets mapped to SADDLP.
4340*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_saddlv (v2i32 V64:$Rn))),
4341*9880d681SAndroid Build Coastguard Worker          (i64 (EXTRACT_SUBREG
4342*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4343*9880d681SAndroid Build Coastguard Worker              (SADDLPv2i32_v1i64 V64:$Rn), dsub),
4344*9880d681SAndroid Build Coastguard Worker            dsub))>;
4345*9880d681SAndroid Build Coastguard Worker// The vaddlv_u32 intrinsic gets mapped to UADDLP.
4346*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_uaddlv (v2i32 V64:$Rn))),
4347*9880d681SAndroid Build Coastguard Worker          (i64 (EXTRACT_SUBREG
4348*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4349*9880d681SAndroid Build Coastguard Worker              (UADDLPv2i32_v1i64 V64:$Rn), dsub),
4350*9880d681SAndroid Build Coastguard Worker            dsub))>;
4351*9880d681SAndroid Build Coastguard Worker
4352*9880d681SAndroid Build Coastguard Worker//------------------------------------------------------------------------------
4353*9880d681SAndroid Build Coastguard Worker// AdvSIMD modified immediate instructions
4354*9880d681SAndroid Build Coastguard Worker//------------------------------------------------------------------------------
4355*9880d681SAndroid Build Coastguard Worker
4356*9880d681SAndroid Build Coastguard Worker// AdvSIMD BIC
4357*9880d681SAndroid Build Coastguard Workerdefm BIC : SIMDModifiedImmVectorShiftTied<1, 0b11, 0b01, "bic", AArch64bici>;
4358*9880d681SAndroid Build Coastguard Worker// AdvSIMD ORR
4359*9880d681SAndroid Build Coastguard Workerdefm ORR : SIMDModifiedImmVectorShiftTied<0, 0b11, 0b01, "orr", AArch64orri>;
4360*9880d681SAndroid Build Coastguard Worker
4361*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic $Vd.4h, $imm", (BICv4i16 V64:$Vd,  imm0_255:$imm, 0)>;
4362*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic $Vd.8h, $imm", (BICv8i16 V128:$Vd, imm0_255:$imm, 0)>;
4363*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic $Vd.2s, $imm", (BICv2i32 V64:$Vd,  imm0_255:$imm, 0)>;
4364*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic $Vd.4s, $imm", (BICv4i32 V128:$Vd, imm0_255:$imm, 0)>;
4365*9880d681SAndroid Build Coastguard Worker
4366*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic.4h $Vd, $imm", (BICv4i16 V64:$Vd,  imm0_255:$imm, 0), 0>;
4367*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic.8h $Vd, $imm", (BICv8i16 V128:$Vd, imm0_255:$imm, 0), 0>;
4368*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic.2s $Vd, $imm", (BICv2i32 V64:$Vd,  imm0_255:$imm, 0), 0>;
4369*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bic.4s $Vd, $imm", (BICv4i32 V128:$Vd, imm0_255:$imm, 0), 0>;
4370*9880d681SAndroid Build Coastguard Worker
4371*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr $Vd.4h, $imm", (ORRv4i16 V64:$Vd,  imm0_255:$imm, 0)>;
4372*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr $Vd.8h, $imm", (ORRv8i16 V128:$Vd, imm0_255:$imm, 0)>;
4373*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr $Vd.2s, $imm", (ORRv2i32 V64:$Vd,  imm0_255:$imm, 0)>;
4374*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr $Vd.4s, $imm", (ORRv4i32 V128:$Vd, imm0_255:$imm, 0)>;
4375*9880d681SAndroid Build Coastguard Worker
4376*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr.4h $Vd, $imm", (ORRv4i16 V64:$Vd,  imm0_255:$imm, 0), 0>;
4377*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr.8h $Vd, $imm", (ORRv8i16 V128:$Vd, imm0_255:$imm, 0), 0>;
4378*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr.2s $Vd, $imm", (ORRv2i32 V64:$Vd,  imm0_255:$imm, 0), 0>;
4379*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"orr.4s $Vd, $imm", (ORRv4i32 V128:$Vd, imm0_255:$imm, 0), 0>;
4380*9880d681SAndroid Build Coastguard Worker
4381*9880d681SAndroid Build Coastguard Worker// AdvSIMD FMOV
4382*9880d681SAndroid Build Coastguard Workerdef FMOVv2f64_ns : SIMDModifiedImmVectorNoShift<1, 1, 0, 0b1111, V128, fpimm8,
4383*9880d681SAndroid Build Coastguard Worker                                              "fmov", ".2d",
4384*9880d681SAndroid Build Coastguard Worker                       [(set (v2f64 V128:$Rd), (AArch64fmov imm0_255:$imm8))]>;
4385*9880d681SAndroid Build Coastguard Workerdef FMOVv2f32_ns : SIMDModifiedImmVectorNoShift<0, 0, 0, 0b1111, V64,  fpimm8,
4386*9880d681SAndroid Build Coastguard Worker                                              "fmov", ".2s",
4387*9880d681SAndroid Build Coastguard Worker                       [(set (v2f32 V64:$Rd), (AArch64fmov imm0_255:$imm8))]>;
4388*9880d681SAndroid Build Coastguard Workerdef FMOVv4f32_ns : SIMDModifiedImmVectorNoShift<1, 0, 0, 0b1111, V128, fpimm8,
4389*9880d681SAndroid Build Coastguard Worker                                              "fmov", ".4s",
4390*9880d681SAndroid Build Coastguard Worker                       [(set (v4f32 V128:$Rd), (AArch64fmov imm0_255:$imm8))]>;
4391*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasNEON, HasFullFP16] in {
4392*9880d681SAndroid Build Coastguard Workerdef FMOVv4f16_ns : SIMDModifiedImmVectorNoShift<0, 0, 1, 0b1111, V64,  fpimm8,
4393*9880d681SAndroid Build Coastguard Worker                                              "fmov", ".4h",
4394*9880d681SAndroid Build Coastguard Worker                       [(set (v4f16 V64:$Rd), (AArch64fmov imm0_255:$imm8))]>;
4395*9880d681SAndroid Build Coastguard Workerdef FMOVv8f16_ns : SIMDModifiedImmVectorNoShift<1, 0, 1, 0b1111, V128, fpimm8,
4396*9880d681SAndroid Build Coastguard Worker                                              "fmov", ".8h",
4397*9880d681SAndroid Build Coastguard Worker                       [(set (v8f16 V128:$Rd), (AArch64fmov imm0_255:$imm8))]>;
4398*9880d681SAndroid Build Coastguard Worker} // Predicates = [HasNEON, HasFullFP16]
4399*9880d681SAndroid Build Coastguard Worker
4400*9880d681SAndroid Build Coastguard Worker// AdvSIMD MOVI
4401*9880d681SAndroid Build Coastguard Worker
4402*9880d681SAndroid Build Coastguard Worker// EDIT byte mask: scalar
4403*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isAsCheapAsAMove = 1 in
4404*9880d681SAndroid Build Coastguard Workerdef MOVID      : SIMDModifiedImmScalarNoShift<0, 1, 0b1110, "movi",
4405*9880d681SAndroid Build Coastguard Worker                    [(set FPR64:$Rd, simdimmtype10:$imm8)]>;
4406*9880d681SAndroid Build Coastguard Worker// The movi_edit node has the immediate value already encoded, so we use
4407*9880d681SAndroid Build Coastguard Worker// a plain imm0_255 here.
4408*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (AArch64movi_edit imm0_255:$shift)),
4409*9880d681SAndroid Build Coastguard Worker          (MOVID imm0_255:$shift)>;
4410*9880d681SAndroid Build Coastguard Worker
4411*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 immAllZerosV), (MOVID (i32 0))>;
4412*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 immAllZerosV), (MOVID (i32 0))>;
4413*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 immAllZerosV), (MOVID (i32 0))>;
4414*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  immAllZerosV), (MOVID (i32 0))>;
4415*9880d681SAndroid Build Coastguard Worker
4416*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 immAllOnesV), (MOVID (i32 255))>;
4417*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 immAllOnesV), (MOVID (i32 255))>;
4418*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 immAllOnesV), (MOVID (i32 255))>;
4419*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  immAllOnesV), (MOVID (i32 255))>;
4420*9880d681SAndroid Build Coastguard Worker
4421*9880d681SAndroid Build Coastguard Worker// EDIT byte mask: 2d
4422*9880d681SAndroid Build Coastguard Worker
4423*9880d681SAndroid Build Coastguard Worker// The movi_edit node has the immediate value already encoded, so we use
4424*9880d681SAndroid Build Coastguard Worker// a plain imm0_255 in the pattern
4425*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isAsCheapAsAMove = 1 in
4426*9880d681SAndroid Build Coastguard Workerdef MOVIv2d_ns   : SIMDModifiedImmVectorNoShift<1, 1, 0, 0b1110, V128,
4427*9880d681SAndroid Build Coastguard Worker                                                simdimmtype10,
4428*9880d681SAndroid Build Coastguard Worker                                                "movi", ".2d",
4429*9880d681SAndroid Build Coastguard Worker                   [(set (v2i64 V128:$Rd), (AArch64movi_edit imm0_255:$imm8))]>;
4430*9880d681SAndroid Build Coastguard Worker
4431*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 immAllZerosV), (MOVIv2d_ns (i32 0))>;
4432*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 immAllZerosV), (MOVIv2d_ns (i32 0))>;
4433*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 immAllZerosV), (MOVIv2d_ns (i32 0))>;
4434*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 immAllZerosV), (MOVIv2d_ns (i32 0))>;
4435*9880d681SAndroid Build Coastguard Worker
4436*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 immAllOnesV), (MOVIv2d_ns (i32 255))>;
4437*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 immAllOnesV), (MOVIv2d_ns (i32 255))>;
4438*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 immAllOnesV), (MOVIv2d_ns (i32 255))>;
4439*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 immAllOnesV), (MOVIv2d_ns (i32 255))>;
4440*9880d681SAndroid Build Coastguard Worker
4441*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64dup (f64 fpimm0))), (MOVIv2d_ns (i32 0))>;
4442*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64dup (f32 fpimm0))), (MOVIv2d_ns (i32 0))>;
4443*9880d681SAndroid Build Coastguard Worker
4444*9880d681SAndroid Build Coastguard Worker// EDIT per word & halfword: 2s, 4h, 4s, & 8h
4445*9880d681SAndroid Build Coastguard Workerdefm MOVI      : SIMDModifiedImmVectorShift<0, 0b10, 0b00, "movi">;
4446*9880d681SAndroid Build Coastguard Worker
4447*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi $Vd.4h, $imm", (MOVIv4i16 V64:$Vd,  imm0_255:$imm, 0), 0>;
4448*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi $Vd.8h, $imm", (MOVIv8i16 V128:$Vd, imm0_255:$imm, 0), 0>;
4449*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi $Vd.2s, $imm", (MOVIv2i32 V64:$Vd,  imm0_255:$imm, 0), 0>;
4450*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi $Vd.4s, $imm", (MOVIv4i32 V128:$Vd, imm0_255:$imm, 0), 0>;
4451*9880d681SAndroid Build Coastguard Worker
4452*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi.4h $Vd, $imm", (MOVIv4i16 V64:$Vd,  imm0_255:$imm, 0), 0>;
4453*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi.8h $Vd, $imm", (MOVIv8i16 V128:$Vd, imm0_255:$imm, 0), 0>;
4454*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi.2s $Vd, $imm", (MOVIv2i32 V64:$Vd,  imm0_255:$imm, 0), 0>;
4455*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"movi.4s $Vd, $imm", (MOVIv4i32 V128:$Vd, imm0_255:$imm, 0), 0>;
4456*9880d681SAndroid Build Coastguard Worker
4457*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64movi_shift imm0_255:$imm8, (i32 imm:$shift))),
4458*9880d681SAndroid Build Coastguard Worker          (MOVIv2i32 imm0_255:$imm8, imm:$shift)>;
4459*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64movi_shift imm0_255:$imm8, (i32 imm:$shift))),
4460*9880d681SAndroid Build Coastguard Worker          (MOVIv4i32 imm0_255:$imm8, imm:$shift)>;
4461*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64movi_shift imm0_255:$imm8, (i32 imm:$shift))),
4462*9880d681SAndroid Build Coastguard Worker          (MOVIv4i16 imm0_255:$imm8, imm:$shift)>;
4463*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64movi_shift imm0_255:$imm8, (i32 imm:$shift))),
4464*9880d681SAndroid Build Coastguard Worker          (MOVIv8i16 imm0_255:$imm8, imm:$shift)>;
4465*9880d681SAndroid Build Coastguard Worker
4466*9880d681SAndroid Build Coastguard Worker// EDIT per word: 2s & 4s with MSL shifter
4467*9880d681SAndroid Build Coastguard Workerdef MOVIv2s_msl  : SIMDModifiedImmMoveMSL<0, 0, {1,1,0,?}, V64, "movi", ".2s",
4468*9880d681SAndroid Build Coastguard Worker                      [(set (v2i32 V64:$Rd),
4469*9880d681SAndroid Build Coastguard Worker                            (AArch64movi_msl imm0_255:$imm8, (i32 imm:$shift)))]>;
4470*9880d681SAndroid Build Coastguard Workerdef MOVIv4s_msl  : SIMDModifiedImmMoveMSL<1, 0, {1,1,0,?}, V128, "movi", ".4s",
4471*9880d681SAndroid Build Coastguard Worker                      [(set (v4i32 V128:$Rd),
4472*9880d681SAndroid Build Coastguard Worker                            (AArch64movi_msl imm0_255:$imm8, (i32 imm:$shift)))]>;
4473*9880d681SAndroid Build Coastguard Worker
4474*9880d681SAndroid Build Coastguard Worker// Per byte: 8b & 16b
4475*9880d681SAndroid Build Coastguard Workerdef MOVIv8b_ns   : SIMDModifiedImmVectorNoShift<0, 0, 0, 0b1110, V64,  imm0_255,
4476*9880d681SAndroid Build Coastguard Worker                                                 "movi", ".8b",
4477*9880d681SAndroid Build Coastguard Worker                       [(set (v8i8 V64:$Rd), (AArch64movi imm0_255:$imm8))]>;
4478*9880d681SAndroid Build Coastguard Workerdef MOVIv16b_ns  : SIMDModifiedImmVectorNoShift<1, 0, 0, 0b1110, V128, imm0_255,
4479*9880d681SAndroid Build Coastguard Worker                                                 "movi", ".16b",
4480*9880d681SAndroid Build Coastguard Worker                       [(set (v16i8 V128:$Rd), (AArch64movi imm0_255:$imm8))]>;
4481*9880d681SAndroid Build Coastguard Worker
4482*9880d681SAndroid Build Coastguard Worker// AdvSIMD MVNI
4483*9880d681SAndroid Build Coastguard Worker
4484*9880d681SAndroid Build Coastguard Worker// EDIT per word & halfword: 2s, 4h, 4s, & 8h
4485*9880d681SAndroid Build Coastguard Workerdefm MVNI      : SIMDModifiedImmVectorShift<1, 0b10, 0b00, "mvni">;
4486*9880d681SAndroid Build Coastguard Worker
4487*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni $Vd.4h, $imm", (MVNIv4i16 V64:$Vd,  imm0_255:$imm, 0), 0>;
4488*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni $Vd.8h, $imm", (MVNIv8i16 V128:$Vd, imm0_255:$imm, 0), 0>;
4489*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni $Vd.2s, $imm", (MVNIv2i32 V64:$Vd,  imm0_255:$imm, 0), 0>;
4490*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni $Vd.4s, $imm", (MVNIv4i32 V128:$Vd, imm0_255:$imm, 0), 0>;
4491*9880d681SAndroid Build Coastguard Worker
4492*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni.4h $Vd, $imm", (MVNIv4i16 V64:$Vd,  imm0_255:$imm, 0), 0>;
4493*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni.8h $Vd, $imm", (MVNIv8i16 V128:$Vd, imm0_255:$imm, 0), 0>;
4494*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni.2s $Vd, $imm", (MVNIv2i32 V64:$Vd,  imm0_255:$imm, 0), 0>;
4495*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mvni.4s $Vd, $imm", (MVNIv4i32 V128:$Vd, imm0_255:$imm, 0), 0>;
4496*9880d681SAndroid Build Coastguard Worker
4497*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64mvni_shift imm0_255:$imm8, (i32 imm:$shift))),
4498*9880d681SAndroid Build Coastguard Worker          (MVNIv2i32 imm0_255:$imm8, imm:$shift)>;
4499*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64mvni_shift imm0_255:$imm8, (i32 imm:$shift))),
4500*9880d681SAndroid Build Coastguard Worker          (MVNIv4i32 imm0_255:$imm8, imm:$shift)>;
4501*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64mvni_shift imm0_255:$imm8, (i32 imm:$shift))),
4502*9880d681SAndroid Build Coastguard Worker          (MVNIv4i16 imm0_255:$imm8, imm:$shift)>;
4503*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64mvni_shift imm0_255:$imm8, (i32 imm:$shift))),
4504*9880d681SAndroid Build Coastguard Worker          (MVNIv8i16 imm0_255:$imm8, imm:$shift)>;
4505*9880d681SAndroid Build Coastguard Worker
4506*9880d681SAndroid Build Coastguard Worker// EDIT per word: 2s & 4s with MSL shifter
4507*9880d681SAndroid Build Coastguard Workerdef MVNIv2s_msl   : SIMDModifiedImmMoveMSL<0, 1, {1,1,0,?}, V64, "mvni", ".2s",
4508*9880d681SAndroid Build Coastguard Worker                      [(set (v2i32 V64:$Rd),
4509*9880d681SAndroid Build Coastguard Worker                            (AArch64mvni_msl imm0_255:$imm8, (i32 imm:$shift)))]>;
4510*9880d681SAndroid Build Coastguard Workerdef MVNIv4s_msl   : SIMDModifiedImmMoveMSL<1, 1, {1,1,0,?}, V128, "mvni", ".4s",
4511*9880d681SAndroid Build Coastguard Worker                      [(set (v4i32 V128:$Rd),
4512*9880d681SAndroid Build Coastguard Worker                            (AArch64mvni_msl imm0_255:$imm8, (i32 imm:$shift)))]>;
4513*9880d681SAndroid Build Coastguard Worker
4514*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
4515*9880d681SAndroid Build Coastguard Worker// AdvSIMD indexed element
4516*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
4517*9880d681SAndroid Build Coastguard Worker
4518*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in {
4519*9880d681SAndroid Build Coastguard Worker  defm FMLA  : SIMDFPIndexedTied<0, 0b0001, "fmla">;
4520*9880d681SAndroid Build Coastguard Worker  defm FMLS  : SIMDFPIndexedTied<0, 0b0101, "fmls">;
4521*9880d681SAndroid Build Coastguard Worker}
4522*9880d681SAndroid Build Coastguard Worker
4523*9880d681SAndroid Build Coastguard Worker// NOTE: Operands are reordered in the FMLA/FMLS PatFrags because the
4524*9880d681SAndroid Build Coastguard Worker// instruction expects the addend first, while the intrinsic expects it last.
4525*9880d681SAndroid Build Coastguard Worker
4526*9880d681SAndroid Build Coastguard Worker// On the other hand, there are quite a few valid combinatorial options due to
4527*9880d681SAndroid Build Coastguard Worker// the commutativity of multiplication and the fact that (-x) * y = x * (-y).
4528*9880d681SAndroid Build Coastguard Workerdefm : SIMDFPIndexedTiedPatterns<"FMLA",
4529*9880d681SAndroid Build Coastguard Worker           TriOpFrag<(fma node:$RHS, node:$MHS, node:$LHS)>>;
4530*9880d681SAndroid Build Coastguard Workerdefm : SIMDFPIndexedTiedPatterns<"FMLA",
4531*9880d681SAndroid Build Coastguard Worker           TriOpFrag<(fma node:$MHS, node:$RHS, node:$LHS)>>;
4532*9880d681SAndroid Build Coastguard Worker
4533*9880d681SAndroid Build Coastguard Workerdefm : SIMDFPIndexedTiedPatterns<"FMLS",
4534*9880d681SAndroid Build Coastguard Worker           TriOpFrag<(fma node:$MHS, (fneg node:$RHS), node:$LHS)> >;
4535*9880d681SAndroid Build Coastguard Workerdefm : SIMDFPIndexedTiedPatterns<"FMLS",
4536*9880d681SAndroid Build Coastguard Worker           TriOpFrag<(fma node:$RHS, (fneg node:$MHS), node:$LHS)> >;
4537*9880d681SAndroid Build Coastguard Workerdefm : SIMDFPIndexedTiedPatterns<"FMLS",
4538*9880d681SAndroid Build Coastguard Worker           TriOpFrag<(fma (fneg node:$RHS), node:$MHS, node:$LHS)> >;
4539*9880d681SAndroid Build Coastguard Workerdefm : SIMDFPIndexedTiedPatterns<"FMLS",
4540*9880d681SAndroid Build Coastguard Worker           TriOpFrag<(fma (fneg node:$MHS), node:$RHS, node:$LHS)> >;
4541*9880d681SAndroid Build Coastguard Worker
4542*9880d681SAndroid Build Coastguard Workermulticlass FMLSIndexedAfterNegPatterns<SDPatternOperator OpNode> {
4543*9880d681SAndroid Build Coastguard Worker  // 3 variants for the .2s version: DUPLANE from 128-bit, DUPLANE from 64-bit
4544*9880d681SAndroid Build Coastguard Worker  // and DUP scalar.
4545*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2f32 (OpNode (v2f32 V64:$Rd), (v2f32 V64:$Rn),
4546*9880d681SAndroid Build Coastguard Worker                           (AArch64duplane32 (v4f32 (fneg V128:$Rm)),
4547*9880d681SAndroid Build Coastguard Worker                                           VectorIndexS:$idx))),
4548*9880d681SAndroid Build Coastguard Worker            (FMLSv2i32_indexed V64:$Rd, V64:$Rn, V128:$Rm, VectorIndexS:$idx)>;
4549*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2f32 (OpNode (v2f32 V64:$Rd), (v2f32 V64:$Rn),
4550*9880d681SAndroid Build Coastguard Worker                           (v2f32 (AArch64duplane32
4551*9880d681SAndroid Build Coastguard Worker                                      (v4f32 (insert_subvector undef,
4552*9880d681SAndroid Build Coastguard Worker                                                 (v2f32 (fneg V64:$Rm)),
4553*9880d681SAndroid Build Coastguard Worker                                                 (i32 0))),
4554*9880d681SAndroid Build Coastguard Worker                                      VectorIndexS:$idx)))),
4555*9880d681SAndroid Build Coastguard Worker            (FMLSv2i32_indexed V64:$Rd, V64:$Rn,
4556*9880d681SAndroid Build Coastguard Worker                               (SUBREG_TO_REG (i32 0), V64:$Rm, dsub),
4557*9880d681SAndroid Build Coastguard Worker                               VectorIndexS:$idx)>;
4558*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2f32 (OpNode (v2f32 V64:$Rd), (v2f32 V64:$Rn),
4559*9880d681SAndroid Build Coastguard Worker                           (AArch64dup (f32 (fneg FPR32Op:$Rm))))),
4560*9880d681SAndroid Build Coastguard Worker            (FMLSv2i32_indexed V64:$Rd, V64:$Rn,
4561*9880d681SAndroid Build Coastguard Worker                (SUBREG_TO_REG (i32 0), FPR32Op:$Rm, ssub), (i64 0))>;
4562*9880d681SAndroid Build Coastguard Worker
4563*9880d681SAndroid Build Coastguard Worker  // 3 variants for the .4s version: DUPLANE from 128-bit, DUPLANE from 64-bit
4564*9880d681SAndroid Build Coastguard Worker  // and DUP scalar.
4565*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (OpNode (v4f32 V128:$Rd), (v4f32 V128:$Rn),
4566*9880d681SAndroid Build Coastguard Worker                           (AArch64duplane32 (v4f32 (fneg V128:$Rm)),
4567*9880d681SAndroid Build Coastguard Worker                                           VectorIndexS:$idx))),
4568*9880d681SAndroid Build Coastguard Worker            (FMLSv4i32_indexed V128:$Rd, V128:$Rn, V128:$Rm,
4569*9880d681SAndroid Build Coastguard Worker                               VectorIndexS:$idx)>;
4570*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (OpNode (v4f32 V128:$Rd), (v4f32 V128:$Rn),
4571*9880d681SAndroid Build Coastguard Worker                           (v4f32 (AArch64duplane32
4572*9880d681SAndroid Build Coastguard Worker                                      (v4f32 (insert_subvector undef,
4573*9880d681SAndroid Build Coastguard Worker                                                 (v2f32 (fneg V64:$Rm)),
4574*9880d681SAndroid Build Coastguard Worker                                                 (i32 0))),
4575*9880d681SAndroid Build Coastguard Worker                                      VectorIndexS:$idx)))),
4576*9880d681SAndroid Build Coastguard Worker            (FMLSv4i32_indexed V128:$Rd, V128:$Rn,
4577*9880d681SAndroid Build Coastguard Worker                               (SUBREG_TO_REG (i32 0), V64:$Rm, dsub),
4578*9880d681SAndroid Build Coastguard Worker                               VectorIndexS:$idx)>;
4579*9880d681SAndroid Build Coastguard Worker  def : Pat<(v4f32 (OpNode (v4f32 V128:$Rd), (v4f32 V128:$Rn),
4580*9880d681SAndroid Build Coastguard Worker                           (AArch64dup (f32 (fneg FPR32Op:$Rm))))),
4581*9880d681SAndroid Build Coastguard Worker            (FMLSv4i32_indexed V128:$Rd, V128:$Rn,
4582*9880d681SAndroid Build Coastguard Worker                (SUBREG_TO_REG (i32 0), FPR32Op:$Rm, ssub), (i64 0))>;
4583*9880d681SAndroid Build Coastguard Worker
4584*9880d681SAndroid Build Coastguard Worker  // 2 variants for the .2d version: DUPLANE from 128-bit, and DUP scalar
4585*9880d681SAndroid Build Coastguard Worker  // (DUPLANE from 64-bit would be trivial).
4586*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2f64 (OpNode (v2f64 V128:$Rd), (v2f64 V128:$Rn),
4587*9880d681SAndroid Build Coastguard Worker                           (AArch64duplane64 (v2f64 (fneg V128:$Rm)),
4588*9880d681SAndroid Build Coastguard Worker                                           VectorIndexD:$idx))),
4589*9880d681SAndroid Build Coastguard Worker            (FMLSv2i64_indexed
4590*9880d681SAndroid Build Coastguard Worker                V128:$Rd, V128:$Rn, V128:$Rm, VectorIndexS:$idx)>;
4591*9880d681SAndroid Build Coastguard Worker  def : Pat<(v2f64 (OpNode (v2f64 V128:$Rd), (v2f64 V128:$Rn),
4592*9880d681SAndroid Build Coastguard Worker                           (AArch64dup (f64 (fneg FPR64Op:$Rm))))),
4593*9880d681SAndroid Build Coastguard Worker            (FMLSv2i64_indexed V128:$Rd, V128:$Rn,
4594*9880d681SAndroid Build Coastguard Worker                (SUBREG_TO_REG (i32 0), FPR64Op:$Rm, dsub), (i64 0))>;
4595*9880d681SAndroid Build Coastguard Worker
4596*9880d681SAndroid Build Coastguard Worker  // 2 variants for 32-bit scalar version: extract from .2s or from .4s
4597*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (OpNode (f32 FPR32:$Rd), (f32 FPR32:$Rn),
4598*9880d681SAndroid Build Coastguard Worker                         (vector_extract (v4f32 (fneg V128:$Rm)),
4599*9880d681SAndroid Build Coastguard Worker                                         VectorIndexS:$idx))),
4600*9880d681SAndroid Build Coastguard Worker            (FMLSv1i32_indexed FPR32:$Rd, FPR32:$Rn,
4601*9880d681SAndroid Build Coastguard Worker                V128:$Rm, VectorIndexS:$idx)>;
4602*9880d681SAndroid Build Coastguard Worker  def : Pat<(f32 (OpNode (f32 FPR32:$Rd), (f32 FPR32:$Rn),
4603*9880d681SAndroid Build Coastguard Worker                         (vector_extract (v4f32 (insert_subvector undef,
4604*9880d681SAndroid Build Coastguard Worker                                                    (v2f32 (fneg V64:$Rm)),
4605*9880d681SAndroid Build Coastguard Worker                                                    (i32 0))),
4606*9880d681SAndroid Build Coastguard Worker                                         VectorIndexS:$idx))),
4607*9880d681SAndroid Build Coastguard Worker            (FMLSv1i32_indexed FPR32:$Rd, FPR32:$Rn,
4608*9880d681SAndroid Build Coastguard Worker                (SUBREG_TO_REG (i32 0), V64:$Rm, dsub), VectorIndexS:$idx)>;
4609*9880d681SAndroid Build Coastguard Worker
4610*9880d681SAndroid Build Coastguard Worker  // 1 variant for 64-bit scalar version: extract from .1d or from .2d
4611*9880d681SAndroid Build Coastguard Worker  def : Pat<(f64 (OpNode (f64 FPR64:$Rd), (f64 FPR64:$Rn),
4612*9880d681SAndroid Build Coastguard Worker                         (vector_extract (v2f64 (fneg V128:$Rm)),
4613*9880d681SAndroid Build Coastguard Worker                                         VectorIndexS:$idx))),
4614*9880d681SAndroid Build Coastguard Worker            (FMLSv1i64_indexed FPR64:$Rd, FPR64:$Rn,
4615*9880d681SAndroid Build Coastguard Worker                V128:$Rm, VectorIndexS:$idx)>;
4616*9880d681SAndroid Build Coastguard Worker}
4617*9880d681SAndroid Build Coastguard Worker
4618*9880d681SAndroid Build Coastguard Workerdefm : FMLSIndexedAfterNegPatterns<
4619*9880d681SAndroid Build Coastguard Worker           TriOpFrag<(fma node:$RHS, node:$MHS, node:$LHS)> >;
4620*9880d681SAndroid Build Coastguard Workerdefm : FMLSIndexedAfterNegPatterns<
4621*9880d681SAndroid Build Coastguard Worker           TriOpFrag<(fma node:$MHS, node:$RHS, node:$LHS)> >;
4622*9880d681SAndroid Build Coastguard Worker
4623*9880d681SAndroid Build Coastguard Workerdefm FMULX : SIMDFPIndexed<1, 0b1001, "fmulx", int_aarch64_neon_fmulx>;
4624*9880d681SAndroid Build Coastguard Workerdefm FMUL  : SIMDFPIndexed<0, 0b1001, "fmul", fmul>;
4625*9880d681SAndroid Build Coastguard Worker
4626*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (fmul V64:$Rn, (AArch64dup (f32 FPR32:$Rm)))),
4627*9880d681SAndroid Build Coastguard Worker          (FMULv2i32_indexed V64:$Rn,
4628*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR32:$Rm, ssub),
4629*9880d681SAndroid Build Coastguard Worker            (i64 0))>;
4630*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (fmul V128:$Rn, (AArch64dup (f32 FPR32:$Rm)))),
4631*9880d681SAndroid Build Coastguard Worker          (FMULv4i32_indexed V128:$Rn,
4632*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR32:$Rm, ssub),
4633*9880d681SAndroid Build Coastguard Worker            (i64 0))>;
4634*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (fmul V128:$Rn, (AArch64dup (f64 FPR64:$Rm)))),
4635*9880d681SAndroid Build Coastguard Worker          (FMULv2i64_indexed V128:$Rn,
4636*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR64:$Rm, dsub),
4637*9880d681SAndroid Build Coastguard Worker            (i64 0))>;
4638*9880d681SAndroid Build Coastguard Worker
4639*9880d681SAndroid Build Coastguard Workerdefm SQDMULH : SIMDIndexedHS<0, 0b1100, "sqdmulh", int_aarch64_neon_sqdmulh>;
4640*9880d681SAndroid Build Coastguard Workerdefm SQRDMULH : SIMDIndexedHS<0, 0b1101, "sqrdmulh", int_aarch64_neon_sqrdmulh>;
4641*9880d681SAndroid Build Coastguard Workerdefm MLA   : SIMDVectorIndexedHSTied<1, 0b0000, "mla",
4642*9880d681SAndroid Build Coastguard Worker              TriOpFrag<(add node:$LHS, (mul node:$MHS, node:$RHS))>>;
4643*9880d681SAndroid Build Coastguard Workerdefm MLS   : SIMDVectorIndexedHSTied<1, 0b0100, "mls",
4644*9880d681SAndroid Build Coastguard Worker              TriOpFrag<(sub node:$LHS, (mul node:$MHS, node:$RHS))>>;
4645*9880d681SAndroid Build Coastguard Workerdefm MUL   : SIMDVectorIndexedHS<0, 0b1000, "mul", mul>;
4646*9880d681SAndroid Build Coastguard Workerdefm SMLAL : SIMDVectorIndexedLongSDTied<0, 0b0010, "smlal",
4647*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(add node:$LHS, (int_aarch64_neon_smull node:$MHS, node:$RHS))>>;
4648*9880d681SAndroid Build Coastguard Workerdefm SMLSL : SIMDVectorIndexedLongSDTied<0, 0b0110, "smlsl",
4649*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(sub node:$LHS, (int_aarch64_neon_smull node:$MHS, node:$RHS))>>;
4650*9880d681SAndroid Build Coastguard Workerdefm SMULL : SIMDVectorIndexedLongSD<0, 0b1010, "smull",
4651*9880d681SAndroid Build Coastguard Worker                int_aarch64_neon_smull>;
4652*9880d681SAndroid Build Coastguard Workerdefm SQDMLAL : SIMDIndexedLongSQDMLXSDTied<0, 0b0011, "sqdmlal",
4653*9880d681SAndroid Build Coastguard Worker                                           int_aarch64_neon_sqadd>;
4654*9880d681SAndroid Build Coastguard Workerdefm SQDMLSL : SIMDIndexedLongSQDMLXSDTied<0, 0b0111, "sqdmlsl",
4655*9880d681SAndroid Build Coastguard Worker                                           int_aarch64_neon_sqsub>;
4656*9880d681SAndroid Build Coastguard Workerdefm SQRDMLAH : SIMDIndexedSQRDMLxHSDTied<1, 0b1101, "sqrdmlah",
4657*9880d681SAndroid Build Coastguard Worker                                          int_aarch64_neon_sqadd>;
4658*9880d681SAndroid Build Coastguard Workerdefm SQRDMLSH : SIMDIndexedSQRDMLxHSDTied<1, 0b1111, "sqrdmlsh",
4659*9880d681SAndroid Build Coastguard Worker                                          int_aarch64_neon_sqsub>;
4660*9880d681SAndroid Build Coastguard Workerdefm SQDMULL : SIMDIndexedLongSD<0, 0b1011, "sqdmull", int_aarch64_neon_sqdmull>;
4661*9880d681SAndroid Build Coastguard Workerdefm UMLAL   : SIMDVectorIndexedLongSDTied<1, 0b0010, "umlal",
4662*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(add node:$LHS, (int_aarch64_neon_umull node:$MHS, node:$RHS))>>;
4663*9880d681SAndroid Build Coastguard Workerdefm UMLSL   : SIMDVectorIndexedLongSDTied<1, 0b0110, "umlsl",
4664*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(sub node:$LHS, (int_aarch64_neon_umull node:$MHS, node:$RHS))>>;
4665*9880d681SAndroid Build Coastguard Workerdefm UMULL   : SIMDVectorIndexedLongSD<1, 0b1010, "umull",
4666*9880d681SAndroid Build Coastguard Worker                int_aarch64_neon_umull>;
4667*9880d681SAndroid Build Coastguard Worker
4668*9880d681SAndroid Build Coastguard Worker// A scalar sqdmull with the second operand being a vector lane can be
4669*9880d681SAndroid Build Coastguard Worker// handled directly with the indexed instruction encoding.
4670*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_sqdmulls_scalar (i32 FPR32:$Rn),
4671*9880d681SAndroid Build Coastguard Worker                                          (vector_extract (v4i32 V128:$Vm),
4672*9880d681SAndroid Build Coastguard Worker                                                           VectorIndexS:$idx)),
4673*9880d681SAndroid Build Coastguard Worker          (SQDMULLv1i64_indexed FPR32:$Rn, V128:$Vm, VectorIndexS:$idx)>;
4674*9880d681SAndroid Build Coastguard Worker
4675*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
4676*9880d681SAndroid Build Coastguard Worker// AdvSIMD scalar shift instructions
4677*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
4678*9880d681SAndroid Build Coastguard Workerdefm FCVTZS : SIMDFPScalarRShift<0, 0b11111, "fcvtzs">;
4679*9880d681SAndroid Build Coastguard Workerdefm FCVTZU : SIMDFPScalarRShift<1, 0b11111, "fcvtzu">;
4680*9880d681SAndroid Build Coastguard Workerdefm SCVTF  : SIMDFPScalarRShift<0, 0b11100, "scvtf">;
4681*9880d681SAndroid Build Coastguard Workerdefm UCVTF  : SIMDFPScalarRShift<1, 0b11100, "ucvtf">;
4682*9880d681SAndroid Build Coastguard Worker// Codegen patterns for the above. We don't put these directly on the
4683*9880d681SAndroid Build Coastguard Worker// instructions because TableGen's type inference can't handle the truth.
4684*9880d681SAndroid Build Coastguard Worker// Having the same base pattern for fp <--> int totally freaks it out.
4685*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_vcvtfp2fxs FPR32:$Rn, vecshiftR32:$imm),
4686*9880d681SAndroid Build Coastguard Worker          (FCVTZSs FPR32:$Rn, vecshiftR32:$imm)>;
4687*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_vcvtfp2fxu FPR32:$Rn, vecshiftR32:$imm),
4688*9880d681SAndroid Build Coastguard Worker          (FCVTZUs FPR32:$Rn, vecshiftR32:$imm)>;
4689*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_vcvtfp2fxs (f64 FPR64:$Rn), vecshiftR64:$imm)),
4690*9880d681SAndroid Build Coastguard Worker          (FCVTZSd FPR64:$Rn, vecshiftR64:$imm)>;
4691*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_vcvtfp2fxu (f64 FPR64:$Rn), vecshiftR64:$imm)),
4692*9880d681SAndroid Build Coastguard Worker          (FCVTZUd FPR64:$Rn, vecshiftR64:$imm)>;
4693*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_vcvtfp2fxs (v1f64 FPR64:$Rn),
4694*9880d681SAndroid Build Coastguard Worker                                            vecshiftR64:$imm)),
4695*9880d681SAndroid Build Coastguard Worker          (FCVTZSd FPR64:$Rn, vecshiftR64:$imm)>;
4696*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_vcvtfp2fxu (v1f64 FPR64:$Rn),
4697*9880d681SAndroid Build Coastguard Worker                                            vecshiftR64:$imm)),
4698*9880d681SAndroid Build Coastguard Worker          (FCVTZUd FPR64:$Rn, vecshiftR64:$imm)>;
4699*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_vcvtfxs2fp FPR32:$Rn, vecshiftR32:$imm),
4700*9880d681SAndroid Build Coastguard Worker          (SCVTFs FPR32:$Rn, vecshiftR32:$imm)>;
4701*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_aarch64_neon_vcvtfxu2fp FPR32:$Rn, vecshiftR32:$imm),
4702*9880d681SAndroid Build Coastguard Worker          (UCVTFs FPR32:$Rn, vecshiftR32:$imm)>;
4703*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_vcvtfxs2fp (i64 FPR64:$Rn), vecshiftR64:$imm)),
4704*9880d681SAndroid Build Coastguard Worker          (SCVTFd FPR64:$Rn, vecshiftR64:$imm)>;
4705*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (int_aarch64_neon_vcvtfxu2fp (i64 FPR64:$Rn), vecshiftR64:$imm)),
4706*9880d681SAndroid Build Coastguard Worker          (UCVTFd FPR64:$Rn, vecshiftR64:$imm)>;
4707*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (int_aarch64_neon_vcvtfxs2fp (v1i64 FPR64:$Rn),
4708*9880d681SAndroid Build Coastguard Worker                                            vecshiftR64:$imm)),
4709*9880d681SAndroid Build Coastguard Worker          (SCVTFd FPR64:$Rn, vecshiftR64:$imm)>;
4710*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (int_aarch64_neon_vcvtfxu2fp (v1i64 FPR64:$Rn),
4711*9880d681SAndroid Build Coastguard Worker                                            vecshiftR64:$imm)),
4712*9880d681SAndroid Build Coastguard Worker          (UCVTFd FPR64:$Rn, vecshiftR64:$imm)>;
4713*9880d681SAndroid Build Coastguard Worker
4714*9880d681SAndroid Build Coastguard Workerdefm SHL      : SIMDScalarLShiftD<   0, 0b01010, "shl", AArch64vshl>;
4715*9880d681SAndroid Build Coastguard Workerdefm SLI      : SIMDScalarLShiftDTied<1, 0b01010, "sli">;
4716*9880d681SAndroid Build Coastguard Workerdefm SQRSHRN  : SIMDScalarRShiftBHS< 0, 0b10011, "sqrshrn",
4717*9880d681SAndroid Build Coastguard Worker                                     int_aarch64_neon_sqrshrn>;
4718*9880d681SAndroid Build Coastguard Workerdefm SQRSHRUN : SIMDScalarRShiftBHS< 1, 0b10001, "sqrshrun",
4719*9880d681SAndroid Build Coastguard Worker                                     int_aarch64_neon_sqrshrun>;
4720*9880d681SAndroid Build Coastguard Workerdefm SQSHLU   : SIMDScalarLShiftBHSD<1, 0b01100, "sqshlu", AArch64sqshlui>;
4721*9880d681SAndroid Build Coastguard Workerdefm SQSHL    : SIMDScalarLShiftBHSD<0, 0b01110, "sqshl", AArch64sqshli>;
4722*9880d681SAndroid Build Coastguard Workerdefm SQSHRN   : SIMDScalarRShiftBHS< 0, 0b10010, "sqshrn",
4723*9880d681SAndroid Build Coastguard Worker                                     int_aarch64_neon_sqshrn>;
4724*9880d681SAndroid Build Coastguard Workerdefm SQSHRUN  : SIMDScalarRShiftBHS< 1, 0b10000, "sqshrun",
4725*9880d681SAndroid Build Coastguard Worker                                     int_aarch64_neon_sqshrun>;
4726*9880d681SAndroid Build Coastguard Workerdefm SRI      : SIMDScalarRShiftDTied<   1, 0b01000, "sri">;
4727*9880d681SAndroid Build Coastguard Workerdefm SRSHR    : SIMDScalarRShiftD<   0, 0b00100, "srshr", AArch64srshri>;
4728*9880d681SAndroid Build Coastguard Workerdefm SRSRA    : SIMDScalarRShiftDTied<   0, 0b00110, "srsra",
4729*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(add node:$LHS,
4730*9880d681SAndroid Build Coastguard Worker                   (AArch64srshri node:$MHS, node:$RHS))>>;
4731*9880d681SAndroid Build Coastguard Workerdefm SSHR     : SIMDScalarRShiftD<   0, 0b00000, "sshr", AArch64vashr>;
4732*9880d681SAndroid Build Coastguard Workerdefm SSRA     : SIMDScalarRShiftDTied<   0, 0b00010, "ssra",
4733*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(add node:$LHS,
4734*9880d681SAndroid Build Coastguard Worker                   (AArch64vashr node:$MHS, node:$RHS))>>;
4735*9880d681SAndroid Build Coastguard Workerdefm UQRSHRN  : SIMDScalarRShiftBHS< 1, 0b10011, "uqrshrn",
4736*9880d681SAndroid Build Coastguard Worker                                     int_aarch64_neon_uqrshrn>;
4737*9880d681SAndroid Build Coastguard Workerdefm UQSHL    : SIMDScalarLShiftBHSD<1, 0b01110, "uqshl", AArch64uqshli>;
4738*9880d681SAndroid Build Coastguard Workerdefm UQSHRN   : SIMDScalarRShiftBHS< 1, 0b10010, "uqshrn",
4739*9880d681SAndroid Build Coastguard Worker                                     int_aarch64_neon_uqshrn>;
4740*9880d681SAndroid Build Coastguard Workerdefm URSHR    : SIMDScalarRShiftD<   1, 0b00100, "urshr", AArch64urshri>;
4741*9880d681SAndroid Build Coastguard Workerdefm URSRA    : SIMDScalarRShiftDTied<   1, 0b00110, "ursra",
4742*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(add node:$LHS,
4743*9880d681SAndroid Build Coastguard Worker                   (AArch64urshri node:$MHS, node:$RHS))>>;
4744*9880d681SAndroid Build Coastguard Workerdefm USHR     : SIMDScalarRShiftD<   1, 0b00000, "ushr", AArch64vlshr>;
4745*9880d681SAndroid Build Coastguard Workerdefm USRA     : SIMDScalarRShiftDTied<   1, 0b00010, "usra",
4746*9880d681SAndroid Build Coastguard Worker    TriOpFrag<(add node:$LHS,
4747*9880d681SAndroid Build Coastguard Worker                   (AArch64vlshr node:$MHS, node:$RHS))>>;
4748*9880d681SAndroid Build Coastguard Worker
4749*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
4750*9880d681SAndroid Build Coastguard Worker// AdvSIMD vector shift instructions
4751*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
4752*9880d681SAndroid Build Coastguard Workerdefm FCVTZS:SIMDVectorRShiftSD<0, 0b11111, "fcvtzs", int_aarch64_neon_vcvtfp2fxs>;
4753*9880d681SAndroid Build Coastguard Workerdefm FCVTZU:SIMDVectorRShiftSD<1, 0b11111, "fcvtzu", int_aarch64_neon_vcvtfp2fxu>;
4754*9880d681SAndroid Build Coastguard Workerdefm SCVTF: SIMDVectorRShiftToFP<0, 0b11100, "scvtf",
4755*9880d681SAndroid Build Coastguard Worker                                   int_aarch64_neon_vcvtfxs2fp>;
4756*9880d681SAndroid Build Coastguard Workerdefm RSHRN   : SIMDVectorRShiftNarrowBHS<0, 0b10001, "rshrn",
4757*9880d681SAndroid Build Coastguard Worker                                         int_aarch64_neon_rshrn>;
4758*9880d681SAndroid Build Coastguard Workerdefm SHL     : SIMDVectorLShiftBHSD<0, 0b01010, "shl", AArch64vshl>;
4759*9880d681SAndroid Build Coastguard Workerdefm SHRN    : SIMDVectorRShiftNarrowBHS<0, 0b10000, "shrn",
4760*9880d681SAndroid Build Coastguard Worker                          BinOpFrag<(trunc (AArch64vashr node:$LHS, node:$RHS))>>;
4761*9880d681SAndroid Build Coastguard Workerdefm SLI     : SIMDVectorLShiftBHSDTied<1, 0b01010, "sli", int_aarch64_neon_vsli>;
4762*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_vsli (v1i64 FPR64:$Rd), (v1i64 FPR64:$Rn),
4763*9880d681SAndroid Build Coastguard Worker                                      (i32 vecshiftL64:$imm))),
4764*9880d681SAndroid Build Coastguard Worker          (SLId FPR64:$Rd, FPR64:$Rn, vecshiftL64:$imm)>;
4765*9880d681SAndroid Build Coastguard Workerdefm SQRSHRN : SIMDVectorRShiftNarrowBHS<0, 0b10011, "sqrshrn",
4766*9880d681SAndroid Build Coastguard Worker                                         int_aarch64_neon_sqrshrn>;
4767*9880d681SAndroid Build Coastguard Workerdefm SQRSHRUN: SIMDVectorRShiftNarrowBHS<1, 0b10001, "sqrshrun",
4768*9880d681SAndroid Build Coastguard Worker                                         int_aarch64_neon_sqrshrun>;
4769*9880d681SAndroid Build Coastguard Workerdefm SQSHLU : SIMDVectorLShiftBHSD<1, 0b01100, "sqshlu", AArch64sqshlui>;
4770*9880d681SAndroid Build Coastguard Workerdefm SQSHL  : SIMDVectorLShiftBHSD<0, 0b01110, "sqshl", AArch64sqshli>;
4771*9880d681SAndroid Build Coastguard Workerdefm SQSHRN  : SIMDVectorRShiftNarrowBHS<0, 0b10010, "sqshrn",
4772*9880d681SAndroid Build Coastguard Worker                                         int_aarch64_neon_sqshrn>;
4773*9880d681SAndroid Build Coastguard Workerdefm SQSHRUN : SIMDVectorRShiftNarrowBHS<1, 0b10000, "sqshrun",
4774*9880d681SAndroid Build Coastguard Worker                                         int_aarch64_neon_sqshrun>;
4775*9880d681SAndroid Build Coastguard Workerdefm SRI     : SIMDVectorRShiftBHSDTied<1, 0b01000, "sri", int_aarch64_neon_vsri>;
4776*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (int_aarch64_neon_vsri (v1i64 FPR64:$Rd), (v1i64 FPR64:$Rn),
4777*9880d681SAndroid Build Coastguard Worker                                      (i32 vecshiftR64:$imm))),
4778*9880d681SAndroid Build Coastguard Worker          (SRId FPR64:$Rd, FPR64:$Rn, vecshiftR64:$imm)>;
4779*9880d681SAndroid Build Coastguard Workerdefm SRSHR   : SIMDVectorRShiftBHSD<0, 0b00100, "srshr", AArch64srshri>;
4780*9880d681SAndroid Build Coastguard Workerdefm SRSRA   : SIMDVectorRShiftBHSDTied<0, 0b00110, "srsra",
4781*9880d681SAndroid Build Coastguard Worker                 TriOpFrag<(add node:$LHS,
4782*9880d681SAndroid Build Coastguard Worker                                (AArch64srshri node:$MHS, node:$RHS))> >;
4783*9880d681SAndroid Build Coastguard Workerdefm SSHLL   : SIMDVectorLShiftLongBHSD<0, 0b10100, "sshll",
4784*9880d681SAndroid Build Coastguard Worker                BinOpFrag<(AArch64vshl (sext node:$LHS), node:$RHS)>>;
4785*9880d681SAndroid Build Coastguard Worker
4786*9880d681SAndroid Build Coastguard Workerdefm SSHR    : SIMDVectorRShiftBHSD<0, 0b00000, "sshr", AArch64vashr>;
4787*9880d681SAndroid Build Coastguard Workerdefm SSRA    : SIMDVectorRShiftBHSDTied<0, 0b00010, "ssra",
4788*9880d681SAndroid Build Coastguard Worker                TriOpFrag<(add node:$LHS, (AArch64vashr node:$MHS, node:$RHS))>>;
4789*9880d681SAndroid Build Coastguard Workerdefm UCVTF   : SIMDVectorRShiftToFP<1, 0b11100, "ucvtf",
4790*9880d681SAndroid Build Coastguard Worker                        int_aarch64_neon_vcvtfxu2fp>;
4791*9880d681SAndroid Build Coastguard Workerdefm UQRSHRN : SIMDVectorRShiftNarrowBHS<1, 0b10011, "uqrshrn",
4792*9880d681SAndroid Build Coastguard Worker                                         int_aarch64_neon_uqrshrn>;
4793*9880d681SAndroid Build Coastguard Workerdefm UQSHL   : SIMDVectorLShiftBHSD<1, 0b01110, "uqshl", AArch64uqshli>;
4794*9880d681SAndroid Build Coastguard Workerdefm UQSHRN  : SIMDVectorRShiftNarrowBHS<1, 0b10010, "uqshrn",
4795*9880d681SAndroid Build Coastguard Worker                                         int_aarch64_neon_uqshrn>;
4796*9880d681SAndroid Build Coastguard Workerdefm URSHR   : SIMDVectorRShiftBHSD<1, 0b00100, "urshr", AArch64urshri>;
4797*9880d681SAndroid Build Coastguard Workerdefm URSRA   : SIMDVectorRShiftBHSDTied<1, 0b00110, "ursra",
4798*9880d681SAndroid Build Coastguard Worker                TriOpFrag<(add node:$LHS,
4799*9880d681SAndroid Build Coastguard Worker                               (AArch64urshri node:$MHS, node:$RHS))> >;
4800*9880d681SAndroid Build Coastguard Workerdefm USHLL   : SIMDVectorLShiftLongBHSD<1, 0b10100, "ushll",
4801*9880d681SAndroid Build Coastguard Worker                BinOpFrag<(AArch64vshl (zext node:$LHS), node:$RHS)>>;
4802*9880d681SAndroid Build Coastguard Workerdefm USHR    : SIMDVectorRShiftBHSD<1, 0b00000, "ushr", AArch64vlshr>;
4803*9880d681SAndroid Build Coastguard Workerdefm USRA    : SIMDVectorRShiftBHSDTied<1, 0b00010, "usra",
4804*9880d681SAndroid Build Coastguard Worker                TriOpFrag<(add node:$LHS, (AArch64vlshr node:$MHS, node:$RHS))> >;
4805*9880d681SAndroid Build Coastguard Worker
4806*9880d681SAndroid Build Coastguard Worker// SHRN patterns for when a logical right shift was used instead of arithmetic
4807*9880d681SAndroid Build Coastguard Worker// (the immediate guarantees no sign bits actually end up in the result so it
4808*9880d681SAndroid Build Coastguard Worker// doesn't matter).
4809*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (trunc (AArch64vlshr (v8i16 V128:$Rn), vecshiftR16Narrow:$imm))),
4810*9880d681SAndroid Build Coastguard Worker          (SHRNv8i8_shift V128:$Rn, vecshiftR16Narrow:$imm)>;
4811*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (trunc (AArch64vlshr (v4i32 V128:$Rn), vecshiftR32Narrow:$imm))),
4812*9880d681SAndroid Build Coastguard Worker          (SHRNv4i16_shift V128:$Rn, vecshiftR32Narrow:$imm)>;
4813*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (trunc (AArch64vlshr (v2i64 V128:$Rn), vecshiftR64Narrow:$imm))),
4814*9880d681SAndroid Build Coastguard Worker          (SHRNv2i32_shift V128:$Rn, vecshiftR64Narrow:$imm)>;
4815*9880d681SAndroid Build Coastguard Worker
4816*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (concat_vectors (v8i8 V64:$Rd),
4817*9880d681SAndroid Build Coastguard Worker                                 (trunc (AArch64vlshr (v8i16 V128:$Rn),
4818*9880d681SAndroid Build Coastguard Worker                                                    vecshiftR16Narrow:$imm)))),
4819*9880d681SAndroid Build Coastguard Worker          (SHRNv16i8_shift (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub),
4820*9880d681SAndroid Build Coastguard Worker                           V128:$Rn, vecshiftR16Narrow:$imm)>;
4821*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (concat_vectors (v4i16 V64:$Rd),
4822*9880d681SAndroid Build Coastguard Worker                                 (trunc (AArch64vlshr (v4i32 V128:$Rn),
4823*9880d681SAndroid Build Coastguard Worker                                                    vecshiftR32Narrow:$imm)))),
4824*9880d681SAndroid Build Coastguard Worker          (SHRNv8i16_shift (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub),
4825*9880d681SAndroid Build Coastguard Worker                           V128:$Rn, vecshiftR32Narrow:$imm)>;
4826*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (concat_vectors (v2i32 V64:$Rd),
4827*9880d681SAndroid Build Coastguard Worker                                 (trunc (AArch64vlshr (v2i64 V128:$Rn),
4828*9880d681SAndroid Build Coastguard Worker                                                    vecshiftR64Narrow:$imm)))),
4829*9880d681SAndroid Build Coastguard Worker          (SHRNv4i32_shift (INSERT_SUBREG (IMPLICIT_DEF), V64:$Rd, dsub),
4830*9880d681SAndroid Build Coastguard Worker                           V128:$Rn, vecshiftR32Narrow:$imm)>;
4831*9880d681SAndroid Build Coastguard Worker
4832*9880d681SAndroid Build Coastguard Worker// Vector sign and zero extensions are implemented with SSHLL and USSHLL.
4833*9880d681SAndroid Build Coastguard Worker// Anyexts are implemented as zexts.
4834*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (sext   (v8i8 V64:$Rn))),  (SSHLLv8i8_shift  V64:$Rn, (i32 0))>;
4835*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (zext   (v8i8 V64:$Rn))),  (USHLLv8i8_shift  V64:$Rn, (i32 0))>;
4836*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (anyext (v8i8 V64:$Rn))),  (USHLLv8i8_shift  V64:$Rn, (i32 0))>;
4837*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (sext   (v4i16 V64:$Rn))), (SSHLLv4i16_shift V64:$Rn, (i32 0))>;
4838*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (zext   (v4i16 V64:$Rn))), (USHLLv4i16_shift V64:$Rn, (i32 0))>;
4839*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (anyext (v4i16 V64:$Rn))), (USHLLv4i16_shift V64:$Rn, (i32 0))>;
4840*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (sext   (v2i32 V64:$Rn))), (SSHLLv2i32_shift V64:$Rn, (i32 0))>;
4841*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (zext   (v2i32 V64:$Rn))), (USHLLv2i32_shift V64:$Rn, (i32 0))>;
4842*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (anyext (v2i32 V64:$Rn))), (USHLLv2i32_shift V64:$Rn, (i32 0))>;
4843*9880d681SAndroid Build Coastguard Worker// Also match an extend from the upper half of a 128 bit source register.
4844*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (anyext (v8i8 (extract_subvector V128:$Rn, (i64 8)) ))),
4845*9880d681SAndroid Build Coastguard Worker          (USHLLv16i8_shift V128:$Rn, (i32 0))>;
4846*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (zext   (v8i8 (extract_subvector V128:$Rn, (i64 8)) ))),
4847*9880d681SAndroid Build Coastguard Worker          (USHLLv16i8_shift V128:$Rn, (i32 0))>;
4848*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (sext   (v8i8 (extract_subvector V128:$Rn, (i64 8)) ))),
4849*9880d681SAndroid Build Coastguard Worker          (SSHLLv16i8_shift V128:$Rn, (i32 0))>;
4850*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (anyext (v4i16 (extract_subvector V128:$Rn, (i64 4)) ))),
4851*9880d681SAndroid Build Coastguard Worker          (USHLLv8i16_shift V128:$Rn, (i32 0))>;
4852*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (zext   (v4i16 (extract_subvector V128:$Rn, (i64 4)) ))),
4853*9880d681SAndroid Build Coastguard Worker          (USHLLv8i16_shift V128:$Rn, (i32 0))>;
4854*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (sext   (v4i16 (extract_subvector V128:$Rn, (i64 4)) ))),
4855*9880d681SAndroid Build Coastguard Worker          (SSHLLv8i16_shift V128:$Rn, (i32 0))>;
4856*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (anyext (v2i32 (extract_subvector V128:$Rn, (i64 2)) ))),
4857*9880d681SAndroid Build Coastguard Worker          (USHLLv4i32_shift V128:$Rn, (i32 0))>;
4858*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (zext   (v2i32 (extract_subvector V128:$Rn, (i64 2)) ))),
4859*9880d681SAndroid Build Coastguard Worker          (USHLLv4i32_shift V128:$Rn, (i32 0))>;
4860*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (sext   (v2i32 (extract_subvector V128:$Rn, (i64 2)) ))),
4861*9880d681SAndroid Build Coastguard Worker          (SSHLLv4i32_shift V128:$Rn, (i32 0))>;
4862*9880d681SAndroid Build Coastguard Worker
4863*9880d681SAndroid Build Coastguard Worker// Vector shift sxtl aliases
4864*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl.8h $dst, $src1",
4865*9880d681SAndroid Build Coastguard Worker                (SSHLLv8i8_shift V128:$dst, V64:$src1, 0)>;
4866*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl $dst.8h, $src1.8b",
4867*9880d681SAndroid Build Coastguard Worker                (SSHLLv8i8_shift V128:$dst, V64:$src1, 0)>;
4868*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl.4s $dst, $src1",
4869*9880d681SAndroid Build Coastguard Worker                (SSHLLv4i16_shift V128:$dst, V64:$src1, 0)>;
4870*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl $dst.4s, $src1.4h",
4871*9880d681SAndroid Build Coastguard Worker                (SSHLLv4i16_shift V128:$dst, V64:$src1, 0)>;
4872*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl.2d $dst, $src1",
4873*9880d681SAndroid Build Coastguard Worker                (SSHLLv2i32_shift V128:$dst, V64:$src1, 0)>;
4874*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl $dst.2d, $src1.2s",
4875*9880d681SAndroid Build Coastguard Worker                (SSHLLv2i32_shift V128:$dst, V64:$src1, 0)>;
4876*9880d681SAndroid Build Coastguard Worker
4877*9880d681SAndroid Build Coastguard Worker// Vector shift sxtl2 aliases
4878*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl2.8h $dst, $src1",
4879*9880d681SAndroid Build Coastguard Worker                (SSHLLv16i8_shift V128:$dst, V128:$src1, 0)>;
4880*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl2 $dst.8h, $src1.16b",
4881*9880d681SAndroid Build Coastguard Worker                (SSHLLv16i8_shift V128:$dst, V128:$src1, 0)>;
4882*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl2.4s $dst, $src1",
4883*9880d681SAndroid Build Coastguard Worker                (SSHLLv8i16_shift V128:$dst, V128:$src1, 0)>;
4884*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl2 $dst.4s, $src1.8h",
4885*9880d681SAndroid Build Coastguard Worker                (SSHLLv8i16_shift V128:$dst, V128:$src1, 0)>;
4886*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl2.2d $dst, $src1",
4887*9880d681SAndroid Build Coastguard Worker                (SSHLLv4i32_shift V128:$dst, V128:$src1, 0)>;
4888*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sxtl2 $dst.2d, $src1.4s",
4889*9880d681SAndroid Build Coastguard Worker                (SSHLLv4i32_shift V128:$dst, V128:$src1, 0)>;
4890*9880d681SAndroid Build Coastguard Worker
4891*9880d681SAndroid Build Coastguard Worker// Vector shift uxtl aliases
4892*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl.8h $dst, $src1",
4893*9880d681SAndroid Build Coastguard Worker                (USHLLv8i8_shift V128:$dst, V64:$src1, 0)>;
4894*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl $dst.8h, $src1.8b",
4895*9880d681SAndroid Build Coastguard Worker                (USHLLv8i8_shift V128:$dst, V64:$src1, 0)>;
4896*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl.4s $dst, $src1",
4897*9880d681SAndroid Build Coastguard Worker                (USHLLv4i16_shift V128:$dst, V64:$src1, 0)>;
4898*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl $dst.4s, $src1.4h",
4899*9880d681SAndroid Build Coastguard Worker                (USHLLv4i16_shift V128:$dst, V64:$src1, 0)>;
4900*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl.2d $dst, $src1",
4901*9880d681SAndroid Build Coastguard Worker                (USHLLv2i32_shift V128:$dst, V64:$src1, 0)>;
4902*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl $dst.2d, $src1.2s",
4903*9880d681SAndroid Build Coastguard Worker                (USHLLv2i32_shift V128:$dst, V64:$src1, 0)>;
4904*9880d681SAndroid Build Coastguard Worker
4905*9880d681SAndroid Build Coastguard Worker// Vector shift uxtl2 aliases
4906*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl2.8h $dst, $src1",
4907*9880d681SAndroid Build Coastguard Worker                (USHLLv16i8_shift V128:$dst, V128:$src1, 0)>;
4908*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl2 $dst.8h, $src1.16b",
4909*9880d681SAndroid Build Coastguard Worker                (USHLLv16i8_shift V128:$dst, V128:$src1, 0)>;
4910*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl2.4s $dst, $src1",
4911*9880d681SAndroid Build Coastguard Worker                (USHLLv8i16_shift V128:$dst, V128:$src1, 0)>;
4912*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl2 $dst.4s, $src1.8h",
4913*9880d681SAndroid Build Coastguard Worker                (USHLLv8i16_shift V128:$dst, V128:$src1, 0)>;
4914*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl2.2d $dst, $src1",
4915*9880d681SAndroid Build Coastguard Worker                (USHLLv4i32_shift V128:$dst, V128:$src1, 0)>;
4916*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"uxtl2 $dst.2d, $src1.4s",
4917*9880d681SAndroid Build Coastguard Worker                (USHLLv4i32_shift V128:$dst, V128:$src1, 0)>;
4918*9880d681SAndroid Build Coastguard Worker
4919*9880d681SAndroid Build Coastguard Worker// If an integer is about to be converted to a floating point value,
4920*9880d681SAndroid Build Coastguard Worker// just load it on the floating point unit.
4921*9880d681SAndroid Build Coastguard Worker// These patterns are more complex because floating point loads do not
4922*9880d681SAndroid Build Coastguard Worker// support sign extension.
4923*9880d681SAndroid Build Coastguard Worker// The sign extension has to be explicitly added and is only supported for
4924*9880d681SAndroid Build Coastguard Worker// one step: byte-to-half, half-to-word, word-to-doubleword.
4925*9880d681SAndroid Build Coastguard Worker// SCVTF GPR -> FPR is 9 cycles.
4926*9880d681SAndroid Build Coastguard Worker// SCVTF FPR -> FPR is 4 cyclces.
4927*9880d681SAndroid Build Coastguard Worker// (sign extension with lengthen) SXTL FPR -> FPR is 2 cycles.
4928*9880d681SAndroid Build Coastguard Worker// Therefore, we can do 2 sign extensions and one SCVTF FPR -> FPR
4929*9880d681SAndroid Build Coastguard Worker// and still being faster.
4930*9880d681SAndroid Build Coastguard Worker// However, this is not good for code size.
4931*9880d681SAndroid Build Coastguard Worker// 8-bits -> float. 2 sizes step-up.
4932*9880d681SAndroid Build Coastguard Workerclass SExtLoadi8CVTf32Pat<dag addrmode, dag INST>
4933*9880d681SAndroid Build Coastguard Worker  : Pat<(f32 (sint_to_fp (i32 (sextloadi8 addrmode)))),
4934*9880d681SAndroid Build Coastguard Worker        (SCVTFv1i32 (f32 (EXTRACT_SUBREG
4935*9880d681SAndroid Build Coastguard Worker                            (SSHLLv4i16_shift
4936*9880d681SAndroid Build Coastguard Worker                              (f64
4937*9880d681SAndroid Build Coastguard Worker                                (EXTRACT_SUBREG
4938*9880d681SAndroid Build Coastguard Worker                                  (SSHLLv8i8_shift
4939*9880d681SAndroid Build Coastguard Worker                                    (INSERT_SUBREG (f64 (IMPLICIT_DEF)),
4940*9880d681SAndroid Build Coastguard Worker                                        INST,
4941*9880d681SAndroid Build Coastguard Worker                                        bsub),
4942*9880d681SAndroid Build Coastguard Worker                                    0),
4943*9880d681SAndroid Build Coastguard Worker                                  dsub)),
4944*9880d681SAndroid Build Coastguard Worker                               0),
4945*9880d681SAndroid Build Coastguard Worker                             ssub)))>,
4946*9880d681SAndroid Build Coastguard Worker    Requires<[NotForCodeSize, UseAlternateSExtLoadCVTF32]>;
4947*9880d681SAndroid Build Coastguard Worker
4948*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi8CVTf32Pat<(ro8.Wpat GPR64sp:$Rn, GPR32:$Rm, ro8.Wext:$ext),
4949*9880d681SAndroid Build Coastguard Worker                          (LDRBroW  GPR64sp:$Rn, GPR32:$Rm, ro8.Wext:$ext)>;
4950*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi8CVTf32Pat<(ro8.Xpat GPR64sp:$Rn, GPR64:$Rm, ro8.Xext:$ext),
4951*9880d681SAndroid Build Coastguard Worker                          (LDRBroX  GPR64sp:$Rn, GPR64:$Rm, ro8.Xext:$ext)>;
4952*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi8CVTf32Pat<(am_indexed8 GPR64sp:$Rn, uimm12s1:$offset),
4953*9880d681SAndroid Build Coastguard Worker                          (LDRBui GPR64sp:$Rn, uimm12s1:$offset)>;
4954*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi8CVTf32Pat<(am_unscaled8 GPR64sp:$Rn, simm9:$offset),
4955*9880d681SAndroid Build Coastguard Worker                          (LDURBi GPR64sp:$Rn, simm9:$offset)>;
4956*9880d681SAndroid Build Coastguard Worker
4957*9880d681SAndroid Build Coastguard Worker// 16-bits -> float. 1 size step-up.
4958*9880d681SAndroid Build Coastguard Workerclass SExtLoadi16CVTf32Pat<dag addrmode, dag INST>
4959*9880d681SAndroid Build Coastguard Worker  : Pat<(f32 (sint_to_fp (i32 (sextloadi16 addrmode)))),
4960*9880d681SAndroid Build Coastguard Worker        (SCVTFv1i32 (f32 (EXTRACT_SUBREG
4961*9880d681SAndroid Build Coastguard Worker                            (SSHLLv4i16_shift
4962*9880d681SAndroid Build Coastguard Worker                                (INSERT_SUBREG (f64 (IMPLICIT_DEF)),
4963*9880d681SAndroid Build Coastguard Worker                                  INST,
4964*9880d681SAndroid Build Coastguard Worker                                  hsub),
4965*9880d681SAndroid Build Coastguard Worker                                0),
4966*9880d681SAndroid Build Coastguard Worker                            ssub)))>, Requires<[NotForCodeSize]>;
4967*9880d681SAndroid Build Coastguard Worker
4968*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf32Pat<(ro16.Wpat GPR64sp:$Rn, GPR32:$Rm, ro16.Wext:$ext),
4969*9880d681SAndroid Build Coastguard Worker                           (LDRHroW   GPR64sp:$Rn, GPR32:$Rm, ro16.Wext:$ext)>;
4970*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf32Pat<(ro16.Xpat GPR64sp:$Rn, GPR64:$Rm, ro16.Xext:$ext),
4971*9880d681SAndroid Build Coastguard Worker                           (LDRHroX   GPR64sp:$Rn, GPR64:$Rm, ro16.Xext:$ext)>;
4972*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf32Pat<(am_indexed16 GPR64sp:$Rn, uimm12s2:$offset),
4973*9880d681SAndroid Build Coastguard Worker                           (LDRHui GPR64sp:$Rn, uimm12s2:$offset)>;
4974*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf32Pat<(am_unscaled16 GPR64sp:$Rn, simm9:$offset),
4975*9880d681SAndroid Build Coastguard Worker                           (LDURHi GPR64sp:$Rn, simm9:$offset)>;
4976*9880d681SAndroid Build Coastguard Worker
4977*9880d681SAndroid Build Coastguard Worker// 32-bits to 32-bits are handled in target specific dag combine:
4978*9880d681SAndroid Build Coastguard Worker// performIntToFpCombine.
4979*9880d681SAndroid Build Coastguard Worker// 64-bits integer to 32-bits floating point, not possible with
4980*9880d681SAndroid Build Coastguard Worker// SCVTF on floating point registers (both source and destination
4981*9880d681SAndroid Build Coastguard Worker// must have the same size).
4982*9880d681SAndroid Build Coastguard Worker
4983*9880d681SAndroid Build Coastguard Worker// Here are the patterns for 8, 16, 32, and 64-bits to double.
4984*9880d681SAndroid Build Coastguard Worker// 8-bits -> double. 3 size step-up: give up.
4985*9880d681SAndroid Build Coastguard Worker// 16-bits -> double. 2 size step.
4986*9880d681SAndroid Build Coastguard Workerclass SExtLoadi16CVTf64Pat<dag addrmode, dag INST>
4987*9880d681SAndroid Build Coastguard Worker  : Pat <(f64 (sint_to_fp (i32 (sextloadi16 addrmode)))),
4988*9880d681SAndroid Build Coastguard Worker           (SCVTFv1i64 (f64 (EXTRACT_SUBREG
4989*9880d681SAndroid Build Coastguard Worker                              (SSHLLv2i32_shift
4990*9880d681SAndroid Build Coastguard Worker                                 (f64
4991*9880d681SAndroid Build Coastguard Worker                                  (EXTRACT_SUBREG
4992*9880d681SAndroid Build Coastguard Worker                                    (SSHLLv4i16_shift
4993*9880d681SAndroid Build Coastguard Worker                                      (INSERT_SUBREG (f64 (IMPLICIT_DEF)),
4994*9880d681SAndroid Build Coastguard Worker                                        INST,
4995*9880d681SAndroid Build Coastguard Worker                                        hsub),
4996*9880d681SAndroid Build Coastguard Worker                                     0),
4997*9880d681SAndroid Build Coastguard Worker                                   dsub)),
4998*9880d681SAndroid Build Coastguard Worker                               0),
4999*9880d681SAndroid Build Coastguard Worker                             dsub)))>,
5000*9880d681SAndroid Build Coastguard Worker    Requires<[NotForCodeSize, UseAlternateSExtLoadCVTF32]>;
5001*9880d681SAndroid Build Coastguard Worker
5002*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf64Pat<(ro16.Wpat GPR64sp:$Rn, GPR32:$Rm, ro16.Wext:$ext),
5003*9880d681SAndroid Build Coastguard Worker                           (LDRHroW GPR64sp:$Rn, GPR32:$Rm, ro16.Wext:$ext)>;
5004*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf64Pat<(ro16.Xpat GPR64sp:$Rn, GPR64:$Rm, ro16.Xext:$ext),
5005*9880d681SAndroid Build Coastguard Worker                           (LDRHroX GPR64sp:$Rn, GPR64:$Rm, ro16.Xext:$ext)>;
5006*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf64Pat<(am_indexed16 GPR64sp:$Rn, uimm12s2:$offset),
5007*9880d681SAndroid Build Coastguard Worker                           (LDRHui GPR64sp:$Rn, uimm12s2:$offset)>;
5008*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi16CVTf64Pat<(am_unscaled16 GPR64sp:$Rn, simm9:$offset),
5009*9880d681SAndroid Build Coastguard Worker                           (LDURHi GPR64sp:$Rn, simm9:$offset)>;
5010*9880d681SAndroid Build Coastguard Worker// 32-bits -> double. 1 size step-up.
5011*9880d681SAndroid Build Coastguard Workerclass SExtLoadi32CVTf64Pat<dag addrmode, dag INST>
5012*9880d681SAndroid Build Coastguard Worker  : Pat <(f64 (sint_to_fp (i32 (load addrmode)))),
5013*9880d681SAndroid Build Coastguard Worker           (SCVTFv1i64 (f64 (EXTRACT_SUBREG
5014*9880d681SAndroid Build Coastguard Worker                              (SSHLLv2i32_shift
5015*9880d681SAndroid Build Coastguard Worker                                (INSERT_SUBREG (f64 (IMPLICIT_DEF)),
5016*9880d681SAndroid Build Coastguard Worker                                  INST,
5017*9880d681SAndroid Build Coastguard Worker                                  ssub),
5018*9880d681SAndroid Build Coastguard Worker                               0),
5019*9880d681SAndroid Build Coastguard Worker                             dsub)))>, Requires<[NotForCodeSize]>;
5020*9880d681SAndroid Build Coastguard Worker
5021*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi32CVTf64Pat<(ro32.Wpat GPR64sp:$Rn, GPR32:$Rm, ro32.Wext:$ext),
5022*9880d681SAndroid Build Coastguard Worker                           (LDRSroW GPR64sp:$Rn, GPR32:$Rm, ro32.Wext:$ext)>;
5023*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi32CVTf64Pat<(ro32.Xpat GPR64sp:$Rn, GPR64:$Rm, ro32.Xext:$ext),
5024*9880d681SAndroid Build Coastguard Worker                           (LDRSroX GPR64sp:$Rn, GPR64:$Rm, ro32.Xext:$ext)>;
5025*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi32CVTf64Pat<(am_indexed32 GPR64sp:$Rn, uimm12s4:$offset),
5026*9880d681SAndroid Build Coastguard Worker                           (LDRSui GPR64sp:$Rn, uimm12s4:$offset)>;
5027*9880d681SAndroid Build Coastguard Workerdef : SExtLoadi32CVTf64Pat<(am_unscaled32 GPR64sp:$Rn, simm9:$offset),
5028*9880d681SAndroid Build Coastguard Worker                           (LDURSi GPR64sp:$Rn, simm9:$offset)>;
5029*9880d681SAndroid Build Coastguard Worker
5030*9880d681SAndroid Build Coastguard Worker// 64-bits -> double are handled in target specific dag combine:
5031*9880d681SAndroid Build Coastguard Worker// performIntToFpCombine.
5032*9880d681SAndroid Build Coastguard Worker
5033*9880d681SAndroid Build Coastguard Worker
5034*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
5035*9880d681SAndroid Build Coastguard Worker// AdvSIMD Load-Store Structure
5036*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
5037*9880d681SAndroid Build Coastguard Workerdefm LD1 : SIMDLd1Multiple<"ld1">;
5038*9880d681SAndroid Build Coastguard Workerdefm LD2 : SIMDLd2Multiple<"ld2">;
5039*9880d681SAndroid Build Coastguard Workerdefm LD3 : SIMDLd3Multiple<"ld3">;
5040*9880d681SAndroid Build Coastguard Workerdefm LD4 : SIMDLd4Multiple<"ld4">;
5041*9880d681SAndroid Build Coastguard Worker
5042*9880d681SAndroid Build Coastguard Workerdefm ST1 : SIMDSt1Multiple<"st1">;
5043*9880d681SAndroid Build Coastguard Workerdefm ST2 : SIMDSt2Multiple<"st2">;
5044*9880d681SAndroid Build Coastguard Workerdefm ST3 : SIMDSt3Multiple<"st3">;
5045*9880d681SAndroid Build Coastguard Workerdefm ST4 : SIMDSt4Multiple<"st4">;
5046*9880d681SAndroid Build Coastguard Worker
5047*9880d681SAndroid Build Coastguard Workerclass Ld1Pat<ValueType ty, Instruction INST>
5048*9880d681SAndroid Build Coastguard Worker  : Pat<(ty (load GPR64sp:$Rn)), (INST GPR64sp:$Rn)>;
5049*9880d681SAndroid Build Coastguard Worker
5050*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v16i8, LD1Onev16b>;
5051*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v8i16, LD1Onev8h>;
5052*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v4i32, LD1Onev4s>;
5053*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v2i64, LD1Onev2d>;
5054*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v8i8,  LD1Onev8b>;
5055*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v4i16, LD1Onev4h>;
5056*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v2i32, LD1Onev2s>;
5057*9880d681SAndroid Build Coastguard Workerdef : Ld1Pat<v1i64, LD1Onev1d>;
5058*9880d681SAndroid Build Coastguard Worker
5059*9880d681SAndroid Build Coastguard Workerclass St1Pat<ValueType ty, Instruction INST>
5060*9880d681SAndroid Build Coastguard Worker  : Pat<(store ty:$Vt, GPR64sp:$Rn),
5061*9880d681SAndroid Build Coastguard Worker        (INST ty:$Vt, GPR64sp:$Rn)>;
5062*9880d681SAndroid Build Coastguard Worker
5063*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v16i8, ST1Onev16b>;
5064*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v8i16, ST1Onev8h>;
5065*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v4i32, ST1Onev4s>;
5066*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v2i64, ST1Onev2d>;
5067*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v8i8,  ST1Onev8b>;
5068*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v4i16, ST1Onev4h>;
5069*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v2i32, ST1Onev2s>;
5070*9880d681SAndroid Build Coastguard Workerdef : St1Pat<v1i64, ST1Onev1d>;
5071*9880d681SAndroid Build Coastguard Worker
5072*9880d681SAndroid Build Coastguard Worker//---
5073*9880d681SAndroid Build Coastguard Worker// Single-element
5074*9880d681SAndroid Build Coastguard Worker//---
5075*9880d681SAndroid Build Coastguard Worker
5076*9880d681SAndroid Build Coastguard Workerdefm LD1R          : SIMDLdR<0, 0b110, 0, "ld1r", "One", 1, 2, 4, 8>;
5077*9880d681SAndroid Build Coastguard Workerdefm LD2R          : SIMDLdR<1, 0b110, 0, "ld2r", "Two", 2, 4, 8, 16>;
5078*9880d681SAndroid Build Coastguard Workerdefm LD3R          : SIMDLdR<0, 0b111, 0, "ld3r", "Three", 3, 6, 12, 24>;
5079*9880d681SAndroid Build Coastguard Workerdefm LD4R          : SIMDLdR<1, 0b111, 0, "ld4r", "Four", 4, 8, 16, 32>;
5080*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, hasSideEffects = 0 in {
5081*9880d681SAndroid Build Coastguard Workerdefm LD1 : SIMDLdSingleBTied<0, 0b000,       "ld1", VecListOneb,   GPR64pi1>;
5082*9880d681SAndroid Build Coastguard Workerdefm LD1 : SIMDLdSingleHTied<0, 0b010, 0,    "ld1", VecListOneh,   GPR64pi2>;
5083*9880d681SAndroid Build Coastguard Workerdefm LD1 : SIMDLdSingleSTied<0, 0b100, 0b00, "ld1", VecListOnes,   GPR64pi4>;
5084*9880d681SAndroid Build Coastguard Workerdefm LD1 : SIMDLdSingleDTied<0, 0b100, 0b01, "ld1", VecListOned,   GPR64pi8>;
5085*9880d681SAndroid Build Coastguard Workerdefm LD2 : SIMDLdSingleBTied<1, 0b000,       "ld2", VecListTwob,   GPR64pi2>;
5086*9880d681SAndroid Build Coastguard Workerdefm LD2 : SIMDLdSingleHTied<1, 0b010, 0,    "ld2", VecListTwoh,   GPR64pi4>;
5087*9880d681SAndroid Build Coastguard Workerdefm LD2 : SIMDLdSingleSTied<1, 0b100, 0b00, "ld2", VecListTwos,   GPR64pi8>;
5088*9880d681SAndroid Build Coastguard Workerdefm LD2 : SIMDLdSingleDTied<1, 0b100, 0b01, "ld2", VecListTwod,   GPR64pi16>;
5089*9880d681SAndroid Build Coastguard Workerdefm LD3 : SIMDLdSingleBTied<0, 0b001,       "ld3", VecListThreeb, GPR64pi3>;
5090*9880d681SAndroid Build Coastguard Workerdefm LD3 : SIMDLdSingleHTied<0, 0b011, 0,    "ld3", VecListThreeh, GPR64pi6>;
5091*9880d681SAndroid Build Coastguard Workerdefm LD3 : SIMDLdSingleSTied<0, 0b101, 0b00, "ld3", VecListThrees, GPR64pi12>;
5092*9880d681SAndroid Build Coastguard Workerdefm LD3 : SIMDLdSingleDTied<0, 0b101, 0b01, "ld3", VecListThreed, GPR64pi24>;
5093*9880d681SAndroid Build Coastguard Workerdefm LD4 : SIMDLdSingleBTied<1, 0b001,       "ld4", VecListFourb,  GPR64pi4>;
5094*9880d681SAndroid Build Coastguard Workerdefm LD4 : SIMDLdSingleHTied<1, 0b011, 0,    "ld4", VecListFourh,  GPR64pi8>;
5095*9880d681SAndroid Build Coastguard Workerdefm LD4 : SIMDLdSingleSTied<1, 0b101, 0b00, "ld4", VecListFours,  GPR64pi16>;
5096*9880d681SAndroid Build Coastguard Workerdefm LD4 : SIMDLdSingleDTied<1, 0b101, 0b01, "ld4", VecListFourd,  GPR64pi32>;
5097*9880d681SAndroid Build Coastguard Worker}
5098*9880d681SAndroid Build Coastguard Worker
5099*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (AArch64dup (i32 (extloadi8 GPR64sp:$Rn)))),
5100*9880d681SAndroid Build Coastguard Worker          (LD1Rv8b GPR64sp:$Rn)>;
5101*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64dup (i32 (extloadi8 GPR64sp:$Rn)))),
5102*9880d681SAndroid Build Coastguard Worker          (LD1Rv16b GPR64sp:$Rn)>;
5103*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64dup (i32 (extloadi16 GPR64sp:$Rn)))),
5104*9880d681SAndroid Build Coastguard Worker          (LD1Rv4h GPR64sp:$Rn)>;
5105*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64dup (i32 (extloadi16 GPR64sp:$Rn)))),
5106*9880d681SAndroid Build Coastguard Worker          (LD1Rv8h GPR64sp:$Rn)>;
5107*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64dup (i32 (load GPR64sp:$Rn)))),
5108*9880d681SAndroid Build Coastguard Worker          (LD1Rv2s GPR64sp:$Rn)>;
5109*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64dup (i32 (load GPR64sp:$Rn)))),
5110*9880d681SAndroid Build Coastguard Worker          (LD1Rv4s GPR64sp:$Rn)>;
5111*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64dup (i64 (load GPR64sp:$Rn)))),
5112*9880d681SAndroid Build Coastguard Worker          (LD1Rv2d GPR64sp:$Rn)>;
5113*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (AArch64dup (i64 (load GPR64sp:$Rn)))),
5114*9880d681SAndroid Build Coastguard Worker          (LD1Rv1d GPR64sp:$Rn)>;
5115*9880d681SAndroid Build Coastguard Worker// Grab the floating point version too
5116*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64dup (f32 (load GPR64sp:$Rn)))),
5117*9880d681SAndroid Build Coastguard Worker          (LD1Rv2s GPR64sp:$Rn)>;
5118*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64dup (f32 (load GPR64sp:$Rn)))),
5119*9880d681SAndroid Build Coastguard Worker          (LD1Rv4s GPR64sp:$Rn)>;
5120*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64dup (f64 (load GPR64sp:$Rn)))),
5121*9880d681SAndroid Build Coastguard Worker          (LD1Rv2d GPR64sp:$Rn)>;
5122*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (AArch64dup (f64 (load GPR64sp:$Rn)))),
5123*9880d681SAndroid Build Coastguard Worker          (LD1Rv1d GPR64sp:$Rn)>;
5124*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64dup (f16 (load GPR64sp:$Rn)))),
5125*9880d681SAndroid Build Coastguard Worker          (LD1Rv4h GPR64sp:$Rn)>;
5126*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64dup (f16 (load GPR64sp:$Rn)))),
5127*9880d681SAndroid Build Coastguard Worker          (LD1Rv8h GPR64sp:$Rn)>;
5128*9880d681SAndroid Build Coastguard Worker
5129*9880d681SAndroid Build Coastguard Workerclass Ld1Lane128Pat<SDPatternOperator scalar_load, Operand VecIndex,
5130*9880d681SAndroid Build Coastguard Worker                    ValueType VTy, ValueType STy, Instruction LD1>
5131*9880d681SAndroid Build Coastguard Worker  : Pat<(vector_insert (VTy VecListOne128:$Rd),
5132*9880d681SAndroid Build Coastguard Worker           (STy (scalar_load GPR64sp:$Rn)), VecIndex:$idx),
5133*9880d681SAndroid Build Coastguard Worker        (LD1 VecListOne128:$Rd, VecIndex:$idx, GPR64sp:$Rn)>;
5134*9880d681SAndroid Build Coastguard Worker
5135*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<extloadi8,  VectorIndexB, v16i8, i32, LD1i8>;
5136*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<extloadi16, VectorIndexH, v8i16, i32, LD1i16>;
5137*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<load,       VectorIndexS, v4i32, i32, LD1i32>;
5138*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<load,       VectorIndexS, v4f32, f32, LD1i32>;
5139*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<load,       VectorIndexD, v2i64, i64, LD1i64>;
5140*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<load,       VectorIndexD, v2f64, f64, LD1i64>;
5141*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane128Pat<load,       VectorIndexH, v8f16, f16, LD1i16>;
5142*9880d681SAndroid Build Coastguard Worker
5143*9880d681SAndroid Build Coastguard Workerclass Ld1Lane64Pat<SDPatternOperator scalar_load, Operand VecIndex,
5144*9880d681SAndroid Build Coastguard Worker                   ValueType VTy, ValueType STy, Instruction LD1>
5145*9880d681SAndroid Build Coastguard Worker  : Pat<(vector_insert (VTy VecListOne64:$Rd),
5146*9880d681SAndroid Build Coastguard Worker           (STy (scalar_load GPR64sp:$Rn)), VecIndex:$idx),
5147*9880d681SAndroid Build Coastguard Worker        (EXTRACT_SUBREG
5148*9880d681SAndroid Build Coastguard Worker            (LD1 (SUBREG_TO_REG (i32 0), VecListOne64:$Rd, dsub),
5149*9880d681SAndroid Build Coastguard Worker                          VecIndex:$idx, GPR64sp:$Rn),
5150*9880d681SAndroid Build Coastguard Worker            dsub)>;
5151*9880d681SAndroid Build Coastguard Worker
5152*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane64Pat<extloadi8,  VectorIndexB, v8i8,  i32, LD1i8>;
5153*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane64Pat<extloadi16, VectorIndexH, v4i16, i32, LD1i16>;
5154*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane64Pat<load,       VectorIndexS, v2i32, i32, LD1i32>;
5155*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane64Pat<load,       VectorIndexS, v2f32, f32, LD1i32>;
5156*9880d681SAndroid Build Coastguard Workerdef : Ld1Lane64Pat<load,       VectorIndexH, v4f16, f16, LD1i16>;
5157*9880d681SAndroid Build Coastguard Worker
5158*9880d681SAndroid Build Coastguard Worker
5159*9880d681SAndroid Build Coastguard Workerdefm LD1 : SIMDLdSt1SingleAliases<"ld1">;
5160*9880d681SAndroid Build Coastguard Workerdefm LD2 : SIMDLdSt2SingleAliases<"ld2">;
5161*9880d681SAndroid Build Coastguard Workerdefm LD3 : SIMDLdSt3SingleAliases<"ld3">;
5162*9880d681SAndroid Build Coastguard Workerdefm LD4 : SIMDLdSt4SingleAliases<"ld4">;
5163*9880d681SAndroid Build Coastguard Worker
5164*9880d681SAndroid Build Coastguard Worker// Stores
5165*9880d681SAndroid Build Coastguard Workerdefm ST1 : SIMDStSingleB<0, 0b000,       "st1", VecListOneb, GPR64pi1>;
5166*9880d681SAndroid Build Coastguard Workerdefm ST1 : SIMDStSingleH<0, 0b010, 0,    "st1", VecListOneh, GPR64pi2>;
5167*9880d681SAndroid Build Coastguard Workerdefm ST1 : SIMDStSingleS<0, 0b100, 0b00, "st1", VecListOnes, GPR64pi4>;
5168*9880d681SAndroid Build Coastguard Workerdefm ST1 : SIMDStSingleD<0, 0b100, 0b01, "st1", VecListOned, GPR64pi8>;
5169*9880d681SAndroid Build Coastguard Worker
5170*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 19 in
5171*9880d681SAndroid Build Coastguard Workerclass St1Lane128Pat<SDPatternOperator scalar_store, Operand VecIndex,
5172*9880d681SAndroid Build Coastguard Worker                    ValueType VTy, ValueType STy, Instruction ST1>
5173*9880d681SAndroid Build Coastguard Worker  : Pat<(scalar_store
5174*9880d681SAndroid Build Coastguard Worker             (STy (vector_extract (VTy VecListOne128:$Vt), VecIndex:$idx)),
5175*9880d681SAndroid Build Coastguard Worker             GPR64sp:$Rn),
5176*9880d681SAndroid Build Coastguard Worker        (ST1 VecListOne128:$Vt, VecIndex:$idx, GPR64sp:$Rn)>;
5177*9880d681SAndroid Build Coastguard Worker
5178*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<truncstorei8,  VectorIndexB, v16i8, i32, ST1i8>;
5179*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<truncstorei16, VectorIndexH, v8i16, i32, ST1i16>;
5180*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<store,         VectorIndexS, v4i32, i32, ST1i32>;
5181*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<store,         VectorIndexS, v4f32, f32, ST1i32>;
5182*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<store,         VectorIndexD, v2i64, i64, ST1i64>;
5183*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<store,         VectorIndexD, v2f64, f64, ST1i64>;
5184*9880d681SAndroid Build Coastguard Workerdef : St1Lane128Pat<store,         VectorIndexH, v8f16, f16, ST1i16>;
5185*9880d681SAndroid Build Coastguard Worker
5186*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 19 in
5187*9880d681SAndroid Build Coastguard Workerclass St1Lane64Pat<SDPatternOperator scalar_store, Operand VecIndex,
5188*9880d681SAndroid Build Coastguard Worker                   ValueType VTy, ValueType STy, Instruction ST1>
5189*9880d681SAndroid Build Coastguard Worker  : Pat<(scalar_store
5190*9880d681SAndroid Build Coastguard Worker             (STy (vector_extract (VTy VecListOne64:$Vt), VecIndex:$idx)),
5191*9880d681SAndroid Build Coastguard Worker             GPR64sp:$Rn),
5192*9880d681SAndroid Build Coastguard Worker        (ST1 (SUBREG_TO_REG (i32 0), VecListOne64:$Vt, dsub),
5193*9880d681SAndroid Build Coastguard Worker             VecIndex:$idx, GPR64sp:$Rn)>;
5194*9880d681SAndroid Build Coastguard Worker
5195*9880d681SAndroid Build Coastguard Workerdef : St1Lane64Pat<truncstorei8,  VectorIndexB, v8i8, i32, ST1i8>;
5196*9880d681SAndroid Build Coastguard Workerdef : St1Lane64Pat<truncstorei16, VectorIndexH, v4i16, i32, ST1i16>;
5197*9880d681SAndroid Build Coastguard Workerdef : St1Lane64Pat<store,         VectorIndexS, v2i32, i32, ST1i32>;
5198*9880d681SAndroid Build Coastguard Workerdef : St1Lane64Pat<store,         VectorIndexS, v2f32, f32, ST1i32>;
5199*9880d681SAndroid Build Coastguard Workerdef : St1Lane64Pat<store,         VectorIndexH, v4f16, f16, ST1i16>;
5200*9880d681SAndroid Build Coastguard Worker
5201*9880d681SAndroid Build Coastguard Workermulticlass St1LanePost64Pat<SDPatternOperator scalar_store, Operand VecIndex,
5202*9880d681SAndroid Build Coastguard Worker                             ValueType VTy, ValueType STy, Instruction ST1,
5203*9880d681SAndroid Build Coastguard Worker                             int offset> {
5204*9880d681SAndroid Build Coastguard Worker  def : Pat<(scalar_store
5205*9880d681SAndroid Build Coastguard Worker              (STy (vector_extract (VTy VecListOne64:$Vt), VecIndex:$idx)),
5206*9880d681SAndroid Build Coastguard Worker              GPR64sp:$Rn, offset),
5207*9880d681SAndroid Build Coastguard Worker        (ST1 (SUBREG_TO_REG (i32 0), VecListOne64:$Vt, dsub),
5208*9880d681SAndroid Build Coastguard Worker             VecIndex:$idx, GPR64sp:$Rn, XZR)>;
5209*9880d681SAndroid Build Coastguard Worker
5210*9880d681SAndroid Build Coastguard Worker  def : Pat<(scalar_store
5211*9880d681SAndroid Build Coastguard Worker              (STy (vector_extract (VTy VecListOne64:$Vt), VecIndex:$idx)),
5212*9880d681SAndroid Build Coastguard Worker              GPR64sp:$Rn, GPR64:$Rm),
5213*9880d681SAndroid Build Coastguard Worker        (ST1 (SUBREG_TO_REG (i32 0), VecListOne64:$Vt, dsub),
5214*9880d681SAndroid Build Coastguard Worker             VecIndex:$idx, GPR64sp:$Rn, $Rm)>;
5215*9880d681SAndroid Build Coastguard Worker}
5216*9880d681SAndroid Build Coastguard Worker
5217*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_truncsti8, VectorIndexB, v8i8, i32, ST1i8_POST, 1>;
5218*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_truncsti16, VectorIndexH, v4i16, i32, ST1i16_POST,
5219*9880d681SAndroid Build Coastguard Worker                        2>;
5220*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_store, VectorIndexS, v2i32, i32, ST1i32_POST, 4>;
5221*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_store, VectorIndexS, v2f32, f32, ST1i32_POST, 4>;
5222*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_store, VectorIndexD, v1i64, i64, ST1i64_POST, 8>;
5223*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_store, VectorIndexD, v1f64, f64, ST1i64_POST, 8>;
5224*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost64Pat<post_store, VectorIndexH, v4f16, f16, ST1i16_POST, 2>;
5225*9880d681SAndroid Build Coastguard Worker
5226*9880d681SAndroid Build Coastguard Workermulticlass St1LanePost128Pat<SDPatternOperator scalar_store, Operand VecIndex,
5227*9880d681SAndroid Build Coastguard Worker                             ValueType VTy, ValueType STy, Instruction ST1,
5228*9880d681SAndroid Build Coastguard Worker                             int offset> {
5229*9880d681SAndroid Build Coastguard Worker  def : Pat<(scalar_store
5230*9880d681SAndroid Build Coastguard Worker              (STy (vector_extract (VTy VecListOne128:$Vt), VecIndex:$idx)),
5231*9880d681SAndroid Build Coastguard Worker              GPR64sp:$Rn, offset),
5232*9880d681SAndroid Build Coastguard Worker        (ST1 VecListOne128:$Vt, VecIndex:$idx, GPR64sp:$Rn, XZR)>;
5233*9880d681SAndroid Build Coastguard Worker
5234*9880d681SAndroid Build Coastguard Worker  def : Pat<(scalar_store
5235*9880d681SAndroid Build Coastguard Worker              (STy (vector_extract (VTy VecListOne128:$Vt), VecIndex:$idx)),
5236*9880d681SAndroid Build Coastguard Worker              GPR64sp:$Rn, GPR64:$Rm),
5237*9880d681SAndroid Build Coastguard Worker        (ST1 VecListOne128:$Vt, VecIndex:$idx, GPR64sp:$Rn, $Rm)>;
5238*9880d681SAndroid Build Coastguard Worker}
5239*9880d681SAndroid Build Coastguard Worker
5240*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_truncsti8, VectorIndexB, v16i8, i32, ST1i8_POST,
5241*9880d681SAndroid Build Coastguard Worker                         1>;
5242*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_truncsti16, VectorIndexH, v8i16, i32, ST1i16_POST,
5243*9880d681SAndroid Build Coastguard Worker                         2>;
5244*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_store, VectorIndexS, v4i32, i32, ST1i32_POST, 4>;
5245*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_store, VectorIndexS, v4f32, f32, ST1i32_POST, 4>;
5246*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_store, VectorIndexD, v2i64, i64, ST1i64_POST, 8>;
5247*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_store, VectorIndexD, v2f64, f64, ST1i64_POST, 8>;
5248*9880d681SAndroid Build Coastguard Workerdefm : St1LanePost128Pat<post_store, VectorIndexH, v8f16, f16, ST1i16_POST, 2>;
5249*9880d681SAndroid Build Coastguard Worker
5250*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, hasSideEffects = 0 in {
5251*9880d681SAndroid Build Coastguard Workerdefm ST2 : SIMDStSingleB<1, 0b000,       "st2", VecListTwob,   GPR64pi2>;
5252*9880d681SAndroid Build Coastguard Workerdefm ST2 : SIMDStSingleH<1, 0b010, 0,    "st2", VecListTwoh,   GPR64pi4>;
5253*9880d681SAndroid Build Coastguard Workerdefm ST2 : SIMDStSingleS<1, 0b100, 0b00, "st2", VecListTwos,   GPR64pi8>;
5254*9880d681SAndroid Build Coastguard Workerdefm ST2 : SIMDStSingleD<1, 0b100, 0b01, "st2", VecListTwod,   GPR64pi16>;
5255*9880d681SAndroid Build Coastguard Workerdefm ST3 : SIMDStSingleB<0, 0b001,       "st3", VecListThreeb, GPR64pi3>;
5256*9880d681SAndroid Build Coastguard Workerdefm ST3 : SIMDStSingleH<0, 0b011, 0,    "st3", VecListThreeh, GPR64pi6>;
5257*9880d681SAndroid Build Coastguard Workerdefm ST3 : SIMDStSingleS<0, 0b101, 0b00, "st3", VecListThrees, GPR64pi12>;
5258*9880d681SAndroid Build Coastguard Workerdefm ST3 : SIMDStSingleD<0, 0b101, 0b01, "st3", VecListThreed, GPR64pi24>;
5259*9880d681SAndroid Build Coastguard Workerdefm ST4 : SIMDStSingleB<1, 0b001,       "st4", VecListFourb,  GPR64pi4>;
5260*9880d681SAndroid Build Coastguard Workerdefm ST4 : SIMDStSingleH<1, 0b011, 0,    "st4", VecListFourh,  GPR64pi8>;
5261*9880d681SAndroid Build Coastguard Workerdefm ST4 : SIMDStSingleS<1, 0b101, 0b00, "st4", VecListFours,  GPR64pi16>;
5262*9880d681SAndroid Build Coastguard Workerdefm ST4 : SIMDStSingleD<1, 0b101, 0b01, "st4", VecListFourd,  GPR64pi32>;
5263*9880d681SAndroid Build Coastguard Worker}
5264*9880d681SAndroid Build Coastguard Worker
5265*9880d681SAndroid Build Coastguard Workerdefm ST1 : SIMDLdSt1SingleAliases<"st1">;
5266*9880d681SAndroid Build Coastguard Workerdefm ST2 : SIMDLdSt2SingleAliases<"st2">;
5267*9880d681SAndroid Build Coastguard Workerdefm ST3 : SIMDLdSt3SingleAliases<"st3">;
5268*9880d681SAndroid Build Coastguard Workerdefm ST4 : SIMDLdSt4SingleAliases<"st4">;
5269*9880d681SAndroid Build Coastguard Worker
5270*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
5271*9880d681SAndroid Build Coastguard Worker// Crypto extensions
5272*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
5273*9880d681SAndroid Build Coastguard Worker
5274*9880d681SAndroid Build Coastguard Workerdef AESErr   : AESTiedInst<0b0100, "aese",   int_aarch64_crypto_aese>;
5275*9880d681SAndroid Build Coastguard Workerdef AESDrr   : AESTiedInst<0b0101, "aesd",   int_aarch64_crypto_aesd>;
5276*9880d681SAndroid Build Coastguard Workerdef AESMCrr  : AESInst<    0b0110, "aesmc",  int_aarch64_crypto_aesmc>;
5277*9880d681SAndroid Build Coastguard Workerdef AESIMCrr : AESInst<    0b0111, "aesimc", int_aarch64_crypto_aesimc>;
5278*9880d681SAndroid Build Coastguard Worker
5279*9880d681SAndroid Build Coastguard Workerdef SHA1Crrr     : SHATiedInstQSV<0b000, "sha1c",   int_aarch64_crypto_sha1c>;
5280*9880d681SAndroid Build Coastguard Workerdef SHA1Prrr     : SHATiedInstQSV<0b001, "sha1p",   int_aarch64_crypto_sha1p>;
5281*9880d681SAndroid Build Coastguard Workerdef SHA1Mrrr     : SHATiedInstQSV<0b010, "sha1m",   int_aarch64_crypto_sha1m>;
5282*9880d681SAndroid Build Coastguard Workerdef SHA1SU0rrr   : SHATiedInstVVV<0b011, "sha1su0", int_aarch64_crypto_sha1su0>;
5283*9880d681SAndroid Build Coastguard Workerdef SHA256Hrrr   : SHATiedInstQQV<0b100, "sha256h", int_aarch64_crypto_sha256h>;
5284*9880d681SAndroid Build Coastguard Workerdef SHA256H2rrr  : SHATiedInstQQV<0b101, "sha256h2",int_aarch64_crypto_sha256h2>;
5285*9880d681SAndroid Build Coastguard Workerdef SHA256SU1rrr :SHATiedInstVVV<0b110, "sha256su1",int_aarch64_crypto_sha256su1>;
5286*9880d681SAndroid Build Coastguard Worker
5287*9880d681SAndroid Build Coastguard Workerdef SHA1Hrr     : SHAInstSS<    0b0000, "sha1h",    int_aarch64_crypto_sha1h>;
5288*9880d681SAndroid Build Coastguard Workerdef SHA1SU1rr   : SHATiedInstVV<0b0001, "sha1su1",  int_aarch64_crypto_sha1su1>;
5289*9880d681SAndroid Build Coastguard Workerdef SHA256SU0rr : SHATiedInstVV<0b0010, "sha256su0",int_aarch64_crypto_sha256su0>;
5290*9880d681SAndroid Build Coastguard Worker
5291*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
5292*9880d681SAndroid Build Coastguard Worker// Compiler-pseudos
5293*9880d681SAndroid Build Coastguard Worker//----------------------------------------------------------------------------
5294*9880d681SAndroid Build Coastguard Worker// FIXME: Like for X86, these should go in their own separate .td file.
5295*9880d681SAndroid Build Coastguard Worker
5296*9880d681SAndroid Build Coastguard Worker// Any instruction that defines a 32-bit result leaves the high half of the
5297*9880d681SAndroid Build Coastguard Worker// register. Truncate can be lowered to EXTRACT_SUBREG. CopyFromReg may
5298*9880d681SAndroid Build Coastguard Worker// be copying from a truncate. But any other 32-bit operation will zero-extend
5299*9880d681SAndroid Build Coastguard Worker// up to 64 bits.
5300*9880d681SAndroid Build Coastguard Worker// FIXME: X86 also checks for CMOV here. Do we need something similar?
5301*9880d681SAndroid Build Coastguard Workerdef def32 : PatLeaf<(i32 GPR32:$src), [{
5302*9880d681SAndroid Build Coastguard Worker  return N->getOpcode() != ISD::TRUNCATE &&
5303*9880d681SAndroid Build Coastguard Worker         N->getOpcode() != TargetOpcode::EXTRACT_SUBREG &&
5304*9880d681SAndroid Build Coastguard Worker         N->getOpcode() != ISD::CopyFromReg;
5305*9880d681SAndroid Build Coastguard Worker}]>;
5306*9880d681SAndroid Build Coastguard Worker
5307*9880d681SAndroid Build Coastguard Worker// In the case of a 32-bit def that is known to implicitly zero-extend,
5308*9880d681SAndroid Build Coastguard Worker// we can use a SUBREG_TO_REG.
5309*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zext def32:$src)), (SUBREG_TO_REG (i64 0), GPR32:$src, sub_32)>;
5310*9880d681SAndroid Build Coastguard Worker
5311*9880d681SAndroid Build Coastguard Worker// For an anyext, we don't care what the high bits are, so we can perform an
5312*9880d681SAndroid Build Coastguard Worker// INSERT_SUBREF into an IMPLICIT_DEF.
5313*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (anyext GPR32:$src)),
5314*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GPR32:$src, sub_32)>;
5315*9880d681SAndroid Build Coastguard Worker
5316*9880d681SAndroid Build Coastguard Worker// When we need to explicitly zero-extend, we use a 32-bit MOV instruction and
5317*9880d681SAndroid Build Coastguard Worker// then assert the extension has happened.
5318*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zext GPR32:$src)),
5319*9880d681SAndroid Build Coastguard Worker          (SUBREG_TO_REG (i32 0), (ORRWrs WZR, GPR32:$src, 0), sub_32)>;
5320*9880d681SAndroid Build Coastguard Worker
5321*9880d681SAndroid Build Coastguard Worker// To sign extend, we use a signed bitfield move instruction (SBFM) on the
5322*9880d681SAndroid Build Coastguard Worker// containing super-reg.
5323*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sext GPR32:$src)),
5324*9880d681SAndroid Build Coastguard Worker   (SBFMXri (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GPR32:$src, sub_32), 0, 31)>;
5325*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sext_inreg GPR64:$src, i32)), (SBFMXri GPR64:$src, 0, 31)>;
5326*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sext_inreg GPR64:$src, i16)), (SBFMXri GPR64:$src, 0, 15)>;
5327*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sext_inreg GPR64:$src, i8)),  (SBFMXri GPR64:$src, 0, 7)>;
5328*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sext_inreg GPR64:$src, i1)),  (SBFMXri GPR64:$src, 0, 0)>;
5329*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg GPR32:$src, i16)), (SBFMWri GPR32:$src, 0, 15)>;
5330*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg GPR32:$src, i8)),  (SBFMWri GPR32:$src, 0, 7)>;
5331*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext_inreg GPR32:$src, i1)),  (SBFMWri GPR32:$src, 0, 0)>;
5332*9880d681SAndroid Build Coastguard Worker
5333*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl (sext_inreg GPR32:$Rn, i8), (i64 imm0_31:$imm)),
5334*9880d681SAndroid Build Coastguard Worker          (SBFMWri GPR32:$Rn, (i64 (i32shift_a       imm0_31:$imm)),
5335*9880d681SAndroid Build Coastguard Worker                              (i64 (i32shift_sext_i8 imm0_31:$imm)))>;
5336*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl (sext_inreg GPR64:$Rn, i8), (i64 imm0_63:$imm)),
5337*9880d681SAndroid Build Coastguard Worker          (SBFMXri GPR64:$Rn, (i64 (i64shift_a imm0_63:$imm)),
5338*9880d681SAndroid Build Coastguard Worker                              (i64 (i64shift_sext_i8 imm0_63:$imm)))>;
5339*9880d681SAndroid Build Coastguard Worker
5340*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl (sext_inreg GPR32:$Rn, i16), (i64 imm0_31:$imm)),
5341*9880d681SAndroid Build Coastguard Worker          (SBFMWri GPR32:$Rn, (i64 (i32shift_a        imm0_31:$imm)),
5342*9880d681SAndroid Build Coastguard Worker                              (i64 (i32shift_sext_i16 imm0_31:$imm)))>;
5343*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl (sext_inreg GPR64:$Rn, i16), (i64 imm0_63:$imm)),
5344*9880d681SAndroid Build Coastguard Worker          (SBFMXri GPR64:$Rn, (i64 (i64shift_a        imm0_63:$imm)),
5345*9880d681SAndroid Build Coastguard Worker                              (i64 (i64shift_sext_i16 imm0_63:$imm)))>;
5346*9880d681SAndroid Build Coastguard Worker
5347*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl (i64 (sext GPR32:$Rn)), (i64 imm0_63:$imm)),
5348*9880d681SAndroid Build Coastguard Worker          (SBFMXri (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GPR32:$Rn, sub_32),
5349*9880d681SAndroid Build Coastguard Worker                   (i64 (i64shift_a        imm0_63:$imm)),
5350*9880d681SAndroid Build Coastguard Worker                   (i64 (i64shift_sext_i32 imm0_63:$imm)))>;
5351*9880d681SAndroid Build Coastguard Worker
5352*9880d681SAndroid Build Coastguard Worker// sra patterns have an AddedComplexity of 10, so make sure we have a higher
5353*9880d681SAndroid Build Coastguard Worker// AddedComplexity for the following patterns since we want to match sext + sra
5354*9880d681SAndroid Build Coastguard Worker// patterns before we attempt to match a single sra node.
5355*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 20 in {
5356*9880d681SAndroid Build Coastguard Worker// We support all sext + sra combinations which preserve at least one bit of the
5357*9880d681SAndroid Build Coastguard Worker// original value which is to be sign extended. E.g. we support shifts up to
5358*9880d681SAndroid Build Coastguard Worker// bitwidth-1 bits.
5359*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra (sext_inreg GPR32:$Rn, i8), (i64 imm0_7:$imm)),
5360*9880d681SAndroid Build Coastguard Worker          (SBFMWri GPR32:$Rn, (i64 imm0_7:$imm), 7)>;
5361*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra (sext_inreg GPR64:$Rn, i8), (i64 imm0_7:$imm)),
5362*9880d681SAndroid Build Coastguard Worker          (SBFMXri GPR64:$Rn, (i64 imm0_7:$imm), 7)>;
5363*9880d681SAndroid Build Coastguard Worker
5364*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra (sext_inreg GPR32:$Rn, i16), (i64 imm0_15:$imm)),
5365*9880d681SAndroid Build Coastguard Worker          (SBFMWri GPR32:$Rn, (i64 imm0_15:$imm), 15)>;
5366*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra (sext_inreg GPR64:$Rn, i16), (i64 imm0_15:$imm)),
5367*9880d681SAndroid Build Coastguard Worker          (SBFMXri GPR64:$Rn, (i64 imm0_15:$imm), 15)>;
5368*9880d681SAndroid Build Coastguard Worker
5369*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra (i64 (sext GPR32:$Rn)), (i64 imm0_31:$imm)),
5370*9880d681SAndroid Build Coastguard Worker          (SBFMXri (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GPR32:$Rn, sub_32),
5371*9880d681SAndroid Build Coastguard Worker                   (i64 imm0_31:$imm), 31)>;
5372*9880d681SAndroid Build Coastguard Worker} // AddedComplexity = 20
5373*9880d681SAndroid Build Coastguard Worker
5374*9880d681SAndroid Build Coastguard Worker// To truncate, we can simply extract from a subregister.
5375*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (trunc GPR64sp:$src)),
5376*9880d681SAndroid Build Coastguard Worker          (i32 (EXTRACT_SUBREG GPR64sp:$src, sub_32))>;
5377*9880d681SAndroid Build Coastguard Worker
5378*9880d681SAndroid Build Coastguard Worker// __builtin_trap() uses the BRK instruction on AArch64.
5379*9880d681SAndroid Build Coastguard Workerdef : Pat<(trap), (BRK 1)>;
5380*9880d681SAndroid Build Coastguard Worker
5381*9880d681SAndroid Build Coastguard Worker// Conversions within AdvSIMD types in the same register size are free.
5382*9880d681SAndroid Build Coastguard Worker// But because we need a consistent lane ordering, in big endian many
5383*9880d681SAndroid Build Coastguard Worker// conversions require one or more REV instructions.
5384*9880d681SAndroid Build Coastguard Worker//
5385*9880d681SAndroid Build Coastguard Worker// Consider a simple memory load followed by a bitconvert then a store.
5386*9880d681SAndroid Build Coastguard Worker//   v0 = load v2i32
5387*9880d681SAndroid Build Coastguard Worker//   v1 = BITCAST v2i32 v0 to v4i16
5388*9880d681SAndroid Build Coastguard Worker//        store v4i16 v2
5389*9880d681SAndroid Build Coastguard Worker//
5390*9880d681SAndroid Build Coastguard Worker// In big endian mode every memory access has an implicit byte swap. LDR and
5391*9880d681SAndroid Build Coastguard Worker// STR do a 64-bit byte swap, whereas LD1/ST1 do a byte swap per lane - that
5392*9880d681SAndroid Build Coastguard Worker// is, they treat the vector as a sequence of elements to be byte-swapped.
5393*9880d681SAndroid Build Coastguard Worker// The two pairs of instructions are fundamentally incompatible. We've decided
5394*9880d681SAndroid Build Coastguard Worker// to use LD1/ST1 only to simplify compiler implementation.
5395*9880d681SAndroid Build Coastguard Worker//
5396*9880d681SAndroid Build Coastguard Worker// LD1/ST1 perform the equivalent of a sequence of LDR/STR + REV. This makes
5397*9880d681SAndroid Build Coastguard Worker// the original code sequence:
5398*9880d681SAndroid Build Coastguard Worker//   v0 = load v2i32
5399*9880d681SAndroid Build Coastguard Worker//   v1 = REV v2i32                  (implicit)
5400*9880d681SAndroid Build Coastguard Worker//   v2 = BITCAST v2i32 v1 to v4i16
5401*9880d681SAndroid Build Coastguard Worker//   v3 = REV v4i16 v2               (implicit)
5402*9880d681SAndroid Build Coastguard Worker//        store v4i16 v3
5403*9880d681SAndroid Build Coastguard Worker//
5404*9880d681SAndroid Build Coastguard Worker// But this is now broken - the value stored is different to the value loaded
5405*9880d681SAndroid Build Coastguard Worker// due to lane reordering. To fix this, on every BITCAST we must perform two
5406*9880d681SAndroid Build Coastguard Worker// other REVs:
5407*9880d681SAndroid Build Coastguard Worker//   v0 = load v2i32
5408*9880d681SAndroid Build Coastguard Worker//   v1 = REV v2i32                  (implicit)
5409*9880d681SAndroid Build Coastguard Worker//   v2 = REV v2i32
5410*9880d681SAndroid Build Coastguard Worker//   v3 = BITCAST v2i32 v2 to v4i16
5411*9880d681SAndroid Build Coastguard Worker//   v4 = REV v4i16
5412*9880d681SAndroid Build Coastguard Worker//   v5 = REV v4i16 v4               (implicit)
5413*9880d681SAndroid Build Coastguard Worker//        store v4i16 v5
5414*9880d681SAndroid Build Coastguard Worker//
5415*9880d681SAndroid Build Coastguard Worker// This means an extra two instructions, but actually in most cases the two REV
5416*9880d681SAndroid Build Coastguard Worker// instructions can be combined into one. For example:
5417*9880d681SAndroid Build Coastguard Worker//   (REV64_2s (REV64_4h X)) === (REV32_4h X)
5418*9880d681SAndroid Build Coastguard Worker//
5419*9880d681SAndroid Build Coastguard Worker// There is also no 128-bit REV instruction. This must be synthesized with an
5420*9880d681SAndroid Build Coastguard Worker// EXT instruction.
5421*9880d681SAndroid Build Coastguard Worker//
5422*9880d681SAndroid Build Coastguard Worker// Most bitconverts require some sort of conversion. The only exceptions are:
5423*9880d681SAndroid Build Coastguard Worker//   a) Identity conversions -  vNfX <-> vNiX
5424*9880d681SAndroid Build Coastguard Worker//   b) Single-lane-to-scalar - v1fX <-> fX or v1iX <-> iX
5425*9880d681SAndroid Build Coastguard Worker//
5426*9880d681SAndroid Build Coastguard Worker
5427*9880d681SAndroid Build Coastguard Worker// Natural vector casts (64 bit)
5428*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (AArch64NvCast (v2i32 FPR64:$src))), (v8i8 FPR64:$src)>;
5429*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64NvCast (v2i32 FPR64:$src))), (v4i16 FPR64:$src)>;
5430*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64NvCast (v2i32 FPR64:$src))), (v4f16 FPR64:$src)>;
5431*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64NvCast (v2i32 FPR64:$src))), (v2i32 FPR64:$src)>;
5432*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64NvCast (v2i32 FPR64:$src))), (v2f32 FPR64:$src)>;
5433*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (AArch64NvCast (v2i32 FPR64:$src))), (v1i64 FPR64:$src)>;
5434*9880d681SAndroid Build Coastguard Worker
5435*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (AArch64NvCast (v4i16 FPR64:$src))), (v8i8 FPR64:$src)>;
5436*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64NvCast (v4i16 FPR64:$src))), (v4i16 FPR64:$src)>;
5437*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64NvCast (v4i16 FPR64:$src))), (v4f16 FPR64:$src)>;
5438*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64NvCast (v4i16 FPR64:$src))), (v2i32 FPR64:$src)>;
5439*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (AArch64NvCast (v4i16 FPR64:$src))), (v1i64 FPR64:$src)>;
5440*9880d681SAndroid Build Coastguard Worker
5441*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (AArch64NvCast (v8i8 FPR64:$src))), (v8i8 FPR64:$src)>;
5442*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64NvCast (v8i8 FPR64:$src))), (v4i16 FPR64:$src)>;
5443*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64NvCast (v8i8 FPR64:$src))), (v4f16 FPR64:$src)>;
5444*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64NvCast (v8i8 FPR64:$src))), (v2i32 FPR64:$src)>;
5445*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (AArch64NvCast (v8i8 FPR64:$src))), (v1i64 FPR64:$src)>;
5446*9880d681SAndroid Build Coastguard Worker
5447*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (AArch64NvCast (f64 FPR64:$src))), (v8i8 FPR64:$src)>;
5448*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64NvCast (f64 FPR64:$src))), (v4i16 FPR64:$src)>;
5449*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (AArch64NvCast (f64 FPR64:$src))), (v4f16 FPR64:$src)>;
5450*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64NvCast (f64 FPR64:$src))), (v2i32 FPR64:$src)>;
5451*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64NvCast (f64 FPR64:$src))), (v2f32 FPR64:$src)>;
5452*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (AArch64NvCast (f64 FPR64:$src))), (v1i64 FPR64:$src)>;
5453*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (AArch64NvCast (f64 FPR64:$src))), (v1f64 FPR64:$src)>;
5454*9880d681SAndroid Build Coastguard Worker
5455*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (AArch64NvCast (v2f32 FPR64:$src))), (v8i8 FPR64:$src)>;
5456*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (AArch64NvCast (v2f32 FPR64:$src))), (v4i16 FPR64:$src)>;
5457*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (AArch64NvCast (v2f32 FPR64:$src))), (v2i32 FPR64:$src)>;
5458*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (AArch64NvCast (v2f32 FPR64:$src))), (v2f32 FPR64:$src)>;
5459*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (AArch64NvCast (v2f32 FPR64:$src))), (v1i64 FPR64:$src)>;
5460*9880d681SAndroid Build Coastguard Worker
5461*9880d681SAndroid Build Coastguard Worker// Natural vector casts (128 bit)
5462*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64NvCast (v4i32 FPR128:$src))), (v16i8 FPR128:$src)>;
5463*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64NvCast (v4i32 FPR128:$src))), (v8i16 FPR128:$src)>;
5464*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64NvCast (v4i32 FPR128:$src))), (v8f16 FPR128:$src)>;
5465*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64NvCast (v4i32 FPR128:$src))), (v4i32 FPR128:$src)>;
5466*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64NvCast (v4i32 FPR128:$src))), (v4f32 FPR128:$src)>;
5467*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64NvCast (v4i32 FPR128:$src))), (v2i64 FPR128:$src)>;
5468*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64NvCast (v4i32 FPR128:$src))), (v2f64 FPR128:$src)>;
5469*9880d681SAndroid Build Coastguard Worker
5470*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64NvCast (v8i16 FPR128:$src))), (v16i8 FPR128:$src)>;
5471*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64NvCast (v8i16 FPR128:$src))), (v8i16 FPR128:$src)>;
5472*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64NvCast (v8i16 FPR128:$src))), (v8f16 FPR128:$src)>;
5473*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64NvCast (v8i16 FPR128:$src))), (v4i32 FPR128:$src)>;
5474*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64NvCast (v8i16 FPR128:$src))), (v2i64 FPR128:$src)>;
5475*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64NvCast (v8i16 FPR128:$src))), (v4f32 FPR128:$src)>;
5476*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64NvCast (v8i16 FPR128:$src))), (v2f64 FPR128:$src)>;
5477*9880d681SAndroid Build Coastguard Worker
5478*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64NvCast (v16i8 FPR128:$src))), (v16i8 FPR128:$src)>;
5479*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64NvCast (v16i8 FPR128:$src))), (v8i16 FPR128:$src)>;
5480*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64NvCast (v16i8 FPR128:$src))), (v8f16 FPR128:$src)>;
5481*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64NvCast (v16i8 FPR128:$src))), (v4i32 FPR128:$src)>;
5482*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64NvCast (v16i8 FPR128:$src))), (v2i64 FPR128:$src)>;
5483*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64NvCast (v16i8 FPR128:$src))), (v4f32 FPR128:$src)>;
5484*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64NvCast (v16i8 FPR128:$src))), (v2f64 FPR128:$src)>;
5485*9880d681SAndroid Build Coastguard Worker
5486*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64NvCast (v2i64 FPR128:$src))), (v16i8 FPR128:$src)>;
5487*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64NvCast (v2i64 FPR128:$src))), (v8i16 FPR128:$src)>;
5488*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64NvCast (v2i64 FPR128:$src))), (v8f16 FPR128:$src)>;
5489*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64NvCast (v2i64 FPR128:$src))), (v4i32 FPR128:$src)>;
5490*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64NvCast (v2i64 FPR128:$src))), (v2i64 FPR128:$src)>;
5491*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64NvCast (v2i64 FPR128:$src))), (v4f32 FPR128:$src)>;
5492*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64NvCast (v2i64 FPR128:$src))), (v2f64 FPR128:$src)>;
5493*9880d681SAndroid Build Coastguard Worker
5494*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64NvCast (v4f32 FPR128:$src))), (v16i8 FPR128:$src)>;
5495*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64NvCast (v4f32 FPR128:$src))), (v8i16 FPR128:$src)>;
5496*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64NvCast (v4f32 FPR128:$src))), (v4i32 FPR128:$src)>;
5497*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64NvCast (v4f32 FPR128:$src))), (v4f32 FPR128:$src)>;
5498*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64NvCast (v4f32 FPR128:$src))), (v2i64 FPR128:$src)>;
5499*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64NvCast (v4f32 FPR128:$src))), (v8f16 FPR128:$src)>;
5500*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64NvCast (v4f32 FPR128:$src))), (v2f64 FPR128:$src)>;
5501*9880d681SAndroid Build Coastguard Worker
5502*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (AArch64NvCast (v2f64 FPR128:$src))), (v16i8 FPR128:$src)>;
5503*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (AArch64NvCast (v2f64 FPR128:$src))), (v8i16 FPR128:$src)>;
5504*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (AArch64NvCast (v2f64 FPR128:$src))), (v4i32 FPR128:$src)>;
5505*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (AArch64NvCast (v2f64 FPR128:$src))), (v2i64 FPR128:$src)>;
5506*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (AArch64NvCast (v2f64 FPR128:$src))), (v2f64 FPR128:$src)>;
5507*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (AArch64NvCast (v2f64 FPR128:$src))), (v8f16 FPR128:$src)>;
5508*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (AArch64NvCast (v2f64 FPR128:$src))), (v4f32 FPR128:$src)>;
5509*9880d681SAndroid Build Coastguard Worker
5510*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5511*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
5512*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
5513*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
5514*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
5515*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
5516*9880d681SAndroid Build Coastguard Worker
5517*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v8i8  V64:$Vn))),
5518*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS V64:$Vn, GPR64)>;
5519*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v4i16 V64:$Vn))),
5520*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS V64:$Vn, GPR64)>;
5521*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v2i32 V64:$Vn))),
5522*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS V64:$Vn, GPR64)>;
5523*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v4f16 V64:$Vn))),
5524*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS V64:$Vn, GPR64)>;
5525*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v2f32 V64:$Vn))),
5526*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS V64:$Vn, GPR64)>;
5527*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v1f64 V64:$Vn))),
5528*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS V64:$Vn, GPR64)>;
5529*9880d681SAndroid Build Coastguard Worker}
5530*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5531*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert GPR64:$Xn)),
5532*9880d681SAndroid Build Coastguard Worker                 (REV64v8i8 (COPY_TO_REGCLASS GPR64:$Xn, FPR64))>;
5533*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert GPR64:$Xn)),
5534*9880d681SAndroid Build Coastguard Worker                 (REV64v4i16 (COPY_TO_REGCLASS GPR64:$Xn, FPR64))>;
5535*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert GPR64:$Xn)),
5536*9880d681SAndroid Build Coastguard Worker                 (REV64v2i32 (COPY_TO_REGCLASS GPR64:$Xn, FPR64))>;
5537*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert GPR64:$Xn)),
5538*9880d681SAndroid Build Coastguard Worker                 (REV64v4i16 (COPY_TO_REGCLASS GPR64:$Xn, FPR64))>;
5539*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert GPR64:$Xn)),
5540*9880d681SAndroid Build Coastguard Worker                 (REV64v2i32 (COPY_TO_REGCLASS GPR64:$Xn, FPR64))>;
5541*9880d681SAndroid Build Coastguard Worker
5542*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v8i8  V64:$Vn))),
5543*9880d681SAndroid Build Coastguard Worker          (REV64v8i8 (COPY_TO_REGCLASS V64:$Vn, GPR64))>;
5544*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v4i16 V64:$Vn))),
5545*9880d681SAndroid Build Coastguard Worker          (REV64v4i16 (COPY_TO_REGCLASS V64:$Vn, GPR64))>;
5546*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v2i32 V64:$Vn))),
5547*9880d681SAndroid Build Coastguard Worker          (REV64v2i32 (COPY_TO_REGCLASS V64:$Vn, GPR64))>;
5548*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v4f16 V64:$Vn))),
5549*9880d681SAndroid Build Coastguard Worker          (REV64v4i16 (COPY_TO_REGCLASS V64:$Vn, GPR64))>;
5550*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v2f32 V64:$Vn))),
5551*9880d681SAndroid Build Coastguard Worker          (REV64v2i32 (COPY_TO_REGCLASS V64:$Vn, GPR64))>;
5552*9880d681SAndroid Build Coastguard Worker}
5553*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
5554*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert GPR64:$Xn)), (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
5555*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v1i64 V64:$Vn))),
5556*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS V64:$Vn, GPR64)>;
5557*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (scalar_to_vector GPR64:$Xn)),
5558*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
5559*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (scalar_to_vector GPR64:$Xn)),
5560*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
5561*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (scalar_to_vector (f64 FPR64:$Xn))), (v1f64 FPR64:$Xn)>;
5562*9880d681SAndroid Build Coastguard Worker
5563*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (bitconvert (i32 GPR32:$Xn))),
5564*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS GPR32:$Xn, FPR32)>;
5565*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (bitconvert (f32 FPR32:$Xn))),
5566*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS FPR32:$Xn, GPR32)>;
5567*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (bitconvert (i64 GPR64:$Xn))),
5568*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS GPR64:$Xn, FPR64)>;
5569*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (f64 FPR64:$Xn))),
5570*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS FPR64:$Xn, GPR64)>;
5571*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (bitconvert (v1f64 V64:$Vn))),
5572*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS V64:$Vn, GPR64)>;
5573*9880d681SAndroid Build Coastguard Worker
5574*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5575*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v2i32 FPR64:$src))), (v1i64 FPR64:$src)>;
5576*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v4i16 FPR64:$src))), (v1i64 FPR64:$src)>;
5577*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v8i8  FPR64:$src))), (v1i64 FPR64:$src)>;
5578*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v4f16 FPR64:$src))), (v1i64 FPR64:$src)>;
5579*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v2f32 FPR64:$src))), (v1i64 FPR64:$src)>;
5580*9880d681SAndroid Build Coastguard Worker}
5581*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5582*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v2i32 FPR64:$src))),
5583*9880d681SAndroid Build Coastguard Worker                             (v1i64 (REV64v2i32 FPR64:$src))>;
5584*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v4i16 FPR64:$src))),
5585*9880d681SAndroid Build Coastguard Worker                             (v1i64 (REV64v4i16 FPR64:$src))>;
5586*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v8i8  FPR64:$src))),
5587*9880d681SAndroid Build Coastguard Worker                             (v1i64 (REV64v8i8 FPR64:$src))>;
5588*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v4f16 FPR64:$src))),
5589*9880d681SAndroid Build Coastguard Worker                             (v1i64 (REV64v4i16 FPR64:$src))>;
5590*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v2f32 FPR64:$src))),
5591*9880d681SAndroid Build Coastguard Worker                             (v1i64 (REV64v2i32 FPR64:$src))>;
5592*9880d681SAndroid Build Coastguard Worker}
5593*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (v1f64 FPR64:$src))), (v1i64 FPR64:$src)>;
5594*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (bitconvert (f64   FPR64:$src))), (v1i64 FPR64:$src)>;
5595*9880d681SAndroid Build Coastguard Worker
5596*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5597*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v1i64 FPR64:$src))), (v2i32 FPR64:$src)>;
5598*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v4i16 FPR64:$src))), (v2i32 FPR64:$src)>;
5599*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v8i8  FPR64:$src))), (v2i32 FPR64:$src)>;
5600*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (f64   FPR64:$src))), (v2i32 FPR64:$src)>;
5601*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v1f64 FPR64:$src))), (v2i32 FPR64:$src)>;
5602*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v4f16 FPR64:$src))), (v2i32 FPR64:$src)>;
5603*9880d681SAndroid Build Coastguard Worker}
5604*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5605*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v1i64 FPR64:$src))),
5606*9880d681SAndroid Build Coastguard Worker                             (v2i32 (REV64v2i32 FPR64:$src))>;
5607*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v4i16 FPR64:$src))),
5608*9880d681SAndroid Build Coastguard Worker                             (v2i32 (REV32v4i16 FPR64:$src))>;
5609*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v8i8  FPR64:$src))),
5610*9880d681SAndroid Build Coastguard Worker                             (v2i32 (REV32v8i8 FPR64:$src))>;
5611*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (f64   FPR64:$src))),
5612*9880d681SAndroid Build Coastguard Worker                             (v2i32 (REV64v2i32 FPR64:$src))>;
5613*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v1f64 FPR64:$src))),
5614*9880d681SAndroid Build Coastguard Worker                             (v2i32 (REV64v2i32 FPR64:$src))>;
5615*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v4f16 FPR64:$src))),
5616*9880d681SAndroid Build Coastguard Worker                             (v2i32 (REV64v4i16 FPR64:$src))>;
5617*9880d681SAndroid Build Coastguard Worker}
5618*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (bitconvert (v2f32 FPR64:$src))), (v2i32 FPR64:$src)>;
5619*9880d681SAndroid Build Coastguard Worker
5620*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5621*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v1i64 FPR64:$src))), (v4i16 FPR64:$src)>;
5622*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v2i32 FPR64:$src))), (v4i16 FPR64:$src)>;
5623*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v8i8  FPR64:$src))), (v4i16 FPR64:$src)>;
5624*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (f64   FPR64:$src))), (v4i16 FPR64:$src)>;
5625*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v4f16 FPR64:$src))), (v4i16 FPR64:$src)>;
5626*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v2f32 FPR64:$src))), (v4i16 FPR64:$src)>;
5627*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v1f64 FPR64:$src))), (v4i16 FPR64:$src)>;
5628*9880d681SAndroid Build Coastguard Worker}
5629*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5630*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v1i64 FPR64:$src))),
5631*9880d681SAndroid Build Coastguard Worker                             (v4i16 (REV64v4i16 FPR64:$src))>;
5632*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v2i32 FPR64:$src))),
5633*9880d681SAndroid Build Coastguard Worker                             (v4i16 (REV32v4i16 FPR64:$src))>;
5634*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v8i8  FPR64:$src))),
5635*9880d681SAndroid Build Coastguard Worker                             (v4i16 (REV16v8i8 FPR64:$src))>;
5636*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (f64   FPR64:$src))),
5637*9880d681SAndroid Build Coastguard Worker                             (v4i16 (REV64v4i16 FPR64:$src))>;
5638*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v4f16 FPR64:$src))),
5639*9880d681SAndroid Build Coastguard Worker                             (v4i16 (REV32v4i16 FPR64:$src))>;
5640*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v2f32 FPR64:$src))),
5641*9880d681SAndroid Build Coastguard Worker                             (v4i16 (REV32v4i16 FPR64:$src))>;
5642*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (bitconvert (v1f64 FPR64:$src))),
5643*9880d681SAndroid Build Coastguard Worker                             (v4i16 (REV64v4i16 FPR64:$src))>;
5644*9880d681SAndroid Build Coastguard Worker}
5645*9880d681SAndroid Build Coastguard Worker
5646*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5647*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v1i64 FPR64:$src))), (v4f16 FPR64:$src)>;
5648*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v2i32 FPR64:$src))), (v4f16 FPR64:$src)>;
5649*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v4i16 FPR64:$src))), (v4f16 FPR64:$src)>;
5650*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v8i8  FPR64:$src))), (v4f16 FPR64:$src)>;
5651*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (f64   FPR64:$src))), (v4f16 FPR64:$src)>;
5652*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v2f32 FPR64:$src))), (v4f16 FPR64:$src)>;
5653*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v1f64 FPR64:$src))), (v4f16 FPR64:$src)>;
5654*9880d681SAndroid Build Coastguard Worker}
5655*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5656*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v1i64 FPR64:$src))),
5657*9880d681SAndroid Build Coastguard Worker                             (v4f16 (REV64v4i16 FPR64:$src))>;
5658*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v2i32 FPR64:$src))),
5659*9880d681SAndroid Build Coastguard Worker                             (v4f16 (REV64v4i16 FPR64:$src))>;
5660*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v4i16 FPR64:$src))),
5661*9880d681SAndroid Build Coastguard Worker                             (v4f16 (REV64v4i16 FPR64:$src))>;
5662*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v8i8  FPR64:$src))),
5663*9880d681SAndroid Build Coastguard Worker                             (v4f16 (REV16v8i8 FPR64:$src))>;
5664*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (f64   FPR64:$src))),
5665*9880d681SAndroid Build Coastguard Worker                             (v4f16 (REV64v4i16 FPR64:$src))>;
5666*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v2f32 FPR64:$src))),
5667*9880d681SAndroid Build Coastguard Worker                             (v4f16 (REV64v4i16 FPR64:$src))>;
5668*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (bitconvert (v1f64 FPR64:$src))),
5669*9880d681SAndroid Build Coastguard Worker                             (v4f16 (REV64v4i16 FPR64:$src))>;
5670*9880d681SAndroid Build Coastguard Worker}
5671*9880d681SAndroid Build Coastguard Worker
5672*9880d681SAndroid Build Coastguard Worker
5673*9880d681SAndroid Build Coastguard Worker
5674*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5675*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (v1i64 FPR64:$src))), (v8i8  FPR64:$src)>;
5676*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (v2i32 FPR64:$src))), (v8i8  FPR64:$src)>;
5677*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (v4i16 FPR64:$src))), (v8i8  FPR64:$src)>;
5678*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (f64   FPR64:$src))), (v8i8  FPR64:$src)>;
5679*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (v2f32 FPR64:$src))), (v8i8  FPR64:$src)>;
5680*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (v1f64 FPR64:$src))), (v8i8  FPR64:$src)>;
5681*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (v4f16 FPR64:$src))), (v8i8  FPR64:$src)>;
5682*9880d681SAndroid Build Coastguard Worker}
5683*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5684*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (v1i64 FPR64:$src))),
5685*9880d681SAndroid Build Coastguard Worker                             (v8i8 (REV64v8i8 FPR64:$src))>;
5686*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (v2i32 FPR64:$src))),
5687*9880d681SAndroid Build Coastguard Worker                             (v8i8 (REV32v8i8 FPR64:$src))>;
5688*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (v4i16 FPR64:$src))),
5689*9880d681SAndroid Build Coastguard Worker                             (v8i8 (REV16v8i8 FPR64:$src))>;
5690*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (f64   FPR64:$src))),
5691*9880d681SAndroid Build Coastguard Worker                             (v8i8 (REV64v8i8 FPR64:$src))>;
5692*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (v2f32 FPR64:$src))),
5693*9880d681SAndroid Build Coastguard Worker                             (v8i8 (REV32v8i8 FPR64:$src))>;
5694*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (v1f64 FPR64:$src))),
5695*9880d681SAndroid Build Coastguard Worker                             (v8i8 (REV64v8i8 FPR64:$src))>;
5696*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8  (bitconvert (v4f16 FPR64:$src))),
5697*9880d681SAndroid Build Coastguard Worker                             (v8i8 (REV16v8i8 FPR64:$src))>;
5698*9880d681SAndroid Build Coastguard Worker}
5699*9880d681SAndroid Build Coastguard Worker
5700*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5701*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64   (bitconvert (v2i32 FPR64:$src))), (f64   FPR64:$src)>;
5702*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64   (bitconvert (v4i16 FPR64:$src))), (f64   FPR64:$src)>;
5703*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64   (bitconvert (v2f32 FPR64:$src))), (f64   FPR64:$src)>;
5704*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64   (bitconvert (v8i8  FPR64:$src))), (f64   FPR64:$src)>;
5705*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64   (bitconvert (v4f16 FPR64:$src))), (f64   FPR64:$src)>;
5706*9880d681SAndroid Build Coastguard Worker}
5707*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5708*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64   (bitconvert (v2i32 FPR64:$src))),
5709*9880d681SAndroid Build Coastguard Worker                             (f64 (REV64v2i32 FPR64:$src))>;
5710*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64   (bitconvert (v4i16 FPR64:$src))),
5711*9880d681SAndroid Build Coastguard Worker                             (f64 (REV64v4i16 FPR64:$src))>;
5712*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64   (bitconvert (v2f32 FPR64:$src))),
5713*9880d681SAndroid Build Coastguard Worker                             (f64 (REV64v2i32 FPR64:$src))>;
5714*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64   (bitconvert (v8i8  FPR64:$src))),
5715*9880d681SAndroid Build Coastguard Worker                             (f64 (REV64v8i8 FPR64:$src))>;
5716*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64   (bitconvert (v4f16 FPR64:$src))),
5717*9880d681SAndroid Build Coastguard Worker                             (f64 (REV64v4i16 FPR64:$src))>;
5718*9880d681SAndroid Build Coastguard Worker}
5719*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64   (bitconvert (v1i64 FPR64:$src))), (f64   FPR64:$src)>;
5720*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64   (bitconvert (v1f64 FPR64:$src))), (f64   FPR64:$src)>;
5721*9880d681SAndroid Build Coastguard Worker
5722*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5723*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v2i32 FPR64:$src))), (v1f64 FPR64:$src)>;
5724*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v4i16 FPR64:$src))), (v1f64 FPR64:$src)>;
5725*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v8i8  FPR64:$src))), (v1f64 FPR64:$src)>;
5726*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v2f32 FPR64:$src))), (v1f64 FPR64:$src)>;
5727*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v4f16 FPR64:$src))), (v1f64 FPR64:$src)>;
5728*9880d681SAndroid Build Coastguard Worker}
5729*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5730*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v2i32 FPR64:$src))),
5731*9880d681SAndroid Build Coastguard Worker                             (v1f64 (REV64v2i32 FPR64:$src))>;
5732*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v4i16 FPR64:$src))),
5733*9880d681SAndroid Build Coastguard Worker                             (v1f64 (REV64v4i16 FPR64:$src))>;
5734*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v8i8  FPR64:$src))),
5735*9880d681SAndroid Build Coastguard Worker                             (v1f64 (REV64v8i8 FPR64:$src))>;
5736*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v2f32 FPR64:$src))),
5737*9880d681SAndroid Build Coastguard Worker                             (v1f64 (REV64v2i32 FPR64:$src))>;
5738*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v4f16 FPR64:$src))),
5739*9880d681SAndroid Build Coastguard Worker                             (v1f64 (REV64v4i16 FPR64:$src))>;
5740*9880d681SAndroid Build Coastguard Worker}
5741*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (v1i64 FPR64:$src))), (v1f64 FPR64:$src)>;
5742*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (bitconvert (f64   FPR64:$src))), (v1f64 FPR64:$src)>;
5743*9880d681SAndroid Build Coastguard Worker
5744*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5745*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v1i64 FPR64:$src))), (v2f32 FPR64:$src)>;
5746*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v4i16 FPR64:$src))), (v2f32 FPR64:$src)>;
5747*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v8i8  FPR64:$src))), (v2f32 FPR64:$src)>;
5748*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v1f64 FPR64:$src))), (v2f32 FPR64:$src)>;
5749*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (f64   FPR64:$src))), (v2f32 FPR64:$src)>;
5750*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v4f16 FPR64:$src))), (v2f32 FPR64:$src)>;
5751*9880d681SAndroid Build Coastguard Worker}
5752*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5753*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v1i64 FPR64:$src))),
5754*9880d681SAndroid Build Coastguard Worker                             (v2f32 (REV64v2i32 FPR64:$src))>;
5755*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v4i16 FPR64:$src))),
5756*9880d681SAndroid Build Coastguard Worker                             (v2f32 (REV32v4i16 FPR64:$src))>;
5757*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v8i8  FPR64:$src))),
5758*9880d681SAndroid Build Coastguard Worker                             (v2f32 (REV32v8i8 FPR64:$src))>;
5759*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v1f64 FPR64:$src))),
5760*9880d681SAndroid Build Coastguard Worker                             (v2f32 (REV64v2i32 FPR64:$src))>;
5761*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (f64   FPR64:$src))),
5762*9880d681SAndroid Build Coastguard Worker                             (v2f32 (REV64v2i32 FPR64:$src))>;
5763*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v4f16 FPR64:$src))),
5764*9880d681SAndroid Build Coastguard Worker                             (v2f32 (REV64v4i16 FPR64:$src))>;
5765*9880d681SAndroid Build Coastguard Worker}
5766*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (bitconvert (v2i32 FPR64:$src))), (v2f32 FPR64:$src)>;
5767*9880d681SAndroid Build Coastguard Worker
5768*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5769*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v2i64 FPR128:$src))), (f128 FPR128:$src)>;
5770*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v4i32 FPR128:$src))), (f128 FPR128:$src)>;
5771*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v8i16 FPR128:$src))), (f128 FPR128:$src)>;
5772*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v2f64 FPR128:$src))), (f128 FPR128:$src)>;
5773*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v4f32 FPR128:$src))), (f128 FPR128:$src)>;
5774*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v8f16 FPR128:$src))), (f128 FPR128:$src)>;
5775*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v16i8 FPR128:$src))), (f128 FPR128:$src)>;
5776*9880d681SAndroid Build Coastguard Worker}
5777*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5778*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v2i64 FPR128:$src))),
5779*9880d681SAndroid Build Coastguard Worker                            (f128 (EXTv16i8 FPR128:$src, FPR128:$src, (i32 8)))>;
5780*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v4i32 FPR128:$src))),
5781*9880d681SAndroid Build Coastguard Worker                            (f128 (EXTv16i8 (REV64v4i32 FPR128:$src),
5782*9880d681SAndroid Build Coastguard Worker                                            (REV64v4i32 FPR128:$src), (i32 8)))>;
5783*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v8i16 FPR128:$src))),
5784*9880d681SAndroid Build Coastguard Worker                            (f128 (EXTv16i8 (REV64v8i16 FPR128:$src),
5785*9880d681SAndroid Build Coastguard Worker                                            (REV64v8i16 FPR128:$src), (i32 8)))>;
5786*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v8f16 FPR128:$src))),
5787*9880d681SAndroid Build Coastguard Worker                            (f128 (EXTv16i8 (REV64v8i16 FPR128:$src),
5788*9880d681SAndroid Build Coastguard Worker                                            (REV64v8i16 FPR128:$src), (i32 8)))>;
5789*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v2f64 FPR128:$src))),
5790*9880d681SAndroid Build Coastguard Worker                            (f128 (EXTv16i8 FPR128:$src, FPR128:$src, (i32 8)))>;
5791*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v4f32 FPR128:$src))),
5792*9880d681SAndroid Build Coastguard Worker                            (f128 (EXTv16i8 (REV64v4i32 FPR128:$src),
5793*9880d681SAndroid Build Coastguard Worker                                            (REV64v4i32 FPR128:$src), (i32 8)))>;
5794*9880d681SAndroid Build Coastguard Workerdef : Pat<(f128 (bitconvert (v16i8 FPR128:$src))),
5795*9880d681SAndroid Build Coastguard Worker                            (f128 (EXTv16i8 (REV64v16i8 FPR128:$src),
5796*9880d681SAndroid Build Coastguard Worker                                            (REV64v16i8 FPR128:$src), (i32 8)))>;
5797*9880d681SAndroid Build Coastguard Worker}
5798*9880d681SAndroid Build Coastguard Worker
5799*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5800*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (f128  FPR128:$src))), (v2f64 FPR128:$src)>;
5801*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v4i32 FPR128:$src))), (v2f64 FPR128:$src)>;
5802*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v8i16 FPR128:$src))), (v2f64 FPR128:$src)>;
5803*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v8f16 FPR128:$src))), (v2f64 FPR128:$src)>;
5804*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v16i8 FPR128:$src))), (v2f64 FPR128:$src)>;
5805*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v4f32 FPR128:$src))), (v2f64 FPR128:$src)>;
5806*9880d681SAndroid Build Coastguard Worker}
5807*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5808*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (f128  FPR128:$src))),
5809*9880d681SAndroid Build Coastguard Worker                             (v2f64 (EXTv16i8 FPR128:$src,
5810*9880d681SAndroid Build Coastguard Worker                                              FPR128:$src, (i32 8)))>;
5811*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v4i32 FPR128:$src))),
5812*9880d681SAndroid Build Coastguard Worker                             (v2f64 (REV64v4i32 FPR128:$src))>;
5813*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v8i16 FPR128:$src))),
5814*9880d681SAndroid Build Coastguard Worker                             (v2f64 (REV64v8i16 FPR128:$src))>;
5815*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v8f16 FPR128:$src))),
5816*9880d681SAndroid Build Coastguard Worker                             (v2f64 (REV64v8i16 FPR128:$src))>;
5817*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v16i8 FPR128:$src))),
5818*9880d681SAndroid Build Coastguard Worker                             (v2f64 (REV64v16i8 FPR128:$src))>;
5819*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v4f32 FPR128:$src))),
5820*9880d681SAndroid Build Coastguard Worker                             (v2f64 (REV64v4i32 FPR128:$src))>;
5821*9880d681SAndroid Build Coastguard Worker}
5822*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f64 (bitconvert (v2i64 FPR128:$src))), (v2f64 FPR128:$src)>;
5823*9880d681SAndroid Build Coastguard Worker
5824*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5825*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (f128  FPR128:$src))), (v4f32 FPR128:$src)>;
5826*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v8i16 FPR128:$src))), (v4f32 FPR128:$src)>;
5827*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v8f16 FPR128:$src))), (v4f32 FPR128:$src)>;
5828*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v16i8 FPR128:$src))), (v4f32 FPR128:$src)>;
5829*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v2i64 FPR128:$src))), (v4f32 FPR128:$src)>;
5830*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v2f64 FPR128:$src))), (v4f32 FPR128:$src)>;
5831*9880d681SAndroid Build Coastguard Worker}
5832*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5833*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (f128  FPR128:$src))),
5834*9880d681SAndroid Build Coastguard Worker                             (v4f32 (EXTv16i8 (REV64v4i32 FPR128:$src),
5835*9880d681SAndroid Build Coastguard Worker                                    (REV64v4i32 FPR128:$src), (i32 8)))>;
5836*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v8i16 FPR128:$src))),
5837*9880d681SAndroid Build Coastguard Worker                             (v4f32 (REV32v8i16 FPR128:$src))>;
5838*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v8f16 FPR128:$src))),
5839*9880d681SAndroid Build Coastguard Worker                             (v4f32 (REV32v8i16 FPR128:$src))>;
5840*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v16i8 FPR128:$src))),
5841*9880d681SAndroid Build Coastguard Worker                             (v4f32 (REV32v16i8 FPR128:$src))>;
5842*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v2i64 FPR128:$src))),
5843*9880d681SAndroid Build Coastguard Worker                             (v4f32 (REV64v4i32 FPR128:$src))>;
5844*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v2f64 FPR128:$src))),
5845*9880d681SAndroid Build Coastguard Worker                             (v4f32 (REV64v4i32 FPR128:$src))>;
5846*9880d681SAndroid Build Coastguard Worker}
5847*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f32 (bitconvert (v4i32 FPR128:$src))), (v4f32 FPR128:$src)>;
5848*9880d681SAndroid Build Coastguard Worker
5849*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5850*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (f128  FPR128:$src))), (v2i64 FPR128:$src)>;
5851*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v4i32 FPR128:$src))), (v2i64 FPR128:$src)>;
5852*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v8i16 FPR128:$src))), (v2i64 FPR128:$src)>;
5853*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v16i8 FPR128:$src))), (v2i64 FPR128:$src)>;
5854*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v4f32 FPR128:$src))), (v2i64 FPR128:$src)>;
5855*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v8f16 FPR128:$src))), (v2i64 FPR128:$src)>;
5856*9880d681SAndroid Build Coastguard Worker}
5857*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5858*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (f128  FPR128:$src))),
5859*9880d681SAndroid Build Coastguard Worker                             (v2i64 (EXTv16i8 FPR128:$src,
5860*9880d681SAndroid Build Coastguard Worker                                              FPR128:$src, (i32 8)))>;
5861*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v4i32 FPR128:$src))),
5862*9880d681SAndroid Build Coastguard Worker                             (v2i64 (REV64v4i32 FPR128:$src))>;
5863*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v8i16 FPR128:$src))),
5864*9880d681SAndroid Build Coastguard Worker                             (v2i64 (REV64v8i16 FPR128:$src))>;
5865*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v16i8 FPR128:$src))),
5866*9880d681SAndroid Build Coastguard Worker                             (v2i64 (REV64v16i8 FPR128:$src))>;
5867*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v4f32 FPR128:$src))),
5868*9880d681SAndroid Build Coastguard Worker                             (v2i64 (REV64v4i32 FPR128:$src))>;
5869*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v8f16 FPR128:$src))),
5870*9880d681SAndroid Build Coastguard Worker                             (v2i64 (REV64v8i16 FPR128:$src))>;
5871*9880d681SAndroid Build Coastguard Worker}
5872*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i64 (bitconvert (v2f64 FPR128:$src))), (v2i64 FPR128:$src)>;
5873*9880d681SAndroid Build Coastguard Worker
5874*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5875*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (f128  FPR128:$src))), (v4i32 FPR128:$src)>;
5876*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v2i64 FPR128:$src))), (v4i32 FPR128:$src)>;
5877*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v8i16 FPR128:$src))), (v4i32 FPR128:$src)>;
5878*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v16i8 FPR128:$src))), (v4i32 FPR128:$src)>;
5879*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v2f64 FPR128:$src))), (v4i32 FPR128:$src)>;
5880*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v8f16 FPR128:$src))), (v4i32 FPR128:$src)>;
5881*9880d681SAndroid Build Coastguard Worker}
5882*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5883*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (f128  FPR128:$src))),
5884*9880d681SAndroid Build Coastguard Worker                             (v4i32 (EXTv16i8 (REV64v4i32 FPR128:$src),
5885*9880d681SAndroid Build Coastguard Worker                                              (REV64v4i32 FPR128:$src),
5886*9880d681SAndroid Build Coastguard Worker                                              (i32 8)))>;
5887*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v2i64 FPR128:$src))),
5888*9880d681SAndroid Build Coastguard Worker                             (v4i32 (REV64v4i32 FPR128:$src))>;
5889*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v8i16 FPR128:$src))),
5890*9880d681SAndroid Build Coastguard Worker                             (v4i32 (REV32v8i16 FPR128:$src))>;
5891*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v16i8 FPR128:$src))),
5892*9880d681SAndroid Build Coastguard Worker                             (v4i32 (REV32v16i8 FPR128:$src))>;
5893*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v2f64 FPR128:$src))),
5894*9880d681SAndroid Build Coastguard Worker                             (v4i32 (REV64v4i32 FPR128:$src))>;
5895*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v8f16 FPR128:$src))),
5896*9880d681SAndroid Build Coastguard Worker                             (v4i32 (REV32v8i16 FPR128:$src))>;
5897*9880d681SAndroid Build Coastguard Worker}
5898*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (bitconvert (v4f32 FPR128:$src))), (v4i32 FPR128:$src)>;
5899*9880d681SAndroid Build Coastguard Worker
5900*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5901*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (f128  FPR128:$src))), (v8i16 FPR128:$src)>;
5902*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v2i64 FPR128:$src))), (v8i16 FPR128:$src)>;
5903*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v4i32 FPR128:$src))), (v8i16 FPR128:$src)>;
5904*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v16i8 FPR128:$src))), (v8i16 FPR128:$src)>;
5905*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v2f64 FPR128:$src))), (v8i16 FPR128:$src)>;
5906*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v4f32 FPR128:$src))), (v8i16 FPR128:$src)>;
5907*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v8f16 FPR128:$src))), (v8i16 FPR128:$src)>;
5908*9880d681SAndroid Build Coastguard Worker}
5909*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5910*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (f128  FPR128:$src))),
5911*9880d681SAndroid Build Coastguard Worker                             (v8i16 (EXTv16i8 (REV64v8i16 FPR128:$src),
5912*9880d681SAndroid Build Coastguard Worker                                              (REV64v8i16 FPR128:$src),
5913*9880d681SAndroid Build Coastguard Worker                                              (i32 8)))>;
5914*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v2i64 FPR128:$src))),
5915*9880d681SAndroid Build Coastguard Worker                             (v8i16 (REV64v8i16 FPR128:$src))>;
5916*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v4i32 FPR128:$src))),
5917*9880d681SAndroid Build Coastguard Worker                             (v8i16 (REV32v8i16 FPR128:$src))>;
5918*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v16i8 FPR128:$src))),
5919*9880d681SAndroid Build Coastguard Worker                             (v8i16 (REV16v16i8 FPR128:$src))>;
5920*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v2f64 FPR128:$src))),
5921*9880d681SAndroid Build Coastguard Worker                             (v8i16 (REV64v8i16 FPR128:$src))>;
5922*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v4f32 FPR128:$src))),
5923*9880d681SAndroid Build Coastguard Worker                             (v8i16 (REV32v8i16 FPR128:$src))>;
5924*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i16 (bitconvert (v8f16 FPR128:$src))),
5925*9880d681SAndroid Build Coastguard Worker                             (v8i16 (REV32v8i16 FPR128:$src))>;
5926*9880d681SAndroid Build Coastguard Worker}
5927*9880d681SAndroid Build Coastguard Worker
5928*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5929*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (f128  FPR128:$src))), (v8f16 FPR128:$src)>;
5930*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v2i64 FPR128:$src))), (v8f16 FPR128:$src)>;
5931*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v4i32 FPR128:$src))), (v8f16 FPR128:$src)>;
5932*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v8i16 FPR128:$src))), (v8f16 FPR128:$src)>;
5933*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v16i8 FPR128:$src))), (v8f16 FPR128:$src)>;
5934*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v2f64 FPR128:$src))), (v8f16 FPR128:$src)>;
5935*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v4f32 FPR128:$src))), (v8f16 FPR128:$src)>;
5936*9880d681SAndroid Build Coastguard Worker}
5937*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5938*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (f128  FPR128:$src))),
5939*9880d681SAndroid Build Coastguard Worker                             (v8f16 (EXTv16i8 (REV64v8i16 FPR128:$src),
5940*9880d681SAndroid Build Coastguard Worker                                              (REV64v8i16 FPR128:$src),
5941*9880d681SAndroid Build Coastguard Worker                                              (i32 8)))>;
5942*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v2i64 FPR128:$src))),
5943*9880d681SAndroid Build Coastguard Worker                             (v8f16 (REV64v8i16 FPR128:$src))>;
5944*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v4i32 FPR128:$src))),
5945*9880d681SAndroid Build Coastguard Worker                             (v8f16 (REV32v8i16 FPR128:$src))>;
5946*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v8i16 FPR128:$src))),
5947*9880d681SAndroid Build Coastguard Worker                             (v8f16 (REV64v8i16 FPR128:$src))>;
5948*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v16i8 FPR128:$src))),
5949*9880d681SAndroid Build Coastguard Worker                             (v8f16 (REV16v16i8 FPR128:$src))>;
5950*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v2f64 FPR128:$src))),
5951*9880d681SAndroid Build Coastguard Worker                             (v8f16 (REV64v8i16 FPR128:$src))>;
5952*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8f16 (bitconvert (v4f32 FPR128:$src))),
5953*9880d681SAndroid Build Coastguard Worker                             (v8f16 (REV32v8i16 FPR128:$src))>;
5954*9880d681SAndroid Build Coastguard Worker}
5955*9880d681SAndroid Build Coastguard Worker
5956*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
5957*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (f128  FPR128:$src))), (v16i8 FPR128:$src)>;
5958*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v2i64 FPR128:$src))), (v16i8 FPR128:$src)>;
5959*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v4i32 FPR128:$src))), (v16i8 FPR128:$src)>;
5960*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v8i16 FPR128:$src))), (v16i8 FPR128:$src)>;
5961*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v2f64 FPR128:$src))), (v16i8 FPR128:$src)>;
5962*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v4f32 FPR128:$src))), (v16i8 FPR128:$src)>;
5963*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v8f16 FPR128:$src))), (v16i8 FPR128:$src)>;
5964*9880d681SAndroid Build Coastguard Worker}
5965*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsBE] in {
5966*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (f128  FPR128:$src))),
5967*9880d681SAndroid Build Coastguard Worker                             (v16i8 (EXTv16i8 (REV64v16i8 FPR128:$src),
5968*9880d681SAndroid Build Coastguard Worker                                              (REV64v16i8 FPR128:$src),
5969*9880d681SAndroid Build Coastguard Worker                                              (i32 8)))>;
5970*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v2i64 FPR128:$src))),
5971*9880d681SAndroid Build Coastguard Worker                             (v16i8 (REV64v16i8 FPR128:$src))>;
5972*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v4i32 FPR128:$src))),
5973*9880d681SAndroid Build Coastguard Worker                             (v16i8 (REV32v16i8 FPR128:$src))>;
5974*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v8i16 FPR128:$src))),
5975*9880d681SAndroid Build Coastguard Worker                             (v16i8 (REV16v16i8 FPR128:$src))>;
5976*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v2f64 FPR128:$src))),
5977*9880d681SAndroid Build Coastguard Worker                             (v16i8 (REV64v16i8 FPR128:$src))>;
5978*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v4f32 FPR128:$src))),
5979*9880d681SAndroid Build Coastguard Worker                             (v16i8 (REV32v16i8 FPR128:$src))>;
5980*9880d681SAndroid Build Coastguard Workerdef : Pat<(v16i8 (bitconvert (v8f16 FPR128:$src))),
5981*9880d681SAndroid Build Coastguard Worker                             (v16i8 (REV16v16i8 FPR128:$src))>;
5982*9880d681SAndroid Build Coastguard Worker}
5983*9880d681SAndroid Build Coastguard Worker
5984*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (extract_subvector V128:$Rn, (i64 0))),
5985*9880d681SAndroid Build Coastguard Worker           (EXTRACT_SUBREG V128:$Rn, dsub)>;
5986*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (extract_subvector V128:$Rn, (i64 0))),
5987*9880d681SAndroid Build Coastguard Worker           (EXTRACT_SUBREG V128:$Rn, dsub)>;
5988*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2f32 (extract_subvector V128:$Rn, (i64 0))),
5989*9880d681SAndroid Build Coastguard Worker           (EXTRACT_SUBREG V128:$Rn, dsub)>;
5990*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4f16 (extract_subvector V128:$Rn, (i64 0))),
5991*9880d681SAndroid Build Coastguard Worker           (EXTRACT_SUBREG V128:$Rn, dsub)>;
5992*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (extract_subvector V128:$Rn, (i64 0))),
5993*9880d681SAndroid Build Coastguard Worker           (EXTRACT_SUBREG V128:$Rn, dsub)>;
5994*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (extract_subvector V128:$Rn, (i64 0))),
5995*9880d681SAndroid Build Coastguard Worker           (EXTRACT_SUBREG V128:$Rn, dsub)>;
5996*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1f64 (extract_subvector V128:$Rn, (i64 0))),
5997*9880d681SAndroid Build Coastguard Worker           (EXTRACT_SUBREG V128:$Rn, dsub)>;
5998*9880d681SAndroid Build Coastguard Worker
5999*9880d681SAndroid Build Coastguard Workerdef : Pat<(v8i8 (extract_subvector (v16i8 FPR128:$Rn), (i64 1))),
6000*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (DUPv2i64lane FPR128:$Rn, 1), dsub)>;
6001*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i16 (extract_subvector (v8i16 FPR128:$Rn), (i64 1))),
6002*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (DUPv2i64lane FPR128:$Rn, 1), dsub)>;
6003*9880d681SAndroid Build Coastguard Workerdef : Pat<(v2i32 (extract_subvector (v4i32 FPR128:$Rn), (i64 1))),
6004*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (DUPv2i64lane FPR128:$Rn, 1), dsub)>;
6005*9880d681SAndroid Build Coastguard Workerdef : Pat<(v1i64 (extract_subvector (v2i64 FPR128:$Rn), (i64 1))),
6006*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (DUPv2i64lane FPR128:$Rn, 1), dsub)>;
6007*9880d681SAndroid Build Coastguard Worker
6008*9880d681SAndroid Build Coastguard Worker// A 64-bit subvector insert to the first 128-bit vector position
6009*9880d681SAndroid Build Coastguard Worker// is a subregister copy that needs no instruction.
6010*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v1i64 FPR64:$src), (i32 0)),
6011*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), FPR64:$src, dsub)>;
6012*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v1f64 FPR64:$src), (i32 0)),
6013*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), FPR64:$src, dsub)>;
6014*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v2i32 FPR64:$src), (i32 0)),
6015*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)), FPR64:$src, dsub)>;
6016*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v2f32 FPR64:$src), (i32 0)),
6017*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), FPR64:$src, dsub)>;
6018*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v4i16 FPR64:$src), (i32 0)),
6019*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)), FPR64:$src, dsub)>;
6020*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v4f16 FPR64:$src), (i32 0)),
6021*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v8f16 (IMPLICIT_DEF)), FPR64:$src, dsub)>;
6022*9880d681SAndroid Build Coastguard Workerdef : Pat<(insert_subvector undef, (v8i8 FPR64:$src), (i32 0)),
6023*9880d681SAndroid Build Coastguard Worker          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), FPR64:$src, dsub)>;
6024*9880d681SAndroid Build Coastguard Worker
6025*9880d681SAndroid Build Coastguard Worker// Use pair-wise add instructions when summing up the lanes for v2f64, v2i64
6026*9880d681SAndroid Build Coastguard Worker// or v2f32.
6027*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (add (vector_extract (v2i64 FPR128:$Rn), (i64 0)),
6028*9880d681SAndroid Build Coastguard Worker                    (vector_extract (v2i64 FPR128:$Rn), (i64 1)))),
6029*9880d681SAndroid Build Coastguard Worker           (i64 (ADDPv2i64p (v2i64 FPR128:$Rn)))>;
6030*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fadd (vector_extract (v2f64 FPR128:$Rn), (i64 0)),
6031*9880d681SAndroid Build Coastguard Worker                     (vector_extract (v2f64 FPR128:$Rn), (i64 1)))),
6032*9880d681SAndroid Build Coastguard Worker           (f64 (FADDPv2i64p (v2f64 FPR128:$Rn)))>;
6033*9880d681SAndroid Build Coastguard Worker    // vector_extract on 64-bit vectors gets promoted to a 128 bit vector,
6034*9880d681SAndroid Build Coastguard Worker    // so we match on v4f32 here, not v2f32. This will also catch adding
6035*9880d681SAndroid Build Coastguard Worker    // the low two lanes of a true v4f32 vector.
6036*9880d681SAndroid Build Coastguard Workerdef : Pat<(fadd (vector_extract (v4f32 FPR128:$Rn), (i64 0)),
6037*9880d681SAndroid Build Coastguard Worker                (vector_extract (v4f32 FPR128:$Rn), (i64 1))),
6038*9880d681SAndroid Build Coastguard Worker          (f32 (FADDPv2i32p (EXTRACT_SUBREG FPR128:$Rn, dsub)))>;
6039*9880d681SAndroid Build Coastguard Worker
6040*9880d681SAndroid Build Coastguard Worker// Scalar 64-bit shifts in FPR64 registers.
6041*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_sshl (i64 FPR64:$Rn), (i64 FPR64:$Rm))),
6042*9880d681SAndroid Build Coastguard Worker          (SSHLv1i64 FPR64:$Rn, FPR64:$Rm)>;
6043*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_ushl (i64 FPR64:$Rn), (i64 FPR64:$Rm))),
6044*9880d681SAndroid Build Coastguard Worker          (USHLv1i64 FPR64:$Rn, FPR64:$Rm)>;
6045*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_srshl (i64 FPR64:$Rn), (i64 FPR64:$Rm))),
6046*9880d681SAndroid Build Coastguard Worker          (SRSHLv1i64 FPR64:$Rn, FPR64:$Rm)>;
6047*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (int_aarch64_neon_urshl (i64 FPR64:$Rn), (i64 FPR64:$Rm))),
6048*9880d681SAndroid Build Coastguard Worker          (URSHLv1i64 FPR64:$Rn, FPR64:$Rm)>;
6049*9880d681SAndroid Build Coastguard Worker
6050*9880d681SAndroid Build Coastguard Worker// Patterns for nontemporal/no-allocate stores.
6051*9880d681SAndroid Build Coastguard Worker// We have to resort to tricks to turn a single-input store into a store pair,
6052*9880d681SAndroid Build Coastguard Worker// because there is no single-input nontemporal store, only STNP.
6053*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsLE] in {
6054*9880d681SAndroid Build Coastguard Workerlet AddedComplexity = 15 in {
6055*9880d681SAndroid Build Coastguard Workerclass NTStore128Pat<ValueType VT> :
6056*9880d681SAndroid Build Coastguard Worker  Pat<(nontemporalstore (VT FPR128:$Rt),
6057*9880d681SAndroid Build Coastguard Worker        (am_indexed7s64 GPR64sp:$Rn, simm7s8:$offset)),
6058*9880d681SAndroid Build Coastguard Worker      (STNPDi (EXTRACT_SUBREG FPR128:$Rt, dsub),
6059*9880d681SAndroid Build Coastguard Worker              (CPYi64 FPR128:$Rt, (i64 1)),
6060*9880d681SAndroid Build Coastguard Worker              GPR64sp:$Rn, simm7s8:$offset)>;
6061*9880d681SAndroid Build Coastguard Worker
6062*9880d681SAndroid Build Coastguard Workerdef : NTStore128Pat<v2i64>;
6063*9880d681SAndroid Build Coastguard Workerdef : NTStore128Pat<v4i32>;
6064*9880d681SAndroid Build Coastguard Workerdef : NTStore128Pat<v8i16>;
6065*9880d681SAndroid Build Coastguard Workerdef : NTStore128Pat<v16i8>;
6066*9880d681SAndroid Build Coastguard Worker
6067*9880d681SAndroid Build Coastguard Workerclass NTStore64Pat<ValueType VT> :
6068*9880d681SAndroid Build Coastguard Worker  Pat<(nontemporalstore (VT FPR64:$Rt),
6069*9880d681SAndroid Build Coastguard Worker        (am_indexed7s32 GPR64sp:$Rn, simm7s4:$offset)),
6070*9880d681SAndroid Build Coastguard Worker      (STNPSi (EXTRACT_SUBREG FPR64:$Rt, ssub),
6071*9880d681SAndroid Build Coastguard Worker              (CPYi32 (SUBREG_TO_REG (i64 0), FPR64:$Rt, dsub), (i64 1)),
6072*9880d681SAndroid Build Coastguard Worker              GPR64sp:$Rn, simm7s4:$offset)>;
6073*9880d681SAndroid Build Coastguard Worker
6074*9880d681SAndroid Build Coastguard Worker// FIXME: Shouldn't v1f64 loads/stores be promoted to v1i64?
6075*9880d681SAndroid Build Coastguard Workerdef : NTStore64Pat<v1f64>;
6076*9880d681SAndroid Build Coastguard Workerdef : NTStore64Pat<v1i64>;
6077*9880d681SAndroid Build Coastguard Workerdef : NTStore64Pat<v2i32>;
6078*9880d681SAndroid Build Coastguard Workerdef : NTStore64Pat<v4i16>;
6079*9880d681SAndroid Build Coastguard Workerdef : NTStore64Pat<v8i8>;
6080*9880d681SAndroid Build Coastguard Worker
6081*9880d681SAndroid Build Coastguard Workerdef : Pat<(nontemporalstore GPR64:$Rt,
6082*9880d681SAndroid Build Coastguard Worker            (am_indexed7s32 GPR64sp:$Rn, simm7s4:$offset)),
6083*9880d681SAndroid Build Coastguard Worker          (STNPWi (EXTRACT_SUBREG GPR64:$Rt, sub_32),
6084*9880d681SAndroid Build Coastguard Worker                  (EXTRACT_SUBREG (UBFMXri GPR64:$Rt, 32, 63), sub_32),
6085*9880d681SAndroid Build Coastguard Worker                  GPR64sp:$Rn, simm7s4:$offset)>;
6086*9880d681SAndroid Build Coastguard Worker} // AddedComplexity=10
6087*9880d681SAndroid Build Coastguard Worker} // Predicates = [IsLE]
6088*9880d681SAndroid Build Coastguard Worker
6089*9880d681SAndroid Build Coastguard Worker// Tail call return handling. These are all compiler pseudo-instructions,
6090*9880d681SAndroid Build Coastguard Worker// so no encoding information or anything like that.
6091*9880d681SAndroid Build Coastguard Workerlet isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [SP] in {
6092*9880d681SAndroid Build Coastguard Worker  def TCRETURNdi : Pseudo<(outs), (ins i64imm:$dst, i32imm:$FPDiff), []>,
6093*9880d681SAndroid Build Coastguard Worker                   Sched<[WriteBrReg]>;
6094*9880d681SAndroid Build Coastguard Worker  def TCRETURNri : Pseudo<(outs), (ins tcGPR64:$dst, i32imm:$FPDiff), []>,
6095*9880d681SAndroid Build Coastguard Worker                   Sched<[WriteBrReg]>;
6096*9880d681SAndroid Build Coastguard Worker}
6097*9880d681SAndroid Build Coastguard Worker
6098*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64tcret tcGPR64:$dst, (i32 timm:$FPDiff)),
6099*9880d681SAndroid Build Coastguard Worker          (TCRETURNri tcGPR64:$dst, imm:$FPDiff)>;
6100*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64tcret tglobaladdr:$dst, (i32 timm:$FPDiff)),
6101*9880d681SAndroid Build Coastguard Worker          (TCRETURNdi texternalsym:$dst, imm:$FPDiff)>;
6102*9880d681SAndroid Build Coastguard Workerdef : Pat<(AArch64tcret texternalsym:$dst, (i32 timm:$FPDiff)),
6103*9880d681SAndroid Build Coastguard Worker          (TCRETURNdi texternalsym:$dst, imm:$FPDiff)>;
6104*9880d681SAndroid Build Coastguard Worker
6105*9880d681SAndroid Build Coastguard Workerinclude "AArch64InstrAtomics.td"
6106