vecintrin.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. /* GNU compiler hardware transactional execution intrinsics
  2. Copyright (C) 2015 Free Software Foundation, Inc.
  3. Contributed by Andreas Krebbel (Andreas.Krebbel@de.ibm.com)
  4. This file is part of GCC.
  5. GCC is free software; you can redistribute it and/or modify it under
  6. the terms of the GNU General Public License as published by the Free
  7. Software Foundation; either version 3, or (at your option) any later
  8. version.
  9. GCC is distributed in the hope that it will be useful, but WITHOUT ANY
  10. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  12. for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with GCC; see the file COPYING3. If not see
  15. <http://www.gnu.org/licenses/>. */
  16. #ifndef _VECINTRIN_H
  17. #define _VECINTRIN_H
  18. #ifdef __VEC__
  19. #define __VFTCI_ZERO 1<<11
  20. #define __VFTCI_ZERO_N 1<<10
  21. #define __VFTCI_NORMAL 1<<9
  22. #define __VFTCI_NORMAL_N 1<<8
  23. #define __VFTCI_SUBNORMAL 1<<7
  24. #define __VFTCI_SUBNORMAL_N 1<<6
  25. #define __VFTCI_INF 1<<5
  26. #define __VFTCI_INF_N 1<<4
  27. #define __VFTCI_QNAN 1<<3
  28. #define __VFTCI_QNAN_N 1<<2
  29. #define __VFTCI_SNAN 1<<1
  30. #define __VFTCI_SNAN_N 1<<0
  31. /* This also accepts a type for its parameter, so it is not enough
  32. to #define vec_step to __builtin_vec_step. */
  33. #define vec_step(x) __builtin_vec_step (* (__typeof__ (x) *) 0)
  34. static inline int
  35. __lcbb(const void *ptr, int bndry)
  36. {
  37. int code;
  38. switch (bndry)
  39. {
  40. case 64: code = 0; break;
  41. case 128: code = 1; break;
  42. case 256: code = 2; break;
  43. case 512: code = 3; break;
  44. case 1024: code = 4; break;
  45. case 2048: code = 5; break;
  46. case 4096: code = 6; break;
  47. default: return 0;
  48. }
  49. return __builtin_s390_lcbb (ptr, code);
  50. }
  51. #define vec_all_nle(X, Y) vec_all_nge ((Y), (X))
  52. #define vec_all_nlt(X, Y) vec_all_ngt ((Y), (X))
  53. #define vec_any_nle(X, Y) vec_any_nge ((Y), (X))
  54. #define vec_any_nlt(X, Y) vec_any_ngt ((Y), (X))
  55. #define vec_genmask __builtin_s390_vgbm
  56. #define vec_genmasks_8 __builtin_s390_vgmb
  57. #define vec_genmasks_16 __builtin_s390_vgmh
  58. #define vec_genmasks_32 __builtin_s390_vgmf
  59. #define vec_genmasks_64 __builtin_s390_vgmg
  60. #define vec_splat_u8 __builtin_s390_vlrepb
  61. #define vec_splat_s8 __builtin_s390_vlrepb
  62. #define vec_splat_u16 __builtin_s390_vlreph
  63. #define vec_splat_s16 __builtin_s390_vlreph
  64. #define vec_splat_u32 __builtin_s390_vlrepf
  65. #define vec_splat_s32 __builtin_s390_vlrepf
  66. #define vec_splat_u64 __builtin_s390_vlrepg
  67. #define vec_splat_s64 __builtin_s390_vlrepg
  68. #define vec_add_u128 __builtin_s390_vaq
  69. #define vec_addc_u128 __builtin_s390_vaccq
  70. #define vec_adde_u128 __builtin_s390_vacq
  71. #define vec_addec_u128 __builtin_s390_vacccq
  72. #define vec_checksum __builtin_s390_vcksm
  73. #define vec_gfmsum_128 __builtin_s390_vgfmg
  74. #define vec_gfmsum_accum_128 __builtin_s390_vgfmag
  75. #define vec_subc_u128 __builtin_s390_vscbiq
  76. #define vec_sube_u128 __builtin_s390_vsbiq
  77. #define vec_subec_u128 __builtin_s390_vsbcbiq
  78. #define vec_ceil(X) __builtin_s390_vfidb((X), 4, 6)
  79. #define vec_roundp(X) __builtin_s390_vfidb((X), 4, 6)
  80. #define vec_floor(X) __builtin_s390_vfidb((X), 4, 7)
  81. #define vec_roundm(X) __builtin_s390_vfidb((X), 4, 7)
  82. #define vec_trunc(X) __builtin_s390_vfidb((X), 4, 5)
  83. #define vec_roundz(X) __builtin_s390_vfidb((X), 4, 5)
  84. #define vec_roundc(X) __builtin_s390_vfidb((X), 4, 0)
  85. #define vec_round(X) __builtin_s390_vfidb((X), 4, 4)
  86. #define vec_madd __builtin_s390_vfmadb
  87. #define vec_msub __builtin_s390_vfmsdb
  88. static inline int
  89. vec_all_nan (__vector double a)
  90. {
  91. int cc;
  92. __builtin_s390_vftcidb (a,
  93. __VFTCI_QNAN
  94. | __VFTCI_QNAN_N
  95. | __VFTCI_SNAN
  96. | __VFTCI_SNAN_N, &cc);
  97. return cc == 0 ? 1 : 0;
  98. }
  99. static inline int
  100. vec_all_numeric (__vector double a)
  101. {
  102. int cc;
  103. __builtin_s390_vftcidb (a,
  104. __VFTCI_NORMAL
  105. | __VFTCI_NORMAL_N
  106. | __VFTCI_SUBNORMAL
  107. | __VFTCI_SUBNORMAL_N, &cc);
  108. return cc == 0 ? 1 : 0;
  109. }
  110. static inline int
  111. vec_any_nan (__vector double a)
  112. {
  113. int cc;
  114. __builtin_s390_vftcidb (a,
  115. __VFTCI_QNAN
  116. | __VFTCI_QNAN_N
  117. | __VFTCI_SNAN
  118. | __VFTCI_SNAN_N, &cc);
  119. return cc != 3 ? 1 : 0;
  120. }
  121. static inline int
  122. vec_any_numeric (__vector double a)
  123. {
  124. int cc;
  125. __builtin_s390_vftcidb (a,
  126. __VFTCI_NORMAL
  127. | __VFTCI_NORMAL_N
  128. | __VFTCI_SUBNORMAL
  129. | __VFTCI_SUBNORMAL_N, &cc);
  130. return cc != 3 ? 1 : 0;
  131. }
  132. #define vec_gather_element __builtin_s390_vec_gather_element
  133. #define vec_xld2 __builtin_s390_vec_xld2
  134. #define vec_xlw4 __builtin_s390_vec_xlw4
  135. #define vec_splats __builtin_s390_vec_splats
  136. #define vec_insert __builtin_s390_vec_insert
  137. #define vec_promote __builtin_s390_vec_promote
  138. #define vec_extract __builtin_s390_vec_extract
  139. #define vec_insert_and_zero __builtin_s390_vec_insert_and_zero
  140. #define vec_load_bndry __builtin_s390_vec_load_bndry
  141. #define vec_load_pair __builtin_s390_vec_load_pair
  142. #define vec_load_len __builtin_s390_vec_load_len
  143. #define vec_mergeh __builtin_s390_vec_mergeh
  144. #define vec_mergel __builtin_s390_vec_mergel
  145. #define vec_pack __builtin_s390_vec_pack
  146. #define vec_packs __builtin_s390_vec_packs
  147. #define vec_packs_cc __builtin_s390_vec_packs_cc
  148. #define vec_packsu __builtin_s390_vec_packsu
  149. #define vec_packsu_cc __builtin_s390_vec_packsu_cc
  150. #define vec_perm __builtin_s390_vec_perm
  151. #define vec_permi __builtin_s390_vec_permi
  152. #define vec_splat __builtin_s390_vec_splat
  153. #define vec_scatter_element __builtin_s390_vec_scatter_element
  154. #define vec_sel __builtin_s390_vec_sel
  155. #define vec_extend_s64 __builtin_s390_vec_extend_s64
  156. #define vec_xstd2 __builtin_s390_vec_xstd2
  157. #define vec_xstw4 __builtin_s390_vec_xstw4
  158. #define vec_store_len __builtin_s390_vec_store_len
  159. #define vec_unpackh __builtin_s390_vec_unpackh
  160. #define vec_unpackl __builtin_s390_vec_unpackl
  161. #define vec_addc __builtin_s390_vec_addc
  162. #define vec_and __builtin_s390_vec_and
  163. #define vec_andc __builtin_s390_vec_andc
  164. #define vec_avg __builtin_s390_vec_avg
  165. #define vec_all_eq __builtin_s390_vec_all_eq
  166. #define vec_all_ne __builtin_s390_vec_all_ne
  167. #define vec_all_ge __builtin_s390_vec_all_ge
  168. #define vec_all_gt __builtin_s390_vec_all_gt
  169. #define vec_all_le __builtin_s390_vec_all_le
  170. #define vec_all_lt __builtin_s390_vec_all_lt
  171. #define vec_any_eq __builtin_s390_vec_any_eq
  172. #define vec_any_ne __builtin_s390_vec_any_ne
  173. #define vec_any_ge __builtin_s390_vec_any_ge
  174. #define vec_any_gt __builtin_s390_vec_any_gt
  175. #define vec_any_le __builtin_s390_vec_any_le
  176. #define vec_any_lt __builtin_s390_vec_any_lt
  177. #define vec_cmpeq __builtin_s390_vec_cmpeq
  178. #define vec_cmpge __builtin_s390_vec_cmpge
  179. #define vec_cmpgt __builtin_s390_vec_cmpgt
  180. #define vec_cmple __builtin_s390_vec_cmple
  181. #define vec_cmplt __builtin_s390_vec_cmplt
  182. #define vec_cntlz __builtin_s390_vec_cntlz
  183. #define vec_cnttz __builtin_s390_vec_cnttz
  184. #define vec_xor __builtin_s390_vec_xor
  185. #define vec_gfmsum __builtin_s390_vec_gfmsum
  186. #define vec_gfmsum_accum __builtin_s390_vec_gfmsum_accum
  187. #define vec_abs __builtin_s390_vec_abs
  188. #define vec_max __builtin_s390_vec_max
  189. #define vec_min __builtin_s390_vec_min
  190. #define vec_mladd __builtin_s390_vec_mladd
  191. #define vec_mhadd __builtin_s390_vec_mhadd
  192. #define vec_meadd __builtin_s390_vec_meadd
  193. #define vec_moadd __builtin_s390_vec_moadd
  194. #define vec_mulh __builtin_s390_vec_mulh
  195. #define vec_mule __builtin_s390_vec_mule
  196. #define vec_mulo __builtin_s390_vec_mulo
  197. #define vec_nor __builtin_s390_vec_nor
  198. #define vec_or __builtin_s390_vec_or
  199. #define vec_popcnt __builtin_s390_vec_popcnt
  200. #define vec_rl __builtin_s390_vec_rl
  201. #define vec_rli __builtin_s390_vec_rli
  202. #define vec_rl_mask __builtin_s390_vec_rl_mask
  203. #define vec_sll __builtin_s390_vec_sll
  204. #define vec_slb __builtin_s390_vec_slb
  205. #define vec_sld __builtin_s390_vec_sld
  206. #define vec_sldw __builtin_s390_vec_sldw
  207. #define vec_sral __builtin_s390_vec_sral
  208. #define vec_srab __builtin_s390_vec_srab
  209. #define vec_srl __builtin_s390_vec_srl
  210. #define vec_srb __builtin_s390_vec_srb
  211. #define vec_subc __builtin_s390_vec_subc
  212. #define vec_sum2 __builtin_s390_vec_sum2
  213. #define vec_sum_u128 __builtin_s390_vec_sum_u128
  214. #define vec_sum4 __builtin_s390_vec_sum4
  215. #define vec_test_mask __builtin_s390_vec_test_mask
  216. #define vec_find_any_eq_idx __builtin_s390_vec_find_any_eq_idx
  217. #define vec_find_any_ne_idx __builtin_s390_vec_find_any_ne_idx
  218. #define vec_find_any_eq_or_0_idx __builtin_s390_vec_find_any_eq_or_0_idx
  219. #define vec_find_any_ne_or_0_idx __builtin_s390_vec_find_any_ne_or_0_idx
  220. #define vec_find_any_eq __builtin_s390_vec_find_any_eq
  221. #define vec_find_any_ne __builtin_s390_vec_find_any_ne
  222. #define vec_find_any_eq_idx_cc __builtin_s390_vec_find_any_eq_idx_cc
  223. #define vec_find_any_ne_idx_cc __builtin_s390_vec_find_any_ne_idx_cc
  224. #define vec_find_any_eq_or_0_idx_cc __builtin_s390_vec_find_any_eq_or_0_idx_cc
  225. #define vec_find_any_ne_or_0_idx_cc __builtin_s390_vec_find_any_ne_or_0_idx_cc
  226. #define vec_find_any_eq_cc __builtin_s390_vec_find_any_eq_cc
  227. #define vec_find_any_ne_cc __builtin_s390_vec_find_any_ne_cc
  228. #define vec_cmpeq_idx __builtin_s390_vec_cmpeq_idx
  229. #define vec_cmpeq_or_0_idx __builtin_s390_vec_cmpeq_or_0_idx
  230. #define vec_cmpeq_idx_cc __builtin_s390_vec_cmpeq_idx_cc
  231. #define vec_cmpeq_or_0_idx_cc __builtin_s390_vec_cmpeq_or_0_idx_cc
  232. #define vec_cmpne_idx __builtin_s390_vec_cmpne_idx
  233. #define vec_cmpne_or_0_idx __builtin_s390_vec_cmpne_or_0_idx
  234. #define vec_cmpne_idx_cc __builtin_s390_vec_cmpne_idx_cc
  235. #define vec_cmpne_or_0_idx_cc __builtin_s390_vec_cmpne_or_0_idx_cc
  236. #define vec_cp_until_zero __builtin_s390_vec_cp_until_zero
  237. #define vec_cp_until_zero_cc __builtin_s390_vec_cp_until_zero_cc
  238. #define vec_cmprg_idx __builtin_s390_vec_cmprg_idx
  239. #define vec_cmpnrg_idx __builtin_s390_vec_cmpnrg_idx
  240. #define vec_cmprg_or_0_idx __builtin_s390_vec_cmprg_or_0_idx
  241. #define vec_cmpnrg_or_0_idx __builtin_s390_vec_cmpnrg_or_0_idx
  242. #define vec_cmprg __builtin_s390_vec_cmprg
  243. #define vec_cmpnrg __builtin_s390_vec_cmpnrg
  244. #define vec_cmprg_idx_cc __builtin_s390_vec_cmprg_idx_cc
  245. #define vec_cmpnrg_idx_cc __builtin_s390_vec_cmpnrg_idx_cc
  246. #define vec_cmprg_or_0_idx_cc __builtin_s390_vec_cmprg_or_0_idx_cc
  247. #define vec_cmpnrg_or_0_idx_cc __builtin_s390_vec_cmpnrg_or_0_idx_cc
  248. #define vec_cmprg_cc __builtin_s390_vec_cmprg_cc
  249. #define vec_cmpnrg_cc __builtin_s390_vec_cmpnrg_cc
  250. #define vec_all_nge __builtin_s390_vec_all_nge
  251. #define vec_all_ngt __builtin_s390_vec_all_ngt
  252. #define vec_any_nge __builtin_s390_vec_any_nge
  253. #define vec_any_ngt __builtin_s390_vec_any_ngt
  254. #define vec_ctd __builtin_s390_vec_ctd
  255. #define vec_ctd_s64 __builtin_s390_vec_ctd_s64
  256. #define vec_ctd_u64 __builtin_s390_vec_ctd_u64
  257. #define vec_ctsl __builtin_s390_vec_ctsl
  258. #define vec_ctul __builtin_s390_vec_ctul
  259. #define vec_ld2f __builtin_s390_vec_ld2f
  260. #define vec_st2f __builtin_s390_vec_st2f
  261. #endif /* __VEC__ */
  262. #endif /* _VECINTRIN_H */