本文整理汇总了C++中AsmJsFunctionInfo::GetArgByteSize方法的典型用法代码示例。如果您正苦于以下问题:C++ AsmJsFunctionInfo::GetArgByteSize方法的具体用法?C++ AsmJsFunctionInfo::GetArgByteSize怎么用?C++ AsmJsFunctionInfo::GetArgByteSize使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类AsmJsFunctionInfo
的用法示例。
在下文中一共展示了AsmJsFunctionInfo::GetArgByteSize方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GetStackSizeForAsmJsUnboxing
int GetStackSizeForAsmJsUnboxing(ScriptFunction* func)
{
AsmJsFunctionInfo* info = func->GetFunctionBody()->GetAsmJsFunctionInfo();
int argSize = info->GetArgByteSize() + MachPtr;
argSize = ::Math::Align<int32>(argSize, 16);
if (argSize < 32)
{
argSize = 32; // convention is to always allocate spill space for rcx,rdx,r8,r9
}
PROBE_STACK_CALL(func->GetScriptContext(), func, argSize + Js::Constants::MinStackDefault);
return argSize;
}
示例2: AsmJsExternalEntryPoint
Var AsmJsExternalEntryPoint(RecyclableObject* entryObject, CallInfo callInfo, ...)
{
ARGUMENTS(args, callInfo);
ScriptFunction* func = (ScriptFunction*)entryObject;
FunctionBody* body = func->GetFunctionBody();
AsmJsFunctionInfo* info = body->GetAsmJsFunctionInfo();
ScriptContext* scriptContext = func->GetScriptContext();
const uint argInCount = callInfo.Count - 1;
int argSize = info->GetArgByteSize();
char* dst;
Var returnValue = 0;
AsmJsModuleInfo::EnsureHeapAttached(func);
argSize = ::Math::Align<int32>(argSize, 8);
// Allocate stack space for args
__asm
{
sub esp, argSize
mov dst, esp
};
// Unbox Var to primitive type
{
int32 intVal; double doubleVal; float floatVal;
for (ArgSlot i = 0; i < info->GetArgCount(); i++)
{
if (info->GetArgType(i).isInt())
{
if (i < argInCount)
{
intVal = JavascriptMath::ToInt32(args.Values[i + 1], scriptContext);
}
else
{
intVal = 0;
}
*(int32*)dst = intVal;
dst += sizeof(int32);
}
else if (info->GetArgType(i).isFloat())
{
if (i < argInCount)
{
floatVal = (float)(JavascriptConversion::ToNumber(args.Values[i + 1], scriptContext));
}
else
{
floatVal = (float)(JavascriptNumber::NaN);
}
*(float*)dst = floatVal;
dst += sizeof(float);
}
else if (info->GetArgType(i).isDouble())
{
if (i < argInCount)
{
doubleVal = JavascriptConversion::ToNumber(args.Values[i + 1], scriptContext);
}
else
{
doubleVal = JavascriptNumber::NaN;
}
*(double*)dst = doubleVal;
dst += sizeof(double);
}
else if (info->GetArgType(i).isSIMD())
{
AsmJsVarType argType = info->GetArgType(i);
AsmJsSIMDValue simdVal;
// SIMD values are copied unaligned.
// SIMD values cannot be implicitly coerced from/to other types. If the SIMD parameter is missing (i.e. Undefined), we throw type error since there is not equivalent SIMD value to coerce to.
switch (argType.which())
{
case AsmJsType::Int32x4:
if (i >= argInCount || !JavascriptSIMDInt32x4::Is(args.Values[i + 1]))
{
JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdInt32x4TypeMismatch, L"Int32x4");
}
simdVal = ((JavascriptSIMDInt32x4*)(args.Values[i + 1]))->GetValue();
break;
case AsmJsType::Float32x4:
if (i >= argInCount || !JavascriptSIMDFloat32x4::Is(args.Values[i + 1]))
{
JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat32x4TypeMismatch, L"Float32x4");
}
simdVal = ((JavascriptSIMDFloat32x4*)(args.Values[i + 1]))->GetValue();
break;
case AsmJsType::Float64x2:
if (i >= argInCount || !JavascriptSIMDFloat64x2::Is(args.Values[i + 1]))
{
JavascriptError::ThrowTypeError(scriptContext, JSERR_SimdFloat64x2TypeMismatch, L"Float64x2");
}
simdVal = ((JavascriptSIMDFloat64x2*)(args.Values[i + 1]))->GetValue();
break;
default:
Assert(UNREACHED);
}
*(AsmJsSIMDValue*)dst = simdVal;
//.........这里部分代码省略.........
示例3: AsmJsExternalEntryPoint
Var AsmJsExternalEntryPoint(RecyclableObject* entryObject, CallInfo callInfo, ...)
{
ARGUMENTS(args, callInfo);
ScriptFunction* func = (ScriptFunction*)entryObject;
FunctionBody* body = func->GetFunctionBody();
AsmJsFunctionInfo* info = body->GetAsmJsFunctionInfo();
int argSize = info->GetArgByteSize();
void* dst;
Var returnValue = 0;
argSize = ::Math::Align<int32>(argSize, 8);
// Allocate stack space for args
PROBE_STACK_CALL(func->GetScriptContext(), func, argSize + Js::Constants::MinStackDefault);
dst = _alloca(argSize);
const void * asmJSEntryPoint = UnboxAsmJsArguments(func, args.Values + 1, ((char*)dst) - MachPtr, callInfo);
// make call and convert primitive type back to Var
switch (info->GetReturnType().which())
{
case AsmJsRetType::Void:
__asm
{
mov ecx, asmJSEntryPoint
#ifdef _CONTROL_FLOW_GUARD
call[__guard_check_icall_fptr]
#endif
push func
call ecx
}
returnValue = JavascriptOperators::OP_LdUndef(func->GetScriptContext());
break;
case AsmJsRetType::Signed:{
int32 ival = 0;
__asm
{
mov ecx, asmJSEntryPoint
#ifdef _CONTROL_FLOW_GUARD
call[__guard_check_icall_fptr]
#endif
push func
call ecx
mov ival, eax
}
returnValue = JavascriptNumber::ToVar(ival, func->GetScriptContext());
break;
}
case AsmJsRetType::Int64:
{
int32 iLow = 0, iHigh = 0;
__asm
{
mov ecx, asmJSEntryPoint
#ifdef _CONTROL_FLOW_GUARD
call[__guard_check_icall_fptr]
#endif
push func
call ecx
mov iLow, eax;
mov iHigh, edx;
}
#if ENABLE_DEBUG_CONFIG_OPTIONS
if (CONFIG_FLAG(WasmI64))
{
uint64 lHigh = ((uint64)iHigh) << 32;
uint64 lLow = (uint64)(uint32)iLow;
returnValue = CreateI64ReturnObject((int64)(lHigh | lLow), func->GetScriptContext());
break;
}
#endif
JavascriptError::ThrowTypeError(func->GetScriptContext(), WASMERR_InvalidTypeConversion);
}
case AsmJsRetType::Double:{
double dval = 0;
__asm
{
mov ecx, asmJSEntryPoint
#ifdef _CONTROL_FLOW_GUARD
call[__guard_check_icall_fptr]
#endif
push func
call ecx
movsd dval, xmm0
}
returnValue = JavascriptNumber::NewWithCheck(dval, func->GetScriptContext());
break;
}
case AsmJsRetType::Float:{
float fval = 0;
__asm
{
mov ecx, asmJSEntryPoint
#ifdef _CONTROL_FLOW_GUARD
call[__guard_check_icall_fptr]
#endif
push func
call ecx
movss fval, xmm0
}
returnValue = JavascriptNumber::NewWithCheck((double)fval, func->GetScriptContext());
//.........这里部分代码省略.........