2
0

JavascriptSIMDFloat64x2.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. JavascriptSIMDFloat64x2::JavascriptSIMDFloat64x2(SIMDValue *val, StaticType *type) : RecyclableObject(type), value(*val)
  9. {
  10. Assert(type->GetTypeId() == TypeIds_SIMDFloat64x2);
  11. }
  12. JavascriptSIMDFloat64x2* JavascriptSIMDFloat64x2::New(SIMDValue *val, ScriptContext* requestContext)
  13. {
  14. return (JavascriptSIMDFloat64x2 *)AllocatorNew(Recycler, requestContext->GetRecycler(), JavascriptSIMDFloat64x2, val, requestContext->GetLibrary()->GetSIMDFloat64x2TypeStatic());
  15. }
  16. bool JavascriptSIMDFloat64x2::Is(Var instance)
  17. {
  18. return JavascriptOperators::GetTypeId(instance) == TypeIds_SIMDFloat64x2;
  19. }
  20. JavascriptSIMDFloat64x2* JavascriptSIMDFloat64x2::FromVar(Var aValue)
  21. {
  22. Assert(aValue);
  23. AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptSIMDFloat64x2'");
  24. return reinterpret_cast<JavascriptSIMDFloat64x2 *>(aValue);
  25. }
  26. JavascriptSIMDFloat64x2* JavascriptSIMDFloat64x2::FromFloat32x4(JavascriptSIMDFloat32x4 *instance, ScriptContext* requestContext)
  27. {
  28. SIMDValue result = SIMDFloat64x2Operation::OpFromFloat32x4(instance->GetValue());
  29. return JavascriptSIMDFloat64x2::New(&result, requestContext);
  30. }
  31. JavascriptSIMDFloat64x2* JavascriptSIMDFloat64x2::FromFloat32x4Bits(JavascriptSIMDFloat32x4 *instance, ScriptContext* requestContext)
  32. {
  33. return JavascriptSIMDFloat64x2::New(&instance->GetValue(), requestContext);
  34. }
  35. JavascriptSIMDFloat64x2* JavascriptSIMDFloat64x2::FromInt32x4(JavascriptSIMDInt32x4 *instance, ScriptContext* requestContext)
  36. {
  37. SIMDValue result = SIMDFloat64x2Operation::OpFromInt32x4(instance->GetValue());
  38. return JavascriptSIMDFloat64x2::New(&result, requestContext);
  39. }
  40. JavascriptSIMDFloat64x2* JavascriptSIMDFloat64x2::FromInt32x4Bits(JavascriptSIMDInt32x4 *instance, ScriptContext* requestContext)
  41. {
  42. return JavascriptSIMDFloat64x2::New(&instance->GetValue(), requestContext);
  43. }
  44. BOOL JavascriptSIMDFloat64x2::GetProperty(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext)
  45. {
  46. return GetPropertyBuiltIns(propertyId, value, requestContext);
  47. }
  48. BOOL JavascriptSIMDFloat64x2::GetProperty(Var originalInstance, JavascriptString* propertyNameString, Var* value, PropertyValueInfo* info, ScriptContext* requestContext)
  49. {
  50. PropertyRecord const* propertyRecord;
  51. this->GetScriptContext()->FindPropertyRecord(propertyNameString, &propertyRecord);
  52. if (propertyRecord != nullptr && GetPropertyBuiltIns(propertyRecord->GetPropertyId(), value, requestContext))
  53. {
  54. return true;
  55. }
  56. *value = requestContext->GetLibrary()->GetUndefined();
  57. return false;
  58. }
  59. BOOL JavascriptSIMDFloat64x2::GetPropertyReference(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext)
  60. {
  61. return JavascriptSIMDFloat64x2::GetProperty(originalInstance, propertyId, value, info, requestContext);
  62. }
  63. bool JavascriptSIMDFloat64x2::GetPropertyBuiltIns(PropertyId propertyId, Var* value, ScriptContext* requestContext)
  64. {
  65. switch (propertyId)
  66. {
  67. case PropertyIds::toString:
  68. *value = requestContext->GetLibrary()->GetSIMDFloat64x2ToStringFunction();
  69. return true;
  70. case PropertyIds::signMask:
  71. *value = GetSignMask();
  72. return true;
  73. }
  74. *value = requestContext->GetLibrary()->GetUndefined();
  75. return false;
  76. }
  77. // Entry Points
  78. Var JavascriptSIMDFloat64x2::EntryToString(RecyclableObject* function, CallInfo callInfo, ...)
  79. {
  80. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  81. ARGUMENTS(args, callInfo);
  82. ScriptContext* scriptContext = function->GetScriptContext();
  83. AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'");
  84. Assert(!(callInfo.Flags & CallFlags_New));
  85. if (args.Info.Count == 0 || JavascriptOperators::GetTypeId(args[0]) != TypeIds_SIMDFloat64x2)
  86. {
  87. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedSimd, L"SIMDFloat64x2.toString");
  88. }
  89. JavascriptSIMDFloat64x2 *instance = JavascriptSIMDFloat64x2::FromVar(args[0]);
  90. Assert(instance);
  91. wchar_t stringBuffer[1024];
  92. SIMDValue value = instance->GetValue();
  93. swprintf_s(stringBuffer, 1024, L"Float64x2(%.1f,%.1f)", value.f64[SIMD_X], value.f64[SIMD_Y]);
  94. JavascriptString* string = JavascriptString::NewCopySzFromArena(stringBuffer, scriptContext, scriptContext->GeneralAllocator());
  95. return string;
  96. }
  97. // End Entry Points
  98. Var JavascriptSIMDFloat64x2::Copy(ScriptContext* requestContext)
  99. {
  100. return JavascriptSIMDFloat64x2::New(&this->value, requestContext);
  101. }
  102. __inline Var JavascriptSIMDFloat64x2::GetSignMask()
  103. {
  104. int signMask = SIMDFloat64x2Operation::OpGetSignMask(value);
  105. return TaggedInt::ToVarUnchecked(signMask);
  106. }
  107. }