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