1; RUN: llc -march=hexagon < %s | FileCheck %s
2
3@d = external global <16 x i32>
4@c = external global <32 x i32>
5
6; CHECK-LABEL: test1:
7; CHECK: v{{[0-9]+}}.b = vpacke(v{{[0-9]+}}.h,v{{[0-9]+}}.h)
8define void @test1(<16 x i32> %a, <16 x i32> %b) #0 {
9entry:
10  %0 = tail call <16 x i32> @llvm.hexagon.V6.vpackeb(<16 x i32> %a, <16 x i32> %b)
11  store <16 x i32> %0, <16 x i32>* @d, align 64
12  ret void
13}
14
15; CHECK-LABEL: test2:
16; CHECK: v{{[0-9]+}}.h = vpacke(v{{[0-9]+}}.w,v{{[0-9]+}}.w)
17define void @test2(<16 x i32> %a, <16 x i32> %b) #0 {
18entry:
19  %0 = tail call <16 x i32> @llvm.hexagon.V6.vpackeh(<16 x i32> %a, <16 x i32> %b)
20  store <16 x i32> %0, <16 x i32>* @d, align 64
21  ret void
22}
23
24; CHECK-LABEL: test3:
25; CHECK: v{{[0-9]+}}.ub = vpack(v{{[0-9]+}}.h,v{{[0-9]+}}.h):sat
26define void @test3(<16 x i32> %a, <16 x i32> %b) #0 {
27entry:
28  %0 = tail call <16 x i32> @llvm.hexagon.V6.vpackhub.sat(<16 x i32> %a, <16 x i32> %b)
29  store <16 x i32> %0, <16 x i32>* @d, align 64
30  ret void
31}
32
33; CHECK-LABEL: test4:
34; CHECK: v{{[0-9]+}}.b = vpack(v{{[0-9]+}}.h,v{{[0-9]+}}.h):sat
35define void @test4(<16 x i32> %a, <16 x i32> %b) #0 {
36entry:
37  %0 = tail call <16 x i32> @llvm.hexagon.V6.vpackhb.sat(<16 x i32> %a, <16 x i32> %b)
38  store <16 x i32> %0, <16 x i32>* @d, align 64
39  ret void
40}
41
42; CHECK-LABEL: test5:
43; CHECK: v{{[0-9]+}}.uh = vpack(v{{[0-9]+}}.w,v{{[0-9]+}}.w):sat
44define void @test5(<16 x i32> %a, <16 x i32> %b) #0 {
45entry:
46  %0 = tail call <16 x i32> @llvm.hexagon.V6.vpackwuh.sat(<16 x i32> %a, <16 x i32> %b)
47  store <16 x i32> %0, <16 x i32>* @d, align 64
48  ret void
49}
50
51; CHECK-LABEL: test6:
52; CHECK: v{{[0-9]+}}.h = vpack(v{{[0-9]+}}.w,v{{[0-9]+}}.w):sat
53define void @test6(<16 x i32> %a, <16 x i32> %b) #0 {
54entry:
55  %0 = tail call <16 x i32> @llvm.hexagon.V6.vpackwh.sat(<16 x i32> %a, <16 x i32> %b)
56  store <16 x i32> %0, <16 x i32>* @d, align 64
57  ret void
58}
59
60; CHECK-LABEL: test7:
61; CHECK: v{{[0-9]+}}.b = vpacko(v{{[0-9]+}}.h,v{{[0-9]+}}.h)
62define void @test7(<16 x i32> %a, <16 x i32> %b) #0 {
63entry:
64  %0 = tail call <16 x i32> @llvm.hexagon.V6.vpackob(<16 x i32> %a, <16 x i32> %b)
65  store <16 x i32> %0, <16 x i32>* @d, align 64
66  ret void
67}
68
69; CHECK-LABEL: test8:
70; CHECK: v{{[0-9]+}}.h = vpacko(v{{[0-9]+}}.w,v{{[0-9]+}}.w)
71define void @test8(<16 x i32> %a, <16 x i32> %b) #0 {
72entry:
73  %0 = tail call <16 x i32> @llvm.hexagon.V6.vpackoh(<16 x i32> %a, <16 x i32> %b)
74  store <16 x i32> %0, <16 x i32>* @d, align 64
75  ret void
76}
77
78; CHECK-LABEL: test9:
79; CHECK: v{{[0-9]+}}:{{[0-9]+}}.uh = vunpack(v{{[0-9]+}}.ub)
80define void @test9(<16 x i32> %a) #0 {
81entry:
82  %0 = tail call <32 x i32> @llvm.hexagon.V6.vunpackub(<16 x i32> %a)
83  store <32 x i32> %0, <32 x i32>* @c, align 128
84  ret void
85}
86
87; CHECK-LABEL: test10:
88; CHECK: v{{[0-9]+}}:{{[0-9]+}}.uw = vunpack(v{{[0-9]+}}.uh)
89define void @test10(<16 x i32> %a) #0 {
90entry:
91  %0 = tail call <32 x i32> @llvm.hexagon.V6.vunpackuh(<16 x i32> %a)
92  store <32 x i32> %0, <32 x i32>* @c, align 128
93  ret void
94}
95
96; CHECK-LABEL: test11:
97; CHECK: v{{[0-9]+}}:{{[0-9]+}}.h = vunpack(v{{[0-9]+}}.b)
98define void @test11(<16 x i32> %a) #0 {
99entry:
100  %0 = tail call <32 x i32> @llvm.hexagon.V6.vunpackb(<16 x i32> %a)
101  store <32 x i32> %0, <32 x i32>* @c, align 128
102  ret void
103}
104
105; CHECK-LABEL: test12:
106; CHECK: v{{[0-9]+}}:{{[0-9]+}}.w = vunpack(v{{[0-9]+}}.h)
107define void @test12(<16 x i32> %a) #0 {
108entry:
109  %0 = tail call <32 x i32> @llvm.hexagon.V6.vunpackh(<16 x i32> %a)
110  store <32 x i32> %0, <32 x i32>* @c, align 128
111  ret void
112}
113
114; CHECK-LABEL: test13:
115; CHECK: v{{[0-9]+}}.h = vdeal(v{{[0-9]+}}.h)
116define void @test13(<16 x i32> %a) #0 {
117entry:
118  %0 = tail call <16 x i32> @llvm.hexagon.V6.vdealh(<16 x i32> %a)
119  store <16 x i32> %0, <16 x i32>* @d, align 64
120  ret void
121}
122
123; CHECK-LABEL: test14:
124; CHECK: v{{[0-9]+}}.b = vdeal(v{{[0-9]+}}.b)
125define void @test14(<16 x i32> %a) #0 {
126entry:
127  %0 = tail call <16 x i32> @llvm.hexagon.V6.vdealb(<16 x i32> %a)
128  store <16 x i32> %0, <16 x i32>* @d, align 64
129  ret void
130}
131
132; CHECK-LABEL: test15:
133; CHECK: v{{[0-9]+}}.h = vshuff(v{{[0-9]+}}.h)
134define void @test15(<16 x i32> %a) #0 {
135entry:
136  %0 = tail call <16 x i32> @llvm.hexagon.V6.vshuffh(<16 x i32> %a)
137  store <16 x i32> %0, <16 x i32>* @d, align 64
138  ret void
139}
140
141; CHECK-LABEL: test16:
142; CHECK: v{{[0-9]+}}.b = vshuff(v{{[0-9]+}}.b)
143define void @test16(<16 x i32> %a) #0 {
144entry:
145  %0 = tail call <16 x i32> @llvm.hexagon.V6.vshuffb(<16 x i32> %a)
146  store <16 x i32> %0, <16 x i32>* @d, align 64
147  ret void
148}
149
150declare <16 x i32> @llvm.hexagon.V6.vpackeb(<16 x i32>, <16 x i32>) #0
151declare <16 x i32> @llvm.hexagon.V6.vpackeh(<16 x i32>, <16 x i32>) #0
152declare <16 x i32> @llvm.hexagon.V6.vpackhub.sat(<16 x i32>, <16 x i32>) #0
153declare <16 x i32> @llvm.hexagon.V6.vpackhb.sat(<16 x i32>, <16 x i32>) #0
154declare <16 x i32> @llvm.hexagon.V6.vpackwuh.sat(<16 x i32>, <16 x i32>) #0
155declare <16 x i32> @llvm.hexagon.V6.vpackwh.sat(<16 x i32>, <16 x i32>) #0
156declare <16 x i32> @llvm.hexagon.V6.vpackob(<16 x i32>, <16 x i32>) #0
157declare <16 x i32> @llvm.hexagon.V6.vpackoh(<16 x i32>, <16 x i32>) #0
158declare <32 x i32> @llvm.hexagon.V6.vunpackub(<16 x i32>) #0
159declare <32 x i32> @llvm.hexagon.V6.vunpackuh(<16 x i32>) #0
160declare <32 x i32> @llvm.hexagon.V6.vunpackb(<16 x i32>) #0
161declare <32 x i32> @llvm.hexagon.V6.vunpackh(<16 x i32>) #0
162declare <16 x i32> @llvm.hexagon.V6.vdealh(<16 x i32>) #0
163declare <16 x i32> @llvm.hexagon.V6.vdealb(<16 x i32>) #0
164declare <16 x i32> @llvm.hexagon.V6.vshuffh(<16 x i32>) #0
165declare <16 x i32> @llvm.hexagon.V6.vshuffb(<16 x i32>) #0
166
167attributes #0 = { nounwind readnone "target-cpu"="hexagonv60" "target-features"="+hvxv60,+hvx-length64b" }
168