rs_cl.rsh revision a16a98145347187e9e92f400e72345354b4cbccf
196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams#ifndef __RS_CL_RSH__
296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams#define __RS_CL_RSH__
396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
4793786c25878f1324b9cb44c47050c180ad68693Stephen Hines#ifdef BCC_PREPARE_BC
5793786c25878f1324b9cb44c47050c180ad68693Stephen Hines#define _RS_STATIC  extern
6793786c25878f1324b9cb44c47050c180ad68693Stephen Hines#else
7793786c25878f1324b9cb44c47050c180ad68693Stephen Hines#define _RS_STATIC  static
8793786c25878f1324b9cb44c47050c180ad68693Stephen Hines#endif
996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
1096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams// Conversions
11a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define CVT_FUNC_2(typeout, typein)                             \
12a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC typeout##2 __attribute__((overloadable))             \
13a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        convert_##typeout##2(typein##2 v) {                     \
14a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    typeout##2 r = {(typeout)v.x, (typeout)v.y};                \
15a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                   \
16a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                               \
17a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC typeout##3 __attribute__((overloadable))             \
18a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        convert_##typeout##3(typein##3 v) {                     \
19a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    typeout##3 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z};  \
20a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                   \
21a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                               \
22a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC typeout##4 __attribute__((overloadable))             \
23a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        convert_##typeout##4(typein##4 v) {                     \
24a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    typeout##4 r = {(typeout)v.x, (typeout)v.y, (typeout)v.z,   \
25a16a98145347187e9e92f400e72345354b4cbccfStephen Hines                    (typeout)v.w};                              \
26a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                   \
27a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}
28a16a98145347187e9e92f400e72345354b4cbccfStephen Hines
29a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define CVT_FUNC(type)  CVT_FUNC_2(type, uchar)     \
30a16a98145347187e9e92f400e72345354b4cbccfStephen Hines                        CVT_FUNC_2(type, char)      \
31a16a98145347187e9e92f400e72345354b4cbccfStephen Hines                        CVT_FUNC_2(type, ushort)    \
32a16a98145347187e9e92f400e72345354b4cbccfStephen Hines                        CVT_FUNC_2(type, short)     \
33a16a98145347187e9e92f400e72345354b4cbccfStephen Hines                        CVT_FUNC_2(type, uint)      \
34a16a98145347187e9e92f400e72345354b4cbccfStephen Hines                        CVT_FUNC_2(type, int)       \
35a16a98145347187e9e92f400e72345354b4cbccfStephen Hines                        CVT_FUNC_2(type, float)
3696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
3796d719c91708fda5abc0442fcf6d275584d2cad6Jason SamsCVT_FUNC(char)
3896d719c91708fda5abc0442fcf6d275584d2cad6Jason SamsCVT_FUNC(uchar)
3996d719c91708fda5abc0442fcf6d275584d2cad6Jason SamsCVT_FUNC(short)
4096d719c91708fda5abc0442fcf6d275584d2cad6Jason SamsCVT_FUNC(ushort)
4196d719c91708fda5abc0442fcf6d275584d2cad6Jason SamsCVT_FUNC(int)
4296d719c91708fda5abc0442fcf6d275584d2cad6Jason SamsCVT_FUNC(uint)
4396d719c91708fda5abc0442fcf6d275584d2cad6Jason SamsCVT_FUNC(float)
4496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
45d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams// Float ops, 6.11.2
46d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
47a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define FN_FUNC_FN(fnc)                                         \
48793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v) { \
49a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float2 r;                                                   \
50a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v.x);                                             \
51a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v.y);                                             \
52a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                   \
53a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                               \
54793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v) { \
55a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float3 r;                                                   \
56a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v.x);                                             \
57a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v.y);                                             \
58a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v.z);                                             \
59a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                   \
60a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                               \
61793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v) { \
62a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float4 r;                                                   \
63a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v.x);                                             \
64a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v.y);                                             \
65a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v.z);                                             \
66a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.w = fnc(v.w);                                             \
67a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                   \
68a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}
69a16a98145347187e9e92f400e72345354b4cbccfStephen Hines
70a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define IN_FUNC_FN(fnc)                                         \
71a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC int2 __attribute__((overloadable)) fnc(float2 v) {   \
72a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    int2 r;                                                     \
73a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v.x);                                             \
74a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v.y);                                             \
75a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                   \
76a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                               \
77a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC int3 __attribute__((overloadable)) fnc(float3 v) {   \
78a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    int3 r;                                                     \
79a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v.x);                                             \
80a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v.y);                                             \
81a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v.z);                                             \
82a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                   \
83a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                               \
84a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC int4 __attribute__((overloadable)) fnc(float4 v) {   \
85a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    int4 r;                                                     \
86a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v.x);                                             \
87a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v.y);                                             \
88a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v.z);                                             \
89a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.w = fnc(v.w);                                             \
90a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                   \
91a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}
92a16a98145347187e9e92f400e72345354b4cbccfStephen Hines
93a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define FN_FUNC_FN_FN(fnc)                                                  \
94793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2) { \
95a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float2 r;                                                               \
96a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x);                                                  \
97a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y);                                                  \
98a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
99a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                                           \
100793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float3 v2) { \
101a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float3 r;                                                               \
102a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x);                                                  \
103a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y);                                                  \
104a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2.z);                                                  \
105a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
106a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                                           \
107793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2) { \
108a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float4 r;                                                               \
109a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x);                                                  \
110a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y);                                                  \
111a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2.z);                                                  \
112a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.w = fnc(v1.w, v2.w);                                                  \
113a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
114a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}
115a16a98145347187e9e92f400e72345354b4cbccfStephen Hines
116a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define FN_FUNC_FN_F(fnc)                                                   \
117a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, float v2) {  \
118a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float2 r;                                                               \
119a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2);                                                    \
120a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2);                                                    \
121a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
122a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                                           \
123a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, float v2) {  \
124a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float3 r;                                                               \
125a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2);                                                    \
126a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2);                                                    \
127a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2);                                                    \
128a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
129a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                                           \
130a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, float v2) {  \
131a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float4 r;                                                               \
132a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2);                                                    \
133a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2);                                                    \
134a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2);                                                    \
135a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.w = fnc(v1.w, v2);                                                    \
136a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
137a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}
138a16a98145347187e9e92f400e72345354b4cbccfStephen Hines
139a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define FN_FUNC_FN_IN(fnc)                                                  \
140a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, int2 v2) {   \
141a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float2 r;                                                               \
142a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x);                                                  \
143a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y);                                                  \
144a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
145a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                                           \
146a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, int3 v2) {   \
147a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float3 r;                                                               \
148a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x);                                                  \
149a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y);                                                  \
150a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2.z);                                                  \
151a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
152a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                                           \
153a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, int4 v2) {   \
154a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float4 r;                                                               \
155a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x);                                                  \
156a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y);                                                  \
157a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2.z);                                                  \
158a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.w = fnc(v1.w, v2.w);                                                  \
159a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
160a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}
161a16a98145347187e9e92f400e72345354b4cbccfStephen Hines
162a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define FN_FUNC_FN_I(fnc)                                                   \
163a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, int v2) {    \
164a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float2 r;                                                               \
165a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2);                                                    \
166a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2);                                                    \
167a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
168a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                                           \
169a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, int v2) {    \
170a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float3 r;                                                               \
171a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2);                                                    \
172a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2);                                                    \
173a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2);                                                    \
174a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
175a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                                           \
176a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, int v2) {    \
177a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float4 r;                                                               \
178a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2);                                                    \
179a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2);                                                    \
180a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2);                                                    \
181a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.w = fnc(v1.w, v2);                                                    \
182a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
183833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines}
184833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines
185a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define FN_FUNC_FN_PFN(fnc)                     \
186a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float2 __attribute__((overloadable)) \
187a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(float2 v1, float2 *v2) {            \
188a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float2 r;                                   \
189a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float t[2];                                 \
190a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, &t[0]);                     \
191a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, &t[1]);                     \
192a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->x = t[0];                               \
193a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->y = t[1];                               \
194a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                   \
195a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                               \
196a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float3 __attribute__((overloadable)) \
197a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(float3 v1, float3 *v2) {            \
198a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float3 r;                                   \
199a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float t[3];                                 \
200a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, &t[0]);                     \
201a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, &t[1]);                     \
202a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, &t[2]);                     \
203a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->x = t[0];                               \
204a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->y = t[1];                               \
205a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->z = t[2];                               \
206a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                   \
207a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                               \
208a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float4 __attribute__((overloadable)) \
209a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(float4 v1, float4 *v2) {            \
210a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float4 r;                                   \
211a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float t[4];                                 \
212a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, &t[0]);                     \
213a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, &t[1]);                     \
214a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, &t[2]);                     \
215a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.w = fnc(v1.w, &t[3]);                     \
216a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->x = t[0];                               \
217a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->y = t[1];                               \
218a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->z = t[2];                               \
219a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->w = t[3];                               \
220a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                   \
221a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}
222a16a98145347187e9e92f400e72345354b4cbccfStephen Hines
223a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define FN_FUNC_FN_PIN(fnc)                                                 \
224a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float2 __attribute__((overloadable)) fnc(float2 v1, int2 *v2) {  \
225a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float2 r;                                                               \
226a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    int t[2];                                                               \
227a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, &t[0]);                                                 \
228a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, &t[1]);                                                 \
229a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->x = t[0];                                                           \
230a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->y = t[1];                                                           \
231a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
232a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                                           \
233a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float3 __attribute__((overloadable)) fnc(float3 v1, int3 *v2) {  \
234a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float3 r;                                                               \
235a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    int t[3];                                                               \
236a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, &t[0]);                                                 \
237a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, &t[1]);                                                 \
238a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, &t[2]);                                                 \
239a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->x = t[0];                                                           \
240a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->y = t[1];                                                           \
241a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->z = t[2];                                                           \
242a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
243a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                                           \
244a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float4 __attribute__((overloadable)) fnc(float4 v1, int4 *v2) {  \
245a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float4 r;                                                               \
246a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    int t[4];                                                               \
247a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, &t[0]);                                                 \
248a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, &t[1]);                                                 \
249a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, &t[2]);                                                 \
250a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.w = fnc(v1.w, &t[3]);                                                 \
251a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->x = t[0];                                                           \
252a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->y = t[1];                                                           \
253a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->z = t[2];                                                           \
254a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v2->w = t[3];                                                           \
255a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                               \
256a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}
257a16a98145347187e9e92f400e72345354b4cbccfStephen Hines
258a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define FN_FUNC_FN_FN_FN(fnc)                   \
259a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float2 __attribute__((overloadable)) \
260a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(float2 v1, float2 v2, float2 v3) {  \
261a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float2 r;                                   \
262a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x, v3.x);                \
263a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y, v3.y);                \
264a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                   \
265a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                               \
266a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float3 __attribute__((overloadable)) \
267a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(float3 v1, float3 v2, float3 v3) {  \
268a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float3 r;                                   \
269a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x, v3.x);                \
270a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y, v3.y);                \
271a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2.z, v3.z);                \
272a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                   \
273a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                               \
274a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float4 __attribute__((overloadable)) \
275a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(float4 v1, float4 v2, float4 v3) {  \
276a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float4 r;                                   \
277a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x, v3.x);                \
278a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y, v3.y);                \
279a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2.z, v3.z);                \
280a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.w = fnc(v1.w, v2.w, v3.w);                \
281a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                   \
282a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}
283a16a98145347187e9e92f400e72345354b4cbccfStephen Hines
284a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define FN_FUNC_FN_FN_PIN(fnc)                  \
285a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float2 __attribute__((overloadable)) \
286a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(float2 v1, float2 v2, int2 *v3) {   \
287a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float2 r;                                   \
288a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    int t[2];                                   \
289a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x, &t[0]);               \
290a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y, &t[1]);               \
291a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v3->x = t[0];                               \
292a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v3->y = t[1];                               \
293a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                   \
294a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                               \
295a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float3 __attribute__((overloadable)) \
296a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(float3 v1, float3 v2, int3 *v3) {   \
297a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float3 r;                                   \
298a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    int t[3];                                   \
299a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x, &t[0]);               \
300a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y, &t[1]);               \
301a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2.z, &t[2]);               \
302a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v3->x = t[0];                               \
303a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v3->y = t[1];                               \
304a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v3->z = t[2];                               \
305a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                   \
306a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                               \
307a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC float4 __attribute__((overloadable)) \
308a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(float4 v1, float4 v2, int4 *v3) {   \
309a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    float4 r;                                   \
310a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    int t[4];                                   \
311a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x, &t[0]);               \
312a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y, &t[1]);               \
313a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2.z, &t[2]);               \
314a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.w = fnc(v1.w, v2.w, &t[3]);               \
315a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v3->x = t[0];                               \
316a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v3->y = t[1];                               \
317a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v3->z = t[2];                               \
318a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    v3->w = t[3];                               \
319a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                   \
320a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}
321833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines
322833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines
323d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) acos(float);
324833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(acos)
325d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
326d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) acosh(float);
327833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(acosh)
32896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
329793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) acospi(float v) {
33096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return acos(v) / M_PI;
33196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
332833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(acospi)
333d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
334d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) asin(float);
335833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(asin)
336d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
337d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) asinh(float);
338833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(asinh)
33996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
340793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) asinpi(float v) {
34196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return asin(v) / M_PI;
34296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
343833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(asinpi)
344d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
345d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) atan(float);
346833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(atan)
347d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
348d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) atan2(float, float);
349833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN(atan2)
350d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
351d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) atanh(float);
352833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(atanh)
35396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
354793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) atanpi(float v) {
35596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return atan(v) / M_PI;
35696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
357833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(atanpi)
35896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
359793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) atan2pi(float y, float x) {
36096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return atan2(y, x) / M_PI;
36196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
362833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN(atan2pi)
363d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
364d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) cbrt(float);
365833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(cbrt)
366d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
367d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) ceil(float);
368833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(ceil)
369d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
370d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) copysign(float, float);
371833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN(copysign)
372d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
373d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) cos(float);
374833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(cos)
375d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
376d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) cosh(float);
377833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(cosh)
37896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
379793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) cospi(float v) {
38096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return cos(v * M_PI);
38196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
382833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(cospi)
383d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
384d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) erfc(float);
385833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(erfc)
386d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
387d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) erf(float);
388833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(erf)
389d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
390d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) exp(float);
391833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(exp)
392d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
393d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) exp2(float);
394833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(exp2)
39596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
39696d719c91708fda5abc0442fcf6d275584d2cad6Jason Samsextern float __attribute__((overloadable)) pow(float, float);
397793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) exp10(float v) {
39896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(10.f, v);
39996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
400833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(exp10)
401d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
402d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) expm1(float);
403833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(expm1)
404d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
405d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) fabs(float);
406833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(fabs)
407d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
408d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) fdim(float, float);
409833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN(fdim)
410d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
411d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) floor(float);
412833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(floor)
413d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
414d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) fma(float, float, float);
415833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN_FN(fma)
416d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
417d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) fmax(float, float);
418833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN(fmax);
419833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_F(fmax);
420d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
421d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) fmin(float, float);
422833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN(fmin);
423833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_F(fmin);
424d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
425d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) fmod(float, float);
426833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN(fmod)
42796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
428793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) fract(float v, float *iptr) {
42996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    int i = (int)floor(v);
43096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    iptr[0] = i;
43196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return fmin(v - i, 0x1.fffffep-1f);
43296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
433a16a98145347187e9e92f400e72345354b4cbccfStephen HinesFN_FUNC_FN_PFN(fract)
434d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
435833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hinesextern float __attribute__((overloadable)) frexp(float, int *);
436833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_PIN(frexp)
437d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
438d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) hypot(float, float);
439833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN(hypot)
440d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
441d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern int __attribute__((overloadable)) ilogb(float);
442833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesIN_FUNC_FN(ilogb)
443d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
444d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) ldexp(float, int);
445833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_IN(ldexp)
446833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_I(ldexp)
447d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
448d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) lgamma(float);
449833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(lgamma)
450833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hinesextern float __attribute__((overloadable)) lgamma(float, int*);
451833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_PIN(lgamma)
452d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
453d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) log(float);
454833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(log)
45596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
456d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
457d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) log10(float);
458833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(log10)
45996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
460793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) log2(float v) {
46196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return log10(v) / log10(2.f);
46296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
463833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(log2)
464d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
465d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) log1p(float);
466833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(log1p)
467d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
468d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) logb(float);
469833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(logb)
470d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
471d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) mad(float, float, float);
472833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN_FN(mad)
473d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
474d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) modf(float, float *);
475833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_PFN(modf);
476d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
47796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams//extern float __attribute__((overloadable)) nan(uint);
478d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
479d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) nextafter(float, float);
480833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN(nextafter)
48196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
482833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN(pow)
48396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
484793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) pown(float v, int p) {
48596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(v, (float)p);
48696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
487793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) pown(float2 v, int2 p) {
48896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(v, (float2)p);
48996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
490793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) pown(float3 v, int3 p) {
49196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(v, (float3)p);
49296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
493793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) pown(float4 v, int4 p) {
49496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(v, (float4)p);
49596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
49696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
497793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) powr(float v, float p) {
49896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(v, p);
49996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
500793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) powr(float2 v, float2 p) {
50196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(v, p);
50296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
503793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) powr(float3 v, float3 p) {
50496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(v, p);
50596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
506793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) powr(float4 v, float4 p) {
50796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(v, p);
50896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
509d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
510d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) remainder(float, float);
511833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN(remainder)
512d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
513682c4a860b435a6888ea0ea753a7ba6194bb442aStephen Hinesextern float __attribute__((overloadable)) remquo(float, float, int *);
514833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_FN_PIN(remquo)
515d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
516d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) rint(float);
517833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(rint)
51896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
519793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) rootn(float v, int r) {
52096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(v, 1.f / r);
52196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
522793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) rootn(float2 v, int2 r) {
52396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float2 t = {1.f / r.x, 1.f / r.y};
52496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(v, t);
52596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
526793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) rootn(float3 v, int3 r) {
52796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float3 t = {1.f / r.x, 1.f / r.y, 1.f / r.z};
52896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(v, t);
52996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
530793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) rootn(float4 v, int4 r) {
53196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float4 t = {1.f / r.x, 1.f / r.y, 1.f / r.z, 1.f / r.w};
53296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return pow(v, t);
53396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
534d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
535d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) round(float);
536833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(round)
53796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
53896d719c91708fda5abc0442fcf6d275584d2cad6Jason Samsextern float __attribute__((overloadable)) sqrt(float);
539793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) rsqrt(float v) {
54096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return 1.f / sqrt(v);
54196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
542833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(rsqrt)
543d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
544d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) sin(float);
545833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(sin)
54696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
547793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) sincos(float v, float *cosptr) {
54896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    *cosptr = cos(v);
54996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return sin(v);
55096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
551793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) sincos(float2 v, float2 *cosptr) {
55296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    *cosptr = cos(v);
55396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return sin(v);
55496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
555793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) sincos(float3 v, float3 *cosptr) {
55696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    *cosptr = cos(v);
55796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return sin(v);
55896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
559793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) sincos(float4 v, float4 *cosptr) {
56096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    *cosptr = cos(v);
56196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return sin(v);
56296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
563d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
564d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) sinh(float);
565833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(sinh)
566d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
567793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) sinpi(float v) {
56896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return sin(v * M_PI);
56996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
570833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(sinpi)
57196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
572833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(sqrt)
573d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
574d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) tan(float);
575833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(tan)
576d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
577d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) tanh(float);
578833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(tanh)
57996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
580793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) tanpi(float v) {
58196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return tan(v * M_PI);
58296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
583833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(tanpi)
584d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
585d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) tgamma(float);
586833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(tgamma)
587d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
588d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) trunc(float);
589833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(trunc)
590d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
591d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams// Int ops (partial), 6.11.3
592d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
593a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define XN_FUNC_YN(typeout, fnc, typein)                                \
594a16a98145347187e9e92f400e72345354b4cbccfStephen Hinesextern typeout __attribute__((overloadable)) fnc(typein);               \
595793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC typeout##2 __attribute__((overloadable)) fnc(typein##2 v) {  \
596a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    typeout##2 r;                                                       \
597a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v.x);                                                     \
598a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v.y);                                                     \
599a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                           \
600a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                                       \
601793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC typeout##3 __attribute__((overloadable)) fnc(typein##3 v) {  \
602a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    typeout##3 r;                                                       \
603a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v.x);                                                     \
604a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v.y);                                                     \
605a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v.z);                                                     \
606a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                           \
607a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                                       \
608793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC typeout##4 __attribute__((overloadable)) fnc(typein##4 v) {  \
609a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    typeout##4 r;                                                       \
610a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v.x);                                                     \
611a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v.y);                                                     \
612a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v.z);                                                     \
613a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.w = fnc(v.w);                                                     \
614a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                                           \
615a8b78174eb6bc202cf86827618c806024e64cd80Stephen Hines}
616a8b78174eb6bc202cf86827618c806024e64cd80Stephen Hines
617a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define UIN_FUNC_IN(fnc)          \
618833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_YN(uchar, fnc, char)      \
619833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_YN(ushort, fnc, short)    \
620833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_YN(uint, fnc, int)
621a8b78174eb6bc202cf86827618c806024e64cd80Stephen Hines
622a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define IN_FUNC_IN(fnc)           \
623833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_YN(uchar, fnc, uchar)     \
624833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_YN(char, fnc, char)       \
625833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_YN(ushort, fnc, ushort)   \
626833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_YN(short, fnc, short)     \
627833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_YN(uint, fnc, uint)       \
628833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_YN(int, fnc, int)
629a8b78174eb6bc202cf86827618c806024e64cd80Stephen Hines
630a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define XN_FUNC_XN_XN_BODY(type, fnc, body)         \
631a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC type __attribute__((overloadable))       \
632a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(type v1, type v2) {                     \
633a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return body;                                    \
634a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                   \
635a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC type##2 __attribute__((overloadable))    \
636a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(type##2 v1, type##2 v2) {               \
637a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    type##2 r;                                      \
638a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x);                          \
639a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y);                          \
640a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                       \
641a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                   \
642a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC type##3 __attribute__((overloadable))    \
643a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(type##3 v1, type##3 v2) {               \
644a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    type##3 r;                                      \
645a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x);                          \
646a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y);                          \
647a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2.z);                          \
648a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                       \
649a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}                                                   \
650a16a98145347187e9e92f400e72345354b4cbccfStephen Hines_RS_STATIC type##4 __attribute__((overloadable))    \
651a16a98145347187e9e92f400e72345354b4cbccfStephen Hines        fnc(type##4 v1, type##4 v2) {               \
652a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    type##4 r;                                      \
653a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.x = fnc(v1.x, v2.x);                          \
654a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.y = fnc(v1.y, v2.y);                          \
655a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.z = fnc(v1.z, v2.z);                          \
656a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    r.w = fnc(v1.w, v2.w);                          \
657a16a98145347187e9e92f400e72345354b4cbccfStephen Hines    return r;                                       \
658a16a98145347187e9e92f400e72345354b4cbccfStephen Hines}
659a16a98145347187e9e92f400e72345354b4cbccfStephen Hines
660a16a98145347187e9e92f400e72345354b4cbccfStephen Hines#define IN_FUNC_IN_IN_BODY(fnc, body) \
661833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_XN_XN_BODY(uchar, fnc, body)  \
662833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_XN_XN_BODY(char, fnc, body)   \
663833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_XN_XN_BODY(ushort, fnc, body) \
664833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_XN_XN_BODY(short, fnc, body)  \
665833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_XN_XN_BODY(uint, fnc, body)   \
666833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_XN_XN_BODY(int, fnc, body)    \
667833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesXN_FUNC_XN_XN_BODY(float, fnc, body)
668a8b78174eb6bc202cf86827618c806024e64cd80Stephen Hines
669833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesUIN_FUNC_IN(abs)
670833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesIN_FUNC_IN(clz)
671a8b78174eb6bc202cf86827618c806024e64cd80Stephen Hines
672833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesIN_FUNC_IN_IN_BODY(min, (v1 < v2 ? v1 : v2))
673833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_F(min)
674a8b78174eb6bc202cf86827618c806024e64cd80Stephen Hines
675833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesIN_FUNC_IN_IN_BODY(max, (v1 > v2 ? v1 : v2))
676833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN_F(max)
677d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
678d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams// 6.11.4
679d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
680793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) clamp(float amount, float low, float high) {
68196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return amount < low ? low : (amount > high ? high : amount);
68296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
683793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) clamp(float2 amount, float2 low, float2 high) {
68496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float2 r;
68596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
68696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
68796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
68896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
689793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) clamp(float3 amount, float3 low, float3 high) {
69096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float3 r;
69196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
69296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
69396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);
69496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
69596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
696793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) clamp(float4 amount, float4 low, float4 high) {
69796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float4 r;
69896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = amount.x < low.x ? low.x : (amount.x > high.x ? high.x : amount.x);
69996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = amount.y < low.y ? low.y : (amount.y > high.y ? high.y : amount.y);
70096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.z = amount.z < low.z ? low.z : (amount.z > high.z ? high.z : amount.z);
70196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.w = amount.w < low.w ? low.w : (amount.w > high.w ? high.w : amount.w);
70296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
70396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
704793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) clamp(float2 amount, float low, float high) {
70596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float2 r;
70696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
70796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
70896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
70996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
710793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) clamp(float3 amount, float low, float high) {
71196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float3 r;
71296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
71396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
71496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
71596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
71696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
717793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) clamp(float4 amount, float low, float high) {
71896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float4 r;
71996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
72096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
72196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
72296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.w = amount.w < low ? low : (amount.w > high ? high : amount.w);
72396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
72496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
72596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
726793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) degrees(float radians) {
72796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return radians * (180.f / M_PI);
72896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
729833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(degrees)
73096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
731793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) mix(float start, float stop, float amount) {
73296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return start + (stop - start) * amount;
73396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
734793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float2 amount) {
73596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return start + (stop - start) * amount;
73696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
737793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float3 amount) {
73896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return start + (stop - start) * amount;
73996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
740793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float4 amount) {
74196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return start + (stop - start) * amount;
74296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
743793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float amount) {
74496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return start + (stop - start) * amount;
74596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
746793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float amount) {
74796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return start + (stop - start) * amount;
74896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
749793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float amount) {
75096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return start + (stop - start) * amount;
75196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
75296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
753793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) radians(float degrees) {
75496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return degrees * (M_PI / 180.f);
75596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
756833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(radians)
75796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
758793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) step(float edge, float v) {
75996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return (v < edge) ? 0.f : 1.f;
76096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
761793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) step(float2 edge, float2 v) {
76296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float2 r;
76396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = (v.x < edge.x) ? 0.f : 1.f;
76496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = (v.y < edge.y) ? 0.f : 1.f;
76596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
76696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
767793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) step(float3 edge, float3 v) {
76896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float3 r;
76996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = (v.x < edge.x) ? 0.f : 1.f;
77096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = (v.y < edge.y) ? 0.f : 1.f;
77196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.z = (v.z < edge.z) ? 0.f : 1.f;
77296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
77396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
774793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) step(float4 edge, float4 v) {
77596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float4 r;
77696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = (v.x < edge.x) ? 0.f : 1.f;
77796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = (v.y < edge.y) ? 0.f : 1.f;
77896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.z = (v.z < edge.z) ? 0.f : 1.f;
77996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.w = (v.w < edge.w) ? 0.f : 1.f;
78096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
78196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
782793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) step(float2 edge, float v) {
78396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float2 r;
78496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = (v < edge.x) ? 0.f : 1.f;
78596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = (v < edge.y) ? 0.f : 1.f;
78696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
78796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
788793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) step(float3 edge, float v) {
78996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float3 r;
79096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = (v < edge.x) ? 0.f : 1.f;
79196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = (v < edge.y) ? 0.f : 1.f;
79296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.z = (v < edge.z) ? 0.f : 1.f;
79396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
79496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
795793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) step(float4 edge, float v) {
79696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float4 r;
79796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = (v < edge.x) ? 0.f : 1.f;
79896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = (v < edge.y) ? 0.f : 1.f;
79996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.z = (v < edge.z) ? 0.f : 1.f;
80096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.w = (v < edge.w) ? 0.f : 1.f;
80196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
80296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
803d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
804d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float __attribute__((overloadable)) smoothstep(float, float, float);
805d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float2 __attribute__((overloadable)) smoothstep(float2, float2, float2);
806d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float3 __attribute__((overloadable)) smoothstep(float3, float3, float3);
807d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float4 __attribute__((overloadable)) smoothstep(float4, float4, float4);
808d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float2 __attribute__((overloadable)) smoothstep(float, float, float2);
809d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float3 __attribute__((overloadable)) smoothstep(float, float, float3);
810d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Samsextern float4 __attribute__((overloadable)) smoothstep(float, float, float4);
811d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
812793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) sign(float v) {
81396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    if (v > 0) return 1.f;
81496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    if (v < 0) return -1.f;
81596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return v;
81696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
817833166d274030bfd90653626f0e9f5bf710f7d4bStephen HinesFN_FUNC_FN(sign)
818d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams
819d79b2e9f8b0fa43f6734aaa5e9d0d389d5da5109Jason Sams// 6.11.5
820793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) cross(float3 lhs, float3 rhs) {
82196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float3 r;
82296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = lhs.y * rhs.z  - lhs.z * rhs.y;
82396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = lhs.z * rhs.x  - lhs.x * rhs.z;
82496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.z = lhs.x * rhs.y  - lhs.y * rhs.x;
82596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
82696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
82796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
828793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) cross(float4 lhs, float4 rhs) {
82996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    float4 r;
83096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.x = lhs.y * rhs.z  - lhs.z * rhs.y;
83196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.y = lhs.z * rhs.x  - lhs.x * rhs.z;
83296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.z = lhs.x * rhs.y  - lhs.y * rhs.x;
83396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    r.w = 0.f;
83496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return r;
83596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
83696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
837793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) dot(float lhs, float rhs) {
83896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return lhs * rhs;
83996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
840793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) dot(float2 lhs, float2 rhs) {
84196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return lhs.x*rhs.x + lhs.y*rhs.y;
84296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
843793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) dot(float3 lhs, float3 rhs) {
84496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z;
84596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
846793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) dot(float4 lhs, float4 rhs) {
84796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z + lhs.w*rhs.w;
84896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
84996d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
850793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) length(float v) {
85196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return v;
85296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
853793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) length(float2 v) {
85496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return sqrt(v.x*v.x + v.y*v.y);
85596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
856793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) length(float3 v) {
85796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
85896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
859793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) length(float4 v) {
86096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return sqrt(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w);
86196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
86296d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
863793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) distance(float lhs, float rhs) {
86496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return length(lhs - rhs);
86596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
866793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) distance(float2 lhs, float2 rhs) {
86796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return length(lhs - rhs);
86896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
869793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) distance(float3 lhs, float3 rhs) {
87096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return length(lhs - rhs);
87196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
872793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) distance(float4 lhs, float4 rhs) {
87396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return length(lhs - rhs);
87496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
87596d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
876793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float __attribute__((overloadable)) normalize(float v) {
87796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return 1.f;
87896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
879793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float2 __attribute__((overloadable)) normalize(float2 v) {
88096d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return v / length(v);
88196d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
882793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float3 __attribute__((overloadable)) normalize(float3 v) {
88396d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return v / length(v);
88496d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
885793786c25878f1324b9cb44c47050c180ad68693Stephen Hines_RS_STATIC float4 __attribute__((overloadable)) normalize(float4 v) {
88696d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams    return v / length(v);
88796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams}
88896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
889682c4a860b435a6888ea0ea753a7ba6194bb442aStephen Hines#undef CVT_FUNC
890682c4a860b435a6888ea0ea753a7ba6194bb442aStephen Hines#undef CVT_FUNC_2
891833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef FN_FUNC_FN
892833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef IN_FUNC_FN
893833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef FN_FUNC_FN_FN
894833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef FN_FUNC_FN_F
895833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef FN_FUNC_FN_IN
896833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef FN_FUNC_FN_I
897833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef FN_FUNC_FN_PFN
898833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef FN_FUNC_FN_PIN
899833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef FN_FUNC_FN_FN_FN
900833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef FN_FUNC_FN_FN_PIN
901833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef XN_FUNC_YN
902833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef UIN_FUNC_IN
903833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef IN_FUNC_IN
904833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef XN_FUNC_XN_XN_BODY
905833166d274030bfd90653626f0e9f5bf710f7d4bStephen Hines#undef IN_FUNC_IN_IN_BODY
906793786c25878f1324b9cb44c47050c180ad68693Stephen Hines#undef _RS_STATIC
90796d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams
90896d719c91708fda5abc0442fcf6d275584d2cad6Jason Sams#endif
909