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