blob: 074fa815293e6042da55e550384bce5adc38d8c1 [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- PPCInstrInfo.td - The PowerPC Instruction Set ------*- tablegen -*-===//
2//
Misha Brukmane05203f2004-06-21 16:55:25 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Jia Liub22310f2012-02-18 12:03:15 +00007//
Misha Brukmane05203f2004-06-21 16:55:25 +00008//===----------------------------------------------------------------------===//
9//
Misha Brukman5295e1d2004-08-09 17:24:04 +000010// This file describes the subset of the 32-bit PowerPC instruction set, as used
11// by the PowerPC instruction selector.
Misha Brukmane05203f2004-06-21 16:55:25 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner7503d462005-10-14 23:40:39 +000015include "PPCInstrFormats.td"
Misha Brukmane05203f2004-06-21 16:55:25 +000016
Chris Lattnercd7f1012005-10-25 20:41:46 +000017//===----------------------------------------------------------------------===//
Chris Lattner27f53452006-03-01 05:50:56 +000018// PowerPC specific type constraints.
19//
20def SDT_PPCstfiwx : SDTypeProfile<0, 2, [ // stfiwx
21 SDTCisVT<0, f64>, SDTCisPtrTy<1>
22]>;
Hal Finkelf6d45f22013-04-01 17:52:07 +000023def SDT_PPClfiwx : SDTypeProfile<1, 1, [ // lfiw[az]x
Hal Finkelbeb296b2013-03-31 10:12:51 +000024 SDTCisVT<0, f64>, SDTCisPtrTy<1>
25]>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +000026def SDT_PPCLxsizx : SDTypeProfile<1, 2, [
27 SDTCisVT<0, f64>, SDTCisPtrTy<1>, SDTCisPtrTy<2>
28]>;
29def SDT_PPCstxsix : SDTypeProfile<0, 3, [
30 SDTCisVT<0, f64>, SDTCisPtrTy<1>, SDTCisPtrTy<2>
31]>;
32def SDT_PPCVexts : SDTypeProfile<1, 2, [
33 SDTCisVT<0, f64>, SDTCisVT<1, f64>, SDTCisPtrTy<2>
34]>;
Hal Finkelbeb296b2013-03-31 10:12:51 +000035
Bill Wendling77b13af2007-11-13 09:19:02 +000036def SDT_PPCCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i32> ]>;
37def SDT_PPCCallSeqEnd : SDCallSeqEnd<[ SDTCisVT<0, i32>,
38 SDTCisVT<1, i32> ]>;
Chris Lattnera8713b12006-03-20 01:53:53 +000039def SDT_PPCvperm : SDTypeProfile<1, 3, [
40 SDTCisVT<3, v16i8>, SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>
41]>;
42
Nemanja Ivanovic1a2b2f02016-05-04 16:04:02 +000043def SDT_PPCVecSplat : SDTypeProfile<1, 2, [ SDTCisVec<0>,
44 SDTCisVec<1>, SDTCisInt<2>
45]>;
46
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +000047def SDT_PPCVecShift : SDTypeProfile<1, 3, [ SDTCisVec<0>,
48 SDTCisVec<1>, SDTCisVec<2>, SDTCisInt<3>
49]>;
50
51def SDT_PPCVecInsert : SDTypeProfile<1, 3, [ SDTCisVec<0>,
52 SDTCisVec<1>, SDTCisVec<2>, SDTCisInt<3>
53]>;
54
Chris Lattnerd7495ae2006-03-31 05:13:27 +000055def SDT_PPCvcmp : SDTypeProfile<1, 3, [
Chris Lattner6961fc72006-03-26 10:06:40 +000056 SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisVT<3, i32>
57]>;
58
Chris Lattner9754d142006-04-18 17:59:36 +000059def SDT_PPCcondbr : SDTypeProfile<0, 3, [
Chris Lattnerbe9377a2006-11-17 22:37:34 +000060 SDTCisVT<0, i32>, SDTCisVT<2, OtherVT>
Chris Lattner9754d142006-04-18 17:59:36 +000061]>;
62
Dan Gohman48b185d2009-09-25 20:36:54 +000063def SDT_PPClbrx : SDTypeProfile<1, 2, [
Hal Finkel31d29562013-03-28 19:25:55 +000064 SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>
Chris Lattnera7976d32006-07-10 20:56:58 +000065]>;
Dan Gohman48b185d2009-09-25 20:36:54 +000066def SDT_PPCstbrx : SDTypeProfile<0, 3, [
Hal Finkel31d29562013-03-28 19:25:55 +000067 SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>
Chris Lattnera7976d32006-07-10 20:56:58 +000068]>;
69
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +000070def SDT_PPCTC_ret : SDTypeProfile<0, 2, [
71 SDTCisPtrTy<0>, SDTCisVT<1, i32>
72]>;
73
Hal Finkel3ee2af72014-07-18 23:29:49 +000074def tocentry32 : Operand<iPTR> {
75 let MIOperandInfo = (ops i32imm:$imm);
76}
Tilmann Schellerd1aaa322009-08-15 11:54:46 +000077
Hal Finkelc93a9a22015-02-25 01:06:45 +000078def SDT_PPCqvfperm : SDTypeProfile<1, 3, [
79 SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisVec<3>
80]>;
81def SDT_PPCqvgpci : SDTypeProfile<1, 1, [
82 SDTCisVec<0>, SDTCisInt<1>
83]>;
84def SDT_PPCqvaligni : SDTypeProfile<1, 3, [
85 SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisInt<3>
86]>;
87def SDT_PPCqvesplati : SDTypeProfile<1, 2, [
88 SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisInt<2>
89]>;
90
91def SDT_PPCqbflt : SDTypeProfile<1, 1, [
92 SDTCisVec<0>, SDTCisVec<1>
93]>;
94
95def SDT_PPCqvlfsb : SDTypeProfile<1, 1, [
96 SDTCisVec<0>, SDTCisPtrTy<1>
97]>;
98
Chris Lattner27f53452006-03-01 05:50:56 +000099//===----------------------------------------------------------------------===//
Chris Lattnercd7f1012005-10-25 20:41:46 +0000100// PowerPC specific DAG Nodes.
101//
102
Hal Finkel2e103312013-04-03 04:01:11 +0000103def PPCfre : SDNode<"PPCISD::FRE", SDTFPUnaryOp, []>;
104def PPCfrsqrte: SDNode<"PPCISD::FRSQRTE", SDTFPUnaryOp, []>;
105
Hal Finkelf6d45f22013-04-01 17:52:07 +0000106def PPCfcfid : SDNode<"PPCISD::FCFID", SDTFPUnaryOp, []>;
107def PPCfcfidu : SDNode<"PPCISD::FCFIDU", SDTFPUnaryOp, []>;
108def PPCfcfids : SDNode<"PPCISD::FCFIDS", SDTFPRoundOp, []>;
109def PPCfcfidus: SDNode<"PPCISD::FCFIDUS", SDTFPRoundOp, []>;
Chris Lattnercd7f1012005-10-25 20:41:46 +0000110def PPCfctidz : SDNode<"PPCISD::FCTIDZ", SDTFPUnaryOp, []>;
111def PPCfctiwz : SDNode<"PPCISD::FCTIWZ", SDTFPUnaryOp, []>;
Hal Finkelf6d45f22013-04-01 17:52:07 +0000112def PPCfctiduz: SDNode<"PPCISD::FCTIDUZ",SDTFPUnaryOp, []>;
113def PPCfctiwuz: SDNode<"PPCISD::FCTIWUZ",SDTFPUnaryOp, []>;
Chris Lattnera348f552008-01-06 06:44:58 +0000114def PPCstfiwx : SDNode<"PPCISD::STFIWX", SDT_PPCstfiwx,
115 [SDNPHasChain, SDNPMayStore]>;
Hal Finkelf6d45f22013-04-01 17:52:07 +0000116def PPClfiwax : SDNode<"PPCISD::LFIWAX", SDT_PPClfiwx,
117 [SDNPHasChain, SDNPMayLoad]>;
118def PPClfiwzx : SDNode<"PPCISD::LFIWZX", SDT_PPClfiwx,
Hal Finkelbeb296b2013-03-31 10:12:51 +0000119 [SDNPHasChain, SDNPMayLoad]>;
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000120def PPClxsizx : SDNode<"PPCISD::LXSIZX", SDT_PPCLxsizx,
121 [SDNPHasChain, SDNPMayLoad]>;
122def PPCstxsix : SDNode<"PPCISD::STXSIX", SDT_PPCstxsix,
123 [SDNPHasChain, SDNPMayStore]>;
124def PPCVexts : SDNode<"PPCISD::VEXTS", SDT_PPCVexts, []>;
Chris Lattnercd7f1012005-10-25 20:41:46 +0000125
Ulrich Weigand874fc622013-03-26 10:56:22 +0000126// Extract FPSCR (not modeled at the DAG level).
127def PPCmffs : SDNode<"PPCISD::MFFS",
128 SDTypeProfile<1, 0, [SDTCisVT<0, f64>]>, []>;
129
130// Perform FADD in round-to-zero mode.
131def PPCfaddrtz: SDNode<"PPCISD::FADDRTZ", SDTFPBinOp, []>;
132
Dale Johannesen666323e2007-10-10 01:01:31 +0000133
Chris Lattner261009a2005-10-25 20:55:47 +0000134def PPCfsel : SDNode<"PPCISD::FSEL",
135 // Type constraint for fsel.
136 SDTypeProfile<1, 3, [SDTCisSameAs<0, 2>, SDTCisSameAs<0, 3>,
137 SDTCisFP<0>, SDTCisVT<1, f64>]>, []>;
Chris Lattner0ec8fa02005-09-08 19:50:41 +0000138
Nate Begeman69caef22005-12-13 22:55:22 +0000139def PPChi : SDNode<"PPCISD::Hi", SDTIntBinOp, []>;
140def PPClo : SDNode<"PPCISD::Lo", SDTIntBinOp, []>;
Hal Finkelcf599212015-02-25 21:36:59 +0000141def PPCtoc_entry: SDNode<"PPCISD::TOC_ENTRY", SDTIntBinOp,
142 [SDNPMayLoad, SDNPMemOperand]>;
Nate Begeman69caef22005-12-13 22:55:22 +0000143def PPCvmaddfp : SDNode<"PPCISD::VMADDFP", SDTFPTernaryOp, []>;
144def PPCvnmsubfp : SDNode<"PPCISD::VNMSUBFP", SDTFPTernaryOp, []>;
Chris Lattner595088a2005-11-17 07:30:41 +0000145
Roman Divacky32143e22013-12-20 18:08:54 +0000146def PPCppc32GOT : SDNode<"PPCISD::PPC32_GOT", SDTIntLeaf, []>;
147
Bill Schmidt9f0b4ec2012-12-14 17:02:38 +0000148def PPCaddisGotTprelHA : SDNode<"PPCISD::ADDIS_GOT_TPREL_HA", SDTIntBinOp>;
149def PPCldGotTprelL : SDNode<"PPCISD::LD_GOT_TPREL_L", SDTIntBinOp,
150 [SDNPMayLoad]>;
Bill Schmidtca4a0c92012-12-04 16:18:08 +0000151def PPCaddTls : SDNode<"PPCISD::ADD_TLS", SDTIntBinOp, []>;
Bill Schmidtc56f1d32012-12-11 20:30:11 +0000152def PPCaddisTlsgdHA : SDNode<"PPCISD::ADDIS_TLSGD_HA", SDTIntBinOp>;
153def PPCaddiTlsgdL : SDNode<"PPCISD::ADDI_TLSGD_L", SDTIntBinOp>;
Bill Schmidt82f1c772015-02-10 19:09:05 +0000154def PPCgetTlsAddr : SDNode<"PPCISD::GET_TLS_ADDR", SDTIntBinOp>;
155def PPCaddiTlsgdLAddr : SDNode<"PPCISD::ADDI_TLSGD_L_ADDR",
156 SDTypeProfile<1, 3, [
157 SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>,
158 SDTCisSameAs<0, 3>, SDTCisInt<0> ]>>;
Bill Schmidt24b8dd62012-12-12 19:29:35 +0000159def PPCaddisTlsldHA : SDNode<"PPCISD::ADDIS_TLSLD_HA", SDTIntBinOp>;
160def PPCaddiTlsldL : SDNode<"PPCISD::ADDI_TLSLD_L", SDTIntBinOp>;
Bill Schmidt82f1c772015-02-10 19:09:05 +0000161def PPCgetTlsldAddr : SDNode<"PPCISD::GET_TLSLD_ADDR", SDTIntBinOp>;
162def PPCaddiTlsldLAddr : SDNode<"PPCISD::ADDI_TLSLD_L_ADDR",
163 SDTypeProfile<1, 3, [
164 SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>,
165 SDTCisSameAs<0, 3>, SDTCisInt<0> ]>>;
166def PPCaddisDtprelHA : SDNode<"PPCISD::ADDIS_DTPREL_HA", SDTIntBinOp>;
Bill Schmidt24b8dd62012-12-12 19:29:35 +0000167def PPCaddiDtprelL : SDNode<"PPCISD::ADDI_DTPREL_L", SDTIntBinOp>;
Bill Schmidtca4a0c92012-12-04 16:18:08 +0000168
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +0000169def PPCvperm : SDNode<"PPCISD::VPERM", SDT_PPCvperm, []>;
Nemanja Ivanovic1a2b2f02016-05-04 16:04:02 +0000170def PPCxxsplt : SDNode<"PPCISD::XXSPLT", SDT_PPCVecSplat, []>;
Nemanja Ivanovicb43bb612016-07-12 21:00:10 +0000171def PPCxxinsert : SDNode<"PPCISD::XXINSERT", SDT_PPCVecInsert, []>;
172def PPCvecshl : SDNode<"PPCISD::VECSHL", SDT_PPCVecShift, []>;
Chris Lattner7e9440a2006-03-19 06:55:52 +0000173
Hal Finkelc93a9a22015-02-25 01:06:45 +0000174def PPCqvfperm : SDNode<"PPCISD::QVFPERM", SDT_PPCqvfperm, []>;
175def PPCqvgpci : SDNode<"PPCISD::QVGPCI", SDT_PPCqvgpci, []>;
176def PPCqvaligni : SDNode<"PPCISD::QVALIGNI", SDT_PPCqvaligni, []>;
177def PPCqvesplati : SDNode<"PPCISD::QVESPLATI", SDT_PPCqvesplati, []>;
178
179def PPCqbflt : SDNode<"PPCISD::QBFLT", SDT_PPCqbflt, []>;
180
181def PPCqvlfsb : SDNode<"PPCISD::QVLFSb", SDT_PPCqvlfsb,
182 [SDNPHasChain, SDNPMayLoad]>;
183
Hal Finkel4edc66b2015-01-03 01:16:37 +0000184def PPCcmpb : SDNode<"PPCISD::CMPB", SDTIntBinOp, []>;
185
Chris Lattnerfea33f72005-12-06 02:10:38 +0000186// These nodes represent the 32-bit PPC shifts that operate on 6-bit shift
187// amounts. These nodes are generated by the multi-precision shift code.
Chris Lattner20b5a2b2008-03-07 20:18:24 +0000188def PPCsrl : SDNode<"PPCISD::SRL" , SDTIntShiftOp>;
189def PPCsra : SDNode<"PPCISD::SRA" , SDTIntShiftOp>;
190def PPCshl : SDNode<"PPCISD::SHL" , SDTIntShiftOp>;
Chris Lattnerfea33f72005-12-06 02:10:38 +0000191
Chris Lattnerf9797942005-12-04 19:01:59 +0000192// These are target-independent nodes, but have target-specific formats.
Bill Wendling77b13af2007-11-13 09:19:02 +0000193def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_PPCCallSeqStart,
Chris Lattner2a0a3b42010-12-23 18:28:41 +0000194 [SDNPHasChain, SDNPOutGlue]>;
Bill Wendling77b13af2007-11-13 09:19:02 +0000195def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_PPCCallSeqEnd,
Chris Lattner2a0a3b42010-12-23 18:28:41 +0000196 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
Chris Lattnerf9797942005-12-04 19:01:59 +0000197
Chris Lattner3b587342006-06-27 18:36:44 +0000198def SDT_PPCCall : SDTypeProfile<0, -1, [SDTCisInt<0>]>;
Ulrich Weigandf62e83f2013-03-22 15:24:13 +0000199def PPCcall : SDNode<"PPCISD::CALL", SDT_PPCCall,
200 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
201 SDNPVariadic]>;
202def PPCcall_nop : SDNode<"PPCISD::CALL_NOP", SDT_PPCCall,
203 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
204 SDNPVariadic]>;
Chris Lattnereb755fc2006-05-17 19:00:46 +0000205def PPCmtctr : SDNode<"PPCISD::MTCTR", SDT_PPCCall,
Chris Lattner2a0a3b42010-12-23 18:28:41 +0000206 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
Ulrich Weigandf62e83f2013-03-22 15:24:13 +0000207def PPCbctrl : SDNode<"PPCISD::BCTRL", SDTNone,
208 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
209 SDNPVariadic]>;
Hal Finkelfc096c92014-12-23 22:29:40 +0000210def PPCbctrl_load_toc : SDNode<"PPCISD::BCTRL_LOAD_TOC",
211 SDTypeProfile<0, 1, []>,
212 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
213 SDNPVariadic]>;
Chris Lattnerb1e9e372006-05-17 06:01:33 +0000214
Chris Lattner9a249b02008-01-15 22:02:54 +0000215def retflag : SDNode<"PPCISD::RET_FLAG", SDTNone,
Chris Lattner2a0a3b42010-12-23 18:28:41 +0000216 [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
Nate Begemanb11b8e42005-12-20 00:26:01 +0000217
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +0000218def PPCtc_return : SDNode<"PPCISD::TC_RETURN", SDT_PPCTC_ret,
Chris Lattner2a0a3b42010-12-23 18:28:41 +0000219 [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>;
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +0000220
Hal Finkel756810f2013-03-21 21:37:52 +0000221def PPCeh_sjlj_setjmp : SDNode<"PPCISD::EH_SJLJ_SETJMP",
222 SDTypeProfile<1, 1, [SDTCisInt<0>,
223 SDTCisPtrTy<1>]>,
224 [SDNPHasChain, SDNPSideEffect]>;
225def PPCeh_sjlj_longjmp : SDNode<"PPCISD::EH_SJLJ_LONGJMP",
226 SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>,
227 [SDNPHasChain, SDNPSideEffect]>;
228
Bill Schmidta87a7e22013-05-14 19:35:45 +0000229def SDT_PPCsc : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
230def PPCsc : SDNode<"PPCISD::SC", SDT_PPCsc,
231 [SDNPHasChain, SDNPSideEffect]>;
232
Bill Schmidte26236e2015-05-22 16:44:10 +0000233def PPCclrbhrb : SDNode<"PPCISD::CLRBHRB", SDTNone,
234 [SDNPHasChain, SDNPSideEffect]>;
235def PPCmfbhrbe : SDNode<"PPCISD::MFBHRBE", SDTIntBinOp, [SDNPHasChain]>;
236def PPCrfebb : SDNode<"PPCISD::RFEBB", SDT_PPCsc,
237 [SDNPHasChain, SDNPSideEffect]>;
238
Chris Lattnerd7495ae2006-03-31 05:13:27 +0000239def PPCvcmp : SDNode<"PPCISD::VCMP" , SDT_PPCvcmp, []>;
Chris Lattner2a0a3b42010-12-23 18:28:41 +0000240def PPCvcmp_o : SDNode<"PPCISD::VCMPo", SDT_PPCvcmp, [SDNPOutGlue]>;
Chris Lattner6961fc72006-03-26 10:06:40 +0000241
Chris Lattner9754d142006-04-18 17:59:36 +0000242def PPCcondbranch : SDNode<"PPCISD::COND_BRANCH", SDT_PPCcondbr,
Chris Lattner2a0a3b42010-12-23 18:28:41 +0000243 [SDNPHasChain, SDNPOptInGlue]>;
Chris Lattner9754d142006-04-18 17:59:36 +0000244
Chris Lattner94de7bc2008-01-10 05:12:37 +0000245def PPClbrx : SDNode<"PPCISD::LBRX", SDT_PPClbrx,
246 [SDNPHasChain, SDNPMayLoad]>;
Chris Lattnera348f552008-01-06 06:44:58 +0000247def PPCstbrx : SDNode<"PPCISD::STBRX", SDT_PPCstbrx,
248 [SDNPHasChain, SDNPMayStore]>;
Chris Lattnera7976d32006-07-10 20:56:58 +0000249
Hal Finkel5ab37802012-08-28 02:10:27 +0000250// Instructions to set/unset CR bit 6 for SVR4 vararg calls
251def PPCcr6set : SDNode<"PPCISD::CR6SET", SDTNone,
252 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
253def PPCcr6unset : SDNode<"PPCISD::CR6UNSET", SDTNone,
254 [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue]>;
255
Jim Laskey48850c12006-11-16 22:43:37 +0000256// Instructions to support dynamic alloca.
257def SDTDynOp : SDTypeProfile<1, 2, []>;
Yury Gribovd7dbb662015-12-01 11:40:55 +0000258def SDTDynAreaOp : SDTypeProfile<1, 1, []>;
Jim Laskey48850c12006-11-16 22:43:37 +0000259def PPCdynalloc : SDNode<"PPCISD::DYNALLOC", SDTDynOp, [SDNPHasChain]>;
Yury Gribovd7dbb662015-12-01 11:40:55 +0000260def PPCdynareaoffset : SDNode<"PPCISD::DYNAREAOFFSET", SDTDynAreaOp, [SDNPHasChain]>;
Jim Laskey48850c12006-11-16 22:43:37 +0000261
Chris Lattner0ec8fa02005-09-08 19:50:41 +0000262//===----------------------------------------------------------------------===//
Chris Lattner39b4d83f2005-09-09 00:39:56 +0000263// PowerPC specific transformation functions and pattern fragments.
264//
Nate Begeman9eaa6ba2005-10-19 01:12:32 +0000265
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000266def SHL32 : SDNodeXForm<imm, [{
267 // Transformation function: 31 - imm
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000268 return getI32Imm(31 - N->getZExtValue(), SDLoc(N));
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000269}]>;
270
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000271def SRL32 : SDNodeXForm<imm, [{
272 // Transformation function: 32 - imm
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000273 return N->getZExtValue() ? getI32Imm(32 - N->getZExtValue(), SDLoc(N))
274 : getI32Imm(0, SDLoc(N));
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000275}]>;
276
Chris Lattner39b4d83f2005-09-09 00:39:56 +0000277def LO16 : SDNodeXForm<imm, [{
278 // Transformation function: get the low 16 bits.
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000279 return getI32Imm((unsigned short)N->getZExtValue(), SDLoc(N));
Chris Lattner39b4d83f2005-09-09 00:39:56 +0000280}]>;
281
282def HI16 : SDNodeXForm<imm, [{
283 // Transformation function: shift the immediate value down into the low bits.
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000284 return getI32Imm((unsigned)N->getZExtValue() >> 16, SDLoc(N));
Chris Lattner39b4d83f2005-09-09 00:39:56 +0000285}]>;
Chris Lattner2d8032b2005-09-08 17:33:10 +0000286
Chris Lattnerd4e9e8b2005-09-28 23:07:13 +0000287def HA16 : SDNodeXForm<imm, [{
288 // Transformation function: shift the immediate value down into the low bits.
David Majnemere61e4bf2016-06-21 05:10:24 +0000289 int Val = N->getZExtValue();
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000290 return getI32Imm((Val - (signed short)Val) >> 16, SDLoc(N));
Chris Lattnerd4e9e8b2005-09-28 23:07:13 +0000291}]>;
Nate Begemand31efd12006-09-22 05:01:56 +0000292def MB : SDNodeXForm<imm, [{
293 // Transformation function: get the start bit of a mask
Duncan Sandsdc845112008-10-16 13:02:33 +0000294 unsigned mb = 0, me;
Dan Gohmaneffb8942008-09-12 16:56:44 +0000295 (void)isRunOfOnes((unsigned)N->getZExtValue(), mb, me);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000296 return getI32Imm(mb, SDLoc(N));
Nate Begemand31efd12006-09-22 05:01:56 +0000297}]>;
Chris Lattnerd4e9e8b2005-09-28 23:07:13 +0000298
Nate Begemand31efd12006-09-22 05:01:56 +0000299def ME : SDNodeXForm<imm, [{
300 // Transformation function: get the end bit of a mask
Duncan Sandsdc845112008-10-16 13:02:33 +0000301 unsigned mb, me = 0;
Dan Gohmaneffb8942008-09-12 16:56:44 +0000302 (void)isRunOfOnes((unsigned)N->getZExtValue(), mb, me);
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000303 return getI32Imm(me, SDLoc(N));
Nate Begemand31efd12006-09-22 05:01:56 +0000304}]>;
305def maskimm32 : PatLeaf<(imm), [{
306 // maskImm predicate - True if immediate is a run of ones.
307 unsigned mb, me;
Owen Anderson9f944592009-08-11 20:47:22 +0000308 if (N->getValueType(0) == MVT::i32)
Dan Gohmaneffb8942008-09-12 16:56:44 +0000309 return isRunOfOnes((unsigned)N->getZExtValue(), mb, me);
Nate Begemand31efd12006-09-22 05:01:56 +0000310 else
311 return false;
312}]>;
Chris Lattnerd4e9e8b2005-09-28 23:07:13 +0000313
Bill Schmidtf88571e2013-05-22 20:09:24 +0000314def imm32SExt16 : Operand<i32>, ImmLeaf<i32, [{
315 // imm32SExt16 predicate - True if the i32 immediate fits in a 16-bit
316 // sign extended field. Used by instructions like 'addi'.
317 return (int32_t)Imm == (short)Imm;
318}]>;
319def imm64SExt16 : Operand<i64>, ImmLeaf<i64, [{
320 // imm64SExt16 predicate - True if the i64 immediate fits in a 16-bit
321 // sign extended field. Used by instructions like 'addi'.
322 return (int64_t)Imm == (short)Imm;
Chris Lattner2d8032b2005-09-08 17:33:10 +0000323}]>;
Chris Lattner76cb0062005-09-08 17:40:49 +0000324def immZExt16 : PatLeaf<(imm), [{
325 // immZExt16 predicate - True if the immediate fits in a 16-bit zero extended
326 // field. Used by instructions like 'ori'.
Dan Gohmaneffb8942008-09-12 16:56:44 +0000327 return (uint64_t)N->getZExtValue() == (unsigned short)N->getZExtValue();
Chris Lattner39b4d83f2005-09-09 00:39:56 +0000328}], LO16>;
Nemanja Ivanovicd2c3c512016-09-23 13:25:31 +0000329def immSExt8 : ImmLeaf<i32, [{ return isInt<8>(Imm); }]>;
Nemanja Ivanovicdf1cb522016-11-29 16:11:34 +0000330def immSExt5NonZero : ImmLeaf<i32, [{ return Imm && isInt<5>(Imm); }]>;
Chris Lattner39b4d83f2005-09-09 00:39:56 +0000331
Chris Lattner7e742e42006-06-20 22:34:10 +0000332// imm16Shifted* - These match immediates where the low 16-bits are zero. There
333// are two forms: imm16ShiftedSExt and imm16ShiftedZExt. These two forms are
334// identical in 32-bit mode, but in 64-bit mode, they return true if the
335// immediate fits into a sign/zero extended 32-bit immediate (with the low bits
336// clear).
337def imm16ShiftedZExt : PatLeaf<(imm), [{
338 // imm16ShiftedZExt predicate - True if only bits in the top 16-bits of the
339 // immediate are set. Used by instructions like 'xoris'.
Dan Gohmaneffb8942008-09-12 16:56:44 +0000340 return (N->getZExtValue() & ~uint64_t(0xFFFF0000)) == 0;
Chris Lattner7e742e42006-06-20 22:34:10 +0000341}], HI16>;
342
343def imm16ShiftedSExt : PatLeaf<(imm), [{
344 // imm16ShiftedSExt predicate - True if only bits in the top 16-bits of the
345 // immediate are set. Used by instructions like 'addis'. Identical to
346 // imm16ShiftedZExt in 32-bit mode.
Dan Gohmaneffb8942008-09-12 16:56:44 +0000347 if (N->getZExtValue() & 0xFFFF) return false;
Owen Anderson9f944592009-08-11 20:47:22 +0000348 if (N->getValueType(0) == MVT::i32)
Chris Lattnerd6e160d2006-06-20 21:39:30 +0000349 return true;
350 // For 64-bit, make sure it is sext right.
Dan Gohmaneffb8942008-09-12 16:56:44 +0000351 return N->getZExtValue() == (uint64_t)(int)N->getZExtValue();
Chris Lattner39b4d83f2005-09-09 00:39:56 +0000352}], HI16>;
Chris Lattner2d8032b2005-09-08 17:33:10 +0000353
Hal Finkel940ab932014-02-28 00:27:01 +0000354def imm64ZExt32 : Operand<i64>, ImmLeaf<i64, [{
355 // imm64ZExt32 predicate - True if the i64 immediate fits in a 32-bit
356 // zero extended field.
357 return isUInt<32>(Imm);
358}]>;
359
Hal Finkelb09680b2013-03-18 23:00:58 +0000360// Some r+i load/store instructions (such as LD, STD, LDU, etc.) that require
Ulrich Weigand9d980cb2013-05-16 17:58:02 +0000361// restricted memrix (4-aligned) constants are alignment sensitive. If these
Hal Finkelb09680b2013-03-18 23:00:58 +0000362// offsets are hidden behind TOC entries than the values of the lower-order
363// bits cannot be checked directly. As a result, we need to also incorporate
364// an alignment check into the relevant patterns.
365
366def aligned4load : PatFrag<(ops node:$ptr), (load node:$ptr), [{
367 return cast<LoadSDNode>(N)->getAlignment() >= 4;
368}]>;
369def aligned4store : PatFrag<(ops node:$val, node:$ptr),
370 (store node:$val, node:$ptr), [{
371 return cast<StoreSDNode>(N)->getAlignment() >= 4;
372}]>;
373def aligned4sextloadi32 : PatFrag<(ops node:$ptr), (sextloadi32 node:$ptr), [{
374 return cast<LoadSDNode>(N)->getAlignment() >= 4;
375}]>;
376def aligned4pre_store : PatFrag<
377 (ops node:$val, node:$base, node:$offset),
378 (pre_store node:$val, node:$base, node:$offset), [{
379 return cast<StoreSDNode>(N)->getAlignment() >= 4;
380}]>;
381
382def unaligned4load : PatFrag<(ops node:$ptr), (load node:$ptr), [{
383 return cast<LoadSDNode>(N)->getAlignment() < 4;
384}]>;
385def unaligned4store : PatFrag<(ops node:$val, node:$ptr),
386 (store node:$val, node:$ptr), [{
387 return cast<StoreSDNode>(N)->getAlignment() < 4;
388}]>;
389def unaligned4sextloadi32 : PatFrag<(ops node:$ptr), (sextloadi32 node:$ptr), [{
390 return cast<LoadSDNode>(N)->getAlignment() < 4;
391}]>;
Chris Lattner2771e2c2006-03-25 06:12:06 +0000392
Chris Lattner0ec8fa02005-09-08 19:50:41 +0000393//===----------------------------------------------------------------------===//
394// PowerPC Flag Definitions.
395
Chris Lattnerc7cb8c72005-04-19 04:32:54 +0000396class isPPC64 { bit PPC64 = 1; }
Hal Finkel1b58f332013-04-12 18:17:57 +0000397class isDOT { bit RC = 1; }
Chris Lattnerc7cb8c72005-04-19 04:32:54 +0000398
Chris Lattner6a5a4f82006-11-08 02:13:12 +0000399class RegConstraint<string C> {
400 string Constraints = C;
401}
Chris Lattner57711562006-11-15 23:24:18 +0000402class NoEncode<string E> {
403 string DisableEncoding = E;
404}
Chris Lattner0ec8fa02005-09-08 19:50:41 +0000405
406
407//===----------------------------------------------------------------------===//
408// PowerPC Operand Definitions.
Chris Lattnerec1cc1b2004-08-14 23:27:29 +0000409
Ulrich Weigand136ac222013-04-26 16:53:15 +0000410// In the default PowerPC assembler syntax, registers are specified simply
411// by number, so they cannot be distinguished from immediate values (without
412// looking at the opcode). This means that the default operand matching logic
413// for the asm parser does not work, and we need to specify custom matchers.
414// Since those can only be specified with RegisterOperand classes and not
415// directly on the RegisterClass, all instructions patterns used by the asm
416// parser need to use a RegisterOperand (instead of a RegisterClass) for
417// all their register operands.
418// For this purpose, we define one RegisterOperand for each RegisterClass,
419// using the same name as the class, just in lower case.
Ulrich Weigand136ac222013-04-26 16:53:15 +0000420
Ulrich Weigand640192d2013-05-03 19:49:39 +0000421def PPCRegGPRCAsmOperand : AsmOperandClass {
422 let Name = "RegGPRC"; let PredicateMethod = "isRegNumber";
423}
424def gprc : RegisterOperand<GPRC> {
425 let ParserMatchClass = PPCRegGPRCAsmOperand;
426}
427def PPCRegG8RCAsmOperand : AsmOperandClass {
428 let Name = "RegG8RC"; let PredicateMethod = "isRegNumber";
429}
430def g8rc : RegisterOperand<G8RC> {
431 let ParserMatchClass = PPCRegG8RCAsmOperand;
432}
433def PPCRegGPRCNoR0AsmOperand : AsmOperandClass {
434 let Name = "RegGPRCNoR0"; let PredicateMethod = "isRegNumber";
435}
436def gprc_nor0 : RegisterOperand<GPRC_NOR0> {
437 let ParserMatchClass = PPCRegGPRCNoR0AsmOperand;
438}
439def PPCRegG8RCNoX0AsmOperand : AsmOperandClass {
440 let Name = "RegG8RCNoX0"; let PredicateMethod = "isRegNumber";
441}
442def g8rc_nox0 : RegisterOperand<G8RC_NOX0> {
443 let ParserMatchClass = PPCRegG8RCNoX0AsmOperand;
444}
445def PPCRegF8RCAsmOperand : AsmOperandClass {
446 let Name = "RegF8RC"; let PredicateMethod = "isRegNumber";
447}
448def f8rc : RegisterOperand<F8RC> {
449 let ParserMatchClass = PPCRegF8RCAsmOperand;
450}
451def PPCRegF4RCAsmOperand : AsmOperandClass {
452 let Name = "RegF4RC"; let PredicateMethod = "isRegNumber";
453}
454def f4rc : RegisterOperand<F4RC> {
455 let ParserMatchClass = PPCRegF4RCAsmOperand;
456}
457def PPCRegVRRCAsmOperand : AsmOperandClass {
458 let Name = "RegVRRC"; let PredicateMethod = "isRegNumber";
459}
460def vrrc : RegisterOperand<VRRC> {
461 let ParserMatchClass = PPCRegVRRCAsmOperand;
462}
Nemanja Ivanovic11049f82016-10-04 06:59:23 +0000463def PPCRegVFRCAsmOperand : AsmOperandClass {
464 let Name = "RegVFRC"; let PredicateMethod = "isRegNumber";
465}
466def vfrc : RegisterOperand<VFRC> {
467 let ParserMatchClass = PPCRegVFRCAsmOperand;
468}
Ulrich Weigand640192d2013-05-03 19:49:39 +0000469def PPCRegCRBITRCAsmOperand : AsmOperandClass {
Ulrich Weigandb86cb7d2013-07-04 14:24:00 +0000470 let Name = "RegCRBITRC"; let PredicateMethod = "isCRBitNumber";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000471}
472def crbitrc : RegisterOperand<CRBITRC> {
473 let ParserMatchClass = PPCRegCRBITRCAsmOperand;
474}
475def PPCRegCRRCAsmOperand : AsmOperandClass {
476 let Name = "RegCRRC"; let PredicateMethod = "isCCRegNumber";
477}
478def crrc : RegisterOperand<CRRC> {
479 let ParserMatchClass = PPCRegCRRCAsmOperand;
480}
Kit Barton535e69d2015-03-25 19:36:23 +0000481def crrc0 : RegisterOperand<CRRC0> {
482 let ParserMatchClass = PPCRegCRRCAsmOperand;
483}
Ulrich Weigand640192d2013-05-03 19:49:39 +0000484
Nemanja Ivanovice8effe12015-03-04 20:44:33 +0000485def PPCU1ImmAsmOperand : AsmOperandClass {
486 let Name = "U1Imm"; let PredicateMethod = "isU1Imm";
487 let RenderMethod = "addImmOperands";
488}
489def u1imm : Operand<i32> {
490 let PrintMethod = "printU1ImmOperand";
491 let ParserMatchClass = PPCU1ImmAsmOperand;
492}
493
Hal Finkel27774d92014-03-13 07:58:58 +0000494def PPCU2ImmAsmOperand : AsmOperandClass {
495 let Name = "U2Imm"; let PredicateMethod = "isU2Imm";
496 let RenderMethod = "addImmOperands";
497}
498def u2imm : Operand<i32> {
499 let PrintMethod = "printU2ImmOperand";
500 let ParserMatchClass = PPCU2ImmAsmOperand;
501}
Joerg Sonnenberger9e9623c2014-07-29 22:21:57 +0000502
Hal Finkel522e4d92016-09-03 02:31:44 +0000503def PPCATBitsAsHintAsmOperand : AsmOperandClass {
504 let Name = "ATBitsAsHint"; let PredicateMethod = "isATBitsAsHint";
505 let RenderMethod = "addImmOperands"; // Irrelevant, predicate always fails.
506}
507def atimm : Operand<i32> {
508 let PrintMethod = "printATBitsAsHint";
509 let ParserMatchClass = PPCATBitsAsHintAsmOperand;
510}
511
Kit Barton535e69d2015-03-25 19:36:23 +0000512def PPCU3ImmAsmOperand : AsmOperandClass {
513 let Name = "U3Imm"; let PredicateMethod = "isU3Imm";
514 let RenderMethod = "addImmOperands";
515}
516def u3imm : Operand<i32> {
517 let PrintMethod = "printU3ImmOperand";
518 let ParserMatchClass = PPCU3ImmAsmOperand;
519}
520
Joerg Sonnenberger9e9623c2014-07-29 22:21:57 +0000521def PPCU4ImmAsmOperand : AsmOperandClass {
522 let Name = "U4Imm"; let PredicateMethod = "isU4Imm";
523 let RenderMethod = "addImmOperands";
524}
525def u4imm : Operand<i32> {
526 let PrintMethod = "printU4ImmOperand";
527 let ParserMatchClass = PPCU4ImmAsmOperand;
528}
Ulrich Weigand640192d2013-05-03 19:49:39 +0000529def PPCS5ImmAsmOperand : AsmOperandClass {
530 let Name = "S5Imm"; let PredicateMethod = "isS5Imm";
531 let RenderMethod = "addImmOperands";
532}
Chris Lattner2771e2c2006-03-25 06:12:06 +0000533def s5imm : Operand<i32> {
534 let PrintMethod = "printS5ImmOperand";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000535 let ParserMatchClass = PPCS5ImmAsmOperand;
Hal Finkel23453472013-12-19 16:13:01 +0000536 let DecoderMethod = "decodeSImmOperand<5>";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000537}
538def PPCU5ImmAsmOperand : AsmOperandClass {
539 let Name = "U5Imm"; let PredicateMethod = "isU5Imm";
540 let RenderMethod = "addImmOperands";
Chris Lattner2771e2c2006-03-25 06:12:06 +0000541}
Chris Lattnerf006d152005-09-14 20:53:05 +0000542def u5imm : Operand<i32> {
Nate Begeman3ad3ad42004-08-21 05:56:39 +0000543 let PrintMethod = "printU5ImmOperand";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000544 let ParserMatchClass = PPCU5ImmAsmOperand;
Hal Finkel23453472013-12-19 16:13:01 +0000545 let DecoderMethod = "decodeUImmOperand<5>";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000546}
547def PPCU6ImmAsmOperand : AsmOperandClass {
548 let Name = "U6Imm"; let PredicateMethod = "isU6Imm";
549 let RenderMethod = "addImmOperands";
Nate Begeman3ad3ad42004-08-21 05:56:39 +0000550}
Chris Lattnerf006d152005-09-14 20:53:05 +0000551def u6imm : Operand<i32> {
Nate Begeman143cf942004-08-30 02:28:06 +0000552 let PrintMethod = "printU6ImmOperand";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000553 let ParserMatchClass = PPCU6ImmAsmOperand;
Hal Finkel23453472013-12-19 16:13:01 +0000554 let DecoderMethod = "decodeUImmOperand<6>";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000555}
Chuang-Yu Cheng80722712016-03-28 08:34:28 +0000556def PPCU7ImmAsmOperand : AsmOperandClass {
557 let Name = "U7Imm"; let PredicateMethod = "isU7Imm";
558 let RenderMethod = "addImmOperands";
559}
560def u7imm : Operand<i32> {
561 let PrintMethod = "printU7ImmOperand";
562 let ParserMatchClass = PPCU7ImmAsmOperand;
563 let DecoderMethod = "decodeUImmOperand<7>";
564}
565def PPCU8ImmAsmOperand : AsmOperandClass {
566 let Name = "U8Imm"; let PredicateMethod = "isU8Imm";
567 let RenderMethod = "addImmOperands";
568}
569def u8imm : Operand<i32> {
570 let PrintMethod = "printU8ImmOperand";
571 let ParserMatchClass = PPCU8ImmAsmOperand;
572 let DecoderMethod = "decodeUImmOperand<8>";
573}
Bill Schmidte26236e2015-05-22 16:44:10 +0000574def PPCU10ImmAsmOperand : AsmOperandClass {
575 let Name = "U10Imm"; let PredicateMethod = "isU10Imm";
576 let RenderMethod = "addImmOperands";
577}
578def u10imm : Operand<i32> {
579 let PrintMethod = "printU10ImmOperand";
580 let ParserMatchClass = PPCU10ImmAsmOperand;
581 let DecoderMethod = "decodeUImmOperand<10>";
582}
Hal Finkelc93a9a22015-02-25 01:06:45 +0000583def PPCU12ImmAsmOperand : AsmOperandClass {
584 let Name = "U12Imm"; let PredicateMethod = "isU12Imm";
585 let RenderMethod = "addImmOperands";
586}
587def u12imm : Operand<i32> {
588 let PrintMethod = "printU12ImmOperand";
589 let ParserMatchClass = PPCU12ImmAsmOperand;
590 let DecoderMethod = "decodeUImmOperand<12>";
591}
Ulrich Weigand640192d2013-05-03 19:49:39 +0000592def PPCS16ImmAsmOperand : AsmOperandClass {
593 let Name = "S16Imm"; let PredicateMethod = "isS16Imm";
Joerg Sonnenbergerbfef1dd2014-08-10 12:41:50 +0000594 let RenderMethod = "addS16ImmOperands";
Nate Begeman143cf942004-08-30 02:28:06 +0000595}
Chris Lattnerf006d152005-09-14 20:53:05 +0000596def s16imm : Operand<i32> {
Nate Begeman4bfceb12004-09-04 05:00:00 +0000597 let PrintMethod = "printS16ImmOperand";
Ulrich Weigandfd3ad692013-06-26 13:49:15 +0000598 let EncoderMethod = "getImm16Encoding";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000599 let ParserMatchClass = PPCS16ImmAsmOperand;
Hal Finkel23453472013-12-19 16:13:01 +0000600 let DecoderMethod = "decodeSImmOperand<16>";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000601}
602def PPCU16ImmAsmOperand : AsmOperandClass {
603 let Name = "U16Imm"; let PredicateMethod = "isU16Imm";
Joerg Sonnenbergerbfef1dd2014-08-10 12:41:50 +0000604 let RenderMethod = "addU16ImmOperands";
Nate Begeman4bfceb12004-09-04 05:00:00 +0000605}
Chris Lattnerf006d152005-09-14 20:53:05 +0000606def u16imm : Operand<i32> {
Chris Lattner8a796852004-08-15 05:20:16 +0000607 let PrintMethod = "printU16ImmOperand";
Ulrich Weigandfd3ad692013-06-26 13:49:15 +0000608 let EncoderMethod = "getImm16Encoding";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000609 let ParserMatchClass = PPCU16ImmAsmOperand;
Hal Finkel23453472013-12-19 16:13:01 +0000610 let DecoderMethod = "decodeUImmOperand<16>";
Chris Lattner8a796852004-08-15 05:20:16 +0000611}
Ulrich Weigand5a02a022013-06-26 13:49:53 +0000612def PPCS17ImmAsmOperand : AsmOperandClass {
613 let Name = "S17Imm"; let PredicateMethod = "isS17Imm";
Joerg Sonnenbergerbfef1dd2014-08-10 12:41:50 +0000614 let RenderMethod = "addS16ImmOperands";
Ulrich Weigand5a02a022013-06-26 13:49:53 +0000615}
616def s17imm : Operand<i32> {
617 // This operand type is used for addis/lis to allow the assembler parser
618 // to accept immediates in the range -65536..65535 for compatibility with
619 // the GNU assembler. The operand is treated as 16-bit otherwise.
620 let PrintMethod = "printS16ImmOperand";
621 let EncoderMethod = "getImm16Encoding";
622 let ParserMatchClass = PPCS17ImmAsmOperand;
Hal Finkel23453472013-12-19 16:13:01 +0000623 let DecoderMethod = "decodeSImmOperand<16>";
Ulrich Weigand5a02a022013-06-26 13:49:53 +0000624}
Ehsan Amiric90b02c2016-10-24 17:31:09 +0000625
626def fpimm0 : PatLeaf<(fpimm), [{ return N->isExactlyValue(+0.0); }]>;
627
Ulrich Weigandb6a30d12013-06-24 11:03:33 +0000628def PPCDirectBrAsmOperand : AsmOperandClass {
629 let Name = "DirectBr"; let PredicateMethod = "isDirectBr";
630 let RenderMethod = "addBranchTargetOperands";
631}
Chris Lattner0e3461e2010-11-15 06:09:35 +0000632def directbrtarget : Operand<OtherVT> {
Nate Begeman61738782004-09-02 08:13:00 +0000633 let PrintMethod = "printBranchOperand";
Chris Lattner0e3461e2010-11-15 06:09:35 +0000634 let EncoderMethod = "getDirectBrEncoding";
Ulrich Weigandb6a30d12013-06-24 11:03:33 +0000635 let ParserMatchClass = PPCDirectBrAsmOperand;
636}
637def absdirectbrtarget : Operand<OtherVT> {
638 let PrintMethod = "printAbsBranchOperand";
639 let EncoderMethod = "getAbsDirectBrEncoding";
640 let ParserMatchClass = PPCDirectBrAsmOperand;
641}
642def PPCCondBrAsmOperand : AsmOperandClass {
643 let Name = "CondBr"; let PredicateMethod = "isCondBr";
644 let RenderMethod = "addBranchTargetOperands";
Chris Lattner0e3461e2010-11-15 06:09:35 +0000645}
646def condbrtarget : Operand<OtherVT> {
Chris Lattnercfedba72010-11-16 01:45:05 +0000647 let PrintMethod = "printBranchOperand";
Chris Lattner0e3461e2010-11-15 06:09:35 +0000648 let EncoderMethod = "getCondBrEncoding";
Ulrich Weigandb6a30d12013-06-24 11:03:33 +0000649 let ParserMatchClass = PPCCondBrAsmOperand;
650}
651def abscondbrtarget : Operand<OtherVT> {
652 let PrintMethod = "printAbsBranchOperand";
653 let EncoderMethod = "getAbsCondBrEncoding";
654 let ParserMatchClass = PPCCondBrAsmOperand;
Nate Begeman61738782004-09-02 08:13:00 +0000655}
Chris Lattnera5190ae2006-06-16 21:01:35 +0000656def calltarget : Operand<iPTR> {
Ulrich Weigandb6a30d12013-06-24 11:03:33 +0000657 let PrintMethod = "printBranchOperand";
Chris Lattner0e3461e2010-11-15 06:09:35 +0000658 let EncoderMethod = "getDirectBrEncoding";
Ulrich Weigandb6a30d12013-06-24 11:03:33 +0000659 let ParserMatchClass = PPCDirectBrAsmOperand;
Chris Lattnerbd9efdb2005-11-17 19:16:08 +0000660}
Ulrich Weigandb6a30d12013-06-24 11:03:33 +0000661def abscalltarget : Operand<iPTR> {
662 let PrintMethod = "printAbsBranchOperand";
663 let EncoderMethod = "getAbsDirectBrEncoding";
664 let ParserMatchClass = PPCDirectBrAsmOperand;
Nate Begemana171f6b2005-11-16 00:48:01 +0000665}
Ulrich Weigand640192d2013-05-03 19:49:39 +0000666def PPCCRBitMaskOperand : AsmOperandClass {
667 let Name = "CRBitMask"; let PredicateMethod = "isCRBitMask";
Nate Begeman4bfceb12004-09-04 05:00:00 +0000668}
Nate Begeman8465fe82005-07-20 22:42:00 +0000669def crbitm: Operand<i8> {
670 let PrintMethod = "printcrbitm";
Chris Lattnerd6a07cc2010-11-15 05:19:25 +0000671 let EncoderMethod = "get_crbitm_encoding";
Hal Finkel23453472013-12-19 16:13:01 +0000672 let DecoderMethod = "decodeCRBitMOperand";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000673 let ParserMatchClass = PPCCRBitMaskOperand;
Nate Begeman8465fe82005-07-20 22:42:00 +0000674}
Nate Begeman8e6a8af2005-12-19 23:25:09 +0000675// Address operands
Hal Finkel638a9fa2013-03-19 18:51:05 +0000676// A version of ptr_rc which excludes R0 (or X0 in 64-bit mode).
Ulrich Weigand640192d2013-05-03 19:49:39 +0000677def PPCRegGxRCNoR0Operand : AsmOperandClass {
678 let Name = "RegGxRCNoR0"; let PredicateMethod = "isRegNumber";
679}
680def ptr_rc_nor0 : Operand<iPTR>, PointerLikeRegClass<1> {
681 let ParserMatchClass = PPCRegGxRCNoR0Operand;
682}
683// A version of ptr_rc usable with the asm parser.
684def PPCRegGxRCOperand : AsmOperandClass {
685 let Name = "RegGxRC"; let PredicateMethod = "isRegNumber";
686}
687def ptr_rc_idx : Operand<iPTR>, PointerLikeRegClass<0> {
688 let ParserMatchClass = PPCRegGxRCOperand;
689}
Hal Finkel638a9fa2013-03-19 18:51:05 +0000690
Ulrich Weigand640192d2013-05-03 19:49:39 +0000691def PPCDispRIOperand : AsmOperandClass {
692 let Name = "DispRI"; let PredicateMethod = "isS16Imm";
Joerg Sonnenbergerbfef1dd2014-08-10 12:41:50 +0000693 let RenderMethod = "addS16ImmOperands";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000694}
695def dispRI : Operand<iPTR> {
696 let ParserMatchClass = PPCDispRIOperand;
697}
698def PPCDispRIXOperand : AsmOperandClass {
699 let Name = "DispRIX"; let PredicateMethod = "isS16ImmX4";
Ulrich Weigand9d980cb2013-05-16 17:58:02 +0000700 let RenderMethod = "addImmOperands";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000701}
702def dispRIX : Operand<iPTR> {
703 let ParserMatchClass = PPCDispRIXOperand;
704}
Kit Bartonba532dc2016-03-08 03:49:13 +0000705def PPCDispRIX16Operand : AsmOperandClass {
706 let Name = "DispRIX16"; let PredicateMethod = "isS16ImmX16";
707 let RenderMethod = "addImmOperands";
708}
709def dispRIX16 : Operand<iPTR> {
710 let ParserMatchClass = PPCDispRIX16Operand;
711}
Joerg Sonnenberger0013b922014-08-08 16:43:49 +0000712def PPCDispSPE8Operand : AsmOperandClass {
713 let Name = "DispSPE8"; let PredicateMethod = "isU8ImmX8";
714 let RenderMethod = "addImmOperands";
715}
716def dispSPE8 : Operand<iPTR> {
717 let ParserMatchClass = PPCDispSPE8Operand;
718}
719def PPCDispSPE4Operand : AsmOperandClass {
720 let Name = "DispSPE4"; let PredicateMethod = "isU7ImmX4";
721 let RenderMethod = "addImmOperands";
722}
723def dispSPE4 : Operand<iPTR> {
724 let ParserMatchClass = PPCDispSPE4Operand;
725}
726def PPCDispSPE2Operand : AsmOperandClass {
727 let Name = "DispSPE2"; let PredicateMethod = "isU6ImmX2";
728 let RenderMethod = "addImmOperands";
729}
730def dispSPE2 : Operand<iPTR> {
731 let ParserMatchClass = PPCDispSPE2Operand;
732}
Ulrich Weigand4a083882013-03-26 10:55:45 +0000733
Chris Lattnera5190ae2006-06-16 21:01:35 +0000734def memri : Operand<iPTR> {
Nate Begeman8e6a8af2005-12-19 23:25:09 +0000735 let PrintMethod = "printMemRegImm";
Ulrich Weigand4a083882013-03-26 10:55:45 +0000736 let MIOperandInfo = (ops dispRI:$imm, ptr_rc_nor0:$reg);
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000737 let EncoderMethod = "getMemRIEncoding";
Hal Finkel23453472013-12-19 16:13:01 +0000738 let DecoderMethod = "decodeMemRIOperands";
Nate Begeman8e6a8af2005-12-19 23:25:09 +0000739}
Chris Lattnera5190ae2006-06-16 21:01:35 +0000740def memrr : Operand<iPTR> {
Nate Begeman8e6a8af2005-12-19 23:25:09 +0000741 let PrintMethod = "printMemRegReg";
Ulrich Weigand640192d2013-05-03 19:49:39 +0000742 let MIOperandInfo = (ops ptr_rc_nor0:$ptrreg, ptr_rc_idx:$offreg);
Nate Begeman8e6a8af2005-12-19 23:25:09 +0000743}
Ulrich Weigand9d980cb2013-05-16 17:58:02 +0000744def memrix : Operand<iPTR> { // memri where the imm is 4-aligned.
745 let PrintMethod = "printMemRegImm";
Ulrich Weigand4a083882013-03-26 10:55:45 +0000746 let MIOperandInfo = (ops dispRIX:$imm, ptr_rc_nor0:$reg);
Chris Lattner8f4444d2010-11-15 08:02:41 +0000747 let EncoderMethod = "getMemRIXEncoding";
Hal Finkel23453472013-12-19 16:13:01 +0000748 let DecoderMethod = "decodeMemRIXOperands";
Chris Lattner4a66d692006-03-22 05:30:33 +0000749}
Kit Bartonba532dc2016-03-08 03:49:13 +0000750def memrix16 : Operand<iPTR> { // memri, imm is 16-aligned, 12-bit, Inst{16:27}
751 let PrintMethod = "printMemRegImm";
752 let MIOperandInfo = (ops dispRIX16:$imm, ptr_rc_nor0:$reg);
753 let EncoderMethod = "getMemRIX16Encoding";
754 let DecoderMethod = "decodeMemRIX16Operands";
755}
Joerg Sonnenberger0013b922014-08-08 16:43:49 +0000756def spe8dis : Operand<iPTR> { // SPE displacement where the imm is 8-aligned.
757 let PrintMethod = "printMemRegImm";
758 let MIOperandInfo = (ops dispSPE8:$imm, ptr_rc_nor0:$reg);
759 let EncoderMethod = "getSPE8DisEncoding";
760}
761def spe4dis : Operand<iPTR> { // SPE displacement where the imm is 4-aligned.
762 let PrintMethod = "printMemRegImm";
763 let MIOperandInfo = (ops dispSPE4:$imm, ptr_rc_nor0:$reg);
764 let EncoderMethod = "getSPE4DisEncoding";
765}
766def spe2dis : Operand<iPTR> { // SPE displacement where the imm is 2-aligned.
767 let PrintMethod = "printMemRegImm";
768 let MIOperandInfo = (ops dispSPE2:$imm, ptr_rc_nor0:$reg);
769 let EncoderMethod = "getSPE2DisEncoding";
770}
Nate Begeman8e6a8af2005-12-19 23:25:09 +0000771
Hal Finkel756810f2013-03-21 21:37:52 +0000772// A single-register address. This is used with the SjLj
773// pseudo-instructions.
774def memr : Operand<iPTR> {
775 let MIOperandInfo = (ops ptr_rc:$ptrreg);
776}
Roman Divacky32143e22013-12-20 18:08:54 +0000777def PPCTLSRegOperand : AsmOperandClass {
778 let Name = "TLSReg"; let PredicateMethod = "isTLSReg";
779 let RenderMethod = "addTLSRegOperands";
780}
781def tlsreg32 : Operand<i32> {
782 let EncoderMethod = "getTLSRegEncoding";
783 let ParserMatchClass = PPCTLSRegOperand;
784}
Hal Finkel7c8ae532014-07-25 17:47:22 +0000785def tlsgd32 : Operand<i32> {}
786def tlscall32 : Operand<i32> {
787 let PrintMethod = "printTLSCall";
788 let MIOperandInfo = (ops calltarget:$func, tlsgd32:$sym);
789 let EncoderMethod = "getTLSCallEncoding";
790}
Hal Finkel756810f2013-03-21 21:37:52 +0000791
Ulrich Weigand63aa8522013-03-26 10:53:27 +0000792// PowerPC Predicate operand.
793def pred : Operand<OtherVT> {
Chris Lattner6be72602006-11-04 05:27:39 +0000794 let PrintMethod = "printPredicateOperand";
Ulrich Weigand136ac222013-04-26 16:53:15 +0000795 let MIOperandInfo = (ops i32imm:$bibo, crrc:$reg);
Chris Lattner6be72602006-11-04 05:27:39 +0000796}
Chris Lattnerc8a68d02006-11-03 23:53:25 +0000797
Chris Lattner268d3582006-01-12 02:05:36 +0000798// Define PowerPC specific addressing mode.
Evan Cheng577ef762006-10-11 21:03:53 +0000799def iaddr : ComplexPattern<iPTR, 2, "SelectAddrImm", [], []>;
800def xaddr : ComplexPattern<iPTR, 2, "SelectAddrIdx", [], []>;
801def xoaddr : ComplexPattern<iPTR, 2, "SelectAddrIdxOnly",[], []>;
Ulrich Weigand9d980cb2013-05-16 17:58:02 +0000802def ixaddr : ComplexPattern<iPTR, 2, "SelectAddrImmX4", [], []>; // "std"
Chris Lattner8a796852004-08-15 05:20:16 +0000803
Hal Finkel756810f2013-03-21 21:37:52 +0000804// The address in a single register. This is used with the SjLj
805// pseudo-instructions.
806def addr : ComplexPattern<iPTR, 1, "SelectAddr",[], []>;
807
Chris Lattner6f5840c2006-11-16 00:41:37 +0000808/// This is just the offset part of iaddr, used for preinc.
809def iaddroff : ComplexPattern<iPTR, 1, "SelectAddrImmOffs", [], []>;
Chris Lattner13969612006-11-15 02:43:19 +0000810
Evan Cheng3db275d2005-12-14 22:07:12 +0000811//===----------------------------------------------------------------------===//
812// PowerPC Instruction Predicate Definitions.
Eric Christopher1b8e7632014-05-22 01:07:24 +0000813def In32BitMode : Predicate<"!PPCSubTarget->isPPC64()">;
814def In64BitMode : Predicate<"PPCSubTarget->isPPC64()">;
815def IsBookE : Predicate<"PPCSubTarget->isBookE()">;
816def IsNotBookE : Predicate<"!PPCSubTarget->isBookE()">;
Hal Finkelfe3368c2014-10-02 22:34:22 +0000817def HasOnlyMSYNC : Predicate<"PPCSubTarget->hasOnlyMSYNC()">;
818def HasSYNC : Predicate<"!PPCSubTarget->hasOnlyMSYNC()">;
Joerg Sonnenberger0b2ebcb2014-08-04 15:47:38 +0000819def IsPPC4xx : Predicate<"PPCSubTarget->isPPC4xx()">;
Joerg Sonnenberger74052102014-08-04 17:07:41 +0000820def IsPPC6xx : Predicate<"PPCSubTarget->isPPC6xx()">;
Joerg Sonnenberger0b2ebcb2014-08-04 15:47:38 +0000821def IsE500 : Predicate<"PPCSubTarget->isE500()">;
Joerg Sonnenberger39f095a2014-08-07 12:18:21 +0000822def HasSPE : Predicate<"PPCSubTarget->HasSPE()">;
Bill Schmidt082cfc02015-01-14 20:17:10 +0000823def HasICBT : Predicate<"PPCSubTarget->hasICBT()">;
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +0000824def HasPartwordAtomics : Predicate<"PPCSubTarget->hasPartwordAtomics()">;
Hal Finkelc93a9a22015-02-25 01:06:45 +0000825def NoNaNsFPMath : Predicate<"TM.Options.NoNaNsFPMath">;
826def NaNsFPMath : Predicate<"!TM.Options.NoNaNsFPMath">;
Nemanja Ivanovicc0904792015-04-09 23:54:37 +0000827def HasBPERMD : Predicate<"PPCSubTarget->hasBPERMD()">;
828def HasExtDiv : Predicate<"PPCSubTarget->hasExtDiv()">;
Nemanja Ivanovica621a7f2016-03-31 15:26:37 +0000829def IsISA3_0 : Predicate<"PPCSubTarget->isISA3_0()">;
Hal Finkelc93a9a22015-02-25 01:06:45 +0000830
Chris Lattner0ec8fa02005-09-08 19:50:41 +0000831//===----------------------------------------------------------------------===//
Hal Finkel654d43b2013-04-12 02:18:09 +0000832// PowerPC Multiclass Definitions.
833
834multiclass XForm_6r<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
835 string asmbase, string asmstr, InstrItinClass itin,
836 list<dag> pattern> {
837 let BaseName = asmbase in {
838 def NAME : XForm_6<opcode, xo, OOL, IOL,
839 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
840 pattern>, RecFormRel;
Hal Finkel1b58f332013-04-12 18:17:57 +0000841 let Defs = [CR0] in
842 def o : XForm_6<opcode, xo, OOL, IOL,
843 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
844 []>, isDOT, RecFormRel;
845 }
846}
847
848multiclass XForm_6rc<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
849 string asmbase, string asmstr, InstrItinClass itin,
850 list<dag> pattern> {
851 let BaseName = asmbase in {
852 let Defs = [CARRY] in
853 def NAME : XForm_6<opcode, xo, OOL, IOL,
854 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
855 pattern>, RecFormRel;
856 let Defs = [CARRY, CR0] in
Hal Finkel654d43b2013-04-12 02:18:09 +0000857 def o : XForm_6<opcode, xo, OOL, IOL,
858 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
859 []>, isDOT, RecFormRel;
860 }
861}
862
Hal Finkel1b58f332013-04-12 18:17:57 +0000863multiclass XForm_10rc<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
864 string asmbase, string asmstr, InstrItinClass itin,
865 list<dag> pattern> {
866 let BaseName = asmbase in {
867 let Defs = [CARRY] in
868 def NAME : XForm_10<opcode, xo, OOL, IOL,
869 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
870 pattern>, RecFormRel;
871 let Defs = [CARRY, CR0] in
Hal Finkel654d43b2013-04-12 02:18:09 +0000872 def o : XForm_10<opcode, xo, OOL, IOL,
873 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
874 []>, isDOT, RecFormRel;
875 }
876}
877
878multiclass XForm_11r<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
879 string asmbase, string asmstr, InstrItinClass itin,
880 list<dag> pattern> {
881 let BaseName = asmbase in {
882 def NAME : XForm_11<opcode, xo, OOL, IOL,
883 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
884 pattern>, RecFormRel;
Hal Finkel1b58f332013-04-12 18:17:57 +0000885 let Defs = [CR0] in
Hal Finkel654d43b2013-04-12 02:18:09 +0000886 def o : XForm_11<opcode, xo, OOL, IOL,
887 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
888 []>, isDOT, RecFormRel;
889 }
890}
891
892multiclass XOForm_1r<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
893 string asmbase, string asmstr, InstrItinClass itin,
894 list<dag> pattern> {
895 let BaseName = asmbase in {
896 def NAME : XOForm_1<opcode, xo, oe, OOL, IOL,
897 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
898 pattern>, RecFormRel;
Hal Finkel1b58f332013-04-12 18:17:57 +0000899 let Defs = [CR0] in
900 def o : XOForm_1<opcode, xo, oe, OOL, IOL,
901 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
902 []>, isDOT, RecFormRel;
903 }
904}
905
Nemanja Ivanovicc0904792015-04-09 23:54:37 +0000906// Multiclass for instructions for which the non record form is not cracked
907// and the record form is cracked (i.e. divw, mullw, etc.)
908multiclass XOForm_1rcr<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
909 string asmbase, string asmstr, InstrItinClass itin,
910 list<dag> pattern> {
911 let BaseName = asmbase in {
912 def NAME : XOForm_1<opcode, xo, oe, OOL, IOL,
913 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
914 pattern>, RecFormRel;
915 let Defs = [CR0] in
916 def o : XOForm_1<opcode, xo, oe, OOL, IOL,
917 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
918 []>, isDOT, RecFormRel, PPC970_DGroup_First,
919 PPC970_DGroup_Cracked;
920 }
921}
922
Hal Finkel1b58f332013-04-12 18:17:57 +0000923multiclass XOForm_1rc<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
924 string asmbase, string asmstr, InstrItinClass itin,
925 list<dag> pattern> {
926 let BaseName = asmbase in {
927 let Defs = [CARRY] in
928 def NAME : XOForm_1<opcode, xo, oe, OOL, IOL,
929 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
930 pattern>, RecFormRel;
931 let Defs = [CARRY, CR0] in
Hal Finkel654d43b2013-04-12 02:18:09 +0000932 def o : XOForm_1<opcode, xo, oe, OOL, IOL,
933 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
934 []>, isDOT, RecFormRel;
935 }
936}
937
938multiclass XOForm_3r<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
939 string asmbase, string asmstr, InstrItinClass itin,
940 list<dag> pattern> {
941 let BaseName = asmbase in {
942 def NAME : XOForm_3<opcode, xo, oe, OOL, IOL,
943 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
944 pattern>, RecFormRel;
Hal Finkel1b58f332013-04-12 18:17:57 +0000945 let Defs = [CR0] in
946 def o : XOForm_3<opcode, xo, oe, OOL, IOL,
947 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
948 []>, isDOT, RecFormRel;
949 }
950}
951
952multiclass XOForm_3rc<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL,
953 string asmbase, string asmstr, InstrItinClass itin,
954 list<dag> pattern> {
955 let BaseName = asmbase in {
956 let Defs = [CARRY] in
957 def NAME : XOForm_3<opcode, xo, oe, OOL, IOL,
958 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
959 pattern>, RecFormRel;
960 let Defs = [CARRY, CR0] in
Hal Finkel654d43b2013-04-12 02:18:09 +0000961 def o : XOForm_3<opcode, xo, oe, OOL, IOL,
962 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
963 []>, isDOT, RecFormRel;
964 }
965}
966
967multiclass MForm_2r<bits<6> opcode, dag OOL, dag IOL,
968 string asmbase, string asmstr, InstrItinClass itin,
969 list<dag> pattern> {
970 let BaseName = asmbase in {
971 def NAME : MForm_2<opcode, OOL, IOL,
972 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
973 pattern>, RecFormRel;
Hal Finkel1b58f332013-04-12 18:17:57 +0000974 let Defs = [CR0] in
Hal Finkel654d43b2013-04-12 02:18:09 +0000975 def o : MForm_2<opcode, OOL, IOL,
976 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
977 []>, isDOT, RecFormRel;
978 }
979}
980
981multiclass MDForm_1r<bits<6> opcode, bits<3> xo, dag OOL, dag IOL,
982 string asmbase, string asmstr, InstrItinClass itin,
983 list<dag> pattern> {
984 let BaseName = asmbase in {
985 def NAME : MDForm_1<opcode, xo, OOL, IOL,
986 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
987 pattern>, RecFormRel;
Hal Finkel1b58f332013-04-12 18:17:57 +0000988 let Defs = [CR0] in
Hal Finkel654d43b2013-04-12 02:18:09 +0000989 def o : MDForm_1<opcode, xo, OOL, IOL,
990 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
991 []>, isDOT, RecFormRel;
992 }
993}
994
Ulrich Weigandfa451ba2013-04-26 15:39:12 +0000995multiclass MDSForm_1r<bits<6> opcode, bits<4> xo, dag OOL, dag IOL,
996 string asmbase, string asmstr, InstrItinClass itin,
997 list<dag> pattern> {
998 let BaseName = asmbase in {
999 def NAME : MDSForm_1<opcode, xo, OOL, IOL,
1000 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
1001 pattern>, RecFormRel;
1002 let Defs = [CR0] in
1003 def o : MDSForm_1<opcode, xo, OOL, IOL,
1004 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
1005 []>, isDOT, RecFormRel;
1006 }
1007}
1008
Hal Finkel1b58f332013-04-12 18:17:57 +00001009multiclass XSForm_1rc<bits<6> opcode, bits<9> xo, dag OOL, dag IOL,
1010 string asmbase, string asmstr, InstrItinClass itin,
1011 list<dag> pattern> {
Hal Finkel654d43b2013-04-12 02:18:09 +00001012 let BaseName = asmbase in {
Hal Finkel1b58f332013-04-12 18:17:57 +00001013 let Defs = [CARRY] in
Hal Finkel654d43b2013-04-12 02:18:09 +00001014 def NAME : XSForm_1<opcode, xo, OOL, IOL,
1015 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
1016 pattern>, RecFormRel;
Hal Finkel1b58f332013-04-12 18:17:57 +00001017 let Defs = [CARRY, CR0] in
Hal Finkel654d43b2013-04-12 02:18:09 +00001018 def o : XSForm_1<opcode, xo, OOL, IOL,
1019 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
1020 []>, isDOT, RecFormRel;
1021 }
1022}
1023
1024multiclass XForm_26r<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
1025 string asmbase, string asmstr, InstrItinClass itin,
1026 list<dag> pattern> {
1027 let BaseName = asmbase in {
1028 def NAME : XForm_26<opcode, xo, OOL, IOL,
1029 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
1030 pattern>, RecFormRel;
Hal Finkel1b58f332013-04-12 18:17:57 +00001031 let Defs = [CR1] in
Hal Finkel654d43b2013-04-12 02:18:09 +00001032 def o : XForm_26<opcode, xo, OOL, IOL,
1033 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
Hal Finkel1b58f332013-04-12 18:17:57 +00001034 []>, isDOT, RecFormRel;
Hal Finkel654d43b2013-04-12 02:18:09 +00001035 }
1036}
1037
Hal Finkeldbc78e12013-08-19 05:01:02 +00001038multiclass XForm_28r<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
1039 string asmbase, string asmstr, InstrItinClass itin,
1040 list<dag> pattern> {
1041 let BaseName = asmbase in {
1042 def NAME : XForm_28<opcode, xo, OOL, IOL,
1043 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
1044 pattern>, RecFormRel;
1045 let Defs = [CR1] in
1046 def o : XForm_28<opcode, xo, OOL, IOL,
1047 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
1048 []>, isDOT, RecFormRel;
1049 }
1050}
1051
Hal Finkel654d43b2013-04-12 02:18:09 +00001052multiclass AForm_1r<bits<6> opcode, bits<5> xo, dag OOL, dag IOL,
1053 string asmbase, string asmstr, InstrItinClass itin,
1054 list<dag> pattern> {
1055 let BaseName = asmbase in {
1056 def NAME : AForm_1<opcode, xo, OOL, IOL,
1057 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
1058 pattern>, RecFormRel;
Hal Finkel1b58f332013-04-12 18:17:57 +00001059 let Defs = [CR1] in
Hal Finkel654d43b2013-04-12 02:18:09 +00001060 def o : AForm_1<opcode, xo, OOL, IOL,
1061 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
Hal Finkel1b58f332013-04-12 18:17:57 +00001062 []>, isDOT, RecFormRel;
Hal Finkel654d43b2013-04-12 02:18:09 +00001063 }
1064}
1065
1066multiclass AForm_2r<bits<6> opcode, bits<5> xo, dag OOL, dag IOL,
1067 string asmbase, string asmstr, InstrItinClass itin,
1068 list<dag> pattern> {
1069 let BaseName = asmbase in {
1070 def NAME : AForm_2<opcode, xo, OOL, IOL,
1071 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
1072 pattern>, RecFormRel;
Hal Finkel1b58f332013-04-12 18:17:57 +00001073 let Defs = [CR1] in
Hal Finkel654d43b2013-04-12 02:18:09 +00001074 def o : AForm_2<opcode, xo, OOL, IOL,
1075 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
Hal Finkel1b58f332013-04-12 18:17:57 +00001076 []>, isDOT, RecFormRel;
Hal Finkel654d43b2013-04-12 02:18:09 +00001077 }
1078}
1079
1080multiclass AForm_3r<bits<6> opcode, bits<5> xo, dag OOL, dag IOL,
1081 string asmbase, string asmstr, InstrItinClass itin,
1082 list<dag> pattern> {
1083 let BaseName = asmbase in {
1084 def NAME : AForm_3<opcode, xo, OOL, IOL,
1085 !strconcat(asmbase, !strconcat(" ", asmstr)), itin,
1086 pattern>, RecFormRel;
Hal Finkel1b58f332013-04-12 18:17:57 +00001087 let Defs = [CR1] in
Hal Finkel654d43b2013-04-12 02:18:09 +00001088 def o : AForm_3<opcode, xo, OOL, IOL,
1089 !strconcat(asmbase, !strconcat(". ", asmstr)), itin,
Hal Finkel1b58f332013-04-12 18:17:57 +00001090 []>, isDOT, RecFormRel;
Hal Finkel654d43b2013-04-12 02:18:09 +00001091 }
1092}
1093
1094//===----------------------------------------------------------------------===//
Chris Lattner0ec8fa02005-09-08 19:50:41 +00001095// PowerPC Instruction Definitions.
1096
Misha Brukmane05203f2004-06-21 16:55:25 +00001097// Pseudo-instructions:
Chris Lattner0ec8fa02005-09-08 19:50:41 +00001098
Chris Lattner51348c52006-03-12 09:13:49 +00001099let hasCtrlDep = 1 in {
Evan Cheng3e18e502007-09-11 19:55:27 +00001100let Defs = [R1], Uses = [R1] in {
Will Schmidt4a67f2e2012-10-04 18:14:28 +00001101def ADJCALLSTACKDOWN : Pseudo<(outs), (ins u16imm:$amt), "#ADJCALLSTACKDOWN $amt",
Chris Lattner27539552008-10-11 22:08:30 +00001102 [(callseq_start timm:$amt)]>;
Will Schmidt4a67f2e2012-10-04 18:14:28 +00001103def ADJCALLSTACKUP : Pseudo<(outs), (ins u16imm:$amt1, u16imm:$amt2), "#ADJCALLSTACKUP $amt1 $amt2",
Chris Lattner27539552008-10-11 22:08:30 +00001104 [(callseq_end timm:$amt1, timm:$amt2)]>;
Evan Cheng3e18e502007-09-11 19:55:27 +00001105}
Chris Lattner02e2c182006-03-13 21:52:10 +00001106
Ulrich Weigand136ac222013-04-26 16:53:15 +00001107def UPDATE_VRSAVE : Pseudo<(outs gprc:$rD), (ins gprc:$rS),
Chris Lattner02e2c182006-03-13 21:52:10 +00001108 "UPDATE_VRSAVE $rD, $rS", []>;
Nate Begeman6e6514c2004-10-07 22:30:03 +00001109}
Jim Laskey48850c12006-11-16 22:43:37 +00001110
Evan Cheng3e18e502007-09-11 19:55:27 +00001111let Defs = [R1], Uses = [R1] in
Ulrich Weigand136ac222013-04-26 16:53:15 +00001112def DYNALLOC : Pseudo<(outs gprc:$result), (ins gprc:$negsize, memri:$fpsi), "#DYNALLOC",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001113 [(set i32:$result,
1114 (PPCdynalloc i32:$negsize, iaddr:$fpsi))]>;
Yury Gribovd7dbb662015-12-01 11:40:55 +00001115def DYNAREAOFFSET : Pseudo<(outs i32imm:$result), (ins memri:$fpsi), "#DYNAREAOFFSET",
1116 [(set i32:$result, (PPCdynareaoffset iaddr:$fpsi))]>;
Jim Laskey48850c12006-11-16 22:43:37 +00001117
Dan Gohman453d64c2009-10-29 18:10:34 +00001118// SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after
1119// instruction selection into a branch sequence.
1120let usesCustomInserter = 1, // Expanded after instruction selection.
Chris Lattner51348c52006-03-12 09:13:49 +00001121 PPC970_Single = 1 in {
Hal Finkel3fa362a2013-03-27 05:57:58 +00001122 // Note that SELECT_CC_I4 and SELECT_CC_I8 use the no-r0 register classes
1123 // because either operand might become the first operand in an isel, and
1124 // that operand cannot be r0.
Ulrich Weigand136ac222013-04-26 16:53:15 +00001125 def SELECT_CC_I4 : Pseudo<(outs gprc:$dst), (ins crrc:$cond,
1126 gprc_nor0:$T, gprc_nor0:$F,
Will Schmidt4a67f2e2012-10-04 18:14:28 +00001127 i32imm:$BROPC), "#SELECT_CC_I4",
Chris Lattner67f8cc52006-09-27 02:55:21 +00001128 []>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001129 def SELECT_CC_I8 : Pseudo<(outs g8rc:$dst), (ins crrc:$cond,
1130 g8rc_nox0:$T, g8rc_nox0:$F,
Will Schmidt4a67f2e2012-10-04 18:14:28 +00001131 i32imm:$BROPC), "#SELECT_CC_I8",
Chris Lattner67f8cc52006-09-27 02:55:21 +00001132 []>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001133 def SELECT_CC_F4 : Pseudo<(outs f4rc:$dst), (ins crrc:$cond, f4rc:$T, f4rc:$F,
Will Schmidt4a67f2e2012-10-04 18:14:28 +00001134 i32imm:$BROPC), "#SELECT_CC_F4",
Chris Lattner67f8cc52006-09-27 02:55:21 +00001135 []>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001136 def SELECT_CC_F8 : Pseudo<(outs f8rc:$dst), (ins crrc:$cond, f8rc:$T, f8rc:$F,
Will Schmidt4a67f2e2012-10-04 18:14:28 +00001137 i32imm:$BROPC), "#SELECT_CC_F8",
Chris Lattner67f8cc52006-09-27 02:55:21 +00001138 []>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001139 def SELECT_CC_VRRC: Pseudo<(outs vrrc:$dst), (ins crrc:$cond, vrrc:$T, vrrc:$F,
Will Schmidt4a67f2e2012-10-04 18:14:28 +00001140 i32imm:$BROPC), "#SELECT_CC_VRRC",
Chris Lattner67f8cc52006-09-27 02:55:21 +00001141 []>;
Hal Finkel940ab932014-02-28 00:27:01 +00001142
1143 // SELECT_* pseudo instructions, like SELECT_CC_* but taking condition
1144 // register bit directly.
1145 def SELECT_I4 : Pseudo<(outs gprc:$dst), (ins crbitrc:$cond,
1146 gprc_nor0:$T, gprc_nor0:$F), "#SELECT_I4",
1147 [(set i32:$dst, (select i1:$cond, i32:$T, i32:$F))]>;
1148 def SELECT_I8 : Pseudo<(outs g8rc:$dst), (ins crbitrc:$cond,
1149 g8rc_nox0:$T, g8rc_nox0:$F), "#SELECT_I8",
1150 [(set i64:$dst, (select i1:$cond, i64:$T, i64:$F))]>;
1151 def SELECT_F4 : Pseudo<(outs f4rc:$dst), (ins crbitrc:$cond,
1152 f4rc:$T, f4rc:$F), "#SELECT_F4",
1153 [(set f32:$dst, (select i1:$cond, f32:$T, f32:$F))]>;
1154 def SELECT_F8 : Pseudo<(outs f8rc:$dst), (ins crbitrc:$cond,
1155 f8rc:$T, f8rc:$F), "#SELECT_F8",
1156 [(set f64:$dst, (select i1:$cond, f64:$T, f64:$F))]>;
1157 def SELECT_VRRC: Pseudo<(outs vrrc:$dst), (ins crbitrc:$cond,
1158 vrrc:$T, vrrc:$F), "#SELECT_VRRC",
1159 [(set v4i32:$dst,
1160 (select i1:$cond, v4i32:$T, v4i32:$F))]>;
Chris Lattner9b577f12005-08-26 21:23:58 +00001161}
1162
Bill Wendling632ea652008-03-03 22:19:16 +00001163// SPILL_CR - Indicate that we're dumping the CR register, so we'll need to
1164// scavenge a register for it.
Hal Finkel940ab932014-02-28 00:27:01 +00001165let mayStore = 1 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00001166def SPILL_CR : Pseudo<(outs), (ins crrc:$cond, memri:$F),
Will Schmidt4a67f2e2012-10-04 18:14:28 +00001167 "#SPILL_CR", []>;
Hal Finkel940ab932014-02-28 00:27:01 +00001168def SPILL_CRBIT : Pseudo<(outs), (ins crbitrc:$cond, memri:$F),
1169 "#SPILL_CRBIT", []>;
1170}
Bill Wendling632ea652008-03-03 22:19:16 +00001171
Hal Finkelbde7f8f2011-12-06 20:55:36 +00001172// RESTORE_CR - Indicate that we're restoring the CR register (previously
1173// spilled), so we'll need to scavenge a register for it.
Hal Finkel940ab932014-02-28 00:27:01 +00001174let mayLoad = 1 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00001175def RESTORE_CR : Pseudo<(outs crrc:$cond), (ins memri:$F),
Will Schmidt4a67f2e2012-10-04 18:14:28 +00001176 "#RESTORE_CR", []>;
Hal Finkel940ab932014-02-28 00:27:01 +00001177def RESTORE_CRBIT : Pseudo<(outs crbitrc:$cond), (ins memri:$F),
1178 "#RESTORE_CRBIT", []>;
1179}
Hal Finkelbde7f8f2011-12-06 20:55:36 +00001180
Evan Chengac1591b2007-07-21 00:34:19 +00001181let isTerminator = 1, isBarrier = 1, PPC970_Unit = 7 in {
Ulrich Weigand63aa8522013-03-26 10:53:27 +00001182 let isReturn = 1, Uses = [LR, RM] in
Hal Finkel3e5a3602013-11-27 23:26:09 +00001183 def BLR : XLForm_2_ext<19, 16, 20, 0, 0, (outs), (ins), "blr", IIC_BrB,
Hal Finkelf4a22c02015-01-13 17:47:54 +00001184 [(retflag)]>, Requires<[In32BitMode]>;
Hal Finkel500b0042013-04-10 06:42:34 +00001185 let isBranch = 1, isIndirectBranch = 1, Uses = [CTR] in {
Hal Finkel3e5a3602013-11-27 23:26:09 +00001186 def BCTR : XLForm_2_ext<19, 528, 20, 0, 0, (outs), (ins), "bctr", IIC_BrB,
1187 []>;
Hal Finkel500b0042013-04-10 06:42:34 +00001188
Hal Finkel940ab932014-02-28 00:27:01 +00001189 let isCodeGenOnly = 1 in {
1190 def BCCCTR : XLForm_2_br<19, 528, 0, (outs), (ins pred:$cond),
1191 "b${cond:cc}ctr${cond:pm} ${cond:reg}", IIC_BrB,
1192 []>;
1193
1194 def BCCTR : XLForm_2_br2<19, 528, 12, 0, (outs), (ins crbitrc:$bi),
1195 "bcctr 12, $bi, 0", IIC_BrB, []>;
1196 def BCCTRn : XLForm_2_br2<19, 528, 4, 0, (outs), (ins crbitrc:$bi),
1197 "bcctr 4, $bi, 0", IIC_BrB, []>;
1198 }
Hal Finkel500b0042013-04-10 06:42:34 +00001199 }
Chris Lattner0ec8fa02005-09-08 19:50:41 +00001200}
1201
Chris Lattner915fd0d2005-02-15 20:26:49 +00001202let Defs = [LR] in
Will Schmidt4a67f2e2012-10-04 18:14:28 +00001203 def MovePCtoLR : Pseudo<(outs), (ins), "#MovePCtoLR", []>,
Chris Lattner51348c52006-03-12 09:13:49 +00001204 PPC970_Unit_BRU;
Justin Hibbitsa88b6052014-11-12 15:16:30 +00001205let Defs = [LR] in
1206 def MoveGOTtoLR : Pseudo<(outs), (ins), "#MoveGOTtoLR", []>,
1207 PPC970_Unit_BRU;
Misha Brukmane05203f2004-06-21 16:55:25 +00001208
Evan Chengac1591b2007-07-21 00:34:19 +00001209let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, PPC970_Unit = 7 in {
Chris Lattnercf569172006-10-13 19:10:34 +00001210 let isBarrier = 1 in {
Chris Lattner0e3461e2010-11-15 06:09:35 +00001211 def B : IForm<18, 0, 0, (outs), (ins directbrtarget:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001212 "b $dst", IIC_BrB,
Chris Lattnerd9d18af2005-12-04 18:42:54 +00001213 [(br bb:$dst)]>;
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001214 def BA : IForm<18, 1, 0, (outs), (ins absdirectbrtarget:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001215 "ba $dst", IIC_BrB, []>;
Chris Lattnercf569172006-10-13 19:10:34 +00001216 }
Chris Lattner40565d72004-11-22 23:07:01 +00001217
Chris Lattnerbe9377a2006-11-17 22:37:34 +00001218 // BCC represents an arbitrary conditional branch on a predicate.
1219 // FIXME: should be able to write a pattern for PPCcondbranch, but can't use
Will Schmidt314c6c42012-10-05 15:16:11 +00001220 // a two-value operand where a dag node expects two operands. :(
Hal Finkelb5aa7e52013-04-08 16:24:03 +00001221 let isCodeGenOnly = 1 in {
Will Schmidt314c6c42012-10-05 15:16:11 +00001222 def BCC : BForm<16, 0, 0, (outs), (ins pred:$cond, condbrtarget:$dst),
Ulrich Weigand86247b62013-06-24 16:52:04 +00001223 "b${cond:cc}${cond:pm} ${cond:reg}, $dst"
Ulrich Weigand136ac222013-04-26 16:53:15 +00001224 /*[(PPCcondbranch crrc:$crS, imm:$opc, bb:$dst)]*/>;
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001225 def BCCA : BForm<16, 1, 0, (outs), (ins pred:$cond, abscondbrtarget:$dst),
Ulrich Weigand86247b62013-06-24 16:52:04 +00001226 "b${cond:cc}a${cond:pm} ${cond:reg}, $dst">;
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001227
Hal Finkelb5aa7e52013-04-08 16:24:03 +00001228 let isReturn = 1, Uses = [LR, RM] in
Hal Finkel940ab932014-02-28 00:27:01 +00001229 def BCCLR : XLForm_2_br<19, 16, 0, (outs), (ins pred:$cond),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001230 "b${cond:cc}lr${cond:pm} ${cond:reg}", IIC_BrB, []>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00001231 }
Hal Finkel5711eca2013-04-09 22:58:37 +00001232
Hal Finkel940ab932014-02-28 00:27:01 +00001233 let isCodeGenOnly = 1 in {
1234 let Pattern = [(brcond i1:$bi, bb:$dst)] in
1235 def BC : BForm_4<16, 12, 0, 0, (outs), (ins crbitrc:$bi, condbrtarget:$dst),
1236 "bc 12, $bi, $dst">;
1237
1238 let Pattern = [(brcond (not i1:$bi), bb:$dst)] in
1239 def BCn : BForm_4<16, 4, 0, 0, (outs), (ins crbitrc:$bi, condbrtarget:$dst),
1240 "bc 4, $bi, $dst">;
1241
1242 let isReturn = 1, Uses = [LR, RM] in
1243 def BCLR : XLForm_2_br2<19, 16, 12, 0, (outs), (ins crbitrc:$bi),
1244 "bclr 12, $bi, 0", IIC_BrB, []>;
1245 def BCLRn : XLForm_2_br2<19, 16, 4, 0, (outs), (ins crbitrc:$bi),
1246 "bclr 4, $bi, 0", IIC_BrB, []>;
1247 }
1248
Ulrich Weigand86247b62013-06-24 16:52:04 +00001249 let isReturn = 1, Defs = [CTR], Uses = [CTR, LR, RM] in {
1250 def BDZLR : XLForm_2_ext<19, 16, 18, 0, 0, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001251 "bdzlr", IIC_BrB, []>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00001252 def BDNZLR : XLForm_2_ext<19, 16, 16, 0, 0, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001253 "bdnzlr", IIC_BrB, []>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00001254 def BDZLRp : XLForm_2_ext<19, 16, 27, 0, 0, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001255 "bdzlr+", IIC_BrB, []>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00001256 def BDNZLRp: XLForm_2_ext<19, 16, 25, 0, 0, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001257 "bdnzlr+", IIC_BrB, []>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00001258 def BDZLRm : XLForm_2_ext<19, 16, 26, 0, 0, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001259 "bdzlr-", IIC_BrB, []>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00001260 def BDNZLRm: XLForm_2_ext<19, 16, 24, 0, 0, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001261 "bdnzlr-", IIC_BrB, []>;
Hal Finkelb5aa7e52013-04-08 16:24:03 +00001262 }
Hal Finkel96c2d4d2012-06-08 15:38:21 +00001263
1264 let Defs = [CTR], Uses = [CTR] in {
Ulrich Weigand01177182012-11-13 19:15:52 +00001265 def BDZ : BForm_1<16, 18, 0, 0, (outs), (ins condbrtarget:$dst),
1266 "bdz $dst">;
1267 def BDNZ : BForm_1<16, 16, 0, 0, (outs), (ins condbrtarget:$dst),
1268 "bdnz $dst">;
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001269 def BDZA : BForm_1<16, 18, 1, 0, (outs), (ins abscondbrtarget:$dst),
1270 "bdza $dst">;
1271 def BDNZA : BForm_1<16, 16, 1, 0, (outs), (ins abscondbrtarget:$dst),
1272 "bdnza $dst">;
Ulrich Weigand86247b62013-06-24 16:52:04 +00001273 def BDZp : BForm_1<16, 27, 0, 0, (outs), (ins condbrtarget:$dst),
1274 "bdz+ $dst">;
1275 def BDNZp: BForm_1<16, 25, 0, 0, (outs), (ins condbrtarget:$dst),
1276 "bdnz+ $dst">;
1277 def BDZAp : BForm_1<16, 27, 1, 0, (outs), (ins abscondbrtarget:$dst),
1278 "bdza+ $dst">;
1279 def BDNZAp: BForm_1<16, 25, 1, 0, (outs), (ins abscondbrtarget:$dst),
1280 "bdnza+ $dst">;
1281 def BDZm : BForm_1<16, 26, 0, 0, (outs), (ins condbrtarget:$dst),
1282 "bdz- $dst">;
1283 def BDNZm: BForm_1<16, 24, 0, 0, (outs), (ins condbrtarget:$dst),
1284 "bdnz- $dst">;
1285 def BDZAm : BForm_1<16, 26, 1, 0, (outs), (ins abscondbrtarget:$dst),
1286 "bdza- $dst">;
1287 def BDNZAm: BForm_1<16, 24, 1, 0, (outs), (ins abscondbrtarget:$dst),
1288 "bdnza- $dst">;
Hal Finkel96c2d4d2012-06-08 15:38:21 +00001289 }
Misha Brukman767fa112004-06-28 18:23:35 +00001290}
1291
Hal Finkele5680b32013-04-04 22:55:54 +00001292// The unconditional BCL used by the SjLj setjmp code.
Ulrich Weigandbbfb0c52013-03-26 10:57:16 +00001293let isCall = 1, hasCtrlDep = 1, isCodeGenOnly = 1, PPC970_Unit = 7 in {
Hal Finkel756810f2013-03-21 21:37:52 +00001294 let Defs = [LR], Uses = [RM] in {
Hal Finkele5680b32013-04-04 22:55:54 +00001295 def BCLalways : BForm_2<16, 20, 31, 0, 1, (outs), (ins condbrtarget:$dst),
1296 "bcl 20, 31, $dst">;
Hal Finkel756810f2013-03-21 21:37:52 +00001297 }
1298}
1299
Roman Divackyef21be22012-03-06 16:41:49 +00001300let isCall = 1, PPC970_Unit = 7, Defs = [LR] in {
Misha Brukman0648a902004-06-30 22:00:45 +00001301 // Convenient aliases for call instructions
Dale Johannesen98aa9d32008-10-29 18:26:45 +00001302 let Uses = [RM] in {
Ulrich Weigandf62e83f2013-03-22 15:24:13 +00001303 def BL : IForm<18, 0, 1, (outs), (ins calltarget:$func),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001304 "bl $func", IIC_BrB, []>; // See Pat patterns below.
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001305 def BLA : IForm<18, 1, 1, (outs), (ins abscalltarget:$func),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001306 "bla $func", IIC_BrB, [(PPCcall (i32 imm:$func))]>;
Ulrich Weigandd20e91e2013-06-24 11:02:19 +00001307
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001308 let isCodeGenOnly = 1 in {
Hal Finkel7c8ae532014-07-25 17:47:22 +00001309 def BL_TLS : IForm<18, 0, 1, (outs), (ins tlscall32:$func),
1310 "bl $func", IIC_BrB, []>;
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001311 def BCCL : BForm<16, 0, 1, (outs), (ins pred:$cond, condbrtarget:$dst),
Ulrich Weigand86247b62013-06-24 16:52:04 +00001312 "b${cond:cc}l${cond:pm} ${cond:reg}, $dst">;
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001313 def BCCLA : BForm<16, 1, 1, (outs), (ins pred:$cond, abscondbrtarget:$dst),
Ulrich Weigand86247b62013-06-24 16:52:04 +00001314 "b${cond:cc}la${cond:pm} ${cond:reg}, $dst">;
Hal Finkel940ab932014-02-28 00:27:01 +00001315
1316 def BCL : BForm_4<16, 12, 0, 1, (outs),
1317 (ins crbitrc:$bi, condbrtarget:$dst),
1318 "bcl 12, $bi, $dst">;
1319 def BCLn : BForm_4<16, 4, 0, 1, (outs),
1320 (ins crbitrc:$bi, condbrtarget:$dst),
1321 "bcl 4, $bi, $dst">;
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001322 }
Dale Johannesen98aa9d32008-10-29 18:26:45 +00001323 }
1324 let Uses = [CTR, RM] in {
Ulrich Weigandf62e83f2013-03-22 15:24:13 +00001325 def BCTRL : XLForm_2_ext<19, 528, 20, 0, 1, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001326 "bctrl", IIC_BrB, [(PPCbctrl)]>,
Ulrich Weigandf62e83f2013-03-22 15:24:13 +00001327 Requires<[In32BitMode]>;
Ulrich Weigandd0585d82013-04-17 17:19:05 +00001328
Hal Finkel940ab932014-02-28 00:27:01 +00001329 let isCodeGenOnly = 1 in {
1330 def BCCCTRL : XLForm_2_br<19, 528, 1, (outs), (ins pred:$cond),
1331 "b${cond:cc}ctrl${cond:pm} ${cond:reg}", IIC_BrB,
1332 []>;
1333
1334 def BCCTRL : XLForm_2_br2<19, 528, 12, 1, (outs), (ins crbitrc:$bi),
1335 "bcctrl 12, $bi, 0", IIC_BrB, []>;
1336 def BCCTRLn : XLForm_2_br2<19, 528, 4, 1, (outs), (ins crbitrc:$bi),
1337 "bcctrl 4, $bi, 0", IIC_BrB, []>;
1338 }
Dale Johannesene395d782008-10-23 20:41:28 +00001339 }
Ulrich Weigand1847bb82013-06-24 11:01:55 +00001340 let Uses = [LR, RM] in {
1341 def BLRL : XLForm_2_ext<19, 16, 20, 0, 1, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001342 "blrl", IIC_BrB, []>;
Ulrich Weigand1847bb82013-06-24 11:01:55 +00001343
Hal Finkel940ab932014-02-28 00:27:01 +00001344 let isCodeGenOnly = 1 in {
1345 def BCCLRL : XLForm_2_br<19, 16, 1, (outs), (ins pred:$cond),
1346 "b${cond:cc}lrl${cond:pm} ${cond:reg}", IIC_BrB,
1347 []>;
1348
1349 def BCLRL : XLForm_2_br2<19, 16, 12, 1, (outs), (ins crbitrc:$bi),
1350 "bclrl 12, $bi, 0", IIC_BrB, []>;
1351 def BCLRLn : XLForm_2_br2<19, 16, 4, 1, (outs), (ins crbitrc:$bi),
1352 "bclrl 4, $bi, 0", IIC_BrB, []>;
1353 }
Ulrich Weigand1847bb82013-06-24 11:01:55 +00001354 }
Ulrich Weigand5b9d5912013-06-24 11:02:38 +00001355 let Defs = [CTR], Uses = [CTR, RM] in {
1356 def BDZL : BForm_1<16, 18, 0, 1, (outs), (ins condbrtarget:$dst),
1357 "bdzl $dst">;
1358 def BDNZL : BForm_1<16, 16, 0, 1, (outs), (ins condbrtarget:$dst),
1359 "bdnzl $dst">;
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001360 def BDZLA : BForm_1<16, 18, 1, 1, (outs), (ins abscondbrtarget:$dst),
1361 "bdzla $dst">;
1362 def BDNZLA : BForm_1<16, 16, 1, 1, (outs), (ins abscondbrtarget:$dst),
1363 "bdnzla $dst">;
Ulrich Weigand86247b62013-06-24 16:52:04 +00001364 def BDZLp : BForm_1<16, 27, 0, 1, (outs), (ins condbrtarget:$dst),
1365 "bdzl+ $dst">;
1366 def BDNZLp: BForm_1<16, 25, 0, 1, (outs), (ins condbrtarget:$dst),
1367 "bdnzl+ $dst">;
1368 def BDZLAp : BForm_1<16, 27, 1, 1, (outs), (ins abscondbrtarget:$dst),
1369 "bdzla+ $dst">;
1370 def BDNZLAp: BForm_1<16, 25, 1, 1, (outs), (ins abscondbrtarget:$dst),
1371 "bdnzla+ $dst">;
1372 def BDZLm : BForm_1<16, 26, 0, 1, (outs), (ins condbrtarget:$dst),
1373 "bdzl- $dst">;
1374 def BDNZLm: BForm_1<16, 24, 0, 1, (outs), (ins condbrtarget:$dst),
1375 "bdnzl- $dst">;
1376 def BDZLAm : BForm_1<16, 26, 1, 1, (outs), (ins abscondbrtarget:$dst),
1377 "bdzla- $dst">;
1378 def BDNZLAm: BForm_1<16, 24, 1, 1, (outs), (ins abscondbrtarget:$dst),
1379 "bdnzla- $dst">;
Ulrich Weigand5b9d5912013-06-24 11:02:38 +00001380 }
1381 let Defs = [CTR], Uses = [CTR, LR, RM] in {
1382 def BDZLRL : XLForm_2_ext<19, 16, 18, 0, 1, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001383 "bdzlrl", IIC_BrB, []>;
Ulrich Weigand5b9d5912013-06-24 11:02:38 +00001384 def BDNZLRL : XLForm_2_ext<19, 16, 16, 0, 1, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001385 "bdnzlrl", IIC_BrB, []>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00001386 def BDZLRLp : XLForm_2_ext<19, 16, 27, 0, 1, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001387 "bdzlrl+", IIC_BrB, []>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00001388 def BDNZLRLp: XLForm_2_ext<19, 16, 25, 0, 1, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001389 "bdnzlrl+", IIC_BrB, []>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00001390 def BDZLRLm : XLForm_2_ext<19, 16, 26, 0, 1, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001391 "bdzlrl-", IIC_BrB, []>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00001392 def BDNZLRLm: XLForm_2_ext<19, 16, 24, 0, 1, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001393 "bdnzlrl-", IIC_BrB, []>;
Ulrich Weigand5b9d5912013-06-24 11:02:38 +00001394 }
Chris Lattner43df5b32007-02-25 05:34:32 +00001395}
1396
Dale Johannesen98aa9d32008-10-29 18:26:45 +00001397let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [RM] in
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00001398def TCRETURNdi :Pseudo< (outs),
Jakob Stoklund Olesened6c0402012-07-13 20:44:29 +00001399 (ins calltarget:$dst, i32imm:$offset),
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00001400 "#TC_RETURNd $dst $offset",
1401 []>;
1402
1403
Dale Johannesen98aa9d32008-10-29 18:26:45 +00001404let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [RM] in
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001405def TCRETURNai :Pseudo<(outs), (ins abscalltarget:$func, i32imm:$offset),
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00001406 "#TC_RETURNa $func $offset",
1407 [(PPCtc_return (i32 imm:$func), imm:$offset)]>;
1408
Dale Johannesen98aa9d32008-10-29 18:26:45 +00001409let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [RM] in
Jakob Stoklund Olesened6c0402012-07-13 20:44:29 +00001410def TCRETURNri : Pseudo<(outs), (ins CTRRC:$dst, i32imm:$offset),
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00001411 "#TC_RETURNr $dst $offset",
1412 []>;
1413
1414
Ulrich Weigandbbfb0c52013-03-26 10:57:16 +00001415let isCodeGenOnly = 1 in {
1416
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00001417let isTerminator = 1, isBarrier = 1, PPC970_Unit = 7, isBranch = 1,
Dale Johannesen98aa9d32008-10-29 18:26:45 +00001418 isIndirectBranch = 1, isCall = 1, isReturn = 1, Uses = [CTR, RM] in
Hal Finkel3e5a3602013-11-27 23:26:09 +00001419def TAILBCTR : XLForm_2_ext<19, 528, 20, 0, 0, (outs), (ins), "bctr", IIC_BrB,
1420 []>, Requires<[In32BitMode]>;
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00001421
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00001422let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, PPC970_Unit = 7,
Dale Johannesen98aa9d32008-10-29 18:26:45 +00001423 isBarrier = 1, isCall = 1, isReturn = 1, Uses = [RM] in
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00001424def TAILB : IForm<18, 0, 0, (outs), (ins calltarget:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001425 "b $dst", IIC_BrB,
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00001426 []>;
1427
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00001428let isBranch = 1, isTerminator = 1, hasCtrlDep = 1, PPC970_Unit = 7,
Dale Johannesen98aa9d32008-10-29 18:26:45 +00001429 isBarrier = 1, isCall = 1, isReturn = 1, Uses = [RM] in
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001430def TAILBA : IForm<18, 0, 0, (outs), (ins abscalltarget:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001431 "ba $dst", IIC_BrB,
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00001432 []>;
1433
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00001434}
1435
Ulrich Weigandbbfb0c52013-03-26 10:57:16 +00001436let hasSideEffects = 1, isBarrier = 1, usesCustomInserter = 1 in {
Hal Finkel40f76d52013-07-17 05:35:44 +00001437 let Defs = [CTR] in
Ulrich Weigand136ac222013-04-26 16:53:15 +00001438 def EH_SjLj_SetJmp32 : Pseudo<(outs gprc:$dst), (ins memr:$buf),
Hal Finkel756810f2013-03-21 21:37:52 +00001439 "#EH_SJLJ_SETJMP32",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001440 [(set i32:$dst, (PPCeh_sjlj_setjmp addr:$buf))]>,
Hal Finkel756810f2013-03-21 21:37:52 +00001441 Requires<[In32BitMode]>;
1442 let isTerminator = 1 in
1443 def EH_SjLj_LongJmp32 : Pseudo<(outs), (ins memr:$buf),
1444 "#EH_SJLJ_LONGJMP32",
1445 [(PPCeh_sjlj_longjmp addr:$buf)]>,
1446 Requires<[In32BitMode]>;
1447}
1448
Marcin Koscielnicki7b329572016-04-28 21:24:37 +00001449// This pseudo is never removed from the function, as it serves as
1450// a terminator. Size is set to 0 to prevent the builtin assembler
1451// from emitting it.
1452let isBranch = 1, isTerminator = 1, Size = 0 in {
Hal Finkel756810f2013-03-21 21:37:52 +00001453 def EH_SjLj_Setup : Pseudo<(outs), (ins directbrtarget:$dst),
1454 "#EH_SjLj_Setup\t$dst", []>;
1455}
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00001456
Bill Schmidta87a7e22013-05-14 19:35:45 +00001457// System call.
1458let PPC970_Unit = 7 in {
1459 def SC : SCForm<17, 1, (outs), (ins i32imm:$lev),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001460 "sc $lev", IIC_BrB, [(PPCsc (i32 imm:$lev))]>;
Bill Schmidta87a7e22013-05-14 19:35:45 +00001461}
1462
Bill Schmidte26236e2015-05-22 16:44:10 +00001463// Branch history rolling buffer.
1464def CLRBHRB : XForm_0<31, 430, (outs), (ins), "clrbhrb", IIC_BrB,
1465 [(PPCclrbhrb)]>,
1466 PPC970_DGroup_Single;
1467// The $dmy argument used for MFBHRBE is not needed; however, including
1468// it avoids automatic generation of PPCFastISel::fastEmit_i(), which
1469// interferes with necessary special handling (see PPCFastISel.cpp).
1470def MFBHRBE : XFXForm_3p<31, 302, (outs gprc:$rD),
1471 (ins u10imm:$imm, u10imm:$dmy),
1472 "mfbhrbe $rD, $imm", IIC_BrB,
1473 [(set i32:$rD,
1474 (PPCmfbhrbe imm:$imm, imm:$dmy))]>,
1475 PPC970_DGroup_First;
1476
1477def RFEBB : XLForm_S<19, 146, (outs), (ins u1imm:$imm), "rfebb $imm",
1478 IIC_BrB, [(PPCrfebb (i32 imm:$imm))]>,
1479 PPC970_DGroup_Single;
1480
Chris Lattnerc8587d42006-06-06 21:29:23 +00001481// DCB* instructions.
Hal Finkel3e5a3602013-11-27 23:26:09 +00001482def DCBA : DCB_Form<758, 0, (outs), (ins memrr:$dst), "dcba $dst",
1483 IIC_LdStDCBF, [(int_ppc_dcba xoaddr:$dst)]>,
Chris Lattnerd43e8a72006-10-24 01:08:42 +00001484 PPC970_DGroup_Single;
Hal Finkel3e5a3602013-11-27 23:26:09 +00001485def DCBI : DCB_Form<470, 0, (outs), (ins memrr:$dst), "dcbi $dst",
1486 IIC_LdStDCBF, [(int_ppc_dcbi xoaddr:$dst)]>,
Chris Lattnerd43e8a72006-10-24 01:08:42 +00001487 PPC970_DGroup_Single;
Hal Finkel3e5a3602013-11-27 23:26:09 +00001488def DCBST : DCB_Form<54, 0, (outs), (ins memrr:$dst), "dcbst $dst",
1489 IIC_LdStDCBF, [(int_ppc_dcbst xoaddr:$dst)]>,
Chris Lattnerd43e8a72006-10-24 01:08:42 +00001490 PPC970_DGroup_Single;
Hal Finkel3e5a3602013-11-27 23:26:09 +00001491def DCBZ : DCB_Form<1014, 0, (outs), (ins memrr:$dst), "dcbz $dst",
1492 IIC_LdStDCBF, [(int_ppc_dcbz xoaddr:$dst)]>,
Chris Lattnerd43e8a72006-10-24 01:08:42 +00001493 PPC970_DGroup_Single;
Hal Finkel3e5a3602013-11-27 23:26:09 +00001494def DCBZL : DCB_Form<1014, 1, (outs), (ins memrr:$dst), "dcbzl $dst",
1495 IIC_LdStDCBF, [(int_ppc_dcbzl xoaddr:$dst)]>,
Chris Lattnerd43e8a72006-10-24 01:08:42 +00001496 PPC970_DGroup_Single;
Chris Lattnere79a4512006-11-14 19:19:53 +00001497
Hal Finkel277736e2016-09-02 23:41:54 +00001498def DCBF : DCB_Form_hint<86, (outs), (ins u5imm:$TH, memrr:$dst),
1499 "dcbf $dst, $TH", IIC_LdStDCBF, []>,
1500 PPC970_DGroup_Single;
1501
Hal Finkelfefcfff2015-04-23 22:47:57 +00001502let hasSideEffects = 0, mayLoad = 1, mayStore = 1 in {
1503def DCBT : DCB_Form_hint<278, (outs), (ins u5imm:$TH, memrr:$dst),
1504 "dcbt $dst, $TH", IIC_LdStDCBF, []>,
1505 PPC970_DGroup_Single;
1506def DCBTST : DCB_Form_hint<246, (outs), (ins u5imm:$TH, memrr:$dst),
1507 "dcbtst $dst, $TH", IIC_LdStDCBF, []>,
1508 PPC970_DGroup_Single;
1509} // hasSideEffects = 0
1510
Hal Finkel584a70c2014-08-23 23:21:04 +00001511def ICBT : XForm_icbt<31, 22, (outs), (ins u4imm:$CT, memrr:$src),
Bill Schmidt082cfc02015-01-14 20:17:10 +00001512 "icbt $CT, $src", IIC_LdStLoad>, Requires<[HasICBT]>;
Hal Finkel584a70c2014-08-23 23:21:04 +00001513
Hal Finkelfefcfff2015-04-23 22:47:57 +00001514def : Pat<(int_ppc_dcbt xoaddr:$dst),
1515 (DCBT 0, xoaddr:$dst)>;
1516def : Pat<(int_ppc_dcbtst xoaddr:$dst),
1517 (DCBTST 0, xoaddr:$dst)>;
Hal Finkel277736e2016-09-02 23:41:54 +00001518def : Pat<(int_ppc_dcbf xoaddr:$dst),
1519 (DCBF 0, xoaddr:$dst)>;
Hal Finkelfefcfff2015-04-23 22:47:57 +00001520
Hal Finkel322e41a2012-04-01 20:08:17 +00001521def : Pat<(prefetch xoaddr:$dst, (i32 0), imm, (i32 1)),
Hal Finkelfefcfff2015-04-23 22:47:57 +00001522 (DCBT 0, xoaddr:$dst)>; // data prefetch for loads
Hal Finkel584a70c2014-08-23 23:21:04 +00001523def : Pat<(prefetch xoaddr:$dst, (i32 1), imm, (i32 1)),
Hal Finkelfefcfff2015-04-23 22:47:57 +00001524 (DCBTST 0, xoaddr:$dst)>; // data prefetch for stores
Hal Finkel584a70c2014-08-23 23:21:04 +00001525def : Pat<(prefetch xoaddr:$dst, (i32 0), imm, (i32 0)),
Bill Schmidt082cfc02015-01-14 20:17:10 +00001526 (ICBT 0, xoaddr:$dst)>, Requires<[HasICBT]>; // inst prefetch (for read)
Hal Finkel322e41a2012-04-01 20:08:17 +00001527
Evan Cheng32e376f2008-07-12 02:23:19 +00001528// Atomic operations
Dan Gohman453d64c2009-10-29 18:10:34 +00001529let usesCustomInserter = 1 in {
Jakob Stoklund Olesen86e1a652011-04-04 17:07:09 +00001530 let Defs = [CR0] in {
Dale Johannesena32affb2008-08-28 17:53:09 +00001531 def ATOMIC_LOAD_ADD_I8 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001532 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_ADD_I8",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001533 [(set i32:$dst, (atomic_load_add_8 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001534 def ATOMIC_LOAD_SUB_I8 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001535 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_SUB_I8",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001536 [(set i32:$dst, (atomic_load_sub_8 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001537 def ATOMIC_LOAD_AND_I8 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001538 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_AND_I8",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001539 [(set i32:$dst, (atomic_load_and_8 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001540 def ATOMIC_LOAD_OR_I8 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001541 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_OR_I8",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001542 [(set i32:$dst, (atomic_load_or_8 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001543 def ATOMIC_LOAD_XOR_I8 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001544 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "ATOMIC_LOAD_XOR_I8",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001545 [(set i32:$dst, (atomic_load_xor_8 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001546 def ATOMIC_LOAD_NAND_I8 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001547 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_NAND_I8",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001548 [(set i32:$dst, (atomic_load_nand_8 xoaddr:$ptr, i32:$incr))]>;
Hal Finkel57282002016-08-28 16:17:58 +00001549 def ATOMIC_LOAD_MIN_I8 : Pseudo<
1550 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_MIN_I8",
1551 [(set i32:$dst, (atomic_load_min_8 xoaddr:$ptr, i32:$incr))]>;
1552 def ATOMIC_LOAD_MAX_I8 : Pseudo<
1553 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_MAX_I8",
1554 [(set i32:$dst, (atomic_load_max_8 xoaddr:$ptr, i32:$incr))]>;
1555 def ATOMIC_LOAD_UMIN_I8 : Pseudo<
1556 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_UMIN_I8",
1557 [(set i32:$dst, (atomic_load_umin_8 xoaddr:$ptr, i32:$incr))]>;
1558 def ATOMIC_LOAD_UMAX_I8 : Pseudo<
1559 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_UMAX_I8",
1560 [(set i32:$dst, (atomic_load_umax_8 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001561 def ATOMIC_LOAD_ADD_I16 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001562 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_ADD_I16",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001563 [(set i32:$dst, (atomic_load_add_16 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001564 def ATOMIC_LOAD_SUB_I16 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001565 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_SUB_I16",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001566 [(set i32:$dst, (atomic_load_sub_16 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001567 def ATOMIC_LOAD_AND_I16 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001568 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_AND_I16",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001569 [(set i32:$dst, (atomic_load_and_16 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001570 def ATOMIC_LOAD_OR_I16 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001571 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_OR_I16",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001572 [(set i32:$dst, (atomic_load_or_16 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001573 def ATOMIC_LOAD_XOR_I16 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001574 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_XOR_I16",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001575 [(set i32:$dst, (atomic_load_xor_16 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001576 def ATOMIC_LOAD_NAND_I16 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001577 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_NAND_I16",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001578 [(set i32:$dst, (atomic_load_nand_16 xoaddr:$ptr, i32:$incr))]>;
Hal Finkel57282002016-08-28 16:17:58 +00001579 def ATOMIC_LOAD_MIN_I16 : Pseudo<
1580 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_MIN_I16",
1581 [(set i32:$dst, (atomic_load_min_16 xoaddr:$ptr, i32:$incr))]>;
1582 def ATOMIC_LOAD_MAX_I16 : Pseudo<
1583 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_MAX_I16",
1584 [(set i32:$dst, (atomic_load_max_16 xoaddr:$ptr, i32:$incr))]>;
1585 def ATOMIC_LOAD_UMIN_I16 : Pseudo<
1586 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_UMIN_I16",
1587 [(set i32:$dst, (atomic_load_umin_16 xoaddr:$ptr, i32:$incr))]>;
1588 def ATOMIC_LOAD_UMAX_I16 : Pseudo<
1589 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_UMAX_I16",
1590 [(set i32:$dst, (atomic_load_umax_16 xoaddr:$ptr, i32:$incr))]>;
Evan Cheng32e376f2008-07-12 02:23:19 +00001591 def ATOMIC_LOAD_ADD_I32 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001592 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_ADD_I32",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001593 [(set i32:$dst, (atomic_load_add_32 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesend4eb0522008-08-25 22:34:37 +00001594 def ATOMIC_LOAD_SUB_I32 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001595 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_SUB_I32",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001596 [(set i32:$dst, (atomic_load_sub_32 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesend4eb0522008-08-25 22:34:37 +00001597 def ATOMIC_LOAD_AND_I32 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001598 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_AND_I32",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001599 [(set i32:$dst, (atomic_load_and_32 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesend4eb0522008-08-25 22:34:37 +00001600 def ATOMIC_LOAD_OR_I32 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001601 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_OR_I32",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001602 [(set i32:$dst, (atomic_load_or_32 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesend4eb0522008-08-25 22:34:37 +00001603 def ATOMIC_LOAD_XOR_I32 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001604 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_XOR_I32",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001605 [(set i32:$dst, (atomic_load_xor_32 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesend4eb0522008-08-25 22:34:37 +00001606 def ATOMIC_LOAD_NAND_I32 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001607 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_NAND_I32",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001608 [(set i32:$dst, (atomic_load_nand_32 xoaddr:$ptr, i32:$incr))]>;
Hal Finkel57282002016-08-28 16:17:58 +00001609 def ATOMIC_LOAD_MIN_I32 : Pseudo<
1610 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_MIN_I32",
1611 [(set i32:$dst, (atomic_load_min_32 xoaddr:$ptr, i32:$incr))]>;
1612 def ATOMIC_LOAD_MAX_I32 : Pseudo<
1613 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_MAX_I32",
1614 [(set i32:$dst, (atomic_load_max_32 xoaddr:$ptr, i32:$incr))]>;
1615 def ATOMIC_LOAD_UMIN_I32 : Pseudo<
1616 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_UMIN_I32",
1617 [(set i32:$dst, (atomic_load_umin_32 xoaddr:$ptr, i32:$incr))]>;
1618 def ATOMIC_LOAD_UMAX_I32 : Pseudo<
1619 (outs gprc:$dst), (ins memrr:$ptr, gprc:$incr), "#ATOMIC_LOAD_UMAX_I32",
1620 [(set i32:$dst, (atomic_load_umax_32 xoaddr:$ptr, i32:$incr))]>;
Dale Johannesend4eb0522008-08-25 22:34:37 +00001621
Dale Johannesena32affb2008-08-28 17:53:09 +00001622 def ATOMIC_CMP_SWAP_I8 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001623 (outs gprc:$dst), (ins memrr:$ptr, gprc:$old, gprc:$new), "#ATOMIC_CMP_SWAP_I8",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001624 [(set i32:$dst, (atomic_cmp_swap_8 xoaddr:$ptr, i32:$old, i32:$new))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001625 def ATOMIC_CMP_SWAP_I16 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001626 (outs gprc:$dst), (ins memrr:$ptr, gprc:$old, gprc:$new), "#ATOMIC_CMP_SWAP_I16 $dst $ptr $old $new",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001627 [(set i32:$dst, (atomic_cmp_swap_16 xoaddr:$ptr, i32:$old, i32:$new))]>;
Dale Johannesendec51702008-08-22 03:49:10 +00001628 def ATOMIC_CMP_SWAP_I32 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001629 (outs gprc:$dst), (ins memrr:$ptr, gprc:$old, gprc:$new), "#ATOMIC_CMP_SWAP_I32 $dst $ptr $old $new",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001630 [(set i32:$dst, (atomic_cmp_swap_32 xoaddr:$ptr, i32:$old, i32:$new))]>;
Dale Johannesend4eb0522008-08-25 22:34:37 +00001631
Dale Johannesena32affb2008-08-28 17:53:09 +00001632 def ATOMIC_SWAP_I8 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001633 (outs gprc:$dst), (ins memrr:$ptr, gprc:$new), "#ATOMIC_SWAP_i8",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001634 [(set i32:$dst, (atomic_swap_8 xoaddr:$ptr, i32:$new))]>;
Dale Johannesena32affb2008-08-28 17:53:09 +00001635 def ATOMIC_SWAP_I16 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001636 (outs gprc:$dst), (ins memrr:$ptr, gprc:$new), "#ATOMIC_SWAP_I16",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001637 [(set i32:$dst, (atomic_swap_16 xoaddr:$ptr, i32:$new))]>;
Dale Johannesen765065c2008-08-25 21:09:52 +00001638 def ATOMIC_SWAP_I32 : Pseudo<
Ulrich Weigand136ac222013-04-26 16:53:15 +00001639 (outs gprc:$dst), (ins memrr:$ptr, gprc:$new), "#ATOMIC_SWAP_I32",
Ulrich Weigandc8868102013-03-25 19:05:30 +00001640 [(set i32:$dst, (atomic_swap_32 xoaddr:$ptr, i32:$new))]>;
Dale Johannesendec51702008-08-22 03:49:10 +00001641 }
Evan Cheng51096af2008-04-19 01:30:48 +00001642}
1643
Evan Cheng32e376f2008-07-12 02:23:19 +00001644// Instructions to support atomic operations
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +00001645let mayLoad = 1, hasSideEffects = 0 in {
1646def LBARX : XForm_1<31, 52, (outs gprc:$rD), (ins memrr:$src),
1647 "lbarx $rD, $src", IIC_LdStLWARX, []>,
1648 Requires<[HasPartwordAtomics]>;
Evan Cheng32e376f2008-07-12 02:23:19 +00001649
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +00001650def LHARX : XForm_1<31, 116, (outs gprc:$rD), (ins memrr:$src),
1651 "lharx $rD, $src", IIC_LdStLWARX, []>,
1652 Requires<[HasPartwordAtomics]>;
1653
1654def LWARX : XForm_1<31, 20, (outs gprc:$rD), (ins memrr:$src),
1655 "lwarx $rD, $src", IIC_LdStLWARX, []>;
1656
1657// Instructions to support lock versions of atomics
1658// (EH=1 - see Power ISA 2.07 Book II 4.4.2)
1659def LBARXL : XForm_1<31, 52, (outs gprc:$rD), (ins memrr:$src),
1660 "lbarx $rD, $src, 1", IIC_LdStLWARX, []>, isDOT,
1661 Requires<[HasPartwordAtomics]>;
1662
1663def LHARXL : XForm_1<31, 116, (outs gprc:$rD), (ins memrr:$src),
1664 "lharx $rD, $src, 1", IIC_LdStLWARX, []>, isDOT,
1665 Requires<[HasPartwordAtomics]>;
1666
1667def LWARXL : XForm_1<31, 20, (outs gprc:$rD), (ins memrr:$src),
1668 "lwarx $rD, $src, 1", IIC_LdStLWARX, []>, isDOT;
Nemanja Ivanovica621a7f2016-03-31 15:26:37 +00001669
1670// The atomic instructions use the destination register as well as the next one
1671// or two registers in order (modulo 31).
1672let hasExtraSrcRegAllocReq = 1 in
1673def LWAT : X_RD5_RS5_IM5<31, 582, (outs gprc:$rD), (ins gprc:$rA, u5imm:$FC),
1674 "lwat $rD, $rA, $FC", IIC_LdStLoad>,
1675 Requires<[IsISA3_0]>;
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +00001676}
1677
1678let Defs = [CR0], mayStore = 1, hasSideEffects = 0 in {
1679def STBCX : XForm_1<31, 694, (outs), (ins gprc:$rS, memrr:$dst),
1680 "stbcx. $rS, $dst", IIC_LdStSTWCX, []>,
1681 isDOT, Requires<[HasPartwordAtomics]>;
1682
1683def STHCX : XForm_1<31, 726, (outs), (ins gprc:$rS, memrr:$dst),
1684 "sthcx. $rS, $dst", IIC_LdStSTWCX, []>,
1685 isDOT, Requires<[HasPartwordAtomics]>;
1686
Ulrich Weigand136ac222013-04-26 16:53:15 +00001687def STWCX : XForm_1<31, 150, (outs), (ins gprc:$rS, memrr:$dst),
Nemanja Ivanovic0adf26b2015-03-10 20:51:07 +00001688 "stwcx. $rS, $dst", IIC_LdStSTWCX, []>, isDOT;
1689}
Evan Cheng32e376f2008-07-12 02:23:19 +00001690
Nemanja Ivanovica621a7f2016-03-31 15:26:37 +00001691let mayStore = 1, hasSideEffects = 0 in
1692def STWAT : X_RD5_RS5_IM5<31, 710, (outs), (ins gprc:$rS, gprc:$rA, u5imm:$FC),
1693 "stwat $rS, $rA, $FC", IIC_LdStStore>,
1694 Requires<[IsISA3_0]>;
1695
Dan Gohman30e3db22010-05-14 16:46:02 +00001696let isTerminator = 1, isBarrier = 1, hasCtrlDep = 1 in
Hal Finkel3e5a3602013-11-27 23:26:09 +00001697def TRAP : XForm_24<31, 4, (outs), (ins), "trap", IIC_LdStLoad, [(trap)]>;
Nate Begemanf69d13b2008-08-11 17:36:31 +00001698
Ulrich Weigand56b0e7b2013-07-04 14:40:12 +00001699def TWI : DForm_base<3, (outs), (ins u5imm:$to, gprc:$rA, s16imm:$imm),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001700 "twi $to, $rA, $imm", IIC_IntTrapW, []>;
Ulrich Weigand56b0e7b2013-07-04 14:40:12 +00001701def TW : XForm_1<31, 4, (outs), (ins u5imm:$to, gprc:$rA, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001702 "tw $to, $rA, $rB", IIC_IntTrapW, []>;
Ulrich Weigand56b0e7b2013-07-04 14:40:12 +00001703def TDI : DForm_base<2, (outs), (ins u5imm:$to, g8rc:$rA, s16imm:$imm),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001704 "tdi $to, $rA, $imm", IIC_IntTrapD, []>;
Ulrich Weigand56b0e7b2013-07-04 14:40:12 +00001705def TD : XForm_1<31, 68, (outs), (ins u5imm:$to, g8rc:$rA, g8rc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001706 "td $to, $rA, $rB", IIC_IntTrapD, []>;
Ulrich Weigand56b0e7b2013-07-04 14:40:12 +00001707
Chris Lattnere79a4512006-11-14 19:19:53 +00001708//===----------------------------------------------------------------------===//
1709// PPC32 Load Instructions.
Nate Begeman143cf942004-08-30 02:28:06 +00001710//
Chris Lattnere79a4512006-11-14 19:19:53 +00001711
Chris Lattner13969612006-11-15 02:43:19 +00001712// Unindexed (r+i) Loads.
Hal Finkel6a778fb2015-03-11 23:28:38 +00001713let PPC970_Unit = 2 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00001714def LBZ : DForm_1<34, (outs gprc:$rD), (ins memri:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001715 "lbz $rD, $src", IIC_LdStLoad,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001716 [(set i32:$rD, (zextloadi8 iaddr:$src))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001717def LHA : DForm_1<42, (outs gprc:$rD), (ins memri:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001718 "lha $rD, $src", IIC_LdStLHA,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001719 [(set i32:$rD, (sextloadi16 iaddr:$src))]>,
Chris Lattner7579cfb2006-03-13 05:15:10 +00001720 PPC970_DGroup_Cracked;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001721def LHZ : DForm_1<40, (outs gprc:$rD), (ins memri:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001722 "lhz $rD, $src", IIC_LdStLoad,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001723 [(set i32:$rD, (zextloadi16 iaddr:$src))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001724def LWZ : DForm_1<32, (outs gprc:$rD), (ins memri:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001725 "lwz $rD, $src", IIC_LdStLoad,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001726 [(set i32:$rD, (load iaddr:$src))]>;
Chris Lattner6a5a4f82006-11-08 02:13:12 +00001727
Ulrich Weigand136ac222013-04-26 16:53:15 +00001728def LFS : DForm_1<48, (outs f4rc:$rD), (ins memri:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001729 "lfs $rD, $src", IIC_LdStLFD,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001730 [(set f32:$rD, (load iaddr:$src))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001731def LFD : DForm_1<50, (outs f8rc:$rD), (ins memri:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001732 "lfd $rD, $src", IIC_LdStLFD,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001733 [(set f64:$rD, (load iaddr:$src))]>;
Chris Lattnerce645542006-11-10 02:08:47 +00001734
Chris Lattnerce645542006-11-10 02:08:47 +00001735
Chris Lattner13969612006-11-15 02:43:19 +00001736// Unindexed (r+i) Loads with Update (preinc).
Craig Topperc50d64b2014-11-26 00:46:26 +00001737let mayLoad = 1, hasSideEffects = 0 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00001738def LBZU : DForm_1<35, (outs gprc:$rD, ptr_rc_nor0:$ea_result), (ins memri:$addr),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001739 "lbzu $rD, $addr", IIC_LdStLoadUpd,
Chris Lattner57711562006-11-15 23:24:18 +00001740 []>, RegConstraint<"$addr.reg = $ea_result">,
1741 NoEncode<"$ea_result">;
Chris Lattnerce645542006-11-10 02:08:47 +00001742
Ulrich Weigand136ac222013-04-26 16:53:15 +00001743def LHAU : DForm_1<43, (outs gprc:$rD, ptr_rc_nor0:$ea_result), (ins memri:$addr),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001744 "lhau $rD, $addr", IIC_LdStLHAU,
Chris Lattner57711562006-11-15 23:24:18 +00001745 []>, RegConstraint<"$addr.reg = $ea_result">,
1746 NoEncode<"$ea_result">;
Chris Lattnerce645542006-11-10 02:08:47 +00001747
Ulrich Weigand136ac222013-04-26 16:53:15 +00001748def LHZU : DForm_1<41, (outs gprc:$rD, ptr_rc_nor0:$ea_result), (ins memri:$addr),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001749 "lhzu $rD, $addr", IIC_LdStLoadUpd,
Chris Lattner57711562006-11-15 23:24:18 +00001750 []>, RegConstraint<"$addr.reg = $ea_result">,
1751 NoEncode<"$ea_result">;
Chris Lattnerce645542006-11-10 02:08:47 +00001752
Ulrich Weigand136ac222013-04-26 16:53:15 +00001753def LWZU : DForm_1<33, (outs gprc:$rD, ptr_rc_nor0:$ea_result), (ins memri:$addr),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001754 "lwzu $rD, $addr", IIC_LdStLoadUpd,
Chris Lattner57711562006-11-15 23:24:18 +00001755 []>, RegConstraint<"$addr.reg = $ea_result">,
1756 NoEncode<"$ea_result">;
Chris Lattnerce645542006-11-10 02:08:47 +00001757
Ulrich Weigand136ac222013-04-26 16:53:15 +00001758def LFSU : DForm_1<49, (outs f4rc:$rD, ptr_rc_nor0:$ea_result), (ins memri:$addr),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001759 "lfsu $rD, $addr", IIC_LdStLFDU,
Chris Lattner57711562006-11-15 23:24:18 +00001760 []>, RegConstraint<"$addr.reg = $ea_result">,
1761 NoEncode<"$ea_result">;
1762
Ulrich Weigand136ac222013-04-26 16:53:15 +00001763def LFDU : DForm_1<51, (outs f8rc:$rD, ptr_rc_nor0:$ea_result), (ins memri:$addr),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001764 "lfdu $rD, $addr", IIC_LdStLFDU,
Chris Lattner57711562006-11-15 23:24:18 +00001765 []>, RegConstraint<"$addr.reg = $ea_result">,
1766 NoEncode<"$ea_result">;
Hal Finkelca542be2012-06-20 15:43:03 +00001767
1768
1769// Indexed (r+r) Loads with Update (preinc).
Ulrich Weigand136ac222013-04-26 16:53:15 +00001770def LBZUX : XForm_1<31, 119, (outs gprc:$rD, ptr_rc_nor0:$ea_result),
Hal Finkelca542be2012-06-20 15:43:03 +00001771 (ins memrr:$addr),
Hal Finkel46402a42013-11-30 20:41:13 +00001772 "lbzux $rD, $addr", IIC_LdStLoadUpdX,
Ulrich Weigand1df06d82013-03-22 14:59:13 +00001773 []>, RegConstraint<"$addr.ptrreg = $ea_result">,
Hal Finkelca542be2012-06-20 15:43:03 +00001774 NoEncode<"$ea_result">;
1775
Ulrich Weigand136ac222013-04-26 16:53:15 +00001776def LHAUX : XForm_1<31, 375, (outs gprc:$rD, ptr_rc_nor0:$ea_result),
Hal Finkelca542be2012-06-20 15:43:03 +00001777 (ins memrr:$addr),
Hal Finkel46402a42013-11-30 20:41:13 +00001778 "lhaux $rD, $addr", IIC_LdStLHAUX,
Ulrich Weigand1df06d82013-03-22 14:59:13 +00001779 []>, RegConstraint<"$addr.ptrreg = $ea_result">,
Hal Finkelca542be2012-06-20 15:43:03 +00001780 NoEncode<"$ea_result">;
1781
Ulrich Weigand136ac222013-04-26 16:53:15 +00001782def LHZUX : XForm_1<31, 311, (outs gprc:$rD, ptr_rc_nor0:$ea_result),
Hal Finkelca542be2012-06-20 15:43:03 +00001783 (ins memrr:$addr),
Hal Finkel46402a42013-11-30 20:41:13 +00001784 "lhzux $rD, $addr", IIC_LdStLoadUpdX,
Ulrich Weigand1df06d82013-03-22 14:59:13 +00001785 []>, RegConstraint<"$addr.ptrreg = $ea_result">,
Hal Finkelca542be2012-06-20 15:43:03 +00001786 NoEncode<"$ea_result">;
1787
Ulrich Weigand136ac222013-04-26 16:53:15 +00001788def LWZUX : XForm_1<31, 55, (outs gprc:$rD, ptr_rc_nor0:$ea_result),
Hal Finkelca542be2012-06-20 15:43:03 +00001789 (ins memrr:$addr),
Hal Finkel46402a42013-11-30 20:41:13 +00001790 "lwzux $rD, $addr", IIC_LdStLoadUpdX,
Ulrich Weigand1df06d82013-03-22 14:59:13 +00001791 []>, RegConstraint<"$addr.ptrreg = $ea_result">,
Hal Finkelca542be2012-06-20 15:43:03 +00001792 NoEncode<"$ea_result">;
1793
Ulrich Weigand136ac222013-04-26 16:53:15 +00001794def LFSUX : XForm_1<31, 567, (outs f4rc:$rD, ptr_rc_nor0:$ea_result),
Hal Finkelca542be2012-06-20 15:43:03 +00001795 (ins memrr:$addr),
Hal Finkel46402a42013-11-30 20:41:13 +00001796 "lfsux $rD, $addr", IIC_LdStLFDUX,
Ulrich Weigand1df06d82013-03-22 14:59:13 +00001797 []>, RegConstraint<"$addr.ptrreg = $ea_result">,
Hal Finkelca542be2012-06-20 15:43:03 +00001798 NoEncode<"$ea_result">;
1799
Ulrich Weigand136ac222013-04-26 16:53:15 +00001800def LFDUX : XForm_1<31, 631, (outs f8rc:$rD, ptr_rc_nor0:$ea_result),
Hal Finkelca542be2012-06-20 15:43:03 +00001801 (ins memrr:$addr),
Hal Finkel46402a42013-11-30 20:41:13 +00001802 "lfdux $rD, $addr", IIC_LdStLFDUX,
Ulrich Weigand1df06d82013-03-22 14:59:13 +00001803 []>, RegConstraint<"$addr.ptrreg = $ea_result">,
Hal Finkelca542be2012-06-20 15:43:03 +00001804 NoEncode<"$ea_result">;
Nate Begeman6e6514c2004-10-07 22:30:03 +00001805}
Dan Gohmanae3ba452008-12-03 02:30:17 +00001806}
Chris Lattner6a5a4f82006-11-08 02:13:12 +00001807
Chris Lattner13969612006-11-15 02:43:19 +00001808// Indexed (r+r) Loads.
Chris Lattnere79a4512006-11-14 19:19:53 +00001809//
Hal Finkel6a778fb2015-03-11 23:28:38 +00001810let PPC970_Unit = 2 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00001811def LBZX : XForm_1<31, 87, (outs gprc:$rD), (ins memrr:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001812 "lbzx $rD, $src", IIC_LdStLoad,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001813 [(set i32:$rD, (zextloadi8 xaddr:$src))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001814def LHAX : XForm_1<31, 343, (outs gprc:$rD), (ins memrr:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001815 "lhax $rD, $src", IIC_LdStLHA,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001816 [(set i32:$rD, (sextloadi16 xaddr:$src))]>,
Chris Lattnere79a4512006-11-14 19:19:53 +00001817 PPC970_DGroup_Cracked;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001818def LHZX : XForm_1<31, 279, (outs gprc:$rD), (ins memrr:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001819 "lhzx $rD, $src", IIC_LdStLoad,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001820 [(set i32:$rD, (zextloadi16 xaddr:$src))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001821def LWZX : XForm_1<31, 23, (outs gprc:$rD), (ins memrr:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001822 "lwzx $rD, $src", IIC_LdStLoad,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001823 [(set i32:$rD, (load xaddr:$src))]>;
Chris Lattnere79a4512006-11-14 19:19:53 +00001824
1825
Ulrich Weigand136ac222013-04-26 16:53:15 +00001826def LHBRX : XForm_1<31, 790, (outs gprc:$rD), (ins memrr:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001827 "lhbrx $rD, $src", IIC_LdStLoad,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001828 [(set i32:$rD, (PPClbrx xoaddr:$src, i16))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001829def LWBRX : XForm_1<31, 534, (outs gprc:$rD), (ins memrr:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001830 "lwbrx $rD, $src", IIC_LdStLoad,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001831 [(set i32:$rD, (PPClbrx xoaddr:$src, i32))]>;
Chris Lattnere79a4512006-11-14 19:19:53 +00001832
Ulrich Weigand136ac222013-04-26 16:53:15 +00001833def LFSX : XForm_25<31, 535, (outs f4rc:$frD), (ins memrr:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001834 "lfsx $frD, $src", IIC_LdStLFD,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001835 [(set f32:$frD, (load xaddr:$src))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001836def LFDX : XForm_25<31, 599, (outs f8rc:$frD), (ins memrr:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001837 "lfdx $frD, $src", IIC_LdStLFD,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001838 [(set f64:$frD, (load xaddr:$src))]>;
Hal Finkelbeb296b2013-03-31 10:12:51 +00001839
Ulrich Weigand136ac222013-04-26 16:53:15 +00001840def LFIWAX : XForm_25<31, 855, (outs f8rc:$frD), (ins memrr:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001841 "lfiwax $frD, $src", IIC_LdStLFD,
Hal Finkelbeb296b2013-03-31 10:12:51 +00001842 [(set f64:$frD, (PPClfiwax xoaddr:$src))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001843def LFIWZX : XForm_25<31, 887, (outs f8rc:$frD), (ins memrr:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001844 "lfiwzx $frD, $src", IIC_LdStLFD,
Hal Finkelf6d45f22013-04-01 17:52:07 +00001845 [(set f64:$frD, (PPClfiwzx xoaddr:$src))]>;
Chris Lattnere79a4512006-11-14 19:19:53 +00001846}
1847
Ulrich Weigand2542b3b2013-07-03 18:29:47 +00001848// Load Multiple
1849def LMW : DForm_1<46, (outs gprc:$rD), (ins memri:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001850 "lmw $rD, $src", IIC_LdStLMW, []>;
Ulrich Weigand2542b3b2013-07-03 18:29:47 +00001851
Chris Lattnere79a4512006-11-14 19:19:53 +00001852//===----------------------------------------------------------------------===//
1853// PPC32 Store Instructions.
1854//
1855
Chris Lattner13969612006-11-15 02:43:19 +00001856// Unindexed (r+i) Stores.
Chris Lattnere20f3802008-01-06 05:53:26 +00001857let PPC970_Unit = 2 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00001858def STB : DForm_1<38, (outs), (ins gprc:$rS, memri:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001859 "stb $rS, $src", IIC_LdStStore,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001860 [(truncstorei8 i32:$rS, iaddr:$src)]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001861def STH : DForm_1<44, (outs), (ins gprc:$rS, memri:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001862 "sth $rS, $src", IIC_LdStStore,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001863 [(truncstorei16 i32:$rS, iaddr:$src)]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001864def STW : DForm_1<36, (outs), (ins gprc:$rS, memri:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001865 "stw $rS, $src", IIC_LdStStore,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001866 [(store i32:$rS, iaddr:$src)]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001867def STFS : DForm_1<52, (outs), (ins f4rc:$rS, memri:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001868 "stfs $rS, $dst", IIC_LdStSTFD,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001869 [(store f32:$rS, iaddr:$dst)]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001870def STFD : DForm_1<54, (outs), (ins f8rc:$rS, memri:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001871 "stfd $rS, $dst", IIC_LdStSTFD,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001872 [(store f64:$rS, iaddr:$dst)]>;
Chris Lattnere79a4512006-11-14 19:19:53 +00001873}
1874
Chris Lattner13969612006-11-15 02:43:19 +00001875// Unindexed (r+i) Stores with Update (preinc).
Ulrich Weigandd8501672013-03-19 19:52:04 +00001876let PPC970_Unit = 2, mayStore = 1 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00001877def STBU : DForm_1<39, (outs ptr_rc_nor0:$ea_res), (ins gprc:$rS, memri:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001878 "stbu $rS, $dst", IIC_LdStStoreUpd, []>,
Ulrich Weigandd8501672013-03-19 19:52:04 +00001879 RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001880def STHU : DForm_1<45, (outs ptr_rc_nor0:$ea_res), (ins gprc:$rS, memri:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001881 "sthu $rS, $dst", IIC_LdStStoreUpd, []>,
Ulrich Weigandd8501672013-03-19 19:52:04 +00001882 RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001883def STWU : DForm_1<37, (outs ptr_rc_nor0:$ea_res), (ins gprc:$rS, memri:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001884 "stwu $rS, $dst", IIC_LdStStoreUpd, []>,
Ulrich Weigandd8501672013-03-19 19:52:04 +00001885 RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001886def STFSU : DForm_1<53, (outs ptr_rc_nor0:$ea_res), (ins f4rc:$rS, memri:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001887 "stfsu $rS, $dst", IIC_LdStSTFDU, []>,
Ulrich Weigandd8501672013-03-19 19:52:04 +00001888 RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001889def STFDU : DForm_1<55, (outs ptr_rc_nor0:$ea_res), (ins f8rc:$rS, memri:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001890 "stfdu $rS, $dst", IIC_LdStSTFDU, []>,
Ulrich Weigandd8501672013-03-19 19:52:04 +00001891 RegConstraint<"$dst.reg = $ea_res">, NoEncode<"$ea_res">;
Chris Lattner13969612006-11-15 02:43:19 +00001892}
1893
Ulrich Weigandd8501672013-03-19 19:52:04 +00001894// Patterns to match the pre-inc stores. We can't put the patterns on
1895// the instruction definitions directly as ISel wants the address base
1896// and offset to be separate operands, not a single complex operand.
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00001897def : Pat<(pre_truncsti8 i32:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
1898 (STBU $rS, iaddroff:$ptroff, $ptrreg)>;
1899def : Pat<(pre_truncsti16 i32:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
1900 (STHU $rS, iaddroff:$ptroff, $ptrreg)>;
1901def : Pat<(pre_store i32:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
1902 (STWU $rS, iaddroff:$ptroff, $ptrreg)>;
1903def : Pat<(pre_store f32:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
1904 (STFSU $rS, iaddroff:$ptroff, $ptrreg)>;
1905def : Pat<(pre_store f64:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
1906 (STFDU $rS, iaddroff:$ptroff, $ptrreg)>;
Chris Lattner13969612006-11-15 02:43:19 +00001907
Chris Lattnere79a4512006-11-14 19:19:53 +00001908// Indexed (r+r) Stores.
Chris Lattnere20f3802008-01-06 05:53:26 +00001909let PPC970_Unit = 2 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00001910def STBX : XForm_8<31, 215, (outs), (ins gprc:$rS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001911 "stbx $rS, $dst", IIC_LdStStore,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001912 [(truncstorei8 i32:$rS, xaddr:$dst)]>,
Chris Lattnere79a4512006-11-14 19:19:53 +00001913 PPC970_DGroup_Cracked;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001914def STHX : XForm_8<31, 407, (outs), (ins gprc:$rS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001915 "sthx $rS, $dst", IIC_LdStStore,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001916 [(truncstorei16 i32:$rS, xaddr:$dst)]>,
Chris Lattnere79a4512006-11-14 19:19:53 +00001917 PPC970_DGroup_Cracked;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001918def STWX : XForm_8<31, 151, (outs), (ins gprc:$rS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001919 "stwx $rS, $dst", IIC_LdStStore,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001920 [(store i32:$rS, xaddr:$dst)]>,
Chris Lattnere79a4512006-11-14 19:19:53 +00001921 PPC970_DGroup_Cracked;
Hal Finkel1cc27e42012-06-19 02:34:32 +00001922
Ulrich Weigand136ac222013-04-26 16:53:15 +00001923def STHBRX: XForm_8<31, 918, (outs), (ins gprc:$rS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001924 "sthbrx $rS, $dst", IIC_LdStStore,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001925 [(PPCstbrx i32:$rS, xoaddr:$dst, i16)]>,
Chris Lattnere79a4512006-11-14 19:19:53 +00001926 PPC970_DGroup_Cracked;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001927def STWBRX: XForm_8<31, 662, (outs), (ins gprc:$rS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001928 "stwbrx $rS, $dst", IIC_LdStStore,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001929 [(PPCstbrx i32:$rS, xoaddr:$dst, i32)]>,
Chris Lattnere79a4512006-11-14 19:19:53 +00001930 PPC970_DGroup_Cracked;
1931
Ulrich Weigand136ac222013-04-26 16:53:15 +00001932def STFIWX: XForm_28<31, 983, (outs), (ins f8rc:$frS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001933 "stfiwx $frS, $dst", IIC_LdStSTFD,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001934 [(PPCstfiwx f64:$frS, xoaddr:$dst)]>;
Chris Lattnera348f552008-01-06 06:44:58 +00001935
Ulrich Weigand136ac222013-04-26 16:53:15 +00001936def STFSX : XForm_28<31, 663, (outs), (ins f4rc:$frS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001937 "stfsx $frS, $dst", IIC_LdStSTFD,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001938 [(store f32:$frS, xaddr:$dst)]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001939def STFDX : XForm_28<31, 727, (outs), (ins f8rc:$frS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001940 "stfdx $frS, $dst", IIC_LdStSTFD,
Ulrich Weigandc8868102013-03-25 19:05:30 +00001941 [(store f64:$frS, xaddr:$dst)]>;
Chris Lattnere79a4512006-11-14 19:19:53 +00001942}
1943
Ulrich Weigandd8501672013-03-19 19:52:04 +00001944// Indexed (r+r) Stores with Update (preinc).
1945let PPC970_Unit = 2, mayStore = 1 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00001946def STBUX : XForm_8<31, 247, (outs ptr_rc_nor0:$ea_res), (ins gprc:$rS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001947 "stbux $rS, $dst", IIC_LdStStoreUpd, []>,
Ulrich Weigand1df06d82013-03-22 14:59:13 +00001948 RegConstraint<"$dst.ptrreg = $ea_res">, NoEncode<"$ea_res">,
Ulrich Weigandd8501672013-03-19 19:52:04 +00001949 PPC970_DGroup_Cracked;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001950def STHUX : XForm_8<31, 439, (outs ptr_rc_nor0:$ea_res), (ins gprc:$rS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001951 "sthux $rS, $dst", IIC_LdStStoreUpd, []>,
Ulrich Weigand1df06d82013-03-22 14:59:13 +00001952 RegConstraint<"$dst.ptrreg = $ea_res">, NoEncode<"$ea_res">,
Ulrich Weigandd8501672013-03-19 19:52:04 +00001953 PPC970_DGroup_Cracked;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001954def STWUX : XForm_8<31, 183, (outs ptr_rc_nor0:$ea_res), (ins gprc:$rS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001955 "stwux $rS, $dst", IIC_LdStStoreUpd, []>,
Ulrich Weigand1df06d82013-03-22 14:59:13 +00001956 RegConstraint<"$dst.ptrreg = $ea_res">, NoEncode<"$ea_res">,
Ulrich Weigandd8501672013-03-19 19:52:04 +00001957 PPC970_DGroup_Cracked;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001958def STFSUX: XForm_8<31, 695, (outs ptr_rc_nor0:$ea_res), (ins f4rc:$rS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001959 "stfsux $rS, $dst", IIC_LdStSTFDU, []>,
Ulrich Weigand1df06d82013-03-22 14:59:13 +00001960 RegConstraint<"$dst.ptrreg = $ea_res">, NoEncode<"$ea_res">,
Ulrich Weigandd8501672013-03-19 19:52:04 +00001961 PPC970_DGroup_Cracked;
Ulrich Weigand136ac222013-04-26 16:53:15 +00001962def STFDUX: XForm_8<31, 759, (outs ptr_rc_nor0:$ea_res), (ins f8rc:$rS, memrr:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001963 "stfdux $rS, $dst", IIC_LdStSTFDU, []>,
Ulrich Weigand1df06d82013-03-22 14:59:13 +00001964 RegConstraint<"$dst.ptrreg = $ea_res">, NoEncode<"$ea_res">,
Ulrich Weigandd8501672013-03-19 19:52:04 +00001965 PPC970_DGroup_Cracked;
1966}
1967
1968// Patterns to match the pre-inc stores. We can't put the patterns on
1969// the instruction definitions directly as ISel wants the address base
1970// and offset to be separate operands, not a single complex operand.
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00001971def : Pat<(pre_truncsti8 i32:$rS, iPTR:$ptrreg, iPTR:$ptroff),
1972 (STBUX $rS, $ptrreg, $ptroff)>;
1973def : Pat<(pre_truncsti16 i32:$rS, iPTR:$ptrreg, iPTR:$ptroff),
1974 (STHUX $rS, $ptrreg, $ptroff)>;
1975def : Pat<(pre_store i32:$rS, iPTR:$ptrreg, iPTR:$ptroff),
1976 (STWUX $rS, $ptrreg, $ptroff)>;
1977def : Pat<(pre_store f32:$rS, iPTR:$ptrreg, iPTR:$ptroff),
1978 (STFSUX $rS, $ptrreg, $ptroff)>;
1979def : Pat<(pre_store f64:$rS, iPTR:$ptrreg, iPTR:$ptroff),
1980 (STFDUX $rS, $ptrreg, $ptroff)>;
Ulrich Weigandd8501672013-03-19 19:52:04 +00001981
Ulrich Weigand2542b3b2013-07-03 18:29:47 +00001982// Store Multiple
1983def STMW : DForm_1<47, (outs), (ins gprc:$rS, memri:$dst),
Hal Finkel3e5a3602013-11-27 23:26:09 +00001984 "stmw $rS, $dst", IIC_LdStLMW, []>;
Ulrich Weigand2542b3b2013-07-03 18:29:47 +00001985
Ulrich Weigand797f1a32013-07-01 16:37:52 +00001986def SYNC : XForm_24_sync<31, 598, (outs), (ins i32imm:$L),
Hal Finkelfe3368c2014-10-02 22:34:22 +00001987 "sync $L", IIC_LdStSync, []>;
Rafael Espindola28a85a82014-01-22 20:20:52 +00001988
1989let isCodeGenOnly = 1 in {
1990 def MSYNC : XForm_24_sync<31, 598, (outs), (ins),
Hal Finkelfe3368c2014-10-02 22:34:22 +00001991 "msync", IIC_LdStSync, []> {
Rafael Espindola28a85a82014-01-22 20:20:52 +00001992 let L = 0;
1993 }
1994}
1995
Hal Finkelfe3368c2014-10-02 22:34:22 +00001996def : Pat<(int_ppc_sync), (SYNC 0)>, Requires<[HasSYNC]>;
1997def : Pat<(int_ppc_lwsync), (SYNC 1)>, Requires<[HasSYNC]>;
1998def : Pat<(int_ppc_sync), (MSYNC)>, Requires<[HasOnlyMSYNC]>;
1999def : Pat<(int_ppc_lwsync), (MSYNC)>, Requires<[HasOnlyMSYNC]>;
Chris Lattnere79a4512006-11-14 19:19:53 +00002000
2001//===----------------------------------------------------------------------===//
2002// PPC32 Arithmetic Instructions.
2003//
Chris Lattner6a5a4f82006-11-08 02:13:12 +00002004
Chris Lattner51348c52006-03-12 09:13:49 +00002005let PPC970_Unit = 1 in { // FXU Operations.
Ulrich Weigand99485462013-05-23 22:48:06 +00002006def ADDI : DForm_2<14, (outs gprc:$rD), (ins gprc_nor0:$rA, s16imm:$imm),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002007 "addi $rD, $rA, $imm", IIC_IntSimple,
Bill Schmidtf88571e2013-05-22 20:09:24 +00002008 [(set i32:$rD, (add i32:$rA, imm32SExt16:$imm))]>;
Hal Finkel1b58f332013-04-12 18:17:57 +00002009let BaseName = "addic" in {
2010let Defs = [CARRY] in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002011def ADDIC : DForm_2<12, (outs gprc:$rD), (ins gprc:$rA, s16imm:$imm),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002012 "addic $rD, $rA, $imm", IIC_IntGeneral,
Bill Schmidtf88571e2013-05-22 20:09:24 +00002013 [(set i32:$rD, (addc i32:$rA, imm32SExt16:$imm))]>,
Hal Finkel654d43b2013-04-12 02:18:09 +00002014 RecFormRel, PPC970_DGroup_Cracked;
Hal Finkel1b58f332013-04-12 18:17:57 +00002015let Defs = [CARRY, CR0] in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002016def ADDICo : DForm_2<13, (outs gprc:$rD), (ins gprc:$rA, s16imm:$imm),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002017 "addic. $rD, $rA, $imm", IIC_IntGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002018 []>, isDOT, RecFormRel;
Dale Johannesen5e9a5c32009-09-18 20:15:22 +00002019}
Ulrich Weigand5a02a022013-06-26 13:49:53 +00002020def ADDIS : DForm_2<15, (outs gprc:$rD), (ins gprc_nor0:$rA, s17imm:$imm),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002021 "addis $rD, $rA, $imm", IIC_IntSimple,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002022 [(set i32:$rD, (add i32:$rA, imm16ShiftedSExt:$imm))]>;
Ulrich Weigandbbfb0c52013-03-26 10:57:16 +00002023let isCodeGenOnly = 1 in
Ulrich Weigand99485462013-05-23 22:48:06 +00002024def LA : DForm_2<14, (outs gprc:$rD), (ins gprc_nor0:$rA, s16imm:$sym),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002025 "la $rD, $sym($rA)", IIC_IntGeneral,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002026 [(set i32:$rD, (add i32:$rA,
Chris Lattner4b11fa22005-11-17 17:52:01 +00002027 (PPClo tglobaladdr:$sym, 0)))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002028def MULLI : DForm_2< 7, (outs gprc:$rD), (ins gprc:$rA, s16imm:$imm),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002029 "mulli $rD, $rA, $imm", IIC_IntMulLI,
Bill Schmidtf88571e2013-05-22 20:09:24 +00002030 [(set i32:$rD, (mul i32:$rA, imm32SExt16:$imm))]>;
Hal Finkel1b58f332013-04-12 18:17:57 +00002031let Defs = [CARRY] in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002032def SUBFIC : DForm_2< 8, (outs gprc:$rD), (ins gprc:$rA, s16imm:$imm),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002033 "subfic $rD, $rA, $imm", IIC_IntGeneral,
Bill Schmidtf88571e2013-05-22 20:09:24 +00002034 [(set i32:$rD, (subc imm32SExt16:$imm, i32:$rA))]>;
Bill Wendlingfb706bc2007-12-07 21:42:31 +00002035
Hal Finkel686f2ee2012-08-28 02:10:33 +00002036let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in {
Ulrich Weigand99485462013-05-23 22:48:06 +00002037 def LI : DForm_2_r0<14, (outs gprc:$rD), (ins s16imm:$imm),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002038 "li $rD, $imm", IIC_IntSimple,
Bill Schmidtf88571e2013-05-22 20:09:24 +00002039 [(set i32:$rD, imm32SExt16:$imm)]>;
Ulrich Weigand5a02a022013-06-26 13:49:53 +00002040 def LIS : DForm_2_r0<15, (outs gprc:$rD), (ins s17imm:$imm),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002041 "lis $rD, $imm", IIC_IntSimple,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002042 [(set i32:$rD, imm16ShiftedSExt:$imm)]>;
Bill Wendlingfb706bc2007-12-07 21:42:31 +00002043}
Chris Lattner51348c52006-03-12 09:13:49 +00002044}
Chris Lattnere79a4512006-11-14 19:19:53 +00002045
Chris Lattner51348c52006-03-12 09:13:49 +00002046let PPC970_Unit = 1 in { // FXU Operations.
Hal Finkel1b58f332013-04-12 18:17:57 +00002047let Defs = [CR0] in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002048def ANDIo : DForm_4<28, (outs gprc:$dst), (ins gprc:$src1, u16imm:$src2),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002049 "andi. $dst, $src1, $src2", IIC_IntGeneral,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002050 [(set i32:$dst, (and i32:$src1, immZExt16:$src2))]>,
Nate Begemanbc3ec1d2006-02-12 09:09:52 +00002051 isDOT;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002052def ANDISo : DForm_4<29, (outs gprc:$dst), (ins gprc:$src1, u16imm:$src2),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002053 "andis. $dst, $src1, $src2", IIC_IntGeneral,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002054 [(set i32:$dst, (and i32:$src1, imm16ShiftedZExt:$src2))]>,
Nate Begemanbc3ec1d2006-02-12 09:09:52 +00002055 isDOT;
Hal Finkel1b58f332013-04-12 18:17:57 +00002056}
Ulrich Weigand136ac222013-04-26 16:53:15 +00002057def ORI : DForm_4<24, (outs gprc:$dst), (ins gprc:$src1, u16imm:$src2),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002058 "ori $dst, $src1, $src2", IIC_IntSimple,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002059 [(set i32:$dst, (or i32:$src1, immZExt16:$src2))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002060def ORIS : DForm_4<25, (outs gprc:$dst), (ins gprc:$src1, u16imm:$src2),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002061 "oris $dst, $src1, $src2", IIC_IntSimple,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002062 [(set i32:$dst, (or i32:$src1, imm16ShiftedZExt:$src2))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002063def XORI : DForm_4<26, (outs gprc:$dst), (ins gprc:$src1, u16imm:$src2),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002064 "xori $dst, $src1, $src2", IIC_IntSimple,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002065 [(set i32:$dst, (xor i32:$src1, immZExt16:$src2))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002066def XORIS : DForm_4<27, (outs gprc:$dst), (ins gprc:$src1, u16imm:$src2),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002067 "xoris $dst, $src1, $src2", IIC_IntSimple,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002068 [(set i32:$dst, (xor i32:$src1, imm16ShiftedZExt:$src2))]>;
Hal Finkelceb1f122013-12-12 00:19:11 +00002069
Hal Finkel3e5a3602013-11-27 23:26:09 +00002070def NOP : DForm_4_zero<24, (outs), (ins), "nop", IIC_IntSimple,
Nate Begemanade6f9a2005-12-09 23:54:18 +00002071 []>;
Hal Finkelceb1f122013-12-12 00:19:11 +00002072let isCodeGenOnly = 1 in {
2073// The POWER6 and POWER7 have special group-terminating nops.
2074def NOP_GT_PWR6 : DForm_4_fixedreg_zero<24, 1, (outs), (ins),
2075 "ori 1, 1, 0", IIC_IntSimple, []>;
2076def NOP_GT_PWR7 : DForm_4_fixedreg_zero<24, 2, (outs), (ins),
2077 "ori 2, 2, 0", IIC_IntSimple, []>;
2078}
2079
Craig Topperc50d64b2014-11-26 00:46:26 +00002080let isCompare = 1, hasSideEffects = 0 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002081 def CMPWI : DForm_5_ext<11, (outs crrc:$crD), (ins gprc:$rA, s16imm:$imm),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002082 "cmpwi $crD, $rA, $imm", IIC_IntCompare>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002083 def CMPLWI : DForm_6_ext<10, (outs crrc:$dst), (ins gprc:$src1, u16imm:$src2),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002084 "cmplwi $dst, $src1, $src2", IIC_IntCompare>;
Nemanja Ivanovic87bcae32016-04-13 18:51:18 +00002085 def CMPRB : X_BF3_L1_RS5_RS5<31, 192, (outs crbitrc:$BF),
2086 (ins u1imm:$L, g8rc:$rA, g8rc:$rB),
2087 "cmprb $BF, $L, $rA, $rB", IIC_IntCompare, []>,
2088 Requires<[IsISA3_0]>;
Hal Finkel95e6ea62013-04-15 02:37:46 +00002089}
Chris Lattner51348c52006-03-12 09:13:49 +00002090}
Nate Begeman4bfceb12004-09-04 05:00:00 +00002091
Craig Topperc50d64b2014-11-26 00:46:26 +00002092let PPC970_Unit = 1, hasSideEffects = 0 in { // FXU Operations.
Hal Finkele01d3212014-03-24 15:07:28 +00002093let isCommutable = 1 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002094defm NAND : XForm_6r<31, 476, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002095 "nand", "$rA, $rS, $rB", IIC_IntSimple,
Hal Finkel654d43b2013-04-12 02:18:09 +00002096 [(set i32:$rA, (not (and i32:$rS, i32:$rB)))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002097defm AND : XForm_6r<31, 28, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002098 "and", "$rA, $rS, $rB", IIC_IntSimple,
Hal Finkel654d43b2013-04-12 02:18:09 +00002099 [(set i32:$rA, (and i32:$rS, i32:$rB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002100} // isCommutable
Ulrich Weigand136ac222013-04-26 16:53:15 +00002101defm ANDC : XForm_6r<31, 60, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002102 "andc", "$rA, $rS, $rB", IIC_IntSimple,
Hal Finkel654d43b2013-04-12 02:18:09 +00002103 [(set i32:$rA, (and i32:$rS, (not i32:$rB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002104let isCommutable = 1 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002105defm OR : XForm_6r<31, 444, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002106 "or", "$rA, $rS, $rB", IIC_IntSimple,
Hal Finkel654d43b2013-04-12 02:18:09 +00002107 [(set i32:$rA, (or i32:$rS, i32:$rB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002108defm NOR : XForm_6r<31, 124, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002109 "nor", "$rA, $rS, $rB", IIC_IntSimple,
Hal Finkel654d43b2013-04-12 02:18:09 +00002110 [(set i32:$rA, (not (or i32:$rS, i32:$rB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002111} // isCommutable
Ulrich Weigand136ac222013-04-26 16:53:15 +00002112defm ORC : XForm_6r<31, 412, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002113 "orc", "$rA, $rS, $rB", IIC_IntSimple,
Hal Finkel654d43b2013-04-12 02:18:09 +00002114 [(set i32:$rA, (or i32:$rS, (not i32:$rB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002115let isCommutable = 1 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002116defm EQV : XForm_6r<31, 284, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002117 "eqv", "$rA, $rS, $rB", IIC_IntSimple,
Hal Finkel654d43b2013-04-12 02:18:09 +00002118 [(set i32:$rA, (not (xor i32:$rS, i32:$rB)))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002119defm XOR : XForm_6r<31, 316, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002120 "xor", "$rA, $rS, $rB", IIC_IntSimple,
Hal Finkel654d43b2013-04-12 02:18:09 +00002121 [(set i32:$rA, (xor i32:$rS, i32:$rB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002122} // isCommutable
Ulrich Weigand136ac222013-04-26 16:53:15 +00002123defm SLW : XForm_6r<31, 24, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002124 "slw", "$rA, $rS, $rB", IIC_IntGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002125 [(set i32:$rA, (PPCshl i32:$rS, i32:$rB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002126defm SRW : XForm_6r<31, 536, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002127 "srw", "$rA, $rS, $rB", IIC_IntGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002128 [(set i32:$rA, (PPCsrl i32:$rS, i32:$rB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002129defm SRAW : XForm_6rc<31, 792, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002130 "sraw", "$rA, $rS, $rB", IIC_IntShift,
Hal Finkel1b58f332013-04-12 18:17:57 +00002131 [(set i32:$rA, (PPCsra i32:$rS, i32:$rB))]>;
Dale Johannesen5e9a5c32009-09-18 20:15:22 +00002132}
Chris Lattnere79a4512006-11-14 19:19:53 +00002133
Chris Lattner51348c52006-03-12 09:13:49 +00002134let PPC970_Unit = 1 in { // FXU Operations.
Craig Topperc50d64b2014-11-26 00:46:26 +00002135let hasSideEffects = 0 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002136defm SRAWI : XForm_10rc<31, 824, (outs gprc:$rA), (ins gprc:$rS, u5imm:$SH),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002137 "srawi", "$rA, $rS, $SH", IIC_IntShift,
Hal Finkel1b58f332013-04-12 18:17:57 +00002138 [(set i32:$rA, (sra i32:$rS, (i32 imm:$SH)))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002139defm CNTLZW : XForm_11r<31, 26, (outs gprc:$rA), (ins gprc:$rS),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002140 "cntlzw", "$rA, $rS", IIC_IntGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002141 [(set i32:$rA, (ctlz i32:$rS))]>;
Nemanja Ivanovic87bcae32016-04-13 18:51:18 +00002142defm CNTTZW : XForm_11r<31, 538, (outs gprc:$rA), (ins gprc:$rS),
2143 "cnttzw", "$rA, $rS", IIC_IntGeneral,
2144 [(set i32:$rA, (cttz i32:$rS))]>, Requires<[IsISA3_0]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002145defm EXTSB : XForm_11r<31, 954, (outs gprc:$rA), (ins gprc:$rS),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002146 "extsb", "$rA, $rS", IIC_IntSimple,
Hal Finkel654d43b2013-04-12 02:18:09 +00002147 [(set i32:$rA, (sext_inreg i32:$rS, i8))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002148defm EXTSH : XForm_11r<31, 922, (outs gprc:$rA), (ins gprc:$rS),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002149 "extsh", "$rA, $rS", IIC_IntSimple,
Hal Finkel654d43b2013-04-12 02:18:09 +00002150 [(set i32:$rA, (sext_inreg i32:$rS, i16))]>;
Hal Finkel4edc66b2015-01-03 01:16:37 +00002151
2152let isCommutable = 1 in
2153def CMPB : XForm_6<31, 508, (outs gprc:$rA), (ins gprc:$rS, gprc:$rB),
2154 "cmpb $rA, $rS, $rB", IIC_IntGeneral,
2155 [(set i32:$rA, (PPCcmpb i32:$rS, i32:$rB))]>;
Hal Finkel654d43b2013-04-12 02:18:09 +00002156}
Craig Topperc50d64b2014-11-26 00:46:26 +00002157let isCompare = 1, hasSideEffects = 0 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002158 def CMPW : XForm_16_ext<31, 0, (outs crrc:$crD), (ins gprc:$rA, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002159 "cmpw $crD, $rA, $rB", IIC_IntCompare>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002160 def CMPLW : XForm_16_ext<31, 32, (outs crrc:$crD), (ins gprc:$rA, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002161 "cmplw $crD, $rA, $rB", IIC_IntCompare>;
Hal Finkel95e6ea62013-04-15 02:37:46 +00002162}
Chris Lattner51348c52006-03-12 09:13:49 +00002163}
2164let PPC970_Unit = 3 in { // FPU Operations.
Evan Cheng94b5a802007-07-19 01:14:50 +00002165//def FCMPO : XForm_17<63, 32, (outs CRRC:$crD), (ins FPRC:$fA, FPRC:$fB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002166// "fcmpo $crD, $fA, $fB", IIC_FPCompare>;
Craig Topperc50d64b2014-11-26 00:46:26 +00002167let isCompare = 1, hasSideEffects = 0 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002168 def FCMPUS : XForm_17<63, 0, (outs crrc:$crD), (ins f4rc:$fA, f4rc:$fB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002169 "fcmpu $crD, $fA, $fB", IIC_FPCompare>;
Hal Finkelb4b99e52013-12-17 23:05:18 +00002170 let Interpretation64Bit = 1, isCodeGenOnly = 1 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002171 def FCMPUD : XForm_17<63, 0, (outs crrc:$crD), (ins f8rc:$fA, f8rc:$fB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002172 "fcmpu $crD, $fA, $fB", IIC_FPCompare>;
Hal Finkel95e6ea62013-04-15 02:37:46 +00002173}
Chris Lattnere79a4512006-11-14 19:19:53 +00002174
Dale Johannesen98aa9d32008-10-29 18:26:45 +00002175let Uses = [RM] in {
Craig Topperc50d64b2014-11-26 00:46:26 +00002176 let hasSideEffects = 0 in {
David Majnemer6ad26d32013-09-26 04:11:24 +00002177 defm FCTIW : XForm_26r<63, 14, (outs f8rc:$frD), (ins f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002178 "fctiw", "$frD, $frB", IIC_FPGeneral,
David Majnemer08249a32013-09-26 05:22:11 +00002179 []>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002180 defm FCTIWZ : XForm_26r<63, 15, (outs f8rc:$frD), (ins f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002181 "fctiwz", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002182 [(set f64:$frD, (PPCfctiwz f64:$frB))]>;
Hal Finkelc20a08d2013-03-29 08:57:48 +00002183
Ulrich Weigand136ac222013-04-26 16:53:15 +00002184 defm FRSP : XForm_26r<63, 12, (outs f4rc:$frD), (ins f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002185 "frsp", "$frD, $frB", IIC_FPGeneral,
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +00002186 [(set f32:$frD, (fpround f64:$frB))]>;
Hal Finkelc20a08d2013-03-29 08:57:48 +00002187
Hal Finkelb4b99e52013-12-17 23:05:18 +00002188 let Interpretation64Bit = 1, isCodeGenOnly = 1 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002189 defm FRIND : XForm_26r<63, 392, (outs f8rc:$frD), (ins f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002190 "frin", "$frD, $frB", IIC_FPGeneral,
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +00002191 [(set f64:$frD, (fround f64:$frB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002192 defm FRINS : XForm_26r<63, 392, (outs f4rc:$frD), (ins f4rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002193 "frin", "$frD, $frB", IIC_FPGeneral,
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +00002194 [(set f32:$frD, (fround f32:$frB))]>;
Hal Finkelf8ac57e2013-03-29 19:41:55 +00002195 }
2196
Craig Topperc50d64b2014-11-26 00:46:26 +00002197 let hasSideEffects = 0 in {
Hal Finkelb4b99e52013-12-17 23:05:18 +00002198 let Interpretation64Bit = 1, isCodeGenOnly = 1 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002199 defm FRIPD : XForm_26r<63, 456, (outs f8rc:$frD), (ins f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002200 "frip", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002201 [(set f64:$frD, (fceil f64:$frB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002202 defm FRIPS : XForm_26r<63, 456, (outs f4rc:$frD), (ins f4rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002203 "frip", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002204 [(set f32:$frD, (fceil f32:$frB))]>;
Hal Finkelb4b99e52013-12-17 23:05:18 +00002205 let Interpretation64Bit = 1, isCodeGenOnly = 1 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002206 defm FRIZD : XForm_26r<63, 424, (outs f8rc:$frD), (ins f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002207 "friz", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002208 [(set f64:$frD, (ftrunc f64:$frB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002209 defm FRIZS : XForm_26r<63, 424, (outs f4rc:$frD), (ins f4rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002210 "friz", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002211 [(set f32:$frD, (ftrunc f32:$frB))]>;
Hal Finkelb4b99e52013-12-17 23:05:18 +00002212 let Interpretation64Bit = 1, isCodeGenOnly = 1 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002213 defm FRIMD : XForm_26r<63, 488, (outs f8rc:$frD), (ins f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002214 "frim", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002215 [(set f64:$frD, (ffloor f64:$frB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002216 defm FRIMS : XForm_26r<63, 488, (outs f4rc:$frD), (ins f4rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002217 "frim", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002218 [(set f32:$frD, (ffloor f32:$frB))]>;
Hal Finkelc20a08d2013-03-29 08:57:48 +00002219
Ulrich Weigand136ac222013-04-26 16:53:15 +00002220 defm FSQRT : XForm_26r<63, 22, (outs f8rc:$frD), (ins f8rc:$frB),
Hal Finkel46402a42013-11-30 20:41:13 +00002221 "fsqrt", "$frD, $frB", IIC_FPSqrtD,
Hal Finkel654d43b2013-04-12 02:18:09 +00002222 [(set f64:$frD, (fsqrt f64:$frB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002223 defm FSQRTS : XForm_26r<59, 22, (outs f4rc:$frD), (ins f4rc:$frB),
Hal Finkel46402a42013-11-30 20:41:13 +00002224 "fsqrts", "$frD, $frB", IIC_FPSqrtS,
Hal Finkel654d43b2013-04-12 02:18:09 +00002225 [(set f32:$frD, (fsqrt f32:$frB))]>;
2226 }
Dale Johannesen98aa9d32008-10-29 18:26:45 +00002227 }
Chris Lattner51348c52006-03-12 09:13:49 +00002228}
Chris Lattnerd3eee1a2005-10-01 01:35:02 +00002229
Jakob Stoklund Olesen44629eb2010-07-16 21:03:52 +00002230/// Note that FMR is defined as pseudo-ops on the PPC970 because they are
Chris Lattnerf5efddf2006-03-24 07:12:19 +00002231/// often coalesced away and we don't want the dispatch group builder to think
Chris Lattner51348c52006-03-12 09:13:49 +00002232/// that they will fill slots (which could cause the load of a LSU reject to
2233/// sneak into a d-group with a store).
Craig Topperc50d64b2014-11-26 00:46:26 +00002234let hasSideEffects = 0 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002235defm FMR : XForm_26r<63, 72, (outs f4rc:$frD), (ins f4rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002236 "fmr", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002237 []>, // (set f32:$frD, f32:$frB)
2238 PPC970_Unit_Pseudo;
Chris Lattnerd3eee1a2005-10-01 01:35:02 +00002239
Craig Topperc50d64b2014-11-26 00:46:26 +00002240let PPC970_Unit = 3, hasSideEffects = 0 in { // FPU Operations.
Chris Lattnerd3eee1a2005-10-01 01:35:02 +00002241// These are artificially split into two different forms, for 4/8 byte FP.
Ulrich Weigand136ac222013-04-26 16:53:15 +00002242defm FABSS : XForm_26r<63, 264, (outs f4rc:$frD), (ins f4rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002243 "fabs", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002244 [(set f32:$frD, (fabs f32:$frB))]>;
Hal Finkelb4b99e52013-12-17 23:05:18 +00002245let Interpretation64Bit = 1, isCodeGenOnly = 1 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002246defm FABSD : XForm_26r<63, 264, (outs f8rc:$frD), (ins f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002247 "fabs", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002248 [(set f64:$frD, (fabs f64:$frB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002249defm FNABSS : XForm_26r<63, 136, (outs f4rc:$frD), (ins f4rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002250 "fnabs", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002251 [(set f32:$frD, (fneg (fabs f32:$frB)))]>;
Hal Finkelb4b99e52013-12-17 23:05:18 +00002252let Interpretation64Bit = 1, isCodeGenOnly = 1 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002253defm FNABSD : XForm_26r<63, 136, (outs f8rc:$frD), (ins f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002254 "fnabs", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002255 [(set f64:$frD, (fneg (fabs f64:$frB)))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002256defm FNEGS : XForm_26r<63, 40, (outs f4rc:$frD), (ins f4rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002257 "fneg", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002258 [(set f32:$frD, (fneg f32:$frB))]>;
Hal Finkelb4b99e52013-12-17 23:05:18 +00002259let Interpretation64Bit = 1, isCodeGenOnly = 1 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002260defm FNEGD : XForm_26r<63, 40, (outs f8rc:$frD), (ins f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002261 "fneg", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002262 [(set f64:$frD, (fneg f64:$frB))]>;
Hal Finkel2e103312013-04-03 04:01:11 +00002263
Hal Finkeldbc78e12013-08-19 05:01:02 +00002264defm FCPSGNS : XForm_28r<63, 8, (outs f4rc:$frD), (ins f4rc:$frA, f4rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002265 "fcpsgn", "$frD, $frA, $frB", IIC_FPGeneral,
Hal Finkeldbc78e12013-08-19 05:01:02 +00002266 [(set f32:$frD, (fcopysign f32:$frB, f32:$frA))]>;
Hal Finkelb4b99e52013-12-17 23:05:18 +00002267let Interpretation64Bit = 1, isCodeGenOnly = 1 in
Hal Finkeldbc78e12013-08-19 05:01:02 +00002268defm FCPSGND : XForm_28r<63, 8, (outs f8rc:$frD), (ins f8rc:$frA, f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002269 "fcpsgn", "$frD, $frA, $frB", IIC_FPGeneral,
Hal Finkeldbc78e12013-08-19 05:01:02 +00002270 [(set f64:$frD, (fcopysign f64:$frB, f64:$frA))]>;
2271
Hal Finkel2e103312013-04-03 04:01:11 +00002272// Reciprocal estimates.
Ulrich Weigand136ac222013-04-26 16:53:15 +00002273defm FRE : XForm_26r<63, 24, (outs f8rc:$frD), (ins f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002274 "fre", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002275 [(set f64:$frD, (PPCfre f64:$frB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002276defm FRES : XForm_26r<59, 24, (outs f4rc:$frD), (ins f4rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002277 "fres", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002278 [(set f32:$frD, (PPCfre f32:$frB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002279defm FRSQRTE : XForm_26r<63, 26, (outs f8rc:$frD), (ins f8rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002280 "frsqrte", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002281 [(set f64:$frD, (PPCfrsqrte f64:$frB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002282defm FRSQRTES : XForm_26r<59, 26, (outs f4rc:$frD), (ins f4rc:$frB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002283 "frsqrtes", "$frD, $frB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002284 [(set f32:$frD, (PPCfrsqrte f32:$frB))]>;
Chris Lattner51348c52006-03-12 09:13:49 +00002285}
Nate Begeman6cdbd222004-08-29 22:45:13 +00002286
Nate Begeman143cf942004-08-30 02:28:06 +00002287// XL-Form instructions. condition register logical ops.
2288//
Craig Topperc50d64b2014-11-26 00:46:26 +00002289let hasSideEffects = 0 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002290def MCRF : XLForm_3<19, 0, (outs crrc:$BF), (ins crrc:$BFA),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002291 "mcrf $BF, $BFA", IIC_BrMCR>,
Chris Lattner51348c52006-03-12 09:13:49 +00002292 PPC970_DGroup_First, PPC970_Unit_CRU;
Nate Begeman143cf942004-08-30 02:28:06 +00002293
Hal Finkelb0e9b352015-01-07 00:15:29 +00002294// FIXME: According to the ISA (section 2.5.1 of version 2.06), the
2295// condition-register logical instructions have preferred forms. Specifically,
2296// it is preferred that the bit specified by the BT field be in the same
2297// condition register as that specified by the bit BB. We might want to account
2298// for this via hinting the register allocator and anti-dep breakers, or we
2299// could constrain the register class to force this constraint and then loosen
2300// it during register allocation via convertToThreeAddress or some similar
2301// mechanism.
2302
Hal Finkele01d3212014-03-24 15:07:28 +00002303let isCommutable = 1 in {
Ulrich Weigand85c6f7f2013-07-01 21:40:54 +00002304def CRAND : XLForm_1<19, 257, (outs crbitrc:$CRD),
2305 (ins crbitrc:$CRA, crbitrc:$CRB),
Hal Finkel940ab932014-02-28 00:27:01 +00002306 "crand $CRD, $CRA, $CRB", IIC_BrCR,
2307 [(set i1:$CRD, (and i1:$CRA, i1:$CRB))]>;
Ulrich Weigand85c6f7f2013-07-01 21:40:54 +00002308
2309def CRNAND : XLForm_1<19, 225, (outs crbitrc:$CRD),
2310 (ins crbitrc:$CRA, crbitrc:$CRB),
Hal Finkel940ab932014-02-28 00:27:01 +00002311 "crnand $CRD, $CRA, $CRB", IIC_BrCR,
2312 [(set i1:$CRD, (not (and i1:$CRA, i1:$CRB)))]>;
Ulrich Weigand85c6f7f2013-07-01 21:40:54 +00002313
2314def CROR : XLForm_1<19, 449, (outs crbitrc:$CRD),
2315 (ins crbitrc:$CRA, crbitrc:$CRB),
Hal Finkel940ab932014-02-28 00:27:01 +00002316 "cror $CRD, $CRA, $CRB", IIC_BrCR,
2317 [(set i1:$CRD, (or i1:$CRA, i1:$CRB))]>;
Ulrich Weigand85c6f7f2013-07-01 21:40:54 +00002318
2319def CRXOR : XLForm_1<19, 193, (outs crbitrc:$CRD),
2320 (ins crbitrc:$CRA, crbitrc:$CRB),
Hal Finkel940ab932014-02-28 00:27:01 +00002321 "crxor $CRD, $CRA, $CRB", IIC_BrCR,
2322 [(set i1:$CRD, (xor i1:$CRA, i1:$CRB))]>;
Ulrich Weigand85c6f7f2013-07-01 21:40:54 +00002323
2324def CRNOR : XLForm_1<19, 33, (outs crbitrc:$CRD),
2325 (ins crbitrc:$CRA, crbitrc:$CRB),
Hal Finkel940ab932014-02-28 00:27:01 +00002326 "crnor $CRD, $CRA, $CRB", IIC_BrCR,
2327 [(set i1:$CRD, (not (or i1:$CRA, i1:$CRB)))]>;
Ulrich Weigand85c6f7f2013-07-01 21:40:54 +00002328
Ulrich Weigand136ac222013-04-26 16:53:15 +00002329def CREQV : XLForm_1<19, 289, (outs crbitrc:$CRD),
2330 (ins crbitrc:$CRA, crbitrc:$CRB),
Hal Finkel940ab932014-02-28 00:27:01 +00002331 "creqv $CRD, $CRA, $CRB", IIC_BrCR,
2332 [(set i1:$CRD, (not (xor i1:$CRA, i1:$CRB)))]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002333} // isCommutable
Chris Lattner43df5b32007-02-25 05:34:32 +00002334
Ulrich Weigand85c6f7f2013-07-01 21:40:54 +00002335def CRANDC : XLForm_1<19, 129, (outs crbitrc:$CRD),
Ulrich Weigand136ac222013-04-26 16:53:15 +00002336 (ins crbitrc:$CRA, crbitrc:$CRB),
Hal Finkel940ab932014-02-28 00:27:01 +00002337 "crandc $CRD, $CRA, $CRB", IIC_BrCR,
2338 [(set i1:$CRD, (and i1:$CRA, (not i1:$CRB)))]>;
Ulrich Weigand85c6f7f2013-07-01 21:40:54 +00002339
2340def CRORC : XLForm_1<19, 417, (outs crbitrc:$CRD),
2341 (ins crbitrc:$CRA, crbitrc:$CRB),
Hal Finkel940ab932014-02-28 00:27:01 +00002342 "crorc $CRD, $CRA, $CRB", IIC_BrCR,
2343 [(set i1:$CRD, (or i1:$CRA, (not i1:$CRB)))]>;
Nicolas Geoffrayb1de7a32008-03-10 14:12:10 +00002344
Ulrich Weigandbbfb0c52013-03-26 10:57:16 +00002345let isCodeGenOnly = 1 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002346def CRSET : XLForm_1_ext<19, 289, (outs crbitrc:$dst), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002347 "creqv $dst, $dst, $dst", IIC_BrCR,
Hal Finkel940ab932014-02-28 00:27:01 +00002348 [(set i1:$dst, 1)]>;
Chris Lattner43df5b32007-02-25 05:34:32 +00002349
Ulrich Weigand136ac222013-04-26 16:53:15 +00002350def CRUNSET: XLForm_1_ext<19, 193, (outs crbitrc:$dst), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002351 "crxor $dst, $dst, $dst", IIC_BrCR,
Hal Finkel940ab932014-02-28 00:27:01 +00002352 [(set i1:$dst, 0)]>;
Roman Divacky71038e72011-08-30 17:04:16 +00002353
Hal Finkel5ab37802012-08-28 02:10:27 +00002354let Defs = [CR1EQ], CRD = 6 in {
2355def CR6SET : XLForm_1_ext<19, 289, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002356 "creqv 6, 6, 6", IIC_BrCR,
Hal Finkel5ab37802012-08-28 02:10:27 +00002357 [(PPCcr6set)]>;
2358
2359def CR6UNSET: XLForm_1_ext<19, 193, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002360 "crxor 6, 6, 6", IIC_BrCR,
Hal Finkel5ab37802012-08-28 02:10:27 +00002361 [(PPCcr6unset)]>;
2362}
Ulrich Weigandbbfb0c52013-03-26 10:57:16 +00002363}
Hal Finkel5ab37802012-08-28 02:10:27 +00002364
Chris Lattner51348c52006-03-12 09:13:49 +00002365// XFX-Form instructions. Instructions that deal with SPRs.
Nate Begeman143cf942004-08-30 02:28:06 +00002366//
Ulrich Weigandae9cf582013-07-03 12:32:41 +00002367
2368def MFSPR : XFXForm_1<31, 339, (outs gprc:$RT), (ins i32imm:$SPR),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002369 "mfspr $RT, $SPR", IIC_SprMFSPR>;
Ulrich Weigandae9cf582013-07-03 12:32:41 +00002370def MTSPR : XFXForm_1<31, 467, (outs), (ins i32imm:$SPR, gprc:$RT),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002371 "mtspr $SPR, $RT", IIC_SprMTSPR>;
Ulrich Weigandae9cf582013-07-03 12:32:41 +00002372
Ulrich Weigande840ee22013-07-08 15:20:38 +00002373def MFTB : XFXForm_1<31, 371, (outs gprc:$RT), (ins i32imm:$SPR),
Kit Barton4f79f962015-06-16 16:01:15 +00002374 "mftb $RT, $SPR", IIC_SprMFTB>;
Ulrich Weigande840ee22013-07-08 15:20:38 +00002375
Hal Finkelbbdee932014-12-02 22:01:00 +00002376// A pseudo-instruction used to implement the read of the 64-bit cycle counter
2377// on a 32-bit target.
2378let hasSideEffects = 1, usesCustomInserter = 1 in
2379def ReadTB : Pseudo<(outs gprc:$lo, gprc:$hi), (ins),
2380 "#ReadTB", []>;
2381
Dale Johannesene395d782008-10-23 20:41:28 +00002382let Uses = [CTR] in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002383def MFCTR : XFXForm_1_ext<31, 339, 9, (outs gprc:$rT), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002384 "mfctr $rT", IIC_SprMFSPR>,
Chris Lattner51348c52006-03-12 09:13:49 +00002385 PPC970_DGroup_First, PPC970_Unit_FXU;
Dale Johannesene395d782008-10-23 20:41:28 +00002386}
Ulrich Weigandc8868102013-03-25 19:05:30 +00002387let Defs = [CTR], Pattern = [(PPCmtctr i32:$rS)] in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002388def MTCTR : XFXForm_7_ext<31, 467, 9, (outs), (ins gprc:$rS),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002389 "mtctr $rS", IIC_SprMTSPR>,
Chris Lattner02e2c182006-03-13 21:52:10 +00002390 PPC970_DGroup_First, PPC970_Unit_FXU;
Chris Lattnereb755fc2006-05-17 19:00:46 +00002391}
Hal Finkel25c19922013-05-15 21:37:41 +00002392let hasSideEffects = 1, isCodeGenOnly = 1, Defs = [CTR] in {
2393let Pattern = [(int_ppc_mtctr i32:$rS)] in
Hal Finkel0859ef22013-05-20 16:08:37 +00002394def MTCTRloop : XFXForm_7_ext<31, 467, 9, (outs), (ins gprc:$rS),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002395 "mtctr $rS", IIC_SprMTSPR>,
Hal Finkel0859ef22013-05-20 16:08:37 +00002396 PPC970_DGroup_First, PPC970_Unit_FXU;
Hal Finkel25c19922013-05-15 21:37:41 +00002397}
Chris Lattner02e2c182006-03-13 21:52:10 +00002398
Dale Johannesene395d782008-10-23 20:41:28 +00002399let Defs = [LR] in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002400def MTLR : XFXForm_7_ext<31, 467, 8, (outs), (ins gprc:$rS),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002401 "mtlr $rS", IIC_SprMTSPR>,
Chris Lattner02e2c182006-03-13 21:52:10 +00002402 PPC970_DGroup_First, PPC970_Unit_FXU;
Dale Johannesene395d782008-10-23 20:41:28 +00002403}
2404let Uses = [LR] in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002405def MFLR : XFXForm_1_ext<31, 339, 8, (outs gprc:$rT), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002406 "mflr $rT", IIC_SprMFSPR>,
Chris Lattner51348c52006-03-12 09:13:49 +00002407 PPC970_DGroup_First, PPC970_Unit_FXU;
Dale Johannesene395d782008-10-23 20:41:28 +00002408}
Chris Lattner02e2c182006-03-13 21:52:10 +00002409
Hal Finkela1431df2013-03-21 19:03:21 +00002410let isCodeGenOnly = 1 in {
Ulrich Weigandae9cf582013-07-03 12:32:41 +00002411 // Move to/from VRSAVE: despite being a SPR, the VRSAVE register is renamed
2412 // like a GPR on the PPC970. As such, copies in and out have the same
2413 // performance characteristics as an OR instruction.
2414 def MTVRSAVE : XFXForm_7_ext<31, 467, 256, (outs), (ins gprc:$rS),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002415 "mtspr 256, $rS", IIC_IntGeneral>,
Ulrich Weigandae9cf582013-07-03 12:32:41 +00002416 PPC970_DGroup_Single, PPC970_Unit_FXU;
2417 def MFVRSAVE : XFXForm_1_ext<31, 339, 256, (outs gprc:$rT), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002418 "mfspr $rT, 256", IIC_IntGeneral>,
Ulrich Weigandae9cf582013-07-03 12:32:41 +00002419 PPC970_DGroup_First, PPC970_Unit_FXU;
2420
Hal Finkela1431df2013-03-21 19:03:21 +00002421 def MTVRSAVEv : XFXForm_7_ext<31, 467, 256,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002422 (outs VRSAVERC:$reg), (ins gprc:$rS),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002423 "mtspr 256, $rS", IIC_IntGeneral>,
Hal Finkela1431df2013-03-21 19:03:21 +00002424 PPC970_DGroup_Single, PPC970_Unit_FXU;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002425 def MFVRSAVEv : XFXForm_1_ext<31, 339, 256, (outs gprc:$rT),
Hal Finkela1431df2013-03-21 19:03:21 +00002426 (ins VRSAVERC:$reg),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002427 "mfspr $rT, 256", IIC_IntGeneral>,
Hal Finkela1431df2013-03-21 19:03:21 +00002428 PPC970_DGroup_First, PPC970_Unit_FXU;
2429}
2430
Eric Christopher1dbb23e2016-06-09 23:27:48 +00002431// Aliases for mtvrsave/mfvrsave to mfspr/mtspr.
2432def : InstAlias<"mtvrsave $rS", (MTVRSAVE gprc:$rS)>;
2433def : InstAlias<"mfvrsave $rS", (MFVRSAVE gprc:$rS)>;
2434
Hal Finkela1431df2013-03-21 19:03:21 +00002435// SPILL_VRSAVE - Indicate that we're dumping the VRSAVE register,
2436// so we'll need to scavenge a register for it.
2437let mayStore = 1 in
2438def SPILL_VRSAVE : Pseudo<(outs), (ins VRSAVERC:$vrsave, memri:$F),
2439 "#SPILL_VRSAVE", []>;
2440
2441// RESTORE_VRSAVE - Indicate that we're restoring the VRSAVE register (previously
2442// spilled), so we'll need to scavenge a register for it.
2443let mayLoad = 1 in
2444def RESTORE_VRSAVE : Pseudo<(outs VRSAVERC:$vrsave), (ins memri:$F),
2445 "#RESTORE_VRSAVE", []>;
2446
Craig Topperc50d64b2014-11-26 00:46:26 +00002447let hasSideEffects = 0 in {
Nemanja Ivanovic2314e832016-01-08 13:09:54 +00002448// mtocrf's input needs to be prepared by shifting by an amount dependent
2449// on the cr register selected. Thus, post-ra anti-dep breaking must not
2450// later change that register assignment.
2451let hasExtraDefRegAllocReq = 1 in {
Ulrich Weigand49f487e2013-07-03 17:59:07 +00002452def MTOCRF: XFXForm_5a<31, 144, (outs crbitm:$FXM), (ins gprc:$ST),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002453 "mtocrf $FXM, $ST", IIC_BrMCRX>,
Ulrich Weigand49f487e2013-07-03 17:59:07 +00002454 PPC970_DGroup_First, PPC970_Unit_CRU;
2455
Nemanja Ivanovic2314e832016-01-08 13:09:54 +00002456// Similarly to mtocrf, the mask for mtcrf must be prepared in a way that
2457// is dependent on the cr fields being set.
Ulrich Weigand49f487e2013-07-03 17:59:07 +00002458def MTCRF : XFXForm_5<31, 144, (outs), (ins i32imm:$FXM, gprc:$rS),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002459 "mtcrf $FXM, $rS", IIC_BrMCRX>,
Chris Lattner51348c52006-03-12 09:13:49 +00002460 PPC970_MicroCode, PPC970_Unit_CRU;
Nemanja Ivanovic2314e832016-01-08 13:09:54 +00002461} // hasExtraDefRegAllocReq = 1
Dale Johannesend7d66382010-05-20 17:48:26 +00002462
Nemanja Ivanovic2314e832016-01-08 13:09:54 +00002463// mfocrf's input needs to be prepared by shifting by an amount dependent
2464// on the cr register selected. Thus, post-ra anti-dep breaking must not
2465// later change that register assignment.
2466let hasExtraSrcRegAllocReq = 1 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002467def MFOCRF: XFXForm_5a<31, 19, (outs gprc:$rT), (ins crbitm:$FXM),
Hal Finkel46402a42013-11-30 20:41:13 +00002468 "mfocrf $rT, $FXM", IIC_SprMFCRF>,
Chris Lattner51348c52006-03-12 09:13:49 +00002469 PPC970_DGroup_First, PPC970_Unit_CRU;
Hal Finkelb47a69a2013-04-07 14:33:13 +00002470
Nemanja Ivanovic2314e832016-01-08 13:09:54 +00002471// Similarly to mfocrf, the mask for mfcrf must be prepared in a way that
2472// is dependent on the cr fields being copied.
Ulrich Weigand136ac222013-04-26 16:53:15 +00002473def MFCR : XFXForm_3<31, 19, (outs gprc:$rT), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002474 "mfcr $rT", IIC_SprMFCR>,
Hal Finkelb47a69a2013-04-07 14:33:13 +00002475 PPC970_MicroCode, PPC970_Unit_CRU;
Nemanja Ivanovic2314e832016-01-08 13:09:54 +00002476} // hasExtraSrcRegAllocReq = 1
Nemanja Ivanovica621a7f2016-03-31 15:26:37 +00002477
2478def MCRXRX : X_BF3<31, 576, (outs crrc:$BF), (ins),
2479 "mcrxrx $BF", IIC_BrMCRX>, Requires<[IsISA3_0]>;
Craig Topperc50d64b2014-11-26 00:46:26 +00002480} // hasSideEffects = 0
Nate Begeman143cf942004-08-30 02:28:06 +00002481
Ulrich Weigand874fc622013-03-26 10:56:22 +00002482// Pseudo instruction to perform FADD in round-to-zero mode.
2483let usesCustomInserter = 1, Uses = [RM] in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002484 def FADDrtz: Pseudo<(outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRB), "",
Ulrich Weigand874fc622013-03-26 10:56:22 +00002485 [(set f64:$FRT, (PPCfaddrtz f64:$FRA, f64:$FRB))]>;
2486}
Dale Johannesen666323e2007-10-10 01:01:31 +00002487
Ulrich Weigand874fc622013-03-26 10:56:22 +00002488// The above pseudo gets expanded to make use of the following instructions
2489// to manipulate FPSCR. Note that FPSCR is not modeled at the DAG level.
Dale Johannesen98aa9d32008-10-29 18:26:45 +00002490let Uses = [RM], Defs = [RM] in {
2491 def MTFSB0 : XForm_43<63, 70, (outs), (ins u5imm:$FM),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002492 "mtfsb0 $FM", IIC_IntMTFSB0, []>,
Dale Johannesen98aa9d32008-10-29 18:26:45 +00002493 PPC970_DGroup_Single, PPC970_Unit_FPU;
2494 def MTFSB1 : XForm_43<63, 38, (outs), (ins u5imm:$FM),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002495 "mtfsb1 $FM", IIC_IntMTFSB0, []>,
Dale Johannesen98aa9d32008-10-29 18:26:45 +00002496 PPC970_DGroup_Single, PPC970_Unit_FPU;
Hal Finkel64202162015-01-15 01:00:53 +00002497 let isCodeGenOnly = 1 in
2498 def MTFSFb : XFLForm<63, 711, (outs), (ins i32imm:$FM, f8rc:$rT),
2499 "mtfsf $FM, $rT", IIC_IntMTFSB0, []>,
2500 PPC970_DGroup_Single, PPC970_Unit_FPU;
Dale Johannesen98aa9d32008-10-29 18:26:45 +00002501}
2502let Uses = [RM] in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002503 def MFFS : XForm_42<63, 583, (outs f8rc:$rT), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002504 "mffs $rT", IIC_IntMFFS,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002505 [(set f64:$rT, (PPCmffs))]>,
Dale Johannesen98aa9d32008-10-29 18:26:45 +00002506 PPC970_DGroup_Single, PPC970_Unit_FPU;
Hal Finkel64202162015-01-15 01:00:53 +00002507
2508 let Defs = [CR1] in
2509 def MFFSo : XForm_42<63, 583, (outs f8rc:$rT), (ins),
2510 "mffs. $rT", IIC_IntMFFS, []>, isDOT;
Dale Johannesen98aa9d32008-10-29 18:26:45 +00002511}
2512
Dale Johannesen666323e2007-10-10 01:01:31 +00002513
Craig Topperc50d64b2014-11-26 00:46:26 +00002514let PPC970_Unit = 1, hasSideEffects = 0 in { // FXU Operations.
Nate Begeman143cf942004-08-30 02:28:06 +00002515// XO-Form instructions. Arithmetic instructions that can set overflow bit
Hal Finkele01d3212014-03-24 15:07:28 +00002516let isCommutable = 1 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002517defm ADD4 : XOForm_1r<31, 266, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002518 "add", "$rT, $rA, $rB", IIC_IntSimple,
Hal Finkel654d43b2013-04-12 02:18:09 +00002519 [(set i32:$rT, (add i32:$rA, i32:$rB))]>;
Roman Divacky32143e22013-12-20 18:08:54 +00002520let isCodeGenOnly = 1 in
2521def ADD4TLS : XOForm_1<31, 266, 0, (outs gprc:$rT), (ins gprc:$rA, tlsreg32:$rB),
2522 "add $rT, $rA, $rB", IIC_IntSimple,
2523 [(set i32:$rT, (add i32:$rA, tglobaltlsaddr:$rB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002524let isCommutable = 1 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002525defm ADDC : XOForm_1rc<31, 10, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002526 "addc", "$rT, $rA, $rB", IIC_IntGeneral,
Hal Finkel1b58f332013-04-12 18:17:57 +00002527 [(set i32:$rT, (addc i32:$rA, i32:$rB))]>,
2528 PPC970_DGroup_Cracked;
Hal Finkele01d3212014-03-24 15:07:28 +00002529
Nemanja Ivanovicc0904792015-04-09 23:54:37 +00002530defm DIVW : XOForm_1rcr<31, 491, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2531 "divw", "$rT, $rA, $rB", IIC_IntDivW,
2532 [(set i32:$rT, (sdiv i32:$rA, i32:$rB))]>;
2533defm DIVWU : XOForm_1rcr<31, 459, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2534 "divwu", "$rT, $rA, $rB", IIC_IntDivW,
2535 [(set i32:$rT, (udiv i32:$rA, i32:$rB))]>;
2536def DIVWE : XOForm_1<31, 427, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2537 "divwe $rT, $rA, $rB", IIC_IntDivW,
2538 [(set i32:$rT, (int_ppc_divwe gprc:$rA, gprc:$rB))]>,
2539 Requires<[HasExtDiv]>;
2540let Defs = [CR0] in
2541def DIVWEo : XOForm_1<31, 427, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2542 "divwe. $rT, $rA, $rB", IIC_IntDivW,
2543 []>, isDOT, PPC970_DGroup_Cracked, PPC970_DGroup_First,
2544 Requires<[HasExtDiv]>;
2545def DIVWEU : XOForm_1<31, 395, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2546 "divweu $rT, $rA, $rB", IIC_IntDivW,
2547 [(set i32:$rT, (int_ppc_divweu gprc:$rA, gprc:$rB))]>,
2548 Requires<[HasExtDiv]>;
2549let Defs = [CR0] in
2550def DIVWEUo : XOForm_1<31, 395, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
2551 "divweu. $rT, $rA, $rB", IIC_IntDivW,
2552 []>, isDOT, PPC970_DGroup_Cracked, PPC970_DGroup_First,
2553 Requires<[HasExtDiv]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002554let isCommutable = 1 in {
Ulrich Weigand136ac222013-04-26 16:53:15 +00002555defm MULHW : XOForm_1r<31, 75, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002556 "mulhw", "$rT, $rA, $rB", IIC_IntMulHW,
Hal Finkel654d43b2013-04-12 02:18:09 +00002557 [(set i32:$rT, (mulhs i32:$rA, i32:$rB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002558defm MULHWU : XOForm_1r<31, 11, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002559 "mulhwu", "$rT, $rA, $rB", IIC_IntMulHWU,
Hal Finkel654d43b2013-04-12 02:18:09 +00002560 [(set i32:$rT, (mulhu i32:$rA, i32:$rB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002561defm MULLW : XOForm_1r<31, 235, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002562 "mullw", "$rT, $rA, $rB", IIC_IntMulHW,
Hal Finkel654d43b2013-04-12 02:18:09 +00002563 [(set i32:$rT, (mul i32:$rA, i32:$rB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002564} // isCommutable
Ulrich Weigand136ac222013-04-26 16:53:15 +00002565defm SUBF : XOForm_1r<31, 40, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002566 "subf", "$rT, $rA, $rB", IIC_IntGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002567 [(set i32:$rT, (sub i32:$rB, i32:$rA))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002568defm SUBFC : XOForm_1rc<31, 8, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002569 "subfc", "$rT, $rA, $rB", IIC_IntGeneral,
Hal Finkel1b58f332013-04-12 18:17:57 +00002570 [(set i32:$rT, (subc i32:$rB, i32:$rA))]>,
2571 PPC970_DGroup_Cracked;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002572defm NEG : XOForm_3r<31, 104, 0, (outs gprc:$rT), (ins gprc:$rA),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002573 "neg", "$rT, $rA", IIC_IntSimple,
Hal Finkel654d43b2013-04-12 02:18:09 +00002574 [(set i32:$rT, (ineg i32:$rA))]>;
Hal Finkel1b58f332013-04-12 18:17:57 +00002575let Uses = [CARRY] in {
Hal Finkele01d3212014-03-24 15:07:28 +00002576let isCommutable = 1 in
Ulrich Weigand136ac222013-04-26 16:53:15 +00002577defm ADDE : XOForm_1rc<31, 138, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002578 "adde", "$rT, $rA, $rB", IIC_IntGeneral,
Hal Finkel1b58f332013-04-12 18:17:57 +00002579 [(set i32:$rT, (adde i32:$rA, i32:$rB))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002580defm ADDME : XOForm_3rc<31, 234, 0, (outs gprc:$rT), (ins gprc:$rA),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002581 "addme", "$rT, $rA", IIC_IntGeneral,
Hal Finkel1b58f332013-04-12 18:17:57 +00002582 [(set i32:$rT, (adde i32:$rA, -1))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002583defm ADDZE : XOForm_3rc<31, 202, 0, (outs gprc:$rT), (ins gprc:$rA),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002584 "addze", "$rT, $rA", IIC_IntGeneral,
Hal Finkel1b58f332013-04-12 18:17:57 +00002585 [(set i32:$rT, (adde i32:$rA, 0))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002586defm SUBFE : XOForm_1rc<31, 136, 0, (outs gprc:$rT), (ins gprc:$rA, gprc:$rB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002587 "subfe", "$rT, $rA, $rB", IIC_IntGeneral,
Hal Finkel1b58f332013-04-12 18:17:57 +00002588 [(set i32:$rT, (sube i32:$rB, i32:$rA))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002589defm SUBFME : XOForm_3rc<31, 232, 0, (outs gprc:$rT), (ins gprc:$rA),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002590 "subfme", "$rT, $rA", IIC_IntGeneral,
Hal Finkel1b58f332013-04-12 18:17:57 +00002591 [(set i32:$rT, (sube -1, i32:$rA))]>;
Ulrich Weigand136ac222013-04-26 16:53:15 +00002592defm SUBFZE : XOForm_3rc<31, 200, 0, (outs gprc:$rT), (ins gprc:$rA),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002593 "subfze", "$rT, $rA", IIC_IntGeneral,
Hal Finkel1b58f332013-04-12 18:17:57 +00002594 [(set i32:$rT, (sube 0, i32:$rA))]>;
Chris Lattner51348c52006-03-12 09:13:49 +00002595}
Dale Johannesen5e9a5c32009-09-18 20:15:22 +00002596}
Nate Begeman143cf942004-08-30 02:28:06 +00002597
2598// A-Form instructions. Most of the instructions executed in the FPU are of
2599// this type.
2600//
Craig Topperc50d64b2014-11-26 00:46:26 +00002601let PPC970_Unit = 3, hasSideEffects = 0 in { // FPU Operations.
Dale Johannesen98aa9d32008-10-29 18:26:45 +00002602let Uses = [RM] in {
Hal Finkele01d3212014-03-24 15:07:28 +00002603let isCommutable = 1 in {
Hal Finkel654d43b2013-04-12 02:18:09 +00002604 defm FMADD : AForm_1r<63, 29,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002605 (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRC, f8rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002606 "fmadd", "$FRT, $FRA, $FRC, $FRB", IIC_FPFused,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002607 [(set f64:$FRT, (fma f64:$FRA, f64:$FRC, f64:$FRB))]>;
Hal Finkel654d43b2013-04-12 02:18:09 +00002608 defm FMADDS : AForm_1r<59, 29,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002609 (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRC, f4rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002610 "fmadds", "$FRT, $FRA, $FRC, $FRB", IIC_FPGeneral,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002611 [(set f32:$FRT, (fma f32:$FRA, f32:$FRC, f32:$FRB))]>;
Hal Finkel654d43b2013-04-12 02:18:09 +00002612 defm FMSUB : AForm_1r<63, 28,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002613 (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRC, f8rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002614 "fmsub", "$FRT, $FRA, $FRC, $FRB", IIC_FPFused,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002615 [(set f64:$FRT,
2616 (fma f64:$FRA, f64:$FRC, (fneg f64:$FRB)))]>;
Hal Finkel654d43b2013-04-12 02:18:09 +00002617 defm FMSUBS : AForm_1r<59, 28,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002618 (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRC, f4rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002619 "fmsubs", "$FRT, $FRA, $FRC, $FRB", IIC_FPGeneral,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002620 [(set f32:$FRT,
2621 (fma f32:$FRA, f32:$FRC, (fneg f32:$FRB)))]>;
Hal Finkel654d43b2013-04-12 02:18:09 +00002622 defm FNMADD : AForm_1r<63, 31,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002623 (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRC, f8rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002624 "fnmadd", "$FRT, $FRA, $FRC, $FRB", IIC_FPFused,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002625 [(set f64:$FRT,
2626 (fneg (fma f64:$FRA, f64:$FRC, f64:$FRB)))]>;
Hal Finkel654d43b2013-04-12 02:18:09 +00002627 defm FNMADDS : AForm_1r<59, 31,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002628 (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRC, f4rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002629 "fnmadds", "$FRT, $FRA, $FRC, $FRB", IIC_FPGeneral,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002630 [(set f32:$FRT,
2631 (fneg (fma f32:$FRA, f32:$FRC, f32:$FRB)))]>;
Hal Finkel654d43b2013-04-12 02:18:09 +00002632 defm FNMSUB : AForm_1r<63, 30,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002633 (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRC, f8rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002634 "fnmsub", "$FRT, $FRA, $FRC, $FRB", IIC_FPFused,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002635 [(set f64:$FRT, (fneg (fma f64:$FRA, f64:$FRC,
2636 (fneg f64:$FRB))))]>;
Hal Finkel654d43b2013-04-12 02:18:09 +00002637 defm FNMSUBS : AForm_1r<59, 30,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002638 (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRC, f4rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002639 "fnmsubs", "$FRT, $FRA, $FRC, $FRB", IIC_FPGeneral,
Ulrich Weigandc8868102013-03-25 19:05:30 +00002640 [(set f32:$FRT, (fneg (fma f32:$FRA, f32:$FRC,
2641 (fneg f32:$FRB))))]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002642} // isCommutable
Dale Johannesen98aa9d32008-10-29 18:26:45 +00002643}
Chris Lattner3734d202005-10-02 07:07:49 +00002644// FSEL is artificially split into 4 and 8-byte forms for the result. To avoid
2645// having 4 of these, force the comparison to always be an 8-byte double (code
2646// should use an FMRSD if the input comparison value really wants to be a float)
Chris Lattner9e986722005-10-02 06:58:23 +00002647// and 4/8 byte forms for the result and operand type..
Hal Finkelb4b99e52013-12-17 23:05:18 +00002648let Interpretation64Bit = 1, isCodeGenOnly = 1 in
Hal Finkel654d43b2013-04-12 02:18:09 +00002649defm FSELD : AForm_1r<63, 23,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002650 (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRC, f8rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002651 "fsel", "$FRT, $FRA, $FRC, $FRB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002652 [(set f64:$FRT, (PPCfsel f64:$FRA, f64:$FRC, f64:$FRB))]>;
2653defm FSELS : AForm_1r<63, 23,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002654 (outs f4rc:$FRT), (ins f8rc:$FRA, f4rc:$FRC, f4rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002655 "fsel", "$FRT, $FRA, $FRC, $FRB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002656 [(set f32:$FRT, (PPCfsel f64:$FRA, f32:$FRC, f32:$FRB))]>;
Dale Johannesen98aa9d32008-10-29 18:26:45 +00002657let Uses = [RM] in {
Hal Finkele01d3212014-03-24 15:07:28 +00002658 let isCommutable = 1 in {
Hal Finkel654d43b2013-04-12 02:18:09 +00002659 defm FADD : AForm_2r<63, 21,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002660 (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002661 "fadd", "$FRT, $FRA, $FRB", IIC_FPAddSub,
Hal Finkel654d43b2013-04-12 02:18:09 +00002662 [(set f64:$FRT, (fadd f64:$FRA, f64:$FRB))]>;
2663 defm FADDS : AForm_2r<59, 21,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002664 (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002665 "fadds", "$FRT, $FRA, $FRB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002666 [(set f32:$FRT, (fadd f32:$FRA, f32:$FRB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002667 } // isCommutable
Hal Finkel654d43b2013-04-12 02:18:09 +00002668 defm FDIV : AForm_2r<63, 18,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002669 (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002670 "fdiv", "$FRT, $FRA, $FRB", IIC_FPDivD,
Hal Finkel654d43b2013-04-12 02:18:09 +00002671 [(set f64:$FRT, (fdiv f64:$FRA, f64:$FRB))]>;
2672 defm FDIVS : AForm_2r<59, 18,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002673 (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002674 "fdivs", "$FRT, $FRA, $FRB", IIC_FPDivS,
Hal Finkel654d43b2013-04-12 02:18:09 +00002675 [(set f32:$FRT, (fdiv f32:$FRA, f32:$FRB))]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002676 let isCommutable = 1 in {
Hal Finkel654d43b2013-04-12 02:18:09 +00002677 defm FMUL : AForm_3r<63, 25,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002678 (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRC),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002679 "fmul", "$FRT, $FRA, $FRC", IIC_FPFused,
Hal Finkel654d43b2013-04-12 02:18:09 +00002680 [(set f64:$FRT, (fmul f64:$FRA, f64:$FRC))]>;
2681 defm FMULS : AForm_3r<59, 25,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002682 (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRC),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002683 "fmuls", "$FRT, $FRA, $FRC", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002684 [(set f32:$FRT, (fmul f32:$FRA, f32:$FRC))]>;
Hal Finkele01d3212014-03-24 15:07:28 +00002685 } // isCommutable
Hal Finkel654d43b2013-04-12 02:18:09 +00002686 defm FSUB : AForm_2r<63, 20,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002687 (outs f8rc:$FRT), (ins f8rc:$FRA, f8rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002688 "fsub", "$FRT, $FRA, $FRB", IIC_FPAddSub,
Hal Finkel654d43b2013-04-12 02:18:09 +00002689 [(set f64:$FRT, (fsub f64:$FRA, f64:$FRB))]>;
2690 defm FSUBS : AForm_2r<59, 20,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002691 (outs f4rc:$FRT), (ins f4rc:$FRA, f4rc:$FRB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002692 "fsubs", "$FRT, $FRA, $FRB", IIC_FPGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002693 [(set f32:$FRT, (fsub f32:$FRA, f32:$FRB))]>;
Dale Johannesen98aa9d32008-10-29 18:26:45 +00002694 }
Chris Lattner51348c52006-03-12 09:13:49 +00002695}
Nate Begeman143cf942004-08-30 02:28:06 +00002696
Craig Topperc50d64b2014-11-26 00:46:26 +00002697let hasSideEffects = 0 in {
Chris Lattner51348c52006-03-12 09:13:49 +00002698let PPC970_Unit = 1 in { // FXU Operations.
Hal Finkel7795e472013-04-07 15:06:53 +00002699 let isSelect = 1 in
Ulrich Weigand84ee76a2012-11-13 19:14:19 +00002700 def ISEL : AForm_4<31, 15,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002701 (outs gprc:$rT), (ins gprc_nor0:$rA, gprc:$rB, crbitrc:$cond),
Hal Finkel11d3c562015-02-01 17:52:16 +00002702 "isel $rT, $rA, $rB, $cond", IIC_IntISEL,
Hal Finkel460e94d2012-06-22 23:10:08 +00002703 []>;
2704}
2705
2706let PPC970_Unit = 1 in { // FXU Operations.
Nate Begemana113d742004-08-31 02:28:08 +00002707// M-Form instructions. rotate and mask instructions.
2708//
Chris Lattner57711562006-11-15 23:24:18 +00002709let isCommutable = 1 in {
Chris Lattnerc37a2f12005-09-09 18:17:41 +00002710// RLWIMI can be commuted if the rotate amount is zero.
Ulrich Weigand136ac222013-04-26 16:53:15 +00002711defm RLWIMI : MForm_2r<20, (outs gprc:$rA),
2712 (ins gprc:$rSi, gprc:$rS, u5imm:$SH, u5imm:$MB,
Hal Finkel3e5a3602013-11-27 23:26:09 +00002713 u5imm:$ME), "rlwimi", "$rA, $rS, $SH, $MB, $ME",
2714 IIC_IntRotate, []>, PPC970_DGroup_Cracked,
2715 RegConstraint<"$rSi = $rA">, NoEncode<"$rSi">;
Nate Begeman29dc5f22004-10-16 20:43:38 +00002716}
Hal Finkel654d43b2013-04-12 02:18:09 +00002717let BaseName = "rlwinm" in {
Chris Lattnerbaa9be52005-04-19 05:21:30 +00002718def RLWINM : MForm_2<21,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002719 (outs gprc:$rA), (ins gprc:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002720 "rlwinm $rA, $rS, $SH, $MB, $ME", IIC_IntGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002721 []>, RecFormRel;
Hal Finkel1b58f332013-04-12 18:17:57 +00002722let Defs = [CR0] in
Chris Lattnerbaa9be52005-04-19 05:21:30 +00002723def RLWINMo : MForm_2<21,
Ulrich Weigand136ac222013-04-26 16:53:15 +00002724 (outs gprc:$rA), (ins gprc:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002725 "rlwinm. $rA, $rS, $SH, $MB, $ME", IIC_IntGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002726 []>, isDOT, RecFormRel, PPC970_DGroup_Cracked;
2727}
Ulrich Weigand136ac222013-04-26 16:53:15 +00002728defm RLWNM : MForm_2r<23, (outs gprc:$rA),
2729 (ins gprc:$rS, gprc:$rB, u5imm:$MB, u5imm:$ME),
Hal Finkel3e5a3602013-11-27 23:26:09 +00002730 "rlwnm", "$rA, $rS, $rB, $MB, $ME", IIC_IntGeneral,
Hal Finkel654d43b2013-04-12 02:18:09 +00002731 []>;
Chris Lattner51348c52006-03-12 09:13:49 +00002732}
Craig Topperc50d64b2014-11-26 00:46:26 +00002733} // hasSideEffects = 0
Chris Lattner382f3562006-03-20 06:15:45 +00002734
Chris Lattner39b4d83f2005-09-09 00:39:56 +00002735//===----------------------------------------------------------------------===//
2736// PowerPC Instruction Patterns
2737//
2738
Chris Lattner4435b142005-09-26 22:20:16 +00002739// Arbitrary immediate support. Implement in terms of LIS/ORI.
2740def : Pat<(i32 imm:$imm),
2741 (ORI (LIS (HI16 imm:$imm)), (LO16 imm:$imm))>;
Chris Lattner8cd7b882005-09-28 17:13:15 +00002742
2743// Implement the 'not' operation with the NOR instruction.
Hal Finkel940ab932014-02-28 00:27:01 +00002744def i32not : OutPatFrag<(ops node:$in),
2745 (NOR $in, $in)>;
2746def : Pat<(not i32:$in),
2747 (i32not $in)>;
Chris Lattner8cd7b882005-09-28 17:13:15 +00002748
Chris Lattnerd4e9e8b2005-09-28 23:07:13 +00002749// ADD an arbitrary immediate.
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00002750def : Pat<(add i32:$in, imm:$imm),
2751 (ADDIS (ADDI $in, (LO16 imm:$imm)), (HA16 imm:$imm))>;
Chris Lattnerd4e9e8b2005-09-28 23:07:13 +00002752// OR an arbitrary immediate.
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00002753def : Pat<(or i32:$in, imm:$imm),
2754 (ORIS (ORI $in, (LO16 imm:$imm)), (HI16 imm:$imm))>;
Chris Lattnerd4e9e8b2005-09-28 23:07:13 +00002755// XOR an arbitrary immediate.
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00002756def : Pat<(xor i32:$in, imm:$imm),
2757 (XORIS (XORI $in, (LO16 imm:$imm)), (HI16 imm:$imm))>;
Nate Begeman5965bd12006-02-17 05:43:56 +00002758// SUBFIC
Bill Schmidtf88571e2013-05-22 20:09:24 +00002759def : Pat<(sub imm32SExt16:$imm, i32:$in),
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00002760 (SUBFIC $in, imm:$imm)>;
Chris Lattner5b6f4dc2005-10-19 01:38:02 +00002761
Chris Lattnerb4299832006-06-16 20:22:01 +00002762// SHL/SRL
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00002763def : Pat<(shl i32:$in, (i32 imm:$imm)),
2764 (RLWINM $in, imm:$imm, 0, (SHL32 imm:$imm))>;
2765def : Pat<(srl i32:$in, (i32 imm:$imm)),
2766 (RLWINM $in, (SRL32 imm:$imm), imm:$imm, 31)>;
Nate Begeman9f3c26c2005-10-19 18:42:01 +00002767
Nate Begeman1b8121b2006-01-11 21:21:00 +00002768// ROTL
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00002769def : Pat<(rotl i32:$in, i32:$sh),
2770 (RLWNM $in, $sh, 0, 31)>;
2771def : Pat<(rotl i32:$in, (i32 imm:$imm)),
2772 (RLWINM $in, imm:$imm, 0, 31)>;
Chris Lattnereb755fc2006-05-17 19:00:46 +00002773
Nate Begemand31efd12006-09-22 05:01:56 +00002774// RLWNM
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00002775def : Pat<(and (rotl i32:$in, i32:$sh), maskimm32:$imm),
2776 (RLWNM $in, $sh, (MB maskimm32:$imm), (ME maskimm32:$imm))>;
Nate Begemand31efd12006-09-22 05:01:56 +00002777
Chris Lattnereb755fc2006-05-17 19:00:46 +00002778// Calls
Ulrich Weigandf62e83f2013-03-22 15:24:13 +00002779def : Pat<(PPCcall (i32 tglobaladdr:$dst)),
2780 (BL tglobaladdr:$dst)>;
2781def : Pat<(PPCcall (i32 texternalsym:$dst)),
2782 (BL texternalsym:$dst)>;
Chris Lattnereb755fc2006-05-17 19:00:46 +00002783
Arnold Schwaighoferbe0de342008-04-30 09:16:33 +00002784def : Pat<(PPCtc_return (i32 tglobaladdr:$dst), imm:$imm),
2785 (TCRETURNdi tglobaladdr:$dst, imm:$imm)>;
2786
2787def : Pat<(PPCtc_return (i32 texternalsym:$dst), imm:$imm),
2788 (TCRETURNdi texternalsym:$dst, imm:$imm)>;
2789
2790def : Pat<(PPCtc_return CTRRC:$dst, imm:$imm),
2791 (TCRETURNri CTRRC:$dst, imm:$imm)>;
2792
2793
2794
Chris Lattner595088a2005-11-17 07:30:41 +00002795// Hi and Lo for Darwin Global Addresses.
Chris Lattner090eed02005-12-11 07:45:47 +00002796def : Pat<(PPChi tglobaladdr:$in, 0), (LIS tglobaladdr:$in)>;
2797def : Pat<(PPClo tglobaladdr:$in, 0), (LI tglobaladdr:$in)>;
2798def : Pat<(PPChi tconstpool:$in, 0), (LIS tconstpool:$in)>;
2799def : Pat<(PPClo tconstpool:$in, 0), (LI tconstpool:$in)>;
Nate Begeman4ca2ea52006-04-22 18:53:45 +00002800def : Pat<(PPChi tjumptable:$in, 0), (LIS tjumptable:$in)>;
2801def : Pat<(PPClo tjumptable:$in, 0), (LI tjumptable:$in)>;
Bob Wilsonf84f7102009-11-04 21:31:18 +00002802def : Pat<(PPChi tblockaddress:$in, 0), (LIS tblockaddress:$in)>;
2803def : Pat<(PPClo tblockaddress:$in, 0), (LI tblockaddress:$in)>;
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00002804def : Pat<(PPChi tglobaltlsaddr:$g, i32:$in),
2805 (ADDIS $in, tglobaltlsaddr:$g)>;
2806def : Pat<(PPClo tglobaltlsaddr:$g, i32:$in),
Ulrich Weigand35f9fdf2013-03-26 10:55:20 +00002807 (ADDI $in, tglobaltlsaddr:$g)>;
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00002808def : Pat<(add i32:$in, (PPChi tglobaladdr:$g, 0)),
2809 (ADDIS $in, tglobaladdr:$g)>;
2810def : Pat<(add i32:$in, (PPChi tconstpool:$g, 0)),
2811 (ADDIS $in, tconstpool:$g)>;
2812def : Pat<(add i32:$in, (PPChi tjumptable:$g, 0)),
2813 (ADDIS $in, tjumptable:$g)>;
2814def : Pat<(add i32:$in, (PPChi tblockaddress:$g, 0)),
2815 (ADDIS $in, tblockaddress:$g)>;
Chris Lattner595088a2005-11-17 07:30:41 +00002816
Roman Divacky32143e22013-12-20 18:08:54 +00002817// Support for thread-local storage.
2818def PPC32GOT: Pseudo<(outs gprc:$rD), (ins), "#PPC32GOT",
2819 [(set i32:$rD, (PPCppc32GOT))]>;
2820
Hal Finkel7c8ae532014-07-25 17:47:22 +00002821// Get the _GLOBAL_OFFSET_TABLE_ in PIC mode.
2822// This uses two output registers, the first as the real output, the second as a
2823// temporary register, used internally in code generation.
2824def PPC32PICGOT: Pseudo<(outs gprc:$rD, gprc:$rT), (ins), "#PPC32PICGOT",
2825 []>, NoEncode<"$rT">;
2826
Roman Divacky32143e22013-12-20 18:08:54 +00002827def LDgotTprelL32: Pseudo<(outs gprc:$rD), (ins s16imm:$disp, gprc_nor0:$reg),
Hal Finkel7c8ae532014-07-25 17:47:22 +00002828 "#LDgotTprelL32",
2829 [(set i32:$rD,
2830 (PPCldGotTprelL tglobaltlsaddr:$disp, i32:$reg))]>;
Roman Divacky32143e22013-12-20 18:08:54 +00002831def : Pat<(PPCaddTls i32:$in, tglobaltlsaddr:$g),
2832 (ADD4TLS $in, tglobaltlsaddr:$g)>;
2833
Hal Finkel7c8ae532014-07-25 17:47:22 +00002834def ADDItlsgdL32 : Pseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s16imm:$disp),
2835 "#ADDItlsgdL32",
2836 [(set i32:$rD,
2837 (PPCaddiTlsgdL i32:$reg, tglobaltlsaddr:$disp))]>;
Bill Schmidt82f1c772015-02-10 19:09:05 +00002838// LR is a true define, while the rest of the Defs are clobbers. R3 is
2839// explicitly defined when this op is created, so not mentioned here.
2840let hasExtraSrcRegAllocReq = 1, hasExtraDefRegAllocReq = 1,
2841 Defs = [R0,R4,R5,R6,R7,R8,R9,R10,R11,R12,LR,CTR,CR0,CR1,CR5,CR6,CR7] in
2842def GETtlsADDR32 : Pseudo<(outs gprc:$rD), (ins gprc:$reg, tlsgd32:$sym),
2843 "GETtlsADDR32",
2844 [(set i32:$rD,
2845 (PPCgetTlsAddr i32:$reg, tglobaltlsaddr:$sym))]>;
2846// Combined op for ADDItlsgdL32 and GETtlsADDR32, late expanded. R3 and LR
2847// are true defines while the rest of the Defs are clobbers.
2848let hasExtraSrcRegAllocReq = 1, hasExtraDefRegAllocReq = 1,
2849 Defs = [R0,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,LR,CTR,CR0,CR1,CR5,CR6,CR7] in
2850def ADDItlsgdLADDR32 : Pseudo<(outs gprc:$rD),
2851 (ins gprc_nor0:$reg, s16imm:$disp, tlsgd32:$sym),
2852 "#ADDItlsgdLADDR32",
2853 [(set i32:$rD,
2854 (PPCaddiTlsgdLAddr i32:$reg,
2855 tglobaltlsaddr:$disp,
2856 tglobaltlsaddr:$sym))]>;
Hal Finkel7c8ae532014-07-25 17:47:22 +00002857def ADDItlsldL32 : Pseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s16imm:$disp),
2858 "#ADDItlsldL32",
2859 [(set i32:$rD,
2860 (PPCaddiTlsldL i32:$reg, tglobaltlsaddr:$disp))]>;
Bill Schmidt82f1c772015-02-10 19:09:05 +00002861// LR is a true define, while the rest of the Defs are clobbers. R3 is
2862// explicitly defined when this op is created, so not mentioned here.
2863let hasExtraSrcRegAllocReq = 1, hasExtraDefRegAllocReq = 1,
2864 Defs = [R0,R4,R5,R6,R7,R8,R9,R10,R11,R12,LR,CTR,CR0,CR1,CR5,CR6,CR7] in
2865def GETtlsldADDR32 : Pseudo<(outs gprc:$rD), (ins gprc:$reg, tlsgd32:$sym),
2866 "GETtlsldADDR32",
2867 [(set i32:$rD,
2868 (PPCgetTlsldAddr i32:$reg,
2869 tglobaltlsaddr:$sym))]>;
2870// Combined op for ADDItlsldL32 and GETtlsADDR32, late expanded. R3 and LR
2871// are true defines while the rest of the Defs are clobbers.
2872let hasExtraSrcRegAllocReq = 1, hasExtraDefRegAllocReq = 1,
2873 Defs = [R0,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,LR,CTR,CR0,CR1,CR5,CR6,CR7] in
2874def ADDItlsldLADDR32 : Pseudo<(outs gprc:$rD),
2875 (ins gprc_nor0:$reg, s16imm:$disp, tlsgd32:$sym),
2876 "#ADDItlsldLADDR32",
2877 [(set i32:$rD,
2878 (PPCaddiTlsldLAddr i32:$reg,
2879 tglobaltlsaddr:$disp,
2880 tglobaltlsaddr:$sym))]>;
Hal Finkel7c8ae532014-07-25 17:47:22 +00002881def ADDIdtprelL32 : Pseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s16imm:$disp),
2882 "#ADDIdtprelL32",
2883 [(set i32:$rD,
2884 (PPCaddiDtprelL i32:$reg, tglobaltlsaddr:$disp))]>;
2885def ADDISdtprelHA32 : Pseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s16imm:$disp),
2886 "#ADDISdtprelHA32",
2887 [(set i32:$rD,
2888 (PPCaddisDtprelHA i32:$reg,
2889 tglobaltlsaddr:$disp))]>;
2890
Hal Finkel3ee2af72014-07-18 23:29:49 +00002891// Support for Position-independent code
Justin Hibbitsa88b6052014-11-12 15:16:30 +00002892def LWZtoc : Pseudo<(outs gprc:$rD), (ins tocentry32:$disp, gprc:$reg),
2893 "#LWZtoc",
2894 [(set i32:$rD,
2895 (PPCtoc_entry tglobaladdr:$disp, i32:$reg))]>;
Hal Finkel3ee2af72014-07-18 23:29:49 +00002896// Get Global (GOT) Base Register offset, from the word immediately preceding
2897// the function label.
Justin Hibbitsa88b6052014-11-12 15:16:30 +00002898def UpdateGBR : Pseudo<(outs gprc:$rD, gprc:$rT), (ins gprc:$rI), "#UpdateGBR", []>;
Hal Finkel3ee2af72014-07-18 23:29:49 +00002899
2900
Chris Lattnerfea33f72005-12-06 02:10:38 +00002901// Standard shifts. These are represented separately from the real shifts above
2902// so that we can distinguish between shifts that allow 5-bit and 6-bit shift
2903// amounts.
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00002904def : Pat<(sra i32:$rS, i32:$rB),
2905 (SRAW $rS, $rB)>;
2906def : Pat<(srl i32:$rS, i32:$rB),
2907 (SRW $rS, $rB)>;
2908def : Pat<(shl i32:$rS, i32:$rB),
2909 (SLW $rS, $rB)>;
Chris Lattnerfea33f72005-12-06 02:10:38 +00002910
Evan Chenge71fe34d2006-10-09 20:57:25 +00002911def : Pat<(zextloadi1 iaddr:$src),
Nate Begeman8e6a8af2005-12-19 23:25:09 +00002912 (LBZ iaddr:$src)>;
Evan Chenge71fe34d2006-10-09 20:57:25 +00002913def : Pat<(zextloadi1 xaddr:$src),
Nate Begeman8e6a8af2005-12-19 23:25:09 +00002914 (LBZX xaddr:$src)>;
Evan Chenge71fe34d2006-10-09 20:57:25 +00002915def : Pat<(extloadi1 iaddr:$src),
Nate Begeman8e6a8af2005-12-19 23:25:09 +00002916 (LBZ iaddr:$src)>;
Evan Chenge71fe34d2006-10-09 20:57:25 +00002917def : Pat<(extloadi1 xaddr:$src),
Nate Begeman8e6a8af2005-12-19 23:25:09 +00002918 (LBZX xaddr:$src)>;
Evan Chenge71fe34d2006-10-09 20:57:25 +00002919def : Pat<(extloadi8 iaddr:$src),
Nate Begeman8e6a8af2005-12-19 23:25:09 +00002920 (LBZ iaddr:$src)>;
Evan Chenge71fe34d2006-10-09 20:57:25 +00002921def : Pat<(extloadi8 xaddr:$src),
Nate Begeman8e6a8af2005-12-19 23:25:09 +00002922 (LBZX xaddr:$src)>;
Evan Chenge71fe34d2006-10-09 20:57:25 +00002923def : Pat<(extloadi16 iaddr:$src),
Nate Begeman8e6a8af2005-12-19 23:25:09 +00002924 (LHZ iaddr:$src)>;
Evan Chenge71fe34d2006-10-09 20:57:25 +00002925def : Pat<(extloadi16 xaddr:$src),
Nate Begeman8e6a8af2005-12-19 23:25:09 +00002926 (LHZX xaddr:$src)>;
Jakob Stoklund Olesen44629eb2010-07-16 21:03:52 +00002927def : Pat<(f64 (extloadf32 iaddr:$src)),
2928 (COPY_TO_REGCLASS (LFS iaddr:$src), F8RC)>;
2929def : Pat<(f64 (extloadf32 xaddr:$src)),
2930 (COPY_TO_REGCLASS (LFSX xaddr:$src), F8RC)>;
2931
Michael Kuperstein2bc3d4d2016-08-18 20:08:15 +00002932def : Pat<(f64 (fpextend f32:$src)),
Ulrich Weigandec6e2cd2013-03-25 19:04:58 +00002933 (COPY_TO_REGCLASS $src, F8RC)>;
Nate Begeman8e6a8af2005-12-19 23:25:09 +00002934
Robin Morisset9098fee2014-10-03 18:04:36 +00002935// Only seq_cst fences require the heavyweight sync (SYNC 0).
2936// All others can use the lightweight sync (SYNC 1).
2937// source: http://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html
2938// The rule for seq_cst is duplicated to work with both 64 bits and 32 bits
2939// versions of Power.
2940def : Pat<(atomic_fence (i64 7), (imm)), (SYNC 0)>, Requires<[HasSYNC]>;
2941def : Pat<(atomic_fence (i32 7), (imm)), (SYNC 0)>, Requires<[HasSYNC]>;
2942def : Pat<(atomic_fence (imm), (imm)), (SYNC 1)>, Requires<[HasSYNC]>;
Hal Finkelfe3368c2014-10-02 22:34:22 +00002943def : Pat<(atomic_fence (imm), (imm)), (MSYNC)>, Requires<[HasOnlyMSYNC]>;
Eli Friedman26a48482011-07-27 22:21:52 +00002944
Hal Finkel2e103312013-04-03 04:01:11 +00002945// Additional FNMSUB patterns: -a*c + b == -(a*c - b)
2946def : Pat<(fma (fneg f64:$A), f64:$C, f64:$B),
2947 (FNMSUB $A, $C, $B)>;
2948def : Pat<(fma f64:$A, (fneg f64:$C), f64:$B),
2949 (FNMSUB $A, $C, $B)>;
2950def : Pat<(fma (fneg f32:$A), f32:$C, f32:$B),
2951 (FNMSUBS $A, $C, $B)>;
2952def : Pat<(fma f32:$A, (fneg f32:$C), f32:$B),
2953 (FNMSUBS $A, $C, $B)>;
2954
Hal Finkeldbc78e12013-08-19 05:01:02 +00002955// FCOPYSIGN's operand types need not agree.
2956def : Pat<(fcopysign f64:$frB, f32:$frA),
2957 (FCPSGND (COPY_TO_REGCLASS $frA, F8RC), $frB)>;
2958def : Pat<(fcopysign f32:$frB, f64:$frA),
2959 (FCPSGNS (COPY_TO_REGCLASS $frA, F4RC), $frB)>;
2960
Chris Lattner2a85fa12006-03-25 07:51:43 +00002961include "PPCInstrAltivec.td"
Joerg Sonnenberger39f095a2014-08-07 12:18:21 +00002962include "PPCInstrSPE.td"
Chris Lattnerb4299832006-06-16 20:22:01 +00002963include "PPCInstr64Bit.td"
Hal Finkel27774d92014-03-13 07:58:58 +00002964include "PPCInstrVSX.td"
Hal Finkelc93a9a22015-02-25 01:06:45 +00002965include "PPCInstrQPX.td"
Kit Barton535e69d2015-03-25 19:36:23 +00002966include "PPCInstrHTM.td"
Ulrich Weigandd8394902013-05-03 19:50:27 +00002967
Hal Finkel940ab932014-02-28 00:27:01 +00002968def crnot : OutPatFrag<(ops node:$in),
2969 (CRNOR $in, $in)>;
2970def : Pat<(not i1:$in),
2971 (crnot $in)>;
2972
2973// Patterns for arithmetic i1 operations.
2974def : Pat<(add i1:$a, i1:$b),
2975 (CRXOR $a, $b)>;
2976def : Pat<(sub i1:$a, i1:$b),
2977 (CRXOR $a, $b)>;
2978def : Pat<(mul i1:$a, i1:$b),
2979 (CRAND $a, $b)>;
2980
2981// We're sometimes asked to materialize i1 -1, which is just 1 in this case
2982// (-1 is used to mean all bits set).
2983def : Pat<(i1 -1), (CRSET)>;
2984
2985// i1 extensions, implemented in terms of isel.
2986def : Pat<(i32 (zext i1:$in)),
2987 (SELECT_I4 $in, (LI 1), (LI 0))>;
2988def : Pat<(i32 (sext i1:$in)),
2989 (SELECT_I4 $in, (LI -1), (LI 0))>;
2990
2991def : Pat<(i64 (zext i1:$in)),
2992 (SELECT_I8 $in, (LI8 1), (LI8 0))>;
2993def : Pat<(i64 (sext i1:$in)),
2994 (SELECT_I8 $in, (LI8 -1), (LI8 0))>;
2995
2996// FIXME: We should choose either a zext or a sext based on other constants
2997// already around.
2998def : Pat<(i32 (anyext i1:$in)),
2999 (SELECT_I4 $in, (LI 1), (LI 0))>;
3000def : Pat<(i64 (anyext i1:$in)),
3001 (SELECT_I8 $in, (LI8 1), (LI8 0))>;
3002
3003// match setcc on i1 variables.
Hal Finkela2cdbce2015-08-30 22:12:50 +00003004// CRANDC is:
3005// 1 1 : F
3006// 1 0 : T
3007// 0 1 : F
3008// 0 0 : F
3009//
3010// LT is:
3011// -1 -1 : F
3012// -1 0 : T
3013// 0 -1 : F
3014// 0 0 : F
3015//
3016// ULT is:
3017// 1 1 : F
3018// 1 0 : F
3019// 0 1 : T
3020// 0 0 : F
Hal Finkel940ab932014-02-28 00:27:01 +00003021def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003022 (CRANDC $s1, $s2)>;
Hal Finkel940ab932014-02-28 00:27:01 +00003023def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETULT)),
3024 (CRANDC $s2, $s1)>;
Hal Finkela2cdbce2015-08-30 22:12:50 +00003025// CRORC is:
3026// 1 1 : T
3027// 1 0 : T
3028// 0 1 : F
3029// 0 0 : T
3030//
3031// LE is:
3032// -1 -1 : T
3033// -1 0 : T
3034// 0 -1 : F
3035// 0 0 : T
3036//
3037// ULE is:
3038// 1 1 : T
3039// 1 0 : F
3040// 0 1 : T
3041// 0 0 : T
Hal Finkel940ab932014-02-28 00:27:01 +00003042def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003043 (CRORC $s1, $s2)>;
Hal Finkel940ab932014-02-28 00:27:01 +00003044def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETULE)),
3045 (CRORC $s2, $s1)>;
Hal Finkela2cdbce2015-08-30 22:12:50 +00003046
Hal Finkel940ab932014-02-28 00:27:01 +00003047def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETEQ)),
3048 (CREQV $s1, $s2)>;
Hal Finkela2cdbce2015-08-30 22:12:50 +00003049
3050// GE is:
3051// -1 -1 : T
3052// -1 0 : F
3053// 0 -1 : T
3054// 0 0 : T
3055//
3056// UGE is:
3057// 1 1 : T
3058// 1 0 : T
3059// 0 1 : F
3060// 0 0 : T
Hal Finkel940ab932014-02-28 00:27:01 +00003061def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003062 (CRORC $s2, $s1)>;
Hal Finkel940ab932014-02-28 00:27:01 +00003063def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETUGE)),
3064 (CRORC $s1, $s2)>;
Hal Finkela2cdbce2015-08-30 22:12:50 +00003065
3066// GT is:
3067// -1 -1 : F
3068// -1 0 : F
3069// 0 -1 : T
3070// 0 0 : F
3071//
3072// UGT is:
3073// 1 1 : F
3074// 1 0 : T
3075// 0 1 : F
3076// 0 0 : F
Hal Finkel940ab932014-02-28 00:27:01 +00003077def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003078 (CRANDC $s2, $s1)>;
Hal Finkel940ab932014-02-28 00:27:01 +00003079def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETUGT)),
3080 (CRANDC $s1, $s2)>;
Hal Finkela2cdbce2015-08-30 22:12:50 +00003081
Hal Finkel940ab932014-02-28 00:27:01 +00003082def : Pat<(i1 (setcc i1:$s1, i1:$s2, SETNE)),
3083 (CRXOR $s1, $s2)>;
3084
3085// match setcc on non-i1 (non-vector) variables. Note that SETUEQ, SETOGE,
3086// SETOLE, SETONE, SETULT and SETUGT should be expanded by legalize for
3087// floating-point types.
3088
3089multiclass CRNotPat<dag pattern, dag result> {
3090 def : Pat<pattern, (crnot result)>;
3091 def : Pat<(not pattern), result>;
3092
3093 // We can also fold the crnot into an extension:
3094 def : Pat<(i32 (zext pattern)),
3095 (SELECT_I4 result, (LI 0), (LI 1))>;
3096 def : Pat<(i32 (sext pattern)),
3097 (SELECT_I4 result, (LI 0), (LI -1))>;
3098
3099 // We can also fold the crnot into an extension:
3100 def : Pat<(i64 (zext pattern)),
3101 (SELECT_I8 result, (LI8 0), (LI8 1))>;
3102 def : Pat<(i64 (sext pattern)),
3103 (SELECT_I8 result, (LI8 0), (LI8 -1))>;
3104
3105 // FIXME: We should choose either a zext or a sext based on other constants
3106 // already around.
3107 def : Pat<(i32 (anyext pattern)),
3108 (SELECT_I4 result, (LI 0), (LI 1))>;
3109
3110 def : Pat<(i64 (anyext pattern)),
3111 (SELECT_I8 result, (LI8 0), (LI8 1))>;
3112}
3113
3114// FIXME: Because of what seems like a bug in TableGen's type-inference code,
3115// we need to write imm:$imm in the output patterns below, not just $imm, or
3116// else the resulting matcher will not correctly add the immediate operand
3117// (making it a register operand instead).
3118
3119// extended SETCC.
3120multiclass ExtSetCCPat<CondCode cc, PatFrag pfrag,
3121 OutPatFrag rfrag, OutPatFrag rfrag8> {
3122 def : Pat<(i32 (zext (i1 (pfrag i32:$s1, cc)))),
3123 (rfrag $s1)>;
3124 def : Pat<(i64 (zext (i1 (pfrag i64:$s1, cc)))),
3125 (rfrag8 $s1)>;
3126 def : Pat<(i64 (zext (i1 (pfrag i32:$s1, cc)))),
3127 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), (rfrag $s1), sub_32)>;
3128 def : Pat<(i32 (zext (i1 (pfrag i64:$s1, cc)))),
3129 (EXTRACT_SUBREG (rfrag8 $s1), sub_32)>;
3130
3131 def : Pat<(i32 (anyext (i1 (pfrag i32:$s1, cc)))),
3132 (rfrag $s1)>;
3133 def : Pat<(i64 (anyext (i1 (pfrag i64:$s1, cc)))),
3134 (rfrag8 $s1)>;
3135 def : Pat<(i64 (anyext (i1 (pfrag i32:$s1, cc)))),
3136 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), (rfrag $s1), sub_32)>;
3137 def : Pat<(i32 (anyext (i1 (pfrag i64:$s1, cc)))),
3138 (EXTRACT_SUBREG (rfrag8 $s1), sub_32)>;
3139}
3140
3141// Note that we do all inversions below with i(32|64)not, instead of using
3142// (xori x, 1) because on the A2 nor has single-cycle latency while xori
3143// has 2-cycle latency.
3144
3145defm : ExtSetCCPat<SETEQ,
3146 PatFrag<(ops node:$in, node:$cc),
3147 (setcc $in, 0, $cc)>,
3148 OutPatFrag<(ops node:$in),
3149 (RLWINM (CNTLZW $in), 27, 31, 31)>,
3150 OutPatFrag<(ops node:$in),
3151 (RLDICL (CNTLZD $in), 58, 63)> >;
3152
3153defm : ExtSetCCPat<SETNE,
3154 PatFrag<(ops node:$in, node:$cc),
3155 (setcc $in, 0, $cc)>,
3156 OutPatFrag<(ops node:$in),
3157 (RLWINM (i32not (CNTLZW $in)), 27, 31, 31)>,
3158 OutPatFrag<(ops node:$in),
3159 (RLDICL (i64not (CNTLZD $in)), 58, 63)> >;
3160
3161defm : ExtSetCCPat<SETLT,
3162 PatFrag<(ops node:$in, node:$cc),
3163 (setcc $in, 0, $cc)>,
3164 OutPatFrag<(ops node:$in),
3165 (RLWINM $in, 1, 31, 31)>,
3166 OutPatFrag<(ops node:$in),
3167 (RLDICL $in, 1, 63)> >;
3168
3169defm : ExtSetCCPat<SETGE,
3170 PatFrag<(ops node:$in, node:$cc),
3171 (setcc $in, 0, $cc)>,
3172 OutPatFrag<(ops node:$in),
3173 (RLWINM (i32not $in), 1, 31, 31)>,
3174 OutPatFrag<(ops node:$in),
3175 (RLDICL (i64not $in), 1, 63)> >;
3176
3177defm : ExtSetCCPat<SETGT,
3178 PatFrag<(ops node:$in, node:$cc),
3179 (setcc $in, 0, $cc)>,
3180 OutPatFrag<(ops node:$in),
3181 (RLWINM (ANDC (NEG $in), $in), 1, 31, 31)>,
3182 OutPatFrag<(ops node:$in),
3183 (RLDICL (ANDC8 (NEG8 $in), $in), 1, 63)> >;
3184
3185defm : ExtSetCCPat<SETLE,
3186 PatFrag<(ops node:$in, node:$cc),
3187 (setcc $in, 0, $cc)>,
3188 OutPatFrag<(ops node:$in),
3189 (RLWINM (ORC $in, (NEG $in)), 1, 31, 31)>,
3190 OutPatFrag<(ops node:$in),
3191 (RLDICL (ORC8 $in, (NEG8 $in)), 1, 63)> >;
3192
3193defm : ExtSetCCPat<SETLT,
3194 PatFrag<(ops node:$in, node:$cc),
3195 (setcc $in, -1, $cc)>,
3196 OutPatFrag<(ops node:$in),
3197 (RLWINM (AND $in, (ADDI $in, 1)), 1, 31, 31)>,
3198 OutPatFrag<(ops node:$in),
3199 (RLDICL (AND8 $in, (ADDI8 $in, 1)), 1, 63)> >;
3200
3201defm : ExtSetCCPat<SETGE,
3202 PatFrag<(ops node:$in, node:$cc),
3203 (setcc $in, -1, $cc)>,
3204 OutPatFrag<(ops node:$in),
3205 (RLWINM (NAND $in, (ADDI $in, 1)), 1, 31, 31)>,
3206 OutPatFrag<(ops node:$in),
3207 (RLDICL (NAND8 $in, (ADDI8 $in, 1)), 1, 63)> >;
3208
3209defm : ExtSetCCPat<SETGT,
3210 PatFrag<(ops node:$in, node:$cc),
3211 (setcc $in, -1, $cc)>,
3212 OutPatFrag<(ops node:$in),
3213 (RLWINM (i32not $in), 1, 31, 31)>,
3214 OutPatFrag<(ops node:$in),
3215 (RLDICL (i64not $in), 1, 63)> >;
3216
3217defm : ExtSetCCPat<SETLE,
3218 PatFrag<(ops node:$in, node:$cc),
3219 (setcc $in, -1, $cc)>,
3220 OutPatFrag<(ops node:$in),
3221 (RLWINM $in, 1, 31, 31)>,
3222 OutPatFrag<(ops node:$in),
3223 (RLDICL $in, 1, 63)> >;
3224
Hal Finkela39fd4b2016-09-02 02:34:44 +00003225// An extended SETCC with shift amount.
3226multiclass ExtSetCCShiftPat<CondCode cc, PatFrag pfrag,
3227 OutPatFrag rfrag, OutPatFrag rfrag8> {
3228 def : Pat<(i32 (zext (i1 (pfrag i32:$s1, i32:$sa, cc)))),
3229 (rfrag $s1, $sa)>;
3230 def : Pat<(i64 (zext (i1 (pfrag i64:$s1, i32:$sa, cc)))),
3231 (rfrag8 $s1, $sa)>;
3232 def : Pat<(i64 (zext (i1 (pfrag i32:$s1, i32:$sa, cc)))),
3233 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), (rfrag $s1, $sa), sub_32)>;
3234 def : Pat<(i32 (zext (i1 (pfrag i64:$s1, i32:$sa, cc)))),
3235 (EXTRACT_SUBREG (rfrag8 $s1, $sa), sub_32)>;
3236
3237 def : Pat<(i32 (anyext (i1 (pfrag i32:$s1, i32:$sa, cc)))),
3238 (rfrag $s1, $sa)>;
3239 def : Pat<(i64 (anyext (i1 (pfrag i64:$s1, i32:$sa, cc)))),
3240 (rfrag8 $s1, $sa)>;
3241 def : Pat<(i64 (anyext (i1 (pfrag i32:$s1, i32:$sa, cc)))),
3242 (INSERT_SUBREG (i64 (IMPLICIT_DEF)), (rfrag $s1, $sa), sub_32)>;
3243 def : Pat<(i32 (anyext (i1 (pfrag i64:$s1, i32:$sa, cc)))),
3244 (EXTRACT_SUBREG (rfrag8 $s1, $sa), sub_32)>;
3245}
3246
3247defm : ExtSetCCShiftPat<SETNE,
3248 PatFrag<(ops node:$in, node:$sa, node:$cc),
3249 (setcc (and $in, (shl 1, $sa)), 0, $cc)>,
3250 OutPatFrag<(ops node:$in, node:$sa),
3251 (RLWNM $in, (SUBFIC $sa, 32), 31, 31)>,
3252 OutPatFrag<(ops node:$in, node:$sa),
3253 (RLDCL $in, (SUBFIC $sa, 64), 63)> >;
3254
3255defm : ExtSetCCShiftPat<SETEQ,
3256 PatFrag<(ops node:$in, node:$sa, node:$cc),
3257 (setcc (and $in, (shl 1, $sa)), 0, $cc)>,
3258 OutPatFrag<(ops node:$in, node:$sa),
3259 (RLWNM (i32not $in),
3260 (SUBFIC $sa, 32), 31, 31)>,
3261 OutPatFrag<(ops node:$in, node:$sa),
3262 (RLDCL (i64not $in),
3263 (SUBFIC $sa, 64), 63)> >;
3264
Hal Finkel940ab932014-02-28 00:27:01 +00003265// SETCC for i32.
3266def : Pat<(i1 (setcc i32:$s1, immZExt16:$imm, SETULT)),
3267 (EXTRACT_SUBREG (CMPLWI $s1, imm:$imm), sub_lt)>;
3268def : Pat<(i1 (setcc i32:$s1, imm32SExt16:$imm, SETLT)),
3269 (EXTRACT_SUBREG (CMPWI $s1, imm:$imm), sub_lt)>;
3270def : Pat<(i1 (setcc i32:$s1, immZExt16:$imm, SETUGT)),
3271 (EXTRACT_SUBREG (CMPLWI $s1, imm:$imm), sub_gt)>;
3272def : Pat<(i1 (setcc i32:$s1, imm32SExt16:$imm, SETGT)),
3273 (EXTRACT_SUBREG (CMPWI $s1, imm:$imm), sub_gt)>;
3274def : Pat<(i1 (setcc i32:$s1, imm32SExt16:$imm, SETEQ)),
3275 (EXTRACT_SUBREG (CMPWI $s1, imm:$imm), sub_eq)>;
3276def : Pat<(i1 (setcc i32:$s1, immZExt16:$imm, SETEQ)),
3277 (EXTRACT_SUBREG (CMPLWI $s1, imm:$imm), sub_eq)>;
3278
3279// For non-equality comparisons, the default code would materialize the
3280// constant, then compare against it, like this:
3281// lis r2, 4660
3282// ori r2, r2, 22136
3283// cmpw cr0, r3, r2
3284// beq cr0,L6
3285// Since we are just comparing for equality, we can emit this instead:
3286// xoris r0,r3,0x1234
3287// cmplwi cr0,r0,0x5678
3288// beq cr0,L6
3289
3290def : Pat<(i1 (setcc i32:$s1, imm:$imm, SETEQ)),
3291 (EXTRACT_SUBREG (CMPLWI (XORIS $s1, (HI16 imm:$imm)),
3292 (LO16 imm:$imm)), sub_eq)>;
3293
3294defm : CRNotPat<(i1 (setcc i32:$s1, immZExt16:$imm, SETUGE)),
3295 (EXTRACT_SUBREG (CMPLWI $s1, imm:$imm), sub_lt)>;
3296defm : CRNotPat<(i1 (setcc i32:$s1, imm32SExt16:$imm, SETGE)),
3297 (EXTRACT_SUBREG (CMPWI $s1, imm:$imm), sub_lt)>;
3298defm : CRNotPat<(i1 (setcc i32:$s1, immZExt16:$imm, SETULE)),
3299 (EXTRACT_SUBREG (CMPLWI $s1, imm:$imm), sub_gt)>;
3300defm : CRNotPat<(i1 (setcc i32:$s1, imm32SExt16:$imm, SETLE)),
3301 (EXTRACT_SUBREG (CMPWI $s1, imm:$imm), sub_gt)>;
3302defm : CRNotPat<(i1 (setcc i32:$s1, imm32SExt16:$imm, SETNE)),
3303 (EXTRACT_SUBREG (CMPWI $s1, imm:$imm), sub_eq)>;
3304defm : CRNotPat<(i1 (setcc i32:$s1, immZExt16:$imm, SETNE)),
3305 (EXTRACT_SUBREG (CMPLWI $s1, imm:$imm), sub_eq)>;
3306
3307defm : CRNotPat<(i1 (setcc i32:$s1, imm:$imm, SETNE)),
3308 (EXTRACT_SUBREG (CMPLWI (XORIS $s1, (HI16 imm:$imm)),
3309 (LO16 imm:$imm)), sub_eq)>;
3310
3311def : Pat<(i1 (setcc i32:$s1, i32:$s2, SETULT)),
3312 (EXTRACT_SUBREG (CMPLW $s1, $s2), sub_lt)>;
3313def : Pat<(i1 (setcc i32:$s1, i32:$s2, SETLT)),
3314 (EXTRACT_SUBREG (CMPW $s1, $s2), sub_lt)>;
3315def : Pat<(i1 (setcc i32:$s1, i32:$s2, SETUGT)),
3316 (EXTRACT_SUBREG (CMPLW $s1, $s2), sub_gt)>;
3317def : Pat<(i1 (setcc i32:$s1, i32:$s2, SETGT)),
3318 (EXTRACT_SUBREG (CMPW $s1, $s2), sub_gt)>;
3319def : Pat<(i1 (setcc i32:$s1, i32:$s2, SETEQ)),
3320 (EXTRACT_SUBREG (CMPW $s1, $s2), sub_eq)>;
3321
3322defm : CRNotPat<(i1 (setcc i32:$s1, i32:$s2, SETUGE)),
3323 (EXTRACT_SUBREG (CMPLW $s1, $s2), sub_lt)>;
3324defm : CRNotPat<(i1 (setcc i32:$s1, i32:$s2, SETGE)),
3325 (EXTRACT_SUBREG (CMPW $s1, $s2), sub_lt)>;
3326defm : CRNotPat<(i1 (setcc i32:$s1, i32:$s2, SETULE)),
3327 (EXTRACT_SUBREG (CMPLW $s1, $s2), sub_gt)>;
3328defm : CRNotPat<(i1 (setcc i32:$s1, i32:$s2, SETLE)),
3329 (EXTRACT_SUBREG (CMPW $s1, $s2), sub_gt)>;
3330defm : CRNotPat<(i1 (setcc i32:$s1, i32:$s2, SETNE)),
3331 (EXTRACT_SUBREG (CMPW $s1, $s2), sub_eq)>;
3332
3333// SETCC for i64.
3334def : Pat<(i1 (setcc i64:$s1, immZExt16:$imm, SETULT)),
3335 (EXTRACT_SUBREG (CMPLDI $s1, imm:$imm), sub_lt)>;
3336def : Pat<(i1 (setcc i64:$s1, imm64SExt16:$imm, SETLT)),
3337 (EXTRACT_SUBREG (CMPDI $s1, imm:$imm), sub_lt)>;
3338def : Pat<(i1 (setcc i64:$s1, immZExt16:$imm, SETUGT)),
3339 (EXTRACT_SUBREG (CMPLDI $s1, imm:$imm), sub_gt)>;
3340def : Pat<(i1 (setcc i64:$s1, imm64SExt16:$imm, SETGT)),
3341 (EXTRACT_SUBREG (CMPDI $s1, imm:$imm), sub_gt)>;
3342def : Pat<(i1 (setcc i64:$s1, imm64SExt16:$imm, SETEQ)),
3343 (EXTRACT_SUBREG (CMPDI $s1, imm:$imm), sub_eq)>;
3344def : Pat<(i1 (setcc i64:$s1, immZExt16:$imm, SETEQ)),
3345 (EXTRACT_SUBREG (CMPLDI $s1, imm:$imm), sub_eq)>;
3346
3347// For non-equality comparisons, the default code would materialize the
3348// constant, then compare against it, like this:
3349// lis r2, 4660
3350// ori r2, r2, 22136
3351// cmpd cr0, r3, r2
3352// beq cr0,L6
3353// Since we are just comparing for equality, we can emit this instead:
3354// xoris r0,r3,0x1234
3355// cmpldi cr0,r0,0x5678
3356// beq cr0,L6
3357
3358def : Pat<(i1 (setcc i64:$s1, imm64ZExt32:$imm, SETEQ)),
3359 (EXTRACT_SUBREG (CMPLDI (XORIS8 $s1, (HI16 imm:$imm)),
3360 (LO16 imm:$imm)), sub_eq)>;
3361
3362defm : CRNotPat<(i1 (setcc i64:$s1, immZExt16:$imm, SETUGE)),
3363 (EXTRACT_SUBREG (CMPLDI $s1, imm:$imm), sub_lt)>;
3364defm : CRNotPat<(i1 (setcc i64:$s1, imm64SExt16:$imm, SETGE)),
3365 (EXTRACT_SUBREG (CMPDI $s1, imm:$imm), sub_lt)>;
3366defm : CRNotPat<(i1 (setcc i64:$s1, immZExt16:$imm, SETULE)),
3367 (EXTRACT_SUBREG (CMPLDI $s1, imm:$imm), sub_gt)>;
3368defm : CRNotPat<(i1 (setcc i64:$s1, imm64SExt16:$imm, SETLE)),
3369 (EXTRACT_SUBREG (CMPDI $s1, imm:$imm), sub_gt)>;
3370defm : CRNotPat<(i1 (setcc i64:$s1, imm64SExt16:$imm, SETNE)),
3371 (EXTRACT_SUBREG (CMPDI $s1, imm:$imm), sub_eq)>;
3372defm : CRNotPat<(i1 (setcc i64:$s1, immZExt16:$imm, SETNE)),
3373 (EXTRACT_SUBREG (CMPLDI $s1, imm:$imm), sub_eq)>;
3374
3375defm : CRNotPat<(i1 (setcc i64:$s1, imm64ZExt32:$imm, SETNE)),
3376 (EXTRACT_SUBREG (CMPLDI (XORIS8 $s1, (HI16 imm:$imm)),
3377 (LO16 imm:$imm)), sub_eq)>;
3378
3379def : Pat<(i1 (setcc i64:$s1, i64:$s2, SETULT)),
3380 (EXTRACT_SUBREG (CMPLD $s1, $s2), sub_lt)>;
3381def : Pat<(i1 (setcc i64:$s1, i64:$s2, SETLT)),
3382 (EXTRACT_SUBREG (CMPD $s1, $s2), sub_lt)>;
3383def : Pat<(i1 (setcc i64:$s1, i64:$s2, SETUGT)),
3384 (EXTRACT_SUBREG (CMPLD $s1, $s2), sub_gt)>;
3385def : Pat<(i1 (setcc i64:$s1, i64:$s2, SETGT)),
3386 (EXTRACT_SUBREG (CMPD $s1, $s2), sub_gt)>;
3387def : Pat<(i1 (setcc i64:$s1, i64:$s2, SETEQ)),
3388 (EXTRACT_SUBREG (CMPD $s1, $s2), sub_eq)>;
3389
3390defm : CRNotPat<(i1 (setcc i64:$s1, i64:$s2, SETUGE)),
3391 (EXTRACT_SUBREG (CMPLD $s1, $s2), sub_lt)>;
3392defm : CRNotPat<(i1 (setcc i64:$s1, i64:$s2, SETGE)),
3393 (EXTRACT_SUBREG (CMPD $s1, $s2), sub_lt)>;
3394defm : CRNotPat<(i1 (setcc i64:$s1, i64:$s2, SETULE)),
3395 (EXTRACT_SUBREG (CMPLD $s1, $s2), sub_gt)>;
3396defm : CRNotPat<(i1 (setcc i64:$s1, i64:$s2, SETLE)),
3397 (EXTRACT_SUBREG (CMPD $s1, $s2), sub_gt)>;
3398defm : CRNotPat<(i1 (setcc i64:$s1, i64:$s2, SETNE)),
3399 (EXTRACT_SUBREG (CMPD $s1, $s2), sub_eq)>;
3400
3401// SETCC for f32.
3402def : Pat<(i1 (setcc f32:$s1, f32:$s2, SETOLT)),
3403 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_lt)>;
3404def : Pat<(i1 (setcc f32:$s1, f32:$s2, SETLT)),
3405 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_lt)>;
3406def : Pat<(i1 (setcc f32:$s1, f32:$s2, SETOGT)),
3407 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_gt)>;
3408def : Pat<(i1 (setcc f32:$s1, f32:$s2, SETGT)),
3409 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_gt)>;
3410def : Pat<(i1 (setcc f32:$s1, f32:$s2, SETOEQ)),
3411 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_eq)>;
3412def : Pat<(i1 (setcc f32:$s1, f32:$s2, SETEQ)),
3413 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_eq)>;
3414def : Pat<(i1 (setcc f32:$s1, f32:$s2, SETUO)),
3415 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_un)>;
3416
3417defm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETUGE)),
3418 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_lt)>;
3419defm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETGE)),
3420 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_lt)>;
3421defm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETULE)),
3422 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_gt)>;
3423defm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETLE)),
3424 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_gt)>;
3425defm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETUNE)),
3426 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_eq)>;
3427defm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETNE)),
3428 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_eq)>;
3429defm : CRNotPat<(i1 (setcc f32:$s1, f32:$s2, SETO)),
3430 (EXTRACT_SUBREG (FCMPUS $s1, $s2), sub_un)>;
3431
3432// SETCC for f64.
3433def : Pat<(i1 (setcc f64:$s1, f64:$s2, SETOLT)),
3434 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_lt)>;
3435def : Pat<(i1 (setcc f64:$s1, f64:$s2, SETLT)),
3436 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_lt)>;
3437def : Pat<(i1 (setcc f64:$s1, f64:$s2, SETOGT)),
3438 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_gt)>;
3439def : Pat<(i1 (setcc f64:$s1, f64:$s2, SETGT)),
3440 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_gt)>;
3441def : Pat<(i1 (setcc f64:$s1, f64:$s2, SETOEQ)),
3442 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_eq)>;
3443def : Pat<(i1 (setcc f64:$s1, f64:$s2, SETEQ)),
3444 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_eq)>;
3445def : Pat<(i1 (setcc f64:$s1, f64:$s2, SETUO)),
3446 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_un)>;
3447
3448defm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETUGE)),
3449 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_lt)>;
3450defm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETGE)),
3451 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_lt)>;
3452defm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETULE)),
3453 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_gt)>;
3454defm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETLE)),
3455 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_gt)>;
3456defm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETUNE)),
3457 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_eq)>;
3458defm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETNE)),
3459 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_eq)>;
3460defm : CRNotPat<(i1 (setcc f64:$s1, f64:$s2, SETO)),
3461 (EXTRACT_SUBREG (FCMPUD $s1, $s2), sub_un)>;
3462
3463// match select on i1 variables:
3464def : Pat<(i1 (select i1:$cond, i1:$tval, i1:$fval)),
3465 (CROR (CRAND $cond , $tval),
3466 (CRAND (crnot $cond), $fval))>;
3467
3468// match selectcc on i1 variables:
3469// select (lhs == rhs), tval, fval is:
3470// ((lhs == rhs) & tval) | (!(lhs == rhs) & fval)
3471def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003472 (CROR (CRAND (CRANDC $lhs, $rhs), $tval),
3473 (CRAND (CRORC $rhs, $lhs), $fval))>;
3474def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETULT)),
Hal Finkel940ab932014-02-28 00:27:01 +00003475 (CROR (CRAND (CRANDC $rhs, $lhs), $tval),
3476 (CRAND (CRORC $lhs, $rhs), $fval))>;
3477def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003478 (CROR (CRAND (CRORC $lhs, $rhs), $tval),
3479 (CRAND (CRANDC $rhs, $lhs), $fval))>;
3480def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETULE)),
Hal Finkel940ab932014-02-28 00:27:01 +00003481 (CROR (CRAND (CRORC $rhs, $lhs), $tval),
3482 (CRAND (CRANDC $lhs, $rhs), $fval))>;
3483def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETEQ)),
3484 (CROR (CRAND (CREQV $lhs, $rhs), $tval),
3485 (CRAND (CRXOR $lhs, $rhs), $fval))>;
3486def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003487 (CROR (CRAND (CRORC $rhs, $lhs), $tval),
3488 (CRAND (CRANDC $lhs, $rhs), $fval))>;
3489def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETUGE)),
Hal Finkel940ab932014-02-28 00:27:01 +00003490 (CROR (CRAND (CRORC $lhs, $rhs), $tval),
3491 (CRAND (CRANDC $rhs, $lhs), $fval))>;
3492def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003493 (CROR (CRAND (CRANDC $rhs, $lhs), $tval),
3494 (CRAND (CRORC $lhs, $rhs), $fval))>;
3495def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETUGT)),
Hal Finkel940ab932014-02-28 00:27:01 +00003496 (CROR (CRAND (CRANDC $lhs, $rhs), $tval),
3497 (CRAND (CRORC $rhs, $lhs), $fval))>;
3498def : Pat <(i1 (selectcc i1:$lhs, i1:$rhs, i1:$tval, i1:$fval, SETNE)),
3499 (CROR (CRAND (CREQV $lhs, $rhs), $fval),
3500 (CRAND (CRXOR $lhs, $rhs), $tval))>;
3501
3502// match selectcc on i1 variables with non-i1 output.
3503def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003504 (SELECT_I4 (CRANDC $lhs, $rhs), $tval, $fval)>;
3505def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETULT)),
Hal Finkel940ab932014-02-28 00:27:01 +00003506 (SELECT_I4 (CRANDC $rhs, $lhs), $tval, $fval)>;
3507def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003508 (SELECT_I4 (CRORC $lhs, $rhs), $tval, $fval)>;
3509def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETULE)),
Hal Finkel940ab932014-02-28 00:27:01 +00003510 (SELECT_I4 (CRORC $rhs, $lhs), $tval, $fval)>;
3511def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETEQ)),
3512 (SELECT_I4 (CREQV $lhs, $rhs), $tval, $fval)>;
3513def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003514 (SELECT_I4 (CRORC $rhs, $lhs), $tval, $fval)>;
3515def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETUGE)),
Hal Finkel940ab932014-02-28 00:27:01 +00003516 (SELECT_I4 (CRORC $lhs, $rhs), $tval, $fval)>;
3517def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003518 (SELECT_I4 (CRANDC $rhs, $lhs), $tval, $fval)>;
3519def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETUGT)),
Hal Finkel940ab932014-02-28 00:27:01 +00003520 (SELECT_I4 (CRANDC $lhs, $rhs), $tval, $fval)>;
3521def : Pat<(i32 (selectcc i1:$lhs, i1:$rhs, i32:$tval, i32:$fval, SETNE)),
3522 (SELECT_I4 (CRXOR $lhs, $rhs), $tval, $fval)>;
3523
3524def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003525 (SELECT_I8 (CRANDC $lhs, $rhs), $tval, $fval)>;
3526def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETULT)),
Hal Finkel940ab932014-02-28 00:27:01 +00003527 (SELECT_I8 (CRANDC $rhs, $lhs), $tval, $fval)>;
3528def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003529 (SELECT_I8 (CRORC $lhs, $rhs), $tval, $fval)>;
3530def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETULE)),
Hal Finkel940ab932014-02-28 00:27:01 +00003531 (SELECT_I8 (CRORC $rhs, $lhs), $tval, $fval)>;
3532def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETEQ)),
3533 (SELECT_I8 (CREQV $lhs, $rhs), $tval, $fval)>;
3534def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003535 (SELECT_I8 (CRORC $rhs, $lhs), $tval, $fval)>;
3536def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETUGE)),
Hal Finkel940ab932014-02-28 00:27:01 +00003537 (SELECT_I8 (CRORC $lhs, $rhs), $tval, $fval)>;
3538def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003539 (SELECT_I8 (CRANDC $rhs, $lhs), $tval, $fval)>;
3540def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETUGT)),
Hal Finkel940ab932014-02-28 00:27:01 +00003541 (SELECT_I8 (CRANDC $lhs, $rhs), $tval, $fval)>;
3542def : Pat<(i64 (selectcc i1:$lhs, i1:$rhs, i64:$tval, i64:$fval, SETNE)),
3543 (SELECT_I8 (CRXOR $lhs, $rhs), $tval, $fval)>;
3544
3545def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003546 (SELECT_F4 (CRANDC $lhs, $rhs), $tval, $fval)>;
3547def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
Hal Finkel940ab932014-02-28 00:27:01 +00003548 (SELECT_F4 (CRANDC $rhs, $lhs), $tval, $fval)>;
3549def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003550 (SELECT_F4 (CRORC $lhs, $rhs), $tval, $fval)>;
3551def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
Hal Finkel940ab932014-02-28 00:27:01 +00003552 (SELECT_F4 (CRORC $rhs, $lhs), $tval, $fval)>;
3553def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
3554 (SELECT_F4 (CREQV $lhs, $rhs), $tval, $fval)>;
3555def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003556 (SELECT_F4 (CRORC $rhs, $lhs), $tval, $fval)>;
3557def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
Hal Finkel940ab932014-02-28 00:27:01 +00003558 (SELECT_F4 (CRORC $lhs, $rhs), $tval, $fval)>;
3559def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003560 (SELECT_F4 (CRANDC $rhs, $lhs), $tval, $fval)>;
3561def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
Hal Finkel940ab932014-02-28 00:27:01 +00003562 (SELECT_F4 (CRANDC $lhs, $rhs), $tval, $fval)>;
3563def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
3564 (SELECT_F4 (CRXOR $lhs, $rhs), $tval, $fval)>;
3565
3566def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003567 (SELECT_F8 (CRANDC $lhs, $rhs), $tval, $fval)>;
3568def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
Hal Finkel940ab932014-02-28 00:27:01 +00003569 (SELECT_F8 (CRANDC $rhs, $lhs), $tval, $fval)>;
3570def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003571 (SELECT_F8 (CRORC $lhs, $rhs), $tval, $fval)>;
3572def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
Hal Finkel940ab932014-02-28 00:27:01 +00003573 (SELECT_F8 (CRORC $rhs, $lhs), $tval, $fval)>;
3574def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
3575 (SELECT_F8 (CREQV $lhs, $rhs), $tval, $fval)>;
3576def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003577 (SELECT_F8 (CRORC $rhs, $lhs), $tval, $fval)>;
3578def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
Hal Finkel940ab932014-02-28 00:27:01 +00003579 (SELECT_F8 (CRORC $lhs, $rhs), $tval, $fval)>;
3580def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003581 (SELECT_F8 (CRANDC $rhs, $lhs), $tval, $fval)>;
3582def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
Hal Finkel940ab932014-02-28 00:27:01 +00003583 (SELECT_F8 (CRANDC $lhs, $rhs), $tval, $fval)>;
3584def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
3585 (SELECT_F8 (CRXOR $lhs, $rhs), $tval, $fval)>;
3586
3587def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETLT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003588 (SELECT_VRRC (CRANDC $lhs, $rhs), $tval, $fval)>;
3589def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETULT)),
Hal Finkel940ab932014-02-28 00:27:01 +00003590 (SELECT_VRRC (CRANDC $rhs, $lhs), $tval, $fval)>;
3591def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETLE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003592 (SELECT_VRRC (CRORC $lhs, $rhs), $tval, $fval)>;
3593def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETULE)),
Hal Finkel940ab932014-02-28 00:27:01 +00003594 (SELECT_VRRC (CRORC $rhs, $lhs), $tval, $fval)>;
3595def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETEQ)),
3596 (SELECT_VRRC (CREQV $lhs, $rhs), $tval, $fval)>;
3597def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETGE)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003598 (SELECT_VRRC (CRORC $rhs, $lhs), $tval, $fval)>;
3599def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETUGE)),
Hal Finkel940ab932014-02-28 00:27:01 +00003600 (SELECT_VRRC (CRORC $lhs, $rhs), $tval, $fval)>;
3601def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETGT)),
Hal Finkela2cdbce2015-08-30 22:12:50 +00003602 (SELECT_VRRC (CRANDC $rhs, $lhs), $tval, $fval)>;
3603def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETUGT)),
Hal Finkel940ab932014-02-28 00:27:01 +00003604 (SELECT_VRRC (CRANDC $lhs, $rhs), $tval, $fval)>;
3605def : Pat<(v4i32 (selectcc i1:$lhs, i1:$rhs, v4i32:$tval, v4i32:$fval, SETNE)),
3606 (SELECT_VRRC (CRXOR $lhs, $rhs), $tval, $fval)>;
3607
3608let usesCustomInserter = 1 in {
3609def ANDIo_1_EQ_BIT : Pseudo<(outs crbitrc:$dst), (ins gprc:$in),
3610 "#ANDIo_1_EQ_BIT",
3611 [(set i1:$dst, (trunc (not i32:$in)))]>;
3612def ANDIo_1_GT_BIT : Pseudo<(outs crbitrc:$dst), (ins gprc:$in),
3613 "#ANDIo_1_GT_BIT",
3614 [(set i1:$dst, (trunc i32:$in))]>;
3615
3616def ANDIo_1_EQ_BIT8 : Pseudo<(outs crbitrc:$dst), (ins g8rc:$in),
3617 "#ANDIo_1_EQ_BIT8",
3618 [(set i1:$dst, (trunc (not i64:$in)))]>;
3619def ANDIo_1_GT_BIT8 : Pseudo<(outs crbitrc:$dst), (ins g8rc:$in),
3620 "#ANDIo_1_GT_BIT8",
3621 [(set i1:$dst, (trunc i64:$in))]>;
3622}
3623
3624def : Pat<(i1 (not (trunc i32:$in))),
3625 (ANDIo_1_EQ_BIT $in)>;
3626def : Pat<(i1 (not (trunc i64:$in))),
3627 (ANDIo_1_EQ_BIT8 $in)>;
Ulrich Weigand300b6872013-05-03 19:51:09 +00003628
3629//===----------------------------------------------------------------------===//
3630// PowerPC Instructions used for assembler/disassembler only
3631//
3632
Joerg Sonnenberger9dedceb2014-08-05 13:34:01 +00003633// FIXME: For B=0 or B > 8, the registers following RT are used.
3634// WARNING: Do not add patterns for this instruction without fixing this.
3635def LSWI : XForm_base_r3xo<31, 597, (outs gprc:$RT), (ins gprc:$A, u5imm:$B),
3636 "lswi $RT, $A, $B", IIC_LdStLoad, []>;
3637
3638// FIXME: For B=0 or B > 8, the registers following RT are used.
3639// WARNING: Do not add patterns for this instruction without fixing this.
3640def STSWI : XForm_base_r3xo<31, 725, (outs), (ins gprc:$RT, gprc:$A, u5imm:$B),
3641 "stswi $RT, $A, $B", IIC_LdStLoad, []>;
3642
Ulrich Weigand300b6872013-05-03 19:51:09 +00003643def ISYNC : XLForm_2_ext<19, 150, 0, 0, 0, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003644 "isync", IIC_SprISYNC, []>;
Ulrich Weigand300b6872013-05-03 19:51:09 +00003645
3646def ICBI : XForm_1a<31, 982, (outs), (ins memrr:$src),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003647 "icbi $src", IIC_LdStICBI, []>;
Ulrich Weigand300b6872013-05-03 19:51:09 +00003648
Sylvestre Ledru9be0b772015-02-05 18:57:02 +00003649// We used to have EIEIO as value but E[0-9A-Z] is a reserved name
3650def EnforceIEIO : XForm_24_eieio<31, 854, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003651 "eieio", IIC_LdStLoad, []>;
Ulrich Weigand98fcc7b2013-07-01 17:06:26 +00003652
Ulrich Weigand7a9fcdf2013-07-01 17:21:23 +00003653def WAIT : XForm_24_sync<31, 62, (outs), (ins i32imm:$L),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003654 "wait $L", IIC_LdStLoad, []>;
Ulrich Weigand7a9fcdf2013-07-01 17:21:23 +00003655
Joerg Sonnenberger99ef10f2014-07-29 23:16:31 +00003656def MBAR : XForm_mbar<31, 854, (outs), (ins u5imm:$MO),
3657 "mbar $MO", IIC_LdStLoad>, Requires<[IsBookE]>;
3658
Joerg Sonnenberger9e9623c2014-07-29 22:21:57 +00003659def MTSR: XForm_sr<31, 210, (outs), (ins gprc:$RS, u4imm:$SR),
3660 "mtsr $SR, $RS", IIC_SprMTSR>;
3661
3662def MFSR: XForm_sr<31, 595, (outs gprc:$RS), (ins u4imm:$SR),
3663 "mfsr $RS, $SR", IIC_SprMFSR>;
3664
3665def MTSRIN: XForm_srin<31, 242, (outs), (ins gprc:$RS, gprc:$RB),
3666 "mtsrin $RS, $RB", IIC_SprMTSR>;
3667
3668def MFSRIN: XForm_srin<31, 659, (outs gprc:$RS), (ins gprc:$RB),
3669 "mfsrin $RS, $RB", IIC_SprMFSR>;
3670
Roman Divacky62cb6352013-09-12 17:50:54 +00003671def MTMSR: XForm_mtmsr<31, 146, (outs), (ins gprc:$RS, i32imm:$L),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003672 "mtmsr $RS, $L", IIC_SprMTMSR>;
Roman Divacky62cb6352013-09-12 17:50:54 +00003673
Joerg Sonnenbergerb97f3192014-07-30 10:32:51 +00003674def WRTEE: XForm_mtmsr<31, 131, (outs), (ins gprc:$RS),
3675 "wrtee $RS", IIC_SprMTMSR>, Requires<[IsBookE]> {
3676 let L = 0;
3677}
3678
3679def WRTEEI: I<31, (outs), (ins i1imm:$E), "wrteei $E", IIC_SprMTMSR>,
3680 Requires<[IsBookE]> {
3681 bits<1> E;
3682
3683 let Inst{16} = E;
3684 let Inst{21-30} = 163;
3685}
3686
Joerg Sonnenberger0d5e0682014-08-09 13:58:31 +00003687def DCCCI : XForm_tlb<454, (outs), (ins gprc:$A, gprc:$B),
3688 "dccci $A, $B", IIC_LdStLoad>, Requires<[IsPPC4xx]>;
3689def ICCCI : XForm_tlb<966, (outs), (ins gprc:$A, gprc:$B),
3690 "iccci $A, $B", IIC_LdStLoad>, Requires<[IsPPC4xx]>;
Joerg Sonnenberger41247122014-08-05 14:40:32 +00003691
Joerg Sonnenberger0d5e0682014-08-09 13:58:31 +00003692def : InstAlias<"dci 0", (DCCCI R0, R0)>, Requires<[IsPPC4xx]>;
3693def : InstAlias<"dccci", (DCCCI R0, R0)>, Requires<[IsPPC4xx]>;
3694def : InstAlias<"ici 0", (ICCCI R0, R0)>, Requires<[IsPPC4xx]>;
3695def : InstAlias<"iccci", (ICCCI R0, R0)>, Requires<[IsPPC4xx]>;
Joerg Sonnenberger41247122014-08-05 14:40:32 +00003696
Roman Divacky62cb6352013-09-12 17:50:54 +00003697def MFMSR : XForm_rs<31, 83, (outs gprc:$RT), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003698 "mfmsr $RT", IIC_SprMFMSR, []>;
Roman Divacky62cb6352013-09-12 17:50:54 +00003699
3700def MTMSRD : XForm_mtmsr<31, 178, (outs), (ins gprc:$RS, i32imm:$L),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003701 "mtmsrd $RS, $L", IIC_SprMTMSRD>;
Roman Divacky62cb6352013-09-12 17:50:54 +00003702
Hal Finkel64202162015-01-15 01:00:53 +00003703def MCRFS : XLForm_3<63, 64, (outs crrc:$BF), (ins crrc:$BFA),
3704 "mcrfs $BF, $BFA", IIC_BrMCR>;
3705
3706def MTFSFI : XLForm_4<63, 134, (outs crrc:$BF), (ins i32imm:$U, i32imm:$W),
3707 "mtfsfi $BF, $U, $W", IIC_IntMFFS>;
3708
3709def MTFSFIo : XLForm_4<63, 134, (outs crrc:$BF), (ins i32imm:$U, i32imm:$W),
3710 "mtfsfi. $BF, $U, $W", IIC_IntMFFS>, isDOT;
3711
3712def : InstAlias<"mtfsfi $BF, $U", (MTFSFI crrc:$BF, i32imm:$U, 0)>;
3713def : InstAlias<"mtfsfi. $BF, $U", (MTFSFIo crrc:$BF, i32imm:$U, 0)>;
3714
3715def MTFSF : XFLForm_1<63, 711, (outs),
3716 (ins i32imm:$FLM, f8rc:$FRB, i32imm:$L, i32imm:$W),
3717 "mtfsf $FLM, $FRB, $L, $W", IIC_IntMFFS, []>;
3718def MTFSFo : XFLForm_1<63, 711, (outs),
3719 (ins i32imm:$FLM, f8rc:$FRB, i32imm:$L, i32imm:$W),
3720 "mtfsf. $FLM, $FRB, $L, $W", IIC_IntMFFS, []>, isDOT;
3721
3722def : InstAlias<"mtfsf $FLM, $FRB", (MTFSF i32imm:$FLM, f8rc:$FRB, 0, 0)>;
3723def : InstAlias<"mtfsf. $FLM, $FRB", (MTFSFo i32imm:$FLM, f8rc:$FRB, 0, 0)>;
3724
Roman Divacky62cb6352013-09-12 17:50:54 +00003725def SLBIE : XForm_16b<31, 434, (outs), (ins gprc:$RB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003726 "slbie $RB", IIC_SprSLBIE, []>;
Roman Divacky62cb6352013-09-12 17:50:54 +00003727
3728def SLBMTE : XForm_26<31, 402, (outs), (ins gprc:$RS, gprc:$RB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003729 "slbmte $RS, $RB", IIC_SprSLBMTE, []>;
Roman Divacky62cb6352013-09-12 17:50:54 +00003730
3731def SLBMFEE : XForm_26<31, 915, (outs gprc:$RT), (ins gprc:$RB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003732 "slbmfee $RT, $RB", IIC_SprSLBMFEE, []>;
Roman Divacky62cb6352013-09-12 17:50:54 +00003733
Hal Finkel28842b92016-09-02 23:42:01 +00003734def SLBMFEV : XLForm_1_gen<31, 851, (outs gprc:$RT), (ins gprc:$RB),
3735 "slbmfev $RT, $RB", IIC_SprSLBMFEV, []>;
3736
Hal Finkel3e5a3602013-11-27 23:26:09 +00003737def SLBIA : XForm_0<31, 498, (outs), (ins), "slbia", IIC_SprSLBIA, []>;
Roman Divacky62cb6352013-09-12 17:50:54 +00003738
Joerg Sonnenbergerc03105b2014-08-02 20:16:29 +00003739def TLBIA : XForm_0<31, 370, (outs), (ins),
3740 "tlbia", IIC_SprTLBIA, []>;
3741
Roman Divacky62cb6352013-09-12 17:50:54 +00003742def TLBSYNC : XForm_0<31, 566, (outs), (ins),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003743 "tlbsync", IIC_SprTLBSYNC, []>;
Roman Divacky62cb6352013-09-12 17:50:54 +00003744
3745def TLBIEL : XForm_16b<31, 274, (outs), (ins gprc:$RB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003746 "tlbiel $RB", IIC_SprTLBIEL, []>;
Roman Divacky62cb6352013-09-12 17:50:54 +00003747
Joerg Sonnenberger5995e002014-08-04 23:49:45 +00003748def TLBLD : XForm_16b<31, 978, (outs), (ins gprc:$RB),
3749 "tlbld $RB", IIC_LdStLoad, []>, Requires<[IsPPC6xx]>;
3750def TLBLI : XForm_16b<31, 1010, (outs), (ins gprc:$RB),
3751 "tlbli $RB", IIC_LdStLoad, []>, Requires<[IsPPC6xx]>;
3752
Roman Divacky62cb6352013-09-12 17:50:54 +00003753def TLBIE : XForm_26<31, 306, (outs), (ins gprc:$RS, gprc:$RB),
Hal Finkel3e5a3602013-11-27 23:26:09 +00003754 "tlbie $RB,$RS", IIC_SprTLBIE, []>;
Roman Divacky62cb6352013-09-12 17:50:54 +00003755
Joerg Sonnenbergerc5fe19d2014-07-30 22:51:15 +00003756def TLBSX : XForm_tlb<914, (outs), (ins gprc:$A, gprc:$B), "tlbsx $A, $B",
3757 IIC_LdStLoad>, Requires<[IsBookE]>;
3758
3759def TLBIVAX : XForm_tlb<786, (outs), (ins gprc:$A, gprc:$B), "tlbivax $A, $B",
3760 IIC_LdStLoad>, Requires<[IsBookE]>;
Joerg Sonnenbergerfee94b42014-07-30 20:44:04 +00003761
3762def TLBRE : XForm_24_eieio<31, 946, (outs), (ins),
3763 "tlbre", IIC_LdStLoad, []>, Requires<[IsBookE]>;
3764
3765def TLBWE : XForm_24_eieio<31, 978, (outs), (ins),
3766 "tlbwe", IIC_LdStLoad, []>, Requires<[IsBookE]>;
3767
Joerg Sonnenberger6c3e3852014-08-04 21:28:22 +00003768def TLBRE2 : XForm_tlbws<31, 946, (outs gprc:$RS), (ins gprc:$A, i1imm:$WS),
3769 "tlbre $RS, $A, $WS", IIC_LdStLoad, []>, Requires<[IsPPC4xx]>;
3770
3771def TLBWE2 : XForm_tlbws<31, 978, (outs), (ins gprc:$RS, gprc:$A, i1imm:$WS),
3772 "tlbwe $RS, $A, $WS", IIC_LdStLoad, []>, Requires<[IsPPC4xx]>;
3773
3774def TLBSX2 : XForm_base_r3xo<31, 914, (outs), (ins gprc:$RST, gprc:$A, gprc:$B),
3775 "tlbsx $RST, $A, $B", IIC_LdStLoad, []>,
3776 Requires<[IsPPC4xx]>;
3777def TLBSX2D : XForm_base_r3xo<31, 914, (outs),
3778 (ins gprc:$RST, gprc:$A, gprc:$B),
3779 "tlbsx. $RST, $A, $B", IIC_LdStLoad, []>,
3780 Requires<[IsPPC4xx]>, isDOT;
3781
Joerg Sonnenbergera3d4dc92014-08-07 12:39:59 +00003782def RFID : XForm_0<19, 18, (outs), (ins), "rfid", IIC_IntRFID, []>;
3783
Joerg Sonnenberger83ef5c72014-08-07 12:35:16 +00003784def RFI : XForm_0<19, 50, (outs), (ins), "rfi", IIC_SprRFI, []>,
Joerg Sonnenberger13076552014-07-29 23:45:20 +00003785 Requires<[IsBookE]>;
3786def RFCI : XForm_0<19, 51, (outs), (ins), "rfci", IIC_BrB, []>,
3787 Requires<[IsBookE]>;
Joerg Sonnenbergeraccbc942014-07-29 15:49:09 +00003788
Joerg Sonnenberger0b2ebcb2014-08-04 15:47:38 +00003789def RFDI : XForm_0<19, 39, (outs), (ins), "rfdi", IIC_BrB, []>,
3790 Requires<[IsE500]>;
3791def RFMCI : XForm_0<19, 38, (outs), (ins), "rfmci", IIC_BrB, []>,
3792 Requires<[IsE500]>;
Joerg Sonnenberger68092872014-07-30 21:09:03 +00003793
Joerg Sonnenbergere8a167c2014-08-02 20:00:26 +00003794def MFDCR : XFXForm_1<31, 323, (outs gprc:$RT), (ins i32imm:$SPR),
Joerg Sonnenberger0b2ebcb2014-08-04 15:47:38 +00003795 "mfdcr $RT, $SPR", IIC_SprMFSPR>, Requires<[IsPPC4xx]>;
Joerg Sonnenbergere8a167c2014-08-02 20:00:26 +00003796def MTDCR : XFXForm_1<31, 451, (outs), (ins gprc:$RT, i32imm:$SPR),
Joerg Sonnenberger0b2ebcb2014-08-04 15:47:38 +00003797 "mtdcr $SPR, $RT", IIC_SprMTSPR>, Requires<[IsPPC4xx]>;
Joerg Sonnenbergere8a167c2014-08-02 20:00:26 +00003798
Hal Finkel28842b92016-09-02 23:42:01 +00003799def HRFID : XLForm_1_np<19, 274, (outs), (ins), "hrfid", IIC_BrB, []>;
3800def NAP : XLForm_1_np<19, 434, (outs), (ins), "nap", IIC_BrB, []>;
3801
Hal Finkel59016762014-11-25 00:30:11 +00003802def ATTN : XForm_attn<0, 256, (outs), (ins), "attn", IIC_BrB>;
3803
Hal Finkel378107d2014-11-30 10:15:56 +00003804def LBZCIX : XForm_base_r3xo<31, 853, (outs gprc:$RST), (ins gprc:$A, gprc:$B),
3805 "lbzcix $RST, $A, $B", IIC_LdStLoad, []>;
3806def LHZCIX : XForm_base_r3xo<31, 821, (outs gprc:$RST), (ins gprc:$A, gprc:$B),
3807 "lhzcix $RST, $A, $B", IIC_LdStLoad, []>;
3808def LWZCIX : XForm_base_r3xo<31, 789, (outs gprc:$RST), (ins gprc:$A, gprc:$B),
3809 "lwzcix $RST, $A, $B", IIC_LdStLoad, []>;
3810def LDCIX : XForm_base_r3xo<31, 885, (outs gprc:$RST), (ins gprc:$A, gprc:$B),
3811 "ldcix $RST, $A, $B", IIC_LdStLoad, []>;
3812
3813def STBCIX : XForm_base_r3xo<31, 981, (outs), (ins gprc:$RST, gprc:$A, gprc:$B),
3814 "stbcix $RST, $A, $B", IIC_LdStLoad, []>;
3815def STHCIX : XForm_base_r3xo<31, 949, (outs), (ins gprc:$RST, gprc:$A, gprc:$B),
3816 "sthcix $RST, $A, $B", IIC_LdStLoad, []>;
3817def STWCIX : XForm_base_r3xo<31, 917, (outs), (ins gprc:$RST, gprc:$A, gprc:$B),
3818 "stwcix $RST, $A, $B", IIC_LdStLoad, []>;
3819def STDCIX : XForm_base_r3xo<31, 1013, (outs), (ins gprc:$RST, gprc:$A, gprc:$B),
3820 "stdcix $RST, $A, $B", IIC_LdStLoad, []>;
3821
Ulrich Weigandd8394902013-05-03 19:50:27 +00003822//===----------------------------------------------------------------------===//
3823// PowerPC Assembler Instruction Aliases
3824//
3825
3826// Pseudo-instructions for alternate assembly syntax (never used by codegen).
3827// These are aliases that require C++ handling to convert to the target
3828// instruction, while InstAliases can be handled directly by tblgen.
3829class PPCAsmPseudo<string asm, dag iops>
3830 : Instruction {
3831 let Namespace = "PPC";
3832 bit PPC64 = 0; // Default value, override with isPPC64
3833
3834 let OutOperandList = (outs);
3835 let InOperandList = iops;
3836 let Pattern = [];
3837 let AsmString = asm;
3838 let isAsmParserOnly = 1;
3839 let isPseudo = 1;
3840}
3841
Ulrich Weigand4c440322013-06-10 17:19:43 +00003842def : InstAlias<"sc", (SC 0)>;
3843
Hal Finkelfe3368c2014-10-02 22:34:22 +00003844def : InstAlias<"sync", (SYNC 0)>, Requires<[HasSYNC]>;
Hal Finkeld86e90a2015-04-23 23:05:08 +00003845def : InstAlias<"msync", (SYNC 0), 0>, Requires<[HasSYNC]>;
Hal Finkelfe3368c2014-10-02 22:34:22 +00003846def : InstAlias<"lwsync", (SYNC 1)>, Requires<[HasSYNC]>;
3847def : InstAlias<"ptesync", (SYNC 2)>, Requires<[HasSYNC]>;
Ulrich Weigand797f1a32013-07-01 16:37:52 +00003848
Ulrich Weigand7a9fcdf2013-07-01 17:21:23 +00003849def : InstAlias<"wait", (WAIT 0)>;
3850def : InstAlias<"waitrsv", (WAIT 1)>;
3851def : InstAlias<"waitimpl", (WAIT 2)>;
3852
Joerg Sonnenberger24507682014-07-29 23:31:27 +00003853def : InstAlias<"mbar", (MBAR 0)>, Requires<[IsBookE]>;
3854
Hal Finkelfefcfff2015-04-23 22:47:57 +00003855def DCBTx : PPCAsmPseudo<"dcbt $dst", (ins memrr:$dst)>;
3856def DCBTSTx : PPCAsmPseudo<"dcbtst $dst", (ins memrr:$dst)>;
3857
3858def DCBTCT : PPCAsmPseudo<"dcbtct $dst, $TH", (ins memrr:$dst, u5imm:$TH)>;
3859def DCBTDS : PPCAsmPseudo<"dcbtds $dst, $TH", (ins memrr:$dst, u5imm:$TH)>;
3860def DCBTT : PPCAsmPseudo<"dcbtt $dst", (ins memrr:$dst)>;
3861
3862def DCBTSTCT : PPCAsmPseudo<"dcbtstct $dst, $TH", (ins memrr:$dst, u5imm:$TH)>;
3863def DCBTSTDS : PPCAsmPseudo<"dcbtstds $dst, $TH", (ins memrr:$dst, u5imm:$TH)>;
3864def DCBTSTT : PPCAsmPseudo<"dcbtstt $dst", (ins memrr:$dst)>;
3865
Hal Finkel277736e2016-09-02 23:41:54 +00003866def DCBFx : PPCAsmPseudo<"dcbf $dst", (ins memrr:$dst)>;
3867def DCBFL : PPCAsmPseudo<"dcbfl $dst", (ins memrr:$dst)>;
3868def DCBFLP : PPCAsmPseudo<"dcbflp $dst", (ins memrr:$dst)>;
3869
Ulrich Weigand85c6f7f2013-07-01 21:40:54 +00003870def : InstAlias<"crset $bx", (CREQV crbitrc:$bx, crbitrc:$bx, crbitrc:$bx)>;
3871def : InstAlias<"crclr $bx", (CRXOR crbitrc:$bx, crbitrc:$bx, crbitrc:$bx)>;
3872def : InstAlias<"crmove $bx, $by", (CROR crbitrc:$bx, crbitrc:$by, crbitrc:$by)>;
3873def : InstAlias<"crnot $bx, $by", (CRNOR crbitrc:$bx, crbitrc:$by, crbitrc:$by)>;
3874
Ulrich Weigandae9cf582013-07-03 12:32:41 +00003875def : InstAlias<"mtxer $Rx", (MTSPR 1, gprc:$Rx)>;
3876def : InstAlias<"mfxer $Rx", (MFSPR gprc:$Rx, 1)>;
3877
Joerg Sonnenberger853feaa2014-08-07 13:16:58 +00003878def : InstAlias<"mfrtcu $Rx", (MFSPR gprc:$Rx, 4)>;
3879def : InstAlias<"mfrtcl $Rx", (MFSPR gprc:$Rx, 5)>;
3880
Joerg Sonnenbergerb1ccf562014-07-29 18:55:43 +00003881def : InstAlias<"mtdscr $Rx", (MTSPR 17, gprc:$Rx)>;
3882def : InstAlias<"mfdscr $Rx", (MFSPR gprc:$Rx, 17)>;
3883
Joerg Sonnenberger053566a2014-07-29 22:42:44 +00003884def : InstAlias<"mtdsisr $Rx", (MTSPR 18, gprc:$Rx)>;
3885def : InstAlias<"mfdsisr $Rx", (MFSPR gprc:$Rx, 18)>;
Joerg Sonnenbergerb1ccf562014-07-29 18:55:43 +00003886
3887def : InstAlias<"mtdar $Rx", (MTSPR 19, gprc:$Rx)>;
3888def : InstAlias<"mfdar $Rx", (MFSPR gprc:$Rx, 19)>;
3889
3890def : InstAlias<"mtdec $Rx", (MTSPR 22, gprc:$Rx)>;
3891def : InstAlias<"mfdec $Rx", (MFSPR gprc:$Rx, 22)>;
3892
3893def : InstAlias<"mtsdr1 $Rx", (MTSPR 25, gprc:$Rx)>;
3894def : InstAlias<"mfsdr1 $Rx", (MFSPR gprc:$Rx, 25)>;
3895
3896def : InstAlias<"mtsrr0 $Rx", (MTSPR 26, gprc:$Rx)>;
3897def : InstAlias<"mfsrr0 $Rx", (MFSPR gprc:$Rx, 26)>;
3898
3899def : InstAlias<"mtsrr1 $Rx", (MTSPR 27, gprc:$Rx)>;
3900def : InstAlias<"mfsrr1 $Rx", (MFSPR gprc:$Rx, 27)>;
3901
Joerg Sonnenberger936a4c82014-08-05 14:53:05 +00003902def : InstAlias<"mtsrr2 $Rx", (MTSPR 990, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3903def : InstAlias<"mfsrr2 $Rx", (MFSPR gprc:$Rx, 990)>, Requires<[IsPPC4xx]>;
3904
3905def : InstAlias<"mtsrr3 $Rx", (MTSPR 991, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3906def : InstAlias<"mfsrr3 $Rx", (MFSPR gprc:$Rx, 991)>, Requires<[IsPPC4xx]>;
3907
Joerg Sonnenbergerb1ccf562014-07-29 18:55:43 +00003908def : InstAlias<"mtcfar $Rx", (MTSPR 28, gprc:$Rx)>;
3909def : InstAlias<"mfcfar $Rx", (MFSPR gprc:$Rx, 28)>;
3910
3911def : InstAlias<"mtamr $Rx", (MTSPR 29, gprc:$Rx)>;
3912def : InstAlias<"mfamr $Rx", (MFSPR gprc:$Rx, 29)>;
3913
Joerg Sonnenberger9e281bf2014-07-30 23:59:11 +00003914def : InstAlias<"mtpid $Rx", (MTSPR 48, gprc:$Rx)>, Requires<[IsBookE]>;
3915def : InstAlias<"mfpid $Rx", (MFSPR gprc:$Rx, 48)>, Requires<[IsBookE]>;
3916
Ulrich Weigande840ee22013-07-08 15:20:38 +00003917def : InstAlias<"mftb $Rx", (MFTB gprc:$Rx, 268)>;
Joerg Sonnenberger6e842b32014-08-04 20:28:34 +00003918def : InstAlias<"mftbl $Rx", (MFTB gprc:$Rx, 268)>;
Ulrich Weigande840ee22013-07-08 15:20:38 +00003919def : InstAlias<"mftbu $Rx", (MFTB gprc:$Rx, 269)>;
3920
Joerg Sonnenberger1837a7b2014-08-07 13:06:23 +00003921def : InstAlias<"mttbl $Rx", (MTSPR 284, gprc:$Rx)>;
3922def : InstAlias<"mttbu $Rx", (MTSPR 285, gprc:$Rx)>;
3923
Joerg Sonnenberger048284e2014-08-05 14:18:16 +00003924def : InstAlias<"mftblo $Rx", (MFSPR gprc:$Rx, 989)>, Requires<[IsPPC4xx]>;
3925def : InstAlias<"mttblo $Rx", (MTSPR 989, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3926def : InstAlias<"mftbhi $Rx", (MFSPR gprc:$Rx, 988)>, Requires<[IsPPC4xx]>;
3927def : InstAlias<"mttbhi $Rx", (MTSPR 988, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3928
Ulrich Weigand6ca71572013-06-24 18:08:03 +00003929def : InstAlias<"xnop", (XORI R0, R0, 0)>;
3930
Ulrich Weigandd8394902013-05-03 19:50:27 +00003931def : InstAlias<"mr $rA, $rB", (OR8 g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
Ulrich Weigand6ca71572013-06-24 18:08:03 +00003932def : InstAlias<"mr. $rA, $rB", (OR8o g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
3933
3934def : InstAlias<"not $rA, $rB", (NOR8 g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
3935def : InstAlias<"not. $rA, $rB", (NOR8o g8rc:$rA, g8rc:$rB, g8rc:$rB)>;
3936
Ulrich Weigand49f487e2013-07-03 17:59:07 +00003937def : InstAlias<"mtcr $rA", (MTCRF8 255, g8rc:$rA)>;
3938
Joerg Sonnenberger74052102014-08-04 17:07:41 +00003939foreach BATR = 0-3 in {
3940 def : InstAlias<"mtdbatu "#BATR#", $Rx",
3941 (MTSPR !add(BATR, !add(BATR, 536)), gprc:$Rx)>,
3942 Requires<[IsPPC6xx]>;
3943 def : InstAlias<"mfdbatu $Rx, "#BATR,
3944 (MFSPR gprc:$Rx, !add(BATR, !add(BATR, 536)))>,
3945 Requires<[IsPPC6xx]>;
3946 def : InstAlias<"mtdbatl "#BATR#", $Rx",
3947 (MTSPR !add(BATR, !add(BATR, 537)), gprc:$Rx)>,
3948 Requires<[IsPPC6xx]>;
3949 def : InstAlias<"mfdbatl $Rx, "#BATR,
3950 (MFSPR gprc:$Rx, !add(BATR, !add(BATR, 537)))>,
3951 Requires<[IsPPC6xx]>;
3952 def : InstAlias<"mtibatu "#BATR#", $Rx",
3953 (MTSPR !add(BATR, !add(BATR, 528)), gprc:$Rx)>,
3954 Requires<[IsPPC6xx]>;
3955 def : InstAlias<"mfibatu $Rx, "#BATR,
3956 (MFSPR gprc:$Rx, !add(BATR, !add(BATR, 528)))>,
3957 Requires<[IsPPC6xx]>;
3958 def : InstAlias<"mtibatl "#BATR#", $Rx",
3959 (MTSPR !add(BATR, !add(BATR, 529)), gprc:$Rx)>,
3960 Requires<[IsPPC6xx]>;
3961 def : InstAlias<"mfibatl $Rx, "#BATR,
3962 (MFSPR gprc:$Rx, !add(BATR, !add(BATR, 529)))>,
3963 Requires<[IsPPC6xx]>;
3964}
3965
Joerg Sonnenbergerc4ce4292014-08-05 15:45:15 +00003966foreach BR = 0-7 in {
3967 def : InstAlias<"mfbr"#BR#" $Rx",
3968 (MFDCR gprc:$Rx, !add(BR, 0x80))>,
3969 Requires<[IsPPC4xx]>;
3970 def : InstAlias<"mtbr"#BR#" $Rx",
3971 (MTDCR gprc:$Rx, !add(BR, 0x80))>,
3972 Requires<[IsPPC4xx]>;
3973}
3974
Joerg Sonnenberger51cf7332014-08-04 22:56:42 +00003975def : InstAlias<"mtdccr $Rx", (MTSPR 1018, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3976def : InstAlias<"mfdccr $Rx", (MFSPR gprc:$Rx, 1018)>, Requires<[IsPPC4xx]>;
3977
3978def : InstAlias<"mticcr $Rx", (MTSPR 1019, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3979def : InstAlias<"mficcr $Rx", (MFSPR gprc:$Rx, 1019)>, Requires<[IsPPC4xx]>;
3980
3981def : InstAlias<"mtdear $Rx", (MTSPR 981, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3982def : InstAlias<"mfdear $Rx", (MFSPR gprc:$Rx, 981)>, Requires<[IsPPC4xx]>;
3983
3984def : InstAlias<"mtesr $Rx", (MTSPR 980, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3985def : InstAlias<"mfesr $Rx", (MFSPR gprc:$Rx, 980)>, Requires<[IsPPC4xx]>;
3986
Joerg Sonnenberger39f095a2014-08-07 12:18:21 +00003987def : InstAlias<"mfspefscr $Rx", (MFSPR gprc:$Rx, 512)>;
3988def : InstAlias<"mtspefscr $Rx", (MTSPR 512, gprc:$Rx)>;
3989
Joerg Sonnenberger755ffa92014-08-04 23:53:42 +00003990def : InstAlias<"mttcr $Rx", (MTSPR 986, gprc:$Rx)>, Requires<[IsPPC4xx]>;
3991def : InstAlias<"mftcr $Rx", (MFSPR gprc:$Rx, 986)>, Requires<[IsPPC4xx]>;
3992
Ulrich Weigand6ca71572013-06-24 18:08:03 +00003993def LAx : PPCAsmPseudo<"la $rA, $addr", (ins gprc:$rA, memri:$addr)>;
Ulrich Weigandd8394902013-05-03 19:50:27 +00003994
Ulrich Weigand4069e242013-06-25 13:16:48 +00003995def SUBI : PPCAsmPseudo<"subi $rA, $rB, $imm",
3996 (ins gprc:$rA, gprc:$rB, s16imm:$imm)>;
3997def SUBIS : PPCAsmPseudo<"subis $rA, $rB, $imm",
3998 (ins gprc:$rA, gprc:$rB, s16imm:$imm)>;
3999def SUBIC : PPCAsmPseudo<"subic $rA, $rB, $imm",
4000 (ins gprc:$rA, gprc:$rB, s16imm:$imm)>;
4001def SUBICo : PPCAsmPseudo<"subic. $rA, $rB, $imm",
4002 (ins gprc:$rA, gprc:$rB, s16imm:$imm)>;
4003
4004def : InstAlias<"sub $rA, $rB, $rC", (SUBF8 g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
4005def : InstAlias<"sub. $rA, $rB, $rC", (SUBF8o g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
4006def : InstAlias<"subc $rA, $rB, $rC", (SUBFC8 g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
4007def : InstAlias<"subc. $rA, $rB, $rC", (SUBFC8o g8rc:$rA, g8rc:$rC, g8rc:$rB)>;
4008
Roman Divacky62cb6352013-09-12 17:50:54 +00004009def : InstAlias<"mtmsrd $RS", (MTMSRD gprc:$RS, 0)>;
4010def : InstAlias<"mtmsr $RS", (MTMSR gprc:$RS, 0)>;
4011
Joerg Sonnenberger84d35df2014-08-07 13:35:34 +00004012def : InstAlias<"mfasr $RT", (MFSPR gprc:$RT, 280)>;
4013def : InstAlias<"mtasr $RT", (MTSPR 280, gprc:$RT)>;
4014
Joerg Sonnenberger5002fb52014-08-04 17:26:15 +00004015foreach SPRG = 0-3 in {
4016 def : InstAlias<"mfsprg $RT, "#SPRG, (MFSPR gprc:$RT, !add(SPRG, 272))>;
4017 def : InstAlias<"mfsprg"#SPRG#" $RT", (MFSPR gprc:$RT, !add(SPRG, 272))>;
4018 def : InstAlias<"mtsprg "#SPRG#", $RT", (MTSPR !add(SPRG, 272), gprc:$RT)>;
4019 def : InstAlias<"mtsprg"#SPRG#" $RT", (MTSPR !add(SPRG, 272), gprc:$RT)>;
4020}
4021foreach SPRG = 4-7 in {
4022 def : InstAlias<"mfsprg $RT, "#SPRG, (MFSPR gprc:$RT, !add(SPRG, 256))>,
4023 Requires<[IsBookE]>;
4024 def : InstAlias<"mfsprg"#SPRG#" $RT", (MFSPR gprc:$RT, !add(SPRG, 256))>,
4025 Requires<[IsBookE]>;
4026 def : InstAlias<"mtsprg "#SPRG#", $RT", (MTSPR !add(SPRG, 256), gprc:$RT)>,
4027 Requires<[IsBookE]>;
4028 def : InstAlias<"mtsprg"#SPRG#" $RT", (MTSPR !add(SPRG, 256), gprc:$RT)>,
4029 Requires<[IsBookE]>;
4030}
Roman Divacky62cb6352013-09-12 17:50:54 +00004031
4032def : InstAlias<"mtasr $RS", (MTSPR 280, gprc:$RS)>;
4033
4034def : InstAlias<"mfdec $RT", (MFSPR gprc:$RT, 22)>;
4035def : InstAlias<"mtdec $RT", (MTSPR 22, gprc:$RT)>;
4036
4037def : InstAlias<"mfpvr $RT", (MFSPR gprc:$RT, 287)>;
4038
4039def : InstAlias<"mfsdr1 $RT", (MFSPR gprc:$RT, 25)>;
4040def : InstAlias<"mtsdr1 $RT", (MTSPR 25, gprc:$RT)>;
4041
4042def : InstAlias<"mfsrr0 $RT", (MFSPR gprc:$RT, 26)>;
4043def : InstAlias<"mfsrr1 $RT", (MFSPR gprc:$RT, 27)>;
4044def : InstAlias<"mtsrr0 $RT", (MTSPR 26, gprc:$RT)>;
4045def : InstAlias<"mtsrr1 $RT", (MTSPR 27, gprc:$RT)>;
4046
4047def : InstAlias<"tlbie $RB", (TLBIE R0, gprc:$RB)>;
4048
Joerg Sonnenberger6c3e3852014-08-04 21:28:22 +00004049def : InstAlias<"tlbrehi $RS, $A", (TLBRE2 gprc:$RS, gprc:$A, 0)>,
4050 Requires<[IsPPC4xx]>;
4051def : InstAlias<"tlbrelo $RS, $A", (TLBRE2 gprc:$RS, gprc:$A, 1)>,
4052 Requires<[IsPPC4xx]>;
4053def : InstAlias<"tlbwehi $RS, $A", (TLBWE2 gprc:$RS, gprc:$A, 0)>,
4054 Requires<[IsPPC4xx]>;
4055def : InstAlias<"tlbwelo $RS, $A", (TLBWE2 gprc:$RS, gprc:$A, 1)>,
4056 Requires<[IsPPC4xx]>;
4057
Ulrich Weigandad873cd2013-06-25 13:17:41 +00004058def EXTLWI : PPCAsmPseudo<"extlwi $rA, $rS, $n, $b",
4059 (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
4060def EXTLWIo : PPCAsmPseudo<"extlwi. $rA, $rS, $n, $b",
4061 (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
4062def EXTRWI : PPCAsmPseudo<"extrwi $rA, $rS, $n, $b",
4063 (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
4064def EXTRWIo : PPCAsmPseudo<"extrwi. $rA, $rS, $n, $b",
4065 (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
4066def INSLWI : PPCAsmPseudo<"inslwi $rA, $rS, $n, $b",
4067 (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
4068def INSLWIo : PPCAsmPseudo<"inslwi. $rA, $rS, $n, $b",
4069 (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
4070def INSRWI : PPCAsmPseudo<"insrwi $rA, $rS, $n, $b",
4071 (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
4072def INSRWIo : PPCAsmPseudo<"insrwi. $rA, $rS, $n, $b",
4073 (ins gprc:$rA, gprc:$rS, u5imm:$n, u5imm:$b)>;
4074def ROTRWI : PPCAsmPseudo<"rotrwi $rA, $rS, $n",
4075 (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
4076def ROTRWIo : PPCAsmPseudo<"rotrwi. $rA, $rS, $n",
4077 (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
Ulrich Weigandd8394902013-05-03 19:50:27 +00004078def SLWI : PPCAsmPseudo<"slwi $rA, $rS, $n",
4079 (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
Ulrich Weigandad873cd2013-06-25 13:17:41 +00004080def SLWIo : PPCAsmPseudo<"slwi. $rA, $rS, $n",
4081 (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
Ulrich Weigandd8394902013-05-03 19:50:27 +00004082def SRWI : PPCAsmPseudo<"srwi $rA, $rS, $n",
4083 (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
Ulrich Weigandad873cd2013-06-25 13:17:41 +00004084def SRWIo : PPCAsmPseudo<"srwi. $rA, $rS, $n",
4085 (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
4086def CLRRWI : PPCAsmPseudo<"clrrwi $rA, $rS, $n",
4087 (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
4088def CLRRWIo : PPCAsmPseudo<"clrrwi. $rA, $rS, $n",
4089 (ins gprc:$rA, gprc:$rS, u5imm:$n)>;
4090def CLRLSLWI : PPCAsmPseudo<"clrlslwi $rA, $rS, $b, $n",
4091 (ins gprc:$rA, gprc:$rS, u5imm:$b, u5imm:$n)>;
4092def CLRLSLWIo : PPCAsmPseudo<"clrlslwi. $rA, $rS, $b, $n",
4093 (ins gprc:$rA, gprc:$rS, u5imm:$b, u5imm:$n)>;
4094
4095def : InstAlias<"rotlwi $rA, $rS, $n", (RLWINM gprc:$rA, gprc:$rS, u5imm:$n, 0, 31)>;
4096def : InstAlias<"rotlwi. $rA, $rS, $n", (RLWINMo gprc:$rA, gprc:$rS, u5imm:$n, 0, 31)>;
4097def : InstAlias<"rotlw $rA, $rS, $rB", (RLWNM gprc:$rA, gprc:$rS, gprc:$rB, 0, 31)>;
4098def : InstAlias<"rotlw. $rA, $rS, $rB", (RLWNMo gprc:$rA, gprc:$rS, gprc:$rB, 0, 31)>;
4099def : InstAlias<"clrlwi $rA, $rS, $n", (RLWINM gprc:$rA, gprc:$rS, 0, u5imm:$n, 31)>;
4100def : InstAlias<"clrlwi. $rA, $rS, $n", (RLWINMo gprc:$rA, gprc:$rS, 0, u5imm:$n, 31)>;
4101
Hal Finkelf4052342015-10-28 03:26:45 +00004102def : InstAlias<"cntlzw $rA, $rS", (CNTLZW gprc:$rA, gprc:$rS)>;
4103def : InstAlias<"cntlzw. $rA, $rS", (CNTLZWo gprc:$rA, gprc:$rS)>;
4104// The POWER variant
4105def : MnemonicAlias<"cntlz", "cntlzw">;
4106def : MnemonicAlias<"cntlz.", "cntlzw.">;
Hal Finkel57c6ac5e2015-02-10 18:45:02 +00004107
Ulrich Weigandad873cd2013-06-25 13:17:41 +00004108def EXTLDI : PPCAsmPseudo<"extldi $rA, $rS, $n, $b",
4109 (ins g8rc:$rA, g8rc:$rS, u6imm:$n, u6imm:$b)>;
4110def EXTLDIo : PPCAsmPseudo<"extldi. $rA, $rS, $n, $b",
4111 (ins g8rc:$rA, g8rc:$rS, u6imm:$n, u6imm:$b)>;
4112def EXTRDI : PPCAsmPseudo<"extrdi $rA, $rS, $n, $b",
4113 (ins g8rc:$rA, g8rc:$rS, u6imm:$n, u6imm:$b)>;
4114def EXTRDIo : PPCAsmPseudo<"extrdi. $rA, $rS, $n, $b",
4115 (ins g8rc:$rA, g8rc:$rS, u6imm:$n, u6imm:$b)>;
4116def INSRDI : PPCAsmPseudo<"insrdi $rA, $rS, $n, $b",
4117 (ins g8rc:$rA, g8rc:$rS, u6imm:$n, u6imm:$b)>;
4118def INSRDIo : PPCAsmPseudo<"insrdi. $rA, $rS, $n, $b",
4119 (ins g8rc:$rA, g8rc:$rS, u6imm:$n, u6imm:$b)>;
4120def ROTRDI : PPCAsmPseudo<"rotrdi $rA, $rS, $n",
4121 (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
4122def ROTRDIo : PPCAsmPseudo<"rotrdi. $rA, $rS, $n",
4123 (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
Ulrich Weigandd8394902013-05-03 19:50:27 +00004124def SLDI : PPCAsmPseudo<"sldi $rA, $rS, $n",
4125 (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
Ulrich Weigandad873cd2013-06-25 13:17:41 +00004126def SLDIo : PPCAsmPseudo<"sldi. $rA, $rS, $n",
4127 (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
Ulrich Weigandd8394902013-05-03 19:50:27 +00004128def SRDI : PPCAsmPseudo<"srdi $rA, $rS, $n",
4129 (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
Ulrich Weigandad873cd2013-06-25 13:17:41 +00004130def SRDIo : PPCAsmPseudo<"srdi. $rA, $rS, $n",
4131 (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
4132def CLRRDI : PPCAsmPseudo<"clrrdi $rA, $rS, $n",
4133 (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
4134def CLRRDIo : PPCAsmPseudo<"clrrdi. $rA, $rS, $n",
4135 (ins g8rc:$rA, g8rc:$rS, u6imm:$n)>;
4136def CLRLSLDI : PPCAsmPseudo<"clrlsldi $rA, $rS, $b, $n",
4137 (ins g8rc:$rA, g8rc:$rS, u6imm:$b, u6imm:$n)>;
4138def CLRLSLDIo : PPCAsmPseudo<"clrlsldi. $rA, $rS, $b, $n",
4139 (ins g8rc:$rA, g8rc:$rS, u6imm:$b, u6imm:$n)>;
4140
4141def : InstAlias<"rotldi $rA, $rS, $n", (RLDICL g8rc:$rA, g8rc:$rS, u6imm:$n, 0)>;
4142def : InstAlias<"rotldi. $rA, $rS, $n", (RLDICLo g8rc:$rA, g8rc:$rS, u6imm:$n, 0)>;
4143def : InstAlias<"rotld $rA, $rS, $rB", (RLDCL g8rc:$rA, g8rc:$rS, gprc:$rB, 0)>;
4144def : InstAlias<"rotld. $rA, $rS, $rB", (RLDCLo g8rc:$rA, g8rc:$rS, gprc:$rB, 0)>;
4145def : InstAlias<"clrldi $rA, $rS, $n", (RLDICL g8rc:$rA, g8rc:$rS, 0, u6imm:$n)>;
4146def : InstAlias<"clrldi. $rA, $rS, $n", (RLDICLo g8rc:$rA, g8rc:$rS, 0, u6imm:$n)>;
Ulrich Weigandd8394902013-05-03 19:50:27 +00004147
Hal Finkel6e9110a2015-03-28 19:42:41 +00004148def RLWINMbm : PPCAsmPseudo<"rlwinm $rA, $rS, $n, $b",
4149 (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>;
4150def RLWINMobm : PPCAsmPseudo<"rlwinm. $rA, $rS, $n, $b",
4151 (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>;
4152def RLWIMIbm : PPCAsmPseudo<"rlwimi $rA, $rS, $n, $b",
4153 (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>;
4154def RLWIMIobm : PPCAsmPseudo<"rlwimi. $rA, $rS, $n, $b",
4155 (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>;
4156def RLWNMbm : PPCAsmPseudo<"rlwnm $rA, $rS, $n, $b",
4157 (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>;
4158def RLWNMobm : PPCAsmPseudo<"rlwnm. $rA, $rS, $n, $b",
4159 (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>;
4160
Ulrich Weigand824b7d82013-06-24 11:55:21 +00004161// These generic branch instruction forms are used for the assembler parser only.
4162// Defs and Uses are conservative, since we don't know the BO value.
4163let PPC970_Unit = 7 in {
4164 let Defs = [CTR], Uses = [CTR, RM] in {
4165 def gBC : BForm_3<16, 0, 0, (outs),
4166 (ins u5imm:$bo, crbitrc:$bi, condbrtarget:$dst),
4167 "bc $bo, $bi, $dst">;
4168 def gBCA : BForm_3<16, 1, 0, (outs),
4169 (ins u5imm:$bo, crbitrc:$bi, abscondbrtarget:$dst),
4170 "bca $bo, $bi, $dst">;
Hal Finkel522e4d92016-09-03 02:31:44 +00004171 let isAsmParserOnly = 1 in {
4172 def gBCat : BForm_3_at<16, 0, 0, (outs),
4173 (ins u5imm:$bo, atimm:$at, crbitrc:$bi,
4174 condbrtarget:$dst),
4175 "bc$at $bo, $bi, $dst">;
4176 def gBCAat : BForm_3_at<16, 1, 0, (outs),
4177 (ins u5imm:$bo, atimm:$at, crbitrc:$bi,
4178 abscondbrtarget:$dst),
4179 "bca$at $bo, $bi, $dst">;
4180 } // isAsmParserOnly = 1
Ulrich Weigand824b7d82013-06-24 11:55:21 +00004181 }
4182 let Defs = [LR, CTR], Uses = [CTR, RM] in {
4183 def gBCL : BForm_3<16, 0, 1, (outs),
4184 (ins u5imm:$bo, crbitrc:$bi, condbrtarget:$dst),
4185 "bcl $bo, $bi, $dst">;
4186 def gBCLA : BForm_3<16, 1, 1, (outs),
4187 (ins u5imm:$bo, crbitrc:$bi, abscondbrtarget:$dst),
4188 "bcla $bo, $bi, $dst">;
Hal Finkel522e4d92016-09-03 02:31:44 +00004189 let isAsmParserOnly = 1 in {
4190 def gBCLat : BForm_3_at<16, 0, 1, (outs),
4191 (ins u5imm:$bo, atimm:$at, crbitrc:$bi,
4192 condbrtarget:$dst),
4193 "bcl$at $bo, $bi, $dst">;
4194 def gBCLAat : BForm_3_at<16, 1, 1, (outs),
4195 (ins u5imm:$bo, atimm:$at, crbitrc:$bi,
4196 abscondbrtarget:$dst),
4197 "bcla$at $bo, $bi, $dst">;
4198 } // // isAsmParserOnly = 1
Ulrich Weigand824b7d82013-06-24 11:55:21 +00004199 }
4200 let Defs = [CTR], Uses = [CTR, LR, RM] in
4201 def gBCLR : XLForm_2<19, 16, 0, (outs),
4202 (ins u5imm:$bo, crbitrc:$bi, i32imm:$bh),
Hal Finkel3e5a3602013-11-27 23:26:09 +00004203 "bclr $bo, $bi, $bh", IIC_BrB, []>;
Ulrich Weigand824b7d82013-06-24 11:55:21 +00004204 let Defs = [LR, CTR], Uses = [CTR, LR, RM] in
4205 def gBCLRL : XLForm_2<19, 16, 1, (outs),
4206 (ins u5imm:$bo, crbitrc:$bi, i32imm:$bh),
Hal Finkel3e5a3602013-11-27 23:26:09 +00004207 "bclrl $bo, $bi, $bh", IIC_BrB, []>;
Ulrich Weigand824b7d82013-06-24 11:55:21 +00004208 let Defs = [CTR], Uses = [CTR, LR, RM] in
4209 def gBCCTR : XLForm_2<19, 528, 0, (outs),
4210 (ins u5imm:$bo, crbitrc:$bi, i32imm:$bh),
Hal Finkel3e5a3602013-11-27 23:26:09 +00004211 "bcctr $bo, $bi, $bh", IIC_BrB, []>;
Ulrich Weigand824b7d82013-06-24 11:55:21 +00004212 let Defs = [LR, CTR], Uses = [CTR, LR, RM] in
4213 def gBCCTRL : XLForm_2<19, 528, 1, (outs),
4214 (ins u5imm:$bo, crbitrc:$bi, i32imm:$bh),
Hal Finkel3e5a3602013-11-27 23:26:09 +00004215 "bcctrl $bo, $bi, $bh", IIC_BrB, []>;
Ulrich Weigand824b7d82013-06-24 11:55:21 +00004216}
Hal Finkel522e4d92016-09-03 02:31:44 +00004217
4218multiclass BranchSimpleMnemonicAT<string pm, int at> {
4219 def : InstAlias<"bc"#pm#" $bo, $bi, $dst", (gBCat u5imm:$bo, at, crbitrc:$bi,
4220 condbrtarget:$dst)>;
4221 def : InstAlias<"bca"#pm#" $bo, $bi, $dst", (gBCAat u5imm:$bo, at, crbitrc:$bi,
4222 condbrtarget:$dst)>;
4223 def : InstAlias<"bcl"#pm#" $bo, $bi, $dst", (gBCLat u5imm:$bo, at, crbitrc:$bi,
4224 condbrtarget:$dst)>;
4225 def : InstAlias<"bcla"#pm#" $bo, $bi, $dst", (gBCLAat u5imm:$bo, at, crbitrc:$bi,
4226 condbrtarget:$dst)>;
4227}
4228defm : BranchSimpleMnemonicAT<"+", 3>;
4229defm : BranchSimpleMnemonicAT<"-", 2>;
4230
Ulrich Weigand824b7d82013-06-24 11:55:21 +00004231def : InstAlias<"bclr $bo, $bi", (gBCLR u5imm:$bo, crbitrc:$bi, 0)>;
4232def : InstAlias<"bclrl $bo, $bi", (gBCLRL u5imm:$bo, crbitrc:$bi, 0)>;
4233def : InstAlias<"bcctr $bo, $bi", (gBCCTR u5imm:$bo, crbitrc:$bi, 0)>;
4234def : InstAlias<"bcctrl $bo, $bi", (gBCCTRL u5imm:$bo, crbitrc:$bi, 0)>;
4235
Ulrich Weigand86247b62013-06-24 16:52:04 +00004236multiclass BranchSimpleMnemonic1<string name, string pm, int bo> {
4237 def : InstAlias<"b"#name#pm#" $bi, $dst", (gBC bo, crbitrc:$bi, condbrtarget:$dst)>;
4238 def : InstAlias<"b"#name#"a"#pm#" $bi, $dst", (gBCA bo, crbitrc:$bi, abscondbrtarget:$dst)>;
4239 def : InstAlias<"b"#name#"lr"#pm#" $bi", (gBCLR bo, crbitrc:$bi, 0)>;
4240 def : InstAlias<"b"#name#"l"#pm#" $bi, $dst", (gBCL bo, crbitrc:$bi, condbrtarget:$dst)>;
4241 def : InstAlias<"b"#name#"la"#pm#" $bi, $dst", (gBCLA bo, crbitrc:$bi, abscondbrtarget:$dst)>;
4242 def : InstAlias<"b"#name#"lrl"#pm#" $bi", (gBCLRL bo, crbitrc:$bi, 0)>;
Ulrich Weigandfedd5a72013-06-24 12:49:20 +00004243}
Ulrich Weigand86247b62013-06-24 16:52:04 +00004244multiclass BranchSimpleMnemonic2<string name, string pm, int bo>
4245 : BranchSimpleMnemonic1<name, pm, bo> {
4246 def : InstAlias<"b"#name#"ctr"#pm#" $bi", (gBCCTR bo, crbitrc:$bi, 0)>;
4247 def : InstAlias<"b"#name#"ctrl"#pm#" $bi", (gBCCTRL bo, crbitrc:$bi, 0)>;
Ulrich Weigandfedd5a72013-06-24 12:49:20 +00004248}
Ulrich Weigand86247b62013-06-24 16:52:04 +00004249defm : BranchSimpleMnemonic2<"t", "", 12>;
4250defm : BranchSimpleMnemonic2<"f", "", 4>;
4251defm : BranchSimpleMnemonic2<"t", "-", 14>;
4252defm : BranchSimpleMnemonic2<"f", "-", 6>;
4253defm : BranchSimpleMnemonic2<"t", "+", 15>;
4254defm : BranchSimpleMnemonic2<"f", "+", 7>;
4255defm : BranchSimpleMnemonic1<"dnzt", "", 8>;
4256defm : BranchSimpleMnemonic1<"dnzf", "", 0>;
4257defm : BranchSimpleMnemonic1<"dzt", "", 10>;
4258defm : BranchSimpleMnemonic1<"dzf", "", 2>;
Ulrich Weigandfedd5a72013-06-24 12:49:20 +00004259
Ulrich Weigand86247b62013-06-24 16:52:04 +00004260multiclass BranchExtendedMnemonicPM<string name, string pm, int bibo> {
4261 def : InstAlias<"b"#name#pm#" $cc, $dst",
Ulrich Weigand39740622013-06-10 17:18:29 +00004262 (BCC bibo, crrc:$cc, condbrtarget:$dst)>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00004263 def : InstAlias<"b"#name#pm#" $dst",
Ulrich Weigandaa4a2d72013-06-10 17:19:15 +00004264 (BCC bibo, CR0, condbrtarget:$dst)>;
4265
Ulrich Weigand86247b62013-06-24 16:52:04 +00004266 def : InstAlias<"b"#name#"a"#pm#" $cc, $dst",
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00004267 (BCCA bibo, crrc:$cc, abscondbrtarget:$dst)>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00004268 def : InstAlias<"b"#name#"a"#pm#" $dst",
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00004269 (BCCA bibo, CR0, abscondbrtarget:$dst)>;
4270
Ulrich Weigand86247b62013-06-24 16:52:04 +00004271 def : InstAlias<"b"#name#"lr"#pm#" $cc",
Hal Finkel940ab932014-02-28 00:27:01 +00004272 (BCCLR bibo, crrc:$cc)>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00004273 def : InstAlias<"b"#name#"lr"#pm,
Hal Finkel940ab932014-02-28 00:27:01 +00004274 (BCCLR bibo, CR0)>;
Ulrich Weigandaa4a2d72013-06-10 17:19:15 +00004275
Ulrich Weigand86247b62013-06-24 16:52:04 +00004276 def : InstAlias<"b"#name#"ctr"#pm#" $cc",
Hal Finkel940ab932014-02-28 00:27:01 +00004277 (BCCCTR bibo, crrc:$cc)>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00004278 def : InstAlias<"b"#name#"ctr"#pm,
Hal Finkel940ab932014-02-28 00:27:01 +00004279 (BCCCTR bibo, CR0)>;
Ulrich Weigandaa4a2d72013-06-10 17:19:15 +00004280
Ulrich Weigand86247b62013-06-24 16:52:04 +00004281 def : InstAlias<"b"#name#"l"#pm#" $cc, $dst",
Ulrich Weigandd20e91e2013-06-24 11:02:19 +00004282 (BCCL bibo, crrc:$cc, condbrtarget:$dst)>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00004283 def : InstAlias<"b"#name#"l"#pm#" $dst",
Ulrich Weigandd20e91e2013-06-24 11:02:19 +00004284 (BCCL bibo, CR0, condbrtarget:$dst)>;
4285
Ulrich Weigand86247b62013-06-24 16:52:04 +00004286 def : InstAlias<"b"#name#"la"#pm#" $cc, $dst",
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00004287 (BCCLA bibo, crrc:$cc, abscondbrtarget:$dst)>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00004288 def : InstAlias<"b"#name#"la"#pm#" $dst",
Ulrich Weigandb6a30d12013-06-24 11:03:33 +00004289 (BCCLA bibo, CR0, abscondbrtarget:$dst)>;
4290
Ulrich Weigand86247b62013-06-24 16:52:04 +00004291 def : InstAlias<"b"#name#"lrl"#pm#" $cc",
Hal Finkel940ab932014-02-28 00:27:01 +00004292 (BCCLRL bibo, crrc:$cc)>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00004293 def : InstAlias<"b"#name#"lrl"#pm,
Hal Finkel940ab932014-02-28 00:27:01 +00004294 (BCCLRL bibo, CR0)>;
Ulrich Weigand1847bb82013-06-24 11:01:55 +00004295
Ulrich Weigand86247b62013-06-24 16:52:04 +00004296 def : InstAlias<"b"#name#"ctrl"#pm#" $cc",
Hal Finkel940ab932014-02-28 00:27:01 +00004297 (BCCCTRL bibo, crrc:$cc)>;
Ulrich Weigand86247b62013-06-24 16:52:04 +00004298 def : InstAlias<"b"#name#"ctrl"#pm,
Hal Finkel940ab932014-02-28 00:27:01 +00004299 (BCCCTRL bibo, CR0)>;
Ulrich Weigand39740622013-06-10 17:18:29 +00004300}
Ulrich Weigand86247b62013-06-24 16:52:04 +00004301multiclass BranchExtendedMnemonic<string name, int bibo> {
4302 defm : BranchExtendedMnemonicPM<name, "", bibo>;
4303 defm : BranchExtendedMnemonicPM<name, "-", !add(bibo, 2)>;
4304 defm : BranchExtendedMnemonicPM<name, "+", !add(bibo, 3)>;
4305}
Ulrich Weigand39740622013-06-10 17:18:29 +00004306defm : BranchExtendedMnemonic<"lt", 12>;
4307defm : BranchExtendedMnemonic<"gt", 44>;
4308defm : BranchExtendedMnemonic<"eq", 76>;
4309defm : BranchExtendedMnemonic<"un", 108>;
4310defm : BranchExtendedMnemonic<"so", 108>;
4311defm : BranchExtendedMnemonic<"ge", 4>;
4312defm : BranchExtendedMnemonic<"nl", 4>;
4313defm : BranchExtendedMnemonic<"le", 36>;
4314defm : BranchExtendedMnemonic<"ng", 36>;
4315defm : BranchExtendedMnemonic<"ne", 68>;
4316defm : BranchExtendedMnemonic<"nu", 100>;
4317defm : BranchExtendedMnemonic<"ns", 100>;
Ulrich Weigandd8394902013-05-03 19:50:27 +00004318
Ulrich Weigand865a1ef2013-06-20 16:15:12 +00004319def : InstAlias<"cmpwi $rA, $imm", (CMPWI CR0, gprc:$rA, s16imm:$imm)>;
4320def : InstAlias<"cmpw $rA, $rB", (CMPW CR0, gprc:$rA, gprc:$rB)>;
4321def : InstAlias<"cmplwi $rA, $imm", (CMPLWI CR0, gprc:$rA, u16imm:$imm)>;
4322def : InstAlias<"cmplw $rA, $rB", (CMPLW CR0, gprc:$rA, gprc:$rB)>;
Hal Finkel77c8dc12014-01-02 21:26:59 +00004323def : InstAlias<"cmpdi $rA, $imm", (CMPDI CR0, g8rc:$rA, s16imm64:$imm)>;
Ulrich Weigand865a1ef2013-06-20 16:15:12 +00004324def : InstAlias<"cmpd $rA, $rB", (CMPD CR0, g8rc:$rA, g8rc:$rB)>;
Hal Finkel77c8dc12014-01-02 21:26:59 +00004325def : InstAlias<"cmpldi $rA, $imm", (CMPLDI CR0, g8rc:$rA, u16imm64:$imm)>;
Ulrich Weigand865a1ef2013-06-20 16:15:12 +00004326def : InstAlias<"cmpld $rA, $rB", (CMPLD CR0, g8rc:$rA, g8rc:$rB)>;
4327
Ulrich Weigandc0944b52013-07-08 14:49:37 +00004328def : InstAlias<"cmpi $bf, 0, $rA, $imm", (CMPWI crrc:$bf, gprc:$rA, s16imm:$imm)>;
4329def : InstAlias<"cmp $bf, 0, $rA, $rB", (CMPW crrc:$bf, gprc:$rA, gprc:$rB)>;
4330def : InstAlias<"cmpli $bf, 0, $rA, $imm", (CMPLWI crrc:$bf, gprc:$rA, u16imm:$imm)>;
4331def : InstAlias<"cmpl $bf, 0, $rA, $rB", (CMPLW crrc:$bf, gprc:$rA, gprc:$rB)>;
Hal Finkel77c8dc12014-01-02 21:26:59 +00004332def : InstAlias<"cmpi $bf, 1, $rA, $imm", (CMPDI crrc:$bf, g8rc:$rA, s16imm64:$imm)>;
Ulrich Weigandc0944b52013-07-08 14:49:37 +00004333def : InstAlias<"cmp $bf, 1, $rA, $rB", (CMPD crrc:$bf, g8rc:$rA, g8rc:$rB)>;
Hal Finkel77c8dc12014-01-02 21:26:59 +00004334def : InstAlias<"cmpli $bf, 1, $rA, $imm", (CMPLDI crrc:$bf, g8rc:$rA, u16imm64:$imm)>;
Ulrich Weigandc0944b52013-07-08 14:49:37 +00004335def : InstAlias<"cmpl $bf, 1, $rA, $rB", (CMPLD crrc:$bf, g8rc:$rA, g8rc:$rB)>;
4336
Ulrich Weigand56b0e7b2013-07-04 14:40:12 +00004337multiclass TrapExtendedMnemonic<string name, int to> {
4338 def : InstAlias<"td"#name#"i $rA, $imm", (TDI to, g8rc:$rA, s16imm:$imm)>;
4339 def : InstAlias<"td"#name#" $rA, $rB", (TD to, g8rc:$rA, g8rc:$rB)>;
4340 def : InstAlias<"tw"#name#"i $rA, $imm", (TWI to, gprc:$rA, s16imm:$imm)>;
4341 def : InstAlias<"tw"#name#" $rA, $rB", (TW to, gprc:$rA, gprc:$rB)>;
4342}
4343defm : TrapExtendedMnemonic<"lt", 16>;
4344defm : TrapExtendedMnemonic<"le", 20>;
4345defm : TrapExtendedMnemonic<"eq", 4>;
4346defm : TrapExtendedMnemonic<"ge", 12>;
4347defm : TrapExtendedMnemonic<"gt", 8>;
4348defm : TrapExtendedMnemonic<"nl", 12>;
4349defm : TrapExtendedMnemonic<"ne", 24>;
4350defm : TrapExtendedMnemonic<"ng", 20>;
4351defm : TrapExtendedMnemonic<"llt", 2>;
4352defm : TrapExtendedMnemonic<"lle", 6>;
4353defm : TrapExtendedMnemonic<"lge", 5>;
4354defm : TrapExtendedMnemonic<"lgt", 1>;
4355defm : TrapExtendedMnemonic<"lnl", 5>;
4356defm : TrapExtendedMnemonic<"lng", 6>;
4357defm : TrapExtendedMnemonic<"u", 31>;
Robin Morissete1ca44b2014-10-02 22:27:07 +00004358
4359// Atomic loads
4360def : Pat<(atomic_load_8 iaddr:$src), (LBZ memri:$src)>;
4361def : Pat<(atomic_load_16 iaddr:$src), (LHZ memri:$src)>;
4362def : Pat<(atomic_load_32 iaddr:$src), (LWZ memri:$src)>;
4363def : Pat<(atomic_load_8 xaddr:$src), (LBZX memrr:$src)>;
4364def : Pat<(atomic_load_16 xaddr:$src), (LHZX memrr:$src)>;
4365def : Pat<(atomic_load_32 xaddr:$src), (LWZX memrr:$src)>;
4366
4367// Atomic stores
4368def : Pat<(atomic_store_8 iaddr:$ptr, i32:$val), (STB gprc:$val, memri:$ptr)>;
4369def : Pat<(atomic_store_16 iaddr:$ptr, i32:$val), (STH gprc:$val, memri:$ptr)>;
4370def : Pat<(atomic_store_32 iaddr:$ptr, i32:$val), (STW gprc:$val, memri:$ptr)>;
4371def : Pat<(atomic_store_8 xaddr:$ptr, i32:$val), (STBX gprc:$val, memrr:$ptr)>;
4372def : Pat<(atomic_store_16 xaddr:$ptr, i32:$val), (STHX gprc:$val, memrr:$ptr)>;
4373def : Pat<(atomic_store_32 xaddr:$ptr, i32:$val), (STWX gprc:$val, memrr:$ptr)>;
Chuang-Yu Chengeaf4b3d2016-04-06 01:46:45 +00004374
4375let Predicates = [IsISA3_0] in {
4376
4377// Copy-Paste Facility
4378// We prefix 'CP' to COPY due to name conflict in Target.td. We also prefix to
4379// PASTE for naming consistency.
4380let mayLoad = 1 in
4381def CP_COPY : X_L1_RA5_RB5<31, 774, "copy" , gprc, IIC_LdStCOPY, []>;
4382
4383let mayStore = 1 in
4384def CP_PASTE : X_L1_RA5_RB5<31, 902, "paste" , gprc, IIC_LdStPASTE, []>;
4385
4386let mayStore = 1, Defs = [CR0] in
4387def CP_PASTEo : X_L1_RA5_RB5<31, 902, "paste.", gprc, IIC_LdStPASTE, []>, isDOT;
4388
4389def CP_COPYx : PPCAsmPseudo<"copy $rA, $rB" , (ins gprc:$rA, gprc:$rB)>;
4390def CP_PASTEx : PPCAsmPseudo<"paste $rA, $rB", (ins gprc:$rA, gprc:$rB)>;
4391def CP_COPY_FIRST : PPCAsmPseudo<"copy_first $rA, $rB",
4392 (ins gprc:$rA, gprc:$rB)>;
4393def CP_PASTE_LAST : PPCAsmPseudo<"paste_last $rA, $rB",
4394 (ins gprc:$rA, gprc:$rB)>;
4395def CP_ABORT : XForm_0<31, 838, (outs), (ins), "cp_abort", IIC_SprABORT, []>;
4396
4397// Message Synchronize
4398def MSGSYNC : XForm_0<31, 886, (outs), (ins), "msgsync", IIC_SprMSGSYNC, []>;
4399
4400// Power-Saving Mode Instruction:
4401def STOP : XForm_0<19, 370, (outs), (ins), "stop", IIC_SprSTOP, []>;
4402
4403} // IsISA3_0