arm_math_memory.h 5.4 KB

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