You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

773 lines
22KB

  1. /* ARM Non-NEON ACLE intrinsics include file.
  2. Copyright (C) 2013-2020 Free Software Foundation, Inc.
  3. Contributed by ARM Ltd.
  4. This file is part of GCC.
  5. GCC is free software; you can redistribute it and/or modify it
  6. under the terms of the GNU General Public License as published
  7. by the Free Software Foundation; either version 3, or (at your
  8. option) any later version.
  9. GCC is distributed in the hope that it will be useful, but WITHOUT
  10. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
  12. License for more details.
  13. Under Section 7 of GPL version 3, you are granted additional
  14. permissions described in the GCC Runtime Library Exception, version
  15. 3.1, as published by the Free Software Foundation.
  16. You should have received a copy of the GNU General Public License and
  17. a copy of the GCC Runtime Library Exception along with this program;
  18. see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
  19. <http://www.gnu.org/licenses/>. */
  20. #ifndef _GCC_ARM_ACLE_H
  21. #define _GCC_ARM_ACLE_H
  22. #include <stdint.h>
  23. #ifdef __cplusplus
  24. extern "C" {
  25. #endif
  26. #if (!__thumb__ || __thumb2__) && __ARM_ARCH >= 4
  27. __extension__ static __inline void __attribute__ ((__always_inline__))
  28. __arm_cdp (const unsigned int __coproc, const unsigned int __opc1,
  29. const unsigned int __CRd, const unsigned int __CRn,
  30. const unsigned int __CRm, const unsigned int __opc2)
  31. {
  32. __builtin_arm_cdp (__coproc, __opc1, __CRd, __CRn, __CRm, __opc2);
  33. }
  34. __extension__ static __inline void __attribute__ ((__always_inline__))
  35. __arm_ldc (const unsigned int __coproc, const unsigned int __CRd,
  36. const void * __p)
  37. {
  38. __builtin_arm_ldc (__coproc, __CRd, __p);
  39. }
  40. __extension__ static __inline void __attribute__ ((__always_inline__))
  41. __arm_ldcl (const unsigned int __coproc, const unsigned int __CRd,
  42. const void * __p)
  43. {
  44. __builtin_arm_ldcl (__coproc, __CRd, __p);
  45. }
  46. __extension__ static __inline void __attribute__ ((__always_inline__))
  47. __arm_stc (const unsigned int __coproc, const unsigned int __CRd,
  48. void * __p)
  49. {
  50. __builtin_arm_stc (__coproc, __CRd, __p);
  51. }
  52. __extension__ static __inline void __attribute__ ((__always_inline__))
  53. __arm_stcl (const unsigned int __coproc, const unsigned int __CRd,
  54. void * __p)
  55. {
  56. __builtin_arm_stcl (__coproc, __CRd, __p);
  57. }
  58. __extension__ static __inline void __attribute__ ((__always_inline__))
  59. __arm_mcr (const unsigned int __coproc, const unsigned int __opc1,
  60. uint32_t __value, const unsigned int __CRn, const unsigned int __CRm,
  61. const unsigned int __opc2)
  62. {
  63. __builtin_arm_mcr (__coproc, __opc1, __value, __CRn, __CRm, __opc2);
  64. }
  65. __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
  66. __arm_mrc (const unsigned int __coproc, const unsigned int __opc1,
  67. const unsigned int __CRn, const unsigned int __CRm,
  68. const unsigned int __opc2)
  69. {
  70. return __builtin_arm_mrc (__coproc, __opc1, __CRn, __CRm, __opc2);
  71. }
  72. #if __ARM_ARCH >= 5
  73. __extension__ static __inline void __attribute__ ((__always_inline__))
  74. __arm_cdp2 (const unsigned int __coproc, const unsigned int __opc1,
  75. const unsigned int __CRd, const unsigned int __CRn,
  76. const unsigned int __CRm, const unsigned int __opc2)
  77. {
  78. __builtin_arm_cdp2 (__coproc, __opc1, __CRd, __CRn, __CRm, __opc2);
  79. }
  80. __extension__ static __inline void __attribute__ ((__always_inline__))
  81. __arm_ldc2 (const unsigned int __coproc, const unsigned int __CRd,
  82. const void * __p)
  83. {
  84. __builtin_arm_ldc2 (__coproc, __CRd, __p);
  85. }
  86. __extension__ static __inline void __attribute__ ((__always_inline__))
  87. __arm_ldc2l (const unsigned int __coproc, const unsigned int __CRd,
  88. const void * __p)
  89. {
  90. __builtin_arm_ldc2l (__coproc, __CRd, __p);
  91. }
  92. __extension__ static __inline void __attribute__ ((__always_inline__))
  93. __arm_stc2 (const unsigned int __coproc, const unsigned int __CRd,
  94. void * __p)
  95. {
  96. __builtin_arm_stc2 (__coproc, __CRd, __p);
  97. }
  98. __extension__ static __inline void __attribute__ ((__always_inline__))
  99. __arm_stc2l (const unsigned int __coproc, const unsigned int __CRd,
  100. void * __p)
  101. {
  102. __builtin_arm_stc2l (__coproc, __CRd, __p);
  103. }
  104. __extension__ static __inline void __attribute__ ((__always_inline__))
  105. __arm_mcr2 (const unsigned int __coproc, const unsigned int __opc1,
  106. uint32_t __value, const unsigned int __CRn,
  107. const unsigned int __CRm, const unsigned int __opc2)
  108. {
  109. __builtin_arm_mcr2 (__coproc, __opc1, __value, __CRn, __CRm, __opc2);
  110. }
  111. __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
  112. __arm_mrc2 (const unsigned int __coproc, const unsigned int __opc1,
  113. const unsigned int __CRn, const unsigned int __CRm,
  114. const unsigned int __opc2)
  115. {
  116. return __builtin_arm_mrc2 (__coproc, __opc1, __CRn, __CRm, __opc2);
  117. }
  118. #if __ARM_ARCH >= 6 || defined (__ARM_ARCH_5TE__)
  119. __extension__ static __inline void __attribute__ ((__always_inline__))
  120. __arm_mcrr (const unsigned int __coproc, const unsigned int __opc1,
  121. uint64_t __value, const unsigned int __CRm)
  122. {
  123. __builtin_arm_mcrr (__coproc, __opc1, __value, __CRm);
  124. }
  125. __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
  126. __arm_mrrc (const unsigned int __coproc, const unsigned int __opc1,
  127. const unsigned int __CRm)
  128. {
  129. return __builtin_arm_mrrc (__coproc, __opc1, __CRm);
  130. }
  131. #if __ARM_ARCH >= 6
  132. __extension__ static __inline void __attribute__ ((__always_inline__))
  133. __arm_mcrr2 (const unsigned int __coproc, const unsigned int __opc1,
  134. uint64_t __value, const unsigned int __CRm)
  135. {
  136. __builtin_arm_mcrr2 (__coproc, __opc1, __value, __CRm);
  137. }
  138. __extension__ static __inline uint64_t __attribute__ ((__always_inline__))
  139. __arm_mrrc2 (const unsigned int __coproc, const unsigned int __opc1,
  140. const unsigned int __CRm)
  141. {
  142. return __builtin_arm_mrrc2 (__coproc, __opc1, __CRm);
  143. }
  144. #endif /* __ARM_ARCH >= 6. */
  145. #endif /* __ARM_ARCH >= 6 || defined (__ARM_ARCH_5TE__). */
  146. #endif /* __ARM_ARCH >= 5. */
  147. #endif /* (!__thumb__ || __thumb2__) && __ARM_ARCH >= 4. */
  148. #ifdef __ARM_FEATURE_SIMD32
  149. typedef int32_t int16x2_t;
  150. typedef uint32_t uint16x2_t;
  151. typedef int32_t int8x4_t;
  152. typedef uint32_t uint8x4_t;
  153. __extension__ extern __inline int16x2_t
  154. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  155. __sxtab16 (int16x2_t __a, int8x4_t __b)
  156. {
  157. return __builtin_arm_sxtab16 (__a, __b);
  158. }
  159. __extension__ extern __inline int16x2_t
  160. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  161. __sxtb16 (int8x4_t __a)
  162. {
  163. return __builtin_arm_sxtb16 (__a);
  164. }
  165. __extension__ extern __inline uint16x2_t
  166. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  167. __uxtab16 (uint16x2_t __a, uint8x4_t __b)
  168. {
  169. return __builtin_arm_uxtab16 (__a, __b);
  170. }
  171. __extension__ extern __inline uint16x2_t
  172. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  173. __uxtb16 (uint8x4_t __a)
  174. {
  175. return __builtin_arm_uxtb16 (__a);
  176. }
  177. __extension__ extern __inline int8x4_t
  178. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  179. __qadd8 (int8x4_t __a, int8x4_t __b)
  180. {
  181. return __builtin_arm_qadd8 (__a, __b);
  182. }
  183. __extension__ extern __inline int8x4_t
  184. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  185. __qsub8 (int8x4_t __a, int8x4_t __b)
  186. {
  187. return __builtin_arm_qsub8 (__a, __b);
  188. }
  189. __extension__ extern __inline int8x4_t
  190. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  191. __shadd8 (int8x4_t __a, int8x4_t __b)
  192. {
  193. return __builtin_arm_shadd8 (__a, __b);
  194. }
  195. __extension__ extern __inline int8x4_t
  196. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  197. __shsub8 (int8x4_t __a, int8x4_t __b)
  198. {
  199. return __builtin_arm_shsub8 (__a, __b);
  200. }
  201. __extension__ extern __inline uint8x4_t
  202. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  203. __uhadd8 (uint8x4_t __a, uint8x4_t __b)
  204. {
  205. return __builtin_arm_uhadd8 (__a, __b);
  206. }
  207. __extension__ extern __inline uint8x4_t
  208. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  209. __uhsub8 (uint8x4_t __a, uint8x4_t __b)
  210. {
  211. return __builtin_arm_uhsub8 (__a, __b);
  212. }
  213. __extension__ extern __inline uint8x4_t
  214. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  215. __uqadd8 (uint8x4_t __a, uint8x4_t __b)
  216. {
  217. return __builtin_arm_uqadd8 (__a, __b);
  218. }
  219. __extension__ extern __inline uint8x4_t
  220. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  221. __uqsub8 (uint8x4_t __a, uint8x4_t __b)
  222. {
  223. return __builtin_arm_uqsub8 (__a, __b);
  224. }
  225. __extension__ extern __inline int16x2_t
  226. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  227. __qadd16 (int16x2_t __a, int16x2_t __b)
  228. {
  229. return __builtin_arm_qadd16 (__a, __b);
  230. }
  231. __extension__ extern __inline int16x2_t
  232. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  233. __qasx (int16x2_t __a, int16x2_t __b)
  234. {
  235. return __builtin_arm_qasx (__a, __b);
  236. }
  237. __extension__ extern __inline int16x2_t
  238. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  239. __qsax (int16x2_t __a, int16x2_t __b)
  240. {
  241. return __builtin_arm_qsax (__a, __b);
  242. }
  243. __extension__ extern __inline int16x2_t
  244. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  245. __qsub16 (int16x2_t __a, int16x2_t __b)
  246. {
  247. return __builtin_arm_qsub16 (__a, __b);
  248. }
  249. __extension__ extern __inline int16x2_t
  250. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  251. __shadd16 (int16x2_t __a, int16x2_t __b)
  252. {
  253. return __builtin_arm_shadd16 (__a, __b);
  254. }
  255. __extension__ extern __inline int16x2_t
  256. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  257. __shasx (int16x2_t __a, int16x2_t __b)
  258. {
  259. return __builtin_arm_shasx (__a, __b);
  260. }
  261. __extension__ extern __inline int16x2_t
  262. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  263. __shsax (int16x2_t __a, int16x2_t __b)
  264. {
  265. return __builtin_arm_shsax (__a, __b);
  266. }
  267. __extension__ extern __inline int16x2_t
  268. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  269. __shsub16 (int16x2_t __a, int16x2_t __b)
  270. {
  271. return __builtin_arm_shsub16 (__a, __b);
  272. }
  273. __extension__ extern __inline uint16x2_t
  274. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  275. __uhadd16 (uint16x2_t __a, uint16x2_t __b)
  276. {
  277. return __builtin_arm_uhadd16 (__a, __b);
  278. }
  279. __extension__ extern __inline uint16x2_t
  280. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  281. __uhasx (uint16x2_t __a, uint16x2_t __b)
  282. {
  283. return __builtin_arm_uhasx (__a, __b);
  284. }
  285. __extension__ extern __inline uint16x2_t
  286. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  287. __uhsax (uint16x2_t __a, uint16x2_t __b)
  288. {
  289. return __builtin_arm_uhsax (__a, __b);
  290. }
  291. __extension__ extern __inline uint16x2_t
  292. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  293. __uhsub16 (uint16x2_t __a, uint16x2_t __b)
  294. {
  295. return __builtin_arm_uhsub16 (__a, __b);
  296. }
  297. __extension__ extern __inline uint16x2_t
  298. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  299. __uqadd16 (uint16x2_t __a, uint16x2_t __b)
  300. {
  301. return __builtin_arm_uqadd16 (__a, __b);
  302. }
  303. __extension__ extern __inline uint16x2_t
  304. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  305. __uqasx (uint16x2_t __a, uint16x2_t __b)
  306. {
  307. return __builtin_arm_uqasx (__a, __b);
  308. }
  309. __extension__ extern __inline uint16x2_t
  310. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  311. __uqsax (uint16x2_t __a, uint16x2_t __b)
  312. {
  313. return __builtin_arm_uqsax (__a, __b);
  314. }
  315. __extension__ extern __inline uint16x2_t
  316. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  317. __uqsub16 (uint16x2_t __a, uint16x2_t __b)
  318. {
  319. return __builtin_arm_uqsub16 (__a, __b);
  320. }
  321. __extension__ extern __inline int32_t
  322. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  323. __smusd (int16x2_t __a, int16x2_t __b)
  324. {
  325. return __builtin_arm_smusd (__a, __b);
  326. }
  327. __extension__ extern __inline int32_t
  328. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  329. __smusdx (int16x2_t __a, int16x2_t __b)
  330. {
  331. return __builtin_arm_smusdx (__a, __b);
  332. }
  333. __extension__ extern __inline uint32_t
  334. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  335. __usad8 (uint8x4_t __a, uint8x4_t __b)
  336. {
  337. return __builtin_arm_usad8 (__a, __b);
  338. }
  339. __extension__ extern __inline uint32_t
  340. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  341. __usada8 (uint8x4_t __a, uint8x4_t __b, uint32_t __c)
  342. {
  343. return __builtin_arm_usada8 (__a, __b, __c);
  344. }
  345. __extension__ extern __inline int64_t
  346. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  347. __smlald (int16x2_t __a, int16x2_t __b, int64_t __c)
  348. {
  349. return __builtin_arm_smlald (__a, __b, __c);
  350. }
  351. __extension__ extern __inline int64_t
  352. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  353. __smlaldx (int16x2_t __a, int16x2_t __b, int64_t __c)
  354. {
  355. return __builtin_arm_smlaldx (__a, __b, __c);
  356. }
  357. __extension__ extern __inline int64_t
  358. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  359. __smlsld (int16x2_t __a, int16x2_t __b, int64_t __c)
  360. {
  361. return __builtin_arm_smlsld (__a, __b, __c);
  362. }
  363. __extension__ extern __inline int64_t
  364. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  365. __smlsldx (int16x2_t __a, int16x2_t __b, int64_t __c)
  366. {
  367. return __builtin_arm_smlsldx (__a, __b, __c);
  368. }
  369. __extension__ extern __inline uint8x4_t
  370. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  371. __sel (uint8x4_t __a, uint8x4_t __b)
  372. {
  373. return __builtin_arm_sel (__a, __b);
  374. }
  375. __extension__ extern __inline int8x4_t
  376. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  377. __sadd8 (int8x4_t __a, int8x4_t __b)
  378. {
  379. return __builtin_arm_sadd8 (__a, __b);
  380. }
  381. __extension__ extern __inline int8x4_t
  382. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  383. __ssub8 (int8x4_t __a, int8x4_t __b)
  384. {
  385. return __builtin_arm_ssub8 (__a, __b);
  386. }
  387. __extension__ extern __inline uint8x4_t
  388. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  389. __uadd8 (uint8x4_t __a, uint8x4_t __b)
  390. {
  391. return __builtin_arm_uadd8 (__a, __b);
  392. }
  393. __extension__ extern __inline uint8x4_t
  394. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  395. __usub8 (uint8x4_t __a, uint8x4_t __b)
  396. {
  397. return __builtin_arm_usub8 (__a, __b);
  398. }
  399. __extension__ extern __inline int16x2_t
  400. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  401. __sadd16 (int16x2_t __a, int16x2_t __b)
  402. {
  403. return __builtin_arm_sadd16 (__a, __b);
  404. }
  405. __extension__ extern __inline int16x2_t
  406. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  407. __sasx (int16x2_t __a, int16x2_t __b)
  408. {
  409. return __builtin_arm_sasx (__a, __b);
  410. }
  411. __extension__ extern __inline int16x2_t
  412. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  413. __ssax (int16x2_t __a, int16x2_t __b)
  414. {
  415. return __builtin_arm_ssax (__a, __b);
  416. }
  417. __extension__ extern __inline int16x2_t
  418. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  419. __ssub16 (int16x2_t __a, int16x2_t __b)
  420. {
  421. return __builtin_arm_ssub16 (__a, __b);
  422. }
  423. __extension__ extern __inline uint16x2_t
  424. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  425. __uadd16 (uint16x2_t __a, uint16x2_t __b)
  426. {
  427. return __builtin_arm_uadd16 (__a, __b);
  428. }
  429. __extension__ extern __inline uint16x2_t
  430. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  431. __uasx (uint16x2_t __a, uint16x2_t __b)
  432. {
  433. return __builtin_arm_uasx (__a, __b);
  434. }
  435. __extension__ extern __inline uint16x2_t
  436. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  437. __usax (uint16x2_t __a, uint16x2_t __b)
  438. {
  439. return __builtin_arm_usax (__a, __b);
  440. }
  441. __extension__ extern __inline uint16x2_t
  442. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  443. __usub16 (uint16x2_t __a, uint16x2_t __b)
  444. {
  445. return __builtin_arm_usub16 (__a, __b);
  446. }
  447. __extension__ extern __inline int32_t
  448. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  449. __smlad (int16x2_t __a, int16x2_t __b, int32_t __c)
  450. {
  451. return __builtin_arm_smlad (__a, __b, __c);
  452. }
  453. __extension__ extern __inline int32_t
  454. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  455. __smladx (int16x2_t __a, int16x2_t __b, int32_t __c)
  456. {
  457. return __builtin_arm_smladx (__a, __b, __c);
  458. }
  459. __extension__ extern __inline int32_t
  460. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  461. __smlsd (int16x2_t __a, int16x2_t __b, int32_t __c)
  462. {
  463. return __builtin_arm_smlsd (__a, __b, __c);
  464. }
  465. __extension__ extern __inline int32_t
  466. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  467. __smlsdx (int16x2_t __a, int16x2_t __b, int32_t __c)
  468. {
  469. return __builtin_arm_smlsdx (__a, __b, __c);
  470. }
  471. __extension__ extern __inline int32_t
  472. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  473. __smuad (int16x2_t __a, int16x2_t __b)
  474. {
  475. return __builtin_arm_smuad (__a, __b);
  476. }
  477. __extension__ extern __inline int32_t
  478. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  479. __smuadx (int16x2_t __a, int16x2_t __b)
  480. {
  481. return __builtin_arm_smuadx (__a, __b);
  482. }
  483. #define __ssat16(__a, __sat) \
  484. __extension__ \
  485. ({ \
  486. int16x2_t __arg = (__a); \
  487. __builtin_sat_imm_check (__sat, 1, 16); \
  488. int16x2_t __res = __builtin_arm_ssat16 (__arg, __sat); \
  489. __res; \
  490. })
  491. #define __usat16(__a, __sat) \
  492. __extension__ \
  493. ({ \
  494. int16x2_t __arg = (__a); \
  495. __builtin_sat_imm_check (__sat, 0, 15); \
  496. int16x2_t __res = __builtin_arm_usat16 (__arg, __sat); \
  497. __res; \
  498. })
  499. #endif
  500. #ifdef __ARM_FEATURE_SAT
  501. #define __ssat(__a, __sat) \
  502. __extension__ \
  503. ({ \
  504. int32_t __arg = (__a); \
  505. __builtin_sat_imm_check (__sat, 1, 32); \
  506. int32_t __res = __builtin_arm_ssat (__arg, __sat); \
  507. __res; \
  508. })
  509. #define __usat(__a, __sat) \
  510. __extension__ \
  511. ({ \
  512. int32_t __arg = (__a); \
  513. __builtin_sat_imm_check (__sat, 0, 31); \
  514. uint32_t __res = __builtin_arm_usat (__arg, __sat); \
  515. __res; \
  516. })
  517. #endif
  518. #ifdef __ARM_FEATURE_QBIT
  519. __extension__ extern __inline void
  520. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  521. __ignore_saturation (void)
  522. {
  523. /* ACLE designates this intrinsic as a hint.
  524. Implement as a nop for now. */
  525. }
  526. /* These are defined as macros because the implementation of the builtins
  527. requires easy access to the current function so wrapping it in an
  528. always_inline function complicates things. */
  529. #define __saturation_occurred __builtin_arm_saturation_occurred
  530. #define __set_saturation_occurred(__a) \
  531. __extension__ \
  532. ({ \
  533. int __arg = (__a); \
  534. __builtin_arm_set_saturation (__arg); \
  535. })
  536. #endif
  537. #ifdef __ARM_FEATURE_DSP
  538. __extension__ extern __inline int32_t
  539. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  540. __qadd (int32_t __a, int32_t __b)
  541. {
  542. return __builtin_arm_qadd (__a, __b);
  543. }
  544. __extension__ extern __inline int32_t
  545. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  546. __qsub (int32_t __a, int32_t __b)
  547. {
  548. return __builtin_arm_qsub (__a, __b);
  549. }
  550. __extension__ extern __inline int32_t
  551. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  552. __qdbl (int32_t __x)
  553. {
  554. return __qadd (__x, __x);
  555. }
  556. __extension__ extern __inline int32_t
  557. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  558. __smlabb (int32_t __a, int32_t __b, int32_t __c)
  559. {
  560. return __builtin_arm_smlabb (__a, __b, __c);
  561. }
  562. __extension__ extern __inline int32_t
  563. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  564. __smlatb (int32_t __a, int32_t __b, int32_t __c)
  565. {
  566. return __builtin_arm_smlatb (__a, __b, __c);
  567. }
  568. /* smlatb is equivalent to smlabt with the two multiplication operands
  569. swapped around. */
  570. __extension__ extern __inline int32_t
  571. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  572. __smlabt (int32_t __a, int32_t __b, int32_t __c)
  573. {
  574. return __smlatb (__b, __a, __c);
  575. }
  576. __extension__ extern __inline int32_t
  577. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  578. __smlatt (int32_t __a, int32_t __b, int32_t __c)
  579. {
  580. return __builtin_arm_smlatt (__a, __b, __c);
  581. }
  582. __extension__ extern __inline int32_t
  583. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  584. __smlawb (int32_t __a, int32_t __b, int32_t __c)
  585. {
  586. return __builtin_arm_smlawb (__a, __b, __c);
  587. }
  588. __extension__ extern __inline int32_t
  589. __attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
  590. __smlawt (int32_t __a, int32_t __b, int32_t __c)
  591. {
  592. return __builtin_arm_smlawt (__a, __b, __c);
  593. }
  594. #endif
  595. #pragma GCC push_options
  596. #ifdef __ARM_FEATURE_CRC32
  597. #ifdef __ARM_FP
  598. #pragma GCC target ("arch=armv8-a+crc+simd")
  599. #else
  600. #pragma GCC target ("arch=armv8-a+crc")
  601. #endif
  602. __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
  603. __crc32b (uint32_t __a, uint8_t __b)
  604. {
  605. return __builtin_arm_crc32b (__a, __b);
  606. }
  607. __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
  608. __crc32h (uint32_t __a, uint16_t __b)
  609. {
  610. return __builtin_arm_crc32h (__a, __b);
  611. }
  612. __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
  613. __crc32w (uint32_t __a, uint32_t __b)
  614. {
  615. return __builtin_arm_crc32w (__a, __b);
  616. }
  617. #ifdef __ARM_32BIT_STATE
  618. __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
  619. __crc32d (uint32_t __a, uint64_t __b)
  620. {
  621. uint32_t __d;
  622. __d = __crc32w (__crc32w (__a, __b & 0xffffffffULL), __b >> 32);
  623. return __d;
  624. }
  625. #endif
  626. __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
  627. __crc32cb (uint32_t __a, uint8_t __b)
  628. {
  629. return __builtin_arm_crc32cb (__a, __b);
  630. }
  631. __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
  632. __crc32ch (uint32_t __a, uint16_t __b)
  633. {
  634. return __builtin_arm_crc32ch (__a, __b);
  635. }
  636. __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
  637. __crc32cw (uint32_t __a, uint32_t __b)
  638. {
  639. return __builtin_arm_crc32cw (__a, __b);
  640. }
  641. #ifdef __ARM_32BIT_STATE
  642. __extension__ static __inline uint32_t __attribute__ ((__always_inline__))
  643. __crc32cd (uint32_t __a, uint64_t __b)
  644. {
  645. uint32_t __d;
  646. __d = __crc32cw (__crc32cw (__a, __b & 0xffffffffULL), __b >> 32);
  647. return __d;
  648. }
  649. #endif
  650. #endif /* __ARM_FEATURE_CRC32 */
  651. #pragma GCC pop_options
  652. #ifdef __cplusplus
  653. }
  654. #endif
  655. #endif