blob: b0c1f53695d7e366de5a5e04f5acdaec0f20e782 [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 Zhuravlyovf74fc602016-10-07 14:22:58 +00004; GCN-LABEL: @add_i3(
5; SI: %r = add i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00006; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00007; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
8; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +00009; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000010; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000011; VI-NEXT: store volatile i3 %[[R_3]]
12define amdgpu_kernel void @add_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000013 %r = add i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000014 store volatile i3 %r, i3 addrspace(1)* undef
15 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000016}
17
18; GCN-LABEL: @add_nsw_i3(
19; SI: %r = add nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000020; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000021; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
22; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +000023; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000024; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000025; VI-NEXT: store volatile i3 %[[R_3]]
26define amdgpu_kernel void @add_nsw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000027 %r = add nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000028 store volatile i3 %r, i3 addrspace(1)* undef
29 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000030}
31
32; GCN-LABEL: @add_nuw_i3(
33; SI: %r = add nuw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000034; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000035; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
36; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +000037; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000038; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000039; VI-NEXT: store volatile i3 %[[R_3]]
40define amdgpu_kernel void @add_nuw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000041 %r = add nuw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000042 store volatile i3 %r, i3 addrspace(1)* undef
43 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000044}
45
46; GCN-LABEL: @add_nuw_nsw_i3(
47; SI: %r = add nuw nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000048; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000049; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
50; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
51; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw i32 %[[A_32]], %[[B_32]]
52; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000053; VI-NEXT: store volatile i3 %[[R_3]]
54define amdgpu_kernel void @add_nuw_nsw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000055 %r = add nuw nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000056 store volatile i3 %r, i3 addrspace(1)* undef
57 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000058}
59
60; GCN-LABEL: @sub_i3(
61; SI: %r = sub i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000062; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000063; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
64; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +000065; VI-NEXT: %[[R_32:[0-9]+]] = sub nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000066; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000067; VI-NEXT: store volatile i3 %[[R_3]]
68define amdgpu_kernel void @sub_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000069 %r = sub i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000070 store volatile i3 %r, i3 addrspace(1)* undef
71 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000072}
73
74; GCN-LABEL: @sub_nsw_i3(
75; SI: %r = sub nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000076; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000077; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
78; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
79; VI-NEXT: %[[R_32:[0-9]+]] = sub nsw i32 %[[A_32]], %[[B_32]]
80; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000081; VI-NEXT: store volatile i3 %[[R_3]]
82define amdgpu_kernel void @sub_nsw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000083 %r = sub nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000084 store volatile i3 %r, i3 addrspace(1)* undef
85 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000086}
87
88; GCN-LABEL: @sub_nuw_i3(
89; SI: %r = sub nuw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000090; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000091; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
92; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +000093; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000094; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000095; VI-NEXT: store volatile i3 %[[R_3]]
96define amdgpu_kernel void @sub_nuw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +000097 %r = sub nuw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +000098 store volatile i3 %r, i3 addrspace(1)* undef
99 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000100}
101
102; GCN-LABEL: @sub_nuw_nsw_i3(
103; SI: %r = sub nuw nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000104; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000105; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
106; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
107; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw nsw i32 %[[A_32]], %[[B_32]]
108; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000109; VI-NEXT: store volatile i3 %[[R_3]]
110define amdgpu_kernel void @sub_nuw_nsw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000111 %r = sub nuw nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000112 store volatile i3 %r, i3 addrspace(1)* undef
113 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000114}
115
116; GCN-LABEL: @mul_i3(
117; SI: %r = mul i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000118; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000119; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
120; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000121; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000122; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000123; VI-NEXT: store volatile i3 %[[R_3]]
124define amdgpu_kernel void @mul_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000125 %r = mul i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000126 store volatile i3 %r, i3 addrspace(1)* undef
127 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000128}
129
130; GCN-LABEL: @mul_nsw_i3(
131; SI: %r = mul nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000132; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000133; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
134; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000135; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000136; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000137; VI-NEXT: store volatile i3 %[[R_3]]
138define amdgpu_kernel void @mul_nsw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000139 %r = mul nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000140 store volatile i3 %r, i3 addrspace(1)* undef
141 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000142}
143
144; GCN-LABEL: @mul_nuw_i3(
145; SI: %r = mul nuw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000146; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000147; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
148; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000149; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000150; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000151; VI-NEXT: store volatile i3 %[[R_3]]
152define amdgpu_kernel void @mul_nuw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000153 %r = mul nuw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000154 store volatile i3 %r, i3 addrspace(1)* undef
155 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000156}
157
158; GCN-LABEL: @mul_nuw_nsw_i3(
159; SI: %r = mul nuw nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000160; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000161; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
162; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
163; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw nsw i32 %[[A_32]], %[[B_32]]
164; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000165; VI-NEXT: store volatile i3 %[[R_3]]
166define amdgpu_kernel void @mul_nuw_nsw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000167 %r = mul nuw nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000168 store volatile i3 %r, i3 addrspace(1)* undef
169 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000170}
171
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000172; GCN-LABEL: @shl_i3(
173; SI: %r = shl i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000174; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000175; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
176; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000177; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000178; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000179; VI-NEXT: store volatile i3 %[[R_3]]
180define amdgpu_kernel void @shl_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000181 %r = shl i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000182 store volatile i3 %r, i3 addrspace(1)* undef
183 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000184}
185
186; GCN-LABEL: @shl_nsw_i3(
187; SI: %r = shl nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000188; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000189; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
190; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000191; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000192; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000193; VI-NEXT: store volatile i3 %[[R_3]]
194define amdgpu_kernel void @shl_nsw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000195 %r = shl nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000196 store volatile i3 %r, i3 addrspace(1)* undef
197 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000198}
199
200; GCN-LABEL: @shl_nuw_i3(
201; SI: %r = shl nuw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000202; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000203; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
204; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000205; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000206; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000207; VI-NEXT: store volatile i3 %[[R_3]]
208define amdgpu_kernel void @shl_nuw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000209 %r = shl nuw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000210 store volatile i3 %r, i3 addrspace(1)* undef
211 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000212}
213
214; GCN-LABEL: @shl_nuw_nsw_i3(
215; SI: %r = shl nuw nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000216; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000217; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
218; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
219; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
220; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000221; VI-NEXT: store volatile i3 %[[R_3]]
222define amdgpu_kernel void @shl_nuw_nsw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000223 %r = shl nuw nsw i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000224 store volatile i3 %r, i3 addrspace(1)* undef
225 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000226}
227
228; GCN-LABEL: @lshr_i3(
229; SI: %r = lshr i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000230; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000231; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
232; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
233; VI-NEXT: %[[R_32:[0-9]+]] = lshr i32 %[[A_32]], %[[B_32]]
234; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000235; VI-NEXT: store volatile i3 %[[R_3]]
236define amdgpu_kernel void @lshr_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000237 %r = lshr i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000238 store volatile i3 %r, i3 addrspace(1)* undef
239 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000240}
241
242; GCN-LABEL: @lshr_exact_i3(
243; SI: %r = lshr exact i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000244; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000245; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
246; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
247; VI-NEXT: %[[R_32:[0-9]+]] = lshr exact i32 %[[A_32]], %[[B_32]]
248; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000249; VI-NEXT: store volatile i3 %[[R_3]]
250define amdgpu_kernel void @lshr_exact_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000251 %r = lshr exact i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000252 store volatile i3 %r, i3 addrspace(1)* undef
253 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000254}
255
256; GCN-LABEL: @ashr_i3(
257; SI: %r = ashr i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000258; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000259; VI: %[[A_32:[0-9]+]] = sext i3 %a to i32
260; VI-NEXT: %[[B_32:[0-9]+]] = sext i3 %b to i32
261; VI-NEXT: %[[R_32:[0-9]+]] = ashr i32 %[[A_32]], %[[B_32]]
262; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000263; VI-NEXT: store volatile i3 %[[R_3]]
264define amdgpu_kernel void @ashr_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000265 %r = ashr i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000266 store volatile i3 %r, i3 addrspace(1)* undef
267 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000268}
269
270; GCN-LABEL: @ashr_exact_i3(
271; SI: %r = ashr exact i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000272; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000273; VI: %[[A_32:[0-9]+]] = sext i3 %a to i32
274; VI-NEXT: %[[B_32:[0-9]+]] = sext i3 %b to i32
275; VI-NEXT: %[[R_32:[0-9]+]] = ashr exact i32 %[[A_32]], %[[B_32]]
276; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000277; VI-NEXT: store volatile i3 %[[R_3]]
278define amdgpu_kernel void @ashr_exact_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000279 %r = ashr exact i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000280 store volatile i3 %r, i3 addrspace(1)* undef
281 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000282}
283
284; GCN-LABEL: @and_i3(
285; SI: %r = and i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000286; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000287; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
288; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
289; VI-NEXT: %[[R_32:[0-9]+]] = and i32 %[[A_32]], %[[B_32]]
290; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000291; VI-NEXT: store volatile i3 %[[R_3]]
292define amdgpu_kernel void @and_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000293 %r = and i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000294 store volatile i3 %r, i3 addrspace(1)* undef
295 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000296}
297
298; GCN-LABEL: @or_i3(
299; SI: %r = or i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000300; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000301; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
302; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
303; VI-NEXT: %[[R_32:[0-9]+]] = or i32 %[[A_32]], %[[B_32]]
304; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000305; VI-NEXT: store volatile i3 %[[R_3]]
306define amdgpu_kernel void @or_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000307 %r = or i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000308 store volatile i3 %r, i3 addrspace(1)* undef
309 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000310}
311
312; GCN-LABEL: @xor_i3(
313; SI: %r = xor i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000314; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000315; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
316; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
317; VI-NEXT: %[[R_32:[0-9]+]] = xor i32 %[[A_32]], %[[B_32]]
318; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000319; VI-NEXT: store volatile i3 %[[R_3]]
320define amdgpu_kernel void @xor_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000321 %r = xor i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000322 store volatile i3 %r, i3 addrspace(1)* undef
323 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000324}
325
326; GCN-LABEL: @select_eq_i3(
327; SI: %cmp = icmp eq i3 %a, %b
328; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000329; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000330; VI: %[[A_32_0:[0-9]+]] = zext i3 %a to i32
331; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i3 %b to i32
332; VI-NEXT: %[[CMP:[0-9]+]] = icmp eq i32 %[[A_32_0]], %[[B_32_0]]
333; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i3 %a to i32
334; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i3 %b to i32
335; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
336; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000337; VI-NEXT: store volatile i3 %[[SEL_3]]
338define amdgpu_kernel void @select_eq_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000339 %cmp = icmp eq i3 %a, %b
340 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000341 store volatile i3 %sel, i3 addrspace(1)* undef
342 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000343}
344
345; GCN-LABEL: @select_ne_i3(
346; SI: %cmp = icmp ne i3 %a, %b
347; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000348; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000349; VI: %[[A_32_0:[0-9]+]] = zext i3 %a to i32
350; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i3 %b to i32
351; VI-NEXT: %[[CMP:[0-9]+]] = icmp ne i32 %[[A_32_0]], %[[B_32_0]]
352; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i3 %a to i32
353; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i3 %b to i32
354; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
355; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000356; VI-NEXT: store volatile i3 %[[SEL_3]]
357define amdgpu_kernel void @select_ne_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000358 %cmp = icmp ne i3 %a, %b
359 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000360 store volatile i3 %sel, i3 addrspace(1)* undef
361 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000362}
363
364; GCN-LABEL: @select_ugt_i3(
365; SI: %cmp = icmp ugt i3 %a, %b
366; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000367; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000368; VI: %[[A_32_0:[0-9]+]] = zext i3 %a to i32
369; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i3 %b to i32
370; VI-NEXT: %[[CMP:[0-9]+]] = icmp ugt i32 %[[A_32_0]], %[[B_32_0]]
371; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i3 %a to i32
372; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i3 %b to i32
373; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
374; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000375; VI-NEXT: store volatile i3 %[[SEL_3]]
376define amdgpu_kernel void @select_ugt_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000377 %cmp = icmp ugt i3 %a, %b
378 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000379 store volatile i3 %sel, i3 addrspace(1)* undef
380 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000381}
382
383; GCN-LABEL: @select_uge_i3(
384; SI: %cmp = icmp uge i3 %a, %b
385; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000386; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000387; VI: %[[A_32_0:[0-9]+]] = zext i3 %a to i32
388; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i3 %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 i3 %a to i32
391; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i3 %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_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000394; VI-NEXT: store volatile i3 %[[SEL_3]]
395define amdgpu_kernel void @select_uge_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000396 %cmp = icmp uge i3 %a, %b
397 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000398 store volatile i3 %sel, i3 addrspace(1)* undef
399 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000400}
401
402; GCN-LABEL: @select_ult_i3(
403; SI: %cmp = icmp ult i3 %a, %b
404; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000405; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000406; VI: %[[A_32_0:[0-9]+]] = zext i3 %a to i32
407; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i3 %b to i32
408; VI-NEXT: %[[CMP:[0-9]+]] = icmp ult i32 %[[A_32_0]], %[[B_32_0]]
409; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i3 %a to i32
410; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i3 %b to i32
411; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
412; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000413; VI-NEXT: store volatile i3 %[[SEL_3]]
414define amdgpu_kernel void @select_ult_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000415 %cmp = icmp ult i3 %a, %b
416 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000417 store volatile i3 %sel, i3 addrspace(1)* undef
418 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000419}
420
421; GCN-LABEL: @select_ule_i3(
422; SI: %cmp = icmp ule i3 %a, %b
423; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000424; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000425; VI: %[[A_32_0:[0-9]+]] = zext i3 %a to i32
426; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i3 %b to i32
427; VI-NEXT: %[[CMP:[0-9]+]] = icmp ule i32 %[[A_32_0]], %[[B_32_0]]
428; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i3 %a to i32
429; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i3 %b to i32
430; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
431; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000432; VI-NEXT: store volatile i3 %[[SEL_3]]
433define amdgpu_kernel void @select_ule_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000434 %cmp = icmp ule i3 %a, %b
435 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000436 store volatile i3 %sel, i3 addrspace(1)* undef
437 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000438}
439
440; GCN-LABEL: @select_sgt_i3(
441; SI: %cmp = icmp sgt i3 %a, %b
442; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000443; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000444; VI: %[[A_32_0:[0-9]+]] = sext i3 %a to i32
445; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i3 %b to i32
446; VI-NEXT: %[[CMP:[0-9]+]] = icmp sgt i32 %[[A_32_0]], %[[B_32_0]]
447; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i3 %a to i32
448; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i3 %b to i32
449; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
450; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000451; VI-NEXT: store volatile i3 %[[SEL_3]]
452define amdgpu_kernel void @select_sgt_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000453 %cmp = icmp sgt i3 %a, %b
454 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000455 store volatile i3 %sel, i3 addrspace(1)* undef
456 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000457}
458
459; GCN-LABEL: @select_sge_i3(
460; SI: %cmp = icmp sge i3 %a, %b
461; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000462; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000463; VI: %[[A_32_0:[0-9]+]] = sext i3 %a to i32
464; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i3 %b to i32
465; VI-NEXT: %[[CMP:[0-9]+]] = icmp sge i32 %[[A_32_0]], %[[B_32_0]]
466; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i3 %a to i32
467; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i3 %b to i32
468; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
469; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000470; VI-NEXT: store volatile i3 %[[SEL_3]]
471define amdgpu_kernel void @select_sge_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000472 %cmp = icmp sge i3 %a, %b
473 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000474 store volatile i3 %sel, i3 addrspace(1)* undef
475 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000476}
477
478; GCN-LABEL: @select_slt_i3(
479; SI: %cmp = icmp slt i3 %a, %b
480; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000481; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000482; VI: %[[A_32_0:[0-9]+]] = sext i3 %a to i32
483; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i3 %b to i32
484; VI-NEXT: %[[CMP:[0-9]+]] = icmp slt i32 %[[A_32_0]], %[[B_32_0]]
485; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i3 %a to i32
486; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i3 %b to i32
487; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
488; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000489; VI-NEXT: store volatile i3 %[[SEL_3]]
490define amdgpu_kernel void @select_slt_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000491 %cmp = icmp slt i3 %a, %b
492 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000493 store volatile i3 %sel, i3 addrspace(1)* undef
494 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000495}
496
497; GCN-LABEL: @select_sle_i3(
498; SI: %cmp = icmp sle i3 %a, %b
499; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000500; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000501; VI: %[[A_32_0:[0-9]+]] = sext i3 %a to i32
502; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i3 %b to i32
503; VI-NEXT: %[[CMP:[0-9]+]] = icmp sle i32 %[[A_32_0]], %[[B_32_0]]
504; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i3 %a to i32
505; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i3 %b to i32
506; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
507; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000508; VI-NEXT: store volatile i3 %[[SEL_3]]
509define amdgpu_kernel void @select_sle_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000510 %cmp = icmp sle i3 %a, %b
511 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000512 store volatile i3 %sel, i3 addrspace(1)* undef
513 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000514}
515
516declare i3 @llvm.bitreverse.i3(i3)
517; GCN-LABEL: @bitreverse_i3(
518; SI: %brev = call i3 @llvm.bitreverse.i3(i3 %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000519; SI-NEXT: store volatile i3 %brev
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000520; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
521; VI-NEXT: %[[R_32:[0-9]+]] = call i32 @llvm.bitreverse.i32(i32 %[[A_32]])
522; VI-NEXT: %[[S_32:[0-9]+]] = lshr i32 %[[R_32]], 29
523; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[S_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000524; VI-NEXT: store volatile i3 %[[R_3]]
525define amdgpu_kernel void @bitreverse_i3(i3 %a) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000526 %brev = call i3 @llvm.bitreverse.i3(i3 %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000527 store volatile i3 %brev, i3 addrspace(1)* undef
528 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000529}
530
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000531; GCN-LABEL: @add_i16(
532; SI: %r = add i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000533; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000534; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000535; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000536; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000537; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000538; VI-NEXT: store volatile i16 %[[R_16]]
539define amdgpu_kernel void @add_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000540 %r = add i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000541 store volatile i16 %r, i16 addrspace(1)* undef
542 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000543}
544
Matt Arsenault269ffda2016-12-06 23:18:06 +0000545; GCN-LABEL: @constant_add_i16(
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000546; VI: store volatile i16 3
547define amdgpu_kernel void @constant_add_i16() {
Matt Arsenault269ffda2016-12-06 23:18:06 +0000548 %r = add i16 1, 2
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000549 store volatile i16 %r, i16 addrspace(1)* undef
550 ret void
Matt Arsenault269ffda2016-12-06 23:18:06 +0000551}
552
553; GCN-LABEL: @constant_add_nsw_i16(
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000554; VI: store volatile i16 3
555define amdgpu_kernel void @constant_add_nsw_i16() {
Matt Arsenault269ffda2016-12-06 23:18:06 +0000556 %r = add nsw i16 1, 2
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000557 store volatile i16 %r, i16 addrspace(1)* undef
558 ret void
Matt Arsenault269ffda2016-12-06 23:18:06 +0000559}
560
561; GCN-LABEL: @constant_add_nuw_i16(
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000562; VI: store volatile i16 3
563define amdgpu_kernel void @constant_add_nuw_i16() {
Matt Arsenault269ffda2016-12-06 23:18:06 +0000564 %r = add nsw i16 1, 2
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000565 store volatile i16 %r, i16 addrspace(1)* undef
566 ret void
Matt Arsenault269ffda2016-12-06 23:18:06 +0000567}
568
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000569; GCN-LABEL: @add_nsw_i16(
570; SI: %r = add nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000571; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000572; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000573; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000574; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000575; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000576; VI-NEXT: store volatile i16 %[[R_16]]
577define amdgpu_kernel void @add_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000578 %r = add nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000579 store volatile i16 %r, i16 addrspace(1)* undef
580 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000581}
582
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000583; GCN-LABEL: @add_nuw_i16(
584; SI: %r = add nuw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000585; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000586; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000587; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000588; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000589; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000590; VI-NEXT: store volatile i16 %[[R_16]]
591define amdgpu_kernel void @add_nuw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000592 %r = add nuw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000593 store volatile i16 %r, i16 addrspace(1)* undef
594 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000595}
596
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000597; GCN-LABEL: @add_nuw_nsw_i16(
598; SI: %r = add nuw nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000599; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000600; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000601; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
602; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw i32 %[[A_32]], %[[B_32]]
603; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000604; VI-NEXT: store volatile i16 %[[R_16]]
605define amdgpu_kernel void @add_nuw_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000606 %r = add nuw nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000607 store volatile i16 %r, i16 addrspace(1)* undef
608 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000609}
610
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000611; GCN-LABEL: @sub_i16(
612; SI: %r = sub i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000613; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000614; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000615; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000616; VI-NEXT: %[[R_32:[0-9]+]] = sub nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000617; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000618; VI-NEXT: store volatile i16 %[[R_16]]
619define amdgpu_kernel void @sub_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000620 %r = sub i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000621 store volatile i16 %r, i16 addrspace(1)* undef
622 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000623}
624
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000625; GCN-LABEL: @sub_nsw_i16(
626; SI: %r = sub nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000627; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000628; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000629; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
630; VI-NEXT: %[[R_32:[0-9]+]] = sub nsw i32 %[[A_32]], %[[B_32]]
631; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000632; VI-NEXT: store volatile i16 %[[R_16]]
633define amdgpu_kernel void @sub_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000634 %r = sub nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000635 store volatile i16 %r, i16 addrspace(1)* undef
636 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000637}
638
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000639; GCN-LABEL: @sub_nuw_i16(
640; SI: %r = sub nuw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000641; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000642; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000643; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000644; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000645; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000646; VI-NEXT: store volatile i16 %[[R_16]]
647define amdgpu_kernel void @sub_nuw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000648 %r = sub nuw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000649 store volatile i16 %r, i16 addrspace(1)* undef
650 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000651}
652
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000653; GCN-LABEL: @sub_nuw_nsw_i16(
654; SI: %r = sub nuw nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000655; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000656; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000657; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
658; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw nsw i32 %[[A_32]], %[[B_32]]
659; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000660; VI-NEXT: store volatile i16 %[[R_16]]
661define amdgpu_kernel void @sub_nuw_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000662 %r = sub nuw nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000663 store volatile i16 %r, i16 addrspace(1)* undef
664 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000665}
666
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000667; GCN-LABEL: @mul_i16(
668; SI: %r = mul i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000669; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000670; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000671; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000672; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000673; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000674; VI-NEXT: store volatile i16 %[[R_16]]
675define amdgpu_kernel void @mul_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000676 %r = mul i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000677 store volatile i16 %r, i16 addrspace(1)* undef
678 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000679}
680
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000681; GCN-LABEL: @mul_nsw_i16(
682; SI: %r = mul nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000683; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000684; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000685; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000686; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000687; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000688; VI-NEXT: store volatile i16 %[[R_16]]
689define amdgpu_kernel void @mul_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000690 %r = mul nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000691 store volatile i16 %r, i16 addrspace(1)* undef
692 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000693}
694
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000695; GCN-LABEL: @mul_nuw_i16(
696; SI: %r = mul nuw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000697; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000698; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000699; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000700; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000701; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000702; VI-NEXT: store volatile i16 %[[R_16]]
703define amdgpu_kernel void @mul_nuw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000704 %r = mul nuw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000705 store volatile i16 %r, i16 addrspace(1)* undef
706 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000707}
708
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000709; GCN-LABEL: @mul_nuw_nsw_i16(
710; SI: %r = mul nuw nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000711; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000712; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000713; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
714; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw nsw i32 %[[A_32]], %[[B_32]]
715; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000716; VI-NEXT: store volatile i16 %[[R_16]]
717define amdgpu_kernel void @mul_nuw_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000718 %r = mul nuw nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000719 store volatile i16 %r, i16 addrspace(1)* undef
720 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000721}
722
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000723; GCN-LABEL: @shl_i16(
724; SI: %r = shl i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000725; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000726; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000727; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000728; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000729; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000730; VI-NEXT: store volatile i16 %[[R_16]]
731define amdgpu_kernel void @shl_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000732 %r = shl i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000733 store volatile i16 %r, i16 addrspace(1)* undef
734 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000735}
736
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000737; GCN-LABEL: @shl_nsw_i16(
738; SI: %r = shl nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000739; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000740; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000741; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000742; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000743; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000744; VI-NEXT: store volatile i16 %[[R_16]]
745define amdgpu_kernel void @shl_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000746 %r = shl nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000747 store volatile i16 %r, i16 addrspace(1)* undef
748 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000749}
750
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000751; GCN-LABEL: @shl_nuw_i16(
752; SI: %r = shl nuw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000753; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000754; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000755; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000756; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000757; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000758; VI-NEXT: store volatile i16 %[[R_16]]
759define amdgpu_kernel void @shl_nuw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000760 %r = shl nuw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000761 store volatile i16 %r, i16 addrspace(1)* undef
762 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000763}
764
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000765; GCN-LABEL: @shl_nuw_nsw_i16(
766; SI: %r = shl nuw nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000767; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000768; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000769; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
770; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
771; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000772; VI-NEXT: store volatile i16 %[[R_16]]
773define amdgpu_kernel void @shl_nuw_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000774 %r = shl nuw nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000775 store volatile i16 %r, i16 addrspace(1)* undef
776 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000777}
778
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000779; GCN-LABEL: @lshr_i16(
780; SI: %r = lshr i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000781; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000782; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000783; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
784; VI-NEXT: %[[R_32:[0-9]+]] = lshr i32 %[[A_32]], %[[B_32]]
785; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000786; VI-NEXT: store volatile i16 %[[R_16]]
787define amdgpu_kernel void @lshr_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000788 %r = lshr i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000789 store volatile i16 %r, i16 addrspace(1)* undef
790 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000791}
792
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000793; GCN-LABEL: @lshr_exact_i16(
794; SI: %r = lshr exact i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000795; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000796; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000797; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
798; VI-NEXT: %[[R_32:[0-9]+]] = lshr exact i32 %[[A_32]], %[[B_32]]
799; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000800; VI-NEXT: store volatile i16 %[[R_16]]
801define amdgpu_kernel void @lshr_exact_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000802 %r = lshr exact i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000803 store volatile i16 %r, i16 addrspace(1)* undef
804 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000805}
806
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000807; GCN-LABEL: @ashr_i16(
808; SI: %r = ashr i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000809; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyov691e2e02016-10-03 18:29:01 +0000810; VI: %[[A_32:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000811; VI-NEXT: %[[B_32:[0-9]+]] = sext i16 %b to i32
812; VI-NEXT: %[[R_32:[0-9]+]] = ashr i32 %[[A_32]], %[[B_32]]
813; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000814; VI-NEXT: store volatile i16 %[[R_16]]
815define amdgpu_kernel void @ashr_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000816 %r = ashr i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000817 store volatile i16 %r, i16 addrspace(1)* undef
818 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000819}
820
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000821; GCN-LABEL: @ashr_exact_i16(
822; SI: %r = ashr exact i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000823; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyov691e2e02016-10-03 18:29:01 +0000824; VI: %[[A_32:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000825; VI-NEXT: %[[B_32:[0-9]+]] = sext i16 %b to i32
826; VI-NEXT: %[[R_32:[0-9]+]] = ashr exact i32 %[[A_32]], %[[B_32]]
827; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000828; VI-NEXT: store volatile i16 %[[R_16]]
829define amdgpu_kernel void @ashr_exact_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000830 %r = ashr exact i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000831 store volatile i16 %r, i16 addrspace(1)* undef
832 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000833}
834
Matt Arsenault269ffda2016-12-06 23:18:06 +0000835; GCN-LABEL: @constant_lshr_exact_i16(
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000836; VI: store volatile i16 2
837define amdgpu_kernel void @constant_lshr_exact_i16(i16 %a, i16 %b) {
Matt Arsenault269ffda2016-12-06 23:18:06 +0000838 %r = lshr exact i16 4, 1
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000839 store volatile i16 %r, i16 addrspace(1)* undef
840 ret void
Matt Arsenault269ffda2016-12-06 23:18:06 +0000841}
842
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000843; GCN-LABEL: @and_i16(
844; SI: %r = and i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000845; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000846; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000847; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
848; VI-NEXT: %[[R_32:[0-9]+]] = and i32 %[[A_32]], %[[B_32]]
849; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000850; VI-NEXT: store volatile i16 %[[R_16]]
851define amdgpu_kernel void @and_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000852 %r = and i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000853 store volatile i16 %r, i16 addrspace(1)* undef
854 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000855}
856
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000857; GCN-LABEL: @or_i16(
858; SI: %r = or i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000859; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000860; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000861; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
862; VI-NEXT: %[[R_32:[0-9]+]] = or i32 %[[A_32]], %[[B_32]]
863; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000864; VI-NEXT: store volatile i16 %[[R_16]]
865define amdgpu_kernel void @or_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000866 %r = or i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000867 store volatile i16 %r, i16 addrspace(1)* undef
868 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000869}
870
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000871; GCN-LABEL: @xor_i16(
872; SI: %r = xor i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000873; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000874; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000875; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
876; VI-NEXT: %[[R_32:[0-9]+]] = xor i32 %[[A_32]], %[[B_32]]
877; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000878; VI-NEXT: store volatile i16 %[[R_16]]
879define amdgpu_kernel void @xor_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000880 %r = xor i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000881 store volatile i16 %r, i16 addrspace(1)* undef
882 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000883}
884
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000885; GCN-LABEL: @select_eq_i16(
886; SI: %cmp = icmp eq i16 %a, %b
887; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000888; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000889; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000890; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
891; VI-NEXT: %[[CMP:[0-9]+]] = icmp eq i32 %[[A_32_0]], %[[B_32_0]]
892; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
893; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
894; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
895; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000896; VI-NEXT: store volatile i16 %[[SEL_16]]
897define amdgpu_kernel void @select_eq_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000898 %cmp = icmp eq i16 %a, %b
899 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000900 store volatile i16 %sel, i16 addrspace(1)* undef
901 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000902}
903
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000904; GCN-LABEL: @select_ne_i16(
905; SI: %cmp = icmp ne i16 %a, %b
906; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000907; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000908; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000909; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
910; VI-NEXT: %[[CMP:[0-9]+]] = icmp ne i32 %[[A_32_0]], %[[B_32_0]]
911; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
912; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
913; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
914; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000915; VI-NEXT: store volatile i16 %[[SEL_16]]
916define amdgpu_kernel void @select_ne_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000917 %cmp = icmp ne i16 %a, %b
918 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000919 store volatile i16 %sel, i16 addrspace(1)* undef
920 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000921}
922
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000923; GCN-LABEL: @select_ugt_i16(
924; SI: %cmp = icmp ugt i16 %a, %b
925; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000926; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000927; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000928; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
929; VI-NEXT: %[[CMP:[0-9]+]] = icmp ugt i32 %[[A_32_0]], %[[B_32_0]]
930; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
931; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
932; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
933; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000934; VI-NEXT: store volatile i16 %[[SEL_16]]
935define amdgpu_kernel void @select_ugt_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000936 %cmp = icmp ugt i16 %a, %b
937 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000938 store volatile i16 %sel, i16 addrspace(1)* undef
939 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000940}
941
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000942; GCN-LABEL: @select_uge_i16(
943; SI: %cmp = icmp uge i16 %a, %b
944; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000945; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000946; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000947; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
948; VI-NEXT: %[[CMP:[0-9]+]] = icmp uge i32 %[[A_32_0]], %[[B_32_0]]
949; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
950; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
951; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
952; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000953; VI-NEXT: store volatile i16 %[[SEL_16]]
954define amdgpu_kernel void @select_uge_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000955 %cmp = icmp uge i16 %a, %b
956 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000957 store volatile i16 %sel, i16 addrspace(1)* undef
958 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000959}
960
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000961; GCN-LABEL: @select_ult_i16(
962; SI: %cmp = icmp ult i16 %a, %b
963; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000964; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000965; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000966; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
967; VI-NEXT: %[[CMP:[0-9]+]] = icmp ult i32 %[[A_32_0]], %[[B_32_0]]
968; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
969; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
970; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
971; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000972; VI-NEXT: store volatile i16 %[[SEL_16]]
973define amdgpu_kernel void @select_ult_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000974 %cmp = icmp ult i16 %a, %b
975 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000976 store volatile i16 %sel, i16 addrspace(1)* undef
977 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000978}
979
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000980; GCN-LABEL: @select_ule_i16(
981; SI: %cmp = icmp ule i16 %a, %b
982; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000983; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000984; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000985; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
986; VI-NEXT: %[[CMP:[0-9]+]] = icmp ule i32 %[[A_32_0]], %[[B_32_0]]
987; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
988; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
989; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
990; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000991; VI-NEXT: store volatile i16 %[[SEL_16]]
992define amdgpu_kernel void @select_ule_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000993 %cmp = icmp ule i16 %a, %b
994 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000995 store volatile i16 %sel, i16 addrspace(1)* undef
996 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000997}
998
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000999; GCN-LABEL: @select_sgt_i16(
1000; SI: %cmp = icmp sgt i16 %a, %b
1001; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001002; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001003; VI: %[[A_32_0:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001004; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i16 %b to i32
1005; VI-NEXT: %[[CMP:[0-9]+]] = icmp sgt i32 %[[A_32_0]], %[[B_32_0]]
1006; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i16 %a to i32
1007; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i16 %b to i32
1008; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
1009; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001010; VI-NEXT: store volatile i16 %[[SEL_16]]
1011define amdgpu_kernel void @select_sgt_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001012 %cmp = icmp sgt i16 %a, %b
1013 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001014 store volatile i16 %sel, i16 addrspace(1)* undef
1015 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001016}
1017
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001018; GCN-LABEL: @select_sge_i16(
1019; SI: %cmp = icmp sge i16 %a, %b
1020; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001021; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001022; VI: %[[A_32_0:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001023; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i16 %b to i32
1024; VI-NEXT: %[[CMP:[0-9]+]] = icmp sge i32 %[[A_32_0]], %[[B_32_0]]
1025; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i16 %a to i32
1026; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i16 %b to i32
1027; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
1028; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001029; VI-NEXT: store volatile i16 %[[SEL_16]]
1030define amdgpu_kernel void @select_sge_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001031 %cmp = icmp sge i16 %a, %b
1032 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001033 store volatile i16 %sel, i16 addrspace(1)* undef
1034 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001035}
1036
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001037; GCN-LABEL: @select_slt_i16(
1038; SI: %cmp = icmp slt i16 %a, %b
1039; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001040; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001041; VI: %[[A_32_0:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001042; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i16 %b to i32
1043; VI-NEXT: %[[CMP:[0-9]+]] = icmp slt i32 %[[A_32_0]], %[[B_32_0]]
1044; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i16 %a to i32
1045; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i16 %b to i32
1046; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
1047; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001048; VI-NEXT: store volatile i16 %[[SEL_16]]
1049define amdgpu_kernel void @select_slt_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001050 %cmp = icmp slt i16 %a, %b
1051 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001052 store volatile i16 %sel, i16 addrspace(1)* undef
1053 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001054}
1055
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001056; GCN-LABEL: @select_sle_i16(
1057; SI: %cmp = icmp sle i16 %a, %b
1058; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001059; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001060; VI: %[[A_32_0:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001061; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i16 %b to i32
1062; VI-NEXT: %[[CMP:[0-9]+]] = icmp sle i32 %[[A_32_0]], %[[B_32_0]]
1063; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i16 %a to i32
1064; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i16 %b to i32
1065; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
1066; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001067; VI-NEXT: store volatile i16 %[[SEL_16]]
1068define amdgpu_kernel void @select_sle_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001069 %cmp = icmp sle i16 %a, %b
1070 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001071 store volatile i16 %sel, i16 addrspace(1)* undef
1072 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001073}
1074
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001075declare i16 @llvm.bitreverse.i16(i16)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001076
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001077; GCN-LABEL: @bitreverse_i16(
1078; SI: %brev = call i16 @llvm.bitreverse.i16(i16 %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001079; SI-NEXT: store volatile i16 %brev
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001080; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
1081; VI-NEXT: %[[R_32:[0-9]+]] = call i32 @llvm.bitreverse.i32(i32 %[[A_32]])
1082; VI-NEXT: %[[S_32:[0-9]+]] = lshr i32 %[[R_32]], 16
1083; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[S_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001084; VI-NEXT: store volatile i16 %[[R_16]]
1085define amdgpu_kernel void @bitreverse_i16(i16 %a) {
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001086 %brev = call i16 @llvm.bitreverse.i16(i16 %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001087 store volatile i16 %brev, i16 addrspace(1)* undef
1088 ret void
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001089}
1090
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001091; GCN-LABEL: @add_3xi15(
1092; SI: %r = add <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001093; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001094; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1095; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001096; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001097; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001098; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1099define amdgpu_kernel void @add_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001100 %r = add <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001101 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1102 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001103}
1104
1105; GCN-LABEL: @add_nsw_3xi15(
1106; SI: %r = add nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001107; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001108; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1109; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001110; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001111; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001112; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1113define amdgpu_kernel void @add_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001114 %r = add nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001115 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1116 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001117}
1118
1119; GCN-LABEL: @add_nuw_3xi15(
1120; SI: %r = add nuw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001121; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001122; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1123; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001124; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001125; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001126; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1127define amdgpu_kernel void @add_nuw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001128 %r = add nuw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001129 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1130 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001131}
1132
1133; GCN-LABEL: @add_nuw_nsw_3xi15(
1134; SI: %r = add nuw nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001135; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001136; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1137; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1138; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
1139; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001140; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1141define amdgpu_kernel void @add_nuw_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001142 %r = add nuw nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001143 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1144 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001145}
1146
1147; GCN-LABEL: @sub_3xi15(
1148; SI: %r = sub <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001149; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001150; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1151; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001152; VI-NEXT: %[[R_32:[0-9]+]] = sub nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001153; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001154; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1155define amdgpu_kernel void @sub_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001156 %r = sub <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001157 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1158 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001159}
1160
1161; GCN-LABEL: @sub_nsw_3xi15(
1162; SI: %r = sub nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001163; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001164; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1165; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1166; VI-NEXT: %[[R_32:[0-9]+]] = sub nsw <3 x i32> %[[A_32]], %[[B_32]]
1167; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001168; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1169define amdgpu_kernel void @sub_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001170 %r = sub nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001171 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1172 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001173}
1174
1175; GCN-LABEL: @sub_nuw_3xi15(
1176; SI: %r = sub nuw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001177; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001178; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1179; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001180; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001181; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001182; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1183define amdgpu_kernel void @sub_nuw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001184 %r = sub nuw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001185 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1186 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001187}
1188
1189; GCN-LABEL: @sub_nuw_nsw_3xi15(
1190; SI: %r = sub nuw nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001191; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001192; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1193; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1194; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
1195; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001196; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1197define amdgpu_kernel void @sub_nuw_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001198 %r = sub nuw nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001199 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1200 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001201}
1202
1203; GCN-LABEL: @mul_3xi15(
1204; SI: %r = mul <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001205; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001206; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1207; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001208; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001209; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001210; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1211define amdgpu_kernel void @mul_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001212 %r = mul <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001213 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1214 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001215}
1216
1217; GCN-LABEL: @mul_nsw_3xi15(
1218; SI: %r = mul nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001219; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001220; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1221; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001222; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001223; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001224; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1225define amdgpu_kernel void @mul_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001226 %r = mul nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001227 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1228 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001229}
1230
1231; GCN-LABEL: @mul_nuw_3xi15(
1232; SI: %r = mul nuw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001233; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001234; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1235; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001236; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001237; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001238; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1239define amdgpu_kernel void @mul_nuw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001240 %r = mul nuw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001241 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1242 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001243}
1244
1245; GCN-LABEL: @mul_nuw_nsw_3xi15(
1246; SI: %r = mul nuw nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001247; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001248; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1249; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1250; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
1251; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001252; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1253define amdgpu_kernel void @mul_nuw_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001254 %r = mul nuw nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001255 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1256 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001257}
1258
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001259; GCN-LABEL: @shl_3xi15(
1260; SI: %r = shl <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001261; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001262; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1263; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001264; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001265; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001266; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1267define amdgpu_kernel void @shl_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001268 %r = shl <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001269 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1270 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001271}
1272
1273; GCN-LABEL: @shl_nsw_3xi15(
1274; SI: %r = shl nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001275; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001276; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1277; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001278; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001279; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001280; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1281define amdgpu_kernel void @shl_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001282 %r = shl nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001283 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1284 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001285}
1286
1287; GCN-LABEL: @shl_nuw_3xi15(
1288; SI: %r = shl nuw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001289; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001290; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1291; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001292; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001293; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001294; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1295define amdgpu_kernel void @shl_nuw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001296 %r = shl nuw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001297 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1298 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001299}
1300
1301; GCN-LABEL: @shl_nuw_nsw_3xi15(
1302; SI: %r = shl nuw nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001303; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001304; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1305; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1306; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
1307; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001308; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1309define amdgpu_kernel void @shl_nuw_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001310 %r = shl nuw nsw <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001311 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1312 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001313}
1314
1315; GCN-LABEL: @lshr_3xi15(
1316; SI: %r = lshr <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001317; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001318; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1319; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1320; VI-NEXT: %[[R_32:[0-9]+]] = lshr <3 x i32> %[[A_32]], %[[B_32]]
1321; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001322; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1323define amdgpu_kernel void @lshr_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001324 %r = lshr <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001325 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1326 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001327}
1328
1329; GCN-LABEL: @lshr_exact_3xi15(
1330; SI: %r = lshr exact <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001331; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001332; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1333; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1334; VI-NEXT: %[[R_32:[0-9]+]] = lshr exact <3 x i32> %[[A_32]], %[[B_32]]
1335; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001336; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1337define amdgpu_kernel void @lshr_exact_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001338 %r = lshr exact <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001339 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1340 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001341}
1342
1343; GCN-LABEL: @ashr_3xi15(
1344; SI: %r = ashr <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001345; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001346; VI: %[[A_32:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1347; VI-NEXT: %[[B_32:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1348; VI-NEXT: %[[R_32:[0-9]+]] = ashr <3 x i32> %[[A_32]], %[[B_32]]
1349; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001350; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1351define amdgpu_kernel void @ashr_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001352 %r = ashr <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001353 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1354 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001355}
1356
1357; GCN-LABEL: @ashr_exact_3xi15(
1358; SI: %r = ashr exact <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001359; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001360; VI: %[[A_32:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1361; VI-NEXT: %[[B_32:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1362; VI-NEXT: %[[R_32:[0-9]+]] = ashr exact <3 x i32> %[[A_32]], %[[B_32]]
1363; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001364; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1365define amdgpu_kernel void @ashr_exact_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001366 %r = ashr exact <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001367 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1368 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001369}
1370
1371; GCN-LABEL: @and_3xi15(
1372; SI: %r = and <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001373; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001374; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1375; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1376; VI-NEXT: %[[R_32:[0-9]+]] = and <3 x i32> %[[A_32]], %[[B_32]]
1377; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001378; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1379define amdgpu_kernel void @and_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001380 %r = and <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001381 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1382 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001383}
1384
1385; GCN-LABEL: @or_3xi15(
1386; SI: %r = or <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001387; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001388; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1389; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1390; VI-NEXT: %[[R_32:[0-9]+]] = or <3 x i32> %[[A_32]], %[[B_32]]
1391; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001392; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1393define amdgpu_kernel void @or_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001394 %r = or <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001395 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1396 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001397}
1398
1399; GCN-LABEL: @xor_3xi15(
1400; SI: %r = xor <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001401; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001402; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1403; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1404; VI-NEXT: %[[R_32:[0-9]+]] = xor <3 x i32> %[[A_32]], %[[B_32]]
1405; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001406; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1407define amdgpu_kernel void @xor_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001408 %r = xor <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001409 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1410 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001411}
1412
1413; GCN-LABEL: @select_eq_3xi15(
1414; SI: %cmp = icmp eq <3 x i15> %a, %b
1415; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001416; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001417; VI: %[[A_32_0:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1418; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1419; VI-NEXT: %[[CMP:[0-9]+]] = icmp eq <3 x i32> %[[A_32_0]], %[[B_32_0]]
1420; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1421; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1422; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1423; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001424; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1425define amdgpu_kernel void @select_eq_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001426 %cmp = icmp eq <3 x i15> %a, %b
1427 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001428 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1429 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001430}
1431
1432; GCN-LABEL: @select_ne_3xi15(
1433; SI: %cmp = icmp ne <3 x i15> %a, %b
1434; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001435; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001436; VI: %[[A_32_0:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1437; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1438; VI-NEXT: %[[CMP:[0-9]+]] = icmp ne <3 x i32> %[[A_32_0]], %[[B_32_0]]
1439; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1440; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1441; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1442; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001443; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1444define amdgpu_kernel void @select_ne_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001445 %cmp = icmp ne <3 x i15> %a, %b
1446 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001447 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1448 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001449}
1450
1451; GCN-LABEL: @select_ugt_3xi15(
1452; SI: %cmp = icmp ugt <3 x i15> %a, %b
1453; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001454; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001455; VI: %[[A_32_0:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1456; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1457; VI-NEXT: %[[CMP:[0-9]+]] = icmp ugt <3 x i32> %[[A_32_0]], %[[B_32_0]]
1458; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1459; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1460; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1461; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001462; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1463define amdgpu_kernel void @select_ugt_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001464 %cmp = icmp ugt <3 x i15> %a, %b
1465 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001466 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1467 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001468}
1469
1470; GCN-LABEL: @select_uge_3xi15(
1471; SI: %cmp = icmp uge <3 x i15> %a, %b
1472; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001473; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001474; VI: %[[A_32_0:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1475; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1476; VI-NEXT: %[[CMP:[0-9]+]] = icmp uge <3 x i32> %[[A_32_0]], %[[B_32_0]]
1477; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1478; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1479; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1480; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001481; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1482define amdgpu_kernel void @select_uge_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001483 %cmp = icmp uge <3 x i15> %a, %b
1484 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001485 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1486 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001487}
1488
1489; GCN-LABEL: @select_ult_3xi15(
1490; SI: %cmp = icmp ult <3 x i15> %a, %b
1491; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001492; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001493; VI: %[[A_32_0:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1494; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1495; VI-NEXT: %[[CMP:[0-9]+]] = icmp ult <3 x i32> %[[A_32_0]], %[[B_32_0]]
1496; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1497; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1498; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1499; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001500; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1501define amdgpu_kernel void @select_ult_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001502 %cmp = icmp ult <3 x i15> %a, %b
1503 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001504 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1505 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001506}
1507
1508; GCN-LABEL: @select_ule_3xi15(
1509; SI: %cmp = icmp ule <3 x i15> %a, %b
1510; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001511; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001512; VI: %[[A_32_0:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1513; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1514; VI-NEXT: %[[CMP:[0-9]+]] = icmp ule <3 x i32> %[[A_32_0]], %[[B_32_0]]
1515; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1516; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1517; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1518; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001519; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1520define amdgpu_kernel void @select_ule_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001521 %cmp = icmp ule <3 x i15> %a, %b
1522 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001523 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1524 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001525}
1526
1527; GCN-LABEL: @select_sgt_3xi15(
1528; SI: %cmp = icmp sgt <3 x i15> %a, %b
1529; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001530; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001531; VI: %[[A_32_0:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1532; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1533; VI-NEXT: %[[CMP:[0-9]+]] = icmp sgt <3 x i32> %[[A_32_0]], %[[B_32_0]]
1534; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1535; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1536; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1537; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001538; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1539define amdgpu_kernel void @select_sgt_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001540 %cmp = icmp sgt <3 x i15> %a, %b
1541 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001542 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1543 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001544}
1545
1546; GCN-LABEL: @select_sge_3xi15(
1547; SI: %cmp = icmp sge <3 x i15> %a, %b
1548; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001549; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001550; VI: %[[A_32_0:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1551; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1552; VI-NEXT: %[[CMP:[0-9]+]] = icmp sge <3 x i32> %[[A_32_0]], %[[B_32_0]]
1553; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1554; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1555; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1556; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001557; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1558define amdgpu_kernel void @select_sge_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001559 %cmp = icmp sge <3 x i15> %a, %b
1560 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001561 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1562 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001563}
1564
1565; GCN-LABEL: @select_slt_3xi15(
1566; SI: %cmp = icmp slt <3 x i15> %a, %b
1567; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001568; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001569; VI: %[[A_32_0:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1570; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1571; VI-NEXT: %[[CMP:[0-9]+]] = icmp slt <3 x i32> %[[A_32_0]], %[[B_32_0]]
1572; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1573; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1574; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1575; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001576; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1577define amdgpu_kernel void @select_slt_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001578 %cmp = icmp slt <3 x i15> %a, %b
1579 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001580 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1581 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001582}
1583
1584; GCN-LABEL: @select_sle_3xi15(
1585; SI: %cmp = icmp sle <3 x i15> %a, %b
1586; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001587; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001588; VI: %[[A_32_0:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1589; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1590; VI-NEXT: %[[CMP:[0-9]+]] = icmp sle <3 x i32> %[[A_32_0]], %[[B_32_0]]
1591; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1592; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1593; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1594; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001595; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1596define amdgpu_kernel void @select_sle_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001597 %cmp = icmp sle <3 x i15> %a, %b
1598 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001599 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1600 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001601}
1602
1603declare <3 x i15> @llvm.bitreverse.v3i15(<3 x i15>)
1604; GCN-LABEL: @bitreverse_3xi15(
1605; SI: %brev = call <3 x i15> @llvm.bitreverse.v3i15(<3 x i15> %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001606; SI-NEXT: store volatile <3 x i15> %brev
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001607; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1608; VI-NEXT: %[[R_32:[0-9]+]] = call <3 x i32> @llvm.bitreverse.v3i32(<3 x i32> %[[A_32]])
1609; VI-NEXT: %[[S_32:[0-9]+]] = lshr <3 x i32> %[[R_32]], <i32 17, i32 17, i32 17>
1610; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[S_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001611; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1612define amdgpu_kernel void @bitreverse_3xi15(<3 x i15> %a) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001613 %brev = call <3 x i15> @llvm.bitreverse.v3i15(<3 x i15> %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001614 store volatile <3 x i15> %brev, <3 x i15> addrspace(1)* undef
1615 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001616}
1617
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001618; GCN-LABEL: @add_3xi16(
1619; SI: %r = add <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001620; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001621; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001622; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001623; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001624; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001625; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1626define amdgpu_kernel void @add_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001627 %r = add <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001628 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1629 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001630}
1631
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001632; GCN-LABEL: @add_nsw_3xi16(
1633; SI: %r = add nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001634; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001635; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001636; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001637; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001638; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001639; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1640define amdgpu_kernel void @add_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001641 %r = add nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001642 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1643 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001644}
1645
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001646; GCN-LABEL: @add_nuw_3xi16(
1647; SI: %r = add nuw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001648; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001649; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001650; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001651; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001652; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001653; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1654define amdgpu_kernel void @add_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001655 %r = add nuw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001656 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1657 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001658}
1659
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001660; GCN-LABEL: @add_nuw_nsw_3xi16(
1661; SI: %r = add nuw nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001662; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001663; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001664; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1665; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
1666; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001667; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1668define amdgpu_kernel void @add_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001669 %r = add nuw nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001670 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1671 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001672}
1673
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001674; GCN-LABEL: @sub_3xi16(
1675; SI: %r = sub <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001676; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001677; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001678; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001679; VI-NEXT: %[[R_32:[0-9]+]] = sub nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001680; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001681; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1682define amdgpu_kernel void @sub_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001683 %r = sub <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001684 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1685 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001686}
1687
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001688; GCN-LABEL: @sub_nsw_3xi16(
1689; SI: %r = sub nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001690; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001691; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001692; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1693; VI-NEXT: %[[R_32:[0-9]+]] = sub nsw <3 x i32> %[[A_32]], %[[B_32]]
1694; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001695; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1696define amdgpu_kernel void @sub_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001697 %r = sub nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001698 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1699 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001700}
1701
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001702; GCN-LABEL: @sub_nuw_3xi16(
1703; SI: %r = sub nuw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001704; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001705; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001706; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001707; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001708; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001709; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1710define amdgpu_kernel void @sub_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001711 %r = sub nuw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001712 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1713 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001714}
1715
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001716; GCN-LABEL: @sub_nuw_nsw_3xi16(
1717; SI: %r = sub nuw nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001718; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001719; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001720; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1721; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
1722; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001723; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1724define amdgpu_kernel void @sub_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001725 %r = sub nuw nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001726 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1727 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001728}
1729
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001730; GCN-LABEL: @mul_3xi16(
1731; SI: %r = mul <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001732; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001733; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001734; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001735; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001736; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001737; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1738define amdgpu_kernel void @mul_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001739 %r = mul <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001740 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1741 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001742}
1743
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001744; GCN-LABEL: @mul_nsw_3xi16(
1745; SI: %r = mul nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001746; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001747; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001748; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001749; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001750; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001751; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1752define amdgpu_kernel void @mul_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001753 %r = mul nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001754 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1755 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001756}
1757
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001758; GCN-LABEL: @mul_nuw_3xi16(
1759; SI: %r = mul nuw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001760; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001761; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001762; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001763; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001764; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001765; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1766define amdgpu_kernel void @mul_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001767 %r = mul nuw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001768 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1769 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001770}
1771
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001772; GCN-LABEL: @mul_nuw_nsw_3xi16(
1773; SI: %r = mul nuw nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001774; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001775; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001776; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1777; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
1778; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001779; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1780define amdgpu_kernel void @mul_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001781 %r = mul nuw nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001782 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1783 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001784}
1785
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001786; GCN-LABEL: @shl_3xi16(
1787; SI: %r = shl <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001788; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001789; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001790; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001791; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001792; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001793; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1794define amdgpu_kernel void @shl_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001795 %r = shl <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001796 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1797 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001798}
1799
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001800; GCN-LABEL: @shl_nsw_3xi16(
1801; SI: %r = shl nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001802; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001803; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001804; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001805; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001806; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001807; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1808define amdgpu_kernel void @shl_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001809 %r = shl nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001810 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1811 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001812}
1813
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001814; GCN-LABEL: @shl_nuw_3xi16(
1815; SI: %r = shl nuw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001816; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001817; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001818; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001819; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001820; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001821; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1822define amdgpu_kernel void @shl_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001823 %r = shl nuw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001824 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1825 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001826}
1827
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001828; GCN-LABEL: @shl_nuw_nsw_3xi16(
1829; SI: %r = shl nuw nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001830; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001831; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001832; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1833; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
1834; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001835; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1836define amdgpu_kernel void @shl_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001837 %r = shl nuw nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001838 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1839 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001840}
1841
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001842; GCN-LABEL: @lshr_3xi16(
1843; SI: %r = lshr <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001844; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001845; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001846; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1847; VI-NEXT: %[[R_32:[0-9]+]] = lshr <3 x i32> %[[A_32]], %[[B_32]]
1848; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001849; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1850define amdgpu_kernel void @lshr_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001851 %r = lshr <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001852 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1853 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001854}
1855
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001856; GCN-LABEL: @lshr_exact_3xi16(
1857; SI: %r = lshr exact <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001858; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001859; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001860; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1861; VI-NEXT: %[[R_32:[0-9]+]] = lshr exact <3 x i32> %[[A_32]], %[[B_32]]
1862; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001863; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1864define amdgpu_kernel void @lshr_exact_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001865 %r = lshr exact <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001866 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1867 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001868}
1869
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001870; GCN-LABEL: @ashr_3xi16(
1871; SI: %r = ashr <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001872; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyov691e2e02016-10-03 18:29:01 +00001873; VI: %[[A_32:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001874; VI-NEXT: %[[B_32:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
1875; VI-NEXT: %[[R_32:[0-9]+]] = ashr <3 x i32> %[[A_32]], %[[B_32]]
1876; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001877; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1878define amdgpu_kernel void @ashr_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001879 %r = ashr <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001880 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1881 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001882}
1883
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001884; GCN-LABEL: @ashr_exact_3xi16(
1885; SI: %r = ashr exact <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001886; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyov691e2e02016-10-03 18:29:01 +00001887; VI: %[[A_32:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001888; VI-NEXT: %[[B_32:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
1889; VI-NEXT: %[[R_32:[0-9]+]] = ashr exact <3 x i32> %[[A_32]], %[[B_32]]
1890; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001891; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1892define amdgpu_kernel void @ashr_exact_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001893 %r = ashr exact <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001894 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1895 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001896}
1897
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001898; GCN-LABEL: @and_3xi16(
1899; SI: %r = and <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001900; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001901; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001902; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1903; VI-NEXT: %[[R_32:[0-9]+]] = and <3 x i32> %[[A_32]], %[[B_32]]
1904; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001905; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1906define amdgpu_kernel void @and_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001907 %r = and <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001908 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1909 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001910}
1911
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001912; GCN-LABEL: @or_3xi16(
1913; SI: %r = or <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001914; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001915; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001916; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1917; VI-NEXT: %[[R_32:[0-9]+]] = or <3 x i32> %[[A_32]], %[[B_32]]
1918; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001919; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1920define amdgpu_kernel void @or_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001921 %r = or <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001922 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1923 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001924}
1925
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001926; GCN-LABEL: @xor_3xi16(
1927; SI: %r = xor <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001928; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001929; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001930; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1931; VI-NEXT: %[[R_32:[0-9]+]] = xor <3 x i32> %[[A_32]], %[[B_32]]
1932; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001933; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1934define amdgpu_kernel void @xor_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001935 %r = xor <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001936 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1937 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001938}
1939
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001940; GCN-LABEL: @select_eq_3xi16(
1941; SI: %cmp = icmp eq <3 x i16> %a, %b
1942; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001943; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001944; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001945; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1946; VI-NEXT: %[[CMP:[0-9]+]] = icmp eq <3 x i32> %[[A_32_0]], %[[B_32_0]]
1947; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
1948; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1949; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1950; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001951; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
1952define amdgpu_kernel void @select_eq_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001953 %cmp = icmp eq <3 x i16> %a, %b
1954 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001955 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
1956 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001957}
1958
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001959; GCN-LABEL: @select_ne_3xi16(
1960; SI: %cmp = icmp ne <3 x i16> %a, %b
1961; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001962; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001963; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001964; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1965; VI-NEXT: %[[CMP:[0-9]+]] = icmp ne <3 x i32> %[[A_32_0]], %[[B_32_0]]
1966; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
1967; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1968; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1969; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001970; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
1971define amdgpu_kernel void @select_ne_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001972 %cmp = icmp ne <3 x i16> %a, %b
1973 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001974 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
1975 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001976}
1977
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001978; GCN-LABEL: @select_ugt_3xi16(
1979; SI: %cmp = icmp ugt <3 x i16> %a, %b
1980; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001981; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001982; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001983; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1984; VI-NEXT: %[[CMP:[0-9]+]] = icmp ugt <3 x i32> %[[A_32_0]], %[[B_32_0]]
1985; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
1986; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1987; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1988; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001989; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
1990define amdgpu_kernel void @select_ugt_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001991 %cmp = icmp ugt <3 x i16> %a, %b
1992 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001993 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
1994 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001995}
1996
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001997; GCN-LABEL: @select_uge_3xi16(
1998; SI: %cmp = icmp uge <3 x i16> %a, %b
1999; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002000; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002001; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002002; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2003; VI-NEXT: %[[CMP:[0-9]+]] = icmp uge <3 x i32> %[[A_32_0]], %[[B_32_0]]
2004; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
2005; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2006; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2007; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002008; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2009define amdgpu_kernel void @select_uge_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002010 %cmp = icmp uge <3 x i16> %a, %b
2011 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002012 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2013 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002014}
2015
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002016; GCN-LABEL: @select_ult_3xi16(
2017; SI: %cmp = icmp ult <3 x i16> %a, %b
2018; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002019; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002020; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002021; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2022; VI-NEXT: %[[CMP:[0-9]+]] = icmp ult <3 x i32> %[[A_32_0]], %[[B_32_0]]
2023; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
2024; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2025; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2026; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002027; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2028define amdgpu_kernel void @select_ult_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002029 %cmp = icmp ult <3 x i16> %a, %b
2030 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002031 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2032 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002033}
2034
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002035; GCN-LABEL: @select_ule_3xi16(
2036; SI: %cmp = icmp ule <3 x i16> %a, %b
2037; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002038; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002039; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002040; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2041; VI-NEXT: %[[CMP:[0-9]+]] = icmp ule <3 x i32> %[[A_32_0]], %[[B_32_0]]
2042; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
2043; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2044; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2045; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002046; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2047define amdgpu_kernel void @select_ule_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002048 %cmp = icmp ule <3 x i16> %a, %b
2049 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002050 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2051 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002052}
2053
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002054; GCN-LABEL: @select_sgt_3xi16(
2055; SI: %cmp = icmp sgt <3 x i16> %a, %b
2056; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002057; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002058; VI: %[[A_32_0:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002059; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2060; VI-NEXT: %[[CMP:[0-9]+]] = icmp sgt <3 x i32> %[[A_32_0]], %[[B_32_0]]
2061; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
2062; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2063; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2064; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002065; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2066define amdgpu_kernel void @select_sgt_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002067 %cmp = icmp sgt <3 x i16> %a, %b
2068 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002069 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2070 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002071}
2072
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002073; GCN-LABEL: @select_sge_3xi16(
2074; SI: %cmp = icmp sge <3 x i16> %a, %b
2075; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002076; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002077; VI: %[[A_32_0:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002078; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2079; VI-NEXT: %[[CMP:[0-9]+]] = icmp sge <3 x i32> %[[A_32_0]], %[[B_32_0]]
2080; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
2081; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2082; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2083; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002084; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2085define amdgpu_kernel void @select_sge_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002086 %cmp = icmp sge <3 x i16> %a, %b
2087 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002088 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2089 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002090}
2091
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002092; GCN-LABEL: @select_slt_3xi16(
2093; SI: %cmp = icmp slt <3 x i16> %a, %b
2094; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002095; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002096; VI: %[[A_32_0:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002097; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2098; VI-NEXT: %[[CMP:[0-9]+]] = icmp slt <3 x i32> %[[A_32_0]], %[[B_32_0]]
2099; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
2100; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2101; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2102; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002103; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2104define amdgpu_kernel void @select_slt_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002105 %cmp = icmp slt <3 x i16> %a, %b
2106 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002107 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2108 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002109}
2110
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002111; GCN-LABEL: @select_sle_3xi16(
2112; SI: %cmp = icmp sle <3 x i16> %a, %b
2113; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002114; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002115; VI: %[[A_32_0:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002116; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2117; VI-NEXT: %[[CMP:[0-9]+]] = icmp sle <3 x i32> %[[A_32_0]], %[[B_32_0]]
2118; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
2119; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2120; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2121; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002122; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2123define amdgpu_kernel void @select_sle_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002124 %cmp = icmp sle <3 x i16> %a, %b
2125 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002126 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2127 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002128}
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002129
2130declare <3 x i16> @llvm.bitreverse.v3i16(<3 x i16>)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002131
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002132; GCN-LABEL: @bitreverse_3xi16(
2133; SI: %brev = call <3 x i16> @llvm.bitreverse.v3i16(<3 x i16> %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002134; SI-NEXT: store volatile <3 x i16> %brev
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002135; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
2136; VI-NEXT: %[[R_32:[0-9]+]] = call <3 x i32> @llvm.bitreverse.v3i32(<3 x i32> %[[A_32]])
2137; VI-NEXT: %[[S_32:[0-9]+]] = lshr <3 x i32> %[[R_32]], <i32 16, i32 16, i32 16>
2138; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[S_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002139; VI-NEXT: store volatile <3 x i16> %[[R_16]]
2140define amdgpu_kernel void @bitreverse_3xi16(<3 x i16> %a) {
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002141 %brev = call <3 x i16> @llvm.bitreverse.v3i16(<3 x i16> %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002142 store volatile <3 x i16> %brev, <3 x i16> addrspace(1)* undef
2143 ret void
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002144}