2020 * THE SOFTWARE.
2121 */
2222
23- #include <clc/clc.h>
24- #include "config.h"
2523#include "../clcmacro.h"
24+ #include "config.h"
2625#include "math.h"
26+ #include <clc/clc.h>
2727
2828_CLC_DEF _CLC_OVERLOAD float __clc_ldexp (float x , int n ) {
2929
30- if (!__clc_fp32_subnormals_supported ()) {
31-
32- // This treats subnormals as zeros
33- int i = as_int (x );
34- int e = (i >> 23 ) & 0xff ;
35- int m = i & 0x007fffff ;
36- int s = i & 0x80000000 ;
37- int v = add_sat (e , n );
38- v = clamp (v , 0 , 0xff );
39- int mr = e == 0 | v == 0 | v == 0xff ? 0 : m ;
40- int c = e == 0xff ;
41- mr = c ? m : mr ;
42- int er = c ? e : v ;
43- er = e ? er : e ;
44- return as_float ( s | (er << 23 ) | mr );
45- }
46-
47- /* supports denormal values */
48- const int multiplier = 24 ;
49- float val_f ;
50- uint val_ui ;
51- uint sign ;
52- int exponent ;
53- val_ui = as_uint (x );
54- sign = val_ui & 0x80000000 ;
55- val_ui = val_ui & 0x7fffffff ;/* remove the sign bit */
56- int val_x = val_ui ;
57-
58- exponent = val_ui >> 23 ; /* get the exponent */
59- int dexp = exponent ;
60-
61- /* denormal support */
62- int fbh = 127 - (as_uint ((float )(as_float (val_ui | 0x3f800000 ) - 1.0f )) >> 23 );
63- int dexponent = 25 - fbh ;
64- uint dval_ui = (( (val_ui << fbh ) & 0x007fffff ) | (dexponent << 23 ));
65- int ex = dexponent + n - multiplier ;
66- dexponent = ex ;
67- uint val = sign | (ex << 23 ) | (dval_ui & 0x007fffff );
68- int ex1 = dexponent + multiplier ;
69- ex1 = - ex1 + 25 ;
70- dval_ui = (((dval_ui & 0x007fffff )| 0x800000 ) >> ex1 );
71- dval_ui = dexponent > 0 ? val :dval_ui ;
72- dval_ui = dexponent > 254 ? 0x7f800000 :dval_ui ; /*overflow*/
73- dval_ui = dexponent < - multiplier ? 0 : dval_ui ; /*underflow*/
74- dval_ui = dval_ui | sign ;
75- val_f = as_float (dval_ui );
76-
77- exponent += n ;
78-
79- val = sign | (exponent << 23 ) | (val_ui & 0x007fffff );
80- ex1 = exponent + multiplier ;
81- ex1 = - ex1 + 25 ;
82- val_ui = (((val_ui & 0x007fffff )| 0x800000 ) >> ex1 );
83- val_ui = exponent > 0 ? val :val_ui ;
84- val_ui = exponent > 254 ? 0x7f800000 :val_ui ; /*overflow*/
85- val_ui = exponent < - multiplier ? 0 : val_ui ; /*underflow*/
86- val_ui = val_ui | sign ;
87-
88- val_ui = dexp == 0 ? dval_ui : val_ui ;
89- val_f = as_float (val_ui );
90-
91- val_f = isnan (x ) | isinf (x ) | val_x == 0 ? x : val_f ;
92- return val_f ;
30+ if (!__clc_fp32_subnormals_supported ()) {
31+
32+ // This treats subnormals as zeros
33+ int i = as_int (x );
34+ int e = (i >> 23 ) & 0xff ;
35+ int m = i & 0x007fffff ;
36+ int s = i & 0x80000000 ;
37+ int v = add_sat (e , n );
38+ v = clamp (v , 0 , 0xff );
39+ int mr = e == 0 | v == 0 | v == 0xff ? 0 : m ;
40+ int c = e == 0xff ;
41+ mr = c ? m : mr ;
42+ int er = c ? e : v ;
43+ er = e ? er : e ;
44+ return as_float (s | (er << 23 ) | mr );
45+ }
46+
47+ /* supports denormal values */
48+ const int multiplier = 24 ;
49+ float val_f ;
50+ uint val_ui ;
51+ uint sign ;
52+ int exponent ;
53+ val_ui = as_uint (x );
54+ sign = val_ui & 0x80000000 ;
55+ val_ui = val_ui & 0x7fffffff ; /* remove the sign bit */
56+ int val_x = val_ui ;
57+
58+ exponent = val_ui >> 23 ; /* get the exponent */
59+ int dexp = exponent ;
60+
61+ /* denormal support */
62+ int fbh =
63+ 127 - (as_uint ((float )(as_float (val_ui | 0x3f800000 ) - 1.0f )) >> 23 );
64+ int dexponent = 25 - fbh ;
65+ uint dval_ui = (((val_ui << fbh ) & 0x007fffff ) | (dexponent << 23 ));
66+ int ex = dexponent + n - multiplier ;
67+ dexponent = ex ;
68+ uint val = sign | (ex << 23 ) | (dval_ui & 0x007fffff );
69+ int ex1 = dexponent + multiplier ;
70+ ex1 = - ex1 + 25 ;
71+ dval_ui = (((dval_ui & 0x007fffff ) | 0x800000 ) >> ex1 );
72+ dval_ui = dexponent > 0 ? val : dval_ui ;
73+ dval_ui = dexponent > 254 ? 0x7f800000 : dval_ui ; /*overflow*/
74+ dval_ui = dexponent < - multiplier ? 0 : dval_ui ; /*underflow*/
75+ dval_ui = dval_ui | sign ;
76+ val_f = as_float (dval_ui );
77+
78+ exponent += n ;
79+
80+ val = sign | (exponent << 23 ) | (val_ui & 0x007fffff );
81+ ex1 = exponent + multiplier ;
82+ ex1 = - ex1 + 25 ;
83+ val_ui = (((val_ui & 0x007fffff ) | 0x800000 ) >> ex1 );
84+ val_ui = exponent > 0 ? val : val_ui ;
85+ val_ui = exponent > 254 ? 0x7f800000 : val_ui ; /*overflow*/
86+ val_ui = exponent < - multiplier ? 0 : val_ui ; /*underflow*/
87+ val_ui = val_ui | sign ;
88+
89+ val_ui = dexp == 0 ? dval_ui : val_ui ;
90+ val_f = as_float (val_ui );
91+
92+ val_f = isnan (x ) | isinf (x ) | val_x == 0 ? x : val_f ;
93+ return val_f ;
9394}
9495
9596#ifdef cl_khr_fp64
9697
9798#pragma OPENCL EXTENSION cl_khr_fp64 : enable
9899
99100_CLC_DEF _CLC_OVERLOAD double __clc_ldexp (double x , int n ) {
100- long l = as_ulong (x );
101- int e = (l >> 52 ) & 0x7ff ;
102- long s = l & 0x8000000000000000 ;
101+ long l = as_ulong (x );
102+ int e = (l >> 52 ) & 0x7ff ;
103+ long s = l & 0x8000000000000000 ;
103104
104- ulong ux = as_ulong (x * 0x1.0p+53 );
105- int de = ((int )(ux >> 52 ) & 0x7ff ) - 53 ;
106- int c = e == 0 ;
107- e = c ? de : e ;
105+ ulong ux = as_ulong (x * 0x1.0p+53 );
106+ int de = ((int )(ux >> 52 ) & 0x7ff ) - 53 ;
107+ int c = e == 0 ;
108+ e = c ? de : e ;
108109
109- ux = c ? ux : l ;
110+ ux = c ? ux : l ;
110111
111- int v = e + n ;
112- v = clamp (v , -0x7ff , 0x7ff );
112+ int v = e + n ;
113+ v = clamp (v , -0x7ff , 0x7ff );
113114
114- ux &= ~EXPBITS_DP64 ;
115+ ux &= ~EXPBITS_DP64 ;
115116
116- double mr = as_double (ux | ((ulong )(v + 53 ) << 52 ));
117- mr = mr * 0x1.0p-53 ;
117+ double mr = as_double (ux | ((ulong )(v + 53 ) << 52 ));
118+ mr = mr * 0x1.0p-53 ;
118119
119- mr = v > 0 ? as_double (ux | ((ulong )v << 52 )) : mr ;
120+ mr = v > 0 ? as_double (ux | ((ulong )v << 52 )) : mr ;
120121
121- mr = v == 0x7ff ? as_double (s | PINFBITPATT_DP64 ) : mr ;
122- mr = v < -53 ? as_double (s ) : mr ;
122+ mr = v == 0x7ff ? as_double (s | PINFBITPATT_DP64 ) : mr ;
123+ mr = v < -53 ? as_double (s ) : mr ;
123124
124- mr = ((n == 0 ) | isinf (x ) | (x == 0 ) ) ? x : mr ;
125- return mr ;
125+ mr = ((n == 0 ) | isinf (x ) | (x == 0 )) ? x : mr ;
126+ return mr ;
126127}
127128
128129#endif
@@ -132,7 +133,7 @@ _CLC_DEF _CLC_OVERLOAD double __clc_ldexp(double x, int n) {
132133#pragma OPENCL EXTENSION cl_khr_fp16 : enable
133134
134135_CLC_OVERLOAD _CLC_DEF half __clc_ldexp (half x , int n ) {
135- return (half )__clc_ldexp ((float )x , n );
136+ return (half )__clc_ldexp ((float )x , n );
136137}
137138
138139_CLC_BINARY_VECTORIZE (_CLC_OVERLOAD _CLC_DEF , half , __clc_ldexp , half , int );
0 commit comments