#pragma once #include #include namespace ircolib { static inline auto roundCeil(float f) { #ifdef SIMD_SUPPORT __m128 t = _mm_set_ss(f); t = _mm_round_ss(t, t, _MM_FROUND_TO_POS_INF); return _mm_cvtss_f32(t); #else return ceilf(f); #endif } static inline auto roundCeil(double f) { #ifdef SIMD_SUPPORT __m128d t = _mm_set_sd(f); t = _mm_round_sd(t, t, _MM_FROUND_TO_POS_INF); return _mm_cvtsd_f64(t); #else return ceil(f); #endif } static inline auto roundNearest(float f) { #ifdef SIMD_SUPPORT __m128 t = _mm_set_ss(f); t = _mm_round_ss(t, t, _MM_FROUND_TO_NEAREST_INT); return _mm_cvtss_f32(t); #else return roundf(f); #endif } static inline auto roundNearest(double f) { #ifdef SIMD_SUPPORT __m128d t = _mm_set_sd(f); t = _mm_round_sd(t, t, _MM_FROUND_TO_NEAREST_INT); return _mm_cvtsd_f64(t); #else return round(f); #endif } static inline auto roundCurrent(float f) { #ifdef SIMD_SUPPORT auto t = _mm_set_ss(f); t = _mm_round_ss(t, t, _MM_FROUND_CUR_DIRECTION); return _mm_cvtss_f32(t); #else return rint(f); #endif } static inline auto roundCurrent(double f) { #ifdef SIMD_SUPPORT auto t = _mm_set_sd(f); t = _mm_round_sd(t, t, _MM_FROUND_CUR_DIRECTION); return _mm_cvtsd_f64(t); #else return rint(f); #endif } static inline auto roundFloor(float f) { #ifdef SIMD_SUPPORT __m128 t = _mm_set_ss(f); t = _mm_round_ss(t, t, _MM_FROUND_TO_NEG_INF); return _mm_cvtss_f32(t); #else return floor(f); #endif } static inline auto roundFloor(double f) { #ifdef SIMD_SUPPORT __m128d t = _mm_set_sd(f); t = _mm_round_sd(t, t, _MM_FROUND_TO_NEG_INF); return _mm_cvtsd_f64(t); #else return floor(f); #endif } static inline auto roundTrunc(float f) { #ifdef SIMD_SUPPORT __m128 t = _mm_set_ss(f); t = _mm_round_ss(t, t, _MM_FROUND_TO_ZERO); return _mm_cvtss_f32(t); #else return trunc(f); #endif } static inline auto roundTrunc(double f) { #ifdef SIMD_SUPPORT __m128d t = _mm_set_sd(f); t = _mm_round_sd(t, t, _MM_FROUND_TO_ZERO); return _mm_cvtsd_f64(t); #else return trunc(f); #endif } } // namespace Util