rs_core.c revision 3ff0fe77fdba8ad4a920dc27157d8c1786bb3661
1#include "rs_core.rsh"
2#include "rs_structs.h"
3
4/* Function declarations from libRS */
5extern float4 __attribute__((overloadable)) convert_float4(uchar4 c);
6
7/* Implementation of Core Runtime */
8
9extern float4 rsUnpackColor8888(uchar4 c)
10{
11    return convert_float4(c) * 0.003921569f;
12}
13
14
15extern float __attribute__((overloadable)) rsClamp(float v, float l, float h) {
16    return clamp(v, l, h);
17}
18extern char __attribute__((overloadable)) rsClamp(char v, char l, char h) {
19    return clamp(v, l, h);
20}
21extern uchar __attribute__((overloadable)) rsClamp(uchar v, uchar l, uchar h) {
22    return clamp(v, l, h);
23}
24extern short __attribute__((overloadable)) rsClamp(short v, short l, short h) {
25    return clamp(v, l, h);
26}
27extern ushort __attribute__((overloadable)) rsClamp(ushort v, ushort l, ushort h) {
28    return clamp(v, l, h);
29}
30extern int __attribute__((overloadable)) rsClamp(int v, int l, int h) {
31    return clamp(v, l, h);
32}
33extern uint __attribute__((overloadable)) rsClamp(uint v, uint l, uint h) {
34    return clamp(v, l, h);
35}
36
37extern int32_t __attribute__((overloadable)) rsAtomicCas(volatile int32_t *ptr, int32_t expectedValue, int32_t newValue) {
38    return __sync_val_compare_and_swap(ptr, expectedValue, newValue);
39}
40
41extern uint32_t __attribute__((overloadable)) rsAtomicCas(volatile uint32_t *ptr, uint32_t expectedValue, uint32_t newValue) {
42    return __sync_val_compare_and_swap(ptr, expectedValue, newValue);
43}
44
45extern int32_t __attribute__((overloadable)) rsAtomicInc(volatile int32_t *ptr) {
46    return __sync_fetch_and_add(ptr, 1);
47}
48
49extern int32_t __attribute__((overloadable)) rsAtomicInc(volatile uint32_t *ptr) {
50    return __sync_fetch_and_add(ptr, 1);
51}
52
53extern int32_t __attribute__((overloadable)) rsAtomicDec(volatile int32_t *ptr) {
54    return __sync_fetch_and_sub(ptr, 1);
55}
56
57extern int32_t __attribute__((overloadable)) rsAtomicDec(volatile uint32_t *ptr) {
58    return __sync_fetch_and_sub(ptr, 1);
59}
60
61extern int32_t __attribute__((overloadable)) rsAtomicAdd(volatile int32_t *ptr, int32_t value) {
62    return __sync_fetch_and_add(ptr, value);
63}
64
65extern int32_t __attribute__((overloadable)) rsAtomicAdd(volatile uint32_t *ptr, uint32_t value) {
66    return __sync_fetch_and_add(ptr, value);
67}
68
69extern int32_t __attribute__((overloadable)) rsAtomicSub(volatile int32_t *ptr, int32_t value) {
70    return __sync_fetch_and_sub(ptr, value);
71}
72
73extern int32_t __attribute__((overloadable)) rsAtomicSub(volatile uint32_t *ptr, uint32_t value) {
74    return __sync_fetch_and_sub(ptr, value);
75}
76
77extern int32_t __attribute__((overloadable)) rsAtomicAnd(volatile int32_t *ptr, int32_t value) {
78    return __sync_fetch_and_and(ptr, value);
79}
80
81extern int32_t __attribute__((overloadable)) rsAtomicAnd(volatile uint32_t *ptr, uint32_t value) {
82    return __sync_fetch_and_and(ptr, value);
83}
84
85extern int32_t __attribute__((overloadable)) rsAtomicOr(volatile int32_t *ptr, int32_t value) {
86    return __sync_fetch_and_or(ptr, value);
87}
88
89extern int32_t __attribute__((overloadable)) rsAtomicOr(volatile uint32_t *ptr, uint32_t value) {
90    return __sync_fetch_and_or(ptr, value);
91}
92
93extern int32_t __attribute__((overloadable)) rsAtomicXor(volatile int32_t *ptr, int32_t value) {
94    return __sync_fetch_and_xor(ptr, value);
95}
96
97extern int32_t __attribute__((overloadable)) rsAtomicXor(volatile uint32_t *ptr, uint32_t value) {
98    return __sync_fetch_and_xor(ptr, value);
99}
100
101extern uint32_t __attribute__((overloadable)) min(uint32_t, uint32_t);
102extern int32_t __attribute__((overloadable)) min(int32_t, int32_t);
103extern uint32_t __attribute__((overloadable)) max(uint32_t, uint32_t);
104extern int32_t __attribute__((overloadable)) max(int32_t, int32_t);
105
106extern uint32_t __attribute__((overloadable)) rsAtomicMin(volatile uint32_t *ptr, uint32_t value) {
107    uint32_t prev, status;
108    do {
109        prev = *ptr;
110        uint32_t n = min(value, prev);
111        status = __sync_val_compare_and_swap(ptr, prev, n);
112    } while (status != prev);
113    return prev;
114}
115
116extern int32_t __attribute__((overloadable)) rsAtomicMin(volatile int32_t *ptr, int32_t value) {
117    int32_t prev, status;
118    do {
119        prev = *ptr;
120        int32_t n = min(value, prev);
121        status = __sync_val_compare_and_swap(ptr, prev, n);
122    } while (status != prev);
123    return prev;
124}
125
126extern uint32_t __attribute__((overloadable)) rsAtomicMax(volatile uint32_t *ptr, uint32_t value) {
127    uint32_t prev, status;
128    do {
129        prev = *ptr;
130        uint32_t n = max(value, prev);
131        status = __sync_val_compare_and_swap(ptr, prev, n);
132    } while (status != prev);
133    return prev;
134}
135
136extern int32_t __attribute__((overloadable)) rsAtomicMax(volatile int32_t *ptr, int32_t value) {
137    int32_t prev, status;
138    do {
139        prev = *ptr;
140        int32_t n = max(value, prev);
141        status = __sync_val_compare_and_swap(ptr, prev, n);
142    } while (status != prev);
143    return prev;
144}
145
146
147
148extern int32_t rand();
149#define RAND_MAX 0x7fffffff
150
151
152
153extern float __attribute__((overloadable)) rsRand(float min, float max);/* {
154    float r = (float)rand();
155    r /= RAND_MAX;
156    r = r * (max - min) + min;
157    return r;
158}
159*/
160
161extern float __attribute__((overloadable)) rsRand(float max) {
162    return rsRand(0.f, max);
163    //float r = (float)rand();
164    //r *= max;
165    //r /= RAND_MAX;
166    //return r;
167}
168
169extern int __attribute__((overloadable)) rsRand(int max) {
170    return (int)rsRand((float)max);
171}
172
173extern int __attribute__((overloadable)) rsRand(int min, int max) {
174    return (int)rsRand((float)min, (float)max);
175}
176
177#define PRIM_DEBUG(T)                               \
178extern void __attribute__((overloadable)) rsDebug(const char *, const T *);     \
179void __attribute__((overloadable)) rsDebug(const char *txt, T val) {            \
180    rsDebug(txt, &val);                                                         \
181}
182
183PRIM_DEBUG(char2)
184PRIM_DEBUG(char3)
185PRIM_DEBUG(char4)
186PRIM_DEBUG(uchar2)
187PRIM_DEBUG(uchar3)
188PRIM_DEBUG(uchar4)
189PRIM_DEBUG(short2)
190PRIM_DEBUG(short3)
191PRIM_DEBUG(short4)
192PRIM_DEBUG(ushort2)
193PRIM_DEBUG(ushort3)
194PRIM_DEBUG(ushort4)
195PRIM_DEBUG(int2)
196PRIM_DEBUG(int3)
197PRIM_DEBUG(int4)
198PRIM_DEBUG(uint2)
199PRIM_DEBUG(uint3)
200PRIM_DEBUG(uint4)
201PRIM_DEBUG(long2)
202PRIM_DEBUG(long3)
203PRIM_DEBUG(long4)
204PRIM_DEBUG(ulong2)
205PRIM_DEBUG(ulong3)
206PRIM_DEBUG(ulong4)
207PRIM_DEBUG(float2)
208PRIM_DEBUG(float3)
209PRIM_DEBUG(float4)
210PRIM_DEBUG(double2)
211PRIM_DEBUG(double3)
212PRIM_DEBUG(double4)
213
214#undef PRIM_DEBUG
215
216