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