[mips][msa] Added support for matching mulv, nlzc, sll, sra, srl, and subv from norma...
[oota-llvm.git] / test / CodeGen / Mips / msa / 2rf.ll
1 ; Test the MSA intrinsics that are encoded with the 2RF instruction format.
2
3 ; RUN: llc -march=mips -mattr=+msa < %s | FileCheck %s
4
5 @llvm_mips_flog2_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
6 @llvm_mips_flog2_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
7
8 define void @llvm_mips_flog2_w_test() nounwind {
9 entry:
10   %0 = load <4 x float>* @llvm_mips_flog2_w_ARG1
11   %1 = tail call <4 x float> @llvm.mips.flog2.w(<4 x float> %0)
12   store <4 x float> %1, <4 x float>* @llvm_mips_flog2_w_RES
13   ret void
14 }
15
16 declare <4 x float> @llvm.mips.flog2.w(<4 x float>) nounwind
17
18 ; CHECK: llvm_mips_flog2_w_test:
19 ; CHECK: ld.w
20 ; CHECK: flog2.w
21 ; CHECK: st.w
22 ; CHECK: .size llvm_mips_flog2_w_test
23 ;
24 @llvm_mips_flog2_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
25 @llvm_mips_flog2_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
26
27 define void @llvm_mips_flog2_d_test() nounwind {
28 entry:
29   %0 = load <2 x double>* @llvm_mips_flog2_d_ARG1
30   %1 = tail call <2 x double> @llvm.mips.flog2.d(<2 x double> %0)
31   store <2 x double> %1, <2 x double>* @llvm_mips_flog2_d_RES
32   ret void
33 }
34
35 declare <2 x double> @llvm.mips.flog2.d(<2 x double>) nounwind
36
37 ; CHECK: llvm_mips_flog2_d_test:
38 ; CHECK: ld.d
39 ; CHECK: flog2.d
40 ; CHECK: st.d
41 ; CHECK: .size llvm_mips_flog2_d_test
42
43 define void @flog2_w_test() nounwind {
44 entry:
45   %0 = load <4 x float>* @llvm_mips_flog2_w_ARG1
46   %1 = tail call <4 x float> @llvm.log2.v4f32(<4 x float> %0)
47   store <4 x float> %1, <4 x float>* @llvm_mips_flog2_w_RES
48   ret void
49 }
50
51 declare <4 x float> @llvm.log2.v4f32(<4 x float> %val)
52
53 ; CHECK: flog2_w_test:
54 ; CHECK: ld.w
55 ; CHECK: flog2.w
56 ; CHECK: st.w
57 ; CHECK: .size flog2_w_test
58
59 define void @flog2_d_test() nounwind {
60 entry:
61   %0 = load <2 x double>* @llvm_mips_flog2_d_ARG1
62   %1 = tail call <2 x double> @llvm.log2.v2f64(<2 x double> %0)
63   store <2 x double> %1, <2 x double>* @llvm_mips_flog2_d_RES
64   ret void
65 }
66
67 declare <2 x double> @llvm.log2.v2f64(<2 x double> %val)
68
69 ; CHECK: flog2_d_test:
70 ; CHECK: ld.d
71 ; CHECK: flog2.d
72 ; CHECK: st.d
73 ; CHECK: .size flog2_d_test
74 ;
75 @llvm_mips_frint_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
76 @llvm_mips_frint_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
77
78 define void @llvm_mips_frint_w_test() nounwind {
79 entry:
80   %0 = load <4 x float>* @llvm_mips_frint_w_ARG1
81   %1 = tail call <4 x float> @llvm.mips.frint.w(<4 x float> %0)
82   store <4 x float> %1, <4 x float>* @llvm_mips_frint_w_RES
83   ret void
84 }
85
86 declare <4 x float> @llvm.mips.frint.w(<4 x float>) nounwind
87
88 ; CHECK: llvm_mips_frint_w_test:
89 ; CHECK: ld.w
90 ; CHECK: frint.w
91 ; CHECK: st.w
92 ; CHECK: .size llvm_mips_frint_w_test
93 ;
94 @llvm_mips_frint_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
95 @llvm_mips_frint_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
96
97 define void @llvm_mips_frint_d_test() nounwind {
98 entry:
99   %0 = load <2 x double>* @llvm_mips_frint_d_ARG1
100   %1 = tail call <2 x double> @llvm.mips.frint.d(<2 x double> %0)
101   store <2 x double> %1, <2 x double>* @llvm_mips_frint_d_RES
102   ret void
103 }
104
105 declare <2 x double> @llvm.mips.frint.d(<2 x double>) nounwind
106
107 ; CHECK: llvm_mips_frint_d_test:
108 ; CHECK: ld.d
109 ; CHECK: frint.d
110 ; CHECK: st.d
111 ; CHECK: .size llvm_mips_frint_d_test
112
113 define void @frint_w_test() nounwind {
114 entry:
115   %0 = load <4 x float>* @llvm_mips_frint_w_ARG1
116   %1 = tail call <4 x float> @llvm.rint.v4f32(<4 x float> %0)
117   store <4 x float> %1, <4 x float>* @llvm_mips_frint_w_RES
118   ret void
119 }
120
121 declare <4 x float> @llvm.rint.v4f32(<4 x float>) nounwind
122
123 ; CHECK: frint_w_test:
124 ; CHECK: ld.w
125 ; CHECK: frint.w
126 ; CHECK: st.w
127 ; CHECK: .size frint_w_test
128
129 define void @frint_d_test() nounwind {
130 entry:
131   %0 = load <2 x double>* @llvm_mips_frint_d_ARG1
132   %1 = tail call <2 x double> @llvm.rint.v2f64(<2 x double> %0)
133   store <2 x double> %1, <2 x double>* @llvm_mips_frint_d_RES
134   ret void
135 }
136
137 declare <2 x double> @llvm.rint.v2f64(<2 x double>) nounwind
138
139 ; CHECK: frint_d_test:
140 ; CHECK: ld.d
141 ; CHECK: frint.d
142 ; CHECK: st.d
143 ; CHECK: .size frint_d_test
144 ;
145 @llvm_mips_frcp_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
146 @llvm_mips_frcp_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
147
148 define void @llvm_mips_frcp_w_test() nounwind {
149 entry:
150   %0 = load <4 x float>* @llvm_mips_frcp_w_ARG1
151   %1 = tail call <4 x float> @llvm.mips.frcp.w(<4 x float> %0)
152   store <4 x float> %1, <4 x float>* @llvm_mips_frcp_w_RES
153   ret void
154 }
155
156 declare <4 x float> @llvm.mips.frcp.w(<4 x float>) nounwind
157
158 ; CHECK: llvm_mips_frcp_w_test:
159 ; CHECK: ld.w
160 ; CHECK: frcp.w
161 ; CHECK: st.w
162 ; CHECK: .size llvm_mips_frcp_w_test
163 ;
164 @llvm_mips_frcp_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
165 @llvm_mips_frcp_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
166
167 define void @llvm_mips_frcp_d_test() nounwind {
168 entry:
169   %0 = load <2 x double>* @llvm_mips_frcp_d_ARG1
170   %1 = tail call <2 x double> @llvm.mips.frcp.d(<2 x double> %0)
171   store <2 x double> %1, <2 x double>* @llvm_mips_frcp_d_RES
172   ret void
173 }
174
175 declare <2 x double> @llvm.mips.frcp.d(<2 x double>) nounwind
176
177 ; CHECK: llvm_mips_frcp_d_test:
178 ; CHECK: ld.d
179 ; CHECK: frcp.d
180 ; CHECK: st.d
181 ; CHECK: .size llvm_mips_frcp_d_test
182 ;
183 @llvm_mips_frsqrt_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
184 @llvm_mips_frsqrt_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
185
186 define void @llvm_mips_frsqrt_w_test() nounwind {
187 entry:
188   %0 = load <4 x float>* @llvm_mips_frsqrt_w_ARG1
189   %1 = tail call <4 x float> @llvm.mips.frsqrt.w(<4 x float> %0)
190   store <4 x float> %1, <4 x float>* @llvm_mips_frsqrt_w_RES
191   ret void
192 }
193
194 declare <4 x float> @llvm.mips.frsqrt.w(<4 x float>) nounwind
195
196 ; CHECK: llvm_mips_frsqrt_w_test:
197 ; CHECK: ld.w
198 ; CHECK: frsqrt.w
199 ; CHECK: st.w
200 ; CHECK: .size llvm_mips_frsqrt_w_test
201 ;
202 @llvm_mips_frsqrt_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
203 @llvm_mips_frsqrt_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
204
205 define void @llvm_mips_frsqrt_d_test() nounwind {
206 entry:
207   %0 = load <2 x double>* @llvm_mips_frsqrt_d_ARG1
208   %1 = tail call <2 x double> @llvm.mips.frsqrt.d(<2 x double> %0)
209   store <2 x double> %1, <2 x double>* @llvm_mips_frsqrt_d_RES
210   ret void
211 }
212
213 declare <2 x double> @llvm.mips.frsqrt.d(<2 x double>) nounwind
214
215 ; CHECK: llvm_mips_frsqrt_d_test:
216 ; CHECK: ld.d
217 ; CHECK: frsqrt.d
218 ; CHECK: st.d
219 ; CHECK: .size llvm_mips_frsqrt_d_test
220 ;
221 @llvm_mips_fsqrt_w_ARG1 = global <4 x float> <float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>, align 16
222 @llvm_mips_fsqrt_w_RES  = global <4 x float> <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, align 16
223
224 define void @llvm_mips_fsqrt_w_test() nounwind {
225 entry:
226   %0 = load <4 x float>* @llvm_mips_fsqrt_w_ARG1
227   %1 = tail call <4 x float> @llvm.mips.fsqrt.w(<4 x float> %0)
228   store <4 x float> %1, <4 x float>* @llvm_mips_fsqrt_w_RES
229   ret void
230 }
231
232 declare <4 x float> @llvm.mips.fsqrt.w(<4 x float>) nounwind
233
234 ; CHECK: llvm_mips_fsqrt_w_test:
235 ; CHECK: ld.w
236 ; CHECK: fsqrt.w
237 ; CHECK: st.w
238 ; CHECK: .size llvm_mips_fsqrt_w_test
239 ;
240 @llvm_mips_fsqrt_d_ARG1 = global <2 x double> <double 0.000000e+00, double 1.000000e+00>, align 16
241 @llvm_mips_fsqrt_d_RES  = global <2 x double> <double 0.000000e+00, double 0.000000e+00>, align 16
242
243 define void @llvm_mips_fsqrt_d_test() nounwind {
244 entry:
245   %0 = load <2 x double>* @llvm_mips_fsqrt_d_ARG1
246   %1 = tail call <2 x double> @llvm.mips.fsqrt.d(<2 x double> %0)
247   store <2 x double> %1, <2 x double>* @llvm_mips_fsqrt_d_RES
248   ret void
249 }
250
251 declare <2 x double> @llvm.mips.fsqrt.d(<2 x double>) nounwind
252
253 ; CHECK: llvm_mips_fsqrt_d_test:
254 ; CHECK: ld.d
255 ; CHECK: fsqrt.d
256 ; CHECK: st.d
257 ; CHECK: .size llvm_mips_fsqrt_d_test
258
259 define void @fsqrt_w_test() nounwind {
260 entry:
261   %0 = load <4 x float>* @llvm_mips_fsqrt_w_ARG1
262   %1 = tail call <4 x float> @llvm.sqrt.v4f32(<4 x float> %0)
263   store <4 x float> %1, <4 x float>* @llvm_mips_fsqrt_w_RES
264   ret void
265 }
266
267 declare <4 x float> @llvm.sqrt.v4f32(<4 x float>) nounwind
268
269 ; CHECK: fsqrt_w_test:
270 ; CHECK: ld.w
271 ; CHECK: fsqrt.w
272 ; CHECK: st.w
273 ; CHECK: .size fsqrt_w_test
274
275 define void @fsqrt_d_test() nounwind {
276 entry:
277   %0 = load <2 x double>* @llvm_mips_fsqrt_d_ARG1
278   %1 = tail call <2 x double> @llvm.sqrt.v2f64(<2 x double> %0)
279   store <2 x double> %1, <2 x double>* @llvm_mips_fsqrt_d_RES
280   ret void
281 }
282
283 declare <2 x double> @llvm.sqrt.v2f64(<2 x double>) nounwind
284
285 ; CHECK: fsqrt_d_test:
286 ; CHECK: ld.d
287 ; CHECK: fsqrt.d
288 ; CHECK: st.d
289 ; CHECK: .size fsqrt_d_test
290 ;