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, L"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 = SIMD128ExtractLane<JavascriptSIMDBool32x4, 4, bool>(args[1], laneVar, scriptContext);
  62. return JavascriptBoolean::ToVar(result, scriptContext);
  63. }
  64. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, L"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. SIMDValue result = SIMD128ReplaceLane<JavascriptSIMDBool32x4, 4, bool>(args[1], laneVar, value, scriptContext);
  80. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  81. }
  82. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, L"ReplaceLane");
  83. }
  84. // UnaryOps
  85. Var SIMDBool32x4Lib::EntryAllTrue(RecyclableObject* function, CallInfo callInfo, ...)
  86. {
  87. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  88. ARGUMENTS(args, callInfo);
  89. ScriptContext* scriptContext = function->GetScriptContext();
  90. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  91. Assert(!(callInfo.Flags & CallFlags_New));
  92. if (args.Info.Count >= 2 && JavascriptSIMDBool32x4::Is(args[1]))
  93. {
  94. JavascriptSIMDBool32x4 *a = JavascriptSIMDBool32x4::FromVar(args[1]);
  95. Assert(a);
  96. bool result = SIMDBool32x4Operation::OpAllTrue(a->GetValue());
  97. return JavascriptBoolean::ToVar(result, scriptContext);
  98. }
  99. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, L"AllTrue");
  100. }
  101. Var SIMDBool32x4Lib::EntryAnyTrue(RecyclableObject* function, CallInfo callInfo, ...)
  102. {
  103. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  104. ARGUMENTS(args, callInfo);
  105. ScriptContext* scriptContext = function->GetScriptContext();
  106. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  107. Assert(!(callInfo.Flags & CallFlags_New));
  108. if (args.Info.Count >= 2 && JavascriptSIMDBool32x4::Is(args[1]))
  109. {
  110. JavascriptSIMDBool32x4 *a = JavascriptSIMDBool32x4::FromVar(args[1]);
  111. Assert(a);
  112. bool result = SIMDBool32x4Operation::OpAnyTrue(a->GetValue());
  113. return JavascriptBoolean::ToVar(result, scriptContext);
  114. }
  115. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, L"AnyTrue");
  116. }
  117. Var SIMDBool32x4Lib::EntryNot(RecyclableObject* function, CallInfo callInfo, ...)
  118. {
  119. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  120. ARGUMENTS(args, callInfo);
  121. ScriptContext* scriptContext = function->GetScriptContext();
  122. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  123. Assert(!(callInfo.Flags & CallFlags_New));
  124. if (args.Info.Count >= 2 && JavascriptSIMDBool32x4::Is(args[1]))
  125. {
  126. JavascriptSIMDBool32x4 *a = JavascriptSIMDBool32x4::FromVar(args[1]);
  127. Assert(a);
  128. SIMDValue result = SIMDInt32x4Operation::OpNot(a->GetValue());
  129. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  130. }
  131. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, L"not");
  132. }
  133. Var SIMDBool32x4Lib::EntryAnd(RecyclableObject* function, CallInfo callInfo, ...)
  134. {
  135. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  136. ARGUMENTS(args, callInfo);
  137. ScriptContext* scriptContext = function->GetScriptContext();
  138. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  139. Assert(!(callInfo.Flags & CallFlags_New));
  140. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  141. // strict type on both operands
  142. if (args.Info.Count >= 3 && JavascriptSIMDBool32x4::Is(args[1]) && JavascriptSIMDBool32x4::Is(args[2]))
  143. {
  144. JavascriptSIMDBool32x4 *a = JavascriptSIMDBool32x4::FromVar(args[1]);
  145. JavascriptSIMDBool32x4 *b = JavascriptSIMDBool32x4::FromVar(args[2]);
  146. Assert(a && b);
  147. SIMDValue result, aValue, bValue;
  148. aValue = a->GetValue();
  149. bValue = b->GetValue();
  150. result = SIMDInt32x4Operation::OpAnd(aValue, bValue);
  151. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  152. }
  153. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, L"and");
  154. }
  155. Var SIMDBool32x4Lib::EntryOr(RecyclableObject* function, CallInfo callInfo, ...)
  156. {
  157. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  158. ARGUMENTS(args, callInfo);
  159. ScriptContext* scriptContext = function->GetScriptContext();
  160. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  161. Assert(!(callInfo.Flags & CallFlags_New));
  162. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  163. // strict type on both operands
  164. if (args.Info.Count >= 3 && JavascriptSIMDBool32x4::Is(args[1]) && JavascriptSIMDBool32x4::Is(args[2]))
  165. {
  166. JavascriptSIMDBool32x4 *a = JavascriptSIMDBool32x4::FromVar(args[1]);
  167. JavascriptSIMDBool32x4 *b = JavascriptSIMDBool32x4::FromVar(args[2]);
  168. Assert(a && b);
  169. SIMDValue result, aValue, bValue;
  170. aValue = a->GetValue();
  171. bValue = b->GetValue();
  172. result = SIMDInt32x4Operation::OpOr(aValue, bValue);
  173. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  174. }
  175. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, L"or");
  176. }
  177. Var SIMDBool32x4Lib::EntryXor(RecyclableObject* function, CallInfo callInfo, ...)
  178. {
  179. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  180. ARGUMENTS(args, callInfo);
  181. ScriptContext* scriptContext = function->GetScriptContext();
  182. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  183. Assert(!(callInfo.Flags & CallFlags_New));
  184. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  185. // strict type on both operands
  186. if (args.Info.Count >= 3 && JavascriptSIMDBool32x4::Is(args[1]) && JavascriptSIMDBool32x4::Is(args[2]))
  187. {
  188. JavascriptSIMDBool32x4 *a = JavascriptSIMDBool32x4::FromVar(args[1]);
  189. JavascriptSIMDBool32x4 *b = JavascriptSIMDBool32x4::FromVar(args[2]);
  190. Assert(a && b);
  191. SIMDValue result, aValue, bValue;
  192. aValue = a->GetValue();
  193. bValue = b->GetValue();
  194. result = SIMDInt32x4Operation::OpXor(aValue, bValue);
  195. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  196. }
  197. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdBool32x4TypeMismatch, L"xor");
  198. }
  199. }