Add a neat little two's complement hack for x86.
[oota-llvm.git] / test / CodeGen / X86 / avx-256-splat.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck %s
2
3 ; FIXME: use avx versions for punpcklbw, punpckhbw and punpckhwd
4
5 ; CHECK: vextractf128 $0
6 ; CHECK-NEXT: punpcklbw
7 ; CHECK-NEXT: punpckhbw
8 ; CHECK-NEXT: vinsertf128 $1
9 ; CHECK-NEXT: vpermilps $85
10 define <32 x i8> @funcA(<32 x i8> %a) nounwind uwtable readnone ssp {
11 entry:
12   %shuffle = shufflevector <32 x i8> %a, <32 x i8> undef, <32 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
13   ret <32 x i8> %shuffle
14 }
15
16 ; CHECK: vextractf128 $0
17 ; CHECK-NEXT: punpckhwd
18 ; CHECK-NEXT: vinsertf128 $1
19 ; CHECK-NEXT: vpermilps $85
20 define <16 x i16> @funcB(<16 x i16> %a) nounwind uwtable readnone ssp {
21 entry:
22   %shuffle = shufflevector <16 x i16> %a, <16 x i16> undef, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
23   ret <16 x i16> %shuffle
24 }
25
26 ; CHECK: vmovd
27 ; CHECK-NEXT: movlhps
28 ; CHECK-NEXT: vinsertf128 $1
29 define <4 x i64> @funcC(i64 %q) nounwind uwtable readnone ssp {
30 entry:
31   %vecinit.i = insertelement <4 x i64> undef, i64 %q, i32 0
32   %vecinit2.i = insertelement <4 x i64> %vecinit.i, i64 %q, i32 1
33   %vecinit4.i = insertelement <4 x i64> %vecinit2.i, i64 %q, i32 2
34   %vecinit6.i = insertelement <4 x i64> %vecinit4.i, i64 %q, i32 3
35   ret <4 x i64> %vecinit6.i
36 }
37
38 ; CHECK: vshufpd
39 ; CHECK-NEXT: vinsertf128 $1
40 define <4 x double> @funcD(double %q) nounwind uwtable readnone ssp {
41 entry:
42   %vecinit.i = insertelement <4 x double> undef, double %q, i32 0
43   %vecinit2.i = insertelement <4 x double> %vecinit.i, double %q, i32 1
44   %vecinit4.i = insertelement <4 x double> %vecinit2.i, double %q, i32 2
45   %vecinit6.i = insertelement <4 x double> %vecinit4.i, double %q, i32 3
46   ret <4 x double> %vecinit6.i
47 }