1#pragma version(1)
2#pragma rs java_package_name(foo)
3
4struct S { int f; } ss;
5
6// accumulator types need not match; function names need not match
7#ifdef __LP64__
8#pragma rs reduce(aa) accumulator(aaAccum) combiner(aaCombAlpha) outconverter(aaOut)
9#else
10#pragma rs reduce(aa) accumulator(aaAccum) combiner(aaCombBeta) outconverter(aaOut)
11#endif
12static void aaAccum(size_t *a, int v) { }
13static void
14#ifdef __LP64__
15aaCombAlpha
16#else
17aaCombBeta
18#endif
19(size_t *a, const size_t *other) { }
20static void aaOut(int *out, const size_t *a) { }
21
22// which functions are present need not match; special arguments need not match
23#ifdef __LP64__
24#pragma rs reduce(bb) accumulator(bbAccum) combiner(bbComb) outconverter(bbOut)
25static void bbOut(int *out, const int *accum) { }
26#else
27#pragma rs reduce(bb) accumulator(bbAccum) combiner(bbComb)
28#endif
29static void bbAccum(int *a, int v,
30#ifdef __LP64__
31                    int x,
32#endif
33                    int y) { }
34static void bbComb(int *a, const int *b) { }
35
36// result type must match; ordinary argument types must match
37#pragma rs reduce(cc) accumulator(ccAccum) combiner(ccComb) outconverter(ccOut)
38static void ccAccum(int *accum, char i, size_t j, short k, size_t l) { }
39static void ccComb(int *accum, const int *other) { }
40static void ccOut(size_t *out, const int *accum) { }
41
42// accumulators must have same number of inputs
43#pragma rs reduce(dd) accumulator(ddAccum) combiner(ddComb)
44#ifdef __LP64__
45static void ddAccum(int *accum, char c) { }
46#else
47static void ddAccum(int *accum, short a, float b) { }
48#endif
49static void ddComb(int *accum, const int *other) { }
50
51// here, 32-bit kernel, 64-bit kernel, or both are not reflected in Java
52#pragma rs reduce(ee) accumulator(eeAccum) combiner(eeComb) outconverter(eeOut)
53#pragma rs reduce(ff) accumulator(ffAccum) combiner(ffComb) outconverter(ffOut)
54#pragma rs reduce(gg) accumulator(ggAccum) outconverter(ggOut)
55#ifdef __LP64__
56#define EETYPE struct S
57#define FFTYPE int
58#define FFINEXTRA int j
59#else
60#define EETYPE int
61#define FFTYPE struct S
62#define FFINEXTRA int j, int k
63#endif
64static void eeAccum(int *a, int v, size_t k) { }
65static void eeComb(int *a, const int *other) { }
66static void eeOut(EETYPE *out, const int *a) { }
67static void ffAccum(int *a, int v, FFINEXTRA) { }
68static void ffComb(int *a, const int *other) { }
69static void ffOut(FFTYPE *out, const int *a) { }
70static void ggAccum(size_t *a, size_t v) { }
71static void ggOut(struct S *out, const size_t *a) { }
72