28
28
_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE
29
29
__clc_frexp (__CLC_GENTYPE x, __CLC_ADDRESS_SPACE __CLC_INTN *ep) {
30
30
__CLC_INTN i = __CLC_AS_INTN (x);
31
- __CLC_INTN ai = i & 0x7fffffff ;
32
- __CLC_INTN d = ai > 0 & ai < 0x00800000 ;
33
- /* scale subnormal by 2^26 without multiplying */
31
+ __CLC_INTN ai = i & EXSIGNBIT_SP32;
32
+
33
+ // Scale subnormal by 2^26 without multiplying
34
+ __CLC_INTN is_subnormal = ai > 0 && ai < 0x00800000 ;
34
35
__CLC_GENTYPE s = __CLC_AS_GENTYPE (ai | 0x0d800000 ) - 0x1 .0p-100f ;
35
- ai = __clc_select (ai, __CLC_AS_INTN (s), d);
36
- __CLC_INTN e =
37
- (ai >> 23 ) - 126 - __clc_select ((__CLC_INTN)0 , (__CLC_INTN)26 , d);
38
- __CLC_INTN t = ai == (__CLC_INTN)0 | e == (__CLC_INTN)129 ;
39
- i = (i & (__CLC_INTN)0x80000000 ) | (__CLC_INTN)0x3f000000 | (ai & 0x007fffff );
40
- *ep = __clc_select (e, (__CLC_INTN)0 , t);
41
- return __clc_select (__CLC_AS_GENTYPE (i), x, t);
36
+ ai = __clc_select (ai, __CLC_AS_INTN (s), is_subnormal);
37
+ __CLC_INTN e = (ai >> EXPSHIFTBITS_SP32) - 126 -
38
+ __clc_select ((__CLC_INTN)0 , (__CLC_INTN)26 , is_subnormal);
39
+
40
+ i = (i & (__CLC_INTN)SIGNBIT_SP32) | (__CLC_INTN)HALFEXPBITS_SP32 |
41
+ (ai & (__CLC_INTN)MANTBITS_SP32);
42
+
43
+ __CLC_INTN is_inf_nan_or_zero =
44
+ x == __CLC_FP_LIT (0.0 ) || __clc_isinf (x) || __clc_isnan (x);
45
+ *ep = __clc_select (e, (__CLC_INTN)0 , is_inf_nan_or_zero);
46
+ return __clc_select (__CLC_AS_GENTYPE (i), x, is_inf_nan_or_zero);
42
47
}
43
48
#endif
44
49
@@ -56,19 +61,22 @@ __clc_frexp(__CLC_GENTYPE x, __CLC_ADDRESS_SPACE __CLC_INTN *ep) {
56
61
_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE
57
62
__clc_frexp (__CLC_GENTYPE x, __CLC_ADDRESS_SPACE __CLC_INTN *ep) {
58
63
__CLC_LONGN i = __CLC_AS_LONGN (x);
59
- __CLC_LONGN ai = i & 0x7fffffffffffffffL ;
60
- __CLC_LONGN d = ai > 0 & ai < 0x0010000000000000L ;
61
- // scale subnormal by 2^54 without multiplying
64
+ __CLC_LONGN ai = i & EXSIGNBIT_DP64;
65
+
66
+ // Scale subnormal by 2^54 without multiplying
67
+ __CLC_LONGN is_subnormal = ai > 0 && ai < 0x0010000000000000L ;
62
68
__CLC_GENTYPE s = __CLC_AS_GENTYPE (ai | 0x0370000000000000L ) - 0x1 .0p-968 ;
63
- ai = __clc_select (ai, __CLC_AS_LONGN (s), d);
64
- __CLC_LONGN e = (ai >> 52 ) - (__CLC_LONGN)1022 -
65
- __clc_select ((__CLC_LONGN)0 , (__CLC_LONGN)54 , d);
66
- __CLC_LONGN t = ai == 0 | e == 1025 ;
67
- i = (i & (__CLC_LONGN)0x8000000000000000L ) |
68
- (__CLC_LONGN)0x3fe0000000000000L |
69
- (ai & (__CLC_LONGN)0x000fffffffffffffL );
70
- *ep = __CLC_CONVERT_INTN (__clc_select (e, 0L , t));
71
- return __clc_select (__CLC_AS_GENTYPE (i), x, t);
69
+ ai = __clc_select (ai, __CLC_AS_LONGN (s), is_subnormal);
70
+ __CLC_LONGN e = (ai >> EXPSHIFTBITS_DP64) - (__CLC_LONGN)1022 -
71
+ __clc_select ((__CLC_LONGN)0 , (__CLC_LONGN)54 , is_subnormal);
72
+
73
+ i = (i & (__CLC_LONGN)SIGNBIT_DP64) | (__CLC_LONGN)HALFEXPBITS_DP64 |
74
+ (ai & (__CLC_LONGN)MANTBITS_DP64);
75
+
76
+ __CLC_LONGN is_inf_nan_or_zero =
77
+ x == __CLC_FP_LIT (0.0 ) || __clc_isinf (x) || __clc_isnan (x);
78
+ *ep = __CLC_CONVERT_INTN (__clc_select (e, 0L , is_inf_nan_or_zero));
79
+ return __clc_select (__CLC_AS_GENTYPE (i), x, is_inf_nan_or_zero);
72
80
}
73
81
74
82
#endif
0 commit comments