SimdUint8x16Lib.cpp 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921
  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. namespace Js
  7. {
  8. Var SIMDUint8x16Lib::EntryUint8x16(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));
  15. Var undefinedVar = scriptContext->GetLibrary()->GetUndefined();
  16. uint8 uintSIMDX0 = JavascriptConversion::ToUInt8(args.Info.Count >= 2 ? args[1] : undefinedVar, scriptContext);
  17. uint8 uintSIMDX1 = JavascriptConversion::ToUInt8(args.Info.Count >= 3 ? args[2] : undefinedVar, scriptContext);
  18. uint8 uintSIMDX2 = JavascriptConversion::ToUInt8(args.Info.Count >= 4 ? args[3] : undefinedVar, scriptContext);
  19. uint8 uintSIMDX3 = JavascriptConversion::ToUInt8(args.Info.Count >= 5 ? args[4] : undefinedVar, scriptContext);
  20. uint8 uintSIMDX4 = JavascriptConversion::ToUInt8(args.Info.Count >= 6 ? args[5] : undefinedVar, scriptContext);
  21. uint8 uintSIMDX5 = JavascriptConversion::ToUInt8(args.Info.Count >= 7 ? args[6] : undefinedVar, scriptContext);
  22. uint8 uintSIMDX6 = JavascriptConversion::ToUInt8(args.Info.Count >= 8 ? args[7] : undefinedVar, scriptContext);
  23. uint8 uintSIMDX7 = JavascriptConversion::ToUInt8(args.Info.Count >= 9 ? args[8] : undefinedVar, scriptContext);
  24. uint8 uintSIMDX8 = JavascriptConversion::ToUInt8(args.Info.Count >= 10 ? args[9] : undefinedVar, scriptContext);
  25. uint8 uintSIMDX9 = JavascriptConversion::ToUInt8(args.Info.Count >= 11 ? args[10] : undefinedVar, scriptContext);
  26. uint8 uintSIMDX10 = JavascriptConversion::ToUInt8(args.Info.Count >= 12 ? args[11] : undefinedVar, scriptContext);
  27. uint8 uintSIMDX11 = JavascriptConversion::ToUInt8(args.Info.Count >= 13 ? args[12] : undefinedVar, scriptContext);
  28. uint8 uintSIMDX12 = JavascriptConversion::ToUInt8(args.Info.Count >= 14 ? args[13] : undefinedVar, scriptContext);
  29. uint8 uintSIMDX13 = JavascriptConversion::ToUInt8(args.Info.Count >= 15 ? args[14] : undefinedVar, scriptContext);
  30. uint8 uintSIMDX14 = JavascriptConversion::ToUInt8(args.Info.Count >= 16 ? args[15] : undefinedVar, scriptContext);
  31. uint8 uintSIMDX15 = JavascriptConversion::ToUInt8(args.Info.Count >= 17 ? args[16] : undefinedVar, scriptContext);
  32. SIMDValue lanes = SIMDUint8x16Operation::OpUint8x16(uintSIMDX0, uintSIMDX1, uintSIMDX2, uintSIMDX3
  33. , uintSIMDX4, uintSIMDX5, uintSIMDX6, uintSIMDX7
  34. , uintSIMDX8, uintSIMDX9, uintSIMDX10, uintSIMDX11
  35. , uintSIMDX12, uintSIMDX13, uintSIMDX14, uintSIMDX15);
  36. return JavascriptSIMDUint8x16::New(&lanes, scriptContext);
  37. }
  38. Var SIMDUint8x16Lib::EntryCheck(RecyclableObject* function, CallInfo callInfo, ...)
  39. {
  40. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  41. ARGUMENTS(args, callInfo);
  42. ScriptContext* scriptContext = function->GetScriptContext();
  43. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  44. Assert(!(callInfo.Flags & CallFlags_New));
  45. if (args.Info.Count >= 2 && JavascriptSIMDUint8x16::Is(args[1]))
  46. {
  47. return args[1];
  48. }
  49. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"Uint8x16");
  50. }
  51. Var SIMDUint8x16Lib::EntrySplat(RecyclableObject* function, CallInfo callInfo, ...)
  52. {
  53. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  54. ARGUMENTS(args, callInfo);
  55. ScriptContext* scriptContext = function->GetScriptContext();
  56. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  57. Assert(!(callInfo.Flags & CallFlags_New));
  58. Var undefinedVar = scriptContext->GetLibrary()->GetUndefined();
  59. uint8 value = JavascriptConversion::ToUInt8(args.Info.Count >= 2 ? args[1] : undefinedVar, scriptContext);
  60. SIMDValue lanes = SIMDInt8x16Operation::OpSplat(value);
  61. return JavascriptSIMDUint8x16::New(&lanes, scriptContext);
  62. }
  63. Var SIMDUint8x16Lib::EntryFromFloat32x4Bits(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 && JavascriptSIMDFloat32x4::Is(args[1]))
  71. {
  72. JavascriptSIMDFloat32x4 *instance = JavascriptSIMDFloat32x4::FromVar(args[1]);
  73. Assert(instance);
  74. return SIMDConvertTypeFromBits<JavascriptSIMDFloat32x4, JavascriptSIMDUint8x16>(instance, scriptContext);
  75. }
  76. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"fromFloat32x4Bits");
  77. }
  78. Var SIMDUint8x16Lib::EntryFromInt32x4Bits(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 && JavascriptSIMDInt32x4::Is(args[1]))
  86. {
  87. JavascriptSIMDInt32x4 *instance = JavascriptSIMDInt32x4::FromVar(args[1]);
  88. Assert(instance);
  89. return SIMDConvertTypeFromBits<JavascriptSIMDInt32x4, JavascriptSIMDUint8x16>(instance, scriptContext);
  90. }
  91. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"fromInt32x4Bits");
  92. }
  93. Var SIMDUint8x16Lib::EntryFromInt16x8Bits(RecyclableObject* function, CallInfo callInfo, ...)
  94. {
  95. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  96. ARGUMENTS(args, callInfo);
  97. ScriptContext* scriptContext = function->GetScriptContext();
  98. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  99. Assert(!(callInfo.Flags & CallFlags_New));
  100. if (args.Info.Count >= 2 && JavascriptSIMDInt16x8::Is(args[1]))
  101. {
  102. JavascriptSIMDInt16x8 *instance = JavascriptSIMDInt16x8::FromVar(args[1]);
  103. Assert(instance);
  104. return SIMDConvertTypeFromBits<JavascriptSIMDInt16x8, JavascriptSIMDUint8x16>(instance, scriptContext);
  105. }
  106. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"fromInt16x8Bits");
  107. }
  108. Var SIMDUint8x16Lib::EntryFromInt8x16Bits(RecyclableObject* function, CallInfo callInfo, ...)
  109. {
  110. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  111. ARGUMENTS(args, callInfo);
  112. ScriptContext* scriptContext = function->GetScriptContext();
  113. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  114. Assert(!(callInfo.Flags & CallFlags_New));
  115. if (args.Info.Count >= 2 && JavascriptSIMDInt8x16::Is(args[1]))
  116. {
  117. JavascriptSIMDInt8x16 *instance = JavascriptSIMDInt8x16::FromVar(args[1]);
  118. Assert(instance);
  119. return SIMDConvertTypeFromBits<JavascriptSIMDInt8x16, JavascriptSIMDUint8x16>(instance, scriptContext);
  120. }
  121. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"fromInt8x16Bits");
  122. }
  123. Var SIMDUint8x16Lib::EntryFromUint32x4Bits(RecyclableObject* function, CallInfo callInfo, ...)
  124. {
  125. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  126. ARGUMENTS(args, callInfo);
  127. ScriptContext* scriptContext = function->GetScriptContext();
  128. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  129. Assert(!(callInfo.Flags & CallFlags_New));
  130. if (args.Info.Count >= 2 && JavascriptSIMDUint32x4::Is(args[1]))
  131. {
  132. JavascriptSIMDUint32x4 *instance = JavascriptSIMDUint32x4::FromVar(args[1]);
  133. Assert(instance);
  134. return SIMDConvertTypeFromBits<JavascriptSIMDUint32x4, JavascriptSIMDUint8x16>(instance, scriptContext);
  135. }
  136. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"fromUint32x4Bits");
  137. }
  138. Var SIMDUint8x16Lib::EntryFromUint16x8Bits(RecyclableObject* function, CallInfo callInfo, ...)
  139. {
  140. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  141. ARGUMENTS(args, callInfo);
  142. ScriptContext* scriptContext = function->GetScriptContext();
  143. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  144. Assert(!(callInfo.Flags & CallFlags_New));
  145. if (args.Info.Count >= 2 && JavascriptSIMDUint16x8::Is(args[1]))
  146. {
  147. JavascriptSIMDUint16x8 *instance = JavascriptSIMDUint16x8::FromVar(args[1]);
  148. Assert(instance);
  149. return SIMDConvertTypeFromBits<JavascriptSIMDUint16x8, JavascriptSIMDUint8x16>(instance, scriptContext);
  150. }
  151. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"fromUint16x8Bits");
  152. }
  153. Var SIMDUint8x16Lib::EntryMin(RecyclableObject* function, CallInfo callInfo, ...)
  154. {
  155. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  156. ARGUMENTS(args, callInfo);
  157. ScriptContext* scriptContext = function->GetScriptContext();
  158. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  159. Assert(!(callInfo.Flags & CallFlags_New));
  160. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  161. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  162. {
  163. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  164. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  165. Assert(a && b);
  166. SIMDValue result, aValue, bValue;
  167. aValue = a->GetValue();
  168. bValue = b->GetValue();
  169. result = SIMDUint8x16Operation::OpMin(aValue, bValue);
  170. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  171. }
  172. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"min");
  173. }
  174. Var SIMDUint8x16Lib::EntryMax(RecyclableObject* function, CallInfo callInfo, ...)
  175. {
  176. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  177. ARGUMENTS(args, callInfo);
  178. ScriptContext* scriptContext = function->GetScriptContext();
  179. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  180. Assert(!(callInfo.Flags & CallFlags_New));
  181. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  182. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  183. {
  184. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  185. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  186. Assert(a && b);
  187. SIMDValue result, aValue, bValue;
  188. aValue = a->GetValue();
  189. bValue = b->GetValue();
  190. result = SIMDUint8x16Operation::OpMax(aValue, bValue);
  191. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  192. }
  193. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"max");
  194. }
  195. Var SIMDUint8x16Lib::EntryLoad(RecyclableObject* function, CallInfo callInfo, ...)
  196. {
  197. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  198. ARGUMENTS(args, callInfo);
  199. ScriptContext* scriptContext = function->GetScriptContext();
  200. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  201. Assert(!(callInfo.Flags & CallFlags_New));
  202. return SIMD128TypedArrayLoad<JavascriptSIMDUint8x16>(args[1], args[2], 16 * INT8_SIZE, scriptContext);
  203. }
  204. Var SIMDUint8x16Lib::EntryStore(RecyclableObject* function, CallInfo callInfo, ...)
  205. {
  206. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  207. ARGUMENTS(args, callInfo);
  208. ScriptContext* scriptContext = function->GetScriptContext();
  209. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  210. Assert(!(callInfo.Flags & CallFlags_New));
  211. if (args.Info.Count >= 4 && JavascriptSIMDUint8x16::Is(args[3]))
  212. {
  213. SIMD128TypedArrayStore<JavascriptSIMDUint8x16>(args[1], args[2], args[3], 16 * INT8_SIZE, scriptContext);
  214. return NULL;
  215. }
  216. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInvalidArgType, L"SIMD.Uint8x16.store");
  217. }
  218. Var SIMDUint8x16Lib::EntryNot(RecyclableObject* function, CallInfo callInfo, ...)
  219. {
  220. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  221. ARGUMENTS(args, callInfo);
  222. ScriptContext* scriptContext = function->GetScriptContext();
  223. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  224. Assert(!(callInfo.Flags & CallFlags_New));
  225. if (args.Info.Count >= 2 && JavascriptSIMDUint8x16::Is(args[1]))
  226. {
  227. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  228. Assert(a);
  229. SIMDValue value, result;
  230. value = a->GetValue();
  231. result = SIMDInt32x4Operation::OpNot(value);
  232. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  233. }
  234. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"not");
  235. }
  236. Var SIMDUint8x16Lib::EntryAdd(RecyclableObject* function, CallInfo callInfo, ...)
  237. {
  238. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  239. ARGUMENTS(args, callInfo);
  240. ScriptContext* scriptContext = function->GetScriptContext();
  241. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  242. Assert(!(callInfo.Flags & CallFlags_New));
  243. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  244. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  245. {
  246. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  247. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  248. Assert(a && b);
  249. SIMDValue result, aValue, bValue;
  250. aValue = a->GetValue();
  251. bValue = b->GetValue();
  252. result = SIMDInt8x16Operation::OpAdd(aValue, bValue);
  253. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  254. }
  255. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"add");
  256. }
  257. Var SIMDUint8x16Lib::EntrySub(RecyclableObject* function, CallInfo callInfo, ...)
  258. {
  259. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  260. ARGUMENTS(args, callInfo);
  261. ScriptContext* scriptContext = function->GetScriptContext();
  262. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  263. Assert(!(callInfo.Flags & CallFlags_New));
  264. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  265. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  266. {
  267. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  268. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  269. Assert(a && b);
  270. SIMDValue result, aValue, bValue;
  271. aValue = a->GetValue();
  272. bValue = b->GetValue();
  273. result = SIMDInt8x16Operation::OpSub(aValue, bValue);
  274. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  275. }
  276. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"sub");
  277. }
  278. Var SIMDUint8x16Lib::EntryMul(RecyclableObject* function, CallInfo callInfo, ...)
  279. {
  280. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  281. ARGUMENTS(args, callInfo);
  282. ScriptContext* scriptContext = function->GetScriptContext();
  283. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  284. Assert(!(callInfo.Flags & CallFlags_New));
  285. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  286. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  287. {
  288. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  289. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  290. Assert(a && b);
  291. SIMDValue result, aValue, bValue;
  292. aValue = a->GetValue();
  293. bValue = b->GetValue();
  294. result = SIMDInt8x16Operation::OpMul(aValue, bValue);
  295. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  296. }
  297. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"mul");
  298. }
  299. Var SIMDUint8x16Lib::EntryAnd(RecyclableObject* function, CallInfo callInfo, ...)
  300. {
  301. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  302. ARGUMENTS(args, callInfo);
  303. ScriptContext* scriptContext = function->GetScriptContext();
  304. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  305. Assert(!(callInfo.Flags & CallFlags_New));
  306. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  307. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  308. {
  309. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  310. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  311. Assert(a && b);
  312. SIMDValue result, aValue, bValue;
  313. aValue = a->GetValue();
  314. bValue = b->GetValue();
  315. result = SIMDInt32x4Operation::OpAnd(aValue, bValue);
  316. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  317. }
  318. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"and");
  319. }
  320. Var SIMDUint8x16Lib::EntryOr(RecyclableObject* function, CallInfo callInfo, ...)
  321. {
  322. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  323. ARGUMENTS(args, callInfo);
  324. ScriptContext* scriptContext = function->GetScriptContext();
  325. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  326. Assert(!(callInfo.Flags & CallFlags_New));
  327. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  328. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  329. {
  330. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  331. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  332. Assert(a && b);
  333. SIMDValue result, aValue, bValue;
  334. aValue = a->GetValue();
  335. bValue = b->GetValue();
  336. result = SIMDInt32x4Operation::OpOr(aValue, bValue);
  337. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  338. }
  339. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"or");
  340. }
  341. Var SIMDUint8x16Lib::EntryXor(RecyclableObject* function, CallInfo callInfo, ...)
  342. {
  343. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  344. ARGUMENTS(args, callInfo);
  345. ScriptContext* scriptContext = function->GetScriptContext();
  346. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  347. Assert(!(callInfo.Flags & CallFlags_New));
  348. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  349. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  350. {
  351. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  352. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  353. Assert(a && b);
  354. SIMDValue result, aValue, bValue;
  355. aValue = a->GetValue();
  356. bValue = b->GetValue();
  357. result = SIMDInt32x4Operation::OpXor(aValue, bValue);
  358. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  359. }
  360. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"xor");
  361. }
  362. Var SIMDUint8x16Lib::EntryLessThan(RecyclableObject* function, CallInfo callInfo, ...)
  363. {
  364. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  365. ARGUMENTS(args, callInfo);
  366. ScriptContext* scriptContext = function->GetScriptContext();
  367. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  368. Assert(!(callInfo.Flags & CallFlags_New));
  369. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  370. // strict type on both operands
  371. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  372. {
  373. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  374. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  375. Assert(a && b);
  376. SIMDValue result, aValue, bValue;
  377. aValue = a->GetValue();
  378. bValue = b->GetValue();
  379. result = SIMDUint8x16Operation::OpLessThan(aValue, bValue);
  380. return JavascriptSIMDBool8x16::New(&result, scriptContext);
  381. }
  382. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"lessThan");
  383. }
  384. Var SIMDUint8x16Lib::EntryLessThanOrEqual(RecyclableObject* function, CallInfo callInfo, ...)
  385. {
  386. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  387. ARGUMENTS(args, callInfo);
  388. ScriptContext* scriptContext = function->GetScriptContext();
  389. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  390. Assert(!(callInfo.Flags & CallFlags_New));
  391. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  392. // strict type on both operands
  393. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  394. {
  395. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  396. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  397. Assert(a && b);
  398. SIMDValue result, aValue, bValue;
  399. aValue = a->GetValue();
  400. bValue = b->GetValue();
  401. result = SIMDUint8x16Operation::OpLessThanOrEqual(aValue, bValue);
  402. return JavascriptSIMDBool8x16::New(&result, scriptContext);
  403. }
  404. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"lessThanOrEqual");
  405. }
  406. Var SIMDUint8x16Lib::EntryEqual(RecyclableObject* function, CallInfo callInfo, ...)
  407. {
  408. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  409. ARGUMENTS(args, callInfo);
  410. ScriptContext* scriptContext = function->GetScriptContext();
  411. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  412. Assert(!(callInfo.Flags & CallFlags_New));
  413. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  414. // strict type on both operands
  415. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  416. {
  417. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  418. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  419. Assert(a && b);
  420. SIMDValue result, aValue, bValue;
  421. aValue = a->GetValue();
  422. bValue = b->GetValue();
  423. result = SIMDInt8x16Operation::OpEqual(aValue, bValue);
  424. return JavascriptSIMDBool8x16::New(&result, scriptContext);
  425. }
  426. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"equal");
  427. }
  428. Var SIMDUint8x16Lib::EntryNotEqual(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. // strict type on both operands
  437. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  438. {
  439. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  440. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  441. Assert(a && b);
  442. SIMDValue result, aValue, bValue;
  443. aValue = a->GetValue();
  444. bValue = b->GetValue();
  445. result = SIMDInt8x16Operation::OpNotEqual(aValue, bValue);
  446. return JavascriptSIMDBool8x16::New(&result, scriptContext);
  447. }
  448. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"notEqual");
  449. }
  450. Var SIMDUint8x16Lib::EntryGreaterThan(RecyclableObject* function, CallInfo callInfo, ...)
  451. {
  452. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  453. ARGUMENTS(args, callInfo);
  454. ScriptContext* scriptContext = function->GetScriptContext();
  455. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  456. Assert(!(callInfo.Flags & CallFlags_New));
  457. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  458. // strict type on both operands
  459. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  460. {
  461. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  462. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  463. Assert(a && b);
  464. SIMDValue result, aValue, bValue;
  465. aValue = a->GetValue();
  466. bValue = b->GetValue();
  467. result = SIMDUint8x16Operation::OpLessThanOrEqual(aValue, bValue);
  468. result = SIMDInt32x4Operation::OpNot(result);
  469. return JavascriptSIMDBool8x16::New(&result, scriptContext);
  470. }
  471. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"greaterThan");
  472. }
  473. Var SIMDUint8x16Lib::EntryGreaterThanOrEqual(RecyclableObject* function, CallInfo callInfo, ...)
  474. {
  475. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  476. ARGUMENTS(args, callInfo);
  477. ScriptContext* scriptContext = function->GetScriptContext();
  478. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  479. Assert(!(callInfo.Flags & CallFlags_New));
  480. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  481. // strict type on both operands
  482. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  483. {
  484. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  485. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  486. Assert(a && b);
  487. SIMDValue result, aValue, bValue;
  488. aValue = a->GetValue();
  489. bValue = b->GetValue();
  490. result = SIMDUint8x16Operation::OpLessThan(aValue, bValue);
  491. result = SIMDInt32x4Operation::OpNot(result);
  492. return JavascriptSIMDBool8x16::New(&result, scriptContext);
  493. }
  494. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"greaterThanOrEqual");
  495. }
  496. Var SIMDUint8x16Lib::EntryShiftLeftByScalar(RecyclableObject* function, CallInfo callInfo, ...)
  497. {
  498. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  499. ARGUMENTS(args, callInfo);
  500. ScriptContext* scriptContext = function->GetScriptContext();
  501. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  502. Assert(!(callInfo.Flags & CallFlags_New));
  503. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]))
  504. {
  505. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  506. Assert(a);
  507. SIMDValue result, aValue;
  508. aValue = a->GetValue();
  509. Var countVar = args[2]; // {int} bits Bit count
  510. int8 count = JavascriptConversion::ToInt8(countVar, scriptContext);
  511. result = SIMDInt8x16Operation::OpShiftLeftByScalar(aValue, count);
  512. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  513. }
  514. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"shiftLeft");
  515. }
  516. Var SIMDUint8x16Lib::EntryShiftRightByScalar(RecyclableObject* function, CallInfo callInfo, ...)
  517. {
  518. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  519. ARGUMENTS(args, callInfo);
  520. ScriptContext* scriptContext = function->GetScriptContext();
  521. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  522. Assert(!(callInfo.Flags & CallFlags_New));
  523. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]))
  524. {
  525. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  526. Assert(a);
  527. SIMDValue result, aValue;
  528. aValue = a->GetValue();
  529. Var countVar = args[2]; // {int} bits Bit count
  530. int8 count = JavascriptConversion::ToInt8(countVar, scriptContext);
  531. result = SIMDUint8x16Operation::OpShiftRightByScalar(aValue, count);
  532. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  533. }
  534. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"shiftRightByScalar");
  535. }
  536. Var SIMDUint8x16Lib::EntrySwizzle(RecyclableObject* function, CallInfo callInfo, ...)
  537. {
  538. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  539. ARGUMENTS(args, callInfo);
  540. ScriptContext* scriptContext = function->GetScriptContext();
  541. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  542. Assert(!(callInfo.Flags & CallFlags_New));
  543. if (args.Info.Count >= 2 && JavascriptSIMDUint8x16::Is(args[1]))
  544. {
  545. // type check on lane indices
  546. if (args.Info.Count < 18)
  547. {
  548. // missing lane args
  549. JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedNumber, L"Lane index");
  550. }
  551. Var lanes[16];
  552. for (uint i = 0; i < 16; ++i)
  553. {
  554. lanes[i] = args[i + 2];
  555. }
  556. return SIMD128SlowShuffle<JavascriptSIMDUint8x16, 16>(args[1], args[1], lanes, 16, scriptContext);
  557. }
  558. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"swizzle");
  559. }
  560. Var SIMDUint8x16Lib::EntryShuffle(RecyclableObject* function, CallInfo callInfo, ...)
  561. {
  562. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  563. ARGUMENTS(args, callInfo);
  564. ScriptContext* scriptContext = function->GetScriptContext();
  565. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  566. Assert(!(callInfo.Flags & CallFlags_New));
  567. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  568. // strict type on both operands
  569. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  570. {
  571. // type check on lane indices
  572. if (args.Info.Count < 19)
  573. {
  574. // missing lane args
  575. JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedNumber, L"Lane index");
  576. }
  577. Var lanes[16];
  578. for (uint i = 0; i < 16; ++i)
  579. {
  580. lanes[i] = args[i + 3];
  581. }
  582. return SIMD128SlowShuffle<JavascriptSIMDUint8x16, 16>(args[1], args[2], lanes, 32, scriptContext);
  583. }
  584. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"shuffle");
  585. }
  586. //Lane Access
  587. Var SIMDUint8x16Lib::EntryExtractLane(RecyclableObject* function, CallInfo callInfo, ...)
  588. {
  589. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  590. ARGUMENTS(args, callInfo);
  591. ScriptContext* scriptContext = function->GetScriptContext();
  592. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  593. Assert(!(callInfo.Flags & CallFlags_New));
  594. // first arg has to be of type Uint8x16, so cannot be missing.
  595. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]))
  596. {
  597. // if value arg is missing, then it is undefined.
  598. Var laneVar = args.Info.Count >= 3 ? args[2] : scriptContext->GetLibrary()->GetUndefined();
  599. uint8 result = SIMD128ExtractLane<JavascriptSIMDUint8x16, 16, uint8>(args[1], laneVar, scriptContext);
  600. return JavascriptNumber::ToVarNoCheck(result, scriptContext);
  601. }
  602. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"ExtractLane");
  603. }
  604. Var SIMDUint8x16Lib::EntryReplaceLane(RecyclableObject* function, CallInfo callInfo, ...)
  605. {
  606. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  607. ARGUMENTS(args, callInfo);
  608. ScriptContext* scriptContext = function->GetScriptContext();
  609. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  610. Assert(!(callInfo.Flags & CallFlags_New));
  611. // first arg has to be of type Uint8x16, so cannot be missing.
  612. if (args.Info.Count >= 4 && JavascriptSIMDUint8x16::Is(args[1]))
  613. {
  614. // if value arg is missing, then it is undefined.
  615. Var laneVar = args.Info.Count >= 4 ? args[2] : scriptContext->GetLibrary()->GetUndefined();
  616. Var argVal = args.Info.Count >= 4 ? args[3] : scriptContext->GetLibrary()->GetUndefined();
  617. uint8 value = JavascriptConversion::ToInt8(argVal, scriptContext);
  618. SIMDValue result = SIMD128ReplaceLane<JavascriptSIMDUint8x16, 16, uint8>(args[1], laneVar, value, scriptContext);
  619. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  620. }
  621. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"ReplaceLane");
  622. }
  623. Var SIMDUint8x16Lib::EntryAddSaturate(RecyclableObject* function, CallInfo callInfo, ...)
  624. {
  625. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  626. ARGUMENTS(args, callInfo);
  627. ScriptContext* scriptContext = function->GetScriptContext();
  628. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  629. Assert(!(callInfo.Flags & CallFlags_New));
  630. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  631. // strict type on both operands
  632. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  633. {
  634. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  635. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  636. Assert(a && b);
  637. SIMDValue result, aValue, bValue;
  638. aValue = a->GetValue();
  639. bValue = b->GetValue();
  640. result = SIMDUint8x16Operation::OpAddSaturate(aValue, bValue);
  641. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  642. }
  643. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"addSaturate");
  644. }
  645. Var SIMDUint8x16Lib::EntrySubSaturate(RecyclableObject* function, CallInfo callInfo, ...)
  646. {
  647. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  648. ARGUMENTS(args, callInfo);
  649. ScriptContext* scriptContext = function->GetScriptContext();
  650. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  651. Assert(!(callInfo.Flags & CallFlags_New));
  652. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  653. // strict type on both operands
  654. if (args.Info.Count >= 3 && JavascriptSIMDUint8x16::Is(args[1]) && JavascriptSIMDUint8x16::Is(args[2]))
  655. {
  656. JavascriptSIMDUint8x16 *a = JavascriptSIMDUint8x16::FromVar(args[1]);
  657. JavascriptSIMDUint8x16 *b = JavascriptSIMDUint8x16::FromVar(args[2]);
  658. Assert(a && b);
  659. SIMDValue result, aValue, bValue;
  660. aValue = a->GetValue();
  661. bValue = b->GetValue();
  662. result = SIMDUint8x16Operation::OpSubSaturate(aValue, bValue);
  663. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  664. }
  665. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"subSaturate");
  666. }
  667. Var SIMDUint8x16Lib::EntrySelect(RecyclableObject* function, CallInfo callInfo, ...)
  668. {
  669. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  670. ARGUMENTS(args, callInfo);
  671. ScriptContext* scriptContext = function->GetScriptContext();
  672. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  673. Assert(!(callInfo.Flags & CallFlags_New));
  674. if (args.Info.Count >= 4 && JavascriptSIMDBool8x16::Is(args[1]) &&
  675. JavascriptSIMDUint8x16::Is(args[2]) && JavascriptSIMDUint8x16::Is(args[3]))
  676. {
  677. JavascriptSIMDBool8x16 *m = JavascriptSIMDBool8x16::FromVar(args[1]);
  678. JavascriptSIMDUint8x16 *t = JavascriptSIMDUint8x16::FromVar(args[2]);
  679. JavascriptSIMDUint8x16 *f = JavascriptSIMDUint8x16::FromVar(args[3]);
  680. Assert(m && t && f);
  681. SIMDValue result, maskValue, trueValue, falseValue;
  682. maskValue = m->GetValue();
  683. trueValue = t->GetValue();
  684. falseValue = f->GetValue();
  685. result = SIMDInt32x4Operation::OpSelect(maskValue, trueValue, falseValue);
  686. return JavascriptSIMDUint8x16::New(&result, scriptContext);
  687. }
  688. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint8x16TypeMismatch, L"select");
  689. }
  690. }