CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
170 lines
5.9 KiB
LLVM
170 lines
5.9 KiB
LLVM
; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | FileCheck %s
|
|
; Test valid scalar and vector conversions for arbitrary FP intrinsics
|
|
|
|
declare i8 @llvm.convert.to.arbitrary.fp.i8.f16(half, metadata, metadata, i1)
|
|
declare <4 x i8> @llvm.convert.to.arbitrary.fp.v4i8.v4f16(<4 x half>, metadata, metadata, i1)
|
|
declare <8 x i8> @llvm.convert.to.arbitrary.fp.v8i8.v8f16(<8 x half>, metadata, metadata, i1)
|
|
declare <4 x i8> @llvm.convert.to.arbitrary.fp.v4i8.v4f32(<4 x float>, metadata, metadata, i1)
|
|
|
|
declare half @llvm.convert.from.arbitrary.fp.f16.i8(i8, metadata)
|
|
declare <4 x half> @llvm.convert.from.arbitrary.fp.v4f16.v4i8(<4 x i8>, metadata)
|
|
declare <8 x half> @llvm.convert.from.arbitrary.fp.v8f16.v8i8(<8 x i8>, metadata)
|
|
declare float @llvm.convert.from.arbitrary.fp.f32.i8(i8, metadata)
|
|
declare <4 x float> @llvm.convert.from.arbitrary.fp.v4f32.v4i8(<4 x i8>, metadata)
|
|
|
|
; Scalar conversions to arbitrary FP
|
|
; CHECK-LABEL: @good_half_to_fp8(
|
|
define i8 @good_half_to_fp8(half %v) {
|
|
%r = call i8 @llvm.convert.to.arbitrary.fp.i8.f16(
|
|
half %v, metadata !"Float8E5M2", metadata !"round.towardzero", i1 true)
|
|
ret i8 %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_half_to_fp8_fnuz(
|
|
define i8 @good_half_to_fp8_fnuz(half %v) {
|
|
%r = call i8 @llvm.convert.to.arbitrary.fp.i8.f16(
|
|
half %v, metadata !"Float8E4M3FNUZ", metadata !"round.tonearest", i1 false)
|
|
ret i8 %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_half_to_fp8_fn(
|
|
define i8 @good_half_to_fp8_fn(half %v) {
|
|
%r = call i8 @llvm.convert.to.arbitrary.fp.i8.f16(
|
|
half %v, metadata !"Float8E4M3FN", metadata !"round.tonearest", i1 false)
|
|
ret i8 %r
|
|
}
|
|
|
|
; Scalar conversions from arbitrary FP
|
|
; CHECK-LABEL: @good_fp8_to_half(
|
|
define half @good_fp8_to_half(i8 %v) {
|
|
%r = call half @llvm.convert.from.arbitrary.fp.f16.i8(
|
|
i8 %v, metadata !"Float8E4M3")
|
|
ret half %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_fp8_e5m2_to_half(
|
|
define half @good_fp8_e5m2_to_half(i8 %v) {
|
|
%r = call half @llvm.convert.from.arbitrary.fp.f16.i8(
|
|
i8 %v, metadata !"Float8E5M2")
|
|
ret half %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_fp8_to_float(
|
|
define float @good_fp8_to_float(i8 %v) {
|
|
%r = call float @llvm.convert.from.arbitrary.fp.f32.i8(
|
|
i8 %v, metadata !"Float8E4M3")
|
|
ret float %r
|
|
}
|
|
|
|
; Vector conversions to arbitrary FP
|
|
; CHECK-LABEL: @good_vec4_half_to_fp8(
|
|
define <4 x i8> @good_vec4_half_to_fp8(<4 x half> %v) {
|
|
%r = call <4 x i8> @llvm.convert.to.arbitrary.fp.v4i8.v4f16(
|
|
<4 x half> %v, metadata !"Float8E4M3FN", metadata !"round.towardzero", i1 true)
|
|
ret <4 x i8> %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_vec8_half_to_fp8(
|
|
define <8 x i8> @good_vec8_half_to_fp8(<8 x half> %v) {
|
|
%r = call <8 x i8> @llvm.convert.to.arbitrary.fp.v8i8.v8f16(
|
|
<8 x half> %v, metadata !"Float8E5M2FNUZ", metadata !"round.tonearest", i1 false)
|
|
ret <8 x i8> %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_vec4_float_to_fp8(
|
|
define <4 x i8> @good_vec4_float_to_fp8(<4 x float> %v) {
|
|
%r = call <4 x i8> @llvm.convert.to.arbitrary.fp.v4i8.v4f32(
|
|
<4 x float> %v, metadata !"Float8E4M3B11FNUZ", metadata !"round.tonearest", i1 false)
|
|
ret <4 x i8> %r
|
|
}
|
|
|
|
; Vector conversions from arbitrary FP
|
|
; CHECK-LABEL: @good_vec4_fp8_to_half(
|
|
define <4 x half> @good_vec4_fp8_to_half(<4 x i8> %v) {
|
|
%r = call <4 x half> @llvm.convert.from.arbitrary.fp.v4f16.v4i8(
|
|
<4 x i8> %v, metadata !"Float8E4M3")
|
|
ret <4 x half> %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_vec8_fp8_to_half(
|
|
define <8 x half> @good_vec8_fp8_to_half(<8 x i8> %v) {
|
|
%r = call <8 x half> @llvm.convert.from.arbitrary.fp.v8f16.v8i8(
|
|
<8 x i8> %v, metadata !"Float8E5M2")
|
|
ret <8 x half> %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_vec4_fp8_to_float(
|
|
define <4 x float> @good_vec4_fp8_to_float(<4 x i8> %v) {
|
|
%r = call <4 x float> @llvm.convert.from.arbitrary.fp.v4f32.v4i8(
|
|
<4 x i8> %v, metadata !"Float8E4M3B11FNUZ")
|
|
ret <4 x float> %r
|
|
}
|
|
|
|
; Test different rounding modes
|
|
; CHECK-LABEL: @good_rounding_towardzero(
|
|
define i8 @good_rounding_towardzero(half %v) {
|
|
%r = call i8 @llvm.convert.to.arbitrary.fp.i8.f16(
|
|
half %v, metadata !"Float8E4M3", metadata !"round.towardzero", i1 false)
|
|
ret i8 %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_rounding_upward(
|
|
define i8 @good_rounding_upward(half %v) {
|
|
%r = call i8 @llvm.convert.to.arbitrary.fp.i8.f16(
|
|
half %v, metadata !"Float8E4M3", metadata !"round.upward", i1 false)
|
|
ret i8 %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_rounding_downward(
|
|
define i8 @good_rounding_downward(half %v) {
|
|
%r = call i8 @llvm.convert.to.arbitrary.fp.i8.f16(
|
|
half %v, metadata !"Float8E4M3", metadata !"round.downward", i1 false)
|
|
ret i8 %r
|
|
}
|
|
|
|
; Test all supported formats
|
|
; CHECK-LABEL: @good_float8_e5m2_fnuz(
|
|
define i8 @good_float8_e5m2_fnuz(half %v) {
|
|
%r = call i8 @llvm.convert.to.arbitrary.fp.i8.f16(
|
|
half %v, metadata !"Float8E5M2FNUZ", metadata !"round.tonearest", i1 false)
|
|
ret i8 %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_float8_e3m4(
|
|
define i8 @good_float8_e3m4(half %v) {
|
|
%r = call i8 @llvm.convert.to.arbitrary.fp.i8.f16(
|
|
half %v, metadata !"Float8E3M4", metadata !"round.tonearest", i1 false)
|
|
ret i8 %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_float8_e8m0fnu(
|
|
define i8 @good_float8_e8m0fnu(half %v) {
|
|
%r = call i8 @llvm.convert.to.arbitrary.fp.i8.f16(
|
|
half %v, metadata !"Float8E8M0FNU", metadata !"round.tonearest", i1 false)
|
|
ret i8 %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_float6_e3m2fn(
|
|
define i6 @good_float6_e3m2fn(half %v) {
|
|
%r = call i6 @llvm.convert.to.arbitrary.fp.i6.f16(
|
|
half %v, metadata !"Float6E3M2FN", metadata !"round.tonearest", i1 false)
|
|
ret i6 %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_float6_e2m3fn(
|
|
define i6 @good_float6_e2m3fn(half %v) {
|
|
%r = call i6 @llvm.convert.to.arbitrary.fp.i6.f16(
|
|
half %v, metadata !"Float6E2M3FN", metadata !"round.tonearest", i1 false)
|
|
ret i6 %r
|
|
}
|
|
|
|
; CHECK-LABEL: @good_float4_e2m1fn(
|
|
define i4 @good_float4_e2m1fn(half %v) {
|
|
%r = call i4 @llvm.convert.to.arbitrary.fp.i4.f16(
|
|
half %v, metadata !"Float4E2M1FN", metadata !"round.tonearest", i1 false)
|
|
ret i4 %r
|
|
}
|
|
|
|
declare i6 @llvm.convert.to.arbitrary.fp.i6.f16(half, metadata, metadata, i1)
|
|
declare i4 @llvm.convert.to.arbitrary.fp.i4.f16(half, metadata, metadata, i1)
|