arm_math_memory.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /******************************************************************************
  2. * @file arm_math_memory.h
  3. * @brief Public header file for CMSIS DSP Library
  4. * @version V1.9.0
  5. * @date 23 April 2021
  6. * Target Processor: Cortex-M and Cortex-A cores
  7. ******************************************************************************/
  8. /*
  9. * Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved.
  10. *
  11. * SPDX-License-Identifier: Apache-2.0
  12. *
  13. * Licensed under the Apache License, Version 2.0 (the License); you may
  14. * not use this file except in compliance with the License.
  15. * You may obtain a copy of the License at
  16. *
  17. * www.apache.org/licenses/LICENSE-2.0
  18. *
  19. * Unless required by applicable law or agreed to in writing, software
  20. * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  21. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  22. * See the License for the specific language governing permissions and
  23. * limitations under the License.
  24. */
  25. #ifndef _ARM_MATH_MEMORY_H_
  26. #define _ARM_MATH_MEMORY_H_
  27. #include "arm_math_types.h"
  28. #ifdef __cplusplus
  29. extern "C"
  30. {
  31. #endif
  32. /**
  33. @brief definition to read/write two 16 bit values.
  34. @deprecated
  35. */
  36. #if defined ( __CC_ARM )
  37. #define __SIMD32_TYPE int32_t __packed
  38. #elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 )
  39. #define __SIMD32_TYPE int32_t
  40. #elif defined ( __GNUC__ )
  41. #define __SIMD32_TYPE int32_t
  42. #elif defined ( __ICCARM__ )
  43. #define __SIMD32_TYPE int32_t __packed
  44. #elif defined ( __TI_ARM__ )
  45. #define __SIMD32_TYPE int32_t
  46. #elif defined ( __CSMC__ )
  47. #define __SIMD32_TYPE int32_t
  48. #elif defined ( __TASKING__ )
  49. #define __SIMD32_TYPE __un(aligned) int32_t
  50. #elif defined(_MSC_VER )
  51. #define __SIMD32_TYPE int32_t
  52. #else
  53. #error Unknown compiler
  54. #endif
  55. #define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr))
  56. #define __SIMD32_CONST(addr) ( (__SIMD32_TYPE * ) (addr))
  57. #define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE * ) (addr))
  58. #define __SIMD64(addr) (*( int64_t **) & (addr))
  59. /* SIMD replacement */
  60. /**
  61. @brief Read 2 Q15 from Q15 pointer.
  62. @param[in] pQ15 points to input value
  63. @return Q31 value
  64. */
  65. __STATIC_FORCEINLINE q31_t read_q15x2 (
  66. q15_t * pQ15)
  67. {
  68. q31_t val;
  69. #ifdef __ARM_FEATURE_UNALIGNED
  70. memcpy (&val, pQ15, 4);
  71. #else
  72. val = (pQ15[1] << 16) | (pQ15[0] & 0x0FFFF) ;
  73. #endif
  74. return (val);
  75. }
  76. /**
  77. @brief Read 2 Q15 from Q15 pointer and increment pointer afterwards.
  78. @param[in] pQ15 points to input value
  79. @return Q31 value
  80. */
  81. __STATIC_FORCEINLINE q31_t read_q15x2_ia (
  82. q15_t ** pQ15)
  83. {
  84. q31_t val;
  85. #ifdef __ARM_FEATURE_UNALIGNED
  86. memcpy (&val, *pQ15, 4);
  87. #else
  88. val = ((*pQ15)[1] << 16) | ((*pQ15)[0] & 0x0FFFF);
  89. #endif
  90. *pQ15 += 2;
  91. return (val);
  92. }
  93. /**
  94. @brief Read 2 Q15 from Q15 pointer and decrement pointer afterwards.
  95. @param[in] pQ15 points to input value
  96. @return Q31 value
  97. */
  98. __STATIC_FORCEINLINE q31_t read_q15x2_da (
  99. q15_t ** pQ15)
  100. {
  101. q31_t val;
  102. #ifdef __ARM_FEATURE_UNALIGNED
  103. memcpy (&val, *pQ15, 4);
  104. #else
  105. val = ((*pQ15)[1] << 16) | ((*pQ15)[0] & 0x0FFFF);
  106. #endif
  107. *pQ15 -= 2;
  108. return (val);
  109. }
  110. /**
  111. @brief Write 2 Q15 to Q15 pointer and increment pointer afterwards.
  112. @param[in] pQ15 points to input value
  113. @param[in] value Q31 value
  114. @return none
  115. */
  116. __STATIC_FORCEINLINE void write_q15x2_ia (
  117. q15_t ** pQ15,
  118. q31_t value)
  119. {
  120. q31_t val = value;
  121. #ifdef __ARM_FEATURE_UNALIGNED
  122. memcpy (*pQ15, &val, 4);
  123. #else
  124. (*pQ15)[0] = (val & 0x0FFFF);
  125. (*pQ15)[1] = (val >> 16) & 0x0FFFF;
  126. #endif
  127. *pQ15 += 2;
  128. }
  129. /**
  130. @brief Write 2 Q15 to Q15 pointer.
  131. @param[in] pQ15 points to input value
  132. @param[in] value Q31 value
  133. @return none
  134. */
  135. __STATIC_FORCEINLINE void write_q15x2 (
  136. q15_t * pQ15,
  137. q31_t value)
  138. {
  139. q31_t val = value;
  140. #ifdef __ARM_FEATURE_UNALIGNED
  141. memcpy (pQ15, &val, 4);
  142. #else
  143. pQ15[0] = val & 0x0FFFF;
  144. pQ15[1] = val >> 16;
  145. #endif
  146. }
  147. /**
  148. @brief Read 4 Q7 from Q7 pointer and increment pointer afterwards.
  149. @param[in] pQ7 points to input value
  150. @return Q31 value
  151. */
  152. __STATIC_FORCEINLINE q31_t read_q7x4_ia (
  153. q7_t ** pQ7)
  154. {
  155. q31_t val;
  156. #ifdef __ARM_FEATURE_UNALIGNED
  157. memcpy (&val, *pQ7, 4);
  158. #else
  159. val =(((*pQ7)[3] & 0x0FF) << 24) | (((*pQ7)[2] & 0x0FF) << 16) | (((*pQ7)[1] & 0x0FF) << 8) | ((*pQ7)[0] & 0x0FF);
  160. #endif
  161. *pQ7 += 4;
  162. return (val);
  163. }
  164. /**
  165. @brief Read 4 Q7 from Q7 pointer and decrement pointer afterwards.
  166. @param[in] pQ7 points to input value
  167. @return Q31 value
  168. */
  169. __STATIC_FORCEINLINE q31_t read_q7x4_da (
  170. q7_t ** pQ7)
  171. {
  172. q31_t val;
  173. #ifdef __ARM_FEATURE_UNALIGNED
  174. memcpy (&val, *pQ7, 4);
  175. #else
  176. val = ((((*pQ7)[3]) & 0x0FF) << 24) | ((((*pQ7)[2]) & 0x0FF) << 16) | ((((*pQ7)[1]) & 0x0FF) << 8) | ((*pQ7)[0] & 0x0FF);
  177. #endif
  178. *pQ7 -= 4;
  179. return (val);
  180. }
  181. /**
  182. @brief Write 4 Q7 to Q7 pointer and increment pointer afterwards.
  183. @param[in] pQ7 points to input value
  184. @param[in] value Q31 value
  185. @return none
  186. */
  187. __STATIC_FORCEINLINE void write_q7x4_ia (
  188. q7_t ** pQ7,
  189. q31_t value)
  190. {
  191. q31_t val = value;
  192. #ifdef __ARM_FEATURE_UNALIGNED
  193. memcpy (*pQ7, &val, 4);
  194. #else
  195. (*pQ7)[0] = val & 0x0FF;
  196. (*pQ7)[1] = (val >> 8) & 0x0FF;
  197. (*pQ7)[2] = (val >> 16) & 0x0FF;
  198. (*pQ7)[3] = (val >> 24) & 0x0FF;
  199. #endif
  200. *pQ7 += 4;
  201. }
  202. #ifdef __cplusplus
  203. }
  204. #endif
  205. #endif /*ifndef _ARM_MATH_MEMORY_H_ */