Var SIMDUint16x8Lib::EntrySelect(RecyclableObject* function, CallInfo callInfo, ...) { PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); Assert(!(callInfo.Flags & CallFlags_New)); if (args.Info.Count >= 4 && JavascriptSIMDBool16x8::Is(args[1]) && JavascriptSIMDUint16x8::Is(args[2]) && JavascriptSIMDUint16x8::Is(args[3])) { JavascriptSIMDBool16x8 *m = JavascriptSIMDBool16x8::FromVar(args[1]); JavascriptSIMDUint16x8 *t = JavascriptSIMDUint16x8::FromVar(args[2]); JavascriptSIMDUint16x8 *f = JavascriptSIMDUint16x8::FromVar(args[3]); Assert(m && t && f); SIMDValue result, maskValue, trueValue, falseValue; maskValue = m->GetValue(); trueValue = t->GetValue(); falseValue = f->GetValue(); result = SIMDInt32x4Operation::OpSelect(maskValue, trueValue, falseValue); return JavascriptSIMDUint16x8::New(&result, scriptContext); } JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint16x8TypeMismatch, _u("select")); }
Var SIMDUint16x8Lib::EntrySubSaturate(RecyclableObject* function, CallInfo callInfo, ...) { PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); Assert(!(callInfo.Flags & CallFlags_New)); // If any of the args are missing, then it is Undefined type which causes TypeError exception. // strict type on both operands if (args.Info.Count >= 3 && JavascriptSIMDUint16x8::Is(args[1]) && JavascriptSIMDUint16x8::Is(args[2])) { JavascriptSIMDUint16x8 *a = JavascriptSIMDUint16x8::FromVar(args[1]); JavascriptSIMDUint16x8 *b = JavascriptSIMDUint16x8::FromVar(args[2]); Assert(a && b); SIMDValue result, aValue, bValue; aValue = a->GetValue(); bValue = b->GetValue(); result = SIMDUint16x8Operation::OpSubSaturate(aValue, bValue); return JavascriptSIMDUint16x8::New(&result, scriptContext); } JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint16x8TypeMismatch, _u("subSaturate")); }
Var SIMDUint16x8Lib::EntryShiftRightByScalar(RecyclableObject* function, CallInfo callInfo, ...) { PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); Assert(!(callInfo.Flags & CallFlags_New)); if (args.Info.Count >= 3 && JavascriptSIMDUint16x8::Is(args[1])) { JavascriptSIMDUint16x8 *a = JavascriptSIMDUint16x8::FromVar(args[1]); Assert(a); SIMDValue result, aValue; aValue = a->GetValue(); Var countVar = args[2]; // {int} bits Bit count int8 count = JavascriptConversion::ToInt8(countVar, scriptContext); result = SIMDUint16x8Operation::OpShiftRightByScalar(aValue, count); return JavascriptSIMDUint16x8::New(&result, scriptContext); } JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint16x8TypeMismatch, _u("shiftRightByScalar")); }
Var JavascriptSIMDUint16x8::EntryToString(RecyclableObject* function, CallInfo callInfo, ...) { PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); Assert(!(callInfo.Flags & CallFlags_New)); if (args.Info.Count == 0 || JavascriptOperators::GetTypeId(args[0]) != TypeIds_SIMDUint16x8) { JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedSimd, L"SIMDUint16x8.toString"); } JavascriptSIMDUint16x8* instance = JavascriptSIMDUint16x8::FromVar(args[0]); Assert(instance); wchar_t stringBuffer[1024]; SIMDValue value = instance->GetValue(); swprintf_s(stringBuffer, 1024, L"SIMD.Uint16x8(%u, %u, %u, %u, %u, %u, %u, %u)", value.u16[0], value.u16[1], value.u16[2], value.u16[3], value.u16[4], value.u16[5], value.u16[6], value.u16[7]); JavascriptString* string = JavascriptString::NewCopySzFromArena(stringBuffer, scriptContext, scriptContext->GeneralAllocator()); return string; }
Var SIMDUint16x8Lib::EntryNot(RecyclableObject* function, CallInfo callInfo, ...) { PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); AssertMsg(args.Info.Count > 0, "Should always have implicit 'this'"); Assert(!(callInfo.Flags & CallFlags_New)); if (args.Info.Count >= 2 && JavascriptSIMDUint16x8::Is(args[1])) { JavascriptSIMDUint16x8 *a = JavascriptSIMDUint16x8::FromVar(args[1]); Assert(a); SIMDValue value, result; value = a->GetValue(); result = SIMDInt32x4Operation::OpNot(value); return JavascriptSIMDUint16x8::New(&result, scriptContext); } JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdUint16x8TypeMismatch, _u("not")); }