OSDN Git Service

Update aosp/master LLVM for rebase to r230699.
[android-x86/external-llvm.git] / test / CodeGen / Hexagon / intrinsics / xtype_perm.ll
1 ; RUN: llc -march=hexagon -O0 < %s | FileCheck %s
2 ; Hexagon Programmer's Reference Manual 11.10.6 XTYPE/PERM
3
4 ; Saturate
5 declare i32 @llvm.hexagon.A2.sat(i64)
6 define i32 @A2_sat(i64 %a) {
7   %z = call i32 @llvm.hexagon.A2.sat(i64 %a)
8   ret i32 %z
9 }
10 ; CHECK: r0 = sat(r1:0)
11
12 declare i32 @llvm.hexagon.A2.sath(i32)
13 define i32 @A2_sath(i32 %a) {
14   %z = call i32 @llvm.hexagon.A2.sath(i32 %a)
15   ret i32 %z
16 }
17 ; CHECK: r0 = sath(r0)
18
19 declare i32 @llvm.hexagon.A2.satuh(i32)
20 define i32 @A2_satuh(i32 %a) {
21   %z = call i32 @llvm.hexagon.A2.satuh(i32 %a)
22   ret i32 %z
23 }
24 ; CHECK: r0 = satuh(r0)
25
26 declare i32 @llvm.hexagon.A2.satub(i32)
27 define i32 @A2_satub(i32 %a) {
28   %z = call i32 @llvm.hexagon.A2.satub(i32 %a)
29   ret i32 %z
30 }
31 ; CHECK: r0 = satub(r0)
32
33 declare i32 @llvm.hexagon.A2.satb(i32)
34 define i32 @A2_satb(i32 %a) {
35   %z = call i32 @llvm.hexagon.A2.satb(i32 %a)
36   ret i32 %z
37 }
38 ; CHECK: r0 = satb(r0)
39
40 ; Swizzle bytes
41 declare i32 @llvm.hexagon.A2.swiz(i32)
42 define i32 @A2_swiz(i32 %a) {
43   %z = call i32 @llvm.hexagon.A2.swiz(i32 %a)
44   ret i32 %z
45 }
46 ; CHECK: r0 = swiz(r0)
47
48 ; Vector round and pack
49 declare i32 @llvm.hexagon.S2.vrndpackwh(i64)
50 define i32 @S2_vrndpackwh(i64 %a) {
51   %z = call i32 @llvm.hexagon.S2.vrndpackwh(i64 %a)
52   ret i32 %z
53 }
54 ; CHECK: r0 = vrndwh(r1:0)
55
56 declare i32 @llvm.hexagon.S2.vrndpackwhs(i64)
57 define i32 @S2_vrndpackwhs(i64 %a) {
58   %z = call i32 @llvm.hexagon.S2.vrndpackwhs(i64 %a)
59   ret i32 %z
60 }
61 ; CHECK: r0 = vrndwh(r1:0):sat
62
63 ; Vector saturate and pack
64 declare i32 @llvm.hexagon.S2.vsathub(i64)
65 define i32 @S2_vsathub(i64 %a) {
66   %z = call i32 @llvm.hexagon.S2.vsathub(i64 %a)
67   ret i32 %z
68 }
69 ; CHECK: r0 = vsathub(r1:0)
70
71 declare i32 @llvm.hexagon.S2.vsatwh(i64)
72 define i32 @S2_vsatwh(i64 %a) {
73   %z = call i32 @llvm.hexagon.S2.vsatwh(i64 %a)
74   ret i32 %z
75 }
76 ; CHECK: r0 = vsatwh(r1:0)
77
78 declare i32 @llvm.hexagon.S2.vsatwuh(i64)
79 define i32 @S2_vsatwuh(i64 %a) {
80   %z = call i32 @llvm.hexagon.S2.vsatwuh(i64 %a)
81   ret i32 %z
82 }
83 ; CHECK: r0 = vsatwuh(r1:0)
84
85 declare i32 @llvm.hexagon.S2.vsathb(i64)
86 define i32 @S2_vsathb(i64 %a) {
87   %z = call i32 @llvm.hexagon.S2.vsathb(i64 %a)
88   ret i32 %z
89 }
90 ; CHECK: r0 = vsathb(r1:0)
91
92 declare i32 @llvm.hexagon.S2.svsathb(i32)
93 define i32 @S2_svsathb(i32 %a) {
94   %z = call i32 @llvm.hexagon.S2.svsathb(i32 %a)
95   ret i32 %z
96 }
97 ; CHECK: r0 = vsathb(r0)
98
99 declare i32 @llvm.hexagon.S2.svsathub(i32)
100 define i32 @S2_svsathub(i32 %a) {
101   %z = call i32 @llvm.hexagon.S2.svsathub(i32 %a)
102   ret i32 %z
103 }
104 ; CHECK: r0 = vsathub(r0)
105
106 ; Vector saturate without pack
107 declare i64 @llvm.hexagon.S2.vsathub.nopack(i64)
108 define i64 @S2_vsathub_nopack(i64 %a) {
109   %z = call i64 @llvm.hexagon.S2.vsathub.nopack(i64 %a)
110   ret i64 %z
111 }
112 ; CHECK: r1:0 = vsathub(r1:0)
113
114 declare i64 @llvm.hexagon.S2.vsatwuh.nopack(i64)
115 define i64 @S2_vsatwuh_nopack(i64 %a) {
116   %z = call i64 @llvm.hexagon.S2.vsatwuh.nopack(i64 %a)
117   ret i64 %z
118 }
119 ; CHECK: r1:0 = vsatwuh(r1:0)
120
121 declare i64 @llvm.hexagon.S2.vsatwh.nopack(i64)
122 define i64 @S2_vsatwh_nopack(i64 %a) {
123   %z = call i64 @llvm.hexagon.S2.vsatwh.nopack(i64 %a)
124   ret i64 %z
125 }
126 ; CHECK: r1:0 = vsatwh(r1:0)
127
128 declare i64 @llvm.hexagon.S2.vsathb.nopack(i64)
129 define i64 @S2_vsathb_nopack(i64 %a) {
130   %z = call i64 @llvm.hexagon.S2.vsathb.nopack(i64 %a)
131   ret i64 %z
132 }
133 ; CHECK: r1:0 = vsathb(r1:0)
134
135 ; Vector shuffle
136 declare i64 @llvm.hexagon.S2.shuffeb(i64, i64)
137 define i64 @S2_shuffeb(i64 %a, i64 %b) {
138   %z = call i64 @llvm.hexagon.S2.shuffeb(i64 %a, i64 %b)
139   ret i64 %z
140 }
141 ; CHECK: r1:0 = shuffeb(r1:0, r3:2)
142
143 declare i64 @llvm.hexagon.S2.shuffob(i64, i64)
144 define i64 @S2_shuffob(i64 %a, i64 %b) {
145   %z = call i64 @llvm.hexagon.S2.shuffob(i64 %a, i64 %b)
146   ret i64 %z
147 }
148 ; CHECK: r1:0 = shuffob(r1:0, r3:2)
149
150 declare i64 @llvm.hexagon.S2.shuffeh(i64, i64)
151 define i64 @S2_shuffeh(i64 %a, i64 %b) {
152   %z = call i64 @llvm.hexagon.S2.shuffeh(i64 %a, i64 %b)
153   ret i64 %z
154 }
155 ; CHECK: r1:0 = shuffeh(r1:0, r3:2)
156
157 declare i64 @llvm.hexagon.S2.shuffoh(i64, i64)
158 define i64 @S2_shuffoh(i64 %a, i64 %b) {
159   %z = call i64 @llvm.hexagon.S2.shuffoh(i64 %a, i64 %b)
160   ret i64 %z
161 }
162 ; CHECK: r1:0 = shuffoh(r1:0, r3:2)
163
164 ; Vector splat bytes
165 declare i32 @llvm.hexagon.S2.vsplatrb(i32)
166 define i32 @S2_vsplatrb(i32 %a) {
167   %z = call i32 @llvm.hexagon.S2.vsplatrb(i32 %a)
168   ret i32 %z
169 }
170 ; CHECK: r0 = vsplatb(r0)
171
172 ; Vector splat halfwords
173 declare i64 @llvm.hexagon.S2.vsplatrh(i32)
174 define i64 @S2_vsplatrh(i32 %a) {
175   %z = call i64 @llvm.hexagon.S2.vsplatrh(i32 %a)
176   ret i64 %z
177 }
178 ; CHECK:  = vsplath(r0)
179
180 ; Vector splice
181 declare i64 @llvm.hexagon.S2.vspliceib(i64, i64, i32)
182 define i64 @S2_vspliceib(i64 %a, i64 %b) {
183   %z = call i64 @llvm.hexagon.S2.vspliceib(i64 %a, i64 %b, i32 0)
184   ret i64 %z
185 }
186 ; CHECK: r1:0 = vspliceb(r1:0, r3:2, #0)
187
188 declare i64 @llvm.hexagon.S2.vsplicerb(i64, i64, i32)
189 define i64 @S2_vsplicerb(i64 %a, i64 %b, i32 %c) {
190   %z = call i64 @llvm.hexagon.S2.vsplicerb(i64 %a, i64 %b, i32 %c)
191   ret i64 %z
192 }
193 ; CHECK: r1:0 = vspliceb(r1:0, r3:2, p0)
194
195 ; Vector sign extend
196 declare i64 @llvm.hexagon.S2.vsxtbh(i32)
197 define i64 @S2_vsxtbh(i32 %a) {
198   %z = call i64 @llvm.hexagon.S2.vsxtbh(i32 %a)
199   ret i64 %z
200 }
201 ; CHECK:  = vsxtbh(r0)
202
203 declare i64 @llvm.hexagon.S2.vsxthw(i32)
204 define i64 @S2_vsxthw(i32 %a) {
205   %z = call i64 @llvm.hexagon.S2.vsxthw(i32 %a)
206   ret i64 %z
207 }
208 ; CHECK:  = vsxthw(r0)
209
210 ; Vector truncate
211 declare i32 @llvm.hexagon.S2.vtrunohb(i64)
212 define i32 @S2_vtrunohb(i64 %a) {
213   %z = call i32 @llvm.hexagon.S2.vtrunohb(i64 %a)
214   ret i32 %z
215 }
216 ; CHECK: r0 = vtrunohb(r1:0)
217
218 declare i32 @llvm.hexagon.S2.vtrunehb(i64)
219 define i32 @S2_vtrunehb(i64 %a) {
220   %z = call i32 @llvm.hexagon.S2.vtrunehb(i64 %a)
221   ret i32 %z
222 }
223 ; CHECK: r0 = vtrunehb(r1:0)
224
225 declare i64 @llvm.hexagon.S2.vtrunowh(i64, i64)
226 define i64 @S2_vtrunowh(i64 %a, i64 %b) {
227   %z = call i64 @llvm.hexagon.S2.vtrunowh(i64 %a, i64 %b)
228   ret i64 %z
229 }
230 ; CHECK: r1:0 = vtrunowh(r1:0, r3:2)
231
232 declare i64 @llvm.hexagon.S2.vtrunewh(i64, i64)
233 define i64 @S2_vtrunewh(i64 %a, i64 %b) {
234   %z = call i64 @llvm.hexagon.S2.vtrunewh(i64 %a, i64 %b)
235   ret i64 %z
236 }
237 ; CHECK: r1:0 = vtrunewh(r1:0, r3:2)
238
239 ; Vector zero extend
240 declare i64 @llvm.hexagon.S2.vzxtbh(i32)
241 define i64 @S2_vzxtbh(i32 %a) {
242   %z = call i64 @llvm.hexagon.S2.vzxtbh(i32 %a)
243   ret i64 %z
244 }
245 ; CHECK:  = vzxtbh(r0)
246
247 declare i64 @llvm.hexagon.S2.vzxthw(i32)
248 define i64 @S2_vzxthw(i32 %a) {
249   %z = call i64 @llvm.hexagon.S2.vzxthw(i32 %a)
250   ret i64 %z
251 }
252 ; CHECK:  = vzxthw(r0)