JavascriptSimdInt32x4.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. JavascriptSIMDInt32x4::JavascriptSIMDInt32x4(StaticType *type) : JavascriptSIMDType(type)
  9. {
  10. Assert(type->GetTypeId() == TypeIds_SIMDInt32x4);
  11. }
  12. JavascriptSIMDInt32x4::JavascriptSIMDInt32x4(SIMDValue *val, StaticType *type) : JavascriptSIMDType(val, type)
  13. {
  14. Assert(type->GetTypeId() == TypeIds_SIMDInt32x4);
  15. }
  16. JavascriptSIMDInt32x4* JavascriptSIMDInt32x4::AllocUninitialized(ScriptContext* requestContext)
  17. {
  18. return (JavascriptSIMDInt32x4 *)AllocatorNew(Recycler, requestContext->GetRecycler(), JavascriptSIMDInt32x4, requestContext->GetLibrary()->GetSIMDInt32x4TypeStatic());
  19. }
  20. JavascriptSIMDInt32x4* JavascriptSIMDInt32x4::New(SIMDValue *val, ScriptContext* requestContext)
  21. {
  22. return (JavascriptSIMDInt32x4 *)AllocatorNew(Recycler, requestContext->GetRecycler(), JavascriptSIMDInt32x4, val, requestContext->GetLibrary()->GetSIMDInt32x4TypeStatic());
  23. }
  24. bool JavascriptSIMDInt32x4::Is(Var instance)
  25. {
  26. return JavascriptOperators::GetTypeId(instance) == TypeIds_SIMDInt32x4;
  27. }
  28. JavascriptSIMDInt32x4* JavascriptSIMDInt32x4::FromVar(Var aValue)
  29. {
  30. Assert(aValue);
  31. AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDInt32x4'");
  32. return reinterpret_cast<JavascriptSIMDInt32x4 *>(aValue);
  33. }
  34. JavascriptSIMDInt32x4* JavascriptSIMDInt32x4::FromBool(SIMDValue *val, ScriptContext* requestContext)
  35. {
  36. SIMDValue result = SIMDInt32x4Operation::OpFromBool(*val);
  37. return JavascriptSIMDInt32x4::New(&result, requestContext);
  38. }
  39. JavascriptSIMDInt32x4* JavascriptSIMDInt32x4::FromFloat64x2(JavascriptSIMDFloat64x2 *instance, ScriptContext* requestContext)
  40. {
  41. SIMDValue result = SIMDInt32x4Operation::OpFromFloat64x2(instance->GetValue());
  42. return JavascriptSIMDInt32x4::New(&result, requestContext);
  43. }
  44. RecyclableObject * JavascriptSIMDInt32x4::CloneToScriptContext(ScriptContext* requestContext)
  45. {
  46. return JavascriptSIMDInt32x4::New(&value, requestContext);
  47. }
  48. bool JavascriptSIMDInt32x4::GetPropertyBuiltIns(PropertyId propertyId, Var* value, ScriptContext* requestContext)
  49. {
  50. switch (propertyId)
  51. {
  52. case PropertyIds::signMask:
  53. *value = GetSignMask();
  54. return true;
  55. case PropertyIds::flagX:
  56. case PropertyIds::flagY:
  57. case PropertyIds::flagZ:
  58. case PropertyIds::flagW:
  59. *value = GetLaneAsFlag(propertyId - PropertyIds::flagX, requestContext);
  60. return true;
  61. }
  62. return false;
  63. }
  64. const wchar_t* JavascriptSIMDInt32x4::GetFullBuiltinName(wchar_t** aBuffer, const wchar_t* name)
  65. {
  66. Assert(aBuffer && *aBuffer);
  67. swprintf_s(*aBuffer, SIMD_STRING_BUFFER_MAX, L"SIMD.Int32x4.%s", name);
  68. return *aBuffer;
  69. }
  70. Var JavascriptSIMDInt32x4::Copy(ScriptContext* requestContext)
  71. {
  72. return JavascriptSIMDInt32x4::New(&this->value, requestContext);
  73. }
  74. Var JavascriptSIMDInt32x4::CallToLocaleString(RecyclableObject& obj, ScriptContext& requestContext, SIMDValue simdValue,
  75. const Var* args, uint numArgs, CallInfo callInfo)
  76. {
  77. wchar_t *typeString = L"SIMD.Int32x4(";
  78. return JavascriptSIMDObject::FromVar(&obj)->ToLocaleString<int, 4>(args, numArgs, typeString,
  79. simdValue.i32, &callInfo, &requestContext);
  80. }
  81. Var JavascriptSIMDInt32x4::CopyAndSetLaneFlag(uint index, BOOL value, ScriptContext* requestContext)
  82. {
  83. AnalysisAssert(index < 4);
  84. Var instance = Copy(requestContext);
  85. JavascriptSIMDInt32x4 *insValue = JavascriptSIMDInt32x4::FromVar(instance);
  86. Assert(insValue);
  87. insValue->value.i32[index] = value ? -1 : 0;
  88. return instance;
  89. }
  90. __inline Var JavascriptSIMDInt32x4::GetLaneAsFlag(uint index, ScriptContext* requestContext)
  91. {
  92. // convert value.i32[index] to TaggedInt
  93. AnalysisAssert(index < 4);
  94. return JavascriptNumber::ToVar(value.i32[index] != 0x0, requestContext);
  95. }
  96. __inline Var JavascriptSIMDInt32x4::GetSignMask()
  97. {
  98. int signMask = SIMDInt32x4Operation::OpGetSignMask(value);
  99. return TaggedInt::ToVarUnchecked(signMask);
  100. }
  101. }