SimdBool32x4Lib.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  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. #include "RuntimeLibraryPch.h"
  6. // SIMD_JS
  7. namespace Js
  8. {
  9. Var SIMDBool32x4Lib::EntryBool32x4(RecyclableObject* function, CallInfo callInfo, ...)
  10. {
  11. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  12. ARGUMENTS(args, callInfo);
  13. ScriptContext* scriptContext = function->GetScriptContext();
  14. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  15. Assert(!(callInfo.Flags & CallFlags_New));
  16. Var undefinedVar = scriptContext->GetLibrary()->GetUndefined();
  17. bool bSIMDX = JavascriptConversion::ToBool(args.Info.Count >= 2 ? args[1] : undefinedVar, scriptContext);
  18. bool bSIMDY = JavascriptConversion::ToBool(args.Info.Count >= 3 ? args[2] : undefinedVar, scriptContext);
  19. bool bSIMDZ = JavascriptConversion::ToBool(args.Info.Count >= 4 ? args[3] : undefinedVar, scriptContext);
  20. bool bSIMDW = JavascriptConversion::ToBool(args.Info.Count >= 5 ? args[4] : undefinedVar, scriptContext);
  21. SIMDValue lanes = SIMDBool32x4Operation::OpBool32x4(bSIMDX, bSIMDY, bSIMDZ, bSIMDW);
  22. return JavascriptSIMDBool32x4::New(&lanes, scriptContext);
  23. }
  24. Var SIMDBool32x4Lib::EntryCheck(RecyclableObject* function, CallInfo callInfo, ...)
  25. {
  26. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  27. ARGUMENTS(args, callInfo);
  28. ScriptContext* scriptContext = function->GetScriptContext();
  29. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  30. Assert(!(callInfo.Flags & CallFlags_New));
  31. if (args.Info.Count >= 2 && JavascriptSIMDBool32x4::Is(args[1]))
  32. {
  33. return args[1];
  34. }
  35. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, _u("bool32x4"));
  36. }
  37. Var SIMDBool32x4Lib::EntrySplat(RecyclableObject* function, CallInfo callInfo, ...)
  38. {
  39. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  40. ARGUMENTS(args, callInfo);
  41. ScriptContext* scriptContext = function->GetScriptContext();
  42. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  43. Assert(!(callInfo.Flags & CallFlags_New));
  44. Var undefinedVar = scriptContext->GetLibrary()->GetUndefined();
  45. bool value = JavascriptConversion::ToBool(args.Info.Count >= 2 ? args[1] : undefinedVar, scriptContext);
  46. SIMDValue lanes = SIMDInt32x4Operation::OpSplat(value ? -1 : 0);
  47. return JavascriptSIMDBool32x4::New(&lanes, scriptContext);
  48. }
  49. //Lane Access
  50. Var SIMDBool32x4Lib::EntryExtractLane(RecyclableObject* function, CallInfo callInfo, ...)
  51. {
  52. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  53. ARGUMENTS(args, callInfo);
  54. ScriptContext* scriptContext = function->GetScriptContext();
  55. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  56. Assert(!(callInfo.Flags & CallFlags_New));
  57. if (args.Info.Count >= 3 && JavascriptSIMDBool32x4::Is(args[1]))
  58. {
  59. // if value arg is missing, then it is undefined.
  60. Var laneVar = args.Info.Count >= 3 ? args[2] : scriptContext->GetLibrary()->GetUndefined();
  61. bool result = (SIMDUtils::SIMD128ExtractLane<JavascriptSIMDBool32x4, 4, int32>(args[1], laneVar, scriptContext)) ? true : false;
  62. return JavascriptBoolean::ToVar(result, scriptContext);
  63. }
  64. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, _u("ExtractLane"));
  65. }
  66. Var SIMDBool32x4Lib::EntryReplaceLane(RecyclableObject* function, CallInfo callInfo, ...)
  67. {
  68. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  69. ARGUMENTS(args, callInfo);
  70. ScriptContext* scriptContext = function->GetScriptContext();
  71. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  72. Assert(!(callInfo.Flags & CallFlags_New));
  73. if (args.Info.Count >= 4 && JavascriptSIMDBool32x4::Is(args[1]))
  74. {
  75. // if value arg is missing, then it is undefined.
  76. Var laneVar = args.Info.Count >= 4 ? args[2] : scriptContext->GetLibrary()->GetUndefined();
  77. Var argVal = args.Info.Count >= 4 ? args[3] : scriptContext->GetLibrary()->GetUndefined();
  78. bool value = JavascriptConversion::ToBool(argVal, scriptContext);
  79. int32 intValue = (value) ? -1 : 0;
  80. SIMDValue result = SIMDUtils::SIMD128ReplaceLane<JavascriptSIMDBool32x4, 4, int32>(args[1], laneVar, intValue, scriptContext);
  81. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  82. }
  83. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, _u("ReplaceLane"));
  84. }
  85. // UnaryOps
  86. Var SIMDBool32x4Lib::EntryAllTrue(RecyclableObject* function, CallInfo callInfo, ...)
  87. {
  88. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  89. ARGUMENTS(args, callInfo);
  90. ScriptContext* scriptContext = function->GetScriptContext();
  91. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  92. Assert(!(callInfo.Flags & CallFlags_New));
  93. if (args.Info.Count >= 2 && JavascriptSIMDBool32x4::Is(args[1]))
  94. {
  95. JavascriptSIMDBool32x4 *a = JavascriptSIMDBool32x4::FromVar(args[1]);
  96. Assert(a);
  97. bool result = SIMDBool32x4Operation::OpAllTrue(a->GetValue());
  98. return JavascriptBoolean::ToVar(result, scriptContext);
  99. }
  100. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, _u("AllTrue"));
  101. }
  102. Var SIMDBool32x4Lib::EntryAnyTrue(RecyclableObject* function, CallInfo callInfo, ...)
  103. {
  104. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  105. ARGUMENTS(args, callInfo);
  106. ScriptContext* scriptContext = function->GetScriptContext();
  107. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  108. Assert(!(callInfo.Flags & CallFlags_New));
  109. if (args.Info.Count >= 2 && JavascriptSIMDBool32x4::Is(args[1]))
  110. {
  111. JavascriptSIMDBool32x4 *a = JavascriptSIMDBool32x4::FromVar(args[1]);
  112. Assert(a);
  113. bool result = SIMDBool32x4Operation::OpAnyTrue(a->GetValue());
  114. return JavascriptBoolean::ToVar(result, scriptContext);
  115. }
  116. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, _u("AnyTrue"));
  117. }
  118. Var SIMDBool32x4Lib::EntryNot(RecyclableObject* function, CallInfo callInfo, ...)
  119. {
  120. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  121. ARGUMENTS(args, callInfo);
  122. ScriptContext* scriptContext = function->GetScriptContext();
  123. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  124. Assert(!(callInfo.Flags & CallFlags_New));
  125. if (args.Info.Count >= 2 && JavascriptSIMDBool32x4::Is(args[1]))
  126. {
  127. JavascriptSIMDBool32x4 *a = JavascriptSIMDBool32x4::FromVar(args[1]);
  128. Assert(a);
  129. SIMDValue result = SIMDInt32x4Operation::OpNot(a->GetValue());
  130. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  131. }
  132. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, _u("not"));
  133. }
  134. Var SIMDBool32x4Lib::EntryAnd(RecyclableObject* function, CallInfo callInfo, ...)
  135. {
  136. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  137. ARGUMENTS(args, callInfo);
  138. ScriptContext* scriptContext = function->GetScriptContext();
  139. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  140. Assert(!(callInfo.Flags & CallFlags_New));
  141. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  142. // strict type on both operands
  143. if (args.Info.Count >= 3 && JavascriptSIMDBool32x4::Is(args[1]) && JavascriptSIMDBool32x4::Is(args[2]))
  144. {
  145. JavascriptSIMDBool32x4 *a = JavascriptSIMDBool32x4::FromVar(args[1]);
  146. JavascriptSIMDBool32x4 *b = JavascriptSIMDBool32x4::FromVar(args[2]);
  147. Assert(a && b);
  148. SIMDValue result, aValue, bValue;
  149. aValue = a->GetValue();
  150. bValue = b->GetValue();
  151. result = SIMDInt32x4Operation::OpAnd(aValue, bValue);
  152. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  153. }
  154. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, _u("and"));
  155. }
  156. Var SIMDBool32x4Lib::EntryOr(RecyclableObject* function, CallInfo callInfo, ...)
  157. {
  158. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  159. ARGUMENTS(args, callInfo);
  160. ScriptContext* scriptContext = function->GetScriptContext();
  161. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  162. Assert(!(callInfo.Flags & CallFlags_New));
  163. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  164. // strict type on both operands
  165. if (args.Info.Count >= 3 && JavascriptSIMDBool32x4::Is(args[1]) && JavascriptSIMDBool32x4::Is(args[2]))
  166. {
  167. JavascriptSIMDBool32x4 *a = JavascriptSIMDBool32x4::FromVar(args[1]);
  168. JavascriptSIMDBool32x4 *b = JavascriptSIMDBool32x4::FromVar(args[2]);
  169. Assert(a && b);
  170. SIMDValue result, aValue, bValue;
  171. aValue = a->GetValue();
  172. bValue = b->GetValue();
  173. result = SIMDInt32x4Operation::OpOr(aValue, bValue);
  174. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  175. }
  176. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, _u("or"));
  177. }
  178. Var SIMDBool32x4Lib::EntryXor(RecyclableObject* function, CallInfo callInfo, ...)
  179. {
  180. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  181. ARGUMENTS(args, callInfo);
  182. ScriptContext* scriptContext = function->GetScriptContext();
  183. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  184. Assert(!(callInfo.Flags & CallFlags_New));
  185. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  186. // strict type on both operands
  187. if (args.Info.Count >= 3 && JavascriptSIMDBool32x4::Is(args[1]) && JavascriptSIMDBool32x4::Is(args[2]))
  188. {
  189. JavascriptSIMDBool32x4 *a = JavascriptSIMDBool32x4::FromVar(args[1]);
  190. JavascriptSIMDBool32x4 *b = JavascriptSIMDBool32x4::FromVar(args[2]);
  191. Assert(a && b);
  192. SIMDValue result, aValue, bValue;
  193. aValue = a->GetValue();
  194. bValue = b->GetValue();
  195. result = SIMDInt32x4Operation::OpXor(aValue, bValue);
  196. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  197. }
  198. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, _u("xor"));
  199. }
  200. }