2
0

SimdFloat64x2Lib.cpp 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930
  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 SIMDFloat64x2Lib::EntryFloat64x2(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 to satisfy language service -ls -stress run
  15. Var undefinedVar = scriptContext->GetLibrary()->GetUndefined();
  16. double dSIMDX = JavascriptConversion::ToNumber(args.Info.Count >= 2 ? args[1] : undefinedVar, scriptContext);
  17. double dSIMDY = JavascriptConversion::ToNumber(args.Info.Count >= 3 ? args[2] : undefinedVar, scriptContext);
  18. SIMDValue lanes = SIMDFloat64x2Operation::OpFloat64x2(dSIMDX, dSIMDY);
  19. return JavascriptSIMDFloat64x2::New(&lanes, scriptContext);
  20. }
  21. Var SIMDFloat64x2Lib::EntryCheck(RecyclableObject* function, CallInfo callInfo, ...)
  22. {
  23. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  24. ARGUMENTS(args, callInfo);
  25. ScriptContext* scriptContext = function->GetScriptContext();
  26. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  27. Assert(!(callInfo.Flags & CallFlags_New)); // comment out to satisfy language service -ls -stress run
  28. if (args.Info.Count >= 2 && JavascriptSIMDFloat64x2::Is(args[1]))
  29. {
  30. return args[1];
  31. }
  32. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("Float64x2"));
  33. }
  34. Var SIMDFloat64x2Lib::EntrySplat(RecyclableObject* function, CallInfo callInfo, ...)
  35. {
  36. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  37. ARGUMENTS(args, callInfo);
  38. ScriptContext* scriptContext = function->GetScriptContext();
  39. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  40. Assert(!(callInfo.Flags & CallFlags_New));
  41. Var undefinedVar = scriptContext->GetLibrary()->GetUndefined();
  42. double value = JavascriptConversion::ToNumber(args.Info.Count >= 2 ? args[1] : undefinedVar, scriptContext);
  43. SIMDValue lanes = SIMDFloat64x2Operation::OpSplat(value);
  44. return JavascriptSIMDFloat64x2::New(&lanes, scriptContext);
  45. }
  46. Var SIMDFloat64x2Lib::EntryFromFloat32x4(RecyclableObject* function, CallInfo callInfo, ...)
  47. {
  48. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  49. ARGUMENTS(args, callInfo);
  50. ScriptContext* scriptContext = function->GetScriptContext();
  51. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  52. Assert(!(callInfo.Flags & CallFlags_New));
  53. if (args.Info.Count >= 2 && JavascriptSIMDFloat32x4::Is(args[1]))
  54. {
  55. JavascriptSIMDFloat32x4 *instance = JavascriptSIMDFloat32x4::FromVar(args[1]);
  56. Assert(instance);
  57. return JavascriptSIMDFloat64x2::FromFloat32x4(instance, scriptContext);
  58. }
  59. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat32x4TypeMismatch, _u("fromFloat32x4"));
  60. }
  61. Var SIMDFloat64x2Lib::EntryFromFloat32x4Bits(RecyclableObject* function, CallInfo callInfo, ...)
  62. {
  63. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  64. ARGUMENTS(args, callInfo);
  65. ScriptContext* scriptContext = function->GetScriptContext();
  66. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  67. Assert(!(callInfo.Flags & CallFlags_New));
  68. if (args.Info.Count >= 2 && JavascriptSIMDFloat32x4::Is(args[1]))
  69. {
  70. JavascriptSIMDFloat32x4 *instance = JavascriptSIMDFloat32x4::FromVar(args[1]);
  71. Assert(instance);
  72. return SIMDUtils::SIMDConvertTypeFromBits<JavascriptSIMDFloat32x4, JavascriptSIMDFloat64x2>(*instance, *scriptContext);
  73. }
  74. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat32x4TypeMismatch, _u("fromFloat32x4Bits"));
  75. }
  76. Var SIMDFloat64x2Lib::EntryFromInt32x4(RecyclableObject* function, CallInfo callInfo, ...)
  77. {
  78. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  79. ARGUMENTS(args, callInfo);
  80. ScriptContext* scriptContext = function->GetScriptContext();
  81. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  82. Assert(!(callInfo.Flags & CallFlags_New));
  83. if (args.Info.Count >= 2 && JavascriptSIMDInt32x4::Is(args[1]))
  84. {
  85. JavascriptSIMDInt32x4 *instance = JavascriptSIMDInt32x4::FromVar(args[1]);
  86. Assert(instance);
  87. return JavascriptSIMDFloat64x2::FromInt32x4(instance, scriptContext);
  88. }
  89. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat32x4TypeMismatch, _u("fromInt32x4"));
  90. }
  91. Var SIMDFloat64x2Lib::EntryFromInt32x4Bits(RecyclableObject* function, CallInfo callInfo, ...)
  92. {
  93. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  94. ARGUMENTS(args, callInfo);
  95. ScriptContext* scriptContext = function->GetScriptContext();
  96. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  97. Assert(!(callInfo.Flags & CallFlags_New));
  98. if (args.Info.Count >= 2 && JavascriptSIMDInt32x4::Is(args[1]))
  99. {
  100. JavascriptSIMDInt32x4 *instance = JavascriptSIMDInt32x4::FromVar(args[1]);
  101. Assert(instance);
  102. return SIMDUtils::SIMDConvertTypeFromBits<JavascriptSIMDInt32x4, JavascriptSIMDFloat64x2>(*instance, *scriptContext);
  103. }
  104. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat32x4TypeMismatch, _u("fromInt32x4Bits"));
  105. }
  106. Var SIMDFloat64x2Lib::EntryNot(RecyclableObject* function, CallInfo callInfo, ...)
  107. {
  108. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  109. ARGUMENTS(args, callInfo);
  110. ScriptContext* scriptContext = function->GetScriptContext();
  111. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  112. Assert(!(callInfo.Flags & CallFlags_New));
  113. if (args.Info.Count >= 2 && JavascriptSIMDFloat64x2::Is(args[1]))
  114. {
  115. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  116. Assert(a);
  117. SIMDValue result, value;
  118. value = a->GetValue();
  119. result = SIMDFloat64x2Operation::OpNot(value);
  120. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  121. }
  122. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("not"));
  123. }
  124. Var SIMDFloat64x2Lib::EntryAbs(RecyclableObject* function, CallInfo callInfo, ...)
  125. {
  126. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  127. ARGUMENTS(args, callInfo);
  128. ScriptContext* scriptContext = function->GetScriptContext();
  129. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  130. Assert(!(callInfo.Flags & CallFlags_New));
  131. if (args.Info.Count >= 2 && JavascriptSIMDFloat64x2::Is(args[1]))
  132. {
  133. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  134. Assert(a);
  135. SIMDValue result, value;
  136. value = a->GetValue();
  137. result = SIMDFloat64x2Operation::OpAbs(value);
  138. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  139. }
  140. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("abs"));
  141. }
  142. Var SIMDFloat64x2Lib::EntryNeg(RecyclableObject* function, CallInfo callInfo, ...)
  143. {
  144. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  145. ARGUMENTS(args, callInfo);
  146. ScriptContext* scriptContext = function->GetScriptContext();
  147. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  148. Assert(!(callInfo.Flags & CallFlags_New));
  149. if (args.Info.Count >= 2 && JavascriptSIMDFloat64x2::Is(args[1]))
  150. {
  151. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  152. Assert(a);
  153. SIMDValue result, value;
  154. value = a->GetValue();
  155. result = SIMDFloat64x2Operation::OpNeg(value);
  156. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  157. }
  158. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("neg"));
  159. }
  160. Var SIMDFloat64x2Lib::EntrySqrt(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 && JavascriptSIMDFloat64x2::Is(args[1]))
  168. {
  169. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  170. Assert(a);
  171. SIMDValue result, value;
  172. value = a->GetValue();
  173. result = SIMDFloat64x2Operation::OpSqrt(value);
  174. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  175. }
  176. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("sqrt"));
  177. }
  178. Var SIMDFloat64x2Lib::EntryReciprocal(RecyclableObject* function, CallInfo callInfo, ...)
  179. {
  180. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  181. ARGUMENTS(args, callInfo);
  182. ScriptContext* scriptContext = function->GetScriptContext();
  183. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  184. Assert(!(callInfo.Flags & CallFlags_New));
  185. if (args.Info.Count >= 2 && JavascriptSIMDFloat64x2::Is(args[1]))
  186. {
  187. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  188. Assert(a);
  189. SIMDValue result, value;
  190. value = a->GetValue();
  191. result = SIMDFloat64x2Operation::OpReciprocal(value);
  192. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  193. }
  194. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("reciprocal"));
  195. }
  196. Var SIMDFloat64x2Lib::EntryReciprocalSqrt(RecyclableObject* function, CallInfo callInfo, ...)
  197. {
  198. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  199. ARGUMENTS(args, callInfo);
  200. ScriptContext* scriptContext = function->GetScriptContext();
  201. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  202. Assert(!(callInfo.Flags & CallFlags_New));
  203. if (args.Info.Count >= 2 && JavascriptSIMDFloat64x2::Is(args[1]))
  204. {
  205. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  206. Assert(a);
  207. SIMDValue result, value;
  208. value = a->GetValue();
  209. result = SIMDFloat64x2Operation::OpReciprocalSqrt(value);
  210. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  211. }
  212. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("reciprocalSqrt"));
  213. }
  214. Var SIMDFloat64x2Lib::EntryAdd(RecyclableObject* function, CallInfo callInfo, ...)
  215. {
  216. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  217. ARGUMENTS(args, callInfo);
  218. ScriptContext* scriptContext = function->GetScriptContext();
  219. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  220. Assert(!(callInfo.Flags & CallFlags_New));
  221. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  222. // strict type on both operands
  223. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  224. {
  225. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  226. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  227. Assert(a && b);
  228. SIMDValue result, aValue, bValue;
  229. aValue = a->GetValue();
  230. bValue = b->GetValue();
  231. result = SIMDFloat64x2Operation::OpAdd(aValue, bValue);
  232. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  233. }
  234. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("add"));
  235. }
  236. Var SIMDFloat64x2Lib::EntrySub(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. // strict type on both operands
  245. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  246. {
  247. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  248. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  249. Assert(a && b);
  250. SIMDValue result, aValue, bValue;
  251. aValue = a->GetValue();
  252. bValue = b->GetValue();
  253. result = SIMDFloat64x2Operation::OpSub(aValue, bValue);
  254. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  255. }
  256. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("sub"));
  257. }
  258. Var SIMDFloat64x2Lib::EntryMul(RecyclableObject* function, CallInfo callInfo, ...)
  259. {
  260. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  261. ARGUMENTS(args, callInfo);
  262. ScriptContext* scriptContext = function->GetScriptContext();
  263. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  264. Assert(!(callInfo.Flags & CallFlags_New));
  265. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  266. // strict type on both operands
  267. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  268. {
  269. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  270. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  271. Assert(a && b);
  272. SIMDValue result, aValue, bValue;
  273. aValue = a->GetValue();
  274. bValue = b->GetValue();
  275. result = SIMDFloat64x2Operation::OpMul(aValue, bValue);
  276. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  277. }
  278. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("mul"));
  279. }
  280. Var SIMDFloat64x2Lib::EntryDiv(RecyclableObject* function, CallInfo callInfo, ...)
  281. {
  282. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  283. ARGUMENTS(args, callInfo);
  284. ScriptContext* scriptContext = function->GetScriptContext();
  285. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  286. Assert(!(callInfo.Flags & CallFlags_New));
  287. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  288. // strict type on both operands
  289. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  290. {
  291. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  292. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  293. Assert(a && b);
  294. SIMDValue result, aValue, bValue;
  295. aValue = a->GetValue();
  296. bValue = b->GetValue();
  297. result = SIMDFloat64x2Operation::OpDiv(aValue, bValue);
  298. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  299. }
  300. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("div"));
  301. }
  302. Var SIMDFloat64x2Lib::EntryAnd(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. // strict type on both operands
  311. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  312. {
  313. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  314. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  315. Assert(a && b);
  316. SIMDValue result, aValue, bValue;
  317. aValue = a->GetValue();
  318. bValue = b->GetValue();
  319. result = SIMDFloat64x2Operation::OpAnd(aValue, bValue);
  320. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  321. }
  322. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("and"));
  323. }
  324. Var SIMDFloat64x2Lib::EntryOr(RecyclableObject* function, CallInfo callInfo, ...)
  325. {
  326. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  327. ARGUMENTS(args, callInfo);
  328. ScriptContext* scriptContext = function->GetScriptContext();
  329. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  330. Assert(!(callInfo.Flags & CallFlags_New));
  331. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  332. // strict type on both operands
  333. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  334. {
  335. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  336. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  337. Assert(a && b);
  338. SIMDValue result, aValue, bValue;
  339. aValue = a->GetValue();
  340. bValue = b->GetValue();
  341. result = SIMDFloat64x2Operation::OpOr(aValue, bValue);
  342. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  343. }
  344. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("or"));
  345. }
  346. Var SIMDFloat64x2Lib::EntryXor(RecyclableObject* function, CallInfo callInfo, ...)
  347. {
  348. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  349. ARGUMENTS(args, callInfo);
  350. ScriptContext* scriptContext = function->GetScriptContext();
  351. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  352. Assert(!(callInfo.Flags & CallFlags_New));
  353. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  354. // strict type on both operands
  355. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  356. {
  357. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  358. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  359. Assert(a && b);
  360. SIMDValue result, aValue, bValue;
  361. aValue = a->GetValue();
  362. bValue = b->GetValue();
  363. result = SIMDFloat64x2Operation::OpXor(aValue, bValue);
  364. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  365. }
  366. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("xor"));
  367. }
  368. Var SIMDFloat64x2Lib::EntryMin(RecyclableObject* function, CallInfo callInfo, ...)
  369. {
  370. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  371. ARGUMENTS(args, callInfo);
  372. ScriptContext* scriptContext = function->GetScriptContext();
  373. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  374. Assert(!(callInfo.Flags & CallFlags_New));
  375. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  376. // strict type on both operands
  377. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  378. {
  379. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  380. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  381. Assert(a && b);
  382. SIMDValue result, aValue, bValue;
  383. aValue = a->GetValue();
  384. bValue = b->GetValue();
  385. result = SIMDFloat64x2Operation::OpMin(aValue, bValue);
  386. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  387. }
  388. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("min"));
  389. }
  390. Var SIMDFloat64x2Lib::EntryMax(RecyclableObject* function, CallInfo callInfo, ...)
  391. {
  392. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  393. ARGUMENTS(args, callInfo);
  394. ScriptContext* scriptContext = function->GetScriptContext();
  395. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  396. Assert(!(callInfo.Flags & CallFlags_New));
  397. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  398. // strict type on both operands
  399. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  400. {
  401. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  402. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  403. Assert(a && b);
  404. SIMDValue result, aValue, bValue;
  405. aValue = a->GetValue();
  406. bValue = b->GetValue();
  407. result = SIMDFloat64x2Operation::OpMax(aValue, bValue);
  408. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  409. }
  410. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("max"));
  411. }
  412. Var SIMDFloat64x2Lib::EntryScale(RecyclableObject* function, CallInfo callInfo, ...)
  413. {
  414. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  415. ARGUMENTS(args, callInfo);
  416. ScriptContext* scriptContext = function->GetScriptContext();
  417. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  418. Assert(!(callInfo.Flags & CallFlags_New));
  419. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  420. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]))
  421. {
  422. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  423. Assert(a);
  424. SIMDValue result, aValue;
  425. aValue = a->GetValue();
  426. double scaleValue = JavascriptConversion::ToNumber(args[2], scriptContext);
  427. result = SIMDFloat64x2Operation::OpScale(aValue, scaleValue);
  428. return JavascriptSIMDFloat64x2::New(&result, scriptContext);
  429. }
  430. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("scale"));
  431. }
  432. Var SIMDFloat64x2Lib::EntryLessThan(RecyclableObject* function, CallInfo callInfo, ...)
  433. {
  434. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  435. ARGUMENTS(args, callInfo);
  436. ScriptContext* scriptContext = function->GetScriptContext();
  437. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  438. Assert(!(callInfo.Flags & CallFlags_New));
  439. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  440. // strict type on both operands
  441. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  442. {
  443. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  444. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  445. Assert(a && b);
  446. SIMDValue result, aValue, bValue;
  447. aValue = a->GetValue();
  448. bValue = b->GetValue();
  449. result = SIMDFloat64x2Operation::OpLessThan(aValue, bValue);
  450. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  451. }
  452. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("lessThan"));
  453. }
  454. Var SIMDFloat64x2Lib::EntryLessThanOrEqual(RecyclableObject* function, CallInfo callInfo, ...)
  455. {
  456. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  457. ARGUMENTS(args, callInfo);
  458. ScriptContext* scriptContext = function->GetScriptContext();
  459. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  460. Assert(!(callInfo.Flags & CallFlags_New));
  461. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  462. // strict type on both operands
  463. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  464. {
  465. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  466. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  467. Assert(a && b);
  468. SIMDValue result, aValue, bValue;
  469. aValue = a->GetValue();
  470. bValue = b->GetValue();
  471. result = SIMDFloat64x2Operation::OpLessThanOrEqual(aValue, bValue);
  472. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  473. }
  474. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("lessThanOrEqual"));
  475. }
  476. Var SIMDFloat64x2Lib::EntryEqual(RecyclableObject* function, CallInfo callInfo, ...)
  477. {
  478. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  479. ARGUMENTS(args, callInfo);
  480. ScriptContext* scriptContext = function->GetScriptContext();
  481. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  482. Assert(!(callInfo.Flags & CallFlags_New));
  483. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  484. // strict type on both operands
  485. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  486. {
  487. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  488. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  489. Assert(a && b);
  490. SIMDValue result, aValue, bValue;
  491. aValue = a->GetValue();
  492. bValue = b->GetValue();
  493. result = SIMDFloat64x2Operation::OpEqual(aValue, bValue);
  494. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  495. }
  496. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("equal"));
  497. }
  498. Var SIMDFloat64x2Lib::EntryNotEqual(RecyclableObject* function, CallInfo callInfo, ...)
  499. {
  500. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  501. ARGUMENTS(args, callInfo);
  502. ScriptContext* scriptContext = function->GetScriptContext();
  503. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  504. Assert(!(callInfo.Flags & CallFlags_New));
  505. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  506. // strict type on both operands
  507. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  508. {
  509. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  510. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  511. Assert(a && b);
  512. SIMDValue result, aValue, bValue;
  513. aValue = a->GetValue();
  514. bValue = b->GetValue();
  515. result = SIMDFloat64x2Operation::OpNotEqual(aValue, bValue);
  516. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  517. }
  518. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("notEqual"));
  519. }
  520. Var SIMDFloat64x2Lib::EntryGreaterThan(RecyclableObject* function, CallInfo callInfo, ...)
  521. {
  522. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  523. ARGUMENTS(args, callInfo);
  524. ScriptContext* scriptContext = function->GetScriptContext();
  525. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  526. Assert(!(callInfo.Flags & CallFlags_New));
  527. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  528. // strict type on both operands
  529. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  530. {
  531. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  532. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  533. Assert(a && b);
  534. SIMDValue result, aValue, bValue;
  535. aValue = a->GetValue();
  536. bValue = b->GetValue();
  537. result = SIMDFloat64x2Operation::OpGreaterThan(aValue, bValue);
  538. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  539. }
  540. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("greaterThan"));
  541. }
  542. Var SIMDFloat64x2Lib::EntryGreaterThanOrEqual(RecyclableObject* function, CallInfo callInfo, ...)
  543. {
  544. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  545. ARGUMENTS(args, callInfo);
  546. ScriptContext* scriptContext = function->GetScriptContext();
  547. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  548. Assert(!(callInfo.Flags & CallFlags_New));
  549. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  550. // strict type on both operands
  551. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  552. {
  553. JavascriptSIMDFloat64x2 *a = JavascriptSIMDFloat64x2::FromVar(args[1]);
  554. JavascriptSIMDFloat64x2 *b = JavascriptSIMDFloat64x2::FromVar(args[2]);
  555. Assert(a && b);
  556. SIMDValue result, aValue, bValue;
  557. aValue = a->GetValue();
  558. bValue = b->GetValue();
  559. result = SIMDFloat64x2Operation::OpGreaterThanOrEqual(aValue, bValue);
  560. return JavascriptSIMDInt32x4::New(&result, scriptContext);
  561. }
  562. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("greaterThanOrEqual"));
  563. }
  564. Var SIMDFloat64x2Lib::EntrySwizzle(RecyclableObject* function, CallInfo callInfo, ...)
  565. {
  566. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  567. ARGUMENTS(args, callInfo);
  568. ScriptContext* scriptContext = function->GetScriptContext();
  569. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  570. Assert(!(callInfo.Flags & CallFlags_New));
  571. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  572. // strict type on both operands
  573. if (args.Info.Count >= 2 && JavascriptSIMDFloat64x2::Is(args[1]))
  574. {
  575. // type check on lane indices
  576. if (args.Info.Count < 4)
  577. {
  578. // missing lane args
  579. JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedNumber, _u("Lane index"));
  580. }
  581. Var lane0 = args[2];
  582. Var lane1 = args[3];
  583. return SIMDUtils::SIMD128SlowShuffle<JavascriptSIMDFloat64x2, 2>(args[1], args[1], lane0, lane1, NULL, NULL, 2, scriptContext);
  584. }
  585. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("swizzle"));
  586. }
  587. Var SIMDFloat64x2Lib::EntryShuffle(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. // If any of the args are missing, then it is Undefined type which causes TypeError exception.
  595. // strict type on both operands
  596. if (args.Info.Count >= 3 && JavascriptSIMDFloat64x2::Is(args[1]) && JavascriptSIMDFloat64x2::Is(args[2]))
  597. {
  598. // type check on lane indices
  599. if (args.Info.Count < 5)
  600. {
  601. // missing lane args
  602. JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedNumber, _u("Lane index"));
  603. }
  604. Var lane0 = args[3];
  605. Var lane1 = args[4];
  606. return SIMDUtils::SIMD128SlowShuffle<JavascriptSIMDFloat64x2, 2>(args[1], args[2], lane0, lane1, NULL, NULL, 4, scriptContext);
  607. }
  608. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, _u("shuffle"));
  609. }
  610. Var SIMDFloat64x2Lib::EntrySelect(RecyclableObject* function, CallInfo callInfo, ...)
  611. {
  612. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  613. ARGUMENTS(args, callInfo);
  614. ScriptContext* scriptContext = function->GetScriptContext();
  615. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  616. Assert(!(callInfo.Flags & CallFlags_New));
  617. // we expect at least 3 explicit args (Int32x4, Float32x4, Float32x4)
  618. if (args.Info.Count >= 4 &&
  619. JavascriptSIMDInt32x4::Is(args[1]) &&
  620. JavascriptSIMDFloat64x2::Is(args[2]) &&
  621. JavascriptSIMDFloat64x2::Is(args[3]))
  622. {
  623. JavascriptSIMDInt32x4 *mask = JavascriptSIMDInt32x4::FromVar(args[1]);
  624. Assert(mask);
  625. JavascriptSIMDFloat64x2 *fmask = (JavascriptSIMDFloat64x2*)SIMDUtils::SIMDConvertTypeFromBits<JavascriptSIMDInt32x4, JavascriptSIMDFloat64x2>(*mask, *scriptContext);
  626. JavascriptSIMDFloat64x2 *tvalue = JavascriptSIMDFloat64x2::FromVar(args[2]);
  627. JavascriptSIMDFloat64x2 *fvalue = JavascriptSIMDFloat64x2::FromVar(args[3]);
  628. Assert(fmask && tvalue && fvalue);
  629. SIMDValue maskValue, trueValue, falseValue, resultValue;
  630. maskValue = fmask->GetValue();
  631. trueValue = tvalue->GetValue();
  632. falseValue = fvalue->GetValue();
  633. resultValue = SIMDFloat64x2Operation::OpSelect(maskValue, trueValue, falseValue);
  634. return JavascriptSIMDFloat64x2::New(&resultValue, scriptContext);
  635. }
  636. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat32x4TypeMismatch, _u("select"));
  637. }
  638. Var SIMDFloat64x2Lib::EntryLoad(RecyclableObject* function, CallInfo callInfo, ...)
  639. {
  640. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  641. ARGUMENTS(args, callInfo);
  642. ScriptContext* scriptContext = function->GetScriptContext();
  643. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  644. Assert(!(callInfo.Flags & CallFlags_New));
  645. return SIMDUtils::SIMD128TypedArrayLoad<JavascriptSIMDFloat64x2>(args[1], args[2], 2 * FLOAT64_SIZE, scriptContext);
  646. }
  647. Var SIMDFloat64x2Lib::EntryLoad1(RecyclableObject* function, CallInfo callInfo, ...)
  648. {
  649. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  650. ARGUMENTS(args, callInfo);
  651. ScriptContext* scriptContext = function->GetScriptContext();
  652. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  653. Assert(!(callInfo.Flags & CallFlags_New));
  654. return SIMDUtils::SIMD128TypedArrayLoad<JavascriptSIMDFloat64x2>(args[1], args[2], 1 * FLOAT64_SIZE, scriptContext);
  655. }
  656. Var SIMDFloat64x2Lib::EntryStore(RecyclableObject* function, CallInfo callInfo, ...)
  657. {
  658. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  659. ARGUMENTS(args, callInfo);
  660. ScriptContext* scriptContext = function->GetScriptContext();
  661. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  662. Assert(!(callInfo.Flags & CallFlags_New));
  663. if (args.Info.Count >= 4 && JavascriptSIMDFloat64x2::Is(args[3]))
  664. {
  665. SIMDUtils::SIMD128TypedArrayStore<JavascriptSIMDFloat64x2>(args[1], args[2], args[3], 2 * FLOAT64_SIZE, scriptContext);
  666. return NULL;
  667. }
  668. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInvalidArgType, _u("SIMD.Float64x2.store"));
  669. }
  670. Var SIMDFloat64x2Lib::EntryStore1(RecyclableObject* function, CallInfo callInfo, ...)
  671. {
  672. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  673. ARGUMENTS(args, callInfo);
  674. ScriptContext* scriptContext = function->GetScriptContext();
  675. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  676. Assert(!(callInfo.Flags & CallFlags_New));
  677. if (args.Info.Count >= 4 && JavascriptSIMDFloat64x2::Is(args[3]))
  678. {
  679. SIMDUtils::SIMD128TypedArrayStore<JavascriptSIMDFloat64x2>(args[1], args[2], args[3], 1 * FLOAT64_SIZE, scriptContext);
  680. return NULL;
  681. }
  682. JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInvalidArgType, _u("SIMD.Float64x2.store"));
  683. }
  684. }