SimdFloat32x4Lib.cpp 51 KB

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