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