blob: 8e5a512dd3c9178f9ac25ea3fd14f010ecd83650 [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
172; GCN-LABEL: @urem_i3(
173; SI: %r = urem 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
177; VI-NEXT: %[[R_32:[0-9]+]] = urem i32 %[[A_32]], %[[B_32]]
178; 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 @urem_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000181 %r = urem 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: @srem_i3(
187; SI: %r = srem 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]+]] = sext i3 %a to i32
190; VI-NEXT: %[[B_32:[0-9]+]] = sext i3 %b to i32
191; VI-NEXT: %[[R_32:[0-9]+]] = srem i32 %[[A_32]], %[[B_32]]
192; 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 @srem_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000195 %r = srem 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_i3(
201; SI: %r = shl 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_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000209 %r = shl 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_nsw_i3(
215; SI: %r = shl 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
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000219; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000220; 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_nsw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000223 %r = shl 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: @shl_nuw_i3(
229; SI: %r = shl nuw 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
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000233; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000234; 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 @shl_nuw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000237 %r = shl nuw 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: @shl_nuw_nsw_i3(
243; SI: %r = shl nuw nsw 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]+]] = shl nuw nsw 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 @shl_nuw_nsw_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000251 %r = shl nuw nsw 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: @lshr_i3(
257; SI: %r = lshr 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]+]] = zext i3 %a to i32
260; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
261; VI-NEXT: %[[R_32:[0-9]+]] = lshr 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 @lshr_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000265 %r = lshr 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: @lshr_exact_i3(
271; SI: %r = lshr 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]+]] = zext i3 %a to i32
274; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
275; VI-NEXT: %[[R_32:[0-9]+]] = lshr 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 @lshr_exact_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000279 %r = lshr 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: @ashr_i3(
285; SI: %r = ashr 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]+]] = sext i3 %a to i32
288; VI-NEXT: %[[B_32:[0-9]+]] = sext i3 %b to i32
289; VI-NEXT: %[[R_32:[0-9]+]] = ashr 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 @ashr_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000293 %r = ashr 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: @ashr_exact_i3(
299; SI: %r = ashr exact 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]+]] = sext i3 %a to i32
302; VI-NEXT: %[[B_32:[0-9]+]] = sext i3 %b to i32
303; VI-NEXT: %[[R_32:[0-9]+]] = ashr exact 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 @ashr_exact_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000307 %r = ashr exact 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: @and_i3(
313; SI: %r = and 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]+]] = and 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 @and_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000321 %r = and 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: @or_i3(
327; SI: %r = or i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000328; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000329; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
330; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
331; VI-NEXT: %[[R_32:[0-9]+]] = or i32 %[[A_32]], %[[B_32]]
332; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000333; VI-NEXT: store volatile i3 %[[R_3]]
334define amdgpu_kernel void @or_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000335 %r = or i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000336 store volatile i3 %r, i3 addrspace(1)* undef
337 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000338}
339
340; GCN-LABEL: @xor_i3(
341; SI: %r = xor i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000342; SI-NEXT: store volatile i3 %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000343; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
344; VI-NEXT: %[[B_32:[0-9]+]] = zext i3 %b to i32
345; VI-NEXT: %[[R_32:[0-9]+]] = xor i32 %[[A_32]], %[[B_32]]
346; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[R_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000347; VI-NEXT: store volatile i3 %[[R_3]]
348define amdgpu_kernel void @xor_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000349 %r = xor i3 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000350 store volatile i3 %r, i3 addrspace(1)* undef
351 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000352}
353
354; GCN-LABEL: @select_eq_i3(
355; SI: %cmp = icmp eq i3 %a, %b
356; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000357; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000358; VI: %[[A_32_0:[0-9]+]] = zext i3 %a to i32
359; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i3 %b to i32
360; VI-NEXT: %[[CMP:[0-9]+]] = icmp eq i32 %[[A_32_0]], %[[B_32_0]]
361; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i3 %a to i32
362; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i3 %b to i32
363; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
364; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000365; VI-NEXT: store volatile i3 %[[SEL_3]]
366define amdgpu_kernel void @select_eq_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000367 %cmp = icmp eq i3 %a, %b
368 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000369 store volatile i3 %sel, i3 addrspace(1)* undef
370 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000371}
372
373; GCN-LABEL: @select_ne_i3(
374; SI: %cmp = icmp ne i3 %a, %b
375; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000376; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000377; VI: %[[A_32_0:[0-9]+]] = zext i3 %a to i32
378; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i3 %b to i32
379; VI-NEXT: %[[CMP:[0-9]+]] = icmp ne i32 %[[A_32_0]], %[[B_32_0]]
380; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i3 %a to i32
381; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i3 %b to i32
382; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
383; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000384; VI-NEXT: store volatile i3 %[[SEL_3]]
385define amdgpu_kernel void @select_ne_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000386 %cmp = icmp ne i3 %a, %b
387 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000388 store volatile i3 %sel, i3 addrspace(1)* undef
389 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000390}
391
392; GCN-LABEL: @select_ugt_i3(
393; SI: %cmp = icmp ugt i3 %a, %b
394; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000395; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000396; VI: %[[A_32_0:[0-9]+]] = zext i3 %a to i32
397; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i3 %b to i32
398; VI-NEXT: %[[CMP:[0-9]+]] = icmp ugt i32 %[[A_32_0]], %[[B_32_0]]
399; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i3 %a to i32
400; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i3 %b to i32
401; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
402; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000403; VI-NEXT: store volatile i3 %[[SEL_3]]
404define amdgpu_kernel void @select_ugt_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000405 %cmp = icmp ugt i3 %a, %b
406 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000407 store volatile i3 %sel, i3 addrspace(1)* undef
408 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000409}
410
411; GCN-LABEL: @select_uge_i3(
412; SI: %cmp = icmp uge i3 %a, %b
413; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000414; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000415; VI: %[[A_32_0:[0-9]+]] = zext i3 %a to i32
416; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i3 %b to i32
417; VI-NEXT: %[[CMP:[0-9]+]] = icmp uge i32 %[[A_32_0]], %[[B_32_0]]
418; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i3 %a to i32
419; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i3 %b to i32
420; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
421; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000422; VI-NEXT: store volatile i3 %[[SEL_3]]
423define amdgpu_kernel void @select_uge_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000424 %cmp = icmp uge i3 %a, %b
425 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000426 store volatile i3 %sel, i3 addrspace(1)* undef
427 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000428}
429
430; GCN-LABEL: @select_ult_i3(
431; SI: %cmp = icmp ult i3 %a, %b
432; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000433; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000434; VI: %[[A_32_0:[0-9]+]] = zext i3 %a to i32
435; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i3 %b to i32
436; VI-NEXT: %[[CMP:[0-9]+]] = icmp ult i32 %[[A_32_0]], %[[B_32_0]]
437; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i3 %a to i32
438; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i3 %b to i32
439; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
440; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000441; VI-NEXT: store volatile i3 %[[SEL_3]]
442define amdgpu_kernel void @select_ult_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000443 %cmp = icmp ult i3 %a, %b
444 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000445 store volatile i3 %sel, i3 addrspace(1)* undef
446 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000447}
448
449; GCN-LABEL: @select_ule_i3(
450; SI: %cmp = icmp ule i3 %a, %b
451; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000452; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000453; VI: %[[A_32_0:[0-9]+]] = zext i3 %a to i32
454; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i3 %b to i32
455; VI-NEXT: %[[CMP:[0-9]+]] = icmp ule i32 %[[A_32_0]], %[[B_32_0]]
456; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i3 %a to i32
457; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i3 %b to i32
458; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
459; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000460; VI-NEXT: store volatile i3 %[[SEL_3]]
461define amdgpu_kernel void @select_ule_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000462 %cmp = icmp ule i3 %a, %b
463 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000464 store volatile i3 %sel, i3 addrspace(1)* undef
465 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000466}
467
468; GCN-LABEL: @select_sgt_i3(
469; SI: %cmp = icmp sgt i3 %a, %b
470; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000471; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000472; VI: %[[A_32_0:[0-9]+]] = sext i3 %a to i32
473; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i3 %b to i32
474; VI-NEXT: %[[CMP:[0-9]+]] = icmp sgt i32 %[[A_32_0]], %[[B_32_0]]
475; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i3 %a to i32
476; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i3 %b to i32
477; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
478; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000479; VI-NEXT: store volatile i3 %[[SEL_3]]
480define amdgpu_kernel void @select_sgt_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000481 %cmp = icmp sgt i3 %a, %b
482 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000483 store volatile i3 %sel, i3 addrspace(1)* undef
484 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000485}
486
487; GCN-LABEL: @select_sge_i3(
488; SI: %cmp = icmp sge i3 %a, %b
489; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000490; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000491; VI: %[[A_32_0:[0-9]+]] = sext i3 %a to i32
492; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i3 %b to i32
493; VI-NEXT: %[[CMP:[0-9]+]] = icmp sge i32 %[[A_32_0]], %[[B_32_0]]
494; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i3 %a to i32
495; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i3 %b to i32
496; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
497; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000498; VI-NEXT: store volatile i3 %[[SEL_3]]
499define amdgpu_kernel void @select_sge_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000500 %cmp = icmp sge i3 %a, %b
501 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000502 store volatile i3 %sel, i3 addrspace(1)* undef
503 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000504}
505
506; GCN-LABEL: @select_slt_i3(
507; SI: %cmp = icmp slt i3 %a, %b
508; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000509; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000510; VI: %[[A_32_0:[0-9]+]] = sext i3 %a to i32
511; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i3 %b to i32
512; VI-NEXT: %[[CMP:[0-9]+]] = icmp slt i32 %[[A_32_0]], %[[B_32_0]]
513; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i3 %a to i32
514; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i3 %b to i32
515; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
516; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000517; VI-NEXT: store volatile i3 %[[SEL_3]]
518define amdgpu_kernel void @select_slt_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000519 %cmp = icmp slt i3 %a, %b
520 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000521 store volatile i3 %sel, i3 addrspace(1)* undef
522 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000523}
524
525; GCN-LABEL: @select_sle_i3(
526; SI: %cmp = icmp sle i3 %a, %b
527; SI-NEXT: %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000528; SI-NEXT: store volatile i3 %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000529; VI: %[[A_32_0:[0-9]+]] = sext i3 %a to i32
530; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i3 %b to i32
531; VI-NEXT: %[[CMP:[0-9]+]] = icmp sle i32 %[[A_32_0]], %[[B_32_0]]
532; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i3 %a to i32
533; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i3 %b to i32
534; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
535; VI-NEXT: %[[SEL_3:[0-9]+]] = trunc i32 %[[SEL_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000536; VI-NEXT: store volatile i3 %[[SEL_3]]
537define amdgpu_kernel void @select_sle_i3(i3 %a, i3 %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000538 %cmp = icmp sle i3 %a, %b
539 %sel = select i1 %cmp, i3 %a, i3 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000540 store volatile i3 %sel, i3 addrspace(1)* undef
541 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000542}
543
544declare i3 @llvm.bitreverse.i3(i3)
545; GCN-LABEL: @bitreverse_i3(
546; SI: %brev = call i3 @llvm.bitreverse.i3(i3 %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000547; SI-NEXT: store volatile i3 %brev
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000548; VI: %[[A_32:[0-9]+]] = zext i3 %a to i32
549; VI-NEXT: %[[R_32:[0-9]+]] = call i32 @llvm.bitreverse.i32(i32 %[[A_32]])
550; VI-NEXT: %[[S_32:[0-9]+]] = lshr i32 %[[R_32]], 29
551; VI-NEXT: %[[R_3:[0-9]+]] = trunc i32 %[[S_32]] to i3
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000552; VI-NEXT: store volatile i3 %[[R_3]]
553define amdgpu_kernel void @bitreverse_i3(i3 %a) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000554 %brev = call i3 @llvm.bitreverse.i3(i3 %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000555 store volatile i3 %brev, i3 addrspace(1)* undef
556 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +0000557}
558
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000559; GCN-LABEL: @add_i16(
560; SI: %r = add i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000561; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000562; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000563; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000564; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000565; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000566; VI-NEXT: store volatile i16 %[[R_16]]
567define amdgpu_kernel void @add_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000568 %r = add i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000569 store volatile i16 %r, i16 addrspace(1)* undef
570 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000571}
572
Matt Arsenault269ffda2016-12-06 23:18:06 +0000573; GCN-LABEL: @constant_add_i16(
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000574; VI: store volatile i16 3
575define amdgpu_kernel void @constant_add_i16() {
Matt Arsenault269ffda2016-12-06 23:18:06 +0000576 %r = add i16 1, 2
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000577 store volatile i16 %r, i16 addrspace(1)* undef
578 ret void
Matt Arsenault269ffda2016-12-06 23:18:06 +0000579}
580
581; GCN-LABEL: @constant_add_nsw_i16(
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000582; VI: store volatile i16 3
583define amdgpu_kernel void @constant_add_nsw_i16() {
Matt Arsenault269ffda2016-12-06 23:18:06 +0000584 %r = add nsw i16 1, 2
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000585 store volatile i16 %r, i16 addrspace(1)* undef
586 ret void
Matt Arsenault269ffda2016-12-06 23:18:06 +0000587}
588
589; GCN-LABEL: @constant_add_nuw_i16(
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000590; VI: store volatile i16 3
591define amdgpu_kernel void @constant_add_nuw_i16() {
Matt Arsenault269ffda2016-12-06 23:18:06 +0000592 %r = add nsw i16 1, 2
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000593 store volatile i16 %r, i16 addrspace(1)* undef
594 ret void
Matt Arsenault269ffda2016-12-06 23:18:06 +0000595}
596
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000597; GCN-LABEL: @add_nsw_i16(
598; SI: %r = add 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
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000602; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000603; 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_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000606 %r = add 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: @add_nuw_i16(
612; SI: %r = add nuw 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]+]] = add nuw 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 @add_nuw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000620 %r = add nuw 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: @add_nuw_nsw_i16(
626; SI: %r = add nuw 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]+]] = add nuw 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 @add_nuw_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000634 %r = add nuw 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_i16(
640; SI: %r = sub 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 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_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000648 %r = sub 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_nsw_i16(
654; SI: %r = sub 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 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_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000662 %r = sub 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: @sub_nuw_i16(
668; SI: %r = sub nuw 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]+]] = sub nuw nsw 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 @sub_nuw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000676 %r = sub nuw 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: @sub_nuw_nsw_i16(
682; SI: %r = sub nuw 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
686; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw nsw i32 %[[A_32]], %[[B_32]]
687; 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 @sub_nuw_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000690 %r = sub nuw 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_i16(
696; SI: %r = mul 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 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_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000704 %r = mul 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_nsw_i16(
710; SI: %r = mul 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
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000714; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000715; 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_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000718 %r = mul 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: @mul_nuw_i16(
724; SI: %r = mul nuw 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]+]] = mul 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 @mul_nuw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000732 %r = mul nuw 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: @mul_nuw_nsw_i16(
738; SI: %r = mul nuw 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
742; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw nsw i32 %[[A_32]], %[[B_32]]
743; 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 @mul_nuw_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000746 %r = mul nuw 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: @urem_i16(
752; SI: %r = urem 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
756; VI-NEXT: %[[R_32:[0-9]+]] = urem i32 %[[A_32]], %[[B_32]]
757; 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 @urem_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000760 %r = urem 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: @srem_i16(
766; SI: %r = srem 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]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000769; VI-NEXT: %[[B_32:[0-9]+]] = sext i16 %b to i32
770; VI-NEXT: %[[R_32:[0-9]+]] = srem 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 @srem_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000774 %r = srem 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: @shl_i16(
780; SI: %r = shl 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
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000784; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000785; 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 @shl_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000788 %r = shl 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: @shl_nsw_i16(
794; SI: %r = shl nsw 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
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000798; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000799; 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 @shl_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000802 %r = shl nsw 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: @shl_nuw_i16(
808; SI: %r = shl nuw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000809; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000810; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000811; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
Matt Arsenaultd59e6402017-02-01 16:25:23 +0000812; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw i32 %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000813; 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 @shl_nuw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000816 %r = shl nuw 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: @shl_nuw_nsw_i16(
822; SI: %r = shl nuw nsw i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000823; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000824; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000825; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
826; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw 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 @shl_nuw_nsw_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000830 %r = shl nuw nsw 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
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000835; GCN-LABEL: @lshr_i16(
836; SI: %r = lshr i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000837; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000838; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000839; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
840; VI-NEXT: %[[R_32:[0-9]+]] = lshr i32 %[[A_32]], %[[B_32]]
841; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000842; VI-NEXT: store volatile i16 %[[R_16]]
843define amdgpu_kernel void @lshr_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000844 %r = lshr i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000845 store volatile i16 %r, i16 addrspace(1)* undef
846 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000847}
848
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000849; GCN-LABEL: @lshr_exact_i16(
850; SI: %r = lshr exact i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000851; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000852; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000853; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
854; VI-NEXT: %[[R_32:[0-9]+]] = lshr exact i32 %[[A_32]], %[[B_32]]
855; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000856; VI-NEXT: store volatile i16 %[[R_16]]
857define amdgpu_kernel void @lshr_exact_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000858 %r = lshr exact i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000859 store volatile i16 %r, i16 addrspace(1)* undef
860 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000861}
862
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000863; GCN-LABEL: @ashr_i16(
864; SI: %r = ashr i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000865; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyov691e2e02016-10-03 18:29:01 +0000866; VI: %[[A_32:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000867; VI-NEXT: %[[B_32:[0-9]+]] = sext i16 %b to i32
868; VI-NEXT: %[[R_32:[0-9]+]] = ashr i32 %[[A_32]], %[[B_32]]
869; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000870; VI-NEXT: store volatile i16 %[[R_16]]
871define amdgpu_kernel void @ashr_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000872 %r = ashr i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000873 store volatile i16 %r, i16 addrspace(1)* undef
874 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000875}
876
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000877; GCN-LABEL: @ashr_exact_i16(
878; SI: %r = ashr exact i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000879; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyov691e2e02016-10-03 18:29:01 +0000880; VI: %[[A_32:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000881; VI-NEXT: %[[B_32:[0-9]+]] = sext i16 %b to i32
882; VI-NEXT: %[[R_32:[0-9]+]] = ashr exact i32 %[[A_32]], %[[B_32]]
883; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000884; VI-NEXT: store volatile i16 %[[R_16]]
885define amdgpu_kernel void @ashr_exact_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000886 %r = ashr exact i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000887 store volatile i16 %r, i16 addrspace(1)* undef
888 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000889}
890
Matt Arsenault269ffda2016-12-06 23:18:06 +0000891; GCN-LABEL: @constant_lshr_exact_i16(
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000892; VI: store volatile i16 2
893define amdgpu_kernel void @constant_lshr_exact_i16(i16 %a, i16 %b) {
Matt Arsenault269ffda2016-12-06 23:18:06 +0000894 %r = lshr exact i16 4, 1
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000895 store volatile i16 %r, i16 addrspace(1)* undef
896 ret void
Matt Arsenault269ffda2016-12-06 23:18:06 +0000897}
898
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000899; GCN-LABEL: @and_i16(
900; SI: %r = and i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000901; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000902; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000903; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
904; VI-NEXT: %[[R_32:[0-9]+]] = and i32 %[[A_32]], %[[B_32]]
905; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000906; VI-NEXT: store volatile i16 %[[R_16]]
907define amdgpu_kernel void @and_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000908 %r = and i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000909 store volatile i16 %r, i16 addrspace(1)* undef
910 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000911}
912
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000913; GCN-LABEL: @or_i16(
914; SI: %r = or i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000915; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000916; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000917; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
918; VI-NEXT: %[[R_32:[0-9]+]] = or i32 %[[A_32]], %[[B_32]]
919; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000920; VI-NEXT: store volatile i16 %[[R_16]]
921define amdgpu_kernel void @or_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000922 %r = or i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000923 store volatile i16 %r, i16 addrspace(1)* undef
924 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000925}
926
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000927; GCN-LABEL: @xor_i16(
928; SI: %r = xor i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000929; SI-NEXT: store volatile i16 %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000930; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000931; VI-NEXT: %[[B_32:[0-9]+]] = zext i16 %b to i32
932; VI-NEXT: %[[R_32:[0-9]+]] = xor i32 %[[A_32]], %[[B_32]]
933; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[R_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000934; VI-NEXT: store volatile i16 %[[R_16]]
935define amdgpu_kernel void @xor_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000936 %r = xor i16 %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000937 store volatile i16 %r, i16 addrspace(1)* undef
938 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000939}
940
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000941; GCN-LABEL: @select_eq_i16(
942; SI: %cmp = icmp eq i16 %a, %b
943; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000944; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000945; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000946; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
947; VI-NEXT: %[[CMP:[0-9]+]] = icmp eq i32 %[[A_32_0]], %[[B_32_0]]
948; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
949; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
950; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
951; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000952; VI-NEXT: store volatile i16 %[[SEL_16]]
953define amdgpu_kernel void @select_eq_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000954 %cmp = icmp eq i16 %a, %b
955 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000956 store volatile i16 %sel, i16 addrspace(1)* undef
957 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000958}
959
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000960; GCN-LABEL: @select_ne_i16(
961; SI: %cmp = icmp ne i16 %a, %b
962; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000963; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000964; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000965; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
966; VI-NEXT: %[[CMP:[0-9]+]] = icmp ne i32 %[[A_32_0]], %[[B_32_0]]
967; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
968; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
969; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
970; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000971; VI-NEXT: store volatile i16 %[[SEL_16]]
972define amdgpu_kernel void @select_ne_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000973 %cmp = icmp ne i16 %a, %b
974 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000975 store volatile i16 %sel, i16 addrspace(1)* undef
976 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000977}
978
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000979; GCN-LABEL: @select_ugt_i16(
980; SI: %cmp = icmp ugt i16 %a, %b
981; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000982; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000983; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000984; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
985; VI-NEXT: %[[CMP:[0-9]+]] = icmp ugt i32 %[[A_32_0]], %[[B_32_0]]
986; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
987; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
988; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
989; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000990; VI-NEXT: store volatile i16 %[[SEL_16]]
991define amdgpu_kernel void @select_ugt_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000992 %cmp = icmp ugt i16 %a, %b
993 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +0000994 store volatile i16 %sel, i16 addrspace(1)* undef
995 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +0000996}
997
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +0000998; GCN-LABEL: @select_uge_i16(
999; SI: %cmp = icmp uge i16 %a, %b
1000; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001001; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001002; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001003; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
1004; VI-NEXT: %[[CMP:[0-9]+]] = icmp uge i32 %[[A_32_0]], %[[B_32_0]]
1005; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
1006; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
1007; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
1008; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001009; VI-NEXT: store volatile i16 %[[SEL_16]]
1010define amdgpu_kernel void @select_uge_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001011 %cmp = icmp uge i16 %a, %b
1012 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001013 store volatile i16 %sel, i16 addrspace(1)* undef
1014 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001015}
1016
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001017; GCN-LABEL: @select_ult_i16(
1018; SI: %cmp = icmp ult i16 %a, %b
1019; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001020; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001021; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001022; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
1023; VI-NEXT: %[[CMP:[0-9]+]] = icmp ult i32 %[[A_32_0]], %[[B_32_0]]
1024; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
1025; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
1026; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
1027; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001028; VI-NEXT: store volatile i16 %[[SEL_16]]
1029define amdgpu_kernel void @select_ult_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001030 %cmp = icmp ult i16 %a, %b
1031 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001032 store volatile i16 %sel, i16 addrspace(1)* undef
1033 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001034}
1035
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001036; GCN-LABEL: @select_ule_i16(
1037; SI: %cmp = icmp ule i16 %a, %b
1038; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001039; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001040; VI: %[[A_32_0:[0-9]+]] = zext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001041; VI-NEXT: %[[B_32_0:[0-9]+]] = zext i16 %b to i32
1042; VI-NEXT: %[[CMP:[0-9]+]] = icmp ule i32 %[[A_32_0]], %[[B_32_0]]
1043; VI-NEXT: %[[A_32_1:[0-9]+]] = zext i16 %a to i32
1044; VI-NEXT: %[[B_32_1:[0-9]+]] = zext i16 %b to i32
1045; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
1046; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001047; VI-NEXT: store volatile i16 %[[SEL_16]]
1048define amdgpu_kernel void @select_ule_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001049 %cmp = icmp ule i16 %a, %b
1050 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001051 store volatile i16 %sel, i16 addrspace(1)* undef
1052 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001053}
1054
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001055; GCN-LABEL: @select_sgt_i16(
1056; SI: %cmp = icmp sgt i16 %a, %b
1057; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001058; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001059; VI: %[[A_32_0:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001060; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i16 %b to i32
1061; VI-NEXT: %[[CMP:[0-9]+]] = icmp sgt i32 %[[A_32_0]], %[[B_32_0]]
1062; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i16 %a to i32
1063; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i16 %b to i32
1064; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
1065; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001066; VI-NEXT: store volatile i16 %[[SEL_16]]
1067define amdgpu_kernel void @select_sgt_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001068 %cmp = icmp sgt i16 %a, %b
1069 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001070 store volatile i16 %sel, i16 addrspace(1)* undef
1071 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001072}
1073
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001074; GCN-LABEL: @select_sge_i16(
1075; SI: %cmp = icmp sge i16 %a, %b
1076; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001077; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001078; VI: %[[A_32_0:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001079; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i16 %b to i32
1080; VI-NEXT: %[[CMP:[0-9]+]] = icmp sge i32 %[[A_32_0]], %[[B_32_0]]
1081; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i16 %a to i32
1082; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i16 %b to i32
1083; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
1084; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001085; VI-NEXT: store volatile i16 %[[SEL_16]]
1086define amdgpu_kernel void @select_sge_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001087 %cmp = icmp sge i16 %a, %b
1088 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001089 store volatile i16 %sel, i16 addrspace(1)* undef
1090 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001091}
1092
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001093; GCN-LABEL: @select_slt_i16(
1094; SI: %cmp = icmp slt i16 %a, %b
1095; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001096; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001097; VI: %[[A_32_0:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001098; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i16 %b to i32
1099; VI-NEXT: %[[CMP:[0-9]+]] = icmp slt i32 %[[A_32_0]], %[[B_32_0]]
1100; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i16 %a to i32
1101; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i16 %b to i32
1102; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
1103; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001104; VI-NEXT: store volatile i16 %[[SEL_16]]
1105define amdgpu_kernel void @select_slt_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001106 %cmp = icmp slt i16 %a, %b
1107 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001108 store volatile i16 %sel, i16 addrspace(1)* undef
1109 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001110}
1111
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001112; GCN-LABEL: @select_sle_i16(
1113; SI: %cmp = icmp sle i16 %a, %b
1114; SI-NEXT: %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001115; SI-NEXT: store volatile i16 %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001116; VI: %[[A_32_0:[0-9]+]] = sext i16 %a to i32
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001117; VI-NEXT: %[[B_32_0:[0-9]+]] = sext i16 %b to i32
1118; VI-NEXT: %[[CMP:[0-9]+]] = icmp sle i32 %[[A_32_0]], %[[B_32_0]]
1119; VI-NEXT: %[[A_32_1:[0-9]+]] = sext i16 %a to i32
1120; VI-NEXT: %[[B_32_1:[0-9]+]] = sext i16 %b to i32
1121; VI-NEXT: %[[SEL_32:[0-9]+]] = select i1 %[[CMP]], i32 %[[A_32_1]], i32 %[[B_32_1]]
1122; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc i32 %[[SEL_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001123; VI-NEXT: store volatile i16 %[[SEL_16]]
1124define amdgpu_kernel void @select_sle_i16(i16 %a, i16 %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001125 %cmp = icmp sle i16 %a, %b
1126 %sel = select i1 %cmp, i16 %a, i16 %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001127 store volatile i16 %sel, i16 addrspace(1)* undef
1128 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001129}
1130
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001131declare i16 @llvm.bitreverse.i16(i16)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001132
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001133; GCN-LABEL: @bitreverse_i16(
1134; SI: %brev = call i16 @llvm.bitreverse.i16(i16 %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001135; SI-NEXT: store volatile i16 %brev
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001136; VI: %[[A_32:[0-9]+]] = zext i16 %a to i32
1137; VI-NEXT: %[[R_32:[0-9]+]] = call i32 @llvm.bitreverse.i32(i32 %[[A_32]])
1138; VI-NEXT: %[[S_32:[0-9]+]] = lshr i32 %[[R_32]], 16
1139; VI-NEXT: %[[R_16:[0-9]+]] = trunc i32 %[[S_32]] to i16
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001140; VI-NEXT: store volatile i16 %[[R_16]]
1141define amdgpu_kernel void @bitreverse_i16(i16 %a) {
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001142 %brev = call i16 @llvm.bitreverse.i16(i16 %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001143 store volatile i16 %brev, i16 addrspace(1)* undef
1144 ret void
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001145}
1146
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001147; GCN-LABEL: @add_3xi15(
1148; SI: %r = add <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]+]] = add nuw 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 @add_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001156 %r = add <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: @add_nsw_3xi15(
1162; SI: %r = add 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>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001166; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001167; 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 @add_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001170 %r = add 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: @add_nuw_3xi15(
1176; SI: %r = add 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]+]] = add 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 @add_nuw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001184 %r = add 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: @add_nuw_nsw_3xi15(
1190; SI: %r = add 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]+]] = add 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 @add_nuw_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001198 %r = add 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: @sub_3xi15(
1204; SI: %r = sub <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]+]] = sub nsw <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 @sub_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001212 %r = sub <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: @sub_nsw_3xi15(
1218; SI: %r = sub 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>
1222; VI-NEXT: %[[R_32:[0-9]+]] = sub nsw <3 x i32> %[[A_32]], %[[B_32]]
1223; 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 @sub_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001226 %r = sub 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: @sub_nuw_3xi15(
1232; SI: %r = sub 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]+]] = sub 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 @sub_nuw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001240 %r = sub 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: @sub_nuw_nsw_3xi15(
1246; SI: %r = sub 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]+]] = sub 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 @sub_nuw_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001254 %r = sub 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
1259; GCN-LABEL: @mul_3xi15(
1260; SI: %r = mul <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]+]] = mul nuw <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 @mul_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001268 %r = mul <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: @mul_nsw_3xi15(
1274; SI: %r = mul 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]+]] = mul nuw <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 @mul_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001282 %r = mul 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: @mul_nuw_3xi15(
1288; SI: %r = mul 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]+]] = mul 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 @mul_nuw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001296 %r = mul 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: @mul_nuw_nsw_3xi15(
1302; SI: %r = mul 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]+]] = mul 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 @mul_nuw_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001310 %r = mul 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: @urem_3xi15(
1316; SI: %r = urem <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]+]] = urem <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 @urem_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001324 %r = urem <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: @srem_3xi15(
1330; SI: %r = srem <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]+]] = sext <3 x i15> %a to <3 x i32>
1333; VI-NEXT: %[[B_32:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1334; VI-NEXT: %[[R_32:[0-9]+]] = srem <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 @srem_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001338 %r = srem <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: @shl_3xi15(
1344; SI: %r = shl <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]+]] = zext <3 x i15> %a to <3 x i32>
1347; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001348; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001349; 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 @shl_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001352 %r = shl <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: @shl_nsw_3xi15(
1358; SI: %r = shl nsw <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]+]] = zext <3 x i15> %a to <3 x i32>
1361; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001362; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001363; 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 @shl_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001366 %r = shl nsw <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: @shl_nuw_3xi15(
1372; SI: %r = shl nuw <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>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001376; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001377; 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 @shl_nuw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001380 %r = shl nuw <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: @shl_nuw_nsw_3xi15(
1386; SI: %r = shl nuw nsw <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]+]] = shl nuw nsw <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 @shl_nuw_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001394 %r = shl nuw nsw <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: @lshr_3xi15(
1400; SI: %r = lshr <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]+]] = lshr <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 @lshr_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001408 %r = lshr <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: @lshr_exact_3xi15(
1414; SI: %r = lshr exact <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001415; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001416; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1417; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1418; VI-NEXT: %[[R_32:[0-9]+]] = lshr exact <3 x i32> %[[A_32]], %[[B_32]]
1419; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001420; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1421define amdgpu_kernel void @lshr_exact_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001422 %r = lshr exact <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001423 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1424 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001425}
1426
1427; GCN-LABEL: @ashr_3xi15(
1428; SI: %r = ashr <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001429; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001430; VI: %[[A_32:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1431; VI-NEXT: %[[B_32:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1432; VI-NEXT: %[[R_32:[0-9]+]] = ashr <3 x i32> %[[A_32]], %[[B_32]]
1433; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001434; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1435define amdgpu_kernel void @ashr_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001436 %r = ashr <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001437 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1438 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001439}
1440
1441; GCN-LABEL: @ashr_exact_3xi15(
1442; SI: %r = ashr exact <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001443; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001444; VI: %[[A_32:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1445; VI-NEXT: %[[B_32:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1446; VI-NEXT: %[[R_32:[0-9]+]] = ashr exact <3 x i32> %[[A_32]], %[[B_32]]
1447; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001448; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1449define amdgpu_kernel void @ashr_exact_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001450 %r = ashr exact <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001451 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1452 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001453}
1454
1455; GCN-LABEL: @and_3xi15(
1456; SI: %r = and <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001457; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001458; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1459; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1460; VI-NEXT: %[[R_32:[0-9]+]] = and <3 x i32> %[[A_32]], %[[B_32]]
1461; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001462; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1463define amdgpu_kernel void @and_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001464 %r = and <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001465 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1466 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001467}
1468
1469; GCN-LABEL: @or_3xi15(
1470; SI: %r = or <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001471; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001472; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1473; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1474; VI-NEXT: %[[R_32:[0-9]+]] = or <3 x i32> %[[A_32]], %[[B_32]]
1475; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001476; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1477define amdgpu_kernel void @or_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001478 %r = or <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001479 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1480 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001481}
1482
1483; GCN-LABEL: @xor_3xi15(
1484; SI: %r = xor <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001485; SI-NEXT: store volatile <3 x i15> %r
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001486; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1487; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1488; VI-NEXT: %[[R_32:[0-9]+]] = xor <3 x i32> %[[A_32]], %[[B_32]]
1489; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001490; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1491define amdgpu_kernel void @xor_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001492 %r = xor <3 x i15> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001493 store volatile <3 x i15> %r, <3 x i15> addrspace(1)* undef
1494 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001495}
1496
1497; GCN-LABEL: @select_eq_3xi15(
1498; SI: %cmp = icmp eq <3 x i15> %a, %b
1499; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001500; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001501; VI: %[[A_32_0:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1502; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1503; VI-NEXT: %[[CMP:[0-9]+]] = icmp eq <3 x i32> %[[A_32_0]], %[[B_32_0]]
1504; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1505; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1506; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1507; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001508; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1509define amdgpu_kernel void @select_eq_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001510 %cmp = icmp eq <3 x i15> %a, %b
1511 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001512 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1513 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001514}
1515
1516; GCN-LABEL: @select_ne_3xi15(
1517; SI: %cmp = icmp ne <3 x i15> %a, %b
1518; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001519; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001520; VI: %[[A_32_0:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1521; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1522; VI-NEXT: %[[CMP:[0-9]+]] = icmp ne <3 x i32> %[[A_32_0]], %[[B_32_0]]
1523; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1524; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1525; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1526; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001527; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1528define amdgpu_kernel void @select_ne_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001529 %cmp = icmp ne <3 x i15> %a, %b
1530 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001531 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1532 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001533}
1534
1535; GCN-LABEL: @select_ugt_3xi15(
1536; SI: %cmp = icmp ugt <3 x i15> %a, %b
1537; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001538; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001539; VI: %[[A_32_0:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1540; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1541; VI-NEXT: %[[CMP:[0-9]+]] = icmp ugt <3 x i32> %[[A_32_0]], %[[B_32_0]]
1542; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1543; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1544; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1545; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001546; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1547define amdgpu_kernel void @select_ugt_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001548 %cmp = icmp ugt <3 x i15> %a, %b
1549 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001550 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1551 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001552}
1553
1554; GCN-LABEL: @select_uge_3xi15(
1555; SI: %cmp = icmp uge <3 x i15> %a, %b
1556; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001557; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001558; VI: %[[A_32_0:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1559; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1560; VI-NEXT: %[[CMP:[0-9]+]] = icmp uge <3 x i32> %[[A_32_0]], %[[B_32_0]]
1561; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1562; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1563; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1564; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001565; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1566define amdgpu_kernel void @select_uge_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001567 %cmp = icmp uge <3 x i15> %a, %b
1568 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001569 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1570 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001571}
1572
1573; GCN-LABEL: @select_ult_3xi15(
1574; SI: %cmp = icmp ult <3 x i15> %a, %b
1575; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001576; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001577; VI: %[[A_32_0:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1578; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1579; VI-NEXT: %[[CMP:[0-9]+]] = icmp ult <3 x i32> %[[A_32_0]], %[[B_32_0]]
1580; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1581; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1582; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1583; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001584; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1585define amdgpu_kernel void @select_ult_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001586 %cmp = icmp ult <3 x i15> %a, %b
1587 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001588 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1589 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001590}
1591
1592; GCN-LABEL: @select_ule_3xi15(
1593; SI: %cmp = icmp ule <3 x i15> %a, %b
1594; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001595; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001596; VI: %[[A_32_0:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1597; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1598; VI-NEXT: %[[CMP:[0-9]+]] = icmp ule <3 x i32> %[[A_32_0]], %[[B_32_0]]
1599; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1600; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i15> %b to <3 x i32>
1601; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1602; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001603; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1604define amdgpu_kernel void @select_ule_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001605 %cmp = icmp ule <3 x i15> %a, %b
1606 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001607 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1608 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001609}
1610
1611; GCN-LABEL: @select_sgt_3xi15(
1612; SI: %cmp = icmp sgt <3 x i15> %a, %b
1613; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001614; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001615; VI: %[[A_32_0:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1616; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1617; VI-NEXT: %[[CMP:[0-9]+]] = icmp sgt <3 x i32> %[[A_32_0]], %[[B_32_0]]
1618; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1619; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1620; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1621; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001622; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1623define amdgpu_kernel void @select_sgt_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001624 %cmp = icmp sgt <3 x i15> %a, %b
1625 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001626 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1627 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001628}
1629
1630; GCN-LABEL: @select_sge_3xi15(
1631; SI: %cmp = icmp sge <3 x i15> %a, %b
1632; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001633; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001634; VI: %[[A_32_0:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1635; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1636; VI-NEXT: %[[CMP:[0-9]+]] = icmp sge <3 x i32> %[[A_32_0]], %[[B_32_0]]
1637; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1638; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1639; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1640; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001641; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1642define amdgpu_kernel void @select_sge_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001643 %cmp = icmp sge <3 x i15> %a, %b
1644 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001645 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1646 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001647}
1648
1649; GCN-LABEL: @select_slt_3xi15(
1650; SI: %cmp = icmp slt <3 x i15> %a, %b
1651; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001652; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001653; VI: %[[A_32_0:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1654; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1655; VI-NEXT: %[[CMP:[0-9]+]] = icmp slt <3 x i32> %[[A_32_0]], %[[B_32_0]]
1656; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1657; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1658; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1659; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001660; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1661define amdgpu_kernel void @select_slt_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001662 %cmp = icmp slt <3 x i15> %a, %b
1663 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001664 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1665 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001666}
1667
1668; GCN-LABEL: @select_sle_3xi15(
1669; SI: %cmp = icmp sle <3 x i15> %a, %b
1670; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001671; SI-NEXT: store volatile <3 x i15> %sel
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001672; VI: %[[A_32_0:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1673; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1674; VI-NEXT: %[[CMP:[0-9]+]] = icmp sle <3 x i32> %[[A_32_0]], %[[B_32_0]]
1675; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i15> %a to <3 x i32>
1676; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i15> %b to <3 x i32>
1677; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
1678; VI-NEXT: %[[SEL_15:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001679; VI-NEXT: store volatile <3 x i15> %[[SEL_15]]
1680define amdgpu_kernel void @select_sle_3xi15(<3 x i15> %a, <3 x i15> %b) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001681 %cmp = icmp sle <3 x i15> %a, %b
1682 %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001683 store volatile <3 x i15> %sel, <3 x i15> addrspace(1)* undef
1684 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001685}
1686
1687declare <3 x i15> @llvm.bitreverse.v3i15(<3 x i15>)
1688; GCN-LABEL: @bitreverse_3xi15(
1689; SI: %brev = call <3 x i15> @llvm.bitreverse.v3i15(<3 x i15> %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001690; SI-NEXT: store volatile <3 x i15> %brev
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001691; VI: %[[A_32:[0-9]+]] = zext <3 x i15> %a to <3 x i32>
1692; VI-NEXT: %[[R_32:[0-9]+]] = call <3 x i32> @llvm.bitreverse.v3i32(<3 x i32> %[[A_32]])
1693; VI-NEXT: %[[S_32:[0-9]+]] = lshr <3 x i32> %[[R_32]], <i32 17, i32 17, i32 17>
1694; VI-NEXT: %[[R_15:[0-9]+]] = trunc <3 x i32> %[[S_32]] to <3 x i15>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001695; VI-NEXT: store volatile <3 x i15> %[[R_15]]
1696define amdgpu_kernel void @bitreverse_3xi15(<3 x i15> %a) {
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001697 %brev = call <3 x i15> @llvm.bitreverse.v3i15(<3 x i15> %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001698 store volatile <3 x i15> %brev, <3 x i15> addrspace(1)* undef
1699 ret void
Konstantin Zhuravlyovf74fc602016-10-07 14:22:58 +00001700}
1701
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001702; GCN-LABEL: @add_3xi16(
1703; SI: %r = add <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]+]] = add 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 @add_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001711 %r = add <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: @add_nsw_3xi16(
1717; SI: %r = add 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>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001721; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001722; 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 @add_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001725 %r = add 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: @add_nuw_3xi16(
1731; SI: %r = add nuw <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]+]] = add nuw nsw <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 @add_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001739 %r = add nuw <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: @add_nuw_nsw_3xi16(
1745; SI: %r = add nuw 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>
1749; VI-NEXT: %[[R_32:[0-9]+]] = add nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
1750; 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 @add_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001753 %r = add nuw 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: @sub_3xi16(
1759; SI: %r = sub <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]+]] = sub 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 @sub_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001767 %r = sub <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: @sub_nsw_3xi16(
1773; SI: %r = sub 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]+]] = sub 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 @sub_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001781 %r = sub 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: @sub_nuw_3xi16(
1787; SI: %r = sub nuw <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]+]] = sub 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 @sub_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001795 %r = sub nuw <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: @sub_nuw_nsw_3xi16(
1801; SI: %r = sub nuw 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>
1805; VI-NEXT: %[[R_32:[0-9]+]] = sub nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
1806; 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 @sub_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001809 %r = sub nuw 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: @mul_3xi16(
1815; SI: %r = mul <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]+]] = mul nuw <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 @mul_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001823 %r = mul <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: @mul_nsw_3xi16(
1829; SI: %r = mul 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>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001833; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001834; 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 @mul_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001837 %r = mul 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: @mul_nuw_3xi16(
1843; SI: %r = mul nuw <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>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001847; VI-NEXT: %[[R_32:[0-9]+]] = mul nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001848; 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 @mul_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001851 %r = mul nuw <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: @mul_nuw_nsw_3xi16(
1857; SI: %r = mul nuw nsw <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]+]] = mul nuw nsw <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 @mul_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001865 %r = mul nuw nsw <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: @urem_3xi16(
1871; SI: %r = urem <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001872; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001873; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001874; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1875; VI-NEXT: %[[R_32:[0-9]+]] = urem <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 @urem_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001879 %r = urem <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: @srem_3xi16(
1885; SI: %r = srem <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001886; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +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]+]] = srem <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 @srem_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001893 %r = srem <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: @shl_3xi16(
1899; SI: %r = shl <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>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001903; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001904; 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 @shl_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001907 %r = shl <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: @shl_nsw_3xi16(
1913; SI: %r = shl nsw <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>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001917; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001918; 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 @shl_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001921 %r = shl nsw <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: @shl_nuw_3xi16(
1927; SI: %r = shl nuw <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>
Matt Arsenaultd59e6402017-02-01 16:25:23 +00001931; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001932; 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 @shl_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001935 %r = shl nuw <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: @shl_nuw_nsw_3xi16(
1941; SI: %r = shl nuw nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001942; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001943; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001944; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1945; VI-NEXT: %[[R_32:[0-9]+]] = shl nuw nsw <3 x i32> %[[A_32]], %[[B_32]]
1946; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001947; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1948define amdgpu_kernel void @shl_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001949 %r = shl nuw nsw <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001950 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1951 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001952}
1953
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001954; GCN-LABEL: @lshr_3xi16(
1955; SI: %r = lshr <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001956; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001957; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001958; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1959; VI-NEXT: %[[R_32:[0-9]+]] = lshr <3 x i32> %[[A_32]], %[[B_32]]
1960; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001961; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1962define amdgpu_kernel void @lshr_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001963 %r = lshr <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001964 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1965 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001966}
1967
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001968; GCN-LABEL: @lshr_exact_3xi16(
1969; SI: %r = lshr exact <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001970; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001971; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001972; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
1973; VI-NEXT: %[[R_32:[0-9]+]] = lshr exact <3 x i32> %[[A_32]], %[[B_32]]
1974; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001975; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1976define amdgpu_kernel void @lshr_exact_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001977 %r = lshr exact <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001978 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1979 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001980}
1981
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001982; GCN-LABEL: @ashr_3xi16(
1983; SI: %r = ashr <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001984; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyov691e2e02016-10-03 18:29:01 +00001985; VI: %[[A_32:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001986; VI-NEXT: %[[B_32:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
1987; VI-NEXT: %[[R_32:[0-9]+]] = ashr <3 x i32> %[[A_32]], %[[B_32]]
1988; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001989; VI-NEXT: store volatile <3 x i16> %[[R_16]]
1990define amdgpu_kernel void @ashr_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001991 %r = ashr <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001992 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
1993 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00001994}
1995
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00001996; GCN-LABEL: @ashr_exact_3xi16(
1997; SI: %r = ashr exact <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00001998; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyov691e2e02016-10-03 18:29:01 +00001999; VI: %[[A_32:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002000; VI-NEXT: %[[B_32:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2001; VI-NEXT: %[[R_32:[0-9]+]] = ashr exact <3 x i32> %[[A_32]], %[[B_32]]
2002; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002003; VI-NEXT: store volatile <3 x i16> %[[R_16]]
2004define amdgpu_kernel void @ashr_exact_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002005 %r = ashr exact <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002006 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
2007 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002008}
2009
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002010; GCN-LABEL: @and_3xi16(
2011; SI: %r = and <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002012; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002013; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002014; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2015; VI-NEXT: %[[R_32:[0-9]+]] = and <3 x i32> %[[A_32]], %[[B_32]]
2016; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002017; VI-NEXT: store volatile <3 x i16> %[[R_16]]
2018define amdgpu_kernel void @and_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002019 %r = and <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002020 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
2021 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002022}
2023
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002024; GCN-LABEL: @or_3xi16(
2025; SI: %r = or <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002026; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002027; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002028; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2029; VI-NEXT: %[[R_32:[0-9]+]] = or <3 x i32> %[[A_32]], %[[B_32]]
2030; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002031; VI-NEXT: store volatile <3 x i16> %[[R_16]]
2032define amdgpu_kernel void @or_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002033 %r = or <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002034 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
2035 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002036}
2037
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002038; GCN-LABEL: @xor_3xi16(
2039; SI: %r = xor <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002040; SI-NEXT: store volatile <3 x i16> %r
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002041; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002042; VI-NEXT: %[[B_32:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2043; VI-NEXT: %[[R_32:[0-9]+]] = xor <3 x i32> %[[A_32]], %[[B_32]]
2044; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[R_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002045; VI-NEXT: store volatile <3 x i16> %[[R_16]]
2046define amdgpu_kernel void @xor_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002047 %r = xor <3 x i16> %a, %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002048 store volatile <3 x i16> %r, <3 x i16> addrspace(1)* undef
2049 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002050}
2051
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002052; GCN-LABEL: @select_eq_3xi16(
2053; SI: %cmp = icmp eq <3 x i16> %a, %b
2054; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002055; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002056; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002057; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2058; VI-NEXT: %[[CMP:[0-9]+]] = icmp eq <3 x i32> %[[A_32_0]], %[[B_32_0]]
2059; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
2060; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2061; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2062; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002063; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2064define amdgpu_kernel void @select_eq_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002065 %cmp = icmp eq <3 x i16> %a, %b
2066 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002067 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2068 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002069}
2070
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002071; GCN-LABEL: @select_ne_3xi16(
2072; SI: %cmp = icmp ne <3 x i16> %a, %b
2073; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002074; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002075; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002076; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2077; VI-NEXT: %[[CMP:[0-9]+]] = icmp ne <3 x i32> %[[A_32_0]], %[[B_32_0]]
2078; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
2079; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2080; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2081; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002082; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2083define amdgpu_kernel void @select_ne_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002084 %cmp = icmp ne <3 x i16> %a, %b
2085 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002086 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2087 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002088}
2089
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002090; GCN-LABEL: @select_ugt_3xi16(
2091; SI: %cmp = icmp ugt <3 x i16> %a, %b
2092; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002093; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002094; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002095; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2096; VI-NEXT: %[[CMP:[0-9]+]] = icmp ugt <3 x i32> %[[A_32_0]], %[[B_32_0]]
2097; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
2098; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2099; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2100; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002101; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2102define amdgpu_kernel void @select_ugt_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002103 %cmp = icmp ugt <3 x i16> %a, %b
2104 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002105 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2106 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002107}
2108
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002109; GCN-LABEL: @select_uge_3xi16(
2110; SI: %cmp = icmp uge <3 x i16> %a, %b
2111; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002112; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002113; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002114; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2115; VI-NEXT: %[[CMP:[0-9]+]] = icmp uge <3 x i32> %[[A_32_0]], %[[B_32_0]]
2116; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
2117; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2118; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2119; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002120; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2121define amdgpu_kernel void @select_uge_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002122 %cmp = icmp uge <3 x i16> %a, %b
2123 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002124 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2125 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002126}
2127
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002128; GCN-LABEL: @select_ult_3xi16(
2129; SI: %cmp = icmp ult <3 x i16> %a, %b
2130; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002131; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002132; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002133; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2134; VI-NEXT: %[[CMP:[0-9]+]] = icmp ult <3 x i32> %[[A_32_0]], %[[B_32_0]]
2135; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
2136; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2137; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2138; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002139; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2140define amdgpu_kernel void @select_ult_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002141 %cmp = icmp ult <3 x i16> %a, %b
2142 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002143 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2144 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002145}
2146
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002147; GCN-LABEL: @select_ule_3xi16(
2148; SI: %cmp = icmp ule <3 x i16> %a, %b
2149; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002150; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002151; VI: %[[A_32_0:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002152; VI-NEXT: %[[B_32_0:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2153; VI-NEXT: %[[CMP:[0-9]+]] = icmp ule <3 x i32> %[[A_32_0]], %[[B_32_0]]
2154; VI-NEXT: %[[A_32_1:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
2155; VI-NEXT: %[[B_32_1:[0-9]+]] = zext <3 x i16> %b to <3 x i32>
2156; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2157; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002158; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2159define amdgpu_kernel void @select_ule_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002160 %cmp = icmp ule <3 x i16> %a, %b
2161 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002162 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2163 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002164}
2165
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002166; GCN-LABEL: @select_sgt_3xi16(
2167; SI: %cmp = icmp sgt <3 x i16> %a, %b
2168; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002169; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002170; VI: %[[A_32_0:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002171; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2172; VI-NEXT: %[[CMP:[0-9]+]] = icmp sgt <3 x i32> %[[A_32_0]], %[[B_32_0]]
2173; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
2174; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2175; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2176; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002177; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2178define amdgpu_kernel void @select_sgt_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002179 %cmp = icmp sgt <3 x i16> %a, %b
2180 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002181 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2182 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002183}
2184
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002185; GCN-LABEL: @select_sge_3xi16(
2186; SI: %cmp = icmp sge <3 x i16> %a, %b
2187; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002188; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002189; VI: %[[A_32_0:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002190; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2191; VI-NEXT: %[[CMP:[0-9]+]] = icmp sge <3 x i32> %[[A_32_0]], %[[B_32_0]]
2192; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
2193; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2194; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2195; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002196; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2197define amdgpu_kernel void @select_sge_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002198 %cmp = icmp sge <3 x i16> %a, %b
2199 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002200 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2201 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002202}
2203
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002204; GCN-LABEL: @select_slt_3xi16(
2205; SI: %cmp = icmp slt <3 x i16> %a, %b
2206; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002207; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002208; VI: %[[A_32_0:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002209; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2210; VI-NEXT: %[[CMP:[0-9]+]] = icmp slt <3 x i32> %[[A_32_0]], %[[B_32_0]]
2211; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
2212; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2213; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2214; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002215; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2216define amdgpu_kernel void @select_slt_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002217 %cmp = icmp slt <3 x i16> %a, %b
2218 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002219 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2220 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002221}
2222
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002223; GCN-LABEL: @select_sle_3xi16(
2224; SI: %cmp = icmp sle <3 x i16> %a, %b
2225; SI-NEXT: %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002226; SI-NEXT: store volatile <3 x i16> %sel
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002227; VI: %[[A_32_0:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002228; VI-NEXT: %[[B_32_0:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2229; VI-NEXT: %[[CMP:[0-9]+]] = icmp sle <3 x i32> %[[A_32_0]], %[[B_32_0]]
2230; VI-NEXT: %[[A_32_1:[0-9]+]] = sext <3 x i16> %a to <3 x i32>
2231; VI-NEXT: %[[B_32_1:[0-9]+]] = sext <3 x i16> %b to <3 x i32>
2232; VI-NEXT: %[[SEL_32:[0-9]+]] = select <3 x i1> %[[CMP]], <3 x i32> %[[A_32_1]], <3 x i32> %[[B_32_1]]
2233; VI-NEXT: %[[SEL_16:[0-9]+]] = trunc <3 x i32> %[[SEL_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002234; VI-NEXT: store volatile <3 x i16> %[[SEL_16]]
2235define amdgpu_kernel void @select_sle_3xi16(<3 x i16> %a, <3 x i16> %b) {
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002236 %cmp = icmp sle <3 x i16> %a, %b
2237 %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002238 store volatile <3 x i16> %sel, <3 x i16> addrspace(1)* undef
2239 ret void
Konstantin Zhuravlyove14df4b2016-09-28 20:05:39 +00002240}
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002241
2242declare <3 x i16> @llvm.bitreverse.v3i16(<3 x i16>)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002243
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002244; GCN-LABEL: @bitreverse_3xi16(
2245; SI: %brev = call <3 x i16> @llvm.bitreverse.v3i16(<3 x i16> %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002246; SI-NEXT: store volatile <3 x i16> %brev
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002247; VI: %[[A_32:[0-9]+]] = zext <3 x i16> %a to <3 x i32>
2248; VI-NEXT: %[[R_32:[0-9]+]] = call <3 x i32> @llvm.bitreverse.v3i32(<3 x i32> %[[A_32]])
2249; VI-NEXT: %[[S_32:[0-9]+]] = lshr <3 x i32> %[[R_32]], <i32 16, i32 16, i32 16>
2250; VI-NEXT: %[[R_16:[0-9]+]] = trunc <3 x i32> %[[S_32]] to <3 x i16>
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002251; VI-NEXT: store volatile <3 x i16> %[[R_16]]
2252define amdgpu_kernel void @bitreverse_3xi16(<3 x i16> %a) {
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002253 %brev = call <3 x i16> @llvm.bitreverse.v3i16(<3 x i16> %a)
Matt Arsenault4c1ecde2017-04-19 17:42:34 +00002254 store volatile <3 x i16> %brev, <3 x i16> addrspace(1)* undef
2255 ret void
Konstantin Zhuravlyovb4eb5d52016-10-06 02:20:46 +00002256}