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