This commit provides definitions of builtins with the generic address space. One concept to consider is the difference between supporting the generic address space from the user's perspective and the requirement for libclc as a compiler implementation detail to define separate generic address space builtins. In practice a target (like NVPTX) might notionally support the generic address space, but it's mapped to the same LLVM target address space as another address space (often the private one). In such cases libclc must be careful not to define both private and generic overloads of the same builtin. We track these two concepts separately, and make the assumption that if the generic address space does clash with another, it's with the private one. We track the concepts separately because there are some builtins such as atomics that are defined for the generic address space but not the private address space.
42 lines
1.5 KiB
C++
42 lines
1.5 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#if __CLC_FPSIZE == 64
|
|
#define MIN_CONSTANT 0x1.fffffffffffffp-1
|
|
#elif __CLC_FPSIZE == 32
|
|
#define MIN_CONSTANT 0x1.fffffep-1f
|
|
#elif __CLC_FPSIZE == 16
|
|
#define MIN_CONSTANT 0x1.ffcp-1h
|
|
#endif
|
|
|
|
_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_fract(__CLC_GENTYPE x,
|
|
private __CLC_GENTYPE *iptr) {
|
|
*iptr = __clc_floor(x);
|
|
__CLC_GENTYPE r = __clc_fmin(x - *iptr, MIN_CONSTANT);
|
|
r = __clc_isinf(x) ? __CLC_FP_LIT(0.0) : r;
|
|
r = __clc_isnan(x) ? x : r;
|
|
return r;
|
|
}
|
|
|
|
#define FRACT_DEF(addrspace) \
|
|
_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_fract( \
|
|
__CLC_GENTYPE x, addrspace __CLC_GENTYPE *iptr) { \
|
|
__CLC_GENTYPE private_iptr; \
|
|
__CLC_GENTYPE ret = __clc_fract(x, &private_iptr); \
|
|
*iptr = private_iptr; \
|
|
return ret; \
|
|
}
|
|
|
|
FRACT_DEF(local);
|
|
FRACT_DEF(global);
|
|
#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
|
|
FRACT_DEF(generic);
|
|
#endif
|
|
|
|
#undef MIN_CONSTANT
|