| #include "edge-impulse-sdk/dsp/config.hpp" |
| #if EIDSP_LOAD_CMSIS_DSP_SOURCES |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include "edge-impulse-sdk/CMSIS/DSP/Include/dsp/matrix_functions.h" |
|
|
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) |
|
|
| arm_status arm_mat_add_q15( |
| const arm_matrix_instance_q15 * pSrcA, |
| const arm_matrix_instance_q15 * pSrcB, |
| arm_matrix_instance_q15 * pDst) |
| { |
| uint32_t numSamples; |
| q15_t *pDataA, *pDataB, *pDataDst; |
| q15x8_t vecA, vecB, vecDst = { 0 }; |
| q15_t const *pSrcAVec; |
| q15_t const *pSrcBVec; |
| uint32_t blkCnt; |
| arm_status status; |
|
|
| pDataA = pSrcA->pData; |
| pDataB = pSrcB->pData; |
| pDataDst = pDst->pData; |
| pSrcAVec = (q15_t const *) pDataA; |
| pSrcBVec = (q15_t const *) pDataB; |
|
|
| #ifdef ARM_MATH_MATRIX_CHECK |
|
|
| |
| if ((pSrcA->numRows != pSrcB->numRows) || |
| (pSrcA->numCols != pSrcB->numCols) || |
| (pSrcA->numRows != pDst->numRows) || |
| (pSrcA->numCols != pDst->numCols) ) |
| { |
| |
| status = ARM_MATH_SIZE_MISMATCH; |
| } |
| else |
|
|
| #endif |
|
|
| { |
|
|
| |
| |
| |
| numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; |
| blkCnt = numSamples >> 3; |
| while (blkCnt > 0U) |
| { |
| |
| |
| vecA = vld1q(pSrcAVec); pSrcAVec += 8; |
| vecB = vld1q(pSrcBVec); pSrcBVec += 8; |
| vecDst = vqaddq(vecA, vecB); |
| vst1q(pDataDst, vecDst); pDataDst += 8; |
| |
| |
| |
| blkCnt--; |
| } |
| |
| |
| |
| |
| blkCnt = numSamples & 7; |
| if (blkCnt > 0U) |
| { |
| mve_pred16_t p0 = vctp16q(blkCnt); |
| vecA = vld1q(pSrcAVec); pSrcAVec += 8; |
| vecB = vld1q(pSrcBVec); pSrcBVec += 8; |
| vecDst = vqaddq_m(vecDst, vecA, vecB, p0); |
| vstrhq_p(pDataDst, vecDst, p0); |
| } |
| |
| status = ARM_MATH_SUCCESS; |
| } |
|
|
| |
| return (status); |
| } |
|
|
| #else |
| arm_status arm_mat_add_q15( |
| const arm_matrix_instance_q15 * pSrcA, |
| const arm_matrix_instance_q15 * pSrcB, |
| arm_matrix_instance_q15 * pDst) |
| { |
| q15_t *pInA = pSrcA->pData; |
| q15_t *pInB = pSrcB->pData; |
| q15_t *pOut = pDst->pData; |
| |
| uint32_t numSamples; |
| uint32_t blkCnt; |
| arm_status status; |
|
|
| #ifdef ARM_MATH_MATRIX_CHECK |
|
|
| |
| if ((pSrcA->numRows != pSrcB->numRows) || |
| (pSrcA->numCols != pSrcB->numCols) || |
| (pSrcA->numRows != pDst->numRows) || |
| (pSrcA->numCols != pDst->numCols) ) |
| { |
| |
| status = ARM_MATH_SIZE_MISMATCH; |
| } |
| else |
|
|
| #endif |
|
|
| { |
| |
| numSamples = (uint32_t) pSrcA->numRows * pSrcA->numCols; |
|
|
| #if defined (ARM_MATH_LOOPUNROLL) |
|
|
| |
| blkCnt = numSamples >> 2U; |
|
|
| while (blkCnt > 0U) |
| { |
| |
|
|
| |
| #if defined (ARM_MATH_DSP) |
| write_q15x2_ia (&pOut, __QADD16(read_q15x2_ia (&pInA), read_q15x2_ia (&pInB))); |
|
|
| write_q15x2_ia (&pOut, __QADD16(read_q15x2_ia (&pInA), read_q15x2_ia (&pInB))); |
| #else |
| *pOut++ = (q15_t) __SSAT(((q31_t) *pInA++ + *pInB++), 16); |
|
|
| *pOut++ = (q15_t) __SSAT(((q31_t) *pInA++ + *pInB++), 16); |
|
|
| *pOut++ = (q15_t) __SSAT(((q31_t) *pInA++ + *pInB++), 16); |
|
|
| *pOut++ = (q15_t) __SSAT(((q31_t) *pInA++ + *pInB++), 16); |
| #endif |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| blkCnt = numSamples % 0x4U; |
|
|
| #else |
|
|
| |
| blkCnt = numSamples; |
|
|
| #endif |
|
|
| while (blkCnt > 0U) |
| { |
| |
|
|
| |
| #if defined (ARM_MATH_DSP) |
| *pOut++ = (q15_t) __QADD16(*pInA++, *pInB++); |
| #else |
| *pOut++ = (q15_t) __SSAT(((q31_t) *pInA++ + *pInB++), 16); |
| #endif |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| status = ARM_MATH_SUCCESS; |
| } |
|
|
| |
| return (status); |
| } |
| #endif |
|
|
| |
| |
| |
|
|
| #endif |
|
|