1#include <clc/clc.h> 2 3#pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable 4 5#define VSTORE_VECTORIZE(PRIM_TYPE, ADDR_SPACE) \ 6 _CLC_OVERLOAD _CLC_DEF void vstore2(PRIM_TYPE##2 vec, size_t offset, ADDR_SPACE PRIM_TYPE *mem) { \ 7 mem[2*offset] = vec.s0; \ 8 mem[2*offset+1] = vec.s1; \ 9 } \ 10\ 11 _CLC_OVERLOAD _CLC_DEF void vstore3(PRIM_TYPE##3 vec, size_t offset, ADDR_SPACE PRIM_TYPE *mem) { \ 12 mem[3*offset] = vec.s0; \ 13 mem[3*offset+1] = vec.s1; \ 14 mem[3*offset+2] = vec.s2; \ 15 } \ 16\ 17 _CLC_OVERLOAD _CLC_DEF void vstore4(PRIM_TYPE##4 vec, size_t offset, ADDR_SPACE PRIM_TYPE *mem) { \ 18 vstore2(vec.lo, 0, &mem[offset*4]); \ 19 vstore2(vec.hi, 1, &mem[offset*4]); \ 20 } \ 21\ 22 _CLC_OVERLOAD _CLC_DEF void vstore8(PRIM_TYPE##8 vec, size_t offset, ADDR_SPACE PRIM_TYPE *mem) { \ 23 vstore4(vec.lo, 0, &mem[offset*8]); \ 24 vstore4(vec.hi, 1, &mem[offset*8]); \ 25 } \ 26\ 27 _CLC_OVERLOAD _CLC_DEF void vstore16(PRIM_TYPE##16 vec, size_t offset, ADDR_SPACE PRIM_TYPE *mem) { \ 28 vstore8(vec.lo, 0, &mem[offset*16]); \ 29 vstore8(vec.hi, 1, &mem[offset*16]); \ 30 } \ 31 32#define VSTORE_ADDR_SPACES(__CLC_SCALAR___CLC_GENTYPE) \ 33 VSTORE_VECTORIZE(__CLC_SCALAR___CLC_GENTYPE, __private) \ 34 VSTORE_VECTORIZE(__CLC_SCALAR___CLC_GENTYPE, __local) \ 35 VSTORE_VECTORIZE(__CLC_SCALAR___CLC_GENTYPE, __global) \ 36 37#define VSTORE_TYPES() \ 38 VSTORE_ADDR_SPACES(char) \ 39 VSTORE_ADDR_SPACES(uchar) \ 40 VSTORE_ADDR_SPACES(short) \ 41 VSTORE_ADDR_SPACES(ushort) \ 42 VSTORE_ADDR_SPACES(int) \ 43 VSTORE_ADDR_SPACES(uint) \ 44 VSTORE_ADDR_SPACES(long) \ 45 VSTORE_ADDR_SPACES(ulong) \ 46 VSTORE_ADDR_SPACES(float) \ 47 48VSTORE_TYPES() 49 50#ifdef cl_khr_fp64 51#pragma OPENCL EXTENSION cl_khr_fp64 : enable 52 VSTORE_ADDR_SPACES(double) 53#endif 54