1 ; RUN: llc < %s -march=x86 -mcpu=core2 -mattr=+ssse3 | FileCheck %s
2 ; RUN: llc < %s -march=x86 -mcpu=yonah | FileCheck --check-prefix=CHECK-YONAH %s
4 define <4 x i32> @test1(<4 x i32> %A, <4 x i32> %B) nounwind {
7 ; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0]
10 ; CHECK-YONAH-LABEL: test1:
11 ; CHECK-YONAH: # BB#0:
12 ; CHECK-YONAH-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0]
13 ; CHECK-YONAH-NEXT: retl
14 %C = shufflevector <4 x i32> %A, <4 x i32> undef, <4 x i32> < i32 1, i32 2, i32 3, i32 0 >
18 define <4 x i32> @test2(<4 x i32> %A, <4 x i32> %B) nounwind {
21 ; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
22 ; CHECK-NEXT: movdqa %xmm1, %xmm0
25 ; CHECK-YONAH-LABEL: test2:
26 ; CHECK-YONAH: # BB#0:
27 ; CHECK-YONAH-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
28 ; CHECK-YONAH-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
29 ; CHECK-YONAH-NEXT: retl
30 %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 3, i32 4 >
34 define <4 x i32> @test3(<4 x i32> %A, <4 x i32> %B) nounwind {
37 ; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
38 ; CHECK-NEXT: movdqa %xmm1, %xmm0
41 ; CHECK-YONAH-LABEL: test3:
42 ; CHECK-YONAH: # BB#0:
43 ; CHECK-YONAH-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
44 ; CHECK-YONAH-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,2,2,3]
45 ; CHECK-YONAH-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
46 ; CHECK-YONAH-NEXT: retl
47 %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 undef, i32 4 >
51 define <4 x i32> @test4(<4 x i32> %A, <4 x i32> %B) nounwind {
54 ; CHECK-NEXT: palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
57 ; CHECK-YONAH-LABEL: test4:
58 ; CHECK-YONAH: # BB#0:
59 ; CHECK-YONAH-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
60 ; CHECK-YONAH-NEXT: movapd %xmm1, %xmm0
61 ; CHECK-YONAH-NEXT: retl
62 %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 >
66 define <4 x float> @test5(<4 x float> %A, <4 x float> %B) nounwind {
69 ; CHECK-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
70 ; CHECK-NEXT: movapd %xmm1, %xmm0
73 ; CHECK-YONAH-LABEL: test5:
74 ; CHECK-YONAH: # BB#0:
75 ; CHECK-YONAH-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
76 ; CHECK-YONAH-NEXT: movapd %xmm1, %xmm0
77 ; CHECK-YONAH-NEXT: retl
78 %C = shufflevector <4 x float> %A, <4 x float> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 >
82 define <8 x i16> @test6(<8 x i16> %A, <8 x i16> %B) nounwind {
85 ; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
86 ; CHECK-NEXT: movdqa %xmm1, %xmm0
89 ; CHECK-YONAH-LABEL: test6:
90 ; CHECK-YONAH: # BB#0:
91 ; CHECK-YONAH-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
92 ; CHECK-YONAH-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5]
93 ; CHECK-YONAH-NEXT: por %xmm1, %xmm0
94 ; CHECK-YONAH-NEXT: retl
95 %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 >
99 define <8 x i16> @test7(<8 x i16> %A, <8 x i16> %B) nounwind {
100 ; CHECK-LABEL: test7:
102 ; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
103 ; CHECK-NEXT: movdqa %xmm1, %xmm0
106 ; CHECK-YONAH-LABEL: test7:
107 ; CHECK-YONAH: # BB#0:
108 ; CHECK-YONAH-NEXT: psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
109 ; CHECK-YONAH-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6,7,8,9]
110 ; CHECK-YONAH-NEXT: por %xmm1, %xmm0
111 ; CHECK-YONAH-NEXT: retl
112 %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 >
116 define <16 x i8> @test8(<16 x i8> %A, <16 x i8> %B) nounwind {
117 ; CHECK-LABEL: test8:
119 ; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]
120 ; CHECK-NEXT: movdqa %xmm1, %xmm0
123 ; CHECK-YONAH-LABEL: test8:
124 ; CHECK-YONAH: # BB#0:
125 ; CHECK-YONAH-NEXT: psrldq {{.*#+}} xmm0 = xmm0[5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero
126 ; CHECK-YONAH-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4]
127 ; CHECK-YONAH-NEXT: por %xmm1, %xmm0
128 ; CHECK-YONAH-NEXT: retl
129 %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 >
133 ; Check that we don't do unary (circular on single operand) palignr incorrectly.
134 ; (It is possible, but before this testcase was committed, it was being done
135 ; incorrectly. In particular, one of the operands of the palignr node
137 define <8 x i16> @test9(<8 x i16> %A, <8 x i16> %B) nounwind {
138 ; CHECK-LABEL: test9:
140 ; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1]
141 ; CHECK-NEXT: movdqa %xmm1, %xmm0
144 ; CHECK-YONAH-LABEL: test9:
145 ; CHECK-YONAH: # BB#0:
146 ; CHECK-YONAH-NEXT: movdqa %xmm1, %xmm0
147 ; CHECK-YONAH-NEXT: psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
148 ; CHECK-YONAH-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]
149 ; CHECK-YONAH-NEXT: por %xmm0, %xmm1
150 ; CHECK-YONAH-NEXT: movdqa %xmm1, %xmm0
151 ; CHECK-YONAH-NEXT: retl
152 %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 >