// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once #include #include #include namespace paddle { namespace lite { namespace arm { namespace math { template static inline _Tp saturate_cast(uint8_t v) { return _Tp(v); } /** @overload */ template static inline _Tp saturate_cast(int8_t v) { return _Tp(v); } /** @overload */ template static inline _Tp saturate_cast(uint16_t v) { return _Tp(v); } /** @overload */ template static inline _Tp saturate_cast(int16_t v) { return _Tp(v); } /** @overload */ template static inline _Tp saturate_cast(uint32_t v) { return _Tp(v); } /** @overload */ template static inline _Tp saturate_cast(int32_t v) { return _Tp(v); } /** @overload */ template static inline _Tp saturate_cast(float v) { return _Tp(v); } /** @overload */ template static inline _Tp saturate_cast(double v) { return _Tp(v); } /** @overload */ template static inline _Tp saturate_cast(int64_t v) { return _Tp(v); } /** @overload */ template static inline _Tp saturate_cast(uint64_t v) { return _Tp(v); } template <> inline uint8_t saturate_cast(int8_t v) { return static_cast(std::max(static_cast(v), 0)); } template <> inline uint8_t saturate_cast(uint16_t v) { return static_cast(std::min((unsigned)v, (unsigned)UCHAR_MAX)); } template <> inline uint8_t saturate_cast(int v) { return static_cast( ((unsigned)v <= UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0)); } template <> inline uint8_t saturate_cast(int16_t v) { return saturate_cast(static_cast(v)); } template <> inline uint8_t saturate_cast(unsigned v) { return static_cast(std::min(v, (unsigned)UCHAR_MAX)); } template <> inline uint8_t saturate_cast(float v) { int iv = static_cast(roundf(v)); return saturate_cast(iv); } template <> inline uint8_t saturate_cast(double v) { int iv = static_cast(round(v)); return saturate_cast(iv); } template <> inline uint8_t saturate_cast(int64_t v) { return static_cast( ((uint64_t)v <= (uint64_t)UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0)); } template <> inline uint8_t saturate_cast(uint64_t v) { return static_cast(std::min(v, (uint64_t)UCHAR_MAX)); } template <> inline int8_t saturate_cast(uint8_t v) { return static_cast(std::min(static_cast(v), SCHAR_MAX)); } template <> inline int8_t saturate_cast(uint16_t v) { return static_cast(std::min((unsigned)v, (unsigned)SCHAR_MAX)); } template <> inline int8_t saturate_cast(int v) { return static_cast(((unsigned)(v - SCHAR_MIN) <= (unsigned)UCHAR_MAX ? v : v > 0 ? SCHAR_MAX : SCHAR_MIN)); } template <> inline int8_t saturate_cast(int16_t v) { return saturate_cast(static_cast(v)); } template <> inline int8_t saturate_cast(unsigned v) { return static_cast(std::min(v, (unsigned)SCHAR_MAX)); } template <> inline int8_t saturate_cast(float v) { int iv = static_cast(roundf(v)); return saturate_cast(iv); } template <> inline int8_t saturate_cast(double v) { int iv = static_cast(round(v)); return saturate_cast(iv); } template <> inline int8_t saturate_cast(int64_t v) { return static_cast( ((uint64_t)(static_cast(v) - SCHAR_MIN) <= (uint64_t)UCHAR_MAX ? v : v > 0 ? SCHAR_MAX : SCHAR_MIN)); } template <> inline int8_t saturate_cast(uint64_t v) { return static_cast(std::min(v, (uint64_t)SCHAR_MAX)); } template <> inline uint16_t saturate_cast(int8_t v) { return static_cast(std::max(static_cast(v), 0)); } template <> inline uint16_t saturate_cast(int16_t v) { return static_cast(std::max(static_cast(v), 0)); } template <> inline uint16_t saturate_cast(int v) { return static_cast( (unsigned)v <= (unsigned)USHRT_MAX ? v : v > 0 ? USHRT_MAX : 0); } template <> inline uint16_t saturate_cast(unsigned v) { return static_cast(std::min(v, (unsigned)USHRT_MAX)); } template <> inline uint16_t saturate_cast(float v) { int iv = static_cast(roundf(v)); return saturate_cast(iv); } template <> inline uint16_t saturate_cast(double v) { int iv = static_cast(round(v)); return saturate_cast(iv); } template <> inline uint16_t saturate_cast(int64_t v) { return static_cast( (uint64_t)v <= (uint64_t)USHRT_MAX ? v : v > 0 ? USHRT_MAX : 0); } template <> inline uint16_t saturate_cast(uint64_t v) { return static_cast(std::min(v, (uint64_t)USHRT_MAX)); } template <> inline int16_t saturate_cast(uint16_t v) { return static_cast(std::min(static_cast(v), SHRT_MAX)); } template <> inline int16_t saturate_cast(int v) { return static_cast((unsigned)(v - SHRT_MIN) <= (unsigned)USHRT_MAX ? v : v > 0 ? SHRT_MAX : SHRT_MIN); } template <> inline int16_t saturate_cast(unsigned v) { return (int16_t)std::min(v, (unsigned)SHRT_MAX); } template <> inline int16_t saturate_cast(float v) { int iv = static_cast(roundf(v)); return saturate_cast(iv); } template <> inline int16_t saturate_cast(double v) { int iv = static_cast(round(v)); return saturate_cast(iv); } template <> inline int16_t saturate_cast(int64_t v) { return static_cast((uint64_t)((int64_t)v - SHRT_MIN) <= (uint64_t)USHRT_MAX ? v : v > 0 ? SHRT_MAX : SHRT_MIN); } template <> inline int16_t saturate_cast(uint64_t v) { return static_cast(std::min(v, (uint64_t)SHRT_MAX)); } template <> inline int saturate_cast(unsigned v) { return static_cast(std::min(v, (unsigned)INT_MAX)); } template <> inline int saturate_cast(int64_t v) { return static_cast((uint64_t)(v - INT_MIN) <= (uint64_t)UINT_MAX ? v : v > 0 ? INT_MAX : INT_MIN); } template <> inline int saturate_cast(uint64_t v) { return static_cast(std::min(v, (uint64_t)INT_MAX)); } template <> inline int saturate_cast(float v) { return static_cast(roundf(v)); } template <> inline int saturate_cast(double v) { return static_cast(round(v)); } template <> inline unsigned saturate_cast(int8_t v) { return static_cast(std::max(v, static_cast(0))); } template <> inline unsigned saturate_cast(int16_t v) { return static_cast(std::max(v, (int16_t)0)); } template <> inline unsigned saturate_cast(int v) { return static_cast(std::max(v, static_cast(0))); } template <> inline unsigned saturate_cast(int64_t v) { return static_cast( (uint64_t)v <= (uint64_t)UINT_MAX ? v : v > 0 ? UINT_MAX : 0); } template <> inline unsigned saturate_cast(uint64_t v) { return static_cast(std::min(v, (uint64_t)UINT_MAX)); } // we intentionally do not clip negative numbers, to make -1 become 0xffffffff // etc. template <> inline unsigned saturate_cast(float v) { return static_cast(roundf(v)); } template <> inline unsigned saturate_cast(double v) { return static_cast(round(v)); } template <> inline uint64_t saturate_cast(int8_t v) { return static_cast(std::max(v, static_cast(0))); } template <> inline uint64_t saturate_cast(int16_t v) { return static_cast(std::max(v, (int16_t)0)); } template <> inline uint64_t saturate_cast(int v) { return static_cast(std::max(v, static_cast(0))); } template <> inline uint64_t saturate_cast(int64_t v) { return static_cast(std::max(v, (int64_t)0)); } template <> inline int64_t saturate_cast(uint64_t v) { return static_cast(std::min(v, (uint64_t)LLONG_MAX)); } } // namespace math } // namespace arm } // namespace lite } // namespace paddle