blob: 3c0496d08e3f75a87e6f93d1593f480883cce332 [file] [log] [blame]
Jason Sams1b937f52010-06-09 14:26:16 -07001#ifndef __RS_CL_RSH__
2#define __RS_CL_RSH__
3
Stephen Hinesf6a28c62011-01-18 16:53:19 -08004#ifdef BCC_PREPARE_BC
5#define _RS_STATIC extern
6#else
7#define _RS_STATIC static
8#endif
Jason Sams1b937f52010-06-09 14:26:16 -07009
Jason Sams1b937f52010-06-09 14:26:16 -070010// Conversions
Stephen Hines47b15302011-01-19 18:06:34 -080011#define CVT_FUNC_2(typeout, typein) \
12_RS_STATIC typeout##2 __attribute__((overloadable)) \
13 convert_##typeout##2(typein##2 v) { \
14 typeout##2 r = {(typeout)v.x, (typeout)v.y}; \
15 return r; \
16} \
17_RS_STATIC typeout##3 __attribute__((overloadable)) \
18 convert_##typeout##3(typein##3 v) { \
19 typeout##3 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z}; \
20 return r; \
21} \
22_RS_STATIC typeout##4 __attribute__((overloadable)) \
23 convert_##typeout##4(typein##4 v) { \
24 typeout##4 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z, \
25 (typeout)v.w}; \
26 return r; \
Jason Sams1b937f52010-06-09 14:26:16 -070027}
28
Stephen Hines47b15302011-01-19 18:06:34 -080029#define CVT_FUNC(type) CVT_FUNC_2(type, uchar) \
30 CVT_FUNC_2(type, char) \
31 CVT_FUNC_2(type, ushort) \
32 CVT_FUNC_2(type, short) \
33 CVT_FUNC_2(type, uint) \
34 CVT_FUNC_2(type, int) \
35 CVT_FUNC_2(type, float)
Jason Sams1b937f52010-06-09 14:26:16 -070036
37CVT_FUNC(char)
38CVT_FUNC(uchar)
39CVT_FUNC(short)
40CVT_FUNC(ushort)
41CVT_FUNC(int)
42CVT_FUNC(uint)
43CVT_FUNC(float)
44
Jason Sams22fa3712010-05-19 17:22:57 -070045// Float ops, 6.11.2
46
Stephen Hines47b15302011-01-19 18:06:34 -080047#define FN_FUNC_FN(fnc) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080048_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v) { \
Stephen Hines47b15302011-01-19 18:06:34 -080049 float2 r; \
50 r.x = fnc(v.x); \
51 r.y = fnc(v.y); \
52 return r; \
53} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080054_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v) { \
Stephen Hines47b15302011-01-19 18:06:34 -080055 float3 r; \
56 r.x = fnc(v.x); \
57 r.y = fnc(v.y); \
58 r.z = fnc(v.z); \
59 return r; \
60} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080061_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v) { \
Stephen Hines47b15302011-01-19 18:06:34 -080062 float4 r; \
63 r.x = fnc(v.x); \
64 r.y = fnc(v.y); \
65 r.z = fnc(v.z); \
66 r.w = fnc(v.w); \
67 return r; \
Jason Sams1b937f52010-06-09 14:26:16 -070068}
69
Stephen Hines47b15302011-01-19 18:06:34 -080070#define IN_FUNC_FN(fnc) \
71_RS_STATIC int2 __attribute__((overloadable)) fnc(float2 v) { \
72 int2 r; \
73 r.x = fnc(v.x); \
74 r.y = fnc(v.y); \
75 return r; \
76} \
77_RS_STATIC int3 __attribute__((overloadable)) fnc(float3 v) { \
78 int3 r; \
79 r.x = fnc(v.x); \
80 r.y = fnc(v.y); \
81 r.z = fnc(v.z); \
82 return r; \
83} \
84_RS_STATIC int4 __attribute__((overloadable)) fnc(float4 v) { \
85 int4 r; \
86 r.x = fnc(v.x); \
87 r.y = fnc(v.y); \
88 r.z = fnc(v.z); \
89 r.w = fnc(v.w); \
90 return r; \
Stephen Hines47416532011-01-11 14:38:18 -080091}
92
Stephen Hines47b15302011-01-19 18:06:34 -080093#define FN_FUNC_FN_FN(fnc) \
Stephen Hinesf6a28c62011-01-18 16:53:19 -080094_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2) { \
Stephen Hines47b15302011-01-19 18:06:34 -080095 float2 r; \
96 r.x = fnc(v1.x, v2.x); \
97 r.y = fnc(v1.y, v2.y); \
98 return r; \
99} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800100_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float3 v2) { \
Stephen Hines47b15302011-01-19 18:06:34 -0800101 float3 r; \
102 r.x = fnc(v1.x, v2.x); \
103 r.y = fnc(v1.y, v2.y); \
104 r.z = fnc(v1.z, v2.z); \
105 return r; \
106} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800107_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2) { \
Stephen Hines47b15302011-01-19 18:06:34 -0800108 float4 r; \
109 r.x = fnc(v1.x, v2.x); \
110 r.y = fnc(v1.y, v2.y); \
111 r.z = fnc(v1.z, v2.z); \
112 r.w = fnc(v1.w, v2.w); \
113 return r; \
Jason Sams1b937f52010-06-09 14:26:16 -0700114}
115
Stephen Hines47b15302011-01-19 18:06:34 -0800116#define FN_FUNC_FN_F(fnc) \
117_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float v2) { \
118 float2 r; \
119 r.x = fnc(v1.x, v2); \
120 r.y = fnc(v1.y, v2); \
121 return r; \
122} \
123_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float v2) { \
124 float3 r; \
125 r.x = fnc(v1.x, v2); \
126 r.y = fnc(v1.y, v2); \
127 r.z = fnc(v1.z, v2); \
128 return r; \
129} \
130_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float v2) { \
131 float4 r; \
132 r.x = fnc(v1.x, v2); \
133 r.y = fnc(v1.y, v2); \
134 r.z = fnc(v1.z, v2); \
135 r.w = fnc(v1.w, v2); \
136 return r; \
Jason Sams1b937f52010-06-09 14:26:16 -0700137}
138
Stephen Hines47b15302011-01-19 18:06:34 -0800139#define FN_FUNC_FN_IN(fnc) \
140_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, int2 v2) { \
141 float2 r; \
142 r.x = fnc(v1.x, v2.x); \
143 r.y = fnc(v1.y, v2.y); \
144 return r; \
145} \
146_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, int3 v2) { \
147 float3 r; \
148 r.x = fnc(v1.x, v2.x); \
149 r.y = fnc(v1.y, v2.y); \
150 r.z = fnc(v1.z, v2.z); \
151 return r; \
152} \
153_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, int4 v2) { \
154 float4 r; \
155 r.x = fnc(v1.x, v2.x); \
156 r.y = fnc(v1.y, v2.y); \
157 r.z = fnc(v1.z, v2.z); \
158 r.w = fnc(v1.w, v2.w); \
159 return r; \
Stephen Hines3e6482f2011-01-19 12:51:33 -0800160}
161
Stephen Hines47b15302011-01-19 18:06:34 -0800162#define FN_FUNC_FN_I(fnc) \
163_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, int v2) { \
164 float2 r; \
165 r.x = fnc(v1.x, v2); \
166 r.y = fnc(v1.y, v2); \
167 return r; \
168} \
169_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, int v2) { \
170 float3 r; \
171 r.x = fnc(v1.x, v2); \
172 r.y = fnc(v1.y, v2); \
173 r.z = fnc(v1.z, v2); \
174 return r; \
175} \
176_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, int v2) { \
177 float4 r; \
178 r.x = fnc(v1.x, v2); \
179 r.y = fnc(v1.y, v2); \
180 r.z = fnc(v1.z, v2); \
181 r.w = fnc(v1.w, v2); \
182 return r; \
Stephen Hines3e6482f2011-01-19 12:51:33 -0800183}
184
Stephen Hines47b15302011-01-19 18:06:34 -0800185#define FN_FUNC_FN_PFN(fnc) \
186_RS_STATIC float2 __attribute__((overloadable)) \
187 fnc(float2 v1, float2 *v2) { \
188 float2 r; \
189 float t[2]; \
190 r.x = fnc(v1.x, &t[0]); \
191 r.y = fnc(v1.y, &t[1]); \
192 v2->x = t[0]; \
193 v2->y = t[1]; \
194 return r; \
195} \
196_RS_STATIC float3 __attribute__((overloadable)) \
197 fnc(float3 v1, float3 *v2) { \
198 float3 r; \
199 float t[3]; \
200 r.x = fnc(v1.x, &t[0]); \
201 r.y = fnc(v1.y, &t[1]); \
202 r.z = fnc(v1.z, &t[2]); \
203 v2->x = t[0]; \
204 v2->y = t[1]; \
205 v2->z = t[2]; \
206 return r; \
207} \
208_RS_STATIC float4 __attribute__((overloadable)) \
209 fnc(float4 v1, float4 *v2) { \
210 float4 r; \
211 float t[4]; \
212 r.x = fnc(v1.x, &t[0]); \
213 r.y = fnc(v1.y, &t[1]); \
214 r.z = fnc(v1.z, &t[2]); \
215 r.w = fnc(v1.w, &t[3]); \
216 v2->x = t[0]; \
217 v2->y = t[1]; \
218 v2->z = t[2]; \
219 v2->w = t[3]; \
220 return r; \
Stephen Hines32086d82011-01-18 19:39:29 -0800221}
Jason Sams1b937f52010-06-09 14:26:16 -0700222
Stephen Hines47b15302011-01-19 18:06:34 -0800223#define FN_FUNC_FN_PIN(fnc) \
224_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, int2 *v2) { \
225 float2 r; \
226 int t[2]; \
227 r.x = fnc(v1.x, &t[0]); \
228 r.y = fnc(v1.y, &t[1]); \
229 v2->x = t[0]; \
230 v2->y = t[1]; \
231 return r; \
232} \
233_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, int3 *v2) { \
234 float3 r; \
235 int t[3]; \
236 r.x = fnc(v1.x, &t[0]); \
237 r.y = fnc(v1.y, &t[1]); \
238 r.z = fnc(v1.z, &t[2]); \
239 v2->x = t[0]; \
240 v2->y = t[1]; \
241 v2->z = t[2]; \
242 return r; \
243} \
244_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, int4 *v2) { \
245 float4 r; \
246 int t[4]; \
247 r.x = fnc(v1.x, &t[0]); \
248 r.y = fnc(v1.y, &t[1]); \
249 r.z = fnc(v1.z, &t[2]); \
250 r.w = fnc(v1.w, &t[3]); \
251 v2->x = t[0]; \
252 v2->y = t[1]; \
253 v2->z = t[2]; \
254 v2->w = t[3]; \
255 return r; \
Stephen Hines3e6482f2011-01-19 12:51:33 -0800256}
257
Stephen Hines47b15302011-01-19 18:06:34 -0800258#define FN_FUNC_FN_FN_FN(fnc) \
259_RS_STATIC float2 __attribute__((overloadable)) \
260 fnc(float2 v1, float2 v2, float2 v3) { \
261 float2 r; \
262 r.x = fnc(v1.x, v2.x, v3.x); \
263 r.y = fnc(v1.y, v2.y, v3.y); \
264 return r; \
265} \
266_RS_STATIC float3 __attribute__((overloadable)) \
267 fnc(float3 v1, float3 v2, float3 v3) { \
268 float3 r; \
269 r.x = fnc(v1.x, v2.x, v3.x); \
270 r.y = fnc(v1.y, v2.y, v3.y); \
271 r.z = fnc(v1.z, v2.z, v3.z); \
272 return r; \
273} \
274_RS_STATIC float4 __attribute__((overloadable)) \
275 fnc(float4 v1, float4 v2, float4 v3) { \
276 float4 r; \
277 r.x = fnc(v1.x, v2.x, v3.x); \
278 r.y = fnc(v1.y, v2.y, v3.y); \
279 r.z = fnc(v1.z, v2.z, v3.z); \
280 r.w = fnc(v1.w, v2.w, v3.w); \
281 return r; \
Stephen Hines3e6482f2011-01-19 12:51:33 -0800282}
283
Stephen Hines47b15302011-01-19 18:06:34 -0800284#define FN_FUNC_FN_FN_PIN(fnc) \
285_RS_STATIC float2 __attribute__((overloadable)) \
286 fnc(float2 v1, float2 v2, int2 *v3) { \
287 float2 r; \
288 int t[2]; \
289 r.x = fnc(v1.x, v2.x, &t[0]); \
290 r.y = fnc(v1.y, v2.y, &t[1]); \
291 v3->x = t[0]; \
292 v3->y = t[1]; \
293 return r; \
294} \
295_RS_STATIC float3 __attribute__((overloadable)) \
296 fnc(float3 v1, float3 v2, int3 *v3) { \
297 float3 r; \
298 int t[3]; \
299 r.x = fnc(v1.x, v2.x, &t[0]); \
300 r.y = fnc(v1.y, v2.y, &t[1]); \
301 r.z = fnc(v1.z, v2.z, &t[2]); \
302 v3->x = t[0]; \
303 v3->y = t[1]; \
304 v3->z = t[2]; \
305 return r; \
306} \
307_RS_STATIC float4 __attribute__((overloadable)) \
308 fnc(float4 v1, float4 v2, int4 *v3) { \
309 float4 r; \
310 int t[4]; \
311 r.x = fnc(v1.x, v2.x, &t[0]); \
312 r.y = fnc(v1.y, v2.y, &t[1]); \
313 r.z = fnc(v1.z, v2.z, &t[2]); \
314 r.w = fnc(v1.w, v2.w, &t[3]); \
315 v3->x = t[0]; \
316 v3->y = t[1]; \
317 v3->z = t[2]; \
318 v3->w = t[3]; \
319 return r; \
Stephen Hines3e6482f2011-01-19 12:51:33 -0800320}
321
322
Jason Sams22fa3712010-05-19 17:22:57 -0700323extern float __attribute__((overloadable)) acos(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800324FN_FUNC_FN(acos)
Jason Sams22fa3712010-05-19 17:22:57 -0700325
326extern float __attribute__((overloadable)) acosh(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800327FN_FUNC_FN(acosh)
Jason Sams22fa3712010-05-19 17:22:57 -0700328
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800329_RS_STATIC float __attribute__((overloadable)) acospi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700330 return acos(v) / M_PI;
331}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800332FN_FUNC_FN(acospi)
Jason Sams22fa3712010-05-19 17:22:57 -0700333
334extern float __attribute__((overloadable)) asin(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800335FN_FUNC_FN(asin)
Jason Sams22fa3712010-05-19 17:22:57 -0700336
337extern float __attribute__((overloadable)) asinh(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800338FN_FUNC_FN(asinh)
Jason Sams22fa3712010-05-19 17:22:57 -0700339
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800340_RS_STATIC float __attribute__((overloadable)) asinpi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700341 return asin(v) / M_PI;
342}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800343FN_FUNC_FN(asinpi)
Jason Sams22fa3712010-05-19 17:22:57 -0700344
345extern float __attribute__((overloadable)) atan(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800346FN_FUNC_FN(atan)
Jason Sams22fa3712010-05-19 17:22:57 -0700347
348extern float __attribute__((overloadable)) atan2(float, float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800349FN_FUNC_FN_FN(atan2)
Jason Sams22fa3712010-05-19 17:22:57 -0700350
351extern float __attribute__((overloadable)) atanh(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800352FN_FUNC_FN(atanh)
Jason Sams22fa3712010-05-19 17:22:57 -0700353
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800354_RS_STATIC float __attribute__((overloadable)) atanpi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700355 return atan(v) / M_PI;
356}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800357FN_FUNC_FN(atanpi)
Jason Sams22fa3712010-05-19 17:22:57 -0700358
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800359_RS_STATIC float __attribute__((overloadable)) atan2pi(float y, float x) {
Jason Sams1b937f52010-06-09 14:26:16 -0700360 return atan2(y, x) / M_PI;
361}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800362FN_FUNC_FN_FN(atan2pi)
Jason Sams22fa3712010-05-19 17:22:57 -0700363
364extern float __attribute__((overloadable)) cbrt(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800365FN_FUNC_FN(cbrt)
Jason Sams22fa3712010-05-19 17:22:57 -0700366
367extern float __attribute__((overloadable)) ceil(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800368FN_FUNC_FN(ceil)
Jason Sams22fa3712010-05-19 17:22:57 -0700369
370extern float __attribute__((overloadable)) copysign(float, float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800371FN_FUNC_FN_FN(copysign)
Jason Sams22fa3712010-05-19 17:22:57 -0700372
373extern float __attribute__((overloadable)) cos(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800374FN_FUNC_FN(cos)
Jason Sams22fa3712010-05-19 17:22:57 -0700375
376extern float __attribute__((overloadable)) cosh(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800377FN_FUNC_FN(cosh)
Jason Sams22fa3712010-05-19 17:22:57 -0700378
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800379_RS_STATIC float __attribute__((overloadable)) cospi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700380 return cos(v * M_PI);
381}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800382FN_FUNC_FN(cospi)
Jason Sams22fa3712010-05-19 17:22:57 -0700383
384extern float __attribute__((overloadable)) erfc(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800385FN_FUNC_FN(erfc)
Jason Sams22fa3712010-05-19 17:22:57 -0700386
387extern float __attribute__((overloadable)) erf(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800388FN_FUNC_FN(erf)
Jason Sams22fa3712010-05-19 17:22:57 -0700389
390extern float __attribute__((overloadable)) exp(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800391FN_FUNC_FN(exp)
Jason Sams22fa3712010-05-19 17:22:57 -0700392
393extern float __attribute__((overloadable)) exp2(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800394FN_FUNC_FN(exp2)
Jason Sams22fa3712010-05-19 17:22:57 -0700395
Jason Sams1b937f52010-06-09 14:26:16 -0700396extern float __attribute__((overloadable)) pow(float, float);
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800397_RS_STATIC float __attribute__((overloadable)) exp10(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700398 return pow(10.f, v);
399}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800400FN_FUNC_FN(exp10)
Jason Sams22fa3712010-05-19 17:22:57 -0700401
402extern float __attribute__((overloadable)) expm1(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800403FN_FUNC_FN(expm1)
Jason Sams22fa3712010-05-19 17:22:57 -0700404
405extern float __attribute__((overloadable)) fabs(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800406FN_FUNC_FN(fabs)
Jason Sams22fa3712010-05-19 17:22:57 -0700407
408extern float __attribute__((overloadable)) fdim(float, float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800409FN_FUNC_FN_FN(fdim)
Jason Sams22fa3712010-05-19 17:22:57 -0700410
411extern float __attribute__((overloadable)) floor(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800412FN_FUNC_FN(floor)
Jason Sams22fa3712010-05-19 17:22:57 -0700413
414extern float __attribute__((overloadable)) fma(float, float, float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800415FN_FUNC_FN_FN_FN(fma)
Jason Sams22fa3712010-05-19 17:22:57 -0700416
417extern float __attribute__((overloadable)) fmax(float, float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800418FN_FUNC_FN_FN(fmax);
419FN_FUNC_FN_F(fmax);
Jason Sams22fa3712010-05-19 17:22:57 -0700420
421extern float __attribute__((overloadable)) fmin(float, float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800422FN_FUNC_FN_FN(fmin);
423FN_FUNC_FN_F(fmin);
Jason Sams22fa3712010-05-19 17:22:57 -0700424
425extern float __attribute__((overloadable)) fmod(float, float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800426FN_FUNC_FN_FN(fmod)
Jason Sams22fa3712010-05-19 17:22:57 -0700427
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800428_RS_STATIC float __attribute__((overloadable)) fract(float v, float *iptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700429 int i = (int)floor(v);
430 iptr[0] = i;
431 return fmin(v - i, 0x1.fffffep-1f);
432}
Stephen Hines47b15302011-01-19 18:06:34 -0800433FN_FUNC_FN_PFN(fract)
Jason Sams22fa3712010-05-19 17:22:57 -0700434
Stephen Hines3e6482f2011-01-19 12:51:33 -0800435extern float __attribute__((overloadable)) frexp(float, int *);
436FN_FUNC_FN_PIN(frexp)
Jason Sams22fa3712010-05-19 17:22:57 -0700437
438extern float __attribute__((overloadable)) hypot(float, float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800439FN_FUNC_FN_FN(hypot)
Jason Sams22fa3712010-05-19 17:22:57 -0700440
441extern int __attribute__((overloadable)) ilogb(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800442IN_FUNC_FN(ilogb)
Jason Sams22fa3712010-05-19 17:22:57 -0700443
444extern float __attribute__((overloadable)) ldexp(float, int);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800445FN_FUNC_FN_IN(ldexp)
446FN_FUNC_FN_I(ldexp)
Jason Sams22fa3712010-05-19 17:22:57 -0700447
448extern float __attribute__((overloadable)) lgamma(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800449FN_FUNC_FN(lgamma)
450extern float __attribute__((overloadable)) lgamma(float, int*);
451FN_FUNC_FN_PIN(lgamma)
Jason Sams22fa3712010-05-19 17:22:57 -0700452
453extern float __attribute__((overloadable)) log(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800454FN_FUNC_FN(log)
Jason Sams22fa3712010-05-19 17:22:57 -0700455
Jason Sams22fa3712010-05-19 17:22:57 -0700456
457extern float __attribute__((overloadable)) log10(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800458FN_FUNC_FN(log10)
Jason Sams1b937f52010-06-09 14:26:16 -0700459
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800460_RS_STATIC float __attribute__((overloadable)) log2(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700461 return log10(v) / log10(2.f);
462}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800463FN_FUNC_FN(log2)
Jason Sams22fa3712010-05-19 17:22:57 -0700464
465extern float __attribute__((overloadable)) log1p(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800466FN_FUNC_FN(log1p)
Jason Sams22fa3712010-05-19 17:22:57 -0700467
468extern float __attribute__((overloadable)) logb(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800469FN_FUNC_FN(logb)
Jason Sams22fa3712010-05-19 17:22:57 -0700470
471extern float __attribute__((overloadable)) mad(float, float, float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800472FN_FUNC_FN_FN_FN(mad)
Jason Sams22fa3712010-05-19 17:22:57 -0700473
474extern float __attribute__((overloadable)) modf(float, float *);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800475FN_FUNC_FN_PFN(modf);
Jason Sams22fa3712010-05-19 17:22:57 -0700476
Jason Sams1b937f52010-06-09 14:26:16 -0700477//extern float __attribute__((overloadable)) nan(uint);
Jason Sams22fa3712010-05-19 17:22:57 -0700478
479extern float __attribute__((overloadable)) nextafter(float, float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800480FN_FUNC_FN_FN(nextafter)
Jason Sams22fa3712010-05-19 17:22:57 -0700481
Stephen Hines3e6482f2011-01-19 12:51:33 -0800482FN_FUNC_FN_FN(pow)
Jason Sams22fa3712010-05-19 17:22:57 -0700483
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800484_RS_STATIC float __attribute__((overloadable)) pown(float v, int p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700485 return pow(v, (float)p);
486}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800487_RS_STATIC float2 __attribute__((overloadable)) pown(float2 v, int2 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700488 return pow(v, (float2)p);
489}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800490_RS_STATIC float3 __attribute__((overloadable)) pown(float3 v, int3 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700491 return pow(v, (float3)p);
492}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800493_RS_STATIC float4 __attribute__((overloadable)) pown(float4 v, int4 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700494 return pow(v, (float4)p);
495}
Jason Sams22fa3712010-05-19 17:22:57 -0700496
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800497_RS_STATIC float __attribute__((overloadable)) powr(float v, float p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700498 return pow(v, p);
499}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800500_RS_STATIC float2 __attribute__((overloadable)) powr(float2 v, float2 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700501 return pow(v, p);
502}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800503_RS_STATIC float3 __attribute__((overloadable)) powr(float3 v, float3 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700504 return pow(v, p);
505}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800506_RS_STATIC float4 __attribute__((overloadable)) powr(float4 v, float4 p) {
Jason Sams1b937f52010-06-09 14:26:16 -0700507 return pow(v, p);
508}
Jason Sams22fa3712010-05-19 17:22:57 -0700509
510extern float __attribute__((overloadable)) remainder(float, float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800511FN_FUNC_FN_FN(remainder)
Jason Sams22fa3712010-05-19 17:22:57 -0700512
Stephen Hines47416532011-01-11 14:38:18 -0800513extern float __attribute__((overloadable)) remquo(float, float, int *);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800514FN_FUNC_FN_FN_PIN(remquo)
Jason Sams22fa3712010-05-19 17:22:57 -0700515
516extern float __attribute__((overloadable)) rint(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800517FN_FUNC_FN(rint)
Jason Sams22fa3712010-05-19 17:22:57 -0700518
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800519_RS_STATIC float __attribute__((overloadable)) rootn(float v, int r) {
Jason Sams1b937f52010-06-09 14:26:16 -0700520 return pow(v, 1.f / r);
521}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800522_RS_STATIC float2 __attribute__((overloadable)) rootn(float2 v, int2 r) {
Jason Sams1b937f52010-06-09 14:26:16 -0700523 float2 t = {1.f / r.x, 1.f / r.y};
524 return pow(v, t);
525}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800526_RS_STATIC float3 __attribute__((overloadable)) rootn(float3 v, int3 r) {
Jason Sams1b937f52010-06-09 14:26:16 -0700527 float3 t = {1.f / r.x, 1.f / r.y, 1.f / r.z};
528 return pow(v, t);
529}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800530_RS_STATIC float4 __attribute__((overloadable)) rootn(float4 v, int4 r) {
Jason Sams1b937f52010-06-09 14:26:16 -0700531 float4 t = {1.f / r.x, 1.f / r.y, 1.f / r.z, 1.f / r.w};
532 return pow(v, t);
533}
Jason Sams22fa3712010-05-19 17:22:57 -0700534
535extern float __attribute__((overloadable)) round(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800536FN_FUNC_FN(round)
Jason Sams22fa3712010-05-19 17:22:57 -0700537
538extern float __attribute__((overloadable)) sqrt(float);
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800539_RS_STATIC float __attribute__((overloadable)) rsqrt(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700540 return 1.f / sqrt(v);
541}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800542FN_FUNC_FN(rsqrt)
Jason Sams1b937f52010-06-09 14:26:16 -0700543
544extern float __attribute__((overloadable)) sin(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800545FN_FUNC_FN(sin)
Jason Sams1b937f52010-06-09 14:26:16 -0700546
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800547_RS_STATIC float __attribute__((overloadable)) sincos(float v, float *cosptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700548 *cosptr = cos(v);
549 return sin(v);
550}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800551_RS_STATIC float2 __attribute__((overloadable)) sincos(float2 v, float2 *cosptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700552 *cosptr = cos(v);
553 return sin(v);
554}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800555_RS_STATIC float3 __attribute__((overloadable)) sincos(float3 v, float3 *cosptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700556 *cosptr = cos(v);
557 return sin(v);
558}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800559_RS_STATIC float4 __attribute__((overloadable)) sincos(float4 v, float4 *cosptr) {
Jason Sams1b937f52010-06-09 14:26:16 -0700560 *cosptr = cos(v);
561 return sin(v);
562}
563
564extern float __attribute__((overloadable)) sinh(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800565FN_FUNC_FN(sinh)
Jason Sams1b937f52010-06-09 14:26:16 -0700566
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800567_RS_STATIC float __attribute__((overloadable)) sinpi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700568 return sin(v * M_PI);
569}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800570FN_FUNC_FN(sinpi)
Jason Sams1b937f52010-06-09 14:26:16 -0700571
Stephen Hines3e6482f2011-01-19 12:51:33 -0800572FN_FUNC_FN(sqrt)
Jason Sams22fa3712010-05-19 17:22:57 -0700573
574extern float __attribute__((overloadable)) tan(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800575FN_FUNC_FN(tan)
Jason Sams22fa3712010-05-19 17:22:57 -0700576
577extern float __attribute__((overloadable)) tanh(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800578FN_FUNC_FN(tanh)
Jason Sams22fa3712010-05-19 17:22:57 -0700579
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800580_RS_STATIC float __attribute__((overloadable)) tanpi(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700581 return tan(v * M_PI);
582}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800583FN_FUNC_FN(tanpi)
Jason Sams22fa3712010-05-19 17:22:57 -0700584
585extern float __attribute__((overloadable)) tgamma(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800586FN_FUNC_FN(tgamma)
Jason Sams22fa3712010-05-19 17:22:57 -0700587
588extern float __attribute__((overloadable)) trunc(float);
Stephen Hines3e6482f2011-01-19 12:51:33 -0800589FN_FUNC_FN(trunc)
Jason Sams22fa3712010-05-19 17:22:57 -0700590
591// Int ops (partial), 6.11.3
Jason Sams22fa3712010-05-19 17:22:57 -0700592
Stephen Hines47b15302011-01-19 18:06:34 -0800593#define XN_FUNC_YN(typeout, fnc, typein) \
594extern typeout __attribute__((overloadable)) fnc(typein); \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800595_RS_STATIC typeout##2 __attribute__((overloadable)) fnc(typein##2 v) { \
Stephen Hines47b15302011-01-19 18:06:34 -0800596 typeout##2 r; \
597 r.x = fnc(v.x); \
598 r.y = fnc(v.y); \
599 return r; \
600} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800601_RS_STATIC typeout##3 __attribute__((overloadable)) fnc(typein##3 v) { \
Stephen Hines47b15302011-01-19 18:06:34 -0800602 typeout##3 r; \
603 r.x = fnc(v.x); \
604 r.y = fnc(v.y); \
605 r.z = fnc(v.z); \
606 return r; \
607} \
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800608_RS_STATIC typeout##4 __attribute__((overloadable)) fnc(typein##4 v) { \
Stephen Hines47b15302011-01-19 18:06:34 -0800609 typeout##4 r; \
610 r.x = fnc(v.x); \
611 r.y = fnc(v.y); \
612 r.z = fnc(v.z); \
613 r.w = fnc(v.w); \
614 return r; \
Jason Sams1b937f52010-06-09 14:26:16 -0700615}
Jason Sams22fa3712010-05-19 17:22:57 -0700616
Stephen Hines47b15302011-01-19 18:06:34 -0800617#define UIN_FUNC_IN(fnc) \
Stephen Hines3e6482f2011-01-19 12:51:33 -0800618XN_FUNC_YN(uchar, fnc, char) \
619XN_FUNC_YN(ushort, fnc, short) \
620XN_FUNC_YN(uint, fnc, int)
Jason Sams22fa3712010-05-19 17:22:57 -0700621
Stephen Hines47b15302011-01-19 18:06:34 -0800622#define IN_FUNC_IN(fnc) \
Stephen Hines3e6482f2011-01-19 12:51:33 -0800623XN_FUNC_YN(uchar, fnc, uchar) \
624XN_FUNC_YN(char, fnc, char) \
625XN_FUNC_YN(ushort, fnc, ushort) \
626XN_FUNC_YN(short, fnc, short) \
627XN_FUNC_YN(uint, fnc, uint) \
628XN_FUNC_YN(int, fnc, int)
Jason Sams22fa3712010-05-19 17:22:57 -0700629
Stephen Hines47b15302011-01-19 18:06:34 -0800630#define XN_FUNC_XN_XN_BODY(type, fnc, body) \
631_RS_STATIC type __attribute__((overloadable)) \
632 fnc(type v1, type v2) { \
633 return body; \
634} \
635_RS_STATIC type##2 __attribute__((overloadable)) \
636 fnc(type##2 v1, type##2 v2) { \
637 type##2 r; \
638 r.x = fnc(v1.x, v2.x); \
639 r.y = fnc(v1.y, v2.y); \
640 return r; \
641} \
642_RS_STATIC type##3 __attribute__((overloadable)) \
643 fnc(type##3 v1, type##3 v2) { \
644 type##3 r; \
645 r.x = fnc(v1.x, v2.x); \
646 r.y = fnc(v1.y, v2.y); \
647 r.z = fnc(v1.z, v2.z); \
648 return r; \
649} \
650_RS_STATIC type##4 __attribute__((overloadable)) \
651 fnc(type##4 v1, type##4 v2) { \
652 type##4 r; \
653 r.x = fnc(v1.x, v2.x); \
654 r.y = fnc(v1.y, v2.y); \
655 r.z = fnc(v1.z, v2.z); \
656 r.w = fnc(v1.w, v2.w); \
657 return r; \
658}
Jason Sams22fa3712010-05-19 17:22:57 -0700659
Stephen Hines47b15302011-01-19 18:06:34 -0800660#define IN_FUNC_IN_IN_BODY(fnc, body) \
Stephen Hines3e6482f2011-01-19 12:51:33 -0800661XN_FUNC_XN_XN_BODY(uchar, fnc, body) \
662XN_FUNC_XN_XN_BODY(char, fnc, body) \
663XN_FUNC_XN_XN_BODY(ushort, fnc, body) \
664XN_FUNC_XN_XN_BODY(short, fnc, body) \
665XN_FUNC_XN_XN_BODY(uint, fnc, body) \
666XN_FUNC_XN_XN_BODY(int, fnc, body) \
667XN_FUNC_XN_XN_BODY(float, fnc, body)
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800668
Stephen Hines3e6482f2011-01-19 12:51:33 -0800669UIN_FUNC_IN(abs)
670IN_FUNC_IN(clz)
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800671
Stephen Hines3e6482f2011-01-19 12:51:33 -0800672IN_FUNC_IN_IN_BODY(min, (v1 < v2 ? v1 : v2))
673FN_FUNC_FN_F(min)
Stephen Hinesb902e4c2011-01-14 18:49:01 -0800674
Stephen Hines3e6482f2011-01-19 12:51:33 -0800675IN_FUNC_IN_IN_BODY(max, (v1 > v2 ? v1 : v2))
676FN_FUNC_FN_F(max)
Jason Sams22fa3712010-05-19 17:22:57 -0700677
678// 6.11.4
679
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800680_RS_STATIC float __attribute__((overloadable)) clamp(float amount, float low, float high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700681 return amount < low ? low : (amount > high ? high : amount);
682}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800683_RS_STATIC float2 __attribute__((overloadable)) clamp(float2 amount, float2 low, float2 high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700684 float2 r;
685 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
686 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
687 return r;
688}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800689_RS_STATIC float3 __attribute__((overloadable)) clamp(float3 amount, float3 low, float3 high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700690 float3 r;
691 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
692 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
693 r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);
694 return r;
695}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800696_RS_STATIC float4 __attribute__((overloadable)) clamp(float4 amount, float4 low, float4 high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700697 float4 r;
698 r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
699 r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
700 r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);
701 r.w = amount.w < low.w ? low.w : (amount.w > high.w ? high.w : amount.w);
702 return r;
703}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800704_RS_STATIC float2 __attribute__((overloadable)) clamp(float2 amount, float low, float high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700705 float2 r;
706 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
707 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
708 return r;
709}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800710_RS_STATIC float3 __attribute__((overloadable)) clamp(float3 amount, float low, float high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700711 float3 r;
712 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
713 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
714 r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
715 return r;
716}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800717_RS_STATIC float4 __attribute__((overloadable)) clamp(float4 amount, float low, float high) {
Jason Sams1b937f52010-06-09 14:26:16 -0700718 float4 r;
719 r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
720 r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
721 r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
722 r.w = amount.w < low ? low : (amount.w > high ? high : amount.w);
723 return r;
724}
Jason Sams22fa3712010-05-19 17:22:57 -0700725
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800726_RS_STATIC float __attribute__((overloadable)) degrees(float radians) {
Jason Sams1b937f52010-06-09 14:26:16 -0700727 return radians * (180.f / M_PI);
728}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800729FN_FUNC_FN(degrees)
Jason Sams22fa3712010-05-19 17:22:57 -0700730
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800731_RS_STATIC float __attribute__((overloadable)) mix(float start, float stop, float amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700732 return start + (stop - start) * amount;
733}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800734_RS_STATIC float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float2 amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700735 return start + (stop - start) * amount;
736}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800737_RS_STATIC float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float3 amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700738 return start + (stop - start) * amount;
739}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800740_RS_STATIC float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float4 amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700741 return start + (stop - start) * amount;
742}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800743_RS_STATIC float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700744 return start + (stop - start) * amount;
745}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800746_RS_STATIC float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700747 return start + (stop - start) * amount;
748}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800749_RS_STATIC float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float amount) {
Jason Sams1b937f52010-06-09 14:26:16 -0700750 return start + (stop - start) * amount;
751}
Jason Sams22fa3712010-05-19 17:22:57 -0700752
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800753_RS_STATIC float __attribute__((overloadable)) radians(float degrees) {
Jason Sams1b937f52010-06-09 14:26:16 -0700754 return degrees * (M_PI / 180.f);
755}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800756FN_FUNC_FN(radians)
Jason Sams22fa3712010-05-19 17:22:57 -0700757
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800758_RS_STATIC float __attribute__((overloadable)) step(float edge, float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700759 return (v < edge) ? 0.f : 1.f;
760}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800761_RS_STATIC float2 __attribute__((overloadable)) step(float2 edge, float2 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700762 float2 r;
763 r.x = (v.x < edge.x) ? 0.f : 1.f;
764 r.y = (v.y < edge.y) ? 0.f : 1.f;
765 return r;
766}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800767_RS_STATIC float3 __attribute__((overloadable)) step(float3 edge, float3 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700768 float3 r;
769 r.x = (v.x < edge.x) ? 0.f : 1.f;
770 r.y = (v.y < edge.y) ? 0.f : 1.f;
771 r.z = (v.z < edge.z) ? 0.f : 1.f;
772 return r;
773}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800774_RS_STATIC float4 __attribute__((overloadable)) step(float4 edge, float4 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700775 float4 r;
776 r.x = (v.x < edge.x) ? 0.f : 1.f;
777 r.y = (v.y < edge.y) ? 0.f : 1.f;
778 r.z = (v.z < edge.z) ? 0.f : 1.f;
779 r.w = (v.w < edge.w) ? 0.f : 1.f;
780 return r;
781}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800782_RS_STATIC float2 __attribute__((overloadable)) step(float2 edge, float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700783 float2 r;
784 r.x = (v < edge.x) ? 0.f : 1.f;
785 r.y = (v < edge.y) ? 0.f : 1.f;
786 return r;
787}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800788_RS_STATIC float3 __attribute__((overloadable)) step(float3 edge, float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700789 float3 r;
790 r.x = (v < edge.x) ? 0.f : 1.f;
791 r.y = (v < edge.y) ? 0.f : 1.f;
792 r.z = (v < edge.z) ? 0.f : 1.f;
793 return r;
794}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800795_RS_STATIC float4 __attribute__((overloadable)) step(float4 edge, float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700796 float4 r;
797 r.x = (v < edge.x) ? 0.f : 1.f;
798 r.y = (v < edge.y) ? 0.f : 1.f;
799 r.z = (v < edge.z) ? 0.f : 1.f;
800 r.w = (v < edge.w) ? 0.f : 1.f;
801 return r;
802}
Jason Sams22fa3712010-05-19 17:22:57 -0700803
804extern float __attribute__((overloadable)) smoothstep(float, float, float);
805extern float2 __attribute__((overloadable)) smoothstep(float2, float2, float2);
806extern float3 __attribute__((overloadable)) smoothstep(float3, float3, float3);
807extern float4 __attribute__((overloadable)) smoothstep(float4, float4, float4);
Jason Sams22fa3712010-05-19 17:22:57 -0700808extern float2 __attribute__((overloadable)) smoothstep(float, float, float2);
809extern float3 __attribute__((overloadable)) smoothstep(float, float, float3);
810extern float4 __attribute__((overloadable)) smoothstep(float, float, float4);
Jason Sams22fa3712010-05-19 17:22:57 -0700811
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800812_RS_STATIC float __attribute__((overloadable)) sign(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700813 if (v > 0) return 1.f;
814 if (v < 0) return -1.f;
815 return v;
816}
Stephen Hines3e6482f2011-01-19 12:51:33 -0800817FN_FUNC_FN(sign)
Jason Sams22fa3712010-05-19 17:22:57 -0700818
819// 6.11.5
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800820_RS_STATIC float3 __attribute__((overloadable)) cross(float3 lhs, float3 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700821 float3 r;
822 r.x = lhs.y * rhs.z - lhs.z * rhs.y;
823 r.y = lhs.z * rhs.x - lhs.x * rhs.z;
824 r.z = lhs.x * rhs.y - lhs.y * rhs.x;
825 return r;
826}
Jason Sams22fa3712010-05-19 17:22:57 -0700827
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800828_RS_STATIC float4 __attribute__((overloadable)) cross(float4 lhs, float4 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700829 float4 r;
830 r.x = lhs.y * rhs.z - lhs.z * rhs.y;
831 r.y = lhs.z * rhs.x - lhs.x * rhs.z;
832 r.z = lhs.x * rhs.y - lhs.y * rhs.x;
833 r.w = 0.f;
834 return r;
835}
Jason Sams22fa3712010-05-19 17:22:57 -0700836
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800837_RS_STATIC float __attribute__((overloadable)) dot(float lhs, float rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700838 return lhs * rhs;
839}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800840_RS_STATIC float __attribute__((overloadable)) dot(float2 lhs, float2 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700841 return lhs.x*rhs.x + lhs.y*rhs.y;
842}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800843_RS_STATIC float __attribute__((overloadable)) dot(float3 lhs, float3 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700844 return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z;
845}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800846_RS_STATIC float __attribute__((overloadable)) dot(float4 lhs, float4 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700847 return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z + lhs.w*rhs.w;
848}
Jason Sams22fa3712010-05-19 17:22:57 -0700849
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800850_RS_STATIC float __attribute__((overloadable)) length(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700851 return v;
852}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800853_RS_STATIC float __attribute__((overloadable)) length(float2 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700854 return sqrt(v.x*v.x + v.y*v.y);
855}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800856_RS_STATIC float __attribute__((overloadable)) length(float3 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700857 return sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
858}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800859_RS_STATIC float __attribute__((overloadable)) length(float4 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700860 return sqrt(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w);
861}
Jason Sams22fa3712010-05-19 17:22:57 -0700862
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800863_RS_STATIC float __attribute__((overloadable)) distance(float lhs, float rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700864 return length(lhs - rhs);
865}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800866_RS_STATIC float __attribute__((overloadable)) distance(float2 lhs, float2 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700867 return length(lhs - rhs);
868}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800869_RS_STATIC float __attribute__((overloadable)) distance(float3 lhs, float3 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700870 return length(lhs - rhs);
871}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800872_RS_STATIC float __attribute__((overloadable)) distance(float4 lhs, float4 rhs) {
Jason Sams1b937f52010-06-09 14:26:16 -0700873 return length(lhs - rhs);
874}
Jason Sams22fa3712010-05-19 17:22:57 -0700875
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800876_RS_STATIC float __attribute__((overloadable)) normalize(float v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700877 return 1.f;
878}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800879_RS_STATIC float2 __attribute__((overloadable)) normalize(float2 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700880 return v / length(v);
881}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800882_RS_STATIC float3 __attribute__((overloadable)) normalize(float3 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700883 return v / length(v);
884}
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800885_RS_STATIC float4 __attribute__((overloadable)) normalize(float4 v) {
Jason Sams1b937f52010-06-09 14:26:16 -0700886 return v / length(v);
887}
888
Stephen Hines47416532011-01-11 14:38:18 -0800889#undef CVT_FUNC
890#undef CVT_FUNC_2
Stephen Hines3e6482f2011-01-19 12:51:33 -0800891#undef FN_FUNC_FN
892#undef IN_FUNC_FN
893#undef FN_FUNC_FN_FN
894#undef FN_FUNC_FN_F
895#undef FN_FUNC_FN_IN
896#undef FN_FUNC_FN_I
897#undef FN_FUNC_FN_PFN
898#undef FN_FUNC_FN_PIN
899#undef FN_FUNC_FN_FN_FN
900#undef FN_FUNC_FN_FN_PIN
901#undef XN_FUNC_YN
902#undef UIN_FUNC_IN
903#undef IN_FUNC_IN
904#undef XN_FUNC_XN_XN_BODY
905#undef IN_FUNC_IN_IN_BODY
Stephen Hinesf6a28c62011-01-18 16:53:19 -0800906#undef _RS_STATIC
Jason Sams1b937f52010-06-09 14:26:16 -0700907
908#endif