diff options
Diffstat (limited to 'src/core/SkHalf.h')
-rw-r--r-- | src/core/SkHalf.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/core/SkHalf.h b/src/core/SkHalf.h index dd978a2347..e71cb8750a 100644 --- a/src/core/SkHalf.h +++ b/src/core/SkHalf.h @@ -11,6 +11,10 @@ #include "SkNx.h" #include "SkTypes.h" +#if !defined(_MSC_VER) && SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX2 + #include <x86intrin.h> +#endif + // 16-bit floating point value // format is 1 bit sign, 5 bits exponent, 10 bits mantissa // only used for storage @@ -85,4 +89,29 @@ static inline Sk4h SkFloatToHalf_finite_ftz(const Sk4f& fs) { #endif } +static inline Sk8f SkHalfToFloat_finite_ftz(const Sk8h& hs) { +#if !defined(SKNX_NO_SIMD) && SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX2 + return _mm256_cvtph_ps(hs.fVec); + +#else + uint64_t parts[2]; + hs.store(parts); + return SkNx_join(SkHalfToFloat_finite_ftz(parts[0]), + SkHalfToFloat_finite_ftz(parts[1])); + +#endif +} + +static inline Sk8h SkFloatToHalf_finite_ftz(const Sk8f& fs) { +#if !defined(SKNX_NO_SIMD) && SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX2 + return _mm256_cvtps_ph(fs.fVec, _MM_FROUND_CUR_DIRECTION); + +#else + uint64_t parts[2]; + SkFloatToHalf_finite_ftz(fs.fLo).store(parts+0); + SkFloatToHalf_finite_ftz(fs.fHi).store(parts+1); + return Sk8h::Load(parts); +#endif +} + #endif |