AsmJsMath.inl 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft Corporation and contributors. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. namespace Js
  6. {
  7. template<typename T>
  8. inline T VECTORCALL minCheckNan(T aLeft, T aRight)
  9. {
  10. if (NumberUtilities::IsNan(aLeft) || NumberUtilities::IsNan(aRight))
  11. {
  12. return (T)NumberConstants::NaN;
  13. }
  14. if (aLeft < aRight)
  15. {
  16. return aLeft;
  17. }
  18. if (aLeft == aRight)
  19. {
  20. if (aRight == 0 && JavascriptNumber::IsNegZero(aLeft))
  21. {
  22. return aLeft;
  23. }
  24. }
  25. return aRight;
  26. }
  27. template<>
  28. inline double AsmJsMath::Min<double>(double aLeft, double aRight)
  29. {
  30. return minCheckNan(aLeft, aRight);
  31. }
  32. template<>
  33. inline float AsmJsMath::Min<float>(float aLeft, float aRight)
  34. {
  35. return minCheckNan(aLeft, aRight);
  36. }
  37. template<typename T>
  38. inline T maxCheckNan(T aLeft, T aRight)
  39. {
  40. if (NumberUtilities::IsNan(aLeft) || NumberUtilities::IsNan(aRight))
  41. {
  42. return (T)NumberConstants::NaN;
  43. }
  44. if (aLeft > aRight)
  45. {
  46. return aLeft;
  47. }
  48. if (aLeft == aRight)
  49. {
  50. if (aLeft == 0 && JavascriptNumber::IsNegZero(aRight))
  51. {
  52. return aLeft;
  53. }
  54. }
  55. return aRight;
  56. }
  57. template<>
  58. inline double AsmJsMath::Max<double>(double aLeft, double aRight)
  59. {
  60. return maxCheckNan(aLeft, aRight);
  61. }
  62. template<>
  63. inline float AsmJsMath::Max<float>(float aLeft, float aRight)
  64. {
  65. return maxCheckNan(aLeft, aRight);
  66. }
  67. template<>
  68. inline double AsmJsMath::Abs<double>(double aLeft)
  69. {
  70. uint64 x = (*(uint64*)(&aLeft) & 0x7FFFFFFFFFFFFFFF);
  71. return *(double*)(&x);
  72. }
  73. template<>
  74. inline float AsmJsMath::Abs<float>(float aLeft)
  75. {
  76. uint32 x = (*(uint32*)(&aLeft) & 0x7FFFFFFF);
  77. return *(float*)(&x);
  78. }
  79. template<typename T>
  80. inline T AsmJsMath::Add( T aLeft, T aRight )
  81. {
  82. return aLeft + aRight;
  83. }
  84. template<typename T>
  85. inline T AsmJsMath::Sub( T aLeft, T aRight )
  86. {
  87. return aLeft - aRight;
  88. }
  89. template<typename T> inline int AsmJsMath::CmpLt( T aLeft, T aRight ){return (int)(aLeft < aRight);}
  90. template<typename T> inline int AsmJsMath::CmpLe( T aLeft, T aRight ){return (int)(aLeft <= aRight);}
  91. template<typename T> inline int AsmJsMath::CmpGt( T aLeft, T aRight ){return (int)(aLeft > aRight);}
  92. template<typename T> inline int AsmJsMath::CmpGe( T aLeft, T aRight ){return (int)(aLeft >= aRight);}
  93. template<typename T> inline int AsmJsMath::CmpEq( T aLeft, T aRight ){return (int)(aLeft == aRight);}
  94. template<typename T> inline int AsmJsMath::CmpNe( T aLeft, T aRight ){return (int)(aLeft != aRight);}
  95. template<typename T>
  96. inline T AsmJsMath::And( T aLeft, T aRight )
  97. {
  98. return aLeft & aRight;
  99. }
  100. template<typename T>
  101. inline T AsmJsMath::Or( T aLeft, T aRight )
  102. {
  103. return aLeft | aRight;
  104. }
  105. template<typename T>
  106. inline T AsmJsMath::Xor( T aLeft, T aRight )
  107. {
  108. return aLeft ^ aRight;
  109. }
  110. template<typename T>
  111. inline T AsmJsMath::Shl( T aLeft, T aRight )
  112. {
  113. return aLeft << aRight;
  114. }
  115. template<typename T>
  116. inline T AsmJsMath::Shr( T aLeft, T aRight )
  117. {
  118. return aLeft >> aRight;
  119. }
  120. template<typename T>
  121. inline T AsmJsMath::ShrU( T aLeft, T aRight )
  122. {
  123. return aLeft >> aRight;
  124. }
  125. template<typename T>
  126. inline T AsmJsMath::Neg( T aLeft )
  127. {
  128. return -aLeft;
  129. }
  130. inline int AsmJsMath::Not( int aLeft )
  131. {
  132. return ~aLeft;
  133. }
  134. inline int AsmJsMath::LogNot( int aLeft )
  135. {
  136. return !aLeft;
  137. }
  138. inline int AsmJsMath::ToBool( int aLeft )
  139. {
  140. return !!aLeft;
  141. }
  142. inline int AsmJsMath::Clz32( int value)
  143. {
  144. DWORD index;
  145. if (_BitScanReverse(&index, value))
  146. {
  147. return 31 - index;
  148. }
  149. return 32;
  150. }
  151. }