1 /* OpenCL built-in library: vtables_macros.h
2 
3    Copyright (c) 2017 Michal Babej / Tampere University of Technology
4 
5    Permission is hereby granted, free of charge, to any person obtaining a copy
6    of this software and associated documentation files (the "Software"), to deal
7    in the Software without restriction, including without limitation the rights
8    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9    copies of the Software, and to permit persons to whom the Software is
10    furnished to do so, subject to the following conditions:
11 
12    The above copyright notice and this permission notice shall be included in
13    all copies or substantial portions of the Software.
14 
15    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21    THE SOFTWARE.
22 */
23 
24 
25 #define VTABLE_FUNCTION(TYPE,VTABLE,NAME)     \
26      _CL_OVERLOADABLE TYPE VTABLE_MANGLE(NAME)(uint idx) {   \
27         TYPE retval;                        \
28         retval = VTABLE[ idx ];          \
29         return retval;                      \
30     }\
31      _CL_OVERLOADABLE TYPE ## 2 VTABLE_MANGLE(NAME)(uint2 idx) {   \
32         TYPE ## 2 retval;                        \
33         retval.s0 = VTABLE [idx.s0];       \
34         retval.s1 = VTABLE [idx.s1];       \
35         return retval;                      \
36     }\
37      _CL_OVERLOADABLE TYPE ## 3 VTABLE_MANGLE(NAME)(uint3 idx) {   \
38         TYPE ## 3 retval;                        \
39         retval.s0 = VTABLE [idx.s0];       \
40         retval.s1 = VTABLE [idx.s1];       \
41         retval.s2 = VTABLE [idx.s2];       \
42         return retval;                      \
43     }\
44      _CL_OVERLOADABLE TYPE ## 4 VTABLE_MANGLE(NAME)(uint4 idx) {   \
45         TYPE ## 4 retval;                        \
46         retval.s0 = VTABLE [idx.s0];       \
47         retval.s1 = VTABLE [idx.s1];       \
48         retval.s2 = VTABLE [idx.s2];       \
49         retval.s3 = VTABLE [idx.s3];       \
50         return retval;                      \
51     }\
52      _CL_OVERLOADABLE TYPE ## 8 VTABLE_MANGLE(NAME)(uint8 idx) {   \
53         TYPE ## 8 retval;                        \
54         retval.s0 = VTABLE [idx.s0];       \
55         retval.s1 = VTABLE [idx.s1];       \
56         retval.s2 = VTABLE [idx.s2];       \
57         retval.s3 = VTABLE [idx.s3];       \
58         retval.s4 = VTABLE [idx.s4];       \
59         retval.s5 = VTABLE [idx.s5];       \
60         retval.s6 = VTABLE [idx.s6];       \
61         retval.s7 = VTABLE [idx.s7];       \
62         return retval;                      \
63     }\
64      _CL_OVERLOADABLE TYPE ## 16 VTABLE_MANGLE(NAME)(uint16 idx) {   \
65         TYPE ## 16 retval;                        \
66         retval.s0 = VTABLE [idx.s0];       \
67         retval.s1 = VTABLE [idx.s1];       \
68         retval.s2 = VTABLE [idx.s2];       \
69         retval.s3 = VTABLE [idx.s3];       \
70         retval.s4 = VTABLE [idx.s4];       \
71         retval.s5 = VTABLE [idx.s5];       \
72         retval.s6 = VTABLE [idx.s6];       \
73         retval.s7 = VTABLE [idx.s7];       \
74         retval.s8 = VTABLE [idx.s8];       \
75         retval.s9 = VTABLE [idx.s9];       \
76         retval.sA = VTABLE [idx.sA];       \
77         retval.sB = VTABLE [idx.sB];       \
78         retval.sC = VTABLE [idx.sC];       \
79         retval.sD = VTABLE [idx.sD];       \
80         retval.sE = VTABLE [idx.sE];       \
81         retval.sF = VTABLE [idx.sF];       \
82         return retval;                      \
83     }
84 
85 
86 
87 
88 
89 #define VTABLE_FUNCTION2(TYPE,VTABLE,NAME)     \
90      _CL_OVERLOADABLE TYPE VTABLE_MANGLE(NAME)(uint idx) {   \
91         TYPE retval;                        \
92         retval.lo = VTABLE[ idx ].lo;             \
93         retval.hi = VTABLE[ idx ].hi;             \
94         return retval;                      \
95     }\
96      _CL_OVERLOADABLE TYPE ## 2 VTABLE_MANGLE(NAME)(uint2 idx) {   \
97         TYPE ## 2 retval;                        \
98         retval.lo.s0 = VTABLE [idx.s0].lo; retval.hi.s0 = VTABLE [idx.s0].hi;       \
99         retval.lo.s1 = VTABLE [idx.s1].lo; retval.hi.s1 = VTABLE [idx.s1].hi;       \
100         return retval;                      \
101     }\
102      _CL_OVERLOADABLE TYPE ## 3 VTABLE_MANGLE(NAME)(uint3 idx) {   \
103         TYPE ## 3 retval;                        \
104         retval.lo.s0 = VTABLE [idx.s0].lo; retval.hi.s0 = VTABLE [idx.s0].hi;       \
105         retval.lo.s1 = VTABLE [idx.s1].lo; retval.hi.s1 = VTABLE [idx.s1].hi;       \
106         retval.lo.s2 = VTABLE [idx.s2].lo; retval.hi.s2 = VTABLE [idx.s2].hi;       \
107         return retval;                      \
108     }\
109      _CL_OVERLOADABLE TYPE ## 4 VTABLE_MANGLE(NAME)(uint4 idx) {   \
110         TYPE ## 4 retval;                        \
111         retval.lo.s0 = VTABLE [idx.s0].lo; retval.hi.s0 = VTABLE [idx.s0].hi;       \
112         retval.lo.s1 = VTABLE [idx.s1].lo; retval.hi.s1 = VTABLE [idx.s1].hi;       \
113         retval.lo.s2 = VTABLE [idx.s2].lo; retval.hi.s2 = VTABLE [idx.s2].hi;       \
114         retval.lo.s3 = VTABLE [idx.s3].lo; retval.hi.s3 = VTABLE [idx.s3].hi;       \
115         return retval;                      \
116     }\
117      _CL_OVERLOADABLE TYPE ## 8 VTABLE_MANGLE(NAME)(uint8 idx) {   \
118         TYPE ## 8 retval;                        \
119         retval.lo.s0 = VTABLE [idx.s0].lo; retval.hi.s0 = VTABLE [idx.s0].hi;       \
120         retval.lo.s1 = VTABLE [idx.s1].lo; retval.hi.s1 = VTABLE [idx.s1].hi;       \
121         retval.lo.s2 = VTABLE [idx.s2].lo; retval.hi.s2 = VTABLE [idx.s2].hi;       \
122         retval.lo.s3 = VTABLE [idx.s3].lo; retval.hi.s3 = VTABLE [idx.s3].hi;       \
123         retval.lo.s4 = VTABLE [idx.s4].lo; retval.hi.s4 = VTABLE [idx.s4].hi;       \
124         retval.lo.s5 = VTABLE [idx.s5].lo; retval.hi.s5 = VTABLE [idx.s5].hi;       \
125         retval.lo.s6 = VTABLE [idx.s6].lo; retval.hi.s6 = VTABLE [idx.s6].hi;       \
126         retval.lo.s7 = VTABLE [idx.s7].lo; retval.hi.s7 = VTABLE [idx.s7].hi;       \
127         return retval;                      \
128     }\
129      _CL_OVERLOADABLE TYPE ## 16 VTABLE_MANGLE(NAME)(uint16 idx) {   \
130         TYPE ## 16 retval;                        \
131         retval.lo.s0 = VTABLE [idx.s0].lo; retval.hi.s0 = VTABLE [idx.s0].hi;       \
132         retval.lo.s1 = VTABLE [idx.s1].lo; retval.hi.s1 = VTABLE [idx.s1].hi;       \
133         retval.lo.s2 = VTABLE [idx.s2].lo; retval.hi.s2 = VTABLE [idx.s2].hi;       \
134         retval.lo.s3 = VTABLE [idx.s3].lo; retval.hi.s3 = VTABLE [idx.s3].hi;       \
135         retval.lo.s4 = VTABLE [idx.s4].lo; retval.hi.s4 = VTABLE [idx.s4].hi;       \
136         retval.lo.s5 = VTABLE [idx.s5].lo; retval.hi.s5 = VTABLE [idx.s5].hi;       \
137         retval.lo.s6 = VTABLE [idx.s6].lo; retval.hi.s6 = VTABLE [idx.s6].hi;       \
138         retval.lo.s7 = VTABLE [idx.s7].lo; retval.hi.s7 = VTABLE [idx.s7].hi;       \
139         retval.lo.s8 = VTABLE [idx.s8].lo; retval.hi.s8 = VTABLE [idx.s8].hi;       \
140         retval.lo.s9 = VTABLE [idx.s9].lo; retval.hi.s9 = VTABLE [idx.s9].hi;       \
141         retval.lo.sA = VTABLE [idx.sA].lo; retval.hi.sA = VTABLE [idx.sA].hi;       \
142         retval.lo.sB = VTABLE [idx.sB].lo; retval.hi.sB = VTABLE [idx.sB].hi;       \
143         retval.lo.sC = VTABLE [idx.sC].lo; retval.hi.sC = VTABLE [idx.sC].hi;       \
144         retval.lo.sD = VTABLE [idx.sD].lo; retval.hi.sD = VTABLE [idx.sD].hi;       \
145         retval.lo.sE = VTABLE [idx.sE].lo; retval.hi.sE = VTABLE [idx.sE].hi;       \
146         retval.lo.sF = VTABLE [idx.sF].lo; retval.hi.sF = VTABLE [idx.sF].hi;       \
147         return retval;                      \
148     }
149 
150 
151 
152 
153 #define VTABLE_FUNCTION4(VTABLE,NAME)     \
154      _CL_OVERLOADABLE v4uint VTABLE_MANGLE(NAME)(uint idx) {   \
155         v4uint retval;                      \
156         retval = *(__constant v4uint *)(VTABLE + idx);             \
157         return retval;                      \
158     }\
159      _CL_OVERLOADABLE v4uint2 VTABLE_MANGLE(NAME)(uint2 idx) {   \
160         v4uint2 retval; uint4 tmp;                       \
161         tmp = *(__constant uint4 *)(VTABLE + idx.s0); retval.s0.s0 = tmp.s0; retval.s1.s0 = tmp.s1; retval.s2.s0 = tmp.s2; retval.s3.s0 = tmp.s3;       \
162         tmp = *(__constant uint4 *)(VTABLE + idx.s1); retval.s0.s1 = tmp.s0; retval.s1.s1 = tmp.s1; retval.s2.s1 = tmp.s2; retval.s3.s1 = tmp.s3;       \
163         return retval;                      \
164     }\
165      _CL_OVERLOADABLE v4uint3 VTABLE_MANGLE(NAME)(uint3 idx) {   \
166         v4uint3 retval; uint4 tmp;                       \
167         tmp = *(__constant uint4 *)(VTABLE + idx.s0); retval.s0.s0 = tmp.s0; retval.s1.s0 = tmp.s1; retval.s2.s0 = tmp.s2; retval.s3.s0 = tmp.s3;       \
168         tmp = *(__constant uint4 *)(VTABLE + idx.s1); retval.s0.s1 = tmp.s0; retval.s1.s1 = tmp.s1; retval.s2.s1 = tmp.s2; retval.s3.s1 = tmp.s3;       \
169         tmp = *(__constant uint4 *)(VTABLE + idx.s2); retval.s0.s2 = tmp.s0; retval.s1.s2 = tmp.s1; retval.s2.s2 = tmp.s2; retval.s3.s2 = tmp.s3;       \
170         return retval;                      \
171     }\
172      _CL_OVERLOADABLE v4uint4 VTABLE_MANGLE(NAME)(uint4 idx) {   \
173         v4uint4 retval; uint4 tmp;                       \
174         tmp = *(__constant uint4 *)(VTABLE + idx.s0); retval.s0.s0 = tmp.s0; retval.s1.s0 = tmp.s1; retval.s2.s0 = tmp.s2; retval.s3.s0 = tmp.s3;       \
175         tmp = *(__constant uint4 *)(VTABLE + idx.s1); retval.s0.s1 = tmp.s0; retval.s1.s1 = tmp.s1; retval.s2.s1 = tmp.s2; retval.s3.s1 = tmp.s3;       \
176         tmp = *(__constant uint4 *)(VTABLE + idx.s2); retval.s0.s2 = tmp.s0; retval.s1.s2 = tmp.s1; retval.s2.s2 = tmp.s2; retval.s3.s2 = tmp.s3;       \
177         tmp = *(__constant uint4 *)(VTABLE + idx.s3); retval.s0.s3 = tmp.s0; retval.s1.s3 = tmp.s1; retval.s2.s3 = tmp.s2; retval.s3.s3 = tmp.s3;       \
178         return retval;                      \
179     }\
180      _CL_OVERLOADABLE v4uint8 VTABLE_MANGLE(NAME)(uint8 idx) {   \
181         v4uint8 retval; uint4 tmp;                        \
182         tmp = *(__constant uint4 *)(VTABLE + idx.s0); retval.s0.s0 = tmp.s0; retval.s1.s0 = tmp.s1; retval.s2.s0 = tmp.s2; retval.s3.s0 = tmp.s3;       \
183         tmp = *(__constant uint4 *)(VTABLE + idx.s1); retval.s0.s1 = tmp.s0; retval.s1.s1 = tmp.s1; retval.s2.s1 = tmp.s2; retval.s3.s1 = tmp.s3;       \
184         tmp = *(__constant uint4 *)(VTABLE + idx.s2); retval.s0.s2 = tmp.s0; retval.s1.s2 = tmp.s1; retval.s2.s2 = tmp.s2; retval.s3.s2 = tmp.s3;       \
185         tmp = *(__constant uint4 *)(VTABLE + idx.s3); retval.s0.s3 = tmp.s0; retval.s1.s3 = tmp.s1; retval.s2.s3 = tmp.s2; retval.s3.s3 = tmp.s3;       \
186         tmp = *(__constant uint4 *)(VTABLE + idx.s4); retval.s0.s4 = tmp.s0; retval.s1.s4 = tmp.s1; retval.s2.s4 = tmp.s2; retval.s3.s4 = tmp.s3;       \
187         tmp = *(__constant uint4 *)(VTABLE + idx.s5); retval.s0.s5 = tmp.s0; retval.s1.s5 = tmp.s1; retval.s2.s5 = tmp.s2; retval.s3.s5 = tmp.s3;       \
188         tmp = *(__constant uint4 *)(VTABLE + idx.s6); retval.s0.s6 = tmp.s0; retval.s1.s6 = tmp.s1; retval.s2.s6 = tmp.s2; retval.s3.s6 = tmp.s3;       \
189         tmp = *(__constant uint4 *)(VTABLE + idx.s7); retval.s0.s7 = tmp.s0; retval.s1.s7 = tmp.s1; retval.s2.s7 = tmp.s2; retval.s3.s7 = tmp.s3;       \
190         return retval;                      \
191     }\
192      _CL_OVERLOADABLE v4uint16 VTABLE_MANGLE(NAME)(uint16 idx) {   \
193         v4uint16 retval; uint4 tmp;                        \
194         tmp = *(__constant uint4 *)(VTABLE + idx.s0); retval.s0.s0 = tmp.s0; retval.s1.s0 = tmp.s1; retval.s2.s0 = tmp.s2; retval.s3.s0 = tmp.s3;       \
195         tmp = *(__constant uint4 *)(VTABLE + idx.s1); retval.s0.s1 = tmp.s0; retval.s1.s1 = tmp.s1; retval.s2.s1 = tmp.s2; retval.s3.s1 = tmp.s3;       \
196         tmp = *(__constant uint4 *)(VTABLE + idx.s2); retval.s0.s2 = tmp.s0; retval.s1.s2 = tmp.s1; retval.s2.s2 = tmp.s2; retval.s3.s2 = tmp.s3;       \
197         tmp = *(__constant uint4 *)(VTABLE + idx.s3); retval.s0.s3 = tmp.s0; retval.s1.s3 = tmp.s1; retval.s2.s3 = tmp.s2; retval.s3.s3 = tmp.s3;       \
198         tmp = *(__constant uint4 *)(VTABLE + idx.s4); retval.s0.s4 = tmp.s0; retval.s1.s4 = tmp.s1; retval.s2.s4 = tmp.s2; retval.s3.s4 = tmp.s3;       \
199         tmp = *(__constant uint4 *)(VTABLE + idx.s5); retval.s0.s5 = tmp.s0; retval.s1.s5 = tmp.s1; retval.s2.s5 = tmp.s2; retval.s3.s5 = tmp.s3;       \
200         tmp = *(__constant uint4 *)(VTABLE + idx.s6); retval.s0.s6 = tmp.s0; retval.s1.s6 = tmp.s1; retval.s2.s6 = tmp.s2; retval.s3.s6 = tmp.s3;       \
201         tmp = *(__constant uint4 *)(VTABLE + idx.s7); retval.s0.s7 = tmp.s0; retval.s1.s7 = tmp.s1; retval.s2.s7 = tmp.s2; retval.s3.s7 = tmp.s3;       \
202         tmp = *(__constant uint4 *)(VTABLE + idx.s8); retval.s0.s8 = tmp.s0; retval.s1.s8 = tmp.s1; retval.s2.s8 = tmp.s2; retval.s3.s8 = tmp.s3;       \
203         tmp = *(__constant uint4 *)(VTABLE + idx.s9); retval.s0.s9 = tmp.s0; retval.s1.s9 = tmp.s1; retval.s2.s9 = tmp.s2; retval.s3.s9 = tmp.s3;       \
204         tmp = *(__constant uint4 *)(VTABLE + idx.sA); retval.s0.sA = tmp.s0; retval.s1.sA = tmp.s1; retval.s2.sA = tmp.s2; retval.s3.sA = tmp.s3;       \
205         tmp = *(__constant uint4 *)(VTABLE + idx.sB); retval.s0.sB = tmp.s0; retval.s1.sB = tmp.s1; retval.s2.sB = tmp.s2; retval.s3.sB = tmp.s3;       \
206         tmp = *(__constant uint4 *)(VTABLE + idx.sC); retval.s0.sC = tmp.s0; retval.s1.sC = tmp.s1; retval.s2.sC = tmp.s2; retval.s3.sC = tmp.s3;       \
207         tmp = *(__constant uint4 *)(VTABLE + idx.sD); retval.s0.sD = tmp.s0; retval.s1.sD = tmp.s1; retval.s2.sD = tmp.s2; retval.s3.sD = tmp.s3;       \
208         tmp = *(__constant uint4 *)(VTABLE + idx.sE); retval.s0.sE = tmp.s0; retval.s1.sE = tmp.s1; retval.s2.sE = tmp.s2; retval.s3.sE = tmp.s3;       \
209         tmp = *(__constant uint4 *)(VTABLE + idx.sF); retval.s0.sF = tmp.s0; retval.s1.sF = tmp.s1; retval.s2.sF = tmp.s2; retval.s3.sF = tmp.s3;       \
210         return retval;                      \
211     }
212