| //@ compile-flags: -Copt-level=3 | |
| //@ revisions: GENERIC LOONGARCH32 LOONGARCH64 RISCV32 RISCV64 | |
| //@ [GENERIC] ignore-loongarch32 | |
| //@ [GENERIC] ignore-loongarch64 | |
| //@ [GENERIC] ignore-riscv32 | |
| //@ [GENERIC] ignore-riscv64 | |
| //@ [LOONGARCH32] only-loongarch32 | |
| //@ [LOONGARCH64] only-loongarch64 | |
| //@ [RISCV32] only-riscv32 | |
| //@ [RISCV64] only-riscv64 | |
| #![crate_type = "lib"] | |
| #![feature(f16b)] | |
| #![allow(improper_ctypes_definitions)] | |
| extern crate core; | |
| use core::num::f16b; | |
| // GENERIC-LABEL: define{{.*}} bfloat @identity_f16b(bfloat | |
| // LOONGARCH32-LABEL: define{{.*}} half @identity_f16b(half | |
| // LOONGARCH64-LABEL: define{{.*}} half @identity_f16b(half | |
| // RISCV32-LABEL: define{{.*}} half @identity_f16b(half | |
| // RISCV64-LABEL: define{{.*}} half @identity_f16b(half | |
| #[no_mangle] | |
| pub extern "C" fn identity_f16b(value: f16b) -> f16b { | |
| // GENERIC: ret bfloat | |
| // LOONGARCH32: ret half | |
| // LOONGARCH64: ret half | |
| // RISCV32: ret half | |
| // RISCV64: ret half | |
| value | |
| } | |
| // GENERIC-LABEL: define{{.*}} i16 @f16b_to_bits(bfloat | |
| // LOONGARCH32-LABEL: define{{.*}} i16 @f16b_to_bits(half | |
| // LOONGARCH64-LABEL: define{{.*}} i16 @f16b_to_bits(half | |
| // RISCV32-LABEL: define{{.*}} i16 @f16b_to_bits(half | |
| // RISCV64-LABEL: define{{.*}} i16 @f16b_to_bits(half | |
| #[no_mangle] | |
| pub extern "C" fn f16b_to_bits(value: f16b) -> u16 { | |
| // GENERIC: bitcast bfloat %value to i16 | |
| // LOONGARCH32: bitcast half %0 to i16 | |
| // LOONGARCH64: bitcast half %0 to i16 | |
| // RISCV32: bitcast half %0 to i16 | |
| // RISCV64: bitcast half %0 to i16 | |
| value.to_bits() | |
| } | |
| // GENERIC-LABEL: define{{.*}} bfloat @f16b_from_bits(i16 | |
| // LOONGARCH32-LABEL: define{{.*}} half @f16b_from_bits(i16 | |
| // LOONGARCH64-LABEL: define{{.*}} half @f16b_from_bits(i16 | |
| // RISCV32-LABEL: define{{.*}} half @f16b_from_bits(i16 | |
| // RISCV64-LABEL: define{{.*}} half @f16b_from_bits(i16 | |
| #[no_mangle] | |
| pub extern "C" fn f16b_from_bits(bits: u16) -> f16b { | |
| // GENERIC: bitcast i16 %bits to bfloat | |
| // LOONGARCH32: bitcast i16 %bits to half | |
| // LOONGARCH64: bitcast i16 %bits to half | |
| // RISCV32: bitcast i16 %bits to half | |
| // RISCV64: bitcast i16 %bits to half | |
| f16b::from_bits(bits) | |
| } | |
| // GENERIC-LABEL: define{{.*}} float @widen_f16b(bfloat | |
| // LOONGARCH32-LABEL: define{{.*}} float @widen_f16b(half | |
| // LOONGARCH64-LABEL: define{{.*}} float @widen_f16b(half | |
| // RISCV32-LABEL: define{{.*}} float @widen_f16b(half | |
| // RISCV64-LABEL: define{{.*}} float @widen_f16b(half | |
| #[no_mangle] | |
| pub extern "C" fn widen_f16b(value: f16b) -> f32 { | |
| // GENERIC: bitcast bfloat %value to i16 | |
| // LOONGARCH32: bitcast half %0 to i16 | |
| // LOONGARCH64: bitcast half %0 to i16 | |
| // RISCV32: bitcast half %0 to i16 | |
| // RISCV64: bitcast half %0 to i16 | |
| // CHECK: zext i16 | |
| // CHECK: shl nuw i32 {{.*}}, 16 | |
| // CHECK: bitcast i32 {{.*}} to float | |
| f32::from(value) | |
| } |