| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc -global-isel=1 -mtriple=amdgpu9.00 -amdgpu-enable-delay-alu=0 -o - %s | FileCheck -check-prefix=GFX9 %s | |
| ; RUN: llc -global-isel=1 -mtriple=amdgpu12.50 -amdgpu-enable-delay-alu=0 -o - %s | FileCheck -check-prefix=GFX1250 %s | |
| define amdgpu_ps i32 @fcmp_olt_bf16_vv(bfloat %a, bfloat %b) { | |
| ; GFX9-LABEL: fcmp_olt_bf16_vv: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v1, 16, v1 | |
| ; GFX9-NEXT: v_cmp_lt_f32_e32 vcc, v0, v1 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc | |
| ; GFX9-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX9-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: fcmp_olt_bf16_vv: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v0, 16, v0 :: v_dual_lshlrev_b32 v1, 16, v1 | |
| ; GFX1250-NEXT: v_cmp_lt_f32_e32 vcc_lo, v0, v1 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %cmp = fcmp olt bfloat %a, %b | |
| %r = zext i1 %cmp to i32 | |
| ret i32 %r | |
| } | |
| define amdgpu_ps i32 @fcmp_olt_bf16_ss(bfloat inreg %a, bfloat inreg %b) { | |
| ; GFX9-LABEL: fcmp_olt_bf16_ss: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_lshl_b32 s1, s1, 16 | |
| ; GFX9-NEXT: s_lshl_b32 s0, s0, 16 | |
| ; GFX9-NEXT: v_mov_b32_e32 v0, s1 | |
| ; GFX9-NEXT: v_cmp_lt_f32_e32 vcc, s0, v0 | |
| ; GFX9-NEXT: s_cmp_lg_u64 vcc, 0 | |
| ; GFX9-NEXT: s_cselect_b32 s0, 1, 0 | |
| ; GFX9-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: fcmp_olt_bf16_ss: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_lshl_b32 s0, s0, 16 | |
| ; GFX1250-NEXT: s_lshl_b32 s1, s1, 16 | |
| ; GFX1250-NEXT: s_cmp_lt_f32 s0, s1 | |
| ; GFX1250-NEXT: s_cselect_b32 s0, 1, 0 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %cmp = fcmp olt bfloat %a, %b | |
| %r = zext i1 %cmp to i32 | |
| ret i32 %r | |
| } | |
| define amdgpu_ps i32 @fcmp_oeq_bf16_vv(bfloat %a, bfloat %b) { | |
| ; GFX9-LABEL: fcmp_oeq_bf16_vv: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v1, 16, v1 | |
| ; GFX9-NEXT: v_cmp_eq_f32_e32 vcc, v0, v1 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc | |
| ; GFX9-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX9-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: fcmp_oeq_bf16_vv: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v0, 16, v0 :: v_dual_lshlrev_b32 v1, 16, v1 | |
| ; GFX1250-NEXT: v_cmp_eq_f32_e32 vcc_lo, v0, v1 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %cmp = fcmp oeq bfloat %a, %b | |
| %r = zext i1 %cmp to i32 | |
| ret i32 %r | |
| } | |
| define amdgpu_ps i32 @fcmp_une_bf16_vv(bfloat %a, bfloat %b) { | |
| ; GFX9-LABEL: fcmp_une_bf16_vv: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v1, 16, v1 | |
| ; GFX9-NEXT: v_cmp_neq_f32_e32 vcc, v0, v1 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc | |
| ; GFX9-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX9-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: fcmp_une_bf16_vv: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v0, 16, v0 :: v_dual_lshlrev_b32 v1, 16, v1 | |
| ; GFX1250-NEXT: v_cmp_neq_f32_e32 vcc_lo, v0, v1 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %cmp = fcmp une bfloat %a, %b | |
| %r = zext i1 %cmp to i32 | |
| ret i32 %r | |
| } | |
| define amdgpu_ps i32 @fcmp_ord_bf16_vv(bfloat %a, bfloat %b) { | |
| ; GFX9-LABEL: fcmp_ord_bf16_vv: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v1, 16, v1 | |
| ; GFX9-NEXT: v_cmp_o_f32_e32 vcc, v0, v1 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc | |
| ; GFX9-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX9-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: fcmp_ord_bf16_vv: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v0, 16, v0 :: v_dual_lshlrev_b32 v1, 16, v1 | |
| ; GFX1250-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v1 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %cmp = fcmp ord bfloat %a, %b | |
| %r = zext i1 %cmp to i32 | |
| ret i32 %r | |
| } | |
| define amdgpu_ps i32 @fcmp_uno_bf16_ss(bfloat inreg %a, bfloat inreg %b) { | |
| ; GFX9-LABEL: fcmp_uno_bf16_ss: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_lshl_b32 s1, s1, 16 | |
| ; GFX9-NEXT: s_lshl_b32 s0, s0, 16 | |
| ; GFX9-NEXT: v_mov_b32_e32 v0, s1 | |
| ; GFX9-NEXT: v_cmp_u_f32_e32 vcc, s0, v0 | |
| ; GFX9-NEXT: s_cmp_lg_u64 vcc, 0 | |
| ; GFX9-NEXT: s_cselect_b32 s0, 1, 0 | |
| ; GFX9-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: fcmp_uno_bf16_ss: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_lshl_b32 s0, s0, 16 | |
| ; GFX1250-NEXT: s_lshl_b32 s1, s1, 16 | |
| ; GFX1250-NEXT: s_cmp_u_f32 s0, s1 | |
| ; GFX1250-NEXT: s_cselect_b32 s0, 1, 0 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %cmp = fcmp uno bfloat %a, %b | |
| %r = zext i1 %cmp to i32 | |
| ret i32 %r | |
| } | |
| define amdgpu_ps i32 @fcmp_uge_bf16_vs(bfloat %a, bfloat inreg %b) { | |
| ; GFX9-LABEL: fcmp_uge_bf16_vs: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 | |
| ; GFX9-NEXT: s_lshl_b32 s0, s0, 16 | |
| ; GFX9-NEXT: v_cmp_ngt_f32_e32 vcc, s0, v0 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc | |
| ; GFX9-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX9-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: fcmp_uge_bf16_vs: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_lshlrev_b32_e32 v0, 16, v0 | |
| ; GFX1250-NEXT: s_lshl_b32 s0, s0, 16 | |
| ; GFX1250-NEXT: v_cmp_ngt_f32_e32 vcc_lo, s0, v0 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %cmp = fcmp uge bfloat %a, %b | |
| %r = zext i1 %cmp to i32 | |
| ret i32 %r | |
| } | |
| define amdgpu_ps bfloat @fcmp_ogt_select_bf16_vv(bfloat %a, bfloat %b) { | |
| ; GFX9-LABEL: fcmp_ogt_select_bf16_vv: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v2, 16, v0 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v3, 16, v1 | |
| ; GFX9-NEXT: v_cmp_gt_f32_e32 vcc, v2, v3 | |
| ; GFX9-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc | |
| ; GFX9-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: fcmp_ogt_select_bf16_vv: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v2, 16, v0 :: v_dual_lshlrev_b32 v3, 16, v1 | |
| ; GFX1250-NEXT: v_cmp_gt_f32_e32 vcc_lo, v2, v3 | |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v0, v1, v0, vcc_lo | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %cmp = fcmp ogt bfloat %a, %b | |
| %r = select i1 %cmp, bfloat %a, bfloat %b | |
| ret bfloat %r | |
| } | |
| define amdgpu_ps <2 x i32> @fcmp_ogt_v2bf16_vv(<2 x bfloat> %a, <2 x bfloat> %b) { | |
| ; GFX9-LABEL: fcmp_ogt_v2bf16_vv: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: v_lshrrev_b32_e32 v2, 16, v0 | |
| ; GFX9-NEXT: v_lshrrev_b32_e32 v3, 16, v1 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v1, 16, v1 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v2, 16, v2 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v3, 16, v3 | |
| ; GFX9-NEXT: v_cmp_gt_f32_e32 vcc, v0, v1 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc | |
| ; GFX9-NEXT: v_cmp_gt_f32_e32 vcc, v2, v3 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v1, 0, 1, vcc | |
| ; GFX9-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX9-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX9-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: fcmp_ogt_v2bf16_vv: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b16_e32 v2.l, v0.h | |
| ; GFX1250-NEXT: v_mov_b16_e32 v3.l, v1.h | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v0, 16, v0 :: v_dual_lshlrev_b32 v1, 16, v1 | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v2, 16, v2 :: v_dual_lshlrev_b32 v3, 16, v3 | |
| ; GFX1250-NEXT: v_cmp_gt_f32_e32 vcc_lo, v0, v1 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_cmp_gt_f32_e32 vcc_lo, v2, v3 | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v1, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s1, v1 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %cmp = fcmp ogt <2 x bfloat> %a, %b | |
| %r = zext <2 x i1> %cmp to <2 x i32> | |
| ret <2 x i32> %r | |
| } | |
| define amdgpu_ps <2 x i32> @fcmp_ogt_v2bf16_ss(<2 x bfloat> inreg %a, <2 x bfloat> inreg %b) { | |
| ; GFX9-LABEL: fcmp_ogt_v2bf16_ss: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: s_lshr_b32 s3, s1, 16 | |
| ; GFX9-NEXT: s_lshl_b32 s1, s1, 16 | |
| ; GFX9-NEXT: s_lshr_b32 s2, s0, 16 | |
| ; GFX9-NEXT: s_lshl_b32 s0, s0, 16 | |
| ; GFX9-NEXT: v_mov_b32_e32 v0, s1 | |
| ; GFX9-NEXT: v_cmp_gt_f32_e32 vcc, s0, v0 | |
| ; GFX9-NEXT: s_cmp_lg_u64 vcc, 0 | |
| ; GFX9-NEXT: s_cselect_b32 s0, 1, 0 | |
| ; GFX9-NEXT: s_lshl_b32 s1, s2, 16 | |
| ; GFX9-NEXT: s_lshl_b32 s2, s3, 16 | |
| ; GFX9-NEXT: v_mov_b32_e32 v0, s2 | |
| ; GFX9-NEXT: v_cmp_gt_f32_e32 vcc, s1, v0 | |
| ; GFX9-NEXT: s_cmp_lg_u64 vcc, 0 | |
| ; GFX9-NEXT: s_cselect_b32 s1, 1, 0 | |
| ; GFX9-NEXT: s_cmp_lg_u32 s0, 0 | |
| ; GFX9-NEXT: s_cselect_b32 s0, 1, 0 | |
| ; GFX9-NEXT: s_cmp_lg_u32 s1, 0 | |
| ; GFX9-NEXT: s_cselect_b32 s1, 1, 0 | |
| ; GFX9-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: fcmp_ogt_v2bf16_ss: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: s_lshr_b32 s2, s0, 16 | |
| ; GFX1250-NEXT: s_lshl_b32 s0, s0, 16 | |
| ; GFX1250-NEXT: s_lshl_b32 s3, s1, 16 | |
| ; GFX1250-NEXT: s_lshr_b32 s1, s1, 16 | |
| ; GFX1250-NEXT: s_cmp_gt_f32 s0, s3 | |
| ; GFX1250-NEXT: s_cselect_b32 s0, 1, 0 | |
| ; GFX1250-NEXT: s_lshl_b32 s2, s2, 16 | |
| ; GFX1250-NEXT: s_lshl_b32 s1, s1, 16 | |
| ; GFX1250-NEXT: s_cmp_gt_f32 s2, s1 | |
| ; GFX1250-NEXT: s_cselect_b32 s1, 1, 0 | |
| ; GFX1250-NEXT: s_cmp_lg_u32 s0, 0 | |
| ; GFX1250-NEXT: s_cselect_b32 s0, 1, 0 | |
| ; GFX1250-NEXT: s_cmp_lg_u32 s1, 0 | |
| ; GFX1250-NEXT: s_cselect_b32 s1, 1, 0 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %cmp = fcmp ogt <2 x bfloat> %a, %b | |
| %r = zext <2 x i1> %cmp to <2 x i32> | |
| ret <2 x i32> %r | |
| } | |
| define amdgpu_ps <3 x i32> @fcmp_ole_v3bf16_vv(<3 x bfloat> %a, <3 x bfloat> %b) { | |
| ; GFX9-LABEL: fcmp_ole_v3bf16_vv: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: v_lshrrev_b32_e32 v4, 16, v0 | |
| ; GFX9-NEXT: v_lshrrev_b32_e32 v5, 16, v2 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v2, 16, v2 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v4, 16, v4 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v5, 16, v5 | |
| ; GFX9-NEXT: v_cmp_le_f32_e32 vcc, v0, v2 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v1, 16, v1 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v3, 16, v3 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc | |
| ; GFX9-NEXT: v_cmp_le_f32_e32 vcc, v4, v5 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc | |
| ; GFX9-NEXT: v_cmp_le_f32_e32 vcc, v1, v3 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v1, 0, 1, vcc | |
| ; GFX9-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX9-NEXT: v_readfirstlane_b32 s1, v2 | |
| ; GFX9-NEXT: v_readfirstlane_b32 s2, v1 | |
| ; GFX9-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: fcmp_ole_v3bf16_vv: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_mov_b16_e32 v4.l, v0.h | |
| ; GFX1250-NEXT: v_mov_b16_e32 v5.l, v2.h | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v0, 16, v0 :: v_dual_lshlrev_b32 v2, 16, v2 | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v1, 16, v1 :: v_dual_lshlrev_b32 v3, 16, v3 | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v4, 16, v4 :: v_dual_lshlrev_b32 v5, 16, v5 | |
| ; GFX1250-NEXT: v_cmp_le_f32_e32 vcc_lo, v0, v2 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_cmp_le_f32_e32 vcc_lo, v4, v5 | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_cmp_le_f32_e32 vcc_lo, v1, v3 | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s1, v2 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v1, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s2, v1 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %cmp = fcmp ole <3 x bfloat> %a, %b | |
| %r = zext <3 x i1> %cmp to <3 x i32> | |
| ret <3 x i32> %r | |
| } | |
| define amdgpu_ps <4 x i32> @fcmp_one_v4bf16_vv(<4 x bfloat> %a, <4 x bfloat> %b) { | |
| ; GFX9-LABEL: fcmp_one_v4bf16_vv: | |
| ; GFX9: ; %bb.0: | |
| ; GFX9-NEXT: v_lshrrev_b32_e32 v4, 16, v0 | |
| ; GFX9-NEXT: v_lshrrev_b32_e32 v6, 16, v2 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v0, 16, v0 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v2, 16, v2 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v4, 16, v4 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v6, 16, v6 | |
| ; GFX9-NEXT: v_cmp_lg_f32_e32 vcc, v0, v2 | |
| ; GFX9-NEXT: v_lshrrev_b32_e32 v5, 16, v1 | |
| ; GFX9-NEXT: v_lshrrev_b32_e32 v7, 16, v3 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v1, 16, v1 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v3, 16, v3 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc | |
| ; GFX9-NEXT: v_cmp_lg_f32_e32 vcc, v4, v6 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v5, 16, v5 | |
| ; GFX9-NEXT: v_lshlrev_b32_e32 v7, 16, v7 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc | |
| ; GFX9-NEXT: v_cmp_lg_f32_e32 vcc, v1, v3 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v1, 0, 1, vcc | |
| ; GFX9-NEXT: v_cmp_lg_f32_e32 vcc, v5, v7 | |
| ; GFX9-NEXT: v_cndmask_b32_e64 v3, 0, 1, vcc | |
| ; GFX9-NEXT: v_readfirstlane_b32 s0, v0 | |
| ; GFX9-NEXT: v_readfirstlane_b32 s1, v2 | |
| ; GFX9-NEXT: v_readfirstlane_b32 s2, v1 | |
| ; GFX9-NEXT: v_readfirstlane_b32 s3, v3 | |
| ; GFX9-NEXT: ; return to shader part epilog | |
| ; | |
| ; GFX1250-LABEL: fcmp_one_v4bf16_vv: | |
| ; GFX1250: ; %bb.0: | |
| ; GFX1250-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0 | |
| ; GFX1250-NEXT: s_mov_b64 s[64:65], 0 | |
| ; GFX1250-NEXT: v_nop | |
| ; GFX1250-NEXT: global_prefetch_b8 v0, s[64:65] scope:SCOPE_SE | |
| ; GFX1250-NEXT: v_lshlrev_b32_e32 v4, 16, v0 | |
| ; GFX1250-NEXT: v_mov_b16_e32 v0.l, v0.h | |
| ; GFX1250-NEXT: v_mov_b16_e32 v5.l, v2.h | |
| ; GFX1250-NEXT: v_lshlrev_b32_e32 v2, 16, v2 | |
| ; GFX1250-NEXT: v_mov_b16_e32 v6.l, v1.h | |
| ; GFX1250-NEXT: v_mov_b16_e32 v7.l, v3.h | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v0, 16, v0 :: v_dual_lshlrev_b32 v5, 16, v5 | |
| ; GFX1250-NEXT: v_cmp_lg_f32_e32 vcc_lo, v4, v2 | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v1, 16, v1 :: v_dual_lshlrev_b32 v3, 16, v3 | |
| ; GFX1250-NEXT: v_dual_lshlrev_b32 v6, 16, v6 :: v_dual_lshlrev_b32 v7, 16, v7 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_cmp_lg_f32_e32 vcc_lo, v0, v5 | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s0, v2 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v0, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_cmp_lg_f32_e32 vcc_lo, v1, v3 | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s1, v0 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v1, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_cmp_lg_f32_e32 vcc_lo, v6, v7 | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s2, v1 | |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v3, 0, 1, vcc_lo | |
| ; GFX1250-NEXT: v_readfirstlane_b32 s3, v3 | |
| ; GFX1250-NEXT: ; return to shader part epilog | |
| %cmp = fcmp one <4 x bfloat> %a, %b | |
| %r = zext <4 x i1> %cmp to <4 x i32> | |
| ret <4 x i32> %r | |
| } |