aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/s390/vecintrin.h
blob: d74d4272c2335d121ec2155c4636d72ea95dde88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
/* GNU compiler vector extension intrinsics
   Copyright (C) 2015-2022 Free Software Foundation, Inc.
   Contributed by Andreas Krebbel (Andreas.Krebbel@de.ibm.com)

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#ifndef _VECINTRIN_H
#define _VECINTRIN_H

#define __VEC_CLASS_FP_ZERO_P      (1<<11)
#define __VEC_CLASS_FP_ZERO_N      (1<<10)
#define __VEC_CLASS_FP_ZERO	   (__VEC_CLASS_FP_ZERO_P	\
				    | __VEC_CLASS_FP_ZERO_N)

#define __VEC_CLASS_FP_NORMAL_P    (1<<9)
#define __VEC_CLASS_FP_NORMAL_N    (1<<8)
#define __VEC_CLASS_FP_NORMAL      (__VEC_CLASS_FP_NORMAL_P	\
				    | __VEC_CLASS_FP_NORMAL_N)

#define __VEC_CLASS_FP_SUBNORMAL_P (1<<7)
#define __VEC_CLASS_FP_SUBNORMAL_N (1<<6)
#define __VEC_CLASS_FP_SUBNORMAL   (__VEC_CLASS_FP_SUBNORMAL_P		\
				    | __VEC_CLASS_FP_SUBNORMAL_N)

#define __VEC_CLASS_FP_INFINITY_P  (1<<5)
#define __VEC_CLASS_FP_INFINITY_N  (1<<4)
#define __VEC_CLASS_FP_INFINITY    (__VEC_CLASS_FP_INFINITY_P		\
				    | __VEC_CLASS_FP_INFINITY_N)

#define __VEC_CLASS_FP_QNAN_P      (1<<3)
#define __VEC_CLASS_FP_QNAN_N      (1<<2)
#define __VEC_CLASS_FP_QNAN        (__VEC_CLASS_FP_QNAN_P	\
				    | __VEC_CLASS_FP_QNAN_N)

#define __VEC_CLASS_FP_SNAN_P      (1<<1)
#define __VEC_CLASS_FP_SNAN_N      (1<<0)
#define __VEC_CLASS_FP_SNAN        (__VEC_CLASS_FP_SNAN_P	\
				    | __VEC_CLASS_FP_SNAN_N)

#define __VEC_CLASS_FP_NAN         (__VEC_CLASS_FP_QNAN		\
				    | __VEC_CLASS_FP_SNAN)
#define __VEC_CLASS_FP_NOT_NORMAL  (__VEC_CLASS_FP_NAN			\
				    | __VEC_CLASS_FP_SUBNORMAL		\
				    |__VEC_CLASS_FP_ZERO		\
				    | __VEC_CLASS_FP_INFINITY)

/* This also accepts a type for its parameter, so it is not enough
   to #define vec_step to __builtin_vec_step.  */
#define vec_step(x) __builtin_vec_step (* (__typeof__ (x) *) 0)

static inline int
__lcbb(const void *ptr, int bndry)
{
  int code;
  switch (bndry)
    {
    case 64: code = 0; break;
    case 128: code = 1; break;
    case 256: code = 2; break;
    case 512: code = 3; break;
    case 1024: code = 4; break;
    case 2048: code = 5; break;
    case 4096: code = 6; break;
    default: return 0;
    }
  return __builtin_s390_lcbb (ptr, code);
}

#define vec_all_nle(X, Y) vec_all_nge ((Y), (X))
#define vec_all_nlt(X, Y) vec_all_ngt ((Y), (X))
#define vec_any_nle(X, Y) vec_any_nge ((Y), (X))
#define vec_any_nlt(X, Y) vec_any_ngt ((Y), (X))
#define vec_genmask __builtin_s390_vgbm
#define vec_genmasks_8 __builtin_s390_vgmb
#define vec_genmasks_16 __builtin_s390_vgmh
#define vec_genmasks_32 __builtin_s390_vgmf
#define vec_genmasks_64 __builtin_s390_vgmg
#define vec_splat_u8 __builtin_s390_vec_splat_u8
#define vec_splat_s8 __builtin_s390_vec_splat_s8
#define vec_splat_u16 __builtin_s390_vec_splat_u16
#define vec_splat_s16 __builtin_s390_vec_splat_s16
#define vec_splat_u32 __builtin_s390_vec_splat_u32
#define vec_splat_s32 __builtin_s390_vec_splat_s32
#define vec_splat_u64 __builtin_s390_vec_splat_u64
#define vec_splat_s64 __builtin_s390_vec_splat_s64
#define vec_checksum __builtin_s390_vcksm
#define vec_gfmsum_128 __builtin_s390_vgfmg
#define vec_gfmsum_accum_128 __builtin_s390_vgfmag
#define vec_ceil(X)   __builtin_s390_vfi((X), 4, 6)
#define vec_roundp(X) __builtin_s390_vfi((X), 4, 6)
#define vec_floor(X)  __builtin_s390_vfi((X), 4, 7)
#define vec_roundm(X) __builtin_s390_vfi((X), 4, 7)
#define vec_trunc(X)  __builtin_s390_vfi((X), 4, 5)
#define vec_roundz(X) __builtin_s390_vfi((X), 4, 5)
#define vec_rint(X)   __builtin_s390_vfi((X), 0, 0)
#define vec_roundc(X) __builtin_s390_vfi((X), 4, 0)
#define vec_round(X)  __builtin_s390_vfi((X), 4, 4)
#define vec_doublee(X) __builtin_s390_vflls((X))
#define vec_floate(X) __builtin_s390_vflrd((X), 0, 0)
#define vec_load_len_r(X,L)				\
  (__vector unsigned char)__builtin_s390_vlrlr((L),(X))
#define vec_store_len_r(X,Y,L) \
  __builtin_s390_vstrlr((__vector signed char)(X),(L),(Y))

#define vec_all_nan(a)						\
  __extension__ ({						\
      int __cc;							\
      __builtin_s390_vec_fp_test_data_class (a,			\
			    __VEC_CLASS_FP_QNAN			\
			    | __VEC_CLASS_FP_QNAN_N			\
			    | __VEC_CLASS_FP_SNAN			\
			    | __VEC_CLASS_FP_SNAN_N, &__cc);		\
      __cc == 0 ? 1 : 0;					\
    })

#define vec_all_numeric(a)					\
  __extension__ ({						\
      int __cc;							\
      __builtin_s390_vec_fp_test_data_class (a,				\
			    __VEC_CLASS_FP_NORMAL			\
			    | __VEC_CLASS_FP_NORMAL_N			\
			    | __VEC_CLASS_FP_SUBNORMAL			\
			    | __VEC_CLASS_FP_SUBNORMAL_N, &__cc);	\
      __cc == 0 ? 1 : 0;					\
    })

#define vec_any_nan(a)						\
  __extension__ ({						\
      int __cc;							\
      __builtin_s390_vec_fp_test_data_class (a,			\
			    __VEC_CLASS_FP_QNAN			\
			    | __VEC_CLASS_FP_QNAN_N			\
			    | __VEC_CLASS_FP_SNAN			\
			    | __VEC_CLASS_FP_SNAN_N, &cc);		\
      cc != 3 ? 1 : 0;						\
    })

#define vec_any_numeric(a)					\
  __extension__ ({						\
      int __cc;							\
      __builtin_s390_vec_fp_test_data_class (a,				\
			    __VEC_CLASS_FP_NORMAL			\
			    | __VEC_CLASS_FP_NORMAL_N			\
			    | __VEC_CLASS_FP_SUBNORMAL			\
			    | __VEC_CLASS_FP_SUBNORMAL_N, &cc);	\
      cc != 3 ? 1 : 0;						\
    })

#define vec_vstbrh vec_vlbrh
#define vec_vstbrf vec_vlbrf
#define vec_vstbrg vec_vlbrg
#define vec_vstbrq vec_vlbrq
#define vec_vstbrf_flt vec_vlbrf_flt
#define vec_vstbrg_dbl vec_vlbrg_dbl

#define vec_vsterb vec_vlerb
#define vec_vsterh vec_vlerh
#define vec_vsterf vec_vlerh
#define vec_vsterg vec_vlerh
#define vec_vsterf_flt vec_vlerf_flt
#define vec_vsterg_dbl vec_vlerg_dbl

#define vec_extend_to_fp32_hi __builtin_s390_vclfnhs
#define vec_extend_to_fp32_lo __builtin_s390_vclfnls
#define vec_round_from_fp32 __builtin_s390_vcrnfs
#define vec_convert_to_fp16 __builtin_s390_vcfn
#define vec_convert_from_fp16 __builtin_s390_vcnf
#define vec_gather_element __builtin_s390_vec_gather_element
#define vec_xl __builtin_s390_vec_xl
#define vec_xld2 __builtin_s390_vec_xld2
#define vec_xlw4 __builtin_s390_vec_xlw4
#define vec_splats __builtin_s390_vec_splats
#define vec_insert __builtin_s390_vec_insert
#define vec_promote __builtin_s390_vec_promote
#define vec_extract __builtin_s390_vec_extract
#define vec_insert_and_zero __builtin_s390_vec_insert_and_zero
#define vec_load_bndry __builtin_s390_vec_load_bndry
#define vec_load_pair __builtin_s390_vec_load_pair
#define vec_load_len __builtin_s390_vec_load_len
#define vec_mergeh __builtin_s390_vec_mergeh
#define vec_mergel __builtin_s390_vec_mergel
#define vec_pack __builtin_s390_vec_pack
#define vec_packs __builtin_s390_vec_packs
#define vec_packs_cc __builtin_s390_vec_packs_cc
#define vec_packsu __builtin_s390_vec_packsu
#define vec_packsu_cc __builtin_s390_vec_packsu_cc
#define vec_perm __builtin_s390_vec_perm
#define vec_permi __builtin_s390_vec_permi
#define vec_splat __builtin_s390_vec_splat
#define vec_scatter_element __builtin_s390_vec_scatter_element
#define vec_sel __builtin_s390_vec_sel
#define vec_extend_s64 __builtin_s390_vec_extend_s64
#define vec_xst __builtin_s390_vec_xst
#define vec_xstd2 __builtin_s390_vec_xstd2
#define vec_xstw4 __builtin_s390_vec_xstw4
#define vec_store_len __builtin_s390_vec_store_len
#define vec_bperm_u128 __builtin_s390_vec_bperm_u128
#define vec_unpackh __builtin_s390_vec_unpackh
#define vec_unpackl __builtin_s390_vec_unpackl
#define vec_addc __builtin_s390_vec_addc
#define vec_add_u128 __builtin_s390_vec_add_u128
#define vec_addc_u128 __builtin_s390_vec_addc_u128
#define vec_adde_u128 __builtin_s390_vec_adde_u128
#define vec_addec_u128 __builtin_s390_vec_addec_u128
#define vec_and __builtin_s390_vec_and
#define vec_andc __builtin_s390_vec_andc
#define vec_avg __builtin_s390_vec_avg
#define vec_all_eq __builtin_s390_vec_all_eq
#define vec_all_ne __builtin_s390_vec_all_ne
#define vec_all_ge __builtin_s390_vec_all_ge
#define vec_all_gt __builtin_s390_vec_all_gt
#define vec_all_le __builtin_s390_vec_all_le
#define vec_all_lt __builtin_s390_vec_all_lt
#define vec_any_eq __builtin_s390_vec_any_eq
#define vec_any_ne __builtin_s390_vec_any_ne
#define vec_any_ge __builtin_s390_vec_any_ge
#define vec_any_gt __builtin_s390_vec_any_gt
#define vec_any_le __builtin_s390_vec_any_le
#define vec_any_lt __builtin_s390_vec_any_lt
#define vec_cmpeq __builtin_s390_vec_cmpeq
#define vec_cmpge __builtin_s390_vec_cmpge
#define vec_cmpgt __builtin_s390_vec_cmpgt
#define vec_cmple __builtin_s390_vec_cmple
#define vec_cmplt __builtin_s390_vec_cmplt
#define vec_cntlz __builtin_s390_vec_cntlz
#define vec_cnttz __builtin_s390_vec_cnttz
#define vec_xor __builtin_s390_vec_xor
#define vec_gfmsum __builtin_s390_vec_gfmsum
#define vec_gfmsum_accum __builtin_s390_vec_gfmsum_accum
#define vec_abs __builtin_s390_vec_abs
#define vec_max __builtin_s390_vec_max
#define vec_min __builtin_s390_vec_min
#define vec_mladd __builtin_s390_vec_mladd
#define vec_mhadd __builtin_s390_vec_mhadd
#define vec_meadd __builtin_s390_vec_meadd
#define vec_moadd __builtin_s390_vec_moadd
#define vec_mulh __builtin_s390_vec_mulh
#define vec_mule __builtin_s390_vec_mule
#define vec_mulo __builtin_s390_vec_mulo
#define vec_nor __builtin_s390_vec_nor
#define vec_or __builtin_s390_vec_or
#define vec_popcnt __builtin_s390_vec_popcnt
#define vec_rl __builtin_s390_vec_rl
#define vec_rli __builtin_s390_vec_rli
#define vec_rl_mask __builtin_s390_vec_rl_mask
#define vec_sll __builtin_s390_vec_sll
#define vec_slb __builtin_s390_vec_slb
#define vec_sld __builtin_s390_vec_sld
#define vec_sldw __builtin_s390_vec_sldw
#define vec_sral __builtin_s390_vec_sral
#define vec_srab __builtin_s390_vec_srab
#define vec_srl __builtin_s390_vec_srl
#define vec_srb __builtin_s390_vec_srb
#define vec_subc __builtin_s390_vec_subc
#define vec_sub_u128 __builtin_s390_vec_sub_u128
#define vec_subc_u128 __builtin_s390_vec_subc_u128
#define vec_sube_u128 __builtin_s390_vec_sube_u128
#define vec_subec_u128 __builtin_s390_vec_subec_u128
#define vec_sum2 __builtin_s390_vec_sum2
#define vec_sum_u128 __builtin_s390_vec_sum_u128
#define vec_sum4 __builtin_s390_vec_sum4
#define vec_test_mask __builtin_s390_vec_test_mask
#define vec_msum_u128 __builtin_s390_vec_msum_u128
#define vec_eqv __builtin_s390_vec_eqv
#define vec_nand __builtin_s390_vec_nand
#define vec_orc __builtin_s390_vec_orc
#define vec_find_any_eq_idx __builtin_s390_vec_find_any_eq_idx
#define vec_find_any_ne_idx __builtin_s390_vec_find_any_ne_idx
#define vec_find_any_eq_or_0_idx __builtin_s390_vec_find_any_eq_or_0_idx
#define vec_find_any_ne_or_0_idx __builtin_s390_vec_find_any_ne_or_0_idx
#define vec_find_any_eq __builtin_s390_vec_find_any_eq
#define vec_find_any_ne __builtin_s390_vec_find_any_ne
#define vec_find_any_eq_idx_cc __builtin_s390_vec_find_any_eq_idx_cc
#define vec_find_any_ne_idx_cc __builtin_s390_vec_find_any_ne_idx_cc
#define vec_find_any_eq_or_0_idx_cc __builtin_s390_vec_find_any_eq_or_0_idx_cc
#define vec_find_any_ne_or_0_idx_cc __builtin_s390_vec_find_any_ne_or_0_idx_cc
#define vec_find_any_eq_cc __builtin_s390_vec_find_any_eq_cc
#define vec_find_any_ne_cc __builtin_s390_vec_find_any_ne_cc
#define vec_cmpeq_idx __builtin_s390_vec_cmpeq_idx
#define vec_cmpeq_or_0_idx __builtin_s390_vec_cmpeq_or_0_idx
#define vec_cmpeq_idx_cc __builtin_s390_vec_cmpeq_idx_cc
#define vec_cmpeq_or_0_idx_cc __builtin_s390_vec_cmpeq_or_0_idx_cc
#define vec_cmpne_idx __builtin_s390_vec_cmpne_idx
#define vec_cmpne_or_0_idx __builtin_s390_vec_cmpne_or_0_idx
#define vec_cmpne_idx_cc __builtin_s390_vec_cmpne_idx_cc
#define vec_cmpne_or_0_idx_cc __builtin_s390_vec_cmpne_or_0_idx_cc
#define vec_cp_until_zero __builtin_s390_vec_cp_until_zero
#define vec_cp_until_zero_cc __builtin_s390_vec_cp_until_zero_cc
#define vec_cmprg_idx __builtin_s390_vec_cmprg_idx
#define vec_cmpnrg_idx __builtin_s390_vec_cmpnrg_idx
#define vec_cmprg_or_0_idx __builtin_s390_vec_cmprg_or_0_idx
#define vec_cmpnrg_or_0_idx __builtin_s390_vec_cmpnrg_or_0_idx
#define vec_cmprg __builtin_s390_vec_cmprg
#define vec_cmpnrg __builtin_s390_vec_cmpnrg
#define vec_cmprg_idx_cc __builtin_s390_vec_cmprg_idx_cc
#define vec_cmpnrg_idx_cc __builtin_s390_vec_cmpnrg_idx_cc
#define vec_cmprg_or_0_idx_cc __builtin_s390_vec_cmprg_or_0_idx_cc
#define vec_cmpnrg_or_0_idx_cc __builtin_s390_vec_cmpnrg_or_0_idx_cc
#define vec_cmprg_cc __builtin_s390_vec_cmprg_cc
#define vec_cmpnrg_cc __builtin_s390_vec_cmpnrg_cc
#define vec_all_nge __builtin_s390_vec_all_nge
#define vec_all_ngt __builtin_s390_vec_all_ngt
#define vec_any_nge __builtin_s390_vec_any_nge
#define vec_any_ngt __builtin_s390_vec_any_ngt
#define vec_ctd __builtin_s390_vec_ctd
#define vec_ctd_s64 __builtin_s390_vec_ctd_s64
#define vec_ctd_u64 __builtin_s390_vec_ctd_u64
#define vec_ctsl __builtin_s390_vec_ctsl
#define vec_ctul __builtin_s390_vec_ctul
#define vec_float __builtin_s390_vec_float
#define vec_double __builtin_s390_vec_double
#define vec_signed __builtin_s390_vec_signed
#define vec_unsigned __builtin_s390_vec_unsigned
#define vec_ld2f __builtin_s390_vec_ld2f
#define vec_st2f __builtin_s390_vec_st2f
#define vec_madd __builtin_s390_vec_madd
#define vec_msub __builtin_s390_vec_msub
#define vec_nmadd __builtin_s390_vec_nmadd
#define vec_nmsub __builtin_s390_vec_nmsub
#define vec_nabs __builtin_s390_vec_nabs
#define vec_sqrt __builtin_s390_vec_sqrt
#define vec_fp_test_data_class __builtin_s390_vec_fp_test_data_class
#define vec_revb __builtin_s390_vec_revb
#define vec_reve __builtin_s390_vec_reve
#define vec_sldb __builtin_s390_vec_sldb
#define vec_srdb __builtin_s390_vec_srdb
#define vec_search_string_cc __builtin_s390_vec_search_string_cc
#define vec_search_string_until_zero_cc __builtin_s390_vec_search_string_until_zero_cc
#endif /* _VECINTRIN_H */