xref: /aosp_15_r20/external/llvm/lib/Target/PowerPC/PPCInstrInfo.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===-- PPCInstrInfo.td - The PowerPC Instruction Set ------*- tablegen -*-===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//
10*9880d681SAndroid Build Coastguard Worker// This file describes the subset of the 32-bit PowerPC instruction set, as used
11*9880d681SAndroid Build Coastguard Worker// by the PowerPC instruction selector.
12*9880d681SAndroid Build Coastguard Worker//
13*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerinclude "PPCInstrFormats.td"
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
18*9880d681SAndroid Build Coastguard Worker// PowerPC specific type constraints.
19*9880d681SAndroid Build Coastguard Worker//
20*9880d681SAndroid Build Coastguard Workerdef SDT_PPCstfiwx : SDTypeProfile<0, 2, [ // stfiwx
21*9880d681SAndroid Build Coastguard Worker  SDTCisVT<0, f64>, SDTCisPtrTy<1>
22*9880d681SAndroid Build Coastguard Worker]>;
23*9880d681SAndroid Build Coastguard Workerdef SDT_PPClfiwx : SDTypeProfile<1, 1, [ // lfiw[az]x
24*9880d681SAndroid Build Coastguard Worker  SDTCisVT<0, f64>, SDTCisPtrTy<1>
25*9880d681SAndroid Build Coastguard Worker]>;
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdef SDT_PPCCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i32> ]>;
28*9880d681SAndroid Build Coastguard Workerdef SDT_PPCCallSeqEnd   : SDCallSeqEnd<[ SDTCisVT<0, i32>,
29*9880d681SAndroid Build Coastguard Worker                                         SDTCisVT<1, i32> ]>;
30*9880d681SAndroid Build Coastguard Workerdef SDT_PPCvperm   : SDTypeProfile<1, 3, [
31*9880d681SAndroid Build Coastguard Worker  SDTCisVT<3, v16i8>, SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>
32*9880d681SAndroid Build Coastguard Worker]>;
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerdef SDT_PPCVecSplat : SDTypeProfile<1, 2, [ SDTCisVec<0>,
35*9880d681SAndroid Build Coastguard Worker  SDTCisVec<1>, SDTCisInt<2>
36*9880d681SAndroid Build Coastguard Worker]>;
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdef SDT_PPCVecShift : SDTypeProfile<1, 3, [ SDTCisVec<0>,
39*9880d681SAndroid Build Coastguard Worker  SDTCisVec<1>, SDTCisVec<2>, SDTCisInt<3>
40*9880d681SAndroid Build Coastguard Worker]>;
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdef SDT_PPCVecInsert : SDTypeProfile<1, 3, [ SDTCisVec<0>,
43*9880d681SAndroid Build Coastguard Worker  SDTCisVec<1>, SDTCisVec<2>, SDTCisInt<3>
44*9880d681SAndroid Build Coastguard Worker]>;
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdef SDT_PPCvcmp : SDTypeProfile<1, 3, [
47*9880d681SAndroid Build Coastguard Worker  SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisVT<3, i32>
48*9880d681SAndroid Build Coastguard Worker]>;
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdef SDT_PPCcondbr : SDTypeProfile<0, 3, [
51*9880d681SAndroid Build Coastguard Worker  SDTCisVT<0, i32>, SDTCisVT<2, OtherVT>
52*9880d681SAndroid Build Coastguard Worker]>;
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdef SDT_PPClbrx : SDTypeProfile<1, 2, [
55*9880d681SAndroid Build Coastguard Worker  SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>
56*9880d681SAndroid Build Coastguard Worker]>;
57*9880d681SAndroid Build Coastguard Workerdef SDT_PPCstbrx : SDTypeProfile<0, 3, [
58*9880d681SAndroid Build Coastguard Worker  SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>
59*9880d681SAndroid Build Coastguard Worker]>;
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdef SDT_PPCTC_ret : SDTypeProfile<0, 2, [
62*9880d681SAndroid Build Coastguard Worker  SDTCisPtrTy<0>, SDTCisVT<1, i32>
63*9880d681SAndroid Build Coastguard Worker]>;
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdef tocentry32 : Operand<iPTR> {
66*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops i32imm:$imm);
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerdef SDT_PPCqvfperm   : SDTypeProfile<1, 3, [
70*9880d681SAndroid Build Coastguard Worker  SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisVec<3>
71*9880d681SAndroid Build Coastguard Worker]>;
72*9880d681SAndroid Build Coastguard Workerdef SDT_PPCqvgpci   : SDTypeProfile<1, 1, [
73*9880d681SAndroid Build Coastguard Worker  SDTCisVec<0>, SDTCisInt<1>
74*9880d681SAndroid Build Coastguard Worker]>;
75*9880d681SAndroid Build Coastguard Workerdef SDT_PPCqvaligni   : SDTypeProfile<1, 3, [
76*9880d681SAndroid Build Coastguard Worker  SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisInt<3>
77*9880d681SAndroid Build Coastguard Worker]>;
78*9880d681SAndroid Build Coastguard Workerdef SDT_PPCqvesplati   : SDTypeProfile<1, 2, [
79*9880d681SAndroid Build Coastguard Worker  SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisInt<2>
80*9880d681SAndroid Build Coastguard Worker]>;
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdef SDT_PPCqbflt : SDTypeProfile<1, 1, [
83*9880d681SAndroid Build Coastguard Worker  SDTCisVec<0>, SDTCisVec<1>
84*9880d681SAndroid Build Coastguard Worker]>;
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerdef SDT_PPCqvlfsb : SDTypeProfile<1, 1, [
87*9880d681SAndroid Build Coastguard Worker  SDTCisVec<0>, SDTCisPtrTy<1>
88*9880d681SAndroid Build Coastguard Worker]>;
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
91*9880d681SAndroid Build Coastguard Worker// PowerPC specific DAG Nodes.
92*9880d681SAndroid Build Coastguard Worker//
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerdef PPCfre    : SDNode<"PPCISD::FRE",     SDTFPUnaryOp, []>;
95*9880d681SAndroid Build Coastguard Workerdef PPCfrsqrte: SDNode<"PPCISD::FRSQRTE", SDTFPUnaryOp, []>;
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdef PPCfcfid  : SDNode<"PPCISD::FCFID",   SDTFPUnaryOp, []>;
98*9880d681SAndroid Build Coastguard Workerdef PPCfcfidu : SDNode<"PPCISD::FCFIDU",  SDTFPUnaryOp, []>;
99*9880d681SAndroid Build Coastguard Workerdef PPCfcfids : SDNode<"PPCISD::FCFIDS",  SDTFPRoundOp, []>;
100*9880d681SAndroid Build Coastguard Workerdef PPCfcfidus: SDNode<"PPCISD::FCFIDUS", SDTFPRoundOp, []>;
101*9880d681SAndroid Build Coastguard Workerdef PPCfctidz : SDNode<"PPCISD::FCTIDZ", SDTFPUnaryOp, []>;
102*9880d681SAndroid Build Coastguard Workerdef PPCfctiwz : SDNode<"PPCISD::FCTIWZ", SDTFPUnaryOp, []>;
103*9880d681SAndroid Build Coastguard Workerdef PPCfctiduz: SDNode<"PPCISD::FCTIDUZ",SDTFPUnaryOp, []>;
104*9880d681SAndroid Build Coastguard Workerdef PPCfctiwuz: SDNode<"PPCISD::FCTIWUZ",SDTFPUnaryOp, []>;
105*9880d681SAndroid Build Coastguard Workerdef PPCstfiwx : SDNode<"PPCISD::STFIWX", SDT_PPCstfiwx,
106*9880d681SAndroid Build Coastguard Worker                       [SDNPHasChain, SDNPMayStore]>;
107*9880d681SAndroid Build Coastguard Workerdef PPClfiwax : SDNode<"PPCISD::LFIWAX", SDT_PPClfiwx,
108*9880d681SAndroid Build Coastguard Worker                       [SDNPHasChain, SDNPMayLoad]>;
109*9880d681SAndroid Build Coastguard Workerdef PPClfiwzx : SDNode<"PPCISD::LFIWZX", SDT_PPClfiwx,
110*9880d681SAndroid Build Coastguard Worker                       [SDNPHasChain, SDNPMayLoad]>;
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker// Extract FPSCR (not modeled at the DAG level).
113*9880d681SAndroid Build Coastguard Workerdef PPCmffs   : SDNode<"PPCISD::MFFS",
114*9880d681SAndroid Build Coastguard Worker                       SDTypeProfile<1, 0, [SDTCisVT<0, f64>]>, []>;
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker// Perform FADD in round-to-zero mode.
117*9880d681SAndroid Build Coastguard Workerdef PPCfaddrtz: SDNode<"PPCISD::FADDRTZ", SDTFPBinOp, []>;
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerdef PPCfsel   : SDNode<"PPCISD::FSEL",
121*9880d681SAndroid Build Coastguard Worker   // Type constraint for fsel.
122*9880d681SAndroid Build Coastguard Worker   SDTypeProfile<1, 3, [SDTCisSameAs<0, 2>, SDTCisSameAs<0, 3>,
123*9880d681SAndroid Build Coastguard Worker                        SDTCisFP<0>, SDTCisVT<1, f64>]>, []>;
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdef PPChi       : SDNode<"PPCISD::Hi", SDTIntBinOp, []>;
126*9880d681SAndroid Build Coastguard Workerdef PPClo       : SDNode<"PPCISD::Lo", SDTIntBinOp, []>;
127*9880d681SAndroid Build Coastguard Workerdef PPCtoc_entry: SDNode<"PPCISD::TOC_ENTRY", SDTIntBinOp,
128*9880d681SAndroid Build Coastguard Worker                         [SDNPMayLoad, SDNPMemOperand]>;
129*9880d681SAndroid Build Coastguard Workerdef PPCvmaddfp  : SDNode<"PPCISD::VMADDFP", SDTFPTernaryOp, []>;
130*9880d681SAndroid Build Coastguard Workerdef PPCvnmsubfp : SDNode<"PPCISD::VNMSUBFP", SDTFPTernaryOp, []>;
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerdef PPCppc32GOT : SDNode<"PPCISD::PPC32_GOT", SDTIntLeaf, []>;
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdef PPCaddisGotTprelHA : SDNode<"PPCISD::ADDIS_GOT_TPREL_HA", SDTIntBinOp>;
135*9880d681SAndroid Build Coastguard Workerdef PPCldGotTprelL : SDNode<"PPCISD::LD_GOT_TPREL_L", SDTIntBinOp,
136*9880d681SAndroid Build Coastguard Worker                            [SDNPMayLoad]>;
137*9880d681SAndroid Build Coastguard Workerdef PPCaddTls     : SDNode<"PPCISD::ADD_TLS", SDTIntBinOp, []>;
138*9880d681SAndroid Build Coastguard Workerdef PPCaddisTlsgdHA : SDNode<"PPCISD::ADDIS_TLSGD_HA", SDTIntBinOp>;
139*9880d681SAndroid Build Coastguard Workerdef PPCaddiTlsgdL   : SDNode<"PPCISD::ADDI_TLSGD_L", SDTIntBinOp>;
140*9880d681SAndroid Build Coastguard Workerdef PPCgetTlsAddr   : SDNode<"PPCISD::GET_TLS_ADDR", SDTIntBinOp>;
141*9880d681SAndroid Build Coastguard Workerdef PPCaddiTlsgdLAddr : SDNode<"PPCISD::ADDI_TLSGD_L_ADDR",
142*9880d681SAndroid Build Coastguard Worker                               SDTypeProfile<1, 3, [
143*9880d681SAndroid Build Coastguard Worker                                 SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>,
144*9880d681SAndroid Build Coastguard Worker                                 SDTCisSameAs<0, 3>, SDTCisInt<0> ]>>;
145*9880d681SAndroid Build Coastguard Workerdef PPCaddisTlsldHA : SDNode<"PPCISD::ADDIS_TLSLD_HA", SDTIntBinOp>;
146*9880d681SAndroid Build Coastguard Workerdef PPCaddiTlsldL   : SDNode<"PPCISD::ADDI_TLSLD_L", SDTIntBinOp>;
147*9880d681SAndroid Build Coastguard Workerdef PPCgetTlsldAddr : SDNode<"PPCISD::GET_TLSLD_ADDR", SDTIntBinOp>;
148*9880d681SAndroid Build Coastguard Workerdef PPCaddiTlsldLAddr : SDNode<"PPCISD::ADDI_TLSLD_L_ADDR",
149*9880d681SAndroid Build Coastguard Worker                               SDTypeProfile<1, 3, [
150*9880d681SAndroid Build Coastguard Worker                                 SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>,
151*9880d681SAndroid Build Coastguard Worker                                 SDTCisSameAs<0, 3>, SDTCisInt<0> ]>>;
152*9880d681SAndroid Build Coastguard Workerdef PPCaddisDtprelHA : SDNode<"PPCISD::ADDIS_DTPREL_HA", SDTIntBinOp>;
153*9880d681SAndroid Build Coastguard Workerdef PPCaddiDtprelL   : SDNode<"PPCISD::ADDI_DTPREL_L", SDTIntBinOp>;
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdef PPCvperm     : SDNode<"PPCISD::VPERM", SDT_PPCvperm, []>;
156*9880d681SAndroid Build Coastguard Workerdef PPCxxsplt    : SDNode<"PPCISD::XXSPLT", SDT_PPCVecSplat, []>;
157*9880d681SAndroid Build Coastguard Workerdef PPCxxinsert  : SDNode<"PPCISD::XXINSERT", SDT_PPCVecInsert, []>;
158*9880d681SAndroid Build Coastguard Workerdef PPCvecshl    : SDNode<"PPCISD::VECSHL", SDT_PPCVecShift, []>;
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workerdef PPCqvfperm   : SDNode<"PPCISD::QVFPERM", SDT_PPCqvfperm, []>;
161*9880d681SAndroid Build Coastguard Workerdef PPCqvgpci    : SDNode<"PPCISD::QVGPCI", SDT_PPCqvgpci, []>;
162*9880d681SAndroid Build Coastguard Workerdef PPCqvaligni  : SDNode<"PPCISD::QVALIGNI", SDT_PPCqvaligni, []>;
163*9880d681SAndroid Build Coastguard Workerdef PPCqvesplati : SDNode<"PPCISD::QVESPLATI", SDT_PPCqvesplati, []>;
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerdef PPCqbflt     : SDNode<"PPCISD::QBFLT", SDT_PPCqbflt, []>;
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerdef PPCqvlfsb    : SDNode<"PPCISD::QVLFSb", SDT_PPCqvlfsb,
168*9880d681SAndroid Build Coastguard Worker                          [SDNPHasChain, SDNPMayLoad]>;
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerdef PPCcmpb     : SDNode<"PPCISD::CMPB", SDTIntBinOp, []>;
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker// These nodes represent the 32-bit PPC shifts that operate on 6-bit shift
173*9880d681SAndroid Build Coastguard Worker// amounts.  These nodes are generated by the multi-precision shift code.
174*9880d681SAndroid Build Coastguard Workerdef PPCsrl        : SDNode<"PPCISD::SRL"       , SDTIntShiftOp>;
175*9880d681SAndroid Build Coastguard Workerdef PPCsra        : SDNode<"PPCISD::SRA"       , SDTIntShiftOp>;
176*9880d681SAndroid Build Coastguard Workerdef PPCshl        : SDNode<"PPCISD::SHL"       , SDTIntShiftOp>;
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Worker// These are target-independent nodes, but have target-specific formats.
179*9880d681SAndroid Build Coastguard Workerdef callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_PPCCallSeqStart,
180*9880d681SAndroid Build Coastguard Worker                           [SDNPHasChain, SDNPOutGlue]>;
181*9880d681SAndroid Build Coastguard Workerdef callseq_end   : SDNode<"ISD::CALLSEQ_END",   SDT_PPCCallSeqEnd,
182*9880d681SAndroid Build Coastguard Worker                           [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerdef SDT_PPCCall   : SDTypeProfile<0, -1, [SDTCisInt<0>]>;
185*9880d681SAndroid Build Coastguard Workerdef PPCcall  : SDNode<"PPCISD::CALL", SDT_PPCCall,
186*9880d681SAndroid Build Coastguard Worker                      [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
187*9880d681SAndroid Build Coastguard Worker                       SDNPVariadic]>;
188*9880d681SAndroid Build Coastguard Workerdef PPCcall_nop  : SDNode<"PPCISD::CALL_NOP", SDT_PPCCall,
189*9880d681SAndroid Build Coastguard Worker                          [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
190*9880d681SAndroid Build Coastguard Worker                           SDNPVariadic]>;
191*9880d681SAndroid Build Coastguard Workerdef PPCmtctr      : SDNode<"PPCISD::MTCTR", SDT_PPCCall,
192*9880d681SAndroid Build Coastguard Worker                           [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
193*9880d681SAndroid Build Coastguard Workerdef PPCbctrl : SDNode<"PPCISD::BCTRL", SDTNone,
194*9880d681SAndroid Build Coastguard Worker                      [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
195*9880d681SAndroid Build Coastguard Worker                       SDNPVariadic]>;
196*9880d681SAndroid Build Coastguard Workerdef PPCbctrl_load_toc : SDNode<"PPCISD::BCTRL_LOAD_TOC",
197*9880d681SAndroid Build Coastguard Worker                               SDTypeProfile<0, 1, []>,
198*9880d681SAndroid Build Coastguard Worker                               [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
199*9880d681SAndroid Build Coastguard Worker                                SDNPVariadic]>;
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Workerdef retflag       : SDNode<"PPCISD::RET_FLAG", SDTNone,
202*9880d681SAndroid Build Coastguard Worker                           [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Workerdef PPCtc_return : SDNode<"PPCISD::TC_RETURN", SDT_PPCTC_ret,
205*9880d681SAndroid Build Coastguard Worker                        [SDNPHasChain,  SDNPOptInGlue, SDNPVariadic]>;
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workerdef PPCeh_sjlj_setjmp  : SDNode<"PPCISD::EH_SJLJ_SETJMP",
208*9880d681SAndroid Build Coastguard Worker                                SDTypeProfile<1, 1, [SDTCisInt<0>,
209*9880d681SAndroid Build Coastguard Worker                                                     SDTCisPtrTy<1>]>,
210*9880d681SAndroid Build Coastguard Worker                                [SDNPHasChain, SDNPSideEffect]>;
211*9880d681SAndroid Build Coastguard Workerdef PPCeh_sjlj_longjmp : SDNode<"PPCISD::EH_SJLJ_LONGJMP",
212*9880d681SAndroid Build Coastguard Worker                                SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>,
213*9880d681SAndroid Build Coastguard Worker                                [SDNPHasChain, SDNPSideEffect]>;
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Workerdef SDT_PPCsc     : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
216*9880d681SAndroid Build Coastguard Workerdef PPCsc         : SDNode<"PPCISD::SC", SDT_PPCsc,
217*9880d681SAndroid Build Coastguard Worker                           [SDNPHasChain, SDNPSideEffect]>;
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Workerdef PPCclrbhrb    : SDNode<"PPCISD::CLRBHRB", SDTNone,
220*9880d681SAndroid Build Coastguard Worker                           [SDNPHasChain, SDNPSideEffect]>;
221*9880d681SAndroid Build Coastguard Workerdef PPCmfbhrbe    : SDNode<"PPCISD::MFBHRBE", SDTIntBinOp, [SDNPHasChain]>;
222*9880d681SAndroid Build Coastguard Workerdef PPCrfebb      : SDNode<"PPCISD::RFEBB", SDT_PPCsc,
223*9880d681SAndroid Build Coastguard Worker                           [SDNPHasChain, SDNPSideEffect]>;
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Workerdef PPCvcmp       : SDNode<"PPCISD::VCMP" , SDT_PPCvcmp, []>;
226*9880d681SAndroid Build Coastguard Workerdef PPCvcmp_o     : SDNode<"PPCISD::VCMPo", SDT_PPCvcmp, [SDNPOutGlue]>;
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Workerdef PPCcondbranch : SDNode<"PPCISD::COND_BRANCH", SDT_PPCcondbr,
229*9880d681SAndroid Build Coastguard Worker                           [SDNPHasChain, SDNPOptInGlue]>;
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Workerdef PPClbrx       : SDNode<"PPCISD::LBRX", SDT_PPClbrx,
232*9880d681SAndroid Build Coastguard Worker                           [SDNPHasChain, SDNPMayLoad]>;
233*9880d681SAndroid Build Coastguard Workerdef PPCstbrx      : SDNode<"PPCISD::STBRX", SDT_PPCstbrx,
234*9880d681SAndroid Build Coastguard Worker                           [SDNPHasChain, SDNPMayStore]>;
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Worker// Instructions to set/unset CR bit 6 for SVR4 vararg calls
237*9880d681SAndroid Build Coastguard Workerdef PPCcr6set   : SDNode<"PPCISD::CR6SET", SDTNone,
238*9880d681SAndroid Build Coastguard Worker                         [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
239*9880d681SAndroid Build Coastguard Workerdef PPCcr6unset : SDNode<"PPCISD::CR6UNSET", SDTNone,
240*9880d681SAndroid Build Coastguard Worker                         [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Worker// Instructions to support dynamic alloca.
243*9880d681SAndroid Build Coastguard Workerdef SDTDynOp  : SDTypeProfile<1, 2, []>;
244*9880d681SAndroid Build Coastguard Workerdef SDTDynAreaOp  : SDTypeProfile<1, 1, []>;
245*9880d681SAndroid Build Coastguard Workerdef PPCdynalloc   : SDNode<"PPCISD::DYNALLOC", SDTDynOp, [SDNPHasChain]>;
246*9880d681SAndroid Build Coastguard Workerdef PPCdynareaoffset   : SDNode<"PPCISD::DYNAREAOFFSET", SDTDynAreaOp, [SDNPHasChain]>;
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
249*9880d681SAndroid Build Coastguard Worker// PowerPC specific transformation functions and pattern fragments.
250*9880d681SAndroid Build Coastguard Worker//
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Workerdef SHL32 : SDNodeXForm<imm, [{
253*9880d681SAndroid Build Coastguard Worker  // Transformation function: 31 - imm
254*9880d681SAndroid Build Coastguard Worker  return getI32Imm(31 - N->getZExtValue(), SDLoc(N));
255*9880d681SAndroid Build Coastguard Worker}]>;
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Workerdef SRL32 : SDNodeXForm<imm, [{
258*9880d681SAndroid Build Coastguard Worker  // Transformation function: 32 - imm
259*9880d681SAndroid Build Coastguard Worker  return N->getZExtValue() ? getI32Imm(32 - N->getZExtValue(), SDLoc(N))
260*9880d681SAndroid Build Coastguard Worker                           : getI32Imm(0, SDLoc(N));
261*9880d681SAndroid Build Coastguard Worker}]>;
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Workerdef LO16 : SDNodeXForm<imm, [{
264*9880d681SAndroid Build Coastguard Worker  // Transformation function: get the low 16 bits.
265*9880d681SAndroid Build Coastguard Worker  return getI32Imm((unsigned short)N->getZExtValue(), SDLoc(N));
266*9880d681SAndroid Build Coastguard Worker}]>;
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Workerdef HI16 : SDNodeXForm<imm, [{
269*9880d681SAndroid Build Coastguard Worker  // Transformation function: shift the immediate value down into the low bits.
270*9880d681SAndroid Build Coastguard Worker  return getI32Imm((unsigned)N->getZExtValue() >> 16, SDLoc(N));
271*9880d681SAndroid Build Coastguard Worker}]>;
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Workerdef HA16 : SDNodeXForm<imm, [{
274*9880d681SAndroid Build Coastguard Worker  // Transformation function: shift the immediate value down into the low bits.
275*9880d681SAndroid Build Coastguard Worker  int Val = N->getZExtValue();
276*9880d681SAndroid Build Coastguard Worker  return getI32Imm((Val - (signed short)Val) >> 16, SDLoc(N));
277*9880d681SAndroid Build Coastguard Worker}]>;
278*9880d681SAndroid Build Coastguard Workerdef MB : SDNodeXForm<imm, [{
279*9880d681SAndroid Build Coastguard Worker  // Transformation function: get the start bit of a mask
280*9880d681SAndroid Build Coastguard Worker  unsigned mb = 0, me;
281*9880d681SAndroid Build Coastguard Worker  (void)isRunOfOnes((unsigned)N->getZExtValue(), mb, me);
282*9880d681SAndroid Build Coastguard Worker  return getI32Imm(mb, SDLoc(N));
283*9880d681SAndroid Build Coastguard Worker}]>;
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Workerdef ME : SDNodeXForm<imm, [{
286*9880d681SAndroid Build Coastguard Worker  // Transformation function: get the end bit of a mask
287*9880d681SAndroid Build Coastguard Worker  unsigned mb, me = 0;
288*9880d681SAndroid Build Coastguard Worker  (void)isRunOfOnes((unsigned)N->getZExtValue(), mb, me);
289*9880d681SAndroid Build Coastguard Worker  return getI32Imm(me, SDLoc(N));
290*9880d681SAndroid Build Coastguard Worker}]>;
291*9880d681SAndroid Build Coastguard Workerdef maskimm32 : PatLeaf<(imm), [{
292*9880d681SAndroid Build Coastguard Worker  // maskImm predicate - True if immediate is a run of ones.
293*9880d681SAndroid Build Coastguard Worker  unsigned mb, me;
294*9880d681SAndroid Build Coastguard Worker  if (N->getValueType(0) == MVT::i32)
295*9880d681SAndroid Build Coastguard Worker    return isRunOfOnes((unsigned)N->getZExtValue(), mb, me);
296*9880d681SAndroid Build Coastguard Worker  else
297*9880d681SAndroid Build Coastguard Worker    return false;
298*9880d681SAndroid Build Coastguard Worker}]>;
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerdef imm32SExt16  : Operand<i32>, ImmLeaf<i32, [{
301*9880d681SAndroid Build Coastguard Worker  // imm32SExt16 predicate - True if the i32 immediate fits in a 16-bit
302*9880d681SAndroid Build Coastguard Worker  // sign extended field.  Used by instructions like 'addi'.
303*9880d681SAndroid Build Coastguard Worker  return (int32_t)Imm == (short)Imm;
304*9880d681SAndroid Build Coastguard Worker}]>;
305*9880d681SAndroid Build Coastguard Workerdef imm64SExt16  : Operand<i64>, ImmLeaf<i64, [{
306*9880d681SAndroid Build Coastguard Worker  // imm64SExt16 predicate - True if the i64 immediate fits in a 16-bit
307*9880d681SAndroid Build Coastguard Worker  // sign extended field.  Used by instructions like 'addi'.
308*9880d681SAndroid Build Coastguard Worker  return (int64_t)Imm == (short)Imm;
309*9880d681SAndroid Build Coastguard Worker}]>;
310*9880d681SAndroid Build Coastguard Workerdef immZExt16  : PatLeaf<(imm), [{
311*9880d681SAndroid Build Coastguard Worker  // immZExt16 predicate - True if the immediate fits in a 16-bit zero extended
312*9880d681SAndroid Build Coastguard Worker  // field.  Used by instructions like 'ori'.
313*9880d681SAndroid Build Coastguard Worker  return (uint64_t)N->getZExtValue() == (unsigned short)N->getZExtValue();
314*9880d681SAndroid Build Coastguard Worker}], LO16>;
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Worker// imm16Shifted* - These match immediates where the low 16-bits are zero.  There
317*9880d681SAndroid Build Coastguard Worker// are two forms: imm16ShiftedSExt and imm16ShiftedZExt.  These two forms are
318*9880d681SAndroid Build Coastguard Worker// identical in 32-bit mode, but in 64-bit mode, they return true if the
319*9880d681SAndroid Build Coastguard Worker// immediate fits into a sign/zero extended 32-bit immediate (with the low bits
320*9880d681SAndroid Build Coastguard Worker// clear).
321*9880d681SAndroid Build Coastguard Workerdef imm16ShiftedZExt : PatLeaf<(imm), [{
322*9880d681SAndroid Build Coastguard Worker  // imm16ShiftedZExt predicate - True if only bits in the top 16-bits of the
323*9880d681SAndroid Build Coastguard Worker  // immediate are set.  Used by instructions like 'xoris'.
324*9880d681SAndroid Build Coastguard Worker  return (N->getZExtValue() & ~uint64_t(0xFFFF0000)) == 0;
325*9880d681SAndroid Build Coastguard Worker}], HI16>;
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Workerdef imm16ShiftedSExt : PatLeaf<(imm), [{
328*9880d681SAndroid Build Coastguard Worker  // imm16ShiftedSExt predicate - True if only bits in the top 16-bits of the
329*9880d681SAndroid Build Coastguard Worker  // immediate are set.  Used by instructions like 'addis'.  Identical to
330*9880d681SAndroid Build Coastguard Worker  // imm16ShiftedZExt in 32-bit mode.
331*9880d681SAndroid Build Coastguard Worker  if (N->getZExtValue() & 0xFFFF) return false;
332*9880d681SAndroid Build Coastguard Worker  if (N->getValueType(0) == MVT::i32)
333*9880d681SAndroid Build Coastguard Worker    return true;
334*9880d681SAndroid Build Coastguard Worker  // For 64-bit, make sure it is sext right.
335*9880d681SAndroid Build Coastguard Worker  return N->getZExtValue() == (uint64_t)(int)N->getZExtValue();
336*9880d681SAndroid Build Coastguard Worker}], HI16>;
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard Workerdef imm64ZExt32  : Operand<i64>, ImmLeaf<i64, [{
339*9880d681SAndroid Build Coastguard Worker  // imm64ZExt32 predicate - True if the i64 immediate fits in a 32-bit
340*9880d681SAndroid Build Coastguard Worker  // zero extended field.
341*9880d681SAndroid Build Coastguard Worker  return isUInt<32>(Imm);
342*9880d681SAndroid Build Coastguard Worker}]>;
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker// Some r+i load/store instructions (such as LD, STD, LDU, etc.) that require
345*9880d681SAndroid Build Coastguard Worker// restricted memrix (4-aligned) constants are alignment sensitive. If these
346*9880d681SAndroid Build Coastguard Worker// offsets are hidden behind TOC entries than the values of the lower-order
347*9880d681SAndroid Build Coastguard Worker// bits cannot be checked directly. As a result, we need to also incorporate
348*9880d681SAndroid Build Coastguard Worker// an alignment check into the relevant patterns.
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Workerdef aligned4load : PatFrag<(ops node:$ptr), (load node:$ptr), [{
351*9880d681SAndroid Build Coastguard Worker  return cast<LoadSDNode>(N)->getAlignment() >= 4;
352*9880d681SAndroid Build Coastguard Worker}]>;
353*9880d681SAndroid Build Coastguard Workerdef aligned4store : PatFrag<(ops node:$val, node:$ptr),
354*9880d681SAndroid Build Coastguard Worker                            (store node:$val, node:$ptr), [{
355*9880d681SAndroid Build Coastguard Worker  return cast<StoreSDNode>(N)->getAlignment() >= 4;
356*9880d681SAndroid Build Coastguard Worker}]>;
357*9880d681SAndroid Build Coastguard Workerdef aligned4sextloadi32 : PatFrag<(ops node:$ptr), (sextloadi32 node:$ptr), [{
358*9880d681SAndroid Build Coastguard Worker  return cast<LoadSDNode>(N)->getAlignment() >= 4;
359*9880d681SAndroid Build Coastguard Worker}]>;
360*9880d681SAndroid Build Coastguard Workerdef aligned4pre_store : PatFrag<
361*9880d681SAndroid Build Coastguard Worker                          (ops node:$val, node:$base, node:$offset),
362*9880d681SAndroid Build Coastguard Worker                          (pre_store node:$val, node:$base, node:$offset), [{
363*9880d681SAndroid Build Coastguard Worker  return cast<StoreSDNode>(N)->getAlignment() >= 4;
364*9880d681SAndroid Build Coastguard Worker}]>;
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Workerdef unaligned4load : PatFrag<(ops node:$ptr), (load node:$ptr), [{
367*9880d681SAndroid Build Coastguard Worker  return cast<LoadSDNode>(N)->getAlignment() < 4;
368*9880d681SAndroid Build Coastguard Worker}]>;
369*9880d681SAndroid Build Coastguard Workerdef unaligned4store : PatFrag<(ops node:$val, node:$ptr),
370*9880d681SAndroid Build Coastguard Worker                              (store node:$val, node:$ptr), [{
371*9880d681SAndroid Build Coastguard Worker  return cast<StoreSDNode>(N)->getAlignment() < 4;
372*9880d681SAndroid Build Coastguard Worker}]>;
373*9880d681SAndroid Build Coastguard Workerdef unaligned4sextloadi32 : PatFrag<(ops node:$ptr), (sextloadi32 node:$ptr), [{
374*9880d681SAndroid Build Coastguard Worker  return cast<LoadSDNode>(N)->getAlignment() < 4;
375*9880d681SAndroid Build Coastguard Worker}]>;
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
378*9880d681SAndroid Build Coastguard Worker// PowerPC Flag Definitions.
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Workerclass isPPC64 { bit PPC64 = 1; }
381*9880d681SAndroid Build Coastguard Workerclass isDOT   { bit RC = 1; }
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Workerclass RegConstraint<string C> {
384*9880d681SAndroid Build Coastguard Worker  string Constraints = C;
385*9880d681SAndroid Build Coastguard Worker}
386*9880d681SAndroid Build Coastguard Workerclass NoEncode<string E> {
387*9880d681SAndroid Build Coastguard Worker  string DisableEncoding = E;
388*9880d681SAndroid Build Coastguard Worker}
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
392*9880d681SAndroid Build Coastguard Worker// PowerPC Operand Definitions.
393*9880d681SAndroid Build Coastguard Worker
394*9880d681SAndroid Build Coastguard Worker// In the default PowerPC assembler syntax, registers are specified simply
395*9880d681SAndroid Build Coastguard Worker// by number, so they cannot be distinguished from immediate values (without
396*9880d681SAndroid Build Coastguard Worker// looking at the opcode).  This means that the default operand matching logic
397*9880d681SAndroid Build Coastguard Worker// for the asm parser does not work, and we need to specify custom matchers.
398*9880d681SAndroid Build Coastguard Worker// Since those can only be specified with RegisterOperand classes and not
399*9880d681SAndroid Build Coastguard Worker// directly on the RegisterClass, all instructions patterns used by the asm
400*9880d681SAndroid Build Coastguard Worker// parser need to use a RegisterOperand (instead of a RegisterClass) for
401*9880d681SAndroid Build Coastguard Worker// all their register operands.
402*9880d681SAndroid Build Coastguard Worker// For this purpose, we define one RegisterOperand for each RegisterClass,
403*9880d681SAndroid Build Coastguard Worker// using the same name as the class, just in lower case.
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Workerdef PPCRegGPRCAsmOperand : AsmOperandClass {
406*9880d681SAndroid Build Coastguard Worker  let Name = "RegGPRC"; let PredicateMethod = "isRegNumber";
407*9880d681SAndroid Build Coastguard Worker}
408*9880d681SAndroid Build Coastguard Workerdef gprc : RegisterOperand<GPRC> {
409*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegGPRCAsmOperand;
410*9880d681SAndroid Build Coastguard Worker}
411*9880d681SAndroid Build Coastguard Workerdef PPCRegG8RCAsmOperand : AsmOperandClass {
412*9880d681SAndroid Build Coastguard Worker  let Name = "RegG8RC"; let PredicateMethod = "isRegNumber";
413*9880d681SAndroid Build Coastguard Worker}
414*9880d681SAndroid Build Coastguard Workerdef g8rc : RegisterOperand<G8RC> {
415*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegG8RCAsmOperand;
416*9880d681SAndroid Build Coastguard Worker}
417*9880d681SAndroid Build Coastguard Workerdef PPCRegGPRCNoR0AsmOperand : AsmOperandClass {
418*9880d681SAndroid Build Coastguard Worker  let Name = "RegGPRCNoR0"; let PredicateMethod = "isRegNumber";
419*9880d681SAndroid Build Coastguard Worker}
420*9880d681SAndroid Build Coastguard Workerdef gprc_nor0 : RegisterOperand<GPRC_NOR0> {
421*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegGPRCNoR0AsmOperand;
422*9880d681SAndroid Build Coastguard Worker}
423*9880d681SAndroid Build Coastguard Workerdef PPCRegG8RCNoX0AsmOperand : AsmOperandClass {
424*9880d681SAndroid Build Coastguard Worker  let Name = "RegG8RCNoX0"; let PredicateMethod = "isRegNumber";
425*9880d681SAndroid Build Coastguard Worker}
426*9880d681SAndroid Build Coastguard Workerdef g8rc_nox0 : RegisterOperand<G8RC_NOX0> {
427*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegG8RCNoX0AsmOperand;
428*9880d681SAndroid Build Coastguard Worker}
429*9880d681SAndroid Build Coastguard Workerdef PPCRegF8RCAsmOperand : AsmOperandClass {
430*9880d681SAndroid Build Coastguard Worker  let Name = "RegF8RC"; let PredicateMethod = "isRegNumber";
431*9880d681SAndroid Build Coastguard Worker}
432*9880d681SAndroid Build Coastguard Workerdef f8rc : RegisterOperand<F8RC> {
433*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegF8RCAsmOperand;
434*9880d681SAndroid Build Coastguard Worker}
435*9880d681SAndroid Build Coastguard Workerdef PPCRegF4RCAsmOperand : AsmOperandClass {
436*9880d681SAndroid Build Coastguard Worker  let Name = "RegF4RC"; let PredicateMethod = "isRegNumber";
437*9880d681SAndroid Build Coastguard Worker}
438*9880d681SAndroid Build Coastguard Workerdef f4rc : RegisterOperand<F4RC> {
439*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegF4RCAsmOperand;
440*9880d681SAndroid Build Coastguard Worker}
441*9880d681SAndroid Build Coastguard Workerdef PPCRegVRRCAsmOperand : AsmOperandClass {
442*9880d681SAndroid Build Coastguard Worker  let Name = "RegVRRC"; let PredicateMethod = "isRegNumber";
443*9880d681SAndroid Build Coastguard Worker}
444*9880d681SAndroid Build Coastguard Workerdef vrrc : RegisterOperand<VRRC> {
445*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegVRRCAsmOperand;
446*9880d681SAndroid Build Coastguard Worker}
447*9880d681SAndroid Build Coastguard Workerdef PPCRegCRBITRCAsmOperand : AsmOperandClass {
448*9880d681SAndroid Build Coastguard Worker  let Name = "RegCRBITRC"; let PredicateMethod = "isCRBitNumber";
449*9880d681SAndroid Build Coastguard Worker}
450*9880d681SAndroid Build Coastguard Workerdef crbitrc : RegisterOperand<CRBITRC> {
451*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegCRBITRCAsmOperand;
452*9880d681SAndroid Build Coastguard Worker}
453*9880d681SAndroid Build Coastguard Workerdef PPCRegCRRCAsmOperand : AsmOperandClass {
454*9880d681SAndroid Build Coastguard Worker  let Name = "RegCRRC"; let PredicateMethod = "isCCRegNumber";
455*9880d681SAndroid Build Coastguard Worker}
456*9880d681SAndroid Build Coastguard Workerdef crrc : RegisterOperand<CRRC> {
457*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegCRRCAsmOperand;
458*9880d681SAndroid Build Coastguard Worker}
459*9880d681SAndroid Build Coastguard Workerdef crrc0 : RegisterOperand<CRRC0> {
460*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegCRRCAsmOperand;
461*9880d681SAndroid Build Coastguard Worker}
462*9880d681SAndroid Build Coastguard Worker
463*9880d681SAndroid Build Coastguard Workerdef PPCU1ImmAsmOperand : AsmOperandClass {
464*9880d681SAndroid Build Coastguard Worker  let Name = "U1Imm"; let PredicateMethod = "isU1Imm";
465*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addImmOperands";
466*9880d681SAndroid Build Coastguard Worker}
467*9880d681SAndroid Build Coastguard Workerdef u1imm   : Operand<i32> {
468*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printU1ImmOperand";
469*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCU1ImmAsmOperand;
470*9880d681SAndroid Build Coastguard Worker}
471*9880d681SAndroid Build Coastguard Worker
472*9880d681SAndroid Build Coastguard Workerdef PPCU2ImmAsmOperand : AsmOperandClass {
473*9880d681SAndroid Build Coastguard Worker  let Name = "U2Imm"; let PredicateMethod = "isU2Imm";
474*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addImmOperands";
475*9880d681SAndroid Build Coastguard Worker}
476*9880d681SAndroid Build Coastguard Workerdef u2imm   : Operand<i32> {
477*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printU2ImmOperand";
478*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCU2ImmAsmOperand;
479*9880d681SAndroid Build Coastguard Worker}
480*9880d681SAndroid Build Coastguard Worker
481*9880d681SAndroid Build Coastguard Workerdef PPCU3ImmAsmOperand : AsmOperandClass {
482*9880d681SAndroid Build Coastguard Worker  let Name = "U3Imm"; let PredicateMethod = "isU3Imm";
483*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addImmOperands";
484*9880d681SAndroid Build Coastguard Worker}
485*9880d681SAndroid Build Coastguard Workerdef u3imm   : Operand<i32> {
486*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printU3ImmOperand";
487*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCU3ImmAsmOperand;
488*9880d681SAndroid Build Coastguard Worker}
489*9880d681SAndroid Build Coastguard Worker
490*9880d681SAndroid Build Coastguard Workerdef PPCU4ImmAsmOperand : AsmOperandClass {
491*9880d681SAndroid Build Coastguard Worker  let Name = "U4Imm"; let PredicateMethod = "isU4Imm";
492*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addImmOperands";
493*9880d681SAndroid Build Coastguard Worker}
494*9880d681SAndroid Build Coastguard Workerdef u4imm   : Operand<i32> {
495*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printU4ImmOperand";
496*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCU4ImmAsmOperand;
497*9880d681SAndroid Build Coastguard Worker}
498*9880d681SAndroid Build Coastguard Workerdef PPCS5ImmAsmOperand : AsmOperandClass {
499*9880d681SAndroid Build Coastguard Worker  let Name = "S5Imm"; let PredicateMethod = "isS5Imm";
500*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addImmOperands";
501*9880d681SAndroid Build Coastguard Worker}
502*9880d681SAndroid Build Coastguard Workerdef s5imm   : Operand<i32> {
503*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printS5ImmOperand";
504*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCS5ImmAsmOperand;
505*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeSImmOperand<5>";
506*9880d681SAndroid Build Coastguard Worker}
507*9880d681SAndroid Build Coastguard Workerdef PPCU5ImmAsmOperand : AsmOperandClass {
508*9880d681SAndroid Build Coastguard Worker  let Name = "U5Imm"; let PredicateMethod = "isU5Imm";
509*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addImmOperands";
510*9880d681SAndroid Build Coastguard Worker}
511*9880d681SAndroid Build Coastguard Workerdef u5imm   : Operand<i32> {
512*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printU5ImmOperand";
513*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCU5ImmAsmOperand;
514*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeUImmOperand<5>";
515*9880d681SAndroid Build Coastguard Worker}
516*9880d681SAndroid Build Coastguard Workerdef PPCU6ImmAsmOperand : AsmOperandClass {
517*9880d681SAndroid Build Coastguard Worker  let Name = "U6Imm"; let PredicateMethod = "isU6Imm";
518*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addImmOperands";
519*9880d681SAndroid Build Coastguard Worker}
520*9880d681SAndroid Build Coastguard Workerdef u6imm   : Operand<i32> {
521*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printU6ImmOperand";
522*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCU6ImmAsmOperand;
523*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeUImmOperand<6>";
524*9880d681SAndroid Build Coastguard Worker}
525*9880d681SAndroid Build Coastguard Workerdef PPCU7ImmAsmOperand : AsmOperandClass {
526*9880d681SAndroid Build Coastguard Worker  let Name = "U7Imm"; let PredicateMethod = "isU7Imm";
527*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addImmOperands";
528*9880d681SAndroid Build Coastguard Worker}
529*9880d681SAndroid Build Coastguard Workerdef u7imm   : Operand<i32> {
530*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printU7ImmOperand";
531*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCU7ImmAsmOperand;
532*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeUImmOperand<7>";
533*9880d681SAndroid Build Coastguard Worker}
534*9880d681SAndroid Build Coastguard Workerdef PPCU8ImmAsmOperand : AsmOperandClass {
535*9880d681SAndroid Build Coastguard Worker  let Name = "U8Imm"; let PredicateMethod = "isU8Imm";
536*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addImmOperands";
537*9880d681SAndroid Build Coastguard Worker}
538*9880d681SAndroid Build Coastguard Workerdef u8imm   : Operand<i32> {
539*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printU8ImmOperand";
540*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCU8ImmAsmOperand;
541*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeUImmOperand<8>";
542*9880d681SAndroid Build Coastguard Worker}
543*9880d681SAndroid Build Coastguard Workerdef PPCU10ImmAsmOperand : AsmOperandClass {
544*9880d681SAndroid Build Coastguard Worker  let Name = "U10Imm"; let PredicateMethod = "isU10Imm";
545*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addImmOperands";
546*9880d681SAndroid Build Coastguard Worker}
547*9880d681SAndroid Build Coastguard Workerdef u10imm  : Operand<i32> {
548*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printU10ImmOperand";
549*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCU10ImmAsmOperand;
550*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeUImmOperand<10>";
551*9880d681SAndroid Build Coastguard Worker}
552*9880d681SAndroid Build Coastguard Workerdef PPCU12ImmAsmOperand : AsmOperandClass {
553*9880d681SAndroid Build Coastguard Worker  let Name = "U12Imm"; let PredicateMethod = "isU12Imm";
554*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addImmOperands";
555*9880d681SAndroid Build Coastguard Worker}
556*9880d681SAndroid Build Coastguard Workerdef u12imm  : Operand<i32> {
557*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printU12ImmOperand";
558*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCU12ImmAsmOperand;
559*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeUImmOperand<12>";
560*9880d681SAndroid Build Coastguard Worker}
561*9880d681SAndroid Build Coastguard Workerdef PPCS16ImmAsmOperand : AsmOperandClass {
562*9880d681SAndroid Build Coastguard Worker  let Name = "S16Imm"; let PredicateMethod = "isS16Imm";
563*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addS16ImmOperands";
564*9880d681SAndroid Build Coastguard Worker}
565*9880d681SAndroid Build Coastguard Workerdef s16imm  : Operand<i32> {
566*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printS16ImmOperand";
567*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getImm16Encoding";
568*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCS16ImmAsmOperand;
569*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeSImmOperand<16>";
570*9880d681SAndroid Build Coastguard Worker}
571*9880d681SAndroid Build Coastguard Workerdef PPCU16ImmAsmOperand : AsmOperandClass {
572*9880d681SAndroid Build Coastguard Worker  let Name = "U16Imm"; let PredicateMethod = "isU16Imm";
573*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addU16ImmOperands";
574*9880d681SAndroid Build Coastguard Worker}
575*9880d681SAndroid Build Coastguard Workerdef u16imm  : Operand<i32> {
576*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printU16ImmOperand";
577*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getImm16Encoding";
578*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCU16ImmAsmOperand;
579*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeUImmOperand<16>";
580*9880d681SAndroid Build Coastguard Worker}
581*9880d681SAndroid Build Coastguard Workerdef PPCS17ImmAsmOperand : AsmOperandClass {
582*9880d681SAndroid Build Coastguard Worker  let Name = "S17Imm"; let PredicateMethod = "isS17Imm";
583*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addS16ImmOperands";
584*9880d681SAndroid Build Coastguard Worker}
585*9880d681SAndroid Build Coastguard Workerdef s17imm  : Operand<i32> {
586*9880d681SAndroid Build Coastguard Worker  // This operand type is used for addis/lis to allow the assembler parser
587*9880d681SAndroid Build Coastguard Worker  // to accept immediates in the range -65536..65535 for compatibility with
588*9880d681SAndroid Build Coastguard Worker  // the GNU assembler.  The operand is treated as 16-bit otherwise.
589*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printS16ImmOperand";
590*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getImm16Encoding";
591*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCS17ImmAsmOperand;
592*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeSImmOperand<16>";
593*9880d681SAndroid Build Coastguard Worker}
594*9880d681SAndroid Build Coastguard Workerdef PPCDirectBrAsmOperand : AsmOperandClass {
595*9880d681SAndroid Build Coastguard Worker  let Name = "DirectBr"; let PredicateMethod = "isDirectBr";
596*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addBranchTargetOperands";
597*9880d681SAndroid Build Coastguard Worker}
598*9880d681SAndroid Build Coastguard Workerdef directbrtarget : Operand<OtherVT> {
599*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printBranchOperand";
600*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getDirectBrEncoding";
601*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCDirectBrAsmOperand;
602*9880d681SAndroid Build Coastguard Worker}
603*9880d681SAndroid Build Coastguard Workerdef absdirectbrtarget : Operand<OtherVT> {
604*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printAbsBranchOperand";
605*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getAbsDirectBrEncoding";
606*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCDirectBrAsmOperand;
607*9880d681SAndroid Build Coastguard Worker}
608*9880d681SAndroid Build Coastguard Workerdef PPCCondBrAsmOperand : AsmOperandClass {
609*9880d681SAndroid Build Coastguard Worker  let Name = "CondBr"; let PredicateMethod = "isCondBr";
610*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addBranchTargetOperands";
611*9880d681SAndroid Build Coastguard Worker}
612*9880d681SAndroid Build Coastguard Workerdef condbrtarget : Operand<OtherVT> {
613*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printBranchOperand";
614*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getCondBrEncoding";
615*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCCondBrAsmOperand;
616*9880d681SAndroid Build Coastguard Worker}
617*9880d681SAndroid Build Coastguard Workerdef abscondbrtarget : Operand<OtherVT> {
618*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printAbsBranchOperand";
619*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getAbsCondBrEncoding";
620*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCCondBrAsmOperand;
621*9880d681SAndroid Build Coastguard Worker}
622*9880d681SAndroid Build Coastguard Workerdef calltarget : Operand<iPTR> {
623*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printBranchOperand";
624*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getDirectBrEncoding";
625*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCDirectBrAsmOperand;
626*9880d681SAndroid Build Coastguard Worker}
627*9880d681SAndroid Build Coastguard Workerdef abscalltarget : Operand<iPTR> {
628*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printAbsBranchOperand";
629*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getAbsDirectBrEncoding";
630*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCDirectBrAsmOperand;
631*9880d681SAndroid Build Coastguard Worker}
632*9880d681SAndroid Build Coastguard Workerdef PPCCRBitMaskOperand : AsmOperandClass {
633*9880d681SAndroid Build Coastguard Worker let Name = "CRBitMask"; let PredicateMethod = "isCRBitMask";
634*9880d681SAndroid Build Coastguard Worker}
635*9880d681SAndroid Build Coastguard Workerdef crbitm: Operand<i8> {
636*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printcrbitm";
637*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "get_crbitm_encoding";
638*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeCRBitMOperand";
639*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCCRBitMaskOperand;
640*9880d681SAndroid Build Coastguard Worker}
641*9880d681SAndroid Build Coastguard Worker// Address operands
642*9880d681SAndroid Build Coastguard Worker// A version of ptr_rc which excludes R0 (or X0 in 64-bit mode).
643*9880d681SAndroid Build Coastguard Workerdef PPCRegGxRCNoR0Operand : AsmOperandClass {
644*9880d681SAndroid Build Coastguard Worker  let Name = "RegGxRCNoR0"; let PredicateMethod = "isRegNumber";
645*9880d681SAndroid Build Coastguard Worker}
646*9880d681SAndroid Build Coastguard Workerdef ptr_rc_nor0 : Operand<iPTR>, PointerLikeRegClass<1> {
647*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegGxRCNoR0Operand;
648*9880d681SAndroid Build Coastguard Worker}
649*9880d681SAndroid Build Coastguard Worker// A version of ptr_rc usable with the asm parser.
650*9880d681SAndroid Build Coastguard Workerdef PPCRegGxRCOperand : AsmOperandClass {
651*9880d681SAndroid Build Coastguard Worker  let Name = "RegGxRC"; let PredicateMethod = "isRegNumber";
652*9880d681SAndroid Build Coastguard Worker}
653*9880d681SAndroid Build Coastguard Workerdef ptr_rc_idx : Operand<iPTR>, PointerLikeRegClass<0> {
654*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCRegGxRCOperand;
655*9880d681SAndroid Build Coastguard Worker}
656*9880d681SAndroid Build Coastguard Worker
657*9880d681SAndroid Build Coastguard Workerdef PPCDispRIOperand : AsmOperandClass {
658*9880d681SAndroid Build Coastguard Worker let Name = "DispRI"; let PredicateMethod = "isS16Imm";
659*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addS16ImmOperands";
660*9880d681SAndroid Build Coastguard Worker}
661*9880d681SAndroid Build Coastguard Workerdef dispRI : Operand<iPTR> {
662*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCDispRIOperand;
663*9880d681SAndroid Build Coastguard Worker}
664*9880d681SAndroid Build Coastguard Workerdef PPCDispRIXOperand : AsmOperandClass {
665*9880d681SAndroid Build Coastguard Worker let Name = "DispRIX"; let PredicateMethod = "isS16ImmX4";
666*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands";
667*9880d681SAndroid Build Coastguard Worker}
668*9880d681SAndroid Build Coastguard Workerdef dispRIX : Operand<iPTR> {
669*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCDispRIXOperand;
670*9880d681SAndroid Build Coastguard Worker}
671*9880d681SAndroid Build Coastguard Workerdef PPCDispRIX16Operand : AsmOperandClass {
672*9880d681SAndroid Build Coastguard Worker let Name = "DispRIX16"; let PredicateMethod = "isS16ImmX16";
673*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands";
674*9880d681SAndroid Build Coastguard Worker}
675*9880d681SAndroid Build Coastguard Workerdef dispRIX16 : Operand<iPTR> {
676*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCDispRIX16Operand;
677*9880d681SAndroid Build Coastguard Worker}
678*9880d681SAndroid Build Coastguard Workerdef PPCDispSPE8Operand : AsmOperandClass {
679*9880d681SAndroid Build Coastguard Worker let Name = "DispSPE8"; let PredicateMethod = "isU8ImmX8";
680*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands";
681*9880d681SAndroid Build Coastguard Worker}
682*9880d681SAndroid Build Coastguard Workerdef dispSPE8 : Operand<iPTR> {
683*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCDispSPE8Operand;
684*9880d681SAndroid Build Coastguard Worker}
685*9880d681SAndroid Build Coastguard Workerdef PPCDispSPE4Operand : AsmOperandClass {
686*9880d681SAndroid Build Coastguard Worker let Name = "DispSPE4"; let PredicateMethod = "isU7ImmX4";
687*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands";
688*9880d681SAndroid Build Coastguard Worker}
689*9880d681SAndroid Build Coastguard Workerdef dispSPE4 : Operand<iPTR> {
690*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCDispSPE4Operand;
691*9880d681SAndroid Build Coastguard Worker}
692*9880d681SAndroid Build Coastguard Workerdef PPCDispSPE2Operand : AsmOperandClass {
693*9880d681SAndroid Build Coastguard Worker let Name = "DispSPE2"; let PredicateMethod = "isU6ImmX2";
694*9880d681SAndroid Build Coastguard Worker let RenderMethod = "addImmOperands";
695*9880d681SAndroid Build Coastguard Worker}
696*9880d681SAndroid Build Coastguard Workerdef dispSPE2 : Operand<iPTR> {
697*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCDispSPE2Operand;
698*9880d681SAndroid Build Coastguard Worker}
699*9880d681SAndroid Build Coastguard Worker
700*9880d681SAndroid Build Coastguard Workerdef memri : Operand<iPTR> {
701*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printMemRegImm";
702*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops dispRI:$imm, ptr_rc_nor0:$reg);
703*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getMemRIEncoding";
704*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeMemRIOperands";
705*9880d681SAndroid Build Coastguard Worker}
706*9880d681SAndroid Build Coastguard Workerdef memrr : Operand<iPTR> {
707*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printMemRegReg";
708*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops ptr_rc_nor0:$ptrreg, ptr_rc_idx:$offreg);
709*9880d681SAndroid Build Coastguard Worker}
710*9880d681SAndroid Build Coastguard Workerdef memrix : Operand<iPTR> {   // memri where the imm is 4-aligned.
711*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printMemRegImm";
712*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops dispRIX:$imm, ptr_rc_nor0:$reg);
713*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getMemRIXEncoding";
714*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeMemRIXOperands";
715*9880d681SAndroid Build Coastguard Worker}
716*9880d681SAndroid Build Coastguard Workerdef memrix16 : Operand<iPTR> { // memri, imm is 16-aligned, 12-bit, Inst{16:27}
717*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printMemRegImm";
718*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops dispRIX16:$imm, ptr_rc_nor0:$reg);
719*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getMemRIX16Encoding";
720*9880d681SAndroid Build Coastguard Worker  let DecoderMethod = "decodeMemRIX16Operands";
721*9880d681SAndroid Build Coastguard Worker}
722*9880d681SAndroid Build Coastguard Workerdef spe8dis : Operand<iPTR> {   // SPE displacement where the imm is 8-aligned.
723*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printMemRegImm";
724*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops dispSPE8:$imm, ptr_rc_nor0:$reg);
725*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getSPE8DisEncoding";
726*9880d681SAndroid Build Coastguard Worker}
727*9880d681SAndroid Build Coastguard Workerdef spe4dis : Operand<iPTR> {   // SPE displacement where the imm is 4-aligned.
728*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printMemRegImm";
729*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops dispSPE4:$imm, ptr_rc_nor0:$reg);
730*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getSPE4DisEncoding";
731*9880d681SAndroid Build Coastguard Worker}
732*9880d681SAndroid Build Coastguard Workerdef spe2dis : Operand<iPTR> {   // SPE displacement where the imm is 2-aligned.
733*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printMemRegImm";
734*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops dispSPE2:$imm, ptr_rc_nor0:$reg);
735*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getSPE2DisEncoding";
736*9880d681SAndroid Build Coastguard Worker}
737*9880d681SAndroid Build Coastguard Worker
738*9880d681SAndroid Build Coastguard Worker// A single-register address. This is used with the SjLj
739*9880d681SAndroid Build Coastguard Worker// pseudo-instructions.
740*9880d681SAndroid Build Coastguard Workerdef memr : Operand<iPTR> {
741*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops ptr_rc:$ptrreg);
742*9880d681SAndroid Build Coastguard Worker}
743*9880d681SAndroid Build Coastguard Workerdef PPCTLSRegOperand : AsmOperandClass {
744*9880d681SAndroid Build Coastguard Worker  let Name = "TLSReg"; let PredicateMethod = "isTLSReg";
745*9880d681SAndroid Build Coastguard Worker  let RenderMethod = "addTLSRegOperands";
746*9880d681SAndroid Build Coastguard Worker}
747*9880d681SAndroid Build Coastguard Workerdef tlsreg32 : Operand<i32> {
748*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getTLSRegEncoding";
749*9880d681SAndroid Build Coastguard Worker  let ParserMatchClass = PPCTLSRegOperand;
750*9880d681SAndroid Build Coastguard Worker}
751*9880d681SAndroid Build Coastguard Workerdef tlsgd32 : Operand<i32> {}
752*9880d681SAndroid Build Coastguard Workerdef tlscall32 : Operand<i32> {
753*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printTLSCall";
754*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops calltarget:$func, tlsgd32:$sym);
755*9880d681SAndroid Build Coastguard Worker  let EncoderMethod = "getTLSCallEncoding";
756*9880d681SAndroid Build Coastguard Worker}
757*9880d681SAndroid Build Coastguard Worker
758*9880d681SAndroid Build Coastguard Worker// PowerPC Predicate operand.
759*9880d681SAndroid Build Coastguard Workerdef pred : Operand<OtherVT> {
760*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printPredicateOperand";
761*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops i32imm:$bibo, crrc:$reg);
762*9880d681SAndroid Build Coastguard Worker}
763*9880d681SAndroid Build Coastguard Worker
764*9880d681SAndroid Build Coastguard Worker// Define PowerPC specific addressing mode.
765*9880d681SAndroid Build Coastguard Workerdef iaddr  : ComplexPattern<iPTR, 2, "SelectAddrImm",    [], []>;
766*9880d681SAndroid Build Coastguard Workerdef xaddr  : ComplexPattern<iPTR, 2, "SelectAddrIdx",    [], []>;
767*9880d681SAndroid Build Coastguard Workerdef xoaddr : ComplexPattern<iPTR, 2, "SelectAddrIdxOnly",[], []>;
768*9880d681SAndroid Build Coastguard Workerdef ixaddr : ComplexPattern<iPTR, 2, "SelectAddrImmX4",  [], []>; // "std"
769*9880d681SAndroid Build Coastguard Worker
770*9880d681SAndroid Build Coastguard Worker// The address in a single register. This is used with the SjLj
771*9880d681SAndroid Build Coastguard Worker// pseudo-instructions.
772*9880d681SAndroid Build Coastguard Workerdef addr   : ComplexPattern<iPTR, 1, "SelectAddr",[], []>;
773*9880d681SAndroid Build Coastguard Worker
774*9880d681SAndroid Build Coastguard Worker/// This is just the offset part of iaddr, used for preinc.
775*9880d681SAndroid Build Coastguard Workerdef iaddroff : ComplexPattern<iPTR, 1, "SelectAddrImmOffs", [], []>;
776*9880d681SAndroid Build Coastguard Worker
777*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
778*9880d681SAndroid Build Coastguard Worker// PowerPC Instruction Predicate Definitions.
779*9880d681SAndroid Build Coastguard Workerdef In32BitMode  : Predicate<"!PPCSubTarget->isPPC64()">;
780*9880d681SAndroid Build Coastguard Workerdef In64BitMode  : Predicate<"PPCSubTarget->isPPC64()">;
781*9880d681SAndroid Build Coastguard Workerdef IsBookE  : Predicate<"PPCSubTarget->isBookE()">;
782*9880d681SAndroid Build Coastguard Workerdef IsNotBookE  : Predicate<"!PPCSubTarget->isBookE()">;
783*9880d681SAndroid Build Coastguard Workerdef HasOnlyMSYNC : Predicate<"PPCSubTarget->hasOnlyMSYNC()">;
784*9880d681SAndroid Build Coastguard Workerdef HasSYNC   : Predicate<"!PPCSubTarget->hasOnlyMSYNC()">;
785*9880d681SAndroid Build Coastguard Workerdef IsPPC4xx  : Predicate<"PPCSubTarget->isPPC4xx()">;
786*9880d681SAndroid Build Coastguard Workerdef IsPPC6xx  : Predicate<"PPCSubTarget->isPPC6xx()">;
787*9880d681SAndroid Build Coastguard Workerdef IsE500  : Predicate<"PPCSubTarget->isE500()">;
788*9880d681SAndroid Build Coastguard Workerdef HasSPE  : Predicate<"PPCSubTarget->HasSPE()">;
789*9880d681SAndroid Build Coastguard Workerdef HasICBT : Predicate<"PPCSubTarget->hasICBT()">;
790*9880d681SAndroid Build Coastguard Workerdef HasPartwordAtomics : Predicate<"PPCSubTarget->hasPartwordAtomics()">;
791*9880d681SAndroid Build Coastguard Workerdef NoNaNsFPMath : Predicate<"TM.Options.NoNaNsFPMath">;
792*9880d681SAndroid Build Coastguard Workerdef NaNsFPMath   : Predicate<"!TM.Options.NoNaNsFPMath">;
793*9880d681SAndroid Build Coastguard Workerdef HasBPERMD : Predicate<"PPCSubTarget->hasBPERMD()">;
794*9880d681SAndroid Build Coastguard Workerdef HasExtDiv : Predicate<"PPCSubTarget->hasExtDiv()">;
795*9880d681SAndroid Build Coastguard Workerdef IsISA3_0 : Predicate<"PPCSubTarget->isISA3_0()">;
796*9880d681SAndroid Build Coastguard Worker
797*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
798*9880d681SAndroid Build Coastguard Worker// PowerPC Multiclass Definitions.
799*9880d681SAndroid Build Coastguard Worker
800*9880d681SAndroid Build Coastguard Workermulticlass XForm_6r<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
801*9880d681SAndroid Build Coastguard Worker                    string asmbase, string asmstr, InstrItinClass itin,
802*9880d681SAndroid Build Coastguard Worker                    list<dag> pattern> {
803*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
804*9880d681SAndroid Build Coastguard Worker    def NAME : XForm_6<opcode, xo, OOL, IOL,
805*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
806*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
807*9880d681SAndroid Build Coastguard Worker    let Defs = [CR0] in
808*9880d681SAndroid Build Coastguard Worker    def o    : XForm_6<opcode, xo, OOL, IOL,
809*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
810*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
811*9880d681SAndroid Build Coastguard Worker  }
812*9880d681SAndroid Build Coastguard Worker}
813*9880d681SAndroid Build Coastguard Worker
814*9880d681SAndroid Build Coastguard Workermulticlass XForm_6rc<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
815*9880d681SAndroid Build Coastguard Worker                     string asmbase, string asmstr, InstrItinClass itin,
816*9880d681SAndroid Build Coastguard Worker                     list<dag> pattern> {
817*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
818*9880d681SAndroid Build Coastguard Worker    let Defs = [CARRY] in
819*9880d681SAndroid Build Coastguard Worker    def NAME : XForm_6<opcode, xo, OOL, IOL,
820*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
821*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
822*9880d681SAndroid Build Coastguard Worker    let Defs = [CARRY, CR0] in
823*9880d681SAndroid Build Coastguard Worker    def o    : XForm_6<opcode, xo, OOL, IOL,
824*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
825*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
826*9880d681SAndroid Build Coastguard Worker  }
827*9880d681SAndroid Build Coastguard Worker}
828*9880d681SAndroid Build Coastguard Worker
829*9880d681SAndroid Build Coastguard Workermulticlass XForm_10rc<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
830*9880d681SAndroid Build Coastguard Worker                      string asmbase, string asmstr, InstrItinClass itin,
831*9880d681SAndroid Build Coastguard Worker                      list<dag> pattern> {
832*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
833*9880d681SAndroid Build Coastguard Worker    let Defs = [CARRY] in
834*9880d681SAndroid Build Coastguard Worker    def NAME : XForm_10<opcode, xo, OOL, IOL,
835*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
836*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
837*9880d681SAndroid Build Coastguard Worker    let Defs = [CARRY, CR0] in
838*9880d681SAndroid Build Coastguard Worker    def o    : XForm_10<opcode, xo, OOL, IOL,
839*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
840*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
841*9880d681SAndroid Build Coastguard Worker  }
842*9880d681SAndroid Build Coastguard Worker}
843*9880d681SAndroid Build Coastguard Worker
844*9880d681SAndroid Build Coastguard Workermulticlass XForm_11r<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
845*9880d681SAndroid Build Coastguard Worker                    string asmbase, string asmstr, InstrItinClass itin,
846*9880d681SAndroid Build Coastguard Worker                    list<dag> pattern> {
847*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
848*9880d681SAndroid Build Coastguard Worker    def NAME : XForm_11<opcode, xo, OOL, IOL,
849*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
850*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
851*9880d681SAndroid Build Coastguard Worker    let Defs = [CR0] in
852*9880d681SAndroid Build Coastguard Worker    def o    : XForm_11<opcode, xo, OOL, IOL,
853*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
854*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
855*9880d681SAndroid Build Coastguard Worker  }
856*9880d681SAndroid Build Coastguard Worker}
857*9880d681SAndroid Build Coastguard Worker
858*9880d681SAndroid Build Coastguard Workermulticlass XOForm_1r<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
859*9880d681SAndroid Build Coastguard Worker                    string asmbase, string asmstr, InstrItinClass itin,
860*9880d681SAndroid Build Coastguard Worker                    list<dag> pattern> {
861*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
862*9880d681SAndroid Build Coastguard Worker    def NAME : XOForm_1<opcode, xo, oe, OOL, IOL,
863*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
864*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
865*9880d681SAndroid Build Coastguard Worker    let Defs = [CR0] in
866*9880d681SAndroid Build Coastguard Worker    def o    : XOForm_1<opcode, xo, oe, OOL, IOL,
867*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
868*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
869*9880d681SAndroid Build Coastguard Worker  }
870*9880d681SAndroid Build Coastguard Worker}
871*9880d681SAndroid Build Coastguard Worker
872*9880d681SAndroid Build Coastguard Worker// Multiclass for instructions for which the non record form is not cracked
873*9880d681SAndroid Build Coastguard Worker// and the record form is cracked (i.e. divw, mullw, etc.)
874*9880d681SAndroid Build Coastguard Workermulticlass XOForm_1rcr<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
875*9880d681SAndroid Build Coastguard Worker                      string asmbase, string asmstr, InstrItinClass itin,
876*9880d681SAndroid Build Coastguard Worker                      list<dag> pattern> {
877*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
878*9880d681SAndroid Build Coastguard Worker    def NAME : XOForm_1<opcode, xo, oe, OOL, IOL,
879*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
880*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
881*9880d681SAndroid Build Coastguard Worker    let Defs = [CR0] in
882*9880d681SAndroid Build Coastguard Worker    def o    : XOForm_1<opcode, xo, oe, OOL, IOL,
883*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
884*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel, PPC970_DGroup_First,
885*9880d681SAndroid Build Coastguard Worker                       PPC970_DGroup_Cracked;
886*9880d681SAndroid Build Coastguard Worker  }
887*9880d681SAndroid Build Coastguard Worker}
888*9880d681SAndroid Build Coastguard Worker
889*9880d681SAndroid Build Coastguard Workermulticlass XOForm_1rc<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
890*9880d681SAndroid Build Coastguard Worker                      string asmbase, string asmstr, InstrItinClass itin,
891*9880d681SAndroid Build Coastguard Worker                      list<dag> pattern> {
892*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
893*9880d681SAndroid Build Coastguard Worker    let Defs = [CARRY] in
894*9880d681SAndroid Build Coastguard Worker    def NAME : XOForm_1<opcode, xo, oe, OOL, IOL,
895*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
896*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
897*9880d681SAndroid Build Coastguard Worker    let Defs = [CARRY, CR0] in
898*9880d681SAndroid Build Coastguard Worker    def o    : XOForm_1<opcode, xo, oe, OOL, IOL,
899*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
900*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
901*9880d681SAndroid Build Coastguard Worker  }
902*9880d681SAndroid Build Coastguard Worker}
903*9880d681SAndroid Build Coastguard Worker
904*9880d681SAndroid Build Coastguard Workermulticlass XOForm_3r<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
905*9880d681SAndroid Build Coastguard Worker                    string asmbase, string asmstr, InstrItinClass itin,
906*9880d681SAndroid Build Coastguard Worker                    list<dag> pattern> {
907*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
908*9880d681SAndroid Build Coastguard Worker    def NAME : XOForm_3<opcode, xo, oe, OOL, IOL,
909*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
910*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
911*9880d681SAndroid Build Coastguard Worker    let Defs = [CR0] in
912*9880d681SAndroid Build Coastguard Worker    def o    : XOForm_3<opcode, xo, oe, OOL, IOL,
913*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
914*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
915*9880d681SAndroid Build Coastguard Worker  }
916*9880d681SAndroid Build Coastguard Worker}
917*9880d681SAndroid Build Coastguard Worker
918*9880d681SAndroid Build Coastguard Workermulticlass XOForm_3rc<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
919*9880d681SAndroid Build Coastguard Worker                      string asmbase, string asmstr, InstrItinClass itin,
920*9880d681SAndroid Build Coastguard Worker                      list<dag> pattern> {
921*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
922*9880d681SAndroid Build Coastguard Worker    let Defs = [CARRY] in
923*9880d681SAndroid Build Coastguard Worker    def NAME : XOForm_3<opcode, xo, oe, OOL, IOL,
924*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
925*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
926*9880d681SAndroid Build Coastguard Worker    let Defs = [CARRY, CR0] in
927*9880d681SAndroid Build Coastguard Worker    def o    : XOForm_3<opcode, xo, oe, OOL, IOL,
928*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
929*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
930*9880d681SAndroid Build Coastguard Worker  }
931*9880d681SAndroid Build Coastguard Worker}
932*9880d681SAndroid Build Coastguard Worker
933*9880d681SAndroid Build Coastguard Workermulticlass MForm_2r<bits<6> opcode, dag OOL, dag IOL,
934*9880d681SAndroid Build Coastguard Worker                    string asmbase, string asmstr, InstrItinClass itin,
935*9880d681SAndroid Build Coastguard Worker                    list<dag> pattern> {
936*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
937*9880d681SAndroid Build Coastguard Worker    def NAME : MForm_2<opcode, OOL, IOL,
938*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
939*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
940*9880d681SAndroid Build Coastguard Worker    let Defs = [CR0] in
941*9880d681SAndroid Build Coastguard Worker    def o    : MForm_2<opcode, OOL, IOL,
942*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
943*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
944*9880d681SAndroid Build Coastguard Worker  }
945*9880d681SAndroid Build Coastguard Worker}
946*9880d681SAndroid Build Coastguard Worker
947*9880d681SAndroid Build Coastguard Workermulticlass MDForm_1r<bits<6> opcode, bits<3> xo, dag OOL, dag IOL,
948*9880d681SAndroid Build Coastguard Worker                    string asmbase, string asmstr, InstrItinClass itin,
949*9880d681SAndroid Build Coastguard Worker                    list<dag> pattern> {
950*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
951*9880d681SAndroid Build Coastguard Worker    def NAME : MDForm_1<opcode, xo, OOL, IOL,
952*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
953*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
954*9880d681SAndroid Build Coastguard Worker    let Defs = [CR0] in
955*9880d681SAndroid Build Coastguard Worker    def o    : MDForm_1<opcode, xo, OOL, IOL,
956*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
957*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
958*9880d681SAndroid Build Coastguard Worker  }
959*9880d681SAndroid Build Coastguard Worker}
960*9880d681SAndroid Build Coastguard Worker
961*9880d681SAndroid Build Coastguard Workermulticlass MDSForm_1r<bits<6> opcode, bits<4> xo, dag OOL, dag IOL,
962*9880d681SAndroid Build Coastguard Worker                     string asmbase, string asmstr, InstrItinClass itin,
963*9880d681SAndroid Build Coastguard Worker                     list<dag> pattern> {
964*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
965*9880d681SAndroid Build Coastguard Worker    def NAME : MDSForm_1<opcode, xo, OOL, IOL,
966*9880d681SAndroid Build Coastguard Worker                        !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
967*9880d681SAndroid Build Coastguard Worker                        pattern>, RecFormRel;
968*9880d681SAndroid Build Coastguard Worker    let Defs = [CR0] in
969*9880d681SAndroid Build Coastguard Worker    def o    : MDSForm_1<opcode, xo, OOL, IOL,
970*9880d681SAndroid Build Coastguard Worker                        !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
971*9880d681SAndroid Build Coastguard Worker                        []>, isDOT, RecFormRel;
972*9880d681SAndroid Build Coastguard Worker  }
973*9880d681SAndroid Build Coastguard Worker}
974*9880d681SAndroid Build Coastguard Worker
975*9880d681SAndroid Build Coastguard Workermulticlass XSForm_1rc<bits<6> opcode, bits<9> xo, dag OOL, dag IOL,
976*9880d681SAndroid Build Coastguard Worker                      string asmbase, string asmstr, InstrItinClass itin,
977*9880d681SAndroid Build Coastguard Worker                      list<dag> pattern> {
978*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
979*9880d681SAndroid Build Coastguard Worker    let Defs = [CARRY] in
980*9880d681SAndroid Build Coastguard Worker    def NAME : XSForm_1<opcode, xo, OOL, IOL,
981*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
982*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
983*9880d681SAndroid Build Coastguard Worker    let Defs = [CARRY, CR0] in
984*9880d681SAndroid Build Coastguard Worker    def o    : XSForm_1<opcode, xo, OOL, IOL,
985*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
986*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
987*9880d681SAndroid Build Coastguard Worker  }
988*9880d681SAndroid Build Coastguard Worker}
989*9880d681SAndroid Build Coastguard Worker
990*9880d681SAndroid Build Coastguard Workermulticlass XForm_26r<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
991*9880d681SAndroid Build Coastguard Worker                    string asmbase, string asmstr, InstrItinClass itin,
992*9880d681SAndroid Build Coastguard Worker                    list<dag> pattern> {
993*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
994*9880d681SAndroid Build Coastguard Worker    def NAME : XForm_26<opcode, xo, OOL, IOL,
995*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
996*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
997*9880d681SAndroid Build Coastguard Worker    let Defs = [CR1] in
998*9880d681SAndroid Build Coastguard Worker    def o    : XForm_26<opcode, xo, OOL, IOL,
999*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
1000*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
1001*9880d681SAndroid Build Coastguard Worker  }
1002*9880d681SAndroid Build Coastguard Worker}
1003*9880d681SAndroid Build Coastguard Worker
1004*9880d681SAndroid Build Coastguard Workermulticlass XForm_28r<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
1005*9880d681SAndroid Build Coastguard Worker                    string asmbase, string asmstr, InstrItinClass itin,
1006*9880d681SAndroid Build Coastguard Worker                    list<dag> pattern> {
1007*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
1008*9880d681SAndroid Build Coastguard Worker    def NAME : XForm_28<opcode, xo, OOL, IOL,
1009*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
1010*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
1011*9880d681SAndroid Build Coastguard Worker    let Defs = [CR1] in
1012*9880d681SAndroid Build Coastguard Worker    def o    : XForm_28<opcode, xo, OOL, IOL,
1013*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
1014*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
1015*9880d681SAndroid Build Coastguard Worker  }
1016*9880d681SAndroid Build Coastguard Worker}
1017*9880d681SAndroid Build Coastguard Worker
1018*9880d681SAndroid Build Coastguard Workermulticlass AForm_1r<bits<6> opcode, bits<5> xo, dag OOL, dag IOL,
1019*9880d681SAndroid Build Coastguard Worker                    string asmbase, string asmstr, InstrItinClass itin,
1020*9880d681SAndroid Build Coastguard Worker                    list<dag> pattern> {
1021*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
1022*9880d681SAndroid Build Coastguard Worker    def NAME : AForm_1<opcode, xo, OOL, IOL,
1023*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
1024*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
1025*9880d681SAndroid Build Coastguard Worker    let Defs = [CR1] in
1026*9880d681SAndroid Build Coastguard Worker    def o    : AForm_1<opcode, xo, OOL, IOL,
1027*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
1028*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
1029*9880d681SAndroid Build Coastguard Worker  }
1030*9880d681SAndroid Build Coastguard Worker}
1031*9880d681SAndroid Build Coastguard Worker
1032*9880d681SAndroid Build Coastguard Workermulticlass AForm_2r<bits<6> opcode, bits<5> xo, dag OOL, dag IOL,
1033*9880d681SAndroid Build Coastguard Worker                    string asmbase, string asmstr, InstrItinClass itin,
1034*9880d681SAndroid Build Coastguard Worker                    list<dag> pattern> {
1035*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
1036*9880d681SAndroid Build Coastguard Worker    def NAME : AForm_2<opcode, xo, OOL, IOL,
1037*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
1038*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
1039*9880d681SAndroid Build Coastguard Worker    let Defs = [CR1] in
1040*9880d681SAndroid Build Coastguard Worker    def o    : AForm_2<opcode, xo, OOL, IOL,
1041*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
1042*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
1043*9880d681SAndroid Build Coastguard Worker  }
1044*9880d681SAndroid Build Coastguard Worker}
1045*9880d681SAndroid Build Coastguard Worker
1046*9880d681SAndroid Build Coastguard Workermulticlass AForm_3r<bits<6> opcode, bits<5> xo, dag OOL, dag IOL,
1047*9880d681SAndroid Build Coastguard Worker                    string asmbase, string asmstr, InstrItinClass itin,
1048*9880d681SAndroid Build Coastguard Worker                    list<dag> pattern> {
1049*9880d681SAndroid Build Coastguard Worker  let BaseName = asmbase in {
1050*9880d681SAndroid Build Coastguard Worker    def NAME : AForm_3<opcode, xo, OOL, IOL,
1051*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
1052*9880d681SAndroid Build Coastguard Worker                       pattern>, RecFormRel;
1053*9880d681SAndroid Build Coastguard Worker    let Defs = [CR1] in
1054*9880d681SAndroid Build Coastguard Worker    def o    : AForm_3<opcode, xo, OOL, IOL,
1055*9880d681SAndroid Build Coastguard Worker                       !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
1056*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, RecFormRel;
1057*9880d681SAndroid Build Coastguard Worker  }
1058*9880d681SAndroid Build Coastguard Worker}
1059*9880d681SAndroid Build Coastguard Worker
1060*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1061*9880d681SAndroid Build Coastguard Worker// PowerPC Instruction Definitions.
1062*9880d681SAndroid Build Coastguard Worker
1063*9880d681SAndroid Build Coastguard Worker// Pseudo-instructions:
1064*9880d681SAndroid Build Coastguard Worker
1065*9880d681SAndroid Build Coastguard Workerlet hasCtrlDep = 1 in {
1066*9880d681SAndroid Build Coastguard Workerlet Defs = [R1], Uses = [R1] in {
1067*9880d681SAndroid Build Coastguard Workerdef ADJCALLSTACKDOWN : Pseudo<(outs), (ins u16imm:$amt), "#ADJCALLSTACKDOWN $amt",
1068*9880d681SAndroid Build Coastguard Worker                              [(callseq_start timm:$amt)]>;
1069*9880d681SAndroid Build Coastguard Workerdef ADJCALLSTACKUP   : Pseudo<(outs), (ins u16imm:$amt1, u16imm:$amt2), "#ADJCALLSTACKUP $amt1 $amt2",
1070*9880d681SAndroid Build Coastguard Worker                              [(callseq_end timm:$amt1, timm:$amt2)]>;
1071*9880d681SAndroid Build Coastguard Worker}
1072*9880d681SAndroid Build Coastguard Worker
1073*9880d681SAndroid Build Coastguard Workerdef UPDATE_VRSAVE    : Pseudo<(outs gprc:$rD), (ins gprc:$rS),
1074*9880d681SAndroid Build Coastguard Worker                              "UPDATE_VRSAVE $rD, $rS", []>;
1075*9880d681SAndroid Build Coastguard Worker}
1076*9880d681SAndroid Build Coastguard Worker
1077*9880d681SAndroid Build Coastguard Workerlet Defs = [R1], Uses = [R1] in
1078*9880d681SAndroid Build Coastguard Workerdef DYNALLOC : Pseudo<(outs gprc:$result), (ins gprc:$negsize, memri:$fpsi), "#DYNALLOC",
1079*9880d681SAndroid Build Coastguard Worker                       [(set i32:$result,
1080*9880d681SAndroid Build Coastguard Worker                             (PPCdynalloc i32:$negsize, iaddr:$fpsi))]>;
1081*9880d681SAndroid Build Coastguard Workerdef DYNAREAOFFSET : Pseudo<(outs i32imm:$result), (ins memri:$fpsi), "#DYNAREAOFFSET",
1082*9880d681SAndroid Build Coastguard Worker                       [(set i32:$result, (PPCdynareaoffset iaddr:$fpsi))]>;
1083*9880d681SAndroid Build Coastguard Worker
1084*9880d681SAndroid Build Coastguard Worker// SELECT_CC_* - Used to implement the SELECT_CC DAG operation.  Expanded after
1085*9880d681SAndroid Build Coastguard Worker// instruction selection into a branch sequence.
1086*9880d681SAndroid Build Coastguard Workerlet usesCustomInserter = 1,    // Expanded after instruction selection.
1087*9880d681SAndroid Build Coastguard Worker    PPC970_Single = 1 in {
1088*9880d681SAndroid Build Coastguard Worker  // Note that SELECT_CC_I4 and SELECT_CC_I8 use the no-r0 register classes
1089*9880d681SAndroid Build Coastguard Worker  // because either operand might become the first operand in an isel, and
1090*9880d681SAndroid Build Coastguard Worker  // that operand cannot be r0.
1091*9880d681SAndroid Build Coastguard Worker  def SELECT_CC_I4 : Pseudo<(outs gprc:$dst), (ins crrc:$cond,
1092*9880d681SAndroid Build Coastguard Worker                              gprc_nor0:$T, gprc_nor0:$F,
1093*9880d681SAndroid Build Coastguard Worker                              i32imm:$BROPC), "#SELECT_CC_I4",
1094*9880d681SAndroid Build Coastguard Worker                              []>;
1095*9880d681SAndroid Build Coastguard Worker  def SELECT_CC_I8 : Pseudo<(outs g8rc:$dst), (ins crrc:$cond,
1096*9880d681SAndroid Build Coastguard Worker                              g8rc_nox0:$T, g8rc_nox0:$F,
1097*9880d681SAndroid Build Coastguard Worker                              i32imm:$BROPC), "#SELECT_CC_I8",
1098*9880d681SAndroid Build Coastguard Worker                              []>;
1099*9880d681SAndroid Build Coastguard Worker  def SELECT_CC_F4  : Pseudo<(outs f4rc:$dst), (ins crrc:$cond, f4rc:$T, f4rc:$F,
1100*9880d681SAndroid Build Coastguard Worker                              i32imm:$BROPC), "#SELECT_CC_F4",
1101*9880d681SAndroid Build Coastguard Worker                              []>;
1102*9880d681SAndroid Build Coastguard Worker  def SELECT_CC_F8  : Pseudo<(outs f8rc:$dst), (ins crrc:$cond, f8rc:$T, f8rc:$F,
1103*9880d681SAndroid Build Coastguard Worker                              i32imm:$BROPC), "#SELECT_CC_F8",
1104*9880d681SAndroid Build Coastguard Worker                              []>;
1105*9880d681SAndroid Build Coastguard Worker  def SELECT_CC_VRRC: Pseudo<(outs vrrc:$dst), (ins crrc:$cond, vrrc:$T, vrrc:$F,
1106*9880d681SAndroid Build Coastguard Worker                              i32imm:$BROPC), "#SELECT_CC_VRRC",
1107*9880d681SAndroid Build Coastguard Worker                              []>;
1108*9880d681SAndroid Build Coastguard Worker
1109*9880d681SAndroid Build Coastguard Worker  // SELECT_* pseudo instructions, like SELECT_CC_* but taking condition
1110*9880d681SAndroid Build Coastguard Worker  // register bit directly.
1111*9880d681SAndroid Build Coastguard Worker  def SELECT_I4 : Pseudo<(outs gprc:$dst), (ins crbitrc:$cond,
1112*9880d681SAndroid Build Coastguard Worker                          gprc_nor0:$T, gprc_nor0:$F), "#SELECT_I4",
1113*9880d681SAndroid Build Coastguard Worker                          [(set i32:$dst, (select i1:$cond, i32:$T, i32:$F))]>;
1114*9880d681SAndroid Build Coastguard Worker  def SELECT_I8 : Pseudo<(outs g8rc:$dst), (ins crbitrc:$cond,
1115*9880d681SAndroid Build Coastguard Worker                          g8rc_nox0:$T, g8rc_nox0:$F), "#SELECT_I8",
1116*9880d681SAndroid Build Coastguard Worker                          [(set i64:$dst, (select i1:$cond, i64:$T, i64:$F))]>;
1117*9880d681SAndroid Build Coastguard Worker  def SELECT_F4  : Pseudo<(outs f4rc:$dst), (ins crbitrc:$cond,
1118*9880d681SAndroid Build Coastguard Worker                          f4rc:$T, f4rc:$F), "#SELECT_F4",
1119*9880d681SAndroid Build Coastguard Worker                          [(set f32:$dst, (select i1:$cond, f32:$T, f32:$F))]>;
1120*9880d681SAndroid Build Coastguard Worker  def SELECT_F8  : Pseudo<(outs f8rc:$dst), (ins crbitrc:$cond,
1121*9880d681SAndroid Build Coastguard Worker                          f8rc:$T, f8rc:$F), "#SELECT_F8",
1122*9880d681SAndroid Build Coastguard Worker                          [(set f64:$dst, (select i1:$cond, f64:$T, f64:$F))]>;
1123*9880d681SAndroid Build Coastguard Worker  def SELECT_VRRC: Pseudo<(outs vrrc:$dst), (ins crbitrc:$cond,
1124*9880d681SAndroid Build Coastguard Worker                          vrrc:$T, vrrc:$F), "#SELECT_VRRC",
1125*9880d681SAndroid Build Coastguard Worker                          [(set v4i32:$dst,
1126*9880d681SAndroid Build Coastguard Worker                                (select i1:$cond, v4i32:$T, v4i32:$F))]>;
1127*9880d681SAndroid Build Coastguard Worker}
1128*9880d681SAndroid Build Coastguard Worker
1129*9880d681SAndroid Build Coastguard Worker// SPILL_CR - Indicate that we're dumping the CR register, so we'll need to
1130*9880d681SAndroid Build Coastguard Worker// scavenge a register for it.
1131*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in {
1132*9880d681SAndroid Build Coastguard Workerdef SPILL_CR : Pseudo<(outs), (ins crrc:$cond, memri:$F),
1133*9880d681SAndroid Build Coastguard Worker                     "#SPILL_CR", []>;
1134*9880d681SAndroid Build Coastguard Workerdef SPILL_CRBIT : Pseudo<(outs), (ins crbitrc:$cond, memri:$F),
1135*9880d681SAndroid Build Coastguard Worker                         "#SPILL_CRBIT", []>;
1136*9880d681SAndroid Build Coastguard Worker}
1137*9880d681SAndroid Build Coastguard Worker
1138*9880d681SAndroid Build Coastguard Worker// RESTORE_CR - Indicate that we're restoring the CR register (previously
1139*9880d681SAndroid Build Coastguard Worker// spilled), so we'll need to scavenge a register for it.
1140*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in {
1141*9880d681SAndroid Build Coastguard Workerdef RESTORE_CR : Pseudo<(outs crrc:$cond), (ins memri:$F),
1142*9880d681SAndroid Build Coastguard Worker                     "#RESTORE_CR", []>;
1143*9880d681SAndroid Build Coastguard Workerdef RESTORE_CRBIT : Pseudo<(outs crbitrc:$cond), (ins memri:$F),
1144*9880d681SAndroid Build Coastguard Worker                           "#RESTORE_CRBIT", []>;
1145*9880d681SAndroid Build Coastguard Worker}
1146*9880d681SAndroid Build Coastguard Worker
1147*9880d681SAndroid Build Coastguard Workerlet isTerminator = 1, isBarrier = 1, PPC970_Unit = 7 in {
1148*9880d681SAndroid Build Coastguard Worker  let isReturn = 1, Uses = [LR, RM] in
1149*9880d681SAndroid Build Coastguard Worker    def BLR : XLForm_2_ext<19, 16, 20, 0, 0, (outs), (ins), "blr", IIC_BrB,
1150*9880d681SAndroid Build Coastguard Worker                           [(retflag)]>, Requires<[In32BitMode]>;
1151*9880d681SAndroid Build Coastguard Worker  let isBranch = 1, isIndirectBranch = 1, Uses = [CTR] in {
1152*9880d681SAndroid Build Coastguard Worker    def BCTR : XLForm_2_ext<19, 528, 20, 0, 0, (outs), (ins), "bctr", IIC_BrB,
1153*9880d681SAndroid Build Coastguard Worker                            []>;
1154*9880d681SAndroid Build Coastguard Worker
1155*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in {
1156*9880d681SAndroid Build Coastguard Worker      def BCCCTR : XLForm_2_br<19, 528, 0, (outs), (ins pred:$cond),
1157*9880d681SAndroid Build Coastguard Worker                               "b${cond:cc}ctr${cond:pm} ${cond:reg}", IIC_BrB,
1158*9880d681SAndroid Build Coastguard Worker                               []>;
1159*9880d681SAndroid Build Coastguard Worker
1160*9880d681SAndroid Build Coastguard Worker      def BCCTR :  XLForm_2_br2<19, 528, 12, 0, (outs), (ins crbitrc:$bi),
1161*9880d681SAndroid Build Coastguard Worker                                "bcctr 12, $bi, 0", IIC_BrB, []>;
1162*9880d681SAndroid Build Coastguard Worker      def BCCTRn : XLForm_2_br2<19, 528, 4, 0, (outs), (ins crbitrc:$bi),
1163*9880d681SAndroid Build Coastguard Worker                                "bcctr 4, $bi, 0", IIC_BrB, []>;
1164*9880d681SAndroid Build Coastguard Worker    }
1165*9880d681SAndroid Build Coastguard Worker  }
1166*9880d681SAndroid Build Coastguard Worker}
1167*9880d681SAndroid Build Coastguard Worker
1168*9880d681SAndroid Build Coastguard Workerlet Defs = [LR] in
1169*9880d681SAndroid Build Coastguard Worker  def MovePCtoLR : Pseudo<(outs), (ins), "#MovePCtoLR", []>,
1170*9880d681SAndroid Build Coastguard Worker                   PPC970_Unit_BRU;
1171*9880d681SAndroid Build Coastguard Workerlet Defs = [LR] in
1172*9880d681SAndroid Build Coastguard Worker  def MoveGOTtoLR : Pseudo<(outs), (ins), "#MoveGOTtoLR", []>,
1173*9880d681SAndroid Build Coastguard Worker                    PPC970_Unit_BRU;
1174*9880d681SAndroid Build Coastguard Worker
1175*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1, hasCtrlDep = 1, PPC970_Unit = 7 in {
1176*9880d681SAndroid Build Coastguard Worker  let isBarrier = 1 in {
1177*9880d681SAndroid Build Coastguard Worker  def B   : IForm<18, 0, 0, (outs), (ins directbrtarget:$dst),
1178*9880d681SAndroid Build Coastguard Worker                  "b $dst", IIC_BrB,
1179*9880d681SAndroid Build Coastguard Worker                  [(br bb:$dst)]>;
1180*9880d681SAndroid Build Coastguard Worker  def BA  : IForm<18, 1, 0, (outs), (ins absdirectbrtarget:$dst),
1181*9880d681SAndroid Build Coastguard Worker                  "ba $dst", IIC_BrB, []>;
1182*9880d681SAndroid Build Coastguard Worker  }
1183*9880d681SAndroid Build Coastguard Worker
1184*9880d681SAndroid Build Coastguard Worker  // BCC represents an arbitrary conditional branch on a predicate.
1185*9880d681SAndroid Build Coastguard Worker  // FIXME: should be able to write a pattern for PPCcondbranch, but can't use
1186*9880d681SAndroid Build Coastguard Worker  // a two-value operand where a dag node expects two operands. :(
1187*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in {
1188*9880d681SAndroid Build Coastguard Worker    def BCC : BForm<16, 0, 0, (outs), (ins pred:$cond, condbrtarget:$dst),
1189*9880d681SAndroid Build Coastguard Worker                    "b${cond:cc}${cond:pm} ${cond:reg}, $dst"
1190*9880d681SAndroid Build Coastguard Worker                    /*[(PPCcondbranch crrc:$crS, imm:$opc, bb:$dst)]*/>;
1191*9880d681SAndroid Build Coastguard Worker    def BCCA : BForm<16, 1, 0, (outs), (ins pred:$cond, abscondbrtarget:$dst),
1192*9880d681SAndroid Build Coastguard Worker                     "b${cond:cc}a${cond:pm} ${cond:reg}, $dst">;
1193*9880d681SAndroid Build Coastguard Worker
1194*9880d681SAndroid Build Coastguard Worker    let isReturn = 1, Uses = [LR, RM] in
1195*9880d681SAndroid Build Coastguard Worker    def BCCLR : XLForm_2_br<19, 16, 0, (outs), (ins pred:$cond),
1196*9880d681SAndroid Build Coastguard Worker                           "b${cond:cc}lr${cond:pm} ${cond:reg}", IIC_BrB, []>;
1197*9880d681SAndroid Build Coastguard Worker  }
1198*9880d681SAndroid Build Coastguard Worker
1199*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in {
1200*9880d681SAndroid Build Coastguard Worker    let Pattern = [(brcond i1:$bi, bb:$dst)] in
1201*9880d681SAndroid Build Coastguard Worker    def BC  : BForm_4<16, 12, 0, 0, (outs), (ins crbitrc:$bi, condbrtarget:$dst),
1202*9880d681SAndroid Build Coastguard Worker             "bc 12, $bi, $dst">;
1203*9880d681SAndroid Build Coastguard Worker
1204*9880d681SAndroid Build Coastguard Worker    let Pattern = [(brcond (not i1:$bi), bb:$dst)] in
1205*9880d681SAndroid Build Coastguard Worker    def BCn : BForm_4<16, 4, 0, 0, (outs), (ins crbitrc:$bi, condbrtarget:$dst),
1206*9880d681SAndroid Build Coastguard Worker             "bc 4, $bi, $dst">;
1207*9880d681SAndroid Build Coastguard Worker
1208*9880d681SAndroid Build Coastguard Worker    let isReturn = 1, Uses = [LR, RM] in
1209*9880d681SAndroid Build Coastguard Worker    def BCLR  : XLForm_2_br2<19, 16, 12, 0, (outs), (ins crbitrc:$bi),
1210*9880d681SAndroid Build Coastguard Worker                             "bclr 12, $bi, 0", IIC_BrB, []>;
1211*9880d681SAndroid Build Coastguard Worker    def BCLRn : XLForm_2_br2<19, 16, 4, 0, (outs), (ins crbitrc:$bi),
1212*9880d681SAndroid Build Coastguard Worker                             "bclr 4, $bi, 0", IIC_BrB, []>;
1213*9880d681SAndroid Build Coastguard Worker  }
1214*9880d681SAndroid Build Coastguard Worker
1215*9880d681SAndroid Build Coastguard Worker  let isReturn = 1, Defs = [CTR], Uses = [CTR, LR, RM] in {
1216*9880d681SAndroid Build Coastguard Worker   def BDZLR  : XLForm_2_ext<19, 16, 18, 0, 0, (outs), (ins),
1217*9880d681SAndroid Build Coastguard Worker                             "bdzlr", IIC_BrB, []>;
1218*9880d681SAndroid Build Coastguard Worker   def BDNZLR : XLForm_2_ext<19, 16, 16, 0, 0, (outs), (ins),
1219*9880d681SAndroid Build Coastguard Worker                             "bdnzlr", IIC_BrB, []>;
1220*9880d681SAndroid Build Coastguard Worker   def BDZLRp : XLForm_2_ext<19, 16, 27, 0, 0, (outs), (ins),
1221*9880d681SAndroid Build Coastguard Worker                             "bdzlr+", IIC_BrB, []>;
1222*9880d681SAndroid Build Coastguard Worker   def BDNZLRp: XLForm_2_ext<19, 16, 25, 0, 0, (outs), (ins),
1223*9880d681SAndroid Build Coastguard Worker                             "bdnzlr+", IIC_BrB, []>;
1224*9880d681SAndroid Build Coastguard Worker   def BDZLRm : XLForm_2_ext<19, 16, 26, 0, 0, (outs), (ins),
1225*9880d681SAndroid Build Coastguard Worker                             "bdzlr-", IIC_BrB, []>;
1226*9880d681SAndroid Build Coastguard Worker   def BDNZLRm: XLForm_2_ext<19, 16, 24, 0, 0, (outs), (ins),
1227*9880d681SAndroid Build Coastguard Worker                             "bdnzlr-", IIC_BrB, []>;
1228*9880d681SAndroid Build Coastguard Worker  }
1229*9880d681SAndroid Build Coastguard Worker
1230*9880d681SAndroid Build Coastguard Worker  let Defs = [CTR], Uses = [CTR] in {
1231*9880d681SAndroid Build Coastguard Worker    def BDZ  : BForm_1<16, 18, 0, 0, (outs), (ins condbrtarget:$dst),
1232*9880d681SAndroid Build Coastguard Worker                       "bdz $dst">;
1233*9880d681SAndroid Build Coastguard Worker    def BDNZ : BForm_1<16, 16, 0, 0, (outs), (ins condbrtarget:$dst),
1234*9880d681SAndroid Build Coastguard Worker                       "bdnz $dst">;
1235*9880d681SAndroid Build Coastguard Worker    def BDZA  : BForm_1<16, 18, 1, 0, (outs), (ins abscondbrtarget:$dst),
1236*9880d681SAndroid Build Coastguard Worker                        "bdza $dst">;
1237*9880d681SAndroid Build Coastguard Worker    def BDNZA : BForm_1<16, 16, 1, 0, (outs), (ins abscondbrtarget:$dst),
1238*9880d681SAndroid Build Coastguard Worker                        "bdnza $dst">;
1239*9880d681SAndroid Build Coastguard Worker    def BDZp : BForm_1<16, 27, 0, 0, (outs), (ins condbrtarget:$dst),
1240*9880d681SAndroid Build Coastguard Worker                       "bdz+ $dst">;
1241*9880d681SAndroid Build Coastguard Worker    def BDNZp: BForm_1<16, 25, 0, 0, (outs), (ins condbrtarget:$dst),
1242*9880d681SAndroid Build Coastguard Worker                       "bdnz+ $dst">;
1243*9880d681SAndroid Build Coastguard Worker    def BDZAp : BForm_1<16, 27, 1, 0, (outs), (ins abscondbrtarget:$dst),
1244*9880d681SAndroid Build Coastguard Worker                        "bdza+ $dst">;
1245*9880d681SAndroid Build Coastguard Worker    def BDNZAp: BForm_1<16, 25, 1, 0, (outs), (ins abscondbrtarget:$dst),
1246*9880d681SAndroid Build Coastguard Worker                        "bdnza+ $dst">;
1247*9880d681SAndroid Build Coastguard Worker    def BDZm : BForm_1<16, 26, 0, 0, (outs), (ins condbrtarget:$dst),
1248*9880d681SAndroid Build Coastguard Worker                       "bdz- $dst">;
1249*9880d681SAndroid Build Coastguard Worker    def BDNZm: BForm_1<16, 24, 0, 0, (outs), (ins condbrtarget:$dst),
1250*9880d681SAndroid Build Coastguard Worker                       "bdnz- $dst">;
1251*9880d681SAndroid Build Coastguard Worker    def BDZAm : BForm_1<16, 26, 1, 0, (outs), (ins abscondbrtarget:$dst),
1252*9880d681SAndroid Build Coastguard Worker                        "bdza- $dst">;
1253*9880d681SAndroid Build Coastguard Worker    def BDNZAm: BForm_1<16, 24, 1, 0, (outs), (ins abscondbrtarget:$dst),
1254*9880d681SAndroid Build Coastguard Worker                        "bdnza- $dst">;
1255*9880d681SAndroid Build Coastguard Worker  }
1256*9880d681SAndroid Build Coastguard Worker}
1257*9880d681SAndroid Build Coastguard Worker
1258*9880d681SAndroid Build Coastguard Worker// The unconditional BCL used by the SjLj setjmp code.
1259*9880d681SAndroid Build Coastguard Workerlet isCall = 1, hasCtrlDep = 1, isCodeGenOnly = 1, PPC970_Unit = 7 in {
1260*9880d681SAndroid Build Coastguard Worker  let Defs = [LR], Uses = [RM] in {
1261*9880d681SAndroid Build Coastguard Worker    def BCLalways  : BForm_2<16, 20, 31, 0, 1, (outs), (ins condbrtarget:$dst),
1262*9880d681SAndroid Build Coastguard Worker                            "bcl 20, 31, $dst">;
1263*9880d681SAndroid Build Coastguard Worker  }
1264*9880d681SAndroid Build Coastguard Worker}
1265*9880d681SAndroid Build Coastguard Worker
1266*9880d681SAndroid Build Coastguard Workerlet isCall = 1, PPC970_Unit = 7, Defs = [LR] in {
1267*9880d681SAndroid Build Coastguard Worker  // Convenient aliases for call instructions
1268*9880d681SAndroid Build Coastguard Worker  let Uses = [RM] in {
1269*9880d681SAndroid Build Coastguard Worker    def BL  : IForm<18, 0, 1, (outs), (ins calltarget:$func),
1270*9880d681SAndroid Build Coastguard Worker                    "bl $func", IIC_BrB, []>;  // See Pat patterns below.
1271*9880d681SAndroid Build Coastguard Worker    def BLA : IForm<18, 1, 1, (outs), (ins abscalltarget:$func),
1272*9880d681SAndroid Build Coastguard Worker                    "bla $func", IIC_BrB, [(PPCcall (i32 imm:$func))]>;
1273*9880d681SAndroid Build Coastguard Worker
1274*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in {
1275*9880d681SAndroid Build Coastguard Worker      def BL_TLS  : IForm<18, 0, 1, (outs), (ins tlscall32:$func),
1276*9880d681SAndroid Build Coastguard Worker                          "bl $func", IIC_BrB, []>;
1277*9880d681SAndroid Build Coastguard Worker      def BCCL : BForm<16, 0, 1, (outs), (ins pred:$cond, condbrtarget:$dst),
1278*9880d681SAndroid Build Coastguard Worker                       "b${cond:cc}l${cond:pm} ${cond:reg}, $dst">;
1279*9880d681SAndroid Build Coastguard Worker      def BCCLA : BForm<16, 1, 1, (outs), (ins pred:$cond, abscondbrtarget:$dst),
1280*9880d681SAndroid Build Coastguard Worker                        "b${cond:cc}la${cond:pm} ${cond:reg}, $dst">;
1281*9880d681SAndroid Build Coastguard Worker
1282*9880d681SAndroid Build Coastguard Worker      def BCL  : BForm_4<16, 12, 0, 1, (outs),
1283*9880d681SAndroid Build Coastguard Worker                         (ins crbitrc:$bi, condbrtarget:$dst),
1284*9880d681SAndroid Build Coastguard Worker                         "bcl 12, $bi, $dst">;
1285*9880d681SAndroid Build Coastguard Worker      def BCLn : BForm_4<16, 4, 0, 1, (outs),
1286*9880d681SAndroid Build Coastguard Worker                         (ins crbitrc:$bi, condbrtarget:$dst),
1287*9880d681SAndroid Build Coastguard Worker                         "bcl 4, $bi, $dst">;
1288*9880d681SAndroid Build Coastguard Worker    }
1289*9880d681SAndroid Build Coastguard Worker  }
1290*9880d681SAndroid Build Coastguard Worker  let Uses = [CTR, RM] in {
1291*9880d681SAndroid Build Coastguard Worker    def BCTRL : XLForm_2_ext<19, 528, 20, 0, 1, (outs), (ins),
1292*9880d681SAndroid Build Coastguard Worker                             "bctrl", IIC_BrB, [(PPCbctrl)]>,
1293*9880d681SAndroid Build Coastguard Worker                Requires<[In32BitMode]>;
1294*9880d681SAndroid Build Coastguard Worker
1295*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in {
1296*9880d681SAndroid Build Coastguard Worker      def BCCCTRL : XLForm_2_br<19, 528, 1, (outs), (ins pred:$cond),
1297*9880d681SAndroid Build Coastguard Worker                                "b${cond:cc}ctrl${cond:pm} ${cond:reg}", IIC_BrB,
1298*9880d681SAndroid Build Coastguard Worker                                []>;
1299*9880d681SAndroid Build Coastguard Worker
1300*9880d681SAndroid Build Coastguard Worker      def BCCTRL  : XLForm_2_br2<19, 528, 12, 1, (outs), (ins crbitrc:$bi),
1301*9880d681SAndroid Build Coastguard Worker                                 "bcctrl 12, $bi, 0", IIC_BrB, []>;
1302*9880d681SAndroid Build Coastguard Worker      def BCCTRLn : XLForm_2_br2<19, 528, 4, 1, (outs), (ins crbitrc:$bi),
1303*9880d681SAndroid Build Coastguard Worker                                 "bcctrl 4, $bi, 0", IIC_BrB, []>;
1304*9880d681SAndroid Build Coastguard Worker    }
1305*9880d681SAndroid Build Coastguard Worker  }
1306*9880d681SAndroid Build Coastguard Worker  let Uses = [LR, RM] in {
1307*9880d681SAndroid Build Coastguard Worker    def BLRL : XLForm_2_ext<19, 16, 20, 0, 1, (outs), (ins),
1308*9880d681SAndroid Build Coastguard Worker                            "blrl", IIC_BrB, []>;
1309*9880d681SAndroid Build Coastguard Worker
1310*9880d681SAndroid Build Coastguard Worker    let isCodeGenOnly = 1 in {
1311*9880d681SAndroid Build Coastguard Worker      def BCCLRL : XLForm_2_br<19, 16, 1, (outs), (ins pred:$cond),
1312*9880d681SAndroid Build Coastguard Worker                              "b${cond:cc}lrl${cond:pm} ${cond:reg}", IIC_BrB,
1313*9880d681SAndroid Build Coastguard Worker                              []>;
1314*9880d681SAndroid Build Coastguard Worker
1315*9880d681SAndroid Build Coastguard Worker      def BCLRL  : XLForm_2_br2<19, 16, 12, 1, (outs), (ins crbitrc:$bi),
1316*9880d681SAndroid Build Coastguard Worker                                "bclrl 12, $bi, 0", IIC_BrB, []>;
1317*9880d681SAndroid Build Coastguard Worker      def BCLRLn : XLForm_2_br2<19, 16, 4, 1, (outs), (ins crbitrc:$bi),
1318*9880d681SAndroid Build Coastguard Worker                                "bclrl 4, $bi, 0", IIC_BrB, []>;
1319*9880d681SAndroid Build Coastguard Worker    }
1320*9880d681SAndroid Build Coastguard Worker  }
1321*9880d681SAndroid Build Coastguard Worker  let Defs = [CTR], Uses = [CTR, RM] in {
1322*9880d681SAndroid Build Coastguard Worker    def BDZL  : BForm_1<16, 18, 0, 1, (outs), (ins condbrtarget:$dst),
1323*9880d681SAndroid Build Coastguard Worker                        "bdzl $dst">;
1324*9880d681SAndroid Build Coastguard Worker    def BDNZL : BForm_1<16, 16, 0, 1, (outs), (ins condbrtarget:$dst),
1325*9880d681SAndroid Build Coastguard Worker                        "bdnzl $dst">;
1326*9880d681SAndroid Build Coastguard Worker    def BDZLA  : BForm_1<16, 18, 1, 1, (outs), (ins abscondbrtarget:$dst),
1327*9880d681SAndroid Build Coastguard Worker                         "bdzla $dst">;
1328*9880d681SAndroid Build Coastguard Worker    def BDNZLA : BForm_1<16, 16, 1, 1, (outs), (ins abscondbrtarget:$dst),
1329*9880d681SAndroid Build Coastguard Worker                         "bdnzla $dst">;
1330*9880d681SAndroid Build Coastguard Worker    def BDZLp : BForm_1<16, 27, 0, 1, (outs), (ins condbrtarget:$dst),
1331*9880d681SAndroid Build Coastguard Worker                        "bdzl+ $dst">;
1332*9880d681SAndroid Build Coastguard Worker    def BDNZLp: BForm_1<16, 25, 0, 1, (outs), (ins condbrtarget:$dst),
1333*9880d681SAndroid Build Coastguard Worker                        "bdnzl+ $dst">;
1334*9880d681SAndroid Build Coastguard Worker    def BDZLAp : BForm_1<16, 27, 1, 1, (outs), (ins abscondbrtarget:$dst),
1335*9880d681SAndroid Build Coastguard Worker                         "bdzla+ $dst">;
1336*9880d681SAndroid Build Coastguard Worker    def BDNZLAp: BForm_1<16, 25, 1, 1, (outs), (ins abscondbrtarget:$dst),
1337*9880d681SAndroid Build Coastguard Worker                         "bdnzla+ $dst">;
1338*9880d681SAndroid Build Coastguard Worker    def BDZLm : BForm_1<16, 26, 0, 1, (outs), (ins condbrtarget:$dst),
1339*9880d681SAndroid Build Coastguard Worker                        "bdzl- $dst">;
1340*9880d681SAndroid Build Coastguard Worker    def BDNZLm: BForm_1<16, 24, 0, 1, (outs), (ins condbrtarget:$dst),
1341*9880d681SAndroid Build Coastguard Worker                        "bdnzl- $dst">;
1342*9880d681SAndroid Build Coastguard Worker    def BDZLAm : BForm_1<16, 26, 1, 1, (outs), (ins abscondbrtarget:$dst),
1343*9880d681SAndroid Build Coastguard Worker                         "bdzla- $dst">;
1344*9880d681SAndroid Build Coastguard Worker    def BDNZLAm: BForm_1<16, 24, 1, 1, (outs), (ins abscondbrtarget:$dst),
1345*9880d681SAndroid Build Coastguard Worker                         "bdnzla- $dst">;
1346*9880d681SAndroid Build Coastguard Worker  }
1347*9880d681SAndroid Build Coastguard Worker  let Defs = [CTR], Uses = [CTR, LR, RM] in {
1348*9880d681SAndroid Build Coastguard Worker    def BDZLRL  : XLForm_2_ext<19, 16, 18, 0, 1, (outs), (ins),
1349*9880d681SAndroid Build Coastguard Worker                               "bdzlrl", IIC_BrB, []>;
1350*9880d681SAndroid Build Coastguard Worker    def BDNZLRL : XLForm_2_ext<19, 16, 16, 0, 1, (outs), (ins),
1351*9880d681SAndroid Build Coastguard Worker                               "bdnzlrl", IIC_BrB, []>;
1352*9880d681SAndroid Build Coastguard Worker    def BDZLRLp : XLForm_2_ext<19, 16, 27, 0, 1, (outs), (ins),
1353*9880d681SAndroid Build Coastguard Worker                               "bdzlrl+", IIC_BrB, []>;
1354*9880d681SAndroid Build Coastguard Worker    def BDNZLRLp: XLForm_2_ext<19, 16, 25, 0, 1, (outs), (ins),
1355*9880d681SAndroid Build Coastguard Worker                               "bdnzlrl+", IIC_BrB, []>;
1356*9880d681SAndroid Build Coastguard Worker    def BDZLRLm : XLForm_2_ext<19, 16, 26, 0, 1, (outs), (ins),
1357*9880d681SAndroid Build Coastguard Worker                               "bdzlrl-", IIC_BrB, []>;
1358*9880d681SAndroid Build Coastguard Worker    def BDNZLRLm: XLForm_2_ext<19, 16, 24, 0, 1, (outs), (ins),
1359*9880d681SAndroid Build Coastguard Worker                               "bdnzlrl-", IIC_BrB, []>;
1360*9880d681SAndroid Build Coastguard Worker  }
1361*9880d681SAndroid Build Coastguard Worker}
1362*9880d681SAndroid Build Coastguard Worker
1363*9880d681SAndroid Build Coastguard Workerlet isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [RM] in
1364*9880d681SAndroid Build Coastguard Workerdef TCRETURNdi :Pseudo< (outs),
1365*9880d681SAndroid Build Coastguard Worker                        (ins calltarget:$dst, i32imm:$offset),
1366*9880d681SAndroid Build Coastguard Worker                 "#TC_RETURNd $dst $offset",
1367*9880d681SAndroid Build Coastguard Worker                 []>;
1368*9880d681SAndroid Build Coastguard Worker
1369*9880d681SAndroid Build Coastguard Worker
1370*9880d681SAndroid Build Coastguard Workerlet isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [RM] in
1371*9880d681SAndroid Build Coastguard Workerdef TCRETURNai :Pseudo<(outs), (ins abscalltarget:$func, i32imm:$offset),
1372*9880d681SAndroid Build Coastguard Worker                 "#TC_RETURNa $func $offset",
1373*9880d681SAndroid Build Coastguard Worker                 [(PPCtc_return (i32 imm:$func), imm:$offset)]>;
1374*9880d681SAndroid Build Coastguard Worker
1375*9880d681SAndroid Build Coastguard Workerlet isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [RM] in
1376*9880d681SAndroid Build Coastguard Workerdef TCRETURNri : Pseudo<(outs), (ins CTRRC:$dst, i32imm:$offset),
1377*9880d681SAndroid Build Coastguard Worker                 "#TC_RETURNr $dst $offset",
1378*9880d681SAndroid Build Coastguard Worker                 []>;
1379*9880d681SAndroid Build Coastguard Worker
1380*9880d681SAndroid Build Coastguard Worker
1381*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in {
1382*9880d681SAndroid Build Coastguard Worker
1383*9880d681SAndroid Build Coastguard Workerlet isTerminator = 1, isBarrier = 1, PPC970_Unit = 7, isBranch = 1,
1384*9880d681SAndroid Build Coastguard Worker    isIndirectBranch = 1, isCall = 1, isReturn = 1, Uses = [CTR, RM]  in
1385*9880d681SAndroid Build Coastguard Workerdef TAILBCTR : XLForm_2_ext<19, 528, 20, 0, 0, (outs), (ins), "bctr", IIC_BrB,
1386*9880d681SAndroid Build Coastguard Worker                            []>, Requires<[In32BitMode]>;
1387*9880d681SAndroid Build Coastguard Worker
1388*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1, hasCtrlDep = 1, PPC970_Unit = 7,
1389*9880d681SAndroid Build Coastguard Worker    isBarrier = 1, isCall = 1, isReturn = 1, Uses = [RM] in
1390*9880d681SAndroid Build Coastguard Workerdef TAILB   : IForm<18, 0, 0, (outs), (ins calltarget:$dst),
1391*9880d681SAndroid Build Coastguard Worker                  "b $dst", IIC_BrB,
1392*9880d681SAndroid Build Coastguard Worker                  []>;
1393*9880d681SAndroid Build Coastguard Worker
1394*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1, hasCtrlDep = 1, PPC970_Unit = 7,
1395*9880d681SAndroid Build Coastguard Worker    isBarrier = 1, isCall = 1, isReturn = 1, Uses = [RM] in
1396*9880d681SAndroid Build Coastguard Workerdef TAILBA   : IForm<18, 0, 0, (outs), (ins abscalltarget:$dst),
1397*9880d681SAndroid Build Coastguard Worker                  "ba $dst", IIC_BrB,
1398*9880d681SAndroid Build Coastguard Worker                  []>;
1399*9880d681SAndroid Build Coastguard Worker
1400*9880d681SAndroid Build Coastguard Worker}
1401*9880d681SAndroid Build Coastguard Worker
1402*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1, isBarrier = 1, usesCustomInserter = 1 in {
1403*9880d681SAndroid Build Coastguard Worker  let Defs = [CTR] in
1404*9880d681SAndroid Build Coastguard Worker  def EH_SjLj_SetJmp32  : Pseudo<(outs gprc:$dst), (ins memr:$buf),
1405*9880d681SAndroid Build Coastguard Worker                            "#EH_SJLJ_SETJMP32",
1406*9880d681SAndroid Build Coastguard Worker                            [(set i32:$dst, (PPCeh_sjlj_setjmp addr:$buf))]>,
1407*9880d681SAndroid Build Coastguard Worker                          Requires<[In32BitMode]>;
1408*9880d681SAndroid Build Coastguard Worker  let isTerminator = 1 in
1409*9880d681SAndroid Build Coastguard Worker  def EH_SjLj_LongJmp32 : Pseudo<(outs), (ins memr:$buf),
1410*9880d681SAndroid Build Coastguard Worker                            "#EH_SJLJ_LONGJMP32",
1411*9880d681SAndroid Build Coastguard Worker                            [(PPCeh_sjlj_longjmp addr:$buf)]>,
1412*9880d681SAndroid Build Coastguard Worker                          Requires<[In32BitMode]>;
1413*9880d681SAndroid Build Coastguard Worker}
1414*9880d681SAndroid Build Coastguard Worker
1415*9880d681SAndroid Build Coastguard Worker// This pseudo is never removed from the function, as it serves as
1416*9880d681SAndroid Build Coastguard Worker// a terminator.  Size is set to 0 to prevent the builtin assembler
1417*9880d681SAndroid Build Coastguard Worker// from emitting it.
1418*9880d681SAndroid Build Coastguard Workerlet isBranch = 1, isTerminator = 1, Size = 0 in {
1419*9880d681SAndroid Build Coastguard Worker  def EH_SjLj_Setup : Pseudo<(outs), (ins directbrtarget:$dst),
1420*9880d681SAndroid Build Coastguard Worker                        "#EH_SjLj_Setup\t$dst", []>;
1421*9880d681SAndroid Build Coastguard Worker}
1422*9880d681SAndroid Build Coastguard Worker
1423*9880d681SAndroid Build Coastguard Worker// System call.
1424*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 7 in {
1425*9880d681SAndroid Build Coastguard Worker  def SC     : SCForm<17, 1, (outs), (ins i32imm:$lev),
1426*9880d681SAndroid Build Coastguard Worker                      "sc $lev", IIC_BrB, [(PPCsc (i32 imm:$lev))]>;
1427*9880d681SAndroid Build Coastguard Worker}
1428*9880d681SAndroid Build Coastguard Worker
1429*9880d681SAndroid Build Coastguard Worker// Branch history rolling buffer.
1430*9880d681SAndroid Build Coastguard Workerdef CLRBHRB : XForm_0<31, 430, (outs), (ins), "clrbhrb", IIC_BrB,
1431*9880d681SAndroid Build Coastguard Worker                      [(PPCclrbhrb)]>,
1432*9880d681SAndroid Build Coastguard Worker                      PPC970_DGroup_Single;
1433*9880d681SAndroid Build Coastguard Worker// The $dmy argument used for MFBHRBE is not needed; however, including
1434*9880d681SAndroid Build Coastguard Worker// it avoids automatic generation of PPCFastISel::fastEmit_i(), which
1435*9880d681SAndroid Build Coastguard Worker// interferes with necessary special handling (see PPCFastISel.cpp).
1436*9880d681SAndroid Build Coastguard Workerdef MFBHRBE : XFXForm_3p<31, 302, (outs gprc:$rD),
1437*9880d681SAndroid Build Coastguard Worker                         (ins u10imm:$imm, u10imm:$dmy),
1438*9880d681SAndroid Build Coastguard Worker                         "mfbhrbe $rD, $imm", IIC_BrB,
1439*9880d681SAndroid Build Coastguard Worker                         [(set i32:$rD,
1440*9880d681SAndroid Build Coastguard Worker                               (PPCmfbhrbe imm:$imm, imm:$dmy))]>,
1441*9880d681SAndroid Build Coastguard Worker                         PPC970_DGroup_First;
1442*9880d681SAndroid Build Coastguard Worker
1443*9880d681SAndroid Build Coastguard Workerdef RFEBB : XLForm_S<19, 146, (outs), (ins u1imm:$imm), "rfebb $imm",
1444*9880d681SAndroid Build Coastguard Worker                     IIC_BrB, [(PPCrfebb (i32 imm:$imm))]>,
1445*9880d681SAndroid Build Coastguard Worker                     PPC970_DGroup_Single;
1446*9880d681SAndroid Build Coastguard Worker
1447*9880d681SAndroid Build Coastguard Worker// DCB* instructions.
1448*9880d681SAndroid Build Coastguard Workerdef DCBA   : DCB_Form<758, 0, (outs), (ins memrr:$dst), "dcba $dst",
1449*9880d681SAndroid Build Coastguard Worker                      IIC_LdStDCBF, [(int_ppc_dcba xoaddr:$dst)]>,
1450*9880d681SAndroid Build Coastguard Worker                      PPC970_DGroup_Single;
1451*9880d681SAndroid Build Coastguard Workerdef DCBF   : DCB_Form<86, 0, (outs), (ins memrr:$dst), "dcbf $dst",
1452*9880d681SAndroid Build Coastguard Worker                      IIC_LdStDCBF, [(int_ppc_dcbf xoaddr:$dst)]>,
1453*9880d681SAndroid Build Coastguard Worker                      PPC970_DGroup_Single;
1454*9880d681SAndroid Build Coastguard Workerdef DCBI   : DCB_Form<470, 0, (outs), (ins memrr:$dst), "dcbi $dst",
1455*9880d681SAndroid Build Coastguard Worker                      IIC_LdStDCBF, [(int_ppc_dcbi xoaddr:$dst)]>,
1456*9880d681SAndroid Build Coastguard Worker                      PPC970_DGroup_Single;
1457*9880d681SAndroid Build Coastguard Workerdef DCBST  : DCB_Form<54, 0, (outs), (ins memrr:$dst), "dcbst $dst",
1458*9880d681SAndroid Build Coastguard Worker                      IIC_LdStDCBF, [(int_ppc_dcbst xoaddr:$dst)]>,
1459*9880d681SAndroid Build Coastguard Worker                      PPC970_DGroup_Single;
1460*9880d681SAndroid Build Coastguard Workerdef DCBZ   : DCB_Form<1014, 0, (outs), (ins memrr:$dst), "dcbz $dst",
1461*9880d681SAndroid Build Coastguard Worker                      IIC_LdStDCBF, [(int_ppc_dcbz xoaddr:$dst)]>,
1462*9880d681SAndroid Build Coastguard Worker                      PPC970_DGroup_Single;
1463*9880d681SAndroid Build Coastguard Workerdef DCBZL  : DCB_Form<1014, 1, (outs), (ins memrr:$dst), "dcbzl $dst",
1464*9880d681SAndroid Build Coastguard Worker                      IIC_LdStDCBF, [(int_ppc_dcbzl xoaddr:$dst)]>,
1465*9880d681SAndroid Build Coastguard Worker                      PPC970_DGroup_Single;
1466*9880d681SAndroid Build Coastguard Worker
1467*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0, mayLoad = 1, mayStore = 1 in {
1468*9880d681SAndroid Build Coastguard Workerdef DCBT   : DCB_Form_hint<278, (outs), (ins u5imm:$TH, memrr:$dst),
1469*9880d681SAndroid Build Coastguard Worker                      "dcbt $dst, $TH", IIC_LdStDCBF, []>,
1470*9880d681SAndroid Build Coastguard Worker                      PPC970_DGroup_Single;
1471*9880d681SAndroid Build Coastguard Workerdef DCBTST : DCB_Form_hint<246, (outs), (ins u5imm:$TH, memrr:$dst),
1472*9880d681SAndroid Build Coastguard Worker                      "dcbtst $dst, $TH", IIC_LdStDCBF, []>,
1473*9880d681SAndroid Build Coastguard Worker                      PPC970_DGroup_Single;
1474*9880d681SAndroid Build Coastguard Worker} // hasSideEffects = 0
1475*9880d681SAndroid Build Coastguard Worker
1476*9880d681SAndroid Build Coastguard Workerdef ICBT  : XForm_icbt<31, 22, (outs), (ins u4imm:$CT, memrr:$src),
1477*9880d681SAndroid Build Coastguard Worker                       "icbt $CT, $src", IIC_LdStLoad>, Requires<[HasICBT]>;
1478*9880d681SAndroid Build Coastguard Worker
1479*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_dcbt xoaddr:$dst),
1480*9880d681SAndroid Build Coastguard Worker          (DCBT 0, xoaddr:$dst)>;
1481*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_dcbtst xoaddr:$dst),
1482*9880d681SAndroid Build Coastguard Worker          (DCBTST 0, xoaddr:$dst)>;
1483*9880d681SAndroid Build Coastguard Worker
1484*9880d681SAndroid Build Coastguard Workerdef : Pat<(prefetch xoaddr:$dst, (i32 0), imm, (i32 1)),
1485*9880d681SAndroid Build Coastguard Worker          (DCBT 0, xoaddr:$dst)>;   // data prefetch for loads
1486*9880d681SAndroid Build Coastguard Workerdef : Pat<(prefetch xoaddr:$dst, (i32 1), imm, (i32 1)),
1487*9880d681SAndroid Build Coastguard Worker          (DCBTST 0, xoaddr:$dst)>; // data prefetch for stores
1488*9880d681SAndroid Build Coastguard Workerdef : Pat<(prefetch xoaddr:$dst, (i32 0), imm, (i32 0)),
1489*9880d681SAndroid Build Coastguard Worker          (ICBT 0, xoaddr:$dst)>, Requires<[HasICBT]>; // inst prefetch (for read)
1490*9880d681SAndroid Build Coastguard Worker
1491*9880d681SAndroid Build Coastguard Worker// Atomic operations
1492*9880d681SAndroid Build Coastguard Workerlet usesCustomInserter = 1 in {
1493*9880d681SAndroid Build Coastguard Worker  let Defs = [CR0] in {
1494*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_ADD_I8 : Pseudo<
1495*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_ADD_I8",
1496*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_add_8 xoaddr:$ptr, i32:$incr))]>;
1497*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_SUB_I8 : Pseudo<
1498*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_SUB_I8",
1499*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_sub_8 xoaddr:$ptr, i32:$incr))]>;
1500*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_AND_I8 : Pseudo<
1501*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_AND_I8",
1502*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_and_8 xoaddr:$ptr, i32:$incr))]>;
1503*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_OR_I8 : Pseudo<
1504*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_OR_I8",
1505*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_or_8 xoaddr:$ptr, i32:$incr))]>;
1506*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_XOR_I8 : Pseudo<
1507*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "ATOMIC_LOAD_XOR_I8",
1508*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_xor_8 xoaddr:$ptr, i32:$incr))]>;
1509*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_NAND_I8 : Pseudo<
1510*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_NAND_I8",
1511*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_nand_8 xoaddr:$ptr, i32:$incr))]>;
1512*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_ADD_I16 : Pseudo<
1513*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_ADD_I16",
1514*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_add_16 xoaddr:$ptr, i32:$incr))]>;
1515*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_SUB_I16 : Pseudo<
1516*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_SUB_I16",
1517*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_sub_16 xoaddr:$ptr, i32:$incr))]>;
1518*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_AND_I16 : Pseudo<
1519*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_AND_I16",
1520*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_and_16 xoaddr:$ptr, i32:$incr))]>;
1521*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_OR_I16 : Pseudo<
1522*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_OR_I16",
1523*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_or_16 xoaddr:$ptr, i32:$incr))]>;
1524*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_XOR_I16 : Pseudo<
1525*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_XOR_I16",
1526*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_xor_16 xoaddr:$ptr, i32:$incr))]>;
1527*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_NAND_I16 : Pseudo<
1528*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_NAND_I16",
1529*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_nand_16 xoaddr:$ptr, i32:$incr))]>;
1530*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_ADD_I32 : Pseudo<
1531*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_ADD_I32",
1532*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_add_32 xoaddr:$ptr, i32:$incr))]>;
1533*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_SUB_I32 : Pseudo<
1534*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_SUB_I32",
1535*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_sub_32 xoaddr:$ptr, i32:$incr))]>;
1536*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_AND_I32 : Pseudo<
1537*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_AND_I32",
1538*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_and_32 xoaddr:$ptr, i32:$incr))]>;
1539*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_OR_I32 : Pseudo<
1540*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_OR_I32",
1541*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_or_32 xoaddr:$ptr, i32:$incr))]>;
1542*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_XOR_I32 : Pseudo<
1543*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_XOR_I32",
1544*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_xor_32 xoaddr:$ptr, i32:$incr))]>;
1545*9880d681SAndroid Build Coastguard Worker    def ATOMIC_LOAD_NAND_I32 : Pseudo<
1546*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_NAND_I32",
1547*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_load_nand_32 xoaddr:$ptr, i32:$incr))]>;
1548*9880d681SAndroid Build Coastguard Worker
1549*9880d681SAndroid Build Coastguard Worker    def ATOMIC_CMP_SWAP_I8 : Pseudo<
1550*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$old, gprc:$new), "#ATOMIC_CMP_SWAP_I8",
1551*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_cmp_swap_8 xoaddr:$ptr, i32:$old, i32:$new))]>;
1552*9880d681SAndroid Build Coastguard Worker    def ATOMIC_CMP_SWAP_I16 : Pseudo<
1553*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$old, gprc:$new), "#ATOMIC_CMP_SWAP_I16 $dst $ptr $old $new",
1554*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_cmp_swap_16 xoaddr:$ptr, i32:$old, i32:$new))]>;
1555*9880d681SAndroid Build Coastguard Worker    def ATOMIC_CMP_SWAP_I32 : Pseudo<
1556*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$old, gprc:$new), "#ATOMIC_CMP_SWAP_I32 $dst $ptr $old $new",
1557*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_cmp_swap_32 xoaddr:$ptr, i32:$old, i32:$new))]>;
1558*9880d681SAndroid Build Coastguard Worker
1559*9880d681SAndroid Build Coastguard Worker    def ATOMIC_SWAP_I8 : Pseudo<
1560*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$new), "#ATOMIC_SWAP_i8",
1561*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_swap_8 xoaddr:$ptr, i32:$new))]>;
1562*9880d681SAndroid Build Coastguard Worker    def ATOMIC_SWAP_I16 : Pseudo<
1563*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$new), "#ATOMIC_SWAP_I16",
1564*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_swap_16 xoaddr:$ptr, i32:$new))]>;
1565*9880d681SAndroid Build Coastguard Worker    def ATOMIC_SWAP_I32 : Pseudo<
1566*9880d681SAndroid Build Coastguard Worker      (outs gprc:$dst), (ins memrr:$ptr, gprc:$new), "#ATOMIC_SWAP_I32",
1567*9880d681SAndroid Build Coastguard Worker      [(set i32:$dst, (atomic_swap_32 xoaddr:$ptr, i32:$new))]>;
1568*9880d681SAndroid Build Coastguard Worker  }
1569*9880d681SAndroid Build Coastguard Worker}
1570*9880d681SAndroid Build Coastguard Worker
1571*9880d681SAndroid Build Coastguard Worker// Instructions to support atomic operations
1572*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, hasSideEffects = 0 in {
1573*9880d681SAndroid Build Coastguard Workerdef LBARX : XForm_1<31,  52, (outs gprc:$rD), (ins memrr:$src),
1574*9880d681SAndroid Build Coastguard Worker                    "lbarx $rD, $src", IIC_LdStLWARX, []>,
1575*9880d681SAndroid Build Coastguard Worker                    Requires<[HasPartwordAtomics]>;
1576*9880d681SAndroid Build Coastguard Worker
1577*9880d681SAndroid Build Coastguard Workerdef LHARX : XForm_1<31,  116, (outs gprc:$rD), (ins memrr:$src),
1578*9880d681SAndroid Build Coastguard Worker                    "lharx $rD, $src", IIC_LdStLWARX, []>,
1579*9880d681SAndroid Build Coastguard Worker                    Requires<[HasPartwordAtomics]>;
1580*9880d681SAndroid Build Coastguard Worker
1581*9880d681SAndroid Build Coastguard Workerdef LWARX : XForm_1<31,  20, (outs gprc:$rD), (ins memrr:$src),
1582*9880d681SAndroid Build Coastguard Worker                    "lwarx $rD, $src", IIC_LdStLWARX, []>;
1583*9880d681SAndroid Build Coastguard Worker
1584*9880d681SAndroid Build Coastguard Worker// Instructions to support lock versions of atomics
1585*9880d681SAndroid Build Coastguard Worker// (EH=1 - see Power ISA 2.07 Book II 4.4.2)
1586*9880d681SAndroid Build Coastguard Workerdef LBARXL : XForm_1<31,  52, (outs gprc:$rD), (ins memrr:$src),
1587*9880d681SAndroid Build Coastguard Worker                     "lbarx $rD, $src, 1", IIC_LdStLWARX, []>, isDOT,
1588*9880d681SAndroid Build Coastguard Worker                     Requires<[HasPartwordAtomics]>;
1589*9880d681SAndroid Build Coastguard Worker
1590*9880d681SAndroid Build Coastguard Workerdef LHARXL : XForm_1<31,  116, (outs gprc:$rD), (ins memrr:$src),
1591*9880d681SAndroid Build Coastguard Worker                     "lharx $rD, $src, 1", IIC_LdStLWARX, []>, isDOT,
1592*9880d681SAndroid Build Coastguard Worker                     Requires<[HasPartwordAtomics]>;
1593*9880d681SAndroid Build Coastguard Worker
1594*9880d681SAndroid Build Coastguard Workerdef LWARXL : XForm_1<31,  20, (outs gprc:$rD), (ins memrr:$src),
1595*9880d681SAndroid Build Coastguard Worker                     "lwarx $rD, $src, 1", IIC_LdStLWARX, []>, isDOT;
1596*9880d681SAndroid Build Coastguard Worker
1597*9880d681SAndroid Build Coastguard Worker// The atomic instructions use the destination register as well as the next one
1598*9880d681SAndroid Build Coastguard Worker// or two registers in order (modulo 31).
1599*9880d681SAndroid Build Coastguard Workerlet hasExtraSrcRegAllocReq = 1 in
1600*9880d681SAndroid Build Coastguard Workerdef LWAT : X_RD5_RS5_IM5<31, 582, (outs gprc:$rD), (ins gprc:$rA, u5imm:$FC),
1601*9880d681SAndroid Build Coastguard Worker                         "lwat $rD, $rA, $FC", IIC_LdStLoad>,
1602*9880d681SAndroid Build Coastguard Worker           Requires<[IsISA3_0]>;
1603*9880d681SAndroid Build Coastguard Worker}
1604*9880d681SAndroid Build Coastguard Worker
1605*9880d681SAndroid Build Coastguard Workerlet Defs = [CR0], mayStore = 1, hasSideEffects = 0 in {
1606*9880d681SAndroid Build Coastguard Workerdef STBCX : XForm_1<31, 694, (outs), (ins gprc:$rS, memrr:$dst),
1607*9880d681SAndroid Build Coastguard Worker                    "stbcx. $rS, $dst", IIC_LdStSTWCX, []>,
1608*9880d681SAndroid Build Coastguard Worker                    isDOT, Requires<[HasPartwordAtomics]>;
1609*9880d681SAndroid Build Coastguard Worker
1610*9880d681SAndroid Build Coastguard Workerdef STHCX : XForm_1<31, 726, (outs), (ins gprc:$rS, memrr:$dst),
1611*9880d681SAndroid Build Coastguard Worker                    "sthcx. $rS, $dst", IIC_LdStSTWCX, []>,
1612*9880d681SAndroid Build Coastguard Worker                    isDOT, Requires<[HasPartwordAtomics]>;
1613*9880d681SAndroid Build Coastguard Worker
1614*9880d681SAndroid Build Coastguard Workerdef STWCX : XForm_1<31, 150, (outs), (ins gprc:$rS, memrr:$dst),
1615*9880d681SAndroid Build Coastguard Worker                    "stwcx. $rS, $dst", IIC_LdStSTWCX, []>, isDOT;
1616*9880d681SAndroid Build Coastguard Worker}
1617*9880d681SAndroid Build Coastguard Worker
1618*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, hasSideEffects = 0 in
1619*9880d681SAndroid Build Coastguard Workerdef STWAT : X_RD5_RS5_IM5<31, 710, (outs), (ins gprc:$rS, gprc:$rA, u5imm:$FC),
1620*9880d681SAndroid Build Coastguard Worker                          "stwat $rS, $rA, $FC", IIC_LdStStore>,
1621*9880d681SAndroid Build Coastguard Worker            Requires<[IsISA3_0]>;
1622*9880d681SAndroid Build Coastguard Worker
1623*9880d681SAndroid Build Coastguard Workerlet isTerminator = 1, isBarrier = 1, hasCtrlDep = 1 in
1624*9880d681SAndroid Build Coastguard Workerdef TRAP  : XForm_24<31, 4, (outs), (ins), "trap", IIC_LdStLoad, [(trap)]>;
1625*9880d681SAndroid Build Coastguard Worker
1626*9880d681SAndroid Build Coastguard Workerdef TWI : DForm_base<3, (outs), (ins u5imm:$to, gprc:$rA, s16imm:$imm),
1627*9880d681SAndroid Build Coastguard Worker                     "twi $to, $rA, $imm", IIC_IntTrapW, []>;
1628*9880d681SAndroid Build Coastguard Workerdef TW : XForm_1<31, 4, (outs), (ins u5imm:$to, gprc:$rA, gprc:$rB),
1629*9880d681SAndroid Build Coastguard Worker                 "tw $to, $rA, $rB", IIC_IntTrapW, []>;
1630*9880d681SAndroid Build Coastguard Workerdef TDI : DForm_base<2, (outs), (ins u5imm:$to, g8rc:$rA, s16imm:$imm),
1631*9880d681SAndroid Build Coastguard Worker                     "tdi $to, $rA, $imm", IIC_IntTrapD, []>;
1632*9880d681SAndroid Build Coastguard Workerdef TD : XForm_1<31, 68, (outs), (ins u5imm:$to, g8rc:$rA, g8rc:$rB),
1633*9880d681SAndroid Build Coastguard Worker                 "td $to, $rA, $rB", IIC_IntTrapD, []>;
1634*9880d681SAndroid Build Coastguard Worker
1635*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1636*9880d681SAndroid Build Coastguard Worker// PPC32 Load Instructions.
1637*9880d681SAndroid Build Coastguard Worker//
1638*9880d681SAndroid Build Coastguard Worker
1639*9880d681SAndroid Build Coastguard Worker// Unindexed (r+i) Loads.
1640*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 2 in {
1641*9880d681SAndroid Build Coastguard Workerdef LBZ : DForm_1<34, (outs gprc:$rD), (ins memri:$src),
1642*9880d681SAndroid Build Coastguard Worker                  "lbz $rD, $src", IIC_LdStLoad,
1643*9880d681SAndroid Build Coastguard Worker                  [(set i32:$rD, (zextloadi8 iaddr:$src))]>;
1644*9880d681SAndroid Build Coastguard Workerdef LHA : DForm_1<42, (outs gprc:$rD), (ins memri:$src),
1645*9880d681SAndroid Build Coastguard Worker                  "lha $rD, $src", IIC_LdStLHA,
1646*9880d681SAndroid Build Coastguard Worker                  [(set i32:$rD, (sextloadi16 iaddr:$src))]>,
1647*9880d681SAndroid Build Coastguard Worker                  PPC970_DGroup_Cracked;
1648*9880d681SAndroid Build Coastguard Workerdef LHZ : DForm_1<40, (outs gprc:$rD), (ins memri:$src),
1649*9880d681SAndroid Build Coastguard Worker                  "lhz $rD, $src", IIC_LdStLoad,
1650*9880d681SAndroid Build Coastguard Worker                  [(set i32:$rD, (zextloadi16 iaddr:$src))]>;
1651*9880d681SAndroid Build Coastguard Workerdef LWZ : DForm_1<32, (outs gprc:$rD), (ins memri:$src),
1652*9880d681SAndroid Build Coastguard Worker                  "lwz $rD, $src", IIC_LdStLoad,
1653*9880d681SAndroid Build Coastguard Worker                  [(set i32:$rD, (load iaddr:$src))]>;
1654*9880d681SAndroid Build Coastguard Worker
1655*9880d681SAndroid Build Coastguard Workerdef LFS : DForm_1<48, (outs f4rc:$rD), (ins memri:$src),
1656*9880d681SAndroid Build Coastguard Worker                  "lfs $rD, $src", IIC_LdStLFD,
1657*9880d681SAndroid Build Coastguard Worker                  [(set f32:$rD, (load iaddr:$src))]>;
1658*9880d681SAndroid Build Coastguard Workerdef LFD : DForm_1<50, (outs f8rc:$rD), (ins memri:$src),
1659*9880d681SAndroid Build Coastguard Worker                  "lfd $rD, $src", IIC_LdStLFD,
1660*9880d681SAndroid Build Coastguard Worker                  [(set f64:$rD, (load iaddr:$src))]>;
1661*9880d681SAndroid Build Coastguard Worker
1662*9880d681SAndroid Build Coastguard Worker
1663*9880d681SAndroid Build Coastguard Worker// Unindexed (r+i) Loads with Update (preinc).
1664*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, hasSideEffects = 0 in {
1665*9880d681SAndroid Build Coastguard Workerdef LBZU : DForm_1<35, (outs gprc:$rD, ptr_rc_nor0:$ea_result), (ins memri:$addr),
1666*9880d681SAndroid Build Coastguard Worker                   "lbzu $rD, $addr", IIC_LdStLoadUpd,
1667*9880d681SAndroid Build Coastguard Worker                   []>, RegConstraint<"$addr.reg = $ea_result">,
1668*9880d681SAndroid Build Coastguard Worker                   NoEncode<"$ea_result">;
1669*9880d681SAndroid Build Coastguard Worker
1670*9880d681SAndroid Build Coastguard Workerdef LHAU : DForm_1<43, (outs gprc:$rD, ptr_rc_nor0:$ea_result), (ins memri:$addr),
1671*9880d681SAndroid Build Coastguard Worker                   "lhau $rD, $addr", IIC_LdStLHAU,
1672*9880d681SAndroid Build Coastguard Worker                   []>, RegConstraint<"$addr.reg = $ea_result">,
1673*9880d681SAndroid Build Coastguard Worker                   NoEncode<"$ea_result">;
1674*9880d681SAndroid Build Coastguard Worker
1675*9880d681SAndroid Build Coastguard Workerdef LHZU : DForm_1<41, (outs gprc:$rD, ptr_rc_nor0:$ea_result), (ins memri:$addr),
1676*9880d681SAndroid Build Coastguard Worker                   "lhzu $rD, $addr", IIC_LdStLoadUpd,
1677*9880d681SAndroid Build Coastguard Worker                   []>, RegConstraint<"$addr.reg = $ea_result">,
1678*9880d681SAndroid Build Coastguard Worker                   NoEncode<"$ea_result">;
1679*9880d681SAndroid Build Coastguard Worker
1680*9880d681SAndroid Build Coastguard Workerdef LWZU : DForm_1<33, (outs gprc:$rD, ptr_rc_nor0:$ea_result), (ins memri:$addr),
1681*9880d681SAndroid Build Coastguard Worker                   "lwzu $rD, $addr", IIC_LdStLoadUpd,
1682*9880d681SAndroid Build Coastguard Worker                   []>, RegConstraint<"$addr.reg = $ea_result">,
1683*9880d681SAndroid Build Coastguard Worker                   NoEncode<"$ea_result">;
1684*9880d681SAndroid Build Coastguard Worker
1685*9880d681SAndroid Build Coastguard Workerdef LFSU : DForm_1<49, (outs f4rc:$rD, ptr_rc_nor0:$ea_result), (ins memri:$addr),
1686*9880d681SAndroid Build Coastguard Worker                  "lfsu $rD, $addr", IIC_LdStLFDU,
1687*9880d681SAndroid Build Coastguard Worker                  []>, RegConstraint<"$addr.reg = $ea_result">,
1688*9880d681SAndroid Build Coastguard Worker                   NoEncode<"$ea_result">;
1689*9880d681SAndroid Build Coastguard Worker
1690*9880d681SAndroid Build Coastguard Workerdef LFDU : DForm_1<51, (outs f8rc:$rD, ptr_rc_nor0:$ea_result), (ins memri:$addr),
1691*9880d681SAndroid Build Coastguard Worker                  "lfdu $rD, $addr", IIC_LdStLFDU,
1692*9880d681SAndroid Build Coastguard Worker                  []>, RegConstraint<"$addr.reg = $ea_result">,
1693*9880d681SAndroid Build Coastguard Worker                   NoEncode<"$ea_result">;
1694*9880d681SAndroid Build Coastguard Worker
1695*9880d681SAndroid Build Coastguard Worker
1696*9880d681SAndroid Build Coastguard Worker// Indexed (r+r) Loads with Update (preinc).
1697*9880d681SAndroid Build Coastguard Workerdef LBZUX : XForm_1<31, 119, (outs gprc:$rD, ptr_rc_nor0:$ea_result),
1698*9880d681SAndroid Build Coastguard Worker                   (ins memrr:$addr),
1699*9880d681SAndroid Build Coastguard Worker                   "lbzux $rD, $addr", IIC_LdStLoadUpdX,
1700*9880d681SAndroid Build Coastguard Worker                   []>, RegConstraint<"$addr.ptrreg = $ea_result">,
1701*9880d681SAndroid Build Coastguard Worker                   NoEncode<"$ea_result">;
1702*9880d681SAndroid Build Coastguard Worker
1703*9880d681SAndroid Build Coastguard Workerdef LHAUX : XForm_1<31, 375, (outs gprc:$rD, ptr_rc_nor0:$ea_result),
1704*9880d681SAndroid Build Coastguard Worker                   (ins memrr:$addr),
1705*9880d681SAndroid Build Coastguard Worker                   "lhaux $rD, $addr", IIC_LdStLHAUX,
1706*9880d681SAndroid Build Coastguard Worker                   []>, RegConstraint<"$addr.ptrreg = $ea_result">,
1707*9880d681SAndroid Build Coastguard Worker                   NoEncode<"$ea_result">;
1708*9880d681SAndroid Build Coastguard Worker
1709*9880d681SAndroid Build Coastguard Workerdef LHZUX : XForm_1<31, 311, (outs gprc:$rD, ptr_rc_nor0:$ea_result),
1710*9880d681SAndroid Build Coastguard Worker                   (ins memrr:$addr),
1711*9880d681SAndroid Build Coastguard Worker                   "lhzux $rD, $addr", IIC_LdStLoadUpdX,
1712*9880d681SAndroid Build Coastguard Worker                   []>, RegConstraint<"$addr.ptrreg = $ea_result">,
1713*9880d681SAndroid Build Coastguard Worker                   NoEncode<"$ea_result">;
1714*9880d681SAndroid Build Coastguard Worker
1715*9880d681SAndroid Build Coastguard Workerdef LWZUX : XForm_1<31, 55, (outs gprc:$rD, ptr_rc_nor0:$ea_result),
1716*9880d681SAndroid Build Coastguard Worker                   (ins memrr:$addr),
1717*9880d681SAndroid Build Coastguard Worker                   "lwzux $rD, $addr", IIC_LdStLoadUpdX,
1718*9880d681SAndroid Build Coastguard Worker                   []>, RegConstraint<"$addr.ptrreg = $ea_result">,
1719*9880d681SAndroid Build Coastguard Worker                   NoEncode<"$ea_result">;
1720*9880d681SAndroid Build Coastguard Worker
1721*9880d681SAndroid Build Coastguard Workerdef LFSUX : XForm_1<31, 567, (outs f4rc:$rD, ptr_rc_nor0:$ea_result),
1722*9880d681SAndroid Build Coastguard Worker                   (ins memrr:$addr),
1723*9880d681SAndroid Build Coastguard Worker                   "lfsux $rD, $addr", IIC_LdStLFDUX,
1724*9880d681SAndroid Build Coastguard Worker                   []>, RegConstraint<"$addr.ptrreg = $ea_result">,
1725*9880d681SAndroid Build Coastguard Worker                   NoEncode<"$ea_result">;
1726*9880d681SAndroid Build Coastguard Worker
1727*9880d681SAndroid Build Coastguard Workerdef LFDUX : XForm_1<31, 631, (outs f8rc:$rD, ptr_rc_nor0:$ea_result),
1728*9880d681SAndroid Build Coastguard Worker                   (ins memrr:$addr),
1729*9880d681SAndroid Build Coastguard Worker                   "lfdux $rD, $addr", IIC_LdStLFDUX,
1730*9880d681SAndroid Build Coastguard Worker                   []>, RegConstraint<"$addr.ptrreg = $ea_result">,
1731*9880d681SAndroid Build Coastguard Worker                   NoEncode<"$ea_result">;
1732*9880d681SAndroid Build Coastguard Worker}
1733*9880d681SAndroid Build Coastguard Worker}
1734*9880d681SAndroid Build Coastguard Worker
1735*9880d681SAndroid Build Coastguard Worker// Indexed (r+r) Loads.
1736*9880d681SAndroid Build Coastguard Worker//
1737*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 2 in {
1738*9880d681SAndroid Build Coastguard Workerdef LBZX : XForm_1<31,  87, (outs gprc:$rD), (ins memrr:$src),
1739*9880d681SAndroid Build Coastguard Worker                   "lbzx $rD, $src", IIC_LdStLoad,
1740*9880d681SAndroid Build Coastguard Worker                   [(set i32:$rD, (zextloadi8 xaddr:$src))]>;
1741*9880d681SAndroid Build Coastguard Workerdef LHAX : XForm_1<31, 343, (outs gprc:$rD), (ins memrr:$src),
1742*9880d681SAndroid Build Coastguard Worker                   "lhax $rD, $src", IIC_LdStLHA,
1743*9880d681SAndroid Build Coastguard Worker                   [(set i32:$rD, (sextloadi16 xaddr:$src))]>,
1744*9880d681SAndroid Build Coastguard Worker                   PPC970_DGroup_Cracked;
1745*9880d681SAndroid Build Coastguard Workerdef LHZX : XForm_1<31, 279, (outs gprc:$rD), (ins memrr:$src),
1746*9880d681SAndroid Build Coastguard Worker                   "lhzx $rD, $src", IIC_LdStLoad,
1747*9880d681SAndroid Build Coastguard Worker                   [(set i32:$rD, (zextloadi16 xaddr:$src))]>;
1748*9880d681SAndroid Build Coastguard Workerdef LWZX : XForm_1<31,  23, (outs gprc:$rD), (ins memrr:$src),
1749*9880d681SAndroid Build Coastguard Worker                   "lwzx $rD, $src", IIC_LdStLoad,
1750*9880d681SAndroid Build Coastguard Worker                   [(set i32:$rD, (load xaddr:$src))]>;
1751*9880d681SAndroid Build Coastguard Worker
1752*9880d681SAndroid Build Coastguard Worker
1753*9880d681SAndroid Build Coastguard Workerdef LHBRX : XForm_1<31, 790, (outs gprc:$rD), (ins memrr:$src),
1754*9880d681SAndroid Build Coastguard Worker                   "lhbrx $rD, $src", IIC_LdStLoad,
1755*9880d681SAndroid Build Coastguard Worker                   [(set i32:$rD, (PPClbrx xoaddr:$src, i16))]>;
1756*9880d681SAndroid Build Coastguard Workerdef LWBRX : XForm_1<31,  534, (outs gprc:$rD), (ins memrr:$src),
1757*9880d681SAndroid Build Coastguard Worker                   "lwbrx $rD, $src", IIC_LdStLoad,
1758*9880d681SAndroid Build Coastguard Worker                   [(set i32:$rD, (PPClbrx xoaddr:$src, i32))]>;
1759*9880d681SAndroid Build Coastguard Worker
1760*9880d681SAndroid Build Coastguard Workerdef LFSX   : XForm_25<31, 535, (outs f4rc:$frD), (ins memrr:$src),
1761*9880d681SAndroid Build Coastguard Worker                      "lfsx $frD, $src", IIC_LdStLFD,
1762*9880d681SAndroid Build Coastguard Worker                      [(set f32:$frD, (load xaddr:$src))]>;
1763*9880d681SAndroid Build Coastguard Workerdef LFDX   : XForm_25<31, 599, (outs f8rc:$frD), (ins memrr:$src),
1764*9880d681SAndroid Build Coastguard Worker                      "lfdx $frD, $src", IIC_LdStLFD,
1765*9880d681SAndroid Build Coastguard Worker                      [(set f64:$frD, (load xaddr:$src))]>;
1766*9880d681SAndroid Build Coastguard Worker
1767*9880d681SAndroid Build Coastguard Workerdef LFIWAX : XForm_25<31, 855, (outs f8rc:$frD), (ins memrr:$src),
1768*9880d681SAndroid Build Coastguard Worker                      "lfiwax $frD, $src", IIC_LdStLFD,
1769*9880d681SAndroid Build Coastguard Worker                      [(set f64:$frD, (PPClfiwax xoaddr:$src))]>;
1770*9880d681SAndroid Build Coastguard Workerdef LFIWZX : XForm_25<31, 887, (outs f8rc:$frD), (ins memrr:$src),
1771*9880d681SAndroid Build Coastguard Worker                      "lfiwzx $frD, $src", IIC_LdStLFD,
1772*9880d681SAndroid Build Coastguard Worker                      [(set f64:$frD, (PPClfiwzx xoaddr:$src))]>;
1773*9880d681SAndroid Build Coastguard Worker}
1774*9880d681SAndroid Build Coastguard Worker
1775*9880d681SAndroid Build Coastguard Worker// Load Multiple
1776*9880d681SAndroid Build Coastguard Workerdef LMW : DForm_1<46, (outs gprc:$rD), (ins memri:$src),
1777*9880d681SAndroid Build Coastguard Worker                  "lmw $rD, $src", IIC_LdStLMW, []>;
1778*9880d681SAndroid Build Coastguard Worker
1779*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1780*9880d681SAndroid Build Coastguard Worker// PPC32 Store Instructions.
1781*9880d681SAndroid Build Coastguard Worker//
1782*9880d681SAndroid Build Coastguard Worker
1783*9880d681SAndroid Build Coastguard Worker// Unindexed (r+i) Stores.
1784*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 2 in {
1785*9880d681SAndroid Build Coastguard Workerdef STB  : DForm_1<38, (outs), (ins gprc:$rS, memri:$src),
1786*9880d681SAndroid Build Coastguard Worker                   "stb $rS, $src", IIC_LdStStore,
1787*9880d681SAndroid Build Coastguard Worker                   [(truncstorei8 i32:$rS, iaddr:$src)]>;
1788*9880d681SAndroid Build Coastguard Workerdef STH  : DForm_1<44, (outs), (ins gprc:$rS, memri:$src),
1789*9880d681SAndroid Build Coastguard Worker                   "sth $rS, $src", IIC_LdStStore,
1790*9880d681SAndroid Build Coastguard Worker                   [(truncstorei16 i32:$rS, iaddr:$src)]>;
1791*9880d681SAndroid Build Coastguard Workerdef STW  : DForm_1<36, (outs), (ins gprc:$rS, memri:$src),
1792*9880d681SAndroid Build Coastguard Worker                   "stw $rS, $src", IIC_LdStStore,
1793*9880d681SAndroid Build Coastguard Worker                   [(store i32:$rS, iaddr:$src)]>;
1794*9880d681SAndroid Build Coastguard Workerdef STFS : DForm_1<52, (outs), (ins f4rc:$rS, memri:$dst),
1795*9880d681SAndroid Build Coastguard Worker                   "stfs $rS, $dst", IIC_LdStSTFD,
1796*9880d681SAndroid Build Coastguard Worker                   [(store f32:$rS, iaddr:$dst)]>;
1797*9880d681SAndroid Build Coastguard Workerdef STFD : DForm_1<54, (outs), (ins f8rc:$rS, memri:$dst),
1798*9880d681SAndroid Build Coastguard Worker                   "stfd $rS, $dst", IIC_LdStSTFD,
1799*9880d681SAndroid Build Coastguard Worker                   [(store f64:$rS, iaddr:$dst)]>;
1800*9880d681SAndroid Build Coastguard Worker}
1801*9880d681SAndroid Build Coastguard Worker
1802*9880d681SAndroid Build Coastguard Worker// Unindexed (r+i) Stores with Update (preinc).
1803*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 2, mayStore = 1 in {
1804*9880d681SAndroid Build Coastguard Workerdef STBU  : DForm_1<39, (outs ptr_rc_nor0:$ea_res), (ins gprc:$rS, memri:$dst),
1805*9880d681SAndroid Build Coastguard Worker                    "stbu $rS, $dst", IIC_LdStStoreUpd, []>,
1806*9880d681SAndroid Build Coastguard Worker                    RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
1807*9880d681SAndroid Build Coastguard Workerdef STHU  : DForm_1<45, (outs ptr_rc_nor0:$ea_res), (ins gprc:$rS, memri:$dst),
1808*9880d681SAndroid Build Coastguard Worker                    "sthu $rS, $dst", IIC_LdStStoreUpd, []>,
1809*9880d681SAndroid Build Coastguard Worker                    RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
1810*9880d681SAndroid Build Coastguard Workerdef STWU  : DForm_1<37, (outs ptr_rc_nor0:$ea_res), (ins gprc:$rS, memri:$dst),
1811*9880d681SAndroid Build Coastguard Worker                    "stwu $rS, $dst", IIC_LdStStoreUpd, []>,
1812*9880d681SAndroid Build Coastguard Worker                    RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
1813*9880d681SAndroid Build Coastguard Workerdef STFSU : DForm_1<53, (outs ptr_rc_nor0:$ea_res), (ins f4rc:$rS, memri:$dst),
1814*9880d681SAndroid Build Coastguard Worker                    "stfsu $rS, $dst", IIC_LdStSTFDU, []>,
1815*9880d681SAndroid Build Coastguard Worker                    RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
1816*9880d681SAndroid Build Coastguard Workerdef STFDU : DForm_1<55, (outs ptr_rc_nor0:$ea_res), (ins f8rc:$rS, memri:$dst),
1817*9880d681SAndroid Build Coastguard Worker                    "stfdu $rS, $dst", IIC_LdStSTFDU, []>,
1818*9880d681SAndroid Build Coastguard Worker                    RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
1819*9880d681SAndroid Build Coastguard Worker}
1820*9880d681SAndroid Build Coastguard Worker
1821*9880d681SAndroid Build Coastguard Worker// Patterns to match the pre-inc stores.  We can't put the patterns on
1822*9880d681SAndroid Build Coastguard Worker// the instruction definitions directly as ISel wants the address base
1823*9880d681SAndroid Build Coastguard Worker// and offset to be separate operands, not a single complex operand.
1824*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_truncsti8 i32:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
1825*9880d681SAndroid Build Coastguard Worker          (STBU $rS, iaddroff:$ptroff, $ptrreg)>;
1826*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_truncsti16 i32:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
1827*9880d681SAndroid Build Coastguard Worker          (STHU $rS, iaddroff:$ptroff, $ptrreg)>;
1828*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store i32:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
1829*9880d681SAndroid Build Coastguard Worker          (STWU $rS, iaddroff:$ptroff, $ptrreg)>;
1830*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store f32:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
1831*9880d681SAndroid Build Coastguard Worker          (STFSU $rS, iaddroff:$ptroff, $ptrreg)>;
1832*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store f64:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
1833*9880d681SAndroid Build Coastguard Worker          (STFDU $rS, iaddroff:$ptroff, $ptrreg)>;
1834*9880d681SAndroid Build Coastguard Worker
1835*9880d681SAndroid Build Coastguard Worker// Indexed (r+r) Stores.
1836*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 2 in {
1837*9880d681SAndroid Build Coastguard Workerdef STBX  : XForm_8<31, 215, (outs), (ins gprc:$rS, memrr:$dst),
1838*9880d681SAndroid Build Coastguard Worker                   "stbx $rS, $dst", IIC_LdStStore,
1839*9880d681SAndroid Build Coastguard Worker                   [(truncstorei8 i32:$rS, xaddr:$dst)]>,
1840*9880d681SAndroid Build Coastguard Worker                   PPC970_DGroup_Cracked;
1841*9880d681SAndroid Build Coastguard Workerdef STHX  : XForm_8<31, 407, (outs), (ins gprc:$rS, memrr:$dst),
1842*9880d681SAndroid Build Coastguard Worker                   "sthx $rS, $dst", IIC_LdStStore,
1843*9880d681SAndroid Build Coastguard Worker                   [(truncstorei16 i32:$rS, xaddr:$dst)]>,
1844*9880d681SAndroid Build Coastguard Worker                   PPC970_DGroup_Cracked;
1845*9880d681SAndroid Build Coastguard Workerdef STWX  : XForm_8<31, 151, (outs), (ins gprc:$rS, memrr:$dst),
1846*9880d681SAndroid Build Coastguard Worker                   "stwx $rS, $dst", IIC_LdStStore,
1847*9880d681SAndroid Build Coastguard Worker                   [(store i32:$rS, xaddr:$dst)]>,
1848*9880d681SAndroid Build Coastguard Worker                   PPC970_DGroup_Cracked;
1849*9880d681SAndroid Build Coastguard Worker
1850*9880d681SAndroid Build Coastguard Workerdef STHBRX: XForm_8<31, 918, (outs), (ins gprc:$rS, memrr:$dst),
1851*9880d681SAndroid Build Coastguard Worker                   "sthbrx $rS, $dst", IIC_LdStStore,
1852*9880d681SAndroid Build Coastguard Worker                   [(PPCstbrx i32:$rS, xoaddr:$dst, i16)]>,
1853*9880d681SAndroid Build Coastguard Worker                   PPC970_DGroup_Cracked;
1854*9880d681SAndroid Build Coastguard Workerdef STWBRX: XForm_8<31, 662, (outs), (ins gprc:$rS, memrr:$dst),
1855*9880d681SAndroid Build Coastguard Worker                   "stwbrx $rS, $dst", IIC_LdStStore,
1856*9880d681SAndroid Build Coastguard Worker                   [(PPCstbrx i32:$rS, xoaddr:$dst, i32)]>,
1857*9880d681SAndroid Build Coastguard Worker                   PPC970_DGroup_Cracked;
1858*9880d681SAndroid Build Coastguard Worker
1859*9880d681SAndroid Build Coastguard Workerdef STFIWX: XForm_28<31, 983, (outs), (ins f8rc:$frS, memrr:$dst),
1860*9880d681SAndroid Build Coastguard Worker                     "stfiwx $frS, $dst", IIC_LdStSTFD,
1861*9880d681SAndroid Build Coastguard Worker                     [(PPCstfiwx f64:$frS, xoaddr:$dst)]>;
1862*9880d681SAndroid Build Coastguard Worker
1863*9880d681SAndroid Build Coastguard Workerdef STFSX : XForm_28<31, 663, (outs), (ins f4rc:$frS, memrr:$dst),
1864*9880d681SAndroid Build Coastguard Worker                     "stfsx $frS, $dst", IIC_LdStSTFD,
1865*9880d681SAndroid Build Coastguard Worker                     [(store f32:$frS, xaddr:$dst)]>;
1866*9880d681SAndroid Build Coastguard Workerdef STFDX : XForm_28<31, 727, (outs), (ins f8rc:$frS, memrr:$dst),
1867*9880d681SAndroid Build Coastguard Worker                     "stfdx $frS, $dst", IIC_LdStSTFD,
1868*9880d681SAndroid Build Coastguard Worker                     [(store f64:$frS, xaddr:$dst)]>;
1869*9880d681SAndroid Build Coastguard Worker}
1870*9880d681SAndroid Build Coastguard Worker
1871*9880d681SAndroid Build Coastguard Worker// Indexed (r+r) Stores with Update (preinc).
1872*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 2, mayStore = 1 in {
1873*9880d681SAndroid Build Coastguard Workerdef STBUX : XForm_8<31, 247, (outs ptr_rc_nor0:$ea_res), (ins gprc:$rS, memrr:$dst),
1874*9880d681SAndroid Build Coastguard Worker                    "stbux $rS, $dst", IIC_LdStStoreUpd, []>,
1875*9880d681SAndroid Build Coastguard Worker                    RegConstraint<"$dst.ptrreg = $ea_res">, NoEncode<"$ea_res">,
1876*9880d681SAndroid Build Coastguard Worker                    PPC970_DGroup_Cracked;
1877*9880d681SAndroid Build Coastguard Workerdef STHUX : XForm_8<31, 439, (outs ptr_rc_nor0:$ea_res), (ins gprc:$rS, memrr:$dst),
1878*9880d681SAndroid Build Coastguard Worker                    "sthux $rS, $dst", IIC_LdStStoreUpd, []>,
1879*9880d681SAndroid Build Coastguard Worker                    RegConstraint<"$dst.ptrreg = $ea_res">, NoEncode<"$ea_res">,
1880*9880d681SAndroid Build Coastguard Worker                    PPC970_DGroup_Cracked;
1881*9880d681SAndroid Build Coastguard Workerdef STWUX : XForm_8<31, 183, (outs ptr_rc_nor0:$ea_res), (ins gprc:$rS, memrr:$dst),
1882*9880d681SAndroid Build Coastguard Worker                    "stwux $rS, $dst", IIC_LdStStoreUpd, []>,
1883*9880d681SAndroid Build Coastguard Worker                    RegConstraint<"$dst.ptrreg = $ea_res">, NoEncode<"$ea_res">,
1884*9880d681SAndroid Build Coastguard Worker                    PPC970_DGroup_Cracked;
1885*9880d681SAndroid Build Coastguard Workerdef STFSUX: XForm_8<31, 695, (outs ptr_rc_nor0:$ea_res), (ins f4rc:$rS, memrr:$dst),
1886*9880d681SAndroid Build Coastguard Worker                    "stfsux $rS, $dst", IIC_LdStSTFDU, []>,
1887*9880d681SAndroid Build Coastguard Worker                    RegConstraint<"$dst.ptrreg = $ea_res">, NoEncode<"$ea_res">,
1888*9880d681SAndroid Build Coastguard Worker                    PPC970_DGroup_Cracked;
1889*9880d681SAndroid Build Coastguard Workerdef STFDUX: XForm_8<31, 759, (outs ptr_rc_nor0:$ea_res), (ins f8rc:$rS, memrr:$dst),
1890*9880d681SAndroid Build Coastguard Worker                    "stfdux $rS, $dst", IIC_LdStSTFDU, []>,
1891*9880d681SAndroid Build Coastguard Worker                    RegConstraint<"$dst.ptrreg = $ea_res">, NoEncode<"$ea_res">,
1892*9880d681SAndroid Build Coastguard Worker                    PPC970_DGroup_Cracked;
1893*9880d681SAndroid Build Coastguard Worker}
1894*9880d681SAndroid Build Coastguard Worker
1895*9880d681SAndroid Build Coastguard Worker// Patterns to match the pre-inc stores.  We can't put the patterns on
1896*9880d681SAndroid Build Coastguard Worker// the instruction definitions directly as ISel wants the address base
1897*9880d681SAndroid Build Coastguard Worker// and offset to be separate operands, not a single complex operand.
1898*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_truncsti8 i32:$rS, iPTR:$ptrreg, iPTR:$ptroff),
1899*9880d681SAndroid Build Coastguard Worker          (STBUX $rS, $ptrreg, $ptroff)>;
1900*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_truncsti16 i32:$rS, iPTR:$ptrreg, iPTR:$ptroff),
1901*9880d681SAndroid Build Coastguard Worker          (STHUX $rS, $ptrreg, $ptroff)>;
1902*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store i32:$rS, iPTR:$ptrreg, iPTR:$ptroff),
1903*9880d681SAndroid Build Coastguard Worker          (STWUX $rS, $ptrreg, $ptroff)>;
1904*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store f32:$rS, iPTR:$ptrreg, iPTR:$ptroff),
1905*9880d681SAndroid Build Coastguard Worker          (STFSUX $rS, $ptrreg, $ptroff)>;
1906*9880d681SAndroid Build Coastguard Workerdef : Pat<(pre_store f64:$rS, iPTR:$ptrreg, iPTR:$ptroff),
1907*9880d681SAndroid Build Coastguard Worker          (STFDUX $rS, $ptrreg, $ptroff)>;
1908*9880d681SAndroid Build Coastguard Worker
1909*9880d681SAndroid Build Coastguard Worker// Store Multiple
1910*9880d681SAndroid Build Coastguard Workerdef STMW : DForm_1<47, (outs), (ins gprc:$rS, memri:$dst),
1911*9880d681SAndroid Build Coastguard Worker                   "stmw $rS, $dst", IIC_LdStLMW, []>;
1912*9880d681SAndroid Build Coastguard Worker
1913*9880d681SAndroid Build Coastguard Workerdef SYNC : XForm_24_sync<31, 598, (outs), (ins i32imm:$L),
1914*9880d681SAndroid Build Coastguard Worker                        "sync $L", IIC_LdStSync, []>;
1915*9880d681SAndroid Build Coastguard Worker
1916*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in {
1917*9880d681SAndroid Build Coastguard Worker  def MSYNC : XForm_24_sync<31, 598, (outs), (ins),
1918*9880d681SAndroid Build Coastguard Worker                           "msync", IIC_LdStSync, []> {
1919*9880d681SAndroid Build Coastguard Worker    let L = 0;
1920*9880d681SAndroid Build Coastguard Worker  }
1921*9880d681SAndroid Build Coastguard Worker}
1922*9880d681SAndroid Build Coastguard Worker
1923*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_sync),   (SYNC 0)>, Requires<[HasSYNC]>;
1924*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_lwsync), (SYNC 1)>, Requires<[HasSYNC]>;
1925*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_sync),   (MSYNC)>, Requires<[HasOnlyMSYNC]>;
1926*9880d681SAndroid Build Coastguard Workerdef : Pat<(int_ppc_lwsync), (MSYNC)>, Requires<[HasOnlyMSYNC]>;
1927*9880d681SAndroid Build Coastguard Worker
1928*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1929*9880d681SAndroid Build Coastguard Worker// PPC32 Arithmetic Instructions.
1930*9880d681SAndroid Build Coastguard Worker//
1931*9880d681SAndroid Build Coastguard Worker
1932*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 1 in {  // FXU Operations.
1933*9880d681SAndroid Build Coastguard Workerdef ADDI   : DForm_2<14, (outs gprc:$rD), (ins gprc_nor0:$rA, s16imm:$imm),
1934*9880d681SAndroid Build Coastguard Worker                     "addi $rD, $rA, $imm", IIC_IntSimple,
1935*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rD, (add i32:$rA, imm32SExt16:$imm))]>;
1936*9880d681SAndroid Build Coastguard Workerlet BaseName = "addic" in {
1937*9880d681SAndroid Build Coastguard Workerlet Defs = [CARRY] in
1938*9880d681SAndroid Build Coastguard Workerdef ADDIC  : DForm_2<12, (outs gprc:$rD), (ins gprc:$rA, s16imm:$imm),
1939*9880d681SAndroid Build Coastguard Worker                     "addic $rD, $rA, $imm", IIC_IntGeneral,
1940*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rD, (addc i32:$rA, imm32SExt16:$imm))]>,
1941*9880d681SAndroid Build Coastguard Worker                     RecFormRel, PPC970_DGroup_Cracked;
1942*9880d681SAndroid Build Coastguard Workerlet Defs = [CARRY, CR0] in
1943*9880d681SAndroid Build Coastguard Workerdef ADDICo : DForm_2<13, (outs gprc:$rD), (ins gprc:$rA, s16imm:$imm),
1944*9880d681SAndroid Build Coastguard Worker                     "addic. $rD, $rA, $imm", IIC_IntGeneral,
1945*9880d681SAndroid Build Coastguard Worker                     []>, isDOT, RecFormRel;
1946*9880d681SAndroid Build Coastguard Worker}
1947*9880d681SAndroid Build Coastguard Workerdef ADDIS  : DForm_2<15, (outs gprc:$rD), (ins gprc_nor0:$rA, s17imm:$imm),
1948*9880d681SAndroid Build Coastguard Worker                     "addis $rD, $rA, $imm", IIC_IntSimple,
1949*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rD, (add i32:$rA, imm16ShiftedSExt:$imm))]>;
1950*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in
1951*9880d681SAndroid Build Coastguard Workerdef LA     : DForm_2<14, (outs gprc:$rD), (ins gprc_nor0:$rA, s16imm:$sym),
1952*9880d681SAndroid Build Coastguard Worker                     "la $rD, $sym($rA)", IIC_IntGeneral,
1953*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rD, (add i32:$rA,
1954*9880d681SAndroid Build Coastguard Worker                                          (PPClo tglobaladdr:$sym, 0)))]>;
1955*9880d681SAndroid Build Coastguard Workerdef MULLI  : DForm_2< 7, (outs gprc:$rD), (ins gprc:$rA, s16imm:$imm),
1956*9880d681SAndroid Build Coastguard Worker                     "mulli $rD, $rA, $imm", IIC_IntMulLI,
1957*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rD, (mul i32:$rA, imm32SExt16:$imm))]>;
1958*9880d681SAndroid Build Coastguard Workerlet Defs = [CARRY] in
1959*9880d681SAndroid Build Coastguard Workerdef SUBFIC : DForm_2< 8, (outs gprc:$rD), (ins gprc:$rA, s16imm:$imm),
1960*9880d681SAndroid Build Coastguard Worker                     "subfic $rD, $rA, $imm", IIC_IntGeneral,
1961*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rD, (subc imm32SExt16:$imm, i32:$rA))]>;
1962*9880d681SAndroid Build Coastguard Worker
1963*9880d681SAndroid Build Coastguard Workerlet isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in {
1964*9880d681SAndroid Build Coastguard Worker  def LI  : DForm_2_r0<14, (outs gprc:$rD), (ins s16imm:$imm),
1965*9880d681SAndroid Build Coastguard Worker                       "li $rD, $imm", IIC_IntSimple,
1966*9880d681SAndroid Build Coastguard Worker                       [(set i32:$rD, imm32SExt16:$imm)]>;
1967*9880d681SAndroid Build Coastguard Worker  def LIS : DForm_2_r0<15, (outs gprc:$rD), (ins s17imm:$imm),
1968*9880d681SAndroid Build Coastguard Worker                       "lis $rD, $imm", IIC_IntSimple,
1969*9880d681SAndroid Build Coastguard Worker                       [(set i32:$rD, imm16ShiftedSExt:$imm)]>;
1970*9880d681SAndroid Build Coastguard Worker}
1971*9880d681SAndroid Build Coastguard Worker}
1972*9880d681SAndroid Build Coastguard Worker
1973*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 1 in {  // FXU Operations.
1974*9880d681SAndroid Build Coastguard Workerlet Defs = [CR0] in {
1975*9880d681SAndroid Build Coastguard Workerdef ANDIo : DForm_4<28, (outs gprc:$dst), (ins gprc:$src1, u16imm:$src2),
1976*9880d681SAndroid Build Coastguard Worker                    "andi. $dst, $src1, $src2", IIC_IntGeneral,
1977*9880d681SAndroid Build Coastguard Worker                    [(set i32:$dst, (and i32:$src1, immZExt16:$src2))]>,
1978*9880d681SAndroid Build Coastguard Worker                    isDOT;
1979*9880d681SAndroid Build Coastguard Workerdef ANDISo : DForm_4<29, (outs gprc:$dst), (ins gprc:$src1, u16imm:$src2),
1980*9880d681SAndroid Build Coastguard Worker                    "andis. $dst, $src1, $src2", IIC_IntGeneral,
1981*9880d681SAndroid Build Coastguard Worker                    [(set i32:$dst, (and i32:$src1, imm16ShiftedZExt:$src2))]>,
1982*9880d681SAndroid Build Coastguard Worker                    isDOT;
1983*9880d681SAndroid Build Coastguard Worker}
1984*9880d681SAndroid Build Coastguard Workerdef ORI   : DForm_4<24, (outs gprc:$dst), (ins gprc:$src1, u16imm:$src2),
1985*9880d681SAndroid Build Coastguard Worker                    "ori $dst, $src1, $src2", IIC_IntSimple,
1986*9880d681SAndroid Build Coastguard Worker                    [(set i32:$dst, (or i32:$src1, immZExt16:$src2))]>;
1987*9880d681SAndroid Build Coastguard Workerdef ORIS  : DForm_4<25, (outs gprc:$dst), (ins gprc:$src1, u16imm:$src2),
1988*9880d681SAndroid Build Coastguard Worker                    "oris $dst, $src1, $src2", IIC_IntSimple,
1989*9880d681SAndroid Build Coastguard Worker                    [(set i32:$dst, (or i32:$src1, imm16ShiftedZExt:$src2))]>;
1990*9880d681SAndroid Build Coastguard Workerdef XORI  : DForm_4<26, (outs gprc:$dst), (ins gprc:$src1, u16imm:$src2),
1991*9880d681SAndroid Build Coastguard Worker                    "xori $dst, $src1, $src2", IIC_IntSimple,
1992*9880d681SAndroid Build Coastguard Worker                    [(set i32:$dst, (xor i32:$src1, immZExt16:$src2))]>;
1993*9880d681SAndroid Build Coastguard Workerdef XORIS : DForm_4<27, (outs gprc:$dst), (ins gprc:$src1, u16imm:$src2),
1994*9880d681SAndroid Build Coastguard Worker                    "xoris $dst, $src1, $src2", IIC_IntSimple,
1995*9880d681SAndroid Build Coastguard Worker                    [(set i32:$dst, (xor i32:$src1, imm16ShiftedZExt:$src2))]>;
1996*9880d681SAndroid Build Coastguard Worker
1997*9880d681SAndroid Build Coastguard Workerdef NOP   : DForm_4_zero<24, (outs), (ins), "nop", IIC_IntSimple,
1998*9880d681SAndroid Build Coastguard Worker                         []>;
1999*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in {
2000*9880d681SAndroid Build Coastguard Worker// The POWER6 and POWER7 have special group-terminating nops.
2001*9880d681SAndroid Build Coastguard Workerdef NOP_GT_PWR6 : DForm_4_fixedreg_zero<24, 1, (outs), (ins),
2002*9880d681SAndroid Build Coastguard Worker                                        "ori 1, 1, 0", IIC_IntSimple, []>;
2003*9880d681SAndroid Build Coastguard Workerdef NOP_GT_PWR7 : DForm_4_fixedreg_zero<24, 2, (outs), (ins),
2004*9880d681SAndroid Build Coastguard Worker                                        "ori 2, 2, 0", IIC_IntSimple, []>;
2005*9880d681SAndroid Build Coastguard Worker}
2006*9880d681SAndroid Build Coastguard Worker
2007*9880d681SAndroid Build Coastguard Workerlet isCompare = 1, hasSideEffects = 0 in {
2008*9880d681SAndroid Build Coastguard Worker  def CMPWI : DForm_5_ext<11, (outs crrc:$crD), (ins gprc:$rA, s16imm:$imm),
2009*9880d681SAndroid Build Coastguard Worker                          "cmpwi $crD, $rA, $imm", IIC_IntCompare>;
2010*9880d681SAndroid Build Coastguard Worker  def CMPLWI : DForm_6_ext<10, (outs crrc:$dst), (ins gprc:$src1, u16imm:$src2),
2011*9880d681SAndroid Build Coastguard Worker                           "cmplwi $dst, $src1, $src2", IIC_IntCompare>;
2012*9880d681SAndroid Build Coastguard Worker  def CMPRB  : X_BF3_L1_RS5_RS5<31, 192, (outs crbitrc:$BF),
2013*9880d681SAndroid Build Coastguard Worker                                (ins u1imm:$L, g8rc:$rA, g8rc:$rB),
2014*9880d681SAndroid Build Coastguard Worker                                "cmprb $BF, $L, $rA, $rB", IIC_IntCompare, []>,
2015*9880d681SAndroid Build Coastguard Worker               Requires<[IsISA3_0]>;
2016*9880d681SAndroid Build Coastguard Worker}
2017*9880d681SAndroid Build Coastguard Worker}
2018*9880d681SAndroid Build Coastguard Worker
2019*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 1, hasSideEffects = 0 in {  // FXU Operations.
2020*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in {
2021*9880d681SAndroid Build Coastguard Workerdefm NAND : XForm_6r<31, 476, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2022*9880d681SAndroid Build Coastguard Worker                     "nand", "$rA, $rS, $rB", IIC_IntSimple,
2023*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rA, (not (and i32:$rS, i32:$rB)))]>;
2024*9880d681SAndroid Build Coastguard Workerdefm AND  : XForm_6r<31,  28, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2025*9880d681SAndroid Build Coastguard Worker                     "and", "$rA, $rS, $rB", IIC_IntSimple,
2026*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rA, (and i32:$rS, i32:$rB))]>;
2027*9880d681SAndroid Build Coastguard Worker} // isCommutable
2028*9880d681SAndroid Build Coastguard Workerdefm ANDC : XForm_6r<31,  60, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2029*9880d681SAndroid Build Coastguard Worker                     "andc", "$rA, $rS, $rB", IIC_IntSimple,
2030*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rA, (and i32:$rS, (not i32:$rB)))]>;
2031*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in {
2032*9880d681SAndroid Build Coastguard Workerdefm OR   : XForm_6r<31, 444, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2033*9880d681SAndroid Build Coastguard Worker                     "or", "$rA, $rS, $rB", IIC_IntSimple,
2034*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rA, (or i32:$rS, i32:$rB))]>;
2035*9880d681SAndroid Build Coastguard Workerdefm NOR  : XForm_6r<31, 124, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2036*9880d681SAndroid Build Coastguard Worker                     "nor", "$rA, $rS, $rB", IIC_IntSimple,
2037*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rA, (not (or i32:$rS, i32:$rB)))]>;
2038*9880d681SAndroid Build Coastguard Worker} // isCommutable
2039*9880d681SAndroid Build Coastguard Workerdefm ORC  : XForm_6r<31, 412, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2040*9880d681SAndroid Build Coastguard Worker                     "orc", "$rA, $rS, $rB", IIC_IntSimple,
2041*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rA, (or i32:$rS, (not i32:$rB)))]>;
2042*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in {
2043*9880d681SAndroid Build Coastguard Workerdefm EQV  : XForm_6r<31, 284, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2044*9880d681SAndroid Build Coastguard Worker                     "eqv", "$rA, $rS, $rB", IIC_IntSimple,
2045*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rA, (not (xor i32:$rS, i32:$rB)))]>;
2046*9880d681SAndroid Build Coastguard Workerdefm XOR  : XForm_6r<31, 316, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2047*9880d681SAndroid Build Coastguard Worker                     "xor", "$rA, $rS, $rB", IIC_IntSimple,
2048*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rA, (xor i32:$rS, i32:$rB))]>;
2049*9880d681SAndroid Build Coastguard Worker} // isCommutable
2050*9880d681SAndroid Build Coastguard Workerdefm SLW  : XForm_6r<31,  24, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2051*9880d681SAndroid Build Coastguard Worker                     "slw", "$rA, $rS, $rB", IIC_IntGeneral,
2052*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rA, (PPCshl i32:$rS, i32:$rB))]>;
2053*9880d681SAndroid Build Coastguard Workerdefm SRW  : XForm_6r<31, 536, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2054*9880d681SAndroid Build Coastguard Worker                     "srw", "$rA, $rS, $rB", IIC_IntGeneral,
2055*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rA, (PPCsrl i32:$rS, i32:$rB))]>;
2056*9880d681SAndroid Build Coastguard Workerdefm SRAW : XForm_6rc<31, 792, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2057*9880d681SAndroid Build Coastguard Worker                      "sraw", "$rA, $rS, $rB", IIC_IntShift,
2058*9880d681SAndroid Build Coastguard Worker                      [(set i32:$rA, (PPCsra i32:$rS, i32:$rB))]>;
2059*9880d681SAndroid Build Coastguard Worker}
2060*9880d681SAndroid Build Coastguard Worker
2061*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 1 in {  // FXU Operations.
2062*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in {
2063*9880d681SAndroid Build Coastguard Workerdefm SRAWI : XForm_10rc<31, 824, (outs gprc:$rA), (ins gprc:$rS, u5imm:$SH),
2064*9880d681SAndroid Build Coastguard Worker                        "srawi", "$rA, $rS, $SH", IIC_IntShift,
2065*9880d681SAndroid Build Coastguard Worker                        [(set i32:$rA, (sra i32:$rS, (i32 imm:$SH)))]>;
2066*9880d681SAndroid Build Coastguard Workerdefm CNTLZW : XForm_11r<31,  26, (outs gprc:$rA), (ins gprc:$rS),
2067*9880d681SAndroid Build Coastguard Worker                        "cntlzw", "$rA, $rS", IIC_IntGeneral,
2068*9880d681SAndroid Build Coastguard Worker                        [(set i32:$rA, (ctlz i32:$rS))]>;
2069*9880d681SAndroid Build Coastguard Workerdefm CNTTZW : XForm_11r<31, 538, (outs gprc:$rA), (ins gprc:$rS),
2070*9880d681SAndroid Build Coastguard Worker                        "cnttzw", "$rA, $rS", IIC_IntGeneral,
2071*9880d681SAndroid Build Coastguard Worker                        [(set i32:$rA, (cttz i32:$rS))]>, Requires<[IsISA3_0]>;
2072*9880d681SAndroid Build Coastguard Workerdefm EXTSB  : XForm_11r<31, 954, (outs gprc:$rA), (ins gprc:$rS),
2073*9880d681SAndroid Build Coastguard Worker                        "extsb", "$rA, $rS", IIC_IntSimple,
2074*9880d681SAndroid Build Coastguard Worker                        [(set i32:$rA, (sext_inreg i32:$rS, i8))]>;
2075*9880d681SAndroid Build Coastguard Workerdefm EXTSH  : XForm_11r<31, 922, (outs gprc:$rA), (ins gprc:$rS),
2076*9880d681SAndroid Build Coastguard Worker                        "extsh", "$rA, $rS", IIC_IntSimple,
2077*9880d681SAndroid Build Coastguard Worker                        [(set i32:$rA, (sext_inreg i32:$rS, i16))]>;
2078*9880d681SAndroid Build Coastguard Worker
2079*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in
2080*9880d681SAndroid Build Coastguard Workerdef CMPB : XForm_6<31, 508, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2081*9880d681SAndroid Build Coastguard Worker                   "cmpb $rA, $rS, $rB", IIC_IntGeneral,
2082*9880d681SAndroid Build Coastguard Worker                   [(set i32:$rA, (PPCcmpb i32:$rS, i32:$rB))]>;
2083*9880d681SAndroid Build Coastguard Worker}
2084*9880d681SAndroid Build Coastguard Workerlet isCompare = 1, hasSideEffects = 0 in {
2085*9880d681SAndroid Build Coastguard Worker  def CMPW   : XForm_16_ext<31, 0, (outs crrc:$crD), (ins gprc:$rA, gprc:$rB),
2086*9880d681SAndroid Build Coastguard Worker                            "cmpw $crD, $rA, $rB", IIC_IntCompare>;
2087*9880d681SAndroid Build Coastguard Worker  def CMPLW  : XForm_16_ext<31, 32, (outs crrc:$crD), (ins gprc:$rA, gprc:$rB),
2088*9880d681SAndroid Build Coastguard Worker                            "cmplw $crD, $rA, $rB", IIC_IntCompare>;
2089*9880d681SAndroid Build Coastguard Worker}
2090*9880d681SAndroid Build Coastguard Worker}
2091*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 3 in {  // FPU Operations.
2092*9880d681SAndroid Build Coastguard Worker//def FCMPO  : XForm_17<63, 32, (outs CRRC:$crD), (ins FPRC:$fA, FPRC:$fB),
2093*9880d681SAndroid Build Coastguard Worker//                      "fcmpo $crD, $fA, $fB", IIC_FPCompare>;
2094*9880d681SAndroid Build Coastguard Workerlet isCompare = 1, hasSideEffects = 0 in {
2095*9880d681SAndroid Build Coastguard Worker  def FCMPUS : XForm_17<63, 0, (outs crrc:$crD), (ins f4rc:$fA, f4rc:$fB),
2096*9880d681SAndroid Build Coastguard Worker                        "fcmpu $crD, $fA, $fB", IIC_FPCompare>;
2097*9880d681SAndroid Build Coastguard Worker  let Interpretation64Bit = 1, isCodeGenOnly = 1 in
2098*9880d681SAndroid Build Coastguard Worker  def FCMPUD : XForm_17<63, 0, (outs crrc:$crD), (ins f8rc:$fA, f8rc:$fB),
2099*9880d681SAndroid Build Coastguard Worker                        "fcmpu $crD, $fA, $fB", IIC_FPCompare>;
2100*9880d681SAndroid Build Coastguard Worker}
2101*9880d681SAndroid Build Coastguard Worker
2102*9880d681SAndroid Build Coastguard Workerlet Uses = [RM] in {
2103*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0 in {
2104*9880d681SAndroid Build Coastguard Worker  defm FCTIW  : XForm_26r<63, 14, (outs f8rc:$frD), (ins f8rc:$frB),
2105*9880d681SAndroid Build Coastguard Worker                          "fctiw", "$frD, $frB", IIC_FPGeneral,
2106*9880d681SAndroid Build Coastguard Worker                          []>;
2107*9880d681SAndroid Build Coastguard Worker  defm FCTIWZ : XForm_26r<63, 15, (outs f8rc:$frD), (ins f8rc:$frB),
2108*9880d681SAndroid Build Coastguard Worker                          "fctiwz", "$frD, $frB", IIC_FPGeneral,
2109*9880d681SAndroid Build Coastguard Worker                          [(set f64:$frD, (PPCfctiwz f64:$frB))]>;
2110*9880d681SAndroid Build Coastguard Worker
2111*9880d681SAndroid Build Coastguard Worker  defm FRSP   : XForm_26r<63, 12, (outs f4rc:$frD), (ins f8rc:$frB),
2112*9880d681SAndroid Build Coastguard Worker                          "frsp", "$frD, $frB", IIC_FPGeneral,
2113*9880d681SAndroid Build Coastguard Worker                          [(set f32:$frD, (fround f64:$frB))]>;
2114*9880d681SAndroid Build Coastguard Worker
2115*9880d681SAndroid Build Coastguard Worker  let Interpretation64Bit = 1, isCodeGenOnly = 1 in
2116*9880d681SAndroid Build Coastguard Worker  defm FRIND  : XForm_26r<63, 392, (outs f8rc:$frD), (ins f8rc:$frB),
2117*9880d681SAndroid Build Coastguard Worker                          "frin", "$frD, $frB", IIC_FPGeneral,
2118*9880d681SAndroid Build Coastguard Worker                          [(set f64:$frD, (frnd f64:$frB))]>;
2119*9880d681SAndroid Build Coastguard Worker  defm FRINS  : XForm_26r<63, 392, (outs f4rc:$frD), (ins f4rc:$frB),
2120*9880d681SAndroid Build Coastguard Worker                          "frin", "$frD, $frB", IIC_FPGeneral,
2121*9880d681SAndroid Build Coastguard Worker                          [(set f32:$frD, (frnd f32:$frB))]>;
2122*9880d681SAndroid Build Coastguard Worker  }
2123*9880d681SAndroid Build Coastguard Worker
2124*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0 in {
2125*9880d681SAndroid Build Coastguard Worker  let Interpretation64Bit = 1, isCodeGenOnly = 1 in
2126*9880d681SAndroid Build Coastguard Worker  defm FRIPD  : XForm_26r<63, 456, (outs f8rc:$frD), (ins f8rc:$frB),
2127*9880d681SAndroid Build Coastguard Worker                          "frip", "$frD, $frB", IIC_FPGeneral,
2128*9880d681SAndroid Build Coastguard Worker                          [(set f64:$frD, (fceil f64:$frB))]>;
2129*9880d681SAndroid Build Coastguard Worker  defm FRIPS  : XForm_26r<63, 456, (outs f4rc:$frD), (ins f4rc:$frB),
2130*9880d681SAndroid Build Coastguard Worker                          "frip", "$frD, $frB", IIC_FPGeneral,
2131*9880d681SAndroid Build Coastguard Worker                          [(set f32:$frD, (fceil f32:$frB))]>;
2132*9880d681SAndroid Build Coastguard Worker  let Interpretation64Bit = 1, isCodeGenOnly = 1 in
2133*9880d681SAndroid Build Coastguard Worker  defm FRIZD  : XForm_26r<63, 424, (outs f8rc:$frD), (ins f8rc:$frB),
2134*9880d681SAndroid Build Coastguard Worker                          "friz", "$frD, $frB", IIC_FPGeneral,
2135*9880d681SAndroid Build Coastguard Worker                          [(set f64:$frD, (ftrunc f64:$frB))]>;
2136*9880d681SAndroid Build Coastguard Worker  defm FRIZS  : XForm_26r<63, 424, (outs f4rc:$frD), (ins f4rc:$frB),
2137*9880d681SAndroid Build Coastguard Worker                          "friz", "$frD, $frB", IIC_FPGeneral,
2138*9880d681SAndroid Build Coastguard Worker                          [(set f32:$frD, (ftrunc f32:$frB))]>;
2139*9880d681SAndroid Build Coastguard Worker  let Interpretation64Bit = 1, isCodeGenOnly = 1 in
2140*9880d681SAndroid Build Coastguard Worker  defm FRIMD  : XForm_26r<63, 488, (outs f8rc:$frD), (ins f8rc:$frB),
2141*9880d681SAndroid Build Coastguard Worker                          "frim", "$frD, $frB", IIC_FPGeneral,
2142*9880d681SAndroid Build Coastguard Worker                          [(set f64:$frD, (ffloor f64:$frB))]>;
2143*9880d681SAndroid Build Coastguard Worker  defm FRIMS  : XForm_26r<63, 488, (outs f4rc:$frD), (ins f4rc:$frB),
2144*9880d681SAndroid Build Coastguard Worker                          "frim", "$frD, $frB", IIC_FPGeneral,
2145*9880d681SAndroid Build Coastguard Worker                          [(set f32:$frD, (ffloor f32:$frB))]>;
2146*9880d681SAndroid Build Coastguard Worker
2147*9880d681SAndroid Build Coastguard Worker  defm FSQRT  : XForm_26r<63, 22, (outs f8rc:$frD), (ins f8rc:$frB),
2148*9880d681SAndroid Build Coastguard Worker                          "fsqrt", "$frD, $frB", IIC_FPSqrtD,
2149*9880d681SAndroid Build Coastguard Worker                          [(set f64:$frD, (fsqrt f64:$frB))]>;
2150*9880d681SAndroid Build Coastguard Worker  defm FSQRTS : XForm_26r<59, 22, (outs f4rc:$frD), (ins f4rc:$frB),
2151*9880d681SAndroid Build Coastguard Worker                          "fsqrts", "$frD, $frB", IIC_FPSqrtS,
2152*9880d681SAndroid Build Coastguard Worker                          [(set f32:$frD, (fsqrt f32:$frB))]>;
2153*9880d681SAndroid Build Coastguard Worker  }
2154*9880d681SAndroid Build Coastguard Worker  }
2155*9880d681SAndroid Build Coastguard Worker}
2156*9880d681SAndroid Build Coastguard Worker
2157*9880d681SAndroid Build Coastguard Worker/// Note that FMR is defined as pseudo-ops on the PPC970 because they are
2158*9880d681SAndroid Build Coastguard Worker/// often coalesced away and we don't want the dispatch group builder to think
2159*9880d681SAndroid Build Coastguard Worker/// that they will fill slots (which could cause the load of a LSU reject to
2160*9880d681SAndroid Build Coastguard Worker/// sneak into a d-group with a store).
2161*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in
2162*9880d681SAndroid Build Coastguard Workerdefm FMR   : XForm_26r<63, 72, (outs f4rc:$frD), (ins f4rc:$frB),
2163*9880d681SAndroid Build Coastguard Worker                       "fmr", "$frD, $frB", IIC_FPGeneral,
2164*9880d681SAndroid Build Coastguard Worker                       []>,  // (set f32:$frD, f32:$frB)
2165*9880d681SAndroid Build Coastguard Worker                       PPC970_Unit_Pseudo;
2166*9880d681SAndroid Build Coastguard Worker
2167*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 3, hasSideEffects = 0 in {  // FPU Operations.
2168*9880d681SAndroid Build Coastguard Worker// These are artificially split into two different forms, for 4/8 byte FP.
2169*9880d681SAndroid Build Coastguard Workerdefm FABSS  : XForm_26r<63, 264, (outs f4rc:$frD), (ins f4rc:$frB),
2170*9880d681SAndroid Build Coastguard Worker                        "fabs", "$frD, $frB", IIC_FPGeneral,
2171*9880d681SAndroid Build Coastguard Worker                        [(set f32:$frD, (fabs f32:$frB))]>;
2172*9880d681SAndroid Build Coastguard Workerlet Interpretation64Bit = 1, isCodeGenOnly = 1 in
2173*9880d681SAndroid Build Coastguard Workerdefm FABSD  : XForm_26r<63, 264, (outs f8rc:$frD), (ins f8rc:$frB),
2174*9880d681SAndroid Build Coastguard Worker                        "fabs", "$frD, $frB", IIC_FPGeneral,
2175*9880d681SAndroid Build Coastguard Worker                        [(set f64:$frD, (fabs f64:$frB))]>;
2176*9880d681SAndroid Build Coastguard Workerdefm FNABSS : XForm_26r<63, 136, (outs f4rc:$frD), (ins f4rc:$frB),
2177*9880d681SAndroid Build Coastguard Worker                        "fnabs", "$frD, $frB", IIC_FPGeneral,
2178*9880d681SAndroid Build Coastguard Worker                        [(set f32:$frD, (fneg (fabs f32:$frB)))]>;
2179*9880d681SAndroid Build Coastguard Workerlet Interpretation64Bit = 1, isCodeGenOnly = 1 in
2180*9880d681SAndroid Build Coastguard Workerdefm FNABSD : XForm_26r<63, 136, (outs f8rc:$frD), (ins f8rc:$frB),
2181*9880d681SAndroid Build Coastguard Worker                        "fnabs", "$frD, $frB", IIC_FPGeneral,
2182*9880d681SAndroid Build Coastguard Worker                        [(set f64:$frD, (fneg (fabs f64:$frB)))]>;
2183*9880d681SAndroid Build Coastguard Workerdefm FNEGS  : XForm_26r<63, 40, (outs f4rc:$frD), (ins f4rc:$frB),
2184*9880d681SAndroid Build Coastguard Worker                        "fneg", "$frD, $frB", IIC_FPGeneral,
2185*9880d681SAndroid Build Coastguard Worker                        [(set f32:$frD, (fneg f32:$frB))]>;
2186*9880d681SAndroid Build Coastguard Workerlet Interpretation64Bit = 1, isCodeGenOnly = 1 in
2187*9880d681SAndroid Build Coastguard Workerdefm FNEGD  : XForm_26r<63, 40, (outs f8rc:$frD), (ins f8rc:$frB),
2188*9880d681SAndroid Build Coastguard Worker                        "fneg", "$frD, $frB", IIC_FPGeneral,
2189*9880d681SAndroid Build Coastguard Worker                        [(set f64:$frD, (fneg f64:$frB))]>;
2190*9880d681SAndroid Build Coastguard Worker
2191*9880d681SAndroid Build Coastguard Workerdefm FCPSGNS : XForm_28r<63, 8, (outs f4rc:$frD), (ins f4rc:$frA, f4rc:$frB),
2192*9880d681SAndroid Build Coastguard Worker                        "fcpsgn", "$frD, $frA, $frB", IIC_FPGeneral,
2193*9880d681SAndroid Build Coastguard Worker                        [(set f32:$frD, (fcopysign f32:$frB, f32:$frA))]>;
2194*9880d681SAndroid Build Coastguard Workerlet Interpretation64Bit = 1, isCodeGenOnly = 1 in
2195*9880d681SAndroid Build Coastguard Workerdefm FCPSGND : XForm_28r<63, 8, (outs f8rc:$frD), (ins f8rc:$frA, f8rc:$frB),
2196*9880d681SAndroid Build Coastguard Worker                        "fcpsgn", "$frD, $frA, $frB", IIC_FPGeneral,
2197*9880d681SAndroid Build Coastguard Worker                        [(set f64:$frD, (fcopysign f64:$frB, f64:$frA))]>;
2198*9880d681SAndroid Build Coastguard Worker
2199*9880d681SAndroid Build Coastguard Worker// Reciprocal estimates.
2200*9880d681SAndroid Build Coastguard Workerdefm FRE      : XForm_26r<63, 24, (outs f8rc:$frD), (ins f8rc:$frB),
2201*9880d681SAndroid Build Coastguard Worker                          "fre", "$frD, $frB", IIC_FPGeneral,
2202*9880d681SAndroid Build Coastguard Worker                          [(set f64:$frD, (PPCfre f64:$frB))]>;
2203*9880d681SAndroid Build Coastguard Workerdefm FRES     : XForm_26r<59, 24, (outs f4rc:$frD), (ins f4rc:$frB),
2204*9880d681SAndroid Build Coastguard Worker                          "fres", "$frD, $frB", IIC_FPGeneral,
2205*9880d681SAndroid Build Coastguard Worker                          [(set f32:$frD, (PPCfre f32:$frB))]>;
2206*9880d681SAndroid Build Coastguard Workerdefm FRSQRTE  : XForm_26r<63, 26, (outs f8rc:$frD), (ins f8rc:$frB),
2207*9880d681SAndroid Build Coastguard Worker                          "frsqrte", "$frD, $frB", IIC_FPGeneral,
2208*9880d681SAndroid Build Coastguard Worker                          [(set f64:$frD, (PPCfrsqrte f64:$frB))]>;
2209*9880d681SAndroid Build Coastguard Workerdefm FRSQRTES : XForm_26r<59, 26, (outs f4rc:$frD), (ins f4rc:$frB),
2210*9880d681SAndroid Build Coastguard Worker                          "frsqrtes", "$frD, $frB", IIC_FPGeneral,
2211*9880d681SAndroid Build Coastguard Worker                          [(set f32:$frD, (PPCfrsqrte f32:$frB))]>;
2212*9880d681SAndroid Build Coastguard Worker}
2213*9880d681SAndroid Build Coastguard Worker
2214*9880d681SAndroid Build Coastguard Worker// XL-Form instructions.  condition register logical ops.
2215*9880d681SAndroid Build Coastguard Worker//
2216*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in
2217*9880d681SAndroid Build Coastguard Workerdef MCRF   : XLForm_3<19, 0, (outs crrc:$BF), (ins crrc:$BFA),
2218*9880d681SAndroid Build Coastguard Worker                      "mcrf $BF, $BFA", IIC_BrMCR>,
2219*9880d681SAndroid Build Coastguard Worker             PPC970_DGroup_First, PPC970_Unit_CRU;
2220*9880d681SAndroid Build Coastguard Worker
2221*9880d681SAndroid Build Coastguard Worker// FIXME: According to the ISA (section 2.5.1 of version 2.06), the
2222*9880d681SAndroid Build Coastguard Worker// condition-register logical instructions have preferred forms. Specifically,
2223*9880d681SAndroid Build Coastguard Worker// it is preferred that the bit specified by the BT field be in the same
2224*9880d681SAndroid Build Coastguard Worker// condition register as that specified by the bit BB. We might want to account
2225*9880d681SAndroid Build Coastguard Worker// for this via hinting the register allocator and anti-dep breakers, or we
2226*9880d681SAndroid Build Coastguard Worker// could constrain the register class to force this constraint and then loosen
2227*9880d681SAndroid Build Coastguard Worker// it during register allocation via convertToThreeAddress or some similar
2228*9880d681SAndroid Build Coastguard Worker// mechanism.
2229*9880d681SAndroid Build Coastguard Worker
2230*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in {
2231*9880d681SAndroid Build Coastguard Workerdef CRAND  : XLForm_1<19, 257, (outs crbitrc:$CRD),
2232*9880d681SAndroid Build Coastguard Worker                               (ins crbitrc:$CRA, crbitrc:$CRB),
2233*9880d681SAndroid Build Coastguard Worker                      "crand $CRD, $CRA, $CRB", IIC_BrCR,
2234*9880d681SAndroid Build Coastguard Worker                      [(set i1:$CRD, (and i1:$CRA, i1:$CRB))]>;
2235*9880d681SAndroid Build Coastguard Worker
2236*9880d681SAndroid Build Coastguard Workerdef CRNAND : XLForm_1<19, 225, (outs crbitrc:$CRD),
2237*9880d681SAndroid Build Coastguard Worker                               (ins crbitrc:$CRA, crbitrc:$CRB),
2238*9880d681SAndroid Build Coastguard Worker                      "crnand $CRD, $CRA, $CRB", IIC_BrCR,
2239*9880d681SAndroid Build Coastguard Worker                      [(set i1:$CRD, (not (and i1:$CRA, i1:$CRB)))]>;
2240*9880d681SAndroid Build Coastguard Worker
2241*9880d681SAndroid Build Coastguard Workerdef CROR   : XLForm_1<19, 449, (outs crbitrc:$CRD),
2242*9880d681SAndroid Build Coastguard Worker                               (ins crbitrc:$CRA, crbitrc:$CRB),
2243*9880d681SAndroid Build Coastguard Worker                      "cror $CRD, $CRA, $CRB", IIC_BrCR,
2244*9880d681SAndroid Build Coastguard Worker                      [(set i1:$CRD, (or i1:$CRA, i1:$CRB))]>;
2245*9880d681SAndroid Build Coastguard Worker
2246*9880d681SAndroid Build Coastguard Workerdef CRXOR  : XLForm_1<19, 193, (outs crbitrc:$CRD),
2247*9880d681SAndroid Build Coastguard Worker                               (ins crbitrc:$CRA, crbitrc:$CRB),
2248*9880d681SAndroid Build Coastguard Worker                      "crxor $CRD, $CRA, $CRB", IIC_BrCR,
2249*9880d681SAndroid Build Coastguard Worker                      [(set i1:$CRD, (xor i1:$CRA, i1:$CRB))]>;
2250*9880d681SAndroid Build Coastguard Worker
2251*9880d681SAndroid Build Coastguard Workerdef CRNOR  : XLForm_1<19, 33, (outs crbitrc:$CRD),
2252*9880d681SAndroid Build Coastguard Worker                              (ins crbitrc:$CRA, crbitrc:$CRB),
2253*9880d681SAndroid Build Coastguard Worker                      "crnor $CRD, $CRA, $CRB", IIC_BrCR,
2254*9880d681SAndroid Build Coastguard Worker                      [(set i1:$CRD, (not (or i1:$CRA, i1:$CRB)))]>;
2255*9880d681SAndroid Build Coastguard Worker
2256*9880d681SAndroid Build Coastguard Workerdef CREQV  : XLForm_1<19, 289, (outs crbitrc:$CRD),
2257*9880d681SAndroid Build Coastguard Worker                               (ins crbitrc:$CRA, crbitrc:$CRB),
2258*9880d681SAndroid Build Coastguard Worker                      "creqv $CRD, $CRA, $CRB", IIC_BrCR,
2259*9880d681SAndroid Build Coastguard Worker                      [(set i1:$CRD, (not (xor i1:$CRA, i1:$CRB)))]>;
2260*9880d681SAndroid Build Coastguard Worker} // isCommutable
2261*9880d681SAndroid Build Coastguard Worker
2262*9880d681SAndroid Build Coastguard Workerdef CRANDC : XLForm_1<19, 129, (outs crbitrc:$CRD),
2263*9880d681SAndroid Build Coastguard Worker                               (ins crbitrc:$CRA, crbitrc:$CRB),
2264*9880d681SAndroid Build Coastguard Worker                      "crandc $CRD, $CRA, $CRB", IIC_BrCR,
2265*9880d681SAndroid Build Coastguard Worker                      [(set i1:$CRD, (and i1:$CRA, (not i1:$CRB)))]>;
2266*9880d681SAndroid Build Coastguard Worker
2267*9880d681SAndroid Build Coastguard Workerdef CRORC  : XLForm_1<19, 417, (outs crbitrc:$CRD),
2268*9880d681SAndroid Build Coastguard Worker                               (ins crbitrc:$CRA, crbitrc:$CRB),
2269*9880d681SAndroid Build Coastguard Worker                      "crorc $CRD, $CRA, $CRB", IIC_BrCR,
2270*9880d681SAndroid Build Coastguard Worker                      [(set i1:$CRD, (or i1:$CRA, (not i1:$CRB)))]>;
2271*9880d681SAndroid Build Coastguard Worker
2272*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in {
2273*9880d681SAndroid Build Coastguard Workerdef CRSET  : XLForm_1_ext<19, 289, (outs crbitrc:$dst), (ins),
2274*9880d681SAndroid Build Coastguard Worker              "creqv $dst, $dst, $dst", IIC_BrCR,
2275*9880d681SAndroid Build Coastguard Worker              [(set i1:$dst, 1)]>;
2276*9880d681SAndroid Build Coastguard Worker
2277*9880d681SAndroid Build Coastguard Workerdef CRUNSET: XLForm_1_ext<19, 193, (outs crbitrc:$dst), (ins),
2278*9880d681SAndroid Build Coastguard Worker              "crxor $dst, $dst, $dst", IIC_BrCR,
2279*9880d681SAndroid Build Coastguard Worker              [(set i1:$dst, 0)]>;
2280*9880d681SAndroid Build Coastguard Worker
2281*9880d681SAndroid Build Coastguard Workerlet Defs = [CR1EQ], CRD = 6 in {
2282*9880d681SAndroid Build Coastguard Workerdef CR6SET  : XLForm_1_ext<19, 289, (outs), (ins),
2283*9880d681SAndroid Build Coastguard Worker              "creqv 6, 6, 6", IIC_BrCR,
2284*9880d681SAndroid Build Coastguard Worker              [(PPCcr6set)]>;
2285*9880d681SAndroid Build Coastguard Worker
2286*9880d681SAndroid Build Coastguard Workerdef CR6UNSET: XLForm_1_ext<19, 193, (outs), (ins),
2287*9880d681SAndroid Build Coastguard Worker              "crxor 6, 6, 6", IIC_BrCR,
2288*9880d681SAndroid Build Coastguard Worker              [(PPCcr6unset)]>;
2289*9880d681SAndroid Build Coastguard Worker}
2290*9880d681SAndroid Build Coastguard Worker}
2291*9880d681SAndroid Build Coastguard Worker
2292*9880d681SAndroid Build Coastguard Worker// XFX-Form instructions.  Instructions that deal with SPRs.
2293*9880d681SAndroid Build Coastguard Worker//
2294*9880d681SAndroid Build Coastguard Worker
2295*9880d681SAndroid Build Coastguard Workerdef MFSPR : XFXForm_1<31, 339, (outs gprc:$RT), (ins i32imm:$SPR),
2296*9880d681SAndroid Build Coastguard Worker                      "mfspr $RT, $SPR", IIC_SprMFSPR>;
2297*9880d681SAndroid Build Coastguard Workerdef MTSPR : XFXForm_1<31, 467, (outs), (ins i32imm:$SPR, gprc:$RT),
2298*9880d681SAndroid Build Coastguard Worker                      "mtspr $SPR, $RT", IIC_SprMTSPR>;
2299*9880d681SAndroid Build Coastguard Worker
2300*9880d681SAndroid Build Coastguard Workerdef MFTB : XFXForm_1<31, 371, (outs gprc:$RT), (ins i32imm:$SPR),
2301*9880d681SAndroid Build Coastguard Worker                     "mftb $RT, $SPR", IIC_SprMFTB>;
2302*9880d681SAndroid Build Coastguard Worker
2303*9880d681SAndroid Build Coastguard Worker// A pseudo-instruction used to implement the read of the 64-bit cycle counter
2304*9880d681SAndroid Build Coastguard Worker// on a 32-bit target.
2305*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1, usesCustomInserter = 1 in
2306*9880d681SAndroid Build Coastguard Workerdef ReadTB : Pseudo<(outs gprc:$lo, gprc:$hi), (ins),
2307*9880d681SAndroid Build Coastguard Worker                    "#ReadTB", []>;
2308*9880d681SAndroid Build Coastguard Worker
2309*9880d681SAndroid Build Coastguard Workerlet Uses = [CTR] in {
2310*9880d681SAndroid Build Coastguard Workerdef MFCTR : XFXForm_1_ext<31, 339, 9, (outs gprc:$rT), (ins),
2311*9880d681SAndroid Build Coastguard Worker                          "mfctr $rT", IIC_SprMFSPR>,
2312*9880d681SAndroid Build Coastguard Worker            PPC970_DGroup_First, PPC970_Unit_FXU;
2313*9880d681SAndroid Build Coastguard Worker}
2314*9880d681SAndroid Build Coastguard Workerlet Defs = [CTR], Pattern = [(PPCmtctr i32:$rS)] in {
2315*9880d681SAndroid Build Coastguard Workerdef MTCTR : XFXForm_7_ext<31, 467, 9, (outs), (ins gprc:$rS),
2316*9880d681SAndroid Build Coastguard Worker                          "mtctr $rS", IIC_SprMTSPR>,
2317*9880d681SAndroid Build Coastguard Worker            PPC970_DGroup_First, PPC970_Unit_FXU;
2318*9880d681SAndroid Build Coastguard Worker}
2319*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1, isCodeGenOnly = 1, Defs = [CTR] in {
2320*9880d681SAndroid Build Coastguard Workerlet Pattern = [(int_ppc_mtctr i32:$rS)] in
2321*9880d681SAndroid Build Coastguard Workerdef MTCTRloop : XFXForm_7_ext<31, 467, 9, (outs), (ins gprc:$rS),
2322*9880d681SAndroid Build Coastguard Worker                              "mtctr $rS", IIC_SprMTSPR>,
2323*9880d681SAndroid Build Coastguard Worker                PPC970_DGroup_First, PPC970_Unit_FXU;
2324*9880d681SAndroid Build Coastguard Worker}
2325*9880d681SAndroid Build Coastguard Worker
2326*9880d681SAndroid Build Coastguard Workerlet Defs = [LR] in {
2327*9880d681SAndroid Build Coastguard Workerdef MTLR  : XFXForm_7_ext<31, 467, 8, (outs), (ins gprc:$rS),
2328*9880d681SAndroid Build Coastguard Worker                          "mtlr $rS", IIC_SprMTSPR>,
2329*9880d681SAndroid Build Coastguard Worker            PPC970_DGroup_First, PPC970_Unit_FXU;
2330*9880d681SAndroid Build Coastguard Worker}
2331*9880d681SAndroid Build Coastguard Workerlet Uses = [LR] in {
2332*9880d681SAndroid Build Coastguard Workerdef MFLR  : XFXForm_1_ext<31, 339, 8, (outs gprc:$rT), (ins),
2333*9880d681SAndroid Build Coastguard Worker                          "mflr $rT", IIC_SprMFSPR>,
2334*9880d681SAndroid Build Coastguard Worker            PPC970_DGroup_First, PPC970_Unit_FXU;
2335*9880d681SAndroid Build Coastguard Worker}
2336*9880d681SAndroid Build Coastguard Worker
2337*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in {
2338*9880d681SAndroid Build Coastguard Worker  // Move to/from VRSAVE: despite being a SPR, the VRSAVE register is renamed
2339*9880d681SAndroid Build Coastguard Worker  // like a GPR on the PPC970.  As such, copies in and out have the same
2340*9880d681SAndroid Build Coastguard Worker  // performance characteristics as an OR instruction.
2341*9880d681SAndroid Build Coastguard Worker  def MTVRSAVE : XFXForm_7_ext<31, 467, 256, (outs), (ins gprc:$rS),
2342*9880d681SAndroid Build Coastguard Worker                               "mtspr 256, $rS", IIC_IntGeneral>,
2343*9880d681SAndroid Build Coastguard Worker                 PPC970_DGroup_Single, PPC970_Unit_FXU;
2344*9880d681SAndroid Build Coastguard Worker  def MFVRSAVE : XFXForm_1_ext<31, 339, 256, (outs gprc:$rT), (ins),
2345*9880d681SAndroid Build Coastguard Worker                               "mfspr $rT, 256", IIC_IntGeneral>,
2346*9880d681SAndroid Build Coastguard Worker                 PPC970_DGroup_First, PPC970_Unit_FXU;
2347*9880d681SAndroid Build Coastguard Worker
2348*9880d681SAndroid Build Coastguard Worker  def MTVRSAVEv : XFXForm_7_ext<31, 467, 256,
2349*9880d681SAndroid Build Coastguard Worker                                (outs VRSAVERC:$reg), (ins gprc:$rS),
2350*9880d681SAndroid Build Coastguard Worker                                "mtspr 256, $rS", IIC_IntGeneral>,
2351*9880d681SAndroid Build Coastguard Worker                  PPC970_DGroup_Single, PPC970_Unit_FXU;
2352*9880d681SAndroid Build Coastguard Worker  def MFVRSAVEv : XFXForm_1_ext<31, 339, 256, (outs gprc:$rT),
2353*9880d681SAndroid Build Coastguard Worker                                (ins VRSAVERC:$reg),
2354*9880d681SAndroid Build Coastguard Worker                                "mfspr $rT, 256", IIC_IntGeneral>,
2355*9880d681SAndroid Build Coastguard Worker                  PPC970_DGroup_First, PPC970_Unit_FXU;
2356*9880d681SAndroid Build Coastguard Worker}
2357*9880d681SAndroid Build Coastguard Worker
2358*9880d681SAndroid Build Coastguard Worker// Aliases for mtvrsave/mfvrsave to mfspr/mtspr.
2359*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtvrsave $rS", (MTVRSAVE gprc:$rS)>;
2360*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfvrsave $rS", (MFVRSAVE gprc:$rS)>;
2361*9880d681SAndroid Build Coastguard Worker
2362*9880d681SAndroid Build Coastguard Worker// SPILL_VRSAVE - Indicate that we're dumping the VRSAVE register,
2363*9880d681SAndroid Build Coastguard Worker// so we'll need to scavenge a register for it.
2364*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in
2365*9880d681SAndroid Build Coastguard Workerdef SPILL_VRSAVE : Pseudo<(outs), (ins VRSAVERC:$vrsave, memri:$F),
2366*9880d681SAndroid Build Coastguard Worker                     "#SPILL_VRSAVE", []>;
2367*9880d681SAndroid Build Coastguard Worker
2368*9880d681SAndroid Build Coastguard Worker// RESTORE_VRSAVE - Indicate that we're restoring the VRSAVE register (previously
2369*9880d681SAndroid Build Coastguard Worker// spilled), so we'll need to scavenge a register for it.
2370*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in
2371*9880d681SAndroid Build Coastguard Workerdef RESTORE_VRSAVE : Pseudo<(outs VRSAVERC:$vrsave), (ins memri:$F),
2372*9880d681SAndroid Build Coastguard Worker                     "#RESTORE_VRSAVE", []>;
2373*9880d681SAndroid Build Coastguard Worker
2374*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in {
2375*9880d681SAndroid Build Coastguard Worker// mtocrf's input needs to be prepared by shifting by an amount dependent
2376*9880d681SAndroid Build Coastguard Worker// on the cr register selected. Thus, post-ra anti-dep breaking must not
2377*9880d681SAndroid Build Coastguard Worker// later change that register assignment.
2378*9880d681SAndroid Build Coastguard Workerlet hasExtraDefRegAllocReq = 1 in {
2379*9880d681SAndroid Build Coastguard Workerdef MTOCRF: XFXForm_5a<31, 144, (outs crbitm:$FXM), (ins gprc:$ST),
2380*9880d681SAndroid Build Coastguard Worker                       "mtocrf $FXM, $ST", IIC_BrMCRX>,
2381*9880d681SAndroid Build Coastguard Worker            PPC970_DGroup_First, PPC970_Unit_CRU;
2382*9880d681SAndroid Build Coastguard Worker
2383*9880d681SAndroid Build Coastguard Worker// Similarly to mtocrf, the mask for mtcrf must be prepared in a way that
2384*9880d681SAndroid Build Coastguard Worker// is dependent on the cr fields being set.
2385*9880d681SAndroid Build Coastguard Workerdef MTCRF : XFXForm_5<31, 144, (outs), (ins i32imm:$FXM, gprc:$rS),
2386*9880d681SAndroid Build Coastguard Worker                      "mtcrf $FXM, $rS", IIC_BrMCRX>,
2387*9880d681SAndroid Build Coastguard Worker            PPC970_MicroCode, PPC970_Unit_CRU;
2388*9880d681SAndroid Build Coastguard Worker} // hasExtraDefRegAllocReq = 1
2389*9880d681SAndroid Build Coastguard Worker
2390*9880d681SAndroid Build Coastguard Worker// mfocrf's input needs to be prepared by shifting by an amount dependent
2391*9880d681SAndroid Build Coastguard Worker// on the cr register selected. Thus, post-ra anti-dep breaking must not
2392*9880d681SAndroid Build Coastguard Worker// later change that register assignment.
2393*9880d681SAndroid Build Coastguard Workerlet hasExtraSrcRegAllocReq = 1 in {
2394*9880d681SAndroid Build Coastguard Workerdef MFOCRF: XFXForm_5a<31, 19, (outs gprc:$rT), (ins crbitm:$FXM),
2395*9880d681SAndroid Build Coastguard Worker                       "mfocrf $rT, $FXM", IIC_SprMFCRF>,
2396*9880d681SAndroid Build Coastguard Worker            PPC970_DGroup_First, PPC970_Unit_CRU;
2397*9880d681SAndroid Build Coastguard Worker
2398*9880d681SAndroid Build Coastguard Worker// Similarly to mfocrf, the mask for mfcrf must be prepared in a way that
2399*9880d681SAndroid Build Coastguard Worker// is dependent on the cr fields being copied.
2400*9880d681SAndroid Build Coastguard Workerdef MFCR : XFXForm_3<31, 19, (outs gprc:$rT), (ins),
2401*9880d681SAndroid Build Coastguard Worker                     "mfcr $rT", IIC_SprMFCR>,
2402*9880d681SAndroid Build Coastguard Worker                     PPC970_MicroCode, PPC970_Unit_CRU;
2403*9880d681SAndroid Build Coastguard Worker} // hasExtraSrcRegAllocReq = 1
2404*9880d681SAndroid Build Coastguard Worker
2405*9880d681SAndroid Build Coastguard Workerdef MCRXRX : X_BF3<31, 576, (outs crrc:$BF), (ins),
2406*9880d681SAndroid Build Coastguard Worker                   "mcrxrx $BF", IIC_BrMCRX>, Requires<[IsISA3_0]>;
2407*9880d681SAndroid Build Coastguard Worker} // hasSideEffects = 0
2408*9880d681SAndroid Build Coastguard Worker
2409*9880d681SAndroid Build Coastguard Worker// Pseudo instruction to perform FADD in round-to-zero mode.
2410*9880d681SAndroid Build Coastguard Workerlet usesCustomInserter = 1, Uses = [RM] in {
2411*9880d681SAndroid Build Coastguard Worker  def FADDrtz: Pseudo<(outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRB), "",
2412*9880d681SAndroid Build Coastguard Worker                      [(set f64:$FRT, (PPCfaddrtz f64:$FRA, f64:$FRB))]>;
2413*9880d681SAndroid Build Coastguard Worker}
2414*9880d681SAndroid Build Coastguard Worker
2415*9880d681SAndroid Build Coastguard Worker// The above pseudo gets expanded to make use of the following instructions
2416*9880d681SAndroid Build Coastguard Worker// to manipulate FPSCR.  Note that FPSCR is not modeled at the DAG level.
2417*9880d681SAndroid Build Coastguard Workerlet Uses = [RM], Defs = [RM] in {
2418*9880d681SAndroid Build Coastguard Worker  def MTFSB0 : XForm_43<63, 70, (outs), (ins u5imm:$FM),
2419*9880d681SAndroid Build Coastguard Worker                        "mtfsb0 $FM", IIC_IntMTFSB0, []>,
2420*9880d681SAndroid Build Coastguard Worker               PPC970_DGroup_Single, PPC970_Unit_FPU;
2421*9880d681SAndroid Build Coastguard Worker  def MTFSB1 : XForm_43<63, 38, (outs), (ins u5imm:$FM),
2422*9880d681SAndroid Build Coastguard Worker                        "mtfsb1 $FM", IIC_IntMTFSB0, []>,
2423*9880d681SAndroid Build Coastguard Worker               PPC970_DGroup_Single, PPC970_Unit_FPU;
2424*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
2425*9880d681SAndroid Build Coastguard Worker  def MTFSFb  : XFLForm<63, 711, (outs), (ins i32imm:$FM, f8rc:$rT),
2426*9880d681SAndroid Build Coastguard Worker                        "mtfsf $FM, $rT", IIC_IntMTFSB0, []>,
2427*9880d681SAndroid Build Coastguard Worker                PPC970_DGroup_Single, PPC970_Unit_FPU;
2428*9880d681SAndroid Build Coastguard Worker}
2429*9880d681SAndroid Build Coastguard Workerlet Uses = [RM] in {
2430*9880d681SAndroid Build Coastguard Worker  def MFFS   : XForm_42<63, 583, (outs f8rc:$rT), (ins),
2431*9880d681SAndroid Build Coastguard Worker                         "mffs $rT", IIC_IntMFFS,
2432*9880d681SAndroid Build Coastguard Worker                         [(set f64:$rT, (PPCmffs))]>,
2433*9880d681SAndroid Build Coastguard Worker               PPC970_DGroup_Single, PPC970_Unit_FPU;
2434*9880d681SAndroid Build Coastguard Worker
2435*9880d681SAndroid Build Coastguard Worker  let Defs = [CR1] in
2436*9880d681SAndroid Build Coastguard Worker  def MFFSo : XForm_42<63, 583, (outs f8rc:$rT), (ins),
2437*9880d681SAndroid Build Coastguard Worker                      "mffs. $rT", IIC_IntMFFS, []>, isDOT;
2438*9880d681SAndroid Build Coastguard Worker}
2439*9880d681SAndroid Build Coastguard Worker
2440*9880d681SAndroid Build Coastguard Worker
2441*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 1, hasSideEffects = 0 in {  // FXU Operations.
2442*9880d681SAndroid Build Coastguard Worker// XO-Form instructions.  Arithmetic instructions that can set overflow bit
2443*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in
2444*9880d681SAndroid Build Coastguard Workerdefm ADD4  : XOForm_1r<31, 266, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2445*9880d681SAndroid Build Coastguard Worker                       "add", "$rT, $rA, $rB", IIC_IntSimple,
2446*9880d681SAndroid Build Coastguard Worker                       [(set i32:$rT, (add i32:$rA, i32:$rB))]>;
2447*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in
2448*9880d681SAndroid Build Coastguard Workerdef ADD4TLS  : XOForm_1<31, 266, 0, (outs gprc:$rT), (ins gprc:$rA, tlsreg32:$rB),
2449*9880d681SAndroid Build Coastguard Worker                       "add $rT, $rA, $rB", IIC_IntSimple,
2450*9880d681SAndroid Build Coastguard Worker                       [(set i32:$rT, (add i32:$rA, tglobaltlsaddr:$rB))]>;
2451*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in
2452*9880d681SAndroid Build Coastguard Workerdefm ADDC  : XOForm_1rc<31, 10, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2453*9880d681SAndroid Build Coastguard Worker                        "addc", "$rT, $rA, $rB", IIC_IntGeneral,
2454*9880d681SAndroid Build Coastguard Worker                        [(set i32:$rT, (addc i32:$rA, i32:$rB))]>,
2455*9880d681SAndroid Build Coastguard Worker                        PPC970_DGroup_Cracked;
2456*9880d681SAndroid Build Coastguard Worker
2457*9880d681SAndroid Build Coastguard Workerdefm DIVW  : XOForm_1rcr<31, 491, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2458*9880d681SAndroid Build Coastguard Worker                          "divw", "$rT, $rA, $rB", IIC_IntDivW,
2459*9880d681SAndroid Build Coastguard Worker                          [(set i32:$rT, (sdiv i32:$rA, i32:$rB))]>;
2460*9880d681SAndroid Build Coastguard Workerdefm DIVWU : XOForm_1rcr<31, 459, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2461*9880d681SAndroid Build Coastguard Worker                          "divwu", "$rT, $rA, $rB", IIC_IntDivW,
2462*9880d681SAndroid Build Coastguard Worker                          [(set i32:$rT, (udiv i32:$rA, i32:$rB))]>;
2463*9880d681SAndroid Build Coastguard Workerdef DIVWE : XOForm_1<31, 427, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2464*9880d681SAndroid Build Coastguard Worker                     "divwe $rT, $rA, $rB", IIC_IntDivW,
2465*9880d681SAndroid Build Coastguard Worker                     [(set i32:$rT, (int_ppc_divwe gprc:$rA, gprc:$rB))]>,
2466*9880d681SAndroid Build Coastguard Worker                     Requires<[HasExtDiv]>;
2467*9880d681SAndroid Build Coastguard Workerlet Defs = [CR0] in
2468*9880d681SAndroid Build Coastguard Workerdef DIVWEo : XOForm_1<31, 427, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2469*9880d681SAndroid Build Coastguard Worker                      "divwe. $rT, $rA, $rB", IIC_IntDivW,
2470*9880d681SAndroid Build Coastguard Worker                      []>, isDOT, PPC970_DGroup_Cracked, PPC970_DGroup_First,
2471*9880d681SAndroid Build Coastguard Worker                      Requires<[HasExtDiv]>;
2472*9880d681SAndroid Build Coastguard Workerdef DIVWEU : XOForm_1<31, 395, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2473*9880d681SAndroid Build Coastguard Worker                      "divweu $rT, $rA, $rB", IIC_IntDivW,
2474*9880d681SAndroid Build Coastguard Worker                      [(set i32:$rT, (int_ppc_divweu gprc:$rA, gprc:$rB))]>,
2475*9880d681SAndroid Build Coastguard Worker                      Requires<[HasExtDiv]>;
2476*9880d681SAndroid Build Coastguard Workerlet Defs = [CR0] in
2477*9880d681SAndroid Build Coastguard Workerdef DIVWEUo : XOForm_1<31, 395, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2478*9880d681SAndroid Build Coastguard Worker                       "divweu. $rT, $rA, $rB", IIC_IntDivW,
2479*9880d681SAndroid Build Coastguard Worker                       []>, isDOT, PPC970_DGroup_Cracked, PPC970_DGroup_First,
2480*9880d681SAndroid Build Coastguard Worker                       Requires<[HasExtDiv]>;
2481*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in {
2482*9880d681SAndroid Build Coastguard Workerdefm MULHW : XOForm_1r<31, 75, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2483*9880d681SAndroid Build Coastguard Worker                       "mulhw", "$rT, $rA, $rB", IIC_IntMulHW,
2484*9880d681SAndroid Build Coastguard Worker                       [(set i32:$rT, (mulhs i32:$rA, i32:$rB))]>;
2485*9880d681SAndroid Build Coastguard Workerdefm MULHWU : XOForm_1r<31, 11, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2486*9880d681SAndroid Build Coastguard Worker                       "mulhwu", "$rT, $rA, $rB", IIC_IntMulHWU,
2487*9880d681SAndroid Build Coastguard Worker                       [(set i32:$rT, (mulhu i32:$rA, i32:$rB))]>;
2488*9880d681SAndroid Build Coastguard Workerdefm MULLW : XOForm_1r<31, 235, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2489*9880d681SAndroid Build Coastguard Worker                       "mullw", "$rT, $rA, $rB", IIC_IntMulHW,
2490*9880d681SAndroid Build Coastguard Worker                       [(set i32:$rT, (mul i32:$rA, i32:$rB))]>;
2491*9880d681SAndroid Build Coastguard Worker} // isCommutable
2492*9880d681SAndroid Build Coastguard Workerdefm SUBF  : XOForm_1r<31, 40, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2493*9880d681SAndroid Build Coastguard Worker                       "subf", "$rT, $rA, $rB", IIC_IntGeneral,
2494*9880d681SAndroid Build Coastguard Worker                       [(set i32:$rT, (sub i32:$rB, i32:$rA))]>;
2495*9880d681SAndroid Build Coastguard Workerdefm SUBFC : XOForm_1rc<31, 8, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2496*9880d681SAndroid Build Coastguard Worker                        "subfc", "$rT, $rA, $rB", IIC_IntGeneral,
2497*9880d681SAndroid Build Coastguard Worker                        [(set i32:$rT, (subc i32:$rB, i32:$rA))]>,
2498*9880d681SAndroid Build Coastguard Worker                        PPC970_DGroup_Cracked;
2499*9880d681SAndroid Build Coastguard Workerdefm NEG    : XOForm_3r<31, 104, 0, (outs gprc:$rT), (ins gprc:$rA),
2500*9880d681SAndroid Build Coastguard Worker                        "neg", "$rT, $rA", IIC_IntSimple,
2501*9880d681SAndroid Build Coastguard Worker                        [(set i32:$rT, (ineg i32:$rA))]>;
2502*9880d681SAndroid Build Coastguard Workerlet Uses = [CARRY] in {
2503*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in
2504*9880d681SAndroid Build Coastguard Workerdefm ADDE  : XOForm_1rc<31, 138, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2505*9880d681SAndroid Build Coastguard Worker                        "adde", "$rT, $rA, $rB", IIC_IntGeneral,
2506*9880d681SAndroid Build Coastguard Worker                        [(set i32:$rT, (adde i32:$rA, i32:$rB))]>;
2507*9880d681SAndroid Build Coastguard Workerdefm ADDME  : XOForm_3rc<31, 234, 0, (outs gprc:$rT), (ins gprc:$rA),
2508*9880d681SAndroid Build Coastguard Worker                         "addme", "$rT, $rA", IIC_IntGeneral,
2509*9880d681SAndroid Build Coastguard Worker                         [(set i32:$rT, (adde i32:$rA, -1))]>;
2510*9880d681SAndroid Build Coastguard Workerdefm ADDZE  : XOForm_3rc<31, 202, 0, (outs gprc:$rT), (ins gprc:$rA),
2511*9880d681SAndroid Build Coastguard Worker                         "addze", "$rT, $rA", IIC_IntGeneral,
2512*9880d681SAndroid Build Coastguard Worker                         [(set i32:$rT, (adde i32:$rA, 0))]>;
2513*9880d681SAndroid Build Coastguard Workerdefm SUBFE : XOForm_1rc<31, 136, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2514*9880d681SAndroid Build Coastguard Worker                        "subfe", "$rT, $rA, $rB", IIC_IntGeneral,
2515*9880d681SAndroid Build Coastguard Worker                        [(set i32:$rT, (sube i32:$rB, i32:$rA))]>;
2516*9880d681SAndroid Build Coastguard Workerdefm SUBFME : XOForm_3rc<31, 232, 0, (outs gprc:$rT), (ins gprc:$rA),
2517*9880d681SAndroid Build Coastguard Worker                         "subfme", "$rT, $rA", IIC_IntGeneral,
2518*9880d681SAndroid Build Coastguard Worker                         [(set i32:$rT, (sube -1, i32:$rA))]>;
2519*9880d681SAndroid Build Coastguard Workerdefm SUBFZE : XOForm_3rc<31, 200, 0, (outs gprc:$rT), (ins gprc:$rA),
2520*9880d681SAndroid Build Coastguard Worker                         "subfze", "$rT, $rA", IIC_IntGeneral,
2521*9880d681SAndroid Build Coastguard Worker                         [(set i32:$rT, (sube 0, i32:$rA))]>;
2522*9880d681SAndroid Build Coastguard Worker}
2523*9880d681SAndroid Build Coastguard Worker}
2524*9880d681SAndroid Build Coastguard Worker
2525*9880d681SAndroid Build Coastguard Worker// A-Form instructions.  Most of the instructions executed in the FPU are of
2526*9880d681SAndroid Build Coastguard Worker// this type.
2527*9880d681SAndroid Build Coastguard Worker//
2528*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 3, hasSideEffects = 0 in {  // FPU Operations.
2529*9880d681SAndroid Build Coastguard Workerlet Uses = [RM] in {
2530*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in {
2531*9880d681SAndroid Build Coastguard Worker  defm FMADD : AForm_1r<63, 29,
2532*9880d681SAndroid Build Coastguard Worker                      (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRC, f8rc:$FRB),
2533*9880d681SAndroid Build Coastguard Worker                      "fmadd", "$FRT, $FRA, $FRC, $FRB", IIC_FPFused,
2534*9880d681SAndroid Build Coastguard Worker                      [(set f64:$FRT, (fma f64:$FRA, f64:$FRC, f64:$FRB))]>;
2535*9880d681SAndroid Build Coastguard Worker  defm FMADDS : AForm_1r<59, 29,
2536*9880d681SAndroid Build Coastguard Worker                      (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRC, f4rc:$FRB),
2537*9880d681SAndroid Build Coastguard Worker                      "fmadds", "$FRT, $FRA, $FRC, $FRB", IIC_FPGeneral,
2538*9880d681SAndroid Build Coastguard Worker                      [(set f32:$FRT, (fma f32:$FRA, f32:$FRC, f32:$FRB))]>;
2539*9880d681SAndroid Build Coastguard Worker  defm FMSUB : AForm_1r<63, 28,
2540*9880d681SAndroid Build Coastguard Worker                      (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRC, f8rc:$FRB),
2541*9880d681SAndroid Build Coastguard Worker                      "fmsub", "$FRT, $FRA, $FRC, $FRB", IIC_FPFused,
2542*9880d681SAndroid Build Coastguard Worker                      [(set f64:$FRT,
2543*9880d681SAndroid Build Coastguard Worker                            (fma f64:$FRA, f64:$FRC, (fneg f64:$FRB)))]>;
2544*9880d681SAndroid Build Coastguard Worker  defm FMSUBS : AForm_1r<59, 28,
2545*9880d681SAndroid Build Coastguard Worker                      (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRC, f4rc:$FRB),
2546*9880d681SAndroid Build Coastguard Worker                      "fmsubs", "$FRT, $FRA, $FRC, $FRB", IIC_FPGeneral,
2547*9880d681SAndroid Build Coastguard Worker                      [(set f32:$FRT,
2548*9880d681SAndroid Build Coastguard Worker                            (fma f32:$FRA, f32:$FRC, (fneg f32:$FRB)))]>;
2549*9880d681SAndroid Build Coastguard Worker  defm FNMADD : AForm_1r<63, 31,
2550*9880d681SAndroid Build Coastguard Worker                      (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRC, f8rc:$FRB),
2551*9880d681SAndroid Build Coastguard Worker                      "fnmadd", "$FRT, $FRA, $FRC, $FRB", IIC_FPFused,
2552*9880d681SAndroid Build Coastguard Worker                      [(set f64:$FRT,
2553*9880d681SAndroid Build Coastguard Worker                            (fneg (fma f64:$FRA, f64:$FRC, f64:$FRB)))]>;
2554*9880d681SAndroid Build Coastguard Worker  defm FNMADDS : AForm_1r<59, 31,
2555*9880d681SAndroid Build Coastguard Worker                      (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRC, f4rc:$FRB),
2556*9880d681SAndroid Build Coastguard Worker                      "fnmadds", "$FRT, $FRA, $FRC, $FRB", IIC_FPGeneral,
2557*9880d681SAndroid Build Coastguard Worker                      [(set f32:$FRT,
2558*9880d681SAndroid Build Coastguard Worker                            (fneg (fma f32:$FRA, f32:$FRC, f32:$FRB)))]>;
2559*9880d681SAndroid Build Coastguard Worker  defm FNMSUB : AForm_1r<63, 30,
2560*9880d681SAndroid Build Coastguard Worker                      (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRC, f8rc:$FRB),
2561*9880d681SAndroid Build Coastguard Worker                      "fnmsub", "$FRT, $FRA, $FRC, $FRB", IIC_FPFused,
2562*9880d681SAndroid Build Coastguard Worker                      [(set f64:$FRT, (fneg (fma f64:$FRA, f64:$FRC,
2563*9880d681SAndroid Build Coastguard Worker                                                 (fneg f64:$FRB))))]>;
2564*9880d681SAndroid Build Coastguard Worker  defm FNMSUBS : AForm_1r<59, 30,
2565*9880d681SAndroid Build Coastguard Worker                      (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRC, f4rc:$FRB),
2566*9880d681SAndroid Build Coastguard Worker                      "fnmsubs", "$FRT, $FRA, $FRC, $FRB", IIC_FPGeneral,
2567*9880d681SAndroid Build Coastguard Worker                      [(set f32:$FRT, (fneg (fma f32:$FRA, f32:$FRC,
2568*9880d681SAndroid Build Coastguard Worker                                                 (fneg f32:$FRB))))]>;
2569*9880d681SAndroid Build Coastguard Worker} // isCommutable
2570*9880d681SAndroid Build Coastguard Worker}
2571*9880d681SAndroid Build Coastguard Worker// FSEL is artificially split into 4 and 8-byte forms for the result.  To avoid
2572*9880d681SAndroid Build Coastguard Worker// having 4 of these, force the comparison to always be an 8-byte double (code
2573*9880d681SAndroid Build Coastguard Worker// should use an FMRSD if the input comparison value really wants to be a float)
2574*9880d681SAndroid Build Coastguard Worker// and 4/8 byte forms for the result and operand type..
2575*9880d681SAndroid Build Coastguard Workerlet Interpretation64Bit = 1, isCodeGenOnly = 1 in
2576*9880d681SAndroid Build Coastguard Workerdefm FSELD : AForm_1r<63, 23,
2577*9880d681SAndroid Build Coastguard Worker                      (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRC, f8rc:$FRB),
2578*9880d681SAndroid Build Coastguard Worker                      "fsel", "$FRT, $FRA, $FRC, $FRB", IIC_FPGeneral,
2579*9880d681SAndroid Build Coastguard Worker                      [(set f64:$FRT, (PPCfsel f64:$FRA, f64:$FRC, f64:$FRB))]>;
2580*9880d681SAndroid Build Coastguard Workerdefm FSELS : AForm_1r<63, 23,
2581*9880d681SAndroid Build Coastguard Worker                      (outs f4rc:$FRT), (ins f8rc:$FRA, f4rc:$FRC, f4rc:$FRB),
2582*9880d681SAndroid Build Coastguard Worker                      "fsel", "$FRT, $FRA, $FRC, $FRB", IIC_FPGeneral,
2583*9880d681SAndroid Build Coastguard Worker                      [(set f32:$FRT, (PPCfsel f64:$FRA, f32:$FRC, f32:$FRB))]>;
2584*9880d681SAndroid Build Coastguard Workerlet Uses = [RM] in {
2585*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in {
2586*9880d681SAndroid Build Coastguard Worker  defm FADD  : AForm_2r<63, 21,
2587*9880d681SAndroid Build Coastguard Worker                        (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRB),
2588*9880d681SAndroid Build Coastguard Worker                        "fadd", "$FRT, $FRA, $FRB", IIC_FPAddSub,
2589*9880d681SAndroid Build Coastguard Worker                        [(set f64:$FRT, (fadd f64:$FRA, f64:$FRB))]>;
2590*9880d681SAndroid Build Coastguard Worker  defm FADDS : AForm_2r<59, 21,
2591*9880d681SAndroid Build Coastguard Worker                        (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRB),
2592*9880d681SAndroid Build Coastguard Worker                        "fadds", "$FRT, $FRA, $FRB", IIC_FPGeneral,
2593*9880d681SAndroid Build Coastguard Worker                        [(set f32:$FRT, (fadd f32:$FRA, f32:$FRB))]>;
2594*9880d681SAndroid Build Coastguard Worker  } // isCommutable
2595*9880d681SAndroid Build Coastguard Worker  defm FDIV  : AForm_2r<63, 18,
2596*9880d681SAndroid Build Coastguard Worker                        (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRB),
2597*9880d681SAndroid Build Coastguard Worker                        "fdiv", "$FRT, $FRA, $FRB", IIC_FPDivD,
2598*9880d681SAndroid Build Coastguard Worker                        [(set f64:$FRT, (fdiv f64:$FRA, f64:$FRB))]>;
2599*9880d681SAndroid Build Coastguard Worker  defm FDIVS : AForm_2r<59, 18,
2600*9880d681SAndroid Build Coastguard Worker                        (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRB),
2601*9880d681SAndroid Build Coastguard Worker                        "fdivs", "$FRT, $FRA, $FRB", IIC_FPDivS,
2602*9880d681SAndroid Build Coastguard Worker                        [(set f32:$FRT, (fdiv f32:$FRA, f32:$FRB))]>;
2603*9880d681SAndroid Build Coastguard Worker  let isCommutable = 1 in {
2604*9880d681SAndroid Build Coastguard Worker  defm FMUL  : AForm_3r<63, 25,
2605*9880d681SAndroid Build Coastguard Worker                        (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRC),
2606*9880d681SAndroid Build Coastguard Worker                        "fmul", "$FRT, $FRA, $FRC", IIC_FPFused,
2607*9880d681SAndroid Build Coastguard Worker                        [(set f64:$FRT, (fmul f64:$FRA, f64:$FRC))]>;
2608*9880d681SAndroid Build Coastguard Worker  defm FMULS : AForm_3r<59, 25,
2609*9880d681SAndroid Build Coastguard Worker                        (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRC),
2610*9880d681SAndroid Build Coastguard Worker                        "fmuls", "$FRT, $FRA, $FRC", IIC_FPGeneral,
2611*9880d681SAndroid Build Coastguard Worker                        [(set f32:$FRT, (fmul f32:$FRA, f32:$FRC))]>;
2612*9880d681SAndroid Build Coastguard Worker  } // isCommutable
2613*9880d681SAndroid Build Coastguard Worker  defm FSUB  : AForm_2r<63, 20,
2614*9880d681SAndroid Build Coastguard Worker                        (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRB),
2615*9880d681SAndroid Build Coastguard Worker                        "fsub", "$FRT, $FRA, $FRB", IIC_FPAddSub,
2616*9880d681SAndroid Build Coastguard Worker                        [(set f64:$FRT, (fsub f64:$FRA, f64:$FRB))]>;
2617*9880d681SAndroid Build Coastguard Worker  defm FSUBS : AForm_2r<59, 20,
2618*9880d681SAndroid Build Coastguard Worker                        (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRB),
2619*9880d681SAndroid Build Coastguard Worker                        "fsubs", "$FRT, $FRA, $FRB", IIC_FPGeneral,
2620*9880d681SAndroid Build Coastguard Worker                        [(set f32:$FRT, (fsub f32:$FRA, f32:$FRB))]>;
2621*9880d681SAndroid Build Coastguard Worker  }
2622*9880d681SAndroid Build Coastguard Worker}
2623*9880d681SAndroid Build Coastguard Worker
2624*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 0 in {
2625*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 1 in {  // FXU Operations.
2626*9880d681SAndroid Build Coastguard Worker  let isSelect = 1 in
2627*9880d681SAndroid Build Coastguard Worker  def ISEL  : AForm_4<31, 15,
2628*9880d681SAndroid Build Coastguard Worker                     (outs gprc:$rT), (ins gprc_nor0:$rA, gprc:$rB, crbitrc:$cond),
2629*9880d681SAndroid Build Coastguard Worker                     "isel $rT, $rA, $rB, $cond", IIC_IntISEL,
2630*9880d681SAndroid Build Coastguard Worker                     []>;
2631*9880d681SAndroid Build Coastguard Worker}
2632*9880d681SAndroid Build Coastguard Worker
2633*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 1 in {  // FXU Operations.
2634*9880d681SAndroid Build Coastguard Worker// M-Form instructions.  rotate and mask instructions.
2635*9880d681SAndroid Build Coastguard Worker//
2636*9880d681SAndroid Build Coastguard Workerlet isCommutable = 1 in {
2637*9880d681SAndroid Build Coastguard Worker// RLWIMI can be commuted if the rotate amount is zero.
2638*9880d681SAndroid Build Coastguard Workerdefm RLWIMI : MForm_2r<20, (outs gprc:$rA),
2639*9880d681SAndroid Build Coastguard Worker                       (ins gprc:$rSi, gprc:$rS, u5imm:$SH, u5imm:$MB,
2640*9880d681SAndroid Build Coastguard Worker                       u5imm:$ME), "rlwimi", "$rA, $rS, $SH, $MB, $ME",
2641*9880d681SAndroid Build Coastguard Worker                       IIC_IntRotate, []>, PPC970_DGroup_Cracked,
2642*9880d681SAndroid Build Coastguard Worker                       RegConstraint<"$rSi = $rA">, NoEncode<"$rSi">;
2643*9880d681SAndroid Build Coastguard Worker}
2644*9880d681SAndroid Build Coastguard Workerlet BaseName = "rlwinm" in {
2645*9880d681SAndroid Build Coastguard Workerdef RLWINM : MForm_2<21,
2646*9880d681SAndroid Build Coastguard Worker                     (outs gprc:$rA), (ins gprc:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME),
2647*9880d681SAndroid Build Coastguard Worker                     "rlwinm $rA, $rS, $SH, $MB, $ME", IIC_IntGeneral,
2648*9880d681SAndroid Build Coastguard Worker                     []>, RecFormRel;
2649*9880d681SAndroid Build Coastguard Workerlet Defs = [CR0] in
2650*9880d681SAndroid Build Coastguard Workerdef RLWINMo : MForm_2<21,
2651*9880d681SAndroid Build Coastguard Worker                      (outs gprc:$rA), (ins gprc:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME),
2652*9880d681SAndroid Build Coastguard Worker                      "rlwinm. $rA, $rS, $SH, $MB, $ME", IIC_IntGeneral,
2653*9880d681SAndroid Build Coastguard Worker                      []>, isDOT, RecFormRel, PPC970_DGroup_Cracked;
2654*9880d681SAndroid Build Coastguard Worker}
2655*9880d681SAndroid Build Coastguard Workerdefm RLWNM  : MForm_2r<23, (outs gprc:$rA),
2656*9880d681SAndroid Build Coastguard Worker                       (ins gprc:$rS, gprc:$rB, u5imm:$MB, u5imm:$ME),
2657*9880d681SAndroid Build Coastguard Worker                       "rlwnm", "$rA, $rS, $rB, $MB, $ME", IIC_IntGeneral,
2658*9880d681SAndroid Build Coastguard Worker                       []>;
2659*9880d681SAndroid Build Coastguard Worker}
2660*9880d681SAndroid Build Coastguard Worker} // hasSideEffects = 0
2661*9880d681SAndroid Build Coastguard Worker
2662*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
2663*9880d681SAndroid Build Coastguard Worker// PowerPC Instruction Patterns
2664*9880d681SAndroid Build Coastguard Worker//
2665*9880d681SAndroid Build Coastguard Worker
2666*9880d681SAndroid Build Coastguard Worker// Arbitrary immediate support.  Implement in terms of LIS/ORI.
2667*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 imm:$imm),
2668*9880d681SAndroid Build Coastguard Worker          (ORI (LIS (HI16 imm:$imm)), (LO16 imm:$imm))>;
2669*9880d681SAndroid Build Coastguard Worker
2670*9880d681SAndroid Build Coastguard Worker// Implement the 'not' operation with the NOR instruction.
2671*9880d681SAndroid Build Coastguard Workerdef i32not : OutPatFrag<(ops node:$in),
2672*9880d681SAndroid Build Coastguard Worker                        (NOR $in, $in)>;
2673*9880d681SAndroid Build Coastguard Workerdef        : Pat<(not i32:$in),
2674*9880d681SAndroid Build Coastguard Worker                 (i32not $in)>;
2675*9880d681SAndroid Build Coastguard Worker
2676*9880d681SAndroid Build Coastguard Worker// ADD an arbitrary immediate.
2677*9880d681SAndroid Build Coastguard Workerdef : Pat<(add i32:$in, imm:$imm),
2678*9880d681SAndroid Build Coastguard Worker          (ADDIS (ADDI $in, (LO16 imm:$imm)), (HA16 imm:$imm))>;
2679*9880d681SAndroid Build Coastguard Worker// OR an arbitrary immediate.
2680*9880d681SAndroid Build Coastguard Workerdef : Pat<(or i32:$in, imm:$imm),
2681*9880d681SAndroid Build Coastguard Worker          (ORIS (ORI $in, (LO16 imm:$imm)), (HI16 imm:$imm))>;
2682*9880d681SAndroid Build Coastguard Worker// XOR an arbitrary immediate.
2683*9880d681SAndroid Build Coastguard Workerdef : Pat<(xor i32:$in, imm:$imm),
2684*9880d681SAndroid Build Coastguard Worker          (XORIS (XORI $in, (LO16 imm:$imm)), (HI16 imm:$imm))>;
2685*9880d681SAndroid Build Coastguard Worker// SUBFIC
2686*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub imm32SExt16:$imm, i32:$in),
2687*9880d681SAndroid Build Coastguard Worker          (SUBFIC $in, imm:$imm)>;
2688*9880d681SAndroid Build Coastguard Worker
2689*9880d681SAndroid Build Coastguard Worker// SHL/SRL
2690*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl i32:$in, (i32 imm:$imm)),
2691*9880d681SAndroid Build Coastguard Worker          (RLWINM $in, imm:$imm, 0, (SHL32 imm:$imm))>;
2692*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl i32:$in, (i32 imm:$imm)),
2693*9880d681SAndroid Build Coastguard Worker          (RLWINM $in, (SRL32 imm:$imm), imm:$imm, 31)>;
2694*9880d681SAndroid Build Coastguard Worker
2695*9880d681SAndroid Build Coastguard Worker// ROTL
2696*9880d681SAndroid Build Coastguard Workerdef : Pat<(rotl i32:$in, i32:$sh),
2697*9880d681SAndroid Build Coastguard Worker          (RLWNM $in, $sh, 0, 31)>;
2698*9880d681SAndroid Build Coastguard Workerdef : Pat<(rotl i32:$in, (i32 imm:$imm)),
2699*9880d681SAndroid Build Coastguard Worker          (RLWINM $in, imm:$imm, 0, 31)>;
2700*9880d681SAndroid Build Coastguard Worker
2701*9880d681SAndroid Build Coastguard Worker// RLWNM
2702*9880d681SAndroid Build Coastguard Workerdef : Pat<(and (rotl i32:$in, i32:$sh), maskimm32:$imm),
2703*9880d681SAndroid Build Coastguard Worker          (RLWNM $in, $sh, (MB maskimm32:$imm), (ME maskimm32:$imm))>;
2704*9880d681SAndroid Build Coastguard Worker
2705*9880d681SAndroid Build Coastguard Worker// Calls
2706*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPCcall (i32 tglobaladdr:$dst)),
2707*9880d681SAndroid Build Coastguard Worker          (BL tglobaladdr:$dst)>;
2708*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPCcall (i32 texternalsym:$dst)),
2709*9880d681SAndroid Build Coastguard Worker          (BL texternalsym:$dst)>;
2710*9880d681SAndroid Build Coastguard Worker
2711*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPCtc_return (i32 tglobaladdr:$dst),  imm:$imm),
2712*9880d681SAndroid Build Coastguard Worker          (TCRETURNdi tglobaladdr:$dst, imm:$imm)>;
2713*9880d681SAndroid Build Coastguard Worker
2714*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPCtc_return (i32 texternalsym:$dst), imm:$imm),
2715*9880d681SAndroid Build Coastguard Worker          (TCRETURNdi texternalsym:$dst, imm:$imm)>;
2716*9880d681SAndroid Build Coastguard Worker
2717*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPCtc_return CTRRC:$dst, imm:$imm),
2718*9880d681SAndroid Build Coastguard Worker          (TCRETURNri CTRRC:$dst, imm:$imm)>;
2719*9880d681SAndroid Build Coastguard Worker
2720*9880d681SAndroid Build Coastguard Worker
2721*9880d681SAndroid Build Coastguard Worker
2722*9880d681SAndroid Build Coastguard Worker// Hi and Lo for Darwin Global Addresses.
2723*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPChi tglobaladdr:$in, 0), (LIS tglobaladdr:$in)>;
2724*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPClo tglobaladdr:$in, 0), (LI tglobaladdr:$in)>;
2725*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPChi tconstpool:$in, 0), (LIS tconstpool:$in)>;
2726*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPClo tconstpool:$in, 0), (LI tconstpool:$in)>;
2727*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPChi tjumptable:$in, 0), (LIS tjumptable:$in)>;
2728*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPClo tjumptable:$in, 0), (LI tjumptable:$in)>;
2729*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPChi tblockaddress:$in, 0), (LIS tblockaddress:$in)>;
2730*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPClo tblockaddress:$in, 0), (LI tblockaddress:$in)>;
2731*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPChi tglobaltlsaddr:$g, i32:$in),
2732*9880d681SAndroid Build Coastguard Worker          (ADDIS $in, tglobaltlsaddr:$g)>;
2733*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPClo tglobaltlsaddr:$g, i32:$in),
2734*9880d681SAndroid Build Coastguard Worker          (ADDI $in, tglobaltlsaddr:$g)>;
2735*9880d681SAndroid Build Coastguard Workerdef : Pat<(add i32:$in, (PPChi tglobaladdr:$g, 0)),
2736*9880d681SAndroid Build Coastguard Worker          (ADDIS $in, tglobaladdr:$g)>;
2737*9880d681SAndroid Build Coastguard Workerdef : Pat<(add i32:$in, (PPChi tconstpool:$g, 0)),
2738*9880d681SAndroid Build Coastguard Worker          (ADDIS $in, tconstpool:$g)>;
2739*9880d681SAndroid Build Coastguard Workerdef : Pat<(add i32:$in, (PPChi tjumptable:$g, 0)),
2740*9880d681SAndroid Build Coastguard Worker          (ADDIS $in, tjumptable:$g)>;
2741*9880d681SAndroid Build Coastguard Workerdef : Pat<(add i32:$in, (PPChi tblockaddress:$g, 0)),
2742*9880d681SAndroid Build Coastguard Worker          (ADDIS $in, tblockaddress:$g)>;
2743*9880d681SAndroid Build Coastguard Worker
2744*9880d681SAndroid Build Coastguard Worker// Support for thread-local storage.
2745*9880d681SAndroid Build Coastguard Workerdef PPC32GOT: Pseudo<(outs gprc:$rD), (ins), "#PPC32GOT",
2746*9880d681SAndroid Build Coastguard Worker                [(set i32:$rD, (PPCppc32GOT))]>;
2747*9880d681SAndroid Build Coastguard Worker
2748*9880d681SAndroid Build Coastguard Worker// Get the _GLOBAL_OFFSET_TABLE_ in PIC mode.
2749*9880d681SAndroid Build Coastguard Worker// This uses two output registers, the first as the real output, the second as a
2750*9880d681SAndroid Build Coastguard Worker// temporary register, used internally in code generation.
2751*9880d681SAndroid Build Coastguard Workerdef PPC32PICGOT: Pseudo<(outs gprc:$rD, gprc:$rT), (ins), "#PPC32PICGOT",
2752*9880d681SAndroid Build Coastguard Worker                []>, NoEncode<"$rT">;
2753*9880d681SAndroid Build Coastguard Worker
2754*9880d681SAndroid Build Coastguard Workerdef LDgotTprelL32: Pseudo<(outs gprc:$rD), (ins s16imm:$disp, gprc_nor0:$reg),
2755*9880d681SAndroid Build Coastguard Worker                           "#LDgotTprelL32",
2756*9880d681SAndroid Build Coastguard Worker                           [(set i32:$rD,
2757*9880d681SAndroid Build Coastguard Worker                             (PPCldGotTprelL tglobaltlsaddr:$disp, i32:$reg))]>;
2758*9880d681SAndroid Build Coastguard Workerdef : Pat<(PPCaddTls i32:$in, tglobaltlsaddr:$g),
2759*9880d681SAndroid Build Coastguard Worker          (ADD4TLS $in, tglobaltlsaddr:$g)>;
2760*9880d681SAndroid Build Coastguard Worker
2761*9880d681SAndroid Build Coastguard Workerdef ADDItlsgdL32 : Pseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s16imm:$disp),
2762*9880d681SAndroid Build Coastguard Worker                         "#ADDItlsgdL32",
2763*9880d681SAndroid Build Coastguard Worker                         [(set i32:$rD,
2764*9880d681SAndroid Build Coastguard Worker                           (PPCaddiTlsgdL i32:$reg, tglobaltlsaddr:$disp))]>;
2765*9880d681SAndroid Build Coastguard Worker// LR is a true define, while the rest of the Defs are clobbers.  R3 is
2766*9880d681SAndroid Build Coastguard Worker// explicitly defined when this op is created, so not mentioned here.
2767*9880d681SAndroid Build Coastguard Workerlet hasExtraSrcRegAllocReq = 1, hasExtraDefRegAllocReq = 1,
2768*9880d681SAndroid Build Coastguard Worker    Defs = [R0,R4,R5,R6,R7,R8,R9,R10,R11,R12,LR,CTR,CR0,CR1,CR5,CR6,CR7] in
2769*9880d681SAndroid Build Coastguard Workerdef GETtlsADDR32 : Pseudo<(outs gprc:$rD), (ins gprc:$reg, tlsgd32:$sym),
2770*9880d681SAndroid Build Coastguard Worker                          "GETtlsADDR32",
2771*9880d681SAndroid Build Coastguard Worker                          [(set i32:$rD,
2772*9880d681SAndroid Build Coastguard Worker                            (PPCgetTlsAddr i32:$reg, tglobaltlsaddr:$sym))]>;
2773*9880d681SAndroid Build Coastguard Worker// Combined op for ADDItlsgdL32 and GETtlsADDR32, late expanded.  R3 and LR
2774*9880d681SAndroid Build Coastguard Worker// are true defines while the rest of the Defs are clobbers.
2775*9880d681SAndroid Build Coastguard Workerlet hasExtraSrcRegAllocReq = 1, hasExtraDefRegAllocReq = 1,
2776*9880d681SAndroid Build Coastguard Worker    Defs = [R0,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,LR,CTR,CR0,CR1,CR5,CR6,CR7] in
2777*9880d681SAndroid Build Coastguard Workerdef ADDItlsgdLADDR32 : Pseudo<(outs gprc:$rD),
2778*9880d681SAndroid Build Coastguard Worker                              (ins gprc_nor0:$reg, s16imm:$disp, tlsgd32:$sym),
2779*9880d681SAndroid Build Coastguard Worker                              "#ADDItlsgdLADDR32",
2780*9880d681SAndroid Build Coastguard Worker                              [(set i32:$rD,
2781*9880d681SAndroid Build Coastguard Worker                                (PPCaddiTlsgdLAddr i32:$reg,
2782*9880d681SAndroid Build Coastguard Worker                                                   tglobaltlsaddr:$disp,
2783*9880d681SAndroid Build Coastguard Worker                                                   tglobaltlsaddr:$sym))]>;
2784*9880d681SAndroid Build Coastguard Workerdef ADDItlsldL32 : Pseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s16imm:$disp),
2785*9880d681SAndroid Build Coastguard Worker                          "#ADDItlsldL32",
2786*9880d681SAndroid Build Coastguard Worker                          [(set i32:$rD,
2787*9880d681SAndroid Build Coastguard Worker                            (PPCaddiTlsldL i32:$reg, tglobaltlsaddr:$disp))]>;
2788*9880d681SAndroid Build Coastguard Worker// LR is a true define, while the rest of the Defs are clobbers.  R3 is
2789*9880d681SAndroid Build Coastguard Worker// explicitly defined when this op is created, so not mentioned here.
2790*9880d681SAndroid Build Coastguard Workerlet hasExtraSrcRegAllocReq = 1, hasExtraDefRegAllocReq = 1,
2791*9880d681SAndroid Build Coastguard Worker    Defs = [R0,R4,R5,R6,R7,R8,R9,R10,R11,R12,LR,CTR,CR0,CR1,CR5,CR6,CR7] in
2792*9880d681SAndroid Build Coastguard Workerdef GETtlsldADDR32 : Pseudo<(outs gprc:$rD), (ins gprc:$reg, tlsgd32:$sym),
2793*9880d681SAndroid Build Coastguard Worker                            "GETtlsldADDR32",
2794*9880d681SAndroid Build Coastguard Worker                            [(set i32:$rD,
2795*9880d681SAndroid Build Coastguard Worker                              (PPCgetTlsldAddr i32:$reg,
2796*9880d681SAndroid Build Coastguard Worker                                               tglobaltlsaddr:$sym))]>;
2797*9880d681SAndroid Build Coastguard Worker// Combined op for ADDItlsldL32 and GETtlsADDR32, late expanded.  R3 and LR
2798*9880d681SAndroid Build Coastguard Worker// are true defines while the rest of the Defs are clobbers.
2799*9880d681SAndroid Build Coastguard Workerlet hasExtraSrcRegAllocReq = 1, hasExtraDefRegAllocReq = 1,
2800*9880d681SAndroid Build Coastguard Worker    Defs = [R0,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,LR,CTR,CR0,CR1,CR5,CR6,CR7] in
2801*9880d681SAndroid Build Coastguard Workerdef ADDItlsldLADDR32 : Pseudo<(outs gprc:$rD),
2802*9880d681SAndroid Build Coastguard Worker                              (ins gprc_nor0:$reg, s16imm:$disp, tlsgd32:$sym),
2803*9880d681SAndroid Build Coastguard Worker                              "#ADDItlsldLADDR32",
2804*9880d681SAndroid Build Coastguard Worker                              [(set i32:$rD,
2805*9880d681SAndroid Build Coastguard Worker                                (PPCaddiTlsldLAddr i32:$reg,
2806*9880d681SAndroid Build Coastguard Worker                                                   tglobaltlsaddr:$disp,
2807*9880d681SAndroid Build Coastguard Worker                                                   tglobaltlsaddr:$sym))]>;
2808*9880d681SAndroid Build Coastguard Workerdef ADDIdtprelL32 : Pseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s16imm:$disp),
2809*9880d681SAndroid Build Coastguard Worker                           "#ADDIdtprelL32",
2810*9880d681SAndroid Build Coastguard Worker                           [(set i32:$rD,
2811*9880d681SAndroid Build Coastguard Worker                             (PPCaddiDtprelL i32:$reg, tglobaltlsaddr:$disp))]>;
2812*9880d681SAndroid Build Coastguard Workerdef ADDISdtprelHA32 : Pseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s16imm:$disp),
2813*9880d681SAndroid Build Coastguard Worker                            "#ADDISdtprelHA32",
2814*9880d681SAndroid Build Coastguard Worker                            [(set i32:$rD,
2815*9880d681SAndroid Build Coastguard Worker                              (PPCaddisDtprelHA i32:$reg,
2816*9880d681SAndroid Build Coastguard Worker                                                tglobaltlsaddr:$disp))]>;
2817*9880d681SAndroid Build Coastguard Worker
2818*9880d681SAndroid Build Coastguard Worker// Support for Position-independent code
2819*9880d681SAndroid Build Coastguard Workerdef LWZtoc : Pseudo<(outs gprc:$rD), (ins tocentry32:$disp, gprc:$reg),
2820*9880d681SAndroid Build Coastguard Worker                   "#LWZtoc",
2821*9880d681SAndroid Build Coastguard Worker                   [(set i32:$rD,
2822*9880d681SAndroid Build Coastguard Worker                      (PPCtoc_entry tglobaladdr:$disp, i32:$reg))]>;
2823*9880d681SAndroid Build Coastguard Worker// Get Global (GOT) Base Register offset, from the word immediately preceding
2824*9880d681SAndroid Build Coastguard Worker// the function label.
2825*9880d681SAndroid Build Coastguard Workerdef UpdateGBR : Pseudo<(outs gprc:$rD, gprc:$rT), (ins gprc:$rI), "#UpdateGBR", []>;
2826*9880d681SAndroid Build Coastguard Worker
2827*9880d681SAndroid Build Coastguard Worker
2828*9880d681SAndroid Build Coastguard Worker// Standard shifts.  These are represented separately from the real shifts above
2829*9880d681SAndroid Build Coastguard Worker// so that we can distinguish between shifts that allow 5-bit and 6-bit shift
2830*9880d681SAndroid Build Coastguard Worker// amounts.
2831*9880d681SAndroid Build Coastguard Workerdef : Pat<(sra i32:$rS, i32:$rB),
2832*9880d681SAndroid Build Coastguard Worker          (SRAW $rS, $rB)>;
2833*9880d681SAndroid Build Coastguard Workerdef : Pat<(srl i32:$rS, i32:$rB),
2834*9880d681SAndroid Build Coastguard Worker          (SRW $rS, $rB)>;
2835*9880d681SAndroid Build Coastguard Workerdef : Pat<(shl i32:$rS, i32:$rB),
2836*9880d681SAndroid Build Coastguard Worker          (SLW $rS, $rB)>;
2837*9880d681SAndroid Build Coastguard Worker
2838*9880d681SAndroid Build Coastguard Workerdef : Pat<(zextloadi1 iaddr:$src),
2839*9880d681SAndroid Build Coastguard Worker          (LBZ iaddr:$src)>;
2840*9880d681SAndroid Build Coastguard Workerdef : Pat<(zextloadi1 xaddr:$src),
2841*9880d681SAndroid Build Coastguard Worker          (LBZX xaddr:$src)>;
2842*9880d681SAndroid Build Coastguard Workerdef : Pat<(extloadi1 iaddr:$src),
2843*9880d681SAndroid Build Coastguard Worker          (LBZ iaddr:$src)>;
2844*9880d681SAndroid Build Coastguard Workerdef : Pat<(extloadi1 xaddr:$src),
2845*9880d681SAndroid Build Coastguard Worker          (LBZX xaddr:$src)>;
2846*9880d681SAndroid Build Coastguard Workerdef : Pat<(extloadi8 iaddr:$src),
2847*9880d681SAndroid Build Coastguard Worker          (LBZ iaddr:$src)>;
2848*9880d681SAndroid Build Coastguard Workerdef : Pat<(extloadi8 xaddr:$src),
2849*9880d681SAndroid Build Coastguard Worker          (LBZX xaddr:$src)>;
2850*9880d681SAndroid Build Coastguard Workerdef : Pat<(extloadi16 iaddr:$src),
2851*9880d681SAndroid Build Coastguard Worker          (LHZ iaddr:$src)>;
2852*9880d681SAndroid Build Coastguard Workerdef : Pat<(extloadi16 xaddr:$src),
2853*9880d681SAndroid Build Coastguard Worker          (LHZX xaddr:$src)>;
2854*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extloadf32 iaddr:$src)),
2855*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS (LFS iaddr:$src), F8RC)>;
2856*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (extloadf32 xaddr:$src)),
2857*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS (LFSX xaddr:$src), F8RC)>;
2858*9880d681SAndroid Build Coastguard Worker
2859*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (fextend f32:$src)),
2860*9880d681SAndroid Build Coastguard Worker          (COPY_TO_REGCLASS $src, F8RC)>;
2861*9880d681SAndroid Build Coastguard Worker
2862*9880d681SAndroid Build Coastguard Worker// Only seq_cst fences require the heavyweight sync (SYNC 0).
2863*9880d681SAndroid Build Coastguard Worker// All others can use the lightweight sync (SYNC 1).
2864*9880d681SAndroid Build Coastguard Worker// source: http://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html
2865*9880d681SAndroid Build Coastguard Worker// The rule for seq_cst is duplicated to work with both 64 bits and 32 bits
2866*9880d681SAndroid Build Coastguard Worker// versions of Power.
2867*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_fence (i64 7), (imm)), (SYNC 0)>, Requires<[HasSYNC]>;
2868*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_fence (i32 7), (imm)), (SYNC 0)>, Requires<[HasSYNC]>;
2869*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_fence (imm),   (imm)), (SYNC 1)>, Requires<[HasSYNC]>;
2870*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_fence (imm), (imm)), (MSYNC)>, Requires<[HasOnlyMSYNC]>;
2871*9880d681SAndroid Build Coastguard Worker
2872*9880d681SAndroid Build Coastguard Worker// Additional FNMSUB patterns: -a*c + b == -(a*c - b)
2873*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
2874*9880d681SAndroid Build Coastguard Worker          (FNMSUB $A, $C, $B)>;
2875*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
2876*9880d681SAndroid Build Coastguard Worker          (FNMSUB $A, $C, $B)>;
2877*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma (fneg f32:$A), f32:$C, f32:$B),
2878*9880d681SAndroid Build Coastguard Worker          (FNMSUBS $A, $C, $B)>;
2879*9880d681SAndroid Build Coastguard Workerdef : Pat<(fma f32:$A, (fneg f32:$C), f32:$B),
2880*9880d681SAndroid Build Coastguard Worker          (FNMSUBS $A, $C, $B)>;
2881*9880d681SAndroid Build Coastguard Worker
2882*9880d681SAndroid Build Coastguard Worker// FCOPYSIGN's operand types need not agree.
2883*9880d681SAndroid Build Coastguard Workerdef : Pat<(fcopysign f64:$frB, f32:$frA),
2884*9880d681SAndroid Build Coastguard Worker          (FCPSGND (COPY_TO_REGCLASS $frA, F8RC), $frB)>;
2885*9880d681SAndroid Build Coastguard Workerdef : Pat<(fcopysign f32:$frB, f64:$frA),
2886*9880d681SAndroid Build Coastguard Worker          (FCPSGNS (COPY_TO_REGCLASS $frA, F4RC), $frB)>;
2887*9880d681SAndroid Build Coastguard Worker
2888*9880d681SAndroid Build Coastguard Workerinclude "PPCInstrAltivec.td"
2889*9880d681SAndroid Build Coastguard Workerinclude "PPCInstrSPE.td"
2890*9880d681SAndroid Build Coastguard Workerinclude "PPCInstr64Bit.td"
2891*9880d681SAndroid Build Coastguard Workerinclude "PPCInstrVSX.td"
2892*9880d681SAndroid Build Coastguard Workerinclude "PPCInstrQPX.td"
2893*9880d681SAndroid Build Coastguard Workerinclude "PPCInstrHTM.td"
2894*9880d681SAndroid Build Coastguard Worker
2895*9880d681SAndroid Build Coastguard Workerdef crnot : OutPatFrag<(ops node:$in),
2896*9880d681SAndroid Build Coastguard Worker                       (CRNOR $in, $in)>;
2897*9880d681SAndroid Build Coastguard Workerdef       : Pat<(not i1:$in),
2898*9880d681SAndroid Build Coastguard Worker                (crnot $in)>;
2899*9880d681SAndroid Build Coastguard Worker
2900*9880d681SAndroid Build Coastguard Worker// Patterns for arithmetic i1 operations.
2901*9880d681SAndroid Build Coastguard Workerdef : Pat<(add i1:$a, i1:$b),
2902*9880d681SAndroid Build Coastguard Worker          (CRXOR $a, $b)>;
2903*9880d681SAndroid Build Coastguard Workerdef : Pat<(sub i1:$a, i1:$b),
2904*9880d681SAndroid Build Coastguard Worker          (CRXOR $a, $b)>;
2905*9880d681SAndroid Build Coastguard Workerdef : Pat<(mul i1:$a, i1:$b),
2906*9880d681SAndroid Build Coastguard Worker          (CRAND $a, $b)>;
2907*9880d681SAndroid Build Coastguard Worker
2908*9880d681SAndroid Build Coastguard Worker// We're sometimes asked to materialize i1 -1, which is just 1 in this case
2909*9880d681SAndroid Build Coastguard Worker// (-1 is used to mean all bits set).
2910*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 -1), (CRSET)>;
2911*9880d681SAndroid Build Coastguard Worker
2912*9880d681SAndroid Build Coastguard Worker// i1 extensions, implemented in terms of isel.
2913*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (zext i1:$in)),
2914*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 $in, (LI 1), (LI 0))>;
2915*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (sext i1:$in)),
2916*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 $in, (LI -1), (LI 0))>;
2917*9880d681SAndroid Build Coastguard Worker
2918*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (zext i1:$in)),
2919*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 $in, (LI8 1), (LI8 0))>;
2920*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (sext i1:$in)),
2921*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 $in, (LI8 -1), (LI8 0))>;
2922*9880d681SAndroid Build Coastguard Worker
2923*9880d681SAndroid Build Coastguard Worker// FIXME: We should choose either a zext or a sext based on other constants
2924*9880d681SAndroid Build Coastguard Worker// already around.
2925*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (anyext i1:$in)),
2926*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 $in, (LI 1), (LI 0))>;
2927*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (anyext i1:$in)),
2928*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 $in, (LI8 1), (LI8 0))>;
2929*9880d681SAndroid Build Coastguard Worker
2930*9880d681SAndroid Build Coastguard Worker// match setcc on i1 variables.
2931*9880d681SAndroid Build Coastguard Worker// CRANDC is:
2932*9880d681SAndroid Build Coastguard Worker//   1 1 : F
2933*9880d681SAndroid Build Coastguard Worker//   1 0 : T
2934*9880d681SAndroid Build Coastguard Worker//   0 1 : F
2935*9880d681SAndroid Build Coastguard Worker//   0 0 : F
2936*9880d681SAndroid Build Coastguard Worker//
2937*9880d681SAndroid Build Coastguard Worker// LT is:
2938*9880d681SAndroid Build Coastguard Worker//  -1 -1  : F
2939*9880d681SAndroid Build Coastguard Worker//  -1  0  : T
2940*9880d681SAndroid Build Coastguard Worker//   0 -1  : F
2941*9880d681SAndroid Build Coastguard Worker//   0  0  : F
2942*9880d681SAndroid Build Coastguard Worker//
2943*9880d681SAndroid Build Coastguard Worker// ULT is:
2944*9880d681SAndroid Build Coastguard Worker//   1 1 : F
2945*9880d681SAndroid Build Coastguard Worker//   1 0 : F
2946*9880d681SAndroid Build Coastguard Worker//   0 1 : T
2947*9880d681SAndroid Build Coastguard Worker//   0 0 : F
2948*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i1:$s1, i1:$s2, SETLT)),
2949*9880d681SAndroid Build Coastguard Worker          (CRANDC $s1, $s2)>;
2950*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i1:$s1, i1:$s2, SETULT)),
2951*9880d681SAndroid Build Coastguard Worker          (CRANDC $s2, $s1)>;
2952*9880d681SAndroid Build Coastguard Worker// CRORC is:
2953*9880d681SAndroid Build Coastguard Worker//   1 1 : T
2954*9880d681SAndroid Build Coastguard Worker//   1 0 : T
2955*9880d681SAndroid Build Coastguard Worker//   0 1 : F
2956*9880d681SAndroid Build Coastguard Worker//   0 0 : T
2957*9880d681SAndroid Build Coastguard Worker//
2958*9880d681SAndroid Build Coastguard Worker// LE is:
2959*9880d681SAndroid Build Coastguard Worker//  -1 -1 : T
2960*9880d681SAndroid Build Coastguard Worker//  -1  0 : T
2961*9880d681SAndroid Build Coastguard Worker//   0 -1 : F
2962*9880d681SAndroid Build Coastguard Worker//   0  0 : T
2963*9880d681SAndroid Build Coastguard Worker//
2964*9880d681SAndroid Build Coastguard Worker// ULE is:
2965*9880d681SAndroid Build Coastguard Worker//   1 1 : T
2966*9880d681SAndroid Build Coastguard Worker//   1 0 : F
2967*9880d681SAndroid Build Coastguard Worker//   0 1 : T
2968*9880d681SAndroid Build Coastguard Worker//   0 0 : T
2969*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i1:$s1, i1:$s2, SETLE)),
2970*9880d681SAndroid Build Coastguard Worker          (CRORC $s1, $s2)>;
2971*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i1:$s1, i1:$s2, SETULE)),
2972*9880d681SAndroid Build Coastguard Worker          (CRORC $s2, $s1)>;
2973*9880d681SAndroid Build Coastguard Worker
2974*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i1:$s1, i1:$s2, SETEQ)),
2975*9880d681SAndroid Build Coastguard Worker          (CREQV $s1, $s2)>;
2976*9880d681SAndroid Build Coastguard Worker
2977*9880d681SAndroid Build Coastguard Worker// GE is:
2978*9880d681SAndroid Build Coastguard Worker//  -1 -1 : T
2979*9880d681SAndroid Build Coastguard Worker//  -1  0 : F
2980*9880d681SAndroid Build Coastguard Worker//   0 -1 : T
2981*9880d681SAndroid Build Coastguard Worker//   0  0 : T
2982*9880d681SAndroid Build Coastguard Worker//
2983*9880d681SAndroid Build Coastguard Worker// UGE is:
2984*9880d681SAndroid Build Coastguard Worker//   1 1 : T
2985*9880d681SAndroid Build Coastguard Worker//   1 0 : T
2986*9880d681SAndroid Build Coastguard Worker//   0 1 : F
2987*9880d681SAndroid Build Coastguard Worker//   0 0 : T
2988*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i1:$s1, i1:$s2, SETGE)),
2989*9880d681SAndroid Build Coastguard Worker          (CRORC $s2, $s1)>;
2990*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i1:$s1, i1:$s2, SETUGE)),
2991*9880d681SAndroid Build Coastguard Worker          (CRORC $s1, $s2)>;
2992*9880d681SAndroid Build Coastguard Worker
2993*9880d681SAndroid Build Coastguard Worker// GT is:
2994*9880d681SAndroid Build Coastguard Worker//  -1 -1 : F
2995*9880d681SAndroid Build Coastguard Worker//  -1  0 : F
2996*9880d681SAndroid Build Coastguard Worker//   0 -1 : T
2997*9880d681SAndroid Build Coastguard Worker//   0  0 : F
2998*9880d681SAndroid Build Coastguard Worker//
2999*9880d681SAndroid Build Coastguard Worker// UGT is:
3000*9880d681SAndroid Build Coastguard Worker//  1 1 : F
3001*9880d681SAndroid Build Coastguard Worker//  1 0 : T
3002*9880d681SAndroid Build Coastguard Worker//  0 1 : F
3003*9880d681SAndroid Build Coastguard Worker//  0 0 : F
3004*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i1:$s1, i1:$s2, SETGT)),
3005*9880d681SAndroid Build Coastguard Worker          (CRANDC $s2, $s1)>;
3006*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i1:$s1, i1:$s2, SETUGT)),
3007*9880d681SAndroid Build Coastguard Worker          (CRANDC $s1, $s2)>;
3008*9880d681SAndroid Build Coastguard Worker
3009*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i1:$s1, i1:$s2, SETNE)),
3010*9880d681SAndroid Build Coastguard Worker          (CRXOR $s1, $s2)>;
3011*9880d681SAndroid Build Coastguard Worker
3012*9880d681SAndroid Build Coastguard Worker// match setcc on non-i1 (non-vector) variables. Note that SETUEQ, SETOGE,
3013*9880d681SAndroid Build Coastguard Worker// SETOLE, SETONE, SETULT and SETUGT should be expanded by legalize for
3014*9880d681SAndroid Build Coastguard Worker// floating-point types.
3015*9880d681SAndroid Build Coastguard Worker
3016*9880d681SAndroid Build Coastguard Workermulticlass CRNotPat<dag pattern, dag result> {
3017*9880d681SAndroid Build Coastguard Worker  def : Pat<pattern, (crnot result)>;
3018*9880d681SAndroid Build Coastguard Worker  def : Pat<(not pattern), result>;
3019*9880d681SAndroid Build Coastguard Worker
3020*9880d681SAndroid Build Coastguard Worker  // We can also fold the crnot into an extension:
3021*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (zext pattern)),
3022*9880d681SAndroid Build Coastguard Worker            (SELECT_I4 result, (LI 0), (LI 1))>;
3023*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (sext pattern)),
3024*9880d681SAndroid Build Coastguard Worker            (SELECT_I4 result, (LI 0), (LI -1))>;
3025*9880d681SAndroid Build Coastguard Worker
3026*9880d681SAndroid Build Coastguard Worker  // We can also fold the crnot into an extension:
3027*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (zext pattern)),
3028*9880d681SAndroid Build Coastguard Worker            (SELECT_I8 result, (LI8 0), (LI8 1))>;
3029*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (sext pattern)),
3030*9880d681SAndroid Build Coastguard Worker            (SELECT_I8 result, (LI8 0), (LI8 -1))>;
3031*9880d681SAndroid Build Coastguard Worker
3032*9880d681SAndroid Build Coastguard Worker  // FIXME: We should choose either a zext or a sext based on other constants
3033*9880d681SAndroid Build Coastguard Worker  // already around.
3034*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (anyext pattern)),
3035*9880d681SAndroid Build Coastguard Worker            (SELECT_I4 result, (LI 0), (LI 1))>;
3036*9880d681SAndroid Build Coastguard Worker
3037*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (anyext pattern)),
3038*9880d681SAndroid Build Coastguard Worker            (SELECT_I8 result, (LI8 0), (LI8 1))>;
3039*9880d681SAndroid Build Coastguard Worker}
3040*9880d681SAndroid Build Coastguard Worker
3041*9880d681SAndroid Build Coastguard Worker// FIXME: Because of what seems like a bug in TableGen's type-inference code,
3042*9880d681SAndroid Build Coastguard Worker// we need to write imm:$imm in the output patterns below, not just $imm, or
3043*9880d681SAndroid Build Coastguard Worker// else the resulting matcher will not correctly add the immediate operand
3044*9880d681SAndroid Build Coastguard Worker// (making it a register operand instead).
3045*9880d681SAndroid Build Coastguard Worker
3046*9880d681SAndroid Build Coastguard Worker// extended SETCC.
3047*9880d681SAndroid Build Coastguard Workermulticlass ExtSetCCPat<CondCode cc, PatFrag pfrag,
3048*9880d681SAndroid Build Coastguard Worker                       OutPatFrag rfrag, OutPatFrag rfrag8> {
3049*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (zext (i1 (pfrag i32:$s1, cc)))),
3050*9880d681SAndroid Build Coastguard Worker            (rfrag $s1)>;
3051*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (zext (i1 (pfrag i64:$s1, cc)))),
3052*9880d681SAndroid Build Coastguard Worker            (rfrag8 $s1)>;
3053*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (zext (i1 (pfrag i32:$s1, cc)))),
3054*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (i64 (IMPLICIT_DEF)), (rfrag $s1), sub_32)>;
3055*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (zext (i1 (pfrag i64:$s1, cc)))),
3056*9880d681SAndroid Build Coastguard Worker            (EXTRACT_SUBREG (rfrag8 $s1), sub_32)>;
3057*9880d681SAndroid Build Coastguard Worker
3058*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (anyext (i1 (pfrag i32:$s1, cc)))),
3059*9880d681SAndroid Build Coastguard Worker            (rfrag $s1)>;
3060*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (anyext (i1 (pfrag i64:$s1, cc)))),
3061*9880d681SAndroid Build Coastguard Worker            (rfrag8 $s1)>;
3062*9880d681SAndroid Build Coastguard Worker  def : Pat<(i64 (anyext (i1 (pfrag i32:$s1, cc)))),
3063*9880d681SAndroid Build Coastguard Worker            (INSERT_SUBREG (i64 (IMPLICIT_DEF)), (rfrag $s1), sub_32)>;
3064*9880d681SAndroid Build Coastguard Worker  def : Pat<(i32 (anyext (i1 (pfrag i64:$s1, cc)))),
3065*9880d681SAndroid Build Coastguard Worker            (EXTRACT_SUBREG (rfrag8 $s1), sub_32)>;
3066*9880d681SAndroid Build Coastguard Worker}
3067*9880d681SAndroid Build Coastguard Worker
3068*9880d681SAndroid Build Coastguard Worker// Note that we do all inversions below with i(32|64)not, instead of using
3069*9880d681SAndroid Build Coastguard Worker// (xori x, 1) because on the A2 nor has single-cycle latency while xori
3070*9880d681SAndroid Build Coastguard Worker// has 2-cycle latency.
3071*9880d681SAndroid Build Coastguard Worker
3072*9880d681SAndroid Build Coastguard Workerdefm : ExtSetCCPat<SETEQ,
3073*9880d681SAndroid Build Coastguard Worker                   PatFrag<(ops node:$in, node:$cc),
3074*9880d681SAndroid Build Coastguard Worker                           (setcc $in, 0, $cc)>,
3075*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3076*9880d681SAndroid Build Coastguard Worker                              (RLWINM (CNTLZW $in), 27, 31, 31)>,
3077*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3078*9880d681SAndroid Build Coastguard Worker                              (RLDICL (CNTLZD $in), 58, 63)> >;
3079*9880d681SAndroid Build Coastguard Worker
3080*9880d681SAndroid Build Coastguard Workerdefm : ExtSetCCPat<SETNE,
3081*9880d681SAndroid Build Coastguard Worker                   PatFrag<(ops node:$in, node:$cc),
3082*9880d681SAndroid Build Coastguard Worker                           (setcc $in, 0, $cc)>,
3083*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3084*9880d681SAndroid Build Coastguard Worker                              (RLWINM (i32not (CNTLZW $in)), 27, 31, 31)>,
3085*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3086*9880d681SAndroid Build Coastguard Worker                              (RLDICL (i64not (CNTLZD $in)), 58, 63)> >;
3087*9880d681SAndroid Build Coastguard Worker
3088*9880d681SAndroid Build Coastguard Workerdefm : ExtSetCCPat<SETLT,
3089*9880d681SAndroid Build Coastguard Worker                   PatFrag<(ops node:$in, node:$cc),
3090*9880d681SAndroid Build Coastguard Worker                           (setcc $in, 0, $cc)>,
3091*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3092*9880d681SAndroid Build Coastguard Worker                              (RLWINM $in, 1, 31, 31)>,
3093*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3094*9880d681SAndroid Build Coastguard Worker                              (RLDICL $in, 1, 63)> >;
3095*9880d681SAndroid Build Coastguard Worker
3096*9880d681SAndroid Build Coastguard Workerdefm : ExtSetCCPat<SETGE,
3097*9880d681SAndroid Build Coastguard Worker                   PatFrag<(ops node:$in, node:$cc),
3098*9880d681SAndroid Build Coastguard Worker                           (setcc $in, 0, $cc)>,
3099*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3100*9880d681SAndroid Build Coastguard Worker                              (RLWINM (i32not $in), 1, 31, 31)>,
3101*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3102*9880d681SAndroid Build Coastguard Worker                              (RLDICL (i64not $in), 1, 63)> >;
3103*9880d681SAndroid Build Coastguard Worker
3104*9880d681SAndroid Build Coastguard Workerdefm : ExtSetCCPat<SETGT,
3105*9880d681SAndroid Build Coastguard Worker                   PatFrag<(ops node:$in, node:$cc),
3106*9880d681SAndroid Build Coastguard Worker                           (setcc $in, 0, $cc)>,
3107*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3108*9880d681SAndroid Build Coastguard Worker                              (RLWINM (ANDC (NEG $in), $in), 1, 31, 31)>,
3109*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3110*9880d681SAndroid Build Coastguard Worker                              (RLDICL (ANDC8 (NEG8 $in), $in), 1, 63)> >;
3111*9880d681SAndroid Build Coastguard Worker
3112*9880d681SAndroid Build Coastguard Workerdefm : ExtSetCCPat<SETLE,
3113*9880d681SAndroid Build Coastguard Worker                   PatFrag<(ops node:$in, node:$cc),
3114*9880d681SAndroid Build Coastguard Worker                           (setcc $in, 0, $cc)>,
3115*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3116*9880d681SAndroid Build Coastguard Worker                              (RLWINM (ORC $in, (NEG $in)), 1, 31, 31)>,
3117*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3118*9880d681SAndroid Build Coastguard Worker                              (RLDICL (ORC8 $in, (NEG8 $in)), 1, 63)> >;
3119*9880d681SAndroid Build Coastguard Worker
3120*9880d681SAndroid Build Coastguard Workerdefm : ExtSetCCPat<SETLT,
3121*9880d681SAndroid Build Coastguard Worker                   PatFrag<(ops node:$in, node:$cc),
3122*9880d681SAndroid Build Coastguard Worker                           (setcc $in, -1, $cc)>,
3123*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3124*9880d681SAndroid Build Coastguard Worker                              (RLWINM (AND $in, (ADDI $in, 1)), 1, 31, 31)>,
3125*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3126*9880d681SAndroid Build Coastguard Worker                              (RLDICL (AND8 $in, (ADDI8 $in, 1)), 1, 63)> >;
3127*9880d681SAndroid Build Coastguard Worker
3128*9880d681SAndroid Build Coastguard Workerdefm : ExtSetCCPat<SETGE,
3129*9880d681SAndroid Build Coastguard Worker                   PatFrag<(ops node:$in, node:$cc),
3130*9880d681SAndroid Build Coastguard Worker                           (setcc $in, -1, $cc)>,
3131*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3132*9880d681SAndroid Build Coastguard Worker                              (RLWINM (NAND $in, (ADDI $in, 1)), 1, 31, 31)>,
3133*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3134*9880d681SAndroid Build Coastguard Worker                              (RLDICL (NAND8 $in, (ADDI8 $in, 1)), 1, 63)> >;
3135*9880d681SAndroid Build Coastguard Worker
3136*9880d681SAndroid Build Coastguard Workerdefm : ExtSetCCPat<SETGT,
3137*9880d681SAndroid Build Coastguard Worker                   PatFrag<(ops node:$in, node:$cc),
3138*9880d681SAndroid Build Coastguard Worker                           (setcc $in, -1, $cc)>,
3139*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3140*9880d681SAndroid Build Coastguard Worker                              (RLWINM (i32not $in), 1, 31, 31)>,
3141*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3142*9880d681SAndroid Build Coastguard Worker                              (RLDICL (i64not $in), 1, 63)> >;
3143*9880d681SAndroid Build Coastguard Worker
3144*9880d681SAndroid Build Coastguard Workerdefm : ExtSetCCPat<SETLE,
3145*9880d681SAndroid Build Coastguard Worker                   PatFrag<(ops node:$in, node:$cc),
3146*9880d681SAndroid Build Coastguard Worker                           (setcc $in, -1, $cc)>,
3147*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3148*9880d681SAndroid Build Coastguard Worker                              (RLWINM $in, 1, 31, 31)>,
3149*9880d681SAndroid Build Coastguard Worker                   OutPatFrag<(ops node:$in),
3150*9880d681SAndroid Build Coastguard Worker                              (RLDICL $in, 1, 63)> >;
3151*9880d681SAndroid Build Coastguard Worker
3152*9880d681SAndroid Build Coastguard Worker// SETCC for i32.
3153*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i32:$s1, immZExt16:$imm, SETULT)),
3154*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPLWI $s1, imm:$imm), sub_lt)>;
3155*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i32:$s1, imm32SExt16:$imm, SETLT)),
3156*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPWI $s1, imm:$imm), sub_lt)>;
3157*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i32:$s1, immZExt16:$imm, SETUGT)),
3158*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPLWI $s1, imm:$imm), sub_gt)>;
3159*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i32:$s1, imm32SExt16:$imm, SETGT)),
3160*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPWI $s1, imm:$imm), sub_gt)>;
3161*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i32:$s1, imm32SExt16:$imm, SETEQ)),
3162*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPWI $s1, imm:$imm), sub_eq)>;
3163*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i32:$s1, immZExt16:$imm, SETEQ)),
3164*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPLWI $s1, imm:$imm), sub_eq)>;
3165*9880d681SAndroid Build Coastguard Worker
3166*9880d681SAndroid Build Coastguard Worker// For non-equality comparisons, the default code would materialize the
3167*9880d681SAndroid Build Coastguard Worker// constant, then compare against it, like this:
3168*9880d681SAndroid Build Coastguard Worker//   lis r2, 4660
3169*9880d681SAndroid Build Coastguard Worker//   ori r2, r2, 22136
3170*9880d681SAndroid Build Coastguard Worker//   cmpw cr0, r3, r2
3171*9880d681SAndroid Build Coastguard Worker//   beq cr0,L6
3172*9880d681SAndroid Build Coastguard Worker// Since we are just comparing for equality, we can emit this instead:
3173*9880d681SAndroid Build Coastguard Worker//   xoris r0,r3,0x1234
3174*9880d681SAndroid Build Coastguard Worker//   cmplwi cr0,r0,0x5678
3175*9880d681SAndroid Build Coastguard Worker//   beq cr0,L6
3176*9880d681SAndroid Build Coastguard Worker
3177*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i32:$s1, imm:$imm, SETEQ)),
3178*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPLWI (XORIS $s1, (HI16 imm:$imm)),
3179*9880d681SAndroid Build Coastguard Worker                                  (LO16 imm:$imm)), sub_eq)>;
3180*9880d681SAndroid Build Coastguard Worker
3181*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i32:$s1, immZExt16:$imm, SETUGE)),
3182*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPLWI $s1, imm:$imm), sub_lt)>;
3183*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i32:$s1, imm32SExt16:$imm, SETGE)),
3184*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPWI $s1, imm:$imm), sub_lt)>;
3185*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i32:$s1, immZExt16:$imm, SETULE)),
3186*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPLWI $s1, imm:$imm), sub_gt)>;
3187*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i32:$s1, imm32SExt16:$imm, SETLE)),
3188*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPWI $s1, imm:$imm), sub_gt)>;
3189*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i32:$s1, imm32SExt16:$imm, SETNE)),
3190*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPWI $s1, imm:$imm), sub_eq)>;
3191*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i32:$s1, immZExt16:$imm, SETNE)),
3192*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPLWI $s1, imm:$imm), sub_eq)>;
3193*9880d681SAndroid Build Coastguard Worker
3194*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i32:$s1, imm:$imm, SETNE)),
3195*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPLWI (XORIS $s1, (HI16 imm:$imm)),
3196*9880d681SAndroid Build Coastguard Worker                                        (LO16 imm:$imm)), sub_eq)>;
3197*9880d681SAndroid Build Coastguard Worker
3198*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i32:$s1, i32:$s2, SETULT)),
3199*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPLW $s1, $s2), sub_lt)>;
3200*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i32:$s1, i32:$s2, SETLT)),
3201*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPW $s1, $s2), sub_lt)>;
3202*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i32:$s1, i32:$s2, SETUGT)),
3203*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPLW $s1, $s2), sub_gt)>;
3204*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i32:$s1, i32:$s2, SETGT)),
3205*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPW $s1, $s2), sub_gt)>;
3206*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i32:$s1, i32:$s2, SETEQ)),
3207*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPW $s1, $s2), sub_eq)>;
3208*9880d681SAndroid Build Coastguard Worker
3209*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i32:$s1, i32:$s2, SETUGE)),
3210*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPLW $s1, $s2), sub_lt)>;
3211*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i32:$s1, i32:$s2, SETGE)),
3212*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPW $s1, $s2), sub_lt)>;
3213*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i32:$s1, i32:$s2, SETULE)),
3214*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPLW $s1, $s2), sub_gt)>;
3215*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i32:$s1, i32:$s2, SETLE)),
3216*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPW $s1, $s2), sub_gt)>;
3217*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i32:$s1, i32:$s2, SETNE)),
3218*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPW $s1, $s2), sub_eq)>;
3219*9880d681SAndroid Build Coastguard Worker
3220*9880d681SAndroid Build Coastguard Worker// SETCC for i64.
3221*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i64:$s1, immZExt16:$imm, SETULT)),
3222*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPLDI $s1, imm:$imm), sub_lt)>;
3223*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i64:$s1, imm64SExt16:$imm, SETLT)),
3224*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPDI $s1, imm:$imm), sub_lt)>;
3225*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i64:$s1, immZExt16:$imm, SETUGT)),
3226*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPLDI $s1, imm:$imm), sub_gt)>;
3227*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i64:$s1, imm64SExt16:$imm, SETGT)),
3228*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPDI $s1, imm:$imm), sub_gt)>;
3229*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i64:$s1, imm64SExt16:$imm, SETEQ)),
3230*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPDI $s1, imm:$imm), sub_eq)>;
3231*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i64:$s1, immZExt16:$imm, SETEQ)),
3232*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPLDI $s1, imm:$imm), sub_eq)>;
3233*9880d681SAndroid Build Coastguard Worker
3234*9880d681SAndroid Build Coastguard Worker// For non-equality comparisons, the default code would materialize the
3235*9880d681SAndroid Build Coastguard Worker// constant, then compare against it, like this:
3236*9880d681SAndroid Build Coastguard Worker//   lis r2, 4660
3237*9880d681SAndroid Build Coastguard Worker//   ori r2, r2, 22136
3238*9880d681SAndroid Build Coastguard Worker//   cmpd cr0, r3, r2
3239*9880d681SAndroid Build Coastguard Worker//   beq cr0,L6
3240*9880d681SAndroid Build Coastguard Worker// Since we are just comparing for equality, we can emit this instead:
3241*9880d681SAndroid Build Coastguard Worker//   xoris r0,r3,0x1234
3242*9880d681SAndroid Build Coastguard Worker//   cmpldi cr0,r0,0x5678
3243*9880d681SAndroid Build Coastguard Worker//   beq cr0,L6
3244*9880d681SAndroid Build Coastguard Worker
3245*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i64:$s1, imm64ZExt32:$imm, SETEQ)),
3246*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPLDI (XORIS8 $s1, (HI16 imm:$imm)),
3247*9880d681SAndroid Build Coastguard Worker                                  (LO16 imm:$imm)), sub_eq)>;
3248*9880d681SAndroid Build Coastguard Worker
3249*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i64:$s1, immZExt16:$imm, SETUGE)),
3250*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPLDI $s1, imm:$imm), sub_lt)>;
3251*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i64:$s1, imm64SExt16:$imm, SETGE)),
3252*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPDI $s1, imm:$imm), sub_lt)>;
3253*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i64:$s1, immZExt16:$imm, SETULE)),
3254*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPLDI $s1, imm:$imm), sub_gt)>;
3255*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i64:$s1, imm64SExt16:$imm, SETLE)),
3256*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPDI $s1, imm:$imm), sub_gt)>;
3257*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i64:$s1, imm64SExt16:$imm, SETNE)),
3258*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPDI $s1, imm:$imm), sub_eq)>;
3259*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i64:$s1, immZExt16:$imm, SETNE)),
3260*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPLDI $s1, imm:$imm), sub_eq)>;
3261*9880d681SAndroid Build Coastguard Worker
3262*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i64:$s1, imm64ZExt32:$imm, SETNE)),
3263*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPLDI (XORIS8 $s1, (HI16 imm:$imm)),
3264*9880d681SAndroid Build Coastguard Worker                                        (LO16 imm:$imm)), sub_eq)>;
3265*9880d681SAndroid Build Coastguard Worker
3266*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i64:$s1, i64:$s2, SETULT)),
3267*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPLD $s1, $s2), sub_lt)>;
3268*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i64:$s1, i64:$s2, SETLT)),
3269*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPD $s1, $s2), sub_lt)>;
3270*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i64:$s1, i64:$s2, SETUGT)),
3271*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPLD $s1, $s2), sub_gt)>;
3272*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i64:$s1, i64:$s2, SETGT)),
3273*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPD $s1, $s2), sub_gt)>;
3274*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc i64:$s1, i64:$s2, SETEQ)),
3275*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (CMPD $s1, $s2), sub_eq)>;
3276*9880d681SAndroid Build Coastguard Worker
3277*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i64:$s1, i64:$s2, SETUGE)),
3278*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPLD $s1, $s2), sub_lt)>;
3279*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i64:$s1, i64:$s2, SETGE)),
3280*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPD $s1, $s2), sub_lt)>;
3281*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i64:$s1, i64:$s2, SETULE)),
3282*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPLD $s1, $s2), sub_gt)>;
3283*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i64:$s1, i64:$s2, SETLE)),
3284*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPD $s1, $s2), sub_gt)>;
3285*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc i64:$s1, i64:$s2, SETNE)),
3286*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (CMPD $s1, $s2), sub_eq)>;
3287*9880d681SAndroid Build Coastguard Worker
3288*9880d681SAndroid Build Coastguard Worker// SETCC for f32.
3289*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f32:$s1, f32:$s2, SETOLT)),
3290*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_lt)>;
3291*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f32:$s1, f32:$s2, SETLT)),
3292*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_lt)>;
3293*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f32:$s1, f32:$s2, SETOGT)),
3294*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_gt)>;
3295*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f32:$s1, f32:$s2, SETGT)),
3296*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_gt)>;
3297*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f32:$s1, f32:$s2, SETOEQ)),
3298*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_eq)>;
3299*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f32:$s1, f32:$s2, SETEQ)),
3300*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_eq)>;
3301*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f32:$s1, f32:$s2, SETUO)),
3302*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_un)>;
3303*9880d681SAndroid Build Coastguard Worker
3304*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETUGE)),
3305*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_lt)>;
3306*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETGE)),
3307*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_lt)>;
3308*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETULE)),
3309*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_gt)>;
3310*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETLE)),
3311*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_gt)>;
3312*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETUNE)),
3313*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_eq)>;
3314*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETNE)),
3315*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_eq)>;
3316*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETO)),
3317*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_un)>;
3318*9880d681SAndroid Build Coastguard Worker
3319*9880d681SAndroid Build Coastguard Worker// SETCC for f64.
3320*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f64:$s1, f64:$s2, SETOLT)),
3321*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_lt)>;
3322*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f64:$s1, f64:$s2, SETLT)),
3323*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_lt)>;
3324*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f64:$s1, f64:$s2, SETOGT)),
3325*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_gt)>;
3326*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f64:$s1, f64:$s2, SETGT)),
3327*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_gt)>;
3328*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f64:$s1, f64:$s2, SETOEQ)),
3329*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_eq)>;
3330*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f64:$s1, f64:$s2, SETEQ)),
3331*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_eq)>;
3332*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (setcc f64:$s1, f64:$s2, SETUO)),
3333*9880d681SAndroid Build Coastguard Worker          (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_un)>;
3334*9880d681SAndroid Build Coastguard Worker
3335*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETUGE)),
3336*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_lt)>;
3337*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETGE)),
3338*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_lt)>;
3339*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETULE)),
3340*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_gt)>;
3341*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETLE)),
3342*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_gt)>;
3343*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETUNE)),
3344*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_eq)>;
3345*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETNE)),
3346*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_eq)>;
3347*9880d681SAndroid Build Coastguard Workerdefm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETO)),
3348*9880d681SAndroid Build Coastguard Worker                (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_un)>;
3349*9880d681SAndroid Build Coastguard Worker
3350*9880d681SAndroid Build Coastguard Worker// match select on i1 variables:
3351*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (select i1:$cond, i1:$tval, i1:$fval)),
3352*9880d681SAndroid Build Coastguard Worker          (CROR (CRAND        $cond , $tval),
3353*9880d681SAndroid Build Coastguard Worker                (CRAND (crnot $cond), $fval))>;
3354*9880d681SAndroid Build Coastguard Worker
3355*9880d681SAndroid Build Coastguard Worker// match selectcc on i1 variables:
3356*9880d681SAndroid Build Coastguard Worker//   select (lhs == rhs), tval, fval is:
3357*9880d681SAndroid Build Coastguard Worker//   ((lhs == rhs) & tval) | (!(lhs == rhs) & fval)
3358*9880d681SAndroid Build Coastguard Workerdef : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETLT)),
3359*9880d681SAndroid Build Coastguard Worker           (CROR (CRAND (CRANDC $lhs, $rhs), $tval),
3360*9880d681SAndroid Build Coastguard Worker                 (CRAND (CRORC  $rhs, $lhs), $fval))>;
3361*9880d681SAndroid Build Coastguard Workerdef : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETULT)),
3362*9880d681SAndroid Build Coastguard Worker           (CROR (CRAND (CRANDC $rhs, $lhs), $tval),
3363*9880d681SAndroid Build Coastguard Worker                 (CRAND (CRORC  $lhs, $rhs), $fval))>;
3364*9880d681SAndroid Build Coastguard Workerdef : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETLE)),
3365*9880d681SAndroid Build Coastguard Worker           (CROR (CRAND (CRORC  $lhs, $rhs), $tval),
3366*9880d681SAndroid Build Coastguard Worker                 (CRAND (CRANDC $rhs, $lhs), $fval))>;
3367*9880d681SAndroid Build Coastguard Workerdef : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETULE)),
3368*9880d681SAndroid Build Coastguard Worker           (CROR (CRAND (CRORC  $rhs, $lhs), $tval),
3369*9880d681SAndroid Build Coastguard Worker                 (CRAND (CRANDC $lhs, $rhs), $fval))>;
3370*9880d681SAndroid Build Coastguard Workerdef : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETEQ)),
3371*9880d681SAndroid Build Coastguard Worker           (CROR (CRAND (CREQV $lhs, $rhs), $tval),
3372*9880d681SAndroid Build Coastguard Worker                 (CRAND (CRXOR $lhs, $rhs), $fval))>;
3373*9880d681SAndroid Build Coastguard Workerdef : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETGE)),
3374*9880d681SAndroid Build Coastguard Worker           (CROR (CRAND (CRORC  $rhs, $lhs), $tval),
3375*9880d681SAndroid Build Coastguard Worker                 (CRAND (CRANDC $lhs, $rhs), $fval))>;
3376*9880d681SAndroid Build Coastguard Workerdef : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETUGE)),
3377*9880d681SAndroid Build Coastguard Worker           (CROR (CRAND (CRORC  $lhs, $rhs), $tval),
3378*9880d681SAndroid Build Coastguard Worker                 (CRAND (CRANDC $rhs, $lhs), $fval))>;
3379*9880d681SAndroid Build Coastguard Workerdef : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETGT)),
3380*9880d681SAndroid Build Coastguard Worker           (CROR (CRAND (CRANDC $rhs, $lhs), $tval),
3381*9880d681SAndroid Build Coastguard Worker                 (CRAND (CRORC  $lhs, $rhs), $fval))>;
3382*9880d681SAndroid Build Coastguard Workerdef : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETUGT)),
3383*9880d681SAndroid Build Coastguard Worker           (CROR (CRAND (CRANDC $lhs, $rhs), $tval),
3384*9880d681SAndroid Build Coastguard Worker                 (CRAND (CRORC  $rhs, $lhs), $fval))>;
3385*9880d681SAndroid Build Coastguard Workerdef : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETNE)),
3386*9880d681SAndroid Build Coastguard Worker           (CROR (CRAND (CREQV $lhs, $rhs), $fval),
3387*9880d681SAndroid Build Coastguard Worker                 (CRAND (CRXOR $lhs, $rhs), $tval))>;
3388*9880d681SAndroid Build Coastguard Worker
3389*9880d681SAndroid Build Coastguard Worker// match selectcc on i1 variables with non-i1 output.
3390*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETLT)),
3391*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 (CRANDC $lhs, $rhs), $tval, $fval)>;
3392*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETULT)),
3393*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 (CRANDC $rhs, $lhs), $tval, $fval)>;
3394*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETLE)),
3395*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 (CRORC  $lhs, $rhs), $tval, $fval)>;
3396*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETULE)),
3397*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 (CRORC  $rhs, $lhs), $tval, $fval)>;
3398*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETEQ)),
3399*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 (CREQV $lhs, $rhs), $tval, $fval)>;
3400*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETGE)),
3401*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 (CRORC  $rhs, $lhs), $tval, $fval)>;
3402*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETUGE)),
3403*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 (CRORC  $lhs, $rhs), $tval, $fval)>;
3404*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETGT)),
3405*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 (CRANDC $rhs, $lhs), $tval, $fval)>;
3406*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETUGT)),
3407*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 (CRANDC $lhs, $rhs), $tval, $fval)>;
3408*9880d681SAndroid Build Coastguard Workerdef : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETNE)),
3409*9880d681SAndroid Build Coastguard Worker          (SELECT_I4 (CRXOR $lhs, $rhs), $tval, $fval)>;
3410*9880d681SAndroid Build Coastguard Worker
3411*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETLT)),
3412*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 (CRANDC $lhs, $rhs), $tval, $fval)>;
3413*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETULT)),
3414*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 (CRANDC $rhs, $lhs), $tval, $fval)>;
3415*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETLE)),
3416*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 (CRORC  $lhs, $rhs), $tval, $fval)>;
3417*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETULE)),
3418*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 (CRORC  $rhs, $lhs), $tval, $fval)>;
3419*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETEQ)),
3420*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 (CREQV $lhs, $rhs), $tval, $fval)>;
3421*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETGE)),
3422*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 (CRORC  $rhs, $lhs), $tval, $fval)>;
3423*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETUGE)),
3424*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 (CRORC  $lhs, $rhs), $tval, $fval)>;
3425*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETGT)),
3426*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 (CRANDC $rhs, $lhs), $tval, $fval)>;
3427*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETUGT)),
3428*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 (CRANDC $lhs, $rhs), $tval, $fval)>;
3429*9880d681SAndroid Build Coastguard Workerdef : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETNE)),
3430*9880d681SAndroid Build Coastguard Worker          (SELECT_I8 (CRXOR $lhs, $rhs), $tval, $fval)>;
3431*9880d681SAndroid Build Coastguard Worker
3432*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
3433*9880d681SAndroid Build Coastguard Worker          (SELECT_F4 (CRANDC $lhs, $rhs), $tval, $fval)>;
3434*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
3435*9880d681SAndroid Build Coastguard Worker          (SELECT_F4 (CRANDC $rhs, $lhs), $tval, $fval)>;
3436*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
3437*9880d681SAndroid Build Coastguard Worker          (SELECT_F4 (CRORC  $lhs, $rhs), $tval, $fval)>;
3438*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
3439*9880d681SAndroid Build Coastguard Worker          (SELECT_F4 (CRORC  $rhs, $lhs), $tval, $fval)>;
3440*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
3441*9880d681SAndroid Build Coastguard Worker          (SELECT_F4 (CREQV $lhs, $rhs), $tval, $fval)>;
3442*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
3443*9880d681SAndroid Build Coastguard Worker          (SELECT_F4 (CRORC  $rhs, $lhs), $tval, $fval)>;
3444*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
3445*9880d681SAndroid Build Coastguard Worker          (SELECT_F4 (CRORC  $lhs, $rhs), $tval, $fval)>;
3446*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
3447*9880d681SAndroid Build Coastguard Worker          (SELECT_F4 (CRANDC $rhs, $lhs), $tval, $fval)>;
3448*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
3449*9880d681SAndroid Build Coastguard Worker          (SELECT_F4 (CRANDC $lhs, $rhs), $tval, $fval)>;
3450*9880d681SAndroid Build Coastguard Workerdef : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
3451*9880d681SAndroid Build Coastguard Worker          (SELECT_F4 (CRXOR $lhs, $rhs), $tval, $fval)>;
3452*9880d681SAndroid Build Coastguard Worker
3453*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
3454*9880d681SAndroid Build Coastguard Worker          (SELECT_F8 (CRANDC $lhs, $rhs), $tval, $fval)>;
3455*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
3456*9880d681SAndroid Build Coastguard Worker          (SELECT_F8 (CRANDC $rhs, $lhs), $tval, $fval)>;
3457*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
3458*9880d681SAndroid Build Coastguard Worker          (SELECT_F8 (CRORC  $lhs, $rhs), $tval, $fval)>;
3459*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
3460*9880d681SAndroid Build Coastguard Worker          (SELECT_F8 (CRORC  $rhs, $lhs), $tval, $fval)>;
3461*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
3462*9880d681SAndroid Build Coastguard Worker          (SELECT_F8 (CREQV $lhs, $rhs), $tval, $fval)>;
3463*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
3464*9880d681SAndroid Build Coastguard Worker          (SELECT_F8 (CRORC  $rhs, $lhs), $tval, $fval)>;
3465*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
3466*9880d681SAndroid Build Coastguard Worker          (SELECT_F8 (CRORC  $lhs, $rhs), $tval, $fval)>;
3467*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
3468*9880d681SAndroid Build Coastguard Worker          (SELECT_F8 (CRANDC $rhs, $lhs), $tval, $fval)>;
3469*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
3470*9880d681SAndroid Build Coastguard Worker          (SELECT_F8 (CRANDC $lhs, $rhs), $tval, $fval)>;
3471*9880d681SAndroid Build Coastguard Workerdef : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
3472*9880d681SAndroid Build Coastguard Worker          (SELECT_F8 (CRXOR $lhs, $rhs), $tval, $fval)>;
3473*9880d681SAndroid Build Coastguard Worker
3474*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETLT)),
3475*9880d681SAndroid Build Coastguard Worker          (SELECT_VRRC (CRANDC $lhs, $rhs), $tval, $fval)>;
3476*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETULT)),
3477*9880d681SAndroid Build Coastguard Worker          (SELECT_VRRC (CRANDC $rhs, $lhs), $tval, $fval)>;
3478*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETLE)),
3479*9880d681SAndroid Build Coastguard Worker          (SELECT_VRRC (CRORC  $lhs, $rhs), $tval, $fval)>;
3480*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETULE)),
3481*9880d681SAndroid Build Coastguard Worker          (SELECT_VRRC (CRORC  $rhs, $lhs), $tval, $fval)>;
3482*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETEQ)),
3483*9880d681SAndroid Build Coastguard Worker          (SELECT_VRRC (CREQV $lhs, $rhs), $tval, $fval)>;
3484*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETGE)),
3485*9880d681SAndroid Build Coastguard Worker          (SELECT_VRRC (CRORC  $rhs, $lhs), $tval, $fval)>;
3486*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETUGE)),
3487*9880d681SAndroid Build Coastguard Worker          (SELECT_VRRC (CRORC  $lhs, $rhs), $tval, $fval)>;
3488*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETGT)),
3489*9880d681SAndroid Build Coastguard Worker          (SELECT_VRRC (CRANDC $rhs, $lhs), $tval, $fval)>;
3490*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETUGT)),
3491*9880d681SAndroid Build Coastguard Worker          (SELECT_VRRC (CRANDC $lhs, $rhs), $tval, $fval)>;
3492*9880d681SAndroid Build Coastguard Workerdef : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETNE)),
3493*9880d681SAndroid Build Coastguard Worker          (SELECT_VRRC (CRXOR $lhs, $rhs), $tval, $fval)>;
3494*9880d681SAndroid Build Coastguard Worker
3495*9880d681SAndroid Build Coastguard Workerlet usesCustomInserter = 1 in {
3496*9880d681SAndroid Build Coastguard Workerdef ANDIo_1_EQ_BIT : Pseudo<(outs crbitrc:$dst), (ins gprc:$in),
3497*9880d681SAndroid Build Coastguard Worker                             "#ANDIo_1_EQ_BIT",
3498*9880d681SAndroid Build Coastguard Worker                             [(set i1:$dst, (trunc (not i32:$in)))]>;
3499*9880d681SAndroid Build Coastguard Workerdef ANDIo_1_GT_BIT : Pseudo<(outs crbitrc:$dst), (ins gprc:$in),
3500*9880d681SAndroid Build Coastguard Worker                             "#ANDIo_1_GT_BIT",
3501*9880d681SAndroid Build Coastguard Worker                             [(set i1:$dst, (trunc i32:$in))]>;
3502*9880d681SAndroid Build Coastguard Worker
3503*9880d681SAndroid Build Coastguard Workerdef ANDIo_1_EQ_BIT8 : Pseudo<(outs crbitrc:$dst), (ins g8rc:$in),
3504*9880d681SAndroid Build Coastguard Worker                              "#ANDIo_1_EQ_BIT8",
3505*9880d681SAndroid Build Coastguard Worker                              [(set i1:$dst, (trunc (not i64:$in)))]>;
3506*9880d681SAndroid Build Coastguard Workerdef ANDIo_1_GT_BIT8 : Pseudo<(outs crbitrc:$dst), (ins g8rc:$in),
3507*9880d681SAndroid Build Coastguard Worker                              "#ANDIo_1_GT_BIT8",
3508*9880d681SAndroid Build Coastguard Worker                              [(set i1:$dst, (trunc i64:$in))]>;
3509*9880d681SAndroid Build Coastguard Worker}
3510*9880d681SAndroid Build Coastguard Worker
3511*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (not (trunc i32:$in))),
3512*9880d681SAndroid Build Coastguard Worker           (ANDIo_1_EQ_BIT $in)>;
3513*9880d681SAndroid Build Coastguard Workerdef : Pat<(i1 (not (trunc i64:$in))),
3514*9880d681SAndroid Build Coastguard Worker           (ANDIo_1_EQ_BIT8 $in)>;
3515*9880d681SAndroid Build Coastguard Worker
3516*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
3517*9880d681SAndroid Build Coastguard Worker// PowerPC Instructions used for assembler/disassembler only
3518*9880d681SAndroid Build Coastguard Worker//
3519*9880d681SAndroid Build Coastguard Worker
3520*9880d681SAndroid Build Coastguard Worker// FIXME: For B=0 or B > 8, the registers following RT are used.
3521*9880d681SAndroid Build Coastguard Worker// WARNING: Do not add patterns for this instruction without fixing this.
3522*9880d681SAndroid Build Coastguard Workerdef LSWI  : XForm_base_r3xo<31, 597, (outs gprc:$RT), (ins gprc:$A, u5imm:$B),
3523*9880d681SAndroid Build Coastguard Worker                            "lswi $RT, $A, $B", IIC_LdStLoad, []>;
3524*9880d681SAndroid Build Coastguard Worker
3525*9880d681SAndroid Build Coastguard Worker// FIXME: For B=0 or B > 8, the registers following RT are used.
3526*9880d681SAndroid Build Coastguard Worker// WARNING: Do not add patterns for this instruction without fixing this.
3527*9880d681SAndroid Build Coastguard Workerdef STSWI : XForm_base_r3xo<31, 725, (outs), (ins gprc:$RT, gprc:$A, u5imm:$B),
3528*9880d681SAndroid Build Coastguard Worker                            "stswi $RT, $A, $B", IIC_LdStLoad, []>;
3529*9880d681SAndroid Build Coastguard Worker
3530*9880d681SAndroid Build Coastguard Workerdef ISYNC : XLForm_2_ext<19, 150, 0, 0, 0, (outs), (ins),
3531*9880d681SAndroid Build Coastguard Worker                         "isync", IIC_SprISYNC, []>;
3532*9880d681SAndroid Build Coastguard Worker
3533*9880d681SAndroid Build Coastguard Workerdef ICBI : XForm_1a<31, 982, (outs), (ins memrr:$src),
3534*9880d681SAndroid Build Coastguard Worker                    "icbi $src", IIC_LdStICBI, []>;
3535*9880d681SAndroid Build Coastguard Worker
3536*9880d681SAndroid Build Coastguard Worker// We used to have EIEIO as value but E[0-9A-Z] is a reserved name
3537*9880d681SAndroid Build Coastguard Workerdef EnforceIEIO : XForm_24_eieio<31, 854, (outs), (ins),
3538*9880d681SAndroid Build Coastguard Worker                           "eieio", IIC_LdStLoad, []>;
3539*9880d681SAndroid Build Coastguard Worker
3540*9880d681SAndroid Build Coastguard Workerdef WAIT : XForm_24_sync<31, 62, (outs), (ins i32imm:$L),
3541*9880d681SAndroid Build Coastguard Worker                         "wait $L", IIC_LdStLoad, []>;
3542*9880d681SAndroid Build Coastguard Worker
3543*9880d681SAndroid Build Coastguard Workerdef MBAR : XForm_mbar<31, 854, (outs), (ins u5imm:$MO),
3544*9880d681SAndroid Build Coastguard Worker                         "mbar $MO", IIC_LdStLoad>, Requires<[IsBookE]>;
3545*9880d681SAndroid Build Coastguard Worker
3546*9880d681SAndroid Build Coastguard Workerdef MTSR: XForm_sr<31, 210, (outs), (ins gprc:$RS, u4imm:$SR),
3547*9880d681SAndroid Build Coastguard Worker            "mtsr $SR, $RS", IIC_SprMTSR>;
3548*9880d681SAndroid Build Coastguard Worker
3549*9880d681SAndroid Build Coastguard Workerdef MFSR: XForm_sr<31, 595, (outs gprc:$RS), (ins u4imm:$SR),
3550*9880d681SAndroid Build Coastguard Worker            "mfsr $RS, $SR", IIC_SprMFSR>;
3551*9880d681SAndroid Build Coastguard Worker
3552*9880d681SAndroid Build Coastguard Workerdef MTSRIN: XForm_srin<31, 242, (outs), (ins gprc:$RS, gprc:$RB),
3553*9880d681SAndroid Build Coastguard Worker            "mtsrin $RS, $RB", IIC_SprMTSR>;
3554*9880d681SAndroid Build Coastguard Worker
3555*9880d681SAndroid Build Coastguard Workerdef MFSRIN: XForm_srin<31, 659, (outs gprc:$RS), (ins gprc:$RB),
3556*9880d681SAndroid Build Coastguard Worker            "mfsrin $RS, $RB", IIC_SprMFSR>;
3557*9880d681SAndroid Build Coastguard Worker
3558*9880d681SAndroid Build Coastguard Workerdef MTMSR: XForm_mtmsr<31, 146, (outs), (ins gprc:$RS, i32imm:$L),
3559*9880d681SAndroid Build Coastguard Worker                    "mtmsr $RS, $L", IIC_SprMTMSR>;
3560*9880d681SAndroid Build Coastguard Worker
3561*9880d681SAndroid Build Coastguard Workerdef WRTEE: XForm_mtmsr<31, 131, (outs), (ins gprc:$RS),
3562*9880d681SAndroid Build Coastguard Worker                    "wrtee $RS", IIC_SprMTMSR>, Requires<[IsBookE]> {
3563*9880d681SAndroid Build Coastguard Worker  let L = 0;
3564*9880d681SAndroid Build Coastguard Worker}
3565*9880d681SAndroid Build Coastguard Worker
3566*9880d681SAndroid Build Coastguard Workerdef WRTEEI: I<31, (outs), (ins i1imm:$E), "wrteei $E", IIC_SprMTMSR>,
3567*9880d681SAndroid Build Coastguard Worker              Requires<[IsBookE]> {
3568*9880d681SAndroid Build Coastguard Worker  bits<1> E;
3569*9880d681SAndroid Build Coastguard Worker
3570*9880d681SAndroid Build Coastguard Worker  let Inst{16} = E;
3571*9880d681SAndroid Build Coastguard Worker  let Inst{21-30} = 163;
3572*9880d681SAndroid Build Coastguard Worker}
3573*9880d681SAndroid Build Coastguard Worker
3574*9880d681SAndroid Build Coastguard Workerdef DCCCI : XForm_tlb<454, (outs), (ins gprc:$A, gprc:$B),
3575*9880d681SAndroid Build Coastguard Worker               "dccci $A, $B", IIC_LdStLoad>, Requires<[IsPPC4xx]>;
3576*9880d681SAndroid Build Coastguard Workerdef ICCCI : XForm_tlb<966, (outs), (ins gprc:$A, gprc:$B),
3577*9880d681SAndroid Build Coastguard Worker               "iccci $A, $B", IIC_LdStLoad>, Requires<[IsPPC4xx]>;
3578*9880d681SAndroid Build Coastguard Worker
3579*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"dci 0", (DCCCI R0, R0)>, Requires<[IsPPC4xx]>;
3580*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"dccci", (DCCCI R0, R0)>, Requires<[IsPPC4xx]>;
3581*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ici 0", (ICCCI R0, R0)>, Requires<[IsPPC4xx]>;
3582*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"iccci", (ICCCI R0, R0)>, Requires<[IsPPC4xx]>;
3583*9880d681SAndroid Build Coastguard Worker
3584*9880d681SAndroid Build Coastguard Workerdef MFMSR : XForm_rs<31, 83, (outs gprc:$RT), (ins),
3585*9880d681SAndroid Build Coastguard Worker                  "mfmsr $RT", IIC_SprMFMSR, []>;
3586*9880d681SAndroid Build Coastguard Worker
3587*9880d681SAndroid Build Coastguard Workerdef MTMSRD : XForm_mtmsr<31, 178, (outs), (ins gprc:$RS, i32imm:$L),
3588*9880d681SAndroid Build Coastguard Worker                    "mtmsrd $RS, $L", IIC_SprMTMSRD>;
3589*9880d681SAndroid Build Coastguard Worker
3590*9880d681SAndroid Build Coastguard Workerdef MCRFS : XLForm_3<63, 64, (outs crrc:$BF), (ins crrc:$BFA),
3591*9880d681SAndroid Build Coastguard Worker                     "mcrfs $BF, $BFA", IIC_BrMCR>;
3592*9880d681SAndroid Build Coastguard Worker
3593*9880d681SAndroid Build Coastguard Workerdef MTFSFI : XLForm_4<63, 134, (outs crrc:$BF), (ins i32imm:$U, i32imm:$W),
3594*9880d681SAndroid Build Coastguard Worker                      "mtfsfi $BF, $U, $W", IIC_IntMFFS>;
3595*9880d681SAndroid Build Coastguard Worker
3596*9880d681SAndroid Build Coastguard Workerdef MTFSFIo : XLForm_4<63, 134, (outs crrc:$BF), (ins i32imm:$U, i32imm:$W),
3597*9880d681SAndroid Build Coastguard Worker                       "mtfsfi. $BF, $U, $W", IIC_IntMFFS>, isDOT;
3598*9880d681SAndroid Build Coastguard Worker
3599*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtfsfi $BF, $U", (MTFSFI crrc:$BF, i32imm:$U, 0)>;
3600*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtfsfi. $BF, $U", (MTFSFIo crrc:$BF, i32imm:$U, 0)>;
3601*9880d681SAndroid Build Coastguard Worker
3602*9880d681SAndroid Build Coastguard Workerdef MTFSF : XFLForm_1<63, 711, (outs),
3603*9880d681SAndroid Build Coastguard Worker                      (ins i32imm:$FLM, f8rc:$FRB, i32imm:$L, i32imm:$W),
3604*9880d681SAndroid Build Coastguard Worker                      "mtfsf $FLM, $FRB, $L, $W", IIC_IntMFFS, []>;
3605*9880d681SAndroid Build Coastguard Workerdef MTFSFo : XFLForm_1<63, 711, (outs),
3606*9880d681SAndroid Build Coastguard Worker                       (ins i32imm:$FLM, f8rc:$FRB, i32imm:$L, i32imm:$W),
3607*9880d681SAndroid Build Coastguard Worker                       "mtfsf. $FLM, $FRB, $L, $W", IIC_IntMFFS, []>, isDOT;
3608*9880d681SAndroid Build Coastguard Worker
3609*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtfsf $FLM, $FRB", (MTFSF i32imm:$FLM, f8rc:$FRB, 0, 0)>;
3610*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtfsf. $FLM, $FRB", (MTFSFo i32imm:$FLM, f8rc:$FRB, 0, 0)>;
3611*9880d681SAndroid Build Coastguard Worker
3612*9880d681SAndroid Build Coastguard Workerdef SLBIE : XForm_16b<31, 434, (outs), (ins gprc:$RB),
3613*9880d681SAndroid Build Coastguard Worker                        "slbie $RB", IIC_SprSLBIE, []>;
3614*9880d681SAndroid Build Coastguard Worker
3615*9880d681SAndroid Build Coastguard Workerdef SLBMTE : XForm_26<31, 402, (outs), (ins gprc:$RS, gprc:$RB),
3616*9880d681SAndroid Build Coastguard Worker                    "slbmte $RS, $RB", IIC_SprSLBMTE, []>;
3617*9880d681SAndroid Build Coastguard Worker
3618*9880d681SAndroid Build Coastguard Workerdef SLBMFEE : XForm_26<31, 915, (outs gprc:$RT), (ins gprc:$RB),
3619*9880d681SAndroid Build Coastguard Worker                       "slbmfee $RT, $RB", IIC_SprSLBMFEE, []>;
3620*9880d681SAndroid Build Coastguard Worker
3621*9880d681SAndroid Build Coastguard Workerdef SLBIA : XForm_0<31, 498, (outs), (ins), "slbia", IIC_SprSLBIA, []>;
3622*9880d681SAndroid Build Coastguard Worker
3623*9880d681SAndroid Build Coastguard Workerdef TLBIA : XForm_0<31, 370, (outs), (ins),
3624*9880d681SAndroid Build Coastguard Worker                        "tlbia", IIC_SprTLBIA, []>;
3625*9880d681SAndroid Build Coastguard Worker
3626*9880d681SAndroid Build Coastguard Workerdef TLBSYNC : XForm_0<31, 566, (outs), (ins),
3627*9880d681SAndroid Build Coastguard Worker                        "tlbsync", IIC_SprTLBSYNC, []>;
3628*9880d681SAndroid Build Coastguard Worker
3629*9880d681SAndroid Build Coastguard Workerdef TLBIEL : XForm_16b<31, 274, (outs), (ins gprc:$RB),
3630*9880d681SAndroid Build Coastguard Worker                          "tlbiel $RB", IIC_SprTLBIEL, []>;
3631*9880d681SAndroid Build Coastguard Worker
3632*9880d681SAndroid Build Coastguard Workerdef TLBLD : XForm_16b<31, 978, (outs), (ins gprc:$RB),
3633*9880d681SAndroid Build Coastguard Worker                          "tlbld $RB", IIC_LdStLoad, []>, Requires<[IsPPC6xx]>;
3634*9880d681SAndroid Build Coastguard Workerdef TLBLI : XForm_16b<31, 1010, (outs), (ins gprc:$RB),
3635*9880d681SAndroid Build Coastguard Worker                          "tlbli $RB", IIC_LdStLoad, []>, Requires<[IsPPC6xx]>;
3636*9880d681SAndroid Build Coastguard Worker
3637*9880d681SAndroid Build Coastguard Workerdef TLBIE : XForm_26<31, 306, (outs), (ins gprc:$RS, gprc:$RB),
3638*9880d681SAndroid Build Coastguard Worker                          "tlbie $RB,$RS", IIC_SprTLBIE, []>;
3639*9880d681SAndroid Build Coastguard Worker
3640*9880d681SAndroid Build Coastguard Workerdef TLBSX : XForm_tlb<914, (outs), (ins gprc:$A, gprc:$B), "tlbsx $A, $B",
3641*9880d681SAndroid Build Coastguard Worker                IIC_LdStLoad>, Requires<[IsBookE]>;
3642*9880d681SAndroid Build Coastguard Worker
3643*9880d681SAndroid Build Coastguard Workerdef TLBIVAX : XForm_tlb<786, (outs), (ins gprc:$A, gprc:$B), "tlbivax $A, $B",
3644*9880d681SAndroid Build Coastguard Worker                IIC_LdStLoad>, Requires<[IsBookE]>;
3645*9880d681SAndroid Build Coastguard Worker
3646*9880d681SAndroid Build Coastguard Workerdef TLBRE : XForm_24_eieio<31, 946, (outs), (ins),
3647*9880d681SAndroid Build Coastguard Worker                           "tlbre", IIC_LdStLoad, []>, Requires<[IsBookE]>;
3648*9880d681SAndroid Build Coastguard Worker
3649*9880d681SAndroid Build Coastguard Workerdef TLBWE : XForm_24_eieio<31, 978, (outs), (ins),
3650*9880d681SAndroid Build Coastguard Worker                           "tlbwe", IIC_LdStLoad, []>, Requires<[IsBookE]>;
3651*9880d681SAndroid Build Coastguard Worker
3652*9880d681SAndroid Build Coastguard Workerdef TLBRE2 : XForm_tlbws<31, 946, (outs gprc:$RS), (ins gprc:$A, i1imm:$WS),
3653*9880d681SAndroid Build Coastguard Worker               "tlbre $RS, $A, $WS", IIC_LdStLoad, []>, Requires<[IsPPC4xx]>;
3654*9880d681SAndroid Build Coastguard Worker
3655*9880d681SAndroid Build Coastguard Workerdef TLBWE2 : XForm_tlbws<31, 978, (outs), (ins gprc:$RS, gprc:$A, i1imm:$WS),
3656*9880d681SAndroid Build Coastguard Worker               "tlbwe $RS, $A, $WS", IIC_LdStLoad, []>, Requires<[IsPPC4xx]>;
3657*9880d681SAndroid Build Coastguard Worker
3658*9880d681SAndroid Build Coastguard Workerdef TLBSX2 : XForm_base_r3xo<31, 914, (outs), (ins gprc:$RST, gprc:$A, gprc:$B),
3659*9880d681SAndroid Build Coastguard Worker                             "tlbsx $RST, $A, $B", IIC_LdStLoad, []>,
3660*9880d681SAndroid Build Coastguard Worker                             Requires<[IsPPC4xx]>;
3661*9880d681SAndroid Build Coastguard Workerdef TLBSX2D : XForm_base_r3xo<31, 914, (outs),
3662*9880d681SAndroid Build Coastguard Worker                              (ins gprc:$RST, gprc:$A, gprc:$B),
3663*9880d681SAndroid Build Coastguard Worker                              "tlbsx. $RST, $A, $B", IIC_LdStLoad, []>,
3664*9880d681SAndroid Build Coastguard Worker                              Requires<[IsPPC4xx]>, isDOT;
3665*9880d681SAndroid Build Coastguard Worker
3666*9880d681SAndroid Build Coastguard Workerdef RFID : XForm_0<19, 18, (outs), (ins), "rfid", IIC_IntRFID, []>;
3667*9880d681SAndroid Build Coastguard Worker
3668*9880d681SAndroid Build Coastguard Workerdef RFI : XForm_0<19, 50, (outs), (ins), "rfi", IIC_SprRFI, []>,
3669*9880d681SAndroid Build Coastguard Worker                  Requires<[IsBookE]>;
3670*9880d681SAndroid Build Coastguard Workerdef RFCI : XForm_0<19, 51, (outs), (ins), "rfci", IIC_BrB, []>,
3671*9880d681SAndroid Build Coastguard Worker                   Requires<[IsBookE]>;
3672*9880d681SAndroid Build Coastguard Worker
3673*9880d681SAndroid Build Coastguard Workerdef RFDI : XForm_0<19, 39, (outs), (ins), "rfdi", IIC_BrB, []>,
3674*9880d681SAndroid Build Coastguard Worker                   Requires<[IsE500]>;
3675*9880d681SAndroid Build Coastguard Workerdef RFMCI : XForm_0<19, 38, (outs), (ins), "rfmci", IIC_BrB, []>,
3676*9880d681SAndroid Build Coastguard Worker                    Requires<[IsE500]>;
3677*9880d681SAndroid Build Coastguard Worker
3678*9880d681SAndroid Build Coastguard Workerdef MFDCR : XFXForm_1<31, 323, (outs gprc:$RT), (ins i32imm:$SPR),
3679*9880d681SAndroid Build Coastguard Worker                      "mfdcr $RT, $SPR", IIC_SprMFSPR>, Requires<[IsPPC4xx]>;
3680*9880d681SAndroid Build Coastguard Workerdef MTDCR : XFXForm_1<31, 451, (outs), (ins gprc:$RT, i32imm:$SPR),
3681*9880d681SAndroid Build Coastguard Worker                      "mtdcr $SPR, $RT", IIC_SprMTSPR>, Requires<[IsPPC4xx]>;
3682*9880d681SAndroid Build Coastguard Worker
3683*9880d681SAndroid Build Coastguard Workerdef ATTN : XForm_attn<0, 256, (outs), (ins), "attn", IIC_BrB>;
3684*9880d681SAndroid Build Coastguard Worker
3685*9880d681SAndroid Build Coastguard Workerdef LBZCIX : XForm_base_r3xo<31, 853, (outs gprc:$RST), (ins gprc:$A, gprc:$B),
3686*9880d681SAndroid Build Coastguard Worker                             "lbzcix $RST, $A, $B", IIC_LdStLoad, []>;
3687*9880d681SAndroid Build Coastguard Workerdef LHZCIX : XForm_base_r3xo<31, 821, (outs gprc:$RST), (ins gprc:$A, gprc:$B),
3688*9880d681SAndroid Build Coastguard Worker                             "lhzcix $RST, $A, $B", IIC_LdStLoad, []>;
3689*9880d681SAndroid Build Coastguard Workerdef LWZCIX : XForm_base_r3xo<31, 789, (outs gprc:$RST), (ins gprc:$A, gprc:$B),
3690*9880d681SAndroid Build Coastguard Worker                             "lwzcix $RST, $A, $B", IIC_LdStLoad, []>;
3691*9880d681SAndroid Build Coastguard Workerdef LDCIX :  XForm_base_r3xo<31, 885, (outs gprc:$RST), (ins gprc:$A, gprc:$B),
3692*9880d681SAndroid Build Coastguard Worker                             "ldcix $RST, $A, $B", IIC_LdStLoad, []>;
3693*9880d681SAndroid Build Coastguard Worker
3694*9880d681SAndroid Build Coastguard Workerdef STBCIX : XForm_base_r3xo<31, 981, (outs), (ins gprc:$RST, gprc:$A, gprc:$B),
3695*9880d681SAndroid Build Coastguard Worker                             "stbcix $RST, $A, $B", IIC_LdStLoad, []>;
3696*9880d681SAndroid Build Coastguard Workerdef STHCIX : XForm_base_r3xo<31, 949, (outs), (ins gprc:$RST, gprc:$A, gprc:$B),
3697*9880d681SAndroid Build Coastguard Worker                             "sthcix $RST, $A, $B", IIC_LdStLoad, []>;
3698*9880d681SAndroid Build Coastguard Workerdef STWCIX : XForm_base_r3xo<31, 917, (outs), (ins gprc:$RST, gprc:$A, gprc:$B),
3699*9880d681SAndroid Build Coastguard Worker                             "stwcix $RST, $A, $B", IIC_LdStLoad, []>;
3700*9880d681SAndroid Build Coastguard Workerdef STDCIX : XForm_base_r3xo<31, 1013, (outs), (ins gprc:$RST, gprc:$A, gprc:$B),
3701*9880d681SAndroid Build Coastguard Worker                             "stdcix $RST, $A, $B", IIC_LdStLoad, []>;
3702*9880d681SAndroid Build Coastguard Worker
3703*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
3704*9880d681SAndroid Build Coastguard Worker// PowerPC Assembler Instruction Aliases
3705*9880d681SAndroid Build Coastguard Worker//
3706*9880d681SAndroid Build Coastguard Worker
3707*9880d681SAndroid Build Coastguard Worker// Pseudo-instructions for alternate assembly syntax (never used by codegen).
3708*9880d681SAndroid Build Coastguard Worker// These are aliases that require C++ handling to convert to the target
3709*9880d681SAndroid Build Coastguard Worker// instruction, while InstAliases can be handled directly by tblgen.
3710*9880d681SAndroid Build Coastguard Workerclass PPCAsmPseudo<string asm, dag iops>
3711*9880d681SAndroid Build Coastguard Worker  : Instruction {
3712*9880d681SAndroid Build Coastguard Worker  let Namespace = "PPC";
3713*9880d681SAndroid Build Coastguard Worker  bit PPC64 = 0;  // Default value, override with isPPC64
3714*9880d681SAndroid Build Coastguard Worker
3715*9880d681SAndroid Build Coastguard Worker  let OutOperandList = (outs);
3716*9880d681SAndroid Build Coastguard Worker  let InOperandList = iops;
3717*9880d681SAndroid Build Coastguard Worker  let Pattern = [];
3718*9880d681SAndroid Build Coastguard Worker  let AsmString = asm;
3719*9880d681SAndroid Build Coastguard Worker  let isAsmParserOnly = 1;
3720*9880d681SAndroid Build Coastguard Worker  let isPseudo = 1;
3721*9880d681SAndroid Build Coastguard Worker}
3722*9880d681SAndroid Build Coastguard Worker
3723*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sc", (SC 0)>;
3724*9880d681SAndroid Build Coastguard Worker
3725*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sync", (SYNC 0)>, Requires<[HasSYNC]>;
3726*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"msync", (SYNC 0), 0>, Requires<[HasSYNC]>;
3727*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"lwsync", (SYNC 1)>, Requires<[HasSYNC]>;
3728*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"ptesync", (SYNC 2)>, Requires<[HasSYNC]>;
3729*9880d681SAndroid Build Coastguard Worker
3730*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"wait", (WAIT 0)>;
3731*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"waitrsv", (WAIT 1)>;
3732*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"waitimpl", (WAIT 2)>;
3733*9880d681SAndroid Build Coastguard Worker
3734*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mbar", (MBAR 0)>, Requires<[IsBookE]>;
3735*9880d681SAndroid Build Coastguard Worker
3736*9880d681SAndroid Build Coastguard Workerdef DCBTx   : PPCAsmPseudo<"dcbt $dst", (ins memrr:$dst)>;
3737*9880d681SAndroid Build Coastguard Workerdef DCBTSTx : PPCAsmPseudo<"dcbtst $dst", (ins memrr:$dst)>;
3738*9880d681SAndroid Build Coastguard Worker
3739*9880d681SAndroid Build Coastguard Workerdef DCBTCT : PPCAsmPseudo<"dcbtct $dst, $TH", (ins memrr:$dst, u5imm:$TH)>;
3740*9880d681SAndroid Build Coastguard Workerdef DCBTDS : PPCAsmPseudo<"dcbtds $dst, $TH", (ins memrr:$dst, u5imm:$TH)>;
3741*9880d681SAndroid Build Coastguard Workerdef DCBTT  : PPCAsmPseudo<"dcbtt $dst", (ins memrr:$dst)>;
3742*9880d681SAndroid Build Coastguard Worker
3743*9880d681SAndroid Build Coastguard Workerdef DCBTSTCT : PPCAsmPseudo<"dcbtstct $dst, $TH", (ins memrr:$dst, u5imm:$TH)>;
3744*9880d681SAndroid Build Coastguard Workerdef DCBTSTDS : PPCAsmPseudo<"dcbtstds $dst, $TH", (ins memrr:$dst, u5imm:$TH)>;
3745*9880d681SAndroid Build Coastguard Workerdef DCBTSTT  : PPCAsmPseudo<"dcbtstt $dst", (ins memrr:$dst)>;
3746*9880d681SAndroid Build Coastguard Worker
3747*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"crset $bx", (CREQV crbitrc:$bx, crbitrc:$bx, crbitrc:$bx)>;
3748*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"crclr $bx", (CRXOR crbitrc:$bx, crbitrc:$bx, crbitrc:$bx)>;
3749*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"crmove $bx, $by", (CROR crbitrc:$bx, crbitrc:$by, crbitrc:$by)>;
3750*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"crnot $bx, $by", (CRNOR crbitrc:$bx, crbitrc:$by, crbitrc:$by)>;
3751*9880d681SAndroid Build Coastguard Worker
3752*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtxer $Rx", (MTSPR 1, gprc:$Rx)>;
3753*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfxer $Rx", (MFSPR gprc:$Rx, 1)>;
3754*9880d681SAndroid Build Coastguard Worker
3755*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfrtcu $Rx", (MFSPR gprc:$Rx, 4)>;
3756*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfrtcl $Rx", (MFSPR gprc:$Rx, 5)>;
3757*9880d681SAndroid Build Coastguard Worker
3758*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtdscr $Rx", (MTSPR 17, gprc:$Rx)>;
3759*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfdscr $Rx", (MFSPR gprc:$Rx, 17)>;
3760*9880d681SAndroid Build Coastguard Worker
3761*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtdsisr $Rx", (MTSPR 18, gprc:$Rx)>;
3762*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfdsisr $Rx", (MFSPR gprc:$Rx, 18)>;
3763*9880d681SAndroid Build Coastguard Worker
3764*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtdar $Rx", (MTSPR 19, gprc:$Rx)>;
3765*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfdar $Rx", (MFSPR gprc:$Rx, 19)>;
3766*9880d681SAndroid Build Coastguard Worker
3767*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtdec $Rx", (MTSPR 22, gprc:$Rx)>;
3768*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfdec $Rx", (MFSPR gprc:$Rx, 22)>;
3769*9880d681SAndroid Build Coastguard Worker
3770*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtsdr1 $Rx", (MTSPR 25, gprc:$Rx)>;
3771*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfsdr1 $Rx", (MFSPR gprc:$Rx, 25)>;
3772*9880d681SAndroid Build Coastguard Worker
3773*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtsrr0 $Rx", (MTSPR 26, gprc:$Rx)>;
3774*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfsrr0 $Rx", (MFSPR gprc:$Rx, 26)>;
3775*9880d681SAndroid Build Coastguard Worker
3776*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtsrr1 $Rx", (MTSPR 27, gprc:$Rx)>;
3777*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfsrr1 $Rx", (MFSPR gprc:$Rx, 27)>;
3778*9880d681SAndroid Build Coastguard Worker
3779*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtsrr2 $Rx", (MTSPR 990, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3780*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfsrr2 $Rx", (MFSPR gprc:$Rx, 990)>, Requires<[IsPPC4xx]>;
3781*9880d681SAndroid Build Coastguard Worker
3782*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtsrr3 $Rx", (MTSPR 991, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3783*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfsrr3 $Rx", (MFSPR gprc:$Rx, 991)>, Requires<[IsPPC4xx]>;
3784*9880d681SAndroid Build Coastguard Worker
3785*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtcfar $Rx", (MTSPR 28, gprc:$Rx)>;
3786*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfcfar $Rx", (MFSPR gprc:$Rx, 28)>;
3787*9880d681SAndroid Build Coastguard Worker
3788*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtamr $Rx", (MTSPR 29, gprc:$Rx)>;
3789*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfamr $Rx", (MFSPR gprc:$Rx, 29)>;
3790*9880d681SAndroid Build Coastguard Worker
3791*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtpid $Rx", (MTSPR 48, gprc:$Rx)>, Requires<[IsBookE]>;
3792*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfpid $Rx", (MFSPR gprc:$Rx, 48)>, Requires<[IsBookE]>;
3793*9880d681SAndroid Build Coastguard Worker
3794*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mftb $Rx", (MFTB gprc:$Rx, 268)>;
3795*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mftbl $Rx", (MFTB gprc:$Rx, 268)>;
3796*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mftbu $Rx", (MFTB gprc:$Rx, 269)>;
3797*9880d681SAndroid Build Coastguard Worker
3798*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mttbl $Rx", (MTSPR 284, gprc:$Rx)>;
3799*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mttbu $Rx", (MTSPR 285, gprc:$Rx)>;
3800*9880d681SAndroid Build Coastguard Worker
3801*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mftblo $Rx", (MFSPR gprc:$Rx, 989)>, Requires<[IsPPC4xx]>;
3802*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mttblo $Rx", (MTSPR 989, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3803*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mftbhi $Rx", (MFSPR gprc:$Rx, 988)>, Requires<[IsPPC4xx]>;
3804*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mttbhi $Rx", (MTSPR 988, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3805*9880d681SAndroid Build Coastguard Worker
3806*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"xnop", (XORI R0, R0, 0)>;
3807*9880d681SAndroid Build Coastguard Worker
3808*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mr $rA, $rB", (OR8 g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
3809*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mr. $rA, $rB", (OR8o g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
3810*9880d681SAndroid Build Coastguard Worker
3811*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"not $rA, $rB", (NOR8 g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
3812*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"not. $rA, $rB", (NOR8o g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
3813*9880d681SAndroid Build Coastguard Worker
3814*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtcr $rA", (MTCRF8 255, g8rc:$rA)>;
3815*9880d681SAndroid Build Coastguard Worker
3816*9880d681SAndroid Build Coastguard Workerforeach BATR = 0-3 in {
3817*9880d681SAndroid Build Coastguard Worker    def : InstAlias<"mtdbatu "#BATR#", $Rx",
3818*9880d681SAndroid Build Coastguard Worker                    (MTSPR !add(BATR, !add(BATR, 536)), gprc:$Rx)>,
3819*9880d681SAndroid Build Coastguard Worker                    Requires<[IsPPC6xx]>;
3820*9880d681SAndroid Build Coastguard Worker    def : InstAlias<"mfdbatu $Rx, "#BATR,
3821*9880d681SAndroid Build Coastguard Worker                    (MFSPR gprc:$Rx, !add(BATR, !add(BATR, 536)))>,
3822*9880d681SAndroid Build Coastguard Worker                    Requires<[IsPPC6xx]>;
3823*9880d681SAndroid Build Coastguard Worker    def : InstAlias<"mtdbatl "#BATR#", $Rx",
3824*9880d681SAndroid Build Coastguard Worker                    (MTSPR !add(BATR, !add(BATR, 537)), gprc:$Rx)>,
3825*9880d681SAndroid Build Coastguard Worker                    Requires<[IsPPC6xx]>;
3826*9880d681SAndroid Build Coastguard Worker    def : InstAlias<"mfdbatl $Rx, "#BATR,
3827*9880d681SAndroid Build Coastguard Worker                    (MFSPR gprc:$Rx, !add(BATR, !add(BATR, 537)))>,
3828*9880d681SAndroid Build Coastguard Worker                    Requires<[IsPPC6xx]>;
3829*9880d681SAndroid Build Coastguard Worker    def : InstAlias<"mtibatu "#BATR#", $Rx",
3830*9880d681SAndroid Build Coastguard Worker                    (MTSPR !add(BATR, !add(BATR, 528)), gprc:$Rx)>,
3831*9880d681SAndroid Build Coastguard Worker                    Requires<[IsPPC6xx]>;
3832*9880d681SAndroid Build Coastguard Worker    def : InstAlias<"mfibatu $Rx, "#BATR,
3833*9880d681SAndroid Build Coastguard Worker                    (MFSPR gprc:$Rx, !add(BATR, !add(BATR, 528)))>,
3834*9880d681SAndroid Build Coastguard Worker                    Requires<[IsPPC6xx]>;
3835*9880d681SAndroid Build Coastguard Worker    def : InstAlias<"mtibatl "#BATR#", $Rx",
3836*9880d681SAndroid Build Coastguard Worker                    (MTSPR !add(BATR, !add(BATR, 529)), gprc:$Rx)>,
3837*9880d681SAndroid Build Coastguard Worker                    Requires<[IsPPC6xx]>;
3838*9880d681SAndroid Build Coastguard Worker    def : InstAlias<"mfibatl $Rx, "#BATR,
3839*9880d681SAndroid Build Coastguard Worker                    (MFSPR gprc:$Rx, !add(BATR, !add(BATR, 529)))>,
3840*9880d681SAndroid Build Coastguard Worker                    Requires<[IsPPC6xx]>;
3841*9880d681SAndroid Build Coastguard Worker}
3842*9880d681SAndroid Build Coastguard Worker
3843*9880d681SAndroid Build Coastguard Workerforeach BR = 0-7 in {
3844*9880d681SAndroid Build Coastguard Worker    def : InstAlias<"mfbr"#BR#" $Rx",
3845*9880d681SAndroid Build Coastguard Worker                    (MFDCR gprc:$Rx, !add(BR, 0x80))>,
3846*9880d681SAndroid Build Coastguard Worker                    Requires<[IsPPC4xx]>;
3847*9880d681SAndroid Build Coastguard Worker    def : InstAlias<"mtbr"#BR#" $Rx",
3848*9880d681SAndroid Build Coastguard Worker                    (MTDCR gprc:$Rx, !add(BR, 0x80))>,
3849*9880d681SAndroid Build Coastguard Worker                    Requires<[IsPPC4xx]>;
3850*9880d681SAndroid Build Coastguard Worker}
3851*9880d681SAndroid Build Coastguard Worker
3852*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtdccr $Rx", (MTSPR 1018, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3853*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfdccr $Rx", (MFSPR gprc:$Rx, 1018)>, Requires<[IsPPC4xx]>;
3854*9880d681SAndroid Build Coastguard Worker
3855*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mticcr $Rx", (MTSPR 1019, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3856*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mficcr $Rx", (MFSPR gprc:$Rx, 1019)>, Requires<[IsPPC4xx]>;
3857*9880d681SAndroid Build Coastguard Worker
3858*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtdear $Rx", (MTSPR 981, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3859*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfdear $Rx", (MFSPR gprc:$Rx, 981)>, Requires<[IsPPC4xx]>;
3860*9880d681SAndroid Build Coastguard Worker
3861*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtesr $Rx", (MTSPR 980, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3862*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfesr $Rx", (MFSPR gprc:$Rx, 980)>, Requires<[IsPPC4xx]>;
3863*9880d681SAndroid Build Coastguard Worker
3864*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfspefscr $Rx", (MFSPR gprc:$Rx, 512)>;
3865*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtspefscr $Rx", (MTSPR 512, gprc:$Rx)>;
3866*9880d681SAndroid Build Coastguard Worker
3867*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mttcr $Rx", (MTSPR 986, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3868*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mftcr $Rx", (MFSPR gprc:$Rx, 986)>, Requires<[IsPPC4xx]>;
3869*9880d681SAndroid Build Coastguard Worker
3870*9880d681SAndroid Build Coastguard Workerdef LAx : PPCAsmPseudo<"la $rA, $addr", (ins gprc:$rA, memri:$addr)>;
3871*9880d681SAndroid Build Coastguard Worker
3872*9880d681SAndroid Build Coastguard Workerdef SUBI : PPCAsmPseudo<"subi $rA, $rB, $imm",
3873*9880d681SAndroid Build Coastguard Worker                        (ins gprc:$rA, gprc:$rB, s16imm:$imm)>;
3874*9880d681SAndroid Build Coastguard Workerdef SUBIS : PPCAsmPseudo<"subis $rA, $rB, $imm",
3875*9880d681SAndroid Build Coastguard Worker                         (ins gprc:$rA, gprc:$rB, s16imm:$imm)>;
3876*9880d681SAndroid Build Coastguard Workerdef SUBIC : PPCAsmPseudo<"subic $rA, $rB, $imm",
3877*9880d681SAndroid Build Coastguard Worker                         (ins gprc:$rA, gprc:$rB, s16imm:$imm)>;
3878*9880d681SAndroid Build Coastguard Workerdef SUBICo : PPCAsmPseudo<"subic. $rA, $rB, $imm",
3879*9880d681SAndroid Build Coastguard Worker                          (ins gprc:$rA, gprc:$rB, s16imm:$imm)>;
3880*9880d681SAndroid Build Coastguard Worker
3881*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sub $rA, $rB, $rC", (SUBF8 g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
3882*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"sub. $rA, $rB, $rC", (SUBF8o g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
3883*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"subc $rA, $rB, $rC", (SUBFC8 g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
3884*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"subc. $rA, $rB, $rC", (SUBFC8o g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
3885*9880d681SAndroid Build Coastguard Worker
3886*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtmsrd $RS", (MTMSRD gprc:$RS, 0)>;
3887*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtmsr $RS", (MTMSR gprc:$RS, 0)>;
3888*9880d681SAndroid Build Coastguard Worker
3889*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfasr $RT", (MFSPR gprc:$RT, 280)>;
3890*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtasr $RT", (MTSPR 280, gprc:$RT)>;
3891*9880d681SAndroid Build Coastguard Worker
3892*9880d681SAndroid Build Coastguard Workerforeach SPRG = 0-3 in {
3893*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"mfsprg $RT, "#SPRG, (MFSPR gprc:$RT, !add(SPRG, 272))>;
3894*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"mfsprg"#SPRG#" $RT", (MFSPR gprc:$RT, !add(SPRG, 272))>;
3895*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"mtsprg "#SPRG#", $RT", (MTSPR !add(SPRG, 272), gprc:$RT)>;
3896*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"mtsprg"#SPRG#" $RT", (MTSPR !add(SPRG, 272), gprc:$RT)>;
3897*9880d681SAndroid Build Coastguard Worker}
3898*9880d681SAndroid Build Coastguard Workerforeach SPRG = 4-7 in {
3899*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"mfsprg $RT, "#SPRG, (MFSPR gprc:$RT, !add(SPRG, 256))>,
3900*9880d681SAndroid Build Coastguard Worker                  Requires<[IsBookE]>;
3901*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"mfsprg"#SPRG#" $RT", (MFSPR gprc:$RT, !add(SPRG, 256))>,
3902*9880d681SAndroid Build Coastguard Worker                  Requires<[IsBookE]>;
3903*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"mtsprg "#SPRG#", $RT", (MTSPR !add(SPRG, 256), gprc:$RT)>,
3904*9880d681SAndroid Build Coastguard Worker                  Requires<[IsBookE]>;
3905*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"mtsprg"#SPRG#" $RT", (MTSPR !add(SPRG, 256), gprc:$RT)>,
3906*9880d681SAndroid Build Coastguard Worker                  Requires<[IsBookE]>;
3907*9880d681SAndroid Build Coastguard Worker}
3908*9880d681SAndroid Build Coastguard Worker
3909*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtasr $RS", (MTSPR 280, gprc:$RS)>;
3910*9880d681SAndroid Build Coastguard Worker
3911*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfdec $RT", (MFSPR gprc:$RT, 22)>;
3912*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtdec $RT", (MTSPR 22, gprc:$RT)>;
3913*9880d681SAndroid Build Coastguard Worker
3914*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfpvr $RT", (MFSPR gprc:$RT, 287)>;
3915*9880d681SAndroid Build Coastguard Worker
3916*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfsdr1 $RT", (MFSPR gprc:$RT, 25)>;
3917*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtsdr1 $RT", (MTSPR 25, gprc:$RT)>;
3918*9880d681SAndroid Build Coastguard Worker
3919*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfsrr0 $RT", (MFSPR gprc:$RT, 26)>;
3920*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mfsrr1 $RT", (MFSPR gprc:$RT, 27)>;
3921*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtsrr0 $RT", (MTSPR 26, gprc:$RT)>;
3922*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"mtsrr1 $RT", (MTSPR 27, gprc:$RT)>;
3923*9880d681SAndroid Build Coastguard Worker
3924*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tlbie $RB", (TLBIE R0, gprc:$RB)>;
3925*9880d681SAndroid Build Coastguard Worker
3926*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tlbrehi $RS, $A", (TLBRE2 gprc:$RS, gprc:$A, 0)>,
3927*9880d681SAndroid Build Coastguard Worker                Requires<[IsPPC4xx]>;
3928*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tlbrelo $RS, $A", (TLBRE2 gprc:$RS, gprc:$A, 1)>,
3929*9880d681SAndroid Build Coastguard Worker                Requires<[IsPPC4xx]>;
3930*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tlbwehi $RS, $A", (TLBWE2 gprc:$RS, gprc:$A, 0)>,
3931*9880d681SAndroid Build Coastguard Worker                Requires<[IsPPC4xx]>;
3932*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"tlbwelo $RS, $A", (TLBWE2 gprc:$RS, gprc:$A, 1)>,
3933*9880d681SAndroid Build Coastguard Worker                Requires<[IsPPC4xx]>;
3934*9880d681SAndroid Build Coastguard Worker
3935*9880d681SAndroid Build Coastguard Workerdef EXTLWI : PPCAsmPseudo<"extlwi $rA, $rS, $n, $b",
3936*9880d681SAndroid Build Coastguard Worker                          (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
3937*9880d681SAndroid Build Coastguard Workerdef EXTLWIo : PPCAsmPseudo<"extlwi. $rA, $rS, $n, $b",
3938*9880d681SAndroid Build Coastguard Worker                           (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
3939*9880d681SAndroid Build Coastguard Workerdef EXTRWI : PPCAsmPseudo<"extrwi $rA, $rS, $n, $b",
3940*9880d681SAndroid Build Coastguard Worker                          (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
3941*9880d681SAndroid Build Coastguard Workerdef EXTRWIo : PPCAsmPseudo<"extrwi. $rA, $rS, $n, $b",
3942*9880d681SAndroid Build Coastguard Worker                           (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
3943*9880d681SAndroid Build Coastguard Workerdef INSLWI : PPCAsmPseudo<"inslwi $rA, $rS, $n, $b",
3944*9880d681SAndroid Build Coastguard Worker                          (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
3945*9880d681SAndroid Build Coastguard Workerdef INSLWIo : PPCAsmPseudo<"inslwi. $rA, $rS, $n, $b",
3946*9880d681SAndroid Build Coastguard Worker                           (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
3947*9880d681SAndroid Build Coastguard Workerdef INSRWI : PPCAsmPseudo<"insrwi $rA, $rS, $n, $b",
3948*9880d681SAndroid Build Coastguard Worker                          (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
3949*9880d681SAndroid Build Coastguard Workerdef INSRWIo : PPCAsmPseudo<"insrwi. $rA, $rS, $n, $b",
3950*9880d681SAndroid Build Coastguard Worker                           (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
3951*9880d681SAndroid Build Coastguard Workerdef ROTRWI : PPCAsmPseudo<"rotrwi $rA, $rS, $n",
3952*9880d681SAndroid Build Coastguard Worker                          (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
3953*9880d681SAndroid Build Coastguard Workerdef ROTRWIo : PPCAsmPseudo<"rotrwi. $rA, $rS, $n",
3954*9880d681SAndroid Build Coastguard Worker                           (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
3955*9880d681SAndroid Build Coastguard Workerdef SLWI : PPCAsmPseudo<"slwi $rA, $rS, $n",
3956*9880d681SAndroid Build Coastguard Worker                        (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
3957*9880d681SAndroid Build Coastguard Workerdef SLWIo : PPCAsmPseudo<"slwi. $rA, $rS, $n",
3958*9880d681SAndroid Build Coastguard Worker                         (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
3959*9880d681SAndroid Build Coastguard Workerdef SRWI : PPCAsmPseudo<"srwi $rA, $rS, $n",
3960*9880d681SAndroid Build Coastguard Worker                        (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
3961*9880d681SAndroid Build Coastguard Workerdef SRWIo : PPCAsmPseudo<"srwi. $rA, $rS, $n",
3962*9880d681SAndroid Build Coastguard Worker                         (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
3963*9880d681SAndroid Build Coastguard Workerdef CLRRWI : PPCAsmPseudo<"clrrwi $rA, $rS, $n",
3964*9880d681SAndroid Build Coastguard Worker                          (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
3965*9880d681SAndroid Build Coastguard Workerdef CLRRWIo : PPCAsmPseudo<"clrrwi. $rA, $rS, $n",
3966*9880d681SAndroid Build Coastguard Worker                           (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
3967*9880d681SAndroid Build Coastguard Workerdef CLRLSLWI : PPCAsmPseudo<"clrlslwi $rA, $rS, $b, $n",
3968*9880d681SAndroid Build Coastguard Worker                            (ins gprc:$rA, gprc:$rS, u5imm:$b, u5imm:$n)>;
3969*9880d681SAndroid Build Coastguard Workerdef CLRLSLWIo : PPCAsmPseudo<"clrlslwi. $rA, $rS, $b, $n",
3970*9880d681SAndroid Build Coastguard Worker                             (ins gprc:$rA, gprc:$rS, u5imm:$b, u5imm:$n)>;
3971*9880d681SAndroid Build Coastguard Worker
3972*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"rotlwi $rA, $rS, $n", (RLWINM gprc:$rA, gprc:$rS, u5imm:$n, 0, 31)>;
3973*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"rotlwi. $rA, $rS, $n", (RLWINMo gprc:$rA, gprc:$rS, u5imm:$n, 0, 31)>;
3974*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"rotlw $rA, $rS, $rB", (RLWNM gprc:$rA, gprc:$rS, gprc:$rB, 0, 31)>;
3975*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"rotlw. $rA, $rS, $rB", (RLWNMo gprc:$rA, gprc:$rS, gprc:$rB, 0, 31)>;
3976*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"clrlwi $rA, $rS, $n", (RLWINM gprc:$rA, gprc:$rS, 0, u5imm:$n, 31)>;
3977*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"clrlwi. $rA, $rS, $n", (RLWINMo gprc:$rA, gprc:$rS, 0, u5imm:$n, 31)>;
3978*9880d681SAndroid Build Coastguard Worker
3979*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cntlzw $rA, $rS", (CNTLZW gprc:$rA, gprc:$rS)>;
3980*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cntlzw. $rA, $rS", (CNTLZWo gprc:$rA, gprc:$rS)>;
3981*9880d681SAndroid Build Coastguard Worker// The POWER variant
3982*9880d681SAndroid Build Coastguard Workerdef : MnemonicAlias<"cntlz",  "cntlzw">;
3983*9880d681SAndroid Build Coastguard Workerdef : MnemonicAlias<"cntlz.", "cntlzw.">;
3984*9880d681SAndroid Build Coastguard Worker
3985*9880d681SAndroid Build Coastguard Workerdef EXTLDI : PPCAsmPseudo<"extldi $rA, $rS, $n, $b",
3986*9880d681SAndroid Build Coastguard Worker                          (ins g8rc:$rA, g8rc:$rS, u6imm:$n, u6imm:$b)>;
3987*9880d681SAndroid Build Coastguard Workerdef EXTLDIo : PPCAsmPseudo<"extldi. $rA, $rS, $n, $b",
3988*9880d681SAndroid Build Coastguard Worker                           (ins g8rc:$rA, g8rc:$rS, u6imm:$n, u6imm:$b)>;
3989*9880d681SAndroid Build Coastguard Workerdef EXTRDI : PPCAsmPseudo<"extrdi $rA, $rS, $n, $b",
3990*9880d681SAndroid Build Coastguard Worker                          (ins g8rc:$rA, g8rc:$rS, u6imm:$n, u6imm:$b)>;
3991*9880d681SAndroid Build Coastguard Workerdef EXTRDIo : PPCAsmPseudo<"extrdi. $rA, $rS, $n, $b",
3992*9880d681SAndroid Build Coastguard Worker                           (ins g8rc:$rA, g8rc:$rS, u6imm:$n, u6imm:$b)>;
3993*9880d681SAndroid Build Coastguard Workerdef INSRDI : PPCAsmPseudo<"insrdi $rA, $rS, $n, $b",
3994*9880d681SAndroid Build Coastguard Worker                          (ins g8rc:$rA, g8rc:$rS, u6imm:$n, u6imm:$b)>;
3995*9880d681SAndroid Build Coastguard Workerdef INSRDIo : PPCAsmPseudo<"insrdi. $rA, $rS, $n, $b",
3996*9880d681SAndroid Build Coastguard Worker                           (ins g8rc:$rA, g8rc:$rS, u6imm:$n, u6imm:$b)>;
3997*9880d681SAndroid Build Coastguard Workerdef ROTRDI : PPCAsmPseudo<"rotrdi $rA, $rS, $n",
3998*9880d681SAndroid Build Coastguard Worker                          (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
3999*9880d681SAndroid Build Coastguard Workerdef ROTRDIo : PPCAsmPseudo<"rotrdi. $rA, $rS, $n",
4000*9880d681SAndroid Build Coastguard Worker                           (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
4001*9880d681SAndroid Build Coastguard Workerdef SLDI : PPCAsmPseudo<"sldi $rA, $rS, $n",
4002*9880d681SAndroid Build Coastguard Worker                        (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
4003*9880d681SAndroid Build Coastguard Workerdef SLDIo : PPCAsmPseudo<"sldi. $rA, $rS, $n",
4004*9880d681SAndroid Build Coastguard Worker                         (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
4005*9880d681SAndroid Build Coastguard Workerdef SRDI : PPCAsmPseudo<"srdi $rA, $rS, $n",
4006*9880d681SAndroid Build Coastguard Worker                        (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
4007*9880d681SAndroid Build Coastguard Workerdef SRDIo : PPCAsmPseudo<"srdi. $rA, $rS, $n",
4008*9880d681SAndroid Build Coastguard Worker                         (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
4009*9880d681SAndroid Build Coastguard Workerdef CLRRDI : PPCAsmPseudo<"clrrdi $rA, $rS, $n",
4010*9880d681SAndroid Build Coastguard Worker                          (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
4011*9880d681SAndroid Build Coastguard Workerdef CLRRDIo : PPCAsmPseudo<"clrrdi. $rA, $rS, $n",
4012*9880d681SAndroid Build Coastguard Worker                           (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
4013*9880d681SAndroid Build Coastguard Workerdef CLRLSLDI : PPCAsmPseudo<"clrlsldi $rA, $rS, $b, $n",
4014*9880d681SAndroid Build Coastguard Worker                            (ins g8rc:$rA, g8rc:$rS, u6imm:$b, u6imm:$n)>;
4015*9880d681SAndroid Build Coastguard Workerdef CLRLSLDIo : PPCAsmPseudo<"clrlsldi. $rA, $rS, $b, $n",
4016*9880d681SAndroid Build Coastguard Worker                             (ins g8rc:$rA, g8rc:$rS, u6imm:$b, u6imm:$n)>;
4017*9880d681SAndroid Build Coastguard Worker
4018*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"rotldi $rA, $rS, $n", (RLDICL g8rc:$rA, g8rc:$rS, u6imm:$n, 0)>;
4019*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"rotldi. $rA, $rS, $n", (RLDICLo g8rc:$rA, g8rc:$rS, u6imm:$n, 0)>;
4020*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"rotld $rA, $rS, $rB", (RLDCL g8rc:$rA, g8rc:$rS, gprc:$rB, 0)>;
4021*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"rotld. $rA, $rS, $rB", (RLDCLo g8rc:$rA, g8rc:$rS, gprc:$rB, 0)>;
4022*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"clrldi $rA, $rS, $n", (RLDICL g8rc:$rA, g8rc:$rS, 0, u6imm:$n)>;
4023*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"clrldi. $rA, $rS, $n", (RLDICLo g8rc:$rA, g8rc:$rS, 0, u6imm:$n)>;
4024*9880d681SAndroid Build Coastguard Worker
4025*9880d681SAndroid Build Coastguard Workerdef RLWINMbm : PPCAsmPseudo<"rlwinm $rA, $rS, $n, $b",
4026*9880d681SAndroid Build Coastguard Worker                            (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>;
4027*9880d681SAndroid Build Coastguard Workerdef RLWINMobm : PPCAsmPseudo<"rlwinm. $rA, $rS, $n, $b",
4028*9880d681SAndroid Build Coastguard Worker                            (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>;
4029*9880d681SAndroid Build Coastguard Workerdef RLWIMIbm : PPCAsmPseudo<"rlwimi $rA, $rS, $n, $b",
4030*9880d681SAndroid Build Coastguard Worker                           (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>;
4031*9880d681SAndroid Build Coastguard Workerdef RLWIMIobm : PPCAsmPseudo<"rlwimi. $rA, $rS, $n, $b",
4032*9880d681SAndroid Build Coastguard Worker                            (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>;
4033*9880d681SAndroid Build Coastguard Workerdef RLWNMbm : PPCAsmPseudo<"rlwnm $rA, $rS, $n, $b",
4034*9880d681SAndroid Build Coastguard Worker                          (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>;
4035*9880d681SAndroid Build Coastguard Workerdef RLWNMobm : PPCAsmPseudo<"rlwnm. $rA, $rS, $n, $b",
4036*9880d681SAndroid Build Coastguard Worker                           (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>;
4037*9880d681SAndroid Build Coastguard Worker
4038*9880d681SAndroid Build Coastguard Worker// These generic branch instruction forms are used for the assembler parser only.
4039*9880d681SAndroid Build Coastguard Worker// Defs and Uses are conservative, since we don't know the BO value.
4040*9880d681SAndroid Build Coastguard Workerlet PPC970_Unit = 7 in {
4041*9880d681SAndroid Build Coastguard Worker  let Defs = [CTR], Uses = [CTR, RM] in {
4042*9880d681SAndroid Build Coastguard Worker    def gBC : BForm_3<16, 0, 0, (outs),
4043*9880d681SAndroid Build Coastguard Worker                      (ins u5imm:$bo, crbitrc:$bi, condbrtarget:$dst),
4044*9880d681SAndroid Build Coastguard Worker                      "bc $bo, $bi, $dst">;
4045*9880d681SAndroid Build Coastguard Worker    def gBCA : BForm_3<16, 1, 0, (outs),
4046*9880d681SAndroid Build Coastguard Worker                       (ins u5imm:$bo, crbitrc:$bi, abscondbrtarget:$dst),
4047*9880d681SAndroid Build Coastguard Worker                       "bca $bo, $bi, $dst">;
4048*9880d681SAndroid Build Coastguard Worker  }
4049*9880d681SAndroid Build Coastguard Worker  let Defs = [LR, CTR], Uses = [CTR, RM] in {
4050*9880d681SAndroid Build Coastguard Worker    def gBCL : BForm_3<16, 0, 1, (outs),
4051*9880d681SAndroid Build Coastguard Worker                       (ins u5imm:$bo, crbitrc:$bi, condbrtarget:$dst),
4052*9880d681SAndroid Build Coastguard Worker                       "bcl $bo, $bi, $dst">;
4053*9880d681SAndroid Build Coastguard Worker    def gBCLA : BForm_3<16, 1, 1, (outs),
4054*9880d681SAndroid Build Coastguard Worker                        (ins u5imm:$bo, crbitrc:$bi, abscondbrtarget:$dst),
4055*9880d681SAndroid Build Coastguard Worker                        "bcla $bo, $bi, $dst">;
4056*9880d681SAndroid Build Coastguard Worker  }
4057*9880d681SAndroid Build Coastguard Worker  let Defs = [CTR], Uses = [CTR, LR, RM] in
4058*9880d681SAndroid Build Coastguard Worker    def gBCLR : XLForm_2<19, 16, 0, (outs),
4059*9880d681SAndroid Build Coastguard Worker                         (ins u5imm:$bo, crbitrc:$bi, i32imm:$bh),
4060*9880d681SAndroid Build Coastguard Worker                         "bclr $bo, $bi, $bh", IIC_BrB, []>;
4061*9880d681SAndroid Build Coastguard Worker  let Defs = [LR, CTR], Uses = [CTR, LR, RM] in
4062*9880d681SAndroid Build Coastguard Worker    def gBCLRL : XLForm_2<19, 16, 1, (outs),
4063*9880d681SAndroid Build Coastguard Worker                          (ins u5imm:$bo, crbitrc:$bi, i32imm:$bh),
4064*9880d681SAndroid Build Coastguard Worker                          "bclrl $bo, $bi, $bh", IIC_BrB, []>;
4065*9880d681SAndroid Build Coastguard Worker  let Defs = [CTR], Uses = [CTR, LR, RM] in
4066*9880d681SAndroid Build Coastguard Worker    def gBCCTR : XLForm_2<19, 528, 0, (outs),
4067*9880d681SAndroid Build Coastguard Worker                          (ins u5imm:$bo, crbitrc:$bi, i32imm:$bh),
4068*9880d681SAndroid Build Coastguard Worker                          "bcctr $bo, $bi, $bh", IIC_BrB, []>;
4069*9880d681SAndroid Build Coastguard Worker  let Defs = [LR, CTR], Uses = [CTR, LR, RM] in
4070*9880d681SAndroid Build Coastguard Worker    def gBCCTRL : XLForm_2<19, 528, 1, (outs),
4071*9880d681SAndroid Build Coastguard Worker                           (ins u5imm:$bo, crbitrc:$bi, i32imm:$bh),
4072*9880d681SAndroid Build Coastguard Worker                           "bcctrl $bo, $bi, $bh", IIC_BrB, []>;
4073*9880d681SAndroid Build Coastguard Worker}
4074*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bclr $bo, $bi", (gBCLR u5imm:$bo, crbitrc:$bi, 0)>;
4075*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bclrl $bo, $bi", (gBCLRL u5imm:$bo, crbitrc:$bi, 0)>;
4076*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bcctr $bo, $bi", (gBCCTR u5imm:$bo, crbitrc:$bi, 0)>;
4077*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"bcctrl $bo, $bi", (gBCCTRL u5imm:$bo, crbitrc:$bi, 0)>;
4078*9880d681SAndroid Build Coastguard Worker
4079*9880d681SAndroid Build Coastguard Workermulticlass BranchSimpleMnemonic1<string name, string pm, int bo> {
4080*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#pm#" $bi, $dst", (gBC bo, crbitrc:$bi, condbrtarget:$dst)>;
4081*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"a"#pm#" $bi, $dst", (gBCA bo, crbitrc:$bi, abscondbrtarget:$dst)>;
4082*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"lr"#pm#" $bi", (gBCLR bo, crbitrc:$bi, 0)>;
4083*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"l"#pm#" $bi, $dst", (gBCL bo, crbitrc:$bi, condbrtarget:$dst)>;
4084*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"la"#pm#" $bi, $dst", (gBCLA bo, crbitrc:$bi, abscondbrtarget:$dst)>;
4085*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"lrl"#pm#" $bi", (gBCLRL bo, crbitrc:$bi, 0)>;
4086*9880d681SAndroid Build Coastguard Worker}
4087*9880d681SAndroid Build Coastguard Workermulticlass BranchSimpleMnemonic2<string name, string pm, int bo>
4088*9880d681SAndroid Build Coastguard Worker  : BranchSimpleMnemonic1<name, pm, bo> {
4089*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"ctr"#pm#" $bi", (gBCCTR bo, crbitrc:$bi, 0)>;
4090*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"ctrl"#pm#" $bi", (gBCCTRL bo, crbitrc:$bi, 0)>;
4091*9880d681SAndroid Build Coastguard Worker}
4092*9880d681SAndroid Build Coastguard Workerdefm : BranchSimpleMnemonic2<"t", "", 12>;
4093*9880d681SAndroid Build Coastguard Workerdefm : BranchSimpleMnemonic2<"f", "", 4>;
4094*9880d681SAndroid Build Coastguard Workerdefm : BranchSimpleMnemonic2<"t", "-", 14>;
4095*9880d681SAndroid Build Coastguard Workerdefm : BranchSimpleMnemonic2<"f", "-", 6>;
4096*9880d681SAndroid Build Coastguard Workerdefm : BranchSimpleMnemonic2<"t", "+", 15>;
4097*9880d681SAndroid Build Coastguard Workerdefm : BranchSimpleMnemonic2<"f", "+", 7>;
4098*9880d681SAndroid Build Coastguard Workerdefm : BranchSimpleMnemonic1<"dnzt", "", 8>;
4099*9880d681SAndroid Build Coastguard Workerdefm : BranchSimpleMnemonic1<"dnzf", "", 0>;
4100*9880d681SAndroid Build Coastguard Workerdefm : BranchSimpleMnemonic1<"dzt", "", 10>;
4101*9880d681SAndroid Build Coastguard Workerdefm : BranchSimpleMnemonic1<"dzf", "", 2>;
4102*9880d681SAndroid Build Coastguard Worker
4103*9880d681SAndroid Build Coastguard Workermulticlass BranchExtendedMnemonicPM<string name, string pm, int bibo> {
4104*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#pm#" $cc, $dst",
4105*9880d681SAndroid Build Coastguard Worker                  (BCC bibo, crrc:$cc, condbrtarget:$dst)>;
4106*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#pm#" $dst",
4107*9880d681SAndroid Build Coastguard Worker                  (BCC bibo, CR0, condbrtarget:$dst)>;
4108*9880d681SAndroid Build Coastguard Worker
4109*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"a"#pm#" $cc, $dst",
4110*9880d681SAndroid Build Coastguard Worker                  (BCCA bibo, crrc:$cc, abscondbrtarget:$dst)>;
4111*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"a"#pm#" $dst",
4112*9880d681SAndroid Build Coastguard Worker                  (BCCA bibo, CR0, abscondbrtarget:$dst)>;
4113*9880d681SAndroid Build Coastguard Worker
4114*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"lr"#pm#" $cc",
4115*9880d681SAndroid Build Coastguard Worker                  (BCCLR bibo, crrc:$cc)>;
4116*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"lr"#pm,
4117*9880d681SAndroid Build Coastguard Worker                  (BCCLR bibo, CR0)>;
4118*9880d681SAndroid Build Coastguard Worker
4119*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"ctr"#pm#" $cc",
4120*9880d681SAndroid Build Coastguard Worker                  (BCCCTR bibo, crrc:$cc)>;
4121*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"ctr"#pm,
4122*9880d681SAndroid Build Coastguard Worker                  (BCCCTR bibo, CR0)>;
4123*9880d681SAndroid Build Coastguard Worker
4124*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"l"#pm#" $cc, $dst",
4125*9880d681SAndroid Build Coastguard Worker                  (BCCL bibo, crrc:$cc, condbrtarget:$dst)>;
4126*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"l"#pm#" $dst",
4127*9880d681SAndroid Build Coastguard Worker                  (BCCL bibo, CR0, condbrtarget:$dst)>;
4128*9880d681SAndroid Build Coastguard Worker
4129*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"la"#pm#" $cc, $dst",
4130*9880d681SAndroid Build Coastguard Worker                  (BCCLA bibo, crrc:$cc, abscondbrtarget:$dst)>;
4131*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"la"#pm#" $dst",
4132*9880d681SAndroid Build Coastguard Worker                  (BCCLA bibo, CR0, abscondbrtarget:$dst)>;
4133*9880d681SAndroid Build Coastguard Worker
4134*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"lrl"#pm#" $cc",
4135*9880d681SAndroid Build Coastguard Worker                  (BCCLRL bibo, crrc:$cc)>;
4136*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"lrl"#pm,
4137*9880d681SAndroid Build Coastguard Worker                  (BCCLRL bibo, CR0)>;
4138*9880d681SAndroid Build Coastguard Worker
4139*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"ctrl"#pm#" $cc",
4140*9880d681SAndroid Build Coastguard Worker                  (BCCCTRL bibo, crrc:$cc)>;
4141*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"b"#name#"ctrl"#pm,
4142*9880d681SAndroid Build Coastguard Worker                  (BCCCTRL bibo, CR0)>;
4143*9880d681SAndroid Build Coastguard Worker}
4144*9880d681SAndroid Build Coastguard Workermulticlass BranchExtendedMnemonic<string name, int bibo> {
4145*9880d681SAndroid Build Coastguard Worker  defm : BranchExtendedMnemonicPM<name, "", bibo>;
4146*9880d681SAndroid Build Coastguard Worker  defm : BranchExtendedMnemonicPM<name, "-", !add(bibo, 2)>;
4147*9880d681SAndroid Build Coastguard Worker  defm : BranchExtendedMnemonicPM<name, "+", !add(bibo, 3)>;
4148*9880d681SAndroid Build Coastguard Worker}
4149*9880d681SAndroid Build Coastguard Workerdefm : BranchExtendedMnemonic<"lt", 12>;
4150*9880d681SAndroid Build Coastguard Workerdefm : BranchExtendedMnemonic<"gt", 44>;
4151*9880d681SAndroid Build Coastguard Workerdefm : BranchExtendedMnemonic<"eq", 76>;
4152*9880d681SAndroid Build Coastguard Workerdefm : BranchExtendedMnemonic<"un", 108>;
4153*9880d681SAndroid Build Coastguard Workerdefm : BranchExtendedMnemonic<"so", 108>;
4154*9880d681SAndroid Build Coastguard Workerdefm : BranchExtendedMnemonic<"ge", 4>;
4155*9880d681SAndroid Build Coastguard Workerdefm : BranchExtendedMnemonic<"nl", 4>;
4156*9880d681SAndroid Build Coastguard Workerdefm : BranchExtendedMnemonic<"le", 36>;
4157*9880d681SAndroid Build Coastguard Workerdefm : BranchExtendedMnemonic<"ng", 36>;
4158*9880d681SAndroid Build Coastguard Workerdefm : BranchExtendedMnemonic<"ne", 68>;
4159*9880d681SAndroid Build Coastguard Workerdefm : BranchExtendedMnemonic<"nu", 100>;
4160*9880d681SAndroid Build Coastguard Workerdefm : BranchExtendedMnemonic<"ns", 100>;
4161*9880d681SAndroid Build Coastguard Worker
4162*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmpwi $rA, $imm", (CMPWI CR0, gprc:$rA, s16imm:$imm)>;
4163*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmpw $rA, $rB", (CMPW CR0, gprc:$rA, gprc:$rB)>;
4164*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmplwi $rA, $imm", (CMPLWI CR0, gprc:$rA, u16imm:$imm)>;
4165*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmplw $rA, $rB", (CMPLW CR0, gprc:$rA, gprc:$rB)>;
4166*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmpdi $rA, $imm", (CMPDI CR0, g8rc:$rA, s16imm64:$imm)>;
4167*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmpd $rA, $rB", (CMPD CR0, g8rc:$rA, g8rc:$rB)>;
4168*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmpldi $rA, $imm", (CMPLDI CR0, g8rc:$rA, u16imm64:$imm)>;
4169*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmpld $rA, $rB", (CMPLD CR0, g8rc:$rA, g8rc:$rB)>;
4170*9880d681SAndroid Build Coastguard Worker
4171*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmpi $bf, 0, $rA, $imm", (CMPWI crrc:$bf, gprc:$rA, s16imm:$imm)>;
4172*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmp $bf, 0, $rA, $rB", (CMPW crrc:$bf, gprc:$rA, gprc:$rB)>;
4173*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmpli $bf, 0, $rA, $imm", (CMPLWI crrc:$bf, gprc:$rA, u16imm:$imm)>;
4174*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmpl $bf, 0, $rA, $rB", (CMPLW crrc:$bf, gprc:$rA, gprc:$rB)>;
4175*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmpi $bf, 1, $rA, $imm", (CMPDI crrc:$bf, g8rc:$rA, s16imm64:$imm)>;
4176*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmp $bf, 1, $rA, $rB", (CMPD crrc:$bf, g8rc:$rA, g8rc:$rB)>;
4177*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmpli $bf, 1, $rA, $imm", (CMPLDI crrc:$bf, g8rc:$rA, u16imm64:$imm)>;
4178*9880d681SAndroid Build Coastguard Workerdef : InstAlias<"cmpl $bf, 1, $rA, $rB", (CMPLD crrc:$bf, g8rc:$rA, g8rc:$rB)>;
4179*9880d681SAndroid Build Coastguard Worker
4180*9880d681SAndroid Build Coastguard Workermulticlass TrapExtendedMnemonic<string name, int to> {
4181*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"td"#name#"i $rA, $imm", (TDI to, g8rc:$rA, s16imm:$imm)>;
4182*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"td"#name#" $rA, $rB", (TD to, g8rc:$rA, g8rc:$rB)>;
4183*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"tw"#name#"i $rA, $imm", (TWI to, gprc:$rA, s16imm:$imm)>;
4184*9880d681SAndroid Build Coastguard Worker  def : InstAlias<"tw"#name#" $rA, $rB", (TW to, gprc:$rA, gprc:$rB)>;
4185*9880d681SAndroid Build Coastguard Worker}
4186*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"lt", 16>;
4187*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"le", 20>;
4188*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"eq", 4>;
4189*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"ge", 12>;
4190*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"gt", 8>;
4191*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"nl", 12>;
4192*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"ne", 24>;
4193*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"ng", 20>;
4194*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"llt", 2>;
4195*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"lle", 6>;
4196*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"lge", 5>;
4197*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"lgt", 1>;
4198*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"lnl", 5>;
4199*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"lng", 6>;
4200*9880d681SAndroid Build Coastguard Workerdefm : TrapExtendedMnemonic<"u", 31>;
4201*9880d681SAndroid Build Coastguard Worker
4202*9880d681SAndroid Build Coastguard Worker// Atomic loads
4203*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_load_8  iaddr:$src), (LBZ  memri:$src)>;
4204*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_load_16 iaddr:$src), (LHZ  memri:$src)>;
4205*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_load_32 iaddr:$src), (LWZ  memri:$src)>;
4206*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_load_8  xaddr:$src), (LBZX memrr:$src)>;
4207*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_load_16 xaddr:$src), (LHZX memrr:$src)>;
4208*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_load_32 xaddr:$src), (LWZX memrr:$src)>;
4209*9880d681SAndroid Build Coastguard Worker
4210*9880d681SAndroid Build Coastguard Worker// Atomic stores
4211*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_store_8  iaddr:$ptr, i32:$val), (STB  gprc:$val, memri:$ptr)>;
4212*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_store_16 iaddr:$ptr, i32:$val), (STH  gprc:$val, memri:$ptr)>;
4213*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_store_32 iaddr:$ptr, i32:$val), (STW  gprc:$val, memri:$ptr)>;
4214*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_store_8  xaddr:$ptr, i32:$val), (STBX gprc:$val, memrr:$ptr)>;
4215*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_store_16 xaddr:$ptr, i32:$val), (STHX gprc:$val, memrr:$ptr)>;
4216*9880d681SAndroid Build Coastguard Workerdef : Pat<(atomic_store_32 xaddr:$ptr, i32:$val), (STWX gprc:$val, memrr:$ptr)>;
4217*9880d681SAndroid Build Coastguard Worker
4218*9880d681SAndroid Build Coastguard Workerlet Predicates = [IsISA3_0] in {
4219*9880d681SAndroid Build Coastguard Worker
4220*9880d681SAndroid Build Coastguard Worker// Copy-Paste Facility
4221*9880d681SAndroid Build Coastguard Worker// We prefix 'CP' to COPY due to name conflict in Target.td. We also prefix to
4222*9880d681SAndroid Build Coastguard Worker// PASTE for naming consistency.
4223*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in
4224*9880d681SAndroid Build Coastguard Workerdef CP_COPY   : X_L1_RA5_RB5<31, 774, "copy"  , gprc, IIC_LdStCOPY, []>;
4225*9880d681SAndroid Build Coastguard Worker
4226*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in
4227*9880d681SAndroid Build Coastguard Workerdef CP_PASTE  : X_L1_RA5_RB5<31, 902, "paste" , gprc, IIC_LdStPASTE, []>;
4228*9880d681SAndroid Build Coastguard Worker
4229*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, Defs = [CR0] in
4230*9880d681SAndroid Build Coastguard Workerdef CP_PASTEo : X_L1_RA5_RB5<31, 902, "paste.", gprc, IIC_LdStPASTE, []>, isDOT;
4231*9880d681SAndroid Build Coastguard Worker
4232*9880d681SAndroid Build Coastguard Workerdef CP_COPYx  : PPCAsmPseudo<"copy $rA, $rB" , (ins gprc:$rA, gprc:$rB)>;
4233*9880d681SAndroid Build Coastguard Workerdef CP_PASTEx : PPCAsmPseudo<"paste $rA, $rB", (ins gprc:$rA, gprc:$rB)>;
4234*9880d681SAndroid Build Coastguard Workerdef CP_COPY_FIRST : PPCAsmPseudo<"copy_first $rA, $rB",
4235*9880d681SAndroid Build Coastguard Worker                                  (ins gprc:$rA, gprc:$rB)>;
4236*9880d681SAndroid Build Coastguard Workerdef CP_PASTE_LAST : PPCAsmPseudo<"paste_last $rA, $rB",
4237*9880d681SAndroid Build Coastguard Worker                                  (ins gprc:$rA, gprc:$rB)>;
4238*9880d681SAndroid Build Coastguard Workerdef CP_ABORT : XForm_0<31, 838, (outs), (ins), "cp_abort", IIC_SprABORT, []>;
4239*9880d681SAndroid Build Coastguard Worker
4240*9880d681SAndroid Build Coastguard Worker// Message Synchronize
4241*9880d681SAndroid Build Coastguard Workerdef MSGSYNC : XForm_0<31, 886, (outs), (ins), "msgsync", IIC_SprMSGSYNC, []>;
4242*9880d681SAndroid Build Coastguard Worker
4243*9880d681SAndroid Build Coastguard Worker// Power-Saving Mode Instruction:
4244*9880d681SAndroid Build Coastguard Workerdef STOP : XForm_0<19, 370, (outs), (ins), "stop", IIC_SprSTOP, []>;
4245*9880d681SAndroid Build Coastguard Worker
4246*9880d681SAndroid Build Coastguard Worker} // IsISA3_0
4247