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