[PowerPC] MULHU/MULHS are not legal for vector types
[oota-llvm.git] / test / CodeGen / PowerPC / vec_shuffle_le.ll
1 ; RUN: llc < %s -mtriple=powerpc64le-unknown-linux-gnu -mattr=+altivec | FileCheck %s
2
3 define void @VPKUHUM_xy(<16 x i8>* %A, <16 x i8>* %B) {
4 entry:
5 ; CHECK: VPKUHUM_xy:
6         %tmp = load <16 x i8>* %A
7         %tmp2 = load <16 x i8>* %B
8         %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
9 ; CHECK: vpkuhum
10         store <16 x i8> %tmp3, <16 x i8>* %A
11         ret void
12 }
13
14 define void @VPKUHUM_xx(<16 x i8>* %A) {
15 entry:
16 ; CHECK: VPKUHUM_xx:
17         %tmp = load <16 x i8>* %A
18         %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
19 ; CHECK: vpkuhum
20         store <16 x i8> %tmp2, <16 x i8>* %A
21         ret void
22 }
23
24 define void @VPKUWUM_xy(<16 x i8>* %A, <16 x i8>* %B) {
25 entry:
26 ; CHECK: VPKUWUM_xy:
27         %tmp = load <16 x i8>* %A
28         %tmp2 = load <16 x i8>* %B
29         %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, <16 x i32> <i32 0, i32 1, i32 4, i32 5, i32 8, i32 9, i32 12, i32 13, i32 16, i32 17, i32 20, i32 21, i32 24, i32 25, i32 28, i32 29>
30 ; CHECK: vpkuwum
31         store <16 x i8> %tmp3, <16 x i8>* %A
32         ret void
33 }
34
35 define void @VPKUWUM_xx(<16 x i8>* %A) {
36 entry:
37 ; CHECK: VPKUWUM_xx:
38         %tmp = load <16 x i8>* %A
39         %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, <16 x i32> <i32 0, i32 1, i32 4, i32 5, i32 8, i32 9, i32 12, i32 13, i32 0, i32 1, i32 4, i32 5, i32 8, i32 9, i32 12, i32 13>
40 ; CHECK: vpkuwum
41         store <16 x i8> %tmp2, <16 x i8>* %A
42         ret void
43 }
44
45 define void @VMRGLB_xy(<16 x i8>* %A, <16 x i8>* %B) {
46 entry:
47 ; CHECK: VMRGLB_xy:
48         %tmp = load <16 x i8>* %A
49         %tmp2 = load <16 x i8>* %B
50         %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23>
51 ; CHECK: lvx [[REG1:[0-9]+]]
52 ; CHECK: lvx [[REG2:[0-9]+]]
53 ; CHECK: vmrglb [[REG3:[0-9]+]], [[REG2]], [[REG1]]
54         store <16 x i8> %tmp3, <16 x i8>* %A
55         ret void
56 }
57
58 define void @VMRGLB_xx(<16 x i8>* %A) {
59 entry:
60 ; CHECK: VMRGLB_xx:
61         %tmp = load <16 x i8>* %A
62         %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, <16 x i32> <i32 0, i32 0, i32 1, i32 1, i32 2, i32 2, i32 3, i32 3, i32 4, i32 4, i32 5, i32 5, i32 6, i32 6, i32 7, i32 7>
63 ; CHECK: vmrglb
64         store <16 x i8> %tmp2, <16 x i8>* %A
65         ret void
66 }
67
68 define void @VMRGHB_xy(<16 x i8>* %A, <16 x i8>* %B) {
69 entry:
70 ; CHECK: VMRGHB_xy:
71         %tmp = load <16 x i8>* %A
72         %tmp2 = load <16 x i8>* %B
73         %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, <16 x i32> <i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>
74 ; CHECK: lvx [[REG1:[0-9]+]]
75 ; CHECK: lvx [[REG2:[0-9]+]]
76 ; CHECK: vmrghb [[REG3:[0-9]+]], [[REG2]], [[REG1]]
77         store <16 x i8> %tmp3, <16 x i8>* %A
78         ret void
79 }
80
81 define void @VMRGHB_xx(<16 x i8>* %A) {
82 entry:
83 ; CHECK: VMRGHB_xx:
84         %tmp = load <16 x i8>* %A
85         %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, <16 x i32> <i32 8, i32 8, i32 9, i32 9, i32 10, i32 10, i32 11, i32 11, i32 12, i32 12, i32 13, i32 13, i32 14, i32 14, i32 15, i32 15>
86 ; CHECK: vmrghb
87         store <16 x i8> %tmp2, <16 x i8>* %A
88         ret void
89 }
90
91 define void @VMRGLH_xy(<16 x i8>* %A, <16 x i8>* %B) {
92 entry:
93 ; CHECK: VMRGLH_xy:
94         %tmp = load <16 x i8>* %A
95         %tmp2 = load <16 x i8>* %B
96         %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, <16 x i32> <i32 0, i32 1, i32 16, i32 17, i32 2, i32 3, i32 18, i32 19, i32 4, i32 5, i32 20, i32 21, i32 6, i32 7, i32 22, i32 23>
97 ; CHECK: lvx [[REG1:[0-9]+]]
98 ; CHECK: lvx [[REG2:[0-9]+]]
99 ; CHECK: vmrglh [[REG3:[0-9]+]], [[REG2]], [[REG1]]
100         store <16 x i8> %tmp3, <16 x i8>* %A
101         ret void
102 }
103
104 define void @VMRGLH_xx(<16 x i8>* %A) {
105 entry:
106 ; CHECK: VMRGLH_xx:
107         %tmp = load <16 x i8>* %A
108         %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, <16 x i32> <i32 0, i32 1, i32 0, i32 1, i32 2, i32 3, i32 2, i32 3, i32 4, i32 5, i32 4, i32 5, i32 6, i32 7, i32 6, i32 7>
109 ; CHECK: vmrglh
110         store <16 x i8> %tmp2, <16 x i8>* %A
111         ret void
112 }
113
114 define void @VMRGHH_xy(<16 x i8>* %A, <16 x i8>* %B) {
115 entry:
116 ; CHECK: VMRGHH_xy:
117         %tmp = load <16 x i8>* %A
118         %tmp2 = load <16 x i8>* %B
119         %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, <16 x i32> <i32 8, i32 9, i32 24, i32 25, i32 10, i32 11, i32 26, i32 27, i32 12, i32 13, i32 28, i32 29, i32 14, i32 15, i32 30, i32 31>
120 ; CHECK: lvx [[REG1:[0-9]+]]
121 ; CHECK: lvx [[REG2:[0-9]+]]
122 ; CHECK: vmrghh [[REG3:[0-9]+]], [[REG2]], [[REG1]]
123         store <16 x i8> %tmp3, <16 x i8>* %A
124         ret void
125 }
126
127 define void @VMRGHH_xx(<16 x i8>* %A) {
128 entry:
129 ; CHECK: VMRGHH_xx:
130         %tmp = load <16 x i8>* %A
131         %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, <16 x i32> <i32 8, i32 9, i32 8, i32 9, i32 10, i32 11, i32 10, i32 11, i32 12, i32 13, i32 12, i32 13, i32 14, i32 15, i32 14, i32 15>
132 ; CHECK: vmrghh
133         store <16 x i8> %tmp2, <16 x i8>* %A
134         ret void
135 }
136
137 define void @VMRGLW_xy(<16 x i8>* %A, <16 x i8>* %B) {
138 entry:
139 ; CHECK: VMRGLW_xy:
140         %tmp = load <16 x i8>* %A
141         %tmp2 = load <16 x i8>* %B
142         %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 16, i32 17, i32 18, i32 19, i32 4, i32 5, i32 6, i32 7, i32 20, i32 21, i32 22, i32 23>
143 ; CHECK: lvx [[REG1:[0-9]+]]
144 ; CHECK: lvx [[REG2:[0-9]+]]
145 ; CHECK: vmrglw [[REG3:[0-9]+]], [[REG2]], [[REG1]]
146         store <16 x i8> %tmp3, <16 x i8>* %A
147         ret void
148 }
149
150 define void @VMRGLW_xx(<16 x i8>* %A) {
151 entry:
152 ; CHECK: VMRGLW_xx:
153         %tmp = load <16 x i8>* %A
154         %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7>
155 ; CHECK: vmrglw
156         store <16 x i8> %tmp2, <16 x i8>* %A
157         ret void
158 }
159
160 define void @VMRGHW_xy(<16 x i8>* %A, <16 x i8>* %B) {
161 entry:
162 ; CHECK: VMRGHW_xy:
163         %tmp = load <16 x i8>* %A
164         %tmp2 = load <16 x i8>* %B
165         %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 24, i32 25, i32 26, i32 27, i32 12, i32 13, i32 14, i32 15, i32 28, i32 29, i32 30, i32 31>
166 ; CHECK: lvx [[REG1:[0-9]+]]
167 ; CHECK: lvx [[REG2:[0-9]+]]
168 ; CHECK: vmrghw [[REG3:[0-9]+]], [[REG2]], [[REG1]]
169         store <16 x i8> %tmp3, <16 x i8>* %A
170         ret void
171 }
172
173 define void @VMRGHW_xx(<16 x i8>* %A) {
174 entry:
175 ; CHECK: VMRGHW_xx:
176         %tmp = load <16 x i8>* %A
177         %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 12, i32 13, i32 14, i32 15>
178 ; CHECK: vmrghw
179         store <16 x i8> %tmp2, <16 x i8>* %A
180         ret void
181 }
182
183 define void @VSLDOI_xy(<16 x i8>* %A, <16 x i8>* %B) {
184 entry:
185 ; CHECK: VSLDOI_xy:
186         %tmp = load <16 x i8>* %A
187         %tmp2 = load <16 x i8>* %B
188         %tmp3 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp2, <16 x i32> <i32 19, i32 18, i32 17, i32 16, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4>
189 ; CHECK: vsldoi
190         store <16 x i8> %tmp3, <16 x i8>* %A
191         ret void
192 }
193
194 define void @VSLDOI_xx(<16 x i8>* %A) {
195 entry:
196 ; CHECK: VSLDOI_xx:
197         %tmp = load <16 x i8>* %A
198         %tmp2 = shufflevector <16 x i8> %tmp, <16 x i8> %tmp, <16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4>
199 ; CHECK: vsldoi
200         store <16 x i8> %tmp2, <16 x i8>* %A
201         ret void
202 }
203