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