[clang] Fix crashes when passing VLA to va_arg (#119563)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / llvm.ldexp.ll
blob53c26cadbf75a6aee2f5335b70ab6c29b5ae409b
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
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
14 define 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]
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]
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]
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
42 define <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]
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]
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]
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
74 define <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]
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]
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]
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
110 define <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]
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]
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]
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
150 define 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
160 define <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
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 ; }
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 ; }
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 ; }
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 ; }
194 define 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]
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]
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]
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]
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]
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]
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]
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]
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]
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
285 define 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]
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]
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]
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]
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]
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]
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]
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
345 define 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]
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]
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]
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]
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]
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]
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]
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]
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]
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
437 define <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]
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]
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]
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_2) | instskip(NEXT) | instid1(VALU_DEP_1)
484 ; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v0.h
485 ; GFX11-SDAG-TRUE16-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
486 ; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
488 ; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v2f16_v2i32:
489 ; GFX11-SDAG-FAKE16:       ; %bb.0:
490 ; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
491 ; GFX11-SDAG-FAKE16-NEXT:    s_movk_i32 s0, 0x8000
492 ; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
493 ; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v2, v2, s0, 0x7fff
494 ; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v1, v1, s0, 0x7fff
495 ; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
496 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v3, v2
497 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
498 ; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
499 ; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v2
500 ; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
502 ; GFX6-GISEL-LABEL: test_ldexp_v2f16_v2i32:
503 ; GFX6-GISEL:       ; %bb.0:
504 ; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
505 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
506 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v1, v1
507 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v2
508 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v1, v3
509 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
510 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v1, v1
511 ; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
513 ; GFX8-GISEL-LABEL: test_ldexp_v2f16_v2i32:
514 ; GFX8-GISEL:       ; %bb.0:
515 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
516 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v3, 0xffff8000
517 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v4, 0x7fff
518 ; GFX8-GISEL-NEXT:    v_med3_i32 v1, v1, v3, v4
519 ; GFX8-GISEL-NEXT:    v_med3_i32 v2, v2, v3, v4
520 ; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v1, v0, v1
521 ; 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
522 ; GFX8-GISEL-NEXT:    v_or_b32_e32 v0, v1, v0
523 ; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
525 ; GFX9-GISEL-LABEL: test_ldexp_v2f16_v2i32:
526 ; GFX9-GISEL:       ; %bb.0:
527 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
528 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v3, 0xffff8000
529 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v4, 0x7fff
530 ; GFX9-GISEL-NEXT:    v_med3_i32 v1, v1, v3, v4
531 ; GFX9-GISEL-NEXT:    v_med3_i32 v2, v2, v3, v4
532 ; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v1, v0, v1
533 ; GFX9-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
534 ; GFX9-GISEL-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
535 ; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
537 ; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v2f16_v2i32:
538 ; GFX11-GISEL-TRUE16:       ; %bb.0:
539 ; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
540 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v3, 0x7fff
541 ; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
542 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
543 ; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v1, 0xffff8000, v1, v3
544 ; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v2, 0xffff8000, v2, v3
545 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v1.l
546 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
547 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v4.l, v2.l
548 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v0.l
549 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
550 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
551 ; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v1, 0xffff, v1
552 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
553 ; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
554 ; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
556 ; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v2f16_v2i32:
557 ; GFX11-GISEL-FAKE16:       ; %bb.0:
558 ; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
559 ; GFX11-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v3, 0x7fff
560 ; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
561 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
562 ; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v1, 0xffff8000, v1, v3
563 ; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v2, 0xffff8000, v2, v3
564 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
565 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
566 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v4, v2
567 ; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
568 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
569 ; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
570 ; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
571   %result = call <2 x half> @llvm.ldexp.v2f16.v2i32(<2 x half> %a, <2 x i32> %b)
572   ret <2 x half> %result
575 define <2 x half> @test_ldexp_v2f16_v2i16(<2 x half> %a, <2 x i16> %b) {
576 ; GFX6-SDAG-LABEL: test_ldexp_v2f16_v2i16:
577 ; GFX6-SDAG:       ; %bb.0:
578 ; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
579 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
580 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
581 ; GFX6-SDAG-NEXT:    v_bfe_i32 v3, v3, 0, 16
582 ; GFX6-SDAG-NEXT:    v_bfe_i32 v2, v2, 0, 16
583 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
584 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v1, v1
585 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v2
586 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v1, v3
587 ; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
589 ; GFX8-SDAG-LABEL: test_ldexp_v2f16_v2i16:
590 ; GFX8-SDAG:       ; %bb.0:
591 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
592 ; 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
593 ; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v1
594 ; GFX8-SDAG-NEXT:    v_or_b32_e32 v0, v0, v2
595 ; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
597 ; GFX9-SDAG-LABEL: test_ldexp_v2f16_v2i16:
598 ; GFX9-SDAG:       ; %bb.0:
599 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
600 ; 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
601 ; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v1
602 ; GFX9-SDAG-NEXT:    v_pack_b32_f16 v0, v0, v2
603 ; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
605 ; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v2f16_v2i16:
606 ; GFX11-SDAG-TRUE16:       ; %bb.0:
607 ; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
608 ; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
609 ; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
610 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v1.l
611 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
612 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v3.l, v2.l
613 ; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v0.h
614 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
615 ; GFX11-SDAG-TRUE16-NEXT:    v_perm_b32 v0, v1, v0, 0x5040100
616 ; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
618 ; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v2f16_v2i16:
619 ; GFX11-SDAG-FAKE16:       ; %bb.0:
620 ; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
621 ; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v2, 16, v1
622 ; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
623 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
624 ; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
625 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v3, v2
626 ; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v2
627 ; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
629 ; GFX6-GISEL-LABEL: test_ldexp_v2f16_v2i16:
630 ; GFX6-GISEL:       ; %bb.0:
631 ; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
632 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
633 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v1, v1
634 ; GFX6-GISEL-NEXT:    v_bfe_i32 v2, v2, 0, 16
635 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v2
636 ; GFX6-GISEL-NEXT:    v_bfe_i32 v2, v3, 0, 16
637 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v1, v2
638 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
639 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v1, v1
640 ; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
642 ; GFX8-GISEL-LABEL: test_ldexp_v2f16_v2i16:
643 ; GFX8-GISEL:       ; %bb.0:
644 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
645 ; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v2, v0, v1
646 ; 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
647 ; GFX8-GISEL-NEXT:    v_or_b32_e32 v0, v2, v0
648 ; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
650 ; GFX9-GISEL-LABEL: test_ldexp_v2f16_v2i16:
651 ; GFX9-GISEL:       ; %bb.0:
652 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
653 ; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v2, v0, v1
654 ; 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
655 ; GFX9-GISEL-NEXT:    v_lshl_or_b32 v0, v0, 16, v2
656 ; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
658 ; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v2f16_v2i16:
659 ; GFX11-GISEL-TRUE16:       ; %bb.0:
660 ; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
661 ; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
662 ; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v3, 16, v1
663 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v1.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_ldexp_f16_e32 v0.h, v2.l, v3.l
666 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v0.l
667 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
668 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
669 ; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v1, 0xffff, v1
670 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
671 ; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
672 ; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
674 ; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v2f16_v2i16:
675 ; GFX11-GISEL-FAKE16:       ; %bb.0:
676 ; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
677 ; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
678 ; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v3, 16, v1
679 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v1
680 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
681 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v2, v3
682 ; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
683 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
684 ; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v0, v1, 16, v0
685 ; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
686   %result = call <2 x half> @llvm.ldexp.v2f16.v2i16(<2 x half> %a, <2 x i16> %b)
687   ret <2 x half> %result
690 define <3 x half> @test_ldexp_v3f16_v3i32(<3 x half> %a, <3 x i32> %b) {
691 ; GFX6-SDAG-LABEL: test_ldexp_v3f16_v3i32:
692 ; GFX6-SDAG:       ; %bb.0:
693 ; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
694 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
695 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
696 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v2, v2
697 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
698 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v1, v1
699 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v2, v2
700 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v3
701 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v1, v4
702 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v2, v2, v5
703 ; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
705 ; GFX8-SDAG-LABEL: test_ldexp_v3f16_v3i32:
706 ; GFX8-SDAG:       ; %bb.0:
707 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
708 ; GFX8-SDAG-NEXT:    s_movk_i32 s4, 0x8000
709 ; GFX8-SDAG-NEXT:    v_mov_b32_e32 v5, 0x7fff
710 ; GFX8-SDAG-NEXT:    v_med3_i32 v2, v2, s4, v5
711 ; GFX8-SDAG-NEXT:    v_med3_i32 v3, v3, s4, v5
712 ; GFX8-SDAG-NEXT:    v_med3_i32 v4, v4, s4, v5
713 ; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v2, v0, v2
714 ; 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
715 ; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v4
716 ; GFX8-SDAG-NEXT:    v_or_b32_e32 v0, v2, v0
717 ; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
719 ; GFX9-SDAG-LABEL: test_ldexp_v3f16_v3i32:
720 ; GFX9-SDAG:       ; %bb.0:
721 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
722 ; GFX9-SDAG-NEXT:    s_movk_i32 s4, 0x8000
723 ; GFX9-SDAG-NEXT:    v_mov_b32_e32 v5, 0x7fff
724 ; GFX9-SDAG-NEXT:    v_med3_i32 v3, v3, s4, v5
725 ; GFX9-SDAG-NEXT:    v_med3_i32 v2, v2, s4, v5
726 ; GFX9-SDAG-NEXT:    v_med3_i32 v4, v4, s4, v5
727 ; GFX9-SDAG-NEXT:    v_ldexp_f16_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
728 ; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v2
729 ; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v4
730 ; GFX9-SDAG-NEXT:    v_pack_b32_f16 v0, v0, v3
731 ; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
733 ; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v3f16_v3i32:
734 ; GFX11-SDAG-TRUE16:       ; %bb.0:
735 ; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
736 ; GFX11-SDAG-TRUE16-NEXT:    s_movk_i32 s0, 0x8000
737 ; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v0
738 ; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v3, v3, s0, 0x7fff
739 ; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v2, v2, s0, 0x7fff
740 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
741 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v5.l, v3.l
742 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
743 ; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v2, v4, s0, 0x7fff
744 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
745 ; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v3.l, v0.h
746 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v1.l, v2.l
747 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)
748 ; GFX11-SDAG-TRUE16-NEXT:    v_perm_b32 v0, v3, v0, 0x5040100
749 ; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
751 ; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v3f16_v3i32:
752 ; GFX11-SDAG-FAKE16:       ; %bb.0:
753 ; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
754 ; GFX11-SDAG-FAKE16-NEXT:    s_movk_i32 s0, 0x8000
755 ; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v0
756 ; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v3, v3, s0, 0x7fff
757 ; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v2, v2, s0, 0x7fff
758 ; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
759 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v3, v5, v3
760 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
761 ; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v2, v4, s0, 0x7fff
762 ; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
763 ; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v3
764 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v2
765 ; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
767 ; GFX6-GISEL-LABEL: test_ldexp_v3f16_v3i32:
768 ; GFX6-GISEL:       ; %bb.0:
769 ; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
770 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
771 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v1, v1
772 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v2, v2
773 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v3
774 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v1, v4
775 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v2, v2, v5
776 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
777 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v1, v1
778 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v2, v2
779 ; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
781 ; GFX8-GISEL-LABEL: test_ldexp_v3f16_v3i32:
782 ; GFX8-GISEL:       ; %bb.0:
783 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
784 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v5, 0xffff8000
785 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v6, 0x7fff
786 ; GFX8-GISEL-NEXT:    v_med3_i32 v2, v2, v5, v6
787 ; GFX8-GISEL-NEXT:    v_med3_i32 v3, v3, v5, v6
788 ; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v2, v0, v2
789 ; 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
790 ; GFX8-GISEL-NEXT:    v_med3_i32 v3, v4, v5, v6
791 ; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v1, v1, v3
792 ; GFX8-GISEL-NEXT:    v_or_b32_e32 v0, v2, v0
793 ; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
795 ; GFX9-GISEL-LABEL: test_ldexp_v3f16_v3i32:
796 ; GFX9-GISEL:       ; %bb.0:
797 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
798 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v5, 0xffff8000
799 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v6, 0x7fff
800 ; GFX9-GISEL-NEXT:    v_med3_i32 v2, v2, v5, v6
801 ; GFX9-GISEL-NEXT:    v_med3_i32 v3, v3, v5, v6
802 ; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v2, v0, v2
803 ; GFX9-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
804 ; GFX9-GISEL-NEXT:    v_med3_i32 v3, v4, v5, v6
805 ; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v1, v1, v3
806 ; GFX9-GISEL-NEXT:    v_lshl_or_b32 v0, v0, 16, v2
807 ; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
809 ; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v3f16_v3i32:
810 ; GFX11-GISEL-TRUE16:       ; %bb.0:
811 ; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
812 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v5, 0x7fff
813 ; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
814 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
815 ; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v2, 0xffff8000, v2, v5
816 ; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v3, 0xffff8000, v3, v5
817 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
818 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
819 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v6.l, v3.l
820 ; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v3, 0xffff8000, v4, v5
821 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v2.l, v0.l
822 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)
823 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
824 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v1.l, v3.l
825 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
826 ; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v2, 0xffff, v2
827 ; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v0, v0, 16, v2
828 ; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
830 ; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v3f16_v3i32:
831 ; GFX11-GISEL-FAKE16:       ; %bb.0:
832 ; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
833 ; GFX11-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v5, 0x7fff
834 ; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
835 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
836 ; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v2, 0xffff8000, v2, v5
837 ; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v3, 0xffff8000, v3, v5
838 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
839 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
840 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v6, v3
841 ; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v3, 0xffff8000, v4, v5
842 ; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
843 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
844 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v3
845 ; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v0, v2, 16, v0
846 ; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
847   %result = call <3 x half> @llvm.ldexp.v3f16.v3i32(<3 x half> %a, <3 x i32> %b)
848   ret <3 x half> %result
851 define <3 x half> @test_ldexp_v3f16_v3i16(<3 x half> %a, <3 x i16> %b) {
852 ; GFX6-SDAG-LABEL: test_ldexp_v3f16_v3i16:
853 ; GFX6-SDAG:       ; %bb.0:
854 ; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
855 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v2, v2
856 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
857 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
858 ; GFX6-SDAG-NEXT:    v_bfe_i32 v5, v5, 0, 16
859 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v2, v2
860 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
861 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v1, v1
862 ; GFX6-SDAG-NEXT:    v_bfe_i32 v4, v4, 0, 16
863 ; GFX6-SDAG-NEXT:    v_bfe_i32 v3, v3, 0, 16
864 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v3
865 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v1, v4
866 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v2, v2, v5
867 ; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
869 ; GFX8-SDAG-LABEL: test_ldexp_v3f16_v3i16:
870 ; GFX8-SDAG:       ; %bb.0:
871 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
872 ; 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
873 ; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v2
874 ; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v3
875 ; GFX8-SDAG-NEXT:    v_or_b32_e32 v0, v0, v4
876 ; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
878 ; GFX9-SDAG-LABEL: test_ldexp_v3f16_v3i16:
879 ; GFX9-SDAG:       ; %bb.0:
880 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
881 ; 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
882 ; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v2
883 ; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v3
884 ; GFX9-SDAG-NEXT:    v_pack_b32_f16 v0, v0, v4
885 ; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
887 ; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v3f16_v3i16:
888 ; GFX11-SDAG-TRUE16:       ; %bb.0:
889 ; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
890 ; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v2
891 ; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v0
892 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
893 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v1.l, v3.l
894 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)
895 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v5.l, v4.l
896 ; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v2.l, v0.l
897 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
898 ; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
899 ; GFX11-SDAG-TRUE16-NEXT:    v_perm_b32 v0, v0, v2, 0x5040100
900 ; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
902 ; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v3f16_v3i16:
903 ; GFX11-SDAG-FAKE16:       ; %bb.0:
904 ; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
905 ; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v2
906 ; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v0
907 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
908 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v3
909 ; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
910 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v5, v4
911 ; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v2
912 ; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
914 ; GFX6-GISEL-LABEL: test_ldexp_v3f16_v3i16:
915 ; GFX6-GISEL:       ; %bb.0:
916 ; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
917 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
918 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v1, v1
919 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v2, v2
920 ; GFX6-GISEL-NEXT:    v_bfe_i32 v3, v3, 0, 16
921 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v3
922 ; GFX6-GISEL-NEXT:    v_bfe_i32 v3, v4, 0, 16
923 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v1, v3
924 ; GFX6-GISEL-NEXT:    v_bfe_i32 v3, v5, 0, 16
925 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v2, v2, v3
926 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
927 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v1, v1
928 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v2, v2
929 ; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
931 ; GFX8-GISEL-LABEL: test_ldexp_v3f16_v3i16:
932 ; GFX8-GISEL:       ; %bb.0:
933 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
934 ; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v4, v0, v2
935 ; 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
936 ; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v1, v1, v3
937 ; GFX8-GISEL-NEXT:    v_or_b32_e32 v0, v4, v0
938 ; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
940 ; GFX9-GISEL-LABEL: test_ldexp_v3f16_v3i16:
941 ; GFX9-GISEL:       ; %bb.0:
942 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
943 ; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v4, v0, v2
944 ; 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
945 ; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v1, v1, v3
946 ; GFX9-GISEL-NEXT:    v_lshl_or_b32 v0, v0, 16, v4
947 ; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
949 ; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v3f16_v3i16:
950 ; GFX11-GISEL-TRUE16:       ; %bb.0:
951 ; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
952 ; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
953 ; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
954 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
955 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v1.l, v3.l
956 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)
957 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v4.l, v5.l
958 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v2.l, v0.l
959 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
960 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
961 ; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v2, 0xffff, v2
962 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
963 ; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v0, v0, 16, v2
964 ; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
966 ; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v3f16_v3i16:
967 ; GFX11-GISEL-FAKE16:       ; %bb.0:
968 ; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
969 ; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
970 ; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
971 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
972 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v3
973 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)
974 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v4, v5
975 ; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
976 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
977 ; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v0, v2, 16, v0
978 ; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
979   %result = call <3 x half> @llvm.ldexp.v3f16.v3i16(<3 x half> %a, <3 x i16> %b)
980   ret <3 x half> %result
983 define <4 x half> @test_ldexp_v4f16_v4i32(<4 x half> %a, <4 x i32> %b) {
984 ; GFX6-SDAG-LABEL: test_ldexp_v4f16_v4i32:
985 ; GFX6-SDAG:       ; %bb.0:
986 ; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
987 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
988 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
989 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v2, v2
990 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v3, v3
991 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
992 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v1, v1
993 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v2, v2
994 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v3, v3
995 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v4
996 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v1, v5
997 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v2, v2, v6
998 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v3, v3, v7
999 ; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
1001 ; GFX8-SDAG-LABEL: test_ldexp_v4f16_v4i32:
1002 ; GFX8-SDAG:       ; %bb.0:
1003 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1004 ; GFX8-SDAG-NEXT:    s_movk_i32 s4, 0x8000
1005 ; GFX8-SDAG-NEXT:    v_mov_b32_e32 v6, 0x7fff
1006 ; GFX8-SDAG-NEXT:    v_med3_i32 v4, v4, s4, v6
1007 ; GFX8-SDAG-NEXT:    v_med3_i32 v5, v5, s4, v6
1008 ; GFX8-SDAG-NEXT:    v_med3_i32 v2, v2, s4, v6
1009 ; GFX8-SDAG-NEXT:    v_med3_i32 v3, v3, s4, v6
1010 ; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v4, v1, v4
1011 ; 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
1012 ; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v2, v0, v2
1013 ; 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
1014 ; GFX8-SDAG-NEXT:    v_or_b32_e32 v0, v2, v0
1015 ; GFX8-SDAG-NEXT:    v_or_b32_e32 v1, v4, v1
1016 ; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
1018 ; GFX9-SDAG-LABEL: test_ldexp_v4f16_v4i32:
1019 ; GFX9-SDAG:       ; %bb.0:
1020 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1021 ; GFX9-SDAG-NEXT:    s_movk_i32 s4, 0x8000
1022 ; GFX9-SDAG-NEXT:    v_mov_b32_e32 v6, 0x7fff
1023 ; GFX9-SDAG-NEXT:    v_med3_i32 v5, v5, s4, v6
1024 ; GFX9-SDAG-NEXT:    v_med3_i32 v4, v4, s4, v6
1025 ; GFX9-SDAG-NEXT:    v_med3_i32 v3, v3, s4, v6
1026 ; GFX9-SDAG-NEXT:    v_med3_i32 v2, v2, s4, v6
1027 ; GFX9-SDAG-NEXT:    v_ldexp_f16_sdwa v5, v1, v5 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1028 ; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v4
1029 ; GFX9-SDAG-NEXT:    v_ldexp_f16_sdwa v3, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1030 ; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1031 ; GFX9-SDAG-NEXT:    v_pack_b32_f16 v0, v0, v3
1032 ; GFX9-SDAG-NEXT:    v_pack_b32_f16 v1, v1, v5
1033 ; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
1035 ; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v4f16_v4i32:
1036 ; GFX11-SDAG-TRUE16:       ; %bb.0:
1037 ; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1038 ; GFX11-SDAG-TRUE16-NEXT:    s_movk_i32 s0, 0x8000
1039 ; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
1040 ; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v5, v5, s0, 0x7fff
1041 ; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v3, v3, s0, 0x7fff
1042 ; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v1
1043 ; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v2, v2, s0, 0x7fff
1044 ; GFX11-SDAG-TRUE16-NEXT:    v_med3_i32 v4, v4, s0, 0x7fff
1045 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1046 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v6.l, v3.l
1047 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v1.h, v7.l, v5.l
1048 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1049 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
1050 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v1.l, v4.l
1051 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1052 ; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v2.l, v0.h
1053 ; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v3.l, v1.h
1054 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1055 ; GFX11-SDAG-TRUE16-NEXT:    v_perm_b32 v0, v2, v0, 0x5040100
1056 ; GFX11-SDAG-TRUE16-NEXT:    v_perm_b32 v1, v3, v1, 0x5040100
1057 ; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
1059 ; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v4f16_v4i32:
1060 ; GFX11-SDAG-FAKE16:       ; %bb.0:
1061 ; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1062 ; GFX11-SDAG-FAKE16-NEXT:    s_movk_i32 s0, 0x8000
1063 ; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v1
1064 ; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v5, v5, s0, 0x7fff
1065 ; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v3, v3, s0, 0x7fff
1066 ; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v0
1067 ; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v2, v2, s0, 0x7fff
1068 ; GFX11-SDAG-FAKE16-NEXT:    v_med3_i32 v4, v4, s0, 0x7fff
1069 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v5, v6, v5
1070 ; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1071 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v3, v7, v3
1072 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1073 ; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2)
1074 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v4
1075 ; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v3
1076 ; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1077 ; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v1, v1, v5
1078 ; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
1080 ; GFX6-GISEL-LABEL: test_ldexp_v4f16_v4i32:
1081 ; GFX6-GISEL:       ; %bb.0:
1082 ; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1083 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
1084 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v1, v1
1085 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v2, v2
1086 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v3, v3
1087 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v4
1088 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v1, v5
1089 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v2, v2, v6
1090 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v3, v3, v7
1091 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
1092 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v1, v1
1093 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v2, v2
1094 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v3, v3
1095 ; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
1097 ; GFX8-GISEL-LABEL: test_ldexp_v4f16_v4i32:
1098 ; GFX8-GISEL:       ; %bb.0:
1099 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1100 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v6, 0xffff8000
1101 ; GFX8-GISEL-NEXT:    v_mov_b32_e32 v7, 0x7fff
1102 ; GFX8-GISEL-NEXT:    v_med3_i32 v2, v2, v6, v7
1103 ; GFX8-GISEL-NEXT:    v_med3_i32 v3, v3, v6, v7
1104 ; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v2, v0, v2
1105 ; 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
1106 ; GFX8-GISEL-NEXT:    v_med3_i32 v3, v4, v6, v7
1107 ; GFX8-GISEL-NEXT:    v_med3_i32 v4, v5, v6, v7
1108 ; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v3, v1, v3
1109 ; 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
1110 ; GFX8-GISEL-NEXT:    v_or_b32_e32 v0, v2, v0
1111 ; GFX8-GISEL-NEXT:    v_or_b32_e32 v1, v3, v1
1112 ; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
1114 ; GFX9-GISEL-LABEL: test_ldexp_v4f16_v4i32:
1115 ; GFX9-GISEL:       ; %bb.0:
1116 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1117 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v6, 0xffff8000
1118 ; GFX9-GISEL-NEXT:    v_mov_b32_e32 v7, 0x7fff
1119 ; GFX9-GISEL-NEXT:    v_med3_i32 v2, v2, v6, v7
1120 ; GFX9-GISEL-NEXT:    v_med3_i32 v3, v3, v6, v7
1121 ; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v2, v0, v2
1122 ; GFX9-GISEL-NEXT:    v_ldexp_f16_sdwa v0, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1123 ; GFX9-GISEL-NEXT:    v_med3_i32 v3, v4, v6, v7
1124 ; GFX9-GISEL-NEXT:    v_med3_i32 v4, v5, v6, v7
1125 ; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v3, v1, v3
1126 ; GFX9-GISEL-NEXT:    v_ldexp_f16_sdwa v1, v1, v4 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:DWORD
1127 ; GFX9-GISEL-NEXT:    v_lshl_or_b32 v0, v0, 16, v2
1128 ; GFX9-GISEL-NEXT:    v_lshl_or_b32 v1, v1, 16, v3
1129 ; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
1131 ; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v4f16_v4i32:
1132 ; GFX11-GISEL-TRUE16:       ; %bb.0:
1133 ; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1134 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v6, 0x7fff
1135 ; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v0
1136 ; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v8, 16, v1
1137 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_4)
1138 ; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v2, 0xffff8000, v2, v6
1139 ; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v4, 0xffff8000, v4, v6
1140 ; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v3, 0xffff8000, v3, v6
1141 ; GFX11-GISEL-TRUE16-NEXT:    v_med3_i32 v5, 0xffff8000, v5, v6
1142 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
1143 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1144 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v1.l, v4.l
1145 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v7.l, v3.l
1146 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1147 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v1.h, v8.l, v5.l
1148 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v2.l, v0.l
1149 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1150 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
1151 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v3.l, v1.l
1152 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1153 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v1.h
1154 ; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1155 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2)
1156 ; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v4, 0xffff, v0
1157 ; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v0, v3, 16, v2
1158 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1159 ; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v1, v1, 16, v4
1160 ; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
1162 ; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v4f16_v4i32:
1163 ; GFX11-GISEL-FAKE16:       ; %bb.0:
1164 ; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1165 ; GFX11-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v6, 0x7fff
1166 ; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v0
1167 ; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v8, 16, v1
1168 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_4)
1169 ; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v2, 0xffff8000, v2, v6
1170 ; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v4, 0xffff8000, v4, v6
1171 ; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v3, 0xffff8000, v3, v6
1172 ; GFX11-GISEL-FAKE16-NEXT:    v_med3_i32 v5, 0xffff8000, v5, v6
1173 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1174 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1175 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v4
1176 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v7, v3
1177 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1178 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v3, v8, v5
1179 ; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1180 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2)
1181 ; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1182 ; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v0, v2, 16, v0
1183 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1184 ; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v1, v3, 16, v1
1185 ; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
1186   %result = call <4 x half> @llvm.ldexp.v4f16.v4i32(<4 x half> %a, <4 x i32> %b)
1187   ret <4 x half> %result
1190 define <4 x half> @test_ldexp_v4f16_v4i16(<4 x half> %a, <4 x i16> %b) {
1191 ; GFX6-SDAG-LABEL: test_ldexp_v4f16_v4i16:
1192 ; GFX6-SDAG:       ; %bb.0:
1193 ; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1194 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v3, v3
1195 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v2, v2
1196 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v0, v0
1197 ; GFX6-SDAG-NEXT:    v_cvt_f16_f32_e32 v1, v1
1198 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v3, v3
1199 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v2, v2
1200 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v0, v0
1201 ; GFX6-SDAG-NEXT:    v_cvt_f32_f16_e32 v1, v1
1202 ; GFX6-SDAG-NEXT:    v_bfe_i32 v7, v7, 0, 16
1203 ; GFX6-SDAG-NEXT:    v_bfe_i32 v6, v6, 0, 16
1204 ; GFX6-SDAG-NEXT:    v_bfe_i32 v5, v5, 0, 16
1205 ; GFX6-SDAG-NEXT:    v_bfe_i32 v4, v4, 0, 16
1206 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v0, v4
1207 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v1, v5
1208 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v2, v2, v6
1209 ; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v3, v3, v7
1210 ; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
1212 ; GFX8-SDAG-LABEL: test_ldexp_v4f16_v4i16:
1213 ; GFX8-SDAG:       ; %bb.0:
1214 ; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1215 ; 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
1216 ; 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
1217 ; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v3
1218 ; GFX8-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1219 ; GFX8-SDAG-NEXT:    v_or_b32_e32 v0, v0, v5
1220 ; GFX8-SDAG-NEXT:    v_or_b32_e32 v1, v1, v4
1221 ; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
1223 ; GFX9-SDAG-LABEL: test_ldexp_v4f16_v4i16:
1224 ; GFX9-SDAG:       ; %bb.0:
1225 ; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1226 ; 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
1227 ; 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
1228 ; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v1, v1, v3
1229 ; GFX9-SDAG-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1230 ; GFX9-SDAG-NEXT:    v_pack_b32_f16 v0, v0, v5
1231 ; GFX9-SDAG-NEXT:    v_pack_b32_f16 v1, v1, v4
1232 ; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
1234 ; GFX11-SDAG-TRUE16-LABEL: test_ldexp_v4f16_v4i16:
1235 ; GFX11-SDAG-TRUE16:       ; %bb.0:
1236 ; GFX11-SDAG-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1237 ; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v3
1238 ; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
1239 ; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
1240 ; GFX11-SDAG-TRUE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v1
1241 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
1242 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v1.l, v3.l
1243 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1244 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v6.l, v5.l
1245 ; GFX11-SDAG-TRUE16-NEXT:    v_ldexp_f16_e32 v1.h, v7.l, v4.l
1246 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1247 ; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v2.l, v0.l
1248 ; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v3.l, v0.h
1249 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1250 ; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v1.l
1251 ; GFX11-SDAG-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v1.h
1252 ; GFX11-SDAG-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1253 ; GFX11-SDAG-TRUE16-NEXT:    v_perm_b32 v0, v0, v2, 0x5040100
1254 ; GFX11-SDAG-TRUE16-NEXT:    v_perm_b32 v1, v1, v3, 0x5040100
1255 ; GFX11-SDAG-TRUE16-NEXT:    s_setpc_b64 s[30:31]
1257 ; GFX11-SDAG-FAKE16-LABEL: test_ldexp_v4f16_v4i16:
1258 ; GFX11-SDAG-FAKE16:       ; %bb.0:
1259 ; GFX11-SDAG-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1260 ; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v3
1261 ; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v2
1262 ; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v0
1263 ; GFX11-SDAG-FAKE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v1
1264 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v3
1265 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1266 ; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1267 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v6, v5
1268 ; GFX11-SDAG-FAKE16-NEXT:    v_ldexp_f16_e32 v3, v7, v4
1269 ; GFX11-SDAG-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1270 ; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v0, v0, v2
1271 ; GFX11-SDAG-FAKE16-NEXT:    v_pack_b32_f16 v1, v1, v3
1272 ; GFX11-SDAG-FAKE16-NEXT:    s_setpc_b64 s[30:31]
1274 ; GFX6-GISEL-LABEL: test_ldexp_v4f16_v4i16:
1275 ; GFX6-GISEL:       ; %bb.0:
1276 ; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1277 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v0, v0
1278 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v1, v1
1279 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v2, v2
1280 ; GFX6-GISEL-NEXT:    v_bfe_i32 v4, v4, 0, 16
1281 ; GFX6-GISEL-NEXT:    v_cvt_f32_f16_e32 v3, v3
1282 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v0, v4
1283 ; GFX6-GISEL-NEXT:    v_bfe_i32 v4, v5, 0, 16
1284 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v1, v4
1285 ; GFX6-GISEL-NEXT:    v_bfe_i32 v4, v6, 0, 16
1286 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v2, v2, v4
1287 ; GFX6-GISEL-NEXT:    v_bfe_i32 v4, v7, 0, 16
1288 ; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v3, v3, v4
1289 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v0, v0
1290 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v1, v1
1291 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v2, v2
1292 ; GFX6-GISEL-NEXT:    v_cvt_f16_f32_e32 v3, v3
1293 ; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
1295 ; GFX8-GISEL-LABEL: test_ldexp_v4f16_v4i16:
1296 ; GFX8-GISEL:       ; %bb.0:
1297 ; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1298 ; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v4, v0, v2
1299 ; 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
1300 ; GFX8-GISEL-NEXT:    v_ldexp_f16_e32 v2, v1, v3
1301 ; 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
1302 ; GFX8-GISEL-NEXT:    v_or_b32_e32 v0, v4, v0
1303 ; GFX8-GISEL-NEXT:    v_or_b32_e32 v1, v2, v1
1304 ; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
1306 ; GFX9-GISEL-LABEL: test_ldexp_v4f16_v4i16:
1307 ; GFX9-GISEL:       ; %bb.0:
1308 ; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1309 ; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v4, v0, v2
1310 ; 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
1311 ; GFX9-GISEL-NEXT:    v_ldexp_f16_e32 v2, v1, v3
1312 ; 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
1313 ; GFX9-GISEL-NEXT:    v_lshl_or_b32 v0, v0, 16, v4
1314 ; GFX9-GISEL-NEXT:    v_lshl_or_b32 v1, v1, 16, v2
1315 ; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
1317 ; GFX11-GISEL-TRUE16-LABEL: test_ldexp_v4f16_v4i16:
1318 ; GFX11-GISEL-TRUE16:       ; %bb.0:
1319 ; GFX11-GISEL-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1320 ; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
1321 ; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v1
1322 ; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v2
1323 ; GFX11-GISEL-TRUE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v3
1324 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.l, v0.l, v2.l
1325 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v0.h, v1.l, v3.l
1326 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1327 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v1.l, v4.l, v6.l
1328 ; GFX11-GISEL-TRUE16-NEXT:    v_ldexp_f16_e32 v1.h, v5.l, v7.l
1329 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1330 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v2.l, v0.l
1331 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v0.l, v0.h
1332 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1333 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v3.l, v1.l
1334 ; GFX11-GISEL-TRUE16-NEXT:    v_mov_b16_e32 v1.l, v1.h
1335 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1336 ; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1337 ; GFX11-GISEL-TRUE16-NEXT:    v_and_b32_e32 v4, 0xffff, v0
1338 ; GFX11-GISEL-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1339 ; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v0, v3, 16, v2
1340 ; GFX11-GISEL-TRUE16-NEXT:    v_lshl_or_b32 v1, v1, 16, v4
1341 ; GFX11-GISEL-TRUE16-NEXT:    s_setpc_b64 s[30:31]
1343 ; GFX11-GISEL-FAKE16-LABEL: test_ldexp_v4f16_v4i16:
1344 ; GFX11-GISEL-FAKE16:       ; %bb.0:
1345 ; GFX11-GISEL-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1346 ; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
1347 ; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v5, 16, v1
1348 ; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v6, 16, v2
1349 ; GFX11-GISEL-FAKE16-NEXT:    v_lshrrev_b32_e32 v7, 16, v3
1350 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v0, v0, v2
1351 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v1, v1, v3
1352 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1353 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v2, v4, v6
1354 ; GFX11-GISEL-FAKE16-NEXT:    v_ldexp_f16_e32 v3, v5, v7
1355 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
1356 ; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1357 ; GFX11-GISEL-FAKE16-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1358 ; GFX11-GISEL-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
1359 ; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v0, v2, 16, v0
1360 ; GFX11-GISEL-FAKE16-NEXT:    v_lshl_or_b32 v1, v3, 16, v1
1361 ; GFX11-GISEL-FAKE16-NEXT:    s_setpc_b64 s[30:31]
1362   %result = call <4 x half> @llvm.ldexp.v4f16.v4i16(<4 x half> %a, <4 x i16> %b)
1363   ret <4 x half> %result
1366 declare float @llvm.ldexp.f32.i32(float, i32) #0
1367 declare float @llvm.ldexp.f32.i16(float, i16) #0
1368 declare float @llvm.ldexp.f32.i64(float, i64) #0
1369 declare half @llvm.ldexp.f16.i8(half, i8) #0
1370 declare half @llvm.ldexp.f16.i16(half, i16) #0
1371 declare half @llvm.ldexp.f16.i32(half, i32) #0
1372 declare <2 x half> @llvm.ldexp.v2f16.v2i16(<2 x half>, <2 x i16>) #0
1373 declare <2 x half> @llvm.ldexp.v2f16.v2i32(<2 x half>, <2 x i32>) #0
1374 declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>) #0
1375 declare <2 x float> @llvm.ldexp.v2f32.v2i16(<2 x float>, <2 x i16>) #0
1376 declare <2 x float> @llvm.ldexp.v2f32.v2i64(<2 x float>, <2 x i64>) #0
1377 declare <3 x float> @llvm.ldexp.v3f32.v3i32(<3 x float>, <3 x i32>) #0
1378 declare <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float>, <4 x i32>) #0
1379 declare double @llvm.ldexp.f64.i32(double, i32) #0
1380 declare <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double>, <2 x i32>) #0
1382 attributes #0 = { nounwind readnone }