blob: e88ccc532430ccc923a99dcef74a5837ea9dd043 [file] [log] [blame]
Tom Stellard51441f82013-06-26 18:22:11 +00001#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[offset] = vec.s0; \
8 mem[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[offset] = vec.s0; \
13 mem[offset+1] = vec.s1; \
14 mem[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 mem[offset] = vec.s0; \
19 mem[offset+1] = vec.s1; \
20 mem[offset+2] = vec.s2; \
21 mem[offset+3] = vec.s3; \
22 } \
23\
24 _CLC_OVERLOAD _CLC_DEF void vstore8(PRIM_TYPE##8 vec, size_t offset, ADDR_SPACE PRIM_TYPE *mem) { \
25 vstore4(vec.lo, offset, mem); \
26 vstore4(vec.hi, offset+4, mem); \
27 } \
28\
29 _CLC_OVERLOAD _CLC_DEF void vstore16(PRIM_TYPE##16 vec, size_t offset, ADDR_SPACE PRIM_TYPE *mem) { \
30 vstore8(vec.lo, offset, mem); \
31 vstore8(vec.hi, offset+8, mem); \
32 } \
33
34#define VSTORE_ADDR_SPACES(SCALAR_GENTYPE) \
35 VSTORE_VECTORIZE(SCALAR_GENTYPE, __private) \
36 VSTORE_VECTORIZE(SCALAR_GENTYPE, __local) \
37 VSTORE_VECTORIZE(SCALAR_GENTYPE, __global) \
38
39#define VSTORE_TYPES() \
40 VSTORE_ADDR_SPACES(char) \
41 VSTORE_ADDR_SPACES(uchar) \
42 VSTORE_ADDR_SPACES(short) \
43 VSTORE_ADDR_SPACES(ushort) \
44 VSTORE_ADDR_SPACES(int) \
45 VSTORE_ADDR_SPACES(uint) \
46 VSTORE_ADDR_SPACES(long) \
47 VSTORE_ADDR_SPACES(ulong) \
48 VSTORE_ADDR_SPACES(float) \
49
50VSTORE_TYPES()
51
52#ifdef cl_khr_fp64
53#pragma OPENCL EXTENSION cl_khr_fp64 : enable
54 VSTORE_ADDR_SPACES(double)
55#endif
56