xref: /llvm-project/llvm/test/CodeGen/AMDGPU/llvm.ldexp.ll (revision 26e13091ea5ac3a53d11b50265a506f88129d6ff)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,GFX6,GFX6-SDAG %s
3; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,GFX8,GFX8-SDAG %s
4; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9,GFX9-SDAG %s
5; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GCN,GFX11,GFX11-SDAG-TRUE16 %s
6; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GCN,GFX11,GFX11-SDAG-FAKE16 %s
7
8; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,GFX6,GFX6-GISEL %s
9; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,GFX8,GFX8-GISEL %s
10; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9,GFX9-GISEL %s
11; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1100 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GCN,GFX11,GFX11-GISEL-TRUE16 %s
12; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1100 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GCN,GFX11,GFX11-GISEL-FAKE16 %s
13
14define float @test_ldexp_f32_i32(ptr addrspace(1) %out, float %a, i32 %b) {
15; GFX6-LABEL: test_ldexp_f32_i32:
16; GFX6:       ; %bb.0:
17; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
18; GFX6-NEXT:    v_ldexp_f32_e32 v0, v2, v3
19; GFX6-NEXT:    s_setpc_b64 s[30:31]
20;
21; GFX8-LABEL: test_ldexp_f32_i32:
22; GFX8:       ; %bb.0:
23; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
24; GFX8-NEXT:    v_ldexp_f32 v0, v2, v3
25; GFX8-NEXT:    s_setpc_b64 s[30:31]
26;
27; GFX9-LABEL: test_ldexp_f32_i32:
28; GFX9:       ; %bb.0:
29; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
30; GFX9-NEXT:    v_ldexp_f32 v0, v2, v3
31; GFX9-NEXT:    s_setpc_b64 s[30:31]
32;
33; GFX11-LABEL: test_ldexp_f32_i32:
34; GFX11:       ; %bb.0:
35; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
36; GFX11-NEXT:    v_ldexp_f32 v0, v2, v3
37; GFX11-NEXT:    s_setpc_b64 s[30:31]
38  %result = call float @llvm.ldexp.f32.i32(float %a, i32 %b)
39  ret float %result
40}
41
42define <2 x float> @test_ldexp_v2f32_v2i32(ptr addrspace(1) %out, <2 x float> %a, <2 x i32> %b) {
43; GFX6-LABEL: test_ldexp_v2f32_v2i32:
44; GFX6:       ; %bb.0:
45; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
46; GFX6-NEXT:    v_ldexp_f32_e32 v0, v2, v4
47; GFX6-NEXT:    v_ldexp_f32_e32 v1, v3, v5
48; GFX6-NEXT:    s_setpc_b64 s[30:31]
49;
50; GFX8-LABEL: test_ldexp_v2f32_v2i32:
51; GFX8:       ; %bb.0:
52; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
53; GFX8-NEXT:    v_ldexp_f32 v0, v2, v4
54; GFX8-NEXT:    v_ldexp_f32 v1, v3, v5
55; GFX8-NEXT:    s_setpc_b64 s[30:31]
56;
57; GFX9-LABEL: test_ldexp_v2f32_v2i32:
58; GFX9:       ; %bb.0:
59; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
60; GFX9-NEXT:    v_ldexp_f32 v0, v2, v4
61; GFX9-NEXT:    v_ldexp_f32 v1, v3, v5
62; GFX9-NEXT:    s_setpc_b64 s[30:31]
63;
64; GFX11-LABEL: test_ldexp_v2f32_v2i32:
65; GFX11:       ; %bb.0:
66; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
67; GFX11-NEXT:    v_ldexp_f32 v0, v2, v4
68; GFX11-NEXT:    v_ldexp_f32 v1, v3, v5
69; GFX11-NEXT:    s_setpc_b64 s[30:31]
70  %result = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %a, <2 x i32> %b)
71  ret <2 x float> %result
72}
73
74define <3 x float> @test_ldexp_v3f32_v3i32(ptr addrspace(1) %out, <3 x float> %a, <3 x i32> %b) {
75; GFX6-LABEL: test_ldexp_v3f32_v3i32:
76; GFX6:       ; %bb.0:
77; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
78; GFX6-NEXT:    v_ldexp_f32_e32 v0, v2, v5
79; GFX6-NEXT:    v_ldexp_f32_e32 v1, v3, v6
80; GFX6-NEXT:    v_ldexp_f32_e32 v2, v4, v7
81; GFX6-NEXT:    s_setpc_b64 s[30:31]
82;
83; GFX8-LABEL: test_ldexp_v3f32_v3i32:
84; GFX8:       ; %bb.0:
85; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
86; GFX8-NEXT:    v_ldexp_f32 v0, v2, v5
87; GFX8-NEXT:    v_ldexp_f32 v1, v3, v6
88; GFX8-NEXT:    v_ldexp_f32 v2, v4, v7
89; GFX8-NEXT:    s_setpc_b64 s[30:31]
90;
91; GFX9-LABEL: test_ldexp_v3f32_v3i32:
92; GFX9:       ; %bb.0:
93; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
94; GFX9-NEXT:    v_ldexp_f32 v0, v2, v5
95; GFX9-NEXT:    v_ldexp_f32 v1, v3, v6
96; GFX9-NEXT:    v_ldexp_f32 v2, v4, v7
97; GFX9-NEXT:    s_setpc_b64 s[30:31]
98;
99; GFX11-LABEL: test_ldexp_v3f32_v3i32:
100; GFX11:       ; %bb.0:
101; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
102; GFX11-NEXT:    v_ldexp_f32 v0, v2, v5
103; GFX11-NEXT:    v_ldexp_f32 v1, v3, v6
104; GFX11-NEXT:    v_ldexp_f32 v2, v4, v7
105; GFX11-NEXT:    s_setpc_b64 s[30:31]
106  %result = call <3 x float> @llvm.ldexp.v3f32.v3i32(<3 x float> %a, <3 x i32> %b)
107  ret <3 x float> %result
108}
109
110define <4 x float> @test_ldexp_v4f32_v4i32(ptr addrspace(1) %out, <4 x float> %a, <4 x i32> %b) {
111; GFX6-LABEL: test_ldexp_v4f32_v4i32:
112; GFX6:       ; %bb.0:
113; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
114; GFX6-NEXT:    v_ldexp_f32_e32 v0, v2, v6
115; GFX6-NEXT:    v_ldexp_f32_e32 v1, v3, v7
116; GFX6-NEXT:    v_ldexp_f32_e32 v2, v4, v8
117; GFX6-NEXT:    v_ldexp_f32_e32 v3, v5, v9
118; GFX6-NEXT:    s_setpc_b64 s[30:31]
119;
120; GFX8-LABEL: test_ldexp_v4f32_v4i32:
121; GFX8:       ; %bb.0:
122; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
123; GFX8-NEXT:    v_ldexp_f32 v0, v2, v6
124; GFX8-NEXT:    v_ldexp_f32 v1, v3, v7
125; GFX8-NEXT:    v_ldexp_f32 v2, v4, v8
126; GFX8-NEXT:    v_ldexp_f32 v3, v5, v9
127; GFX8-NEXT:    s_setpc_b64 s[30:31]
128;
129; GFX9-LABEL: test_ldexp_v4f32_v4i32:
130; GFX9:       ; %bb.0:
131; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
132; GFX9-NEXT:    v_ldexp_f32 v0, v2, v6
133; GFX9-NEXT:    v_ldexp_f32 v1, v3, v7
134; GFX9-NEXT:    v_ldexp_f32 v2, v4, v8
135; GFX9-NEXT:    v_ldexp_f32 v3, v5, v9
136; GFX9-NEXT:    s_setpc_b64 s[30:31]
137;
138; GFX11-LABEL: test_ldexp_v4f32_v4i32:
139; GFX11:       ; %bb.0:
140; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
141; GFX11-NEXT:    v_ldexp_f32 v0, v2, v6
142; GFX11-NEXT:    v_ldexp_f32 v1, v3, v7
143; GFX11-NEXT:    v_ldexp_f32 v2, v4, v8
144; GFX11-NEXT:    v_ldexp_f32 v3, v5, v9
145; GFX11-NEXT:    s_setpc_b64 s[30:31]
146  %result = call <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float> %a, <4 x i32> %b)
147  ret <4 x float> %result
148}
149
150define double @test_ldexp_f64_i32(double %a, i32 %b) {
151; GCN-LABEL: test_ldexp_f64_i32:
152; GCN:       ; %bb.0:
153; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
154; GCN-NEXT:    v_ldexp_f64 v[0:1], v[0:1], v2
155; GCN-NEXT:    s_setpc_b64 s[30:31]
156  %result = call double @llvm.ldexp.f64.i32(double %a, i32 %b)
157  ret double %result
158}
159
160define <2 x double> @test_ldexp_v2f64_v2i32(<2 x double> %a, <2 x i32> %b) {
161; GCN-LABEL: test_ldexp_v2f64_v2i32:
162; GCN:       ; %bb.0:
163; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
164; GCN-NEXT:    v_ldexp_f64 v[0:1], v[0:1], v4
165; GCN-NEXT:    v_ldexp_f64 v[2:3], v[2:3], v5
166; GCN-NEXT:    s_setpc_b64 s[30:31]
167  %result = call <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double> %a, <2 x i32> %b)
168  ret <2 x double> %result
169}
170
171; Broken for DAG
172; define float @test_ldexp_f32_i16(float %a, i16 %b) {
173;   %result = call float @llvm.ldexp.f32.i16(float %a, i16 %b)
174;   ret float %result
175; }
176
177; FIXME: Should be able to truncate to i32
178; define float @test_ldexp_f32_i64(float %a, i64 %b) {
179;   %result = call float @llvm.ldexp.f32.i64(float %a, i64 %b)
180;   ret float %result
181; }
182
183; define <2 x float> @test_ldexp_v2f32_v2i16(<2 x float> %a, <2 x i16> %b) {
184;   %result = call <2 x float> @llvm.ldexp.v2f32.v2i16(<2 x float> %a, <2 x i16> %b)
185;   ret <2 x float> %result
186; }
187
188; FIXME: Should be able to truncate to i32
189; define <2 x float> @test_ldexp_v2f32_v2i64(<2 x float> %a, <2 x i64> %b) {
190;   %result = call <2 x float> @llvm.ldexp.v2f32.v2i64(<2 x float> %a, <2 x i64> %b)
191;   ret <2 x float> %result
192; }
193
194define half @test_ldexp_f16_i8(half %a, i8 %b) {
195; GFX6-SDAG-LABEL: test_ldexp_f16_i8:
196; GFX6-SDAG:       ; %bb.0:
197; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
198; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
199; GFX6-SDAG-NEXT:    v_bfe_i32 v1, v1, 0, 8
200; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
201; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v1
202; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
203;
204; GFX8-SDAG-LABEL: test_ldexp_f16_i8:
205; GFX8-SDAG:       ; %bb.0:
206; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
207; GFX8-SDAG-NEXT:    v_ldexp_f16_sdwa v0, v0, sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
208; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
209;
210; GFX9-SDAG-LABEL: test_ldexp_f16_i8:
211; GFX9-SDAG:       ; %bb.0:
212; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
213; GFX9-SDAG-NEXT:    v_ldexp_f16_sdwa v0, v0, sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:DWORD src1_sel:BYTE_0
214; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
215;
216; GFX11-SDAG-TRUE16-LABEL: test_ldexp_f16_i8:
217; GFX11-SDAG-TRUE16:       ; %bb.0:
218; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
219; GFX11-SDAG-TRUE16-NEXT:    v_bfe_i32 v1, v1, 0, 8
220; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
221; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
222; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v0.h
223; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
224;
225; GFX11-SDAG-FAKE16-LABEL: test_ldexp_f16_i8:
226; GFX11-SDAG-FAKE16:       ; %bb.0:
227; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
228; GFX11-SDAG-FAKE16-NEXT:    v_bfe_i32 v1, v1, 0, 8
229; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
230; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
231; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
232;
233; GFX6-GISEL-LABEL: test_ldexp_f16_i8:
234; GFX6-GISEL:       ; %bb.0:
235; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
236; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
237; GFX6-GISEL-NEXT:    v_bfe_i32 v1, v1, 0, 8
238; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v1
239; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
240; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
241;
242; GFX8-GISEL-LABEL: test_ldexp_f16_i8:
243; GFX8-GISEL:       ; %bb.0:
244; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
245; GFX8-GISEL-NEXT:    v_bfe_i32 v1, v1, 0, 8
246; GFX8-GISEL-NEXT:    v_mov_b32_e32 v2, 0xffff8000
247; GFX8-GISEL-NEXT:    v_mov_b32_e32 v3, 0x7fff
248; GFX8-GISEL-NEXT:    v_med3_i32 v1, v1, v2, v3
249; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v0, v0, v1
250; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
251;
252; GFX9-GISEL-LABEL: test_ldexp_f16_i8:
253; GFX9-GISEL:       ; %bb.0:
254; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
255; GFX9-GISEL-NEXT:    v_bfe_i32 v1, v1, 0, 8
256; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0xffff8000
257; GFX9-GISEL-NEXT:    v_mov_b32_e32 v3, 0x7fff
258; GFX9-GISEL-NEXT:    v_med3_i32 v1, v1, v2, v3
259; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v0, v0, v1
260; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
261;
262; GFX11-GISEL-TRUE16-LABEL: test_ldexp_f16_i8:
263; GFX11-GISEL-TRUE16:       ; %bb.0:
264; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
265; GFX11-GISEL-TRUE16-NEXT:    v_bfe_i32 v1, v1, 0, 8
266; GFX11-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v2, 0x7fff
267; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
268; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v1, 0xffff8000, v1, v2
269; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v1.l
270; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
271;
272; GFX11-GISEL-FAKE16-LABEL: test_ldexp_f16_i8:
273; GFX11-GISEL-FAKE16:       ; %bb.0:
274; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
275; GFX11-GISEL-FAKE16-NEXT:    v_bfe_i32 v1, v1, 0, 8
276; GFX11-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v2, 0x7fff
277; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
278; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v1, 0xffff8000, v1, v2
279; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
280; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
281  %result = call half @llvm.ldexp.f16.i8(half %a, i8 %b)
282  ret half %result
283}
284
285define half @test_ldexp_f16_i16(half %a, i16 %b) {
286; GFX6-SDAG-LABEL: test_ldexp_f16_i16:
287; GFX6-SDAG:       ; %bb.0:
288; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
289; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
290; GFX6-SDAG-NEXT:    v_bfe_i32 v1, v1, 0, 16
291; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
292; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v1
293; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
294;
295; GFX8-LABEL: test_ldexp_f16_i16:
296; GFX8:       ; %bb.0:
297; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
298; GFX8-NEXT:    v_ldexp_f16_e32 v0, v0, v1
299; GFX8-NEXT:    s_setpc_b64 s[30:31]
300;
301; GFX9-LABEL: test_ldexp_f16_i16:
302; GFX9:       ; %bb.0:
303; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
304; GFX9-NEXT:    v_ldexp_f16_e32 v0, v0, v1
305; GFX9-NEXT:    s_setpc_b64 s[30:31]
306;
307; GFX11-SDAG-TRUE16-LABEL: test_ldexp_f16_i16:
308; GFX11-SDAG-TRUE16:       ; %bb.0:
309; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
310; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v0.h, v1.l
311; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
312; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v0.h
313; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
314;
315; GFX11-SDAG-FAKE16-LABEL: test_ldexp_f16_i16:
316; GFX11-SDAG-FAKE16:       ; %bb.0:
317; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
318; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
319; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
320;
321; GFX6-GISEL-LABEL: test_ldexp_f16_i16:
322; GFX6-GISEL:       ; %bb.0:
323; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
324; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
325; GFX6-GISEL-NEXT:    v_bfe_i32 v1, v1, 0, 16
326; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v1
327; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
328; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
329;
330; GFX11-GISEL-TRUE16-LABEL: test_ldexp_f16_i16:
331; GFX11-GISEL-TRUE16:       ; %bb.0:
332; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
333; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v1.l
334; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
335;
336; GFX11-GISEL-FAKE16-LABEL: test_ldexp_f16_i16:
337; GFX11-GISEL-FAKE16:       ; %bb.0:
338; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
339; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
340; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
341  %result = call half @llvm.ldexp.f16.i16(half %a, i16 %b)
342  ret half %result
343}
344
345define half @test_ldexp_f16_i32(half %a, i32 %b) {
346; GFX6-SDAG-LABEL: test_ldexp_f16_i32:
347; GFX6-SDAG:       ; %bb.0:
348; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
349; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
350; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
351; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v1
352; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
353;
354; GFX8-SDAG-LABEL: test_ldexp_f16_i32:
355; GFX8-SDAG:       ; %bb.0:
356; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
357; GFX8-SDAG-NEXT:    s_movk_i32 s4, 0x8000
358; GFX8-SDAG-NEXT:    v_mov_b32_e32 v2, 0x7fff
359; GFX8-SDAG-NEXT:    v_med3_i32 v1, v1, s4, v2
360; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v1
361; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
362;
363; GFX9-SDAG-LABEL: test_ldexp_f16_i32:
364; GFX9-SDAG:       ; %bb.0:
365; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
366; GFX9-SDAG-NEXT:    s_movk_i32 s4, 0x8000
367; GFX9-SDAG-NEXT:    v_mov_b32_e32 v2, 0x7fff
368; GFX9-SDAG-NEXT:    v_med3_i32 v1, v1, s4, v2
369; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v1
370; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
371;
372; GFX11-SDAG-TRUE16-LABEL: test_ldexp_f16_i32:
373; GFX11-SDAG-TRUE16:       ; %bb.0:
374; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
375; GFX11-SDAG-TRUE16-NEXT:    s_movk_i32 s0, 0x8000
376; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1)
377; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v1, v1, s0, 0x7fff
378; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v1.l
379; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
380;
381; GFX11-SDAG-FAKE16-LABEL: test_ldexp_f16_i32:
382; GFX11-SDAG-FAKE16:       ; %bb.0:
383; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
384; GFX11-SDAG-FAKE16-NEXT:    s_movk_i32 s0, 0x8000
385; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1)
386; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v1, v1, s0, 0x7fff
387; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
388; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
389;
390; GFX6-GISEL-LABEL: test_ldexp_f16_i32:
391; GFX6-GISEL:       ; %bb.0:
392; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
393; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
394; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v1
395; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
396; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
397;
398; GFX8-GISEL-LABEL: test_ldexp_f16_i32:
399; GFX8-GISEL:       ; %bb.0:
400; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
401; GFX8-GISEL-NEXT:    v_mov_b32_e32 v2, 0xffff8000
402; GFX8-GISEL-NEXT:    v_mov_b32_e32 v3, 0x7fff
403; GFX8-GISEL-NEXT:    v_med3_i32 v1, v1, v2, v3
404; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v0, v0, v1
405; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
406;
407; GFX9-GISEL-LABEL: test_ldexp_f16_i32:
408; GFX9-GISEL:       ; %bb.0:
409; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
410; GFX9-GISEL-NEXT:    v_mov_b32_e32 v2, 0xffff8000
411; GFX9-GISEL-NEXT:    v_mov_b32_e32 v3, 0x7fff
412; GFX9-GISEL-NEXT:    v_med3_i32 v1, v1, v2, v3
413; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v0, v0, v1
414; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
415;
416; GFX11-GISEL-TRUE16-LABEL: test_ldexp_f16_i32:
417; GFX11-GISEL-TRUE16:       ; %bb.0:
418; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
419; GFX11-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v2, 0x7fff
420; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
421; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v1, 0xffff8000, v1, v2
422; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v1.l
423; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
424;
425; GFX11-GISEL-FAKE16-LABEL: test_ldexp_f16_i32:
426; GFX11-GISEL-FAKE16:       ; %bb.0:
427; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
428; GFX11-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v2, 0x7fff
429; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
430; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v1, 0xffff8000, v1, v2
431; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
432; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
433  %result = call half @llvm.ldexp.f16.i32(half %a, i32 %b)
434  ret half %result
435}
436
437define <2 x half> @test_ldexp_v2f16_v2i32(<2 x half> %a, <2 x i32> %b) {
438; GFX6-SDAG-LABEL: test_ldexp_v2f16_v2i32:
439; GFX6-SDAG:       ; %bb.0:
440; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
441; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
442; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
443; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
444; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v1, v1
445; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v2
446; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v1, v3
447; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
448;
449; GFX8-SDAG-LABEL: test_ldexp_v2f16_v2i32:
450; GFX8-SDAG:       ; %bb.0:
451; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
452; GFX8-SDAG-NEXT:    s_movk_i32 s4, 0x8000
453; GFX8-SDAG-NEXT:    v_mov_b32_e32 v3, 0x7fff
454; GFX8-SDAG-NEXT:    v_med3_i32 v2, v2, s4, v3
455; GFX8-SDAG-NEXT:    v_med3_i32 v1, v1, s4, v3
456; GFX8-SDAG-NEXT:    v_ldexp_f16_sdwa v2, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
457; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v1
458; GFX8-SDAG-NEXT:    v_or_b32_e32 v0, v0, v2
459; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
460;
461; GFX9-SDAG-LABEL: test_ldexp_v2f16_v2i32:
462; GFX9-SDAG:       ; %bb.0:
463; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
464; GFX9-SDAG-NEXT:    s_movk_i32 s4, 0x8000
465; GFX9-SDAG-NEXT:    v_mov_b32_e32 v3, 0x7fff
466; GFX9-SDAG-NEXT:    v_med3_i32 v2, v2, s4, v3
467; GFX9-SDAG-NEXT:    v_med3_i32 v1, v1, s4, v3
468; GFX9-SDAG-NEXT:    v_ldexp_f16_sdwa v2, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
469; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v1
470; GFX9-SDAG-NEXT:    v_pack_b32_f16 v0, v0, v2
471; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
472;
473; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v2f16_v2i32:
474; GFX11-SDAG-TRUE16:       ; %bb.0:
475; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
476; GFX11-SDAG-TRUE16-NEXT:    s_movk_i32 s0, 0x8000
477; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
478; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v2, v2, s0, 0x7fff
479; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v1, v1, s0, 0x7fff
480; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
481; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v3.l, v2.l
482; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v1.l
483; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
484; GFX11-SDAG-TRUE16-NEXT:    v_pack_b32_f16 v0, v0.l, v0.h
485; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
486;
487; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v2f16_v2i32:
488; GFX11-SDAG-FAKE16:       ; %bb.0:
489; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
490; GFX11-SDAG-FAKE16-NEXT:    s_movk_i32 s0, 0x8000
491; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
492; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v2, v2, s0, 0x7fff
493; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v1, v1, s0, 0x7fff
494; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
495; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v3, v2
496; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
497; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
498; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v2
499; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
500;
501; GFX6-GISEL-LABEL: test_ldexp_v2f16_v2i32:
502; GFX6-GISEL:       ; %bb.0:
503; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
504; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
505; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v1, v1
506; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v2
507; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v1, v3
508; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
509; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v1, v1
510; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
511;
512; GFX8-GISEL-LABEL: test_ldexp_v2f16_v2i32:
513; GFX8-GISEL:       ; %bb.0:
514; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
515; GFX8-GISEL-NEXT:    v_mov_b32_e32 v3, 0xffff8000
516; GFX8-GISEL-NEXT:    v_mov_b32_e32 v4, 0x7fff
517; GFX8-GISEL-NEXT:    v_med3_i32 v1, v1, v3, v4
518; GFX8-GISEL-NEXT:    v_med3_i32 v2, v2, v3, v4
519; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v1, v0, v1
520; GFX8-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
521; GFX8-GISEL-NEXT:    v_or_b32_e32 v0, v1, v0
522; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
523;
524; GFX9-GISEL-LABEL: test_ldexp_v2f16_v2i32:
525; GFX9-GISEL:       ; %bb.0:
526; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
527; GFX9-GISEL-NEXT:    v_mov_b32_e32 v3, 0xffff8000
528; GFX9-GISEL-NEXT:    v_mov_b32_e32 v4, 0x7fff
529; GFX9-GISEL-NEXT:    v_med3_i32 v1, v1, v3, v4
530; GFX9-GISEL-NEXT:    v_med3_i32 v2, v2, v3, v4
531; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v1, v0, v1
532; GFX9-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
533; GFX9-GISEL-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
534; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
535;
536; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v2f16_v2i32:
537; GFX11-GISEL-TRUE16:       ; %bb.0:
538; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
539; GFX11-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v3, 0x7fff
540; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
541; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
542; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v1, 0xffff8000, v1, v3
543; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v2, 0xffff8000, v2, v3
544; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v1.l
545; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
546; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v4.l, v2.l
547; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v0.l
548; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
549; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
550; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v1, 0xffff, v1
551; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
552; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
553; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
554;
555; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v2f16_v2i32:
556; GFX11-GISEL-FAKE16:       ; %bb.0:
557; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
558; GFX11-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v3, 0x7fff
559; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
560; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
561; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v1, 0xffff8000, v1, v3
562; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v2, 0xffff8000, v2, v3
563; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
564; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
565; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v4, v2
566; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
567; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
568; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
569; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
570  %result = call <2 x half> @llvm.ldexp.v2f16.v2i32(<2 x half> %a, <2 x i32> %b)
571  ret <2 x half> %result
572}
573
574define <2 x half> @test_ldexp_v2f16_v2i16(<2 x half> %a, <2 x i16> %b) {
575; GFX6-SDAG-LABEL: test_ldexp_v2f16_v2i16:
576; GFX6-SDAG:       ; %bb.0:
577; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
578; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
579; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
580; GFX6-SDAG-NEXT:    v_bfe_i32 v3, v3, 0, 16
581; GFX6-SDAG-NEXT:    v_bfe_i32 v2, v2, 0, 16
582; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
583; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v1, v1
584; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v2
585; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v1, v3
586; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
587;
588; GFX8-SDAG-LABEL: test_ldexp_v2f16_v2i16:
589; GFX8-SDAG:       ; %bb.0:
590; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
591; GFX8-SDAG-NEXT:    v_ldexp_f16_sdwa v2, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
592; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v1
593; GFX8-SDAG-NEXT:    v_or_b32_e32 v0, v0, v2
594; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
595;
596; GFX9-SDAG-LABEL: test_ldexp_v2f16_v2i16:
597; GFX9-SDAG:       ; %bb.0:
598; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
599; GFX9-SDAG-NEXT:    v_ldexp_f16_sdwa v2, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
600; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v1
601; GFX9-SDAG-NEXT:    v_pack_b32_f16 v0, v0, v2
602; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
603;
604; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v2f16_v2i16:
605; GFX11-SDAG-TRUE16:       ; %bb.0:
606; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
607; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
608; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
609; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v1.l
610; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
611; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v3.l, v2.l
612; GFX11-SDAG-TRUE16-NEXT:    v_pack_b32_f16 v0, v0.l, v0.h
613; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
614;
615; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v2f16_v2i16:
616; GFX11-SDAG-FAKE16:       ; %bb.0:
617; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
618; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
619; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
620; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
621; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
622; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v3, v2
623; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v2
624; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
625;
626; GFX6-GISEL-LABEL: test_ldexp_v2f16_v2i16:
627; GFX6-GISEL:       ; %bb.0:
628; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
629; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
630; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v1, v1
631; GFX6-GISEL-NEXT:    v_bfe_i32 v2, v2, 0, 16
632; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v2
633; GFX6-GISEL-NEXT:    v_bfe_i32 v2, v3, 0, 16
634; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v1, v2
635; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
636; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v1, v1
637; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
638;
639; GFX8-GISEL-LABEL: test_ldexp_v2f16_v2i16:
640; GFX8-GISEL:       ; %bb.0:
641; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
642; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v2, v0, v1
643; GFX8-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v1 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
644; GFX8-GISEL-NEXT:    v_or_b32_e32 v0, v2, v0
645; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
646;
647; GFX9-GISEL-LABEL: test_ldexp_v2f16_v2i16:
648; GFX9-GISEL:       ; %bb.0:
649; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
650; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v2, v0, v1
651; GFX9-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
652; GFX9-GISEL-NEXT:    v_lshl_or_b32 v0, v0, 16, v2
653; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
654;
655; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v2f16_v2i16:
656; GFX11-GISEL-TRUE16:       ; %bb.0:
657; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
658; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
659; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v3, 16, v1
660; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v1.l
661; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
662; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v2.l, v3.l
663; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v0.l
664; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
665; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
666; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v1, 0xffff, v1
667; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
668; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
669; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
670;
671; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v2f16_v2i16:
672; GFX11-GISEL-FAKE16:       ; %bb.0:
673; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
674; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
675; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v3, 16, v1
676; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
677; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
678; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v2, v3
679; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
680; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
681; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
682; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
683  %result = call <2 x half> @llvm.ldexp.v2f16.v2i16(<2 x half> %a, <2 x i16> %b)
684  ret <2 x half> %result
685}
686
687define <3 x half> @test_ldexp_v3f16_v3i32(<3 x half> %a, <3 x i32> %b) {
688; GFX6-SDAG-LABEL: test_ldexp_v3f16_v3i32:
689; GFX6-SDAG:       ; %bb.0:
690; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
691; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
692; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
693; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v2, v2
694; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
695; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v1, v1
696; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v2, v2
697; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v3
698; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v1, v4
699; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v2, v2, v5
700; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
701;
702; GFX8-SDAG-LABEL: test_ldexp_v3f16_v3i32:
703; GFX8-SDAG:       ; %bb.0:
704; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
705; GFX8-SDAG-NEXT:    s_movk_i32 s4, 0x8000
706; GFX8-SDAG-NEXT:    v_mov_b32_e32 v5, 0x7fff
707; GFX8-SDAG-NEXT:    v_med3_i32 v2, v2, s4, v5
708; GFX8-SDAG-NEXT:    v_med3_i32 v3, v3, s4, v5
709; GFX8-SDAG-NEXT:    v_med3_i32 v4, v4, s4, v5
710; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v2, v0, v2
711; GFX8-SDAG-NEXT:    v_ldexp_f16_sdwa v0, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
712; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v4
713; GFX8-SDAG-NEXT:    v_or_b32_e32 v0, v2, v0
714; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
715;
716; GFX9-SDAG-LABEL: test_ldexp_v3f16_v3i32:
717; GFX9-SDAG:       ; %bb.0:
718; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
719; GFX9-SDAG-NEXT:    s_movk_i32 s4, 0x8000
720; GFX9-SDAG-NEXT:    v_mov_b32_e32 v5, 0x7fff
721; GFX9-SDAG-NEXT:    v_med3_i32 v3, v3, s4, v5
722; GFX9-SDAG-NEXT:    v_med3_i32 v2, v2, s4, v5
723; GFX9-SDAG-NEXT:    v_med3_i32 v4, v4, s4, v5
724; GFX9-SDAG-NEXT:    v_ldexp_f16_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
725; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v2
726; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v4
727; GFX9-SDAG-NEXT:    v_pack_b32_f16 v0, v0, v3
728; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
729;
730; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v3f16_v3i32:
731; GFX11-SDAG-TRUE16:       ; %bb.0:
732; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
733; GFX11-SDAG-TRUE16-NEXT:    s_movk_i32 s0, 0x8000
734; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v0
735; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v3, v3, s0, 0x7fff
736; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v2, v2, s0, 0x7fff
737; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v4, v4, s0, 0x7fff
738; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)
739; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v5.l, v3.l
740; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
741; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
742; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v1.l, v4.l
743; GFX11-SDAG-TRUE16-NEXT:    v_pack_b32_f16 v0, v0.l, v0.h
744; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
745;
746; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v3f16_v3i32:
747; GFX11-SDAG-FAKE16:       ; %bb.0:
748; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
749; GFX11-SDAG-FAKE16-NEXT:    s_movk_i32 s0, 0x8000
750; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v0
751; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v3, v3, s0, 0x7fff
752; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v2, v2, s0, 0x7fff
753; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
754; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v3, v5, v3
755; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
756; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v2, v4, s0, 0x7fff
757; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
758; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v3
759; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v2
760; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
761;
762; GFX6-GISEL-LABEL: test_ldexp_v3f16_v3i32:
763; GFX6-GISEL:       ; %bb.0:
764; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
765; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
766; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v1, v1
767; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v2, v2
768; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v3
769; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v1, v4
770; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v2, v2, v5
771; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
772; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v1, v1
773; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v2, v2
774; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
775;
776; GFX8-GISEL-LABEL: test_ldexp_v3f16_v3i32:
777; GFX8-GISEL:       ; %bb.0:
778; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
779; GFX8-GISEL-NEXT:    v_mov_b32_e32 v5, 0xffff8000
780; GFX8-GISEL-NEXT:    v_mov_b32_e32 v6, 0x7fff
781; GFX8-GISEL-NEXT:    v_med3_i32 v2, v2, v5, v6
782; GFX8-GISEL-NEXT:    v_med3_i32 v3, v3, v5, v6
783; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v2, v0, v2
784; GFX8-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
785; GFX8-GISEL-NEXT:    v_med3_i32 v3, v4, v5, v6
786; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v1, v1, v3
787; GFX8-GISEL-NEXT:    v_or_b32_e32 v0, v2, v0
788; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
789;
790; GFX9-GISEL-LABEL: test_ldexp_v3f16_v3i32:
791; GFX9-GISEL:       ; %bb.0:
792; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
793; GFX9-GISEL-NEXT:    v_mov_b32_e32 v5, 0xffff8000
794; GFX9-GISEL-NEXT:    v_mov_b32_e32 v6, 0x7fff
795; GFX9-GISEL-NEXT:    v_med3_i32 v2, v2, v5, v6
796; GFX9-GISEL-NEXT:    v_med3_i32 v3, v3, v5, v6
797; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v2, v0, v2
798; GFX9-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
799; GFX9-GISEL-NEXT:    v_med3_i32 v3, v4, v5, v6
800; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v1, v1, v3
801; GFX9-GISEL-NEXT:    v_lshl_or_b32 v0, v0, 16, v2
802; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
803;
804; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v3f16_v3i32:
805; GFX11-GISEL-TRUE16:       ; %bb.0:
806; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
807; GFX11-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v5, 0x7fff
808; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
809; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
810; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v2, 0xffff8000, v2, v5
811; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v3, 0xffff8000, v3, v5
812; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
813; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
814; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v6.l, v3.l
815; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v3, 0xffff8000, v4, v5
816; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v2.l, v0.l
817; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)
818; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
819; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v1.l, v3.l
820; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
821; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v2, 0xffff, v2
822; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v0, v0, 16, v2
823; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
824;
825; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v3f16_v3i32:
826; GFX11-GISEL-FAKE16:       ; %bb.0:
827; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
828; GFX11-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v5, 0x7fff
829; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
830; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
831; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v2, 0xffff8000, v2, v5
832; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v3, 0xffff8000, v3, v5
833; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
834; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
835; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v6, v3
836; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v3, 0xffff8000, v4, v5
837; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
838; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
839; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v3
840; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v0, v2, 16, v0
841; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
842  %result = call <3 x half> @llvm.ldexp.v3f16.v3i32(<3 x half> %a, <3 x i32> %b)
843  ret <3 x half> %result
844}
845
846define <3 x half> @test_ldexp_v3f16_v3i16(<3 x half> %a, <3 x i16> %b) {
847; GFX6-SDAG-LABEL: test_ldexp_v3f16_v3i16:
848; GFX6-SDAG:       ; %bb.0:
849; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
850; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v2, v2
851; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
852; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
853; GFX6-SDAG-NEXT:    v_bfe_i32 v5, v5, 0, 16
854; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v2, v2
855; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
856; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v1, v1
857; GFX6-SDAG-NEXT:    v_bfe_i32 v4, v4, 0, 16
858; GFX6-SDAG-NEXT:    v_bfe_i32 v3, v3, 0, 16
859; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v3
860; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v1, v4
861; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v2, v2, v5
862; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
863;
864; GFX8-SDAG-LABEL: test_ldexp_v3f16_v3i16:
865; GFX8-SDAG:       ; %bb.0:
866; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
867; GFX8-SDAG-NEXT:    v_ldexp_f16_sdwa v4, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
868; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v2
869; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v3
870; GFX8-SDAG-NEXT:    v_or_b32_e32 v0, v0, v4
871; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
872;
873; GFX9-SDAG-LABEL: test_ldexp_v3f16_v3i16:
874; GFX9-SDAG:       ; %bb.0:
875; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
876; GFX9-SDAG-NEXT:    v_ldexp_f16_sdwa v4, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
877; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v2
878; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v3
879; GFX9-SDAG-NEXT:    v_pack_b32_f16 v0, v0, v4
880; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
881;
882; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v3f16_v3i16:
883; GFX11-SDAG-TRUE16:       ; %bb.0:
884; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
885; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v2
886; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v0
887; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
888; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v1.l, v3.l
889; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
890; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v5.l, v4.l
891; GFX11-SDAG-TRUE16-NEXT:    v_pack_b32_f16 v0, v0.l, v0.h
892; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
893;
894; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v3f16_v3i16:
895; GFX11-SDAG-FAKE16:       ; %bb.0:
896; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
897; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v2
898; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v0
899; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
900; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v3
901; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
902; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v5, v4
903; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v2
904; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
905;
906; GFX6-GISEL-LABEL: test_ldexp_v3f16_v3i16:
907; GFX6-GISEL:       ; %bb.0:
908; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
909; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
910; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v1, v1
911; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v2, v2
912; GFX6-GISEL-NEXT:    v_bfe_i32 v3, v3, 0, 16
913; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v3
914; GFX6-GISEL-NEXT:    v_bfe_i32 v3, v4, 0, 16
915; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v1, v3
916; GFX6-GISEL-NEXT:    v_bfe_i32 v3, v5, 0, 16
917; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v2, v2, v3
918; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
919; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v1, v1
920; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v2, v2
921; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
922;
923; GFX8-GISEL-LABEL: test_ldexp_v3f16_v3i16:
924; GFX8-GISEL:       ; %bb.0:
925; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
926; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v4, v0, v2
927; GFX8-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
928; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v1, v1, v3
929; GFX8-GISEL-NEXT:    v_or_b32_e32 v0, v4, v0
930; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
931;
932; GFX9-GISEL-LABEL: test_ldexp_v3f16_v3i16:
933; GFX9-GISEL:       ; %bb.0:
934; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
935; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v4, v0, v2
936; GFX9-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
937; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v1, v1, v3
938; GFX9-GISEL-NEXT:    v_lshl_or_b32 v0, v0, 16, v4
939; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
940;
941; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v3f16_v3i16:
942; GFX11-GISEL-TRUE16:       ; %bb.0:
943; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
944; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
945; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
946; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
947; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v1.l, v3.l
948; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)
949; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v4.l, v5.l
950; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v2.l, v0.l
951; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
952; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
953; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v2, 0xffff, v2
954; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
955; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v0, v0, 16, v2
956; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
957;
958; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v3f16_v3i16:
959; GFX11-GISEL-FAKE16:       ; %bb.0:
960; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
961; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
962; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
963; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
964; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v3
965; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)
966; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v4, v5
967; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
968; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
969; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v0, v2, 16, v0
970; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
971  %result = call <3 x half> @llvm.ldexp.v3f16.v3i16(<3 x half> %a, <3 x i16> %b)
972  ret <3 x half> %result
973}
974
975define <4 x half> @test_ldexp_v4f16_v4i32(<4 x half> %a, <4 x i32> %b) {
976; GFX6-SDAG-LABEL: test_ldexp_v4f16_v4i32:
977; GFX6-SDAG:       ; %bb.0:
978; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
979; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
980; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
981; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v2, v2
982; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v3, v3
983; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
984; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v1, v1
985; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v2, v2
986; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v3, v3
987; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v4
988; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v1, v5
989; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v2, v2, v6
990; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v3, v3, v7
991; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
992;
993; GFX8-SDAG-LABEL: test_ldexp_v4f16_v4i32:
994; GFX8-SDAG:       ; %bb.0:
995; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
996; GFX8-SDAG-NEXT:    s_movk_i32 s4, 0x8000
997; GFX8-SDAG-NEXT:    v_mov_b32_e32 v6, 0x7fff
998; GFX8-SDAG-NEXT:    v_med3_i32 v4, v4, s4, v6
999; GFX8-SDAG-NEXT:    v_med3_i32 v5, v5, s4, v6
1000; GFX8-SDAG-NEXT:    v_med3_i32 v2, v2, s4, v6
1001; GFX8-SDAG-NEXT:    v_med3_i32 v3, v3, s4, v6
1002; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v4, v1, v4
1003; GFX8-SDAG-NEXT:    v_ldexp_f16_sdwa v1, v1, v5 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1004; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v2, v0, v2
1005; GFX8-SDAG-NEXT:    v_ldexp_f16_sdwa v0, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1006; GFX8-SDAG-NEXT:    v_or_b32_e32 v0, v2, v0
1007; GFX8-SDAG-NEXT:    v_or_b32_e32 v1, v4, v1
1008; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
1009;
1010; GFX9-SDAG-LABEL: test_ldexp_v4f16_v4i32:
1011; GFX9-SDAG:       ; %bb.0:
1012; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1013; GFX9-SDAG-NEXT:    s_movk_i32 s4, 0x8000
1014; GFX9-SDAG-NEXT:    v_mov_b32_e32 v6, 0x7fff
1015; GFX9-SDAG-NEXT:    v_med3_i32 v5, v5, s4, v6
1016; GFX9-SDAG-NEXT:    v_med3_i32 v4, v4, s4, v6
1017; GFX9-SDAG-NEXT:    v_med3_i32 v3, v3, s4, v6
1018; GFX9-SDAG-NEXT:    v_med3_i32 v2, v2, s4, v6
1019; GFX9-SDAG-NEXT:    v_ldexp_f16_sdwa v5, v1, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1020; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v4
1021; GFX9-SDAG-NEXT:    v_ldexp_f16_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1022; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1023; GFX9-SDAG-NEXT:    v_pack_b32_f16 v0, v0, v3
1024; GFX9-SDAG-NEXT:    v_pack_b32_f16 v1, v1, v5
1025; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
1026;
1027; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v4f16_v4i32:
1028; GFX11-SDAG-TRUE16:       ; %bb.0:
1029; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1030; GFX11-SDAG-TRUE16-NEXT:    s_movk_i32 s0, 0x8000
1031; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v1
1032; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v5, v5, s0, 0x7fff
1033; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v3, v3, s0, 0x7fff
1034; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v0
1035; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v2, v2, s0, 0x7fff
1036; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v4, v4, s0, 0x7fff
1037; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v1.h, v6.l, v5.l
1038; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1039; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v7.l, v3.l
1040; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
1041; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2)
1042; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v1.l, v4.l
1043; GFX11-SDAG-TRUE16-NEXT:    v_pack_b32_f16 v0, v0.l, v0.h
1044; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1045; GFX11-SDAG-TRUE16-NEXT:    v_pack_b32_f16 v1, v1.l, v1.h
1046; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
1047;
1048; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v4f16_v4i32:
1049; GFX11-SDAG-FAKE16:       ; %bb.0:
1050; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1051; GFX11-SDAG-FAKE16-NEXT:    s_movk_i32 s0, 0x8000
1052; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v1
1053; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v5, v5, s0, 0x7fff
1054; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v3, v3, s0, 0x7fff
1055; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v0
1056; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v2, v2, s0, 0x7fff
1057; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v4, v4, s0, 0x7fff
1058; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v5, v6, v5
1059; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1060; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v3, v7, v3
1061; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1062; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2)
1063; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v4
1064; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v3
1065; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1066; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v1, v1, v5
1067; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
1068;
1069; GFX6-GISEL-LABEL: test_ldexp_v4f16_v4i32:
1070; GFX6-GISEL:       ; %bb.0:
1071; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1072; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
1073; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v1, v1
1074; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v2, v2
1075; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v3, v3
1076; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v4
1077; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v1, v5
1078; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v2, v2, v6
1079; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v3, v3, v7
1080; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
1081; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v1, v1
1082; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v2, v2
1083; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v3, v3
1084; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
1085;
1086; GFX8-GISEL-LABEL: test_ldexp_v4f16_v4i32:
1087; GFX8-GISEL:       ; %bb.0:
1088; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1089; GFX8-GISEL-NEXT:    v_mov_b32_e32 v6, 0xffff8000
1090; GFX8-GISEL-NEXT:    v_mov_b32_e32 v7, 0x7fff
1091; GFX8-GISEL-NEXT:    v_med3_i32 v2, v2, v6, v7
1092; GFX8-GISEL-NEXT:    v_med3_i32 v3, v3, v6, v7
1093; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v2, v0, v2
1094; GFX8-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1095; GFX8-GISEL-NEXT:    v_med3_i32 v3, v4, v6, v7
1096; GFX8-GISEL-NEXT:    v_med3_i32 v4, v5, v6, v7
1097; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v3, v1, v3
1098; GFX8-GISEL-NEXT:    v_ldexp_f16_sdwa v1, v1, v4 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1099; GFX8-GISEL-NEXT:    v_or_b32_e32 v0, v2, v0
1100; GFX8-GISEL-NEXT:    v_or_b32_e32 v1, v3, v1
1101; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
1102;
1103; GFX9-GISEL-LABEL: test_ldexp_v4f16_v4i32:
1104; GFX9-GISEL:       ; %bb.0:
1105; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1106; GFX9-GISEL-NEXT:    v_mov_b32_e32 v6, 0xffff8000
1107; GFX9-GISEL-NEXT:    v_mov_b32_e32 v7, 0x7fff
1108; GFX9-GISEL-NEXT:    v_med3_i32 v2, v2, v6, v7
1109; GFX9-GISEL-NEXT:    v_med3_i32 v3, v3, v6, v7
1110; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v2, v0, v2
1111; GFX9-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1112; GFX9-GISEL-NEXT:    v_med3_i32 v3, v4, v6, v7
1113; GFX9-GISEL-NEXT:    v_med3_i32 v4, v5, v6, v7
1114; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v3, v1, v3
1115; GFX9-GISEL-NEXT:    v_ldexp_f16_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1116; GFX9-GISEL-NEXT:    v_lshl_or_b32 v0, v0, 16, v2
1117; GFX9-GISEL-NEXT:    v_lshl_or_b32 v1, v1, 16, v3
1118; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
1119;
1120; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v4f16_v4i32:
1121; GFX11-GISEL-TRUE16:       ; %bb.0:
1122; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1123; GFX11-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v6, 0x7fff
1124; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v0
1125; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v8, 16, v1
1126; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_4)
1127; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v2, 0xffff8000, v2, v6
1128; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v4, 0xffff8000, v4, v6
1129; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v3, 0xffff8000, v3, v6
1130; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v5, 0xffff8000, v5, v6
1131; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
1132; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1133; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v1.l, v4.l
1134; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v7.l, v3.l
1135; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1136; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v1.h, v8.l, v5.l
1137; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v2.l, v0.l
1138; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1139; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
1140; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v3.l, v1.l
1141; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1142; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v1.h
1143; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1144; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2)
1145; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v4, 0xffff, v0
1146; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v0, v3, 16, v2
1147; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1148; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v1, v1, 16, v4
1149; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
1150;
1151; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v4f16_v4i32:
1152; GFX11-GISEL-FAKE16:       ; %bb.0:
1153; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1154; GFX11-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v6, 0x7fff
1155; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v0
1156; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v8, 16, v1
1157; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_4)
1158; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v2, 0xffff8000, v2, v6
1159; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v4, 0xffff8000, v4, v6
1160; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v3, 0xffff8000, v3, v6
1161; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v5, 0xffff8000, v5, v6
1162; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1163; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1164; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v4
1165; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v7, v3
1166; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1167; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v3, v8, v5
1168; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1169; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2)
1170; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1171; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v0, v2, 16, v0
1172; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1173; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v1, v3, 16, v1
1174; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
1175  %result = call <4 x half> @llvm.ldexp.v4f16.v4i32(<4 x half> %a, <4 x i32> %b)
1176  ret <4 x half> %result
1177}
1178
1179define <4 x half> @test_ldexp_v4f16_v4i16(<4 x half> %a, <4 x i16> %b) {
1180; GFX6-SDAG-LABEL: test_ldexp_v4f16_v4i16:
1181; GFX6-SDAG:       ; %bb.0:
1182; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1183; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v3, v3
1184; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v2, v2
1185; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1186; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
1187; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v3, v3
1188; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v2, v2
1189; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
1190; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v1, v1
1191; GFX6-SDAG-NEXT:    v_bfe_i32 v7, v7, 0, 16
1192; GFX6-SDAG-NEXT:    v_bfe_i32 v6, v6, 0, 16
1193; GFX6-SDAG-NEXT:    v_bfe_i32 v5, v5, 0, 16
1194; GFX6-SDAG-NEXT:    v_bfe_i32 v4, v4, 0, 16
1195; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v4
1196; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v1, v5
1197; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v2, v2, v6
1198; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v3, v3, v7
1199; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
1200;
1201; GFX8-SDAG-LABEL: test_ldexp_v4f16_v4i16:
1202; GFX8-SDAG:       ; %bb.0:
1203; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1204; GFX8-SDAG-NEXT:    v_ldexp_f16_sdwa v4, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1205; GFX8-SDAG-NEXT:    v_ldexp_f16_sdwa v5, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1206; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v3
1207; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1208; GFX8-SDAG-NEXT:    v_or_b32_e32 v0, v0, v5
1209; GFX8-SDAG-NEXT:    v_or_b32_e32 v1, v1, v4
1210; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
1211;
1212; GFX9-SDAG-LABEL: test_ldexp_v4f16_v4i16:
1213; GFX9-SDAG:       ; %bb.0:
1214; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1215; GFX9-SDAG-NEXT:    v_ldexp_f16_sdwa v4, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1216; GFX9-SDAG-NEXT:    v_ldexp_f16_sdwa v5, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1217; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v3
1218; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1219; GFX9-SDAG-NEXT:    v_pack_b32_f16 v0, v0, v5
1220; GFX9-SDAG-NEXT:    v_pack_b32_f16 v1, v1, v4
1221; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
1222;
1223; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v4f16_v4i16:
1224; GFX11-SDAG-TRUE16:       ; %bb.0:
1225; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1226; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v3
1227; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
1228; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
1229; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v1
1230; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v1.l, v3.l
1231; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
1232; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1233; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v6.l, v5.l
1234; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v1.h, v7.l, v4.l
1235; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1236; GFX11-SDAG-TRUE16-NEXT:    v_pack_b32_f16 v0, v0.l, v0.h
1237; GFX11-SDAG-TRUE16-NEXT:    v_pack_b32_f16 v1, v1.l, v1.h
1238; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
1239;
1240; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v4f16_v4i16:
1241; GFX11-SDAG-FAKE16:       ; %bb.0:
1242; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1243; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v3
1244; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
1245; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
1246; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v1
1247; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v3
1248; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1249; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1250; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v6, v5
1251; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v3, v7, v4
1252; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1253; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v2
1254; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v1, v1, v3
1255; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
1256;
1257; GFX6-GISEL-LABEL: test_ldexp_v4f16_v4i16:
1258; GFX6-GISEL:       ; %bb.0:
1259; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1260; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
1261; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v1, v1
1262; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v2, v2
1263; GFX6-GISEL-NEXT:    v_bfe_i32 v4, v4, 0, 16
1264; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v3, v3
1265; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v4
1266; GFX6-GISEL-NEXT:    v_bfe_i32 v4, v5, 0, 16
1267; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v1, v4
1268; GFX6-GISEL-NEXT:    v_bfe_i32 v4, v6, 0, 16
1269; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v2, v2, v4
1270; GFX6-GISEL-NEXT:    v_bfe_i32 v4, v7, 0, 16
1271; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v3, v3, v4
1272; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
1273; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v1, v1
1274; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v2, v2
1275; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v3, v3
1276; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
1277;
1278; GFX8-GISEL-LABEL: test_ldexp_v4f16_v4i16:
1279; GFX8-GISEL:       ; %bb.0:
1280; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1281; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v4, v0, v2
1282; GFX8-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v2 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1283; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v2, v1, v3
1284; GFX8-GISEL-NEXT:    v_ldexp_f16_sdwa v1, v1, v3 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1285; GFX8-GISEL-NEXT:    v_or_b32_e32 v0, v4, v0
1286; GFX8-GISEL-NEXT:    v_or_b32_e32 v1, v2, v1
1287; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
1288;
1289; GFX9-GISEL-LABEL: test_ldexp_v4f16_v4i16:
1290; GFX9-GISEL:       ; %bb.0:
1291; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1292; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v4, v0, v2
1293; GFX9-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1294; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v2, v1, v3
1295; GFX9-GISEL-NEXT:    v_ldexp_f16_sdwa v1, v1, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1296; GFX9-GISEL-NEXT:    v_lshl_or_b32 v0, v0, 16, v4
1297; GFX9-GISEL-NEXT:    v_lshl_or_b32 v1, v1, 16, v2
1298; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
1299;
1300; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v4f16_v4i16:
1301; GFX11-GISEL-TRUE16:       ; %bb.0:
1302; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1303; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
1304; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v1
1305; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v2
1306; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v3
1307; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
1308; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v1.l, v3.l
1309; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1310; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v4.l, v6.l
1311; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v1.h, v5.l, v7.l
1312; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1313; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v2.l, v0.l
1314; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
1315; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1316; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v3.l, v1.l
1317; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v1.h
1318; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1319; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1320; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v4, 0xffff, v0
1321; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1322; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v0, v3, 16, v2
1323; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v1, v1, 16, v4
1324; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
1325;
1326; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v4f16_v4i16:
1327; GFX11-GISEL-FAKE16:       ; %bb.0:
1328; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1329; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
1330; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v1
1331; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v2
1332; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v3
1333; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1334; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v3
1335; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1336; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v4, v6
1337; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v3, v5, v7
1338; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1339; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1340; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1341; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1342; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v0, v2, 16, v0
1343; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v1, v3, 16, v1
1344; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
1345  %result = call <4 x half> @llvm.ldexp.v4f16.v4i16(<4 x half> %a, <4 x i16> %b)
1346  ret <4 x half> %result
1347}
1348
1349declare float @llvm.ldexp.f32.i32(float, i32) #0
1350declare float @llvm.ldexp.f32.i16(float, i16) #0
1351declare float @llvm.ldexp.f32.i64(float, i64) #0
1352declare half @llvm.ldexp.f16.i8(half, i8) #0
1353declare half @llvm.ldexp.f16.i16(half, i16) #0
1354declare half @llvm.ldexp.f16.i32(half, i32) #0
1355declare <2 x half> @llvm.ldexp.v2f16.v2i16(<2 x half>, <2 x i16>) #0
1356declare <2 x half> @llvm.ldexp.v2f16.v2i32(<2 x half>, <2 x i32>) #0
1357declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>) #0
1358declare <2 x float> @llvm.ldexp.v2f32.v2i16(<2 x float>, <2 x i16>) #0
1359declare <2 x float> @llvm.ldexp.v2f32.v2i64(<2 x float>, <2 x i64>) #0
1360declare <3 x float> @llvm.ldexp.v3f32.v3i32(<3 x float>, <3 x i32>) #0
1361declare <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float>, <4 x i32>) #0
1362declare double @llvm.ldexp.f64.i32(double, i32) #0
1363declare <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double>, <2 x i32>) #0
1364
1365attributes #0 = { nounwind readnone }
1366