@@ -153,9 +153,34 @@ define amdgpu_ps float @v_test_cvt_v2f64_v2bf16_v(<2 x double> %src) {
153
153
;
154
154
; GFX-950-LABEL: v_test_cvt_v2f64_v2bf16_v:
155
155
; 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
159
184
; GFX-950-NEXT: ; return to shader part epilog
160
185
%res = fptrunc <2 x double > %src to <2 x bfloat>
161
186
%cast = bitcast <2 x bfloat> %res to float
@@ -347,7 +372,18 @@ define amdgpu_ps void @fptrunc_f64_to_bf16(double %a, ptr %out) {
347
372
;
348
373
; GFX-950-LABEL: fptrunc_f64_to_bf16:
349
374
; 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
351
387
; GFX-950-NEXT: v_cvt_pk_bf16_f32 v0, v0, s0
352
388
; GFX-950-NEXT: flat_store_short v[2:3], v0
353
389
; GFX-950-NEXT: s_endpgm
@@ -385,7 +421,19 @@ define amdgpu_ps void @fptrunc_f64_to_bf16_neg(double %a, ptr %out) {
385
421
;
386
422
; GFX-950-LABEL: fptrunc_f64_to_bf16_neg:
387
423
; 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
389
437
; GFX-950-NEXT: v_cvt_pk_bf16_f32 v0, v0, s0
390
438
; GFX-950-NEXT: flat_store_short v[2:3], v0
391
439
; GFX-950-NEXT: s_endpgm
@@ -424,7 +472,19 @@ define amdgpu_ps void @fptrunc_f64_to_bf16_abs(double %a, ptr %out) {
424
472
;
425
473
; GFX-950-LABEL: fptrunc_f64_to_bf16_abs:
426
474
; 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
428
488
; GFX-950-NEXT: v_cvt_pk_bf16_f32 v0, v0, s0
429
489
; GFX-950-NEXT: flat_store_short v[2:3], v0
430
490
; GFX-950-NEXT: s_endpgm
0 commit comments