diff options
Diffstat (limited to 'PxShared/include/foundation/nx/PxNXIntrinsics.h')
| -rw-r--r-- | PxShared/include/foundation/nx/PxNXIntrinsics.h | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/PxShared/include/foundation/nx/PxNXIntrinsics.h b/PxShared/include/foundation/nx/PxNXIntrinsics.h new file mode 100644 index 0000000..adf3bf5 --- /dev/null +++ b/PxShared/include/foundation/nx/PxNXIntrinsics.h @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, related documentation + * and any modifications thereto. Any use, reproduction, disclosure or + * distribution of this software and related documentation without an express + * license agreement from NVIDIA CORPORATION is strictly prohibited. + */ +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + + +#ifndef PX_FOUNDATION_PX_NX_INTRINSICS_H +#define PX_FOUNDATION_PX_NX_INTRINSICS_H + +#include "foundation/Px.h" +#include "foundation/PxAssert.h" + +#if !PX_NX + #error "This file should only be included by NX builds!!" +#endif + +#include <math.h> +#include <float.h> + +#include "nn/cstd/cstd_CMath.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace intrinsics +{ +#endif + + //! \brief platform-specific absolute value + PX_CUDA_CALLABLE PX_FORCE_INLINE float abs(float a) { return ::fabsf(a); } + + //! \brief platform-specific select float + PX_CUDA_CALLABLE PX_FORCE_INLINE float fsel(float a, float b, float c) { return (a >= 0.0f) ? b : c; } + + //! \brief platform-specific sign + PX_CUDA_CALLABLE PX_FORCE_INLINE float sign(float a) { return (a >= 0.0f) ? 1.0f : -1.0f; } + + //! \brief platform-specific reciprocal + PX_CUDA_CALLABLE PX_FORCE_INLINE float recip(float a) { return 1.0f/a; } + + //! \brief platform-specific reciprocal estimate + PX_CUDA_CALLABLE PX_FORCE_INLINE float recipFast(float a) { return 1.0f/a; } + + //! \brief platform-specific square root + PX_CUDA_CALLABLE PX_FORCE_INLINE float sqrt(float a) { return ::sqrtf(a); } + + //! \brief platform-specific reciprocal square root + PX_CUDA_CALLABLE PX_FORCE_INLINE float recipSqrt(float a) { return 1.0f/::sqrtf(a); } + + //! \brief platform-specific reciprocal square root estimate + PX_CUDA_CALLABLE PX_FORCE_INLINE float recipSqrtFast(float a) { return 1.0f/::sqrtf(a); } + + //! \brief platform-specific sine + PX_CUDA_CALLABLE PX_FORCE_INLINE float sin(float a) { return ::sinf(a); } + + //! \brief platform-specific cosine + PX_CUDA_CALLABLE PX_FORCE_INLINE float cos(float a) { return ::cosf(a); } + + //! \brief platform-specific minimum + PX_CUDA_CALLABLE PX_FORCE_INLINE float selectMin(float a, float b) { return a<b ? a : b; } + + //! \brief platform-specific maximum + PX_CUDA_CALLABLE PX_FORCE_INLINE float selectMax(float a, float b) { return a>b ? a : b; } + + //! \brief platform-specific finiteness check + PX_CUDA_CALLABLE PX_FORCE_INLINE bool isFinite(float a) + { +#ifdef __CUDACC__ + return isfinite(a) ? true : false; +#else + return !nn::cstd::IsNan(a) && !nn::cstd::IsInf(a); +#endif + } + + //! \brief platform-specific finiteness check + PX_CUDA_CALLABLE PX_FORCE_INLINE bool isFinite(double a) + { +#ifdef __CUDACC__ + return isfinite(a) ? true : false; +#else + return !nn::cstd::IsNan(a) && !nn::cstd::IsInf(a); +#endif + } + + /*! + Sets \c count bytes starting at \c dst to zero. + */ + PX_FORCE_INLINE void* memZero(void* PX_RESTRICT dest, uint32_t count) + { + return memset(dest, 0, count); + } + + /*! + Sets \c count bytes starting at \c dst to \c c. + */ + PX_FORCE_INLINE void* memSet(void* PX_RESTRICT dest, int32_t c, uint32_t count) + { + return memset(dest, c, count); + } + + /*! + Copies \c count bytes from \c src to \c dst. User memMove if regions overlap. + */ + PX_FORCE_INLINE void* memCopy(void* PX_RESTRICT dest, const void* PX_RESTRICT src, uint32_t count) + { + return memcpy(dest, src, count); + } + + /*! + Copies \c count bytes from \c src to \c dst. Supports overlapping regions. + */ + PX_FORCE_INLINE void* memMove(void* PX_RESTRICT dest, const void* PX_RESTRICT src, uint32_t count) + { + return memmove(dest, src, count); + } + + /*! + Set 128B to zero starting at \c dst+offset. Must be aligned. + */ + PX_FORCE_INLINE void memZero128(void* PX_RESTRICT dest, uint32_t offset = 0) + { + PX_ASSERT(((size_t(dest)+offset) & 0x7f) == 0); + memSet((char* PX_RESTRICT)dest+offset, 0, 128); + } + +#if !PX_DOXYGEN +} // namespace intrinsics +} // namespace physx +#endif + +#endif |