Merging r261039:
[oota-llvm.git] / test / CodeGen / X86 / palignr.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -march=x86 -mcpu=core2 -mattr=+ssse3 | FileCheck %s
3 ; RUN: llc < %s -march=x86 -mcpu=yonah | FileCheck --check-prefix=CHECK-YONAH %s
4
5 define <4 x i32> @test1(<4 x i32> %A, <4 x i32> %B) nounwind {
6 ; CHECK-LABEL: test1:
7 ; CHECK:       # BB#0:
8 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0]
9 ; CHECK-NEXT:    retl
10 ;
11 ; CHECK-YONAH-LABEL: test1:
12 ; CHECK-YONAH:       # BB#0:
13 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0]
14 ; CHECK-YONAH-NEXT:    retl
15   %C = shufflevector <4 x i32> %A, <4 x i32> undef, <4 x i32> < i32 1, i32 2, i32 3, i32 0 >
16         ret <4 x i32> %C
17 }
18
19 define <4 x i32> @test2(<4 x i32> %A, <4 x i32> %B) nounwind {
20 ; CHECK-LABEL: test2:
21 ; CHECK:       # BB#0:
22 ; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
23 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
24 ; CHECK-NEXT:    retl
25 ;
26 ; CHECK-YONAH-LABEL: test2:
27 ; CHECK-YONAH:       # BB#0:
28 ; CHECK-YONAH-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
29 ; CHECK-YONAH-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
30 ; CHECK-YONAH-NEXT:    retl
31   %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 3, i32 4 >
32         ret <4 x i32> %C
33 }
34
35 define <4 x i32> @test3(<4 x i32> %A, <4 x i32> %B) nounwind {
36 ; CHECK-LABEL: test3:
37 ; CHECK:       # BB#0:
38 ; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
39 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
40 ; CHECK-NEXT:    retl
41 ;
42 ; CHECK-YONAH-LABEL: test3:
43 ; CHECK-YONAH:       # BB#0:
44 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
45 ; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,2,2,3]
46 ; CHECK-YONAH-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
47 ; CHECK-YONAH-NEXT:    retl
48   %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 undef, i32 4 >
49         ret <4 x i32> %C
50 }
51
52 define <4 x i32> @test4(<4 x i32> %A, <4 x i32> %B) nounwind {
53 ; CHECK-LABEL: test4:
54 ; CHECK:       # BB#0:
55 ; CHECK-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
56 ; CHECK-NEXT:    retl
57 ;
58 ; CHECK-YONAH-LABEL: test4:
59 ; CHECK-YONAH:       # BB#0:
60 ; CHECK-YONAH-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
61 ; CHECK-YONAH-NEXT:    movapd %xmm1, %xmm0
62 ; CHECK-YONAH-NEXT:    retl
63   %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 >
64         ret <4 x i32> %C
65 }
66
67 define <4 x float> @test5(<4 x float> %A, <4 x float> %B) nounwind {
68 ; CHECK-LABEL: test5:
69 ; CHECK:       # BB#0:
70 ; CHECK-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
71 ; CHECK-NEXT:    movapd %xmm1, %xmm0
72 ; CHECK-NEXT:    retl
73 ;
74 ; CHECK-YONAH-LABEL: test5:
75 ; CHECK-YONAH:       # BB#0:
76 ; CHECK-YONAH-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
77 ; CHECK-YONAH-NEXT:    movapd %xmm1, %xmm0
78 ; CHECK-YONAH-NEXT:    retl
79   %C = shufflevector <4 x float> %A, <4 x float> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 >
80         ret <4 x float> %C
81 }
82
83 define <8 x i16> @test6(<8 x i16> %A, <8 x i16> %B) nounwind {
84 ; CHECK-LABEL: test6:
85 ; CHECK:       # BB#0:
86 ; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
87 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
88 ; CHECK-NEXT:    retl
89 ;
90 ; CHECK-YONAH-LABEL: test6:
91 ; CHECK-YONAH:       # BB#0:
92 ; CHECK-YONAH-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
93 ; CHECK-YONAH-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5]
94 ; CHECK-YONAH-NEXT:    por %xmm1, %xmm0
95 ; CHECK-YONAH-NEXT:    retl
96   %C = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> < i32 3, i32 4, i32 undef, i32 6, i32 7, i32 8, i32 9, i32 10 >
97         ret <8 x i16> %C
98 }
99
100 define <8 x i16> @test7(<8 x i16> %A, <8 x i16> %B) nounwind {
101 ; CHECK-LABEL: test7:
102 ; CHECK:       # BB#0:
103 ; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
104 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
105 ; CHECK-NEXT:    retl
106 ;
107 ; CHECK-YONAH-LABEL: test7:
108 ; CHECK-YONAH:       # BB#0:
109 ; CHECK-YONAH-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
110 ; CHECK-YONAH-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6,7,8,9]
111 ; CHECK-YONAH-NEXT:    por %xmm1, %xmm0
112 ; CHECK-YONAH-NEXT:    retl
113   %C = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> < i32 undef, i32 6, i32 undef, i32 8, i32 9, i32 10, i32 11, i32 12 >
114         ret <8 x i16> %C
115 }
116
117 define <16 x i8> @test8(<16 x i8> %A, <16 x i8> %B) nounwind {
118 ; CHECK-LABEL: test8:
119 ; CHECK:       # BB#0:
120 ; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]
121 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
122 ; CHECK-NEXT:    retl
123 ;
124 ; CHECK-YONAH-LABEL: test8:
125 ; CHECK-YONAH:       # BB#0:
126 ; CHECK-YONAH-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero
127 ; CHECK-YONAH-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4]
128 ; CHECK-YONAH-NEXT:    por %xmm1, %xmm0
129 ; CHECK-YONAH-NEXT:    retl
130   %C = shufflevector <16 x i8> %A, <16 x i8> %B, <16 x i32> < i32 5, i32 6, i32 7, i32 undef, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20 >
131         ret <16 x i8> %C
132 }
133
134 ; Check that we don't do unary (circular on single operand) palignr incorrectly.
135 ; (It is possible, but before this testcase was committed, it was being done
136 ; incorrectly.  In particular, one of the operands of the palignr node
137 ; was an UNDEF.)
138 define <8 x i16> @test9(<8 x i16> %A, <8 x i16> %B) nounwind {
139 ; CHECK-LABEL: test9:
140 ; CHECK:       # BB#0:
141 ; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1]
142 ; CHECK-NEXT:    movdqa %xmm1, %xmm0
143 ; CHECK-NEXT:    retl
144 ;
145 ; CHECK-YONAH-LABEL: test9:
146 ; CHECK-YONAH:       # BB#0:
147 ; CHECK-YONAH-NEXT:    movdqa %xmm1, %xmm0
148 ; CHECK-YONAH-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
149 ; CHECK-YONAH-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]
150 ; CHECK-YONAH-NEXT:    por %xmm0, %xmm1
151 ; CHECK-YONAH-NEXT:    movdqa %xmm1, %xmm0
152 ; CHECK-YONAH-NEXT:    retl
153   %C = shufflevector <8 x i16> %B, <8 x i16> %A, <8 x i32> < i32 undef, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0 >
154         ret <8 x i16> %C
155 }
156