Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "arm_math.h"
00034
00058 void arm_shift_q15(
00059 q15_t * pSrc,
00060 int8_t shiftBits,
00061 q15_t * pDst,
00062 uint32_t blockSize)
00063 {
00064 uint32_t blkCnt;
00065 uint8_t sign;
00066
00067 #ifndef ARM_MATH_CM0
00068
00069
00070
00071 q15_t in1, in2;
00072
00073
00074
00075 blkCnt = blockSize >> 2u;
00076
00077
00078 sign = (shiftBits & 0x80);
00079
00080
00081 if(sign == 0u)
00082 {
00083
00084
00085 while(blkCnt > 0u)
00086 {
00087
00088 in1 = *pSrc++;
00089 in2 = *pSrc++;
00090
00091
00092 #ifndef ARM_MATH_BIG_ENDIAN
00093
00094 *__SIMD32(pDst)++ = __PKHBT(__SSAT((in1 << shiftBits), 16),
00095 __SSAT((in2 << shiftBits), 16), 16);
00096
00097 #else
00098
00099 *__SIMD32(pDst)++ = __PKHBT(__SSAT((in2 << shiftBits), 16),
00100 __SSAT((in1 << shiftBits), 16), 16);
00101
00102 #endif
00103
00104 in1 = *pSrc++;
00105 in2 = *pSrc++;
00106
00107 #ifndef ARM_MATH_BIG_ENDIAN
00108
00109 *__SIMD32(pDst)++ = __PKHBT(__SSAT((in1 << shiftBits), 16),
00110 __SSAT((in2 << shiftBits), 16), 16);
00111
00112 #else
00113
00114 *__SIMD32(pDst)++ = __PKHBT(__SSAT((in2 << shiftBits), 16),
00115 __SSAT((in1 << shiftBits), 16), 16);
00116
00117 #endif
00118
00119
00120 blkCnt--;
00121 }
00122
00123
00124
00125 blkCnt = blockSize % 0x4u;
00126
00127 while(blkCnt > 0u)
00128 {
00129
00130
00131 *pDst++ = __SSAT((*pSrc++ << shiftBits), 16);
00132
00133
00134 blkCnt--;
00135 }
00136 }
00137 else
00138 {
00139
00140
00141 while(blkCnt > 0u)
00142 {
00143
00144 in1 = *pSrc++;
00145 in2 = *pSrc++;
00146
00147
00148 #ifndef ARM_MATH_BIG_ENDIAN
00149
00150 *__SIMD32(pDst)++ = __PKHBT((in1 >> -shiftBits),
00151 (in2 >> -shiftBits), 16);
00152
00153 #else
00154
00155 *__SIMD32(pDst)++ = __PKHBT((in2 >> -shiftBits),
00156 (in1 >> -shiftBits), 16);
00157
00158 #endif
00159
00160 in1 = *pSrc++;
00161 in2 = *pSrc++;
00162
00163 #ifndef ARM_MATH_BIG_ENDIAN
00164
00165 *__SIMD32(pDst)++ = __PKHBT((in1 >> -shiftBits),
00166 (in2 >> -shiftBits), 16);
00167
00168 #else
00169
00170 *__SIMD32(pDst)++ = __PKHBT((in2 >> -shiftBits),
00171 (in1 >> -shiftBits), 16);
00172
00173 #endif
00174
00175
00176 blkCnt--;
00177 }
00178
00179
00180
00181 blkCnt = blockSize % 0x4u;
00182
00183 while(blkCnt > 0u)
00184 {
00185
00186
00187 *pDst++ = (*pSrc++ >> -shiftBits);
00188
00189
00190 blkCnt--;
00191 }
00192 }
00193
00194 #else
00195
00196
00197
00198
00199 sign = (shiftBits & 0x80);
00200
00201
00202 if(sign == 0u)
00203 {
00204
00205 blkCnt = blockSize;
00206
00207 while(blkCnt > 0u)
00208 {
00209
00210
00211 *pDst++ = __SSAT(((q31_t) * pSrc++ << shiftBits), 16);
00212
00213
00214 blkCnt--;
00215 }
00216 }
00217 else
00218 {
00219
00220 blkCnt = blockSize;
00221
00222 while(blkCnt > 0u)
00223 {
00224
00225
00226 *pDst++ = (*pSrc++ >> -shiftBits);
00227
00228
00229 blkCnt--;
00230 }
00231 }
00232
00233 #endif
00234
00235 }
00236