1*e1eccf28SAndroid Build Coastguard Worker #include "rs_core.rsh"
2*e1eccf28SAndroid Build Coastguard Worker #include "rs_f16_util.h"
3*e1eccf28SAndroid Build Coastguard Worker
4*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) convert_float2(int2 c);
5*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) convert_float3(int3 c);
6*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) convert_float4(int4 c);
7*e1eccf28SAndroid Build Coastguard Worker
8*e1eccf28SAndroid Build Coastguard Worker extern int2 __attribute__((overloadable)) convert_int2(float2 c);
9*e1eccf28SAndroid Build Coastguard Worker extern int3 __attribute__((overloadable)) convert_int3(float3 c);
10*e1eccf28SAndroid Build Coastguard Worker extern int4 __attribute__((overloadable)) convert_int4(float4 c);
11*e1eccf28SAndroid Build Coastguard Worker
12*e1eccf28SAndroid Build Coastguard Worker
13*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fmin(float v, float v2);
14*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fmin(float2 v, float v2);
15*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fmin(float3 v, float v2);
16*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fmin(float4 v, float v2);
17*e1eccf28SAndroid Build Coastguard Worker
18*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fmax(float v, float v2);
19*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fmax(float2 v, float v2);
20*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fmax(float3 v, float v2);
21*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fmax(float4 v, float v2);
22*e1eccf28SAndroid Build Coastguard Worker
23*e1eccf28SAndroid Build Coastguard Worker // Float ops, 6.11.2
24*e1eccf28SAndroid Build Coastguard Worker
25*e1eccf28SAndroid Build Coastguard Worker #define FN_FUNC_FN(fnc) \
26*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fnc(float2 v) { \
27*e1eccf28SAndroid Build Coastguard Worker float2 r; \
28*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v.x); \
29*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v.y); \
30*e1eccf28SAndroid Build Coastguard Worker return r; \
31*e1eccf28SAndroid Build Coastguard Worker } \
32*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fnc(float3 v) { \
33*e1eccf28SAndroid Build Coastguard Worker float3 r; \
34*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v.x); \
35*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v.y); \
36*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v.z); \
37*e1eccf28SAndroid Build Coastguard Worker return r; \
38*e1eccf28SAndroid Build Coastguard Worker } \
39*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fnc(float4 v) { \
40*e1eccf28SAndroid Build Coastguard Worker float4 r; \
41*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v.x); \
42*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v.y); \
43*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v.z); \
44*e1eccf28SAndroid Build Coastguard Worker r.w = fnc(v.w); \
45*e1eccf28SAndroid Build Coastguard Worker return r; \
46*e1eccf28SAndroid Build Coastguard Worker }
47*e1eccf28SAndroid Build Coastguard Worker
48*e1eccf28SAndroid Build Coastguard Worker #define IN_FUNC_FN(fnc) \
49*e1eccf28SAndroid Build Coastguard Worker extern int2 __attribute__((overloadable)) fnc(float2 v) { \
50*e1eccf28SAndroid Build Coastguard Worker int2 r; \
51*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v.x); \
52*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v.y); \
53*e1eccf28SAndroid Build Coastguard Worker return r; \
54*e1eccf28SAndroid Build Coastguard Worker } \
55*e1eccf28SAndroid Build Coastguard Worker extern int3 __attribute__((overloadable)) fnc(float3 v) { \
56*e1eccf28SAndroid Build Coastguard Worker int3 r; \
57*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v.x); \
58*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v.y); \
59*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v.z); \
60*e1eccf28SAndroid Build Coastguard Worker return r; \
61*e1eccf28SAndroid Build Coastguard Worker } \
62*e1eccf28SAndroid Build Coastguard Worker extern int4 __attribute__((overloadable)) fnc(float4 v) { \
63*e1eccf28SAndroid Build Coastguard Worker int4 r; \
64*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v.x); \
65*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v.y); \
66*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v.z); \
67*e1eccf28SAndroid Build Coastguard Worker r.w = fnc(v.w); \
68*e1eccf28SAndroid Build Coastguard Worker return r; \
69*e1eccf28SAndroid Build Coastguard Worker }
70*e1eccf28SAndroid Build Coastguard Worker
71*e1eccf28SAndroid Build Coastguard Worker #define FN_FUNC_FN_FN(fnc) \
72*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2) { \
73*e1eccf28SAndroid Build Coastguard Worker float2 r; \
74*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x); \
75*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y); \
76*e1eccf28SAndroid Build Coastguard Worker return r; \
77*e1eccf28SAndroid Build Coastguard Worker } \
78*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fnc(float3 v1, float3 v2) { \
79*e1eccf28SAndroid Build Coastguard Worker float3 r; \
80*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x); \
81*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y); \
82*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2.z); \
83*e1eccf28SAndroid Build Coastguard Worker return r; \
84*e1eccf28SAndroid Build Coastguard Worker } \
85*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2) { \
86*e1eccf28SAndroid Build Coastguard Worker float4 r; \
87*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x); \
88*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y); \
89*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2.z); \
90*e1eccf28SAndroid Build Coastguard Worker r.w = fnc(v1.w, v2.w); \
91*e1eccf28SAndroid Build Coastguard Worker return r; \
92*e1eccf28SAndroid Build Coastguard Worker }
93*e1eccf28SAndroid Build Coastguard Worker
94*e1eccf28SAndroid Build Coastguard Worker #define FN_FUNC_FN_F(fnc) \
95*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fnc(float2 v1, float v2) { \
96*e1eccf28SAndroid Build Coastguard Worker float2 r; \
97*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2); \
98*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2); \
99*e1eccf28SAndroid Build Coastguard Worker return r; \
100*e1eccf28SAndroid Build Coastguard Worker } \
101*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fnc(float3 v1, float v2) { \
102*e1eccf28SAndroid Build Coastguard Worker float3 r; \
103*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2); \
104*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2); \
105*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2); \
106*e1eccf28SAndroid Build Coastguard Worker return r; \
107*e1eccf28SAndroid Build Coastguard Worker } \
108*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fnc(float4 v1, float v2) { \
109*e1eccf28SAndroid Build Coastguard Worker float4 r; \
110*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2); \
111*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2); \
112*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2); \
113*e1eccf28SAndroid Build Coastguard Worker r.w = fnc(v1.w, v2); \
114*e1eccf28SAndroid Build Coastguard Worker return r; \
115*e1eccf28SAndroid Build Coastguard Worker }
116*e1eccf28SAndroid Build Coastguard Worker
117*e1eccf28SAndroid Build Coastguard Worker #define FN_FUNC_FN_IN(fnc) \
118*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fnc(float2 v1, int2 v2) { \
119*e1eccf28SAndroid Build Coastguard Worker float2 r; \
120*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x); \
121*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y); \
122*e1eccf28SAndroid Build Coastguard Worker return r; \
123*e1eccf28SAndroid Build Coastguard Worker } \
124*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fnc(float3 v1, int3 v2) { \
125*e1eccf28SAndroid Build Coastguard Worker float3 r; \
126*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x); \
127*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y); \
128*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2.z); \
129*e1eccf28SAndroid Build Coastguard Worker return r; \
130*e1eccf28SAndroid Build Coastguard Worker } \
131*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fnc(float4 v1, int4 v2) { \
132*e1eccf28SAndroid Build Coastguard Worker float4 r; \
133*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x); \
134*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y); \
135*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2.z); \
136*e1eccf28SAndroid Build Coastguard Worker r.w = fnc(v1.w, v2.w); \
137*e1eccf28SAndroid Build Coastguard Worker return r; \
138*e1eccf28SAndroid Build Coastguard Worker }
139*e1eccf28SAndroid Build Coastguard Worker
140*e1eccf28SAndroid Build Coastguard Worker #define FN_FUNC_FN_I(fnc) \
141*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fnc(float2 v1, int v2) { \
142*e1eccf28SAndroid Build Coastguard Worker float2 r; \
143*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2); \
144*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2); \
145*e1eccf28SAndroid Build Coastguard Worker return r; \
146*e1eccf28SAndroid Build Coastguard Worker } \
147*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fnc(float3 v1, int v2) { \
148*e1eccf28SAndroid Build Coastguard Worker float3 r; \
149*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2); \
150*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2); \
151*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2); \
152*e1eccf28SAndroid Build Coastguard Worker return r; \
153*e1eccf28SAndroid Build Coastguard Worker } \
154*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fnc(float4 v1, int v2) { \
155*e1eccf28SAndroid Build Coastguard Worker float4 r; \
156*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2); \
157*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2); \
158*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2); \
159*e1eccf28SAndroid Build Coastguard Worker r.w = fnc(v1.w, v2); \
160*e1eccf28SAndroid Build Coastguard Worker return r; \
161*e1eccf28SAndroid Build Coastguard Worker }
162*e1eccf28SAndroid Build Coastguard Worker
163*e1eccf28SAndroid Build Coastguard Worker #define FN_FUNC_FN_PFN(fnc) \
164*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) \
165*e1eccf28SAndroid Build Coastguard Worker fnc(float2 v1, float2 *v2) { \
166*e1eccf28SAndroid Build Coastguard Worker float2 r; \
167*e1eccf28SAndroid Build Coastguard Worker float t[2]; \
168*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, &t[0]); \
169*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, &t[1]); \
170*e1eccf28SAndroid Build Coastguard Worker v2->x = t[0]; \
171*e1eccf28SAndroid Build Coastguard Worker v2->y = t[1]; \
172*e1eccf28SAndroid Build Coastguard Worker return r; \
173*e1eccf28SAndroid Build Coastguard Worker } \
174*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) \
175*e1eccf28SAndroid Build Coastguard Worker fnc(float3 v1, float3 *v2) { \
176*e1eccf28SAndroid Build Coastguard Worker float3 r; \
177*e1eccf28SAndroid Build Coastguard Worker float t[3]; \
178*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, &t[0]); \
179*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, &t[1]); \
180*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, &t[2]); \
181*e1eccf28SAndroid Build Coastguard Worker v2->x = t[0]; \
182*e1eccf28SAndroid Build Coastguard Worker v2->y = t[1]; \
183*e1eccf28SAndroid Build Coastguard Worker v2->z = t[2]; \
184*e1eccf28SAndroid Build Coastguard Worker return r; \
185*e1eccf28SAndroid Build Coastguard Worker } \
186*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) \
187*e1eccf28SAndroid Build Coastguard Worker fnc(float4 v1, float4 *v2) { \
188*e1eccf28SAndroid Build Coastguard Worker float4 r; \
189*e1eccf28SAndroid Build Coastguard Worker float t[4]; \
190*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, &t[0]); \
191*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, &t[1]); \
192*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, &t[2]); \
193*e1eccf28SAndroid Build Coastguard Worker r.w = fnc(v1.w, &t[3]); \
194*e1eccf28SAndroid Build Coastguard Worker v2->x = t[0]; \
195*e1eccf28SAndroid Build Coastguard Worker v2->y = t[1]; \
196*e1eccf28SAndroid Build Coastguard Worker v2->z = t[2]; \
197*e1eccf28SAndroid Build Coastguard Worker v2->w = t[3]; \
198*e1eccf28SAndroid Build Coastguard Worker return r; \
199*e1eccf28SAndroid Build Coastguard Worker }
200*e1eccf28SAndroid Build Coastguard Worker
201*e1eccf28SAndroid Build Coastguard Worker #define FN_FUNC_FN_PIN(fnc) \
202*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fnc(float2 v1, int2 *v2) { \
203*e1eccf28SAndroid Build Coastguard Worker float2 r; \
204*e1eccf28SAndroid Build Coastguard Worker int t[2]; \
205*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, &t[0]); \
206*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, &t[1]); \
207*e1eccf28SAndroid Build Coastguard Worker v2->x = t[0]; \
208*e1eccf28SAndroid Build Coastguard Worker v2->y = t[1]; \
209*e1eccf28SAndroid Build Coastguard Worker return r; \
210*e1eccf28SAndroid Build Coastguard Worker } \
211*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fnc(float3 v1, int3 *v2) { \
212*e1eccf28SAndroid Build Coastguard Worker float3 r; \
213*e1eccf28SAndroid Build Coastguard Worker int t[3]; \
214*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, &t[0]); \
215*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, &t[1]); \
216*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, &t[2]); \
217*e1eccf28SAndroid Build Coastguard Worker v2->x = t[0]; \
218*e1eccf28SAndroid Build Coastguard Worker v2->y = t[1]; \
219*e1eccf28SAndroid Build Coastguard Worker v2->z = t[2]; \
220*e1eccf28SAndroid Build Coastguard Worker return r; \
221*e1eccf28SAndroid Build Coastguard Worker } \
222*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fnc(float4 v1, int4 *v2) { \
223*e1eccf28SAndroid Build Coastguard Worker float4 r; \
224*e1eccf28SAndroid Build Coastguard Worker int t[4]; \
225*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, &t[0]); \
226*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, &t[1]); \
227*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, &t[2]); \
228*e1eccf28SAndroid Build Coastguard Worker r.w = fnc(v1.w, &t[3]); \
229*e1eccf28SAndroid Build Coastguard Worker v2->x = t[0]; \
230*e1eccf28SAndroid Build Coastguard Worker v2->y = t[1]; \
231*e1eccf28SAndroid Build Coastguard Worker v2->z = t[2]; \
232*e1eccf28SAndroid Build Coastguard Worker v2->w = t[3]; \
233*e1eccf28SAndroid Build Coastguard Worker return r; \
234*e1eccf28SAndroid Build Coastguard Worker }
235*e1eccf28SAndroid Build Coastguard Worker
236*e1eccf28SAndroid Build Coastguard Worker #define FN_FUNC_FN_FN_FN(fnc) \
237*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) \
238*e1eccf28SAndroid Build Coastguard Worker fnc(float2 v1, float2 v2, float2 v3) { \
239*e1eccf28SAndroid Build Coastguard Worker float2 r; \
240*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x, v3.x); \
241*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y, v3.y); \
242*e1eccf28SAndroid Build Coastguard Worker return r; \
243*e1eccf28SAndroid Build Coastguard Worker } \
244*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) \
245*e1eccf28SAndroid Build Coastguard Worker fnc(float3 v1, float3 v2, float3 v3) { \
246*e1eccf28SAndroid Build Coastguard Worker float3 r; \
247*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x, v3.x); \
248*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y, v3.y); \
249*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2.z, v3.z); \
250*e1eccf28SAndroid Build Coastguard Worker return r; \
251*e1eccf28SAndroid Build Coastguard Worker } \
252*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) \
253*e1eccf28SAndroid Build Coastguard Worker fnc(float4 v1, float4 v2, float4 v3) { \
254*e1eccf28SAndroid Build Coastguard Worker float4 r; \
255*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x, v3.x); \
256*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y, v3.y); \
257*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2.z, v3.z); \
258*e1eccf28SAndroid Build Coastguard Worker r.w = fnc(v1.w, v2.w, v3.w); \
259*e1eccf28SAndroid Build Coastguard Worker return r; \
260*e1eccf28SAndroid Build Coastguard Worker }
261*e1eccf28SAndroid Build Coastguard Worker
262*e1eccf28SAndroid Build Coastguard Worker #define FN_FUNC_FN_FN_PIN(fnc) \
263*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) \
264*e1eccf28SAndroid Build Coastguard Worker fnc(float2 v1, float2 v2, int2 *v3) { \
265*e1eccf28SAndroid Build Coastguard Worker float2 r; \
266*e1eccf28SAndroid Build Coastguard Worker int t[2]; \
267*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x, &t[0]); \
268*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y, &t[1]); \
269*e1eccf28SAndroid Build Coastguard Worker v3->x = t[0]; \
270*e1eccf28SAndroid Build Coastguard Worker v3->y = t[1]; \
271*e1eccf28SAndroid Build Coastguard Worker return r; \
272*e1eccf28SAndroid Build Coastguard Worker } \
273*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) \
274*e1eccf28SAndroid Build Coastguard Worker fnc(float3 v1, float3 v2, int3 *v3) { \
275*e1eccf28SAndroid Build Coastguard Worker float3 r; \
276*e1eccf28SAndroid Build Coastguard Worker int t[3]; \
277*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x, &t[0]); \
278*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y, &t[1]); \
279*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2.z, &t[2]); \
280*e1eccf28SAndroid Build Coastguard Worker v3->x = t[0]; \
281*e1eccf28SAndroid Build Coastguard Worker v3->y = t[1]; \
282*e1eccf28SAndroid Build Coastguard Worker v3->z = t[2]; \
283*e1eccf28SAndroid Build Coastguard Worker return r; \
284*e1eccf28SAndroid Build Coastguard Worker } \
285*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) \
286*e1eccf28SAndroid Build Coastguard Worker fnc(float4 v1, float4 v2, int4 *v3) { \
287*e1eccf28SAndroid Build Coastguard Worker float4 r; \
288*e1eccf28SAndroid Build Coastguard Worker int t[4]; \
289*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x, &t[0]); \
290*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y, &t[1]); \
291*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2.z, &t[2]); \
292*e1eccf28SAndroid Build Coastguard Worker r.w = fnc(v1.w, v2.w, &t[3]); \
293*e1eccf28SAndroid Build Coastguard Worker v3->x = t[0]; \
294*e1eccf28SAndroid Build Coastguard Worker v3->y = t[1]; \
295*e1eccf28SAndroid Build Coastguard Worker v3->z = t[2]; \
296*e1eccf28SAndroid Build Coastguard Worker v3->w = t[3]; \
297*e1eccf28SAndroid Build Coastguard Worker return r; \
298*e1eccf28SAndroid Build Coastguard Worker }
299*e1eccf28SAndroid Build Coastguard Worker
300*e1eccf28SAndroid Build Coastguard Worker static const unsigned int iposinf = 0x7f800000;
301*e1eccf28SAndroid Build Coastguard Worker static const unsigned int ineginf = 0xff800000;
302*e1eccf28SAndroid Build Coastguard Worker
posinf()303*e1eccf28SAndroid Build Coastguard Worker static float posinf() {
304*e1eccf28SAndroid Build Coastguard Worker float f = *((float*)&iposinf);
305*e1eccf28SAndroid Build Coastguard Worker return f;
306*e1eccf28SAndroid Build Coastguard Worker }
307*e1eccf28SAndroid Build Coastguard Worker
float_bits(float f)308*e1eccf28SAndroid Build Coastguard Worker static unsigned int float_bits(float f) {
309*e1eccf28SAndroid Build Coastguard Worker /* TODO(jeanluc) Use this better approach once the Mac(SDK) build issues are fixed.
310*e1eccf28SAndroid Build Coastguard Worker // Get the bits while following the strict aliasing rules.
311*e1eccf28SAndroid Build Coastguard Worker unsigned int result;
312*e1eccf28SAndroid Build Coastguard Worker memcpy(&result, &f, sizeof(f));
313*e1eccf28SAndroid Build Coastguard Worker return result;
314*e1eccf28SAndroid Build Coastguard Worker */
315*e1eccf28SAndroid Build Coastguard Worker return *(unsigned int*)(char*)(&f);
316*e1eccf28SAndroid Build Coastguard Worker }
317*e1eccf28SAndroid Build Coastguard Worker
isinf(float f)318*e1eccf28SAndroid Build Coastguard Worker static bool isinf(float f) {
319*e1eccf28SAndroid Build Coastguard Worker unsigned int i = float_bits(f);
320*e1eccf28SAndroid Build Coastguard Worker return (i == iposinf) || (i == ineginf);
321*e1eccf28SAndroid Build Coastguard Worker }
322*e1eccf28SAndroid Build Coastguard Worker
isnan(float f)323*e1eccf28SAndroid Build Coastguard Worker static bool isnan(float f) {
324*e1eccf28SAndroid Build Coastguard Worker unsigned int i = float_bits(f);
325*e1eccf28SAndroid Build Coastguard Worker return (((i & 0x7f800000) == 0x7f800000) && (i & 0x007fffff));
326*e1eccf28SAndroid Build Coastguard Worker }
327*e1eccf28SAndroid Build Coastguard Worker
isposzero(float f)328*e1eccf28SAndroid Build Coastguard Worker static bool isposzero(float f) {
329*e1eccf28SAndroid Build Coastguard Worker return (float_bits(f) == 0x00000000);
330*e1eccf28SAndroid Build Coastguard Worker }
331*e1eccf28SAndroid Build Coastguard Worker
isnegzero(float f)332*e1eccf28SAndroid Build Coastguard Worker static bool isnegzero(float f) {
333*e1eccf28SAndroid Build Coastguard Worker return (float_bits(f) == 0x80000000);
334*e1eccf28SAndroid Build Coastguard Worker }
335*e1eccf28SAndroid Build Coastguard Worker
iszero(float f)336*e1eccf28SAndroid Build Coastguard Worker static bool iszero(float f) {
337*e1eccf28SAndroid Build Coastguard Worker return isposzero(f) || isnegzero(f);
338*e1eccf28SAndroid Build Coastguard Worker }
339*e1eccf28SAndroid Build Coastguard Worker
340*e1eccf28SAndroid Build Coastguard Worker
341*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_acosf(float);
acos(float v)342*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) acos(float v) {
343*e1eccf28SAndroid Build Coastguard Worker return SC_acosf(v);
344*e1eccf28SAndroid Build Coastguard Worker }
345*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(acos)
346*e1eccf28SAndroid Build Coastguard Worker
347*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_acoshf(float);
acosh(float v)348*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) acosh(float v) {
349*e1eccf28SAndroid Build Coastguard Worker return SC_acoshf(v);
350*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(acosh)351*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(acosh)
352*e1eccf28SAndroid Build Coastguard Worker
353*e1eccf28SAndroid Build Coastguard Worker
354*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) acospi(float v) {
355*e1eccf28SAndroid Build Coastguard Worker return acos(v) / M_PI;
356*e1eccf28SAndroid Build Coastguard Worker }
357*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(acospi)
358*e1eccf28SAndroid Build Coastguard Worker
359*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_asinf(float);
asin(float v)360*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) asin(float v) {
361*e1eccf28SAndroid Build Coastguard Worker return SC_asinf(v);
362*e1eccf28SAndroid Build Coastguard Worker }
363*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(asin)
364*e1eccf28SAndroid Build Coastguard Worker
365*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_asinhf(float);
asinh(float v)366*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) asinh(float v) {
367*e1eccf28SAndroid Build Coastguard Worker return SC_asinhf(v);
368*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(asinh)369*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(asinh)
370*e1eccf28SAndroid Build Coastguard Worker
371*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) asinpi(float v) {
372*e1eccf28SAndroid Build Coastguard Worker return asin(v) / M_PI;
373*e1eccf28SAndroid Build Coastguard Worker }
374*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(asinpi)
375*e1eccf28SAndroid Build Coastguard Worker
376*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_atanf(float);
atan(float v)377*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) atan(float v) {
378*e1eccf28SAndroid Build Coastguard Worker return SC_atanf(v);
379*e1eccf28SAndroid Build Coastguard Worker }
380*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(atan)
381*e1eccf28SAndroid Build Coastguard Worker
382*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_atan2f(float, float);
atan2(float v1,float v2)383*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) atan2(float v1, float v2) {
384*e1eccf28SAndroid Build Coastguard Worker return SC_atan2f(v1, v2);
385*e1eccf28SAndroid Build Coastguard Worker }
386*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_FN(atan2)
387*e1eccf28SAndroid Build Coastguard Worker
388*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_atanhf(float);
atanh(float v)389*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) atanh(float v) {
390*e1eccf28SAndroid Build Coastguard Worker return SC_atanhf(v);
391*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(atanh)392*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(atanh)
393*e1eccf28SAndroid Build Coastguard Worker
394*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) atanpi(float v) {
395*e1eccf28SAndroid Build Coastguard Worker return atan(v) / M_PI;
396*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(atanpi)397*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(atanpi)
398*e1eccf28SAndroid Build Coastguard Worker
399*e1eccf28SAndroid Build Coastguard Worker
400*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) atan2pi(float y, float x) {
401*e1eccf28SAndroid Build Coastguard Worker return atan2(y, x) / M_PI;
402*e1eccf28SAndroid Build Coastguard Worker }
403*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_FN(atan2pi)
404*e1eccf28SAndroid Build Coastguard Worker
405*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_cbrtf(float);
cbrt(float v)406*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) cbrt(float v) {
407*e1eccf28SAndroid Build Coastguard Worker return SC_cbrtf(v);
408*e1eccf28SAndroid Build Coastguard Worker }
409*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(cbrt)
410*e1eccf28SAndroid Build Coastguard Worker
411*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_ceilf(float);
ceil(float v)412*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) ceil(float v) {
413*e1eccf28SAndroid Build Coastguard Worker return SC_ceilf(v);
414*e1eccf28SAndroid Build Coastguard Worker }
415*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(ceil)
416*e1eccf28SAndroid Build Coastguard Worker
417*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_copysignf(float, float);
copysign(float v1,float v2)418*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) copysign(float v1, float v2) {
419*e1eccf28SAndroid Build Coastguard Worker return SC_copysignf(v1, v2);
420*e1eccf28SAndroid Build Coastguard Worker }
421*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_FN(copysign)
422*e1eccf28SAndroid Build Coastguard Worker
423*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_cosf(float);
cos(float v)424*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) cos(float v) {
425*e1eccf28SAndroid Build Coastguard Worker return SC_cosf(v);
426*e1eccf28SAndroid Build Coastguard Worker }
427*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(cos)
428*e1eccf28SAndroid Build Coastguard Worker
429*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_coshf(float);
cosh(float v)430*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) cosh(float v) {
431*e1eccf28SAndroid Build Coastguard Worker return SC_coshf(v);
432*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(cosh)433*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(cosh)
434*e1eccf28SAndroid Build Coastguard Worker
435*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) cospi(float v) {
436*e1eccf28SAndroid Build Coastguard Worker return cos(v * M_PI);
437*e1eccf28SAndroid Build Coastguard Worker }
438*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(cospi)
439*e1eccf28SAndroid Build Coastguard Worker
440*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_erfcf(float);
erfc(float v)441*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) erfc(float v) {
442*e1eccf28SAndroid Build Coastguard Worker return SC_erfcf(v);
443*e1eccf28SAndroid Build Coastguard Worker }
444*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(erfc)
445*e1eccf28SAndroid Build Coastguard Worker
446*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_erff(float);
erf(float v)447*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) erf(float v) {
448*e1eccf28SAndroid Build Coastguard Worker return SC_erff(v);
449*e1eccf28SAndroid Build Coastguard Worker }
450*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(erf)
451*e1eccf28SAndroid Build Coastguard Worker
452*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_expf(float);
exp(float v)453*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) exp(float v) {
454*e1eccf28SAndroid Build Coastguard Worker return SC_expf(v);
455*e1eccf28SAndroid Build Coastguard Worker }
456*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(exp)
457*e1eccf28SAndroid Build Coastguard Worker
458*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_exp2f(float);
exp2(float v)459*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) exp2(float v) {
460*e1eccf28SAndroid Build Coastguard Worker return SC_exp2f(v);
461*e1eccf28SAndroid Build Coastguard Worker }
462*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(exp2)
463*e1eccf28SAndroid Build Coastguard Worker
464*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) pow(float, float);
465*e1eccf28SAndroid Build Coastguard Worker
exp10(float v)466*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) exp10(float v) {
467*e1eccf28SAndroid Build Coastguard Worker return exp2(v * 3.321928095f);
468*e1eccf28SAndroid Build Coastguard Worker }
469*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(exp10)
470*e1eccf28SAndroid Build Coastguard Worker
471*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_expm1f(float);
expm1(float v)472*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) expm1(float v) {
473*e1eccf28SAndroid Build Coastguard Worker return SC_expm1f(v);
474*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(expm1)475*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(expm1)
476*e1eccf28SAndroid Build Coastguard Worker
477*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fabs(float v) {
478*e1eccf28SAndroid Build Coastguard Worker int i = *((int*)(void*)&v) & 0x7fffffff;
479*e1eccf28SAndroid Build Coastguard Worker return *((float*)(void*)&i);
480*e1eccf28SAndroid Build Coastguard Worker }
481*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(fabs)
482*e1eccf28SAndroid Build Coastguard Worker
483*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_fdimf(float, float);
fdim(float v1,float v2)484*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) fdim(float v1, float v2) {
485*e1eccf28SAndroid Build Coastguard Worker return SC_fdimf(v1, v2);
486*e1eccf28SAndroid Build Coastguard Worker }
487*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_FN(fdim)
488*e1eccf28SAndroid Build Coastguard Worker
489*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_floorf(float);
floor(float v)490*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) floor(float v) {
491*e1eccf28SAndroid Build Coastguard Worker return SC_floorf(v);
492*e1eccf28SAndroid Build Coastguard Worker }
493*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(floor)
494*e1eccf28SAndroid Build Coastguard Worker
495*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_fmaf(float, float, float);
fma(float v1,float v2,float v3)496*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) fma(float v1, float v2, float v3) {
497*e1eccf28SAndroid Build Coastguard Worker return SC_fmaf(v1, v2, v3);
498*e1eccf28SAndroid Build Coastguard Worker }
499*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_FN_FN(fma)
500*e1eccf28SAndroid Build Coastguard Worker
501*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_fminf(float, float);
502*e1eccf28SAndroid Build Coastguard Worker
503*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_fmodf(float, float);
fmod(float v1,float v2)504*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) fmod(float v1, float v2) {
505*e1eccf28SAndroid Build Coastguard Worker return SC_fmodf(v1, v2);
506*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN_FN(fmod)507*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_FN(fmod)
508*e1eccf28SAndroid Build Coastguard Worker
509*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fract(float v, float *iptr) {
510*e1eccf28SAndroid Build Coastguard Worker int i = (int)floor(v);
511*e1eccf28SAndroid Build Coastguard Worker if (iptr) {
512*e1eccf28SAndroid Build Coastguard Worker iptr[0] = i;
513*e1eccf28SAndroid Build Coastguard Worker }
514*e1eccf28SAndroid Build Coastguard Worker return fmin(v - i, 0x1.fffffep-1f);
515*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN_PFN(fract)516*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_PFN(fract)
517*e1eccf28SAndroid Build Coastguard Worker
518*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((const, overloadable)) fract(float v) {
519*e1eccf28SAndroid Build Coastguard Worker float unused;
520*e1eccf28SAndroid Build Coastguard Worker return fract(v, &unused);
521*e1eccf28SAndroid Build Coastguard Worker }
522*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(fract)
523*e1eccf28SAndroid Build Coastguard Worker
524*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_frexpf(float, int *);
frexp(float v1,int * v2)525*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) frexp(float v1, int* v2) {
526*e1eccf28SAndroid Build Coastguard Worker return SC_frexpf(v1, v2);
527*e1eccf28SAndroid Build Coastguard Worker }
528*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_PIN(frexp)
529*e1eccf28SAndroid Build Coastguard Worker
530*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_hypotf(float, float);
hypot(float v1,float v2)531*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) hypot(float v1, float v2) {
532*e1eccf28SAndroid Build Coastguard Worker return SC_hypotf(v1, v2);
533*e1eccf28SAndroid Build Coastguard Worker }
534*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_FN(hypot)
535*e1eccf28SAndroid Build Coastguard Worker
536*e1eccf28SAndroid Build Coastguard Worker extern int __attribute__((overloadable)) SC_ilogbf(float);
ilogb(float v)537*e1eccf28SAndroid Build Coastguard Worker int __attribute__((overloadable)) ilogb(float v) {
538*e1eccf28SAndroid Build Coastguard Worker return SC_ilogbf(v);
539*e1eccf28SAndroid Build Coastguard Worker }
540*e1eccf28SAndroid Build Coastguard Worker IN_FUNC_FN(ilogb)
541*e1eccf28SAndroid Build Coastguard Worker
542*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_ldexpf(float, int);
ldexp(float v1,int v2)543*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) ldexp(float v1, int v2) {
544*e1eccf28SAndroid Build Coastguard Worker return SC_ldexpf(v1, v2);
545*e1eccf28SAndroid Build Coastguard Worker }
546*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_IN(ldexp)
547*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_I(ldexp)
548*e1eccf28SAndroid Build Coastguard Worker
549*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_lgammaf(float);
lgamma(float v)550*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) lgamma(float v) {
551*e1eccf28SAndroid Build Coastguard Worker return SC_lgammaf(v);
552*e1eccf28SAndroid Build Coastguard Worker }
553*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(lgamma)
554*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_lgammaf_r(float, int*);
lgamma(float v,int * ptr)555*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) lgamma(float v, int* ptr) {
556*e1eccf28SAndroid Build Coastguard Worker return SC_lgammaf_r(v, ptr);
557*e1eccf28SAndroid Build Coastguard Worker }
558*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_PIN(lgamma)
559*e1eccf28SAndroid Build Coastguard Worker
560*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_logf(float);
log(float v)561*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) log(float v) {
562*e1eccf28SAndroid Build Coastguard Worker return SC_logf(v);
563*e1eccf28SAndroid Build Coastguard Worker }
564*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(log)
565*e1eccf28SAndroid Build Coastguard Worker
566*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_log10f(float);
log10(float v)567*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) log10(float v) {
568*e1eccf28SAndroid Build Coastguard Worker return SC_log10f(v);
569*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(log10)570*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(log10)
571*e1eccf28SAndroid Build Coastguard Worker
572*e1eccf28SAndroid Build Coastguard Worker
573*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) log2(float v) {
574*e1eccf28SAndroid Build Coastguard Worker return log10(v) * 3.321928095f;
575*e1eccf28SAndroid Build Coastguard Worker }
576*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(log2)
577*e1eccf28SAndroid Build Coastguard Worker
578*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_log1pf(float);
log1p(float v)579*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) log1p(float v) {
580*e1eccf28SAndroid Build Coastguard Worker return SC_log1pf(v);
581*e1eccf28SAndroid Build Coastguard Worker }
582*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(log1p)
583*e1eccf28SAndroid Build Coastguard Worker
584*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_logbf(float);
logb(float v)585*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) logb(float v) {
586*e1eccf28SAndroid Build Coastguard Worker return SC_logbf(v);
587*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(logb)588*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(logb)
589*e1eccf28SAndroid Build Coastguard Worker
590*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) mad(float a, float b, float c) {
591*e1eccf28SAndroid Build Coastguard Worker return a * b + c;
592*e1eccf28SAndroid Build Coastguard Worker }
mad(float2 a,float2 b,float2 c)593*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) mad(float2 a, float2 b, float2 c) {
594*e1eccf28SAndroid Build Coastguard Worker return a * b + c;
595*e1eccf28SAndroid Build Coastguard Worker }
mad(float3 a,float3 b,float3 c)596*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) mad(float3 a, float3 b, float3 c) {
597*e1eccf28SAndroid Build Coastguard Worker return a * b + c;
598*e1eccf28SAndroid Build Coastguard Worker }
mad(float4 a,float4 b,float4 c)599*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) mad(float4 a, float4 b, float4 c) {
600*e1eccf28SAndroid Build Coastguard Worker return a * b + c;
601*e1eccf28SAndroid Build Coastguard Worker }
602*e1eccf28SAndroid Build Coastguard Worker
603*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_modff(float, float *);
modf(float v1,float * v2)604*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) modf(float v1, float *v2) {
605*e1eccf28SAndroid Build Coastguard Worker return SC_modff(v1, v2);
606*e1eccf28SAndroid Build Coastguard Worker }
607*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_PFN(modf);
608*e1eccf28SAndroid Build Coastguard Worker
nan(uint v)609*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) nan(uint v) {
610*e1eccf28SAndroid Build Coastguard Worker float f[1];
611*e1eccf28SAndroid Build Coastguard Worker uint32_t *ip = (uint32_t *)f;
612*e1eccf28SAndroid Build Coastguard Worker *ip = v | 0x7fc00000;
613*e1eccf28SAndroid Build Coastguard Worker return f[0];
614*e1eccf28SAndroid Build Coastguard Worker }
615*e1eccf28SAndroid Build Coastguard Worker
616*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_nextafterf(float, float);
nextafter(float v1,float v2)617*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) nextafter(float v1, float v2) {
618*e1eccf28SAndroid Build Coastguard Worker return SC_nextafterf(v1, v2);
619*e1eccf28SAndroid Build Coastguard Worker }
620*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_FN(nextafter)
621*e1eccf28SAndroid Build Coastguard Worker
622*e1eccf28SAndroid Build Coastguard Worker // This function must be defined here if we're compiling with debug info
623*e1eccf28SAndroid Build Coastguard Worker // (libclcore_g.bc), because we need a C source to get debug information.
624*e1eccf28SAndroid Build Coastguard Worker // Otherwise the implementation can be found in IR.
625*e1eccf28SAndroid Build Coastguard Worker #if defined(RS_G_RUNTIME)
626*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_powf(float, float);
pow(float v1,float v2)627*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) pow(float v1, float v2) {
628*e1eccf28SAndroid Build Coastguard Worker return SC_powf(v1, v2);
629*e1eccf28SAndroid Build Coastguard Worker }
630*e1eccf28SAndroid Build Coastguard Worker #endif // defined(RS_G_RUNTIME)
FN_FUNC_FN_FN(pow)631*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_FN(pow)
632*e1eccf28SAndroid Build Coastguard Worker
633*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) pown(float v, int p) {
634*e1eccf28SAndroid Build Coastguard Worker /* The mantissa of a float has fewer bits than an int (24 effective vs. 31).
635*e1eccf28SAndroid Build Coastguard Worker * For very large ints, we'll lose whether the exponent is even or odd, making
636*e1eccf28SAndroid Build Coastguard Worker * the selection of a correct sign incorrect. We correct this. Use copysign
637*e1eccf28SAndroid Build Coastguard Worker * to handle the negative zero case.
638*e1eccf28SAndroid Build Coastguard Worker */
639*e1eccf28SAndroid Build Coastguard Worker float sign = (p & 0x1) ? copysign(1.f, v) : 1.f;
640*e1eccf28SAndroid Build Coastguard Worker float f = pow(v, (float)p);
641*e1eccf28SAndroid Build Coastguard Worker return copysign(f, sign);
642*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN_IN(pown)643*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_IN(pown)
644*e1eccf28SAndroid Build Coastguard Worker
645*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) powr(float v, float p) {
646*e1eccf28SAndroid Build Coastguard Worker return pow(v, p);
647*e1eccf28SAndroid Build Coastguard Worker }
powr(float2 v,float2 p)648*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) powr(float2 v, float2 p) {
649*e1eccf28SAndroid Build Coastguard Worker return pow(v, p);
650*e1eccf28SAndroid Build Coastguard Worker }
powr(float3 v,float3 p)651*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) powr(float3 v, float3 p) {
652*e1eccf28SAndroid Build Coastguard Worker return pow(v, p);
653*e1eccf28SAndroid Build Coastguard Worker }
powr(float4 v,float4 p)654*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) powr(float4 v, float4 p) {
655*e1eccf28SAndroid Build Coastguard Worker return pow(v, p);
656*e1eccf28SAndroid Build Coastguard Worker }
657*e1eccf28SAndroid Build Coastguard Worker
658*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_remainderf(float, float);
remainder(float v1,float v2)659*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) remainder(float v1, float v2) {
660*e1eccf28SAndroid Build Coastguard Worker return SC_remainderf(v1, v2);
661*e1eccf28SAndroid Build Coastguard Worker }
662*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_FN(remainder)
663*e1eccf28SAndroid Build Coastguard Worker
664*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_remquof(float, float, int *);
remquo(float v1,float v2,int * v3)665*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) remquo(float v1, float v2, int *v3) {
666*e1eccf28SAndroid Build Coastguard Worker return SC_remquof(v1, v2, v3);
667*e1eccf28SAndroid Build Coastguard Worker }
668*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_FN_PIN(remquo)
669*e1eccf28SAndroid Build Coastguard Worker
670*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_rintf(float);
rint(float v)671*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) rint(float v) {
672*e1eccf28SAndroid Build Coastguard Worker return SC_rintf(v);
673*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(rint)674*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(rint)
675*e1eccf28SAndroid Build Coastguard Worker
676*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) rootn(float v, int r) {
677*e1eccf28SAndroid Build Coastguard Worker if (r == 0) {
678*e1eccf28SAndroid Build Coastguard Worker return posinf();
679*e1eccf28SAndroid Build Coastguard Worker }
680*e1eccf28SAndroid Build Coastguard Worker
681*e1eccf28SAndroid Build Coastguard Worker if (iszero(v)) {
682*e1eccf28SAndroid Build Coastguard Worker if (r < 0) {
683*e1eccf28SAndroid Build Coastguard Worker if (r & 1) {
684*e1eccf28SAndroid Build Coastguard Worker return copysign(posinf(), v);
685*e1eccf28SAndroid Build Coastguard Worker } else {
686*e1eccf28SAndroid Build Coastguard Worker return posinf();
687*e1eccf28SAndroid Build Coastguard Worker }
688*e1eccf28SAndroid Build Coastguard Worker } else {
689*e1eccf28SAndroid Build Coastguard Worker if (r & 1) {
690*e1eccf28SAndroid Build Coastguard Worker return copysign(0.f, v);
691*e1eccf28SAndroid Build Coastguard Worker } else {
692*e1eccf28SAndroid Build Coastguard Worker return 0.f;
693*e1eccf28SAndroid Build Coastguard Worker }
694*e1eccf28SAndroid Build Coastguard Worker }
695*e1eccf28SAndroid Build Coastguard Worker }
696*e1eccf28SAndroid Build Coastguard Worker
697*e1eccf28SAndroid Build Coastguard Worker if (!isinf(v) && !isnan(v) && (v < 0.f)) {
698*e1eccf28SAndroid Build Coastguard Worker if (r & 1) {
699*e1eccf28SAndroid Build Coastguard Worker return (-1.f * pow(-1.f * v, 1.f / r));
700*e1eccf28SAndroid Build Coastguard Worker } else {
701*e1eccf28SAndroid Build Coastguard Worker return nan(0);
702*e1eccf28SAndroid Build Coastguard Worker }
703*e1eccf28SAndroid Build Coastguard Worker }
704*e1eccf28SAndroid Build Coastguard Worker
705*e1eccf28SAndroid Build Coastguard Worker return pow(v, 1.f / r);
706*e1eccf28SAndroid Build Coastguard Worker }
707*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN_IN(rootn);
708*e1eccf28SAndroid Build Coastguard Worker
709*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_roundf(float);
round(float v)710*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) round(float v) {
711*e1eccf28SAndroid Build Coastguard Worker return SC_roundf(v);
712*e1eccf28SAndroid Build Coastguard Worker }
713*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(round)
714*e1eccf28SAndroid Build Coastguard Worker
715*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_randf2(float, float);
rsRand(float min,float max)716*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) rsRand(float min, float max) {
717*e1eccf28SAndroid Build Coastguard Worker return SC_randf2(min, max);
718*e1eccf28SAndroid Build Coastguard Worker }
719*e1eccf28SAndroid Build Coastguard Worker
720*e1eccf28SAndroid Build Coastguard Worker
rsqrt(float v)721*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) rsqrt(float v) {
722*e1eccf28SAndroid Build Coastguard Worker return 1.f / sqrt(v);
723*e1eccf28SAndroid Build Coastguard Worker }
724*e1eccf28SAndroid Build Coastguard Worker
725*e1eccf28SAndroid Build Coastguard Worker #if !defined(ARCH_X86_HAVE_SSSE3) || defined(RS_DEBUG_RUNTIME) || defined(RS_G_RUNTIME)
726*e1eccf28SAndroid Build Coastguard Worker // These functions must be defined here if we are not using the SSE
727*e1eccf28SAndroid Build Coastguard Worker // implementation, which includes when we are built as part of the
728*e1eccf28SAndroid Build Coastguard Worker // debug runtime (libclcore_debug.bc) or compiling with debug info.
729*e1eccf28SAndroid Build Coastguard Worker #if defined(RS_G_RUNTIME)
730*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_sqrtf(float);
sqrt(float v)731*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) sqrt(float v) {
732*e1eccf28SAndroid Build Coastguard Worker return SC_sqrtf(v);
733*e1eccf28SAndroid Build Coastguard Worker }
734*e1eccf28SAndroid Build Coastguard Worker #endif // defined(RS_G_RUNTIME)
735*e1eccf28SAndroid Build Coastguard Worker
736*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(sqrt)
737*e1eccf28SAndroid Build Coastguard Worker #else
738*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) sqrt(float2);
739*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) sqrt(float3);
740*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) sqrt(float4);
741*e1eccf28SAndroid Build Coastguard Worker #endif // !defined(ARCH_X86_HAVE_SSSE3) || defined(RS_DEBUG_RUNTIME) || defined(RS_G_RUNTIME)
742*e1eccf28SAndroid Build Coastguard Worker
743*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(rsqrt)
744*e1eccf28SAndroid Build Coastguard Worker
745*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_sinf(float);
sin(float v)746*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) sin(float v) {
747*e1eccf28SAndroid Build Coastguard Worker return SC_sinf(v);
748*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(sin)749*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(sin)
750*e1eccf28SAndroid Build Coastguard Worker
751*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) sincos(float v, float *cosptr) {
752*e1eccf28SAndroid Build Coastguard Worker *cosptr = cos(v);
753*e1eccf28SAndroid Build Coastguard Worker return sin(v);
754*e1eccf28SAndroid Build Coastguard Worker }
sincos(float2 v,float2 * cosptr)755*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) sincos(float2 v, float2 *cosptr) {
756*e1eccf28SAndroid Build Coastguard Worker *cosptr = cos(v);
757*e1eccf28SAndroid Build Coastguard Worker return sin(v);
758*e1eccf28SAndroid Build Coastguard Worker }
sincos(float3 v,float3 * cosptr)759*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) sincos(float3 v, float3 *cosptr) {
760*e1eccf28SAndroid Build Coastguard Worker *cosptr = cos(v);
761*e1eccf28SAndroid Build Coastguard Worker return sin(v);
762*e1eccf28SAndroid Build Coastguard Worker }
sincos(float4 v,float4 * cosptr)763*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) sincos(float4 v, float4 *cosptr) {
764*e1eccf28SAndroid Build Coastguard Worker *cosptr = cos(v);
765*e1eccf28SAndroid Build Coastguard Worker return sin(v);
766*e1eccf28SAndroid Build Coastguard Worker }
767*e1eccf28SAndroid Build Coastguard Worker
768*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_sinhf(float);
sinh(float v)769*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) sinh(float v) {
770*e1eccf28SAndroid Build Coastguard Worker return SC_sinhf(v);
771*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(sinh)772*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(sinh)
773*e1eccf28SAndroid Build Coastguard Worker
774*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) sinpi(float v) {
775*e1eccf28SAndroid Build Coastguard Worker return sin(v * M_PI);
776*e1eccf28SAndroid Build Coastguard Worker }
777*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(sinpi)
778*e1eccf28SAndroid Build Coastguard Worker
779*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_tanf(float);
tan(float v)780*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) tan(float v) {
781*e1eccf28SAndroid Build Coastguard Worker return SC_tanf(v);
782*e1eccf28SAndroid Build Coastguard Worker }
783*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(tan)
784*e1eccf28SAndroid Build Coastguard Worker
785*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_tanhf(float);
tanh(float v)786*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) tanh(float v) {
787*e1eccf28SAndroid Build Coastguard Worker return SC_tanhf(v);
788*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(tanh)789*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(tanh)
790*e1eccf28SAndroid Build Coastguard Worker
791*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) tanpi(float v) {
792*e1eccf28SAndroid Build Coastguard Worker return tan(v * M_PI);
793*e1eccf28SAndroid Build Coastguard Worker }
794*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(tanpi)
795*e1eccf28SAndroid Build Coastguard Worker
796*e1eccf28SAndroid Build Coastguard Worker
797*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_tgammaf(float);
tgamma(float v)798*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) tgamma(float v) {
799*e1eccf28SAndroid Build Coastguard Worker return SC_tgammaf(v);
800*e1eccf28SAndroid Build Coastguard Worker }
801*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(tgamma)
802*e1eccf28SAndroid Build Coastguard Worker
803*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) SC_truncf(float);
trunc(float v)804*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) trunc(float v) {
805*e1eccf28SAndroid Build Coastguard Worker return SC_truncf(v);
806*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(trunc)807*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(trunc)
808*e1eccf28SAndroid Build Coastguard Worker
809*e1eccf28SAndroid Build Coastguard Worker // Int ops (partial), 6.11.3
810*e1eccf28SAndroid Build Coastguard Worker
811*e1eccf28SAndroid Build Coastguard Worker #define XN_FUNC_YN(typeout, fnc, typein) \
812*e1eccf28SAndroid Build Coastguard Worker extern typeout __attribute__((overloadable)) fnc(typein); \
813*e1eccf28SAndroid Build Coastguard Worker extern typeout##2 __attribute__((overloadable)) fnc(typein##2 v) { \
814*e1eccf28SAndroid Build Coastguard Worker typeout##2 r; \
815*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v.x); \
816*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v.y); \
817*e1eccf28SAndroid Build Coastguard Worker return r; \
818*e1eccf28SAndroid Build Coastguard Worker } \
819*e1eccf28SAndroid Build Coastguard Worker extern typeout##3 __attribute__((overloadable)) fnc(typein##3 v) { \
820*e1eccf28SAndroid Build Coastguard Worker typeout##3 r; \
821*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v.x); \
822*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v.y); \
823*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v.z); \
824*e1eccf28SAndroid Build Coastguard Worker return r; \
825*e1eccf28SAndroid Build Coastguard Worker } \
826*e1eccf28SAndroid Build Coastguard Worker extern typeout##4 __attribute__((overloadable)) fnc(typein##4 v) { \
827*e1eccf28SAndroid Build Coastguard Worker typeout##4 r; \
828*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v.x); \
829*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v.y); \
830*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v.z); \
831*e1eccf28SAndroid Build Coastguard Worker r.w = fnc(v.w); \
832*e1eccf28SAndroid Build Coastguard Worker return r; \
833*e1eccf28SAndroid Build Coastguard Worker }
834*e1eccf28SAndroid Build Coastguard Worker
835*e1eccf28SAndroid Build Coastguard Worker
836*e1eccf28SAndroid Build Coastguard Worker #define UIN_FUNC_IN(fnc) \
837*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_YN(uchar, fnc, char) \
838*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_YN(ushort, fnc, short) \
839*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_YN(uint, fnc, int)
840*e1eccf28SAndroid Build Coastguard Worker
841*e1eccf28SAndroid Build Coastguard Worker #define IN_FUNC_IN(fnc) \
842*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_YN(uchar, fnc, uchar) \
843*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_YN(char, fnc, char) \
844*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_YN(ushort, fnc, ushort) \
845*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_YN(short, fnc, short) \
846*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_YN(uint, fnc, uint) \
847*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_YN(int, fnc, int)
848*e1eccf28SAndroid Build Coastguard Worker
849*e1eccf28SAndroid Build Coastguard Worker
850*e1eccf28SAndroid Build Coastguard Worker #define XN_FUNC_XN_XN_BODY(type, fnc, body) \
851*e1eccf28SAndroid Build Coastguard Worker extern type __attribute__((overloadable)) \
852*e1eccf28SAndroid Build Coastguard Worker fnc(type v1, type v2) { \
853*e1eccf28SAndroid Build Coastguard Worker return body; \
854*e1eccf28SAndroid Build Coastguard Worker } \
855*e1eccf28SAndroid Build Coastguard Worker extern type##2 __attribute__((overloadable)) \
856*e1eccf28SAndroid Build Coastguard Worker fnc(type##2 v1, type##2 v2) { \
857*e1eccf28SAndroid Build Coastguard Worker type##2 r; \
858*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x); \
859*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y); \
860*e1eccf28SAndroid Build Coastguard Worker return r; \
861*e1eccf28SAndroid Build Coastguard Worker } \
862*e1eccf28SAndroid Build Coastguard Worker extern type##3 __attribute__((overloadable)) \
863*e1eccf28SAndroid Build Coastguard Worker fnc(type##3 v1, type##3 v2) { \
864*e1eccf28SAndroid Build Coastguard Worker type##3 r; \
865*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x); \
866*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y); \
867*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2.z); \
868*e1eccf28SAndroid Build Coastguard Worker return r; \
869*e1eccf28SAndroid Build Coastguard Worker } \
870*e1eccf28SAndroid Build Coastguard Worker extern type##4 __attribute__((overloadable)) \
871*e1eccf28SAndroid Build Coastguard Worker fnc(type##4 v1, type##4 v2) { \
872*e1eccf28SAndroid Build Coastguard Worker type##4 r; \
873*e1eccf28SAndroid Build Coastguard Worker r.x = fnc(v1.x, v2.x); \
874*e1eccf28SAndroid Build Coastguard Worker r.y = fnc(v1.y, v2.y); \
875*e1eccf28SAndroid Build Coastguard Worker r.z = fnc(v1.z, v2.z); \
876*e1eccf28SAndroid Build Coastguard Worker r.w = fnc(v1.w, v2.w); \
877*e1eccf28SAndroid Build Coastguard Worker return r; \
878*e1eccf28SAndroid Build Coastguard Worker }
879*e1eccf28SAndroid Build Coastguard Worker
880*e1eccf28SAndroid Build Coastguard Worker #define IN_FUNC_IN_IN_BODY(fnc, body) \
881*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_XN_XN_BODY(uchar, fnc, body) \
882*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_XN_XN_BODY(char, fnc, body) \
883*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_XN_XN_BODY(ushort, fnc, body) \
884*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_XN_XN_BODY(short, fnc, body) \
885*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_XN_XN_BODY(uint, fnc, body) \
886*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_XN_XN_BODY(int, fnc, body) \
887*e1eccf28SAndroid Build Coastguard Worker XN_FUNC_XN_XN_BODY(float, fnc, body)
888*e1eccf28SAndroid Build Coastguard Worker
889*e1eccf28SAndroid Build Coastguard Worker
890*e1eccf28SAndroid Build Coastguard Worker /**
891*e1eccf28SAndroid Build Coastguard Worker * abs
892*e1eccf28SAndroid Build Coastguard Worker */
893*e1eccf28SAndroid Build Coastguard Worker extern uint32_t __attribute__((overloadable)) abs(int32_t v) {
894*e1eccf28SAndroid Build Coastguard Worker if (v < 0)
895*e1eccf28SAndroid Build Coastguard Worker return -v;
896*e1eccf28SAndroid Build Coastguard Worker return v;
897*e1eccf28SAndroid Build Coastguard Worker }
abs(int16_t v)898*e1eccf28SAndroid Build Coastguard Worker extern uint16_t __attribute__((overloadable)) abs(int16_t v) {
899*e1eccf28SAndroid Build Coastguard Worker if (v < 0)
900*e1eccf28SAndroid Build Coastguard Worker return -v;
901*e1eccf28SAndroid Build Coastguard Worker return v;
902*e1eccf28SAndroid Build Coastguard Worker }
abs(int8_t v)903*e1eccf28SAndroid Build Coastguard Worker extern uint8_t __attribute__((overloadable)) abs(int8_t v) {
904*e1eccf28SAndroid Build Coastguard Worker if (v < 0)
905*e1eccf28SAndroid Build Coastguard Worker return -v;
906*e1eccf28SAndroid Build Coastguard Worker return v;
907*e1eccf28SAndroid Build Coastguard Worker }
908*e1eccf28SAndroid Build Coastguard Worker
909*e1eccf28SAndroid Build Coastguard Worker /**
910*e1eccf28SAndroid Build Coastguard Worker * clz
911*e1eccf28SAndroid Build Coastguard Worker * __builtin_clz only accepts a 32-bit unsigned int, so every input will be
912*e1eccf28SAndroid Build Coastguard Worker * expanded to 32 bits. For our smaller data types, we need to subtract off
913*e1eccf28SAndroid Build Coastguard Worker * these unused top bits (that will be always be composed of zeros).
914*e1eccf28SAndroid Build Coastguard Worker */
clz(uint32_t v)915*e1eccf28SAndroid Build Coastguard Worker extern uint32_t __attribute__((overloadable)) clz(uint32_t v) {
916*e1eccf28SAndroid Build Coastguard Worker return __builtin_clz(v);
917*e1eccf28SAndroid Build Coastguard Worker }
clz(uint16_t v)918*e1eccf28SAndroid Build Coastguard Worker extern uint16_t __attribute__((overloadable)) clz(uint16_t v) {
919*e1eccf28SAndroid Build Coastguard Worker return __builtin_clz(v) - 16;
920*e1eccf28SAndroid Build Coastguard Worker }
clz(uint8_t v)921*e1eccf28SAndroid Build Coastguard Worker extern uint8_t __attribute__((overloadable)) clz(uint8_t v) {
922*e1eccf28SAndroid Build Coastguard Worker return __builtin_clz(v) - 24;
923*e1eccf28SAndroid Build Coastguard Worker }
clz(int32_t v)924*e1eccf28SAndroid Build Coastguard Worker extern int32_t __attribute__((overloadable)) clz(int32_t v) {
925*e1eccf28SAndroid Build Coastguard Worker return __builtin_clz(v);
926*e1eccf28SAndroid Build Coastguard Worker }
clz(int16_t v)927*e1eccf28SAndroid Build Coastguard Worker extern int16_t __attribute__((overloadable)) clz(int16_t v) {
928*e1eccf28SAndroid Build Coastguard Worker return __builtin_clz(((uint32_t)v) & 0x0000ffff) - 16;
929*e1eccf28SAndroid Build Coastguard Worker }
clz(int8_t v)930*e1eccf28SAndroid Build Coastguard Worker extern int8_t __attribute__((overloadable)) clz(int8_t v) {
931*e1eccf28SAndroid Build Coastguard Worker return __builtin_clz(((uint32_t)v) & 0x000000ff) - 24;
932*e1eccf28SAndroid Build Coastguard Worker }
933*e1eccf28SAndroid Build Coastguard Worker
934*e1eccf28SAndroid Build Coastguard Worker
935*e1eccf28SAndroid Build Coastguard Worker UIN_FUNC_IN(abs)
IN_FUNC_IN(clz)936*e1eccf28SAndroid Build Coastguard Worker IN_FUNC_IN(clz)
937*e1eccf28SAndroid Build Coastguard Worker
938*e1eccf28SAndroid Build Coastguard Worker
939*e1eccf28SAndroid Build Coastguard Worker // 6.11.4
940*e1eccf28SAndroid Build Coastguard Worker
941*e1eccf28SAndroid Build Coastguard Worker
942*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) degrees(float radians) {
943*e1eccf28SAndroid Build Coastguard Worker return radians * (180.f / M_PI);
944*e1eccf28SAndroid Build Coastguard Worker }
degrees(float2 radians)945*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) degrees(float2 radians) {
946*e1eccf28SAndroid Build Coastguard Worker return radians * (180.f / M_PI);
947*e1eccf28SAndroid Build Coastguard Worker }
degrees(float3 radians)948*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) degrees(float3 radians) {
949*e1eccf28SAndroid Build Coastguard Worker return radians * (180.f / M_PI);
950*e1eccf28SAndroid Build Coastguard Worker }
degrees(float4 radians)951*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) degrees(float4 radians) {
952*e1eccf28SAndroid Build Coastguard Worker return radians * (180.f / M_PI);
953*e1eccf28SAndroid Build Coastguard Worker }
954*e1eccf28SAndroid Build Coastguard Worker
mix(float start,float stop,float amount)955*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) mix(float start, float stop, float amount) {
956*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
957*e1eccf28SAndroid Build Coastguard Worker }
mix(float2 start,float2 stop,float2 amount)958*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float2 amount) {
959*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
960*e1eccf28SAndroid Build Coastguard Worker }
mix(float3 start,float3 stop,float3 amount)961*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float3 amount) {
962*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
963*e1eccf28SAndroid Build Coastguard Worker }
mix(float4 start,float4 stop,float4 amount)964*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float4 amount) {
965*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
966*e1eccf28SAndroid Build Coastguard Worker }
mix(float2 start,float2 stop,float amount)967*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float amount) {
968*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
969*e1eccf28SAndroid Build Coastguard Worker }
mix(float3 start,float3 stop,float amount)970*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float amount) {
971*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
972*e1eccf28SAndroid Build Coastguard Worker }
mix(float4 start,float4 stop,float amount)973*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float amount) {
974*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
975*e1eccf28SAndroid Build Coastguard Worker }
976*e1eccf28SAndroid Build Coastguard Worker
radians(float degrees)977*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) radians(float degrees) {
978*e1eccf28SAndroid Build Coastguard Worker return degrees * (M_PI / 180.f);
979*e1eccf28SAndroid Build Coastguard Worker }
radians(float2 degrees)980*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) radians(float2 degrees) {
981*e1eccf28SAndroid Build Coastguard Worker return degrees * (M_PI / 180.f);
982*e1eccf28SAndroid Build Coastguard Worker }
radians(float3 degrees)983*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) radians(float3 degrees) {
984*e1eccf28SAndroid Build Coastguard Worker return degrees * (M_PI / 180.f);
985*e1eccf28SAndroid Build Coastguard Worker }
radians(float4 degrees)986*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) radians(float4 degrees) {
987*e1eccf28SAndroid Build Coastguard Worker return degrees * (M_PI / 180.f);
988*e1eccf28SAndroid Build Coastguard Worker }
989*e1eccf28SAndroid Build Coastguard Worker
step(float edge,float v)990*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) step(float edge, float v) {
991*e1eccf28SAndroid Build Coastguard Worker return (v < edge) ? 0.f : 1.f;
992*e1eccf28SAndroid Build Coastguard Worker }
step(float2 edge,float2 v)993*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) step(float2 edge, float2 v) {
994*e1eccf28SAndroid Build Coastguard Worker float2 r;
995*e1eccf28SAndroid Build Coastguard Worker r.x = (v.x < edge.x) ? 0.f : 1.f;
996*e1eccf28SAndroid Build Coastguard Worker r.y = (v.y < edge.y) ? 0.f : 1.f;
997*e1eccf28SAndroid Build Coastguard Worker return r;
998*e1eccf28SAndroid Build Coastguard Worker }
step(float3 edge,float3 v)999*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) step(float3 edge, float3 v) {
1000*e1eccf28SAndroid Build Coastguard Worker float3 r;
1001*e1eccf28SAndroid Build Coastguard Worker r.x = (v.x < edge.x) ? 0.f : 1.f;
1002*e1eccf28SAndroid Build Coastguard Worker r.y = (v.y < edge.y) ? 0.f : 1.f;
1003*e1eccf28SAndroid Build Coastguard Worker r.z = (v.z < edge.z) ? 0.f : 1.f;
1004*e1eccf28SAndroid Build Coastguard Worker return r;
1005*e1eccf28SAndroid Build Coastguard Worker }
step(float4 edge,float4 v)1006*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) step(float4 edge, float4 v) {
1007*e1eccf28SAndroid Build Coastguard Worker float4 r;
1008*e1eccf28SAndroid Build Coastguard Worker r.x = (v.x < edge.x) ? 0.f : 1.f;
1009*e1eccf28SAndroid Build Coastguard Worker r.y = (v.y < edge.y) ? 0.f : 1.f;
1010*e1eccf28SAndroid Build Coastguard Worker r.z = (v.z < edge.z) ? 0.f : 1.f;
1011*e1eccf28SAndroid Build Coastguard Worker r.w = (v.w < edge.w) ? 0.f : 1.f;
1012*e1eccf28SAndroid Build Coastguard Worker return r;
1013*e1eccf28SAndroid Build Coastguard Worker }
step(float2 edge,float v)1014*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) step(float2 edge, float v) {
1015*e1eccf28SAndroid Build Coastguard Worker float2 r;
1016*e1eccf28SAndroid Build Coastguard Worker r.x = (v < edge.x) ? 0.f : 1.f;
1017*e1eccf28SAndroid Build Coastguard Worker r.y = (v < edge.y) ? 0.f : 1.f;
1018*e1eccf28SAndroid Build Coastguard Worker return r;
1019*e1eccf28SAndroid Build Coastguard Worker }
step(float3 edge,float v)1020*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) step(float3 edge, float v) {
1021*e1eccf28SAndroid Build Coastguard Worker float3 r;
1022*e1eccf28SAndroid Build Coastguard Worker r.x = (v < edge.x) ? 0.f : 1.f;
1023*e1eccf28SAndroid Build Coastguard Worker r.y = (v < edge.y) ? 0.f : 1.f;
1024*e1eccf28SAndroid Build Coastguard Worker r.z = (v < edge.z) ? 0.f : 1.f;
1025*e1eccf28SAndroid Build Coastguard Worker return r;
1026*e1eccf28SAndroid Build Coastguard Worker }
step(float4 edge,float v)1027*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) step(float4 edge, float v) {
1028*e1eccf28SAndroid Build Coastguard Worker float4 r;
1029*e1eccf28SAndroid Build Coastguard Worker r.x = (v < edge.x) ? 0.f : 1.f;
1030*e1eccf28SAndroid Build Coastguard Worker r.y = (v < edge.y) ? 0.f : 1.f;
1031*e1eccf28SAndroid Build Coastguard Worker r.z = (v < edge.z) ? 0.f : 1.f;
1032*e1eccf28SAndroid Build Coastguard Worker r.w = (v < edge.w) ? 0.f : 1.f;
1033*e1eccf28SAndroid Build Coastguard Worker return r;
1034*e1eccf28SAndroid Build Coastguard Worker }
step(float edge,float2 v)1035*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) step(float edge, float2 v) {
1036*e1eccf28SAndroid Build Coastguard Worker float2 r;
1037*e1eccf28SAndroid Build Coastguard Worker r.x = (v.x < edge) ? 0.f : 1.f;
1038*e1eccf28SAndroid Build Coastguard Worker r.y = (v.y < edge) ? 0.f : 1.f;
1039*e1eccf28SAndroid Build Coastguard Worker return r;
1040*e1eccf28SAndroid Build Coastguard Worker }
step(float edge,float3 v)1041*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) step(float edge, float3 v) {
1042*e1eccf28SAndroid Build Coastguard Worker float3 r;
1043*e1eccf28SAndroid Build Coastguard Worker r.x = (v.x < edge) ? 0.f : 1.f;
1044*e1eccf28SAndroid Build Coastguard Worker r.y = (v.y < edge) ? 0.f : 1.f;
1045*e1eccf28SAndroid Build Coastguard Worker r.z = (v.z < edge) ? 0.f : 1.f;
1046*e1eccf28SAndroid Build Coastguard Worker return r;
1047*e1eccf28SAndroid Build Coastguard Worker }
step(float edge,float4 v)1048*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) step(float edge, float4 v) {
1049*e1eccf28SAndroid Build Coastguard Worker float4 r;
1050*e1eccf28SAndroid Build Coastguard Worker r.x = (v.x < edge) ? 0.f : 1.f;
1051*e1eccf28SAndroid Build Coastguard Worker r.y = (v.y < edge) ? 0.f : 1.f;
1052*e1eccf28SAndroid Build Coastguard Worker r.z = (v.z < edge) ? 0.f : 1.f;
1053*e1eccf28SAndroid Build Coastguard Worker r.w = (v.w < edge) ? 0.f : 1.f;
1054*e1eccf28SAndroid Build Coastguard Worker return r;
1055*e1eccf28SAndroid Build Coastguard Worker }
1056*e1eccf28SAndroid Build Coastguard Worker
sign(float v)1057*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) sign(float v) {
1058*e1eccf28SAndroid Build Coastguard Worker if (v > 0) return 1.f;
1059*e1eccf28SAndroid Build Coastguard Worker if (v < 0) return -1.f;
1060*e1eccf28SAndroid Build Coastguard Worker return v;
1061*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(sign)1062*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(sign)
1063*e1eccf28SAndroid Build Coastguard Worker
1064*e1eccf28SAndroid Build Coastguard Worker
1065*e1eccf28SAndroid Build Coastguard Worker // 6.11.5
1066*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) cross(float3 lhs, float3 rhs) {
1067*e1eccf28SAndroid Build Coastguard Worker float3 r;
1068*e1eccf28SAndroid Build Coastguard Worker r.x = lhs.y * rhs.z - lhs.z * rhs.y;
1069*e1eccf28SAndroid Build Coastguard Worker r.y = lhs.z * rhs.x - lhs.x * rhs.z;
1070*e1eccf28SAndroid Build Coastguard Worker r.z = lhs.x * rhs.y - lhs.y * rhs.x;
1071*e1eccf28SAndroid Build Coastguard Worker return r;
1072*e1eccf28SAndroid Build Coastguard Worker }
1073*e1eccf28SAndroid Build Coastguard Worker
cross(float4 lhs,float4 rhs)1074*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) cross(float4 lhs, float4 rhs) {
1075*e1eccf28SAndroid Build Coastguard Worker float4 r;
1076*e1eccf28SAndroid Build Coastguard Worker r.x = lhs.y * rhs.z - lhs.z * rhs.y;
1077*e1eccf28SAndroid Build Coastguard Worker r.y = lhs.z * rhs.x - lhs.x * rhs.z;
1078*e1eccf28SAndroid Build Coastguard Worker r.z = lhs.x * rhs.y - lhs.y * rhs.x;
1079*e1eccf28SAndroid Build Coastguard Worker r.w = 0.f;
1080*e1eccf28SAndroid Build Coastguard Worker return r;
1081*e1eccf28SAndroid Build Coastguard Worker }
1082*e1eccf28SAndroid Build Coastguard Worker
1083*e1eccf28SAndroid Build Coastguard Worker #if !defined(ARCH_X86_HAVE_SSSE3) || defined(RS_DEBUG_RUNTIME) || defined(RS_G_RUNTIME)
1084*e1eccf28SAndroid Build Coastguard Worker // These functions must be defined here if we are not using the SSE
1085*e1eccf28SAndroid Build Coastguard Worker // implementation, which includes when we are built as part of the
1086*e1eccf28SAndroid Build Coastguard Worker // debug runtime (libclcore_debug.bc) or compiling with debug info.
1087*e1eccf28SAndroid Build Coastguard Worker
dot(float lhs,float rhs)1088*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) dot(float lhs, float rhs) {
1089*e1eccf28SAndroid Build Coastguard Worker return lhs * rhs;
1090*e1eccf28SAndroid Build Coastguard Worker }
dot(float2 lhs,float2 rhs)1091*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) dot(float2 lhs, float2 rhs) {
1092*e1eccf28SAndroid Build Coastguard Worker return lhs.x*rhs.x + lhs.y*rhs.y;
1093*e1eccf28SAndroid Build Coastguard Worker }
dot(float3 lhs,float3 rhs)1094*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) dot(float3 lhs, float3 rhs) {
1095*e1eccf28SAndroid Build Coastguard Worker return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z;
1096*e1eccf28SAndroid Build Coastguard Worker }
dot(float4 lhs,float4 rhs)1097*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) dot(float4 lhs, float4 rhs) {
1098*e1eccf28SAndroid Build Coastguard Worker return lhs.x*rhs.x + lhs.y*rhs.y + lhs.z*rhs.z + lhs.w*rhs.w;
1099*e1eccf28SAndroid Build Coastguard Worker }
1100*e1eccf28SAndroid Build Coastguard Worker
length(float v)1101*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) length(float v) {
1102*e1eccf28SAndroid Build Coastguard Worker return fabs(v);
1103*e1eccf28SAndroid Build Coastguard Worker }
length(float2 v)1104*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) length(float2 v) {
1105*e1eccf28SAndroid Build Coastguard Worker return sqrt(v.x*v.x + v.y*v.y);
1106*e1eccf28SAndroid Build Coastguard Worker }
length(float3 v)1107*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) length(float3 v) {
1108*e1eccf28SAndroid Build Coastguard Worker return sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
1109*e1eccf28SAndroid Build Coastguard Worker }
length(float4 v)1110*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) length(float4 v) {
1111*e1eccf28SAndroid Build Coastguard Worker return sqrt(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w);
1112*e1eccf28SAndroid Build Coastguard Worker }
1113*e1eccf28SAndroid Build Coastguard Worker
1114*e1eccf28SAndroid Build Coastguard Worker #else
1115*e1eccf28SAndroid Build Coastguard Worker
1116*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) length(float v);
1117*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) length(float2 v);
1118*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) length(float3 v);
1119*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) length(float4 v);
1120*e1eccf28SAndroid Build Coastguard Worker
1121*e1eccf28SAndroid Build Coastguard Worker #endif // !defined(ARCH_X86_HAVE_SSSE3) || defined(RS_DEBUG_RUNTIME) || defined(RS_G_RUNTIME)
1122*e1eccf28SAndroid Build Coastguard Worker
distance(float lhs,float rhs)1123*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) distance(float lhs, float rhs) {
1124*e1eccf28SAndroid Build Coastguard Worker return length(lhs - rhs);
1125*e1eccf28SAndroid Build Coastguard Worker }
distance(float2 lhs,float2 rhs)1126*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) distance(float2 lhs, float2 rhs) {
1127*e1eccf28SAndroid Build Coastguard Worker return length(lhs - rhs);
1128*e1eccf28SAndroid Build Coastguard Worker }
distance(float3 lhs,float3 rhs)1129*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) distance(float3 lhs, float3 rhs) {
1130*e1eccf28SAndroid Build Coastguard Worker return length(lhs - rhs);
1131*e1eccf28SAndroid Build Coastguard Worker }
distance(float4 lhs,float4 rhs)1132*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) distance(float4 lhs, float4 rhs) {
1133*e1eccf28SAndroid Build Coastguard Worker return length(lhs - rhs);
1134*e1eccf28SAndroid Build Coastguard Worker }
1135*e1eccf28SAndroid Build Coastguard Worker
1136*e1eccf28SAndroid Build Coastguard Worker /* For the normalization functions, vectors of length 0 should simply be
1137*e1eccf28SAndroid Build Coastguard Worker * returned (i.e. all the components of that vector are 0).
1138*e1eccf28SAndroid Build Coastguard Worker */
normalize(float v)1139*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) normalize(float v) {
1140*e1eccf28SAndroid Build Coastguard Worker if (v == 0.0f) {
1141*e1eccf28SAndroid Build Coastguard Worker return 0.0f;
1142*e1eccf28SAndroid Build Coastguard Worker } else if (v < 0.0f) {
1143*e1eccf28SAndroid Build Coastguard Worker return -1.0f;
1144*e1eccf28SAndroid Build Coastguard Worker } else {
1145*e1eccf28SAndroid Build Coastguard Worker return 1.0f;
1146*e1eccf28SAndroid Build Coastguard Worker }
1147*e1eccf28SAndroid Build Coastguard Worker }
normalize(float2 v)1148*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) normalize(float2 v) {
1149*e1eccf28SAndroid Build Coastguard Worker float l = length(v);
1150*e1eccf28SAndroid Build Coastguard Worker return l == 0.0f ? v : v / l;
1151*e1eccf28SAndroid Build Coastguard Worker }
normalize(float3 v)1152*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) normalize(float3 v) {
1153*e1eccf28SAndroid Build Coastguard Worker float l = length(v);
1154*e1eccf28SAndroid Build Coastguard Worker return l == 0.0f ? v : v / l;
1155*e1eccf28SAndroid Build Coastguard Worker }
normalize(float4 v)1156*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) normalize(float4 v) {
1157*e1eccf28SAndroid Build Coastguard Worker float l = length(v);
1158*e1eccf28SAndroid Build Coastguard Worker return l == 0.0f ? v : v / l;
1159*e1eccf28SAndroid Build Coastguard Worker }
1160*e1eccf28SAndroid Build Coastguard Worker
half_sqrt(float v)1161*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) half_sqrt(float v) {
1162*e1eccf28SAndroid Build Coastguard Worker return sqrt(v);
1163*e1eccf28SAndroid Build Coastguard Worker }
FN_FUNC_FN(half_sqrt)1164*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(half_sqrt)
1165*e1eccf28SAndroid Build Coastguard Worker
1166*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fast_length(float v) {
1167*e1eccf28SAndroid Build Coastguard Worker return fabs(v);
1168*e1eccf28SAndroid Build Coastguard Worker }
fast_length(float2 v)1169*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fast_length(float2 v) {
1170*e1eccf28SAndroid Build Coastguard Worker return half_sqrt(v.x*v.x + v.y*v.y);
1171*e1eccf28SAndroid Build Coastguard Worker }
fast_length(float3 v)1172*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fast_length(float3 v) {
1173*e1eccf28SAndroid Build Coastguard Worker return half_sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
1174*e1eccf28SAndroid Build Coastguard Worker }
fast_length(float4 v)1175*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fast_length(float4 v) {
1176*e1eccf28SAndroid Build Coastguard Worker return half_sqrt(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w);
1177*e1eccf28SAndroid Build Coastguard Worker }
1178*e1eccf28SAndroid Build Coastguard Worker
fast_distance(float lhs,float rhs)1179*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fast_distance(float lhs, float rhs) {
1180*e1eccf28SAndroid Build Coastguard Worker return fast_length(lhs - rhs);
1181*e1eccf28SAndroid Build Coastguard Worker }
fast_distance(float2 lhs,float2 rhs)1182*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fast_distance(float2 lhs, float2 rhs) {
1183*e1eccf28SAndroid Build Coastguard Worker return fast_length(lhs - rhs);
1184*e1eccf28SAndroid Build Coastguard Worker }
fast_distance(float3 lhs,float3 rhs)1185*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fast_distance(float3 lhs, float3 rhs) {
1186*e1eccf28SAndroid Build Coastguard Worker return fast_length(lhs - rhs);
1187*e1eccf28SAndroid Build Coastguard Worker }
fast_distance(float4 lhs,float4 rhs)1188*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fast_distance(float4 lhs, float4 rhs) {
1189*e1eccf28SAndroid Build Coastguard Worker return fast_length(lhs - rhs);
1190*e1eccf28SAndroid Build Coastguard Worker }
1191*e1eccf28SAndroid Build Coastguard Worker
1192*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) half_rsqrt(float);
1193*e1eccf28SAndroid Build Coastguard Worker
1194*e1eccf28SAndroid Build Coastguard Worker /* For the normalization functions, vectors of length 0 should simply be
1195*e1eccf28SAndroid Build Coastguard Worker * returned (i.e. all the components of that vector are 0).
1196*e1eccf28SAndroid Build Coastguard Worker */
fast_normalize(float v)1197*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) fast_normalize(float v) {
1198*e1eccf28SAndroid Build Coastguard Worker if (v == 0.0f) {
1199*e1eccf28SAndroid Build Coastguard Worker return 0.0f;
1200*e1eccf28SAndroid Build Coastguard Worker } else if (v < 0.0f) {
1201*e1eccf28SAndroid Build Coastguard Worker return -1.0f;
1202*e1eccf28SAndroid Build Coastguard Worker } else {
1203*e1eccf28SAndroid Build Coastguard Worker return 1.0f;
1204*e1eccf28SAndroid Build Coastguard Worker }
1205*e1eccf28SAndroid Build Coastguard Worker }
1206*e1eccf28SAndroid Build Coastguard Worker // If the length is 0, then rlength should be NaN.
fast_normalize(float2 v)1207*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) fast_normalize(float2 v) {
1208*e1eccf28SAndroid Build Coastguard Worker float rlength = half_rsqrt(v.x*v.x + v.y*v.y);
1209*e1eccf28SAndroid Build Coastguard Worker return (rlength == rlength) ? v * rlength : v;
1210*e1eccf28SAndroid Build Coastguard Worker }
fast_normalize(float3 v)1211*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) fast_normalize(float3 v) {
1212*e1eccf28SAndroid Build Coastguard Worker float rlength = half_rsqrt(v.x*v.x + v.y*v.y + v.z*v.z);
1213*e1eccf28SAndroid Build Coastguard Worker return (rlength == rlength) ? v * rlength : v;
1214*e1eccf28SAndroid Build Coastguard Worker }
fast_normalize(float4 v)1215*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) fast_normalize(float4 v) {
1216*e1eccf28SAndroid Build Coastguard Worker float rlength = half_rsqrt(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w);
1217*e1eccf28SAndroid Build Coastguard Worker return (rlength == rlength) ? v * rlength : v;
1218*e1eccf28SAndroid Build Coastguard Worker }
1219*e1eccf28SAndroid Build Coastguard Worker
half_recip(float v)1220*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) half_recip(float v) {
1221*e1eccf28SAndroid Build Coastguard Worker return 1.f / v;
1222*e1eccf28SAndroid Build Coastguard Worker }
1223*e1eccf28SAndroid Build Coastguard Worker
1224*e1eccf28SAndroid Build Coastguard Worker /*
1225*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) approx_atan(float x) {
1226*e1eccf28SAndroid Build Coastguard Worker if (x == 0.f)
1227*e1eccf28SAndroid Build Coastguard Worker return 0.f;
1228*e1eccf28SAndroid Build Coastguard Worker if (x < 0.f)
1229*e1eccf28SAndroid Build Coastguard Worker return -1.f * approx_atan(-1.f * x);
1230*e1eccf28SAndroid Build Coastguard Worker if (x > 1.f)
1231*e1eccf28SAndroid Build Coastguard Worker return M_PI_2 - approx_atan(approx_recip(x));
1232*e1eccf28SAndroid Build Coastguard Worker return x * approx_recip(1.f + 0.28f * x*x);
1233*e1eccf28SAndroid Build Coastguard Worker }
1234*e1eccf28SAndroid Build Coastguard Worker FN_FUNC_FN(approx_atan)
1235*e1eccf28SAndroid Build Coastguard Worker */
1236*e1eccf28SAndroid Build Coastguard Worker
1237*e1eccf28SAndroid Build Coastguard Worker typedef union
1238*e1eccf28SAndroid Build Coastguard Worker {
1239*e1eccf28SAndroid Build Coastguard Worker float fv;
1240*e1eccf28SAndroid Build Coastguard Worker int32_t iv;
1241*e1eccf28SAndroid Build Coastguard Worker } ieee_float_shape_type;
1242*e1eccf28SAndroid Build Coastguard Worker
1243*e1eccf28SAndroid Build Coastguard Worker /* Get a 32 bit int from a float. */
1244*e1eccf28SAndroid Build Coastguard Worker
1245*e1eccf28SAndroid Build Coastguard Worker #define GET_FLOAT_WORD(i,d) \
1246*e1eccf28SAndroid Build Coastguard Worker do { \
1247*e1eccf28SAndroid Build Coastguard Worker ieee_float_shape_type gf_u; \
1248*e1eccf28SAndroid Build Coastguard Worker gf_u.fv = (d); \
1249*e1eccf28SAndroid Build Coastguard Worker (i) = gf_u.iv; \
1250*e1eccf28SAndroid Build Coastguard Worker } while (0)
1251*e1eccf28SAndroid Build Coastguard Worker
1252*e1eccf28SAndroid Build Coastguard Worker /* Set a float from a 32 bit int. */
1253*e1eccf28SAndroid Build Coastguard Worker
1254*e1eccf28SAndroid Build Coastguard Worker #define SET_FLOAT_WORD(d,i) \
1255*e1eccf28SAndroid Build Coastguard Worker do { \
1256*e1eccf28SAndroid Build Coastguard Worker ieee_float_shape_type sf_u; \
1257*e1eccf28SAndroid Build Coastguard Worker sf_u.iv = (i); \
1258*e1eccf28SAndroid Build Coastguard Worker (d) = sf_u.fv; \
1259*e1eccf28SAndroid Build Coastguard Worker } while (0)
1260*e1eccf28SAndroid Build Coastguard Worker
1261*e1eccf28SAndroid Build Coastguard Worker
1262*e1eccf28SAndroid Build Coastguard Worker
1263*e1eccf28SAndroid Build Coastguard Worker // Valid -125 to 125
native_exp2(float v)1264*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) native_exp2(float v) {
1265*e1eccf28SAndroid Build Coastguard Worker int32_t iv = (int)v;
1266*e1eccf28SAndroid Build Coastguard Worker int32_t x = iv + (iv >> 31); // ~floor(v)
1267*e1eccf28SAndroid Build Coastguard Worker float r = (v - x);
1268*e1eccf28SAndroid Build Coastguard Worker
1269*e1eccf28SAndroid Build Coastguard Worker float fo;
1270*e1eccf28SAndroid Build Coastguard Worker SET_FLOAT_WORD(fo, (x + 127) << 23);
1271*e1eccf28SAndroid Build Coastguard Worker
1272*e1eccf28SAndroid Build Coastguard Worker r *= 0.694f; // ~ log(e) / log(2)
1273*e1eccf28SAndroid Build Coastguard Worker float r2 = r*r;
1274*e1eccf28SAndroid Build Coastguard Worker float adj = 1.f + r + (r2 * 0.5f) + (r2*r * 0.166666f) + (r2*r2 * 0.0416666f);
1275*e1eccf28SAndroid Build Coastguard Worker return fo * adj;
1276*e1eccf28SAndroid Build Coastguard Worker }
1277*e1eccf28SAndroid Build Coastguard Worker
native_exp2(float2 v)1278*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) native_exp2(float2 v) {
1279*e1eccf28SAndroid Build Coastguard Worker int2 iv = convert_int2(v);
1280*e1eccf28SAndroid Build Coastguard Worker int2 x = iv + (iv >> (int2)31);//floor(v);
1281*e1eccf28SAndroid Build Coastguard Worker float2 r = (v - convert_float2(x));
1282*e1eccf28SAndroid Build Coastguard Worker
1283*e1eccf28SAndroid Build Coastguard Worker x += 127;
1284*e1eccf28SAndroid Build Coastguard Worker
1285*e1eccf28SAndroid Build Coastguard Worker float2 fo = (float2)(x << (int2)23);
1286*e1eccf28SAndroid Build Coastguard Worker
1287*e1eccf28SAndroid Build Coastguard Worker r *= 0.694f; // ~ log(e) / log(2)
1288*e1eccf28SAndroid Build Coastguard Worker float2 r2 = r*r;
1289*e1eccf28SAndroid Build Coastguard Worker float2 adj = 1.f + r + (r2 * 0.5f) + (r2*r * 0.166666f) + (r2*r2 * 0.0416666f);
1290*e1eccf28SAndroid Build Coastguard Worker return fo * adj;
1291*e1eccf28SAndroid Build Coastguard Worker }
1292*e1eccf28SAndroid Build Coastguard Worker
native_exp2(float4 v)1293*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) native_exp2(float4 v) {
1294*e1eccf28SAndroid Build Coastguard Worker int4 iv = convert_int4(v);
1295*e1eccf28SAndroid Build Coastguard Worker int4 x = iv + (iv >> (int4)31);//floor(v);
1296*e1eccf28SAndroid Build Coastguard Worker float4 r = (v - convert_float4(x));
1297*e1eccf28SAndroid Build Coastguard Worker
1298*e1eccf28SAndroid Build Coastguard Worker x += 127;
1299*e1eccf28SAndroid Build Coastguard Worker
1300*e1eccf28SAndroid Build Coastguard Worker float4 fo = (float4)(x << (int4)23);
1301*e1eccf28SAndroid Build Coastguard Worker
1302*e1eccf28SAndroid Build Coastguard Worker r *= 0.694f; // ~ log(e) / log(2)
1303*e1eccf28SAndroid Build Coastguard Worker float4 r2 = r*r;
1304*e1eccf28SAndroid Build Coastguard Worker float4 adj = 1.f + r + (r2 * 0.5f) + (r2*r * 0.166666f) + (r2*r2 * 0.0416666f);
1305*e1eccf28SAndroid Build Coastguard Worker return fo * adj;
1306*e1eccf28SAndroid Build Coastguard Worker }
1307*e1eccf28SAndroid Build Coastguard Worker
native_exp2(float3 v)1308*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) native_exp2(float3 v) {
1309*e1eccf28SAndroid Build Coastguard Worker float4 t = 1.f;
1310*e1eccf28SAndroid Build Coastguard Worker t.xyz = v;
1311*e1eccf28SAndroid Build Coastguard Worker return native_exp2(t).xyz;
1312*e1eccf28SAndroid Build Coastguard Worker }
1313*e1eccf28SAndroid Build Coastguard Worker
1314*e1eccf28SAndroid Build Coastguard Worker
native_exp(float v)1315*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) native_exp(float v) {
1316*e1eccf28SAndroid Build Coastguard Worker return native_exp2(v * 1.442695041f);
1317*e1eccf28SAndroid Build Coastguard Worker }
native_exp(float2 v)1318*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) native_exp(float2 v) {
1319*e1eccf28SAndroid Build Coastguard Worker return native_exp2(v * 1.442695041f);
1320*e1eccf28SAndroid Build Coastguard Worker }
native_exp(float3 v)1321*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) native_exp(float3 v) {
1322*e1eccf28SAndroid Build Coastguard Worker return native_exp2(v * 1.442695041f);
1323*e1eccf28SAndroid Build Coastguard Worker }
native_exp(float4 v)1324*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) native_exp(float4 v) {
1325*e1eccf28SAndroid Build Coastguard Worker return native_exp2(v * 1.442695041f);
1326*e1eccf28SAndroid Build Coastguard Worker }
1327*e1eccf28SAndroid Build Coastguard Worker
native_exp10(float v)1328*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) native_exp10(float v) {
1329*e1eccf28SAndroid Build Coastguard Worker return native_exp2(v * 3.321928095f);
1330*e1eccf28SAndroid Build Coastguard Worker }
native_exp10(float2 v)1331*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) native_exp10(float2 v) {
1332*e1eccf28SAndroid Build Coastguard Worker return native_exp2(v * 3.321928095f);
1333*e1eccf28SAndroid Build Coastguard Worker }
native_exp10(float3 v)1334*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) native_exp10(float3 v) {
1335*e1eccf28SAndroid Build Coastguard Worker return native_exp2(v * 3.321928095f);
1336*e1eccf28SAndroid Build Coastguard Worker }
native_exp10(float4 v)1337*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) native_exp10(float4 v) {
1338*e1eccf28SAndroid Build Coastguard Worker return native_exp2(v * 3.321928095f);
1339*e1eccf28SAndroid Build Coastguard Worker }
1340*e1eccf28SAndroid Build Coastguard Worker
native_log2(float v)1341*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) native_log2(float v) {
1342*e1eccf28SAndroid Build Coastguard Worker int32_t ibits;
1343*e1eccf28SAndroid Build Coastguard Worker GET_FLOAT_WORD(ibits, v);
1344*e1eccf28SAndroid Build Coastguard Worker
1345*e1eccf28SAndroid Build Coastguard Worker int32_t e = (ibits >> 23) & 0xff;
1346*e1eccf28SAndroid Build Coastguard Worker
1347*e1eccf28SAndroid Build Coastguard Worker ibits &= 0x7fffff;
1348*e1eccf28SAndroid Build Coastguard Worker ibits |= 127 << 23;
1349*e1eccf28SAndroid Build Coastguard Worker
1350*e1eccf28SAndroid Build Coastguard Worker float ir;
1351*e1eccf28SAndroid Build Coastguard Worker SET_FLOAT_WORD(ir, ibits);
1352*e1eccf28SAndroid Build Coastguard Worker ir -= 1.5f;
1353*e1eccf28SAndroid Build Coastguard Worker float ir2 = ir*ir;
1354*e1eccf28SAndroid Build Coastguard Worker float adj2 = (0.405465108f / 0.693147181f) +
1355*e1eccf28SAndroid Build Coastguard Worker ((0.666666667f / 0.693147181f) * ir) -
1356*e1eccf28SAndroid Build Coastguard Worker ((0.222222222f / 0.693147181f) * ir2) +
1357*e1eccf28SAndroid Build Coastguard Worker ((0.098765432f / 0.693147181f) * ir*ir2) -
1358*e1eccf28SAndroid Build Coastguard Worker ((0.049382716f / 0.693147181f) * ir2*ir2) +
1359*e1eccf28SAndroid Build Coastguard Worker ((0.026337449f / 0.693147181f) * ir*ir2*ir2) -
1360*e1eccf28SAndroid Build Coastguard Worker ((0.014631916f / 0.693147181f) * ir2*ir2*ir2);
1361*e1eccf28SAndroid Build Coastguard Worker return (float)(e - 127) + adj2;
1362*e1eccf28SAndroid Build Coastguard Worker }
native_log2(float2 v)1363*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) native_log2(float2 v) {
1364*e1eccf28SAndroid Build Coastguard Worker float2 v2 = {native_log2(v.x), native_log2(v.y)};
1365*e1eccf28SAndroid Build Coastguard Worker return v2;
1366*e1eccf28SAndroid Build Coastguard Worker }
native_log2(float3 v)1367*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) native_log2(float3 v) {
1368*e1eccf28SAndroid Build Coastguard Worker float3 v2 = {native_log2(v.x), native_log2(v.y), native_log2(v.z)};
1369*e1eccf28SAndroid Build Coastguard Worker return v2;
1370*e1eccf28SAndroid Build Coastguard Worker }
native_log2(float4 v)1371*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) native_log2(float4 v) {
1372*e1eccf28SAndroid Build Coastguard Worker float4 v2 = {native_log2(v.x), native_log2(v.y), native_log2(v.z), native_log2(v.w)};
1373*e1eccf28SAndroid Build Coastguard Worker return v2;
1374*e1eccf28SAndroid Build Coastguard Worker }
1375*e1eccf28SAndroid Build Coastguard Worker
native_log(float v)1376*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) native_log(float v) {
1377*e1eccf28SAndroid Build Coastguard Worker return native_log2(v) * (1.f / 1.442695041f);
1378*e1eccf28SAndroid Build Coastguard Worker }
native_log(float2 v)1379*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) native_log(float2 v) {
1380*e1eccf28SAndroid Build Coastguard Worker return native_log2(v) * (1.f / 1.442695041f);
1381*e1eccf28SAndroid Build Coastguard Worker }
native_log(float3 v)1382*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) native_log(float3 v) {
1383*e1eccf28SAndroid Build Coastguard Worker return native_log2(v) * (1.f / 1.442695041f);
1384*e1eccf28SAndroid Build Coastguard Worker }
native_log(float4 v)1385*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) native_log(float4 v) {
1386*e1eccf28SAndroid Build Coastguard Worker return native_log2(v) * (1.f / 1.442695041f);
1387*e1eccf28SAndroid Build Coastguard Worker }
1388*e1eccf28SAndroid Build Coastguard Worker
native_log10(float v)1389*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) native_log10(float v) {
1390*e1eccf28SAndroid Build Coastguard Worker return native_log2(v) * (1.f / 3.321928095f);
1391*e1eccf28SAndroid Build Coastguard Worker }
native_log10(float2 v)1392*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) native_log10(float2 v) {
1393*e1eccf28SAndroid Build Coastguard Worker return native_log2(v) * (1.f / 3.321928095f);
1394*e1eccf28SAndroid Build Coastguard Worker }
native_log10(float3 v)1395*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) native_log10(float3 v) {
1396*e1eccf28SAndroid Build Coastguard Worker return native_log2(v) * (1.f / 3.321928095f);
1397*e1eccf28SAndroid Build Coastguard Worker }
native_log10(float4 v)1398*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) native_log10(float4 v) {
1399*e1eccf28SAndroid Build Coastguard Worker return native_log2(v) * (1.f / 3.321928095f);
1400*e1eccf28SAndroid Build Coastguard Worker }
1401*e1eccf28SAndroid Build Coastguard Worker
1402*e1eccf28SAndroid Build Coastguard Worker
native_powr(float v,float y)1403*e1eccf28SAndroid Build Coastguard Worker extern float __attribute__((overloadable)) native_powr(float v, float y) {
1404*e1eccf28SAndroid Build Coastguard Worker float v2 = native_log2(v);
1405*e1eccf28SAndroid Build Coastguard Worker v2 = fmax(v2 * y, -125.f);
1406*e1eccf28SAndroid Build Coastguard Worker return native_exp2(v2);
1407*e1eccf28SAndroid Build Coastguard Worker }
native_powr(float2 v,float2 y)1408*e1eccf28SAndroid Build Coastguard Worker extern float2 __attribute__((overloadable)) native_powr(float2 v, float2 y) {
1409*e1eccf28SAndroid Build Coastguard Worker float2 v2 = native_log2(v);
1410*e1eccf28SAndroid Build Coastguard Worker v2 = fmax(v2 * y, -125.f);
1411*e1eccf28SAndroid Build Coastguard Worker return native_exp2(v2);
1412*e1eccf28SAndroid Build Coastguard Worker }
native_powr(float3 v,float3 y)1413*e1eccf28SAndroid Build Coastguard Worker extern float3 __attribute__((overloadable)) native_powr(float3 v, float3 y) {
1414*e1eccf28SAndroid Build Coastguard Worker float3 v2 = native_log2(v);
1415*e1eccf28SAndroid Build Coastguard Worker v2 = fmax(v2 * y, -125.f);
1416*e1eccf28SAndroid Build Coastguard Worker return native_exp2(v2);
1417*e1eccf28SAndroid Build Coastguard Worker }
native_powr(float4 v,float4 y)1418*e1eccf28SAndroid Build Coastguard Worker extern float4 __attribute__((overloadable)) native_powr(float4 v, float4 y) {
1419*e1eccf28SAndroid Build Coastguard Worker float4 v2 = native_log2(v);
1420*e1eccf28SAndroid Build Coastguard Worker v2 = fmax(v2 * y, -125.f);
1421*e1eccf28SAndroid Build Coastguard Worker return native_exp2(v2);
1422*e1eccf28SAndroid Build Coastguard Worker }
1423*e1eccf28SAndroid Build Coastguard Worker
min(double v1,double v2)1424*e1eccf28SAndroid Build Coastguard Worker extern double __attribute__((overloadable)) min(double v1, double v2) {
1425*e1eccf28SAndroid Build Coastguard Worker return v1 < v2 ? v1 : v2;
1426*e1eccf28SAndroid Build Coastguard Worker }
1427*e1eccf28SAndroid Build Coastguard Worker
min(double2 v1,double2 v2)1428*e1eccf28SAndroid Build Coastguard Worker extern double2 __attribute__((overloadable)) min(double2 v1, double2 v2) {
1429*e1eccf28SAndroid Build Coastguard Worker double2 r;
1430*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x < v2.x ? v1.x : v2.x;
1431*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y < v2.y ? v1.y : v2.y;
1432*e1eccf28SAndroid Build Coastguard Worker return r;
1433*e1eccf28SAndroid Build Coastguard Worker }
1434*e1eccf28SAndroid Build Coastguard Worker
min(double3 v1,double3 v2)1435*e1eccf28SAndroid Build Coastguard Worker extern double3 __attribute__((overloadable)) min(double3 v1, double3 v2) {
1436*e1eccf28SAndroid Build Coastguard Worker double3 r;
1437*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x < v2.x ? v1.x : v2.x;
1438*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y < v2.y ? v1.y : v2.y;
1439*e1eccf28SAndroid Build Coastguard Worker r.z = v1.z < v2.z ? v1.z : v2.z;
1440*e1eccf28SAndroid Build Coastguard Worker return r;
1441*e1eccf28SAndroid Build Coastguard Worker }
1442*e1eccf28SAndroid Build Coastguard Worker
min(double4 v1,double4 v2)1443*e1eccf28SAndroid Build Coastguard Worker extern double4 __attribute__((overloadable)) min(double4 v1, double4 v2) {
1444*e1eccf28SAndroid Build Coastguard Worker double4 r;
1445*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x < v2.x ? v1.x : v2.x;
1446*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y < v2.y ? v1.y : v2.y;
1447*e1eccf28SAndroid Build Coastguard Worker r.z = v1.z < v2.z ? v1.z : v2.z;
1448*e1eccf28SAndroid Build Coastguard Worker r.w = v1.w < v2.w ? v1.w : v2.w;
1449*e1eccf28SAndroid Build Coastguard Worker return r;
1450*e1eccf28SAndroid Build Coastguard Worker }
1451*e1eccf28SAndroid Build Coastguard Worker
min(long v1,long v2)1452*e1eccf28SAndroid Build Coastguard Worker extern long __attribute__((overloadable)) min(long v1, long v2) {
1453*e1eccf28SAndroid Build Coastguard Worker return v1 < v2 ? v1 : v2;
1454*e1eccf28SAndroid Build Coastguard Worker }
min(long2 v1,long2 v2)1455*e1eccf28SAndroid Build Coastguard Worker extern long2 __attribute__((overloadable)) min(long2 v1, long2 v2) {
1456*e1eccf28SAndroid Build Coastguard Worker long2 r;
1457*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x < v2.x ? v1.x : v2.x;
1458*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y < v2.y ? v1.y : v2.y;
1459*e1eccf28SAndroid Build Coastguard Worker return r;
1460*e1eccf28SAndroid Build Coastguard Worker }
min(long3 v1,long3 v2)1461*e1eccf28SAndroid Build Coastguard Worker extern long3 __attribute__((overloadable)) min(long3 v1, long3 v2) {
1462*e1eccf28SAndroid Build Coastguard Worker long3 r;
1463*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x < v2.x ? v1.x : v2.x;
1464*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y < v2.y ? v1.y : v2.y;
1465*e1eccf28SAndroid Build Coastguard Worker r.z = v1.z < v2.z ? v1.z : v2.z;
1466*e1eccf28SAndroid Build Coastguard Worker return r;
1467*e1eccf28SAndroid Build Coastguard Worker }
min(long4 v1,long4 v2)1468*e1eccf28SAndroid Build Coastguard Worker extern long4 __attribute__((overloadable)) min(long4 v1, long4 v2) {
1469*e1eccf28SAndroid Build Coastguard Worker long4 r;
1470*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x < v2.x ? v1.x : v2.x;
1471*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y < v2.y ? v1.y : v2.y;
1472*e1eccf28SAndroid Build Coastguard Worker r.z = v1.z < v2.z ? v1.z : v2.z;
1473*e1eccf28SAndroid Build Coastguard Worker r.w = v1.w < v2.w ? v1.w : v2.w;
1474*e1eccf28SAndroid Build Coastguard Worker return r;
1475*e1eccf28SAndroid Build Coastguard Worker }
1476*e1eccf28SAndroid Build Coastguard Worker
min(ulong v1,ulong v2)1477*e1eccf28SAndroid Build Coastguard Worker extern ulong __attribute__((overloadable)) min(ulong v1, ulong v2) {
1478*e1eccf28SAndroid Build Coastguard Worker return v1 < v2 ? v1 : v2;
1479*e1eccf28SAndroid Build Coastguard Worker }
min(ulong2 v1,ulong2 v2)1480*e1eccf28SAndroid Build Coastguard Worker extern ulong2 __attribute__((overloadable)) min(ulong2 v1, ulong2 v2) {
1481*e1eccf28SAndroid Build Coastguard Worker ulong2 r;
1482*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x < v2.x ? v1.x : v2.x;
1483*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y < v2.y ? v1.y : v2.y;
1484*e1eccf28SAndroid Build Coastguard Worker return r;
1485*e1eccf28SAndroid Build Coastguard Worker }
min(ulong3 v1,ulong3 v2)1486*e1eccf28SAndroid Build Coastguard Worker extern ulong3 __attribute__((overloadable)) min(ulong3 v1, ulong3 v2) {
1487*e1eccf28SAndroid Build Coastguard Worker ulong3 r;
1488*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x < v2.x ? v1.x : v2.x;
1489*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y < v2.y ? v1.y : v2.y;
1490*e1eccf28SAndroid Build Coastguard Worker r.z = v1.z < v2.z ? v1.z : v2.z;
1491*e1eccf28SAndroid Build Coastguard Worker return r;
1492*e1eccf28SAndroid Build Coastguard Worker }
min(ulong4 v1,ulong4 v2)1493*e1eccf28SAndroid Build Coastguard Worker extern ulong4 __attribute__((overloadable)) min(ulong4 v1, ulong4 v2) {
1494*e1eccf28SAndroid Build Coastguard Worker ulong4 r;
1495*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x < v2.x ? v1.x : v2.x;
1496*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y < v2.y ? v1.y : v2.y;
1497*e1eccf28SAndroid Build Coastguard Worker r.z = v1.z < v2.z ? v1.z : v2.z;
1498*e1eccf28SAndroid Build Coastguard Worker r.w = v1.w < v2.w ? v1.w : v2.w;
1499*e1eccf28SAndroid Build Coastguard Worker return r;
1500*e1eccf28SAndroid Build Coastguard Worker }
1501*e1eccf28SAndroid Build Coastguard Worker
max(double v1,double v2)1502*e1eccf28SAndroid Build Coastguard Worker extern double __attribute__((overloadable)) max(double v1, double v2) {
1503*e1eccf28SAndroid Build Coastguard Worker return v1 > v2 ? v1 : v2;
1504*e1eccf28SAndroid Build Coastguard Worker }
1505*e1eccf28SAndroid Build Coastguard Worker
max(double2 v1,double2 v2)1506*e1eccf28SAndroid Build Coastguard Worker extern double2 __attribute__((overloadable)) max(double2 v1, double2 v2) {
1507*e1eccf28SAndroid Build Coastguard Worker double2 r;
1508*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x > v2.x ? v1.x : v2.x;
1509*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y > v2.y ? v1.y : v2.y;
1510*e1eccf28SAndroid Build Coastguard Worker return r;
1511*e1eccf28SAndroid Build Coastguard Worker }
1512*e1eccf28SAndroid Build Coastguard Worker
max(double3 v1,double3 v2)1513*e1eccf28SAndroid Build Coastguard Worker extern double3 __attribute__((overloadable)) max(double3 v1, double3 v2) {
1514*e1eccf28SAndroid Build Coastguard Worker double3 r;
1515*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x > v2.x ? v1.x : v2.x;
1516*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y > v2.y ? v1.y : v2.y;
1517*e1eccf28SAndroid Build Coastguard Worker r.z = v1.z > v2.z ? v1.z : v2.z;
1518*e1eccf28SAndroid Build Coastguard Worker return r;
1519*e1eccf28SAndroid Build Coastguard Worker }
1520*e1eccf28SAndroid Build Coastguard Worker
max(double4 v1,double4 v2)1521*e1eccf28SAndroid Build Coastguard Worker extern double4 __attribute__((overloadable)) max(double4 v1, double4 v2) {
1522*e1eccf28SAndroid Build Coastguard Worker double4 r;
1523*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x > v2.x ? v1.x : v2.x;
1524*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y > v2.y ? v1.y : v2.y;
1525*e1eccf28SAndroid Build Coastguard Worker r.z = v1.z > v2.z ? v1.z : v2.z;
1526*e1eccf28SAndroid Build Coastguard Worker r.w = v1.w > v2.w ? v1.w : v2.w;
1527*e1eccf28SAndroid Build Coastguard Worker return r;
1528*e1eccf28SAndroid Build Coastguard Worker }
1529*e1eccf28SAndroid Build Coastguard Worker
max(long v1,long v2)1530*e1eccf28SAndroid Build Coastguard Worker extern long __attribute__((overloadable)) max(long v1, long v2) {
1531*e1eccf28SAndroid Build Coastguard Worker return v1 > v2 ? v1 : v2;
1532*e1eccf28SAndroid Build Coastguard Worker }
max(long2 v1,long2 v2)1533*e1eccf28SAndroid Build Coastguard Worker extern long2 __attribute__((overloadable)) max(long2 v1, long2 v2) {
1534*e1eccf28SAndroid Build Coastguard Worker long2 r;
1535*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x > v2.x ? v1.x : v2.x;
1536*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y > v2.y ? v1.y : v2.y;
1537*e1eccf28SAndroid Build Coastguard Worker return r;
1538*e1eccf28SAndroid Build Coastguard Worker }
max(long3 v1,long3 v2)1539*e1eccf28SAndroid Build Coastguard Worker extern long3 __attribute__((overloadable)) max(long3 v1, long3 v2) {
1540*e1eccf28SAndroid Build Coastguard Worker long3 r;
1541*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x > v2.x ? v1.x : v2.x;
1542*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y > v2.y ? v1.y : v2.y;
1543*e1eccf28SAndroid Build Coastguard Worker r.z = v1.z > v2.z ? v1.z : v2.z;
1544*e1eccf28SAndroid Build Coastguard Worker return r;
1545*e1eccf28SAndroid Build Coastguard Worker }
max(long4 v1,long4 v2)1546*e1eccf28SAndroid Build Coastguard Worker extern long4 __attribute__((overloadable)) max(long4 v1, long4 v2) {
1547*e1eccf28SAndroid Build Coastguard Worker long4 r;
1548*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x > v2.x ? v1.x : v2.x;
1549*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y > v2.y ? v1.y : v2.y;
1550*e1eccf28SAndroid Build Coastguard Worker r.z = v1.z > v2.z ? v1.z : v2.z;
1551*e1eccf28SAndroid Build Coastguard Worker r.w = v1.w > v2.w ? v1.w : v2.w;
1552*e1eccf28SAndroid Build Coastguard Worker return r;
1553*e1eccf28SAndroid Build Coastguard Worker }
1554*e1eccf28SAndroid Build Coastguard Worker
max(ulong v1,ulong v2)1555*e1eccf28SAndroid Build Coastguard Worker extern ulong __attribute__((overloadable)) max(ulong v1, ulong v2) {
1556*e1eccf28SAndroid Build Coastguard Worker return v1 > v2 ? v1 : v2;
1557*e1eccf28SAndroid Build Coastguard Worker }
max(ulong2 v1,ulong2 v2)1558*e1eccf28SAndroid Build Coastguard Worker extern ulong2 __attribute__((overloadable)) max(ulong2 v1, ulong2 v2) {
1559*e1eccf28SAndroid Build Coastguard Worker ulong2 r;
1560*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x > v2.x ? v1.x : v2.x;
1561*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y > v2.y ? v1.y : v2.y;
1562*e1eccf28SAndroid Build Coastguard Worker return r;
1563*e1eccf28SAndroid Build Coastguard Worker }
max(ulong3 v1,ulong3 v2)1564*e1eccf28SAndroid Build Coastguard Worker extern ulong3 __attribute__((overloadable)) max(ulong3 v1, ulong3 v2) {
1565*e1eccf28SAndroid Build Coastguard Worker ulong3 r;
1566*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x > v2.x ? v1.x : v2.x;
1567*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y > v2.y ? v1.y : v2.y;
1568*e1eccf28SAndroid Build Coastguard Worker r.z = v1.z > v2.z ? v1.z : v2.z;
1569*e1eccf28SAndroid Build Coastguard Worker return r;
1570*e1eccf28SAndroid Build Coastguard Worker }
max(ulong4 v1,ulong4 v2)1571*e1eccf28SAndroid Build Coastguard Worker extern ulong4 __attribute__((overloadable)) max(ulong4 v1, ulong4 v2) {
1572*e1eccf28SAndroid Build Coastguard Worker ulong4 r;
1573*e1eccf28SAndroid Build Coastguard Worker r.x = v1.x > v2.x ? v1.x : v2.x;
1574*e1eccf28SAndroid Build Coastguard Worker r.y = v1.y > v2.y ? v1.y : v2.y;
1575*e1eccf28SAndroid Build Coastguard Worker r.z = v1.z > v2.z ? v1.z : v2.z;
1576*e1eccf28SAndroid Build Coastguard Worker r.w = v1.w > v2.w ? v1.w : v2.w;
1577*e1eccf28SAndroid Build Coastguard Worker return r;
1578*e1eccf28SAndroid Build Coastguard Worker }
1579*e1eccf28SAndroid Build Coastguard Worker
1580*e1eccf28SAndroid Build Coastguard Worker #define THUNK_NATIVE_F(fn) \
1581*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_##fn(float v) { return fn(v);} \
1582*e1eccf28SAndroid Build Coastguard Worker float2 __attribute__((overloadable)) native_##fn(float2 v) { return fn(v);} \
1583*e1eccf28SAndroid Build Coastguard Worker float3 __attribute__((overloadable)) native_##fn(float3 v) { return fn(v);} \
1584*e1eccf28SAndroid Build Coastguard Worker float4 __attribute__((overloadable)) native_##fn(float4 v) { return fn(v);}
1585*e1eccf28SAndroid Build Coastguard Worker
1586*e1eccf28SAndroid Build Coastguard Worker #define THUNK_NATIVE_F_F(fn) \
1587*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_##fn(float v1, float v2) { return fn(v1, v2);} \
1588*e1eccf28SAndroid Build Coastguard Worker float2 __attribute__((overloadable)) native_##fn(float2 v1, float2 v2) { return fn(v1, v2);} \
1589*e1eccf28SAndroid Build Coastguard Worker float3 __attribute__((overloadable)) native_##fn(float3 v1, float3 v2) { return fn(v1, v2);} \
1590*e1eccf28SAndroid Build Coastguard Worker float4 __attribute__((overloadable)) native_##fn(float4 v1, float4 v2) { return fn(v1, v2);}
1591*e1eccf28SAndroid Build Coastguard Worker
1592*e1eccf28SAndroid Build Coastguard Worker #define THUNK_NATIVE_F_FP(fn) \
1593*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_##fn(float v1, float *v2) { return fn(v1, v2);} \
1594*e1eccf28SAndroid Build Coastguard Worker float2 __attribute__((overloadable)) native_##fn(float2 v1, float2 *v2) { return fn(v1, v2);} \
1595*e1eccf28SAndroid Build Coastguard Worker float3 __attribute__((overloadable)) native_##fn(float3 v1, float3 *v2) { return fn(v1, v2);} \
1596*e1eccf28SAndroid Build Coastguard Worker float4 __attribute__((overloadable)) native_##fn(float4 v1, float4 *v2) { return fn(v1, v2);}
1597*e1eccf28SAndroid Build Coastguard Worker
1598*e1eccf28SAndroid Build Coastguard Worker #define THUNK_NATIVE_F_I(fn) \
1599*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_##fn(float v1, int v2) { return fn(v1, v2);} \
1600*e1eccf28SAndroid Build Coastguard Worker float2 __attribute__((overloadable)) native_##fn(float2 v1, int2 v2) { return fn(v1, v2);} \
1601*e1eccf28SAndroid Build Coastguard Worker float3 __attribute__((overloadable)) native_##fn(float3 v1, int3 v2) { return fn(v1, v2);} \
1602*e1eccf28SAndroid Build Coastguard Worker float4 __attribute__((overloadable)) native_##fn(float4 v1, int4 v2) { return fn(v1, v2);}
1603*e1eccf28SAndroid Build Coastguard Worker
1604*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(acos)
THUNK_NATIVE_F(acosh)1605*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(acosh)
1606*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(acospi)
1607*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(asin)
1608*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(asinh)
1609*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(asinpi)
1610*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(atan)
1611*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F_F(atan2)
1612*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(atanh)
1613*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(atanpi)
1614*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F_F(atan2pi)
1615*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(cbrt)
1616*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(cos)
1617*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(cosh)
1618*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(cospi)
1619*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(expm1)
1620*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F_F(hypot)
1621*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(log1p)
1622*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F_I(rootn)
1623*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(rsqrt)
1624*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(sqrt)
1625*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(sin)
1626*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F_FP(sincos)
1627*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(sinh)
1628*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(sinpi)
1629*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(tan)
1630*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(tanh)
1631*e1eccf28SAndroid Build Coastguard Worker THUNK_NATIVE_F(tanpi)
1632*e1eccf28SAndroid Build Coastguard Worker
1633*e1eccf28SAndroid Build Coastguard Worker #undef THUNK_NATIVE_F
1634*e1eccf28SAndroid Build Coastguard Worker #undef THUNK_NATIVE_F_F
1635*e1eccf28SAndroid Build Coastguard Worker #undef THUNK_NATIVE_F_I
1636*e1eccf28SAndroid Build Coastguard Worker #undef THUNK_NATIVE_F_FP
1637*e1eccf28SAndroid Build Coastguard Worker
1638*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_normalize(float v) { return fast_normalize(v);}
native_normalize(float2 v)1639*e1eccf28SAndroid Build Coastguard Worker float2 __attribute__((overloadable)) native_normalize(float2 v) { return fast_normalize(v);}
native_normalize(float3 v)1640*e1eccf28SAndroid Build Coastguard Worker float3 __attribute__((overloadable)) native_normalize(float3 v) { return fast_normalize(v);}
native_normalize(float4 v)1641*e1eccf28SAndroid Build Coastguard Worker float4 __attribute__((overloadable)) native_normalize(float4 v) { return fast_normalize(v);}
1642*e1eccf28SAndroid Build Coastguard Worker
native_distance(float v1,float v2)1643*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_distance(float v1, float v2) { return fast_distance(v1, v2);}
native_distance(float2 v1,float2 v2)1644*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_distance(float2 v1, float2 v2) { return fast_distance(v1, v2);}
native_distance(float3 v1,float3 v2)1645*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_distance(float3 v1, float3 v2) { return fast_distance(v1, v2);}
native_distance(float4 v1,float4 v2)1646*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_distance(float4 v1, float4 v2) { return fast_distance(v1, v2);}
1647*e1eccf28SAndroid Build Coastguard Worker
native_length(float v)1648*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_length(float v) { return fast_length(v);}
native_length(float2 v)1649*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_length(float2 v) { return fast_length(v);}
native_length(float3 v)1650*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_length(float3 v) { return fast_length(v);}
native_length(float4 v)1651*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_length(float4 v) { return fast_length(v);}
1652*e1eccf28SAndroid Build Coastguard Worker
native_divide(float v1,float v2)1653*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_divide(float v1, float v2) { return v1 / v2;}
native_divide(float2 v1,float2 v2)1654*e1eccf28SAndroid Build Coastguard Worker float2 __attribute__((overloadable)) native_divide(float2 v1, float2 v2) { return v1 / v2;}
native_divide(float3 v1,float3 v2)1655*e1eccf28SAndroid Build Coastguard Worker float3 __attribute__((overloadable)) native_divide(float3 v1, float3 v2) { return v1 / v2;}
native_divide(float4 v1,float4 v2)1656*e1eccf28SAndroid Build Coastguard Worker float4 __attribute__((overloadable)) native_divide(float4 v1, float4 v2) { return v1 / v2;}
1657*e1eccf28SAndroid Build Coastguard Worker
native_recip(float v)1658*e1eccf28SAndroid Build Coastguard Worker float __attribute__((overloadable)) native_recip(float v) { return 1.f / v;}
native_recip(float2 v)1659*e1eccf28SAndroid Build Coastguard Worker float2 __attribute__((overloadable)) native_recip(float2 v) { return ((float2)1.f) / v;}
native_recip(float3 v)1660*e1eccf28SAndroid Build Coastguard Worker float3 __attribute__((overloadable)) native_recip(float3 v) { return ((float3)1.f) / v;}
native_recip(float4 v)1661*e1eccf28SAndroid Build Coastguard Worker float4 __attribute__((overloadable)) native_recip(float4 v) { return ((float4)1.f) / v;}
1662*e1eccf28SAndroid Build Coastguard Worker
1663*e1eccf28SAndroid Build Coastguard Worker
1664*e1eccf28SAndroid Build Coastguard Worker
1665*e1eccf28SAndroid Build Coastguard Worker
1666*e1eccf28SAndroid Build Coastguard Worker
1667*e1eccf28SAndroid Build Coastguard Worker #undef FN_FUNC_FN
1668*e1eccf28SAndroid Build Coastguard Worker #undef IN_FUNC_FN
1669*e1eccf28SAndroid Build Coastguard Worker #undef FN_FUNC_FN_FN
1670*e1eccf28SAndroid Build Coastguard Worker #undef FN_FUNC_FN_F
1671*e1eccf28SAndroid Build Coastguard Worker #undef FN_FUNC_FN_IN
1672*e1eccf28SAndroid Build Coastguard Worker #undef FN_FUNC_FN_I
1673*e1eccf28SAndroid Build Coastguard Worker #undef FN_FUNC_FN_PFN
1674*e1eccf28SAndroid Build Coastguard Worker #undef FN_FUNC_FN_PIN
1675*e1eccf28SAndroid Build Coastguard Worker #undef FN_FUNC_FN_FN_FN
1676*e1eccf28SAndroid Build Coastguard Worker #undef FN_FUNC_FN_FN_PIN
1677*e1eccf28SAndroid Build Coastguard Worker #undef XN_FUNC_YN
1678*e1eccf28SAndroid Build Coastguard Worker #undef UIN_FUNC_IN
1679*e1eccf28SAndroid Build Coastguard Worker #undef IN_FUNC_IN
1680*e1eccf28SAndroid Build Coastguard Worker #undef XN_FUNC_XN_XN_BODY
1681*e1eccf28SAndroid Build Coastguard Worker #undef IN_FUNC_IN_IN_BODY
1682*e1eccf28SAndroid Build Coastguard Worker
1683*e1eccf28SAndroid Build Coastguard Worker static const unsigned short kHalfPositiveInfinity = 0x7c00;
1684*e1eccf28SAndroid Build Coastguard Worker
1685*e1eccf28SAndroid Build Coastguard Worker /* Define f16 functions of the form
1686*e1eccf28SAndroid Build Coastguard Worker * HN output = fn(HN input)
1687*e1eccf28SAndroid Build Coastguard Worker * where HN is scalar or vector half type
1688*e1eccf28SAndroid Build Coastguard Worker */
1689*e1eccf28SAndroid Build Coastguard Worker #define HN_FUNC_HN(fn) \
1690*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fn(half h) { \
1691*e1eccf28SAndroid Build Coastguard Worker return (half) fn((float) h); \
1692*e1eccf28SAndroid Build Coastguard Worker } \
1693*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) fn(half2 v) { \
1694*e1eccf28SAndroid Build Coastguard Worker return convert_half2(fn(convert_float2(v))); \
1695*e1eccf28SAndroid Build Coastguard Worker } \
1696*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) fn(half3 v) { \
1697*e1eccf28SAndroid Build Coastguard Worker return convert_half3(fn(convert_float3(v))); \
1698*e1eccf28SAndroid Build Coastguard Worker } \
1699*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) fn(half4 v) { \
1700*e1eccf28SAndroid Build Coastguard Worker return convert_half4(fn(convert_float4(v))); \
1701*e1eccf28SAndroid Build Coastguard Worker }
1702*e1eccf28SAndroid Build Coastguard Worker
1703*e1eccf28SAndroid Build Coastguard Worker /* Define f16 functions of the form
1704*e1eccf28SAndroid Build Coastguard Worker * HN output = fn(HN input1, HN input2)
1705*e1eccf28SAndroid Build Coastguard Worker * where HN is scalar or vector half type
1706*e1eccf28SAndroid Build Coastguard Worker */
1707*e1eccf28SAndroid Build Coastguard Worker #define HN_FUNC_HN_HN(fn) \
1708*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fn(half h1, half h2) { \
1709*e1eccf28SAndroid Build Coastguard Worker return (half) fn((float) h1, (float) h2); \
1710*e1eccf28SAndroid Build Coastguard Worker } \
1711*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) fn(half2 v1, half2 v2) { \
1712*e1eccf28SAndroid Build Coastguard Worker return convert_half2(fn(convert_float2(v1), \
1713*e1eccf28SAndroid Build Coastguard Worker convert_float2(v2))); \
1714*e1eccf28SAndroid Build Coastguard Worker } \
1715*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) fn(half3 v1, half3 v2) { \
1716*e1eccf28SAndroid Build Coastguard Worker return convert_half3(fn(convert_float3(v1), \
1717*e1eccf28SAndroid Build Coastguard Worker convert_float3(v2))); \
1718*e1eccf28SAndroid Build Coastguard Worker } \
1719*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) fn(half4 v1, half4 v2) { \
1720*e1eccf28SAndroid Build Coastguard Worker return convert_half4(fn(convert_float4(v1), \
1721*e1eccf28SAndroid Build Coastguard Worker convert_float4(v2))); \
1722*e1eccf28SAndroid Build Coastguard Worker }
1723*e1eccf28SAndroid Build Coastguard Worker
1724*e1eccf28SAndroid Build Coastguard Worker /* Define f16 functions of the form
1725*e1eccf28SAndroid Build Coastguard Worker * HN output = fn(HN input1, half input2)
1726*e1eccf28SAndroid Build Coastguard Worker * where HN is scalar or vector half type
1727*e1eccf28SAndroid Build Coastguard Worker */
1728*e1eccf28SAndroid Build Coastguard Worker #define HN_FUNC_HN_H(fn) \
1729*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) fn(half2 v1, half v2) { \
1730*e1eccf28SAndroid Build Coastguard Worker return convert_half2(fn(convert_float2(v1), (float) v2)); \
1731*e1eccf28SAndroid Build Coastguard Worker } \
1732*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) fn(half3 v1, half v2) { \
1733*e1eccf28SAndroid Build Coastguard Worker return convert_half3(fn(convert_float3(v1), (float) v2)); \
1734*e1eccf28SAndroid Build Coastguard Worker } \
1735*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) fn(half4 v1, half v2) { \
1736*e1eccf28SAndroid Build Coastguard Worker return convert_half4(fn(convert_float4(v1), (float) v2)); \
1737*e1eccf28SAndroid Build Coastguard Worker }
1738*e1eccf28SAndroid Build Coastguard Worker
1739*e1eccf28SAndroid Build Coastguard Worker /* Define f16 functions of the form
1740*e1eccf28SAndroid Build Coastguard Worker * HN output = fn(HN input1, HN input2, HN input3)
1741*e1eccf28SAndroid Build Coastguard Worker * where HN is scalar or vector half type
1742*e1eccf28SAndroid Build Coastguard Worker */
1743*e1eccf28SAndroid Build Coastguard Worker #define HN_FUNC_HN_HN_HN(fn) \
1744*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fn(half h1, half h2, half h3) { \
1745*e1eccf28SAndroid Build Coastguard Worker return (half) fn((float) h1, (float) h2, (float) h3); \
1746*e1eccf28SAndroid Build Coastguard Worker } \
1747*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) fn(half2 v1, half2 v2, half2 v3) { \
1748*e1eccf28SAndroid Build Coastguard Worker return convert_half2(fn(convert_float2(v1), \
1749*e1eccf28SAndroid Build Coastguard Worker convert_float2(v2), \
1750*e1eccf28SAndroid Build Coastguard Worker convert_float2(v3))); \
1751*e1eccf28SAndroid Build Coastguard Worker } \
1752*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) fn(half3 v1, half3 v2, half3 v3) { \
1753*e1eccf28SAndroid Build Coastguard Worker return convert_half3(fn(convert_float3(v1), \
1754*e1eccf28SAndroid Build Coastguard Worker convert_float3(v2), \
1755*e1eccf28SAndroid Build Coastguard Worker convert_float3(v3))); \
1756*e1eccf28SAndroid Build Coastguard Worker } \
1757*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) fn(half4 v1, half4 v2, half4 v3) { \
1758*e1eccf28SAndroid Build Coastguard Worker return convert_half4(fn(convert_float4(v1), \
1759*e1eccf28SAndroid Build Coastguard Worker convert_float4(v2), \
1760*e1eccf28SAndroid Build Coastguard Worker convert_float4(v3))); \
1761*e1eccf28SAndroid Build Coastguard Worker }
1762*e1eccf28SAndroid Build Coastguard Worker
1763*e1eccf28SAndroid Build Coastguard Worker /* Define f16 functions of the form
1764*e1eccf28SAndroid Build Coastguard Worker * HN output = fn(HN input1, IN input2)
1765*e1eccf28SAndroid Build Coastguard Worker * where HN is scalar or vector half type and IN the equivalent integer type
1766*e1eccf28SAndroid Build Coastguard Worker * of same vector length.
1767*e1eccf28SAndroid Build Coastguard Worker */
1768*e1eccf28SAndroid Build Coastguard Worker #define HN_FUNC_HN_IN(fn) \
1769*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fn(half h1, int v) { \
1770*e1eccf28SAndroid Build Coastguard Worker return (half) fn((float) h1, v); \
1771*e1eccf28SAndroid Build Coastguard Worker } \
1772*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) fn(half2 v1, int2 v2) { \
1773*e1eccf28SAndroid Build Coastguard Worker return convert_half2(fn(convert_float2(v1), v2)); \
1774*e1eccf28SAndroid Build Coastguard Worker } \
1775*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) fn(half3 v1, int3 v2) { \
1776*e1eccf28SAndroid Build Coastguard Worker return convert_half3(fn(convert_float3(v1), v2)); \
1777*e1eccf28SAndroid Build Coastguard Worker } \
1778*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) fn(half4 v1, int4 v2) { \
1779*e1eccf28SAndroid Build Coastguard Worker return convert_half4(fn(convert_float4(v1), v2)); \
1780*e1eccf28SAndroid Build Coastguard Worker }
1781*e1eccf28SAndroid Build Coastguard Worker
1782*e1eccf28SAndroid Build Coastguard Worker /* Define f16 functions of the form
1783*e1eccf28SAndroid Build Coastguard Worker * half output = fn(HN input1)
1784*e1eccf28SAndroid Build Coastguard Worker * where HN is a scalar or vector half type.
1785*e1eccf28SAndroid Build Coastguard Worker */
1786*e1eccf28SAndroid Build Coastguard Worker #define H_FUNC_HN(fn) \
1787*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fn(half h) { \
1788*e1eccf28SAndroid Build Coastguard Worker return (half) fn((float) h); \
1789*e1eccf28SAndroid Build Coastguard Worker } \
1790*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fn(half2 v) { \
1791*e1eccf28SAndroid Build Coastguard Worker return fn(convert_float2(v)); \
1792*e1eccf28SAndroid Build Coastguard Worker } \
1793*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fn(half3 v) { \
1794*e1eccf28SAndroid Build Coastguard Worker return fn(convert_float3(v)); \
1795*e1eccf28SAndroid Build Coastguard Worker } \
1796*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fn(half4 v) { \
1797*e1eccf28SAndroid Build Coastguard Worker return fn(convert_float4(v)); \
1798*e1eccf28SAndroid Build Coastguard Worker }
1799*e1eccf28SAndroid Build Coastguard Worker
1800*e1eccf28SAndroid Build Coastguard Worker /* Define f16 functions of the form
1801*e1eccf28SAndroid Build Coastguard Worker * half output = fn(HN input1, HN input2)
1802*e1eccf28SAndroid Build Coastguard Worker * where HN is a scalar or vector half type.
1803*e1eccf28SAndroid Build Coastguard Worker */
1804*e1eccf28SAndroid Build Coastguard Worker #define H_FUNC_HN_HN(fn) \
1805*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fn(half h1, half h2) { \
1806*e1eccf28SAndroid Build Coastguard Worker return (half) fn((float) h1, (float) h2); \
1807*e1eccf28SAndroid Build Coastguard Worker } \
1808*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fn(half2 v1, half2 v2) { \
1809*e1eccf28SAndroid Build Coastguard Worker return fn(convert_float2(v1), convert_float2(v2)); \
1810*e1eccf28SAndroid Build Coastguard Worker } \
1811*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fn(half3 v1, half3 v2) { \
1812*e1eccf28SAndroid Build Coastguard Worker return fn(convert_float3(v1), convert_float3(v2)); \
1813*e1eccf28SAndroid Build Coastguard Worker } \
1814*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fn(half4 v1, half4 v2) { \
1815*e1eccf28SAndroid Build Coastguard Worker return fn(convert_float4(v1), convert_float4(v2)); \
1816*e1eccf28SAndroid Build Coastguard Worker }
1817*e1eccf28SAndroid Build Coastguard Worker
1818*e1eccf28SAndroid Build Coastguard Worker #define SCALARIZE_HN_FUNC_HN_PHN(fnc) \
1819*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) fnc(half2 v1, half2 *v2) { \
1820*e1eccf28SAndroid Build Coastguard Worker half2 ret; \
1821*e1eccf28SAndroid Build Coastguard Worker half t[2]; \
1822*e1eccf28SAndroid Build Coastguard Worker ret.x = fnc(v1.x, &t[0]); \
1823*e1eccf28SAndroid Build Coastguard Worker ret.y = fnc(v1.y, &t[1]); \
1824*e1eccf28SAndroid Build Coastguard Worker v2->x = t[0]; \
1825*e1eccf28SAndroid Build Coastguard Worker v2->y = t[1]; \
1826*e1eccf28SAndroid Build Coastguard Worker return ret; \
1827*e1eccf28SAndroid Build Coastguard Worker } \
1828*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) fnc(half3 v1, half3 *v2) { \
1829*e1eccf28SAndroid Build Coastguard Worker half3 ret; \
1830*e1eccf28SAndroid Build Coastguard Worker half t[3]; \
1831*e1eccf28SAndroid Build Coastguard Worker ret.x = fnc(v1.x, &t[0]); \
1832*e1eccf28SAndroid Build Coastguard Worker ret.y = fnc(v1.y, &t[1]); \
1833*e1eccf28SAndroid Build Coastguard Worker ret.z = fnc(v1.z, &t[2]); \
1834*e1eccf28SAndroid Build Coastguard Worker v2->x = t[0]; \
1835*e1eccf28SAndroid Build Coastguard Worker v2->y = t[1]; \
1836*e1eccf28SAndroid Build Coastguard Worker v2->z = t[2]; \
1837*e1eccf28SAndroid Build Coastguard Worker return ret; \
1838*e1eccf28SAndroid Build Coastguard Worker } \
1839*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) fnc(half4 v1, half4 *v2) { \
1840*e1eccf28SAndroid Build Coastguard Worker half4 ret; \
1841*e1eccf28SAndroid Build Coastguard Worker half t[4]; \
1842*e1eccf28SAndroid Build Coastguard Worker ret.x = fnc(v1.x, &t[0]); \
1843*e1eccf28SAndroid Build Coastguard Worker ret.y = fnc(v1.y, &t[1]); \
1844*e1eccf28SAndroid Build Coastguard Worker ret.z = fnc(v1.z, &t[2]); \
1845*e1eccf28SAndroid Build Coastguard Worker ret.w = fnc(v1.w, &t[3]); \
1846*e1eccf28SAndroid Build Coastguard Worker v2->x = t[0]; \
1847*e1eccf28SAndroid Build Coastguard Worker v2->y = t[1]; \
1848*e1eccf28SAndroid Build Coastguard Worker v2->z = t[2]; \
1849*e1eccf28SAndroid Build Coastguard Worker v2->w = t[3]; \
1850*e1eccf28SAndroid Build Coastguard Worker return ret; \
1851*e1eccf28SAndroid Build Coastguard Worker }
1852*e1eccf28SAndroid Build Coastguard Worker
1853*e1eccf28SAndroid Build Coastguard Worker /* Define f16 functions of the form
1854*e1eccf28SAndroid Build Coastguard Worker * HN output = fn(HN input1, HN input2)
1855*e1eccf28SAndroid Build Coastguard Worker * where HN is a vector half type. The functions are defined to call the
1856*e1eccf28SAndroid Build Coastguard Worker * scalar function of the same name.
1857*e1eccf28SAndroid Build Coastguard Worker */
1858*e1eccf28SAndroid Build Coastguard Worker #define SCALARIZE_HN_FUNC_HN_HN(fn) \
1859*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) fn(half2 v1, half2 v2) { \
1860*e1eccf28SAndroid Build Coastguard Worker half2 ret; \
1861*e1eccf28SAndroid Build Coastguard Worker ret.x = fn(v1.x, v2.x); \
1862*e1eccf28SAndroid Build Coastguard Worker ret.y = fn(v1.y, v2.y); \
1863*e1eccf28SAndroid Build Coastguard Worker return ret; \
1864*e1eccf28SAndroid Build Coastguard Worker } \
1865*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) fn(half3 v1, half3 v2) { \
1866*e1eccf28SAndroid Build Coastguard Worker half3 ret; \
1867*e1eccf28SAndroid Build Coastguard Worker ret.x = fn(v1.x, v2.x); \
1868*e1eccf28SAndroid Build Coastguard Worker ret.y = fn(v1.y, v2.y); \
1869*e1eccf28SAndroid Build Coastguard Worker ret.z = fn(v1.z, v2.z); \
1870*e1eccf28SAndroid Build Coastguard Worker return ret; \
1871*e1eccf28SAndroid Build Coastguard Worker } \
1872*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) fn(half4 v1, half4 v2) { \
1873*e1eccf28SAndroid Build Coastguard Worker half4 ret; \
1874*e1eccf28SAndroid Build Coastguard Worker ret.x = fn(v1.x, v2.x); \
1875*e1eccf28SAndroid Build Coastguard Worker ret.y = fn(v1.y, v2.y); \
1876*e1eccf28SAndroid Build Coastguard Worker ret.z = fn(v1.z, v2.z); \
1877*e1eccf28SAndroid Build Coastguard Worker ret.w = fn(v1.w, v2.w); \
1878*e1eccf28SAndroid Build Coastguard Worker return ret; \
1879*e1eccf28SAndroid Build Coastguard Worker } \
1880*e1eccf28SAndroid Build Coastguard Worker
1881*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(acos);
1882*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(acosh);
1883*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(acospi);
1884*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(asin);
1885*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(asinh);
1886*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(asinpi);
1887*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(atan);
1888*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(atanh);
1889*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(atanpi);
1890*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(atan2);
1891*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(atan2pi);
1892*e1eccf28SAndroid Build Coastguard Worker
1893*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(cbrt);
1894*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(ceil);
1895*e1eccf28SAndroid Build Coastguard Worker
1896*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) copysign(half x, half y);
1897*e1eccf28SAndroid Build Coastguard Worker SCALARIZE_HN_FUNC_HN_HN(copysign);
1898*e1eccf28SAndroid Build Coastguard Worker
1899*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(cos);
1900*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(cosh);
1901*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(cospi);
1902*e1eccf28SAndroid Build Coastguard Worker
cross(half3 lhs,half3 rhs)1903*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) cross(half3 lhs, half3 rhs) {
1904*e1eccf28SAndroid Build Coastguard Worker half3 r;
1905*e1eccf28SAndroid Build Coastguard Worker r.x = lhs.y * rhs.z - lhs.z * rhs.y;
1906*e1eccf28SAndroid Build Coastguard Worker r.y = lhs.z * rhs.x - lhs.x * rhs.z;
1907*e1eccf28SAndroid Build Coastguard Worker r.z = lhs.x * rhs.y - lhs.y * rhs.x;
1908*e1eccf28SAndroid Build Coastguard Worker return r;
1909*e1eccf28SAndroid Build Coastguard Worker }
1910*e1eccf28SAndroid Build Coastguard Worker
cross(half4 lhs,half4 rhs)1911*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) cross(half4 lhs, half4 rhs) {
1912*e1eccf28SAndroid Build Coastguard Worker half4 r;
1913*e1eccf28SAndroid Build Coastguard Worker r.x = lhs.y * rhs.z - lhs.z * rhs.y;
1914*e1eccf28SAndroid Build Coastguard Worker r.y = lhs.z * rhs.x - lhs.x * rhs.z;
1915*e1eccf28SAndroid Build Coastguard Worker r.z = lhs.x * rhs.y - lhs.y * rhs.x;
1916*e1eccf28SAndroid Build Coastguard Worker r.w = 0.f;
1917*e1eccf28SAndroid Build Coastguard Worker return r;
1918*e1eccf28SAndroid Build Coastguard Worker }
1919*e1eccf28SAndroid Build Coastguard Worker
1920*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(degrees);
1921*e1eccf28SAndroid Build Coastguard Worker H_FUNC_HN_HN(distance);
1922*e1eccf28SAndroid Build Coastguard Worker H_FUNC_HN_HN(dot);
1923*e1eccf28SAndroid Build Coastguard Worker
1924*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(erf);
1925*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(erfc);
1926*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(exp);
1927*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(exp10);
1928*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(exp2);
1929*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(expm1);
1930*e1eccf28SAndroid Build Coastguard Worker
1931*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(fabs);
1932*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(fdim);
1933*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(floor);
1934*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN_HN(fma);
1935*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(fmax);
1936*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_H(fmax);
1937*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(fmin);
1938*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_H(fmin);
1939*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(fmod);
1940*e1eccf28SAndroid Build Coastguard Worker
fract(half v,half * iptr)1941*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) fract(half v, half *iptr) {
1942*e1eccf28SAndroid Build Coastguard Worker // maxLessThanOne = 0.99951171875, the largest value < 1.0
1943*e1eccf28SAndroid Build Coastguard Worker half maxLessThanOne;
1944*e1eccf28SAndroid Build Coastguard Worker SET_HALF_WORD(maxLessThanOne, 0x3bff);
1945*e1eccf28SAndroid Build Coastguard Worker
1946*e1eccf28SAndroid Build Coastguard Worker int i = (int) floor(v);
1947*e1eccf28SAndroid Build Coastguard Worker if (iptr) {
1948*e1eccf28SAndroid Build Coastguard Worker *iptr = i;
1949*e1eccf28SAndroid Build Coastguard Worker }
1950*e1eccf28SAndroid Build Coastguard Worker // return v - floor(v), if strictly less than one
1951*e1eccf28SAndroid Build Coastguard Worker return fmin(v - i, maxLessThanOne);
1952*e1eccf28SAndroid Build Coastguard Worker }
1953*e1eccf28SAndroid Build Coastguard Worker
1954*e1eccf28SAndroid Build Coastguard Worker SCALARIZE_HN_FUNC_HN_PHN(fract);
1955*e1eccf28SAndroid Build Coastguard Worker
fract(half v)1956*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((const, overloadable)) fract(half v) {
1957*e1eccf28SAndroid Build Coastguard Worker half unused;
1958*e1eccf28SAndroid Build Coastguard Worker return fract(v, &unused);
1959*e1eccf28SAndroid Build Coastguard Worker }
1960*e1eccf28SAndroid Build Coastguard Worker
fract(half2 v)1961*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((const, overloadable)) fract(half2 v) {
1962*e1eccf28SAndroid Build Coastguard Worker half2 unused;
1963*e1eccf28SAndroid Build Coastguard Worker return fract(v, &unused);
1964*e1eccf28SAndroid Build Coastguard Worker }
1965*e1eccf28SAndroid Build Coastguard Worker
fract(half3 v)1966*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((const, overloadable)) fract(half3 v) {
1967*e1eccf28SAndroid Build Coastguard Worker half3 unused;
1968*e1eccf28SAndroid Build Coastguard Worker return fract(v, &unused);
1969*e1eccf28SAndroid Build Coastguard Worker }
1970*e1eccf28SAndroid Build Coastguard Worker
fract(half4 v)1971*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((const, overloadable)) fract(half4 v) {
1972*e1eccf28SAndroid Build Coastguard Worker half4 unused;
1973*e1eccf28SAndroid Build Coastguard Worker return fract(v, &unused);
1974*e1eccf28SAndroid Build Coastguard Worker }
1975*e1eccf28SAndroid Build Coastguard Worker
1976*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) frexp(half x, int *eptr);
1977*e1eccf28SAndroid Build Coastguard Worker
frexp(half2 v1,int2 * eptr)1978*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) frexp(half2 v1, int2 *eptr) {
1979*e1eccf28SAndroid Build Coastguard Worker half2 ret;
1980*e1eccf28SAndroid Build Coastguard Worker int e[2];
1981*e1eccf28SAndroid Build Coastguard Worker ret.x = frexp(v1.x, &e[0]);
1982*e1eccf28SAndroid Build Coastguard Worker ret.y = frexp(v1.y, &e[1]);
1983*e1eccf28SAndroid Build Coastguard Worker eptr->x = e[0];
1984*e1eccf28SAndroid Build Coastguard Worker eptr->y = e[1];
1985*e1eccf28SAndroid Build Coastguard Worker return ret;
1986*e1eccf28SAndroid Build Coastguard Worker }
1987*e1eccf28SAndroid Build Coastguard Worker
frexp(half3 v1,int3 * eptr)1988*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) frexp(half3 v1, int3 *eptr) {
1989*e1eccf28SAndroid Build Coastguard Worker half3 ret;
1990*e1eccf28SAndroid Build Coastguard Worker int e[3];
1991*e1eccf28SAndroid Build Coastguard Worker ret.x = frexp(v1.x, &e[0]);
1992*e1eccf28SAndroid Build Coastguard Worker ret.y = frexp(v1.y, &e[1]);
1993*e1eccf28SAndroid Build Coastguard Worker ret.z = frexp(v1.z, &e[2]);
1994*e1eccf28SAndroid Build Coastguard Worker eptr->x = e[0];
1995*e1eccf28SAndroid Build Coastguard Worker eptr->y = e[1];
1996*e1eccf28SAndroid Build Coastguard Worker eptr->z = e[2];
1997*e1eccf28SAndroid Build Coastguard Worker return ret;
1998*e1eccf28SAndroid Build Coastguard Worker }
1999*e1eccf28SAndroid Build Coastguard Worker
frexp(half4 v1,int4 * eptr)2000*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) frexp(half4 v1, int4 *eptr) {
2001*e1eccf28SAndroid Build Coastguard Worker half4 ret;
2002*e1eccf28SAndroid Build Coastguard Worker int e[4];
2003*e1eccf28SAndroid Build Coastguard Worker ret.x = frexp(v1.x, &e[0]);
2004*e1eccf28SAndroid Build Coastguard Worker ret.y = frexp(v1.y, &e[1]);
2005*e1eccf28SAndroid Build Coastguard Worker ret.z = frexp(v1.z, &e[2]);
2006*e1eccf28SAndroid Build Coastguard Worker ret.w = frexp(v1.w, &e[3]);
2007*e1eccf28SAndroid Build Coastguard Worker eptr->x = e[0];
2008*e1eccf28SAndroid Build Coastguard Worker eptr->y = e[1];
2009*e1eccf28SAndroid Build Coastguard Worker eptr->z = e[2];
2010*e1eccf28SAndroid Build Coastguard Worker eptr->w = e[3];
2011*e1eccf28SAndroid Build Coastguard Worker return ret;
2012*e1eccf28SAndroid Build Coastguard Worker }
2013*e1eccf28SAndroid Build Coastguard Worker
2014*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(hypot);
2015*e1eccf28SAndroid Build Coastguard Worker
2016*e1eccf28SAndroid Build Coastguard Worker extern int __attribute__((overloadable)) ilogb(half x);
2017*e1eccf28SAndroid Build Coastguard Worker
ilogb(half2 v)2018*e1eccf28SAndroid Build Coastguard Worker extern int2 __attribute__((overloadable)) ilogb(half2 v) {
2019*e1eccf28SAndroid Build Coastguard Worker int2 ret;
2020*e1eccf28SAndroid Build Coastguard Worker ret.x = ilogb(v.x);
2021*e1eccf28SAndroid Build Coastguard Worker ret.y = ilogb(v.y);
2022*e1eccf28SAndroid Build Coastguard Worker return ret;
2023*e1eccf28SAndroid Build Coastguard Worker }
ilogb(half3 v)2024*e1eccf28SAndroid Build Coastguard Worker extern int3 __attribute__((overloadable)) ilogb(half3 v) {
2025*e1eccf28SAndroid Build Coastguard Worker int3 ret;
2026*e1eccf28SAndroid Build Coastguard Worker ret.x = ilogb(v.x);
2027*e1eccf28SAndroid Build Coastguard Worker ret.y = ilogb(v.y);
2028*e1eccf28SAndroid Build Coastguard Worker ret.z = ilogb(v.z);
2029*e1eccf28SAndroid Build Coastguard Worker return ret;
2030*e1eccf28SAndroid Build Coastguard Worker }
ilogb(half4 v)2031*e1eccf28SAndroid Build Coastguard Worker extern int4 __attribute__((overloadable)) ilogb(half4 v) {
2032*e1eccf28SAndroid Build Coastguard Worker int4 ret;
2033*e1eccf28SAndroid Build Coastguard Worker ret.x = ilogb(v.x);
2034*e1eccf28SAndroid Build Coastguard Worker ret.y = ilogb(v.y);
2035*e1eccf28SAndroid Build Coastguard Worker ret.z = ilogb(v.z);
2036*e1eccf28SAndroid Build Coastguard Worker ret.w = ilogb(v.w);
2037*e1eccf28SAndroid Build Coastguard Worker return ret;
2038*e1eccf28SAndroid Build Coastguard Worker }
2039*e1eccf28SAndroid Build Coastguard Worker
2040*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_IN(ldexp);
ldexp(half2 v,int exponent)2041*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) ldexp(half2 v, int exponent) {
2042*e1eccf28SAndroid Build Coastguard Worker return convert_half2(ldexp(convert_float2(v), exponent));
2043*e1eccf28SAndroid Build Coastguard Worker }
ldexp(half3 v,int exponent)2044*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) ldexp(half3 v, int exponent) {
2045*e1eccf28SAndroid Build Coastguard Worker return convert_half3(ldexp(convert_float3(v), exponent));
2046*e1eccf28SAndroid Build Coastguard Worker }
ldexp(half4 v,int exponent)2047*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) ldexp(half4 v, int exponent) {
2048*e1eccf28SAndroid Build Coastguard Worker return convert_half4(ldexp(convert_float4(v), exponent));
2049*e1eccf28SAndroid Build Coastguard Worker }
2050*e1eccf28SAndroid Build Coastguard Worker
2051*e1eccf28SAndroid Build Coastguard Worker H_FUNC_HN(length);
2052*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(lgamma);
2053*e1eccf28SAndroid Build Coastguard Worker
lgamma(half h,int * signp)2054*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) lgamma(half h, int *signp) {
2055*e1eccf28SAndroid Build Coastguard Worker return (half) lgamma((float) h, signp);
2056*e1eccf28SAndroid Build Coastguard Worker }
lgamma(half2 v,int2 * signp)2057*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) lgamma(half2 v, int2 *signp) {
2058*e1eccf28SAndroid Build Coastguard Worker return convert_half2(lgamma(convert_float2(v), signp));
2059*e1eccf28SAndroid Build Coastguard Worker }
lgamma(half3 v,int3 * signp)2060*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) lgamma(half3 v, int3 *signp) {
2061*e1eccf28SAndroid Build Coastguard Worker return convert_half3(lgamma(convert_float3(v), signp));
2062*e1eccf28SAndroid Build Coastguard Worker }
lgamma(half4 v,int4 * signp)2063*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) lgamma(half4 v, int4 *signp) {
2064*e1eccf28SAndroid Build Coastguard Worker return convert_half4(lgamma(convert_float4(v), signp));
2065*e1eccf28SAndroid Build Coastguard Worker }
2066*e1eccf28SAndroid Build Coastguard Worker
2067*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(log);
2068*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(log10);
2069*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(log1p);
2070*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(log2);
2071*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(logb);
2072*e1eccf28SAndroid Build Coastguard Worker
2073*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN_HN(mad);
2074*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(max);
2075*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_H(max); // TODO can this be arch-specific similar to _Z3maxDv2_ff?
2076*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(min);
2077*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_H(min); // TODO can this be arch-specific similar to _Z3minDv2_ff?
2078*e1eccf28SAndroid Build Coastguard Worker
mix(half start,half stop,half amount)2079*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) mix(half start, half stop, half amount) {
2080*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
2081*e1eccf28SAndroid Build Coastguard Worker }
mix(half2 start,half2 stop,half2 amount)2082*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) mix(half2 start, half2 stop, half2 amount) {
2083*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
2084*e1eccf28SAndroid Build Coastguard Worker }
mix(half3 start,half3 stop,half3 amount)2085*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) mix(half3 start, half3 stop, half3 amount) {
2086*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
2087*e1eccf28SAndroid Build Coastguard Worker }
mix(half4 start,half4 stop,half4 amount)2088*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) mix(half4 start, half4 stop, half4 amount) {
2089*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
2090*e1eccf28SAndroid Build Coastguard Worker }
mix(half2 start,half2 stop,half amount)2091*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) mix(half2 start, half2 stop, half amount) {
2092*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
2093*e1eccf28SAndroid Build Coastguard Worker }
mix(half3 start,half3 stop,half amount)2094*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) mix(half3 start, half3 stop, half amount) {
2095*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
2096*e1eccf28SAndroid Build Coastguard Worker }
mix(half4 start,half4 stop,half amount)2097*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) mix(half4 start, half4 stop, half amount) {
2098*e1eccf28SAndroid Build Coastguard Worker return start + (stop - start) * amount;
2099*e1eccf28SAndroid Build Coastguard Worker }
2100*e1eccf28SAndroid Build Coastguard Worker
2101*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) modf(half x, half *iptr);
2102*e1eccf28SAndroid Build Coastguard Worker SCALARIZE_HN_FUNC_HN_PHN(modf);
2103*e1eccf28SAndroid Build Coastguard Worker
nan_half()2104*e1eccf28SAndroid Build Coastguard Worker half __attribute__((overloadable)) nan_half() {
2105*e1eccf28SAndroid Build Coastguard Worker unsigned short nan_short = kHalfPositiveInfinity | 0x0200;
2106*e1eccf28SAndroid Build Coastguard Worker half nan;
2107*e1eccf28SAndroid Build Coastguard Worker SET_HALF_WORD(nan, nan_short);
2108*e1eccf28SAndroid Build Coastguard Worker return nan;
2109*e1eccf28SAndroid Build Coastguard Worker }
2110*e1eccf28SAndroid Build Coastguard Worker
2111*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(normalize);
2112*e1eccf28SAndroid Build Coastguard Worker
2113*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) nextafter(half x, half y);
2114*e1eccf28SAndroid Build Coastguard Worker SCALARIZE_HN_FUNC_HN_HN(nextafter);
2115*e1eccf28SAndroid Build Coastguard Worker
2116*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(pow);
2117*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_IN(pown);
2118*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(powr);
2119*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(radians);
2120*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(remainder);
2121*e1eccf28SAndroid Build Coastguard Worker
remquo(half n,half d,int * quo)2122*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) remquo(half n, half d, int *quo) {
2123*e1eccf28SAndroid Build Coastguard Worker return (float) remquo((float) n, (float) d, quo);
2124*e1eccf28SAndroid Build Coastguard Worker }
remquo(half2 n,half2 d,int2 * quo)2125*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) remquo(half2 n, half2 d, int2 *quo) {
2126*e1eccf28SAndroid Build Coastguard Worker return convert_half2(remquo(convert_float2(d), convert_float2(n), quo));
2127*e1eccf28SAndroid Build Coastguard Worker }
remquo(half3 n,half3 d,int3 * quo)2128*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) remquo(half3 n, half3 d, int3 *quo) {
2129*e1eccf28SAndroid Build Coastguard Worker return convert_half3(remquo(convert_float3(d), convert_float3(n), quo));
2130*e1eccf28SAndroid Build Coastguard Worker }
remquo(half4 n,half4 d,int4 * quo)2131*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) remquo(half4 n, half4 d, int4 *quo) {
2132*e1eccf28SAndroid Build Coastguard Worker return convert_half4(remquo(convert_float4(d), convert_float4(n), quo));
2133*e1eccf28SAndroid Build Coastguard Worker }
2134*e1eccf28SAndroid Build Coastguard Worker
2135*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(rint);
2136*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_IN(rootn);
2137*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(round);
2138*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(rsqrt);
2139*e1eccf28SAndroid Build Coastguard Worker
sign(half h)2140*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) sign(half h) {
2141*e1eccf28SAndroid Build Coastguard Worker if (h > 0) return (half) 1.f;
2142*e1eccf28SAndroid Build Coastguard Worker if (h < 0) return (half) -1.f;
2143*e1eccf28SAndroid Build Coastguard Worker return h;
2144*e1eccf28SAndroid Build Coastguard Worker }
sign(half2 v)2145*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) sign(half2 v) {
2146*e1eccf28SAndroid Build Coastguard Worker half2 ret;
2147*e1eccf28SAndroid Build Coastguard Worker ret.x = sign(v.x);
2148*e1eccf28SAndroid Build Coastguard Worker ret.y = sign(v.y);
2149*e1eccf28SAndroid Build Coastguard Worker return ret;
2150*e1eccf28SAndroid Build Coastguard Worker }
sign(half3 v)2151*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) sign(half3 v) {
2152*e1eccf28SAndroid Build Coastguard Worker half3 ret;
2153*e1eccf28SAndroid Build Coastguard Worker ret.x = sign(v.x);
2154*e1eccf28SAndroid Build Coastguard Worker ret.y = sign(v.y);
2155*e1eccf28SAndroid Build Coastguard Worker ret.z = sign(v.z);
2156*e1eccf28SAndroid Build Coastguard Worker return ret;
2157*e1eccf28SAndroid Build Coastguard Worker }
sign(half4 v)2158*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) sign(half4 v) {
2159*e1eccf28SAndroid Build Coastguard Worker half4 ret;
2160*e1eccf28SAndroid Build Coastguard Worker ret.x = sign(v.x);
2161*e1eccf28SAndroid Build Coastguard Worker ret.y = sign(v.y);
2162*e1eccf28SAndroid Build Coastguard Worker ret.z = sign(v.z);
2163*e1eccf28SAndroid Build Coastguard Worker ret.w = sign(v.w);
2164*e1eccf28SAndroid Build Coastguard Worker return ret;
2165*e1eccf28SAndroid Build Coastguard Worker }
2166*e1eccf28SAndroid Build Coastguard Worker
2167*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(sin);
2168*e1eccf28SAndroid Build Coastguard Worker
sincos(half v,half * cosptr)2169*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) sincos(half v, half *cosptr) {
2170*e1eccf28SAndroid Build Coastguard Worker *cosptr = cos(v);
2171*e1eccf28SAndroid Build Coastguard Worker return sin(v);
2172*e1eccf28SAndroid Build Coastguard Worker }
2173*e1eccf28SAndroid Build Coastguard Worker // TODO verify if LLVM eliminates the duplicate convert_float2
sincos(half2 v,half2 * cosptr)2174*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) sincos(half2 v, half2 *cosptr) {
2175*e1eccf28SAndroid Build Coastguard Worker *cosptr = cos(v);
2176*e1eccf28SAndroid Build Coastguard Worker return sin(v);
2177*e1eccf28SAndroid Build Coastguard Worker }
sincos(half3 v,half3 * cosptr)2178*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) sincos(half3 v, half3 *cosptr) {
2179*e1eccf28SAndroid Build Coastguard Worker *cosptr = cos(v);
2180*e1eccf28SAndroid Build Coastguard Worker return sin(v);
2181*e1eccf28SAndroid Build Coastguard Worker }
sincos(half4 v,half4 * cosptr)2182*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) sincos(half4 v, half4 *cosptr) {
2183*e1eccf28SAndroid Build Coastguard Worker *cosptr = cos(v);
2184*e1eccf28SAndroid Build Coastguard Worker return sin(v);
2185*e1eccf28SAndroid Build Coastguard Worker }
2186*e1eccf28SAndroid Build Coastguard Worker
2187*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(sinh);
2188*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(sinpi);
2189*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(sqrt);
2190*e1eccf28SAndroid Build Coastguard Worker
step(half edge,half v)2191*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) step(half edge, half v) {
2192*e1eccf28SAndroid Build Coastguard Worker return (v < edge) ? 0.f : 1.f;
2193*e1eccf28SAndroid Build Coastguard Worker }
step(half2 edge,half2 v)2194*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) step(half2 edge, half2 v) {
2195*e1eccf28SAndroid Build Coastguard Worker half2 r;
2196*e1eccf28SAndroid Build Coastguard Worker r.x = (v.x < edge.x) ? 0.f : 1.f;
2197*e1eccf28SAndroid Build Coastguard Worker r.y = (v.y < edge.y) ? 0.f : 1.f;
2198*e1eccf28SAndroid Build Coastguard Worker return r;
2199*e1eccf28SAndroid Build Coastguard Worker }
step(half3 edge,half3 v)2200*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) step(half3 edge, half3 v) {
2201*e1eccf28SAndroid Build Coastguard Worker half3 r;
2202*e1eccf28SAndroid Build Coastguard Worker r.x = (v.x < edge.x) ? 0.f : 1.f;
2203*e1eccf28SAndroid Build Coastguard Worker r.y = (v.y < edge.y) ? 0.f : 1.f;
2204*e1eccf28SAndroid Build Coastguard Worker r.z = (v.z < edge.z) ? 0.f : 1.f;
2205*e1eccf28SAndroid Build Coastguard Worker return r;
2206*e1eccf28SAndroid Build Coastguard Worker }
step(half4 edge,half4 v)2207*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) step(half4 edge, half4 v) {
2208*e1eccf28SAndroid Build Coastguard Worker half4 r;
2209*e1eccf28SAndroid Build Coastguard Worker r.x = (v.x < edge.x) ? 0.f : 1.f;
2210*e1eccf28SAndroid Build Coastguard Worker r.y = (v.y < edge.y) ? 0.f : 1.f;
2211*e1eccf28SAndroid Build Coastguard Worker r.z = (v.z < edge.z) ? 0.f : 1.f;
2212*e1eccf28SAndroid Build Coastguard Worker r.w = (v.w < edge.w) ? 0.f : 1.f;
2213*e1eccf28SAndroid Build Coastguard Worker return r;
2214*e1eccf28SAndroid Build Coastguard Worker }
step(half2 edge,half v)2215*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) step(half2 edge, half v) {
2216*e1eccf28SAndroid Build Coastguard Worker half2 r;
2217*e1eccf28SAndroid Build Coastguard Worker r.x = (v < edge.x) ? 0.f : 1.f;
2218*e1eccf28SAndroid Build Coastguard Worker r.y = (v < edge.y) ? 0.f : 1.f;
2219*e1eccf28SAndroid Build Coastguard Worker return r;
2220*e1eccf28SAndroid Build Coastguard Worker }
step(half3 edge,half v)2221*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) step(half3 edge, half v) {
2222*e1eccf28SAndroid Build Coastguard Worker half3 r;
2223*e1eccf28SAndroid Build Coastguard Worker r.x = (v < edge.x) ? 0.f : 1.f;
2224*e1eccf28SAndroid Build Coastguard Worker r.y = (v < edge.y) ? 0.f : 1.f;
2225*e1eccf28SAndroid Build Coastguard Worker r.z = (v < edge.z) ? 0.f : 1.f;
2226*e1eccf28SAndroid Build Coastguard Worker return r;
2227*e1eccf28SAndroid Build Coastguard Worker }
step(half4 edge,half v)2228*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) step(half4 edge, half v) {
2229*e1eccf28SAndroid Build Coastguard Worker half4 r;
2230*e1eccf28SAndroid Build Coastguard Worker r.x = (v < edge.x) ? 0.f : 1.f;
2231*e1eccf28SAndroid Build Coastguard Worker r.y = (v < edge.y) ? 0.f : 1.f;
2232*e1eccf28SAndroid Build Coastguard Worker r.z = (v < edge.z) ? 0.f : 1.f;
2233*e1eccf28SAndroid Build Coastguard Worker r.w = (v < edge.w) ? 0.f : 1.f;
2234*e1eccf28SAndroid Build Coastguard Worker return r;
2235*e1eccf28SAndroid Build Coastguard Worker }
step(half edge,half2 v)2236*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) step(half edge, half2 v) {
2237*e1eccf28SAndroid Build Coastguard Worker half2 r;
2238*e1eccf28SAndroid Build Coastguard Worker r.x = (v.x < edge) ? 0.f : 1.f;
2239*e1eccf28SAndroid Build Coastguard Worker r.y = (v.y < edge) ? 0.f : 1.f;
2240*e1eccf28SAndroid Build Coastguard Worker return r;
2241*e1eccf28SAndroid Build Coastguard Worker }
step(half edge,half3 v)2242*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) step(half edge, half3 v) {
2243*e1eccf28SAndroid Build Coastguard Worker half3 r;
2244*e1eccf28SAndroid Build Coastguard Worker r.x = (v.x < edge) ? 0.f : 1.f;
2245*e1eccf28SAndroid Build Coastguard Worker r.y = (v.y < edge) ? 0.f : 1.f;
2246*e1eccf28SAndroid Build Coastguard Worker r.z = (v.z < edge) ? 0.f : 1.f;
2247*e1eccf28SAndroid Build Coastguard Worker return r;
2248*e1eccf28SAndroid Build Coastguard Worker }
step(half edge,half4 v)2249*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) step(half edge, half4 v) {
2250*e1eccf28SAndroid Build Coastguard Worker half4 r;
2251*e1eccf28SAndroid Build Coastguard Worker r.x = (v.x < edge) ? 0.f : 1.f;
2252*e1eccf28SAndroid Build Coastguard Worker r.y = (v.y < edge) ? 0.f : 1.f;
2253*e1eccf28SAndroid Build Coastguard Worker r.z = (v.z < edge) ? 0.f : 1.f;
2254*e1eccf28SAndroid Build Coastguard Worker r.w = (v.w < edge) ? 0.f : 1.f;
2255*e1eccf28SAndroid Build Coastguard Worker return r;
2256*e1eccf28SAndroid Build Coastguard Worker }
2257*e1eccf28SAndroid Build Coastguard Worker
2258*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(tan);
2259*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(tanh);
2260*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(tanpi);
2261*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(tgamma);
2262*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(trunc); // TODO: rethink: needs half-specific implementation?
2263*e1eccf28SAndroid Build Coastguard Worker
2264*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_acos);
2265*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_acosh);
2266*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_acospi);
2267*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_asin);
2268*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_asinh);
2269*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_asinpi);
2270*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_atan);
2271*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_atanh);
2272*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_atanpi);
2273*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(native_atan2);
2274*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(native_atan2pi);
2275*e1eccf28SAndroid Build Coastguard Worker
2276*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_cbrt);
2277*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_cos);
2278*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_cosh);
2279*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_cospi);
2280*e1eccf28SAndroid Build Coastguard Worker
2281*e1eccf28SAndroid Build Coastguard Worker H_FUNC_HN_HN(native_distance);
2282*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(native_divide);
2283*e1eccf28SAndroid Build Coastguard Worker
2284*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_exp);
2285*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_exp10);
2286*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_exp2);
2287*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_expm1);
2288*e1eccf28SAndroid Build Coastguard Worker
2289*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(native_hypot);
2290*e1eccf28SAndroid Build Coastguard Worker H_FUNC_HN(native_length);
2291*e1eccf28SAndroid Build Coastguard Worker
2292*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_log);
2293*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_log10);
2294*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_log1p);
2295*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_log2);
2296*e1eccf28SAndroid Build Coastguard Worker
2297*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_normalize);
2298*e1eccf28SAndroid Build Coastguard Worker
2299*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_HN(native_powr); // TODO are parameter limits different for half?
2300*e1eccf28SAndroid Build Coastguard Worker
2301*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_recip);
2302*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN_IN(native_rootn);
2303*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_rsqrt);
2304*e1eccf28SAndroid Build Coastguard Worker
2305*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_sin);
2306*e1eccf28SAndroid Build Coastguard Worker
native_sincos(half v,half * cosptr)2307*e1eccf28SAndroid Build Coastguard Worker extern half __attribute__((overloadable)) native_sincos(half v, half *cosptr) {
2308*e1eccf28SAndroid Build Coastguard Worker return sincos(v, cosptr);
2309*e1eccf28SAndroid Build Coastguard Worker }
native_sincos(half2 v,half2 * cosptr)2310*e1eccf28SAndroid Build Coastguard Worker extern half2 __attribute__((overloadable)) native_sincos(half2 v, half2 *cosptr) {
2311*e1eccf28SAndroid Build Coastguard Worker return sincos(v, cosptr);
2312*e1eccf28SAndroid Build Coastguard Worker }
native_sincos(half3 v,half3 * cosptr)2313*e1eccf28SAndroid Build Coastguard Worker extern half3 __attribute__((overloadable)) native_sincos(half3 v, half3 *cosptr) {
2314*e1eccf28SAndroid Build Coastguard Worker return sincos(v, cosptr);
2315*e1eccf28SAndroid Build Coastguard Worker }
native_sincos(half4 v,half4 * cosptr)2316*e1eccf28SAndroid Build Coastguard Worker extern half4 __attribute__((overloadable)) native_sincos(half4 v, half4 *cosptr) {
2317*e1eccf28SAndroid Build Coastguard Worker return sincos(v, cosptr);
2318*e1eccf28SAndroid Build Coastguard Worker }
2319*e1eccf28SAndroid Build Coastguard Worker
2320*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_sinh);
2321*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_sinpi);
2322*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_sqrt);
2323*e1eccf28SAndroid Build Coastguard Worker
2324*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_tan);
2325*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_tanh);
2326*e1eccf28SAndroid Build Coastguard Worker HN_FUNC_HN(native_tanpi);
2327*e1eccf28SAndroid Build Coastguard Worker
2328*e1eccf28SAndroid Build Coastguard Worker #undef HN_FUNC_HN
2329*e1eccf28SAndroid Build Coastguard Worker #undef HN_FUNC_HN_HN
2330*e1eccf28SAndroid Build Coastguard Worker #undef HN_FUNC_HN_H
2331*e1eccf28SAndroid Build Coastguard Worker #undef HN_FUNC_HN_HN_HN
2332*e1eccf28SAndroid Build Coastguard Worker #undef HN_FUNC_HN_IN
2333*e1eccf28SAndroid Build Coastguard Worker #undef H_FUNC_HN
2334*e1eccf28SAndroid Build Coastguard Worker #undef H_FUNC_HN_HN
2335*e1eccf28SAndroid Build Coastguard Worker #undef SCALARIZE_HN_FUNC_HN_HN
2336*e1eccf28SAndroid Build Coastguard Worker
2337*e1eccf28SAndroid Build Coastguard Worker // exports unavailable mathlib functions to compat lib
2338*e1eccf28SAndroid Build Coastguard Worker
2339*e1eccf28SAndroid Build Coastguard Worker #ifdef RS_COMPATIBILITY_LIB
2340*e1eccf28SAndroid Build Coastguard Worker
2341*e1eccf28SAndroid Build Coastguard Worker // !!! DANGER !!!
2342*e1eccf28SAndroid Build Coastguard Worker // These functions are potentially missing on older Android versions.
2343*e1eccf28SAndroid Build Coastguard Worker // Work around the issue by supplying our own variants.
2344*e1eccf28SAndroid Build Coastguard Worker // !!! DANGER !!!
2345*e1eccf28SAndroid Build Coastguard Worker
2346*e1eccf28SAndroid Build Coastguard Worker // The logbl() implementation is taken from the latest bionic/, since
2347*e1eccf28SAndroid Build Coastguard Worker // double == long double on Android.
logbl(long double x)2348*e1eccf28SAndroid Build Coastguard Worker extern "C" long double logbl(long double x) { return logb(x); }
2349*e1eccf28SAndroid Build Coastguard Worker
2350*e1eccf28SAndroid Build Coastguard Worker // __aeabi_idiv0 is a missing function in libcompiler_rt.so, so we just
2351*e1eccf28SAndroid Build Coastguard Worker // pick the simplest implementation based on the ARM EABI doc.
__aeabi_idiv0(int v)2352*e1eccf28SAndroid Build Coastguard Worker extern "C" int __aeabi_idiv0(int v) { return v; }
2353*e1eccf28SAndroid Build Coastguard Worker
2354*e1eccf28SAndroid Build Coastguard Worker #endif // compatibility lib
2355