1; RUN: llc -mcpu=pwr8 -mattr=+vsx -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
2
3define <2 x double> @test00(<2 x double>* %p1, <2 x double>* %p2) {
4  %v1 = load <2 x double>* %p1
5  %v2 = load <2 x double>* %p2
6  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 0>
7  ret <2 x double> %v3
8
9; CHECK-LABEL: test00
10; CHECK: lxvd2x 0, 0, 3
11; CHECK: xxpermdi 0, 0, 0, 2
12; CHECK: xxpermdi 34, 0, 0, 3
13}
14
15define <2 x double> @test01(<2 x double>* %p1, <2 x double>* %p2) {
16  %v1 = load <2 x double>* %p1
17  %v2 = load <2 x double>* %p2
18  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 1>
19  ret <2 x double> %v3
20
21; CHECK-LABEL: test01
22; CHECK: lxvd2x 0, 0, 3
23; CHECK: xxpermdi 34, 0, 0, 2
24}
25
26define <2 x double> @test02(<2 x double>* %p1, <2 x double>* %p2) {
27  %v1 = load <2 x double>* %p1
28  %v2 = load <2 x double>* %p2
29  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 2>
30  ret <2 x double> %v3
31
32; CHECK-LABEL: @test02
33; CHECK: lxvd2x 0, 0, 3
34; CHECK: lxvd2x 1, 0, 4
35; CHECK: xxpermdi 0, 0, 0, 2
36; CHECK: xxpermdi 1, 1, 1, 2
37; CHECK: xxpermdi 34, 1, 0, 3
38}
39
40define <2 x double> @test03(<2 x double>* %p1, <2 x double>* %p2) {
41  %v1 = load <2 x double>* %p1
42  %v2 = load <2 x double>* %p2
43  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 3>
44  ret <2 x double> %v3
45
46; CHECK-LABEL: @test03
47; CHECK: lxvd2x 0, 0, 3
48; CHECK: lxvd2x 1, 0, 4
49; CHECK: xxpermdi 0, 0, 0, 2
50; CHECK: xxpermdi 1, 1, 1, 2
51; CHECK: xxpermdi 34, 1, 0, 1
52}
53
54define <2 x double> @test10(<2 x double>* %p1, <2 x double>* %p2) {
55  %v1 = load <2 x double>* %p1
56  %v2 = load <2 x double>* %p2
57  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 0>
58  ret <2 x double> %v3
59
60; CHECK-LABEL: @test10
61; CHECK: lxvd2x 0, 0, 3
62; CHECK: xxpermdi 0, 0, 0, 2
63; CHECK: xxpermdi 34, 0, 0, 2
64}
65
66define <2 x double> @test11(<2 x double>* %p1, <2 x double>* %p2) {
67  %v1 = load <2 x double>* %p1
68  %v2 = load <2 x double>* %p2
69  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 1>
70  ret <2 x double> %v3
71
72; CHECK-LABEL: @test11
73; CHECK: lxvd2x 0, 0, 3
74; CHECK: xxpermdi 0, 0, 0, 2
75; CHECK: xxpermdi 34, 0, 0, 0
76}
77
78define <2 x double> @test12(<2 x double>* %p1, <2 x double>* %p2) {
79  %v1 = load <2 x double>* %p1
80  %v2 = load <2 x double>* %p2
81  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 2>
82  ret <2 x double> %v3
83
84; CHECK-LABEL: @test12
85; CHECK: lxvd2x 0, 0, 3
86; CHECK: lxvd2x 1, 0, 4
87; CHECK: xxpermdi 0, 0, 0, 2
88; CHECK: xxpermdi 1, 1, 1, 2
89; CHECK: xxpermdi 34, 1, 0, 2
90}
91
92define <2 x double> @test13(<2 x double>* %p1, <2 x double>* %p2) {
93  %v1 = load <2 x double>* %p1
94  %v2 = load <2 x double>* %p2
95  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 3>
96  ret <2 x double> %v3
97
98; CHECK-LABEL: @test13
99; CHECK: lxvd2x 0, 0, 3
100; CHECK: lxvd2x 1, 0, 4
101; CHECK: xxpermdi 0, 0, 0, 2
102; CHECK: xxpermdi 1, 1, 1, 2
103; CHECK: xxpermdi 34, 1, 0, 0
104}
105
106define <2 x double> @test20(<2 x double>* %p1, <2 x double>* %p2) {
107  %v1 = load <2 x double>* %p1
108  %v2 = load <2 x double>* %p2
109  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 0>
110  ret <2 x double> %v3
111
112; CHECK-LABEL: @test20
113; CHECK: lxvd2x 0, 0, 3
114; CHECK: lxvd2x 1, 0, 4
115; CHECK: xxpermdi 0, 0, 0, 2
116; CHECK: xxpermdi 1, 1, 1, 2
117; CHECK: xxpermdi 34, 0, 1, 3
118}
119
120define <2 x double> @test21(<2 x double>* %p1, <2 x double>* %p2) {
121  %v1 = load <2 x double>* %p1
122  %v2 = load <2 x double>* %p2
123  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 1>
124  ret <2 x double> %v3
125
126; CHECK-LABEL: @test21
127; CHECK: lxvd2x 0, 0, 3
128; CHECK: lxvd2x 1, 0, 4
129; CHECK: xxpermdi 0, 0, 0, 2
130; CHECK: xxpermdi 1, 1, 1, 2
131; CHECK: xxpermdi 34, 0, 1, 1
132}
133
134define <2 x double> @test22(<2 x double>* %p1, <2 x double>* %p2) {
135  %v1 = load <2 x double>* %p1
136  %v2 = load <2 x double>* %p2
137  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 2>
138  ret <2 x double> %v3
139
140; CHECK-LABEL: @test22
141; CHECK: lxvd2x 0, 0, 4
142; CHECK: xxpermdi 0, 0, 0, 2
143; CHECK: xxpermdi 34, 0, 0, 3
144}
145
146define <2 x double> @test23(<2 x double>* %p1, <2 x double>* %p2) {
147  %v1 = load <2 x double>* %p1
148  %v2 = load <2 x double>* %p2
149  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 3>
150  ret <2 x double> %v3
151
152; CHECK-LABEL: @test23
153; CHECK: lxvd2x 0, 0, 4
154; CHECK: xxpermdi 34, 0, 0, 2
155}
156
157define <2 x double> @test30(<2 x double>* %p1, <2 x double>* %p2) {
158  %v1 = load <2 x double>* %p1
159  %v2 = load <2 x double>* %p2
160  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 0>
161  ret <2 x double> %v3
162
163; CHECK-LABEL: @test30
164; CHECK: lxvd2x 0, 0, 3
165; CHECK: lxvd2x 1, 0, 4
166; CHECK: xxpermdi 0, 0, 0, 2
167; CHECK: xxpermdi 1, 1, 1, 2
168; CHECK: xxpermdi 34, 0, 1, 2
169}
170
171define <2 x double> @test31(<2 x double>* %p1, <2 x double>* %p2) {
172  %v1 = load <2 x double>* %p1
173  %v2 = load <2 x double>* %p2
174  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 1>
175  ret <2 x double> %v3
176
177; CHECK-LABEL: @test31
178; CHECK: lxvd2x 0, 0, 3
179; CHECK: lxvd2x 1, 0, 4
180; CHECK: xxpermdi 0, 0, 0, 2
181; CHECK: xxpermdi 1, 1, 1, 2
182; CHECK: xxpermdi 34, 0, 1, 0
183}
184
185define <2 x double> @test32(<2 x double>* %p1, <2 x double>* %p2) {
186  %v1 = load <2 x double>* %p1
187  %v2 = load <2 x double>* %p2
188  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 2>
189  ret <2 x double> %v3
190
191; CHECK-LABEL: @test32
192; CHECK: lxvd2x 0, 0, 4
193; CHECK: xxpermdi 0, 0, 0, 2
194; CHECK: xxpermdi 34, 0, 0, 2
195}
196
197define <2 x double> @test33(<2 x double>* %p1, <2 x double>* %p2) {
198  %v1 = load <2 x double>* %p1
199  %v2 = load <2 x double>* %p2
200  %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 3>
201  ret <2 x double> %v3
202
203; CHECK-LABEL: @test33
204; CHECK: lxvd2x 0, 0, 4
205; CHECK: xxpermdi 0, 0, 0, 2
206; CHECK: xxpermdi 34, 0, 0, 0
207}
208