blob: 965e0c08255d3213521e12291071bb7896c47bea [file] [log] [blame]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001; RUN: opt -S -mtriple=amdgcn-- -amdgpu-codegenprepare %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
2; RUN: opt -S -mtriple=amdgcn-- -mcpu=tonga -amdgpu-codegenprepare %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00003
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00004; GCN-LABEL: @add_i16(
5; SI: %r = add i16 %a, %b
6; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00007; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00008; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
9; VI-NEXT: %[[R_32:[0-9]+]] = add i32 %[[A_32]], %[[B_32]]
10; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
11; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000012define i16 @add_i16(i16 %a, i16 %b) {
13 %r = add i16 %a, %b
14 ret i16 %r
15}
16
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000017; GCN-LABEL: @add_nsw_i16(
18; SI: %r = add nsw i16 %a, %b
19; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000020; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000021; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
22; VI-NEXT: %[[R_32:[0-9]+]] = add nsw i32 %[[A_32]], %[[B_32]]
23; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
24; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000025define i16 @add_nsw_i16(i16 %a, i16 %b) {
26 %r = add nsw i16 %a, %b
27 ret i16 %r
28}
29
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000030; GCN-LABEL: @add_nuw_i16(
31; SI: %r = add nuw i16 %a, %b
32; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000033; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000034; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
35; VI-NEXT: %[[R_32:[0-9]+]] = add nuw i32 %[[A_32]], %[[B_32]]
36; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
37; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000038define i16 @add_nuw_i16(i16 %a, i16 %b) {
39 %r = add nuw i16 %a, %b
40 ret i16 %r
41}
42
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000043; GCN-LABEL: @add_nuw_nsw_i16(
44; SI: %r = add nuw nsw i16 %a, %b
45; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000046; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000047; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
48; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw i32 %[[A_32]], %[[B_32]]
49; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
50; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000051define i16 @add_nuw_nsw_i16(i16 %a, i16 %b) {
52 %r = add nuw nsw i16 %a, %b
53 ret i16 %r
54}
55
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000056; GCN-LABEL: @sub_i16(
57; SI: %r = sub i16 %a, %b
58; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000059; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000060; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
61; VI-NEXT: %[[R_32:[0-9]+]] = sub i32 %[[A_32]], %[[B_32]]
62; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
63; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000064define i16 @sub_i16(i16 %a, i16 %b) {
65 %r = sub i16 %a, %b
66 ret i16 %r
67}
68
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000069; GCN-LABEL: @sub_nsw_i16(
70; SI: %r = sub nsw i16 %a, %b
71; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000072; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000073; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
74; VI-NEXT: %[[R_32:[0-9]+]] = sub nsw i32 %[[A_32]], %[[B_32]]
75; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
76; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000077define i16 @sub_nsw_i16(i16 %a, i16 %b) {
78 %r = sub nsw i16 %a, %b
79 ret i16 %r
80}
81
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000082; GCN-LABEL: @sub_nuw_i16(
83; SI: %r = sub nuw i16 %a, %b
84; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000085; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000086; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
87; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw i32 %[[A_32]], %[[B_32]]
88; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
89; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000090define i16 @sub_nuw_i16(i16 %a, i16 %b) {
91 %r = sub nuw i16 %a, %b
92 ret i16 %r
93}
94
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000095; GCN-LABEL: @sub_nuw_nsw_i16(
96; SI: %r = sub nuw nsw i16 %a, %b
97; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +000098; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +000099; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
100; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw nsw i32 %[[A_32]], %[[B_32]]
101; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
102; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000103define i16 @sub_nuw_nsw_i16(i16 %a, i16 %b) {
104 %r = sub nuw nsw i16 %a, %b
105 ret i16 %r
106}
107
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000108; GCN-LABEL: @mul_i16(
109; SI: %r = mul i16 %a, %b
110; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000111; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000112; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
113; VI-NEXT: %[[R_32:[0-9]+]] = mul i32 %[[A_32]], %[[B_32]]
114; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
115; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000116define i16 @mul_i16(i16 %a, i16 %b) {
117 %r = mul i16 %a, %b
118 ret i16 %r
119}
120
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000121; GCN-LABEL: @mul_nsw_i16(
122; SI: %r = mul nsw i16 %a, %b
123; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000124; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000125; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
126; VI-NEXT: %[[R_32:[0-9]+]] = mul nsw i32 %[[A_32]], %[[B_32]]
127; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
128; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000129define i16 @mul_nsw_i16(i16 %a, i16 %b) {
130 %r = mul nsw i16 %a, %b
131 ret i16 %r
132}
133
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000134; GCN-LABEL: @mul_nuw_i16(
135; SI: %r = mul nuw i16 %a, %b
136; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000137; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000138; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
139; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw i32 %[[A_32]], %[[B_32]]
140; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
141; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000142define i16 @mul_nuw_i16(i16 %a, i16 %b) {
143 %r = mul nuw i16 %a, %b
144 ret i16 %r
145}
146
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000147; GCN-LABEL: @mul_nuw_nsw_i16(
148; SI: %r = mul nuw nsw i16 %a, %b
149; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000150; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000151; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
152; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw nsw i32 %[[A_32]], %[[B_32]]
153; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
154; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000155define i16 @mul_nuw_nsw_i16(i16 %a, i16 %b) {
156 %r = mul nuw nsw i16 %a, %b
157 ret i16 %r
158}
159
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000160; GCN-LABEL: @urem_i16(
161; SI: %r = urem i16 %a, %b
162; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000163; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000164; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
165; VI-NEXT: %[[R_32:[0-9]+]] = urem i32 %[[A_32]], %[[B_32]]
166; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
167; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000168define i16 @urem_i16(i16 %a, i16 %b) {
169 %r = urem i16 %a, %b
170 ret i16 %r
171}
172
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000173; GCN-LABEL: @srem_i16(
174; SI: %r = srem i16 %a, %b
175; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000176; VI: %[[A_32:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000177; VI-NEXT: %[[B_32:[0-9]+]] = sext i16 %b to i32
178; VI-NEXT: %[[R_32:[0-9]+]] = srem i32 %[[A_32]], %[[B_32]]
179; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
180; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000181define i16 @srem_i16(i16 %a, i16 %b) {
182 %r = srem i16 %a, %b
183 ret i16 %r
184}
185
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000186; GCN-LABEL: @shl_i16(
187; SI: %r = shl i16 %a, %b
188; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000189; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000190; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
191; VI-NEXT: %[[R_32:[0-9]+]] = shl i32 %[[A_32]], %[[B_32]]
192; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
193; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000194define i16 @shl_i16(i16 %a, i16 %b) {
195 %r = shl i16 %a, %b
196 ret i16 %r
197}
198
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000199; GCN-LABEL: @shl_nsw_i16(
200; SI: %r = shl nsw i16 %a, %b
201; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000202; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000203; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
204; VI-NEXT: %[[R_32:[0-9]+]] = shl nsw i32 %[[A_32]], %[[B_32]]
205; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
206; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000207define i16 @shl_nsw_i16(i16 %a, i16 %b) {
208 %r = shl nsw i16 %a, %b
209 ret i16 %r
210}
211
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000212; GCN-LABEL: @shl_nuw_i16(
213; SI: %r = shl nuw i16 %a, %b
214; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000215; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000216; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
217; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw i32 %[[A_32]], %[[B_32]]
218; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
219; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000220define i16 @shl_nuw_i16(i16 %a, i16 %b) {
221 %r = shl nuw i16 %a, %b
222 ret i16 %r
223}
224
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000225; GCN-LABEL: @shl_nuw_nsw_i16(
226; SI: %r = shl nuw nsw i16 %a, %b
227; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000228; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000229; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
230; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
231; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
232; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000233define i16 @shl_nuw_nsw_i16(i16 %a, i16 %b) {
234 %r = shl nuw nsw i16 %a, %b
235 ret i16 %r
236}
237
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000238; GCN-LABEL: @lshr_i16(
239; SI: %r = lshr i16 %a, %b
240; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000241; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000242; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
243; VI-NEXT: %[[R_32:[0-9]+]] = lshr i32 %[[A_32]], %[[B_32]]
244; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
245; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000246define i16 @lshr_i16(i16 %a, i16 %b) {
247 %r = lshr i16 %a, %b
248 ret i16 %r
249}
250
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000251; GCN-LABEL: @lshr_exact_i16(
252; SI: %r = lshr exact i16 %a, %b
253; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000254; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000255; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
256; VI-NEXT: %[[R_32:[0-9]+]] = lshr exact i32 %[[A_32]], %[[B_32]]
257; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
258; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000259define i16 @lshr_exact_i16(i16 %a, i16 %b) {
260 %r = lshr exact i16 %a, %b
261 ret i16 %r
262}
263
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000264; GCN-LABEL: @ashr_i16(
265; SI: %r = ashr i16 %a, %b
266; SI-NEXT: ret i16 %r
Konstantin Zhuravlyov691e2e02016-10-03 18:29:01 +0000267; VI: %[[A_32:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000268; VI-NEXT: %[[B_32:[0-9]+]] = sext i16 %b to i32
269; VI-NEXT: %[[R_32:[0-9]+]] = ashr i32 %[[A_32]], %[[B_32]]
270; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
271; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000272define i16 @ashr_i16(i16 %a, i16 %b) {
273 %r = ashr i16 %a, %b
274 ret i16 %r
275}
276
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000277; GCN-LABEL: @ashr_exact_i16(
278; SI: %r = ashr exact i16 %a, %b
279; SI-NEXT: ret i16 %r
Konstantin Zhuravlyov691e2e02016-10-03 18:29:01 +0000280; VI: %[[A_32:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000281; VI-NEXT: %[[B_32:[0-9]+]] = sext i16 %b to i32
282; VI-NEXT: %[[R_32:[0-9]+]] = ashr exact i32 %[[A_32]], %[[B_32]]
283; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
284; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000285define i16 @ashr_exact_i16(i16 %a, i16 %b) {
286 %r = ashr exact i16 %a, %b
287 ret i16 %r
288}
289
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000290; GCN-LABEL: @and_i16(
291; SI: %r = and i16 %a, %b
292; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000293; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000294; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
295; VI-NEXT: %[[R_32:[0-9]+]] = and i32 %[[A_32]], %[[B_32]]
296; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
297; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000298define i16 @and_i16(i16 %a, i16 %b) {
299 %r = and i16 %a, %b
300 ret i16 %r
301}
302
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000303; GCN-LABEL: @or_i16(
304; SI: %r = or i16 %a, %b
305; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000306; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000307; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
308; VI-NEXT: %[[R_32:[0-9]+]] = or i32 %[[A_32]], %[[B_32]]
309; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
310; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000311define i16 @or_i16(i16 %a, i16 %b) {
312 %r = or i16 %a, %b
313 ret i16 %r
314}
315
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000316; GCN-LABEL: @xor_i16(
317; SI: %r = xor i16 %a, %b
318; SI-NEXT: ret i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000319; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000320; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
321; VI-NEXT: %[[R_32:[0-9]+]] = xor i32 %[[A_32]], %[[B_32]]
322; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
323; VI-NEXT: ret i16 %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000324define i16 @xor_i16(i16 %a, i16 %b) {
325 %r = xor i16 %a, %b
326 ret i16 %r
327}
328
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000329; GCN-LABEL: @select_eq_i16(
330; SI: %cmp = icmp eq i16 %a, %b
331; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
332; SI-NEXT: ret i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000333; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000334; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
335; VI-NEXT: %[[CMP:[0-9]+]] = icmp eq i32 %[[A_32_0]], %[[B_32_0]]
336; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
337; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
338; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
339; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
340; VI-NEXT: ret i16 %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000341define i16 @select_eq_i16(i16 %a, i16 %b) {
342 %cmp = icmp eq i16 %a, %b
343 %sel = select i1 %cmp, i16 %a, i16 %b
344 ret i16 %sel
345}
346
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000347; GCN-LABEL: @select_ne_i16(
348; SI: %cmp = icmp ne i16 %a, %b
349; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
350; SI-NEXT: ret i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000351; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000352; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
353; VI-NEXT: %[[CMP:[0-9]+]] = icmp ne i32 %[[A_32_0]], %[[B_32_0]]
354; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
355; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
356; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
357; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
358; VI-NEXT: ret i16 %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000359define i16 @select_ne_i16(i16 %a, i16 %b) {
360 %cmp = icmp ne i16 %a, %b
361 %sel = select i1 %cmp, i16 %a, i16 %b
362 ret i16 %sel
363}
364
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000365; GCN-LABEL: @select_ugt_i16(
366; SI: %cmp = icmp ugt i16 %a, %b
367; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
368; SI-NEXT: ret i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000369; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000370; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
371; VI-NEXT: %[[CMP:[0-9]+]] = icmp ugt i32 %[[A_32_0]], %[[B_32_0]]
372; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
373; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
374; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
375; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
376; VI-NEXT: ret i16 %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000377define i16 @select_ugt_i16(i16 %a, i16 %b) {
378 %cmp = icmp ugt i16 %a, %b
379 %sel = select i1 %cmp, i16 %a, i16 %b
380 ret i16 %sel
381}
382
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000383; GCN-LABEL: @select_uge_i16(
384; SI: %cmp = icmp uge i16 %a, %b
385; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
386; SI-NEXT: ret i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000387; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000388; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
389; VI-NEXT: %[[CMP:[0-9]+]] = icmp uge i32 %[[A_32_0]], %[[B_32_0]]
390; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
391; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
392; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
393; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
394; VI-NEXT: ret i16 %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000395define i16 @select_uge_i16(i16 %a, i16 %b) {
396 %cmp = icmp uge i16 %a, %b
397 %sel = select i1 %cmp, i16 %a, i16 %b
398 ret i16 %sel
399}
400
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000401; GCN-LABEL: @select_ult_i16(
402; SI: %cmp = icmp ult i16 %a, %b
403; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
404; SI-NEXT: ret i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000405; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000406; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
407; VI-NEXT: %[[CMP:[0-9]+]] = icmp ult i32 %[[A_32_0]], %[[B_32_0]]
408; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
409; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
410; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
411; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
412; VI-NEXT: ret i16 %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000413define i16 @select_ult_i16(i16 %a, i16 %b) {
414 %cmp = icmp ult i16 %a, %b
415 %sel = select i1 %cmp, i16 %a, i16 %b
416 ret i16 %sel
417}
418
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000419; GCN-LABEL: @select_ule_i16(
420; SI: %cmp = icmp ule i16 %a, %b
421; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
422; SI-NEXT: ret i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000423; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000424; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
425; VI-NEXT: %[[CMP:[0-9]+]] = icmp ule i32 %[[A_32_0]], %[[B_32_0]]
426; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
427; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
428; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
429; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
430; VI-NEXT: ret i16 %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000431define i16 @select_ule_i16(i16 %a, i16 %b) {
432 %cmp = icmp ule i16 %a, %b
433 %sel = select i1 %cmp, i16 %a, i16 %b
434 ret i16 %sel
435}
436
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000437; GCN-LABEL: @select_sgt_i16(
438; SI: %cmp = icmp sgt i16 %a, %b
439; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
440; SI-NEXT: ret i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000441; VI: %[[A_32_0:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000442; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i16 %b to i32
443; VI-NEXT: %[[CMP:[0-9]+]] = icmp sgt i32 %[[A_32_0]], %[[B_32_0]]
444; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i16 %a to i32
445; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i16 %b to i32
446; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
447; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
448; VI-NEXT: ret i16 %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000449define i16 @select_sgt_i16(i16 %a, i16 %b) {
450 %cmp = icmp sgt i16 %a, %b
451 %sel = select i1 %cmp, i16 %a, i16 %b
452 ret i16 %sel
453}
454
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000455; GCN-LABEL: @select_sge_i16(
456; SI: %cmp = icmp sge i16 %a, %b
457; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
458; SI-NEXT: ret i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000459; VI: %[[A_32_0:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000460; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i16 %b to i32
461; VI-NEXT: %[[CMP:[0-9]+]] = icmp sge i32 %[[A_32_0]], %[[B_32_0]]
462; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i16 %a to i32
463; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i16 %b to i32
464; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
465; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
466; VI-NEXT: ret i16 %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000467define i16 @select_sge_i16(i16 %a, i16 %b) {
468 %cmp = icmp sge i16 %a, %b
469 %sel = select i1 %cmp, i16 %a, i16 %b
470 ret i16 %sel
471}
472
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000473; GCN-LABEL: @select_slt_i16(
474; SI: %cmp = icmp slt i16 %a, %b
475; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
476; SI-NEXT: ret i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000477; VI: %[[A_32_0:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000478; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i16 %b to i32
479; VI-NEXT: %[[CMP:[0-9]+]] = icmp slt i32 %[[A_32_0]], %[[B_32_0]]
480; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i16 %a to i32
481; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i16 %b to i32
482; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
483; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
484; VI-NEXT: ret i16 %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000485define i16 @select_slt_i16(i16 %a, i16 %b) {
486 %cmp = icmp slt i16 %a, %b
487 %sel = select i1 %cmp, i16 %a, i16 %b
488 ret i16 %sel
489}
490
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000491; GCN-LABEL: @select_sle_i16(
492; SI: %cmp = icmp sle i16 %a, %b
493; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
494; SI-NEXT: ret i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000495; VI: %[[A_32_0:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000496; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i16 %b to i32
497; VI-NEXT: %[[CMP:[0-9]+]] = icmp sle i32 %[[A_32_0]], %[[B_32_0]]
498; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i16 %a to i32
499; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i16 %b to i32
500; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
501; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
502; VI-NEXT: ret i16 %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000503define i16 @select_sle_i16(i16 %a, i16 %b) {
504 %cmp = icmp sle i16 %a, %b
505 %sel = select i1 %cmp, i16 %a, i16 %b
506 ret i16 %sel
507}
508
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000509declare i16 @llvm.bitreverse.i16(i16)
510; GCN-LABEL: @bitreverse_i16(
511; SI: %brev = call i16 @llvm.bitreverse.i16(i16 %a)
512; SI-NEXT: ret i16 %brev
513; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
514; VI-NEXT: %[[R_32:[0-9]+]] = call i32 @llvm.bitreverse.i32(i32 %[[A_32]])
515; VI-NEXT: %[[S_32:[0-9]+]] = lshr i32 %[[R_32]], 16
516; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[S_32]] to i16
517; VI-NEXT: ret i16 %[[R_16]]
518define i16 @bitreverse_i16(i16 %a) {
519 %brev = call i16 @llvm.bitreverse.i16(i16 %a)
520 ret i16 %brev
521}
522
523; GCN-LABEL: @add_3xi16(
524; SI: %r = add <3 x i16> %a, %b
525; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000526; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000527; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
528; VI-NEXT: %[[R_32:[0-9]+]] = add <3 x i32> %[[A_32]], %[[B_32]]
529; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
530; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000531define <3 x i16> @add_3xi16(<3 x i16> %a, <3 x i16> %b) {
532 %r = add <3 x i16> %a, %b
533 ret <3 x i16> %r
534}
535
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000536; GCN-LABEL: @add_nsw_3xi16(
537; SI: %r = add nsw <3 x i16> %a, %b
538; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000539; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000540; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
541; VI-NEXT: %[[R_32:[0-9]+]] = add nsw <3 x i32> %[[A_32]], %[[B_32]]
542; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
543; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000544define <3 x i16> @add_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
545 %r = add nsw <3 x i16> %a, %b
546 ret <3 x i16> %r
547}
548
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000549; GCN-LABEL: @add_nuw_3xi16(
550; SI: %r = add nuw <3 x i16> %a, %b
551; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000552; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000553; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
554; VI-NEXT: %[[R_32:[0-9]+]] = add nuw <3 x i32> %[[A_32]], %[[B_32]]
555; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
556; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000557define <3 x i16> @add_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) {
558 %r = add nuw <3 x i16> %a, %b
559 ret <3 x i16> %r
560}
561
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000562; GCN-LABEL: @add_nuw_nsw_3xi16(
563; SI: %r = add nuw nsw <3 x i16> %a, %b
564; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000565; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000566; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
567; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
568; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
569; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000570define <3 x i16> @add_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
571 %r = add nuw nsw <3 x i16> %a, %b
572 ret <3 x i16> %r
573}
574
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000575; GCN-LABEL: @sub_3xi16(
576; SI: %r = sub <3 x i16> %a, %b
577; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000578; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000579; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
580; VI-NEXT: %[[R_32:[0-9]+]] = sub <3 x i32> %[[A_32]], %[[B_32]]
581; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
582; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000583define <3 x i16> @sub_3xi16(<3 x i16> %a, <3 x i16> %b) {
584 %r = sub <3 x i16> %a, %b
585 ret <3 x i16> %r
586}
587
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000588; GCN-LABEL: @sub_nsw_3xi16(
589; SI: %r = sub nsw <3 x i16> %a, %b
590; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000591; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000592; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
593; VI-NEXT: %[[R_32:[0-9]+]] = sub nsw <3 x i32> %[[A_32]], %[[B_32]]
594; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
595; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000596define <3 x i16> @sub_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
597 %r = sub nsw <3 x i16> %a, %b
598 ret <3 x i16> %r
599}
600
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000601; GCN-LABEL: @sub_nuw_3xi16(
602; SI: %r = sub nuw <3 x i16> %a, %b
603; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000604; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000605; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
606; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw <3 x i32> %[[A_32]], %[[B_32]]
607; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
608; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000609define <3 x i16> @sub_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) {
610 %r = sub nuw <3 x i16> %a, %b
611 ret <3 x i16> %r
612}
613
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000614; GCN-LABEL: @sub_nuw_nsw_3xi16(
615; SI: %r = sub nuw nsw <3 x i16> %a, %b
616; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000617; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000618; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
619; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
620; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
621; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000622define <3 x i16> @sub_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
623 %r = sub nuw nsw <3 x i16> %a, %b
624 ret <3 x i16> %r
625}
626
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000627; GCN-LABEL: @mul_3xi16(
628; SI: %r = mul <3 x i16> %a, %b
629; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000630; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000631; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
632; VI-NEXT: %[[R_32:[0-9]+]] = mul <3 x i32> %[[A_32]], %[[B_32]]
633; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
634; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000635define <3 x i16> @mul_3xi16(<3 x i16> %a, <3 x i16> %b) {
636 %r = mul <3 x i16> %a, %b
637 ret <3 x i16> %r
638}
639
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000640; GCN-LABEL: @mul_nsw_3xi16(
641; SI: %r = mul nsw <3 x i16> %a, %b
642; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000643; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000644; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
645; VI-NEXT: %[[R_32:[0-9]+]] = mul nsw <3 x i32> %[[A_32]], %[[B_32]]
646; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
647; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000648define <3 x i16> @mul_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
649 %r = mul nsw <3 x i16> %a, %b
650 ret <3 x i16> %r
651}
652
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000653; GCN-LABEL: @mul_nuw_3xi16(
654; SI: %r = mul nuw <3 x i16> %a, %b
655; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000656; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000657; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
658; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw <3 x i32> %[[A_32]], %[[B_32]]
659; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
660; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000661define <3 x i16> @mul_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) {
662 %r = mul nuw <3 x i16> %a, %b
663 ret <3 x i16> %r
664}
665
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000666; GCN-LABEL: @mul_nuw_nsw_3xi16(
667; SI: %r = mul nuw nsw <3 x i16> %a, %b
668; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000669; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000670; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
671; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
672; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
673; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000674define <3 x i16> @mul_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
675 %r = mul nuw nsw <3 x i16> %a, %b
676 ret <3 x i16> %r
677}
678
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000679; GCN-LABEL: @urem_3xi16(
680; SI: %r = urem <3 x i16> %a, %b
681; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000682; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000683; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
684; VI-NEXT: %[[R_32:[0-9]+]] = urem <3 x i32> %[[A_32]], %[[B_32]]
685; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
686; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000687define <3 x i16> @urem_3xi16(<3 x i16> %a, <3 x i16> %b) {
688 %r = urem <3 x i16> %a, %b
689 ret <3 x i16> %r
690}
691
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000692; GCN-LABEL: @srem_3xi16(
693; SI: %r = srem <3 x i16> %a, %b
694; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000695; VI: %[[A_32:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000696; VI-NEXT: %[[B_32:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
697; VI-NEXT: %[[R_32:[0-9]+]] = srem <3 x i32> %[[A_32]], %[[B_32]]
698; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
699; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000700define <3 x i16> @srem_3xi16(<3 x i16> %a, <3 x i16> %b) {
701 %r = srem <3 x i16> %a, %b
702 ret <3 x i16> %r
703}
704
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000705; GCN-LABEL: @shl_3xi16(
706; SI: %r = shl <3 x i16> %a, %b
707; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000708; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000709; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
710; VI-NEXT: %[[R_32:[0-9]+]] = shl <3 x i32> %[[A_32]], %[[B_32]]
711; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
712; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000713define <3 x i16> @shl_3xi16(<3 x i16> %a, <3 x i16> %b) {
714 %r = shl <3 x i16> %a, %b
715 ret <3 x i16> %r
716}
717
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000718; GCN-LABEL: @shl_nsw_3xi16(
719; SI: %r = shl nsw <3 x i16> %a, %b
720; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000721; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000722; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
723; VI-NEXT: %[[R_32:[0-9]+]] = shl nsw <3 x i32> %[[A_32]], %[[B_32]]
724; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
725; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000726define <3 x i16> @shl_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
727 %r = shl nsw <3 x i16> %a, %b
728 ret <3 x i16> %r
729}
730
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000731; GCN-LABEL: @shl_nuw_3xi16(
732; SI: %r = shl nuw <3 x i16> %a, %b
733; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000734; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000735; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
736; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw <3 x i32> %[[A_32]], %[[B_32]]
737; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
738; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000739define <3 x i16> @shl_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) {
740 %r = shl nuw <3 x i16> %a, %b
741 ret <3 x i16> %r
742}
743
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000744; GCN-LABEL: @shl_nuw_nsw_3xi16(
745; SI: %r = shl nuw nsw <3 x i16> %a, %b
746; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000747; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000748; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
749; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
750; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
751; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000752define <3 x i16> @shl_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
753 %r = shl nuw nsw <3 x i16> %a, %b
754 ret <3 x i16> %r
755}
756
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000757; GCN-LABEL: @lshr_3xi16(
758; SI: %r = lshr <3 x i16> %a, %b
759; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000760; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000761; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
762; VI-NEXT: %[[R_32:[0-9]+]] = lshr <3 x i32> %[[A_32]], %[[B_32]]
763; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
764; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000765define <3 x i16> @lshr_3xi16(<3 x i16> %a, <3 x i16> %b) {
766 %r = lshr <3 x i16> %a, %b
767 ret <3 x i16> %r
768}
769
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000770; GCN-LABEL: @lshr_exact_3xi16(
771; SI: %r = lshr exact <3 x i16> %a, %b
772; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000773; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000774; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
775; VI-NEXT: %[[R_32:[0-9]+]] = lshr exact <3 x i32> %[[A_32]], %[[B_32]]
776; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
777; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000778define <3 x i16> @lshr_exact_3xi16(<3 x i16> %a, <3 x i16> %b) {
779 %r = lshr exact <3 x i16> %a, %b
780 ret <3 x i16> %r
781}
782
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000783; GCN-LABEL: @ashr_3xi16(
784; SI: %r = ashr <3 x i16> %a, %b
785; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyov691e2e02016-10-03 18:29:01 +0000786; VI: %[[A_32:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000787; VI-NEXT: %[[B_32:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
788; VI-NEXT: %[[R_32:[0-9]+]] = ashr <3 x i32> %[[A_32]], %[[B_32]]
789; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
790; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000791define <3 x i16> @ashr_3xi16(<3 x i16> %a, <3 x i16> %b) {
792 %r = ashr <3 x i16> %a, %b
793 ret <3 x i16> %r
794}
795
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000796; GCN-LABEL: @ashr_exact_3xi16(
797; SI: %r = ashr exact <3 x i16> %a, %b
798; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyov691e2e02016-10-03 18:29:01 +0000799; VI: %[[A_32:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000800; VI-NEXT: %[[B_32:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
801; VI-NEXT: %[[R_32:[0-9]+]] = ashr exact <3 x i32> %[[A_32]], %[[B_32]]
802; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
803; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000804define <3 x i16> @ashr_exact_3xi16(<3 x i16> %a, <3 x i16> %b) {
805 %r = ashr exact <3 x i16> %a, %b
806 ret <3 x i16> %r
807}
808
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000809; GCN-LABEL: @and_3xi16(
810; SI: %r = and <3 x i16> %a, %b
811; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000812; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000813; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
814; VI-NEXT: %[[R_32:[0-9]+]] = and <3 x i32> %[[A_32]], %[[B_32]]
815; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
816; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000817define <3 x i16> @and_3xi16(<3 x i16> %a, <3 x i16> %b) {
818 %r = and <3 x i16> %a, %b
819 ret <3 x i16> %r
820}
821
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000822; GCN-LABEL: @or_3xi16(
823; SI: %r = or <3 x i16> %a, %b
824; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000825; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000826; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
827; VI-NEXT: %[[R_32:[0-9]+]] = or <3 x i32> %[[A_32]], %[[B_32]]
828; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
829; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000830define <3 x i16> @or_3xi16(<3 x i16> %a, <3 x i16> %b) {
831 %r = or <3 x i16> %a, %b
832 ret <3 x i16> %r
833}
834
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000835; GCN-LABEL: @xor_3xi16(
836; SI: %r = xor <3 x i16> %a, %b
837; SI-NEXT: ret <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000838; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000839; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
840; VI-NEXT: %[[R_32:[0-9]+]] = xor <3 x i32> %[[A_32]], %[[B_32]]
841; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
842; VI-NEXT: ret <3 x i16> %[[R_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000843define <3 x i16> @xor_3xi16(<3 x i16> %a, <3 x i16> %b) {
844 %r = xor <3 x i16> %a, %b
845 ret <3 x i16> %r
846}
847
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000848; GCN-LABEL: @select_eq_3xi16(
849; SI: %cmp = icmp eq <3 x i16> %a, %b
850; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
851; SI-NEXT: ret <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000852; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000853; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
854; VI-NEXT: %[[CMP:[0-9]+]] = icmp eq <3 x i32> %[[A_32_0]], %[[B_32_0]]
855; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
856; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
857; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
858; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
859; VI-NEXT: ret <3 x i16> %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000860define <3 x i16> @select_eq_3xi16(<3 x i16> %a, <3 x i16> %b) {
861 %cmp = icmp eq <3 x i16> %a, %b
862 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
863 ret <3 x i16> %sel
864}
865
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000866; GCN-LABEL: @select_ne_3xi16(
867; SI: %cmp = icmp ne <3 x i16> %a, %b
868; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
869; SI-NEXT: ret <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000870; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000871; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
872; VI-NEXT: %[[CMP:[0-9]+]] = icmp ne <3 x i32> %[[A_32_0]], %[[B_32_0]]
873; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
874; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
875; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
876; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
877; VI-NEXT: ret <3 x i16> %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000878define <3 x i16> @select_ne_3xi16(<3 x i16> %a, <3 x i16> %b) {
879 %cmp = icmp ne <3 x i16> %a, %b
880 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
881 ret <3 x i16> %sel
882}
883
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000884; GCN-LABEL: @select_ugt_3xi16(
885; SI: %cmp = icmp ugt <3 x i16> %a, %b
886; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
887; SI-NEXT: ret <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000888; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000889; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
890; VI-NEXT: %[[CMP:[0-9]+]] = icmp ugt <3 x i32> %[[A_32_0]], %[[B_32_0]]
891; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
892; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
893; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
894; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
895; VI-NEXT: ret <3 x i16> %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000896define <3 x i16> @select_ugt_3xi16(<3 x i16> %a, <3 x i16> %b) {
897 %cmp = icmp ugt <3 x i16> %a, %b
898 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
899 ret <3 x i16> %sel
900}
901
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000902; GCN-LABEL: @select_uge_3xi16(
903; SI: %cmp = icmp uge <3 x i16> %a, %b
904; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
905; SI-NEXT: ret <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000906; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000907; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
908; VI-NEXT: %[[CMP:[0-9]+]] = icmp uge <3 x i32> %[[A_32_0]], %[[B_32_0]]
909; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
910; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
911; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
912; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
913; VI-NEXT: ret <3 x i16> %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000914define <3 x i16> @select_uge_3xi16(<3 x i16> %a, <3 x i16> %b) {
915 %cmp = icmp uge <3 x i16> %a, %b
916 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
917 ret <3 x i16> %sel
918}
919
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000920; GCN-LABEL: @select_ult_3xi16(
921; SI: %cmp = icmp ult <3 x i16> %a, %b
922; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
923; SI-NEXT: ret <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000924; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000925; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
926; VI-NEXT: %[[CMP:[0-9]+]] = icmp ult <3 x i32> %[[A_32_0]], %[[B_32_0]]
927; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
928; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
929; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
930; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
931; VI-NEXT: ret <3 x i16> %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000932define <3 x i16> @select_ult_3xi16(<3 x i16> %a, <3 x i16> %b) {
933 %cmp = icmp ult <3 x i16> %a, %b
934 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
935 ret <3 x i16> %sel
936}
937
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000938; GCN-LABEL: @select_ule_3xi16(
939; SI: %cmp = icmp ule <3 x i16> %a, %b
940; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
941; SI-NEXT: ret <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000942; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000943; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
944; VI-NEXT: %[[CMP:[0-9]+]] = icmp ule <3 x i32> %[[A_32_0]], %[[B_32_0]]
945; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
946; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
947; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
948; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
949; VI-NEXT: ret <3 x i16> %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000950define <3 x i16> @select_ule_3xi16(<3 x i16> %a, <3 x i16> %b) {
951 %cmp = icmp ule <3 x i16> %a, %b
952 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
953 ret <3 x i16> %sel
954}
955
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000956; GCN-LABEL: @select_sgt_3xi16(
957; SI: %cmp = icmp sgt <3 x i16> %a, %b
958; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
959; SI-NEXT: ret <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000960; VI: %[[A_32_0:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000961; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
962; VI-NEXT: %[[CMP:[0-9]+]] = icmp sgt <3 x i32> %[[A_32_0]], %[[B_32_0]]
963; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
964; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
965; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
966; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
967; VI-NEXT: ret <3 x i16> %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000968define <3 x i16> @select_sgt_3xi16(<3 x i16> %a, <3 x i16> %b) {
969 %cmp = icmp sgt <3 x i16> %a, %b
970 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
971 ret <3 x i16> %sel
972}
973
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000974; GCN-LABEL: @select_sge_3xi16(
975; SI: %cmp = icmp sge <3 x i16> %a, %b
976; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
977; SI-NEXT: ret <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000978; VI: %[[A_32_0:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000979; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
980; VI-NEXT: %[[CMP:[0-9]+]] = icmp sge <3 x i32> %[[A_32_0]], %[[B_32_0]]
981; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
982; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
983; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
984; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
985; VI-NEXT: ret <3 x i16> %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000986define <3 x i16> @select_sge_3xi16(<3 x i16> %a, <3 x i16> %b) {
987 %cmp = icmp sge <3 x i16> %a, %b
988 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
989 ret <3 x i16> %sel
990}
991
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000992; GCN-LABEL: @select_slt_3xi16(
993; SI: %cmp = icmp slt <3 x i16> %a, %b
994; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
995; SI-NEXT: ret <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000996; VI: %[[A_32_0:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000997; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
998; VI-NEXT: %[[CMP:[0-9]+]] = icmp slt <3 x i32> %[[A_32_0]], %[[B_32_0]]
999; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
1000; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
1001; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1002; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
1003; VI-NEXT: ret <3 x i16> %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001004define <3 x i16> @select_slt_3xi16(<3 x i16> %a, <3 x i16> %b) {
1005 %cmp = icmp slt <3 x i16> %a, %b
1006 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
1007 ret <3 x i16> %sel
1008}
1009
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001010; GCN-LABEL: @select_sle_3xi16(
1011; SI: %cmp = icmp sle <3 x i16> %a, %b
1012; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
1013; SI-NEXT: ret <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001014; VI: %[[A_32_0:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001015; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
1016; VI-NEXT: %[[CMP:[0-9]+]] = icmp sle <3 x i32> %[[A_32_0]], %[[B_32_0]]
1017; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
1018; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
1019; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1020; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
1021; VI-NEXT: ret <3 x i16> %[[SEL_16]]
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001022define <3 x i16> @select_sle_3xi16(<3 x i16> %a, <3 x i16> %b) {
1023 %cmp = icmp sle <3 x i16> %a, %b
1024 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
1025 ret <3 x i16> %sel
1026}
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001027
1028declare <3 x i16> @llvm.bitreverse.v3i16(<3 x i16>)
1029; GCN-LABEL: @bitreverse_3xi16(
1030; SI: %brev = call <3 x i16> @llvm.bitreverse.v3i16(<3 x i16> %a)
1031; SI-NEXT: ret <3 x i16> %brev
1032; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
1033; VI-NEXT: %[[R_32:[0-9]+]] = call <3 x i32> @llvm.bitreverse.v3i32(<3 x i32> %[[A_32]])
1034; VI-NEXT: %[[S_32:[0-9]+]] = lshr <3 x i32> %[[R_32]], <i32 16, i32 16, i32 16>
1035; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[S_32]] to <3 x i16>
1036; VI-NEXT: ret <3 x i16> %[[R_16]]
1037define <3 x i16> @bitreverse_3xi16(<3 x i16> %a) {
1038 %brev = call <3 x i16> @llvm.bitreverse.v3i16(<3 x i16> %a)
1039 ret <3 x i16> %brev
1040}