| ; 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=amdgpu12.00-amd-amdhsa | FileCheck -check-prefix=GFX1200 %s |
| ; RUN: llc < %s -mtriple=amdgpu12.50-amd-amdhsa -mattr=+real-true16 | FileCheck -check-prefixes=GFX1250,GFX1250-TRUE16 %s |
| ; RUN: llc < %s -mtriple=amdgpu12.50-amd-amdhsa -mattr=-real-true16 | FileCheck -check-prefixes=GFX1250,GFX1250-FAKE16 %s |
| ; RUN: llc < %s -mtriple=amdgpu13.10-amd-amdhsa | FileCheck -check-prefix=GFX1310 %s |
| |
| ; llvm.convert.to.arbitrary.fp to OCP FP8 E4M3FN and BF8 E5M2 from f32, plus |
| ; E5M3FNU on GFX1250, lowered to packed HW instructions. The FNUZ subtargets |
| ; are covered by float-to-arbitrary-fp-fp8-fnuz.ll. |
| |
| define i8 @to_fp8_f32(float %x) { |
| ; GFX950-LABEL: to_fp8_f32: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_cvt_pk_fp8_f32 v0, v0, v0 |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_fp8_f32: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_cvt_pk_fp8_f32 v0.l, v0, v0 |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_fp8_f32: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_fp8_f32 v0.l, v0, v0 |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_fp8_f32: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_fp8_f32 v0, v0, v0 |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_fp8_f32: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_cvt_pk_fp8_f32 v0, v0, v0 |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.f32(float %x, metadata !"Float8E4M3FN", metadata !"round.tonearest", i1 false) |
| ret i8 %r |
| } |
| |
| define i8 @to_bf8_f32(float %x) { |
| ; GFX950-LABEL: to_bf8_f32: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_cvt_pk_bf8_f32 v0, v0, v0 |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_bf8_f32: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_cvt_pk_bf8_f32 v0.l, v0, v0 |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_bf8_f32: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_bf8_f32 v0.l, v0, v0 |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_bf8_f32: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_bf8_f32 v0, v0, v0 |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_bf8_f32: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_cvt_pk_bf8_f32 v0, v0, v0 |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.f32(float %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 false) |
| ret i8 %r |
| } |
| |
| define <2 x i8> @to_fp8_v2f32(<2 x float> %x) { |
| ; GFX950-LABEL: to_fp8_v2f32: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_cvt_pk_fp8_f32 v0, v0, v1 |
| ; GFX950-NEXT: v_lshrrev_b16_e32 v1, 8, v0 |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_fp8_v2f32: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_cvt_pk_fp8_f32 v0.l, v0, v1 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1200-NEXT: v_lshrrev_b16 v1.l, 8, v0.l |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_fp8_v2f32: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_fp8_f32 v0.l, v0, v1 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-TRUE16-NEXT: v_lshrrev_b16 v1.l, 8, v0.l |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_fp8_v2f32: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_fp8_f32 v0, v0, v1 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-FAKE16-NEXT: v_lshrrev_b16 v1, 8, v0 |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_fp8_v2f32: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_cvt_pk_fp8_f32 v0, v0, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1310-NEXT: v_lshrrev_b16 v1, 8, v0 |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call <2 x i8> @llvm.convert.to.arbitrary.fp.v2i8.v2f32(<2 x float> %x, metadata !"Float8E4M3FN", metadata !"round.tonearest", i1 false) |
| ret <2 x i8> %r |
| } |
| |
| define <2 x i8> @to_bf8_v2f32(<2 x float> %x) { |
| ; GFX950-LABEL: to_bf8_v2f32: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_cvt_pk_bf8_f32 v0, v0, v1 |
| ; GFX950-NEXT: v_lshrrev_b16_e32 v1, 8, v0 |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_bf8_v2f32: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_cvt_pk_bf8_f32 v0.l, v0, v1 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1200-NEXT: v_lshrrev_b16 v1.l, 8, v0.l |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_bf8_v2f32: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_bf8_f32 v0.l, v0, v1 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-TRUE16-NEXT: v_lshrrev_b16 v1.l, 8, v0.l |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_bf8_v2f32: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_bf8_f32 v0, v0, v1 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-FAKE16-NEXT: v_lshrrev_b16 v1, 8, v0 |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_bf8_v2f32: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_cvt_pk_bf8_f32 v0, v0, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1310-NEXT: v_lshrrev_b16 v1, 8, v0 |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call <2 x i8> @llvm.convert.to.arbitrary.fp.v2i8.v2f32(<2 x float> %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 false) |
| ret <2 x i8> %r |
| } |
| |
| define <3 x i8> @to_fp8_v3f32(<3 x float> %x) { |
| ; GFX950-LABEL: to_fp8_v3f32: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_cvt_pk_fp8_f32 v0, v0, v0 |
| ; GFX950-NEXT: v_cvt_pk_fp8_f32 v1, v1, v1 |
| ; GFX950-NEXT: v_cvt_pk_fp8_f32 v2, v2, v2 |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_fp8_v3f32: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_cvt_pk_fp8_f32 v0.l, v0, v0 |
| ; GFX1200-NEXT: v_cvt_pk_fp8_f32 v1.l, v1, v1 |
| ; GFX1200-NEXT: v_cvt_pk_fp8_f32 v2.l, v2, v2 |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_fp8_v3f32: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_fp8_f32 v0.l, v0, v0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_fp8_f32 v1.l, v1, v1 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_fp8_f32 v2.l, v2, v2 |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_fp8_v3f32: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_fp8_f32 v0, v0, v0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_fp8_f32 v1, v1, v1 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_fp8_f32 v2, v2, v2 |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_fp8_v3f32: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_cvt_pk_fp8_f32 v0, v0, v0 |
| ; GFX1310-NEXT: v_cvt_pk_fp8_f32 v1, v1, v1 |
| ; GFX1310-NEXT: v_cvt_pk_fp8_f32 v2, v2, v2 |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call <3 x i8> @llvm.convert.to.arbitrary.fp.v3i8.v3f32(<3 x float> %x, metadata !"Float8E4M3FN", metadata !"round.tonearest", i1 false) |
| ret <3 x i8> %r |
| } |
| |
| define <3 x i8> @to_bf8_v3f32(<3 x float> %x) { |
| ; GFX950-LABEL: to_bf8_v3f32: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_cvt_pk_bf8_f32 v0, v0, v0 |
| ; GFX950-NEXT: v_cvt_pk_bf8_f32 v1, v1, v1 |
| ; GFX950-NEXT: v_cvt_pk_bf8_f32 v2, v2, v2 |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_bf8_v3f32: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_cvt_pk_bf8_f32 v0.l, v0, v0 |
| ; GFX1200-NEXT: v_cvt_pk_bf8_f32 v1.l, v1, v1 |
| ; GFX1200-NEXT: v_cvt_pk_bf8_f32 v2.l, v2, v2 |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_bf8_v3f32: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_bf8_f32 v0.l, v0, v0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_bf8_f32 v1.l, v1, v1 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_bf8_f32 v2.l, v2, v2 |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_bf8_v3f32: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_bf8_f32 v0, v0, v0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_bf8_f32 v1, v1, v1 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_bf8_f32 v2, v2, v2 |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_bf8_v3f32: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_cvt_pk_bf8_f32 v0, v0, v0 |
| ; GFX1310-NEXT: v_cvt_pk_bf8_f32 v1, v1, v1 |
| ; GFX1310-NEXT: v_cvt_pk_bf8_f32 v2, v2, v2 |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call <3 x i8> @llvm.convert.to.arbitrary.fp.v3i8.v3f32(<3 x float> %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 false) |
| ret <3 x i8> %r |
| } |
| |
| define <4 x i8> @to_fp8_v4f32(<4 x float> %x) { |
| ; GFX950-LABEL: to_fp8_v4f32: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_cvt_pk_fp8_f32 v2, v2, v3 |
| ; GFX950-NEXT: v_cvt_pk_fp8_f32 v0, v0, v1 |
| ; GFX950-NEXT: s_mov_b32 s0, 0xff00 |
| ; GFX950-NEXT: v_lshlrev_b32_e32 v1, 16, v2 |
| ; GFX950-NEXT: v_and_or_b32 v1, v0, s0, v1 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX950-NEXT: v_bfe_u32 v3, v2, 8, 8 |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_fp8_v4f32: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_cvt_pk_fp8_f32 v2.l, v2, v3 |
| ; GFX1200-NEXT: v_cvt_pk_fp8_f32 v0.l, v0, v1 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_lshlrev_b32_e32 v1, 16, v2 |
| ; GFX1200-NEXT: v_bfe_u32 v3, v2, 8, 8 |
| ; GFX1200-NEXT: v_and_or_b32 v1, 0xff00, v0, v1 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_fp8_v4f32: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_fp8_f32 v2.l, v2, v3 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_fp8_f32 v0.l, v0, v1 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 16, v2 |
| ; GFX1250-TRUE16-NEXT: v_bfe_u32 v3, v2, 8, 8 |
| ; GFX1250-TRUE16-NEXT: v_and_or_b32 v1, 0xff00, v0, v1 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_fp8_v4f32: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_fp8_f32 v2, v2, v3 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_fp8_f32 v0, v0, v1 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_lshlrev_b32_e32 v1, 16, v2 |
| ; GFX1250-FAKE16-NEXT: v_bfe_u32 v3, v2, 8, 8 |
| ; GFX1250-FAKE16-NEXT: v_and_or_b32 v1, 0xff00, v0, v1 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_fp8_v4f32: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_cvt_pk_fp8_f32 v2, v2, v3 |
| ; GFX1310-NEXT: v_cvt_pk_fp8_f32 v0, v0, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_lshlrev_b32_e32 v1, 16, v2 |
| ; GFX1310-NEXT: v_bfe_u32 v3, v2, 8, 8 |
| ; GFX1310-NEXT: v_and_or_b32 v1, 0xff00, v0, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call <4 x i8> @llvm.convert.to.arbitrary.fp.v4i8.v4f32(<4 x float> %x, metadata !"Float8E4M3FN", metadata !"round.tonearest", i1 false) |
| ret <4 x i8> %r |
| } |
| |
| define <4 x i8> @to_bf8_v4f32(<4 x float> %x) { |
| ; GFX950-LABEL: to_bf8_v4f32: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_cvt_pk_bf8_f32 v2, v2, v3 |
| ; GFX950-NEXT: v_cvt_pk_bf8_f32 v0, v0, v1 |
| ; GFX950-NEXT: s_mov_b32 s0, 0xff00 |
| ; GFX950-NEXT: v_lshlrev_b32_e32 v1, 16, v2 |
| ; GFX950-NEXT: v_and_or_b32 v1, v0, s0, v1 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX950-NEXT: v_bfe_u32 v3, v2, 8, 8 |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_bf8_v4f32: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_cvt_pk_bf8_f32 v2.l, v2, v3 |
| ; GFX1200-NEXT: v_cvt_pk_bf8_f32 v0.l, v0, v1 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_lshlrev_b32_e32 v1, 16, v2 |
| ; GFX1200-NEXT: v_bfe_u32 v3, v2, 8, 8 |
| ; GFX1200-NEXT: v_and_or_b32 v1, 0xff00, v0, v1 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_bf8_v4f32: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_bf8_f32 v2.l, v2, v3 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_bf8_f32 v0.l, v0, v1 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 16, v2 |
| ; GFX1250-TRUE16-NEXT: v_bfe_u32 v3, v2, 8, 8 |
| ; GFX1250-TRUE16-NEXT: v_and_or_b32 v1, 0xff00, v0, v1 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_bf8_v4f32: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_bf8_f32 v2, v2, v3 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_bf8_f32 v0, v0, v1 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_lshlrev_b32_e32 v1, 16, v2 |
| ; GFX1250-FAKE16-NEXT: v_bfe_u32 v3, v2, 8, 8 |
| ; GFX1250-FAKE16-NEXT: v_and_or_b32 v1, 0xff00, v0, v1 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_bf8_v4f32: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_cvt_pk_bf8_f32 v2, v2, v3 |
| ; GFX1310-NEXT: v_cvt_pk_bf8_f32 v0, v0, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_lshlrev_b32_e32 v1, 16, v2 |
| ; GFX1310-NEXT: v_bfe_u32 v3, v2, 8, 8 |
| ; GFX1310-NEXT: v_and_or_b32 v1, 0xff00, v0, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call <4 x i8> @llvm.convert.to.arbitrary.fp.v4i8.v4f32(<4 x float> %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 false) |
| ret <4 x i8> %r |
| } |
| |
| ; Saturation is not implemented by the HW conversion, so it uses the generic |
| ; expansion. |
| define i8 @to_fp8_f32_saturate(float %x) { |
| ; GFX950-LABEL: to_fp8_f32_saturate: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX950-NEXT: v_sub_u32_e32 v2, 15, v1 |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v3, v0 |
| ; GFX950-NEXT: v_min_u32_e32 v2, 31, v2 |
| ; GFX950-NEXT: v_and_b32_e32 v4, 0x7fffff, v3 |
| ; GFX950-NEXT: v_or_b32_e32 v5, 0x800000, v4 |
| ; GFX950-NEXT: v_sub_u32_e64 v7, v2, 1 clamp |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v8, v7, v5 |
| ; GFX950-NEXT: v_bfe_u32 v7, v5, 0, v7 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v7 |
| ; GFX950-NEXT: v_bfe_u32 v6, v5, v2, 1 |
| ; GFX950-NEXT: s_movk_i32 s0, 0x80 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v6, v8, v7, v6 bitop3:0xe0 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v2 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v2, v2, v5 |
| ; GFX950-NEXT: v_and_b32_e32 v7, 0x7ffff, v3 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v6, 0, v6, vcc |
| ; GFX950-NEXT: v_add_u32_e32 v2, v2, v6 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v2 |
| ; GFX950-NEXT: v_and_b32_sdwa v6, v0, s0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD |
| ; GFX950-NEXT: v_bfe_u32 v4, v4, 20, 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v5, 0, 8, vcc |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v7 |
| ; GFX950-NEXT: v_or3_b32 v2, v6, v5, v2 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v5, 19, v3 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v4, v5, v7, v4 bitop3:0xe0 |
| ; GFX950-NEXT: v_bfe_u32 v3, v3, 20, 3 |
| ; GFX950-NEXT: v_add_u32_e32 v3, v3, v4 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v3 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc |
| ; GFX950-NEXT: v_addc_co_u32_e32 v1, vcc, 6, v1, vcc |
| ; GFX950-NEXT: v_lshlrev_b32_e32 v4, 3, v1 |
| ; GFX950-NEXT: v_or3_b32 v4, v6, v4, v3 |
| ; GFX950-NEXT: v_cmp_gt_i32_e32 vcc, 1, v1 |
| ; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 15, v1 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v2, v4, v2, vcc |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 6, v3 |
| ; GFX950-NEXT: s_and_b64 s[0:1], s[0:1], vcc |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 15, v1 |
| ; GFX950-NEXT: v_or_b32_e32 v1, 0x7e, v6 |
| ; GFX950-NEXT: s_or_b64 vcc, vcc, s[0:1] |
| ; GFX950-NEXT: v_cndmask_b32_e32 v2, v2, v1, vcc |
| ; GFX950-NEXT: v_cmp_eq_f32_e32 vcc, 0, v0 |
| ; GFX950-NEXT: s_movk_i32 s0, 0x204 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v2, v2, v6, vcc |
| ; GFX950-NEXT: v_cmp_class_f32_e64 vcc, v0, s0 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v1, v2, v1, vcc |
| ; GFX950-NEXT: v_mov_b32_e32 v2, 0x7f |
| ; GFX950-NEXT: v_cmp_o_f32_e32 vcc, v0, v0 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_fp8_f32_saturate: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v3, v0 |
| ; GFX1200-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_sub_nc_u32_e32 v2, 15, v1 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: v_and_or_b32 v4, v3, s0, 0x800000 |
| ; GFX1200-NEXT: v_and_b32_e32 v6, 0x7ffff, v3 |
| ; GFX1200-NEXT: v_bfe_u32 v8, v3, 20, 3 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v3, 19, v3 |
| ; GFX1200-NEXT: v_min_u32_e32 v2, 31, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v6 |
| ; GFX1200-NEXT: v_sub_nc_u32_e64 v5, v2, 1 clamp |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v9, v2, v4 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc_lo |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_bfe_u32 v7, v4, 0, v5 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v4, v5, v4 |
| ; GFX1200-NEXT: v_and_or_b32 v6, v8, 1, v6 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v7 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v2 |
| ; GFX1200-NEXT: v_and_or_b32 v5, v9, 1, v7 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1) |
| ; GFX1200-NEXT: v_and_b32_e32 v4, v4, v5 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_dual_cndmask_b32 v2, 0, v4 :: v_dual_and_b32 v3, v3, v6 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v3, v8, v3 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v4, 24, v0 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v2, v9, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v3 |
| ; GFX1200-NEXT: v_and_b32_e32 v4, 0x80, v4 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v1, null, 6, v1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1200-NEXT: v_lshlrev_b32_e32 v5, 3, v1 |
| ; GFX1200-NEXT: v_cmp_gt_i32_e64 s2, 1, v1 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc_lo |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v6, 0, 8, vcc_lo |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 6, v3 |
| ; GFX1200-NEXT: v_or3_b32 v5, v4, v5, v3 |
| ; GFX1200-NEXT: v_cmp_eq_u32_e64 s0, 15, v1 |
| ; GFX1200-NEXT: v_cmp_lt_i32_e64 s1, 15, v1 |
| ; GFX1200-NEXT: v_or3_b32 v2, v4, v6, v2 |
| ; GFX1200-NEXT: s_and_b32 s0, s0, vcc_lo |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_4) | instid1(VALU_DEP_1) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v1, v5, v2, s2 |
| ; GFX1200-NEXT: v_or_b32_e32 v2, 0x7e, v4 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: s_or_b32 vcc_lo, s1, s0 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, v1, v2, vcc_lo |
| ; GFX1200-NEXT: v_cmp_eq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, v1, v4, vcc_lo |
| ; GFX1200-NEXT: v_cmp_class_f32_e64 vcc_lo, v0, 0x204 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, v1, v2, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v0, 0x7f, v1, vcc_lo |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-LABEL: to_fp8_f32_saturate: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1250-NEXT: v_frexp_mant_f32_e32 v2, v0 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_4) |
| ; GFX1250-NEXT: v_dual_sub_nc_u32 v3, 15, v1 :: v_dual_lshrrev_b32 v8, 19, v2 |
| ; GFX1250-NEXT: v_and_b32_e32 v4, 0x7fffff, v2 |
| ; GFX1250-NEXT: v_and_b32_e32 v7, 0x7ffff, v2 |
| ; GFX1250-NEXT: v_bfe_u32 v2, v2, 20, 3 |
| ; GFX1250-NEXT: v_min_u32_e32 v3, 31, v3 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1250-NEXT: v_or_b32_e32 v5, 0x800000, v4 |
| ; GFX1250-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v7 |
| ; GFX1250-NEXT: v_bfe_u32 v4, v4, 20, 1 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1250-NEXT: v_sub_nc_u32_e64 v6, v3, 1 clamp |
| ; GFX1250-NEXT: v_bfe_u32 v10, v5, v3, 1 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc_lo |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1250-NEXT: v_bfe_u32 v9, v5, 0, v6 |
| ; GFX1250-NEXT: v_dual_lshrrev_b32 v6, v6, v5 :: v_dual_lshrrev_b32 v5, v3, v5 |
| ; GFX1250-NEXT: v_bitop3_b32 v4, v8, v7, v4 bitop3:0xe0 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v9 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v9, 0, 1, vcc_lo |
| ; GFX1250-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v3 |
| ; GFX1250-NEXT: v_bitop3_b32 v6, v6, v9, v10 bitop3:0xe0 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1250-NEXT: v_dual_cndmask_b32 v3, 0, v6 :: v_dual_add_nc_u32 v2, v2, v4 |
| ; GFX1250-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v2 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3) |
| ; GFX1250-NEXT: v_dual_lshrrev_b32 v4, 24, v0 :: v_dual_add_nc_u32 v3, v5, v3 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc_lo |
| ; GFX1250-NEXT: v_add_co_ci_u32_e64 v1, null, 6, v1, vcc_lo |
| ; GFX1250-NEXT: v_and_b32_e32 v4, 0x80, v4 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1250-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v3 |
| ; GFX1250-NEXT: v_cmp_eq_u32_e64 s0, 15, v1 |
| ; GFX1250-NEXT: v_cmp_lt_i32_e64 s1, 15, v1 |
| ; GFX1250-NEXT: v_cmp_gt_i32_e64 s2, 1, v1 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v6, 0, 8, vcc_lo |
| ; GFX1250-NEXT: v_cmp_lt_i32_e32 vcc_lo, 6, v2 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(SALU_CYCLE_1) |
| ; GFX1250-NEXT: v_or3_b32 v3, v4, v6, v3 |
| ; GFX1250-NEXT: s_and_b32 s0, s0, vcc_lo |
| ; GFX1250-NEXT: s_or_b32 vcc_lo, s1, s0 |
| ; GFX1250-NEXT: v_lshlrev_b32_e32 v5, 3, v1 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_or3_b32 v5, v4, v5, v2 |
| ; GFX1250-NEXT: v_or_b32_e32 v2, 0x7e, v4 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v1, v5, v3, s2 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v1, v1, v2, vcc_lo |
| ; GFX1250-NEXT: v_cmp_eq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v1, v1, v4, vcc_lo |
| ; GFX1250-NEXT: v_cmp_class_f32_e64 vcc_lo, v0, 0x204 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v1, v1, v2, vcc_lo |
| ; GFX1250-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v0, 0x7f, v1, vcc_lo |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_fp8_f32_saturate: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v2, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_dual_sub_nc_u32 v3, 15, v1 :: v_dual_lshrrev_b32 v8, 19, v2 |
| ; GFX1310-NEXT: v_and_b32_e32 v4, 0x7fffff, v2 |
| ; GFX1310-NEXT: v_and_b32_e32 v7, 0x7ffff, v2 |
| ; GFX1310-NEXT: v_bfe_u32 v2, v2, 20, 3 |
| ; GFX1310-NEXT: v_min_u32_e32 v3, 31, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_or_b32_e32 v5, 0x800000, v4 |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v7 |
| ; GFX1310-NEXT: v_bfe_u32 v4, v4, 20, 1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_sub_nc_u32_e64 v6, v3, 1 clamp |
| ; GFX1310-NEXT: v_bfe_u32 v10, v5, v3, 1 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc_lo |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_bfe_u32 v9, v5, 0, v6 |
| ; GFX1310-NEXT: v_dual_lshrrev_b32 v6, v6, v5 :: v_dual_lshrrev_b32 v5, v3, v5 |
| ; GFX1310-NEXT: v_bitop3_b32 v4, v8, v7, v4 bitop3:0xe0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v9 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v9, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v3 |
| ; GFX1310-NEXT: v_bitop3_b32 v6, v6, v9, v10 bitop3:0xe0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_dual_cndmask_b32 v3, 0, v6 :: v_dual_add_nc_u32 v2, v2, v4 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_dual_lshrrev_b32 v4, 24, v0 :: v_dual_add_nc_u32 v3, v5, v3 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc_lo |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v1, null, 6, v1, vcc_lo |
| ; GFX1310-NEXT: v_and_b32_e32 v4, 0x80, v4 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v3 |
| ; GFX1310-NEXT: v_cmp_eq_u32_e64 s0, 15, v1 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e64 s1, 15, v1 |
| ; GFX1310-NEXT: v_cmp_gt_i32_e64 s2, 1, v1 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v6, 0, 8, vcc_lo |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 6, v2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(SALU_CYCLE_1) |
| ; GFX1310-NEXT: v_or3_b32 v3, v4, v6, v3 |
| ; GFX1310-NEXT: s_and_b32 s0, s0, vcc_lo |
| ; GFX1310-NEXT: s_or_b32 vcc_lo, s1, s0 |
| ; GFX1310-NEXT: v_lshlrev_b32_e32 v5, 3, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_or3_b32 v5, v4, v5, v2 |
| ; GFX1310-NEXT: v_or_b32_e32 v2, 0x7e, v4 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v1, v5, v3, s2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, v1, v2, vcc_lo |
| ; GFX1310-NEXT: v_cmp_eq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, v1, v4, vcc_lo |
| ; GFX1310-NEXT: v_cmp_class_f32_e64 vcc_lo, v0, 0x204 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, v1, v2, vcc_lo |
| ; GFX1310-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v0, 0x7f, v1, vcc_lo |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.f32(float %x, metadata !"Float8E4M3FN", metadata !"round.tonearest", i1 true) |
| ret i8 %r |
| } |
| |
| ; Only round-to-nearest-even maps to the HW conversion. |
| define i8 @to_fp8_f32_towardzero(float %x) { |
| ; GFX950-LABEL: to_fp8_f32_towardzero: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v1, v0 |
| ; GFX950-NEXT: v_bfe_u32 v2, v1, 20, 3 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v2 |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v4, v0 |
| ; GFX950-NEXT: v_and_b32_e32 v1, 0x7fffff, v1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc |
| ; GFX950-NEXT: v_addc_co_u32_e32 v5, vcc, 6, v4, vcc |
| ; GFX950-NEXT: v_sub_u32_e32 v4, 15, v4 |
| ; GFX950-NEXT: v_or_b32_e32 v1, 0x800000, v1 |
| ; GFX950-NEXT: v_min_u32_e32 v4, 31, v4 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v1, v4, v1 |
| ; GFX950-NEXT: s_movk_i32 s0, 0x80 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v1 |
| ; GFX950-NEXT: v_and_b32_sdwa v3, v0, s0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD |
| ; GFX950-NEXT: v_lshlrev_b32_e32 v6, 3, v5 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v4, 0, 8, vcc |
| ; GFX950-NEXT: v_or3_b32 v2, v3, v6, v2 |
| ; GFX950-NEXT: v_or3_b32 v1, v3, v4, v1 |
| ; GFX950-NEXT: v_cmp_gt_i32_e32 vcc, 1, v5 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v1, v2, v1, vcc |
| ; GFX950-NEXT: v_cmp_eq_f32_e32 vcc, 0, v0 |
| ; GFX950-NEXT: v_mov_b32_e32 v2, 0x7f |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc |
| ; GFX950-NEXT: v_cmp_o_f32_e32 vcc, v0, v0 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_fp8_f32_towardzero: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v2, v0 |
| ; GFX1200-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_sub_nc_u32_e32 v3, 15, v1 |
| ; GFX1200-NEXT: v_bfe_u32 v4, v2, 20, 3 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: v_and_or_b32 v2, v2, s0, 0x800000 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_min_u32_e32 v3, 31, v3 |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v4 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v2, v3, v2 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v4, v4, 0, vcc_lo |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v3, 24, v0 |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v1, null, 6, v1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_and_b32_e32 v3, 0x80, v3 |
| ; GFX1200-NEXT: v_lshlrev_b32_e32 v5, 3, v1 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc_lo |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v6, 0, 8, vcc_lo |
| ; GFX1200-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v1 |
| ; GFX1200-NEXT: v_or3_b32 v4, v3, v5, v4 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_1) |
| ; GFX1200-NEXT: v_or3_b32 v2, v3, v6, v2 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc_lo |
| ; GFX1200-NEXT: v_cmp_eq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v0, 0x7f, v1, vcc_lo |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-LABEL: to_fp8_f32_towardzero: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-NEXT: v_frexp_mant_f32_e32 v2, v0 |
| ; GFX1250-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1250-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_bfe_u32 v4, v2, 20, 3 |
| ; GFX1250-NEXT: v_sub_nc_u32_e32 v3, 15, v1 |
| ; GFX1250-NEXT: v_and_or_b32 v2, v2, s0, 0x800000 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v4 |
| ; GFX1250-NEXT: v_add_co_ci_u32_e64 v1, null, 6, v1, vcc_lo |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v4, v4, 0, vcc_lo |
| ; GFX1250-NEXT: v_lshlrev_b32_e32 v5, 3, v1 |
| ; GFX1250-NEXT: v_min_u32_e32 v3, 31, v3 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1250-NEXT: v_dual_lshrrev_b32 v2, v3, v2 :: v_dual_lshrrev_b32 v3, 24, v0 |
| ; GFX1250-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v2 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3) |
| ; GFX1250-NEXT: v_and_b32_e32 v3, 0x80, v3 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc_lo |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v6, 0, 8, vcc_lo |
| ; GFX1250-NEXT: v_or3_b32 v4, v3, v5, v4 |
| ; GFX1250-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v1 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1250-NEXT: v_or3_b32 v2, v3, v6, v2 |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc_lo |
| ; GFX1250-NEXT: v_cmp_eq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc_lo |
| ; GFX1250-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v0, 0x7f, v1, vcc_lo |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_fp8_f32_towardzero: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v2, v0 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1310-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_bfe_u32 v4, v2, 20, 3 |
| ; GFX1310-NEXT: v_sub_nc_u32_e32 v3, 15, v1 |
| ; GFX1310-NEXT: v_and_or_b32 v2, v2, s0, 0x800000 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v4 |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v1, null, 6, v1, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v4, v4, 0, vcc_lo |
| ; GFX1310-NEXT: v_lshlrev_b32_e32 v5, 3, v1 |
| ; GFX1310-NEXT: v_min_u32_e32 v3, 31, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_dual_lshrrev_b32 v2, v3, v2 :: v_dual_lshrrev_b32 v3, 24, v0 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_and_b32_e32 v3, 0x80, v3 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v6, 0, 8, vcc_lo |
| ; GFX1310-NEXT: v_or3_b32 v4, v3, v5, v4 |
| ; GFX1310-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_or3_b32 v2, v3, v6, v2 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, v4, v2, vcc_lo |
| ; GFX1310-NEXT: v_cmp_eq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, v1, v3, vcc_lo |
| ; GFX1310-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v0, 0x7f, v1, vcc_lo |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.f32(float %x, metadata !"Float8E4M3FN", metadata !"round.towardzero", i1 false) |
| ret i8 %r |
| } |
| |
| ; FP4 has no unscaled HW conversion, only the scalef32 family, so it uses the |
| ; generic expansion. |
| define i4 @to_fp4_f32(float %x) { |
| ; GFX950-LABEL: to_fp4_f32: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX950-NEXT: v_sub_u32_e32 v2, 23, v1 |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v3, v0 |
| ; GFX950-NEXT: v_min_u32_e32 v2, 31, v2 |
| ; GFX950-NEXT: v_and_b32_e32 v4, 0x7fffff, v3 |
| ; GFX950-NEXT: v_or_b32_e32 v4, 0x800000, v4 |
| ; GFX950-NEXT: v_sub_u32_e64 v6, v2, 1 clamp |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v7, v6, v4 |
| ; GFX950-NEXT: v_bfe_u32 v6, v4, 0, v6 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v6 |
| ; GFX950-NEXT: v_bfe_u32 v5, v4, v2, 1 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v5, v7, v6, v5 bitop3:0xe0 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v2 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v2, v2, v4 |
| ; GFX950-NEXT: v_and_b32_e32 v6, 0x1fffff, v3 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v5, 0, v5, vcc |
| ; GFX950-NEXT: v_add_u32_e32 v2, v2, v5 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 1, v2 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v5, 28, v0 |
| ; GFX950-NEXT: v_and_b32_e32 v5, 8, v5 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v4, 0, 2, vcc |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v6 |
| ; GFX950-NEXT: v_or3_b32 v2, v5, v4, v2 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v4, 21, v3 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc |
| ; GFX950-NEXT: v_bfe_u32 v3, v3, 22, 1 |
| ; GFX950-NEXT: v_bitop3_b32 v4, v4, v6, v3 bitop3:0xe0 |
| ; GFX950-NEXT: v_add_u32_e32 v3, v3, v4 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 1, v3 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc |
| ; GFX950-NEXT: v_addc_co_u32_e32 v1, vcc, 0, v1, vcc |
| ; GFX950-NEXT: v_lshlrev_b32_e32 v4, 1, v1 |
| ; GFX950-NEXT: v_or3_b32 v3, v5, v4, v3 |
| ; GFX950-NEXT: v_cmp_gt_i32_e32 vcc, 1, v1 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v1, v3, v2, vcc |
| ; GFX950-NEXT: v_cmp_eq_f32_e32 vcc, 0, v0 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v0, v1, v5, vcc |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_fp4_f32: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v3, v0 |
| ; GFX1200-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_sub_nc_u32_e32 v2, 23, v1 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: v_and_or_b32 v4, v3, s0, 0x800000 |
| ; GFX1200-NEXT: v_bfe_u32 v8, v3, 22, 1 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1200-NEXT: v_min_u32_e32 v2, 31, v2 |
| ; GFX1200-NEXT: v_sub_nc_u32_e64 v5, v2, 1 clamp |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v9, v2, v4 |
| ; GFX1200-NEXT: v_bfe_u32 v6, v4, 0, v5 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v4, v5, v4 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1) |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v6 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_and_or_b32 v5, v9, 1, v6 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_and_b32_e32 v4, v4, v5 |
| ; GFX1200-NEXT: v_and_b32_e32 v7, 0x1fffff, v3 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v3, 21, v3 |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v7 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_or_b32_e32 v6, v7, v8 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v2, 0, v4, vcc_lo |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v4, 28, v0 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v2, v9, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_and_b32_e32 v4, 8, v4 |
| ; GFX1200-NEXT: v_and_b32_e32 v3, v3, v6 |
| ; GFX1200-NEXT: v_cmp_lt_i32_e64 s0, 1, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v3, v8, v3 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v2, v2, 0, s0 |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v5, 0, 2, s0 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 1, v3 |
| ; GFX1200-NEXT: v_or3_b32 v2, v4, v5, v2 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_lshlrev_b32_e32 v6, 1, v1 |
| ; GFX1200-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v1 |
| ; GFX1200-NEXT: v_or3_b32 v3, v4, v6, v3 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, v3, v2, vcc_lo |
| ; GFX1200-NEXT: v_cmp_eq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v0, v1, v4, vcc_lo |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-LABEL: to_fp4_f32: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1250-NEXT: v_frexp_mant_f32_e32 v3, v0 |
| ; GFX1250-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_4) |
| ; GFX1250-NEXT: v_dual_sub_nc_u32 v2, 23, v1 :: v_dual_lshrrev_b32 v6, 21, v3 |
| ; GFX1250-NEXT: v_and_or_b32 v4, v3, s0, 0x800000 |
| ; GFX1250-NEXT: v_and_b32_e32 v8, 0x1fffff, v3 |
| ; GFX1250-NEXT: v_bfe_u32 v3, v3, 22, 1 |
| ; GFX1250-NEXT: v_min_u32_e32 v2, 31, v2 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_sub_nc_u32_e64 v5, v2, 1 clamp |
| ; GFX1250-NEXT: v_bfe_u32 v9, v4, v2, 1 |
| ; GFX1250-NEXT: v_bfe_u32 v7, v4, 0, v5 |
| ; GFX1250-NEXT: v_dual_lshrrev_b32 v5, v5, v4 :: v_dual_lshrrev_b32 v4, v2, v4 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v7 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc_lo |
| ; GFX1250-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v8 |
| ; GFX1250-NEXT: v_bitop3_b32 v5, v5, v7, v9 bitop3:0xe0 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v8, 0, 1, vcc_lo |
| ; GFX1250-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v2 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1250-NEXT: v_bitop3_b32 v6, v6, v8, v3 bitop3:0xe0 |
| ; GFX1250-NEXT: v_dual_cndmask_b32 v2, 0, v5 :: v_dual_add_nc_u32 v3, v3, v6 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_dual_add_nc_u32 v2, v4, v2 :: v_dual_lshrrev_b32 v4, 28, v0 |
| ; GFX1250-NEXT: v_cmp_lt_i32_e32 vcc_lo, 1, v3 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_4) |
| ; GFX1250-NEXT: v_cmp_lt_i32_e64 s0, 1, v2 |
| ; GFX1250-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1250-NEXT: v_and_b32_e32 v4, 8, v4 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v2, v2, 0, s0 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v5, 0, 2, s0 |
| ; GFX1250-NEXT: v_lshlrev_b32_e32 v6, 1, v1 |
| ; GFX1250-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v1 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1250-NEXT: v_or3_b32 v2, v4, v5, v2 |
| ; GFX1250-NEXT: v_or3_b32 v3, v4, v6, v3 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v1, v3, v2, vcc_lo |
| ; GFX1250-NEXT: v_cmp_eq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v0, v1, v4, vcc_lo |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_fp4_f32: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v3, v0 |
| ; GFX1310-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_dual_sub_nc_u32 v2, 23, v1 :: v_dual_lshrrev_b32 v6, 21, v3 |
| ; GFX1310-NEXT: v_and_or_b32 v4, v3, s0, 0x800000 |
| ; GFX1310-NEXT: v_and_b32_e32 v8, 0x1fffff, v3 |
| ; GFX1310-NEXT: v_bfe_u32 v3, v3, 22, 1 |
| ; GFX1310-NEXT: v_min_u32_e32 v2, 31, v2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_sub_nc_u32_e64 v5, v2, 1 clamp |
| ; GFX1310-NEXT: v_bfe_u32 v9, v4, v2, 1 |
| ; GFX1310-NEXT: v_bfe_u32 v7, v4, 0, v5 |
| ; GFX1310-NEXT: v_dual_lshrrev_b32 v5, v5, v4 :: v_dual_lshrrev_b32 v4, v2, v4 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v7 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v8 |
| ; GFX1310-NEXT: v_bitop3_b32 v5, v5, v7, v9 bitop3:0xe0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v8, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_bitop3_b32 v6, v6, v8, v3 bitop3:0xe0 |
| ; GFX1310-NEXT: v_dual_cndmask_b32 v2, 0, v5 :: v_dual_add_nc_u32 v3, v3, v6 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_dual_add_nc_u32 v2, v4, v2 :: v_dual_lshrrev_b32 v4, 28, v0 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 1, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_cmp_lt_i32_e64 s0, 1, v2 |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v1, null, 0, v1, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1310-NEXT: v_and_b32_e32 v4, 8, v4 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v2, v2, 0, s0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v5, 0, 2, s0 |
| ; GFX1310-NEXT: v_lshlrev_b32_e32 v6, 1, v1 |
| ; GFX1310-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_or3_b32 v2, v4, v5, v2 |
| ; GFX1310-NEXT: v_or3_b32 v3, v4, v6, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, v3, v2, vcc_lo |
| ; GFX1310-NEXT: v_cmp_eq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v0, v1, v4, vcc_lo |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call i4 @llvm.convert.to.arbitrary.fp.i4.f32(float %x, metadata !"Float4E2M1FN", metadata !"round.tonearest", i1 false) |
| ret i4 %r |
| } |
| |
| ; f64 source has no HW conversion, so it uses the generic expansion. |
| define i8 @to_fp8_f64(double %x) { |
| ; GFX950-LABEL: to_fp8_f64: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_frexp_exp_i32_f64_e32 v2, v[0:1] |
| ; GFX950-NEXT: v_ashrrev_i32_e32 v3, 31, v2 |
| ; GFX950-NEXT: v_sub_co_u32_e32 v4, vcc, 37, v2 |
| ; GFX950-NEXT: v_frexp_mant_f64_e32 v[10:11], v[0:1] |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_subb_co_u32_e32 v5, vcc, 0, v3, vcc |
| ; GFX950-NEXT: v_cmp_gt_u64_e32 vcc, 63, v[4:5] |
| ; GFX950-NEXT: v_and_b32_e32 v14, 0xfffff, v11 |
| ; GFX950-NEXT: v_or_b32_e32 v13, 0x100000, v14 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v5, 0, v5, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e32 v4, 63, v4, vcc |
| ; GFX950-NEXT: v_cmp_lt_u64_e32 vcc, 1, v[4:5] |
| ; GFX950-NEXT: v_mov_b32_e32 v12, v10 |
| ; GFX950-NEXT: v_mov_b32_e32 v7, 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v6, 1, v4, vcc |
| ; GFX950-NEXT: v_add_u32_e32 v6, -1, v6 |
| ; GFX950-NEXT: v_lshlrev_b64 v[8:9], v6, 1 |
| ; GFX950-NEXT: v_lshl_add_u64 v[8:9], v[8:9], 0, -1 |
| ; GFX950-NEXT: v_and_b32_e32 v9, v13, v9 |
| ; GFX950-NEXT: v_and_b32_e32 v8, v10, v8 |
| ; GFX950-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[8:9] |
| ; GFX950-NEXT: v_lshrrev_b64 v[8:9], v4, v[12:13] |
| ; GFX950-NEXT: v_and_b32_e32 v16, 1, v8 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v15, 0, 1, vcc |
| ; GFX950-NEXT: v_or_b32_e32 v15, v15, v16 |
| ; GFX950-NEXT: v_lshrrev_b64 v[12:13], v6, v[12:13] |
| ; GFX950-NEXT: v_and_b32_e32 v6, v12, v15 |
| ; GFX950-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[4:5] |
| ; GFX950-NEXT: s_movk_i32 s1, 0x80 |
| ; GFX950-NEXT: s_mov_b32 s0, 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v6, 0, v6, vcc |
| ; GFX950-NEXT: v_lshl_add_u64 v[4:5], v[8:9], 0, v[6:7] |
| ; GFX950-NEXT: v_cmp_lt_i64_e32 vcc, 3, v[4:5] |
| ; GFX950-NEXT: v_and_b32_sdwa v8, v1, s1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_3 src1_sel:DWORD |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v4, v4, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v5, 0, 4, vcc |
| ; GFX950-NEXT: v_or3_b32 v9, v8, v5, v4 |
| ; GFX950-NEXT: v_and_b32_e32 v5, 0x1ffff, v11 |
| ; GFX950-NEXT: v_mov_b32_e32 v4, v10 |
| ; GFX950-NEXT: v_cmp_ne_u64_e32 vcc, 0, v[4:5] |
| ; GFX950-NEXT: v_bfe_u32 v5, v14, 18, 1 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v4, 0, 1, vcc |
| ; GFX950-NEXT: v_or_b32_e32 v4, v4, v5 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v5, 17, v11 |
| ; GFX950-NEXT: v_and_b32_e32 v6, v5, v4 |
| ; GFX950-NEXT: v_bfe_u32 v4, v11, 18, 2 |
| ; GFX950-NEXT: v_mov_b32_e32 v5, v7 |
| ; GFX950-NEXT: v_lshl_add_u64 v[4:5], v[4:5], 0, v[6:7] |
| ; GFX950-NEXT: v_cmp_lt_i64_e32 vcc, 3, v[4:5] |
| ; GFX950-NEXT: v_mov_b32_e32 v7, s0 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc |
| ; GFX950-NEXT: v_lshl_add_u64 v[2:3], v[2:3], 0, v[6:7] |
| ; GFX950-NEXT: v_lshl_add_u64 v[2:3], v[2:3], 0, 14 |
| ; GFX950-NEXT: v_lshlrev_b64 v[6:7], 2, v[2:3] |
| ; GFX950-NEXT: v_cndmask_b32_e64 v4, v4, 0, vcc |
| ; GFX950-NEXT: v_or_b32_e32 v6, v6, v8 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v5, v5, 0, vcc |
| ; GFX950-NEXT: v_or_b32_e32 v6, v6, v4 |
| ; GFX950-NEXT: v_cmp_gt_i64_e32 vcc, 1, v[2:3] |
| ; GFX950-NEXT: v_cmp_eq_u64_e64 s[0:1], 30, v[2:3] |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v6, v6, v9, vcc |
| ; GFX950-NEXT: v_cmp_lt_i64_e32 vcc, 3, v[4:5] |
| ; GFX950-NEXT: s_and_b64 s[0:1], s[0:1], vcc |
| ; GFX950-NEXT: v_cmp_lt_i64_e32 vcc, 30, v[2:3] |
| ; GFX950-NEXT: v_or_b32_e32 v2, 0x7c, v8 |
| ; GFX950-NEXT: s_or_b64 vcc, vcc, s[0:1] |
| ; GFX950-NEXT: v_cndmask_b32_e32 v3, v6, v2, vcc |
| ; GFX950-NEXT: v_cmp_eq_f64_e32 vcc, 0, v[0:1] |
| ; GFX950-NEXT: s_movk_i32 s0, 0x204 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v3, v3, v8, vcc |
| ; GFX950-NEXT: v_cmp_class_f64_e64 vcc, v[0:1], s0 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v2, v3, v2, vcc |
| ; GFX950-NEXT: v_mov_b32_e32 v3, 0x7e |
| ; GFX950-NEXT: v_cmp_o_f64_e32 vcc, v[0:1], v[0:1] |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v0, v3, v2, vcc |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_fp8_f64: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f64_e32 v12, v[0:1] |
| ; GFX1200-NEXT: v_frexp_mant_f64_e32 v[2:3], v[0:1] |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_ashrrev_i32_e32 v13, 31, v12 |
| ; GFX1200-NEXT: v_sub_co_u32 v4, vcc_lo, 37, v12 |
| ; GFX1200-NEXT: v_dual_mov_b32 v6, v2 :: v_dual_and_b32 v9, 0xfffff, v3 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_4) |
| ; GFX1200-NEXT: v_sub_co_ci_u32_e64 v5, null, 0, v13, vcc_lo |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v15, 17, v3 |
| ; GFX1200-NEXT: v_bfe_u32 v17, v3, 18, 2 |
| ; GFX1200-NEXT: v_bfe_u32 v11, v9, 18, 1 |
| ; GFX1200-NEXT: v_cmp_gt_u64_e32 vcc_lo, 63, v[4:5] |
| ; GFX1200-NEXT: v_or_b32_e32 v9, 0x100000, v9 |
| ; GFX1200-NEXT: v_and_b32_e32 v7, 0x1ffff, v3 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_dual_cndmask_b32 v5, 0, v5 :: v_dual_cndmask_b32 v4, 63, v4 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cmp_lt_u64_e32 vcc_lo, 1, v[4:5] |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v8, 1, v4, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u64_e32 vcc_lo, 0, v[6:7] |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v14, -1, v8 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v10, 0, 1, vcc_lo |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_lshlrev_b64_e64 v[6:7], v14, 1 |
| ; GFX1200-NEXT: v_or_b32_e32 v10, v10, v11 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_add_co_u32 v11, vcc_lo, v6, -1 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v16, null, -1, v7, vcc_lo |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_4) |
| ; GFX1200-NEXT: v_and_b32_e32 v10, v15, v10 |
| ; GFX1200-NEXT: v_mov_b32_e32 v8, v2 |
| ; GFX1200-NEXT: v_and_b32_e32 v2, v2, v11 |
| ; GFX1200-NEXT: v_and_b32_e32 v3, v9, v16 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1200-NEXT: v_add_co_u32 v10, s0, v17, v10 |
| ; GFX1200-NEXT: v_lshrrev_b64 v[6:7], v4, v[8:9] |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_4) |
| ; GFX1200-NEXT: v_cmp_ne_u64_e32 vcc_lo, 0, v[2:3] |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v11, null, 0, 0, s0 |
| ; GFX1200-NEXT: v_lshrrev_b64 v[2:3], v14, v[8:9] |
| ; GFX1200-NEXT: v_and_b32_e32 v15, 1, v6 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v16, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_lt_i64_e32 vcc_lo, 3, v[10:11] |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1200-NEXT: v_or_b32_e32 v8, v16, v15 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v9, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v3, v11, 0, vcc_lo |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v11, 24, v1 |
| ; GFX1200-NEXT: v_and_b32_e32 v2, v2, v8 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_4) | instid1(VALU_DEP_1) |
| ; GFX1200-NEXT: v_add_co_u32 v8, s0, v12, v9 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v9, null, 0, v13, s0 |
| ; GFX1200-NEXT: v_cmp_ne_u64_e64 s0, 0, v[4:5] |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v2, 0, v2, s0 |
| ; GFX1200-NEXT: v_add_co_u32 v4, s0, v8, 14 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v5, null, 0, v9, s0 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_add_co_u32 v6, s0, v6, v2 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v7, null, 0, v7, s0 |
| ; GFX1200-NEXT: v_lshlrev_b64_e32 v[8:9], 2, v[4:5] |
| ; GFX1200-NEXT: v_and_b32_e32 v9, 0x80, v11 |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v2, v10, 0, vcc_lo |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) |
| ; GFX1200-NEXT: v_cmp_lt_i64_e64 s0, 3, v[6:7] |
| ; GFX1200-NEXT: v_cmp_gt_i64_e64 s2, 1, v[4:5] |
| ; GFX1200-NEXT: v_cmp_lt_i64_e64 s1, 30, v[4:5] |
| ; GFX1200-NEXT: v_or_b32_e32 v7, v8, v9 |
| ; GFX1200-NEXT: v_cmp_lt_i64_e32 vcc_lo, 3, v[2:3] |
| ; GFX1200-NEXT: v_or_b32_e32 v3, 0x7c, v9 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v6, v6, 0, s0 |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v8, 0, 4, s0 |
| ; GFX1200-NEXT: v_or_b32_e32 v7, v7, v2 |
| ; GFX1200-NEXT: v_cmp_eq_u64_e64 s0, 30, v[4:5] |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_1) |
| ; GFX1200-NEXT: v_or3_b32 v6, v9, v8, v6 |
| ; GFX1200-NEXT: s_and_b32 s0, s0, vcc_lo |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v2, v7, v6, s2 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: s_or_b32 vcc_lo, s1, s0 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v2, v2, v3, vcc_lo |
| ; GFX1200-NEXT: v_cmp_eq_f64_e32 vcc_lo, 0, v[0:1] |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v2, v2, v9, vcc_lo |
| ; GFX1200-NEXT: v_cmp_class_f64_e64 vcc_lo, v[0:1], 0x204 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v2, v2, v3, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f64_e32 vcc_lo, v[0:1], v[0:1] |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v0, 0x7e, v2, vcc_lo |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-LABEL: to_fp8_f64: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-NEXT: v_frexp_exp_i32_f64_e32 v2, v[0:1] |
| ; GFX1250-NEXT: v_frexp_mant_f64_e32 v[4:5], v[0:1] |
| ; GFX1250-NEXT: s_mov_b32 s0, 0 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_ashrrev_i32_e32 v3, 31, v2 |
| ; GFX1250-NEXT: v_and_b32_e32 v15, 0xfffff, v5 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1250-NEXT: v_mov_b32_e32 v10, v4 |
| ; GFX1250-NEXT: v_sub_nc_u64_e32 v[6:7], 37, v[2:3] |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_or_b32_e32 v11, 0x100000, v15 |
| ; GFX1250-NEXT: v_cmp_gt_u64_e32 vcc_lo, 63, v[6:7] |
| ; GFX1250-NEXT: v_dual_cndmask_b32 v7, 0, v7 :: v_dual_cndmask_b32 v6, 63, v6 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1) |
| ; GFX1250-NEXT: v_cmp_lt_u64_e32 vcc_lo, 1, v[6:7] |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v8, 1, v6, vcc_lo |
| ; GFX1250-NEXT: v_add_nc_u32_e32 v14, -1, v8 |
| ; GFX1250-NEXT: v_lshrrev_b64 v[12:13], v6, v[10:11] |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_lshlrev_b64_e64 v[8:9], v14, 1 |
| ; GFX1250-NEXT: v_and_b32_e32 v16, 1, v12 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1250-NEXT: v_add_nc_u64_e32 v[8:9], -1, v[8:9] |
| ; GFX1250-NEXT: v_and_b32_e32 v9, v11, v9 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3) |
| ; GFX1250-NEXT: v_and_b32_e32 v8, v4, v8 |
| ; GFX1250-NEXT: v_lshrrev_b64 v[10:11], v14, v[10:11] |
| ; GFX1250-NEXT: v_lshrrev_b32_e32 v14, 17, v5 |
| ; GFX1250-NEXT: v_cmp_ne_u64_e32 vcc_lo, 0, v[8:9] |
| ; GFX1250-NEXT: v_and_b32_e32 v9, 0x1ffff, v5 |
| ; GFX1250-NEXT: v_mov_b32_e32 v8, v4 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v17, 0, 1, vcc_lo |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cmp_ne_u64_e32 vcc_lo, 0, v[8:9] |
| ; GFX1250-NEXT: v_dual_mov_b32 v9, 0 :: v_dual_bitop2_b32 v4, v17, v16 bitop3:0x54 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v11, 0, 1, vcc_lo |
| ; GFX1250-NEXT: v_cmp_ne_u64_e32 vcc_lo, 0, v[6:7] |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_dual_mov_b32 v7, v9 :: v_dual_bitop2_b32 v4, v10, v4 bitop3:0x40 |
| ; GFX1250-NEXT: v_bfe_u32 v10, v15, 18, 1 |
| ; GFX1250-NEXT: v_bfe_u32 v6, v5, 18, 2 |
| ; GFX1250-NEXT: v_dual_cndmask_b32 v8, 0, v4, vcc_lo :: v_dual_bitop2_b32 v10, v11, v10 bitop3:0x54 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_add_nc_u64_e32 v[4:5], v[12:13], v[8:9] |
| ; GFX1250-NEXT: v_dual_lshrrev_b32 v10, 24, v1 :: v_dual_bitop2_b32 v8, v14, v10 bitop3:0x40 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_4) |
| ; GFX1250-NEXT: v_add_nc_u64_e32 v[6:7], v[6:7], v[8:9] |
| ; GFX1250-NEXT: v_mov_b32_e32 v9, s0 |
| ; GFX1250-NEXT: v_cmp_lt_i64_e64 s0, 3, v[4:5] |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1250-NEXT: v_and_b32_e32 v5, 0x80, v10 |
| ; GFX1250-NEXT: v_cmp_lt_i64_e32 vcc_lo, 3, v[6:7] |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_3) |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v4, v4, 0, s0 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v8, 0, 1, vcc_lo |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v7, v7, 0, vcc_lo |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v6, v6, 0, vcc_lo |
| ; GFX1250-NEXT: v_add_nc_u64_e32 v[2:3], v[2:3], v[8:9] |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cmp_lt_i64_e32 vcc_lo, 3, v[6:7] |
| ; GFX1250-NEXT: v_add_nc_u64_e32 v[2:3], 14, v[2:3] |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-NEXT: v_lshlrev_b64_e32 v[8:9], 2, v[2:3] |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v9, 0, 4, s0 |
| ; GFX1250-NEXT: v_cmp_eq_u64_e64 s0, 30, v[2:3] |
| ; GFX1250-NEXT: v_cmp_lt_i64_e64 s1, 30, v[2:3] |
| ; GFX1250-NEXT: v_cmp_gt_i64_e64 s2, 1, v[2:3] |
| ; GFX1250-NEXT: v_or_b32_e32 v3, 0x7c, v5 |
| ; GFX1250-NEXT: v_or3_b32 v4, v5, v9, v4 |
| ; GFX1250-NEXT: s_and_b32 s0, s0, vcc_lo |
| ; GFX1250-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(VALU_DEP_1) |
| ; GFX1250-NEXT: s_or_b32 vcc_lo, s1, s0 |
| ; GFX1250-NEXT: v_or_b32_e32 v8, v8, v5 |
| ; GFX1250-NEXT: v_or_b32_e32 v8, v8, v6 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v2, v8, v4, s2 |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v2, v2, v3, vcc_lo |
| ; GFX1250-NEXT: v_cmp_eq_f64_e32 vcc_lo, 0, v[0:1] |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v2, v2, v5, vcc_lo |
| ; GFX1250-NEXT: v_cmp_class_f64_e64 vcc_lo, v[0:1], 0x204 |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v2, v2, v3, vcc_lo |
| ; GFX1250-NEXT: v_cmp_o_f64_e32 vcc_lo, v[0:1], v[0:1] |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v0, 0x7e, v2, vcc_lo |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_fp8_f64: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f64_e32 v12, v[0:1] |
| ; GFX1310-NEXT: v_frexp_mant_f64_e32 v[2:3], v[0:1] |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_ashrrev_i32_e32 v13, 31, v12 |
| ; GFX1310-NEXT: v_sub_co_u32 v4, vcc_lo, 37, v12 |
| ; GFX1310-NEXT: v_and_b32_e32 v7, 0x1ffff, v3 |
| ; GFX1310-NEXT: v_and_b32_e32 v9, 0xfffff, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_2) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_sub_co_ci_u32_e64 v5, null, 0, v13, vcc_lo |
| ; GFX1310-NEXT: v_bfe_u32 v17, v3, 18, 2 |
| ; GFX1310-NEXT: v_mov_b32_e32 v6, v2 |
| ; GFX1310-NEXT: v_bfe_u32 v11, v9, 18, 1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_3) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_cmp_gt_u64_e32 vcc_lo, 63, v[4:5] |
| ; GFX1310-NEXT: v_or_b32_e32 v9, 0x100000, v9 |
| ; GFX1310-NEXT: v_dual_lshrrev_b32 v15, 17, v3 :: v_dual_cndmask_b32 v5, 0, v5, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v4, 63, v4, vcc_lo |
| ; GFX1310-NEXT: v_cmp_lt_u64_e32 vcc_lo, 1, v[4:5] |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v8, 1, v4, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u64_e32 vcc_lo, 0, v[6:7] |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_dual_add_nc_u32 v14, -1, v8 :: v_dual_mov_b32 v8, v2 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v10, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_lshlrev_b64_e64 v[6:7], v14, 1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_or_b32_e32 v10, v10, v11 |
| ; GFX1310-NEXT: v_add_co_u32 v11, vcc_lo, v6, -1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v16, null, -1, v7, vcc_lo |
| ; GFX1310-NEXT: v_and_b32_e32 v10, v15, v10 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_and_b32_e32 v2, v2, v11 |
| ; GFX1310-NEXT: v_lshrrev_b64 v[6:7], v4, v[8:9] |
| ; GFX1310-NEXT: v_and_b32_e32 v3, v9, v16 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_add_co_u32 v10, s0, v17, v10 |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v11, null, 0, 0, s0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_4) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cmp_ne_u64_e32 vcc_lo, 0, v[2:3] |
| ; GFX1310-NEXT: v_and_b32_e32 v15, 1, v6 |
| ; GFX1310-NEXT: v_lshrrev_b64 v[2:3], v14, v[8:9] |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v16, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_lt_i64_e32 vcc_lo, 3, v[10:11] |
| ; GFX1310-NEXT: v_or_b32_e32 v8, v16, v15 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v9, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v3, v11, 0, vcc_lo |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_dual_lshrrev_b32 v11, 24, v1 :: v_dual_bitop2_b32 v2, v2, v8 bitop3:0x40 |
| ; GFX1310-NEXT: v_add_co_u32 v8, s0, v12, v9 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v9, null, 0, v13, s0 |
| ; GFX1310-NEXT: v_cmp_ne_u64_e64 s0, 0, v[4:5] |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v2, 0, v2, s0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_add_co_u32 v4, s0, v8, 14 |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v5, null, 0, v9, s0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_add_co_u32 v6, s0, v6, v2 |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v7, null, 0, v7, s0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_lshlrev_b64_e32 v[8:9], 2, v[4:5] |
| ; GFX1310-NEXT: v_and_b32_e32 v9, 0x80, v11 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v2, v10, 0, vcc_lo |
| ; GFX1310-NEXT: v_cmp_lt_i64_e64 s0, 3, v[6:7] |
| ; GFX1310-NEXT: v_cmp_gt_i64_e64 s2, 1, v[4:5] |
| ; GFX1310-NEXT: v_cmp_lt_i64_e64 s1, 30, v[4:5] |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) |
| ; GFX1310-NEXT: v_cmp_lt_i64_e32 vcc_lo, 3, v[2:3] |
| ; GFX1310-NEXT: v_or_b32_e32 v3, 0x7c, v9 |
| ; GFX1310-NEXT: v_or_b32_e32 v7, v8, v9 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v6, v6, 0, s0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v8, 0, 4, s0 |
| ; GFX1310-NEXT: v_cmp_eq_u64_e64 s0, 30, v[4:5] |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_or_b32_e32 v7, v7, v2 |
| ; GFX1310-NEXT: v_or3_b32 v6, v9, v8, v6 |
| ; GFX1310-NEXT: s_and_b32 s0, s0, vcc_lo |
| ; GFX1310-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: s_or_b32 vcc_lo, s1, s0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v2, v7, v6, s2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v2, v2, v3, vcc_lo |
| ; GFX1310-NEXT: v_cmp_eq_f64_e32 vcc_lo, 0, v[0:1] |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v2, v2, v9, vcc_lo |
| ; GFX1310-NEXT: v_cmp_class_f64_e64 vcc_lo, v[0:1], 0x204 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v2, v2, v3, vcc_lo |
| ; GFX1310-NEXT: v_cmp_o_f64_e32 vcc_lo, v[0:1], v[0:1] |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v0, 0x7e, v2, vcc_lo |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.f64(double %x, metadata !"Float8E5M2", metadata !"round.tonearest", i1 false) |
| ret i8 %r |
| } |
| |
| ; bf16 source has no HW conversion, so it uses the generic expansion. |
| define i8 @to_fp8_bf16(bfloat %x) { |
| ; GFX950-LABEL: to_fp8_bf16: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_lshlrev_b32_e32 v1, 16, v0 |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v5, v1 |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v2, v1 |
| ; GFX950-NEXT: v_xor_b32_e32 v6, -1, v5 |
| ; GFX950-NEXT: v_cvt_pk_bf16_f32 v2, v2, s0 |
| ; GFX950-NEXT: s_movk_i32 s0, 0x80 |
| ; GFX950-NEXT: v_mov_b32_e32 v3, 0x7f |
| ; GFX950-NEXT: v_min_u16_e32 v6, 15, v6 |
| ; GFX950-NEXT: v_bitop3_b16 v4, v2, s0, v3 bitop3:0xec |
| ; GFX950-NEXT: v_sub_u16_e64 v9, v6, 1 clamp |
| ; GFX950-NEXT: v_lshrrev_b16_e32 v7, v6, v4 |
| ; GFX950-NEXT: v_lshrrev_b16_e32 v4, v9, v4 |
| ; GFX950-NEXT: v_lshlrev_b16_e64 v9, v9, 1 |
| ; GFX950-NEXT: v_and_b32_e32 v10, 0x7f, v2 |
| ; GFX950-NEXT: v_add_u16_e32 v9, -1, v9 |
| ; GFX950-NEXT: v_bitop3_b16 v9, v10, v9, s0 bitop3:0xc8 |
| ; GFX950-NEXT: v_cmp_ne_u16_e32 vcc, 0, v9 |
| ; GFX950-NEXT: v_and_b32_e32 v8, 1, v7 |
| ; GFX950-NEXT: v_and_b32_sdwa v0, v0, s0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD |
| ; GFX950-NEXT: v_cndmask_b32_e64 v9, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b16 v4, v4, v9, v8 bitop3:0xe0 |
| ; GFX950-NEXT: v_cmp_ne_u16_e32 vcc, 0, v6 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v4, 0, v4, vcc |
| ; GFX950-NEXT: v_add_u16_e32 v4, v7, v4 |
| ; GFX950-NEXT: v_cmp_lt_i16_e32 vcc, 7, v4 |
| ; GFX950-NEXT: v_lshrrev_b16_e32 v7, 4, v10 |
| ; GFX950-NEXT: v_and_b32_e32 v8, 1, v7 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v4, v4, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, 0, 8, vcc |
| ; GFX950-NEXT: v_bitop3_b16 v4, v0, v4, v6 bitop3:0xfe |
| ; GFX950-NEXT: v_lshrrev_b16_e32 v6, 3, v2 |
| ; GFX950-NEXT: v_and_b32_e32 v2, 7, v2 |
| ; GFX950-NEXT: v_cmp_ne_u16_e32 vcc, 0, v2 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v2, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b16 v2, v6, v2, v8 bitop3:0xe0 |
| ; GFX950-NEXT: v_add_u16_e32 v2, v7, v2 |
| ; GFX950-NEXT: v_cmp_lt_i16_e32 vcc, 7, v2 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc |
| ; GFX950-NEXT: v_add_u16_e32 v5, v5, v6 |
| ; GFX950-NEXT: v_add_u16_e32 v5, 6, v5 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc |
| ; GFX950-NEXT: v_lshlrev_b16_e32 v6, 3, v5 |
| ; GFX950-NEXT: v_bitop3_b16 v2, v0, v2, v6 bitop3:0xfe |
| ; GFX950-NEXT: v_cmp_gt_i16_e32 vcc, 1, v5 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v2, v2, v4, vcc |
| ; GFX950-NEXT: v_cmp_eq_f32_e32 vcc, 0, v1 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc |
| ; GFX950-NEXT: v_cmp_o_f32_e32 vcc, v1, v1 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v0, v3, v0, vcc |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_fp8_bf16: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_lshlrev_b32_e32 v5, 16, v0 |
| ; GFX1200-NEXT: v_lshrrev_b16 v0.l, 8, v0.l |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v2, v5 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v6, v5 |
| ; GFX1200-NEXT: v_and_b16 v0.l, 0x80, v0.l |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_bfe_u32 v3, v2, 16, 1 |
| ; GFX1200-NEXT: v_xor_b16 v1.l, v6.l, -1 |
| ; GFX1200-NEXT: v_or_b32_e32 v4, 0x400000, v2 |
| ; GFX1200-NEXT: v_cmp_u_f32_e32 vcc_lo, v2, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1200-NEXT: v_add3_u32 v3, v3, v2, 0x7fff |
| ; GFX1200-NEXT: v_min_u16 v1.l, v1.l, 15 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v7, v3, v4, vcc_lo |
| ; GFX1200-NEXT: v_sub_nc_u16 v1.h, v1.l, 1 clamp |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v3, 16, v7 |
| ; GFX1200-NEXT: v_lshlrev_b16 v2.l, v1.h, 1 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v7, 19, v7 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_4) |
| ; GFX1200-NEXT: v_and_b16 v2.h, 0x7f, v3.l |
| ; GFX1200-NEXT: v_and_b16 v3.l, v3.l, 7 |
| ; GFX1200-NEXT: v_add_nc_u16 v2.l, v2.l, -1 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_4) |
| ; GFX1200-NEXT: v_or_b16 v3.h, 0x80, v2.h |
| ; GFX1200-NEXT: v_lshrrev_b16 v2.h, 4, v2.h |
| ; GFX1200-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0, v3.l |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_and_b16 v2.l, v3.h, v2.l |
| ; GFX1200-NEXT: v_and_b16 v3.l, v2.h, 1 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v4, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_lshrrev_b16 v4.h, v1.l, v3.h |
| ; GFX1200-NEXT: v_lshrrev_b16 v1.h, v1.h, v3.h |
| ; GFX1200-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0, v2.l |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1200-NEXT: v_or_b16 v2.l, v4.l, v3.l |
| ; GFX1200-NEXT: v_and_b16 v3.l, v4.h, 1 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v8, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0, v1.l |
| ; GFX1200-NEXT: v_and_b16 v2.l, v7.l, v2.l |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_mov_b16_e32 v4.l, v8.l |
| ; GFX1200-NEXT: v_add_nc_u16 v2.l, v2.h, v2.l |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_or_b16 v3.l, v4.l, v3.l |
| ; GFX1200-NEXT: v_cmp_lt_i16_e64 s0, 7, v2.l |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_and_b16 v1.l, v1.h, v3.l |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v3, 0, 1, s0 |
| ; GFX1200-NEXT: v_cndmask_b16 v2.l, v2.l, 0, s0 |
| ; GFX1200-NEXT: v_cmp_eq_f32_e64 s0, 0, v5 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b16 v1.l, 0, v1.l, vcc_lo |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_add_nc_u16 v0.h, v4.h, v1.l |
| ; GFX1200-NEXT: v_add_nc_u16 v1.l, v6.l, v3.l |
| ; GFX1200-NEXT: v_cmp_lt_i16_e32 vcc_lo, 7, v0.h |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_add_nc_u16 v1.l, v1.l, 6 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b16 v1.h, 0, 8, vcc_lo |
| ; GFX1200-NEXT: v_lshlrev_b16 v2.h, 3, v1.l |
| ; GFX1200-NEXT: v_cndmask_b16 v0.h, v0.h, 0, vcc_lo |
| ; GFX1200-NEXT: v_cmp_gt_i16_e32 vcc_lo, 1, v1.l |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1200-NEXT: v_or_b16 v1.h, v0.l, v1.h |
| ; GFX1200-NEXT: v_or_b16 v2.h, v0.l, v2.h |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_or_b16 v0.h, v1.h, v0.h |
| ; GFX1200-NEXT: v_or_b16 v1.l, v2.h, v2.l |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b16 v0.h, v1.l, v0.h, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f32_e32 vcc_lo, v5, v5 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b16 v0.l, v0.h, v0.l, s0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1200-NEXT: v_cndmask_b16 v0.l, 0x7f, v0.l, vcc_lo |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_fp8_bf16: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_lshlrev_b32_e32 v6, 16, v0 |
| ; GFX1250-TRUE16-NEXT: v_mov_b16_e32 v4.l, 0x80 |
| ; GFX1250-TRUE16-NEXT: v_lshrrev_b16 v0.l, 8, v0.l |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1250-TRUE16-NEXT: v_frexp_exp_i32_f32_e32 v7, v6 |
| ; GFX1250-TRUE16-NEXT: v_frexp_mant_f32_e32 v2, v6 |
| ; GFX1250-TRUE16-NEXT: v_and_b16 v0.l, 0x80, v0.l |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1250-TRUE16-NEXT: v_xor_b16 v1.l, v7.l, -1 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_bf16_f32 v2, v2, s0 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-TRUE16-NEXT: v_min_u16 v1.l, v1.l, 15 |
| ; GFX1250-TRUE16-NEXT: v_and_b16 v2.h, 0x7f, v2.l |
| ; GFX1250-TRUE16-NEXT: v_and_b16 v3.l, v2.l, 7 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1250-TRUE16-NEXT: v_sub_nc_u16 v1.h, v1.l, 1 clamp |
| ; GFX1250-TRUE16-NEXT: v_lshrrev_b16 v4.h, 4, v2.h |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1250-TRUE16-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0, v3.l |
| ; GFX1250-TRUE16-NEXT: v_lshlrev_b16 v3.h, v1.h, 1 |
| ; GFX1250-TRUE16-NEXT: v_cndmask_b32_e64 v5, 0, 1, vcc_lo |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_4) |
| ; GFX1250-TRUE16-NEXT: v_add_nc_u16 v3.l, v3.h, -1 |
| ; GFX1250-TRUE16-NEXT: v_bitop3_b16 v3.h, v2.l, v4.l, 0x7f bitop3:0xec |
| ; GFX1250-TRUE16-NEXT: v_lshrrev_b16 v2.l, 3, v2.l |
| ; GFX1250-TRUE16-NEXT: v_and_b16 v4.l, v4.h, 1 |
| ; GFX1250-TRUE16-NEXT: v_bitop3_b16 v2.h, v2.h, v3.l, 0x80 bitop3:0xc8 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_4) |
| ; GFX1250-TRUE16-NEXT: v_lshrrev_b16 v3.l, v1.l, v3.h |
| ; GFX1250-TRUE16-NEXT: v_lshrrev_b16 v1.h, v1.h, v3.h |
| ; GFX1250-TRUE16-NEXT: v_bitop3_b16 v2.l, v2.l, v5.l, v4.l bitop3:0xe0 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1250-TRUE16-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0, v2.h |
| ; GFX1250-TRUE16-NEXT: v_and_b16 v2.h, v3.l, 1 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_3) |
| ; GFX1250-TRUE16-NEXT: v_add_nc_u16 v2.l, v4.h, v2.l |
| ; GFX1250-TRUE16-NEXT: v_cndmask_b32_e64 v5, 0, 1, vcc_lo |
| ; GFX1250-TRUE16-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0, v1.l |
| ; GFX1250-TRUE16-NEXT: v_cmp_lt_i16_e64 s0, 7, v2.l |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-TRUE16-NEXT: v_mov_b16_e32 v4.l, v5.l |
| ; GFX1250-TRUE16-NEXT: v_cndmask_b32_e64 v5, 0, 1, s0 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_4) |
| ; GFX1250-TRUE16-NEXT: v_bitop3_b16 v1.l, v1.h, v4.l, v2.h bitop3:0xe0 |
| ; GFX1250-TRUE16-NEXT: v_cndmask_b16 v1.h, v2.l, 0, s0 |
| ; GFX1250-TRUE16-NEXT: v_cmp_eq_f32_e64 s0, 0, v6 |
| ; GFX1250-TRUE16-NEXT: v_mov_b16_e32 v4.l, v5.l |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-TRUE16-NEXT: v_cndmask_b16 v1.l, 0, v1.l, vcc_lo |
| ; GFX1250-TRUE16-NEXT: v_add_nc_u16 v0.h, v7.l, v4.l |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-TRUE16-NEXT: v_add_nc_u16 v1.l, v3.l, v1.l |
| ; GFX1250-TRUE16-NEXT: v_add_nc_u16 v0.h, v0.h, 6 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-TRUE16-NEXT: v_cmp_lt_i16_e32 vcc_lo, 7, v1.l |
| ; GFX1250-TRUE16-NEXT: v_lshlrev_b16 v2.l, 3, v0.h |
| ; GFX1250-TRUE16-NEXT: v_cndmask_b16 v1.l, v1.l, 0, vcc_lo |
| ; GFX1250-TRUE16-NEXT: v_cndmask_b16 v2.h, 0, 8, vcc_lo |
| ; GFX1250-TRUE16-NEXT: v_cmp_gt_i16_e32 vcc_lo, 1, v0.h |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1250-TRUE16-NEXT: v_bitop3_b16 v0.h, v0.l, v1.h, v2.l bitop3:0xfe |
| ; GFX1250-TRUE16-NEXT: v_bitop3_b16 v1.l, v0.l, v1.l, v2.h bitop3:0xfe |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-TRUE16-NEXT: v_cndmask_b16 v0.h, v0.h, v1.l, vcc_lo |
| ; GFX1250-TRUE16-NEXT: v_cmp_o_f32_e32 vcc_lo, v6, v6 |
| ; GFX1250-TRUE16-NEXT: v_cndmask_b16 v0.l, v0.h, v0.l, s0 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-TRUE16-NEXT: v_cndmask_b16 v0.l, 0x7f, v0.l, vcc_lo |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_fp8_bf16: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_lshlrev_b32_e32 v1, 16, v0 |
| ; GFX1250-FAKE16-NEXT: v_lshrrev_b16 v0, 8, v0 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_frexp_exp_i32_f32_e32 v2, v1 |
| ; GFX1250-FAKE16-NEXT: v_and_b32_e32 v0, 0x80, v0 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_xor_b32_e32 v3, -1, v2 |
| ; GFX1250-FAKE16-NEXT: v_frexp_mant_f32_e32 v4, v1 |
| ; GFX1250-FAKE16-NEXT: v_min_u16 v3, v3, 15 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_bf16_f32 v4, v4, s0 |
| ; GFX1250-FAKE16-NEXT: s_movk_i32 s0, 0x80 |
| ; GFX1250-FAKE16-NEXT: v_sub_nc_u16 v5, v3, 1 clamp |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_and_b32_e32 v6, 0x7f, v4 |
| ; GFX1250-FAKE16-NEXT: v_bitop3_b16 v9, v4, s0, 0x7f bitop3:0xec |
| ; GFX1250-FAKE16-NEXT: v_cmp_ne_u16_e64 s0, 0, v3 |
| ; GFX1250-FAKE16-NEXT: v_and_b32_e32 v8, 7, v4 |
| ; GFX1250-FAKE16-NEXT: v_lshlrev_b16 v7, v5, 1 |
| ; GFX1250-FAKE16-NEXT: v_lshrrev_b16 v10, 4, v6 |
| ; GFX1250-FAKE16-NEXT: v_lshrrev_b16 v4, 3, v4 |
| ; GFX1250-FAKE16-NEXT: v_lshrrev_b16 v12, v3, v9 |
| ; GFX1250-FAKE16-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0, v8 |
| ; GFX1250-FAKE16-NEXT: v_add_nc_u16 v7, v7, -1 |
| ; GFX1250-FAKE16-NEXT: v_and_b32_e32 v11, 1, v10 |
| ; GFX1250-FAKE16-NEXT: v_lshrrev_b16 v5, v5, v9 |
| ; GFX1250-FAKE16-NEXT: v_cndmask_b32_e64 v8, 0, 1, vcc_lo |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1250-FAKE16-NEXT: v_bitop3_b16 v6, v6, v7, 0x80 bitop3:0xc8 |
| ; GFX1250-FAKE16-NEXT: v_and_b32_e32 v7, 1, v12 |
| ; GFX1250-FAKE16-NEXT: v_bitop3_b16 v4, v4, v8, v11 bitop3:0xe0 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0, v6 |
| ; GFX1250-FAKE16-NEXT: v_add_nc_u16 v4, v10, v4 |
| ; GFX1250-FAKE16-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc_lo |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_cmp_lt_i16_e32 vcc_lo, 7, v4 |
| ; GFX1250-FAKE16-NEXT: v_bitop3_b16 v5, v5, v6, v7 bitop3:0xe0 |
| ; GFX1250-FAKE16-NEXT: v_cndmask_b32_e64 v4, v4, 0, vcc_lo |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_cndmask_b32_e64 v3, 0, v5, s0 |
| ; GFX1250-FAKE16-NEXT: v_cndmask_b32_e64 v5, 0, 1, vcc_lo |
| ; GFX1250-FAKE16-NEXT: v_add_nc_u16 v3, v12, v3 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_add_nc_u16 v2, v2, v5 |
| ; GFX1250-FAKE16-NEXT: v_cmp_lt_i16_e32 vcc_lo, 7, v3 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3) |
| ; GFX1250-FAKE16-NEXT: v_add_nc_u16 v2, v2, 6 |
| ; GFX1250-FAKE16-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1250-FAKE16-NEXT: v_cndmask_b32_e64 v5, 0, 8, vcc_lo |
| ; GFX1250-FAKE16-NEXT: v_lshlrev_b16 v6, 3, v2 |
| ; GFX1250-FAKE16-NEXT: v_cmp_gt_i16_e32 vcc_lo, 1, v2 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1250-FAKE16-NEXT: v_bitop3_b16 v3, v0, v3, v5 bitop3:0xfe |
| ; GFX1250-FAKE16-NEXT: v_bitop3_b16 v4, v0, v4, v6 bitop3:0xfe |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_cndmask_b32_e32 v2, v4, v3, vcc_lo |
| ; GFX1250-FAKE16-NEXT: v_cmp_eq_f32_e32 vcc_lo, 0, v1 |
| ; GFX1250-FAKE16-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc_lo |
| ; GFX1250-FAKE16-NEXT: v_cmp_o_f32_e32 vcc_lo, v1, v1 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_cndmask_b32_e32 v0, 0x7f, v0, vcc_lo |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_fp8_bf16: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_lshlrev_b32_e32 v1, 16, v0 |
| ; GFX1310-NEXT: v_lshrrev_b16 v0, 8, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v2, v1 |
| ; GFX1310-NEXT: v_and_b32_e32 v0, 0x80, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_xor_b32_e32 v3, -1, v2 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v4, v1 |
| ; GFX1310-NEXT: v_min_u16 v3, v3, 15 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cvt_pk_bf16_f32 v4, v4, s0 |
| ; GFX1310-NEXT: s_movk_i32 s0, 0x80 |
| ; GFX1310-NEXT: v_sub_nc_u16 v5, v3, 1 clamp |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1310-NEXT: v_and_b32_e32 v6, 0x7f, v4 |
| ; GFX1310-NEXT: v_bitop3_b16 v9, v4, s0, 0x7f bitop3:0xec |
| ; GFX1310-NEXT: v_cmp_ne_u16_e64 s0, 0, v3 |
| ; GFX1310-NEXT: v_and_b32_e32 v8, 7, v4 |
| ; GFX1310-NEXT: v_lshlrev_b16 v7, v5, 1 |
| ; GFX1310-NEXT: v_lshrrev_b16 v10, 4, v6 |
| ; GFX1310-NEXT: v_lshrrev_b16 v4, 3, v4 |
| ; GFX1310-NEXT: v_lshrrev_b16 v12, v3, v9 |
| ; GFX1310-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0, v8 |
| ; GFX1310-NEXT: v_add_nc_u16 v7, v7, -1 |
| ; GFX1310-NEXT: v_and_b32_e32 v11, 1, v10 |
| ; GFX1310-NEXT: v_lshrrev_b16 v5, v5, v9 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v8, 0, 1, vcc_lo |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_bitop3_b16 v6, v6, v7, 0x80 bitop3:0xc8 |
| ; GFX1310-NEXT: v_and_b32_e32 v7, 1, v12 |
| ; GFX1310-NEXT: v_bitop3_b16 v4, v4, v8, v11 bitop3:0xe0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cmp_ne_u16_e32 vcc_lo, 0, v6 |
| ; GFX1310-NEXT: v_add_nc_u16 v4, v10, v4 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc_lo |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cmp_lt_i16_e32 vcc_lo, 7, v4 |
| ; GFX1310-NEXT: v_bitop3_b16 v5, v5, v6, v7 bitop3:0xe0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v4, v4, 0, vcc_lo |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v3, 0, v5, s0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v5, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_add_nc_u16 v3, v12, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_add_nc_u16 v2, v2, v5 |
| ; GFX1310-NEXT: v_cmp_lt_i16_e32 vcc_lo, 7, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_add_nc_u16 v2, v2, 6 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v5, 0, 8, vcc_lo |
| ; GFX1310-NEXT: v_lshlrev_b16 v6, 3, v2 |
| ; GFX1310-NEXT: v_cmp_gt_i16_e32 vcc_lo, 1, v2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_bitop3_b16 v3, v0, v3, v5 bitop3:0xfe |
| ; GFX1310-NEXT: v_bitop3_b16 v4, v0, v4, v6 bitop3:0xfe |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v2, v4, v3, vcc_lo |
| ; GFX1310-NEXT: v_cmp_eq_f32_e32 vcc_lo, 0, v1 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v0, v2, v0, vcc_lo |
| ; GFX1310-NEXT: v_cmp_o_f32_e32 vcc_lo, v1, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v0, 0x7f, v0, vcc_lo |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.bf16(bfloat %x, metadata !"Float8E4M3FN", metadata !"round.tonearest", i1 false) |
| ret i8 %r |
| } |
| |
| ; The clamp modifier selects E5M3 for these instructions. The conversion's |
| ; native clamping also implements the saturating form of the generic intrinsic. |
| define i8 @to_e5m3fnu_f32(float %x) { |
| ; GFX950-LABEL: to_e5m3fnu_f32: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX950-NEXT: v_sub_u32_e32 v2, 7, v1 |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v3, v0 |
| ; GFX950-NEXT: v_min_u32_e32 v2, 31, v2 |
| ; GFX950-NEXT: v_and_b32_e32 v4, 0x7fffff, v3 |
| ; GFX950-NEXT: v_or_b32_e32 v5, 0x800000, v4 |
| ; GFX950-NEXT: v_sub_u32_e64 v7, v2, 1 clamp |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v8, v7, v5 |
| ; GFX950-NEXT: v_bfe_u32 v7, v5, 0, v7 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v7 |
| ; GFX950-NEXT: v_bfe_u32 v6, v5, v2, 1 |
| ; GFX950-NEXT: v_bfe_u32 v4, v4, 20, 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v6, v8, v7, v6 bitop3:0xe0 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v2 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v2, v2, v5 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v6, 0, v6, vcc |
| ; GFX950-NEXT: v_add_u32_e32 v2, v2, v6 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v2 |
| ; GFX950-NEXT: v_and_b32_e32 v6, 0x7ffff, v3 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v5, 0, 8, vcc |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v6 |
| ; GFX950-NEXT: v_or_b32_e32 v2, v5, v2 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v5, 19, v3 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v4, v5, v6, v4 bitop3:0xe0 |
| ; GFX950-NEXT: v_bfe_u32 v3, v3, 20, 3 |
| ; GFX950-NEXT: v_add_u32_e32 v3, v3, v4 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v3 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc |
| ; GFX950-NEXT: v_addc_co_u32_e32 v1, vcc, 14, v1, vcc |
| ; GFX950-NEXT: v_lshl_or_b32 v3, v1, 3, v3 |
| ; GFX950-NEXT: v_cmp_gt_i32_e32 vcc, 1, v1 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v1, v3, v2, vcc |
| ; GFX950-NEXT: v_cmp_neq_f32_e32 vcc, 0, v0 |
| ; GFX950-NEXT: v_mov_b32_e32 v2, 0xff |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc |
| ; GFX950-NEXT: v_cmp_o_f32_e32 vcc, v0, v0 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_e5m3fnu_f32: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v3, v0 |
| ; GFX1200-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_sub_nc_u32_e32 v2, 7, v1 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: v_and_or_b32 v4, v3, s0, 0x800000 |
| ; GFX1200-NEXT: v_and_b32_e32 v8, 0x7ffff, v3 |
| ; GFX1200-NEXT: v_bfe_u32 v9, v3, 20, 3 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v3, 19, v3 |
| ; GFX1200-NEXT: v_min_u32_e32 v2, 31, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_sub_nc_u32_e64 v5, v2, 1 clamp |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v7, v2, v4 |
| ; GFX1200-NEXT: v_bfe_u32 v6, v4, 0, v5 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v4, v5, v4 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v6 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v8 |
| ; GFX1200-NEXT: v_and_or_b32 v5, v7, 1, v6 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_and_b32_e32 v4, v4, v5 |
| ; GFX1200-NEXT: v_and_or_b32 v5, v9, 1, v6 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1200-NEXT: v_dual_cndmask_b32 v2, 0, v4 :: v_dual_and_b32 v3, v3, v5 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v2, v7, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v3, v9, v3 |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cmp_lt_i32_e64 s0, 7, v3 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc_lo |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v3, v3, 0, s0 |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v4, 0, 8, vcc_lo |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v1, null, 14, v1, s0 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_or_b32_e32 v2, v4, v2 |
| ; GFX1200-NEXT: v_lshl_or_b32 v3, v1, 3, v3 |
| ; GFX1200-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v1 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, v3, v2, vcc_lo |
| ; GFX1200-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v0, 0xff, v1, vcc_lo |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_e5m3fnu_f32: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_fp8_f32 v0.l, v0, v0 clamp |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_e5m3fnu_f32: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_fp8_f32 v0, v0, v0 clamp |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_e5m3fnu_f32: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v2, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_dual_sub_nc_u32 v3, 7, v1 :: v_dual_lshrrev_b32 v10, 19, v2 |
| ; GFX1310-NEXT: v_and_b32_e32 v4, 0x7fffff, v2 |
| ; GFX1310-NEXT: v_and_b32_e32 v9, 0x7ffff, v2 |
| ; GFX1310-NEXT: v_bfe_u32 v2, v2, 20, 3 |
| ; GFX1310-NEXT: v_min_u32_e32 v3, 31, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_or_b32_e32 v5, 0x800000, v4 |
| ; GFX1310-NEXT: v_bfe_u32 v4, v4, 20, 1 |
| ; GFX1310-NEXT: v_sub_nc_u32_e64 v6, v3, 1 clamp |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_bfe_u32 v8, v5, v3, 1 |
| ; GFX1310-NEXT: v_bfe_u32 v7, v5, 0, v6 |
| ; GFX1310-NEXT: v_dual_lshrrev_b32 v6, v6, v5 :: v_dual_lshrrev_b32 v5, v3, v5 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v7 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v9 |
| ; GFX1310-NEXT: v_bitop3_b32 v6, v6, v7, v8 bitop3:0xe0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_bitop3_b32 v4, v10, v7, v4 bitop3:0xe0 |
| ; GFX1310-NEXT: v_dual_cndmask_b32 v3, 0, v6 :: v_dual_add_nc_u32 v2, v2, v4 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_add_nc_u32_e32 v3, v5, v3 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e64 s0, 7, v2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v3 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v2, v2, 0, s0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v4, 0, 8, vcc_lo |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v1, null, 14, v1, s0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_or_b32_e32 v3, v4, v3 |
| ; GFX1310-NEXT: v_lshl_or_b32 v2, v1, 3, v2 |
| ; GFX1310-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, v2, v3, vcc_lo |
| ; GFX1310-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v0, 0xff, v1, vcc_lo |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.f32(float %x, metadata !"Float8E5M3FNU", metadata !"round.tonearest", i1 false) |
| ret i8 %r |
| } |
| |
| define <2 x i8> @to_e5m3fnu_v2f32(<2 x float> %x) { |
| ; GFX950-LABEL: to_e5m3fnu_v2f32: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v2, v1 |
| ; GFX950-NEXT: v_sub_u32_e32 v3, 7, v2 |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v4, v1 |
| ; GFX950-NEXT: v_min_u32_e32 v3, 31, v3 |
| ; GFX950-NEXT: v_and_b32_e32 v5, 0x7fffff, v4 |
| ; GFX950-NEXT: v_or_b32_e32 v6, 0x800000, v5 |
| ; GFX950-NEXT: v_sub_u32_e64 v8, v3, 1 clamp |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v9, v8, v6 |
| ; GFX950-NEXT: v_bfe_u32 v8, v6, 0, v8 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v8 |
| ; GFX950-NEXT: v_bfe_u32 v7, v6, v3, 1 |
| ; GFX950-NEXT: v_bfe_u32 v5, v5, 20, 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v8, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v7, v9, v8, v7 bitop3:0xe0 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v3 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v3, v3, v6 |
| ; GFX950-NEXT: s_movk_i32 s0, 0xff |
| ; GFX950-NEXT: v_cndmask_b32_e32 v7, 0, v7, vcc |
| ; GFX950-NEXT: v_add_u32_e32 v3, v3, v7 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v3 |
| ; GFX950-NEXT: v_and_b32_e32 v7, 0x7ffff, v4 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, 0, 8, vcc |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v7 |
| ; GFX950-NEXT: v_or_b32_e32 v3, v6, v3 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v6, 19, v4 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v5, v6, v7, v5 bitop3:0xe0 |
| ; GFX950-NEXT: v_bfe_u32 v4, v4, 20, 3 |
| ; GFX950-NEXT: v_add_u32_e32 v4, v4, v5 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v4 |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v6, v0 |
| ; GFX950-NEXT: v_and_b32_e32 v7, 0x7fffff, v6 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v4, v4, 0, vcc |
| ; GFX950-NEXT: v_addc_co_u32_e32 v2, vcc, 14, v2, vcc |
| ; GFX950-NEXT: v_lshl_or_b32 v4, v2, 3, v4 |
| ; GFX950-NEXT: v_cmp_gt_i32_e32 vcc, 1, v2 |
| ; GFX950-NEXT: v_or_b32_e32 v8, 0x800000, v7 |
| ; GFX950-NEXT: v_bfe_u32 v7, v7, 20, 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v2, v4, v3, vcc |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v4, v0 |
| ; GFX950-NEXT: v_sub_u32_e32 v5, 7, v4 |
| ; GFX950-NEXT: v_min_u32_e32 v5, 31, v5 |
| ; GFX950-NEXT: v_cmp_neq_f32_e32 vcc, 0, v1 |
| ; GFX950-NEXT: v_sub_u32_e64 v10, v5, 1 clamp |
| ; GFX950-NEXT: v_mov_b32_e32 v3, 0xff |
| ; GFX950-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc |
| ; GFX950-NEXT: v_cmp_o_f32_e32 vcc, v1, v1 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v11, v10, v8 |
| ; GFX950-NEXT: v_bfe_u32 v10, v8, 0, v10 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v1, v3, v2, vcc |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v10 |
| ; GFX950-NEXT: v_bfe_u32 v9, v8, v5, 1 |
| ; GFX950-NEXT: v_lshlrev_b16_e32 v2, 8, v1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v10, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v9, v11, v10, v9 bitop3:0xe0 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v5 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v5, v5, v8 |
| ; GFX950-NEXT: v_and_b32_e32 v1, 0xff, v1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v9, 0, v9, vcc |
| ; GFX950-NEXT: v_add_u32_e32 v5, v5, v9 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v5 |
| ; GFX950-NEXT: v_and_b32_e32 v9, 0x7ffff, v6 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v5, v5, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v8, 0, 8, vcc |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v9 |
| ; GFX950-NEXT: v_or_b32_e32 v5, v8, v5 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v8, 19, v6 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v9, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v7, v8, v9, v7 bitop3:0xe0 |
| ; GFX950-NEXT: v_bfe_u32 v6, v6, 20, 3 |
| ; GFX950-NEXT: v_add_u32_e32 v6, v6, v7 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v6 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, v6, 0, vcc |
| ; GFX950-NEXT: v_addc_co_u32_e32 v4, vcc, 14, v4, vcc |
| ; GFX950-NEXT: v_lshl_or_b32 v6, v4, 3, v6 |
| ; GFX950-NEXT: v_cmp_gt_i32_e32 vcc, 1, v4 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v4, v6, v5, vcc |
| ; GFX950-NEXT: v_cmp_neq_f32_e32 vcc, 0, v0 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v4, 0, v4, vcc |
| ; GFX950-NEXT: v_cmp_o_f32_e32 vcc, v0, v0 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v0, v3, v4, vcc |
| ; GFX950-NEXT: v_bitop3_b16 v0, v0, v2, s0 bitop3:0xec |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_e5m3fnu_v2f32: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v3, v1 |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v2, v1 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v5, v0 |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v4, v0 |
| ; GFX1200-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1200-NEXT: v_sub_nc_u32_e32 v7, 7, v3 |
| ; GFX1200-NEXT: v_and_b32_e32 v8, 0x7ffff, v2 |
| ; GFX1200-NEXT: v_sub_nc_u32_e32 v10, 7, v5 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: v_and_or_b32 v6, v2, s0, 0x800000 |
| ; GFX1200-NEXT: v_and_b32_e32 v12, 0x7ffff, v4 |
| ; GFX1200-NEXT: v_min_u32_e32 v7, 31, v7 |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v8 |
| ; GFX1200-NEXT: v_min_u32_e32 v10, 31, v10 |
| ; GFX1200-NEXT: v_and_or_b32 v11, v4, s0, 0x800000 |
| ; GFX1200-NEXT: v_bfe_u32 v9, v2, 20, 3 |
| ; GFX1200-NEXT: v_sub_nc_u32_e64 v14, v7, 1 clamp |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v8, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_sub_nc_u32_e64 v15, v10, 1 clamp |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v12 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v17, v7, v6 |
| ; GFX1200-NEXT: v_bfe_u32 v16, v6, 0, v14 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v19, v10, v11 |
| ; GFX1200-NEXT: v_bfe_u32 v18, v11, 0, v15 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v12, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v2, 19, v2 |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v16 |
| ; GFX1200-NEXT: v_and_or_b32 v8, v9, 1, v8 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v6, v14, v6 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v11, v15, v11 |
| ; GFX1200-NEXT: v_bfe_u32 v13, v4, 20, 3 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v16, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v18 |
| ; GFX1200-NEXT: v_and_b32_e32 v2, v2, v8 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v4, 19, v4 |
| ; GFX1200-NEXT: v_and_or_b32 v12, v13, 1, v12 |
| ; GFX1200-NEXT: v_and_or_b32 v14, v17, 1, v16 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v18, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v7 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v2, v9, v2 |
| ; GFX1200-NEXT: v_and_b32_e32 v4, v4, v12 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_and_or_b32 v15, v19, 1, v18 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v4, v13, v4 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_and_b32_e32 v8, v11, v15 |
| ; GFX1200-NEXT: v_and_b32_e32 v6, v6, v14 |
| ; GFX1200-NEXT: v_cmp_lt_i32_e64 s0, 7, v4 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v6, 0, v6, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v10 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v4, v4, 0, s0 |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v5, null, 14, v5, s0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v7, 0, v8, vcc_lo |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_lshl_or_b32 v4, v5, 3, v4 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v7, v19, v7 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v6, v17, v6 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc_lo |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v3, null, 14, v3, vcc_lo |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v7 |
| ; GFX1200-NEXT: v_cmp_lt_i32_e64 s1, 7, v6 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) |
| ; GFX1200-NEXT: v_lshl_or_b32 v2, v3, 3, v2 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v7, v7, 0, vcc_lo |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v6, v6, 0, s1 |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v8, 0, 8, s1 |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v9, 0, 8, vcc_lo |
| ; GFX1200-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v3 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_or_b32_e32 v6, v8, v6 |
| ; GFX1200-NEXT: v_or_b32_e32 v7, v9, v7 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v2, v2, v6, vcc_lo |
| ; GFX1200-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v5 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v3, v4, v7, vcc_lo |
| ; GFX1200-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v1 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc_lo |
| ; GFX1200-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v3, 0, v3, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f32_e32 vcc_lo, v1, v1 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, 0xff, v2, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_lshlrev_b16 v0.l, 8, v1.l |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v2, 0xff, v3, vcc_lo |
| ; GFX1200-NEXT: v_and_b16 v1.l, 0xff, v1.l |
| ; GFX1200-NEXT: v_and_b16 v0.h, 0xff, v2.l |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1200-NEXT: v_or_b16 v0.l, v0.h, v0.l |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_e5m3fnu_v2f32: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_fp8_f32 v0.l, v0, v1 clamp |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-TRUE16-NEXT: v_lshrrev_b16 v1.l, 8, v0.l |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_e5m3fnu_v2f32: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_fp8_f32 v0, v0, v1 clamp |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-FAKE16-NEXT: v_lshrrev_b16 v1, 8, v0 |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_e5m3fnu_v2f32: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v2, v1 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v3, v1 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v4, v0 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v5, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_dual_sub_nc_u32 v6, 7, v2 :: v_dual_lshrrev_b32 v8, 19, v3 |
| ; GFX1310-NEXT: v_and_b32_e32 v7, 0x7fffff, v3 |
| ; GFX1310-NEXT: v_dual_sub_nc_u32 v10, 7, v4 :: v_dual_lshrrev_b32 v12, 19, v5 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_min_u32_e32 v6, 31, v6 |
| ; GFX1310-NEXT: v_and_b32_e32 v11, 0x7fffff, v5 |
| ; GFX1310-NEXT: v_or_b32_e32 v14, 0x800000, v7 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) |
| ; GFX1310-NEXT: v_min_u32_e32 v10, 31, v10 |
| ; GFX1310-NEXT: v_and_b32_e32 v9, 0x7ffff, v3 |
| ; GFX1310-NEXT: v_sub_nc_u32_e64 v15, v6, 1 clamp |
| ; GFX1310-NEXT: v_or_b32_e32 v16, 0x800000, v11 |
| ; GFX1310-NEXT: v_bfe_u32 v18, v14, v6, 1 |
| ; GFX1310-NEXT: v_sub_nc_u32_e64 v17, v10, 1 clamp |
| ; GFX1310-NEXT: v_and_b32_e32 v13, 0x7ffff, v5 |
| ; GFX1310-NEXT: v_bfe_u32 v19, v14, 0, v15 |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v15, v15, v14 |
| ; GFX1310-NEXT: v_bfe_u32 v7, v7, 20, 1 |
| ; GFX1310-NEXT: v_bfe_u32 v21, v16, 0, v17 |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v17, v17, v16 |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v19 |
| ; GFX1310-NEXT: v_bfe_u32 v20, v16, v10, 1 |
| ; GFX1310-NEXT: v_bfe_u32 v3, v3, 20, 3 |
| ; GFX1310-NEXT: v_bfe_u32 v11, v11, 20, 1 |
| ; GFX1310-NEXT: v_bfe_u32 v5, v5, 20, 3 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v19, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v21 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_bitop3_b32 v15, v15, v19, v18 bitop3:0xe0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v21, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v9 |
| ; GFX1310-NEXT: v_bitop3_b32 v17, v17, v21, v20 bitop3:0xe0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v9, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v6 |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v14, v6, v14 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_bitop3_b32 v7, v8, v9, v7 bitop3:0xe0 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v6, 0, v15, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v13 |
| ; GFX1310-NEXT: v_dual_add_nc_u32 v3, v3, v7 :: v_dual_add_nc_u32 v6, v14, v6 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v13, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v10 |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v10, v10, v16 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_cmp_lt_i32_e64 s0, 7, v3 |
| ; GFX1310-NEXT: v_bitop3_b32 v9, v12, v13, v11 bitop3:0xe0 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v8, 0, v17, vcc_lo |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v6 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v3, v3, 0, s0 |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v2, null, 14, v2, s0 |
| ; GFX1310-NEXT: v_dual_add_nc_u32 v5, v5, v9 :: v_dual_add_nc_u32 v7, v10, v8 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v6, v6, 0, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v8, 0, 8, vcc_lo |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_lshl_or_b32 v3, v2, 3, v3 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e64 s0, 7, v5 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v7 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_4) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v5, v5, 0, s0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v7, v7, 0, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v9, 0, 8, vcc_lo |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v4, null, 14, v4, s0 |
| ; GFX1310-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v2 |
| ; GFX1310-NEXT: v_or_b32_e32 v7, v9, v7 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_lshl_or_b32 v5, v4, 3, v5 |
| ; GFX1310-NEXT: v_or_b32_e32 v6, v8, v6 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v2, v3, v6, vcc_lo |
| ; GFX1310-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v4 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v3, v5, v7, vcc_lo |
| ; GFX1310-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v1 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc_lo |
| ; GFX1310-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v3, 0, v3, vcc_lo |
| ; GFX1310-NEXT: v_cmp_o_f32_e32 vcc_lo, v1, v1 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, 0xff, v2, vcc_lo |
| ; GFX1310-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v0, 0xff, v3, vcc_lo |
| ; GFX1310-NEXT: v_lshlrev_b16 v2, 8, v1 |
| ; GFX1310-NEXT: v_and_b32_e32 v1, 0xff, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1310-NEXT: v_bitop3_b16 v0, v0, v2, 0xff bitop3:0xec |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call <2 x i8> @llvm.convert.to.arbitrary.fp.v2i8.v2f32(<2 x float> %x, metadata !"Float8E5M3FNU", metadata !"round.tonearest", i1 false) |
| ret <2 x i8> %r |
| } |
| |
| define <4 x i8> @to_e5m3fnu_v4f32(<4 x float> %x) { |
| ; GFX950-LABEL: to_e5m3fnu_v4f32: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v4, v1 |
| ; GFX950-NEXT: v_sub_u32_e32 v5, 7, v4 |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v6, v1 |
| ; GFX950-NEXT: v_min_u32_e32 v5, 31, v5 |
| ; GFX950-NEXT: v_and_b32_e32 v7, 0x7fffff, v6 |
| ; GFX950-NEXT: v_or_b32_e32 v8, 0x800000, v7 |
| ; GFX950-NEXT: v_sub_u32_e64 v10, v5, 1 clamp |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v11, v10, v8 |
| ; GFX950-NEXT: v_bfe_u32 v10, v8, 0, v10 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v10 |
| ; GFX950-NEXT: v_bfe_u32 v9, v8, v5, 1 |
| ; GFX950-NEXT: v_bfe_u32 v7, v7, 20, 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v10, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v9, v11, v10, v9 bitop3:0xe0 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v5 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v5, v5, v8 |
| ; GFX950-NEXT: s_movk_i32 s0, 0xff |
| ; GFX950-NEXT: v_cndmask_b32_e32 v9, 0, v9, vcc |
| ; GFX950-NEXT: v_add_u32_e32 v5, v5, v9 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v5 |
| ; GFX950-NEXT: v_and_b32_e32 v9, 0x7ffff, v6 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v5, v5, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v8, 0, 8, vcc |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v9 |
| ; GFX950-NEXT: v_or_b32_e32 v5, v8, v5 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v8, 19, v6 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v9, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v7, v8, v9, v7 bitop3:0xe0 |
| ; GFX950-NEXT: v_bfe_u32 v6, v6, 20, 3 |
| ; GFX950-NEXT: v_add_u32_e32 v6, v6, v7 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v6 |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v7, v0 |
| ; GFX950-NEXT: v_and_b32_e32 v8, 0x7fffff, v7 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, v6, 0, vcc |
| ; GFX950-NEXT: v_addc_co_u32_e32 v4, vcc, 14, v4, vcc |
| ; GFX950-NEXT: v_lshl_or_b32 v6, v4, 3, v6 |
| ; GFX950-NEXT: v_cmp_gt_i32_e32 vcc, 1, v4 |
| ; GFX950-NEXT: v_or_b32_e32 v9, 0x800000, v8 |
| ; GFX950-NEXT: v_bfe_u32 v8, v8, 20, 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v4, v6, v5, vcc |
| ; GFX950-NEXT: v_cmp_neq_f32_e32 vcc, 0, v1 |
| ; GFX950-NEXT: v_mov_b32_e32 v5, 0xff |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v4, 0, v4, vcc |
| ; GFX950-NEXT: v_cmp_o_f32_e32 vcc, v1, v1 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v1, v5, v4, vcc |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v4, v0 |
| ; GFX950-NEXT: v_sub_u32_e32 v6, 7, v4 |
| ; GFX950-NEXT: v_min_u32_e32 v6, 31, v6 |
| ; GFX950-NEXT: v_sub_u32_e64 v11, v6, 1 clamp |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v12, v11, v9 |
| ; GFX950-NEXT: v_bfe_u32 v11, v9, 0, v11 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v11 |
| ; GFX950-NEXT: v_bfe_u32 v10, v9, v6, 1 |
| ; GFX950-NEXT: v_lshlrev_b16_e32 v1, 8, v1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v11, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v10, v12, v11, v10 bitop3:0xe0 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v6 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v6, v6, v9 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v10, 0, v10, vcc |
| ; GFX950-NEXT: v_add_u32_e32 v6, v6, v10 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v6 |
| ; GFX950-NEXT: v_and_b32_e32 v10, 0x7ffff, v7 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, v6, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v9, 0, 8, vcc |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v10 |
| ; GFX950-NEXT: v_or_b32_e32 v6, v9, v6 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v9, 19, v7 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v10, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v8, v9, v10, v8 bitop3:0xe0 |
| ; GFX950-NEXT: v_bfe_u32 v7, v7, 20, 3 |
| ; GFX950-NEXT: v_add_u32_e32 v7, v7, v8 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v7 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v7, v7, 0, vcc |
| ; GFX950-NEXT: v_addc_co_u32_e32 v4, vcc, 14, v4, vcc |
| ; GFX950-NEXT: v_lshl_or_b32 v7, v4, 3, v7 |
| ; GFX950-NEXT: v_cmp_gt_i32_e32 vcc, 1, v4 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v4, v7, v6, vcc |
| ; GFX950-NEXT: v_cmp_neq_f32_e32 vcc, 0, v0 |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v7, v3 |
| ; GFX950-NEXT: v_and_b32_e32 v8, 0x7fffff, v7 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v4, 0, v4, vcc |
| ; GFX950-NEXT: v_cmp_o_f32_e32 vcc, v0, v0 |
| ; GFX950-NEXT: v_or_b32_e32 v9, 0x800000, v8 |
| ; GFX950-NEXT: v_bfe_u32 v8, v8, 20, 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v0, v5, v4, vcc |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v4, v3 |
| ; GFX950-NEXT: v_sub_u32_e32 v6, 7, v4 |
| ; GFX950-NEXT: v_min_u32_e32 v6, 31, v6 |
| ; GFX950-NEXT: v_sub_u32_e64 v11, v6, 1 clamp |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v12, v11, v9 |
| ; GFX950-NEXT: v_bfe_u32 v11, v9, 0, v11 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v11 |
| ; GFX950-NEXT: v_bfe_u32 v10, v9, v6, 1 |
| ; GFX950-NEXT: v_bitop3_b16 v0, v0, v1, s0 bitop3:0xec |
| ; GFX950-NEXT: v_cndmask_b32_e64 v11, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v10, v12, v11, v10 bitop3:0xe0 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v6 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v6, v6, v9 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v10, 0, v10, vcc |
| ; GFX950-NEXT: v_add_u32_e32 v6, v6, v10 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v6 |
| ; GFX950-NEXT: v_and_b32_e32 v10, 0x7ffff, v7 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, v6, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v9, 0, 8, vcc |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v10 |
| ; GFX950-NEXT: v_or_b32_e32 v6, v9, v6 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v9, 19, v7 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v10, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v8, v9, v10, v8 bitop3:0xe0 |
| ; GFX950-NEXT: v_bfe_u32 v7, v7, 20, 3 |
| ; GFX950-NEXT: v_add_u32_e32 v7, v7, v8 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v7 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v7, v7, 0, vcc |
| ; GFX950-NEXT: v_addc_co_u32_e32 v4, vcc, 14, v4, vcc |
| ; GFX950-NEXT: v_lshl_or_b32 v7, v4, 3, v7 |
| ; GFX950-NEXT: v_cmp_gt_i32_e32 vcc, 1, v4 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v4, v7, v6, vcc |
| ; GFX950-NEXT: v_cmp_neq_f32_e32 vcc, 0, v3 |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v7, v2 |
| ; GFX950-NEXT: v_and_b32_e32 v8, 0x7fffff, v7 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v4, 0, v4, vcc |
| ; GFX950-NEXT: v_cmp_o_f32_e32 vcc, v3, v3 |
| ; GFX950-NEXT: v_or_b32_e32 v9, 0x800000, v8 |
| ; GFX950-NEXT: v_bfe_u32 v8, v8, 20, 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v3, v5, v4, vcc |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v4, v2 |
| ; GFX950-NEXT: v_sub_u32_e32 v6, 7, v4 |
| ; GFX950-NEXT: v_min_u32_e32 v6, 31, v6 |
| ; GFX950-NEXT: v_sub_u32_e64 v11, v6, 1 clamp |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v12, v11, v9 |
| ; GFX950-NEXT: v_bfe_u32 v11, v9, 0, v11 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v11 |
| ; GFX950-NEXT: v_bfe_u32 v10, v9, v6, 1 |
| ; GFX950-NEXT: v_lshlrev_b16_e32 v3, 8, v3 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v11, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v10, v12, v11, v10 bitop3:0xe0 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v6 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v6, v6, v9 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v10, 0, v10, vcc |
| ; GFX950-NEXT: v_add_u32_e32 v6, v6, v10 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v6 |
| ; GFX950-NEXT: v_and_b32_e32 v10, 0x7ffff, v7 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, v6, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v9, 0, 8, vcc |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v10 |
| ; GFX950-NEXT: v_or_b32_e32 v6, v9, v6 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v9, 19, v7 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v10, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v8, v9, v10, v8 bitop3:0xe0 |
| ; GFX950-NEXT: v_bfe_u32 v7, v7, 20, 3 |
| ; GFX950-NEXT: v_add_u32_e32 v7, v7, v8 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v7 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v7, v7, 0, vcc |
| ; GFX950-NEXT: v_addc_co_u32_e32 v4, vcc, 14, v4, vcc |
| ; GFX950-NEXT: v_lshl_or_b32 v7, v4, 3, v7 |
| ; GFX950-NEXT: v_cmp_gt_i32_e32 vcc, 1, v4 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v4, v7, v6, vcc |
| ; GFX950-NEXT: v_cmp_neq_f32_e32 vcc, 0, v2 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v4, 0, v4, vcc |
| ; GFX950-NEXT: v_cmp_o_f32_e32 vcc, v2, v2 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v2, v5, v4, vcc |
| ; GFX950-NEXT: v_bitop3_b16 v2, v2, v3, s0 bitop3:0xec |
| ; GFX950-NEXT: v_lshlrev_b32_e32 v3, 16, v2 |
| ; GFX950-NEXT: v_lshl_or_b32 v1, v2, 16, v1 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v3, 24, v3 |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_e5m3fnu_v4f32: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v4, v1 |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v5, v1 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v6, v0 |
| ; GFX1200-NEXT: s_mov_b32 s1, 0x7fffff |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v7, v0 |
| ; GFX1200-NEXT: v_sub_nc_u32_e32 v8, 7, v4 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: v_and_or_b32 v13, v5, s1, 0x800000 |
| ; GFX1200-NEXT: v_sub_nc_u32_e32 v11, 7, v6 |
| ; GFX1200-NEXT: v_and_b32_e32 v14, 0x7ffff, v5 |
| ; GFX1200-NEXT: v_and_or_b32 v17, v7, s1, 0x800000 |
| ; GFX1200-NEXT: v_min_u32_e32 v8, 31, v8 |
| ; GFX1200-NEXT: v_bfe_u32 v15, v5, 20, 3 |
| ; GFX1200-NEXT: v_min_u32_e32 v11, 31, v11 |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v14 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v5, 19, v5 |
| ; GFX1200-NEXT: v_sub_nc_u32_e64 v16, v8, 1 clamp |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v22, v8, v13 |
| ; GFX1200-NEXT: v_sub_nc_u32_e64 v18, v11, 1 clamp |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v14, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v23, v11, v17 |
| ; GFX1200-NEXT: v_bfe_u32 v20, v13, 0, v16 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v13, v16, v13 |
| ; GFX1200-NEXT: v_bfe_u32 v21, v17, 0, v18 |
| ; GFX1200-NEXT: v_and_or_b32 v14, v15, 1, v14 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v17, v18, v17 |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v20 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v10, v3 |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v9, v3 |
| ; GFX1200-NEXT: v_and_b32_e32 v5, v5, v14 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v12, v2 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v20, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v21 |
| ; GFX1200-NEXT: v_sub_nc_u32_e32 v14, 7, v10 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v5, v15, v5 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) |
| ; GFX1200-NEXT: v_and_or_b32 v16, v22, 1, v20 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v21, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v8 |
| ; GFX1200-NEXT: v_min_u32_e32 v14, 31, v14 |
| ; GFX1200-NEXT: v_and_or_b32 v20, v9, s1, 0x800000 |
| ; GFX1200-NEXT: v_and_b32_e32 v13, v13, v16 |
| ; GFX1200-NEXT: v_and_b32_e32 v19, 0x7ffff, v7 |
| ; GFX1200-NEXT: v_and_or_b32 v18, v23, 1, v21 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v8, 0, v13, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v11 |
| ; GFX1200-NEXT: v_and_b32_e32 v16, v17, v18 |
| ; GFX1200-NEXT: v_sub_nc_u32_e32 v13, 7, v12 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v18, v14, v20 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v8, v22, v8 |
| ; GFX1200-NEXT: v_bfe_u32 v22, v9, 20, 3 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v11, 0, v16, vcc_lo |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v5 |
| ; GFX1200-NEXT: v_sub_nc_u32_e64 v16, v14, 1 clamp |
| ; GFX1200-NEXT: v_cmp_lt_i32_e64 s0, 7, v8 |
| ; GFX1200-NEXT: v_min_u32_e32 v13, 31, v13 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v5, v5, 0, vcc_lo |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v4, null, 14, v4, vcc_lo |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v8, v8, 0, s0 |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v15, 0, 8, s0 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_lshl_or_b32 v5, v4, 3, v5 |
| ; GFX1200-NEXT: v_or_b32_e32 v8, v15, v8 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v11, v23, v11 |
| ; GFX1200-NEXT: v_bfe_u32 v15, v20, 0, v16 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v16, v16, v20 |
| ; GFX1200-NEXT: v_sub_nc_u32_e64 v20, v13, 1 clamp |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_4) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v11 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v11, v11, 0, vcc_lo |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v17, 0, 8, vcc_lo |
| ; GFX1200-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v4 |
| ; GFX1200-NEXT: v_or_b32_e32 v11, v17, v11 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v4, v5, v8, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v15 |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v15, v2 |
| ; GFX1200-NEXT: v_and_b32_e32 v21, 0x7ffff, v9 |
| ; GFX1200-NEXT: v_bfe_u32 v17, v7, 20, 3 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v7, 19, v7 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v5, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v19 |
| ; GFX1200-NEXT: v_and_or_b32 v19, v15, s1, 0x800000 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v9, 19, v9 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) |
| ; GFX1200-NEXT: v_and_or_b32 v5, v18, 1, v5 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v8, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v21 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v23, v13, v19 |
| ; GFX1200-NEXT: v_and_b32_e32 v5, v16, v5 |
| ; GFX1200-NEXT: v_bfe_u32 v16, v19, 0, v20 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v21, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_and_or_b32 v8, v17, 1, v8 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v19, v20, v19 |
| ; GFX1200-NEXT: v_bfe_u32 v20, v15, 20, 3 |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v16 |
| ; GFX1200-NEXT: v_and_or_b32 v21, v22, 1, v21 |
| ; GFX1200-NEXT: v_and_b32_e32 v7, v7, v8 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v16, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v14 |
| ; GFX1200-NEXT: v_and_b32_e32 v14, 0x7ffff, v15 |
| ; GFX1200-NEXT: v_and_b32_e32 v9, v9, v21 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v15, 19, v15 |
| ; GFX1200-NEXT: v_and_or_b32 v16, v23, 1, v16 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v5, 0, v5, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v14 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v9, v22, v9 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v7, v17, v7 |
| ; GFX1200-NEXT: v_and_b32_e32 v8, v19, v16 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v5, v18, v5 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v14, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v13 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_and_or_b32 v14, v20, 1, v14 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v8, 0, v8, vcc_lo |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v5 |
| ; GFX1200-NEXT: v_and_b32_e32 v13, v15, v14 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v8, v23, v8 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v5, v5, 0, vcc_lo |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v14, 0, 8, vcc_lo |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v9 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v13, v20, v13 |
| ; GFX1200-NEXT: v_cmp_lt_i32_e64 s0, 7, v8 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_4) |
| ; GFX1200-NEXT: v_or_b32_e32 v5, v14, v5 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v9, v9, 0, vcc_lo |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v10, null, 14, v10, vcc_lo |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v13 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v8, v8, 0, s0 |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v15, 0, 8, s0 |
| ; GFX1200-NEXT: v_lshl_or_b32 v9, v10, 3, v9 |
| ; GFX1200-NEXT: v_cmp_gt_i32_e64 s0, 1, v10 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v13, v13, 0, vcc_lo |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v12, null, 14, v12, vcc_lo |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v7 |
| ; GFX1200-NEXT: v_or_b32_e32 v8, v15, v8 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v5, v9, v5, s0 |
| ; GFX1200-NEXT: v_lshl_or_b32 v13, v12, 3, v13 |
| ; GFX1200-NEXT: v_cmp_gt_i32_e64 s0, 1, v12 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v7, v7, 0, vcc_lo |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v6, null, 14, v6, vcc_lo |
| ; GFX1200-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v3 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v8, v13, v8, s0 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) |
| ; GFX1200-NEXT: v_lshl_or_b32 v7, v6, 3, v7 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v5, 0, v5, vcc_lo |
| ; GFX1200-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v2 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v8, 0, v8, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f32_e32 vcc_lo, v3, v3 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v3, 0xff, v5, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f32_e32 vcc_lo, v2, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_lshlrev_b16 v2.l, 8, v3.l |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v5, 0xff, v8, vcc_lo |
| ; GFX1200-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v6 |
| ; GFX1200-NEXT: v_and_b16 v2.h, 0xff, v5.l |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v6, v7, v11, vcc_lo |
| ; GFX1200-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v1 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) |
| ; GFX1200-NEXT: v_or_b16 v2.h, v2.h, v2.l |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v4, 0, v4, vcc_lo |
| ; GFX1200-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v3, 0, v6, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f32_e32 vcc_lo, v1, v1 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, 0xff, v4, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_lshlrev_b16 v2.l, 8, v1.l |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v0, 0xff, v3, vcc_lo |
| ; GFX1200-NEXT: v_mov_b16_e32 v3.l, v2.h |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v1, 8, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_and_b16 v0.l, 0xff, v0.l |
| ; GFX1200-NEXT: v_lshlrev_b32_e32 v3, 16, v3 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_or_b16 v0.l, v0.l, v2.l |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v3, 24, v3 |
| ; GFX1200-NEXT: v_mov_b16_e32 v2.l, v2.h |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_e5m3fnu_v4f32: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_fp8_f32 v2.l, v2, v3 clamp |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_fp8_f32 v0.l, v0, v1 clamp |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-TRUE16-NEXT: v_lshlrev_b32_e32 v1, 16, v2 |
| ; GFX1250-TRUE16-NEXT: v_bfe_u32 v3, v2, 8, 8 |
| ; GFX1250-TRUE16-NEXT: v_and_or_b32 v1, 0xff00, v0, v1 |
| ; GFX1250-TRUE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-TRUE16-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_e5m3fnu_v4f32: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_fp8_f32 v2, v2, v3 clamp |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_fp8_f32 v0, v0, v1 clamp |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-FAKE16-NEXT: v_lshlrev_b32_e32 v1, 16, v2 |
| ; GFX1250-FAKE16-NEXT: v_bfe_u32 v3, v2, 8, 8 |
| ; GFX1250-FAKE16-NEXT: v_and_or_b32 v1, 0xff00, v0, v1 |
| ; GFX1250-FAKE16-NEXT: s_delay_alu instid0(VALU_DEP_1) |
| ; GFX1250-FAKE16-NEXT: v_lshrrev_b32_e32 v1, 8, v1 |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_e5m3fnu_v4f32: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v4, v1 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v5, v1 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v6, v0 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v8, v0 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v9, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_2) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_dual_sub_nc_u32 v7, 7, v4 :: v_dual_lshrrev_b32 v12, 19, v5 |
| ; GFX1310-NEXT: v_and_b32_e32 v11, 0x7fffff, v5 |
| ; GFX1310-NEXT: v_and_b32_e32 v13, 0x7ffff, v5 |
| ; GFX1310-NEXT: v_dual_sub_nc_u32 v16, 7, v6 :: v_dual_sub_nc_u32 v18, 7, v9 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_min_u32_e32 v7, 31, v7 |
| ; GFX1310-NEXT: v_or_b32_e32 v14, 0x800000, v11 |
| ; GFX1310-NEXT: v_bfe_u32 v11, v11, 20, 1 |
| ; GFX1310-NEXT: v_bfe_u32 v5, v5, 20, 3 |
| ; GFX1310-NEXT: v_and_b32_e32 v17, 0x7fffff, v8 |
| ; GFX1310-NEXT: v_sub_nc_u32_e64 v15, v7, 1 clamp |
| ; GFX1310-NEXT: v_min_u32_e32 v16, 31, v16 |
| ; GFX1310-NEXT: v_bfe_u32 v21, v14, v7, 1 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v10, v3 |
| ; GFX1310-NEXT: v_or_b32_e32 v22, 0x800000, v17 |
| ; GFX1310-NEXT: v_bfe_u32 v20, v14, 0, v15 |
| ; GFX1310-NEXT: v_min_u32_e32 v18, 31, v18 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_and_b32_e32 v19, 0x7fffff, v10 |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v20 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v20, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v13 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v13, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v7 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_bitop3_b32 v11, v12, v13, v11 bitop3:0xe0 |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v15, v15, v14 |
| ; GFX1310-NEXT: v_bfe_u32 v13, v22, v16, 1 |
| ; GFX1310-NEXT: v_add_nc_u32_e32 v5, v5, v11 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_bitop3_b32 v15, v15, v20, v21 bitop3:0xe0 |
| ; GFX1310-NEXT: v_sub_nc_u32_e64 v20, v16, 1 clamp |
| ; GFX1310-NEXT: v_dual_cndmask_b32 v7, 0, v15 :: v_dual_lshrrev_b32 v14, v7, v14 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_bfe_u32 v12, v22, 0, v20 |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v11, v20, v22 |
| ; GFX1310-NEXT: v_sub_nc_u32_e64 v15, v18, 1 clamp |
| ; GFX1310-NEXT: v_add_nc_u32_e32 v7, v14, v7 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v12 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e64 s0, 7, v7 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v12, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v5 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v7, v7, 0, s0 |
| ; GFX1310-NEXT: v_bitop3_b32 v11, v11, v12, v13 bitop3:0xe0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v5, v5, 0, vcc_lo |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v4, null, 14, v4, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v12, 0, 8, s0 |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v16 |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v14, v16, v22 |
| ; GFX1310-NEXT: v_or_b32_e32 v13, 0x800000, v19 |
| ; GFX1310-NEXT: v_lshl_or_b32 v5, v4, 3, v5 |
| ; GFX1310-NEXT: v_or_b32_e32 v7, v12, v7 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v11, 0, v11, vcc_lo |
| ; GFX1310-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v4 |
| ; GFX1310-NEXT: v_cmp_neq_f32_e64 s0, 0, v1 |
| ; GFX1310-NEXT: v_bfe_u32 v12, v13, v18, 1 |
| ; GFX1310-NEXT: v_bfe_u32 v19, v19, 20, 1 |
| ; GFX1310-NEXT: v_dual_add_nc_u32 v11, v14, v11 :: v_dual_lshrrev_b32 v14, v15, v13 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v4, v5, v7, vcc_lo |
| ; GFX1310-NEXT: v_bfe_u32 v5, v13, 0, v15 |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v13, v18, v13 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v15, v2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v4, 0, v4, s0 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v11 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v7, v11, 0, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v11, 0, 8, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v5 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v5, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_o_f32_e32 vcc_lo, v1, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1310-NEXT: v_bitop3_b32 v5, v14, v5, v12 bitop3:0xe0 |
| ; GFX1310-NEXT: v_and_b32_e32 v12, 0x7ffff, v8 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v14, v2 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, 0xff, v4, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v18 |
| ; GFX1310-NEXT: v_or_b32_e32 v4, v11, v7 |
| ; GFX1310-NEXT: v_bfe_u32 v11, v17, 20, 1 |
| ; GFX1310-NEXT: v_and_b32_e32 v17, 0x7ffff, v10 |
| ; GFX1310-NEXT: v_dual_lshrrev_b32 v7, 19, v8 :: v_dual_cndmask_b32 v5, 0, v5, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v12 |
| ; GFX1310-NEXT: v_sub_nc_u32_e32 v16, 7, v14 |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v18, 19, v10 |
| ; GFX1310-NEXT: v_bfe_u32 v10, v10, 20, 3 |
| ; GFX1310-NEXT: v_bfe_u32 v8, v8, 20, 3 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v12, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v17 |
| ; GFX1310-NEXT: v_min_u32_e32 v16, 31, v16 |
| ; GFX1310-NEXT: v_lshlrev_b16 v1, 8, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_bitop3_b32 v7, v7, v12, v11 bitop3:0xe0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v17, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_sub_nc_u32_e64 v21, v16, 1 clamp |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_bitop3_b32 v12, v18, v17, v19 bitop3:0xe0 |
| ; GFX1310-NEXT: v_add_nc_u32_e32 v5, v13, v5 |
| ; GFX1310-NEXT: v_and_b32_e32 v13, 0x7fffff, v15 |
| ; GFX1310-NEXT: v_add_nc_u32_e32 v10, v10, v12 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v5 |
| ; GFX1310-NEXT: v_or_b32_e32 v20, 0x800000, v13 |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v12, 19, v15 |
| ; GFX1310-NEXT: v_bfe_u32 v13, v13, 20, 1 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v5, v5, 0, vcc_lo |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) |
| ; GFX1310-NEXT: v_bfe_u32 v11, v20, 0, v21 |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v18, v21, v20 |
| ; GFX1310-NEXT: v_and_b32_e32 v21, 0x7ffff, v15 |
| ; GFX1310-NEXT: v_bfe_u32 v17, v20, v16, 1 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v19, 0, 8, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e64 s0, 0, v11 |
| ; GFX1310-NEXT: v_add_nc_u32_e32 v7, v8, v7 |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v21 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_or_b32_e32 v5, v19, v5 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v11, 0, 1, s0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_bitop3_b32 v11, v18, v11, v17 bitop3:0xe0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v17, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v16 |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v16, v16, v20 |
| ; GFX1310-NEXT: v_bitop3_b32 v12, v12, v17, v13 bitop3:0xe0 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v11, 0, v11, vcc_lo |
| ; GFX1310-NEXT: v_bfe_u32 v13, v15, 20, 3 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v10 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_dual_add_nc_u32 v11, v16, v11 :: v_dual_add_nc_u32 v12, v13, v12 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v10, v10, 0, vcc_lo |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v9, null, 14, v9, vcc_lo |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v11 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_cmp_lt_i32_e64 s0, 7, v12 |
| ; GFX1310-NEXT: v_lshl_or_b32 v8, v9, 3, v10 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v10, v11, 0, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v11, 0, 8, vcc_lo |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_3) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v12, v12, 0, s0 |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v13, null, 14, v14, s0 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v7 |
| ; GFX1310-NEXT: v_cmp_gt_i32_e64 s0, 1, v9 |
| ; GFX1310-NEXT: v_lshl_or_b32 v9, v13, 3, v12 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v7, v7, 0, vcc_lo |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_dual_cndmask_b32 v5, v8, v5, s0 :: v_dual_bitop2_b32 v8, v11, v10 bitop3:0x54 |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v6, null, 14, v6, vcc_lo |
| ; GFX1310-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v3 |
| ; GFX1310-NEXT: v_lshl_or_b32 v7, v6, 3, v7 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_3) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v5, 0, v5, vcc_lo |
| ; GFX1310-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v13 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v8, v9, v8, vcc_lo |
| ; GFX1310-NEXT: v_cmp_o_f32_e32 vcc_lo, v3, v3 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v3, 0xff, v5, vcc_lo |
| ; GFX1310-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v5, 0, v8, vcc_lo |
| ; GFX1310-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v6 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v4, v7, v4, vcc_lo |
| ; GFX1310-NEXT: v_cmp_o_f32_e32 vcc_lo, v2, v2 |
| ; GFX1310-NEXT: v_lshlrev_b16 v3, 8, v3 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v2, 0xff, v5, vcc_lo |
| ; GFX1310-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_bitop3_b16 v2, v2, v3, 0xff bitop3:0xec |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v4, 0, v4, vcc_lo |
| ; GFX1310-NEXT: v_and_b32_e32 v3, 0xffff, v1 |
| ; GFX1310-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1310-NEXT: v_lshl_or_b32 v3, v2, 16, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v0, 0xff, v4, vcc_lo |
| ; GFX1310-NEXT: v_lshlrev_b32_e32 v4, 16, v2 |
| ; GFX1310-NEXT: v_bitop3_b16 v0, v0, v1, 0xff bitop3:0xec |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) |
| ; GFX1310-NEXT: v_dual_lshrrev_b32 v1, 8, v3 :: v_dual_lshrrev_b32 v3, 24, v4 |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call <4 x i8> @llvm.convert.to.arbitrary.fp.v4i8.v4f32(<4 x float> %x, metadata !"Float8E5M3FNU", metadata !"round.tonearest", i1 false) |
| ret <4 x i8> %r |
| } |
| |
| define i8 @to_e5m3fnu_f32_sat(float %x) { |
| ; GFX950-LABEL: to_e5m3fnu_f32_sat: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX950-NEXT: v_sub_u32_e32 v2, 7, v1 |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v3, v0 |
| ; GFX950-NEXT: v_min_u32_e32 v2, 31, v2 |
| ; GFX950-NEXT: v_and_b32_e32 v4, 0x7fffff, v3 |
| ; GFX950-NEXT: v_or_b32_e32 v5, 0x800000, v4 |
| ; GFX950-NEXT: v_sub_u32_e64 v7, v2, 1 clamp |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v8, v7, v5 |
| ; GFX950-NEXT: v_bfe_u32 v7, v5, 0, v7 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v7 |
| ; GFX950-NEXT: v_bfe_u32 v6, v5, v2, 1 |
| ; GFX950-NEXT: v_bfe_u32 v4, v4, 20, 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v6, v8, v7, v6 bitop3:0xe0 |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v2 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v2, v2, v5 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v6, 0, v6, vcc |
| ; GFX950-NEXT: v_add_u32_e32 v2, v2, v6 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v2 |
| ; GFX950-NEXT: v_and_b32_e32 v6, 0x7ffff, v3 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v5, 0, 8, vcc |
| ; GFX950-NEXT: v_cmp_ne_u32_e32 vcc, 0, v6 |
| ; GFX950-NEXT: v_or_b32_e32 v2, v5, v2 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v5, 19, v3 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc |
| ; GFX950-NEXT: v_bitop3_b32 v4, v5, v6, v4 bitop3:0xe0 |
| ; GFX950-NEXT: v_bfe_u32 v3, v3, 20, 3 |
| ; GFX950-NEXT: v_add_u32_e32 v3, v3, v4 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v3 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc |
| ; GFX950-NEXT: v_addc_co_u32_e32 v1, vcc, 14, v1, vcc |
| ; GFX950-NEXT: v_lshl_or_b32 v4, v1, 3, v3 |
| ; GFX950-NEXT: v_cmp_gt_i32_e32 vcc, 1, v1 |
| ; GFX950-NEXT: v_cmp_eq_u32_e64 s[0:1], 31, v1 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v2, v4, v2, vcc |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 6, v3 |
| ; GFX950-NEXT: s_and_b64 s[0:1], s[0:1], vcc |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 31, v1 |
| ; GFX950-NEXT: v_mov_b32_e32 v1, 0xfe |
| ; GFX950-NEXT: s_or_b64 vcc, vcc, s[0:1] |
| ; GFX950-NEXT: v_cndmask_b32_e32 v2, v2, v1, vcc |
| ; GFX950-NEXT: v_cmp_neq_f32_e32 vcc, 0, v0 |
| ; GFX950-NEXT: s_mov_b32 s0, 0x7f800000 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc |
| ; GFX950-NEXT: v_cmp_neq_f32_e64 vcc, |v0|, s0 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v1, v1, v2, vcc |
| ; GFX950-NEXT: v_cmp_ngt_f32_e32 vcc, 0, v0 |
| ; GFX950-NEXT: v_mov_b32_e32 v2, 0xff |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc |
| ; GFX950-NEXT: v_cmp_o_f32_e32 vcc, v0, v0 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_e5m3fnu_f32_sat: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v3, v0 |
| ; GFX1200-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_sub_nc_u32_e32 v2, 7, v1 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: v_and_or_b32 v4, v3, s0, 0x800000 |
| ; GFX1200-NEXT: v_and_b32_e32 v8, 0x7ffff, v3 |
| ; GFX1200-NEXT: v_bfe_u32 v9, v3, 20, 3 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v3, 19, v3 |
| ; GFX1200-NEXT: v_min_u32_e32 v2, 31, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_sub_nc_u32_e64 v5, v2, 1 clamp |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v7, v2, v4 |
| ; GFX1200-NEXT: v_bfe_u32 v6, v4, 0, v5 |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v4, v5, v4 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v6 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v8 |
| ; GFX1200-NEXT: v_and_or_b32 v5, v7, 1, v6 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v6, 0, 1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_and_b32_e32 v4, v4, v5 |
| ; GFX1200-NEXT: v_and_or_b32 v5, v9, 1, v6 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1200-NEXT: v_dual_cndmask_b32 v2, 0, v4 :: v_dual_and_b32 v3, v3, v5 |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v2, v7, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_add_nc_u32_e32 v3, v9, v3 |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cmp_lt_i32_e64 s0, 7, v3 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc_lo |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v3, v3, 0, s0 |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v4, 0, 8, vcc_lo |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v1, null, 14, v1, s0 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 6, v3 |
| ; GFX1200-NEXT: v_or_b32_e32 v2, v4, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_4) | instid1(VALU_DEP_3) |
| ; GFX1200-NEXT: v_lshl_or_b32 v4, v1, 3, v3 |
| ; GFX1200-NEXT: v_cmp_gt_i32_e64 s2, 1, v1 |
| ; GFX1200-NEXT: v_cmp_eq_u32_e64 s0, 31, v1 |
| ; GFX1200-NEXT: v_cmp_lt_i32_e64 s1, 31, v1 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v1, v4, v2, s2 |
| ; GFX1200-NEXT: s_and_b32 s0, s0, vcc_lo |
| ; GFX1200-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: s_or_b32 s0, s1, s0 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v1, v1, 0xfe, s0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_neq_f32_e64 vcc_lo, 0x7f800000, |v0| |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, 0xfe, v1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_ngt_f32_e32 vcc_lo, 0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v0, 0xff, v1, vcc_lo |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-TRUE16-LABEL: to_e5m3fnu_f32_sat: |
| ; GFX1250-TRUE16: ; %bb.0: |
| ; GFX1250-TRUE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-TRUE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-TRUE16-NEXT: v_cvt_pk_fp8_f32 v0.l, v0, v0 clamp |
| ; GFX1250-TRUE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1250-FAKE16-LABEL: to_e5m3fnu_f32_sat: |
| ; GFX1250-FAKE16: ; %bb.0: |
| ; GFX1250-FAKE16-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-FAKE16-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-FAKE16-NEXT: v_cvt_pk_fp8_f32 v0, v0, v0 clamp |
| ; GFX1250-FAKE16-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_e5m3fnu_f32_sat: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v2, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_4) |
| ; GFX1310-NEXT: v_dual_sub_nc_u32 v3, 7, v1 :: v_dual_lshrrev_b32 v10, 19, v2 |
| ; GFX1310-NEXT: v_and_b32_e32 v4, 0x7fffff, v2 |
| ; GFX1310-NEXT: v_and_b32_e32 v9, 0x7ffff, v2 |
| ; GFX1310-NEXT: v_bfe_u32 v2, v2, 20, 3 |
| ; GFX1310-NEXT: v_min_u32_e32 v3, 31, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(SKIP_1) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_or_b32_e32 v5, 0x800000, v4 |
| ; GFX1310-NEXT: v_bfe_u32 v4, v4, 20, 1 |
| ; GFX1310-NEXT: v_sub_nc_u32_e64 v6, v3, 1 clamp |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_bfe_u32 v8, v5, v3, 1 |
| ; GFX1310-NEXT: v_bfe_u32 v7, v5, 0, v6 |
| ; GFX1310-NEXT: v_dual_lshrrev_b32 v6, v6, v5 :: v_dual_lshrrev_b32 v5, v3, v5 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v7 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v9 |
| ; GFX1310-NEXT: v_bitop3_b32 v6, v6, v7, v8 bitop3:0xe0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v7, 0, 1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ne_u32_e32 vcc_lo, 0, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_bitop3_b32 v4, v10, v7, v4 bitop3:0xe0 |
| ; GFX1310-NEXT: v_dual_cndmask_b32 v3, 0, v6 :: v_dual_add_nc_u32 v2, v2, v4 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_add_nc_u32_e32 v3, v5, v3 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e64 s0, 7, v2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v3 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v2, v2, 0, s0 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v4, 0, 8, vcc_lo |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v1, null, 14, v1, s0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_4) | instskip(NEXT) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 6, v2 |
| ; GFX1310-NEXT: v_or_b32_e32 v3, v4, v3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_3) | instid1(VALU_DEP_3) |
| ; GFX1310-NEXT: v_lshl_or_b32 v4, v1, 3, v2 |
| ; GFX1310-NEXT: v_cmp_gt_i32_e64 s2, 1, v1 |
| ; GFX1310-NEXT: v_cmp_eq_u32_e64 s0, 31, v1 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e64 s1, 31, v1 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v1, v4, v3, s2 |
| ; GFX1310-NEXT: s_and_b32 s0, s0, vcc_lo |
| ; GFX1310-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1310-NEXT: s_or_b32 s0, s1, s0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instid1(SALU_CYCLE_1) |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v1, v1, 0xfe, s0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_neq_f32_e64 vcc_lo, 0x7f800000, |v0| |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, 0xfe, v1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_ngt_f32_e32 vcc_lo, 0, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v0, 0xff, v1, vcc_lo |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.f32(float %x, metadata !"Float8E5M3FNU", metadata !"round.tonearest", i1 true) |
| ret i8 %r |
| } |
| |
| define i8 @to_e5m3fnu_f32_rtz(float %x) { |
| ; GFX950-LABEL: to_e5m3fnu_f32_rtz: |
| ; GFX950: ; %bb.0: |
| ; GFX950-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; GFX950-NEXT: v_frexp_mant_f32_e32 v1, v0 |
| ; GFX950-NEXT: v_frexp_exp_i32_f32_e32 v3, v0 |
| ; GFX950-NEXT: v_and_b32_e32 v2, 0x7fffff, v1 |
| ; GFX950-NEXT: v_sub_u32_e32 v4, 7, v3 |
| ; GFX950-NEXT: v_or_b32_e32 v2, 0x800000, v2 |
| ; GFX950-NEXT: v_min_u32_e32 v4, 31, v4 |
| ; GFX950-NEXT: v_lshrrev_b32_e32 v2, v4, v2 |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v2 |
| ; GFX950-NEXT: v_bfe_u32 v1, v1, 20, 3 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v2, v2, 0, vcc |
| ; GFX950-NEXT: v_cndmask_b32_e64 v4, 0, 8, vcc |
| ; GFX950-NEXT: v_cmp_lt_i32_e32 vcc, 7, v1 |
| ; GFX950-NEXT: v_or_b32_e32 v2, v4, v2 |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e64 v1, v1, 0, vcc |
| ; GFX950-NEXT: v_addc_co_u32_e32 v3, vcc, 14, v3, vcc |
| ; GFX950-NEXT: v_lshl_or_b32 v1, v3, 3, v1 |
| ; GFX950-NEXT: v_cmp_gt_i32_e32 vcc, 1, v3 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v1, v1, v2, vcc |
| ; GFX950-NEXT: v_cmp_neq_f32_e32 vcc, 0, v0 |
| ; GFX950-NEXT: v_mov_b32_e32 v2, 0xff |
| ; GFX950-NEXT: s_nop 0 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc |
| ; GFX950-NEXT: v_cmp_o_f32_e32 vcc, v0, v0 |
| ; GFX950-NEXT: s_nop 1 |
| ; GFX950-NEXT: v_cndmask_b32_e32 v0, v2, v1, vcc |
| ; GFX950-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1200-LABEL: to_e5m3fnu_f32_rtz: |
| ; GFX1200: ; %bb.0: |
| ; GFX1200-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1200-NEXT: s_wait_expcnt 0x0 |
| ; GFX1200-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1200-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1200-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1200-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1200-NEXT: v_frexp_mant_f32_e32 v2, v0 |
| ; GFX1200-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_sub_nc_u32_e32 v3, 7, v1 |
| ; GFX1200-NEXT: s_wait_alu depctr_sa_sdst(0) |
| ; GFX1200-NEXT: v_and_or_b32 v4, v2, s0, 0x800000 |
| ; GFX1200-NEXT: v_bfe_u32 v2, v2, 20, 3 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_min_u32_e32 v3, 31, v3 |
| ; GFX1200-NEXT: v_cmp_lt_i32_e64 s0, 7, v2 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_lshrrev_b32_e32 v3, v3, v4 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_sdst(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v2, v2, 0, s0 |
| ; GFX1200-NEXT: v_add_co_ci_u32_e64 v1, null, 14, v1, s0 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v3 |
| ; GFX1200-NEXT: v_lshl_or_b32 v2, v1, 3, v2 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1200-NEXT: v_cndmask_b32_e64 v4, 0, 8, vcc_lo |
| ; GFX1200-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v1 |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_1) |
| ; GFX1200-NEXT: v_or_b32_e32 v3, v4, v3 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, v2, v3, vcc_lo |
| ; GFX1200-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_2) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc_lo |
| ; GFX1200-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1200-NEXT: s_wait_alu depctr_va_vcc(0) |
| ; GFX1200-NEXT: v_cndmask_b32_e32 v0, 0xff, v1, vcc_lo |
| ; GFX1200-NEXT: s_setpc_b64 s[30:31] |
| ; |
| ; GFX1250-LABEL: to_e5m3fnu_f32_rtz: |
| ; GFX1250: ; %bb.0: |
| ; GFX1250-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1250-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1250-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1250-NEXT: v_frexp_mant_f32_e32 v2, v0 |
| ; GFX1250-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_sub_nc_u32_e32 v3, 7, v1 |
| ; GFX1250-NEXT: v_and_or_b32 v4, v2, s0, 0x800000 |
| ; GFX1250-NEXT: v_bfe_u32 v2, v2, 20, 3 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_min_u32_e32 v3, 31, v3 |
| ; GFX1250-NEXT: v_cmp_lt_i32_e64 s0, 7, v2 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_lshrrev_b32_e32 v3, v3, v4 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v2, v2, 0, s0 |
| ; GFX1250-NEXT: v_add_co_ci_u32_e64 v1, null, 14, v1, s0 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v3 |
| ; GFX1250-NEXT: v_lshl_or_b32 v2, v1, 3, v2 |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1250-NEXT: v_cndmask_b32_e64 v4, 0, 8, vcc_lo |
| ; GFX1250-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v1 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1250-NEXT: v_or_b32_e32 v3, v4, v3 |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v1, v2, v3, vcc_lo |
| ; GFX1250-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1250-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc_lo |
| ; GFX1250-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1250-NEXT: v_cndmask_b32_e32 v0, 0xff, v1, vcc_lo |
| ; GFX1250-NEXT: s_set_pc_i64 s[30:31] |
| ; |
| ; GFX1310-LABEL: to_e5m3fnu_f32_rtz: |
| ; GFX1310: ; %bb.0: |
| ; GFX1310-NEXT: s_wait_loadcnt_dscnt 0x0 |
| ; GFX1310-NEXT: s_wait_expcnt 0x0 |
| ; GFX1310-NEXT: s_wait_samplecnt 0x0 |
| ; GFX1310-NEXT: s_wait_bvhcnt 0x0 |
| ; GFX1310-NEXT: s_wait_kmcnt 0x0 |
| ; GFX1310-NEXT: v_frexp_exp_i32_f32_e32 v1, v0 |
| ; GFX1310-NEXT: v_frexp_mant_f32_e32 v2, v0 |
| ; GFX1310-NEXT: s_mov_b32 s0, 0x7fffff |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_sub_nc_u32_e32 v3, 7, v1 |
| ; GFX1310-NEXT: v_and_or_b32 v4, v2, s0, 0x800000 |
| ; GFX1310-NEXT: v_bfe_u32 v2, v2, 20, 3 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_min_u32_e32 v3, 31, v3 |
| ; GFX1310-NEXT: v_cmp_lt_i32_e64 s0, 7, v2 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_lshrrev_b32_e32 v3, v3, v4 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v2, v2, 0, s0 |
| ; GFX1310-NEXT: v_add_co_ci_u32_e64 v1, null, 14, v1, s0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cmp_lt_i32_e32 vcc_lo, 7, v3 |
| ; GFX1310-NEXT: v_lshl_or_b32 v2, v1, 3, v2 |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v3, v3, 0, vcc_lo |
| ; GFX1310-NEXT: v_cndmask_b32_e64 v4, 0, 8, vcc_lo |
| ; GFX1310-NEXT: v_cmp_gt_i32_e32 vcc_lo, 1, v1 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1) |
| ; GFX1310-NEXT: v_or_b32_e32 v3, v4, v3 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, v2, v3, vcc_lo |
| ; GFX1310-NEXT: v_cmp_neq_f32_e32 vcc_lo, 0, v0 |
| ; GFX1310-NEXT: s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2) |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v1, 0, v1, vcc_lo |
| ; GFX1310-NEXT: v_cmp_o_f32_e32 vcc_lo, v0, v0 |
| ; GFX1310-NEXT: v_cndmask_b32_e32 v0, 0xff, v1, vcc_lo |
| ; GFX1310-NEXT: s_set_pc_i64 s[30:31] |
| %r = call i8 @llvm.convert.to.arbitrary.fp.i8.f32(float %x, metadata !"Float8E5M3FNU", metadata !"round.towardzero", i1 false) |
| ret i8 %r |
| } |