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