blob: 9338e5476cf1465c13a2f21766b2d5c609acefd4 [file] [log] [blame]
Chris Lattnerb22a04d2006-03-25 07:51:43 +00001//===- PPCInstrAltivec.td - The PowerPC Altivec Extension --*- tablegen -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Chris Lattner and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the Altivec extension to the PowerPC instruction set.
11//
12//===----------------------------------------------------------------------===//
13
14//===----------------------------------------------------------------------===//
15// Altivec transformation functions and pattern fragments.
16//
17
18// VSPLT_get_imm xform function: convert vector_shuffle mask to VSPLT* imm.
19def VSPLT_get_imm : SDNodeXForm<build_vector, [{
20 return getI32Imm(PPC::getVSPLTImmediate(N));
21}]>;
22
23def VSPLT_shuffle_mask : PatLeaf<(build_vector), [{
24 return PPC::isSplatShuffleMask(N);
25}], VSPLT_get_imm>;
26
27def vecimm0 : PatLeaf<(build_vector), [{
28 return PPC::isZeroVector(N);
29}]>;
30
31
32// VSPLTISB_get_imm xform function: convert build_vector to VSPLTISB imm.
33def VSPLTISB_get_imm : SDNodeXForm<build_vector, [{
34 char Val;
35 PPC::isVecSplatImm(N, 1, &Val);
36 return getI32Imm(Val);
37}]>;
38def vecspltisb : PatLeaf<(build_vector), [{
39 return PPC::isVecSplatImm(N, 1);
40}], VSPLTISB_get_imm>;
41
42// VSPLTISH_get_imm xform function: convert build_vector to VSPLTISH imm.
43def VSPLTISH_get_imm : SDNodeXForm<build_vector, [{
44 char Val;
45 PPC::isVecSplatImm(N, 2, &Val);
46 return getI32Imm(Val);
47}]>;
48def vecspltish : PatLeaf<(build_vector), [{
49 return PPC::isVecSplatImm(N, 2);
50}], VSPLTISH_get_imm>;
51
52// VSPLTISW_get_imm xform function: convert build_vector to VSPLTISW imm.
53def VSPLTISW_get_imm : SDNodeXForm<build_vector, [{
54 char Val;
55 PPC::isVecSplatImm(N, 4, &Val);
56 return getI32Imm(Val);
57}]>;
58def vecspltisw : PatLeaf<(build_vector), [{
59 return PPC::isVecSplatImm(N, 4);
60}], VSPLTISW_get_imm>;
61
62
63
64//===----------------------------------------------------------------------===//
65// Instruction Definitions.
66
67def IMPLICIT_DEF_VRRC : Pseudo<(ops VRRC:$rD), "; $rD = IMPLICIT_DEF_VRRC",
68 [(set VRRC:$rD, (v4f32 (undef)))]>;
69
70let isLoad = 1, PPC970_Unit = 2 in { // Loads.
71def LVEBX: XForm_1<31, 7, (ops VRRC:$vD, memrr:$src),
72 "lvebx $vD, $src", LdStGeneral,
73 [(set VRRC:$vD, (v16i8 (PPClve_x xoaddr:$src)))]>;
74def LVEHX: XForm_1<31, 39, (ops VRRC:$vD, memrr:$src),
75 "lvehx $vD, $src", LdStGeneral,
76 [(set VRRC:$vD, (v8i16 (PPClve_x xoaddr:$src)))]>;
77def LVEWX: XForm_1<31, 71, (ops VRRC:$vD, memrr:$src),
78 "lvewx $vD, $src", LdStGeneral,
79 [(set VRRC:$vD, (v4f32 (PPClve_x xoaddr:$src)))]>;
80def LVX : XForm_1<31, 103, (ops VRRC:$vD, memrr:$src),
81 "lvx $vD, $src", LdStGeneral,
82 [(set VRRC:$vD, (v4f32 (load xoaddr:$src)))]>;
83}
84
85def LVSL : XForm_1<31, 6, (ops VRRC:$vD, GPRC:$base, GPRC:$rA),
86 "lvsl $vD, $base, $rA", LdStGeneral,
87 []>, PPC970_Unit_LSU;
88def LVSR : XForm_1<31, 38, (ops VRRC:$vD, GPRC:$base, GPRC:$rA),
89 "lvsl $vD, $base, $rA", LdStGeneral,
90 []>, PPC970_Unit_LSU;
91
92let isStore = 1, noResults = 1, PPC970_Unit = 2 in { // Stores.
93def STVEBX: XForm_8<31, 135, (ops VRRC:$rS, GPRC:$rA, GPRC:$rB),
94 "stvebx $rS, $rA, $rB", LdStGeneral,
95 []>;
96def STVEHX: XForm_8<31, 167, (ops VRRC:$rS, GPRC:$rA, GPRC:$rB),
97 "stvehx $rS, $rA, $rB", LdStGeneral,
98 []>;
99def STVEWX: XForm_8<31, 199, (ops VRRC:$rS, GPRC:$rA, GPRC:$rB),
100 "stvewx $rS, $rA, $rB", LdStGeneral,
101 []>;
102def STVX : XForm_8<31, 231, (ops VRRC:$rS, memrr:$dst),
103 "stvx $rS, $dst", LdStGeneral,
104 [(store (v4f32 VRRC:$rS), xoaddr:$dst)]>;
105}
106
107let PPC970_Unit = 5 in { // VALU Operations.
108// VA-Form instructions. 3-input AltiVec ops.
109def VMADDFP : VAForm_1<46, (ops VRRC:$vD, VRRC:$vA, VRRC:$vC, VRRC:$vB),
110 "vmaddfp $vD, $vA, $vC, $vB", VecFP,
111 [(set VRRC:$vD, (fadd (fmul VRRC:$vA, VRRC:$vC),
112 VRRC:$vB))]>,
113 Requires<[FPContractions]>;
114def VNMSUBFP: VAForm_1<47, (ops VRRC:$vD, VRRC:$vA, VRRC:$vC, VRRC:$vB),
115 "vnmsubfp $vD, $vA, $vC, $vB", VecFP,
116 [(set VRRC:$vD, (fneg (fsub (fmul VRRC:$vA, VRRC:$vC),
117 VRRC:$vB)))]>,
118 Requires<[FPContractions]>;
119
120def VPERM : VAForm_1<43, (ops VRRC:$vD, VRRC:$vA, VRRC:$vC, VRRC:$vB),
121 "vperm $vD, $vA, $vB, $vC", VecPerm,
122 [(set VRRC:$vD,
123 (PPCvperm (v4f32 VRRC:$vA), VRRC:$vB, VRRC:$vC))]>;
124
125
126// VX-Form instructions. AltiVec arithmetic ops.
Chris Lattner984f38b2006-03-25 08:01:02 +0000127def VADDCUW : VXForm_1<384, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
128 "vaddcuw $vD, $vA, $vB", VecFP,
129 [(set VRRC:$vD,
130 (int_ppc_altivec_vaddcuw VRRC:$vA, VRRC:$vB))]>;
Chris Lattnerb22a04d2006-03-25 07:51:43 +0000131def VADDFP : VXForm_1<10, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
132 "vaddfp $vD, $vA, $vB", VecFP,
133 [(set VRRC:$vD, (fadd VRRC:$vA, VRRC:$vB))]>;
Chris Lattner984f38b2006-03-25 08:01:02 +0000134def VADDSBS : VXForm_1<768, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
135 "vaddsbs $vD, $vA, $vB", VecFP,
136 [(set VRRC:$vD,
137 (int_ppc_altivec_vaddsbs VRRC:$vA, VRRC:$vB))]>;
138def VADDSHS : VXForm_1<832, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
139 "vaddshs $vD, $vA, $vB", VecFP,
140 [(set VRRC:$vD,
141 (int_ppc_altivec_vaddshs VRRC:$vA, VRRC:$vB))]>;
142def VADDSWS : VXForm_1<896, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
143 "vaddsws $vD, $vA, $vB", VecFP,
144 [(set VRRC:$vD,
145 (int_ppc_altivec_vaddsws VRRC:$vA, VRRC:$vB))]>;
146def VADDUBS : VXForm_1<512, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
147 "vaddubs $vD, $vA, $vB", VecFP,
148 [(set VRRC:$vD,
149 (int_ppc_altivec_vaddubs VRRC:$vA, VRRC:$vB))]>;
150def VADDUHS : VXForm_1<576, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
151 "vadduhs $vD, $vA, $vB", VecFP,
152 [(set VRRC:$vD,
153 (int_ppc_altivec_vadduhs VRRC:$vA, VRRC:$vB))]>;
Chris Lattnerb22a04d2006-03-25 07:51:43 +0000154def VADDUWM : VXForm_1<128, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
155 "vadduwm $vD, $vA, $vB", VecGeneral,
156 [(set VRRC:$vD, (add (v4i32 VRRC:$vA), VRRC:$vB))]>;
Chris Lattner984f38b2006-03-25 08:01:02 +0000157def VADDUWS : VXForm_1<640, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
158 "vadduws $vD, $vA, $vB", VecFP,
159 [(set VRRC:$vD,
160 (int_ppc_altivec_vadduws VRRC:$vA, VRRC:$vB))]>;
161
Chris Lattnerb22a04d2006-03-25 07:51:43 +0000162def VCFSX : VXForm_1<842, (ops VRRC:$vD, u5imm:$UIMM, VRRC:$vB),
163 "vcfsx $vD, $vB, $UIMM", VecFP,
Chris Lattner984f38b2006-03-25 08:01:02 +0000164 [(set VRRC:$vD,
165 (int_ppc_altivec_vcfsx VRRC:$vB, imm:$UIMM))]>;
Chris Lattnerb22a04d2006-03-25 07:51:43 +0000166def VCFUX : VXForm_1<778, (ops VRRC:$vD, u5imm:$UIMM, VRRC:$vB),
167 "vcfux $vD, $vB, $UIMM", VecFP,
Chris Lattner984f38b2006-03-25 08:01:02 +0000168 [(set VRRC:$vD,
169 (int_ppc_altivec_vcfux VRRC:$vB, imm:$UIMM))]>;
Chris Lattnerb22a04d2006-03-25 07:51:43 +0000170def VCTSXS : VXForm_1<970, (ops VRRC:$vD, u5imm:$UIMM, VRRC:$vB),
171 "vctsxs $vD, $vB, $UIMM", VecFP,
172 []>;
173def VCTUXS : VXForm_1<906, (ops VRRC:$vD, u5imm:$UIMM, VRRC:$vB),
174 "vctuxs $vD, $vB, $UIMM", VecFP,
175 []>;
176def VEXPTEFP : VXForm_2<394, (ops VRRC:$vD, VRRC:$vB),
177 "vexptefp $vD, $vB", VecFP,
178 []>;
179def VLOGEFP : VXForm_2<458, (ops VRRC:$vD, VRRC:$vB),
180 "vlogefp $vD, $vB", VecFP,
181 []>;
182def VMAXFP : VXForm_1<1034, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
183 "vmaxfp $vD, $vA, $vB", VecFP,
184 []>;
185def VMINFP : VXForm_1<1098, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
186 "vminfp $vD, $vA, $vB", VecFP,
187 []>;
188def VREFP : VXForm_2<266, (ops VRRC:$vD, VRRC:$vB),
189 "vrefp $vD, $vB", VecFP,
190 []>;
191def VRFIM : VXForm_2<714, (ops VRRC:$vD, VRRC:$vB),
192 "vrfim $vD, $vB", VecFP,
193 []>;
194def VRFIN : VXForm_2<522, (ops VRRC:$vD, VRRC:$vB),
195 "vrfin $vD, $vB", VecFP,
196 []>;
197def VRFIP : VXForm_2<650, (ops VRRC:$vD, VRRC:$vB),
198 "vrfip $vD, $vB", VecFP,
199 []>;
200def VRFIZ : VXForm_2<586, (ops VRRC:$vD, VRRC:$vB),
201 "vrfiz $vD, $vB", VecFP,
202 []>;
203def VRSQRTEFP : VXForm_2<330, (ops VRRC:$vD, VRRC:$vB),
204 "vrsqrtefp $vD, $vB", VecFP,
Chris Lattner984f38b2006-03-25 08:01:02 +0000205 [(set VRRC:$vD,(int_ppc_altivec_vrsqrtefp VRRC:$vB))]>;
Chris Lattnerb22a04d2006-03-25 07:51:43 +0000206def VSUBFP : VXForm_1<74, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
207 "vsubfp $vD, $vA, $vB", VecFP,
208 [(set VRRC:$vD, (fsub VRRC:$vA, VRRC:$vB))]>;
209def VOR : VXForm_1<1156, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
210 "vor $vD, $vA, $vB", VecFP,
211 []>;
212def VXOR : VXForm_1<1220, (ops VRRC:$vD, VRRC:$vA, VRRC:$vB),
213 "vxor $vD, $vA, $vB", VecFP,
214 []>;
215
216def VSPLTB : VXForm_1<524, (ops VRRC:$vD, u5imm:$UIMM, VRRC:$vB),
217 "vspltb $vD, $vB, $UIMM", VecPerm,
218 []>;
219def VSPLTH : VXForm_1<588, (ops VRRC:$vD, u5imm:$UIMM, VRRC:$vB),
220 "vsplth $vD, $vB, $UIMM", VecPerm,
221 []>;
222def VSPLTW : VXForm_1<652, (ops VRRC:$vD, u5imm:$UIMM, VRRC:$vB),
223 "vspltw $vD, $vB, $UIMM", VecPerm,
224 [(set VRRC:$vD, (vector_shuffle (v4f32 VRRC:$vB), (undef),
225 VSPLT_shuffle_mask:$UIMM))]>;
226
227def VSPLTISB : VXForm_1<780, (ops VRRC:$vD, s5imm:$SIMM),
228 "vspltisb $vD, $SIMM", VecPerm,
229 [(set VRRC:$vD, (v4f32 vecspltisb:$SIMM))]>;
230def VSPLTISH : VXForm_1<844, (ops VRRC:$vD, s5imm:$SIMM),
231 "vspltish $vD, $SIMM", VecPerm,
232 [(set VRRC:$vD, (v4f32 vecspltish:$SIMM))]>;
233def VSPLTISW : VXForm_1<908, (ops VRRC:$vD, s5imm:$SIMM),
234 "vspltisw $vD, $SIMM", VecPerm,
235 [(set VRRC:$vD, (v4f32 vecspltisw:$SIMM))]>;
236
237
238// VX-Form Pseudo Instructions
239
240def V_SET0 : VXForm_setzero<1220, (ops VRRC:$vD),
241 "vxor $vD, $vD, $vD", VecFP,
242 [(set VRRC:$vD, (v4f32 vecimm0))]>;
243}
244
245//===----------------------------------------------------------------------===//
246// Additional Altivec Patterns
247//
248
249// Undef/Zero.
250def : Pat<(v16i8 (undef)), (v16i8 (IMPLICIT_DEF_VRRC))>;
251def : Pat<(v8i16 (undef)), (v8i16 (IMPLICIT_DEF_VRRC))>;
252def : Pat<(v4i32 (undef)), (v4i32 (IMPLICIT_DEF_VRRC))>;
253def : Pat<(v16i8 vecimm0), (v16i8 (V_SET0))>;
254def : Pat<(v8i16 vecimm0), (v8i16 (V_SET0))>;
255def : Pat<(v4i32 vecimm0), (v4i32 (V_SET0))>;
256
257// Loads.
258def : Pat<(v16i8 (load xoaddr:$src)), (v16i8 (LVX xoaddr:$src))>;
259def : Pat<(v8i16 (load xoaddr:$src)), (v8i16 (LVX xoaddr:$src))>;
260def : Pat<(v4i32 (load xoaddr:$src)), (v4i32 (LVX xoaddr:$src))>;
261
262// Stores.
263def : Pat<(store (v16i8 VRRC:$rS), xoaddr:$dst),
264 (STVX (v16i8 VRRC:$rS), xoaddr:$dst)>;
265def : Pat<(store (v8i16 VRRC:$rS), xoaddr:$dst),
266 (STVX (v8i16 VRRC:$rS), xoaddr:$dst)>;
267def : Pat<(store (v4i32 VRRC:$rS), xoaddr:$dst),
268 (STVX (v4i32 VRRC:$rS), xoaddr:$dst)>;
269
270// Bit conversions.
271def : Pat<(v16i8 (bitconvert (v8i16 VRRC:$src))), (v16i8 VRRC:$src)>;
272def : Pat<(v16i8 (bitconvert (v4i32 VRRC:$src))), (v16i8 VRRC:$src)>;
273def : Pat<(v16i8 (bitconvert (v4f32 VRRC:$src))), (v16i8 VRRC:$src)>;
274
275def : Pat<(v8i16 (bitconvert (v16i8 VRRC:$src))), (v8i16 VRRC:$src)>;
276def : Pat<(v8i16 (bitconvert (v4i32 VRRC:$src))), (v8i16 VRRC:$src)>;
277def : Pat<(v8i16 (bitconvert (v4f32 VRRC:$src))), (v8i16 VRRC:$src)>;
278
279def : Pat<(v4i32 (bitconvert (v16i8 VRRC:$src))), (v4i32 VRRC:$src)>;
280def : Pat<(v4i32 (bitconvert (v8i16 VRRC:$src))), (v4i32 VRRC:$src)>;
281def : Pat<(v4i32 (bitconvert (v4f32 VRRC:$src))), (v4i32 VRRC:$src)>;
282
283def : Pat<(v4f32 (bitconvert (v16i8 VRRC:$src))), (v4f32 VRRC:$src)>;
284def : Pat<(v4f32 (bitconvert (v8i16 VRRC:$src))), (v4f32 VRRC:$src)>;
285def : Pat<(v4f32 (bitconvert (v4i32 VRRC:$src))), (v4f32 VRRC:$src)>;
286
287// Immediate vector formation with vsplti*.
288def : Pat<(v16i8 vecspltisb:$invec), (v16i8 (VSPLTISB vecspltisb:$invec))>;
289def : Pat<(v16i8 vecspltish:$invec), (v16i8 (VSPLTISH vecspltish:$invec))>;
290def : Pat<(v16i8 vecspltisw:$invec), (v16i8 (VSPLTISW vecspltisw:$invec))>;
291
292def : Pat<(v8i16 vecspltisb:$invec), (v8i16 (VSPLTISB vecspltisb:$invec))>;
293def : Pat<(v8i16 vecspltish:$invec), (v8i16 (VSPLTISH vecspltish:$invec))>;
294def : Pat<(v8i16 vecspltisw:$invec), (v8i16 (VSPLTISW vecspltisw:$invec))>;
295
296def : Pat<(v4i32 vecspltisb:$invec), (v4i32 (VSPLTISB vecspltisb:$invec))>;
297def : Pat<(v4i32 vecspltish:$invec), (v4i32 (VSPLTISH vecspltish:$invec))>;
298def : Pat<(v4i32 vecspltisw:$invec), (v4i32 (VSPLTISW vecspltisw:$invec))>;
299
300
301
302def : Pat<(fmul VRRC:$vA, VRRC:$vB),
303 (VMADDFP VRRC:$vA, VRRC:$vB, (V_SET0))>;
304
305// Fused multiply add and multiply sub for packed float. These are represented
306// separately from the real instructions above, for operations that must have
307// the additional precision, such as Newton-Rhapson (used by divide, sqrt)
308def : Pat<(PPCvmaddfp VRRC:$A, VRRC:$B, VRRC:$C),
309 (VMADDFP VRRC:$A, VRRC:$B, VRRC:$C)>;
310def : Pat<(PPCvnmsubfp VRRC:$A, VRRC:$B, VRRC:$C),
311 (VNMSUBFP VRRC:$A, VRRC:$B, VRRC:$C)>;
312
313def : Pat<(int_ppc_altivec_vmaddfp VRRC:$A, VRRC:$B, VRRC:$C),
314 (VMADDFP VRRC:$A, VRRC:$B, VRRC:$C)>;
315def : Pat<(int_ppc_altivec_vnmsubfp VRRC:$A, VRRC:$B, VRRC:$C),
316 (VNMSUBFP VRRC:$A, VRRC:$B, VRRC:$C)>;
317
318def : Pat<(vector_shuffle (v4i32 VRRC:$vB), (undef), VSPLT_shuffle_mask:$UIMM),
319 (v4i32 (VSPLTW VSPLT_shuffle_mask:$UIMM, VRRC:$vB))>;
320
321def : Pat<(PPCvperm (v4i32 VRRC:$vA), VRRC:$vB, VRRC:$vC),
322 (v4i32 (VPERM VRRC:$vA, VRRC:$vB, VRRC:$vC))>;
323
324def : Pat<(v4i32 (PPClve_x xoaddr:$src)),
325 (v4i32 (LVEWX xoaddr:$src))>;
326
327