|
1 | 1 | #include <clc/clcmacro.h>
|
2 | 2 | #include <clc/internal/clc.h>
|
| 3 | +#include <clc/math/clc_fabs.h> |
3 | 4 | #include <clc/relational/clc_isnan.h>
|
4 | 5 |
|
5 | 6 | // This file provides OpenCL C implementations of __clc_nextafter for
|
|
12 | 13 | FLOAT_TYPE y) { \
|
13 | 14 | const UINT_TYPE sign_bit = (UINT_TYPE)1 \
|
14 | 15 | << (sizeof(INT_TYPE_SCALAR) * 8 - 1); \
|
15 |
| - const UINT_TYPE sign_bit_mask = sign_bit - (UINT_TYPE)1; \ |
16 |
| - INT_TYPE ix = CLC_AS_TYPE(INT_TYPE)(x); \ |
17 |
| - UINT_TYPE ax = CLC_AS_TYPE(UINT_TYPE)(ix) & sign_bit_mask; \ |
18 |
| - INT_TYPE mx = CLC_AS_TYPE(INT_TYPE)(sign_bit) - ix; \ |
19 |
| - mx = CLC_AS_TYPE(INT_TYPE)(ix) < (INT_TYPE)0 ? mx : ix; \ |
20 |
| - INT_TYPE iy = CLC_AS_TYPE(INT_TYPE)(y); \ |
21 |
| - UINT_TYPE ay = CLC_AS_TYPE(UINT_TYPE)(iy) & sign_bit_mask; \ |
22 |
| - INT_TYPE my = CLC_AS_TYPE(INT_TYPE)(sign_bit) - iy; \ |
23 |
| - my = iy < (INT_TYPE)0 ? my : iy; \ |
| 16 | + UINT_TYPE ix = CLC_AS_TYPE(UINT_TYPE)(x); \ |
| 17 | + FLOAT_TYPE absx = __clc_fabs(x); \ |
| 18 | + UINT_TYPE mxu = sign_bit - ix; \ |
| 19 | + INT_TYPE mx = CLC_AS_TYPE(INT_TYPE)(mxu); \ |
| 20 | + mx = CLC_AS_TYPE(INT_TYPE)(ix) < (INT_TYPE)0 ? mx \ |
| 21 | + : CLC_AS_TYPE(INT_TYPE)(ix); \ |
| 22 | + UINT_TYPE iy = CLC_AS_TYPE(UINT_TYPE)(y); \ |
| 23 | + FLOAT_TYPE absy = __clc_fabs(y); \ |
| 24 | + UINT_TYPE myu = sign_bit - iy; \ |
| 25 | + INT_TYPE my = CLC_AS_TYPE(INT_TYPE)(myu); \ |
| 26 | + my = CLC_AS_TYPE(INT_TYPE)(iy) < (INT_TYPE)0 ? my \ |
| 27 | + : CLC_AS_TYPE(INT_TYPE)(iy); \ |
24 | 28 | INT_TYPE t = mx + (mx < my ? (INT_TYPE)1 : (INT_TYPE)-1); \
|
25 |
| - INT_TYPE r = CLC_AS_TYPE(INT_TYPE)(sign_bit) - t; \ |
26 |
| - r = t < (INT_TYPE)0 ? r : t; \ |
| 29 | + UINT_TYPE r = sign_bit - CLC_AS_TYPE(UINT_TYPE)(t); \ |
| 30 | + r = (t < (INT_TYPE)0 || (t == (INT_TYPE)0 && mx < my)) \ |
| 31 | + ? r \ |
| 32 | + : CLC_AS_TYPE(UINT_TYPE)(t); \ |
27 | 33 | r = __clc_isnan(x) ? ix : r; \
|
28 |
| - r = __clc_isnan(y) ? CLC_AS_TYPE(INT_TYPE)(iy) : r; \ |
29 |
| - r = ((ax | ay) == (UINT_TYPE)0 || ix == iy) ? iy : r; \ |
| 34 | + r = __clc_isnan(y) ? iy : r; \ |
| 35 | + r = ((CLC_AS_TYPE(UINT_TYPE)(absx) | CLC_AS_TYPE(UINT_TYPE)(absy)) == \ |
| 36 | + (UINT_TYPE)0 || \ |
| 37 | + ix == iy) \ |
| 38 | + ? iy \ |
| 39 | + : r; \ |
30 | 40 | return CLC_AS_TYPE(FLOAT_TYPE)(r); \
|
31 | 41 | }
|
32 | 42 |
|
|
0 commit comments