SimdInt32x4Lib.cpp 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140
  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. #include "RuntimeLibraryPch.h"
  6. namespace Js
  7. {
  8. Var SIMDInt32x4Lib::EntryInt32x4(RecyclableObject* function, CallInfo callInfo, ...)
  9. {
  10. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  11. ARGUMENTS(args, callInfo);
  12. ScriptContext* scriptContext = function->GetScriptContext();
  13. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  14. Assert(!(callInfo.Flags & CallFlags_New)); //comment out due to -ls -stress run
  15. Var undefinedVar = scriptContext->GetLibrary()->GetUndefined();
  16. int intSIMDX = JavascriptConversion::ToInt32(args.Info.Count >= 2 ? args[1] : undefinedVar, scriptContext);
  17. int intSIMDY = JavascriptConversion::ToInt32(args.Info.Count >= 3 ? args[2] : undefinedVar, scriptContext);
  18. int intSIMDZ = JavascriptConversion::ToInt32(args.Info.Count >= 4 ? args[3] : undefinedVar, scriptContext);
  19. int intSIMDW = JavascriptConversion::ToInt32(args.Info.Count >= 5 ? args[4] : undefinedVar, scriptContext);
  20. SIMDValue lanes = SIMDInt32x4Operation::OpInt32x4(intSIMDX, intSIMDY, intSIMDZ, intSIMDW);
  21. return JavascriptSIMDInt32x4::New(&lanes, scriptContext);
  22. }
  23. Var SIMDInt32x4Lib::EntryCheck(RecyclableObject* function, CallInfo callInfo, ...)
  24. {
  25. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  26. ARGUMENTS(args, callInfo);
  27. ScriptContext* scriptContext = function->GetScriptContext();
  28. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  29. Assert(!(callInfo.Flags & CallFlags_New)); //comment out due to -ls -stress run
  30. if (args.Info.Count >= 2 && JavascriptSIMDInt32x4::Is(args[1]))
  31. {
  32. return args[1];
  33. }
  34. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("int32x4"));
  35. }
  36. Var SIMDInt32x4Lib::EntrySplat(RecyclableObject* function, CallInfo callInfo, ...)
  37. {
  38. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  39. ARGUMENTS(args, callInfo);
  40. ScriptContext* scriptContext = function->GetScriptContext();
  41. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  42. Assert(!(callInfo.Flags & CallFlags_New));
  43. Var undefinedVar = scriptContext->GetLibrary()->GetUndefined();
  44. int value = JavascriptConversion::ToInt32(args.Info.Count >= 2 ? args[1] : undefinedVar, scriptContext);
  45. SIMDValue lanes = SIMDInt32x4Operation::OpSplat(value);
  46. return JavascriptSIMDInt32x4::New(&lanes, scriptContext);
  47. }
  48. Var SIMDInt32x4Lib::EntryFromFloat64x2(RecyclableObject* function, CallInfo callInfo, ...)
  49. {
  50. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  51. ARGUMENTS(args, callInfo);
  52. ScriptContext* scriptContext = function->GetScriptContext();
  53. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  54. Assert(!(callInfo.Flags & CallFlags_New));
  55. if (args.Info.Count >= 2 && JavascriptSIMDFloat64x2::Is(args[1]))
  56. {
  57. JavascriptSIMDFloat64x2 *instance = JavascriptSIMDFloat64x2::FromVar(args[1]);
  58. Assert(instance);
  59. return JavascriptSIMDInt32x4::FromFloat64x2(instance, scriptContext);
  60. }
  61. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("fromFloat64x2"));
  62. }
  63. Var SIMDInt32x4Lib::EntryFromFloat64x2Bits(RecyclableObject* function, CallInfo callInfo, ...)
  64. {
  65. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  66. ARGUMENTS(args, callInfo);
  67. ScriptContext* scriptContext = function->GetScriptContext();
  68. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  69. Assert(!(callInfo.Flags & CallFlags_New));
  70. if (args.Info.Count >= 2 && JavascriptSIMDFloat64x2::Is(args[1]))
  71. {
  72. JavascriptSIMDFloat64x2 *instance = JavascriptSIMDFloat64x2::FromVar(args[1]);
  73. Assert(instance);
  74. return SIMDUtils::SIMDConvertTypeFromBits<JavascriptSIMDFloat64x2, JavascriptSIMDInt32x4>(*instance, *scriptContext);
  75. }
  76. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("fromFloat64x2Bits"));
  77. }
  78. Var SIMDInt32x4Lib::EntryFromFloat32x4(RecyclableObject* function, CallInfo callInfo, ...)
  79. {
  80. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  81. ARGUMENTS(args, callInfo);
  82. ScriptContext* scriptContext = function->GetScriptContext();
  83. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  84. Assert(!(callInfo.Flags & CallFlags_New));
  85. if (args.Info.Count >= 2 && JavascriptSIMDFloat32x4::Is(args[1]))
  86. {
  87. JavascriptSIMDFloat32x4 *instance = JavascriptSIMDFloat32x4::FromVar(args[1]);
  88. Assert(instance);
  89. bool throws = false;
  90. SIMDValue result = SIMDInt32x4Operation::OpFromFloat32x4(instance->GetValue(), throws);
  91. // out of range
  92. if (throws)
  93. {
  94. JavascriptError::ThrowRangeError(scriptContext, JSERR_ArgumentOutOfRange, _u("SIMD.Int32x4.FromFloat32x4"));
  95. }
  96. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  97. }
  98. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("fromFloat32x4"));
  99. }
  100. Var SIMDInt32x4Lib::EntryFromFloat32x4Bits(RecyclableObject* function, CallInfo callInfo, ...)
  101. {
  102. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  103. ARGUMENTS(args, callInfo);
  104. ScriptContext* scriptContext = function->GetScriptContext();
  105. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  106. Assert(!(callInfo.Flags & CallFlags_New));
  107. if (args.Info.Count >= 2 && JavascriptSIMDFloat32x4::Is(args[1]))
  108. {
  109. JavascriptSIMDFloat32x4 *instance = JavascriptSIMDFloat32x4::FromVar(args[1]);
  110. Assert(instance);
  111. return SIMDUtils::SIMDConvertTypeFromBits<JavascriptSIMDFloat32x4, JavascriptSIMDInt32x4>(*instance, *scriptContext);
  112. }
  113. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("fromFloat32x4Bits"));
  114. }
  115. Var SIMDInt32x4Lib::EntryFromUint32x4Bits(RecyclableObject* function, CallInfo callInfo, ...)
  116. {
  117. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  118. ARGUMENTS(args, callInfo);
  119. ScriptContext* scriptContext = function->GetScriptContext();
  120. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  121. Assert(!(callInfo.Flags & CallFlags_New));
  122. if (args.Info.Count >= 2 && JavascriptSIMDUint32x4::Is(args[1]))
  123. {
  124. JavascriptSIMDUint32x4 *instance = JavascriptSIMDUint32x4::FromVar(args[1]);
  125. Assert(instance);
  126. return SIMDUtils::SIMDConvertTypeFromBits<JavascriptSIMDUint32x4, JavascriptSIMDInt32x4>(*instance, *scriptContext);
  127. }
  128. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("fromUint32x4Bits"));
  129. }
  130. Var SIMDInt32x4Lib::EntryFromUint8x16Bits(RecyclableObject* function, CallInfo callInfo, ...)
  131. {
  132. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  133. ARGUMENTS(args, callInfo);
  134. ScriptContext* scriptContext = function->GetScriptContext();
  135. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  136. Assert(!(callInfo.Flags & CallFlags_New));
  137. if (args.Info.Count >= 2 && JavascriptSIMDUint8x16::Is(args[1]))
  138. {
  139. JavascriptSIMDUint8x16 *instance = JavascriptSIMDUint8x16::FromVar(args[1]);
  140. Assert(instance);
  141. return SIMDUtils::SIMDConvertTypeFromBits<JavascriptSIMDUint8x16, JavascriptSIMDInt32x4>(*instance, *scriptContext);
  142. }
  143. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("fromUint8x16Bits"));
  144. }
  145. Var SIMDInt32x4Lib::EntryFromUint16x8Bits(RecyclableObject* function, CallInfo callInfo, ...)
  146. {
  147. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  148. ARGUMENTS(args, callInfo);
  149. ScriptContext* scriptContext = function->GetScriptContext();
  150. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  151. Assert(!(callInfo.Flags & CallFlags_New));
  152. if (args.Info.Count >= 2 && JavascriptSIMDUint16x8::Is(args[1]))
  153. {
  154. JavascriptSIMDUint16x8 *instance = JavascriptSIMDUint16x8::FromVar(args[1]);
  155. Assert(instance);
  156. return SIMDUtils::SIMDConvertTypeFromBits<JavascriptSIMDUint16x8, JavascriptSIMDInt32x4>(*instance, *scriptContext);
  157. }
  158. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("fromUint16x8Bits"));
  159. }
  160. Var SIMDInt32x4Lib::EntryFromInt8x16Bits(RecyclableObject* function, CallInfo callInfo, ...)
  161. {
  162. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  163. ARGUMENTS(args, callInfo);
  164. ScriptContext* scriptContext = function->GetScriptContext();
  165. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  166. Assert(!(callInfo.Flags & CallFlags_New));
  167. if (args.Info.Count >= 2 && JavascriptSIMDInt8x16::Is(args[1]))
  168. {
  169. JavascriptSIMDInt8x16 *instance = JavascriptSIMDInt8x16::FromVar(args[1]);
  170. Assert(instance);
  171. return SIMDUtils::SIMDConvertTypeFromBits<JavascriptSIMDInt8x16, JavascriptSIMDInt32x4>(*instance, *scriptContext);
  172. }
  173. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("fromInt8x16Bits"));
  174. }
  175. Var SIMDInt32x4Lib::EntryFromInt16x8Bits(RecyclableObject* function, CallInfo callInfo, ...)
  176. {
  177. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  178. ARGUMENTS(args, callInfo);
  179. ScriptContext* scriptContext = function->GetScriptContext();
  180. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  181. Assert(!(callInfo.Flags & CallFlags_New));
  182. if (args.Info.Count >= 2 && JavascriptSIMDInt16x8::Is(args[1]))
  183. {
  184. JavascriptSIMDInt16x8 *instance = JavascriptSIMDInt16x8::FromVar(args[1]);
  185. Assert(instance);
  186. return SIMDUtils::SIMDConvertTypeFromBits<JavascriptSIMDInt16x8, JavascriptSIMDInt32x4>(*instance, *scriptContext);
  187. }
  188. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("fromInt16x8Bits"));
  189. }
  190. //Lane Access
  191. Var SIMDInt32x4Lib::EntryExtractLane(RecyclableObject* function, CallInfo callInfo, ...)
  192. {
  193. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  194. ARGUMENTS(args, callInfo);
  195. ScriptContext* scriptContext = function->GetScriptContext();
  196. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  197. Assert(!(callInfo.Flags & CallFlags_New));
  198. // first arg has to be of type Int32x4, so cannot be missing.
  199. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]))
  200. {
  201. // if value arg is missing, then it is undefined.
  202. Var laneVar = args.Info.Count >= 3 ? args[2] : scriptContext->GetLibrary()->GetUndefined();
  203. int result = SIMDUtils::SIMD128ExtractLane<JavascriptSIMDInt32x4, 4, int>(args[1], laneVar, scriptContext);
  204. return JavascriptNumber::ToVarNoCheck(result, scriptContext);
  205. }
  206. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("ExtractLane"));
  207. }
  208. Var SIMDInt32x4Lib::EntryReplaceLane(RecyclableObject* function, CallInfo callInfo, ...)
  209. {
  210. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  211. ARGUMENTS(args, callInfo);
  212. ScriptContext* scriptContext = function->GetScriptContext();
  213. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  214. Assert(!(callInfo.Flags & CallFlags_New));
  215. // first arg has to be of type Int32x4, so cannot be missing.
  216. if (args.Info.Count >= 4 && JavascriptSIMDInt32x4::Is(args[1]))
  217. {
  218. // if value arg is missing, then it is undefined.
  219. Var laneVar = args.Info.Count >= 4 ? args[2] : scriptContext->GetLibrary()->GetUndefined();
  220. Var argVal = args.Info.Count >= 4 ? args[3] : scriptContext->GetLibrary()->GetUndefined();
  221. int value = JavascriptConversion::ToInt32(argVal, scriptContext);
  222. SIMDValue result = SIMDUtils::SIMD128ReplaceLane<JavascriptSIMDInt32x4, 4, int>(args[1], laneVar, value, scriptContext);
  223. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  224. }
  225. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("ReplaceLane"));
  226. }
  227. Var SIMDInt32x4Lib::EntryAbs(RecyclableObject* function, CallInfo callInfo, ...)
  228. {
  229. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  230. ARGUMENTS(args, callInfo);
  231. ScriptContext* scriptContext = function->GetScriptContext();
  232. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  233. Assert(!(callInfo.Flags & CallFlags_New));
  234. if (args.Info.Count >= 2 && JavascriptSIMDInt32x4::Is(args[1]))
  235. {
  236. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  237. Assert(a);
  238. SIMDValue value, result;
  239. value = a->GetValue();
  240. result = SIMDInt32x4Operation::OpAbs(value);
  241. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  242. }
  243. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("abs"));
  244. }
  245. Var SIMDInt32x4Lib::EntryNeg(RecyclableObject* function, CallInfo callInfo, ...)
  246. {
  247. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  248. ARGUMENTS(args, callInfo);
  249. ScriptContext* scriptContext = function->GetScriptContext();
  250. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  251. Assert(!(callInfo.Flags & CallFlags_New));
  252. if (args.Info.Count >= 2 && JavascriptSIMDInt32x4::Is(args[1]))
  253. {
  254. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  255. Assert(a);
  256. SIMDValue value, result;
  257. value = a->GetValue();
  258. result = SIMDInt32x4Operation::OpNeg(value);
  259. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  260. }
  261. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("neg"));
  262. }
  263. Var SIMDInt32x4Lib::EntryNot(RecyclableObject* function, CallInfo callInfo, ...)
  264. {
  265. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  266. ARGUMENTS(args, callInfo);
  267. ScriptContext* scriptContext = function->GetScriptContext();
  268. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  269. Assert(!(callInfo.Flags & CallFlags_New));
  270. if (args.Info.Count >= 2 && JavascriptSIMDInt32x4::Is(args[1]))
  271. {
  272. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  273. Assert(a);
  274. SIMDValue value, result;
  275. value = a->GetValue();
  276. result = SIMDInt32x4Operation::OpNot(value);
  277. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  278. }
  279. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("not"));
  280. }
  281. Var SIMDInt32x4Lib::EntryAdd(RecyclableObject* function, CallInfo callInfo, ...)
  282. {
  283. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  284. ARGUMENTS(args, callInfo);
  285. ScriptContext* scriptContext = function->GetScriptContext();
  286. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  287. Assert(!(callInfo.Flags & CallFlags_New));
  288. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  289. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  290. {
  291. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  292. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  293. Assert(a && b);
  294. SIMDValue result, aValue, bValue;
  295. aValue = a->GetValue();
  296. bValue = b->GetValue();
  297. result = SIMDInt32x4Operation::OpAdd(aValue, bValue);
  298. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  299. }
  300. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("add"));
  301. }
  302. Var SIMDInt32x4Lib::EntrySub(RecyclableObject* function, CallInfo callInfo, ...)
  303. {
  304. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  305. ARGUMENTS(args, callInfo);
  306. ScriptContext* scriptContext = function->GetScriptContext();
  307. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  308. Assert(!(callInfo.Flags & CallFlags_New));
  309. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  310. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  311. {
  312. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  313. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  314. Assert(a && b);
  315. SIMDValue result, aValue, bValue;
  316. aValue = a->GetValue();
  317. bValue = b->GetValue();
  318. result = SIMDInt32x4Operation::OpSub(aValue, bValue);
  319. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  320. }
  321. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("sub"));
  322. }
  323. Var SIMDInt32x4Lib::EntryMul(RecyclableObject* function, CallInfo callInfo, ...)
  324. {
  325. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  326. ARGUMENTS(args, callInfo);
  327. ScriptContext* scriptContext = function->GetScriptContext();
  328. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  329. Assert(!(callInfo.Flags & CallFlags_New));
  330. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  331. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  332. {
  333. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  334. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  335. Assert(a && b);
  336. SIMDValue result, aValue, bValue;
  337. aValue = a->GetValue();
  338. bValue = b->GetValue();
  339. result = SIMDInt32x4Operation::OpMul(aValue, bValue);
  340. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  341. }
  342. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("mul"));
  343. }
  344. Var SIMDInt32x4Lib::EntryAnd(RecyclableObject* function, CallInfo callInfo, ...)
  345. {
  346. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  347. ARGUMENTS(args, callInfo);
  348. ScriptContext* scriptContext = function->GetScriptContext();
  349. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  350. Assert(!(callInfo.Flags & CallFlags_New));
  351. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  352. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  353. {
  354. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  355. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  356. Assert(a && b);
  357. SIMDValue result, aValue, bValue;
  358. aValue = a->GetValue();
  359. bValue = b->GetValue();
  360. result = SIMDInt32x4Operation::OpAnd(aValue, bValue);
  361. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  362. }
  363. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("and"));
  364. }
  365. Var SIMDInt32x4Lib::EntryOr(RecyclableObject* function, CallInfo callInfo, ...)
  366. {
  367. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  368. ARGUMENTS(args, callInfo);
  369. ScriptContext* scriptContext = function->GetScriptContext();
  370. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  371. Assert(!(callInfo.Flags & CallFlags_New));
  372. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  373. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  374. {
  375. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  376. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  377. Assert(a && b);
  378. SIMDValue result, aValue, bValue;
  379. aValue = a->GetValue();
  380. bValue = b->GetValue();
  381. result = SIMDInt32x4Operation::OpOr(aValue, bValue);
  382. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  383. }
  384. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("or"));
  385. }
  386. Var SIMDInt32x4Lib::EntryXor(RecyclableObject* function, CallInfo callInfo, ...)
  387. {
  388. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  389. ARGUMENTS(args, callInfo);
  390. ScriptContext* scriptContext = function->GetScriptContext();
  391. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  392. Assert(!(callInfo.Flags & CallFlags_New));
  393. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  394. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  395. {
  396. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  397. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  398. Assert(a && b);
  399. SIMDValue result, aValue, bValue;
  400. aValue = a->GetValue();
  401. bValue = b->GetValue();
  402. result = SIMDInt32x4Operation::OpXor(aValue, bValue);
  403. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  404. }
  405. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("xor"));
  406. }
  407. Var SIMDInt32x4Lib::EntryMin(RecyclableObject* function, CallInfo callInfo, ...)
  408. {
  409. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  410. ARGUMENTS(args, callInfo);
  411. ScriptContext* scriptContext = function->GetScriptContext();
  412. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  413. Assert(!(callInfo.Flags & CallFlags_New));
  414. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  415. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  416. {
  417. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  418. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  419. Assert(a && b);
  420. SIMDValue result, aValue, bValue;
  421. aValue = a->GetValue();
  422. bValue = b->GetValue();
  423. result = SIMDInt32x4Operation::OpMin(aValue, bValue);
  424. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  425. }
  426. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("min"));
  427. }
  428. Var SIMDInt32x4Lib::EntryMax(RecyclableObject* function, CallInfo callInfo, ...)
  429. {
  430. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  431. ARGUMENTS(args, callInfo);
  432. ScriptContext* scriptContext = function->GetScriptContext();
  433. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  434. Assert(!(callInfo.Flags & CallFlags_New));
  435. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  436. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  437. {
  438. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  439. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  440. Assert(a && b);
  441. SIMDValue result, aValue, bValue;
  442. aValue = a->GetValue();
  443. bValue = b->GetValue();
  444. result = SIMDInt32x4Operation::OpMax(aValue, bValue);
  445. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  446. }
  447. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("max"));
  448. }
  449. Var SIMDInt32x4Lib::EntryLessThan(RecyclableObject* function, CallInfo callInfo, ...)
  450. {
  451. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  452. ARGUMENTS(args, callInfo);
  453. ScriptContext* scriptContext = function->GetScriptContext();
  454. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  455. Assert(!(callInfo.Flags & CallFlags_New));
  456. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  457. // strict type on both operands
  458. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  459. {
  460. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  461. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  462. Assert(a && b);
  463. SIMDValue result, aValue, bValue;
  464. aValue = a->GetValue();
  465. bValue = b->GetValue();
  466. result = SIMDInt32x4Operation::OpLessThan(aValue, bValue);
  467. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  468. }
  469. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("lessThan"));
  470. }
  471. Var SIMDInt32x4Lib::EntryLessThanOrEqual(RecyclableObject* function, CallInfo callInfo, ...)
  472. {
  473. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  474. ARGUMENTS(args, callInfo);
  475. ScriptContext* scriptContext = function->GetScriptContext();
  476. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  477. Assert(!(callInfo.Flags & CallFlags_New));
  478. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  479. // strict type on both operands
  480. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  481. {
  482. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  483. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  484. Assert(a && b);
  485. SIMDValue result, aValue, bValue;
  486. aValue = a->GetValue();
  487. bValue = b->GetValue();
  488. result = SIMDInt32x4Operation::OpLessThanOrEqual(aValue, bValue);
  489. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  490. }
  491. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("lessThanOrEqual"));
  492. }
  493. Var SIMDInt32x4Lib::EntryEqual(RecyclableObject* function, CallInfo callInfo, ...)
  494. {
  495. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  496. ARGUMENTS(args, callInfo);
  497. ScriptContext* scriptContext = function->GetScriptContext();
  498. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  499. Assert(!(callInfo.Flags & CallFlags_New));
  500. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  501. // strict type on both operands
  502. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  503. {
  504. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  505. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  506. Assert(a && b);
  507. SIMDValue result, aValue, bValue;
  508. aValue = a->GetValue();
  509. bValue = b->GetValue();
  510. result = SIMDInt32x4Operation::OpEqual(aValue, bValue);
  511. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  512. }
  513. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("equal"));
  514. }
  515. Var SIMDInt32x4Lib::EntryNotEqual(RecyclableObject* function, CallInfo callInfo, ...)
  516. {
  517. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  518. ARGUMENTS(args, callInfo);
  519. ScriptContext* scriptContext = function->GetScriptContext();
  520. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  521. Assert(!(callInfo.Flags & CallFlags_New));
  522. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  523. // strict type on both operands
  524. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  525. {
  526. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  527. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  528. Assert(a && b);
  529. SIMDValue result, aValue, bValue;
  530. aValue = a->GetValue();
  531. bValue = b->GetValue();
  532. result = SIMDInt32x4Operation::OpNotEqual(aValue, bValue);
  533. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  534. }
  535. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("notEqual"));
  536. }
  537. Var SIMDInt32x4Lib::EntryGreaterThan(RecyclableObject* function, CallInfo callInfo, ...)
  538. {
  539. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  540. ARGUMENTS(args, callInfo);
  541. ScriptContext* scriptContext = function->GetScriptContext();
  542. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  543. Assert(!(callInfo.Flags & CallFlags_New));
  544. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  545. // strict type on both operands
  546. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  547. {
  548. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  549. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  550. Assert(a && b);
  551. SIMDValue result, aValue, bValue;
  552. aValue = a->GetValue();
  553. bValue = b->GetValue();
  554. result = SIMDInt32x4Operation::OpGreaterThan(aValue, bValue);
  555. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  556. }
  557. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("greaterThan"));
  558. }
  559. Var SIMDInt32x4Lib::EntryGreaterThanOrEqual(RecyclableObject* function, CallInfo callInfo, ...)
  560. {
  561. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  562. ARGUMENTS(args, callInfo);
  563. ScriptContext* scriptContext = function->GetScriptContext();
  564. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  565. Assert(!(callInfo.Flags & CallFlags_New));
  566. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  567. // strict type on both operands
  568. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  569. {
  570. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  571. JavascriptSIMDInt32x4 *b = JavascriptSIMDInt32x4::FromVar(args[2]);
  572. Assert(a && b);
  573. SIMDValue result, aValue, bValue;
  574. aValue = a->GetValue();
  575. bValue = b->GetValue();
  576. result = SIMDInt32x4Operation::OpGreaterThanOrEqual(aValue, bValue);
  577. return JavascriptSIMDBool32x4::New(&result, scriptContext);
  578. }
  579. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("greaterThanOrEqual"));
  580. }
  581. Var SIMDInt32x4Lib::EntrySwizzle(RecyclableObject* function, CallInfo callInfo, ...)
  582. {
  583. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  584. ARGUMENTS(args, callInfo);
  585. ScriptContext* scriptContext = function->GetScriptContext();
  586. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  587. Assert(!(callInfo.Flags & CallFlags_New));
  588. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  589. // strict type on both operands
  590. if (args.Info.Count >= 2 && JavascriptSIMDInt32x4::Is(args[1]))
  591. {
  592. // type check on lane indices
  593. if (args.Info.Count < 6)
  594. {
  595. // missing lane args
  596. JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedNumber, _u("Lane index"));
  597. }
  598. Var lanes[4];
  599. lanes[0] = args[2];
  600. lanes[1] = args[3];
  601. lanes[2] = args[4];
  602. lanes[3] = args[5];
  603. return SIMDUtils::SIMD128SlowShuffle<JavascriptSIMDInt32x4>(args[1], args[1], lanes, 4, 4, scriptContext);
  604. }
  605. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("swizzle"));
  606. }
  607. Var SIMDInt32x4Lib::EntryShuffle(RecyclableObject* function, CallInfo callInfo, ...)
  608. {
  609. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  610. ARGUMENTS(args, callInfo);
  611. ScriptContext* scriptContext = function->GetScriptContext();
  612. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  613. Assert(!(callInfo.Flags & CallFlags_New));
  614. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  615. // strict type on both operands
  616. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]) && JavascriptSIMDInt32x4::Is(args[2]))
  617. {
  618. // type check on lane indices
  619. if (args.Info.Count < 7)
  620. {
  621. // missing lane args
  622. JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedNumber, _u("Lane index"));
  623. }
  624. Var lanes[4];
  625. lanes[0] = args[3];
  626. lanes[1] = args[4];
  627. lanes[2] = args[5];
  628. lanes[3] = args[6];
  629. return SIMDUtils::SIMD128SlowShuffle<JavascriptSIMDInt32x4>(args[1], args[2], lanes, 4, 8, scriptContext);
  630. }
  631. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("shuffle"));
  632. }
  633. Var SIMDInt32x4Lib::EntryShiftLeftByScalar(RecyclableObject* function, CallInfo callInfo, ...)
  634. {
  635. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  636. ARGUMENTS(args, callInfo);
  637. ScriptContext* scriptContext = function->GetScriptContext();
  638. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  639. Assert(!(callInfo.Flags & CallFlags_New));
  640. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]))
  641. {
  642. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  643. Assert(a);
  644. SIMDValue result, aValue;
  645. aValue = a->GetValue();
  646. Var countVar = args[2]; // {int} bits Bit count
  647. int32 count = JavascriptConversion::ToInt32(countVar, scriptContext);
  648. result = SIMDInt32x4Operation::OpShiftLeftByScalar(aValue, count);
  649. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  650. }
  651. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("shiftLeft"));
  652. }
  653. Var SIMDInt32x4Lib::EntryShiftRightByScalar(RecyclableObject* function, CallInfo callInfo, ...)
  654. {
  655. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  656. ARGUMENTS(args, callInfo);
  657. ScriptContext* scriptContext = function->GetScriptContext();
  658. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  659. Assert(!(callInfo.Flags & CallFlags_New));
  660. if (args.Info.Count >= 3 && JavascriptSIMDInt32x4::Is(args[1]))
  661. {
  662. JavascriptSIMDInt32x4 *a = JavascriptSIMDInt32x4::FromVar(args[1]);
  663. Assert(a);
  664. SIMDValue result, aValue;
  665. aValue = a->GetValue();
  666. Var countVar = args[2]; // {int} bits Bit count
  667. int32 count = JavascriptConversion::ToInt32(countVar, scriptContext);
  668. result = SIMDInt32x4Operation::OpShiftRightByScalar(aValue, count);
  669. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  670. }
  671. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("shiftRightByScalar"));
  672. }
  673. Var SIMDInt32x4Lib::EntrySelect(RecyclableObject* function, CallInfo callInfo, ...)
  674. {
  675. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  676. ARGUMENTS(args, callInfo);
  677. ScriptContext* scriptContext = function->GetScriptContext();
  678. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  679. Assert(!(callInfo.Flags & CallFlags_New));
  680. if (args.Info.Count >= 4 && JavascriptSIMDBool32x4::Is(args[1]) &&
  681. JavascriptSIMDInt32x4::Is(args[2]) && JavascriptSIMDInt32x4::Is(args[3]))
  682. {
  683. JavascriptSIMDBool32x4 *m = JavascriptSIMDBool32x4::FromVar(args[1]);
  684. JavascriptSIMDInt32x4 *t = JavascriptSIMDInt32x4::FromVar(args[2]);
  685. JavascriptSIMDInt32x4 *f = JavascriptSIMDInt32x4::FromVar(args[3]);
  686. Assert(m && t && f);
  687. SIMDValue result, maskValue, trueValue, falseValue;
  688. maskValue = m->GetValue();
  689. trueValue = t->GetValue();
  690. falseValue = f->GetValue();
  691. result = SIMDInt32x4Operation::OpSelect(maskValue, trueValue, falseValue);
  692. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  693. }
  694. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, _u("select"));
  695. }
  696. Var SIMDInt32x4Lib::EntryLoad(RecyclableObject* function, CallInfo callInfo, ...)
  697. {
  698. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  699. ARGUMENTS(args, callInfo);
  700. ScriptContext* scriptContext = function->GetScriptContext();
  701. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  702. Assert(!(callInfo.Flags & CallFlags_New));
  703. Var tarray;
  704. Var index;
  705. if (args.Info.Count > 1)
  706. {
  707. tarray = args[1];
  708. }
  709. else
  710. {
  711. tarray = scriptContext->GetLibrary()->GetUndefined();
  712. }
  713. if (args.Info.Count > 2)
  714. {
  715. index = args[2];
  716. }
  717. else
  718. {
  719. index = scriptContext->GetLibrary()->GetUndefined();
  720. }
  721. return SIMDUtils::SIMD128TypedArrayLoad<JavascriptSIMDInt32x4>(tarray, index, 4 * INT32_SIZE, scriptContext);
  722. }
  723. Var SIMDInt32x4Lib::EntryLoad1(RecyclableObject* function, CallInfo callInfo, ...)
  724. {
  725. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  726. ARGUMENTS(args, callInfo);
  727. ScriptContext* scriptContext = function->GetScriptContext();
  728. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  729. Assert(!(callInfo.Flags & CallFlags_New));
  730. Var tarray;
  731. Var index;
  732. if (args.Info.Count > 1)
  733. {
  734. tarray = args[1];
  735. }
  736. else
  737. {
  738. tarray = scriptContext->GetLibrary()->GetUndefined();
  739. }
  740. if (args.Info.Count > 2)
  741. {
  742. index = args[2];
  743. }
  744. else
  745. {
  746. index = scriptContext->GetLibrary()->GetUndefined();
  747. }
  748. return SIMDUtils::SIMD128TypedArrayLoad<JavascriptSIMDInt32x4>(tarray, index, 1 * INT32_SIZE, scriptContext);
  749. }
  750. Var SIMDInt32x4Lib::EntryLoad2(RecyclableObject* function, CallInfo callInfo, ...)
  751. {
  752. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  753. ARGUMENTS(args, callInfo);
  754. ScriptContext* scriptContext = function->GetScriptContext();
  755. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  756. Assert(!(callInfo.Flags & CallFlags_New));
  757. Var tarray;
  758. Var index;
  759. if (args.Info.Count > 1)
  760. {
  761. tarray = args[1];
  762. }
  763. else
  764. {
  765. tarray = scriptContext->GetLibrary()->GetUndefined();
  766. }
  767. if (args.Info.Count > 2)
  768. {
  769. index = args[2];
  770. }
  771. else
  772. {
  773. index = scriptContext->GetLibrary()->GetUndefined();
  774. }
  775. return SIMDUtils::SIMD128TypedArrayLoad<JavascriptSIMDInt32x4>(tarray, index, 2 * INT32_SIZE, scriptContext);
  776. }
  777. Var SIMDInt32x4Lib::EntryLoad3(RecyclableObject* function, CallInfo callInfo, ...)
  778. {
  779. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  780. ARGUMENTS(args, callInfo);
  781. ScriptContext* scriptContext = function->GetScriptContext();
  782. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  783. Assert(!(callInfo.Flags & CallFlags_New));
  784. Var tarray;
  785. Var index;
  786. if (args.Info.Count > 1)
  787. {
  788. tarray = args[1];
  789. }
  790. else
  791. {
  792. tarray = scriptContext->GetLibrary()->GetUndefined();
  793. }
  794. if (args.Info.Count > 2)
  795. {
  796. index = args[2];
  797. }
  798. else
  799. {
  800. index = scriptContext->GetLibrary()->GetUndefined();
  801. }
  802. return SIMDUtils::SIMD128TypedArrayLoad<JavascriptSIMDInt32x4>(tarray, index, 3 * INT32_SIZE, scriptContext);
  803. }
  804. Var SIMDInt32x4Lib::EntryStore(RecyclableObject* function, CallInfo callInfo, ...)
  805. {
  806. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  807. ARGUMENTS(args, callInfo);
  808. ScriptContext* scriptContext = function->GetScriptContext();
  809. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  810. Assert(!(callInfo.Flags & CallFlags_New));
  811. if (args.Info.Count >= 4 && JavascriptSIMDInt32x4::Is(args[3]))
  812. {
  813. SIMDUtils::SIMD128TypedArrayStore<JavascriptSIMDInt32x4>(args[1], args[2], args[3], 4 * INT32_SIZE, scriptContext);
  814. return JavascriptSIMDInt32x4::FromVar(args[3]);
  815. }
  816. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInvalidArgType, _u("SIMD.Int32x4.store"));
  817. }
  818. Var SIMDInt32x4Lib::EntryStore1(RecyclableObject* function, CallInfo callInfo, ...)
  819. {
  820. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  821. ARGUMENTS(args, callInfo);
  822. ScriptContext* scriptContext = function->GetScriptContext();
  823. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  824. Assert(!(callInfo.Flags & CallFlags_New));
  825. if (args.Info.Count >= 4 && JavascriptSIMDInt32x4::Is(args[3]))
  826. {
  827. SIMDUtils::SIMD128TypedArrayStore<JavascriptSIMDInt32x4>(args[1], args[2], args[3], 1 * INT32_SIZE, scriptContext);
  828. return JavascriptSIMDInt32x4::FromVar(args[3]);
  829. }
  830. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInvalidArgType, _u("SIMD.Int32x4.store"));
  831. }
  832. Var SIMDInt32x4Lib::EntryStore2(RecyclableObject* function, CallInfo callInfo, ...)
  833. {
  834. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  835. ARGUMENTS(args, callInfo);
  836. ScriptContext* scriptContext = function->GetScriptContext();
  837. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  838. Assert(!(callInfo.Flags & CallFlags_New));
  839. if (args.Info.Count >= 4 && JavascriptSIMDInt32x4::Is(args[3]))
  840. {
  841. SIMDUtils::SIMD128TypedArrayStore<JavascriptSIMDInt32x4>(args[1], args[2], args[3], 2 * INT32_SIZE, scriptContext);
  842. return JavascriptSIMDInt32x4::FromVar(args[3]);
  843. }
  844. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInvalidArgType, _u("SIMD.Int32x4.store"));
  845. }
  846. Var SIMDInt32x4Lib::EntryStore3(RecyclableObject* function, CallInfo callInfo, ...)
  847. {
  848. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  849. ARGUMENTS(args, callInfo);
  850. ScriptContext* scriptContext = function->GetScriptContext();
  851. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  852. Assert(!(callInfo.Flags & CallFlags_New));
  853. if (args.Info.Count >= 4 && JavascriptSIMDInt32x4::Is(args[3]))
  854. {
  855. SIMDUtils::SIMD128TypedArrayStore<JavascriptSIMDInt32x4>(args[1], args[2], args[3], 3 * INT32_SIZE, scriptContext);
  856. return JavascriptSIMDInt32x4::FromVar(args[3]);
  857. }
  858. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInvalidArgType, _u("SIMD.Int32x4.store"));
  859. }
  860. }