blob: e289b558aecdf0e1ca2a34edcfd0ccdcc7ca4b81 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc < %s -mtriple=amdgpu9.50-amd-amdhsa | FileCheck -check-prefix=GFX950 %s
; RUN: llc < %s -mtriple=amdgpu11.70-amd-amdhsa | FileCheck -check-prefix=GFX1170 %s
; RUN: llc < %s -mtriple=amdgpu12.50-amd-amdhsa | FileCheck -check-prefix=GFX1250 %s
; llvm.convert.from.arbitrary.fp on FP8ConversionInsts targets with OCP FP8,
; plus E5M3FNU on GFX1250.
; Scalar Float8E5M2
define float @from_bf8_dynamic(i8 %x) {
; GFX950-LABEL: from_bf8_dynamic:
; GFX950: ; %bb.0:
; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_cvt_f32_bf8_e32 v0, v0
; GFX950-NEXT: s_setpc_b64 s[30:31]
;
; GFX1170-LABEL: from_bf8_dynamic:
; GFX1170: ; %bb.0:
; GFX1170-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX1170-NEXT: v_cvt_f32_bf8_e32 v0, v0
; GFX1170-NEXT: s_setpc_b64 s[30:31]
;
; GFX1250-LABEL: from_bf8_dynamic:
; GFX1250: ; %bb.0:
; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0
; GFX1250-NEXT: s_wait_kmcnt 0x0
; GFX1250-NEXT: v_cvt_f32_bf8_e32 v0, v0
; GFX1250-NEXT: s_set_pc_i64 s[30:31]
%r = call float @llvm.convert.from.arbitrary.fp.f32.i8(i8 %x, metadata !"Float8E5M2")
ret float %r
}
; Scalar Float8E4M3FN
define float @from_fp8_dynamic(i8 %x) {
; GFX950-LABEL: from_fp8_dynamic:
; GFX950: ; %bb.0:
; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_cvt_f32_fp8_e32 v0, v0
; GFX950-NEXT: s_setpc_b64 s[30:31]
;
; GFX1170-LABEL: from_fp8_dynamic:
; GFX1170: ; %bb.0:
; GFX1170-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX1170-NEXT: v_cvt_f32_fp8_e32 v0, v0
; GFX1170-NEXT: s_setpc_b64 s[30:31]
;
; GFX1250-LABEL: from_fp8_dynamic:
; GFX1250: ; %bb.0:
; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0
; GFX1250-NEXT: s_wait_kmcnt 0x0
; GFX1250-NEXT: v_cvt_f32_fp8_e32 v0, v0
; GFX1250-NEXT: s_set_pc_i64 s[30:31]
%r = call float @llvm.convert.from.arbitrary.fp.f32.i8(i8 %x, metadata !"Float8E4M3FN")
ret float %r
}
; v2f32
define <2 x float> @v2_from_bf8(<2 x i8> %x) {
; GFX950-LABEL: v2_from_bf8:
; GFX950: ; %bb.0:
; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX950-NEXT: s_mov_b32 s0, 0xc0c0004
; GFX950-NEXT: v_perm_b32 v0, v0, v1, s0
; GFX950-NEXT: v_cvt_pk_f32_bf8_e32 v[0:1], v0
; GFX950-NEXT: s_setpc_b64 s[30:31]
;
; GFX1170-LABEL: v2_from_bf8:
; GFX1170: ; %bb.0:
; GFX1170-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX1170-NEXT: v_perm_b32 v0, v0, v1, 0xc0c0004
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_1)
; GFX1170-NEXT: v_cvt_pk_f32_bf8_e32 v[0:1], v0
; GFX1170-NEXT: s_setpc_b64 s[30:31]
;
; GFX1250-LABEL: v2_from_bf8:
; GFX1250: ; %bb.0:
; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0
; GFX1250-NEXT: s_wait_kmcnt 0x0
; GFX1250-NEXT: v_perm_b32 v0, v0, v1, 0xc0c0004
; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1)
; GFX1250-NEXT: v_cvt_pk_f32_bf8_e32 v[0:1], v0
; GFX1250-NEXT: s_set_pc_i64 s[30:31]
%r = call <2 x float> @llvm.convert.from.arbitrary.fp.v2f32.v2i8(<2 x i8> %x, metadata !"Float8E5M2")
ret <2 x float> %r
}
define <2 x float> @v2_from_fp8(<2 x i8> %x) {
; GFX950-LABEL: v2_from_fp8:
; GFX950: ; %bb.0:
; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX950-NEXT: s_mov_b32 s0, 0xc0c0004
; GFX950-NEXT: v_perm_b32 v0, v0, v1, s0
; GFX950-NEXT: v_cvt_pk_f32_fp8_e32 v[0:1], v0
; GFX950-NEXT: s_setpc_b64 s[30:31]
;
; GFX1170-LABEL: v2_from_fp8:
; GFX1170: ; %bb.0:
; GFX1170-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX1170-NEXT: v_perm_b32 v0, v0, v1, 0xc0c0004
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_1)
; GFX1170-NEXT: v_cvt_pk_f32_fp8_e32 v[0:1], v0
; GFX1170-NEXT: s_setpc_b64 s[30:31]
;
; GFX1250-LABEL: v2_from_fp8:
; GFX1250: ; %bb.0:
; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0
; GFX1250-NEXT: s_wait_kmcnt 0x0
; GFX1250-NEXT: v_perm_b32 v0, v0, v1, 0xc0c0004
; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1)
; GFX1250-NEXT: v_cvt_pk_f32_fp8_e32 v[0:1], v0
; GFX1250-NEXT: s_set_pc_i64 s[30:31]
%r = call <2 x float> @llvm.convert.from.arbitrary.fp.v2f32.v2i8(<2 x i8> %x, metadata !"Float8E4M3FN")
ret <2 x float> %r
}
; v4f32
define <4 x float> @v4_from_bf8(<4 x i8> %x) {
; GFX950-LABEL: v4_from_bf8:
; GFX950: ; %bb.0:
; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX950-NEXT: s_mov_b32 s0, 0xc0c0004
; GFX950-NEXT: v_perm_b32 v0, v0, v1, s0
; GFX950-NEXT: v_perm_b32 v2, v2, v3, s0
; GFX950-NEXT: v_cvt_pk_f32_bf8_e32 v[0:1], v0
; GFX950-NEXT: v_cvt_pk_f32_bf8_e32 v[2:3], v2
; GFX950-NEXT: s_setpc_b64 s[30:31]
;
; GFX1170-LABEL: v4_from_bf8:
; GFX1170: ; %bb.0:
; GFX1170-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX1170-NEXT: v_perm_b32 v0, v0, v1, 0xc0c0004
; GFX1170-NEXT: v_perm_b32 v2, v2, v3, 0xc0c0004
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_cvt_pk_f32_bf8_e32 v[0:1], v0
; GFX1170-NEXT: v_cvt_pk_f32_bf8_e32 v[2:3], v2
; GFX1170-NEXT: s_setpc_b64 s[30:31]
;
; GFX1250-LABEL: v4_from_bf8:
; GFX1250: ; %bb.0:
; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0
; GFX1250-NEXT: s_wait_kmcnt 0x0
; GFX1250-NEXT: v_perm_b32 v0, v0, v1, 0xc0c0004
; GFX1250-NEXT: v_perm_b32 v2, v2, v3, 0xc0c0004
; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX1250-NEXT: v_cvt_pk_f32_bf8_e32 v[0:1], v0
; GFX1250-NEXT: v_cvt_pk_f32_bf8_e32 v[2:3], v2
; GFX1250-NEXT: s_set_pc_i64 s[30:31]
%r = call <4 x float> @llvm.convert.from.arbitrary.fp.v4f32.v4i8(<4 x i8> %x, metadata !"Float8E5M2")
ret <4 x float> %r
}
define <4 x float> @v4_from_fp8(<4 x i8> %x) {
; GFX950-LABEL: v4_from_fp8:
; GFX950: ; %bb.0:
; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX950-NEXT: s_mov_b32 s0, 0xc0c0004
; GFX950-NEXT: v_perm_b32 v0, v0, v1, s0
; GFX950-NEXT: v_perm_b32 v2, v2, v3, s0
; GFX950-NEXT: v_cvt_pk_f32_fp8_e32 v[0:1], v0
; GFX950-NEXT: v_cvt_pk_f32_fp8_e32 v[2:3], v2
; GFX950-NEXT: s_setpc_b64 s[30:31]
;
; GFX1170-LABEL: v4_from_fp8:
; GFX1170: ; %bb.0:
; GFX1170-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX1170-NEXT: v_perm_b32 v0, v0, v1, 0xc0c0004
; GFX1170-NEXT: v_perm_b32 v2, v2, v3, 0xc0c0004
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_cvt_pk_f32_fp8_e32 v[0:1], v0
; GFX1170-NEXT: v_cvt_pk_f32_fp8_e32 v[2:3], v2
; GFX1170-NEXT: s_setpc_b64 s[30:31]
;
; GFX1250-LABEL: v4_from_fp8:
; GFX1250: ; %bb.0:
; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0
; GFX1250-NEXT: s_wait_kmcnt 0x0
; GFX1250-NEXT: v_perm_b32 v0, v0, v1, 0xc0c0004
; GFX1250-NEXT: v_perm_b32 v2, v2, v3, 0xc0c0004
; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX1250-NEXT: v_cvt_pk_f32_fp8_e32 v[0:1], v0
; GFX1250-NEXT: v_cvt_pk_f32_fp8_e32 v[2:3], v2
; GFX1250-NEXT: s_set_pc_i64 s[30:31]
%r = call <4 x float> @llvm.convert.from.arbitrary.fp.v4f32.v4i8(<4 x i8> %x, metadata !"Float8E4M3FN")
ret <4 x float> %r
}
; v3f32
define <3 x float> @v3_from_bf8(<3 x i8> %x) {
; GFX950-LABEL: v3_from_bf8:
; GFX950: ; %bb.0:
; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX950-NEXT: s_mov_b32 s0, 0xc0c0004
; GFX950-NEXT: v_perm_b32 v0, v0, v1, s0
; GFX950-NEXT: v_and_b32_e32 v2, 0xff, v2
; GFX950-NEXT: v_cvt_pk_f32_bf8_e32 v[0:1], v0
; GFX950-NEXT: v_cvt_pk_f32_bf8_e32 v[2:3], v2
; GFX950-NEXT: s_setpc_b64 s[30:31]
;
; GFX1170-LABEL: v3_from_bf8:
; GFX1170: ; %bb.0:
; GFX1170-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX1170-NEXT: v_perm_b32 v0, v0, v1, 0xc0c0004
; GFX1170-NEXT: v_and_b16 v2.l, 0xff, v2.l
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_cvt_pk_f32_bf8_e32 v[0:1], v0
; GFX1170-NEXT: v_cvt_pk_f32_bf8_e32 v[2:3], v2
; GFX1170-NEXT: s_setpc_b64 s[30:31]
;
; GFX1250-LABEL: v3_from_bf8:
; GFX1250: ; %bb.0:
; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0
; GFX1250-NEXT: s_wait_kmcnt 0x0
; GFX1250-NEXT: v_perm_b32 v0, v0, v1, 0xc0c0004
; GFX1250-NEXT: v_and_b16 v2.l, 0xff, v2.l
; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX1250-NEXT: v_cvt_pk_f32_bf8_e32 v[0:1], v0
; GFX1250-NEXT: v_cvt_pk_f32_bf8_e32 v[2:3], v2
; GFX1250-NEXT: s_set_pc_i64 s[30:31]
%r = call <3 x float> @llvm.convert.from.arbitrary.fp.v3f32.v3i8(<3 x i8> %x, metadata !"Float8E5M2")
ret <3 x float> %r
}
define <3 x float> @v3_from_fp8(<3 x i8> %x) {
; GFX950-LABEL: v3_from_fp8:
; GFX950: ; %bb.0:
; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX950-NEXT: s_mov_b32 s0, 0xc0c0004
; GFX950-NEXT: v_perm_b32 v0, v0, v1, s0
; GFX950-NEXT: v_and_b32_e32 v2, 0xff, v2
; GFX950-NEXT: v_cvt_pk_f32_fp8_e32 v[0:1], v0
; GFX950-NEXT: v_cvt_pk_f32_fp8_e32 v[2:3], v2
; GFX950-NEXT: s_setpc_b64 s[30:31]
;
; GFX1170-LABEL: v3_from_fp8:
; GFX1170: ; %bb.0:
; GFX1170-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX1170-NEXT: v_perm_b32 v0, v0, v1, 0xc0c0004
; GFX1170-NEXT: v_and_b16 v2.l, 0xff, v2.l
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_cvt_pk_f32_fp8_e32 v[0:1], v0
; GFX1170-NEXT: v_cvt_pk_f32_fp8_e32 v[2:3], v2
; GFX1170-NEXT: s_setpc_b64 s[30:31]
;
; GFX1250-LABEL: v3_from_fp8:
; GFX1250: ; %bb.0:
; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0
; GFX1250-NEXT: s_wait_kmcnt 0x0
; GFX1250-NEXT: v_perm_b32 v0, v0, v1, 0xc0c0004
; GFX1250-NEXT: v_and_b16 v2.l, 0xff, v2.l
; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX1250-NEXT: v_cvt_pk_f32_fp8_e32 v[0:1], v0
; GFX1250-NEXT: v_cvt_pk_f32_fp8_e32 v[2:3], v2
; GFX1250-NEXT: s_set_pc_i64 s[30:31]
%r = call <3 x float> @llvm.convert.from.arbitrary.fp.v3f32.v3i8(<3 x i8> %x, metadata !"Float8E4M3FN")
ret <3 x float> %r
}
; E5M3FNU is selected by the clamp encoding bit on GFX1250.
define float @from_e5m3fnu_f32(i8 %x) {
; GFX950-LABEL: from_e5m3fnu_f32:
; GFX950: ; %bb.0:
; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_and_b32_e32 v0, 0xffff, v0
; GFX950-NEXT: v_and_b32_e32 v1, 7, v0
; GFX950-NEXT: v_ffbh_u32_e32 v2, v1
; GFX950-NEXT: v_sub_u32_e32 v3, 31, v2
; GFX950-NEXT: v_lshlrev_b32_e64 v3, v3, 1
; GFX950-NEXT: v_bitop3_b32 v3, v0, v3, 7 bitop3:0x6c
; GFX950-NEXT: v_add_u32_e32 v4, -8, v2
; GFX950-NEXT: v_lshlrev_b32_e32 v3, v4, v3
; GFX950-NEXT: v_sub_u32_e32 v2, 0x8d, v2
; GFX950-NEXT: v_lshl_or_b32 v2, v2, 23, v3
; GFX950-NEXT: v_bfe_u32 v0, v0, 3, 5
; GFX950-NEXT: v_lshlrev_b32_e32 v3, 20, v1
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v1
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 0, v0
; GFX950-NEXT: v_lshl_or_b32 v3, v0, 23, v3
; GFX950-NEXT: v_add_u32_e32 v3, 0x38000000, v3
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: v_cndmask_b32_e32 v2, v3, v2, vcc
; GFX950-NEXT: v_or_b32_e32 v3, v0, v1
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v3
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 31, v0
; GFX950-NEXT: v_mov_b32_e32 v0, 0x7fc00000
; GFX950-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc
; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, 7, v1
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: s_nop 0
; GFX950-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc
; GFX950-NEXT: s_setpc_b64 s[30:31]
;
; GFX1170-LABEL: from_e5m3fnu_f32:
; GFX1170: ; %bb.0:
; GFX1170-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX1170-NEXT: v_cvt_u32_u16_e32 v0, v0.l
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_and_b32_e32 v1, 7, v0
; GFX1170-NEXT: v_bfe_u32 v0, v0, 3, 5
; GFX1170-NEXT: v_clz_i32_u32_e32 v2, v1
; GFX1170-NEXT: v_lshlrev_b32_e32 v5, 20, v1
; GFX1170-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v1
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
; GFX1170-NEXT: v_cmp_eq_u32_e64 s0, 0, v0
; GFX1170-NEXT: v_sub_nc_u32_e32 v3, 31, v2
; GFX1170-NEXT: v_add_nc_u32_e32 v4, -8, v2
; GFX1170-NEXT: v_sub_nc_u32_e32 v2, 0x8d, v2
; GFX1170-NEXT: s_and_b32 vcc_lo, s0, vcc_lo
; GFX1170-NEXT: v_cmp_eq_u32_e64 s0, 31, v0
; GFX1170-NEXT: v_lshlrev_b32_e64 v3, v3, 1
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX1170-NEXT: v_xor_b32_e32 v3, v1, v3
; GFX1170-NEXT: v_lshlrev_b32_e32 v3, v4, v3
; GFX1170-NEXT: v_lshl_or_b32 v4, v0, 23, v5
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_lshl_or_b32 v2, v2, 23, v3
; GFX1170-NEXT: v_add_nc_u32_e32 v3, 0x38000000, v4
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_cndmask_b32_e32 v2, v3, v2, vcc_lo
; GFX1170-NEXT: v_or_b32_e32 v4, v0, v1
; GFX1170-NEXT: v_cmp_eq_u32_e32 vcc_lo, 7, v1
; GFX1170-NEXT: v_cmp_ne_u32_e64 s1, 0, v4
; GFX1170-NEXT: s_and_b32 s0, s0, vcc_lo
; GFX1170-NEXT: v_cndmask_b32_e64 v0, 0, v2, s1
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_1)
; GFX1170-NEXT: v_cndmask_b32_e64 v0, v0, 0x7fc00000, s0
; GFX1170-NEXT: s_setpc_b64 s[30:31]
;
; GFX1250-LABEL: from_e5m3fnu_f32:
; GFX1250: ; %bb.0:
; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0
; GFX1250-NEXT: s_wait_kmcnt 0x0
; GFX1250-NEXT: v_cvt_f32_fp8_e64 v0, v0 clamp
; GFX1250-NEXT: s_set_pc_i64 s[30:31]
%r = call float @llvm.convert.from.arbitrary.fp.f32.i8(i8 %x, metadata !"Float8E5M3FNU")
ret float %r
}
define <2 x float> @v2_from_e5m3fnu(<2 x i8> %x) {
; GFX950-LABEL: v2_from_e5m3fnu:
; GFX950: ; %bb.0:
; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_and_b32_e32 v0, 0xffff, v0
; GFX950-NEXT: v_and_b32_e32 v2, 7, v0
; GFX950-NEXT: v_ffbh_u32_e32 v3, v2
; GFX950-NEXT: v_sub_u32_e32 v4, 31, v3
; GFX950-NEXT: v_lshlrev_b32_e64 v4, v4, 1
; GFX950-NEXT: v_bitop3_b32 v4, v0, v4, 7 bitop3:0x6c
; GFX950-NEXT: v_add_u32_e32 v5, -8, v3
; GFX950-NEXT: v_lshlrev_b32_e32 v4, v5, v4
; GFX950-NEXT: v_sub_u32_e32 v3, 0x8d, v3
; GFX950-NEXT: v_lshl_or_b32 v3, v3, 23, v4
; GFX950-NEXT: v_bfe_u32 v0, v0, 3, 5
; GFX950-NEXT: v_lshlrev_b32_e32 v4, 20, v2
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v2
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 0, v0
; GFX950-NEXT: v_lshl_or_b32 v4, v0, 23, v4
; GFX950-NEXT: v_add_u32_e32 v4, 0x38000000, v4
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: v_cndmask_b32_e32 v3, v4, v3, vcc
; GFX950-NEXT: v_or_b32_e32 v4, v0, v2
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v4
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 31, v0
; GFX950-NEXT: v_and_b32_e32 v1, 0xffff, v1
; GFX950-NEXT: v_cndmask_b32_e32 v3, 0, v3, vcc
; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, 7, v2
; GFX950-NEXT: v_mov_b32_e32 v2, 0x7fc00000
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: v_cndmask_b32_e32 v0, v3, v2, vcc
; GFX950-NEXT: v_and_b32_e32 v3, 7, v1
; GFX950-NEXT: v_ffbh_u32_e32 v4, v3
; GFX950-NEXT: v_sub_u32_e32 v5, 31, v4
; GFX950-NEXT: v_lshlrev_b32_e64 v5, v5, 1
; GFX950-NEXT: v_bitop3_b32 v5, v1, v5, 7 bitop3:0x6c
; GFX950-NEXT: v_add_u32_e32 v6, -8, v4
; GFX950-NEXT: v_lshlrev_b32_e32 v5, v6, v5
; GFX950-NEXT: v_sub_u32_e32 v4, 0x8d, v4
; GFX950-NEXT: v_lshl_or_b32 v4, v4, 23, v5
; GFX950-NEXT: v_bfe_u32 v1, v1, 3, 5
; GFX950-NEXT: v_lshlrev_b32_e32 v5, 20, v3
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v3
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 0, v1
; GFX950-NEXT: v_lshl_or_b32 v5, v1, 23, v5
; GFX950-NEXT: v_add_u32_e32 v5, 0x38000000, v5
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: v_cndmask_b32_e32 v4, v5, v4, vcc
; GFX950-NEXT: v_or_b32_e32 v5, v1, v3
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v5
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 31, v1
; GFX950-NEXT: s_nop 0
; GFX950-NEXT: v_cndmask_b32_e32 v4, 0, v4, vcc
; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, 7, v3
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: s_nop 0
; GFX950-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc
; GFX950-NEXT: s_setpc_b64 s[30:31]
;
; GFX1170-LABEL: v2_from_e5m3fnu:
; GFX1170: ; %bb.0:
; GFX1170-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX1170-NEXT: v_cvt_u32_u16_e32 v0, v0.l
; GFX1170-NEXT: v_cvt_u32_u16_e32 v1, v1.l
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_and_b32_e32 v2, 7, v0
; GFX1170-NEXT: v_bfe_u32 v0, v0, 3, 5
; GFX1170-NEXT: v_clz_i32_u32_e32 v4, v2
; GFX1170-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v2
; GFX1170-NEXT: v_lshlrev_b32_e32 v5, 20, v2
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_4)
; GFX1170-NEXT: v_or_b32_e32 v7, v0, v2
; GFX1170-NEXT: v_cmp_eq_u32_e64 s1, 7, v2
; GFX1170-NEXT: v_sub_nc_u32_e32 v8, 31, v4
; GFX1170-NEXT: v_add_nc_u32_e32 v11, -8, v4
; GFX1170-NEXT: v_cmp_eq_u32_e64 s0, 0, v0
; GFX1170-NEXT: v_cmp_eq_u32_e64 s2, 31, v0
; GFX1170-NEXT: v_sub_nc_u32_e32 v4, 0x8d, v4
; GFX1170-NEXT: v_lshlrev_b32_e64 v8, v8, 1
; GFX1170-NEXT: v_lshl_or_b32 v0, v0, 23, v5
; GFX1170-NEXT: s_and_b32 vcc_lo, s0, vcc_lo
; GFX1170-NEXT: v_cmp_ne_u32_e64 s0, 0, v7
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)
; GFX1170-NEXT: v_xor_b32_e32 v2, v2, v8
; GFX1170-NEXT: v_add_nc_u32_e32 v0, 0x38000000, v0
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
; GFX1170-NEXT: v_lshlrev_b32_e32 v2, v11, v2
; GFX1170-NEXT: v_lshl_or_b32 v2, v4, 23, v2
; GFX1170-NEXT: v_and_b32_e32 v3, 7, v1
; GFX1170-NEXT: v_bfe_u32 v1, v1, 3, 5
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)
; GFX1170-NEXT: v_cndmask_b32_e32 v0, v0, v2, vcc_lo
; GFX1170-NEXT: v_clz_i32_u32_e32 v6, v3
; GFX1170-NEXT: v_lshlrev_b32_e32 v10, 20, v3
; GFX1170-NEXT: v_cmp_ne_u32_e64 s3, 0, v3
; GFX1170-NEXT: v_cmp_eq_u32_e64 s4, 0, v1
; GFX1170-NEXT: v_cndmask_b32_e64 v0, 0, v0, s0
; GFX1170-NEXT: v_sub_nc_u32_e32 v9, 31, v6
; GFX1170-NEXT: v_add_nc_u32_e32 v8, -8, v6
; GFX1170-NEXT: v_sub_nc_u32_e32 v5, 0x8d, v6
; GFX1170-NEXT: v_lshl_or_b32 v6, v1, 23, v10
; GFX1170-NEXT: s_and_b32 vcc_lo, s4, s3
; GFX1170-NEXT: v_lshlrev_b32_e64 v9, v9, 1
; GFX1170-NEXT: v_cmp_eq_u32_e64 s5, 7, v3
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)
; GFX1170-NEXT: v_add_nc_u32_e32 v4, 0x38000000, v6
; GFX1170-NEXT: v_xor_b32_e32 v9, v3, v9
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_lshlrev_b32_e32 v8, v8, v9
; GFX1170-NEXT: v_or_b32_e32 v9, v1, v3
; GFX1170-NEXT: v_lshl_or_b32 v5, v5, 23, v8
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_cmp_ne_u32_e64 s0, 0, v9
; GFX1170-NEXT: v_cndmask_b32_e32 v2, v4, v5, vcc_lo
; GFX1170-NEXT: v_cmp_eq_u32_e32 vcc_lo, 31, v1
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(SALU_CYCLE_1)
; GFX1170-NEXT: v_cndmask_b32_e64 v1, 0, v2, s0
; GFX1170-NEXT: s_and_b32 s0, s2, s1
; GFX1170-NEXT: v_cndmask_b32_e64 v0, v0, 0x7fc00000, s0
; GFX1170-NEXT: s_and_b32 s0, vcc_lo, s5
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_2) | instid1(SALU_CYCLE_1)
; GFX1170-NEXT: v_cndmask_b32_e64 v1, v1, 0x7fc00000, s0
; GFX1170-NEXT: s_setpc_b64 s[30:31]
;
; GFX1250-LABEL: v2_from_e5m3fnu:
; GFX1250: ; %bb.0:
; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0
; GFX1250-NEXT: s_wait_kmcnt 0x0
; GFX1250-NEXT: v_perm_b32 v1, v0, v1, 0xc0c0004
; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1)
; GFX1250-NEXT: v_cvt_f32_fp8_e64 v0, v1 clamp
; GFX1250-NEXT: v_cvt_f32_fp8_e64 v1, v1 byte_sel:1 clamp
; GFX1250-NEXT: s_set_pc_i64 s[30:31]
%r = call <2 x float> @llvm.convert.from.arbitrary.fp.v2f32.v2i8(<2 x i8> %x, metadata !"Float8E5M3FNU")
ret <2 x float> %r
}
define <4 x float> @v4_from_e5m3fnu(<4 x i8> %x) {
; GFX950-LABEL: v4_from_e5m3fnu:
; GFX950: ; %bb.0:
; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX950-NEXT: v_and_b32_e32 v0, 0xffff, v0
; GFX950-NEXT: v_and_b32_e32 v4, 7, v0
; GFX950-NEXT: v_ffbh_u32_e32 v5, v4
; GFX950-NEXT: v_sub_u32_e32 v6, 31, v5
; GFX950-NEXT: v_lshlrev_b32_e64 v6, v6, 1
; GFX950-NEXT: v_bitop3_b32 v6, v0, v6, 7 bitop3:0x6c
; GFX950-NEXT: v_add_u32_e32 v7, -8, v5
; GFX950-NEXT: v_lshlrev_b32_e32 v6, v7, v6
; GFX950-NEXT: v_sub_u32_e32 v5, 0x8d, v5
; GFX950-NEXT: v_lshl_or_b32 v5, v5, 23, v6
; GFX950-NEXT: v_bfe_u32 v0, v0, 3, 5
; GFX950-NEXT: v_lshlrev_b32_e32 v6, 20, v4
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v4
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 0, v0
; GFX950-NEXT: v_lshl_or_b32 v6, v0, 23, v6
; GFX950-NEXT: v_add_u32_e32 v6, 0x38000000, v6
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: v_cndmask_b32_e32 v5, v6, v5, vcc
; GFX950-NEXT: v_or_b32_e32 v6, v0, v4
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v6
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 31, v0
; GFX950-NEXT: v_and_b32_e32 v1, 0xffff, v1
; GFX950-NEXT: v_cndmask_b32_e32 v5, 0, v5, vcc
; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, 7, v4
; GFX950-NEXT: v_mov_b32_e32 v4, 0x7fc00000
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: v_cndmask_b32_e32 v0, v5, v4, vcc
; GFX950-NEXT: v_and_b32_e32 v5, 7, v1
; GFX950-NEXT: v_ffbh_u32_e32 v6, v5
; GFX950-NEXT: v_sub_u32_e32 v7, 31, v6
; GFX950-NEXT: v_lshlrev_b32_e64 v7, v7, 1
; GFX950-NEXT: v_bitop3_b32 v7, v1, v7, 7 bitop3:0x6c
; GFX950-NEXT: v_add_u32_e32 v8, -8, v6
; GFX950-NEXT: v_lshlrev_b32_e32 v7, v8, v7
; GFX950-NEXT: v_sub_u32_e32 v6, 0x8d, v6
; GFX950-NEXT: v_lshl_or_b32 v6, v6, 23, v7
; GFX950-NEXT: v_bfe_u32 v1, v1, 3, 5
; GFX950-NEXT: v_lshlrev_b32_e32 v7, 20, v5
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v5
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 0, v1
; GFX950-NEXT: v_lshl_or_b32 v7, v1, 23, v7
; GFX950-NEXT: v_add_u32_e32 v7, 0x38000000, v7
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: v_cndmask_b32_e32 v6, v7, v6, vcc
; GFX950-NEXT: v_or_b32_e32 v7, v1, v5
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v7
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 31, v1
; GFX950-NEXT: v_and_b32_e32 v2, 0xffff, v2
; GFX950-NEXT: v_cndmask_b32_e32 v6, 0, v6, vcc
; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, 7, v5
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: v_and_b32_e32 v5, 7, v2
; GFX950-NEXT: v_cndmask_b32_e32 v1, v6, v4, vcc
; GFX950-NEXT: v_ffbh_u32_e32 v6, v5
; GFX950-NEXT: v_sub_u32_e32 v7, 31, v6
; GFX950-NEXT: v_lshlrev_b32_e64 v7, v7, 1
; GFX950-NEXT: v_bitop3_b32 v7, v2, v7, 7 bitop3:0x6c
; GFX950-NEXT: v_add_u32_e32 v8, -8, v6
; GFX950-NEXT: v_lshlrev_b32_e32 v7, v8, v7
; GFX950-NEXT: v_sub_u32_e32 v6, 0x8d, v6
; GFX950-NEXT: v_lshl_or_b32 v6, v6, 23, v7
; GFX950-NEXT: v_bfe_u32 v2, v2, 3, 5
; GFX950-NEXT: v_lshlrev_b32_e32 v7, 20, v5
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v5
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 0, v2
; GFX950-NEXT: v_lshl_or_b32 v7, v2, 23, v7
; GFX950-NEXT: v_add_u32_e32 v7, 0x38000000, v7
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: v_cndmask_b32_e32 v6, v7, v6, vcc
; GFX950-NEXT: v_or_b32_e32 v7, v2, v5
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v7
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 31, v2
; GFX950-NEXT: v_and_b32_e32 v3, 0xffff, v3
; GFX950-NEXT: v_cndmask_b32_e32 v6, 0, v6, vcc
; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, 7, v5
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: v_and_b32_e32 v5, 7, v3
; GFX950-NEXT: v_cndmask_b32_e32 v2, v6, v4, vcc
; GFX950-NEXT: v_ffbh_u32_e32 v6, v5
; GFX950-NEXT: v_sub_u32_e32 v7, 31, v6
; GFX950-NEXT: v_lshlrev_b32_e64 v7, v7, 1
; GFX950-NEXT: v_bitop3_b32 v7, v3, v7, 7 bitop3:0x6c
; GFX950-NEXT: v_add_u32_e32 v8, -8, v6
; GFX950-NEXT: v_lshlrev_b32_e32 v7, v8, v7
; GFX950-NEXT: v_sub_u32_e32 v6, 0x8d, v6
; GFX950-NEXT: v_lshl_or_b32 v6, v6, 23, v7
; GFX950-NEXT: v_bfe_u32 v3, v3, 3, 5
; GFX950-NEXT: v_lshlrev_b32_e32 v7, 20, v5
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v5
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 0, v3
; GFX950-NEXT: v_lshl_or_b32 v7, v3, 23, v7
; GFX950-NEXT: v_add_u32_e32 v7, 0x38000000, v7
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: v_cndmask_b32_e32 v6, v7, v6, vcc
; GFX950-NEXT: v_or_b32_e32 v7, v3, v5
; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v7
; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 31, v3
; GFX950-NEXT: s_nop 0
; GFX950-NEXT: v_cndmask_b32_e32 v6, 0, v6, vcc
; GFX950-NEXT: v_cmp_eq_u32_e32 vcc, 7, v5
; GFX950-NEXT: s_and_b64 vcc, s[0:1], vcc
; GFX950-NEXT: s_nop 0
; GFX950-NEXT: v_cndmask_b32_e32 v3, v6, v4, vcc
; GFX950-NEXT: s_setpc_b64 s[30:31]
;
; GFX1170-LABEL: v4_from_e5m3fnu:
; GFX1170: ; %bb.0:
; GFX1170-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
; GFX1170-NEXT: v_cvt_u32_u16_e32 v0, v0.l
; GFX1170-NEXT: v_cvt_u32_u16_e32 v1, v1.l
; GFX1170-NEXT: v_cvt_u32_u16_e32 v2, v2.l
; GFX1170-NEXT: v_cvt_u32_u16_e32 v3, v3.l
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_4)
; GFX1170-NEXT: v_and_b32_e32 v4, 7, v0
; GFX1170-NEXT: v_bfe_u32 v0, v0, 3, 5
; GFX1170-NEXT: v_and_b32_e32 v6, 7, v2
; GFX1170-NEXT: v_bfe_u32 v2, v2, 3, 5
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_4)
; GFX1170-NEXT: v_clz_i32_u32_e32 v8, v4
; GFX1170-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v4
; GFX1170-NEXT: v_lshlrev_b32_e32 v9, 20, v4
; GFX1170-NEXT: v_or_b32_e32 v10, v0, v4
; GFX1170-NEXT: v_cmp_eq_u32_e64 s1, 7, v4
; GFX1170-NEXT: v_sub_nc_u32_e32 v11, 31, v8
; GFX1170-NEXT: v_add_nc_u32_e32 v17, -8, v8
; GFX1170-NEXT: v_cmp_eq_u32_e64 s0, 0, v0
; GFX1170-NEXT: v_cmp_eq_u32_e64 s2, 31, v0
; GFX1170-NEXT: v_sub_nc_u32_e32 v8, 0x8d, v8
; GFX1170-NEXT: v_lshlrev_b32_e64 v11, v11, 1
; GFX1170-NEXT: v_lshl_or_b32 v0, v0, 23, v9
; GFX1170-NEXT: s_and_b32 vcc_lo, s0, vcc_lo
; GFX1170-NEXT: v_clz_i32_u32_e32 v15, v6
; GFX1170-NEXT: s_and_b32 s0, s2, s1
; GFX1170-NEXT: v_xor_b32_e32 v4, v4, v11
; GFX1170-NEXT: v_add_nc_u32_e32 v0, 0x38000000, v0
; GFX1170-NEXT: v_cmp_ne_u32_e64 s1, 0, v6
; GFX1170-NEXT: v_cmp_eq_u32_e64 s2, 0, v2
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_2) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_lshlrev_b32_e32 v4, v17, v4
; GFX1170-NEXT: s_and_b32 s1, s2, s1
; GFX1170-NEXT: v_cmp_eq_u32_e64 s2, 31, v2
; GFX1170-NEXT: v_lshl_or_b32 v4, v8, 23, v4
; GFX1170-NEXT: v_and_b32_e32 v5, 7, v1
; GFX1170-NEXT: v_bfe_u32 v1, v1, 3, 5
; GFX1170-NEXT: v_sub_nc_u32_e32 v8, 31, v15
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
; GFX1170-NEXT: v_cndmask_b32_e32 v0, v0, v4, vcc_lo
; GFX1170-NEXT: v_clz_i32_u32_e32 v12, v5
; GFX1170-NEXT: v_lshlrev_b32_e32 v13, 20, v5
; GFX1170-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v10
; GFX1170-NEXT: v_and_b32_e32 v7, 7, v3
; GFX1170-NEXT: v_cmp_ne_u32_e64 s3, 0, v5
; GFX1170-NEXT: v_sub_nc_u32_e32 v16, 31, v12
; GFX1170-NEXT: v_add_nc_u32_e32 v9, -8, v12
; GFX1170-NEXT: v_sub_nc_u32_e32 v12, 0x8d, v12
; GFX1170-NEXT: v_lshl_or_b32 v13, v1, 23, v13
; GFX1170-NEXT: v_cmp_eq_u32_e64 s4, 0, v1
; GFX1170-NEXT: v_lshlrev_b32_e64 v16, v16, 1
; GFX1170-NEXT: v_or_b32_e32 v14, v1, v5
; GFX1170-NEXT: v_lshlrev_b32_e64 v4, v8, 1
; GFX1170-NEXT: v_add_nc_u32_e32 v8, 0x38000000, v13
; GFX1170-NEXT: v_cndmask_b32_e32 v0, 0, v0, vcc_lo
; GFX1170-NEXT: v_xor_b32_e32 v16, v5, v16
; GFX1170-NEXT: v_clz_i32_u32_e32 v11, v7
; GFX1170-NEXT: s_and_b32 vcc_lo, s4, s3
; GFX1170-NEXT: v_xor_b32_e32 v4, v6, v4
; GFX1170-NEXT: v_cndmask_b32_e64 v0, v0, 0x7fc00000, s0
; GFX1170-NEXT: v_lshlrev_b32_e32 v9, v9, v16
; GFX1170-NEXT: v_sub_nc_u32_e32 v10, 31, v11
; GFX1170-NEXT: v_cmp_eq_u32_e64 s0, 31, v1
; GFX1170-NEXT: v_bfe_u32 v3, v3, 3, 5
; GFX1170-NEXT: v_cmp_ne_u32_e64 s3, 0, v7
; GFX1170-NEXT: v_lshl_or_b32 v9, v12, 23, v9
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_cmp_eq_u32_e64 s4, 0, v3
; GFX1170-NEXT: v_dual_cndmask_b32 v8, v8, v9 :: v_dual_add_nc_u32 v9, -8, v15
; GFX1170-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v14
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_3)
; GFX1170-NEXT: v_lshlrev_b32_e32 v4, v9, v4
; GFX1170-NEXT: v_cndmask_b32_e32 v8, 0, v8, vcc_lo
; GFX1170-NEXT: v_cmp_eq_u32_e32 vcc_lo, 7, v5
; GFX1170-NEXT: v_lshlrev_b32_e64 v5, v10, 1
; GFX1170-NEXT: v_sub_nc_u32_e32 v9, 0x8d, v15
; GFX1170-NEXT: v_lshlrev_b32_e32 v10, 20, v6
; GFX1170-NEXT: s_and_b32 s0, s0, vcc_lo
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_4) | instid1(VALU_DEP_4)
; GFX1170-NEXT: v_xor_b32_e32 v1, v7, v5
; GFX1170-NEXT: v_add_nc_u32_e32 v5, -8, v11
; GFX1170-NEXT: v_lshl_or_b32 v4, v9, 23, v4
; GFX1170-NEXT: v_lshl_or_b32 v9, v2, 23, v10
; GFX1170-NEXT: v_lshlrev_b32_e32 v10, 20, v7
; GFX1170-NEXT: v_lshlrev_b32_e32 v1, v5, v1
; GFX1170-NEXT: v_sub_nc_u32_e32 v5, 0x8d, v11
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4)
; GFX1170-NEXT: v_add_nc_u32_e32 v9, 0x38000000, v9
; GFX1170-NEXT: v_lshl_or_b32 v10, v3, 23, v10
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3)
; GFX1170-NEXT: v_lshl_or_b32 v1, v5, 23, v1
; GFX1170-NEXT: v_cndmask_b32_e64 v4, v9, v4, s1
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_3)
; GFX1170-NEXT: v_add_nc_u32_e32 v5, 0x38000000, v10
; GFX1170-NEXT: v_or_b32_e32 v10, v2, v6
; GFX1170-NEXT: s_and_b32 s1, s4, s3
; GFX1170-NEXT: v_cmp_eq_u32_e64 s4, 31, v3
; GFX1170-NEXT: v_cndmask_b32_e64 v1, v5, v1, s1
; GFX1170-NEXT: v_or_b32_e32 v5, v3, v7
; GFX1170-NEXT: v_cmp_ne_u32_e64 s1, 0, v10
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
; GFX1170-NEXT: v_cmp_ne_u32_e64 s3, 0, v5
; GFX1170-NEXT: v_cndmask_b32_e64 v4, 0, v4, s1
; GFX1170-NEXT: v_cmp_eq_u32_e64 s1, 7, v6
; GFX1170-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(SALU_CYCLE_1)
; GFX1170-NEXT: v_cndmask_b32_e64 v5, 0, v1, s3
; GFX1170-NEXT: v_cmp_eq_u32_e64 s3, 7, v7
; GFX1170-NEXT: v_cndmask_b32_e64 v1, v8, 0x7fc00000, s0
; GFX1170-NEXT: s_and_b32 s0, s2, s1
; GFX1170-NEXT: v_cndmask_b32_e64 v2, v4, 0x7fc00000, s0
; GFX1170-NEXT: s_and_b32 s0, s4, s3
; GFX1170-NEXT: s_delay_alu instid0(SALU_CYCLE_1)
; GFX1170-NEXT: v_cndmask_b32_e64 v3, v5, 0x7fc00000, s0
; GFX1170-NEXT: s_setpc_b64 s[30:31]
;
; GFX1250-LABEL: v4_from_e5m3fnu:
; GFX1250: ; %bb.0:
; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0
; GFX1250-NEXT: s_wait_kmcnt 0x0
; GFX1250-NEXT: v_perm_b32 v1, v0, v1, 0xc0c0004
; GFX1250-NEXT: v_perm_b32 v3, v2, v3, 0xc0c0004
; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3)
; GFX1250-NEXT: v_cvt_f32_fp8_e64 v0, v1 clamp
; GFX1250-NEXT: v_cvt_f32_fp8_e64 v1, v1 byte_sel:1 clamp
; GFX1250-NEXT: v_cvt_f32_fp8_e64 v2, v3 clamp
; GFX1250-NEXT: v_cvt_f32_fp8_e64 v3, v3 byte_sel:1 clamp
; GFX1250-NEXT: s_set_pc_i64 s[30:31]
%r = call <4 x float> @llvm.convert.from.arbitrary.fp.v4f32.v4i8(<4 x i8> %x, metadata !"Float8E5M3FNU")
ret <4 x float> %r
}