1 //===-- generic/include/clc/misc/shuffle.h ------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #define _CLC_SHUFFLE_DECL(TYPE, MASKTYPE, RETTYPE) \
10   _CLC_OVERLOAD _CLC_DECL RETTYPE shuffle(TYPE x, MASKTYPE mask);
11 
12 //Return type is same base type as the input type, with the same vector size as the mask.
13 //Elements in the mask must be the same size (number of bits) as the input value.
14 //E.g. char8 ret = shuffle(char2 x, uchar8 mask);
15 
16 #define _CLC_VECTOR_SHUFFLE_MASKSIZE(INBASE, INTYPE, MASKTYPE) \
17   _CLC_SHUFFLE_DECL(INTYPE, MASKTYPE##2, INBASE##2) \
18   _CLC_SHUFFLE_DECL(INTYPE, MASKTYPE##4, INBASE##4) \
19   _CLC_SHUFFLE_DECL(INTYPE, MASKTYPE##8, INBASE##8) \
20   _CLC_SHUFFLE_DECL(INTYPE, MASKTYPE##16, INBASE##16) \
21 
22 #define _CLC_VECTOR_SHUFFLE_INSIZE(TYPE, MASKTYPE) \
23   _CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, TYPE##2, MASKTYPE) \
24   _CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, TYPE##4, MASKTYPE) \
25   _CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, TYPE##8, MASKTYPE) \
26   _CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, TYPE##16, MASKTYPE) \
27 
28 _CLC_VECTOR_SHUFFLE_INSIZE(char, uchar)
29 _CLC_VECTOR_SHUFFLE_INSIZE(short, ushort)
30 _CLC_VECTOR_SHUFFLE_INSIZE(int, uint)
31 _CLC_VECTOR_SHUFFLE_INSIZE(long, ulong)
32 _CLC_VECTOR_SHUFFLE_INSIZE(uchar, uchar)
33 _CLC_VECTOR_SHUFFLE_INSIZE(ushort, ushort)
34 _CLC_VECTOR_SHUFFLE_INSIZE(uint, uint)
35 _CLC_VECTOR_SHUFFLE_INSIZE(ulong, ulong)
36 _CLC_VECTOR_SHUFFLE_INSIZE(float, uint)
37 #ifdef cl_khr_fp64
38 _CLC_VECTOR_SHUFFLE_INSIZE(double, ulong)
39 #endif
40 #ifdef cl_khr_fp16
41 _CLC_VECTOR_SHUFFLE_INSIZE(half, ushort)
42 #endif
43 
44 #undef _CLC_SHUFFLE_DECL
45 #undef _CLC_VECTOR_SHUFFLE_MASKSIZE
46 #undef _CLC_VECTOR_SHUFFLE_INSIZE
47