| #![allow(unused_variables)] // "unused" f16 registers |
| #![cfg_attr(f128_enabled, feature(f128))] |
| #![cfg_attr(f16_enabled, feature(f16))] |
| |
| use builtins_test::float_bench; |
| use compiler_builtins::float::extend; |
| use criterion::{Criterion, criterion_main}; |
| |
| #[cfg(f16_enabled)] |
| float_bench! { |
| name: extend_f16_f32, |
| sig: (a: f16) -> f32, |
| crate_fn: extend::__extendhfsf2, |
| sys_fn: __extendhfsf2, |
| sys_available: not(feature = "no-sys-f16"), |
| asm: [ |
| #[cfg(target_arch = "aarch64")] { |
| let ret: f32; |
| asm!( |
| "fcvt {ret:s}, {a:h}", |
| a = in(vreg) a, |
| ret = lateout(vreg) ret, |
| options(nomem, nostack, pure), |
| ); |
| |
| ret |
| }; |
| ], |
| } |
| |
| #[cfg(f16_enabled)] |
| float_bench! { |
| name: extend_f16_f64, |
| sig: (a: f16) -> f64, |
| crate_fn: extend::__extendhfdf2, |
| sys_fn: __extendhfdf2, |
| sys_available: not(feature = "no-sys-f16-f64-convert"), |
| asm: [ |
| #[cfg(target_arch = "aarch64")] { |
| let ret: f64; |
| asm!( |
| "fcvt {ret:d}, {a:h}", |
| a = in(vreg) a, |
| ret = lateout(vreg) ret, |
| options(nomem, nostack, pure), |
| ); |
| |
| ret |
| }; |
| ], |
| } |
| |
| #[cfg(all(f16_enabled, f128_enabled))] |
| float_bench! { |
| name: extend_f16_f128, |
| sig: (a: f16) -> f128, |
| crate_fn: extend::__extendhftf2, |
| crate_fn_ppc: extend::__extendhfkf2, |
| sys_fn: __extendhftf2, |
| sys_fn_ppc: __extendhfkf2, |
| sys_available: not(feature = "no-sys-f16-f128-convert"), |
| asm: [], |
| } |
| |
| float_bench! { |
| name: extend_f32_f64, |
| sig: (a: f32) -> f64, |
| crate_fn: extend::__extendsfdf2, |
| sys_fn: __extendsfdf2, |
| sys_available: all(), |
| asm: [ |
| #[cfg(target_arch = "aarch64")] { |
| let ret: f64; |
| asm!( |
| "fcvt {ret:d}, {a:s}", |
| a = in(vreg) a, |
| ret = lateout(vreg) ret, |
| options(nomem, nostack, pure), |
| ); |
| |
| ret |
| }; |
| ], |
| } |
| |
| #[cfg(f128_enabled)] |
| float_bench! { |
| name: extend_f32_f128, |
| sig: (a: f32) -> f128, |
| crate_fn: extend::__extendsftf2, |
| crate_fn_ppc: extend::__extendsfkf2, |
| sys_fn: __extendsftf2, |
| sys_fn_ppc: __extendsfkf2, |
| sys_available: not(feature = "no-sys-f128"), |
| asm: [], |
| } |
| |
| #[cfg(f128_enabled)] |
| float_bench! { |
| name: extend_f64_f128, |
| sig: (a: f64) -> f128, |
| crate_fn: extend::__extenddftf2, |
| crate_fn_ppc: extend::__extenddfkf2, |
| sys_fn: __extenddftf2, |
| sys_fn_ppc: __extenddfkf2, |
| sys_available: not(feature = "no-sys-f128"), |
| asm: [], |
| } |
| |
| pub fn float_extend() { |
| let mut criterion = Criterion::default().configure_from_args(); |
| |
| #[cfg(f16_enabled)] |
| { |
| extend_f16_f32(&mut criterion); |
| extend_f16_f64(&mut criterion); |
| |
| #[cfg(f128_enabled)] |
| extend_f16_f128(&mut criterion); |
| } |
| |
| extend_f32_f64(&mut criterion); |
| |
| #[cfg(f128_enabled)] |
| { |
| extend_f32_f128(&mut criterion); |
| extend_f64_f128(&mut criterion); |
| } |
| } |
| |
| criterion_main!(float_extend); |