JavascriptMath.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. 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. #ifdef SSE2MATH
  8. namespace SSE2
  9. {
  10. #endif
  11. class JavascriptMath
  12. {
  13. public:
  14. //
  15. // Some frequently-used operations have three flavors optimized for different situations.
  16. //
  17. // 1. Op : Called from the interpreter loop only. Must handle all cases (may call Op_Full)
  18. // 2. Op_Full : Called from generated code or from Op (case 1). TaggedInt cases already handled.
  19. // 3. Op_InPlace : Called from generated code only where result may be "in-place new'd"
  20. //
  21. static Var Increment(Var aRight,ScriptContext* scriptContext);
  22. static Var Increment_Full(Var aRight,ScriptContext* scriptContext);
  23. static Var Increment_InPlace(Var aRight,ScriptContext* scriptContext, JavascriptNumber* result);
  24. static Var Decrement(Var aRight,ScriptContext* scriptContext);
  25. static Var Decrement_Full(Var aRight,ScriptContext* scriptContext);
  26. static Var Decrement_InPlace(Var aRight,ScriptContext* scriptContext, JavascriptNumber* result);
  27. static Var Negate(Var aRight,ScriptContext* scriptContext);
  28. static Var Negate_Full(Var aRight,ScriptContext* scriptContext);
  29. static Var Negate_InPlace(Var aRight,ScriptContext* scriptContext, JavascriptNumber* result);
  30. static Var Not(Var aRight,ScriptContext* scriptContext);
  31. static Var Not_Full(Var aRight,ScriptContext* scriptContext);
  32. static Var Not_InPlace(Var aRight,ScriptContext* scriptContext, JavascriptNumber* result);
  33. static Var Add(Var aLeft, Var aRight,ScriptContext* scriptContext);
  34. static Var Add_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  35. static Var Add_InPlace(Var aLeft, Var aRight,ScriptContext* scriptContext, JavascriptNumber *result);
  36. static Var AddLeftDead(Var aLeft, Var aRight,ScriptContext* scriptContext, JavascriptNumber *result);
  37. static Var MulAddLeft(Var mulLeft, Var mulRight, Var addLeft, ScriptContext* scriptContext, JavascriptNumber* result);
  38. static Var MulAddRight(Var mulLeft, Var mulRight, Var addRight, ScriptContext* scriptContext, JavascriptNumber* result);
  39. static Var MulSubLeft(Var mulLeft, Var mulRight, Var subLeft, ScriptContext* scriptContext, JavascriptNumber* result);
  40. static Var MulSubRight(Var mulLeft, Var mulRight, Var subRight, ScriptContext* scriptContext, JavascriptNumber* result);
  41. static Var Subtract(Var aLeft, Var aRight,ScriptContext* scriptContext);
  42. static Var Subtract_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  43. static Var Subtract_InPlace(Var aLeft, Var aRight,ScriptContext* scriptContext, JavascriptNumber *result);
  44. static Var Multiply(Var aLeft, Var aRight,ScriptContext* scriptContext);
  45. static Var Multiply_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  46. static Var Multiply_InPlace(Var aLeft, Var aRight,ScriptContext* scriptContext, JavascriptNumber *result);
  47. static Var Divide(Var aLeft, Var aRight,ScriptContext* scriptContext);
  48. static Var Divide_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  49. static Var Divide_InPlace(Var aLeft, Var aRight,ScriptContext* scriptContext, JavascriptNumber *result);
  50. static Var Exponentiation(Var aLeft, Var aRight, ScriptContext* scriptContext);
  51. static Var Exponentiation_Full(Var aLeft, Var aRight, ScriptContext* scriptContext);
  52. static Var Exponentiation_InPlace(Var aLeft, Var aRight, ScriptContext* scriptContext, JavascriptNumber *result);
  53. static Var Modulus(Var aLeft, Var aRight,ScriptContext* scriptContext);
  54. static Var Modulus_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  55. static Var Modulus_InPlace(Var aLeft, Var aRight,ScriptContext* scriptContext, JavascriptNumber *result);
  56. static Var And(Var aLeft, Var aRight,ScriptContext* scriptContext);
  57. static Var And_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  58. static Var And_InPlace(Var aLeft, Var aRight,ScriptContext* scriptContext, JavascriptNumber *result);
  59. static Var Or(Var aLeft, Var aRight,ScriptContext* scriptContext);
  60. static Var Or_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  61. static Var Or_InPlace(Var aLeft, Var aRight,ScriptContext* scriptContext, JavascriptNumber *result);
  62. static Var Xor(Var aLeft, Var aRight,ScriptContext* scriptContext);
  63. static Var Xor_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  64. static Var Xor_InPlace(Var aLeft, Var aRight,ScriptContext* scriptContext, JavascriptNumber *result);
  65. static Var ShiftLeft(Var aLeft, Var aRight,ScriptContext* scriptContext);
  66. static Var ShiftLeft_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  67. static Var ShiftRight(Var aLeft, Var aRight,ScriptContext* scriptContext);
  68. static Var ShiftRight_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  69. static Var ShiftRightU(Var aLeft, Var aRight,ScriptContext* scriptContext);
  70. static Var ShiftRightU_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  71. static Var FinishOddDivByPow2(int32 value, ScriptContext *scriptContext);
  72. static Var FinishOddDivByPow2_InPlace(int32 value, ScriptContext *scriptContext, JavascriptNumber* result);
  73. static Var MaxInAnArray(RecyclableObject * function, CallInfo callInfo, ...);
  74. static Var MinInAnArray(RecyclableObject * function, CallInfo callInfo, ...);
  75. static double Random(ScriptContext *scriptContext);
  76. static int32 ToInt32Core(double T1);
  77. static uint32 ToUInt32(double value);
  78. static int64 TryToInt64(double T1);
  79. static int32 ToInt32_NoObjects(Var aValue, ScriptContext* scriptContext, bool& isObject);
  80. static int32 ToInt32(Var aValue, ScriptContext* scriptContext);
  81. static int32 ToInt32(double value);
  82. static int32 ToInt32_Full(Var aValue, ScriptContext* scriptContext);
  83. // different CRT versions define these with different calling conventions, so use our own method to prevent these inconsistencies
  84. static float FloorF(float val) { return floorf(val); }
  85. static double Floor(double val) { return floor(val); }
  86. static float CeilF(float val) { return ceilf(val); }
  87. static double Ceil(double val) { return ceil(val); }
  88. private:
  89. static Var Add_FullHelper(Var aLeft, Var aRight, ScriptContext* scriptContext, JavascriptNumber* result, bool leftIsDead);
  90. static Var Add_FullHelper_Wrapper(Var aLeft, Var aRight, ScriptContext* scriptContext, JavascriptNumber* result, bool leftIsDead);
  91. static double Add_Helper(Var aLeft, Var aRight,ScriptContext* scriptContext);
  92. static double Subtract_Helper(Var aLeft, Var aRight,ScriptContext* scriptContext);
  93. static double Multiply_Helper(Var aLeft, Var aRight,ScriptContext* scriptContext);
  94. static double Divide_Helper(Var aLeft, Var aRight,ScriptContext* scriptContext);
  95. static double Modulus_Helper(Var aLeft, Var aRight,ScriptContext* scriptContext);
  96. static Var Add_DoubleHelper(double dblLeft, Var addRight, ScriptContext* scriptContext, JavascriptNumber* result);
  97. static Var Add_DoubleHelper(Var addLeft, double dblRight, ScriptContext* scriptContext, JavascriptNumber* result);
  98. static Var Subtract_DoubleHelper(double dblLeft, Var subRight, ScriptContext* scriptContext, JavascriptNumber* result);
  99. static Var Subtract_DoubleHelper(Var subLeft, double dblRight, ScriptContext* scriptContext, JavascriptNumber* result);
  100. static int32 And_Helper(Var aLeft, Var aRight,ScriptContext* scriptContext);
  101. static double Decrement_Helper(Var aLeft, ScriptContext* scriptContext);
  102. static double Increment_Helper(Var aLeft, ScriptContext* scriptContext);
  103. static double Negate_Helper(Var aRight,ScriptContext* scriptContext);
  104. static int32 Or_Helper(Var aLeft, Var aRight,ScriptContext* scriptContext);
  105. static BOOL IsNanInfZero(double v);
  106. static __int64 ToInt32ES5OverflowHelper(double d);
  107. };
  108. #ifdef SSE2MATH
  109. }
  110. #endif
  111. }