1//=======-- PPCInstrSPE.td - The PowerPC SPE Extension -*- tablegen -*-=======//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the Signal Processing Engine extension to
11// the PowerPC instruction set.
12//
13//===----------------------------------------------------------------------===//
14
15class EFXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
16               InstrItinClass itin, list<dag> pattern> :
17               I<4, OOL, IOL, asmstr, itin> {
18  bits<5> RT;
19  bits<5> RA;
20  bits<5> RB;
21
22  let Pattern = pattern;
23
24  let Inst{6-10}  = RT;
25  let Inst{11-15} = RA;
26  let Inst{16-20} = RB;
27  let Inst{21-31} = xo;
28}
29
30class EFXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
31               InstrItinClass itin, list<dag> pattern> :
32               EFXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
33  let RB = 0;
34}
35
36class EFXForm_2a<bits<11> xo, dag OOL, dag IOL, string asmstr,
37               InstrItinClass itin, list<dag> pattern> :
38               EFXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
39  let RA = 0;
40}
41
42class EFXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
43              InstrItinClass itin> :
44              I<4, OOL, IOL, asmstr, itin> {
45  bits<3> crD;
46  bits<5> RA;
47  bits<5> RB;
48
49  let Inst{6-8}  = crD;
50  let Inst{9-10}  = 0;
51  let Inst{11-15} = RA;
52  let Inst{16-20} = RB;
53  let Inst{21-31} = xo;
54}
55
56class EVXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
57               InstrItinClass itin, list<dag> pattern> :
58               I<4, OOL, IOL, asmstr, itin> {
59  bits<5> RT;
60  bits<5> RA;
61  bits<5> RB;
62
63  let Pattern = pattern;
64
65  let Inst{6-10}  = RT;
66  let Inst{11-15} = RA;
67  let Inst{16-20} = RB;
68  let Inst{21-31} = xo;
69}
70
71class EVXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
72               InstrItinClass itin, list<dag> pattern> :
73               EVXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
74  let RB = 0;
75}
76
77class EVXForm_2a<bits<11> xo, dag OOL, dag IOL, string asmstr,
78               InstrItinClass itin, list<dag> pattern> :
79               EVXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
80  let RA = 0;
81}
82
83class EVXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
84              InstrItinClass itin, list<dag> pattern> :
85              I<4, OOL, IOL, asmstr, itin> {
86  bits<3> crD;
87  bits<5> RA;
88  bits<5> RB;
89
90  let Pattern = pattern;
91
92  let Inst{6-8}  = crD;
93  let Inst{9-10}  = 0;
94  let Inst{11-15} = RA;
95  let Inst{16-20} = RB;
96  let Inst{21-31} = xo;
97}
98
99class EVXForm_4<bits<8> xo, dag OOL, dag IOL, string asmstr,
100               InstrItinClass itin, list<dag> pattern> :
101               I<4, OOL, IOL, asmstr, itin> {
102  bits<3> crD;
103  bits<5> RA;
104  bits<5> RB;
105  bits<5> RT;
106
107  let Pattern = pattern;
108
109  let Inst{6-10}  = RT;
110  let Inst{11-15} = RA;
111  let Inst{16-20} = RB;
112  let Inst{21-28} = xo;
113  let Inst{29-31} = crD;
114}
115
116class EVXForm_D<bits<11> xo, dag OOL, dag IOL, string asmstr,
117               InstrItinClass itin, list<dag> pattern> :
118               I<4, OOL, IOL, asmstr, itin> {
119  bits<5> RT;
120  bits<21> D;
121
122  let Pattern = pattern;
123
124  let Inst{6-10}  = RT;
125  let Inst{20} = D{0};
126  let Inst{19} = D{1};
127  let Inst{18} = D{2};
128  let Inst{17} = D{3};
129  let Inst{16} = D{4};
130  let Inst{15} = D{5};
131  let Inst{14} = D{6};
132  let Inst{13} = D{7};
133  let Inst{12} = D{8};
134  let Inst{11} = D{9};
135  let Inst{11-20} = D{0-9};
136  let Inst{21-31} = xo;
137}
138
139let DecoderNamespace = "SPE", Predicates = [HasSPE] in {
140
141def BRINC          : EVXForm_1<527, (outs gprc:$RT), (ins gprc:$RA, gprc:$RB),
142                               "brinc $RT, $RA, $RB", IIC_IntSimple, []>;
143
144// Double-precision floating point
145def EFDABS         : EFXForm_2<740, (outs sperc:$RT), (ins sperc:$RA),
146                                "efdabs $RT, $RA", IIC_FPDGeneral,
147                                [(set f64:$RT, (fabs f64:$RA))]>;
148
149def EFDADD         : EFXForm_1<736, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
150                                "efdadd $RT, $RA, $RB", IIC_FPAddSub,
151                                [(set f64:$RT, (fadd f64:$RA, f64:$RB))]>;
152
153def EFDCFS         : EFXForm_2a<751, (outs sperc:$RT), (ins spe4rc:$RB),
154                                "efdcfs $RT, $RB", IIC_FPDGeneral,
155                                [(set f64:$RT, (fpextend f32:$RB))]>;
156
157def EFDCFSF        : EFXForm_2a<755, (outs sperc:$RT), (ins spe4rc:$RB),
158                                "efdcfsf $RT, $RB", IIC_FPDGeneral, []>;
159
160def EFDCFSI        : EFXForm_2a<753, (outs sperc:$RT), (ins gprc:$RB),
161                                "efdcfsi $RT, $RB", IIC_FPDGeneral,
162                                [(set f64:$RT, (sint_to_fp i32:$RB))]>;
163
164def EFDCFSID       : EFXForm_2a<739, (outs sperc:$RT), (ins gprc:$RB),
165                                "efdcfsid $RT, $RB", IIC_FPDGeneral,
166                                []>;
167
168def EFDCFUF        : EFXForm_2a<754, (outs sperc:$RT), (ins spe4rc:$RB),
169                                "efdcfuf $RT, $RB", IIC_FPDGeneral, []>;
170
171def EFDCFUI        : EFXForm_2a<752, (outs sperc:$RT), (ins gprc:$RB),
172                                "efdcfui $RT, $RB", IIC_FPDGeneral,
173                                [(set f64:$RT, (uint_to_fp i32:$RB))]>;
174
175def EFDCFUID       : EFXForm_2a<738, (outs sperc:$RT), (ins gprc:$RB),
176                                "efdcfuid $RT, $RB", IIC_FPDGeneral,
177                                []>;
178
179let isCompare = 1 in {
180def EFDCMPEQ       : EFXForm_3<750, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
181                               "efdcmpeq $crD, $RA, $RB", IIC_FPDGeneral>;
182def EFDCMPGT       : EFXForm_3<748, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
183                               "efdcmpgt $crD, $RA, $RB", IIC_FPDGeneral>;
184def EFDCMPLT       : EFXForm_3<749, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
185                               "efdcmplt $crD, $RA, $RB", IIC_FPDGeneral>;
186}
187
188def EFDCTSF        : EFXForm_2a<759, (outs sperc:$RT), (ins spe4rc:$RB),
189                                "efdctsf $RT, $RB", IIC_FPDGeneral, []>;
190
191def EFDCTSI        : EFXForm_2a<757, (outs gprc:$RT), (ins sperc:$RB),
192                                "efdctsi $RT, $RB", IIC_FPDGeneral,
193                                []>;
194
195def EFDCTSIDZ      : EFXForm_2a<747, (outs gprc:$RT), (ins sperc:$RB),
196                                "efdctsidz $RT, $RB", IIC_FPDGeneral,
197                                []>;
198
199def EFDCTSIZ       : EFXForm_2a<762, (outs gprc:$RT), (ins sperc:$RB),
200                                "efdctsiz $RT, $RB", IIC_FPDGeneral,
201                                [(set i32:$RT, (fp_to_sint f64:$RB))]>;
202
203def EFDCTUF        : EFXForm_2a<758, (outs sperc:$RT), (ins spe4rc:$RB),
204                                "efdctuf $RT, $RB", IIC_FPDGeneral, []>;
205
206def EFDCTUI        : EFXForm_2a<756, (outs gprc:$RT), (ins sperc:$RB),
207                                "efdctui $RT, $RB", IIC_FPDGeneral,
208                                []>;
209
210def EFDCTUIDZ      : EFXForm_2a<746, (outs gprc:$RT), (ins sperc:$RB),
211                                "efdctuidz $RT, $RB", IIC_FPDGeneral,
212                                []>;
213
214def EFDCTUIZ       : EFXForm_2a<760, (outs gprc:$RT), (ins sperc:$RB),
215                                "efdctuiz $RT, $RB", IIC_FPDGeneral,
216                                [(set i32:$RT, (fp_to_uint f64:$RB))]>;
217
218def EFDDIV         : EFXForm_1<745, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
219                               "efddiv $RT, $RA, $RB", IIC_FPDivD,
220                               [(set f64:$RT, (fdiv f64:$RA, f64:$RB))]>;
221
222def EFDMUL         : EFXForm_1<744, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
223                               "efdmul $RT, $RA, $RB", IIC_FPDGeneral,
224                               [(set f64:$RT, (fmul f64:$RA, f64:$RB))]>;
225
226def EFDNABS        : EFXForm_2<741, (outs sperc:$RT), (ins sperc:$RA),
227                               "efdnabs $RT, $RA", IIC_FPDGeneral,
228                               [(set f64:$RT, (fneg (fabs f64:$RA)))]>;
229
230def EFDNEG         : EFXForm_2<742, (outs sperc:$RT), (ins sperc:$RA),
231                               "efdneg $RT, $RA", IIC_FPDGeneral,
232                               [(set f64:$RT, (fneg f64:$RA))]>;
233
234def EFDSUB         : EFXForm_1<737, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
235                               "efdsub $RT, $RA, $RB", IIC_FPDGeneral,
236                               [(set f64:$RT, (fsub f64:$RA, f64:$RB))]>;
237
238let isCompare = 1 in {
239def EFDTSTEQ       : EFXForm_3<766, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
240                               "efdtsteq $crD, $RA, $RB", IIC_FPDGeneral>;
241def EFDTSTGT       : EFXForm_3<764, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
242                               "efdtstgt $crD, $RA, $RB", IIC_FPDGeneral>;
243def EFDTSTLT       : EFXForm_3<765, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
244                               "efdtstlt $crD, $RA, $RB", IIC_FPDGeneral>;
245}
246
247// Single-precision floating point
248def EFSABS         : EFXForm_2<708, (outs spe4rc:$RT), (ins spe4rc:$RA),
249                                "efsabs $RT, $RA", IIC_FPSGeneral,
250                                [(set f32:$RT, (fabs f32:$RA))]>;
251
252def EFSADD         : EFXForm_1<704, (outs spe4rc:$RT), (ins spe4rc:$RA, spe4rc:$RB),
253                                "efsadd $RT, $RA, $RB", IIC_FPAddSub,
254                                [(set f32:$RT, (fadd f32:$RA, f32:$RB))]>;
255
256def EFSCFD         : EFXForm_2a<719, (outs spe4rc:$RT), (ins sperc:$RB),
257                                "efscfd $RT, $RB", IIC_FPSGeneral,
258                                [(set f32:$RT, (fpround f64:$RB))]>;
259
260def EFSCFSF        : EFXForm_2a<723, (outs spe4rc:$RT), (ins spe4rc:$RB),
261                                "efscfsf $RT, $RB", IIC_FPSGeneral, []>;
262
263def EFSCFSI        : EFXForm_2a<721, (outs spe4rc:$RT), (ins gprc:$RB),
264                                "efscfsi $RT, $RB", IIC_FPSGeneral,
265                                [(set f32:$RT, (sint_to_fp i32:$RB))]>;
266
267def EFSCFUF        : EFXForm_2a<722, (outs spe4rc:$RT), (ins spe4rc:$RB),
268                                "efscfuf $RT, $RB", IIC_FPSGeneral, []>;
269
270def EFSCFUI        : EFXForm_2a<720, (outs spe4rc:$RT), (ins gprc:$RB),
271                                "efscfui $RT, $RB", IIC_FPSGeneral,
272                                [(set f32:$RT, (uint_to_fp i32:$RB))]>;
273
274let isCompare = 1 in {
275def EFSCMPEQ       : EFXForm_3<718, (outs crrc:$crD), (ins spe4rc:$RA, spe4rc:$RB),
276                               "efscmpeq $crD, $RA, $RB", IIC_FPCompare>;
277def EFSCMPGT       : EFXForm_3<716, (outs crrc:$crD), (ins spe4rc:$RA, spe4rc:$RB),
278                               "efscmpgt $crD, $RA, $RB", IIC_FPCompare>;
279def EFSCMPLT       : EFXForm_3<717, (outs crrc:$crD), (ins spe4rc:$RA, spe4rc:$RB),
280                               "efscmplt $crD, $RA, $RB", IIC_FPCompare>;
281}
282
283def EFSCTSF        : EFXForm_2a<727, (outs spe4rc:$RT), (ins spe4rc:$RB),
284                                "efsctsf $RT, $RB", IIC_FPSGeneral, []>;
285
286def EFSCTSI        : EFXForm_2a<725, (outs gprc:$RT), (ins spe4rc:$RB),
287                                "efsctsi $RT, $RB", IIC_FPSGeneral,
288                                []>;
289
290def EFSCTSIZ       : EFXForm_2a<730, (outs gprc:$RT), (ins spe4rc:$RB),
291                                "efsctsiz $RT, $RB", IIC_FPSGeneral,
292                                [(set i32:$RT, (fp_to_sint f32:$RB))]>;
293
294def EFSCTUF        : EFXForm_2a<726, (outs sperc:$RT), (ins spe4rc:$RB),
295                                "efsctuf $RT, $RB", IIC_FPSGeneral, []>;
296
297def EFSCTUI        : EFXForm_2a<724, (outs gprc:$RT), (ins spe4rc:$RB),
298                                "efsctui $RT, $RB", IIC_FPSGeneral,
299                                []>;
300
301def EFSCTUIZ       : EFXForm_2a<728, (outs gprc:$RT), (ins spe4rc:$RB),
302                                "efsctuiz $RT, $RB", IIC_FPSGeneral,
303                                [(set i32:$RT, (fp_to_uint f32:$RB))]>;
304
305def EFSDIV         : EFXForm_1<713, (outs spe4rc:$RT), (ins spe4rc:$RA, spe4rc:$RB),
306                               "efsdiv $RT, $RA, $RB", IIC_FPDivD,
307                               [(set f32:$RT, (fdiv f32:$RA, f32:$RB))]>;
308
309def EFSMUL         : EFXForm_1<712, (outs spe4rc:$RT), (ins spe4rc:$RA, spe4rc:$RB),
310                               "efsmul $RT, $RA, $RB", IIC_FPGeneral,
311                               [(set f32:$RT, (fmul f32:$RA, f32:$RB))]>;
312
313def EFSNABS        : EFXForm_2<709, (outs spe4rc:$RT), (ins spe4rc:$RA),
314                               "efsnabs $RT, $RA", IIC_FPGeneral,
315                               [(set f32:$RT, (fneg (fabs f32:$RA)))]>;
316
317def EFSNEG         : EFXForm_2<710, (outs spe4rc:$RT), (ins spe4rc:$RA),
318                               "efsneg $RT, $RA", IIC_FPGeneral,
319                               [(set f32:$RT, (fneg f32:$RA))]>;
320
321def EFSSUB         : EFXForm_1<705, (outs spe4rc:$RT), (ins spe4rc:$RA, spe4rc:$RB),
322                               "efssub $RT, $RA, $RB", IIC_FPSGeneral,
323                               [(set f32:$RT, (fsub f32:$RA, f32:$RB))]>;
324
325let isCompare = 1 in {
326def EFSTSTEQ       : EFXForm_3<734, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
327                               "efststeq $crD, $RA, $RB", IIC_FPCompare>;
328def EFSTSTGT       : EFXForm_3<732, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
329                               "efststgt $crD, $RA, $RB", IIC_FPCompare>;
330def EFSTSTLT       : EFXForm_3<733, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
331                               "efststlt $crD, $RA, $RB", IIC_FPCompare>;
332}
333
334// SPE Vector operations
335
336def EVABS          : EVXForm_2<520, (outs sperc:$RT), (ins sperc:$RA),
337                               "evabs $RT, $RA", IIC_VecGeneral,
338                               []>;
339
340def EVADDIW        : EVXForm_1<514, (outs sperc:$RT), (ins sperc:$RA, u5imm:$RB),
341                               "evaddiw $RT, $RB, $RA", IIC_VecGeneral, []>;
342def EVADDSMIAAW    : EVXForm_2<1225, (outs sperc:$RT), (ins sperc:$RA),
343                               "evaddsmiaaw $RT, $RA", IIC_VecComplex, []>;
344def EVADDSSIAAW    : EVXForm_2<1217, (outs sperc:$RT), (ins sperc:$RA),
345                               "evaddssiaaw $RT, $RA", IIC_VecComplex, []>;
346def EVADDUSIAAW    : EVXForm_2<1216, (outs sperc:$RT), (ins sperc:$RA),
347                               "evaddusiaaw $RT, $RA", IIC_VecComplex, []>;
348def EVADDUMIAAW    : EVXForm_2<1224, (outs sperc:$RT), (ins sperc:$RA),
349                               "evaddumiaaw $RT, $RA", IIC_VecComplex, []>;
350def EVADDW         : EVXForm_1<512, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
351                               "evaddw $RT, $RA, $RB", IIC_VecGeneral,
352                               []>;
353
354def EVAND          : EVXForm_1<529, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
355                               "evand $RT, $RA, $RB", IIC_VecGeneral,
356                               []>;
357def EVANDC         : EVXForm_1<530, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
358                               "evandc $RT, $RA, $RB", IIC_VecGeneral,
359                               []>;
360
361let isCompare = 1 in {
362def EVCMPEQ        : EVXForm_3<564, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
363                               "evcmpeq $crD, $RA, $RB", IIC_VecGeneral, []>;
364def EVCMPGTS       : EVXForm_3<561, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
365                               "evcmpgts $crD, $RA, $RB", IIC_VecGeneral, []>;
366def EVCMPGTU       : EVXForm_3<560, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
367                               "evcmpgtu $crD, $RA, $RB", IIC_VecGeneral, []>;
368def EVCMPLTS       : EVXForm_3<563, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
369                               "evcmplts $crD, $RA, $RB", IIC_VecGeneral, []>;
370def EVCMPLTU       : EVXForm_3<562, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
371                               "evcmpltu $crD, $RA, $RB", IIC_VecGeneral, []>;
372}
373
374def EVCNTLSW       : EVXForm_2<526, (outs sperc:$RT), (ins sperc:$RA),
375                               "evcntlsw $RT, $RA", IIC_VecGeneral, []>;
376def EVCNTLZW       : EVXForm_2<525, (outs sperc:$RT), (ins sperc:$RA),
377                               "evcntlzw $RT, $RA", IIC_VecGeneral,
378                               []>;
379
380def EVDIVWS        : EVXForm_1<1222, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
381                               "evdivws $RT, $RA, $RB", IIC_VecComplex,
382                               []>;
383def EVDIVWU        : EVXForm_1<1223, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
384                               "evdivwu $RT, $RA, $RB", IIC_VecComplex,
385                               []>;
386
387def EVEQV          : EVXForm_1<537, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
388                               "eveqv $RT, $RA, $RB", IIC_VecGeneral,
389                               []>;
390
391def EVEXTSB        : EVXForm_2<522, (outs sperc:$RT), (ins sperc:$RA),
392                               "evextsb $RT, $RA", IIC_VecGeneral,
393                               []>;
394def EVEXTSH        : EVXForm_2<523, (outs sperc:$RT), (ins sperc:$RA),
395                               "evextsh $RT, $RA", IIC_VecGeneral,
396                               []>;
397
398def EVFSABS        : EVXForm_2<644, (outs sperc:$RT), (ins sperc:$RA),
399                               "evfsabs $RT, $RA", IIC_VecGeneral,
400                               []>;
401def EVFSADD        : EVXForm_1<640, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
402                               "evfsadd $RT, $RA, $RB", IIC_VecComplex,
403                               []>;
404def EVFSCFSF       : EVXForm_2a<659, (outs sperc:$RT), (ins sperc:$RB),
405                                "evfscfsf $RT, $RB", IIC_VecComplex, []>;
406def EVFSCFSI       : EVXForm_2a<657, (outs sperc:$RT), (ins sperc:$RB),
407                                "evfscfsi $RT, $RB", IIC_VecComplex,
408                                []>;
409def EVFSCFUF       : EVXForm_2a<658, (outs sperc:$RT), (ins sperc:$RB),
410                                "evfscfuf $RT, $RB", IIC_VecComplex, []>;
411def EVFSCFUI       : EVXForm_2a<650, (outs sperc:$RT), (ins sperc:$RB),
412                                "evfscfui $RT, $RB", IIC_VecComplex,
413                                []>;
414let isCompare = 1 in {
415def EVFSCMPEQ      : EVXForm_3<654, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
416                               "evfscmpeq $crD, $RA, $RB", IIC_FPSGeneral, []>;
417def EVFSCMPGT      : EVXForm_3<652, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
418                               "evfscmpgt $crD, $RA, $RB", IIC_FPSGeneral, []>;
419def EVFSCMPLT      : EVXForm_3<653, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
420                               "evfscmplt $crD, $RA, $RB", IIC_FPSGeneral, []>;
421}
422
423def EVFSCTSF        : EVXForm_2a<663, (outs sperc:$RT), (ins sperc:$RB),
424                                "evfsctsf $RT, $RB", IIC_VecComplex, []>;
425def EVFSCTSI        : EVXForm_2a<661, (outs sperc:$RT), (ins sperc:$RB),
426                                "evfsctsi $RT, $RB", IIC_VecComplex,
427                                []>;
428def EVFSCTSIZ       : EVXForm_2a<666, (outs sperc:$RT), (ins sperc:$RB),
429                                "evfsctsiz $RT, $RB", IIC_VecComplex,
430                                []>;
431def EVFSCTUF        : EVXForm_2a<662, (outs sperc:$RT), (ins sperc:$RB),
432                                "evfsctsf $RT, $RB", IIC_VecComplex, []>;
433def EVFSCTUI        : EVXForm_2a<660, (outs sperc:$RT), (ins sperc:$RB),
434                                "evfsctui $RT, $RB", IIC_VecComplex,
435                                []>;
436def EVFSCTUIZ       : EVXForm_2a<664, (outs sperc:$RT), (ins sperc:$RB),
437                                "evfsctsiz $RT, $RB", IIC_VecComplex,
438                                []>;
439def EVFSDIV         : EVXForm_1<649, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
440                               "evfsdiv $RT, $RA, $RB", IIC_FPDivD,
441                               []>;
442def EVFSMUL         : EVXForm_1<648, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
443                               "evfsmul $RT, $RA, $RB", IIC_VecComplex,
444                               []>;
445def EVFSNABS        : EVXForm_2<645, (outs sperc:$RT), (ins sperc:$RA),
446                               "evfsnabs $RT, $RA", IIC_VecGeneral,
447                               []>;
448def EVFSNEG         : EVXForm_2<646, (outs sperc:$RT), (ins sperc:$RA),
449                               "evfsneg $RT, $RA", IIC_VecGeneral,
450                               []>;
451def EVFSSUB         : EVXForm_1<641, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
452                               "evfssub $RT, $RA, $RB", IIC_VecComplex,
453                               []>;
454
455let isCompare = 1 in {
456def EVFSTSTEQ       : EVXForm_3<670, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
457                               "evfststeq $crD, $RA, $RB", IIC_VecGeneral, []>;
458def EVFSTSTGT       : EVXForm_3<668, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
459                               "evfststgt $crD, $RA, $RB", IIC_VecGeneral, []>;
460def EVFSTSTLT       : EVXForm_3<669, (outs crrc:$crD), (ins sperc:$RA, sperc:$RB),
461                               "evfststlt $crD, $RA, $RB", IIC_VecGeneral, []>;
462}
463
464def EVLDD          : EVXForm_D<769, (outs sperc:$RT), (ins spe8dis:$dst),
465                               "evldd $RT, $dst", IIC_LdStLoad,
466                               [(set f64:$RT, (load iaddr:$dst))]>;
467def EVLDDX         : EVXForm_1<768, (outs sperc:$RT), (ins memrr:$src),
468                               "evlddx $RT, $src", IIC_LdStLoad,
469                               [(set f64:$RT, (load xaddr:$src))]>;
470def EVLDH          : EVXForm_D<773, (outs sperc:$RT), (ins spe8dis:$dst),
471                               "evldh $RT, $dst", IIC_LdStLoad, []>;
472def EVLDHX         : EVXForm_1<772, (outs sperc:$RT), (ins memrr:$src),
473                               "evldhx $RT, $src", IIC_LdStLoad, []>;
474def EVLDW          : EVXForm_D<771, (outs sperc:$RT), (ins spe8dis:$dst),
475                               "evldw $RT, $dst", IIC_LdStLoad,
476                               []>;
477def EVLDWX         : EVXForm_1<770, (outs sperc:$RT), (ins memrr:$src),
478                               "evldwx $RT, $src", IIC_LdStLoad,
479                               []>;
480def EVLHHESPLAT    : EVXForm_D<777, (outs sperc:$RT), (ins spe2dis:$dst),
481                               "evlhhesplat $RT, $dst", IIC_LdStLoad, []>;
482def EVLHHESPLATX   : EVXForm_1<776, (outs sperc:$RT), (ins memrr:$src),
483                               "evlhhesplatx $RT, $src", IIC_LdStLoad, []>;
484def EVLHHOUSPLAT   : EVXForm_D<781, (outs sperc:$RT), (ins spe2dis:$dst),
485                               "evlhhousplat $RT, $dst", IIC_LdStLoad, []>;
486def EVLHHOUSPLATX  : EVXForm_1<780, (outs sperc:$RT), (ins memrr:$src),
487                               "evlhhousplatx $RT, $src", IIC_LdStLoad, []>;
488def EVLHHOSSPLAT   : EVXForm_D<783, (outs sperc:$RT), (ins spe2dis:$dst),
489                               "evlhhossplat $RT, $dst", IIC_LdStLoad, []>;
490def EVLHHOSSPLATX  : EVXForm_1<782, (outs sperc:$RT), (ins memrr:$src),
491                               "evlhhossplatx $RT, $src", IIC_LdStLoad, []>;
492def EVLWHE         : EVXForm_D<785, (outs sperc:$RT), (ins spe4dis:$dst),
493                               "evlwhe $RT, $dst", IIC_LdStLoad, []>;
494def EVLWHEX        : EVXForm_1<784, (outs sperc:$RT), (ins memrr:$src),
495                               "evlwhex $RT, $src", IIC_LdStLoad, []>;
496def EVLWHOS        : EVXForm_D<791, (outs sperc:$RT), (ins spe4dis:$dst),
497                               "evlwhos $RT, $dst", IIC_LdStLoad, []>;
498def EVLWHOSX       : EVXForm_1<790, (outs sperc:$RT), (ins memrr:$src),
499                               "evlwhosx $RT, $src", IIC_LdStLoad, []>;
500def EVLWHOU        : EVXForm_D<789, (outs sperc:$RT), (ins spe4dis:$dst),
501                               "evlwhou $RT, $dst", IIC_LdStLoad, []>;
502def EVLWHOUX       : EVXForm_1<788, (outs sperc:$RT), (ins memrr:$src),
503                               "evlwhoux $RT, $src", IIC_LdStLoad, []>;
504def EVLWHSPLAT     : EVXForm_D<797, (outs sperc:$RT), (ins spe4dis:$dst),
505                               "evlwhsplat $RT, $dst", IIC_LdStLoad, []>;
506def EVLWHSPLATX    : EVXForm_1<796, (outs sperc:$RT), (ins memrr:$src),
507                               "evlwhsplatx $RT, $src", IIC_LdStLoad, []>;
508def EVLWWSPLAT     : EVXForm_D<793, (outs sperc:$RT), (ins spe4dis:$dst),
509                               "evlwwsplat $RT, $dst", IIC_LdStLoad, []>;
510def EVLWWSPLATX    : EVXForm_1<792, (outs sperc:$RT), (ins memrr:$src),
511                               "evlwwsplatx $RT, $src", IIC_LdStLoad, []>;
512
513def EVMERGEHI      : EVXForm_1<556, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
514                               "evmergehi $RT, $RA, $RB", IIC_VecGeneral, []>;
515def EVMERGELO      : EVXForm_1<557, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
516                               "evmergelo $RT, $RA, $RB", IIC_VecGeneral, []>;
517def EVMERGEHILO    : EVXForm_1<558, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
518                               "evmergehilo $RT, $RA, $RB", IIC_VecGeneral, []>;
519def EVMERGELOHI    : EVXForm_1<559, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
520                               "evmergelohi $RT, $RA, $RB", IIC_VecGeneral, []>;
521
522def EVMHEGSMFAA    : EVXForm_1<1323, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
523                               "evmhegsmfaa $RT, $RA, $RB", IIC_VecComplex, []>;
524def EVMHEGSMFAN    : EVXForm_1<1451, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
525                               "evmhegsmfan $RT, $RA, $RB", IIC_VecComplex, []>;
526def EVMHEGSMIAA    : EVXForm_1<1321, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
527                               "evmhegsmiaa $RT, $RA, $RB", IIC_VecComplex, []>;
528def EVMHEGSMIAN    : EVXForm_1<1449, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
529                               "evmhegsmian $RT, $RA, $RB", IIC_VecComplex, []>;
530def EVMHEGUMIAA    : EVXForm_1<1320, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
531                               "evmhegumiaa $RT, $RA, $RB", IIC_VecComplex, []>;
532def EVMHEGUMIAN    : EVXForm_1<1448, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
533                               "evmhegumian $RT, $RA, $RB", IIC_VecComplex, []>;
534
535def EVMHESMF       : EVXForm_1<1035, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
536                               "evmhesmf $RT, $RA, $RB", IIC_VecComplex, []>;
537def EVMHESMFA      : EVXForm_1<1067, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
538                               "evmhesmfa $RT, $RA, $RB", IIC_VecComplex, []>;
539def EVMHESMFAAW    : EVXForm_1<1291, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
540                               "evmhesmfaaw $RT, $RA, $RB", IIC_VecComplex, []>;
541def EVMHESMFANW    : EVXForm_1<1419, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
542                               "evmhesmfanw $RT, $RA, $RB", IIC_VecComplex, []>;
543def EVMHESMI       : EVXForm_1<1033, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
544                               "evmhesmi $RT, $RA, $RB", IIC_VecComplex, []>;
545def EVMHESMIA      : EVXForm_1<1065, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
546                               "evmhesmia $RT, $RA, $RB", IIC_VecComplex, []>;
547def EVMHESMIAAW    : EVXForm_1<1289, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
548                               "evmhesmiaaw $RT, $RA, $RB", IIC_VecComplex, []>;
549def EVMHESMIANW    : EVXForm_1<1417, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
550                               "evmhesmianw $RT, $RA, $RB", IIC_VecComplex, []>;
551def EVMHESSF       : EVXForm_1<1027, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
552                               "evmhessf $RT, $RA, $RB", IIC_VecComplex, []>;
553def EVMHESSFA      : EVXForm_1<1059, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
554                               "evmhessfa $RT, $RA, $RB", IIC_VecComplex, []>;
555def EVMHESSFAAW    : EVXForm_1<1283, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
556                               "evmhessfaaw $RT, $RA, $RB", IIC_VecComplex, []>;
557def EVMHESSFANW    : EVXForm_1<1411, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
558                               "evmhessfanw $RT, $RA, $RB", IIC_VecComplex, []>;
559def EVMHESSIAAW    : EVXForm_1<1281, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
560                               "evmhessiaaw $RT, $RA, $RB", IIC_VecComplex, []>;
561def EVMHESSIANW    : EVXForm_1<1409, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
562                               "evmhessianw $RT, $RA, $RB", IIC_VecComplex, []>;
563def EVMHEUMI       : EVXForm_1<1032, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
564                               "evmheumi $RT, $RA, $RB", IIC_VecComplex, []>;
565def EVMHEUMIA      : EVXForm_1<1064, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
566                               "evmheumia $RT, $RA, $RB", IIC_VecComplex, []>;
567def EVMHEUMIAAW    : EVXForm_1<1288, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
568                               "evmheumiaaw $RT, $RA, $RB", IIC_VecComplex, []>;
569def EVMHEUMIANW    : EVXForm_1<1416, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
570                               "evmheumianw $RT, $RA, $RB", IIC_VecComplex, []>;
571def EVMHEUSIAAW    : EVXForm_1<1280, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
572                               "evmheusiaaw $RT, $RA, $RB", IIC_VecComplex, []>;
573def EVMHEUSIANW    : EVXForm_1<1408, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
574                               "evmheusianw $RT, $RA, $RB", IIC_VecComplex, []>;
575def EVMHOGSMFAA    : EVXForm_1<1327, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
576                               "evmhogsmfaa $RT, $RA, $RB", IIC_VecComplex, []>;
577def EVMHOGSMFAN    : EVXForm_1<1455, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
578                               "evmhogsmfan $RT, $RA, $RB", IIC_VecComplex, []>;
579def EVMHOGSMIAA    : EVXForm_1<1325, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
580                               "evmhogsmiaa $RT, $RA, $RB", IIC_VecComplex, []>;
581def EVMHOGSMIAN    : EVXForm_1<1453, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
582                               "evmhogsmian $RT, $RA, $RB", IIC_VecComplex, []>;
583def EVMHOGUMIAA    : EVXForm_1<1324, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
584                               "evmhogumiaa $RT, $RA, $RB", IIC_VecComplex, []>;
585def EVMHOGUMIAN    : EVXForm_1<1452, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
586                               "evmhogumian $RT, $RA, $RB", IIC_VecComplex, []>;
587def EVMHOSMF       : EVXForm_1<1039, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
588                               "evmhosmf $RT, $RA, $RB", IIC_VecComplex, []>;
589def EVMHOSMFA      : EVXForm_1<1071, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
590                               "evmhosmfa $RT, $RA, $RB", IIC_VecComplex, []>;
591def EVMHOSMFAAW    : EVXForm_1<1295, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
592                               "evmhosmfaaw $RT, $RA, $RB", IIC_VecComplex, []>;
593def EVMHOSMFANW    : EVXForm_1<1423, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
594                               "evmhosmfanw $RT, $RA, $RB", IIC_VecComplex, []>;
595def EVMHOSMI       : EVXForm_1<1037, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
596                               "evmhosmi $RT, $RA, $RB", IIC_VecComplex, []>;
597def EVMHOSMIA      : EVXForm_1<1069, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
598                               "evmhosmia $RT, $RA, $RB", IIC_VecComplex, []>;
599def EVMHOSMIAAW    : EVXForm_1<1293, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
600                               "evmhosmiaaw $RT, $RA, $RB", IIC_VecComplex, []>;
601def EVMHOSMIANW    : EVXForm_1<1421, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
602                               "evmhosmianw $RT, $RA, $RB", IIC_VecComplex, []>;
603def EVMHOSSF       : EVXForm_1<1031, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
604                               "evmhossf $RT, $RA, $RB", IIC_VecComplex, []>;
605def EVMHOSSFA      : EVXForm_1<1063, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
606                               "evmhossfa $RT, $RA, $RB", IIC_VecComplex, []>;
607def EVMHOSSFAAW    : EVXForm_1<1287, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
608                               "evmhossfaaw $RT, $RA, $RB", IIC_VecComplex, []>;
609def EVMHOSSFANW    : EVXForm_1<1415, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
610                               "evmhossfanw $RT, $RA, $RB", IIC_VecComplex, []>;
611def EVMHOSSIAAW    : EVXForm_1<1285, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
612                               "evmhossiaaw $RT, $RA, $RB", IIC_VecComplex, []>;
613def EVMHOSSIANW    : EVXForm_1<1413, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
614                               "evmhossianw $RT, $RA, $RB", IIC_VecComplex, []>;
615def EVMHOUMI       : EVXForm_1<1036, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
616                               "evmhoumi $RT, $RA, $RB", IIC_VecComplex, []>;
617def EVMHOUMIA      : EVXForm_1<1068, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
618                               "evmhoumia $RT, $RA, $RB", IIC_VecComplex, []>;
619def EVMHOUMIAAW    : EVXForm_1<1292, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
620                               "evmhoumiaaw $RT, $RA, $RB", IIC_VecComplex, []>;
621def EVMHOUMIANW    : EVXForm_1<1420, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
622                               "evmhoumianw $RT, $RA, $RB", IIC_VecComplex, []>;
623def EVMHOUSIAAW    : EVXForm_1<1284, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
624                               "evmhousiaaw $RT, $RA, $RB", IIC_VecComplex, []>;
625def EVMHOUSIANW    : EVXForm_1<1412, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
626                               "evmhousianw $RT, $RA, $RB", IIC_VecComplex, []>;
627
628def EVMRA          : EVXForm_2<1220, (outs sperc:$RT), (ins sperc:$RA),
629                               "evmra $RT, $RA", IIC_VecComplex, []>;
630
631def EVMWHSMF       : EVXForm_1<1103, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
632                               "evmwhsmf $RT, $RA, $RB", IIC_VecComplex, []>;
633def EVMWHSMFA      : EVXForm_1<1135, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
634                               "evmwhsmfa $RT, $RA, $RB", IIC_VecComplex, []>;
635def EVMWHSMI       : EVXForm_1<1101, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
636                               "evmwhsmi $RT, $RA, $RB", IIC_VecComplex, []>;
637def EVMWHSMIA      : EVXForm_1<1133, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
638                               "evmwhsmia $RT, $RA, $RB", IIC_VecComplex, []>;
639def EVMWHSSF       : EVXForm_1<1095, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
640                               "evmwhssf $RT, $RA, $RB", IIC_VecComplex, []>;
641def EVMWHSSFA      : EVXForm_1<1127, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
642                               "evmwhssfa $RT, $RA, $RB", IIC_VecComplex, []>;
643def EVMWHUMI       : EVXForm_1<1100, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
644                               "evmwhumi $RT, $RA, $RB", IIC_VecComplex, []>;
645def EVMWHUMIA      : EVXForm_1<1132, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
646                               "evmwhumia $RT, $RA, $RB", IIC_VecComplex, []>;
647def EVMWLSMIAAW    : EVXForm_1<1353, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
648                               "evmwlsmiaaw $RT, $RA, $RB", IIC_VecComplex, []>;
649def EVMWLSMIANW    : EVXForm_1<1481, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
650                               "evmwlsmianw $RT, $RA, $RB", IIC_VecComplex, []>;
651def EVMWLSSIAAW    : EVXForm_1<1345, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
652                               "evmwlssiaaw $RT, $RA, $RB", IIC_VecComplex, []>;
653def EVMWLSSIANW    : EVXForm_1<1473, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
654                               "evmwlssianw $RT, $RA, $RB", IIC_VecComplex, []>;
655def EVMWLUMI       : EVXForm_1<1096, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
656                               "evmwlumi $RT, $RA, $RB", IIC_VecComplex,
657                               []>;
658def EVMWLUMIA      : EVXForm_1<1128, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
659                               "evmwlumia $RT, $RA, $RB", IIC_VecComplex, []>;
660def EVMWLUMIAAW    : EVXForm_1<1352, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
661                               "evmwlumiaaw $RT, $RA, $RB", IIC_VecComplex, []>;
662def EVMWLUMIANW    : EVXForm_1<1480, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
663                               "evmwlumianw $RT, $RA, $RB", IIC_VecComplex, []>;
664def EVMWLUSIAAW    : EVXForm_1<1344, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
665                               "evmwlusiaaw $RT, $RA, $RB", IIC_VecComplex, []>;
666def EVMWLUSIANW    : EVXForm_1<1472, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
667                               "evmwlusianw $RT, $RA, $RB", IIC_VecComplex, []>;
668def EVMWSMF        : EVXForm_1<1115, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
669                               "evmwsmf $RT, $RA, $RB", IIC_VecComplex, []>;
670def EVMWSMFA       : EVXForm_1<1147, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
671                               "evmwsmfa $RT, $RA, $RB", IIC_VecComplex, []>;
672def EVMWSMFAA      : EVXForm_1<1371, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
673                               "evmwsmfaa $RT, $RA, $RB", IIC_VecComplex, []>;
674def EVMWSMFAN      : EVXForm_1<1499, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
675                               "evmwsmfan $RT, $RA, $RB", IIC_VecComplex, []>;
676def EVMWSMI        : EVXForm_1<1113, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
677                               "evmwsmi $RT, $RA, $RB", IIC_VecComplex, []>;
678def EVMWSMIA       : EVXForm_1<1145, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
679                               "evmwsmia $RT, $RA, $RB", IIC_VecComplex, []>;
680def EVMWSMIAA      : EVXForm_1<1369, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
681                               "evmwsmiaa $RT, $RA, $RB", IIC_VecComplex, []>;
682def EVMWSMIAN      : EVXForm_1<1497, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
683                               "evmwsmian $RT, $RA, $RB", IIC_VecComplex, []>;
684def EVMWSSF        : EVXForm_1<1107, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
685                               "evmwssf $RT, $RA, $RB", IIC_VecComplex, []>;
686def EVMWSSFA       : EVXForm_1<1139, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
687                               "evmwssfa $RT, $RA, $RB", IIC_VecComplex, []>;
688def EVMWSSFAA      : EVXForm_1<1363, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
689                               "evmwssfaa $RT, $RA, $RB", IIC_VecComplex, []>;
690def EVMWSSFAN      : EVXForm_1<1491, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
691                               "evmwssfan $RT, $RA, $RB", IIC_VecComplex, []>;
692def EVMWUMI        : EVXForm_1<1112, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
693                               "evmwumi $RT, $RA, $RB", IIC_VecComplex, []>;
694def EVMWUMIA       : EVXForm_1<1144, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
695                               "evmwumia $RT, $RA, $RB", IIC_VecComplex, []>;
696def EVMWUMIAA      : EVXForm_1<1368, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
697                               "evmwumiaa $RT, $RA, $RB", IIC_VecComplex, []>;
698def EVMWUMIAN      : EVXForm_1<1496, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
699                               "evmwumian $RT, $RA, $RB", IIC_VecComplex, []>;
700
701
702def EVNAND         : EVXForm_1<542, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
703                               "evnand $RT, $RA, $RB", IIC_VecGeneral,
704                               []>;
705
706def EVNEG          : EVXForm_2<521, (outs sperc:$RT), (ins sperc:$RA),
707                               "evneg $RT, $RA", IIC_VecGeneral,
708                               []>;
709
710def EVNOR          : EVXForm_1<536, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
711                               "evnor $RT, $RA, $RB", IIC_VecGeneral,
712                               []>;
713def EVOR           : EVXForm_1<535, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
714                               "evor $RT, $RA, $RB", IIC_VecGeneral,
715                               []>;
716def EVORC          : EVXForm_1<539, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
717                               "evorc $RT, $RA, $RB", IIC_VecGeneral,
718                               []>;
719
720def EVRLWI         : EVXForm_1<554, (outs sperc:$RT), (ins sperc:$RA, u5imm:$RB),
721                               "evrlwi $RT, $RA, $RB", IIC_VecGeneral, []>;
722def EVRLW          : EVXForm_1<552, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
723                               "evrlw $RT, $RA, $RB", IIC_VecGeneral,
724                               []>;
725
726def EVRNDW         : EVXForm_2<524, (outs sperc:$RT), (ins sperc:$RA),
727                               "evrndw $RT, $RA", IIC_VecGeneral, []>;
728
729def EVSEL          : EVXForm_4<79, (outs sperc:$RT),
730                               (ins sperc:$RA, sperc:$RB, crrc:$crD),
731                               "evsel crD,$RT,$RA,$RB", IIC_VecGeneral, []>;
732
733def EVSLWI         : EVXForm_1<550, (outs sperc:$RT), (ins sperc:$RA, u5imm:$RB),
734                               "evslwi $RT, $RA, $RB", IIC_VecGeneral, []>;
735def EVSLW          : EVXForm_1<548, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
736                               "evslw $RT, $RA, $RB", IIC_VecGeneral,
737                               []>;
738
739def EVSPLATFI      : EVXForm_2<555, (outs sperc:$RT), (ins s5imm:$RA),
740                               "evsplatfi $RT, $RA", IIC_VecGeneral, []>;
741def EVSPLATI       : EVXForm_2<553, (outs sperc:$RT), (ins s5imm:$RA),
742                               "evsplati $RT, $RA", IIC_VecGeneral, []>;
743
744def EVSRWIS        : EVXForm_1<547, (outs sperc:$RT), (ins sperc:$RA, u5imm:$RB),
745                               "evsrwis $RT, $RA, $RB", IIC_VecGeneral, []>;
746def EVSRWIU        : EVXForm_1<546, (outs sperc:$RT), (ins sperc:$RA, u5imm:$RB),
747                               "evsrwiu $RT, $RA, $RB", IIC_VecGeneral, []>;
748def EVSRWS         : EVXForm_1<545, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
749                               "evsrws $RT, $RA, $RB", IIC_VecGeneral,
750                               []>;
751def EVSRWU         : EVXForm_1<544, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
752                               "evsrwu $RT, $RA, $RB", IIC_VecGeneral,
753                               []>;
754
755def EVSTDD         : EVXForm_D<801, (outs), (ins sperc:$RT, spe8dis:$dst),
756                               "evstdd $RT, $dst", IIC_LdStStore,
757                               [(store f64:$RT, iaddr:$dst)]>;
758def EVSTDDX        : EVXForm_1<800, (outs), (ins sperc:$RT, memrr:$dst),
759                               "evstddx $RT, $dst", IIC_LdStStore,
760                               [(store f64:$RT, xaddr:$dst)]>;
761def EVSTDH         : EVXForm_D<805, (outs), (ins sperc:$RT, spe8dis:$dst),
762                               "evstdh $RT, $dst", IIC_LdStStore, []>;
763def EVSTDHX        : EVXForm_1<804, (outs), (ins sperc:$RT, memrr:$dst),
764                               "evstdhx $RT, $dst", IIC_LdStStore, []>;
765def EVSTDW         : EVXForm_D<803, (outs), (ins sperc:$RT, spe8dis:$dst),
766                               "evstdw $RT, $dst", IIC_LdStStore,
767                               []>;
768def EVSTDWX        : EVXForm_1<802, (outs), (ins sperc:$RT, memrr:$dst),
769                               "evstdwx $RT, $dst", IIC_LdStStore,
770                               []>;
771def EVSTWHE        : EVXForm_D<817, (outs), (ins sperc:$RT, spe4dis:$dst),
772                               "evstwhe $RT, $dst", IIC_LdStStore, []>;
773def EVSTWHEX       : EVXForm_1<816, (outs), (ins sperc:$RT, memrr:$dst),
774                               "evstwhex $RT, $dst", IIC_LdStStore, []>;
775def EVSTWHO        : EVXForm_D<821, (outs), (ins sperc:$RT, spe4dis:$dst),
776                               "evstwho $RT, $dst", IIC_LdStStore, []>;
777def EVSTWHOX       : EVXForm_1<820, (outs), (ins sperc:$RT, memrr:$dst),
778                               "evstwhox $RT, $dst", IIC_LdStStore, []>;
779def EVSTWWE        : EVXForm_D<825, (outs), (ins sperc:$RT, spe4dis:$dst),
780                               "evstwwe $RT, $dst", IIC_LdStStore, []>;
781def EVSTWWEX       : EVXForm_1<824, (outs), (ins sperc:$RT, memrr:$dst),
782                               "evstwwex $RT, $dst", IIC_LdStStore, []>;
783def EVSTWWO        : EVXForm_D<829, (outs), (ins sperc:$RT, spe4dis:$dst),
784                               "evstwwo $RT, $dst", IIC_LdStStore, []>;
785def EVSTWWOX       : EVXForm_1<828, (outs), (ins sperc:$RT, memrr:$dst),
786                               "evstwwox $RT, $dst", IIC_LdStStore, []>;
787
788def EVSUBFSSIAAW   : EVXForm_2<1219, (outs sperc:$RT), (ins sperc:$RA),
789                               "evsubfssiaaw $RT, $RA", IIC_VecComplex, []>;
790def EVSUBFSMIAAW   : EVXForm_2<1227, (outs sperc:$RT), (ins sperc:$RA),
791                               "evsubfsmiaaw $RT, $RA", IIC_VecComplex, []>;
792def EVSUBFUMIAAW   : EVXForm_2<1226, (outs sperc:$RT), (ins sperc:$RA),
793                               "evsubfumiaaw $RT, $RA", IIC_VecComplex, []>;
794def EVSUBFUSIAAW   : EVXForm_2<1218, (outs sperc:$RT), (ins sperc:$RA),
795                               "evsubfusiaaw $RT, $RA", IIC_VecComplex, []>;
796def EVSUBFW        : EVXForm_1<516, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
797                               "evsubfw $RT, $RA, $RB", IIC_VecGeneral,
798                               []>;
799def EVSUBIFW       : EVXForm_1<518, (outs sperc:$RT), (ins u5imm:$RA, sperc:$RB),
800                               "evsubifw $RT, $RA, $RB", IIC_VecGeneral, []>;
801def EVXOR          : EVXForm_1<534, (outs sperc:$RT), (ins sperc:$RA, sperc:$RB),
802                               "evxor $RT, $RA, $RB", IIC_VecGeneral,
803                               []>;
804
805let isAsmParserOnly = 1 in {
806// Identical to the integer Load/Stores, but to handle floats
807def SPELWZ        : DForm_1<32, (outs spe4rc:$rD), (ins memri:$src),
808                            "lwz $rD, $src", IIC_LdStLoad,
809                            [(set f32:$rD, (load iaddr:$src))]>;
810def SPELWZX       : XForm_1<31,  23, (outs spe4rc:$rD), (ins memrr:$src),
811                            "lwzx $rD, $src", IIC_LdStLoad,
812                            [(set f32:$rD, (load xaddr:$src))]>;
813def SPESTW        : DForm_1<36, (outs), (ins spe4rc:$rS, memri:$src),
814                            "stw $rS, $src", IIC_LdStStore,
815                            [(store f32:$rS, iaddr:$src)]>;
816def SPESTWX       : XForm_8<31, 151, (outs), (ins spe4rc:$rS, memrr:$dst),
817                           "stwx $rS, $dst", IIC_LdStStore,
818                           [(store f32:$rS, xaddr:$dst)]>;
819}
820
821} // HasSPE
822
823let Predicates = [HasSPE] in {
824def : Pat<(f64 (extloadf32 iaddr:$src)),
825          (COPY_TO_REGCLASS (SPELWZ iaddr:$src), SPERC)>;
826def : Pat<(f64 (extloadf32 xaddr:$src)),
827          (COPY_TO_REGCLASS (SPELWZX xaddr:$src), SPERC)>;
828
829def : Pat<(f64 (fpextend f32:$src)),
830          (COPY_TO_REGCLASS $src, SPERC)>;
831}
832
833let Predicates = [HasSPE] in {
834def SELECT_CC_SPE4 : PPCCustomInserterPseudo<(outs spe4rc:$dst),
835                            (ins crrc:$cond, spe4rc:$T, spe4rc:$F,
836                            i32imm:$BROPC), "#SELECT_CC_SPE4",
837                            []>;
838def SELECT_CC_SPE  : PPCCustomInserterPseudo<(outs sperc:$dst),
839                            (ins crrc:$cond, sperc:$T, sperc:$F, i32imm:$BROPC),
840                            "#SELECT_CC_SPE",
841                            []>;
842def SELECT_SPE4  : PPCCustomInserterPseudo<(outs spe4rc:$dst), (ins crbitrc:$cond,
843                          spe4rc:$T, spe4rc:$F), "#SELECT_SPE4",
844                          [(set f32:$dst, (select i1:$cond, f32:$T, f32:$F))]>;
845def SELECT_SPE   : PPCCustomInserterPseudo<(outs sperc:$dst), (ins crbitrc:$cond,
846                          sperc:$T, sperc:$F), "#SELECT_SPE",
847                          [(set f64:$dst, (select i1:$cond, f64:$T, f64:$F))]>;
848
849def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLT)),
850          (SELECT_SPE4 (CRANDC $lhs, $rhs), $tval, $fval)>;
851def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULT)),
852          (SELECT_SPE4 (CRANDC $rhs, $lhs), $tval, $fval)>;
853def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETLE)),
854          (SELECT_SPE4 (CRORC  $lhs, $rhs), $tval, $fval)>;
855def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETULE)),
856          (SELECT_SPE4 (CRORC  $rhs, $lhs), $tval, $fval)>;
857def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETEQ)),
858          (SELECT_SPE4 (CREQV $lhs, $rhs), $tval, $fval)>;
859def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGE)),
860          (SELECT_SPE4 (CRORC  $rhs, $lhs), $tval, $fval)>;
861def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGE)),
862          (SELECT_SPE4 (CRORC  $lhs, $rhs), $tval, $fval)>;
863def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETGT)),
864          (SELECT_SPE4 (CRANDC $rhs, $lhs), $tval, $fval)>;
865def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETUGT)),
866          (SELECT_SPE4 (CRANDC $lhs, $rhs), $tval, $fval)>;
867def : Pat<(f32 (selectcc i1:$lhs, i1:$rhs, f32:$tval, f32:$fval, SETNE)),
868          (SELECT_SPE4 (CRXOR $lhs, $rhs), $tval, $fval)>;
869
870def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLT)),
871          (SELECT_SPE (CRANDC $lhs, $rhs), $tval, $fval)>;
872def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULT)),
873          (SELECT_SPE (CRANDC $rhs, $lhs), $tval, $fval)>;
874def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETLE)),
875          (SELECT_SPE (CRORC  $lhs, $rhs), $tval, $fval)>;
876def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETULE)),
877          (SELECT_SPE (CRORC  $rhs, $lhs), $tval, $fval)>;
878def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETEQ)),
879          (SELECT_SPE (CREQV $lhs, $rhs), $tval, $fval)>;
880def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGE)),
881          (SELECT_SPE (CRORC  $rhs, $lhs), $tval, $fval)>;
882def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGE)),
883          (SELECT_SPE (CRORC  $lhs, $rhs), $tval, $fval)>;
884def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETGT)),
885          (SELECT_SPE (CRANDC $rhs, $lhs), $tval, $fval)>;
886def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETUGT)),
887          (SELECT_SPE (CRANDC $lhs, $rhs), $tval, $fval)>;
888def : Pat<(f64 (selectcc i1:$lhs, i1:$rhs, f64:$tval, f64:$fval, SETNE)),
889          (SELECT_SPE (CRXOR $lhs, $rhs), $tval, $fval)>;
890}
891