@@ -153,9 +153,34 @@ define amdgpu_ps float @v_test_cvt_v2f64_v2bf16_v(<2 x double> %src) {
153153;
154154; GFX-950-LABEL: v_test_cvt_v2f64_v2bf16_v:
155155; GFX-950: ; %bb.0:
156- ; GFX-950-NEXT: v_cvt_f32_f64_e32 v2, v[2:3]
157- ; GFX-950-NEXT: v_cvt_f32_f64_e32 v0, v[0:1]
158- ; GFX-950-NEXT: v_cvt_pk_bf16_f32 v0, v0, v2
156+ ; GFX-950-NEXT: v_mov_b32_e32 v4, v3
157+ ; GFX-950-NEXT: v_and_b32_e32 v3, 0x7fffffff, v4
158+ ; GFX-950-NEXT: v_mov_b32_e32 v5, v1
159+ ; GFX-950-NEXT: v_cvt_f32_f64_e32 v1, v[2:3]
160+ ; GFX-950-NEXT: v_cvt_f64_f32_e32 v[6:7], v1
161+ ; GFX-950-NEXT: v_and_b32_e32 v8, 1, v1
162+ ; GFX-950-NEXT: v_cmp_gt_f64_e64 s[2:3], v[2:3], v[6:7]
163+ ; GFX-950-NEXT: v_cmp_nlg_f64_e32 vcc, v[2:3], v[6:7]
164+ ; GFX-950-NEXT: v_cmp_eq_u32_e64 s[0:1], 1, v8
165+ ; GFX-950-NEXT: v_cndmask_b32_e64 v2, -1, 1, s[2:3]
166+ ; GFX-950-NEXT: v_add_u32_e32 v2, v1, v2
167+ ; GFX-950-NEXT: s_or_b64 vcc, vcc, s[0:1]
168+ ; GFX-950-NEXT: v_cndmask_b32_e32 v1, v2, v1, vcc
169+ ; GFX-950-NEXT: s_brev_b32 s4, 1
170+ ; GFX-950-NEXT: v_and_or_b32 v4, v4, s4, v1
171+ ; GFX-950-NEXT: v_and_b32_e32 v1, 0x7fffffff, v5
172+ ; GFX-950-NEXT: v_cvt_f32_f64_e32 v6, v[0:1]
173+ ; GFX-950-NEXT: v_cvt_f64_f32_e32 v[2:3], v6
174+ ; GFX-950-NEXT: v_and_b32_e32 v7, 1, v6
175+ ; GFX-950-NEXT: v_cmp_gt_f64_e64 s[2:3], v[0:1], v[2:3]
176+ ; GFX-950-NEXT: v_cmp_nlg_f64_e32 vcc, v[0:1], v[2:3]
177+ ; GFX-950-NEXT: v_cmp_eq_u32_e64 s[0:1], 1, v7
178+ ; GFX-950-NEXT: v_cndmask_b32_e64 v0, -1, 1, s[2:3]
179+ ; GFX-950-NEXT: v_add_u32_e32 v0, v6, v0
180+ ; GFX-950-NEXT: s_or_b64 vcc, vcc, s[0:1]
181+ ; GFX-950-NEXT: v_cndmask_b32_e32 v0, v0, v6, vcc
182+ ; GFX-950-NEXT: v_and_or_b32 v0, v5, s4, v0
183+ ; GFX-950-NEXT: v_cvt_pk_bf16_f32 v0, v0, v4
159184; GFX-950-NEXT: ; return to shader part epilog
160185 %res = fptrunc <2 x double > %src to <2 x bfloat>
161186 %cast = bitcast <2 x bfloat> %res to float
@@ -347,7 +372,18 @@ define amdgpu_ps void @fptrunc_f64_to_bf16(double %a, ptr %out) {
347372;
348373; GFX-950-LABEL: fptrunc_f64_to_bf16:
349374; GFX-950: ; %bb.0: ; %entry
350- ; GFX-950-NEXT: v_cvt_f32_f64_e32 v0, v[0:1]
375+ ; GFX-950-NEXT: v_cvt_f32_f64_e64 v6, |v[0:1]|
376+ ; GFX-950-NEXT: v_cvt_f64_f32_e32 v[4:5], v6
377+ ; GFX-950-NEXT: v_and_b32_e32 v7, 1, v6
378+ ; GFX-950-NEXT: v_cmp_gt_f64_e64 s[2:3], |v[0:1]|, v[4:5]
379+ ; GFX-950-NEXT: v_cmp_nlg_f64_e64 s[0:1], |v[0:1]|, v[4:5]
380+ ; GFX-950-NEXT: v_cmp_eq_u32_e32 vcc, 1, v7
381+ ; GFX-950-NEXT: v_cndmask_b32_e64 v0, -1, 1, s[2:3]
382+ ; GFX-950-NEXT: v_add_u32_e32 v0, v6, v0
383+ ; GFX-950-NEXT: s_or_b64 vcc, s[0:1], vcc
384+ ; GFX-950-NEXT: v_cndmask_b32_e32 v0, v0, v6, vcc
385+ ; GFX-950-NEXT: s_brev_b32 s0, 1
386+ ; GFX-950-NEXT: v_and_or_b32 v0, v1, s0, v0
351387; GFX-950-NEXT: v_cvt_pk_bf16_f32 v0, v0, s0
352388; GFX-950-NEXT: flat_store_short v[2:3], v0
353389; GFX-950-NEXT: s_endpgm
@@ -385,7 +421,19 @@ define amdgpu_ps void @fptrunc_f64_to_bf16_neg(double %a, ptr %out) {
385421;
386422; GFX-950-LABEL: fptrunc_f64_to_bf16_neg:
387423; GFX-950: ; %bb.0: ; %entry
388- ; GFX-950-NEXT: v_cvt_f32_f64_e64 v0, -v[0:1]
424+ ; GFX-950-NEXT: v_cvt_f32_f64_e64 v7, |v[0:1]|
425+ ; GFX-950-NEXT: v_cvt_f64_f32_e32 v[4:5], v7
426+ ; GFX-950-NEXT: v_and_b32_e32 v8, 1, v7
427+ ; GFX-950-NEXT: v_cmp_gt_f64_e64 s[2:3], |v[0:1]|, v[4:5]
428+ ; GFX-950-NEXT: v_cmp_nlg_f64_e64 s[0:1], |v[0:1]|, v[4:5]
429+ ; GFX-950-NEXT: v_cmp_eq_u32_e32 vcc, 1, v8
430+ ; GFX-950-NEXT: v_cndmask_b32_e64 v0, -1, 1, s[2:3]
431+ ; GFX-950-NEXT: v_add_u32_e32 v0, v7, v0
432+ ; GFX-950-NEXT: s_or_b64 vcc, s[0:1], vcc
433+ ; GFX-950-NEXT: s_brev_b32 s4, 1
434+ ; GFX-950-NEXT: v_xor_b32_e32 v6, 0x80000000, v1
435+ ; GFX-950-NEXT: v_cndmask_b32_e32 v0, v0, v7, vcc
436+ ; GFX-950-NEXT: v_and_or_b32 v0, v6, s4, v0
389437; GFX-950-NEXT: v_cvt_pk_bf16_f32 v0, v0, s0
390438; GFX-950-NEXT: flat_store_short v[2:3], v0
391439; GFX-950-NEXT: s_endpgm
@@ -424,7 +472,19 @@ define amdgpu_ps void @fptrunc_f64_to_bf16_abs(double %a, ptr %out) {
424472;
425473; GFX-950-LABEL: fptrunc_f64_to_bf16_abs:
426474; GFX-950: ; %bb.0: ; %entry
427- ; GFX-950-NEXT: v_cvt_f32_f64_e64 v0, |v[0:1]|
475+ ; GFX-950-NEXT: v_cvt_f32_f64_e64 v7, |v[0:1]|
476+ ; GFX-950-NEXT: v_cvt_f64_f32_e32 v[4:5], v7
477+ ; GFX-950-NEXT: v_and_b32_e32 v8, 1, v7
478+ ; GFX-950-NEXT: v_cmp_gt_f64_e64 s[2:3], |v[0:1]|, v[4:5]
479+ ; GFX-950-NEXT: v_cmp_nlg_f64_e64 s[0:1], |v[0:1]|, v[4:5]
480+ ; GFX-950-NEXT: v_cmp_eq_u32_e32 vcc, 1, v8
481+ ; GFX-950-NEXT: v_cndmask_b32_e64 v0, -1, 1, s[2:3]
482+ ; GFX-950-NEXT: v_add_u32_e32 v0, v7, v0
483+ ; GFX-950-NEXT: s_or_b64 vcc, s[0:1], vcc
484+ ; GFX-950-NEXT: v_and_b32_e32 v6, 0x7fffffff, v1
485+ ; GFX-950-NEXT: v_cndmask_b32_e32 v0, v0, v7, vcc
486+ ; GFX-950-NEXT: s_brev_b32 s0, 1
487+ ; GFX-950-NEXT: v_and_or_b32 v0, v6, s0, v0
428488; GFX-950-NEXT: v_cvt_pk_bf16_f32 v0, v0, s0
429489; GFX-950-NEXT: flat_store_short v[2:3], v0
430490; GFX-950-NEXT: s_endpgm
0 commit comments