@@ -20,104 +20,6 @@ float __devicelib_crealf(float __complex__ z) { return __real__(z); }
2020DEVICE_EXTERN_C_INLINE
2121float __devicelib_cimagf (float __complex__ z) { return __imag__ (z); }
2222
23- // __mulsc3
24- // Returns: the product of a + ib and c + id
25- DEVICE_EXTERN_C_INLINE
26- float __complex__ __devicelib___mulsc3 (float __a, float __b, float __c,
27- float __d) {
28- float __ac = __a * __c;
29- float __bd = __b * __d;
30- float __ad = __a * __d;
31- float __bc = __b * __c;
32- float __complex__ z;
33- z = CMPLXF ((__ac - __bd), (__ad + __bc));
34- if (__spirv_IsNan (__devicelib_crealf (z)) &&
35- __spirv_IsNan (__devicelib_cimagf (z))) {
36- int __recalc = 0 ;
37- if (__spirv_IsInf (__a) || __spirv_IsInf (__b)) {
38- __a = __spirv_ocl_copysign (__spirv_IsInf (__a) ? 1 .0f : 0 .0f , __a);
39- __b = __spirv_ocl_copysign (__spirv_IsInf (__b) ? 1 .0f : 0 .0f , __b);
40- if (__spirv_IsNan (__c))
41- __c = __spirv_ocl_copysign (0 .0f , __c);
42- if (__spirv_IsNan (__d))
43- __d = __spirv_ocl_copysign (0 .0f , __d);
44- __recalc = 1 ;
45- }
46- if (__spirv_IsInf (__c) || __spirv_IsInf (__d)) {
47- __c = __spirv_ocl_copysign (__spirv_IsInf (__c) ? 1 .0f : 0 .0f , __c);
48- __d = __spirv_ocl_copysign (__spirv_IsInf (__d) ? 1 .0f : 0 .0f , __d);
49- if (__spirv_IsNan (__a))
50- __a = __spirv_ocl_copysign (0 .0f , __a);
51- if (__spirv_IsNan (__b))
52- __b = __spirv_ocl_copysign (0 .0f , __b);
53- __recalc = 1 ;
54- }
55- if (!__recalc && (__spirv_IsInf (__ac) || __spirv_IsInf (__bd) ||
56- __spirv_IsInf (__ad) || __spirv_IsInf (__bc))) {
57- if (__spirv_IsNan (__a))
58- __a = __spirv_ocl_copysign (0 .0f , __a);
59- if (__spirv_IsNan (__b))
60- __b = __spirv_ocl_copysign (0 .0f , __b);
61- if (__spirv_IsNan (__c))
62- __c = __spirv_ocl_copysign (0 .0f , __c);
63- if (__spirv_IsNan (__d))
64- __d = __spirv_ocl_copysign (0 .0f , __d);
65- __recalc = 1 .0f ;
66- }
67- if (__recalc) {
68- z = CMPLXF ((INFINITY * (__a * __c - __b * __d)),
69- (INFINITY * (__a * __d + __b * __c)));
70- }
71- }
72- return z;
73- }
74-
75- // __divsc3
76- // Returns: the quotient of (a + ib) / (c + id)
77- // FIXME: divsc3/divdc3 have overflow issue when dealing with large number.
78- // And this overflow issue is from libc++/compiler-rt's implementation.
79- DEVICE_EXTERN_C_INLINE
80- float __complex__ __devicelib___divsc3 (float __a, float __b, float __c,
81- float __d) {
82- int __ilogbw = 0 ;
83- float __logbw = __spirv_ocl_logb (
84- __spirv_ocl_fmax (__spirv_ocl_fabs (__c), __spirv_ocl_fabs (__d)));
85- if (__spirv_IsFinite (__logbw)) {
86- __ilogbw = (int )__logbw;
87- __c = __spirv_ocl_ldexp (__c, -__ilogbw);
88- __d = __spirv_ocl_ldexp (__d, -__ilogbw);
89- }
90- float __denom = __c * __c + __d * __d;
91- float __complex__ z;
92- float z_real =
93- __spirv_ocl_ldexp ((__a * __c + __b * __d) / __denom, -__ilogbw);
94- float z_imag =
95- __spirv_ocl_ldexp ((__b * __c - __a * __d) / __denom, -__ilogbw);
96- z = CMPLXF (z_real, z_imag);
97- if (__spirv_IsNan (z_real) && __spirv_IsNan (z_imag)) {
98- if ((__denom == 0 .0f ) && (!__spirv_IsNan (__a) || !__spirv_IsNan (__b))) {
99- z_real = __spirv_ocl_copysign (INFINITY, __c) * __a;
100- z_imag = __spirv_ocl_copysign (INFINITY, __c) * __b;
101- z = CMPLXF (z_real, z_imag);
102- } else if ((__spirv_IsInf (__a) || __spirv_IsInf (__b)) &&
103- __spirv_IsFinite (__c) && __spirv_IsFinite (__d)) {
104- __a = __spirv_ocl_copysign (__spirv_IsInf (__a) ? 1 .0f : 0 .0f , __a);
105- __b = __spirv_ocl_copysign (__spirv_IsInf (__b) ? 1 .0f : 0 .0f , __b);
106- z_real = INFINITY * (__a * __c + __b * __d);
107- z_imag = INFINITY * (__b * __c - __a * __d);
108- z = CMPLXF (z_real, z_imag);
109- } else if (__spirv_IsInf (__logbw) && __logbw > 0 .0f &&
110- __spirv_IsFinite (__a) && __spirv_IsFinite (__b)) {
111- __c = __spirv_ocl_copysign (__spirv_IsInf (__c) ? 1 .0f : 0 .0f , __c);
112- __d = __spirv_ocl_copysign (__spirv_IsInf (__d) ? 1 .0f : 0 .0f , __d);
113- z_real = 0 .0f * (__a * __c + __b * __d);
114- z_imag = 0 .0f * (__b * __c - __a * __d);
115- z = CMPLXF (z_real, z_imag);
116- }
117- }
118- return z;
119- }
120-
12123DEVICE_EXTERN_C_INLINE
12224float __devicelib_cargf (float __complex__ z) {
12325 return __spirv_ocl_atan2 (__devicelib_cimagf (z), __devicelib_crealf (z));
@@ -170,7 +72,7 @@ DEVICE_EXTERN_C_INLINE
17072float __complex__ __devicelib_cpowf (float __complex__ x, float __complex__ y) {
17173 float __complex__ t = __devicelib_clogf (x);
17274 float __complex__ w =
173- __devicelib___mulsc3 (__devicelib_crealf (y), __devicelib_cimagf (y),
75+ __mulsc3 (__devicelib_crealf (y), __devicelib_cimagf (y),
17476 __devicelib_crealf (t), __devicelib_cimagf (t));
17577 return __devicelib_cexpf (w);
17678}
@@ -421,7 +323,7 @@ float __complex__ __devicelib_catanhf(float __complex__ z) {
421323 float __complex__ t1 = 1 .0f + z;
422324 float __complex__ t2 = 1 .0f - z;
423325 float __complex__ t3 =
424- __devicelib___divsc3 (__devicelib_crealf (t1), __devicelib_cimagf (t1),
326+ __divsc3 (__devicelib_crealf (t1), __devicelib_cimagf (t1),
425327 __devicelib_crealf (t2), __devicelib_cimagf (t2));
426328 float __complex__ w = __devicelib_clogf (t3) / 2 .0f ;
427329 return CMPLXF (__spirv_ocl_copysign (__devicelib_crealf (w), z_real),
0 commit comments