| #include "edge-impulse-sdk/dsp/config.hpp" |
| #if EIDSP_LOAD_CMSIS_DSP_SOURCES |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/dsp/support_functions_f16.h" |
|
|
| #if defined(ARM_FLOAT16_SUPPORTED) |
|
|
|
|
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) && defined(__CMSIS_GCC_H) |
| #pragma GCC warning "Scalar version of arm_float_to_f16 built. Helium version has build issues with gcc." |
| #endif |
|
|
| #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) && !defined(__CMSIS_GCC_H) |
|
|
| void arm_float_to_f16( |
| const float32_t * pSrc, |
| float16_t * pDst, |
| uint32_t blockSize) |
| { |
| int32_t blkCnt; |
| float32x4x2_t tmp; |
| float16x8_t vecDst; |
| float32_t const *pSrcVec; |
|
|
|
|
| pSrcVec = (float32_t const *) pSrc; |
| blkCnt = blockSize >> 3; |
| while (blkCnt > 0) |
| { |
| |
| tmp = vld2q(pSrcVec); pSrcVec += 8; |
| |
| vecDst = vcvtbq_f16_f32(vecDst, tmp.val[0]); |
| vecDst = vcvttq_f16_f32(vecDst, tmp.val[1]); |
| vst1q(pDst, vecDst); pDst += 8; |
| |
| |
| |
| blkCnt--; |
| } |
|
|
| |
| |
| |
| blkCnt = blockSize & 7; |
| if (blkCnt > 0) |
| { |
| mve_pred16_t p0 = vctp16q(blkCnt); |
| tmp = vld2q(pSrcVec); |
| vecDst = vcvtbq_f16_f32(vecDst, tmp.val[0]); |
| vecDst = vcvttq_f16_f32(vecDst, tmp.val[1]); |
| vstrhq_p(pDst, vecDst, p0); |
| } |
| } |
|
|
| #else |
|
|
| void arm_float_to_f16( |
| const float32_t * pSrc, |
| float16_t * pDst, |
| uint32_t blockSize) |
| { |
| const float32_t *pIn = pSrc; |
| uint32_t blkCnt; |
|
|
| |
| |
| |
| blkCnt = blockSize; |
|
|
| while (blkCnt > 0U) |
| { |
|
|
| *pDst++ = (float16_t) * pIn++; |
| |
| |
| |
| blkCnt--; |
| } |
| } |
| #endif |
|
|
| |
| |
| |
|
|
| #endif |
|
|
|
|
| #endif |
|
|