[libclc] [libclc] Improve nextafter behaviour around zero (PR #127469)
Matt Arsenault via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 18 09:55:24 PST 2025
================
@@ -13,19 +13,25 @@
const UINT_TYPE sign_bit = (UINT_TYPE)1 \
<< (sizeof(INT_TYPE_SCALAR) * 8 - 1); \
const UINT_TYPE sign_bit_mask = sign_bit - (UINT_TYPE)1; \
- INT_TYPE ix = CLC_AS_TYPE(INT_TYPE)(x); \
- UINT_TYPE ax = CLC_AS_TYPE(UINT_TYPE)(ix) & sign_bit_mask; \
- INT_TYPE mx = CLC_AS_TYPE(INT_TYPE)(sign_bit) - ix; \
- mx = CLC_AS_TYPE(INT_TYPE)(ix) < (INT_TYPE)0 ? mx : ix; \
- INT_TYPE iy = CLC_AS_TYPE(INT_TYPE)(y); \
- UINT_TYPE ay = CLC_AS_TYPE(UINT_TYPE)(iy) & sign_bit_mask; \
- INT_TYPE my = CLC_AS_TYPE(INT_TYPE)(sign_bit) - iy; \
- my = iy < (INT_TYPE)0 ? my : iy; \
+ UINT_TYPE ix = CLC_AS_TYPE(UINT_TYPE)(x); \
+ UINT_TYPE ax = ix & sign_bit_mask; \
+ UINT_TYPE mxu = sign_bit - ix; \
+ INT_TYPE mx = CLC_AS_TYPE(INT_TYPE)(mxu); \
+ mx = CLC_AS_TYPE(INT_TYPE)(ix) < (INT_TYPE)0 ? mx \
+ : CLC_AS_TYPE(INT_TYPE)(ix); \
+ UINT_TYPE iy = CLC_AS_TYPE(UINT_TYPE)(y); \
+ UINT_TYPE ay = iy & sign_bit_mask; \
+ UINT_TYPE myu = sign_bit - iy; \
+ INT_TYPE my = CLC_AS_TYPE(INT_TYPE)(myu); \
+ my = CLC_AS_TYPE(INT_TYPE)(iy) < (INT_TYPE)0 ? my \
+ : CLC_AS_TYPE(INT_TYPE)(iy); \
INT_TYPE t = mx + (mx < my ? (INT_TYPE)1 : (INT_TYPE)-1); \
- INT_TYPE r = CLC_AS_TYPE(INT_TYPE)(sign_bit) - t; \
- r = t < (INT_TYPE)0 ? r : t; \
+ UINT_TYPE r = sign_bit - CLC_AS_TYPE(UINT_TYPE)(t); \
+ r = (t < (INT_TYPE)0 || (t == (INT_TYPE)0 && mx < my)) \
+ ? r \
+ : CLC_AS_TYPE(UINT_TYPE)(t); \
r = __clc_isnan(x) ? ix : r; \
- r = __clc_isnan(y) ? CLC_AS_TYPE(INT_TYPE)(iy) : r; \
+ r = __clc_isnan(y) ? iy : r; \
r = ((ax | ay) == (UINT_TYPE)0 || ix == iy) ? iy : r; \
----------------
arsenm wrote:
```suggestion
r = ((CLC_AS_TYPE(INT_TYPE)(ax) | CLC_AS_TYPE(INT_TYPE)(ay)) == 0 | ix == iy) ? iy : r;
```
https://github.com/llvm/llvm-project/pull/127469
More information about the cfe-commits
mailing list