blob: 8440fdab0eeae559ff1ec79a1a1fd00410399046 [file] [log] [blame]
Andrea Di Biagio446a5272014-05-30 23:17:53 +00001; RUN: llc < %s -march=x86-64 -mcpu=corei7 -mtriple=x86_64-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK -check-prefix=SSE41
2; RUN: llc < %s -march=x86-64 -mcpu=corei7-avx -mtriple=x86_64-unknown-linux-gnu | FileCheck %s -check-prefix=CHECK -check-prefix=AVX
3
4
5define double @test1_add(double %A, double %B) {
6 %1 = bitcast double %A to <2 x i32>
7 %2 = bitcast double %B to <2 x i32>
8 %add = add <2 x i32> %1, %2
9 %3 = bitcast <2 x i32> %add to double
10 ret double %3
11}
12; CHECK-LABEL: test1_add
13; SSE41: paddd
14; AVX: vpaddd
15; CHECK-NEXT: ret
16
17
18define double @test2_add(double %A, double %B) {
19 %1 = bitcast double %A to <4 x i16>
20 %2 = bitcast double %B to <4 x i16>
21 %add = add <4 x i16> %1, %2
22 %3 = bitcast <4 x i16> %add to double
23 ret double %3
24}
25; CHECK-LABEL: test2_add
26; SSE41: paddw
27; AVX: vpaddw
28; CHECK-NEXT: ret
29
30define double @test3_add(double %A, double %B) {
31 %1 = bitcast double %A to <8 x i8>
32 %2 = bitcast double %B to <8 x i8>
33 %add = add <8 x i8> %1, %2
34 %3 = bitcast <8 x i8> %add to double
35 ret double %3
36}
37; CHECK-LABEL: test3_add
38; SSE41: paddb
39; AVX: vpaddb
40; CHECK-NEXT: ret
41
42
43define double @test1_sub(double %A, double %B) {
44 %1 = bitcast double %A to <2 x i32>
45 %2 = bitcast double %B to <2 x i32>
46 %sub = sub <2 x i32> %1, %2
47 %3 = bitcast <2 x i32> %sub to double
48 ret double %3
49}
50; CHECK-LABEL: test1_sub
51; SSE41: psubd
52; AVX: vpsubd
53; CHECK-NEXT: ret
54
55
56define double @test2_sub(double %A, double %B) {
57 %1 = bitcast double %A to <4 x i16>
58 %2 = bitcast double %B to <4 x i16>
59 %sub = sub <4 x i16> %1, %2
60 %3 = bitcast <4 x i16> %sub to double
61 ret double %3
62}
63; CHECK-LABEL: test2_sub
64; SSE41: psubw
65; AVX: vpsubw
66; CHECK-NEXT: ret
67
68
69define double @test3_sub(double %A, double %B) {
70 %1 = bitcast double %A to <8 x i8>
71 %2 = bitcast double %B to <8 x i8>
72 %sub = sub <8 x i8> %1, %2
73 %3 = bitcast <8 x i8> %sub to double
74 ret double %3
75}
76; CHECK-LABEL: test3_sub
77; SSE41: psubb
78; AVX: vpsubb
79; CHECK-NEXT: ret
80
81
82define double @test1_mul(double %A, double %B) {
83 %1 = bitcast double %A to <2 x i32>
84 %2 = bitcast double %B to <2 x i32>
85 %mul = mul <2 x i32> %1, %2
86 %3 = bitcast <2 x i32> %mul to double
87 ret double %3
88}
89; CHECK-LABEL: test1_mul
90; SSE41: pmulld
91; AVX: vpmulld
92; CHECK-NEXT: ret
93
94
95define double @test2_mul(double %A, double %B) {
96 %1 = bitcast double %A to <4 x i16>
97 %2 = bitcast double %B to <4 x i16>
98 %mul = mul <4 x i16> %1, %2
99 %3 = bitcast <4 x i16> %mul to double
100 ret double %3
101}
102; CHECK-LABEL: test2_mul
103; SSE41: pmullw
104; AVX: vpmullw
105; CHECK-NEXT: ret
106
107; There is no legal ISD::MUL with type MVT::v8i16.
108define double @test3_mul(double %A, double %B) {
109 %1 = bitcast double %A to <8 x i8>
110 %2 = bitcast double %B to <8 x i8>
111 %mul = mul <8 x i8> %1, %2
112 %3 = bitcast <8 x i8> %mul to double
113 ret double %3
114}
115; CHECK-LABEL: test3_mul
116; CHECK: pmullw
117; CHECK-NEXT: pshufb
118; CHECK-NEXT: ret
119
120
121define double @test1_and(double %A, double %B) {
122 %1 = bitcast double %A to <2 x i32>
123 %2 = bitcast double %B to <2 x i32>
124 %and = and <2 x i32> %1, %2
125 %3 = bitcast <2 x i32> %and to double
126 ret double %3
127}
128; CHECK-LABEL: test1_and
129; SSE41: andps
130; AVX: vandps
131; CHECK-NEXT: ret
132
133
134define double @test2_and(double %A, double %B) {
135 %1 = bitcast double %A to <4 x i16>
136 %2 = bitcast double %B to <4 x i16>
137 %and = and <4 x i16> %1, %2
138 %3 = bitcast <4 x i16> %and to double
139 ret double %3
140}
141; CHECK-LABEL: test2_and
142; SSE41: andps
143; AVX: vandps
144; CHECK-NEXT: ret
145
146
147define double @test3_and(double %A, double %B) {
148 %1 = bitcast double %A to <8 x i8>
149 %2 = bitcast double %B to <8 x i8>
150 %and = and <8 x i8> %1, %2
151 %3 = bitcast <8 x i8> %and to double
152 ret double %3
153}
154; CHECK-LABEL: test3_and
155; SSE41: andps
156; AVX: vandps
157; CHECK-NEXT: ret
158
159
160define double @test1_or(double %A, double %B) {
161 %1 = bitcast double %A to <2 x i32>
162 %2 = bitcast double %B to <2 x i32>
163 %or = or <2 x i32> %1, %2
164 %3 = bitcast <2 x i32> %or to double
165 ret double %3
166}
167; CHECK-LABEL: test1_or
168; SSE41: orps
169; AVX: vorps
170; CHECK-NEXT: ret
171
172
173define double @test2_or(double %A, double %B) {
174 %1 = bitcast double %A to <4 x i16>
175 %2 = bitcast double %B to <4 x i16>
176 %or = or <4 x i16> %1, %2
177 %3 = bitcast <4 x i16> %or to double
178 ret double %3
179}
180; CHECK-LABEL: test2_or
181; SSE41: orps
182; AVX: vorps
183; CHECK-NEXT: ret
184
185
186define double @test3_or(double %A, double %B) {
187 %1 = bitcast double %A to <8 x i8>
188 %2 = bitcast double %B to <8 x i8>
189 %or = or <8 x i8> %1, %2
190 %3 = bitcast <8 x i8> %or to double
191 ret double %3
192}
193; CHECK-LABEL: test3_or
194; SSE41: orps
195; AVX: vorps
196; CHECK-NEXT: ret
197
198
199define double @test1_xor(double %A, double %B) {
200 %1 = bitcast double %A to <2 x i32>
201 %2 = bitcast double %B to <2 x i32>
202 %xor = xor <2 x i32> %1, %2
203 %3 = bitcast <2 x i32> %xor to double
204 ret double %3
205}
206; CHECK-LABEL: test1_xor
207; SSE41: xorps
208; AVX: vxorps
209; CHECK-NEXT: ret
210
211
212define double @test2_xor(double %A, double %B) {
213 %1 = bitcast double %A to <4 x i16>
214 %2 = bitcast double %B to <4 x i16>
215 %xor = xor <4 x i16> %1, %2
216 %3 = bitcast <4 x i16> %xor to double
217 ret double %3
218}
219; CHECK-LABEL: test2_xor
220; SSE41: xorps
221; AVX: vxorps
222; CHECK-NEXT: ret
223
224
225define double @test3_xor(double %A, double %B) {
226 %1 = bitcast double %A to <8 x i8>
227 %2 = bitcast double %B to <8 x i8>
228 %xor = xor <8 x i8> %1, %2
229 %3 = bitcast <8 x i8> %xor to double
230 ret double %3
231}
232; CHECK-LABEL: test3_xor
233; SSE41: xorps
234; AVX: vxorps
235; CHECK-NEXT: ret
236
237
238define double @test_fadd(double %A, double %B) {
239 %1 = bitcast double %A to <2 x float>
240 %2 = bitcast double %B to <2 x float>
241 %add = fadd <2 x float> %1, %2
242 %3 = bitcast <2 x float> %add to double
243 ret double %3
244}
245; CHECK-LABEL: test_fadd
246; SSE41: addps
247; AVX: vaddps
248; CHECK-NEXT: ret
249
250define double @test_fsub(double %A, double %B) {
251 %1 = bitcast double %A to <2 x float>
252 %2 = bitcast double %B to <2 x float>
253 %sub = fsub <2 x float> %1, %2
254 %3 = bitcast <2 x float> %sub to double
255 ret double %3
256}
257; CHECK-LABEL: test_fsub
258; SSE41: subps
259; AVX: vsubps
260; CHECK-NEXT: ret
261
262define double @test_fmul(double %A, double %B) {
263 %1 = bitcast double %A to <2 x float>
264 %2 = bitcast double %B to <2 x float>
265 %mul = fmul <2 x float> %1, %2
266 %3 = bitcast <2 x float> %mul to double
267 ret double %3
268}
269; CHECK-LABEL: test_fmul
270; SSE41: mulps
271; AVX: vmulps
272; CHECK-NEXT: ret
273