| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft Corporation and contributors. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- namespace Js
- {
- template<typename T>
- inline T VECTORCALL minCheckNan(T aLeft, T aRight)
- {
- if (NumberUtilities::IsNan(aLeft) || NumberUtilities::IsNan(aRight))
- {
- return (T)NumberConstants::NaN;
- }
- if (aLeft < aRight)
- {
- return aLeft;
- }
- if (aLeft == aRight)
- {
- if (aRight == 0 && JavascriptNumber::IsNegZero(aLeft))
- {
- return aLeft;
- }
- }
- return aRight;
- }
- template<>
- inline double AsmJsMath::Min<double>(double aLeft, double aRight)
- {
- return minCheckNan(aLeft, aRight);
- }
- template<>
- inline float AsmJsMath::Min<float>(float aLeft, float aRight)
- {
- return minCheckNan(aLeft, aRight);
- }
- template<typename T>
- inline T maxCheckNan(T aLeft, T aRight)
- {
- if (NumberUtilities::IsNan(aLeft) || NumberUtilities::IsNan(aRight))
- {
- return (T)NumberConstants::NaN;
- }
- if (aLeft > aRight)
- {
- return aLeft;
- }
- if (aLeft == aRight)
- {
- if (aLeft == 0 && JavascriptNumber::IsNegZero(aRight))
- {
- return aLeft;
- }
- }
- return aRight;
- }
- template<>
- inline double AsmJsMath::Max<double>(double aLeft, double aRight)
- {
- return maxCheckNan(aLeft, aRight);
- }
- template<>
- inline float AsmJsMath::Max<float>(float aLeft, float aRight)
- {
- return maxCheckNan(aLeft, aRight);
- }
- template<>
- inline double AsmJsMath::Abs<double>(double aLeft)
- {
- uint64 x = (*(uint64*)(&aLeft) & 0x7FFFFFFFFFFFFFFF);
- return *(double*)(&x);
- }
- template<>
- inline float AsmJsMath::Abs<float>(float aLeft)
- {
- uint32 x = (*(uint32*)(&aLeft) & 0x7FFFFFFF);
- return *(float*)(&x);
- }
- template<typename T>
- inline T AsmJsMath::Add( T aLeft, T aRight )
- {
- return aLeft + aRight;
- }
- template<typename T>
- inline T AsmJsMath::Sub( T aLeft, T aRight )
- {
- return aLeft - aRight;
- }
- template<typename T> inline int AsmJsMath::CmpLt( T aLeft, T aRight ){return (int)(aLeft < aRight);}
- template<typename T> inline int AsmJsMath::CmpLe( T aLeft, T aRight ){return (int)(aLeft <= aRight);}
- template<typename T> inline int AsmJsMath::CmpGt( T aLeft, T aRight ){return (int)(aLeft > aRight);}
- template<typename T> inline int AsmJsMath::CmpGe( T aLeft, T aRight ){return (int)(aLeft >= aRight);}
- template<typename T> inline int AsmJsMath::CmpEq( T aLeft, T aRight ){return (int)(aLeft == aRight);}
- template<typename T> inline int AsmJsMath::CmpNe( T aLeft, T aRight ){return (int)(aLeft != aRight);}
- template<typename T>
- inline T AsmJsMath::And( T aLeft, T aRight )
- {
- return aLeft & aRight;
- }
- template<typename T>
- inline T AsmJsMath::Or( T aLeft, T aRight )
- {
- return aLeft | aRight;
- }
- template<typename T>
- inline T AsmJsMath::Xor( T aLeft, T aRight )
- {
- return aLeft ^ aRight;
- }
- template<typename T>
- inline T AsmJsMath::Shl( T aLeft, T aRight )
- {
- return aLeft << aRight;
- }
- template<typename T>
- inline T AsmJsMath::Shr( T aLeft, T aRight )
- {
- return aLeft >> aRight;
- }
- template<typename T>
- inline T AsmJsMath::ShrU( T aLeft, T aRight )
- {
- return aLeft >> aRight;
- }
- template<typename T>
- inline T AsmJsMath::Neg( T aLeft )
- {
- return -aLeft;
- }
- inline int AsmJsMath::Not( int aLeft )
- {
- return ~aLeft;
- }
- inline int AsmJsMath::LogNot( int aLeft )
- {
- return !aLeft;
- }
- inline int AsmJsMath::ToBool( int aLeft )
- {
- return !!aLeft;
- }
- inline int AsmJsMath::Clz32( int value)
- {
- DWORD index;
- if (_BitScanReverse(&index, value))
- {
- return 31 - index;
- }
- return 32;
- }
- }
|