Skip to content

Commit 99957c5

Browse files
authored
[SYCL-PTX] Implement remaining SPIR-V functions (#2014)
Add shuffle builtins (misc category) and missing bindings test for conversions and VectorTimesScalar. Signed-off-by: Victor Lomuller <[email protected]>
1 parent d129edd commit 99957c5

File tree

905 files changed

+37464
-102
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

905 files changed

+37464
-102
lines changed

libclc/generic/include/spirv/misc/shuffle.h

Lines changed: 0 additions & 46 deletions
This file was deleted.

libclc/generic/include/spirv/misc/shuffle2.h

Lines changed: 0 additions & 46 deletions
This file was deleted.

libclc/generic/include/spirv/spirv.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,6 @@
6767
#include <spirv/atomic/atomic_xchg.h>
6868
#include <spirv/atomic/atomic_xor.h>
6969

70-
/* cl_khr extension atomics are omitted from __spirv */
71-
72-
/* 6.12.12 Miscellaneous Vector Functions */
73-
#include <spirv/misc/shuffle.h>
74-
#include <spirv/misc/shuffle2.h>
75-
7670
/* 6.11.13 Image Read and Write Functions */
7771
#include <spirv/image/image_defines.h>
7872
#include <spirv/image/image.h>

libclc/generic/include/spirv/spirv_builtins.h

Lines changed: 819 additions & 0 deletions
Large diffs are not rendered by default.

libclc/generic/libspirv/SOURCES

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ math/tanh.cl
182182
math/tanpi.cl
183183
math/tgamma.cl
184184
math/trunc.cl
185+
misc/shuffle.cl
186+
misc/shuffle2.cl
185187
relational/all.cl
186188
relational/any.cl
187189
relational/bitselect.cl
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
//===----------------- generic/lib/misc/shuffle.cl ------------------------===//
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+
#include <spirv/spirv.h>
10+
11+
#define _CLC_ELEMENT_CASES2(VAR) \
12+
case 0: \
13+
return VAR.s0; \
14+
case 1: \
15+
return VAR.s1;
16+
17+
#define _CLC_ELEMENT_CASES4(VAR) \
18+
_CLC_ELEMENT_CASES2(VAR) \
19+
case 2: \
20+
return VAR.s2; \
21+
case 3: \
22+
return VAR.s3;
23+
24+
#define _CLC_ELEMENT_CASES8(VAR) \
25+
_CLC_ELEMENT_CASES4(VAR) \
26+
case 4: \
27+
return VAR.s4; \
28+
case 5: \
29+
return VAR.s5; \
30+
case 6: \
31+
return VAR.s6; \
32+
case 7: \
33+
return VAR.s7;
34+
35+
#define _CLC_ELEMENT_CASES16(VAR) \
36+
_CLC_ELEMENT_CASES8(VAR) \
37+
case 8: \
38+
return VAR.s8; \
39+
case 9: \
40+
return VAR.s9; \
41+
case 10: \
42+
return VAR.sA; \
43+
case 11: \
44+
return VAR.sB; \
45+
case 12: \
46+
return VAR.sC; \
47+
case 13: \
48+
return VAR.sD; \
49+
case 14: \
50+
return VAR.sE; \
51+
case 15: \
52+
return VAR.sF;
53+
54+
#define _CLC_GET_ELEMENT_DEFINE(ARGTYPE, ARGSIZE, IDXTYPE) \
55+
inline ARGTYPE __clc_get_el_##ARGTYPE##ARGSIZE##_##IDXTYPE( \
56+
ARGTYPE##ARGSIZE x, IDXTYPE idx) { \
57+
switch (idx) { _CLC_ELEMENT_CASES##ARGSIZE(x) default : return 0; } \
58+
}
59+
60+
#define _CLC_SHUFFLE_SET_ONE_ELEMENT(ARGTYPE, ARGSIZE, INDEX, MASKTYPE) \
61+
ret_val.s##INDEX = \
62+
__clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s##INDEX);
63+
64+
#define _CLC_SHUFFLE_SET_2_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE) \
65+
ret_val.s0 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s0); \
66+
ret_val.s1 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s1);
67+
68+
#define _CLC_SHUFFLE_SET_4_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE) \
69+
_CLC_SHUFFLE_SET_2_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE) \
70+
ret_val.s2 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s2); \
71+
ret_val.s3 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s3);
72+
73+
#define _CLC_SHUFFLE_SET_8_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE) \
74+
_CLC_SHUFFLE_SET_4_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE) \
75+
ret_val.s4 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s4); \
76+
ret_val.s5 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s5); \
77+
ret_val.s6 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s6); \
78+
ret_val.s7 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s7);
79+
80+
#define _CLC_SHUFFLE_SET_16_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE) \
81+
_CLC_SHUFFLE_SET_8_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE) \
82+
ret_val.s8 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s8); \
83+
ret_val.s9 = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.s9); \
84+
ret_val.sA = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.sA); \
85+
ret_val.sB = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.sB); \
86+
ret_val.sC = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.sC); \
87+
ret_val.sD = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.sD); \
88+
ret_val.sE = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.sE); \
89+
ret_val.sF = __clc_get_el_##ARGTYPE##ARGSIZE##_##MASKTYPE(x, mask.sF);
90+
91+
#define _CLC_SHUFFLE_DEFINE2(ARGTYPE, ARGSIZE, MASKTYPE) \
92+
_CLC_DEF _CLC_OVERLOAD ARGTYPE##2 __spirv_ocl_shuffle(ARGTYPE##ARGSIZE x, \
93+
MASKTYPE##2 mask) { \
94+
ARGTYPE##2 ret_val; \
95+
mask &= (MASKTYPE##2)(ARGSIZE - 1); \
96+
_CLC_SHUFFLE_SET_2_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE) \
97+
return ret_val; \
98+
}
99+
100+
#define _CLC_SHUFFLE_DEFINE4(ARGTYPE, ARGSIZE, MASKTYPE) \
101+
_CLC_DEF _CLC_OVERLOAD ARGTYPE##4 __spirv_ocl_shuffle(ARGTYPE##ARGSIZE x, \
102+
MASKTYPE##4 mask) { \
103+
ARGTYPE##4 ret_val; \
104+
mask &= (MASKTYPE##4)(ARGSIZE - 1); \
105+
_CLC_SHUFFLE_SET_4_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE) \
106+
return ret_val; \
107+
}
108+
109+
#define _CLC_SHUFFLE_DEFINE8(ARGTYPE, ARGSIZE, MASKTYPE) \
110+
_CLC_DEF _CLC_OVERLOAD ARGTYPE##8 __spirv_ocl_shuffle(ARGTYPE##ARGSIZE x, \
111+
MASKTYPE##8 mask) { \
112+
ARGTYPE##8 ret_val; \
113+
mask &= (MASKTYPE##8)(ARGSIZE - 1); \
114+
_CLC_SHUFFLE_SET_8_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE) \
115+
return ret_val; \
116+
}
117+
118+
#define _CLC_SHUFFLE_DEFINE16(ARGTYPE, ARGSIZE, MASKTYPE) \
119+
_CLC_DEF _CLC_OVERLOAD ARGTYPE##16 __spirv_ocl_shuffle(ARGTYPE##ARGSIZE x, \
120+
MASKTYPE##16 mask) { \
121+
ARGTYPE##16 ret_val; \
122+
mask &= (MASKTYPE##16)(ARGSIZE - 1); \
123+
_CLC_SHUFFLE_SET_16_ELEMENTS(ARGTYPE, ARGSIZE, MASKTYPE) \
124+
return ret_val; \
125+
}
126+
127+
#define _CLC_VECTOR_SHUFFLE_MASKSIZE(INTYPE, ARGSIZE, MASKTYPE) \
128+
_CLC_GET_ELEMENT_DEFINE(INTYPE, ARGSIZE, MASKTYPE) \
129+
_CLC_SHUFFLE_DEFINE2(INTYPE, ARGSIZE, MASKTYPE) \
130+
_CLC_SHUFFLE_DEFINE4(INTYPE, ARGSIZE, MASKTYPE) \
131+
_CLC_SHUFFLE_DEFINE8(INTYPE, ARGSIZE, MASKTYPE) \
132+
_CLC_SHUFFLE_DEFINE16(INTYPE, ARGSIZE, MASKTYPE)
133+
134+
#define _CLC_VECTOR_SHUFFLE_INSIZE(TYPE, MASKTYPE) \
135+
_CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, 2, MASKTYPE) \
136+
_CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, 4, MASKTYPE) \
137+
_CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, 8, MASKTYPE) \
138+
_CLC_VECTOR_SHUFFLE_MASKSIZE(TYPE, 16, MASKTYPE)
139+
140+
_CLC_VECTOR_SHUFFLE_INSIZE(char, uchar)
141+
_CLC_VECTOR_SHUFFLE_INSIZE(schar, uchar)
142+
_CLC_VECTOR_SHUFFLE_INSIZE(short, ushort)
143+
_CLC_VECTOR_SHUFFLE_INSIZE(int, uint)
144+
_CLC_VECTOR_SHUFFLE_INSIZE(long, ulong)
145+
_CLC_VECTOR_SHUFFLE_INSIZE(uchar, uchar)
146+
_CLC_VECTOR_SHUFFLE_INSIZE(ushort, ushort)
147+
_CLC_VECTOR_SHUFFLE_INSIZE(uint, uint)
148+
_CLC_VECTOR_SHUFFLE_INSIZE(ulong, ulong)
149+
_CLC_VECTOR_SHUFFLE_INSIZE(float, uint)
150+
#ifdef cl_khr_fp64
151+
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
152+
_CLC_VECTOR_SHUFFLE_INSIZE(double, ulong)
153+
#endif
154+
#ifdef cl_khr_fp16
155+
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
156+
_CLC_VECTOR_SHUFFLE_INSIZE(half, ushort)
157+
#endif
158+
159+
#undef _CLC_ELEMENT_CASES2
160+
#undef _CLC_ELEMENT_CASES4
161+
#undef _CLC_ELEMENT_CASES8
162+
#undef _CLC_ELEMENT_CASES16
163+
#undef _CLC_GET_ELEMENT_DEFINE
164+
#undef _CLC_SHUFFLE_SET_ONE_ELEMENT
165+
#undef _CLC_SHUFFLE_SET_2_ELEMENTS
166+
#undef _CLC_SHUFFLE_SET_4_ELEMENTS
167+
#undef _CLC_SHUFFLE_SET_8_ELEMENTS
168+
#undef _CLC_SHUFFLE_SET_16_ELEMENTS
169+
#undef _CLC_SHUFFLE_DEFINE2
170+
#undef _CLC_SHUFFLE_DEFINE4
171+
#undef _CLC_SHUFFLE_DEFINE8
172+
#undef _CLC_SHUFFLE_DEFINE16
173+
#undef _CLC_VECTOR_SHUFFLE_MASKSIZE
174+
#undef _CLC_VECTOR_SHUFFLE_INSIZE

0 commit comments

Comments
 (0)