| #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_q31( |
| const arm_matrix_instance_q31 * pSrcA, |
| const arm_matrix_instance_q31 * pSrcB, |
| arm_matrix_instance_q31 * pDst) |
| { |
| arm_status status; |
| uint32_t numSamples; |
| q31_t *pDataA, *pDataB, *pDataDst; |
| q31x4_t vecA, vecB, vecDst = { 0 }; |
| q31_t const *pSrcAVec; |
| q31_t const *pSrcBVec; |
| uint32_t blkCnt; |
|
|
| pDataA = pSrcA->pData; |
| pDataB = pSrcB->pData; |
| pDataDst = pDst->pData; |
| pSrcAVec = (q31_t const *) pDataA; |
| pSrcBVec = (q31_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 >> 2; |
| while (blkCnt > 0U) |
| { |
| |
| |
| vecA = vld1q(pSrcAVec); |
| pSrcAVec += 4; |
| vecB = vld1q(pSrcBVec); |
| pSrcBVec += 4; |
| vecDst = vqaddq(vecA, vecB); |
| vst1q(pDataDst, vecDst); |
| pDataDst += 4; |
| |
| |
| |
| blkCnt--; |
| } |
| |
| |
| |
| blkCnt = numSamples & 3; |
| if (blkCnt > 0U) |
| { |
| mve_pred16_t p0 = vctp32q(blkCnt); |
| vecA = vld1q(pSrcAVec); |
| pSrcAVec += 4; |
| vecB = vld1q(pSrcBVec); |
| pSrcBVec += 4; |
| vecDst = vqaddq_m(vecDst, vecA, vecB, p0); |
| vstrwq_p(pDataDst, vecDst, p0); |
| } |
| status = ARM_MATH_SUCCESS; |
| } |
|
|
| |
| return (status); |
| } |
|
|
| #else |
| arm_status arm_mat_add_q31( |
| const arm_matrix_instance_q31 * pSrcA, |
| const arm_matrix_instance_q31 * pSrcB, |
| arm_matrix_instance_q31 * pDst) |
| { |
| q31_t *pInA = pSrcA->pData; |
| q31_t *pInB = pSrcB->pData; |
| q31_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) |
| { |
| |
|
|
| |
| *pOut++ = __QADD(*pInA++, *pInB++); |
|
|
| *pOut++ = __QADD(*pInA++, *pInB++); |
|
|
| *pOut++ = __QADD(*pInA++, *pInB++); |
|
|
| *pOut++ = __QADD(*pInA++, *pInB++); |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| blkCnt = numSamples % 0x4U; |
|
|
| #else |
|
|
| |
| blkCnt = numSamples; |
|
|
| #endif |
|
|
| while (blkCnt > 0U) |
| { |
| |
|
|
| |
| *pOut++ = __QADD(*pInA++, *pInB++); |
|
|
| |
| blkCnt--; |
| } |
|
|
| |
| status = ARM_MATH_SUCCESS; |
| } |
|
|
| |
| return (status); |
| } |
| #endif |
|
|
| |
| |
| |
|
|
| #endif |
|
|