| //------------------------------------------------------------------------------------------------------- |
| // Copyright (C) Microsoft Corporation and contributors. All rights reserved. |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. |
| //------------------------------------------------------------------------------------------------------- |
| |
| #include "RuntimeLanguagePch.h" |
| |
| #ifndef TEMP_DISABLE_ASMJS |
| #include "ByteCode/Symbol.h" |
| #include "ByteCode/FuncInfo.h" |
| #include "ByteCode/ByteCodeApi.h" |
| #include "ByteCode/ByteCodeWriter.h" |
| #include "ByteCode/ByteCodeGenerator.h" |
| #include "ByteCode/AsmJsByteCodeWriter.h" |
| #include "Language/AsmJsByteCodeGenerator.h" |
| |
| namespace Js |
| { |
| |
| bool AsmJsModuleCompiler::CompileAllFunctions() |
| { |
| const int size = mFunctionArray.Count(); |
| |
| for (int i = 0; i < size; i++) |
| { |
| AsmJsFunc* func = mFunctionArray.Item(i); |
| |
| if (!CompileFunction(func, i)) |
| { |
| // an error occurred in the function, revert state on all asm.js functions |
| for (int j = 0; j <= i; j++) |
| { |
| RevertFunction(j); |
| } |
| return false; |
| } |
| func->Finish(); |
| } |
| return true; |
| } |
| |
| |
| void AsmJsModuleCompiler::RevertFunction(int funcIndex) |
| { |
| AsmJsFunc* func = mFunctionArray.Item(funcIndex); |
| FunctionBody * funcBody = func->GetFuncBody(); |
| funcBody->ResetByteCodeGenState(); |
| funcBody->AddDeferParseAttribute(); |
| funcBody->SetFunctionParsed(false); |
| funcBody->ResetEntryPoint(); |
| funcBody->SetEntryPoint(funcBody->GetDefaultEntryPointInfo(), GetScriptContext()->DeferredParsingThunk); |
| funcBody->SetIsAsmjsMode(false); |
| funcBody->SetIsAsmJsFunction(false); |
| func->GetFncNode()->sxFnc.funcInfo->byteCodeFunction = func->GetFuncBody(); |
| } |
| |
| void AsmJsModuleCompiler::RevertAllFunctions() |
| { |
| for (int i = 0; i < mFunctionArray.Count(); i++) |
| { |
| RevertFunction(i); |
| } |
| } |
| |
| |
| bool AsmJsModuleCompiler::CommitFunctions() |
| { |
| const int size = mFunctionArray.Count(); |
| // if changeHeap is defined, it must be first function, so we should skip it |
| for (int i = 0; i < size; i++) |
| { |
| AsmJsFunc* func = mFunctionArray.Item(i); |
| FunctionBody* functionBody = func->GetFuncBody(); |
| AsmJsFunctionInfo* asmInfo = functionBody->AllocateAsmJsFunctionInfo(); |
| if (i == 0 && mUsesChangeHeap) |
| { |
| continue; |
| } |
| const auto& intRegisterSpace = func->GetRegisterSpace<int>(); |
| const auto& doubleRegisterSpace = func->GetRegisterSpace<double>(); |
| const auto& floatRegisterSpace = func->GetRegisterSpace<float>(); |
| |
| if (!asmInfo->Init(func)) |
| { |
| return false; |
| } |
| asmInfo->SetIsHeapBufferConst(!mUsesChangeHeap); |
| asmInfo->SetUsesHeapBuffer(mUsesHeapBuffer); |
| int varCount = 0; |
| varCount += (int)((intRegisterSpace.GetTotalVarCount() * INT_SLOTS_SPACE) + 0.5); |
| varCount += (int)(floatRegisterSpace.GetTotalVarCount() * FLOAT_SLOTS_SPACE + 0.5); |
| varCount += doubleRegisterSpace.GetTotalVarCount() * DOUBLE_SLOTS_SPACE; |
| |
| if (IsSimdjsEnabled()) |
| { |
| const auto& simdRegisterSpace = func->GetRegisterSpace<AsmJsSIMDValue>(); |
| varCount += (int)((simdRegisterSpace.GetTotalVarCount() + 1) * SIMD_SLOTS_SPACE); /* + 1 to make room for possible alignment of SIMD values*/ |
| // Aligned SIMD values. |
| Assert(asmInfo->GetSimdByteOffset() % sizeof(AsmJsSIMDValue) == 0); |
| } |
| |
| functionBody->CheckAndSetOutParamMaxDepth(func->GetMaxArgOutDepth()); |
| functionBody->CheckAndSetVarCount(varCount); |
| // should be set in EmitOneFunction |
| Assert(functionBody->GetIsAsmjsMode()); |
| Assert(functionBody->GetIsAsmJsFunction()); |
| ((EntryPointInfo*)functionBody->GetDefaultEntryPointInfo())->SetIsAsmJSFunction(true); |
| #if _M_IX86 |
| if (PHASE_ON1(AsmJsJITTemplatePhase) && !Configuration::Global.flags.NoNative) |
| { |
| AsmJsCodeGenerator* generator = GetScriptContext()->GetAsmJsCodeGenerator(); |
| AccumulateCompileTime(); |
| if (!generator) |
| { |
| generator = GetScriptContext()->InitAsmJsCodeGenerator(); |
| } |
| Assert( generator ); |
| generator->CodeGen(functionBody); |
| AccumulateCompileTime(AsmJsCompilation::TemplateJIT); |
| } |
| #endif |
| } |
| |
| return true; |
| } |
| |
| bool AsmJsModuleCompiler::CommitModule() |
| { |
| FuncInfo* funcInfo = GetModuleFunctionNode()->sxFnc.funcInfo; |
| FunctionBody* functionBody = funcInfo->GetParsedFunctionBody(); |
| AsmJsModuleInfo* asmInfo = functionBody->AllocateAsmJsModuleInfo(); |
| |
| int argCount = 0; |
| if (mBufferArgName) |
| { |
| argCount = 3; |
| } |
| else if (mForeignArgName) |
| { |
| argCount = 2; |
| } |
| else if (mStdLibArgName) |
| { |
| argCount = 1; |
| } |
| |
| const int functionCount = mFunctionArray.Count(); |
| const int functionTableCount = mFunctionTableArray.Count(); |
| const int importFunctionCount = mImportFunctions.GetTotalVarCount(); |
| asmInfo->SetFunctionCount(functionCount); |
| asmInfo->SetFunctionTableCount(functionTableCount); |
| asmInfo->SetFunctionImportCount(importFunctionCount); |
| asmInfo->SetVarCount(mVarCount); |
| asmInfo->SetVarImportCount(mVarImportCount); |
| asmInfo->SetArgInCount(argCount); |
| asmInfo->SetModuleMemory(mModuleMemory); |
| asmInfo->SetAsmMathBuiltinUsed(mAsmMathBuiltinUsedBV); |
| asmInfo->SetAsmArrayBuiltinUsed(mAsmArrayBuiltinUsedBV); |
| asmInfo->SetUsesChangeHeap(mUsesChangeHeap); |
| asmInfo->SetMaxHeapAccess(mMaxHeapAccess); |
| |
| if (IsSimdjsEnabled()) |
| { |
| asmInfo->SetAsmSimdBuiltinUsed(mAsmSimdBuiltinUsedBV); |
| asmInfo->SetSimdRegCount(mSimdVarSpace.GetTotalVarCount()); |
| } |
| |
| int varCount = 3; // 3 possible arguments |
| |
| functionBody->SetInParamsCount(4); // Always set 4 inParams so the memory space is the same (globalEnv,stdlib,foreign,buffer) |
| functionBody->SetReportedInParamsCount(4); |
| functionBody->CheckAndSetConstantCount(2); // Return register + Root |
| functionBody->CreateConstantTable(); |
| functionBody->CheckAndSetVarCount(varCount); |
| functionBody->SetIsAsmjsMode(true); |
| functionBody->NewObjectLiteral(); // allocate one object literal for the export object |
| |
| AsmJSByteCodeGenerator::EmitEmptyByteCode(funcInfo, GetByteCodeGenerator(), GetModuleFunctionNode()); |
| |
| // Create export module proxy |
| asmInfo->SetExportFunctionIndex(mExportFuncIndex); |
| asmInfo->SetExportsCount(mExports.Count()); |
| for (int i = 0; i < mExports.Count(); i++) |
| { |
| AsmJsModuleExport& exMod = mExports.Item(i); |
| auto ex = asmInfo->GetExport(i); |
| *ex.id = exMod.id; |
| *ex.location = exMod.location; |
| } |
| |
| int iVar = 0, iVarImp = 0, iFunc = 0, iFuncImp = 0; |
| const int size = mModuleEnvironment.Count(); |
| asmInfo->InitializeSlotMap(size); |
| auto slotMap = asmInfo->GetAsmJsSlotMap(); |
| for (int i = 0; i < size; i++) |
| { |
| AsmJsSymbol* sym = mModuleEnvironment.GetValueAt(i); |
| if (sym) |
| { |
| AsmJsSlot * slot = RecyclerNewLeaf(GetScriptContext()->GetRecycler(), AsmJsSlot); |
| slot->symType = sym->GetSymbolType(); |
| slotMap->AddNew(sym->GetName()->GetPropertyId(), slot); |
| switch (sym->GetSymbolType()) |
| { |
| case AsmJsSymbol::Variable:{ |
| AsmJsVar* var = sym->Cast<AsmJsVar>(); |
| auto& modVar = asmInfo->GetVar(iVar++); |
| modVar.location = var->GetLocation(); |
| modVar.type = var->GetVarType().which(); |
| if (var->GetVarType().isInt()) |
| { |
| modVar.initialiser.intInit = var->GetIntInitialiser(); |
| } |
| else if (var->GetVarType().isFloat()) |
| { |
| modVar.initialiser.floatInit = var->GetFloatInitialiser(); |
| } |
| else if (var->GetVarType().isDouble()) |
| { |
| modVar.initialiser.doubleInit = var->GetDoubleInitialiser(); |
| } |
| else if (IsSimdjsEnabled() && var->GetVarType().isSIMD()) |
| { |
| modVar.initialiser.simdInit = var->GetSimdConstInitialiser(); |
| } |
| else |
| { |
| Assert(UNREACHED); |
| } |
| |
| modVar.isMutable = var->isMutable(); |
| |
| slot->location = modVar.location; |
| slot->varType = var->GetVarType().which(); |
| slot->isConstVar = !modVar.isMutable; |
| break; |
| } |
| case AsmJsSymbol::ConstantImport:{ |
| AsmJsConstantImport* var = sym->Cast<AsmJsConstantImport>(); |
| auto& modVar = asmInfo->GetVarImport(iVarImp++); |
| modVar.location = var->GetLocation(); |
| modVar.field = var->GetField()->GetPropertyId(); |
| modVar.type = var->GetVarType().which(); |
| |
| slot->location = modVar.location; |
| slot->varType = modVar.type; |
| break; |
| } |
| case AsmJsSymbol::ImportFunction:{ |
| AsmJsImportFunction* func = sym->Cast<AsmJsImportFunction>(); |
| auto& modVar = asmInfo->GetFunctionImport(iFuncImp++); |
| modVar.location = func->GetFunctionIndex(); |
| modVar.field = func->GetField()->GetPropertyId(); |
| |
| slot->location = modVar.location; |
| break; |
| } |
| case AsmJsSymbol::FuncPtrTable:{ |
| AsmJsFunctionTable* funcTable = sym->Cast<AsmJsFunctionTable>(); |
| const uint size = funcTable->GetSize(); |
| const RegSlot index = funcTable->GetFunctionIndex(); |
| asmInfo->SetFunctionTableSize(index, size); |
| auto& modTable = asmInfo->GetFunctionTable(index); |
| for (uint j = 0; j < size; j++) |
| { |
| modTable.moduleFunctionIndex[j] = funcTable->GetModuleFunctionIndex(j); |
| } |
| slot->funcTableSize = size; |
| slot->location = index; |
| |
| break; |
| } |
| case AsmJsSymbol::ModuleFunction:{ |
| AsmJsFunc* func = sym->Cast<AsmJsFunc>(); |
| auto& modVar = asmInfo->GetFunction(iFunc++); |
| modVar.location = func->GetFunctionIndex(); |
| slot->location = modVar.location; |
| break; |
| } |
| case AsmJsSymbol::ArrayView: |
| { |
| AsmJsArrayView * var = sym->Cast<AsmJsArrayView>(); |
| slot->viewType = var->GetViewType(); |
| break; |
| } |
| case AsmJsSymbol::ModuleArgument: |
| { |
| AsmJsModuleArg * arg = sym->Cast<AsmJsModuleArg>(); |
| slot->argType = arg->GetArgType(); |
| break; |
| } |
| // used only for module validation |
| case AsmJsSymbol::MathConstant: |
| { |
| AsmJsMathConst * constVar = sym->Cast<AsmJsMathConst>(); |
| slot->mathConstVal = *constVar->GetVal(); |
| break; |
| } |
| case AsmJsSymbol::MathBuiltinFunction: |
| { |
| AsmJsMathFunction * mathFunc = sym->Cast<AsmJsMathFunction>(); |
| slot->builtinMathFunc = mathFunc->GetMathBuiltInFunction(); |
| break; |
| } |
| case AsmJsSymbol::TypedArrayBuiltinFunction: |
| { |
| AsmJsTypedArrayFunction * mathFunc = sym->Cast<AsmJsTypedArrayFunction>(); |
| slot->builtinArrayFunc = mathFunc->GetArrayBuiltInFunction(); |
| break; |
| } |
| case AsmJsSymbol::SIMDBuiltinFunction: |
| { |
| AsmJsSIMDFunction * mathFunc = sym->Cast<AsmJsSIMDFunction>(); |
| slot->builtinSIMDFunc = mathFunc->GetSimdBuiltInFunction(); |
| break; |
| } |
| default: |
| Assume(UNREACHED); |
| } |
| } |
| } |
| return true; |
| } |
| |
| void AsmJsModuleCompiler::ASTPrepass(ParseNodePtr pnode, AsmJsFunc * func) |
| { |
| ThreadContext::ProbeCurrentStackNoDispose(Js::Constants::MinStackByteCodeVisitor, GetByteCodeGenerator()->GetScriptContext()); |
| |
| if (pnode == NULL) |
| { |
| return; |
| } |
| |
| switch (pnode->nop) { |
| // these first cases do the interesting work |
| case knopBreak: |
| case knopContinue: |
| GetByteCodeGenerator()->AddTargetStmt(pnode->sxJump.pnodeTarget); |
| break; |
| |
| case knopInt: |
| func->AddConst<int>(pnode->sxInt.lw); |
| break; |
| case knopFlt: |
| { |
| const double d = pnode->sxFlt.dbl; |
| if (ParserWrapper::IsMinInt(pnode)) |
| { |
| func->AddConst<int>((int)d); |
| } |
| else if (ParserWrapper::IsUnsigned(pnode)) |
| { |
| func->AddConst<int>((int)(uint32)d); |
| } |
| else |
| { |
| func->AddConst<double>(d); |
| } |
| break; |
| } |
| case knopName: |
| { |
| GetByteCodeGenerator()->AssignPropertyId(pnode->name()); |
| AsmJsSymbol * declSym = LookupIdentifier(pnode->name()); |
| if (declSym) |
| { |
| if (declSym->GetSymbolType() == AsmJsSymbol::MathConstant) |
| { |
| AsmJsMathConst * definition = declSym->Cast<AsmJsMathConst>(); |
| Assert(definition->GetType().isDouble()); |
| func->AddConst<double>(*definition->GetVal()); |
| } |
| else if (declSym->GetSymbolType() == AsmJsSymbol::Variable && !declSym->isMutable()) |
| { |
| AsmJsVar * definition = declSym->Cast<AsmJsVar>(); |
| switch (definition->GetVarType().which()) |
| { |
| case AsmJsVarType::Double: |
| func->AddConst<double>(definition->GetDoubleInitialiser()); |
| break; |
| case AsmJsVarType::Float: |
| func->AddConst<float>(definition->GetFloatInitialiser()); |
| break; |
| case AsmJsVarType::Int: |
| func->AddConst<int>(definition->GetIntInitialiser()); |
| break; |
| default: |
| Assume(UNREACHED); |
| } |
| } |
| } |
| break; |
| } |
| case knopCall: |
| { |
| ASTPrepass(pnode->sxCall.pnodeTarget, func); |
| bool evalArgs = true; |
| if (pnode->sxCall.pnodeTarget->nop == knopName) |
| { |
| AsmJsFunctionDeclaration* funcDecl = this->LookupFunction(pnode->sxCall.pnodeTarget->name()); |
| if (funcDecl && funcDecl->GetSymbolType() == AsmJsSymbol::MathBuiltinFunction) |
| { |
| AsmJsMathFunction* mathFunc = funcDecl->Cast<AsmJsMathFunction>(); |
| if (mathFunc->GetMathBuiltInFunction() == AsmJSMathBuiltin_fround) |
| { |
| switch (pnode->sxCall.pnodeArgs->nop) |
| { |
| case knopFlt: |
| func->AddConst<float>((float)pnode->sxCall.pnodeArgs->sxFlt.dbl); |
| evalArgs = false; |
| break; |
| case knopInt: |
| func->AddConst<float>((float)pnode->sxCall.pnodeArgs->sxInt.lw); |
| evalArgs = false; |
| break; |
| case knopNeg: |
| if (pnode->sxCall.pnodeArgs->sxUni.pnode1->nop == knopInt && pnode->sxCall.pnodeArgs->sxUni.pnode1->sxInt.lw == 0) |
| { |
| func->AddConst<float>(-0.0f); |
| evalArgs = false; |
| break; |
| } |
| } |
| } |
| } |
| else if (IsSimdjsEnabled()) |
| { |
| /* |
| Float32x4 operations work on Float reg space. |
| If any of the args is a literal (DoubleLit), we need to have a copy of it in the Float reg space. |
| Note that we may end up with redundant copies in the Double reg space, since we ASTPrepass the args (Fix later ?) |
| */ |
| if (funcDecl && funcDecl->GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction) |
| { |
| AsmJsSIMDFunction* simdFunc = funcDecl->Cast<AsmJsSIMDFunction>(); |
| if (simdFunc->IsFloat32x4Func()) |
| { |
| ParseNode *argNode, *arg; |
| argNode = arg = pnode->sxCall.pnodeArgs; |
| do |
| { |
| if (argNode->nop == knopList) |
| { |
| arg = ParserWrapper::GetBinaryLeft(argNode); |
| argNode = ParserWrapper::GetBinaryRight(argNode); |
| } |
| if (arg->nop == knopFlt) |
| { |
| func->AddConst<float>((float)arg->sxFlt.dbl); |
| } |
| if (argNode != arg && argNode->nop == knopFlt) |
| { // last arg |
| func->AddConst<float>((float)argNode->sxFlt.dbl); |
| } |
| } while (argNode->nop == knopList); |
| } |
| } |
| } |
| |
| } |
| if (evalArgs) |
| { |
| ASTPrepass(pnode->sxCall.pnodeArgs, func); |
| } |
| break; |
| } |
| case knopVarDecl: |
| GetByteCodeGenerator()->AssignPropertyId(pnode->name()); |
| ASTPrepass(pnode->sxVar.pnodeInit, func); |
| break; |
| // all the rest of the cases simply walk the AST |
| case knopQmark: |
| ASTPrepass(pnode->sxTri.pnode1, func); |
| ASTPrepass(pnode->sxTri.pnode2, func); |
| ASTPrepass(pnode->sxTri.pnode3, func); |
| break; |
| case knopList: |
| do |
| { |
| ParseNode * pnode1 = pnode->sxBin.pnode1; |
| ASTPrepass(pnode1, func); |
| pnode = pnode->sxBin.pnode2; |
| } while (pnode->nop == knopList); |
| ASTPrepass(pnode, func); |
| break; |
| case knopFor: |
| ASTPrepass(pnode->sxFor.pnodeInit, func); |
| ASTPrepass(pnode->sxFor.pnodeCond, func); |
| ASTPrepass(pnode->sxFor.pnodeIncr, func); |
| ASTPrepass(pnode->sxFor.pnodeBody, func); |
| break; |
| case knopIf: |
| ASTPrepass(pnode->sxIf.pnodeCond, func); |
| ASTPrepass(pnode->sxIf.pnodeTrue, func); |
| ASTPrepass(pnode->sxIf.pnodeFalse, func); |
| break; |
| case knopDoWhile: |
| case knopWhile: |
| ASTPrepass(pnode->sxWhile.pnodeCond, func); |
| ASTPrepass(pnode->sxWhile.pnodeBody, func); |
| break; |
| case knopReturn: |
| ASTPrepass(pnode->sxReturn.pnodeExpr, func); |
| break; |
| case knopBlock: |
| ASTPrepass(pnode->sxBlock.pnodeStmt, func); |
| break; |
| case knopSwitch: |
| ASTPrepass(pnode->sxSwitch.pnodeVal, func); |
| for (ParseNode *pnodeT = pnode->sxSwitch.pnodeCases; NULL != pnodeT; pnodeT = pnodeT->sxCase.pnodeNext) |
| { |
| ASTPrepass(pnodeT, func); |
| } |
| ASTPrepass(pnode->sxSwitch.pnodeBlock, func); |
| break; |
| case knopCase: |
| ASTPrepass(pnode->sxCase.pnodeExpr, func); |
| ASTPrepass(pnode->sxCase.pnodeBody, func); |
| break; |
| case knopComma: |
| { |
| ParseNode *pnode1 = pnode->sxBin.pnode1; |
| if (pnode1->nop == knopComma) |
| { |
| // avoid recursion on very large comma expressions. |
| ArenaAllocator *alloc = GetByteCodeGenerator()->GetAllocator(); |
| SList<ParseNode*> *rhsStack = Anew(alloc, SList<ParseNode*>, alloc); |
| do { |
| rhsStack->Push(pnode1->sxBin.pnode2); |
| pnode1 = pnode1->sxBin.pnode1; |
| } while (pnode1->nop == knopComma); |
| ASTPrepass(pnode1, func); |
| while (!rhsStack->Empty()) |
| { |
| ParseNode *pnodeRhs = rhsStack->Pop(); |
| ASTPrepass(pnodeRhs, func); |
| } |
| Adelete(alloc, rhsStack); |
| } |
| else |
| { |
| ASTPrepass(pnode1, func); |
| } |
| ASTPrepass(pnode->sxBin.pnode2, func); |
| break; |
| } |
| default: |
| { |
| uint flags = ParseNode::Grfnop(pnode->nop); |
| if (flags&fnopUni) |
| { |
| ASTPrepass(pnode->sxUni.pnode1, func); |
| } |
| else if (flags&fnopBin) |
| { |
| ASTPrepass(pnode->sxBin.pnode1, func); |
| ASTPrepass(pnode->sxBin.pnode2, func); |
| } |
| break; |
| } |
| } |
| } |
| |
| void AsmJsModuleCompiler::BindArguments(ParseNode* argList) |
| { |
| for (ParseNode* pnode = argList; pnode; pnode = pnode->sxVar.pnodeNext) |
| { |
| GetByteCodeGenerator()->AssignPropertyId(pnode->name()); |
| } |
| } |
| |
| bool AsmJsModuleCompiler::CompileFunction(AsmJsFunc * func, int funcIndex) |
| { |
| ParseNodePtr fncNode = func->GetFncNode(); |
| ParseNodePtr pnodeBody = nullptr; |
| |
| Assert(fncNode->nop == knopFncDecl && fncNode->sxFnc.funcInfo && fncNode->sxFnc.funcInfo->IsDeferred() && fncNode->sxFnc.pnodeBody == NULL); |
| |
| Js::ParseableFunctionInfo* deferParseFunction = fncNode->sxFnc.funcInfo->byteCodeFunction; |
| Utf8SourceInfo * utf8SourceInfo = deferParseFunction->GetUtf8SourceInfo(); |
| ULONG grfscr = utf8SourceInfo->GetParseFlags(); |
| grfscr = grfscr & (~fscrGlobalCode); |
| func->SetOrigParseFlags(grfscr); |
| deferParseFunction->SetGrfscr(grfscr | (grfscr & ~fscrDeferredFncExpression)); |
| deferParseFunction->SetSourceInfo(GetByteCodeGenerator()->GetCurrentSourceIndex(), |
| fncNode, |
| !!(grfscr & fscrEvalCode), |
| ((grfscr & fscrDynamicCode) && !(grfscr & fscrEvalCode))); |
| |
| deferParseFunction->SetInParamsCount(fncNode->sxFnc.funcInfo->inArgsCount); |
| deferParseFunction->SetReportedInParamsCount(fncNode->sxFnc.funcInfo->inArgsCount); |
| |
| if (fncNode->sxFnc.pnodeBody == NULL) |
| { |
| if (!PHASE_OFF1(Js::SkipNestedDeferredPhase)) |
| { |
| deferParseFunction->BuildDeferredStubs(fncNode); |
| } |
| } |
| deferParseFunction->SetIsAsmjsMode(true); |
| PageAllocator tempPageAlloc(NULL, Js::Configuration::Global.flags); |
| Parser ps(GetScriptContext(), FALSE, &tempPageAlloc); |
| FunctionBody * funcBody; |
| ParseNodePtr parseTree; |
| |
| CompileScriptException se; |
| funcBody = deferParseFunction->ParseAsmJs(&ps, &se, &parseTree); |
| |
| TRACE_BYTECODE(_u("\nDeferred parse %s\n"), funcBody->GetDisplayName()); |
| if (parseTree && parseTree->nop == knopProg) |
| { |
| auto body = parseTree->sxProg.pnodeBody; |
| if (body && body->nop == knopList) |
| { |
| auto fncDecl = body->sxBin.pnode1; |
| if (fncDecl && fncDecl->nop == knopFncDecl) |
| { |
| pnodeBody = fncDecl->sxFnc.pnodeBody; |
| func->SetFuncBody(funcBody); |
| } |
| } |
| } |
| GetByteCodeGenerator()->PushFuncInfo(_u("Start asm.js AST prepass"), fncNode->sxFnc.funcInfo); |
| fncNode->sxFnc.funcInfo->byteCodeFunction->SetBoundPropertyRecords(GetByteCodeGenerator()->EnsurePropertyRecordList()); |
| BindArguments(fncNode->sxFnc.pnodeParams); |
| ASTPrepass(pnodeBody, func); |
| GetByteCodeGenerator()->PopFuncInfo(_u("End asm.js AST prepass")); |
| |
| fncNode->sxFnc.pnodeBody = pnodeBody; |
| |
| if (!pnodeBody) |
| { |
| // body should never be null if parsing succeeded |
| Assert(UNREACHED); |
| return Fail(fncNode, _u("Function should always have parse nodes")); |
| } |
| |
| // Check if this function requires a bigger Ast |
| UpdateMaxAstSize(fncNode->sxFnc.astSize); |
| |
| if (funcIndex == 0 && CheckChangeHeap(func)) |
| { |
| fncNode->sxFnc.pnodeBody = NULL; |
| return true; |
| } |
| |
| if (!SetupFunctionArguments(func, pnodeBody)) |
| { |
| // failure message will be printed by SetupFunctionArguments |
| fncNode->sxFnc.pnodeBody = NULL; |
| return false; |
| } |
| |
| if (!SetupLocalVariables(func)) |
| { |
| // failure message will be printed by SetupLocalVariables |
| fncNode->sxFnc.pnodeBody = NULL; |
| return false; |
| } |
| |
| // now that we have setup the function, we can generate bytecode for it |
| AsmJSByteCodeGenerator gen(func, this); |
| bool wasEmit = gen.EmitOneFunction(); |
| fncNode->sxFnc.pnodeBody = NULL; |
| return wasEmit; |
| } |
| |
| |
| bool AsmJsModuleCompiler::SetupFunctionArguments(AsmJsFunc * func, ParseNodePtr pnode) |
| { |
| // Check arguments |
| ArgSlot numArguments = 0; |
| ParseNode * fncNode = func->GetFncNode(); |
| ParseNode* argNode = ParserWrapper::FunctionArgsList(fncNode, numArguments); |
| |
| if (!func->EnsureArgCount(numArguments)) |
| { |
| return Fail(argNode, _u("Cannot have variable number of arguments")); |
| } |
| |
| ArgSlot index = 0; |
| while (argNode) |
| { |
| if (pnode->nop != knopList) |
| { |
| return Fail(pnode, _u("Missing assignment statement for argument")); |
| } |
| |
| |
| if (!ParserWrapper::IsDefinition(argNode)) |
| { |
| return Fail(argNode, _u("duplicate argument name not allowed")); |
| } |
| |
| PropertyName argName = argNode->name(); |
| if (!AsmJSCompiler::CheckIdentifier(*this, argNode, argName)) |
| { |
| return false; |
| } |
| |
| // creates the variable |
| AsmJsVarBase* var = func->DefineVar(argName, true); |
| if (!var) |
| { |
| return Fail(argNode, _u("Failed to define var")); |
| } |
| |
| ParseNode* argDefinition = ParserWrapper::GetBinaryLeft(pnode); |
| if (argDefinition->nop != knopAsg) |
| { |
| return Fail(argDefinition, _u("Expecting an assignment")); |
| } |
| |
| ParseNode* lhs = ParserWrapper::GetBinaryLeft(argDefinition); |
| ParseNode* rhs = ParserWrapper::GetBinaryRight(argDefinition); |
| |
| #define NodeDefineThisArgument(n,var) (n->nop == knopName && ParserWrapper::VariableName(n)->GetPropertyId() == var->GetName()->GetPropertyId()) |
| |
| if (!NodeDefineThisArgument(lhs, var)) |
| { |
| return Fail(lhs, _u("Defining wrong argument")); |
| } |
| |
| if (rhs->nop == knopPos) |
| { |
| // unary + => double |
| var->SetVarType(AsmJsVarType::Double); |
| var->SetLocation(func->AcquireRegister<double>()); |
| // validate stmt |
| ParseNode* argSym = ParserWrapper::GetUnaryNode(rhs); |
| |
| if (!NodeDefineThisArgument(argSym, var)) |
| { |
| return Fail(lhs, _u("Defining wrong argument")); |
| } |
| } |
| else if (rhs->nop == knopOr) |
| { |
| var->SetVarType(AsmJsVarType::Int); |
| var->SetLocation(func->AcquireRegister<int>()); |
| |
| ParseNode* argSym = ParserWrapper::GetBinaryLeft(rhs); |
| ParseNode* intSym = ParserWrapper::GetBinaryRight(rhs); |
| // validate stmt |
| if (!NodeDefineThisArgument(argSym, var)) |
| { |
| return Fail(lhs, _u("Defining wrong argument")); |
| } |
| if (intSym->nop != knopInt || intSym->sxInt.lw != 0) |
| { |
| return Fail(lhs, _u("Or value must be 0 when defining arguments")); |
| } |
| } |
| else if (rhs->nop == knopCall) |
| { |
| if (rhs->sxCall.pnodeTarget->nop != knopName) |
| { |
| return Fail(rhs, _u("call should be for fround")); |
| } |
| AsmJsFunctionDeclaration* funcDecl = this->LookupFunction(rhs->sxCall.pnodeTarget->name()); |
| |
| if (!funcDecl) |
| return Fail(rhs, _u("Cannot resolve function for argument definition, or wrong function")); |
| |
| if (funcDecl->GetSymbolType() == AsmJsSymbol::MathBuiltinFunction) |
| { |
| AsmJsMathFunction* mathFunc = funcDecl->Cast<AsmJsMathFunction>(); |
| if (!(mathFunc && mathFunc->GetMathBuiltInFunction() == AsmJSMathBuiltin_fround)) |
| { |
| return Fail(rhs, _u("call should be for fround")); |
| } |
| var->SetVarType(AsmJsVarType::Float); |
| var->SetLocation(func->AcquireRegister<float>()); |
| } |
| else if (IsSimdjsEnabled() && funcDecl->GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction) |
| { |
| AsmJsSIMDFunction* simdFunc = funcDecl->Cast<AsmJsSIMDFunction>(); |
| // x = f4check(x) |
| if (!simdFunc->IsTypeCheck()) |
| { |
| return Fail(rhs, _u("Invalid SIMD argument type check. E.g. expected x = f4check(x)")); |
| } |
| if (simdFunc->IsUnsignedTypeCheck()) |
| { |
| return Fail(rhs, _u("Invalid SIMD argument type. Expecting Signed arguments.")); |
| } |
| var->SetVarType(simdFunc->GetTypeCheckVarType()); |
| // We don't set SIMD args reg location here. We defer that after all function locals are processed. |
| // This allows us to capture all SIMD constants from locals initializations, add them to the register space before we assign registers to args and locals. |
| func->GetSimdVarsList().Add(var); |
| } |
| else |
| { |
| return Fail(rhs, _u("Wrong function used for argument definition")); |
| } |
| |
| if (!NodeDefineThisArgument(rhs->sxCall.pnodeArgs, var)) |
| { |
| return Fail(lhs, _u("Defining wrong argument")); |
| } |
| } |
| else |
| { |
| return Fail(rhs, _u("arguments are not casted as valid Asm.js type")); |
| } |
| |
| if (PHASE_TRACE1(ByteCodePhase)) |
| { |
| Output::Print(_u(" Argument [%s] Valid"), argName->Psz()); |
| } |
| |
| if (!func->EnsureArgType(var, index++)) |
| { |
| return Fail(rhs, _u("Unexpected argument type")); |
| } |
| |
| argNode = ParserWrapper::NextVar(argNode); |
| pnode = ParserWrapper::GetBinaryRight(pnode); |
| } |
| |
| func->SetBodyNode(pnode); |
| return true; |
| } |
| |
| bool AsmJsModuleCompiler::SetupLocalVariables(AsmJsFunc * func) |
| { |
| ParseNodePtr pnode = func->GetBodyNode(); |
| MathBuiltin mathBuiltin; |
| AsmJsMathFunction* mathFunc = nullptr; |
| AsmJsSIMDFunction* simdFunc = nullptr; |
| AsmJsSIMDValue simdValue; |
| simdValue.Zero(); |
| // define all variables |
| while (pnode->nop == knopList) |
| { |
| ParseNode * varNode = ParserWrapper::GetBinaryLeft(pnode); |
| while (varNode && varNode->nop != knopEndCode) |
| { |
| ParseNode * decl; |
| if (varNode->nop == knopList) |
| { |
| decl = ParserWrapper::GetBinaryLeft(varNode); |
| varNode = ParserWrapper::GetBinaryRight(varNode); |
| } |
| else |
| { |
| decl = varNode; |
| varNode = nullptr; |
| } |
| // if we have hit a non-declaration, we are done processing the function header |
| if (decl->nop != knopVarDecl) |
| { |
| goto varDeclEnd; |
| } |
| ParseNode* pnodeInit = decl->sxVar.pnodeInit; |
| AsmJsSymbol * declSym = nullptr; |
| |
| mathFunc = nullptr; |
| simdFunc = nullptr; |
| |
| if (!pnodeInit) |
| { |
| return Fail(decl, _u("The righthand side of a var declaration missing an initialization (empty)")); |
| } |
| |
| if (pnodeInit->nop == knopName) |
| { |
| declSym = LookupIdentifier(pnodeInit->name(), func); |
| if (!declSym || declSym->isMutable() || (declSym->GetSymbolType() != AsmJsSymbol::Variable && declSym->GetSymbolType() != AsmJsSymbol::MathConstant)) |
| { |
| return Fail(decl, _u("Var declaration with non-constant")); |
| } |
| } |
| else if (pnodeInit->nop == knopCall) |
| { |
| if (pnodeInit->sxCall.pnodeTarget->nop != knopName) |
| { |
| return Fail(decl, _u("Var declaration with something else than a literal value|fround call")); |
| } |
| AsmJsFunctionDeclaration* funcDecl = this->LookupFunction(pnodeInit->sxCall.pnodeTarget->name()); |
| |
| if (!funcDecl) |
| return Fail(pnodeInit, _u("Cannot resolve function name")); |
| |
| if (funcDecl->GetSymbolType() == AsmJsSymbol::MathBuiltinFunction) |
| { |
| mathFunc = funcDecl->Cast<AsmJsMathFunction>(); |
| if (!(mathFunc && mathFunc->GetMathBuiltInFunction() == AsmJSMathBuiltin_fround)) |
| { |
| return Fail(decl, _u("Var declaration with something else than a literal value|fround call")); |
| } |
| if (!ParserWrapper::IsFroundNumericLiteral(pnodeInit->sxCall.pnodeArgs)) |
| { |
| return Fail(decl, _u("Var declaration with something else than a literal value|fround call")); |
| } |
| } |
| else if (IsSimdjsEnabled() && funcDecl->GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction) |
| { |
| // var x = f4(1.0, 2.0, 3.0, 4.0); |
| simdFunc = funcDecl->Cast<AsmJsSIMDFunction>(); |
| if (!ValidateSimdConstructor(pnodeInit, simdFunc, simdValue)) |
| { |
| return Fail(varNode, _u("Invalid SIMD local declaration")); |
| } |
| } |
| } |
| else if (pnodeInit->nop != knopInt && pnodeInit->nop != knopFlt) |
| { |
| return Fail(decl, _u("Var declaration with something else than a literal value|fround call")); |
| } |
| if (!AsmJSCompiler::CheckIdentifier(*this, decl, decl->name())) |
| { |
| // CheckIdentifier will print failure message |
| return false; |
| } |
| |
| AsmJsVar* var = (AsmJsVar*)func->DefineVar(decl->name(), false); |
| if (!var) |
| { |
| return Fail(decl, _u("Failed to define var")); |
| } |
| RegSlot loc = Constants::NoRegister; |
| if (pnodeInit->nop == knopInt) |
| { |
| var->SetVarType(AsmJsVarType::Int); |
| var->SetLocation(func->AcquireRegister<int>()); |
| var->SetConstInitialiser(pnodeInit->sxInt.lw); |
| loc = func->GetConstRegister<int>(pnodeInit->sxInt.lw); |
| } |
| else if (ParserWrapper::IsMinInt(pnodeInit)) |
| { |
| var->SetVarType(AsmJsVarType::Int); |
| var->SetLocation(func->AcquireRegister<int>()); |
| var->SetConstInitialiser(MININT); |
| loc = func->GetConstRegister<int>(MININT); |
| } |
| else if (ParserWrapper::IsUnsigned(pnodeInit)) |
| { |
| var->SetVarType(AsmJsVarType::Int); |
| var->SetLocation(func->AcquireRegister<int>()); |
| var->SetConstInitialiser((int)((uint32)pnodeInit->sxFlt.dbl)); |
| loc = func->GetConstRegister<int>((uint32)pnodeInit->sxFlt.dbl); |
| } |
| else if (pnodeInit->nop == knopFlt) |
| { |
| if (pnodeInit->sxFlt.maybeInt) |
| { |
| return Fail(decl, _u("Var declaration with integer literal outside range [-2^31, 2^32)")); |
| } |
| var->SetVarType(AsmJsVarType::Double); |
| var->SetLocation(func->AcquireRegister<double>()); |
| loc = func->GetConstRegister<double>(pnodeInit->sxFlt.dbl); |
| var->SetConstInitialiser(pnodeInit->sxFlt.dbl); |
| } |
| else if (pnodeInit->nop == knopName) |
| { |
| if (declSym->GetSymbolType() == AsmJsSymbol::Variable) |
| { |
| AsmJsVar * definition = declSym->Cast<AsmJsVar>(); |
| switch (definition->GetVarType().which()) |
| { |
| case AsmJsVarType::Double: |
| var->SetVarType(AsmJsVarType::Double); |
| var->SetLocation(func->AcquireRegister<double>()); |
| var->SetConstInitialiser(definition->GetDoubleInitialiser()); |
| break; |
| |
| case AsmJsVarType::Float: |
| var->SetVarType(AsmJsVarType::Float); |
| var->SetLocation(func->AcquireRegister<float>()); |
| var->SetConstInitialiser(definition->GetFloatInitialiser()); |
| break; |
| |
| case AsmJsVarType::Int: |
| var->SetVarType(AsmJsVarType::Int); |
| var->SetLocation(func->AcquireRegister<int>()); |
| var->SetConstInitialiser(definition->GetIntInitialiser()); |
| break; |
| |
| default: |
| Assume(UNREACHED); |
| } |
| } |
| else |
| { |
| Assert(declSym->GetSymbolType() == AsmJsSymbol::MathConstant); |
| Assert(declSym->GetType() == AsmJsType::Double); |
| |
| AsmJsMathConst * definition = declSym->Cast<AsmJsMathConst>(); |
| |
| var->SetVarType(AsmJsVarType::Double); |
| var->SetLocation(func->AcquireRegister<double>()); |
| var->SetConstInitialiser(*definition->GetVal()); |
| } |
| } |
| else if (pnodeInit->nop == knopCall) |
| { |
| if (mathFunc) |
| { |
| var->SetVarType(AsmJsVarType::Float); |
| var->SetLocation(func->AcquireRegister<float>()); |
| if (pnodeInit->sxCall.pnodeArgs->nop == knopInt) |
| { |
| int iVal = pnodeInit->sxCall.pnodeArgs->sxInt.lw; |
| var->SetConstInitialiser((float)iVal); |
| loc = func->GetConstRegister<float>((float)iVal); |
| } |
| else if (ParserWrapper::IsNegativeZero(pnodeInit->sxCall.pnodeArgs)) |
| { |
| var->SetConstInitialiser(-0.0f); |
| loc = func->GetConstRegister<float>(-0.0f); |
| } |
| else |
| { |
| // note: fround((-)NumericLiteral) is explicitly allowed for any range, so we do not need to check for maybeInt |
| Assert(pnodeInit->sxCall.pnodeArgs->nop == knopFlt); |
| float fVal = (float)pnodeInit->sxCall.pnodeArgs->sxFlt.dbl; |
| var->SetConstInitialiser((float)fVal); |
| loc = func->GetConstRegister<float>(fVal); |
| } |
| } |
| else if (IsSimdjsEnabled() && simdFunc) |
| { |
| // simd constructor call |
| // en-register the simdvalue constant first |
| func->AddConst<AsmJsSIMDValue>(simdValue); |
| loc = func->GetConstRegister<AsmJsSIMDValue>(simdValue); |
| var->SetConstInitialiser(simdValue); |
| var->SetVarType(simdFunc->GetConstructorVarType()); |
| // add to list. assign register after all constants. |
| func->GetSimdVarsList().Add(var); |
| } |
| else |
| { |
| Assert(UNREACHED); |
| } |
| } |
| |
| if (loc == Constants::NoRegister && pnodeInit->nop != knopName) |
| { |
| return Fail(decl, _u("Cannot find Register constant for var")); |
| } |
| } |
| |
| if (ParserWrapper::GetBinaryRight(pnode)->nop == knopEndCode) |
| { |
| break; |
| } |
| pnode = ParserWrapper::GetBinaryRight(pnode); |
| } |
| |
| varDeclEnd: |
| // this code has to be on all exit-path from the function |
| if (IsSimdjsEnabled()) |
| { |
| // Now, assign registers to all SIMD vars after all constants are en-registered. |
| for (int i = 0; i < func->GetSimdVarsList().Count(); i++) |
| { |
| AsmJsVarBase *var = func->GetSimdVarsList().Item(i); |
| var->SetLocation(func->AcquireRegister<AsmJsSIMDValue>()); |
| } |
| func->GetSimdVarsList().Reset(); // list not needed anymore |
| } |
| return true; |
| } |
| |
| AsmJsFunc* AsmJsModuleCompiler::CreateNewFunctionEntry( ParseNode* pnodeFnc ) |
| { |
| PropertyName name = ParserWrapper::FunctionName( pnodeFnc ); |
| GetByteCodeGenerator()->AssignPropertyId(name); |
| AsmJsFunc* func = Anew( &mAllocator, AsmJsFunc, name, pnodeFnc, &mAllocator ); |
| if( func ) |
| { |
| if( DefineIdentifier( name, func ) ) |
| { |
| func->SetFunctionIndex( pnodeFnc->sxFnc.nestedIndex ); |
| // Add extra check to make sure all the slots between 0 - Count are filled with func; |
| mFunctionArray.SetItem( func->GetFunctionIndex(), func ); |
| return func; |
| } |
| // Error adding function |
| mAllocator.Free( func, sizeof( AsmJsFunc ) ); |
| } |
| // Error allocating a new function |
| return nullptr; |
| } |
| |
| bool AsmJsModuleCompiler::CheckChangeHeap(AsmJsFunc * func) |
| { |
| ParseNode * fncNode = func->GetFncNode(); |
| ParseNode * pnodeBody = fncNode->sxFnc.pnodeBody; |
| ParseNode * pnodeArgs = fncNode->sxFnc.pnodeParams; |
| |
| // match AST for changeHeap function. |
| // it must be defined in the following format (names/whitespace can differ): |
| //function changeHeap(newBuffer) |
| //{ |
| // if (byteLength(newBuffer) & 0xffffff || |
| // byteLength(newBuffer) <= 0xffffff || |
| // byteLength(newBuffer) > 0x80000000) |
| // return false; |
| // heap32 = new Int32Array(newBuffer); |
| // ... |
| // buffer = newBuffer; |
| // return true; |
| //} |
| |
| // ensure function |
| if (pnodeBody->nop != knopList || !pnodeArgs || pnodeArgs->nop != knopVarDecl) |
| { |
| return false; |
| } |
| |
| // ensure if expression |
| ParseNode * ifNode = pnodeBody->sxBin.pnode1; |
| if (ifNode->nop != knopIf || ifNode->sxIf.pnodeFalse) |
| { |
| return false; |
| } |
| |
| // validate "byteLength(newBuffer) > 0x80000000" |
| ParseNode * orNode = ifNode->sxIf.pnodeCond; |
| if (orNode->nop != knopLogOr || orNode->sxBin.pnode1->nop != knopLogOr) |
| { |
| return false; |
| } |
| ParseNode * cond = orNode->sxBin.pnode2; |
| if (cond->nop != knopGt || !CheckByteLengthCall(cond->sxBin.pnode1, pnodeArgs) || cond->sxBin.pnode2->nop != knopFlt || cond->sxBin.pnode2->sxFlt.dbl != 2147483648.0 || !cond->sxBin.pnode2->sxFlt.maybeInt) |
| { |
| return false; |
| } |
| |
| // validate "byteLength(newBuffer) <= 0xffffff" |
| orNode = orNode->sxBin.pnode1; |
| cond = orNode->sxBin.pnode2; |
| if (cond->nop != knopLe || !CheckByteLengthCall(cond->sxBin.pnode1, pnodeArgs) || cond->sxBin.pnode2->nop != knopInt || cond->sxBin.pnode2->sxInt.lw != 0x00ffffff) |
| { |
| return false; |
| } |
| |
| // validate "byteLength(newBuffer) & 0xffffff" |
| cond = orNode->sxBin.pnode1; |
| if (cond->nop != knopAnd || !CheckByteLengthCall(cond->sxBin.pnode1, pnodeArgs) || cond->sxBin.pnode2->nop != knopInt || cond->sxBin.pnode2->sxInt.lw != 0x00ffffff) |
| { |
| return false; |
| } |
| // validate "return false;" |
| cond = ifNode->sxIf.pnodeTrue; |
| if (!cond || cond->nop != knopReturn || cond->sxReturn.pnodeExpr->nop != knopFalse) |
| { |
| return false; |
| } |
| |
| // validate heap32 = new Int32Array(newBuffer); etc. |
| while (!mArrayViews.Empty()) |
| { |
| // all views that were instantiated must be replaced in the order which they were instantiated |
| AsmJsArrayView * requiredArrayView = mArrayViews.Dequeue(); |
| pnodeBody = pnodeBody->sxBin.pnode2; |
| if (pnodeBody->nop != knopList) |
| { |
| return false; |
| } |
| ParseNode * assignNode = pnodeBody->sxBin.pnode1; |
| if (assignNode->nop != knopAsg || assignNode->sxBin.pnode1->nop != knopName) |
| { |
| return false; |
| } |
| // validate left hand side |
| AsmJsSymbol * actualArraySym = LookupIdentifier(assignNode->sxBin.pnode1->name()); |
| if (requiredArrayView != actualArraySym) |
| { |
| return false; |
| } |
| |
| ParseNode * callNode = assignNode->sxBin.pnode2; |
| // validate correct argument is passed |
| if (callNode->nop != knopNew || !callNode->sxCall.pnodeArgs || callNode->sxCall.pnodeArgs->nop != knopName || callNode->sxCall.pnodeArgs->name()->GetPropertyId() != pnodeArgs->name()->GetPropertyId() || callNode->sxCall.pnodeTarget->nop != knopName) |
| { |
| return false; |
| } |
| // validate correct function is being called |
| AsmJsSymbol * callTargetSym = LookupIdentifier(callNode->sxCall.pnodeTarget->name()); |
| if (!callTargetSym || callTargetSym->GetSymbolType() != AsmJsSymbol::TypedArrayBuiltinFunction) |
| { |
| return false; |
| } |
| if (requiredArrayView->GetViewType() != callTargetSym->Cast<AsmJsTypedArrayFunction>()->GetViewType()) |
| { |
| return false; |
| } |
| } |
| pnodeBody = pnodeBody->sxBin.pnode2; |
| if (pnodeBody->nop != knopList) |
| { |
| return false; |
| } |
| |
| // validate buffer = newBuffer; |
| ParseNode * assign = pnodeBody->sxBin.pnode1; |
| if (assign->nop != knopAsg || assign->sxBin.pnode1->nop != knopName || !mBufferArgName || mBufferArgName->GetPropertyId() != assign->sxBin.pnode1->name()->GetPropertyId() || |
| assign->sxBin.pnode2->nop != knopName || pnodeArgs->name()->GetPropertyId() != assign->sxBin.pnode2->name()->GetPropertyId()) |
| { |
| return false; |
| } |
| // validate return true; |
| pnodeBody = pnodeBody->sxBin.pnode2; |
| if (pnodeBody->nop != knopList || pnodeBody->sxBin.pnode2->nop != knopEndCode || |
| pnodeBody->sxBin.pnode1->nop != knopReturn || !pnodeBody->sxBin.pnode1->sxReturn.pnodeExpr || pnodeBody->sxBin.pnode1->sxReturn.pnodeExpr->nop != knopTrue) |
| { |
| return false; |
| } |
| // now we should flag this module as containing changeHeap method |
| mUsesChangeHeap = true; |
| AsmJSByteCodeGenerator::EmitEmptyByteCode(func->GetFuncInfo(), GetByteCodeGenerator(), fncNode); |
| return true; |
| } |
| |
| bool AsmJsModuleCompiler::CheckByteLengthCall(ParseNode * callNode, ParseNode * bufferDecl) |
| { |
| if (callNode->nop != knopCall || callNode->sxCall.pnodeTarget->nop != knopName) |
| { |
| return false; |
| } |
| AsmJsSymbol* funcDecl = LookupIdentifier(callNode->sxCall.pnodeTarget->name()); |
| if (!funcDecl || funcDecl->GetSymbolType() != AsmJsSymbol::TypedArrayBuiltinFunction) |
| { |
| return false; |
| } |
| |
| AsmJsTypedArrayFunction* arrayFunc = funcDecl->Cast<AsmJsTypedArrayFunction>(); |
| return callNode->sxCall.argCount == 1 && |
| !callNode->sxCall.isApplyCall && |
| !callNode->sxCall.isEvalCall && |
| callNode->sxCall.spreadArgCount == 0 && |
| arrayFunc->GetArrayBuiltInFunction() == AsmJSTypedArrayBuiltin_byteLength && |
| callNode->sxCall.pnodeArgs->nop == knopName && |
| callNode->sxCall.pnodeArgs->name()->GetPropertyId() == bufferDecl->name()->GetPropertyId(); |
| } |
| |
| bool AsmJsModuleCompiler::Fail( ParseNode* usepn, const wchar *error ) |
| { |
| AsmJSCompiler::OutputError(GetScriptContext(), error); |
| return false; |
| } |
| |
| bool AsmJsModuleCompiler::FailName( ParseNode *usepn, const wchar *fmt, PropertyName name ) |
| { |
| AsmJSCompiler::OutputError(GetScriptContext(), fmt, name->Psz()); |
| return false; |
| } |
| |
| bool AsmJsModuleCompiler::LookupStandardLibraryMathName( PropertyName name, MathBuiltin *mathBuiltin ) const |
| { |
| return mStandardLibraryMathNames.TryGetValue( name->GetPropertyId(), mathBuiltin ); |
| } |
| |
| bool AsmJsModuleCompiler::LookupStandardLibraryArrayName(PropertyName name, TypedArrayBuiltin *builtin) const |
| { |
| return mStandardLibraryArrayNames.TryGetValue(name->GetPropertyId(), builtin); |
| } |
| |
| void AsmJsModuleCompiler::InitBufferArgName( PropertyName n ) |
| { |
| #if DBG |
| Assert( !mBufferArgNameInit ); |
| mBufferArgNameInit = true; |
| #endif |
| mBufferArgName = n; |
| } |
| |
| void AsmJsModuleCompiler::InitForeignArgName( PropertyName n ) |
| { |
| #if DBG |
| Assert( !mForeignArgNameInit ); |
| mForeignArgNameInit = true; |
| #endif |
| mForeignArgName = n; |
| } |
| |
| void AsmJsModuleCompiler::InitStdLibArgName( PropertyName n ) |
| { |
| #if DBG |
| Assert( !mStdLibArgNameInit ); |
| mStdLibArgNameInit = true; |
| #endif |
| mStdLibArgName = n; |
| } |
| |
| Js::PropertyName AsmJsModuleCompiler::GetStdLibArgName() const |
| { |
| #if DBG |
| Assert( mBufferArgNameInit ); |
| #endif |
| return mStdLibArgName; |
| } |
| |
| Js::PropertyName AsmJsModuleCompiler::GetForeignArgName() const |
| { |
| #if DBG |
| Assert( mForeignArgNameInit ); |
| #endif |
| return mForeignArgName; |
| } |
| |
| Js::PropertyName AsmJsModuleCompiler::GetBufferArgName() const |
| { |
| #if DBG |
| Assert( mStdLibArgNameInit ); |
| #endif |
| return mBufferArgName; |
| } |
| |
| bool AsmJsModuleCompiler::Init() |
| { |
| if( mInitialised ) |
| { |
| return false; |
| } |
| mInitialised = true; |
| |
| struct MathFunc |
| { |
| MathFunc( PropertyId id_ = 0, AsmJsMathFunction* val_ = nullptr ) : |
| id( id_ ), val( val_ ) |
| { |
| } |
| PropertyId id; |
| AsmJsMathFunction* val; |
| }; |
| MathFunc mathFunctions[AsmJSMathBuiltinFunction_COUNT]; |
| // we could move the mathBuiltinFuncname to MathFunc struct |
| mathFunctions[AsmJSMathBuiltin_sin ] = MathFunc(PropertyIds::sin , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_sin , OpCodeAsmJs::Sin_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_cos ] = MathFunc(PropertyIds::cos , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_cos , OpCodeAsmJs::Cos_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_tan ] = MathFunc(PropertyIds::tan , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_tan , OpCodeAsmJs::Tan_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_asin ] = MathFunc(PropertyIds::asin , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_asin , OpCodeAsmJs::Asin_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_acos ] = MathFunc(PropertyIds::acos , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_acos , OpCodeAsmJs::Acos_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_atan ] = MathFunc(PropertyIds::atan , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_atan , OpCodeAsmJs::Atan_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_ceil ] = MathFunc(PropertyIds::ceil , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_ceil , OpCodeAsmJs::Ceil_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_floor ] = MathFunc(PropertyIds::floor , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_floor , OpCodeAsmJs::Floor_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_exp ] = MathFunc(PropertyIds::exp , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_exp , OpCodeAsmJs::Exp_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_log ] = MathFunc(PropertyIds::log , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_log , OpCodeAsmJs::Log_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_pow ] = MathFunc(PropertyIds::pow , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 2, AsmJSMathBuiltin_pow , OpCodeAsmJs::Pow_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_sqrt ] = MathFunc(PropertyIds::sqrt , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_sqrt , OpCodeAsmJs::Sqrt_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_abs ] = MathFunc(PropertyIds::abs , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_abs , OpCodeAsmJs::Abs_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_atan2 ] = MathFunc(PropertyIds::atan2 , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 2, AsmJSMathBuiltin_atan2 , OpCodeAsmJs::Atan2_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble, AsmJsType::MaybeDouble )); |
| mathFunctions[AsmJSMathBuiltin_imul ] = MathFunc(PropertyIds::imul , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 2, AsmJSMathBuiltin_imul , OpCodeAsmJs::Imul_Int , AsmJsRetType::Signed, AsmJsType::Intish , AsmJsType::Intish )); |
| mathFunctions[AsmJSMathBuiltin_fround] = MathFunc(PropertyIds::fround, Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_fround, OpCodeAsmJs::Fround_Flt,AsmJsRetType::Float , AsmJsType::Floatish )); |
| mathFunctions[AsmJSMathBuiltin_min ] = MathFunc(PropertyIds::min , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 2, AsmJSMathBuiltin_min , OpCodeAsmJs::Min_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble, AsmJsType::MaybeDouble)); |
| mathFunctions[AsmJSMathBuiltin_max ] = MathFunc(PropertyIds::max , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 2, AsmJSMathBuiltin_max , OpCodeAsmJs::Max_Db , AsmJsRetType::Double, AsmJsType::MaybeDouble, AsmJsType::MaybeDouble)); |
| mathFunctions[AsmJSMathBuiltin_clz32 ] = MathFunc(PropertyIds::clz32 , Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_clz32 , OpCodeAsmJs::Clz32_Int, AsmJsRetType::Fixnum, AsmJsType::Intish)); |
| |
| mathFunctions[AsmJSMathBuiltin_abs].val->SetOverload(Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_abs, OpCodeAsmJs::Abs_Int, AsmJsRetType::Unsigned, AsmJsType::Signed)); |
| mathFunctions[AsmJSMathBuiltin_min].val->SetOverload(Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 2, AsmJSMathBuiltin_min, OpCodeAsmJs::Min_Int, AsmJsRetType::Signed, AsmJsType::Signed, AsmJsType::Signed)); |
| mathFunctions[AsmJSMathBuiltin_max].val->SetOverload(Anew( &mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 2, AsmJSMathBuiltin_max, OpCodeAsmJs::Max_Int, AsmJsRetType::Signed, AsmJsType::Signed, AsmJsType::Signed)); |
| |
| //Float Overloads |
| mathFunctions[AsmJSMathBuiltin_fround].val->SetOverload(Anew(&mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_fround, OpCodeAsmJs::Fround_Db, AsmJsRetType::Float, AsmJsType::MaybeDouble)); |
| mathFunctions[AsmJSMathBuiltin_fround].val->SetOverload(Anew(&mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_fround, OpCodeAsmJs::Fround_Int, AsmJsRetType::Float, AsmJsType::Int));// should we split this into signed and unsigned? |
| mathFunctions[AsmJSMathBuiltin_abs].val->SetOverload( Anew(&mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_abs, OpCodeAsmJs::Abs_Flt, AsmJsRetType::Floatish, AsmJsType::MaybeFloat)); |
| mathFunctions[AsmJSMathBuiltin_ceil].val->SetOverload( Anew(&mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_ceil, OpCodeAsmJs::Ceil_Flt, AsmJsRetType::Floatish, AsmJsType::MaybeFloat)); |
| mathFunctions[AsmJSMathBuiltin_floor].val->SetOverload( Anew(&mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_floor, OpCodeAsmJs::Floor_Flt, AsmJsRetType::Floatish, AsmJsType::MaybeFloat)); |
| mathFunctions[AsmJSMathBuiltin_sqrt].val->SetOverload( Anew(&mAllocator, AsmJsMathFunction, nullptr, &mAllocator, 1, AsmJSMathBuiltin_sqrt, OpCodeAsmJs::Sqrt_Flt, AsmJsRetType::Floatish, AsmJsType::MaybeFloat)); |
| |
| for (int i = 0; i < AsmJSMathBuiltinFunction_COUNT ; i++) |
| { |
| if( !AddStandardLibraryMathName( (PropertyId)mathFunctions[i].id, mathFunctions[i].val, mathFunctions[i].val->GetMathBuiltInFunction() ) ) |
| { |
| return false; |
| } |
| } |
| |
| struct ConstMath |
| { |
| ConstMath( PropertyId id_, const double* val_, AsmJSMathBuiltinFunction mathLibConstName_): |
| id(id_), val(val_), mathLibConstName(mathLibConstName_) { } |
| PropertyId id; |
| AsmJSMathBuiltinFunction mathLibConstName; |
| const double* val; |
| }; |
| ConstMath constMath[] = { |
| ConstMath( PropertyIds::E , &Math::E , AsmJSMathBuiltinFunction::AsmJSMathBuiltin_e ), |
| ConstMath(PropertyIds::LN10 , &Math::LN10 , AsmJSMathBuiltinFunction::AsmJSMathBuiltin_ln10), |
| ConstMath(PropertyIds::LN2 , &Math::LN2 , AsmJSMathBuiltinFunction::AsmJSMathBuiltin_ln2), |
| ConstMath(PropertyIds::LOG2E , &Math::LOG2E , AsmJSMathBuiltinFunction::AsmJSMathBuiltin_log2e), |
| ConstMath(PropertyIds::LOG10E , &Math::LOG10E , AsmJSMathBuiltinFunction::AsmJSMathBuiltin_log10e), |
| ConstMath(PropertyIds::PI , &Math::PI , AsmJSMathBuiltinFunction::AsmJSMathBuiltin_pi), |
| ConstMath(PropertyIds::SQRT1_2 , &Math::SQRT1_2 , AsmJSMathBuiltinFunction::AsmJSMathBuiltin_sqrt1_2), |
| ConstMath(PropertyIds::SQRT2 , &Math::SQRT2 , AsmJSMathBuiltinFunction::AsmJSMathBuiltin_sqrt2), |
| ConstMath(PropertyIds::Infinity , &NumberConstants::POSITIVE_INFINITY, AsmJSMathBuiltinFunction::AsmJSMathBuiltin_infinity), |
| ConstMath(PropertyIds::NaN , &NumberConstants::NaN , AsmJSMathBuiltinFunction::AsmJSMathBuiltin_nan), |
| }; |
| const int size = sizeof( constMath ) / sizeof( ConstMath ); |
| for (int i = 0; i < size ; i++) |
| { |
| if( !AddStandardLibraryMathName( constMath[i].id, constMath[i].val, constMath[i].mathLibConstName ) ) |
| { |
| return false; |
| } |
| } |
| |
| |
| struct ArrayFunc |
| { |
| ArrayFunc(PropertyId id_ = 0, AsmJsTypedArrayFunction* val_ = nullptr) : |
| id(id_), val(val_) |
| { |
| } |
| PropertyId id; |
| AsmJsTypedArrayFunction* val; |
| }; |
| |
| ArrayFunc arrayFunctions[AsmJSMathBuiltinFunction_COUNT]; |
| arrayFunctions[AsmJSTypedArrayBuiltin_Int8Array ] = ArrayFunc(PropertyIds::Int8Array, Anew(&mAllocator, AsmJsTypedArrayFunction, nullptr, &mAllocator, AsmJSTypedArrayBuiltin_Int8Array, ArrayBufferView::TYPE_INT8)); |
| arrayFunctions[AsmJSTypedArrayBuiltin_Uint8Array ] = ArrayFunc(PropertyIds::Uint8Array, Anew(&mAllocator, AsmJsTypedArrayFunction, nullptr, &mAllocator, AsmJSTypedArrayBuiltin_Uint8Array, ArrayBufferView::TYPE_UINT8)); |
| arrayFunctions[AsmJSTypedArrayBuiltin_Int16Array ] = ArrayFunc(PropertyIds::Int16Array, Anew(&mAllocator, AsmJsTypedArrayFunction, nullptr, &mAllocator, AsmJSTypedArrayBuiltin_Int16Array, ArrayBufferView::TYPE_INT16)); |
| arrayFunctions[AsmJSTypedArrayBuiltin_Uint16Array ] = ArrayFunc(PropertyIds::Uint16Array, Anew(&mAllocator, AsmJsTypedArrayFunction, nullptr, &mAllocator, AsmJSTypedArrayBuiltin_Uint16Array, ArrayBufferView::TYPE_UINT16)); |
| arrayFunctions[AsmJSTypedArrayBuiltin_Int32Array ] = ArrayFunc(PropertyIds::Int32Array, Anew(&mAllocator, AsmJsTypedArrayFunction, nullptr, &mAllocator, AsmJSTypedArrayBuiltin_Int32Array, ArrayBufferView::TYPE_INT32)); |
| arrayFunctions[AsmJSTypedArrayBuiltin_Uint32Array ] = ArrayFunc(PropertyIds::Uint32Array, Anew(&mAllocator, AsmJsTypedArrayFunction, nullptr, &mAllocator, AsmJSTypedArrayBuiltin_Uint32Array, ArrayBufferView::TYPE_UINT32)); |
| arrayFunctions[AsmJSTypedArrayBuiltin_Float32Array] = ArrayFunc(PropertyIds::Float32Array, Anew(&mAllocator, AsmJsTypedArrayFunction, nullptr, &mAllocator, AsmJSTypedArrayBuiltin_Float32Array, ArrayBufferView::TYPE_FLOAT32)); |
| arrayFunctions[AsmJSTypedArrayBuiltin_Float64Array] = ArrayFunc(PropertyIds::Float64Array, Anew(&mAllocator, AsmJsTypedArrayFunction, nullptr, &mAllocator, AsmJSTypedArrayBuiltin_Float64Array, ArrayBufferView::TYPE_FLOAT64)); |
| arrayFunctions[AsmJSTypedArrayBuiltin_byteLength ] = ArrayFunc(PropertyIds::byteLength, Anew(&mAllocator, AsmJsTypedArrayFunction, nullptr, &mAllocator, AsmJSTypedArrayBuiltin_byteLength, ArrayBufferView::TYPE_INVALID)); |
| |
| for (int i = 0; i < AsmJSTypedArrayBuiltin_COUNT; i++) |
| { |
| if (!AddStandardLibraryArrayName((PropertyId)arrayFunctions[i].id, arrayFunctions[i].val, arrayFunctions[i].val->GetArrayBuiltInFunction())) |
| { |
| return false; |
| } |
| } |
| // similar to math functions maps initialization. |
| if (IsSimdjsEnabled()) |
| { |
| if (!InitSIMDBuiltins()) |
| { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| bool AsmJsModuleCompiler::InitSIMDBuiltins() |
| { |
| struct SIMDFunc |
| { |
| SIMDFunc(PropertyId id_ = 0, AsmJsSIMDFunction* val_ = nullptr) : |
| id(id_), val(val_) |
| { |
| } |
| PropertyId id; |
| AsmJsSIMDFunction* val; |
| }; |
| |
| SIMDFunc simdFunctions[AsmJsSIMDBuiltin_COUNT]; |
| |
| // !! NOTE: Keep these grouped by SIMD type |
| |
| /* Int32x4 builtins*/ |
| //------------------- |
| simdFunctions[AsmJsSIMDBuiltin_Int32x4] = SIMDFunc(PropertyIds::Int32x4, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 4, AsmJsSIMDBuiltin_Int32x4, OpCodeAsmJs::Simd128_IntsToI4, AsmJsRetType::Int32x4, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_check] = SIMDFunc(PropertyIds::check, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_check, OpCodeAsmJs::Simd128_Ld_I4 /*no dynamic checks*/, AsmJsRetType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_splat] = SIMDFunc(PropertyIds::splat, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_splat, OpCodeAsmJs::Simd128_Splat_I4, AsmJsRetType::Int32x4, AsmJsType::Intish)); |
| #if 0 |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_fromFloat64x2] = SIMDFunc(PropertyIds::fromFloat64x2, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_fromFloat64x2, OpCodeAsmJs::Simd128_FromFloat64x2_I4, AsmJsRetType::Int32x4, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_fromFloat64x2Bits] = SIMDFunc(PropertyIds::fromFloat64x2Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_fromFloat64x2Bits, OpCodeAsmJs::Simd128_FromFloat64x2Bits_I4, AsmJsRetType::Int32x4, AsmJsType::Float64x2)); |
| #endif |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_fromFloat32x4] = SIMDFunc(PropertyIds::fromFloat32x4, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_fromFloat32x4, OpCodeAsmJs::Simd128_FromFloat32x4_I4, AsmJsRetType::Int32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_fromFloat32x4Bits] = SIMDFunc(PropertyIds::fromFloat32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_fromFloat32x4Bits, OpCodeAsmJs::Simd128_FromFloat32x4Bits_I4, AsmJsRetType::Int32x4, AsmJsType::Float32x4)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_fromInt16x8Bits] = SIMDFunc(PropertyIds::fromInt16x8Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_fromInt16x8Bits, OpCodeAsmJs::Simd128_FromInt16x8Bits_I4, AsmJsRetType::Int32x4, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_fromInt8x16Bits] = SIMDFunc(PropertyIds::fromInt8x16Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_fromInt8x16Bits, OpCodeAsmJs::Simd128_FromInt8x16Bits_I4, AsmJsRetType::Int32x4, AsmJsType::Int8x16)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_fromUint32x4Bits] = SIMDFunc(PropertyIds::fromUint32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_fromUint32x4Bits, OpCodeAsmJs::Simd128_FromUint32x4Bits_I4, AsmJsRetType::Int32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_fromUint16x8Bits] = SIMDFunc(PropertyIds::fromUint16x8Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_fromUint16x8Bits, OpCodeAsmJs::Simd128_FromUint16x8Bits_I4, AsmJsRetType::Int32x4, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_fromUint8x16Bits] = SIMDFunc(PropertyIds::fromUint8x16Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_fromUint8x16Bits, OpCodeAsmJs::Simd128_FromUint8x16Bits_I4, AsmJsRetType::Int32x4, AsmJsType::Uint8x16)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_neg] = SIMDFunc(PropertyIds::neg, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_neg, OpCodeAsmJs::Simd128_Neg_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_add] = SIMDFunc(PropertyIds::add, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_add, OpCodeAsmJs::Simd128_Add_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_sub] = SIMDFunc(PropertyIds::sub, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_sub, OpCodeAsmJs::Simd128_Sub_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_mul] = SIMDFunc(PropertyIds::mul, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_mul, OpCodeAsmJs::Simd128_Mul_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_swizzle] = SIMDFunc(PropertyIds::swizzle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 5, AsmJsSIMDBuiltin_int32x4_swizzle, OpCodeAsmJs::Simd128_Swizzle_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_shuffle] = SIMDFunc(PropertyIds::shuffle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 6, AsmJsSIMDBuiltin_int32x4_shuffle, OpCodeAsmJs::Simd128_Shuffle_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4, AsmJsType::Int32x4, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_extractLane] = SIMDFunc(PropertyIds::extractLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_extractLane, OpCodeAsmJs::Simd128_ExtractLane_I4, AsmJsRetType::Signed, AsmJsType::Int32x4, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_replaceLane] = SIMDFunc(PropertyIds::replaceLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_int32x4_replaceLane, OpCodeAsmJs::Simd128_ReplaceLane_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4, AsmJsType::Int, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_lessThan] = SIMDFunc(PropertyIds::lessThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_lessThan, OpCodeAsmJs::Simd128_Lt_I4, AsmJsRetType::Bool32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_lessThanOrEqual] = SIMDFunc(PropertyIds::lessThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_lessThanOrEqual, OpCodeAsmJs::Simd128_LtEq_I4, AsmJsRetType::Bool32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_equal] = SIMDFunc(PropertyIds::equal, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_equal, OpCodeAsmJs::Simd128_Eq_I4, AsmJsRetType::Bool32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_notEqual] = SIMDFunc(PropertyIds::notEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_notEqual, OpCodeAsmJs::Simd128_Neq_I4, AsmJsRetType::Bool32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_greaterThan] = SIMDFunc(PropertyIds::greaterThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_greaterThan, OpCodeAsmJs::Simd128_Gt_I4, AsmJsRetType::Bool32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_greaterThanOrEqual] = SIMDFunc(PropertyIds::greaterThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_greaterThanOrEqual, OpCodeAsmJs::Simd128_GtEq_I4, AsmJsRetType::Bool32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_select] = SIMDFunc(PropertyIds::select, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_int32x4_select, OpCodeAsmJs::Simd128_Select_I4, AsmJsRetType::Int32x4, AsmJsType::Bool32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_and] = SIMDFunc(PropertyIds::and, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_and, OpCodeAsmJs::Simd128_And_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_or] = SIMDFunc(PropertyIds::or, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_or, OpCodeAsmJs::Simd128_Or_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_xor] = SIMDFunc(PropertyIds::xor, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_xor, OpCodeAsmJs::Simd128_Xor_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_not] = SIMDFunc(PropertyIds::not, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int32x4_not, OpCodeAsmJs::Simd128_Not_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_shiftLeftByScalar] = SIMDFunc(PropertyIds::shiftLeftByScalar, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_shiftLeftByScalar, OpCodeAsmJs::Simd128_ShLtByScalar_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_shiftRightByScalar] = SIMDFunc(PropertyIds::shiftRightByScalar, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_shiftRightByScalar, OpCodeAsmJs::Simd128_ShRtByScalar_I4, AsmJsRetType::Int32x4, AsmJsType::Int32x4, AsmJsType::Int)); |
| |
| // Loads and Stores |
| // We fill Void for the tarray type. This is ok since we special handle these ops. |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_load] = SIMDFunc(PropertyIds::load, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_load, OpCodeAsmJs::Simd128_LdArr_I4, AsmJsRetType::Int32x4, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_load1] = SIMDFunc(PropertyIds::load1, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_load1, OpCodeAsmJs::Simd128_LdArr_I4, AsmJsRetType::Int32x4, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_load2] = SIMDFunc(PropertyIds::load2, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_load2, OpCodeAsmJs::Simd128_LdArr_I4, AsmJsRetType::Int32x4, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_load3] = SIMDFunc(PropertyIds::load3, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int32x4_load3, OpCodeAsmJs::Simd128_LdArr_I4, AsmJsRetType::Int32x4, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_store] = SIMDFunc(PropertyIds::store, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_int32x4_store, OpCodeAsmJs::Simd128_StArr_I4, AsmJsRetType::Int32x4, AsmJsType::Void, AsmJsType::Int, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_store1] = SIMDFunc(PropertyIds::store1, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_int32x4_store1, OpCodeAsmJs::Simd128_StArr_I4, AsmJsRetType::Int32x4, AsmJsType::Void, AsmJsType::Int, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_store2] = SIMDFunc(PropertyIds::store2, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_int32x4_store2, OpCodeAsmJs::Simd128_StArr_I4, AsmJsRetType::Int32x4, AsmJsType::Void, AsmJsType::Int, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int32x4_store3] = SIMDFunc(PropertyIds::store3, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_int32x4_store3, OpCodeAsmJs::Simd128_StArr_I4, AsmJsRetType::Int32x4, AsmJsType::Void, AsmJsType::Int, AsmJsType::Int32x4)); |
| |
| /* Float32x4 builtins*/ |
| //------------------- |
| simdFunctions[AsmJsSIMDBuiltin_Float32x4] = SIMDFunc(PropertyIds::Float32x4, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 4, AsmJsSIMDBuiltin_Float32x4, OpCodeAsmJs::Simd128_FloatsToF4, AsmJsRetType::Float32x4, AsmJsType::FloatishDoubleLit, AsmJsType::FloatishDoubleLit, AsmJsType::FloatishDoubleLit, AsmJsType::FloatishDoubleLit)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_check] = SIMDFunc(PropertyIds::check, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_check, OpCodeAsmJs::Simd128_Ld_F4 /*no dynamic checks*/, AsmJsRetType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_splat] = SIMDFunc(PropertyIds::splat, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_splat, OpCodeAsmJs::Simd128_Splat_F4, AsmJsRetType::Float32x4, AsmJsType::FloatishDoubleLit)); |
| #if 0 |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_fromFloat64x2] = SIMDFunc(PropertyIds::fromFloat64x2, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_fromFloat64x2, OpCodeAsmJs::Simd128_FromFloat64x2_F4, AsmJsRetType::Float32x4, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_fromFloat64x2Bits] = SIMDFunc(PropertyIds::fromFloat64x2Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_fromFloat64x2Bits, OpCodeAsmJs::Simd128_FromFloat64x2Bits_F4, AsmJsRetType::Float32x4, AsmJsType::Float64x2)); |
| #endif |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_fromInt32x4] = SIMDFunc(PropertyIds::fromInt32x4, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_fromInt32x4, OpCodeAsmJs::Simd128_FromInt32x4_F4, AsmJsRetType::Float32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_fromUint32x4] = SIMDFunc(PropertyIds::fromUint32x4, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_fromUint32x4, OpCodeAsmJs::Simd128_FromUint32x4_F4, AsmJsRetType::Float32x4, AsmJsType::Uint32x4)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_fromInt32x4Bits] = SIMDFunc(PropertyIds::fromInt32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_fromInt32x4Bits, OpCodeAsmJs::Simd128_FromInt32x4Bits_F4, AsmJsRetType::Float32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_fromInt16x8Bits] = SIMDFunc(PropertyIds::fromInt16x8Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_fromInt16x8Bits, OpCodeAsmJs::Simd128_FromInt16x8Bits_F4, AsmJsRetType::Float32x4, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_fromInt8x16Bits] = SIMDFunc(PropertyIds::fromInt8x16Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_fromInt8x16Bits, OpCodeAsmJs::Simd128_FromInt8x16Bits_F4, AsmJsRetType::Float32x4, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_fromUint32x4Bits] = SIMDFunc(PropertyIds::fromUint32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_fromUint32x4Bits, OpCodeAsmJs::Simd128_FromUint32x4Bits_F4, AsmJsRetType::Float32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_fromUint16x8Bits] = SIMDFunc(PropertyIds::fromUint16x8Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_fromUint16x8Bits, OpCodeAsmJs::Simd128_FromUint16x8Bits_F4, AsmJsRetType::Float32x4, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_fromUint8x16Bits] = SIMDFunc(PropertyIds::fromUint8x16Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_fromUint8x16Bits, OpCodeAsmJs::Simd128_FromUint8x16Bits_F4, AsmJsRetType::Float32x4, AsmJsType::Uint8x16)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_abs] = SIMDFunc(PropertyIds::abs, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_abs, OpCodeAsmJs::Simd128_Abs_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_neg] = SIMDFunc(PropertyIds::neg, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_neg, OpCodeAsmJs::Simd128_Neg_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_add] = SIMDFunc(PropertyIds::add, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_add, OpCodeAsmJs::Simd128_Add_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_sub] = SIMDFunc(PropertyIds::sub, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_sub, OpCodeAsmJs::Simd128_Sub_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_mul] = SIMDFunc(PropertyIds::mul, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_mul, OpCodeAsmJs::Simd128_Mul_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_div] = SIMDFunc(PropertyIds::div, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_div, OpCodeAsmJs::Simd128_Div_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_min] = SIMDFunc(PropertyIds::min, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_min, OpCodeAsmJs::Simd128_Min_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_max] = SIMDFunc(PropertyIds::max, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_max, OpCodeAsmJs::Simd128_Max_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_minNum] = SIMDFunc(PropertyIds::minNum, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_minNum, OpCodeAsmJs::Simd128_MinNum_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_maxNum] = SIMDFunc(PropertyIds::maxNum, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_maxNum, OpCodeAsmJs::Simd128_MaxNum_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_reciprocal] = SIMDFunc(PropertyIds::reciprocalApproximation, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_reciprocal, OpCodeAsmJs::Simd128_Rcp_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_reciprocalSqrt] = SIMDFunc(PropertyIds::reciprocalSqrtApproximation, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_reciprocalSqrt, OpCodeAsmJs::Simd128_RcpSqrt_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_sqrt] = SIMDFunc(PropertyIds::sqrt, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float32x4_sqrt, OpCodeAsmJs::Simd128_Sqrt_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_swizzle] = SIMDFunc(PropertyIds::swizzle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 5, AsmJsSIMDBuiltin_float32x4_swizzle, OpCodeAsmJs::Simd128_Swizzle_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_shuffle] = SIMDFunc(PropertyIds::shuffle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 6, AsmJsSIMDBuiltin_float32x4_shuffle, OpCodeAsmJs::Simd128_Shuffle_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4, AsmJsType::Float32x4, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_extractLane] = SIMDFunc(PropertyIds::extractLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_extractLane, OpCodeAsmJs::Simd128_ExtractLane_F4, AsmJsRetType::Float, AsmJsType::Float32x4, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_replaceLane] = SIMDFunc(PropertyIds::replaceLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_float32x4_replaceLane, OpCodeAsmJs::Simd128_ReplaceLane_F4, AsmJsRetType::Float32x4, AsmJsType::Float32x4, AsmJsType::Int, AsmJsType::FloatishDoubleLit)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_lessThan] = SIMDFunc(PropertyIds::lessThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_lessThan, OpCodeAsmJs::Simd128_Lt_F4, AsmJsRetType::Bool32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_lessThanOrEqual] = SIMDFunc(PropertyIds::lessThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_lessThanOrEqual, OpCodeAsmJs::Simd128_LtEq_F4, AsmJsRetType::Bool32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_equal] = SIMDFunc(PropertyIds::equal, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_equal, OpCodeAsmJs::Simd128_Eq_F4, AsmJsRetType::Bool32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_notEqual] = SIMDFunc(PropertyIds::notEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_notEqual, OpCodeAsmJs::Simd128_Neq_F4, AsmJsRetType::Bool32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_greaterThan] = SIMDFunc(PropertyIds::greaterThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_greaterThan, OpCodeAsmJs::Simd128_Gt_F4, AsmJsRetType::Bool32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_greaterThanOrEqual]= SIMDFunc(PropertyIds::greaterThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_greaterThanOrEqual, OpCodeAsmJs::Simd128_GtEq_F4, AsmJsRetType::Bool32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_select] = SIMDFunc(PropertyIds::select, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_float32x4_select, OpCodeAsmJs::Simd128_Select_F4, AsmJsRetType::Float32x4, AsmJsType::Bool32x4, AsmJsType::Float32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_load] = SIMDFunc(PropertyIds::load, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_load, OpCodeAsmJs::Simd128_LdArr_F4, AsmJsRetType::Float32x4, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_load1] = SIMDFunc(PropertyIds::load1, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_load1, OpCodeAsmJs::Simd128_LdArr_F4, AsmJsRetType::Float32x4, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_load2] = SIMDFunc(PropertyIds::load2, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_load2, OpCodeAsmJs::Simd128_LdArr_F4, AsmJsRetType::Float32x4, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_load3] = SIMDFunc(PropertyIds::load3, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float32x4_load3, OpCodeAsmJs::Simd128_LdArr_F4, AsmJsRetType::Float32x4, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_store] = SIMDFunc(PropertyIds::store, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_float32x4_store, OpCodeAsmJs::Simd128_StArr_F4, AsmJsRetType::Float32x4, AsmJsType::Void, AsmJsType::Int, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_store1] = SIMDFunc(PropertyIds::store1, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_float32x4_store1, OpCodeAsmJs::Simd128_StArr_F4, AsmJsRetType::Float32x4, AsmJsType::Void, AsmJsType::Int, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_store2] = SIMDFunc(PropertyIds::store2, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_float32x4_store2, OpCodeAsmJs::Simd128_StArr_F4, AsmJsRetType::Float32x4, AsmJsType::Void, AsmJsType::Int, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float32x4_store3] = SIMDFunc(PropertyIds::store3, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_float32x4_store3, OpCodeAsmJs::Simd128_StArr_F4, AsmJsRetType::Float32x4, AsmJsType::Void, AsmJsType::Int, AsmJsType::Float32x4)); |
| |
| /* Float64x2 builtins*/ |
| //------------------- |
| #if 0 |
| simdFunctions[AsmJsSIMDBuiltin_Float64x2] = SIMDFunc(PropertyIds::Float64x2, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_Float64x2, OpCodeAsmJs::Simd128_DoublesToD2, AsmJsRetType::Float64x2, AsmJsType::MaybeDouble, AsmJsType::MaybeDouble)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_check] = SIMDFunc(PropertyIds::check, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float64x2_check, OpCodeAsmJs::Simd128_Ld_D2 /*no dynamic checks*/, AsmJsRetType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_splat] = SIMDFunc(PropertyIds::splat, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float64x2_splat, OpCodeAsmJs::Simd128_Splat_D2, AsmJsRetType::Float64x2, AsmJsType::Double)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_fromFloat32x4] = SIMDFunc(PropertyIds::fromFloat32x4, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float64x2_fromFloat32x4, OpCodeAsmJs::Simd128_FromFloat32x4_D2, AsmJsRetType::Float64x2, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_fromFloat32x4Bits] = SIMDFunc(PropertyIds::fromFloat32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float64x2_fromFloat32x4Bits, OpCodeAsmJs::Simd128_FromFloat32x4Bits_D2, AsmJsRetType::Float64x2, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_fromInt32x4] = SIMDFunc(PropertyIds::fromInt32x4, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float64x2_fromInt32x4, OpCodeAsmJs::Simd128_FromInt32x4_D2, AsmJsRetType::Float64x2, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_fromInt32x4Bits] = SIMDFunc(PropertyIds::fromInt32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float64x2_fromInt32x4Bits, OpCodeAsmJs::Simd128_FromInt32x4Bits_D2, AsmJsRetType::Float64x2, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_abs] = SIMDFunc(PropertyIds::abs, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float64x2_abs, OpCodeAsmJs::Simd128_Abs_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_neg] = SIMDFunc(PropertyIds::neg, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float64x2_neg, OpCodeAsmJs::Simd128_Neg_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_add] = SIMDFunc(PropertyIds::add, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_add, OpCodeAsmJs::Simd128_Add_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_sub] = SIMDFunc(PropertyIds::sub, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_sub, OpCodeAsmJs::Simd128_Sub_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_mul] = SIMDFunc(PropertyIds::mul, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_mul, OpCodeAsmJs::Simd128_Mul_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_div] = SIMDFunc(PropertyIds::div, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_div, OpCodeAsmJs::Simd128_Div_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_min] = SIMDFunc(PropertyIds::min, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_min, OpCodeAsmJs::Simd128_Min_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_max] = SIMDFunc(PropertyIds::max, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_max, OpCodeAsmJs::Simd128_Max_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_reciprocal] = SIMDFunc(PropertyIds::reciprocalApproximation, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float64x2_reciprocal, OpCodeAsmJs::Simd128_Rcp_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_reciprocalSqrt] = SIMDFunc(PropertyIds::reciprocalSqrtApproximation, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float64x2_reciprocalSqrt, OpCodeAsmJs::Simd128_RcpSqrt_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_sqrt] = SIMDFunc(PropertyIds::sqrt, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_float64x2_sqrt, OpCodeAsmJs::Simd128_Sqrt_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_swizzle] = SIMDFunc(PropertyIds::swizzle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_float64x2_swizzle, OpCodeAsmJs::Simd128_Swizzle_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_shuffle] = SIMDFunc(PropertyIds::shuffle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 4, AsmJsSIMDBuiltin_float64x2_shuffle, OpCodeAsmJs::Simd128_Shuffle_D2, AsmJsRetType::Float64x2, AsmJsType::Float64x2, AsmJsType::Float64x2, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_lessThan] = SIMDFunc(PropertyIds::lessThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_lessThan, OpCodeAsmJs::Simd128_Lt_D2, AsmJsRetType::Bool32x4, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_lessThanOrEqual] = SIMDFunc(PropertyIds::lessThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_lessThanOrEqual, OpCodeAsmJs::Simd128_LtEq_D2, AsmJsRetType::Bool32x4, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_equal] = SIMDFunc(PropertyIds::equal, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_equal, OpCodeAsmJs::Simd128_Eq_D2, AsmJsRetType::Bool32x4, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_notEqual] = SIMDFunc(PropertyIds::notEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_notEqual, OpCodeAsmJs::Simd128_Neq_D2, AsmJsRetType::Bool32x4, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_greaterThan] = SIMDFunc(PropertyIds::greaterThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_greaterThan, OpCodeAsmJs::Simd128_Gt_D2, AsmJsRetType::Bool32x4, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_greaterThanOrEqual]= SIMDFunc(PropertyIds::greaterThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_greaterThanOrEqual, OpCodeAsmJs::Simd128_GtEq_D2, AsmJsRetType::Bool32x4, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_select] = SIMDFunc(PropertyIds::select, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_float64x2_select, OpCodeAsmJs::Simd128_Select_D2, AsmJsRetType::Float64x2, AsmJsType::Bool32x4, AsmJsType::Float64x2, AsmJsType::Float64x2)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_load] = SIMDFunc(PropertyIds::load, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_load, OpCodeAsmJs::Simd128_LdArr_D2, AsmJsRetType::Float64x2, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_load1] = SIMDFunc(PropertyIds::load1, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_float64x2_load1, OpCodeAsmJs::Simd128_LdArr_D2, AsmJsRetType::Float64x2, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_store] = SIMDFunc(PropertyIds::store, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_float64x2_store, OpCodeAsmJs::Simd128_StArr_D2, AsmJsRetType::Float64x2, AsmJsType::Void, AsmJsType::Int, AsmJsType::Float64x2)); |
| simdFunctions[AsmJsSIMDBuiltin_float64x2_store1] = SIMDFunc(PropertyIds::store1, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_float64x2_store1, OpCodeAsmJs::Simd128_StArr_D2, AsmJsRetType::Float64x2, AsmJsType::Void, AsmJsType::Int, AsmJsType::Float64x2)); |
| #endif |
| /* Int16x8 */ |
| simdFunctions[AsmJsSIMDBuiltin_Int16x8] = SIMDFunc(PropertyIds::Int16x8, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 8, AsmJsSIMDBuiltin_Int16x8, OpCodeAsmJs::Simd128_IntsToI8, AsmJsRetType::Int16x8, |
| AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_check] = SIMDFunc(PropertyIds::check, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int16x8_check, OpCodeAsmJs::Simd128_Ld_I8 /*no dynamic checks*/, AsmJsRetType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_extractLane] = SIMDFunc(PropertyIds::extractLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_extractLane, OpCodeAsmJs::Simd128_ExtractLane_I8, AsmJsRetType::Signed, AsmJsType::Int16x8, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_swizzle] = SIMDFunc(PropertyIds::swizzle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 9, AsmJsSIMDBuiltin_int16x8_swizzle, OpCodeAsmJs::Simd128_Swizzle_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int, |
| AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_shuffle] = SIMDFunc(PropertyIds::shuffle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 10, AsmJsSIMDBuiltin_int16x8_shuffle, OpCodeAsmJs::Simd128_Shuffle_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int16x8, |
| AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_splat] = SIMDFunc(PropertyIds::splat, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int16x8_splat, OpCodeAsmJs::Simd128_Splat_I8, AsmJsRetType::Int16x8, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_replaceLane] = SIMDFunc(PropertyIds::replaceLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_int16x8_replaceLane, OpCodeAsmJs::Simd128_ReplaceLane_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_and] = SIMDFunc(PropertyIds::and, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_and, OpCodeAsmJs::Simd128_And_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_or] = SIMDFunc(PropertyIds::or, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_or, OpCodeAsmJs::Simd128_Or_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_xor] = SIMDFunc(PropertyIds::xor , Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_xor, OpCodeAsmJs::Simd128_Xor_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_not] = SIMDFunc(PropertyIds::not, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int16x8_not, OpCodeAsmJs::Simd128_Not_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_add] = SIMDFunc(PropertyIds::add, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_add, OpCodeAsmJs::Simd128_Add_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_sub] = SIMDFunc(PropertyIds::sub, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_sub, OpCodeAsmJs::Simd128_Sub_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_mul] = SIMDFunc(PropertyIds::mul, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_mul, OpCodeAsmJs::Simd128_Mul_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_neg] = SIMDFunc(PropertyIds::neg, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int16x8_neg, OpCodeAsmJs::Simd128_Neg_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_shiftLeftByScalar] = SIMDFunc(PropertyIds::shiftLeftByScalar, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_shiftLeftByScalar, OpCodeAsmJs::Simd128_ShLtByScalar_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_shiftRightByScalar] = SIMDFunc(PropertyIds::shiftRightByScalar, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_shiftRightByScalar, OpCodeAsmJs::Simd128_ShRtByScalar_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_lessThan] = SIMDFunc(PropertyIds::lessThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_lessThan, OpCodeAsmJs::Simd128_Lt_I8, AsmJsRetType::Bool16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_lessThanOrEqual] = SIMDFunc(PropertyIds::lessThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_lessThanOrEqual, OpCodeAsmJs::Simd128_LtEq_I8, AsmJsRetType::Bool16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_equal] = SIMDFunc(PropertyIds::equal, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_equal, OpCodeAsmJs::Simd128_Eq_I8, AsmJsRetType::Bool16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_notEqual] = SIMDFunc(PropertyIds::notEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_notEqual, OpCodeAsmJs::Simd128_Neq_I8, AsmJsRetType::Bool16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_greaterThan] = SIMDFunc(PropertyIds::greaterThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_greaterThan, OpCodeAsmJs::Simd128_Gt_I8, AsmJsRetType::Bool16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_greaterThanOrEqual] = SIMDFunc(PropertyIds::greaterThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_greaterThanOrEqual, OpCodeAsmJs::Simd128_GtEq_I8, AsmJsRetType::Bool16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_select] = SIMDFunc(PropertyIds::select, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_int16x8_select, OpCodeAsmJs::Simd128_Select_I8, AsmJsRetType::Int16x8, AsmJsType::Bool16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_addSaturate] = SIMDFunc(PropertyIds::addSaturate, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_addSaturate, OpCodeAsmJs::Simd128_AddSaturate_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_subSaturate] = SIMDFunc(PropertyIds::subSaturate, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_subSaturate, OpCodeAsmJs::Simd128_SubSaturate_I8, AsmJsRetType::Int16x8, AsmJsType::Int16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_load] = SIMDFunc(PropertyIds::load, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int16x8_load, OpCodeAsmJs::Simd128_LdArr_I8, AsmJsRetType::Int16x8, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_store] = SIMDFunc(PropertyIds::store, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_int16x8_store, OpCodeAsmJs::Simd128_StArr_I8, AsmJsRetType::Int16x8, AsmJsType::Void, AsmJsType::Int, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_fromFloat32x4Bits] = SIMDFunc(PropertyIds::fromFloat32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int16x8_fromFloat32x4Bits, OpCodeAsmJs::Simd128_FromFloat32x4Bits_I8, AsmJsRetType::Int16x8, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_fromInt32x4Bits] = SIMDFunc(PropertyIds::fromInt32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int16x8_fromInt32x4Bits, OpCodeAsmJs::Simd128_FromInt32x4Bits_I8, AsmJsRetType::Int16x8, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_fromInt8x16Bits] = SIMDFunc(PropertyIds::fromInt8x16Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int16x8_fromInt8x16Bits, OpCodeAsmJs::Simd128_FromInt8x16Bits_I8, AsmJsRetType::Int16x8, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_fromUint32x4Bits] = SIMDFunc(PropertyIds::fromUint32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int16x8_fromUint32x4Bits, OpCodeAsmJs::Simd128_FromUint32x4Bits_I8, AsmJsRetType::Int16x8, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_fromUint16x8Bits] = SIMDFunc(PropertyIds::fromUint16x8Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int16x8_fromUint16x8Bits, OpCodeAsmJs::Simd128_FromUint16x8Bits_I8, AsmJsRetType::Int16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int16x8_fromUint8x16Bits] = SIMDFunc(PropertyIds::fromUint8x16Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int16x8_fromUint8x16Bits, OpCodeAsmJs::Simd128_FromUint8x16Bits_I8, AsmJsRetType::Int16x8, AsmJsType::Uint8x16)); |
| |
| /* Int8x16 builtins*/ |
| //------------------- |
| simdFunctions[AsmJsSIMDBuiltin_Int8x16] = SIMDFunc(PropertyIds::Int8x16, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 16, AsmJsSIMDBuiltin_Int8x16, OpCodeAsmJs::Simd128_IntsToI16, AsmJsRetType::Int8x16, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_check] = SIMDFunc(PropertyIds::check, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int8x16_check, OpCodeAsmJs::Simd128_Ld_I16 /*no dynamic checks*/, AsmJsRetType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_splat] = SIMDFunc(PropertyIds::splat, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int8x16_splat, OpCodeAsmJs::Simd128_Splat_I16, AsmJsRetType::Int8x16, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_neg] = SIMDFunc(PropertyIds::neg, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int8x16_neg, OpCodeAsmJs::Simd128_Neg_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_add] = SIMDFunc(PropertyIds::add, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_add, OpCodeAsmJs::Simd128_Add_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_sub] = SIMDFunc(PropertyIds::sub, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_sub, OpCodeAsmJs::Simd128_Sub_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_mul] = SIMDFunc(PropertyIds::mul, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_mul, OpCodeAsmJs::Simd128_Mul_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_and] = SIMDFunc(PropertyIds::and, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_and, OpCodeAsmJs::Simd128_And_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_or] = SIMDFunc(PropertyIds:: or , Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_or, OpCodeAsmJs::Simd128_Or_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_xor] = SIMDFunc(PropertyIds::xor, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_xor, OpCodeAsmJs::Simd128_Xor_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_not] = SIMDFunc(PropertyIds::not, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int8x16_not, OpCodeAsmJs::Simd128_Not_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_shiftLeftByScalar] = SIMDFunc(PropertyIds::shiftLeftByScalar, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_shiftLeftByScalar, OpCodeAsmJs::Simd128_ShLtByScalar_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_shiftRightByScalar] = SIMDFunc(PropertyIds::shiftRightByScalar, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_shiftRightByScalar, OpCodeAsmJs::Simd128_ShRtByScalar_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, AsmJsType::Int)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_lessThan] = SIMDFunc(PropertyIds::lessThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_lessThan, OpCodeAsmJs::Simd128_Lt_I16, AsmJsRetType::Bool8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_lessThanOrEqual] = SIMDFunc(PropertyIds::lessThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_lessThanOrEqual, OpCodeAsmJs::Simd128_LtEq_I16, AsmJsRetType::Bool8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_equal] = SIMDFunc(PropertyIds::equal, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_equal, OpCodeAsmJs::Simd128_Eq_I16, AsmJsRetType::Bool8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_notEqual] = SIMDFunc(PropertyIds::notEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_notEqual, OpCodeAsmJs::Simd128_Neq_I16, AsmJsRetType::Bool8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_greaterThan] = SIMDFunc(PropertyIds::greaterThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_greaterThan, OpCodeAsmJs::Simd128_Gt_I16, AsmJsRetType::Bool8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_greaterThanOrEqual] = SIMDFunc(PropertyIds::greaterThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_greaterThanOrEqual, OpCodeAsmJs::Simd128_GtEq_I16, AsmJsRetType::Bool8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_select] = SIMDFunc(PropertyIds::select, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_int8x16_select, OpCodeAsmJs::Simd128_Select_I16, AsmJsRetType::Int8x16, AsmJsType::Bool8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| |
| |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_addSaturate] = SIMDFunc(PropertyIds::addSaturate, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_addSaturate, OpCodeAsmJs::Simd128_AddSaturate_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_subSaturate] = SIMDFunc(PropertyIds::subSaturate, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_subSaturate, OpCodeAsmJs::Simd128_SubSaturate_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_load] = SIMDFunc(PropertyIds::load, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_load, OpCodeAsmJs::Simd128_LdArr_I16, AsmJsRetType::Int8x16, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_store] = SIMDFunc(PropertyIds::store, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_int8x16_store, OpCodeAsmJs::Simd128_StArr_I16, AsmJsRetType::Int8x16, AsmJsType::Void, AsmJsType::Int, AsmJsType::Int8x16)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_extractLane] = SIMDFunc(PropertyIds::extractLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_int8x16_extractLane, OpCodeAsmJs::Simd128_ExtractLane_I16, AsmJsRetType::Signed, AsmJsType::Int8x16, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_replaceLane] = SIMDFunc(PropertyIds::replaceLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_int8x16_replaceLane, OpCodeAsmJs::Simd128_ReplaceLane_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, AsmJsType::Int, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_swizzle] = SIMDFunc(PropertyIds::swizzle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 17, AsmJsSIMDBuiltin_int8x16_swizzle, OpCodeAsmJs::Simd128_Swizzle_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, |
| AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, |
| AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_shuffle] = SIMDFunc(PropertyIds::shuffle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 18, AsmJsSIMDBuiltin_int8x16_shuffle, OpCodeAsmJs::Simd128_Shuffle_I16, AsmJsRetType::Int8x16, AsmJsType::Int8x16, AsmJsType::Int8x16, |
| AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, |
| AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_fromFloat32x4Bits] = SIMDFunc(PropertyIds::fromFloat32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int8x16_fromFloat32x4Bits, OpCodeAsmJs::Simd128_FromFloat32x4Bits_I16, AsmJsRetType::Int8x16, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_fromInt32x4Bits] = SIMDFunc(PropertyIds::fromInt32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int8x16_fromInt32x4Bits, OpCodeAsmJs::Simd128_FromInt32x4Bits_I16, AsmJsRetType::Int8x16, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_fromInt16x8Bits] = SIMDFunc(PropertyIds::fromInt16x8Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int8x16_fromInt16x8Bits, OpCodeAsmJs::Simd128_FromInt16x8Bits_I16, AsmJsRetType::Int8x16, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_fromUint32x4Bits] = SIMDFunc(PropertyIds::fromUint32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int8x16_fromUint32x4Bits, OpCodeAsmJs::Simd128_FromUint32x4Bits_I16, AsmJsRetType::Int8x16, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_fromUint16x8Bits] = SIMDFunc(PropertyIds::fromUint16x8Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int8x16_fromUint16x8Bits, OpCodeAsmJs::Simd128_FromUint16x8Bits_I16, AsmJsRetType::Int8x16, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_int8x16_fromUint8x16Bits] = SIMDFunc(PropertyIds::fromUint8x16Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_int8x16_fromUint8x16Bits, OpCodeAsmJs::Simd128_FromUint8x16Bits_I16, AsmJsRetType::Int8x16, AsmJsType::Uint8x16)); |
| |
| |
| /* Uint32x4 */ |
| simdFunctions[AsmJsSIMDBuiltin_Uint32x4] = SIMDFunc(PropertyIds::Uint32x4, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 4, AsmJsSIMDBuiltin_Uint32x4, OpCodeAsmJs::Simd128_IntsToU4, AsmJsRetType::Uint32x4, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_check] = SIMDFunc(PropertyIds::check, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint32x4_check, OpCodeAsmJs::Simd128_Ld_U4 /*no dynamic checks*/, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_extractLane ]= SIMDFunc(PropertyIds::extractLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_extractLane, OpCodeAsmJs::Simd128_ExtractLane_U4, AsmJsRetType::Unsigned, AsmJsType::Uint32x4, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_swizzle ]= SIMDFunc(PropertyIds::swizzle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 5, AsmJsSIMDBuiltin_uint32x4_swizzle, OpCodeAsmJs::Simd128_Swizzle_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_shuffle ]= SIMDFunc(PropertyIds::shuffle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 6, AsmJsSIMDBuiltin_uint32x4_shuffle, OpCodeAsmJs::Simd128_Shuffle_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_splat ]= SIMDFunc(PropertyIds::splat, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint32x4_splat, OpCodeAsmJs::Simd128_Splat_U4, AsmJsRetType::Uint32x4, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_replaceLane ]= SIMDFunc(PropertyIds::replaceLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_uint32x4_replaceLane, OpCodeAsmJs::Simd128_ReplaceLane_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4, AsmJsType::Int, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_and ]= SIMDFunc(PropertyIds::and, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_and, OpCodeAsmJs::Simd128_And_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_or ]= SIMDFunc(PropertyIds::or, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_or, OpCodeAsmJs::Simd128_Or_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_xor ]= SIMDFunc(PropertyIds::xor, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_xor, OpCodeAsmJs::Simd128_Xor_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_not ]= SIMDFunc(PropertyIds::not, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint32x4_not, OpCodeAsmJs::Simd128_Not_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_neg ]= SIMDFunc(PropertyIds::neg, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint32x4_neg, OpCodeAsmJs::Simd128_Neg_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_add ]= SIMDFunc(PropertyIds::add, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_add, OpCodeAsmJs::Simd128_Add_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_sub ]= SIMDFunc(PropertyIds::sub, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_sub, OpCodeAsmJs::Simd128_Sub_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_mul ]= SIMDFunc(PropertyIds::mul, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_mul, OpCodeAsmJs::Simd128_Mul_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_shiftLeftByScalar ]= SIMDFunc(PropertyIds::shiftLeftByScalar, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_shiftLeftByScalar, OpCodeAsmJs::Simd128_ShLtByScalar_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_shiftRightByScalar ]= SIMDFunc(PropertyIds::shiftRightByScalar, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_shiftRightByScalar, OpCodeAsmJs::Simd128_ShRtByScalar_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint32x4, AsmJsType::Int)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_lessThan] = SIMDFunc(PropertyIds::lessThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_lessThan, OpCodeAsmJs::Simd128_Lt_U4, AsmJsRetType::Bool32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_lessThanOrEqual] = SIMDFunc(PropertyIds::lessThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_lessThanOrEqual, OpCodeAsmJs::Simd128_LtEq_U4, AsmJsRetType::Bool32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_equal] = SIMDFunc(PropertyIds::equal, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_equal, OpCodeAsmJs::Simd128_Eq_U4, AsmJsRetType::Bool32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_notEqual] = SIMDFunc(PropertyIds::notEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_notEqual, OpCodeAsmJs::Simd128_Neq_U4, AsmJsRetType::Bool32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_greaterThan] = SIMDFunc(PropertyIds::greaterThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_greaterThan, OpCodeAsmJs::Simd128_Gt_U4, AsmJsRetType::Bool32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_greaterThanOrEqual] = SIMDFunc(PropertyIds::greaterThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_greaterThanOrEqual, OpCodeAsmJs::Simd128_GtEq_U4, AsmJsRetType::Bool32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_select] = SIMDFunc(PropertyIds::select, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_uint32x4_select, OpCodeAsmJs::Simd128_Select_U4, AsmJsRetType::Uint32x4, AsmJsType::Bool32x4, AsmJsType::Uint32x4, AsmJsType::Uint32x4)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_load ]= SIMDFunc(PropertyIds::load, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_load, OpCodeAsmJs::Simd128_LdArr_U4, AsmJsRetType::Uint32x4, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_load1 ]= SIMDFunc(PropertyIds::load1, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_load1, OpCodeAsmJs::Simd128_LdArr_U4, AsmJsRetType::Uint32x4, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_load2 ]= SIMDFunc(PropertyIds::load2, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_load2, OpCodeAsmJs::Simd128_LdArr_U4, AsmJsRetType::Uint32x4, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_load3 ]= SIMDFunc(PropertyIds::load3, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint32x4_load3, OpCodeAsmJs::Simd128_LdArr_U4, AsmJsRetType::Uint32x4, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_store ]= SIMDFunc(PropertyIds::store, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_uint32x4_store, OpCodeAsmJs::Simd128_StArr_U4, AsmJsRetType::Uint32x4, AsmJsType::Void, AsmJsType::Int, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_store1 ]= SIMDFunc(PropertyIds::store1, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_uint32x4_store1, OpCodeAsmJs::Simd128_StArr_U4, AsmJsRetType::Uint32x4, AsmJsType::Void, AsmJsType::Int, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_store2 ]= SIMDFunc(PropertyIds::store2, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_uint32x4_store2, OpCodeAsmJs::Simd128_StArr_U4, AsmJsRetType::Uint32x4, AsmJsType::Void, AsmJsType::Int, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_store3 ]= SIMDFunc(PropertyIds::store3, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_uint32x4_store3, OpCodeAsmJs::Simd128_StArr_U4, AsmJsRetType::Uint32x4, AsmJsType::Void, AsmJsType::Int, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_fromFloat32x4 ]= SIMDFunc(PropertyIds::fromFloat32x4, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint32x4_fromFloat32x4, OpCodeAsmJs::Simd128_FromFloat32x4_U4, AsmJsRetType::Uint32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_fromFloat32x4Bits ]= SIMDFunc(PropertyIds::fromFloat32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint32x4_fromFloat32x4Bits, OpCodeAsmJs::Simd128_FromFloat32x4Bits_U4, AsmJsRetType::Uint32x4, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_fromInt32x4Bits ]= SIMDFunc(PropertyIds::fromInt32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint32x4_fromInt32x4Bits, OpCodeAsmJs::Simd128_FromInt32x4Bits_U4, AsmJsRetType::Uint32x4, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_fromInt16x8Bits ]= SIMDFunc(PropertyIds::fromInt16x8Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint32x4_fromInt16x8Bits, OpCodeAsmJs::Simd128_FromInt16x8Bits_U4, AsmJsRetType::Uint32x4, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_fromInt8x16Bits ]= SIMDFunc(PropertyIds::fromInt8x16Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint32x4_fromInt8x16Bits, OpCodeAsmJs::Simd128_FromInt8x16Bits_U4, AsmJsRetType::Uint32x4, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_fromUint16x8Bits ]= SIMDFunc(PropertyIds::fromUint16x8Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint32x4_fromUint16x8Bits, OpCodeAsmJs::Simd128_FromUint16x8Bits_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint32x4_fromUint8x16Bits ]= SIMDFunc(PropertyIds::fromUint8x16Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint32x4_fromUint8x16Bits, OpCodeAsmJs::Simd128_FromUint8x16Bits_U4, AsmJsRetType::Uint32x4, AsmJsType::Uint8x16)); |
| |
| /* Uint16x8 */ |
| simdFunctions[AsmJsSIMDBuiltin_Uint16x8] = SIMDFunc(PropertyIds::Uint16x8, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 8, AsmJsSIMDBuiltin_Uint16x8, OpCodeAsmJs::Simd128_IntsToU8, AsmJsRetType::Uint16x8, |
| AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_check] = SIMDFunc(PropertyIds::check, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint16x8_check, OpCodeAsmJs::Simd128_Ld_U8 /*no dynamic checks*/, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_extractLane ]= SIMDFunc(PropertyIds::extractLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_extractLane, OpCodeAsmJs::Simd128_ExtractLane_U8, AsmJsRetType::Unsigned, AsmJsType::Uint16x8, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_swizzle ]= SIMDFunc(PropertyIds::swizzle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 9, AsmJsSIMDBuiltin_uint16x8_swizzle, OpCodeAsmJs::Simd128_Swizzle_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, |
| AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_shuffle ]= SIMDFunc(PropertyIds::shuffle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 10, AsmJsSIMDBuiltin_uint16x8_shuffle, OpCodeAsmJs::Simd128_Shuffle_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8, |
| AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_splat ]= SIMDFunc(PropertyIds::splat, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint16x8_splat, OpCodeAsmJs::Simd128_Splat_U8, AsmJsRetType::Uint16x8, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_replaceLane ]= SIMDFunc(PropertyIds::replaceLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_uint16x8_replaceLane, OpCodeAsmJs::Simd128_ReplaceLane_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, AsmJsType::Int, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_and ]= SIMDFunc(PropertyIds::and, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_and, OpCodeAsmJs::Simd128_And_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_or ]= SIMDFunc(PropertyIds::or, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_or, OpCodeAsmJs::Simd128_Or_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_xor ]= SIMDFunc(PropertyIds::xor, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_xor, OpCodeAsmJs::Simd128_Xor_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_not ]= SIMDFunc(PropertyIds::not, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint16x8_not, OpCodeAsmJs::Simd128_Not_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_neg ]= SIMDFunc(PropertyIds::neg, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint16x8_neg, OpCodeAsmJs::Simd128_Neg_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_add ]= SIMDFunc(PropertyIds::add, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_add, OpCodeAsmJs::Simd128_Add_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_sub ]= SIMDFunc(PropertyIds::sub, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_sub, OpCodeAsmJs::Simd128_Sub_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_mul ]= SIMDFunc(PropertyIds::mul, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_mul, OpCodeAsmJs::Simd128_Mul_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_shiftLeftByScalar ]= SIMDFunc(PropertyIds::shiftLeftByScalar, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_shiftLeftByScalar, OpCodeAsmJs::Simd128_ShLtByScalar_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_shiftRightByScalar ]= SIMDFunc(PropertyIds::shiftRightByScalar, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_shiftRightByScalar, OpCodeAsmJs::Simd128_ShRtByScalar_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, AsmJsType::Int)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_lessThan] = SIMDFunc(PropertyIds::lessThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_lessThan, OpCodeAsmJs::Simd128_Lt_U8, AsmJsRetType::Bool16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_lessThanOrEqual] = SIMDFunc(PropertyIds::lessThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_lessThanOrEqual, OpCodeAsmJs::Simd128_LtEq_U8, AsmJsRetType::Bool16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_equal] = SIMDFunc(PropertyIds::equal, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_equal, OpCodeAsmJs::Simd128_Eq_U8, AsmJsRetType::Bool16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_notEqual] = SIMDFunc(PropertyIds::notEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_notEqual, OpCodeAsmJs::Simd128_Neq_U8, AsmJsRetType::Bool16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_greaterThan] = SIMDFunc(PropertyIds::greaterThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_greaterThan, OpCodeAsmJs::Simd128_Gt_U8, AsmJsRetType::Bool16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_greaterThanOrEqual] = SIMDFunc(PropertyIds::greaterThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_greaterThanOrEqual, OpCodeAsmJs::Simd128_GtEq_U8, AsmJsRetType::Bool16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_select] = SIMDFunc(PropertyIds::select, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_uint16x8_select, OpCodeAsmJs::Simd128_Select_U8, AsmJsRetType::Uint16x8, AsmJsType::Bool16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_addSaturate ]= SIMDFunc(PropertyIds::addSaturate, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_addSaturate, OpCodeAsmJs::Simd128_AddSaturate_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_subSaturate ]= SIMDFunc(PropertyIds::subSaturate, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_subSaturate, OpCodeAsmJs::Simd128_SubSaturate_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint16x8, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_load ]= SIMDFunc(PropertyIds::load, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint16x8_load, OpCodeAsmJs::Simd128_LdArr_U8, AsmJsRetType::Uint16x8, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_store ]= SIMDFunc(PropertyIds::store, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_uint16x8_store, OpCodeAsmJs::Simd128_StArr_U8, AsmJsRetType::Uint16x8, AsmJsType::Void, AsmJsType::Int, AsmJsType::Uint16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_fromFloat32x4Bits ]= SIMDFunc(PropertyIds::fromFloat32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint16x8_fromFloat32x4Bits, OpCodeAsmJs::Simd128_FromFloat32x4Bits_U8, AsmJsRetType::Uint16x8, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_fromInt32x4Bits ]= SIMDFunc(PropertyIds::fromInt32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint16x8_fromInt32x4Bits, OpCodeAsmJs::Simd128_FromInt32x4Bits_U8, AsmJsRetType::Uint16x8, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_fromInt16x8Bits ]= SIMDFunc(PropertyIds::fromInt16x8Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint16x8_fromInt16x8Bits, OpCodeAsmJs::Simd128_FromInt16x8Bits_U8, AsmJsRetType::Uint16x8, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_fromInt8x16Bits ]= SIMDFunc(PropertyIds::fromInt8x16Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint16x8_fromInt8x16Bits, OpCodeAsmJs::Simd128_FromInt8x16Bits_U8, AsmJsRetType::Uint16x8, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_fromUint32x4Bits ]= SIMDFunc(PropertyIds::fromUint32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint16x8_fromUint32x4Bits, OpCodeAsmJs::Simd128_FromUint32x4Bits_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint16x8_fromUint8x16Bits ]= SIMDFunc(PropertyIds::fromUint8x16Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint16x8_fromUint8x16Bits, OpCodeAsmJs::Simd128_FromUint8x16Bits_U8, AsmJsRetType::Uint16x8, AsmJsType::Uint8x16)); |
| |
| |
| /* Uint8x16 */ |
| simdFunctions[AsmJsSIMDBuiltin_Uint8x16] = SIMDFunc(PropertyIds::Uint8x16, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 16, AsmJsSIMDBuiltin_Uint8x16, OpCodeAsmJs::Simd128_IntsToU16, AsmJsRetType::Uint8x16, |
| AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, |
| AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_check] = SIMDFunc(PropertyIds::check, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint8x16_check, OpCodeAsmJs::Simd128_Ld_U16 /*no dynamic checks*/, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_extractLane ] = SIMDFunc(PropertyIds::extractLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_extractLane, OpCodeAsmJs::Simd128_ExtractLane_U16, AsmJsRetType::Unsigned, AsmJsType::Uint8x16, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_swizzle ] = SIMDFunc(PropertyIds::swizzle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 17, AsmJsSIMDBuiltin_uint8x16_swizzle, OpCodeAsmJs::Simd128_Swizzle_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, |
| AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, |
| AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_shuffle] = SIMDFunc(PropertyIds::shuffle, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 18, AsmJsSIMDBuiltin_uint8x16_shuffle, OpCodeAsmJs::Simd128_Shuffle_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16, |
| AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, |
| AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_splat ] = SIMDFunc(PropertyIds::splat, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint8x16_splat, OpCodeAsmJs::Simd128_Splat_U16, AsmJsRetType::Uint8x16, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_replaceLane ] = SIMDFunc(PropertyIds::replaceLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_uint8x16_replaceLane, OpCodeAsmJs::Simd128_ReplaceLane_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, AsmJsType::Int, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_and ] = SIMDFunc(PropertyIds::and, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_and, OpCodeAsmJs::Simd128_And_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_or ] = SIMDFunc(PropertyIds::or, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_or, OpCodeAsmJs::Simd128_Or_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_xor ] = SIMDFunc(PropertyIds::xor, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_xor, OpCodeAsmJs::Simd128_Xor_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_not ] = SIMDFunc(PropertyIds::not, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint8x16_not, OpCodeAsmJs::Simd128_Not_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_neg ] = SIMDFunc(PropertyIds::neg, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint8x16_neg, OpCodeAsmJs::Simd128_Neg_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_add ] = SIMDFunc(PropertyIds::add, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_add, OpCodeAsmJs::Simd128_Add_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_sub ] = SIMDFunc(PropertyIds::sub, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_sub, OpCodeAsmJs::Simd128_Sub_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_mul ] = SIMDFunc(PropertyIds::mul, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_mul, OpCodeAsmJs::Simd128_Mul_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_shiftLeftByScalar ] = SIMDFunc(PropertyIds::shiftLeftByScalar, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_shiftLeftByScalar, OpCodeAsmJs::Simd128_ShLtByScalar_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_shiftRightByScalar] = SIMDFunc(PropertyIds::shiftRightByScalar, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_shiftRightByScalar, OpCodeAsmJs::Simd128_ShRtByScalar_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, AsmJsType::Int)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_lessThan] = SIMDFunc(PropertyIds::lessThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_lessThan, OpCodeAsmJs::Simd128_Lt_U16, AsmJsRetType::Bool8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_lessThanOrEqual] = SIMDFunc(PropertyIds::lessThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_lessThanOrEqual, OpCodeAsmJs::Simd128_LtEq_U16, AsmJsRetType::Bool8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_equal] = SIMDFunc(PropertyIds::equal, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_equal, OpCodeAsmJs::Simd128_Eq_U16, AsmJsRetType::Bool8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_notEqual] = SIMDFunc(PropertyIds::notEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_notEqual, OpCodeAsmJs::Simd128_Neq_U16, AsmJsRetType::Bool8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_greaterThan] = SIMDFunc(PropertyIds::greaterThan, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_greaterThan, OpCodeAsmJs::Simd128_Gt_U16, AsmJsRetType::Bool8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_greaterThanOrEqual] = SIMDFunc(PropertyIds::greaterThanOrEqual, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_greaterThanOrEqual, OpCodeAsmJs::Simd128_GtEq_U16, AsmJsRetType::Bool8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_select] = SIMDFunc(PropertyIds::select, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_uint8x16_select, OpCodeAsmJs::Simd128_Select_U16, AsmJsRetType::Uint8x16, AsmJsType::Bool8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| |
| |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_addSaturate ] = SIMDFunc(PropertyIds::addSaturate, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_addSaturate, OpCodeAsmJs::Simd128_AddSaturate_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_subSaturate ] = SIMDFunc(PropertyIds::subSaturate, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_subSaturate, OpCodeAsmJs::Simd128_SubSaturate_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint8x16, AsmJsType::Uint8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_load ] = SIMDFunc(PropertyIds::load, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_uint8x16_load, OpCodeAsmJs::Simd128_LdArr_U16, AsmJsRetType::Uint8x16, AsmJsType::Void, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_store ] = SIMDFunc(PropertyIds::store, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_uint8x16_store, OpCodeAsmJs::Simd128_StArr_U16, AsmJsRetType::Uint8x16, AsmJsType::Void, AsmJsType::Int, AsmJsType::Uint8x16)); |
| |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_fromFloat32x4Bits ] = SIMDFunc(PropertyIds::fromFloat32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint8x16_fromFloat32x4Bits, OpCodeAsmJs::Simd128_FromFloat32x4Bits_U16, AsmJsRetType::Uint8x16, AsmJsType::Float32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_fromInt32x4Bits ] = SIMDFunc(PropertyIds::fromInt32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint8x16_fromInt32x4Bits, OpCodeAsmJs::Simd128_FromInt32x4Bits_U16, AsmJsRetType::Uint8x16, AsmJsType::Int32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_fromInt16x8Bits ] = SIMDFunc(PropertyIds::fromInt16x8Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint8x16_fromInt16x8Bits, OpCodeAsmJs::Simd128_FromInt16x8Bits_U16, AsmJsRetType::Uint8x16, AsmJsType::Int16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_fromInt8x16Bits ] = SIMDFunc(PropertyIds::fromInt8x16Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint8x16_fromInt8x16Bits, OpCodeAsmJs::Simd128_FromInt8x16Bits_U16, AsmJsRetType::Uint8x16, AsmJsType::Int8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_fromUint32x4Bits ] = SIMDFunc(PropertyIds::fromUint32x4Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint8x16_fromUint32x4Bits, OpCodeAsmJs::Simd128_FromUint32x4Bits_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_uint8x16_fromUint16x8Bits ] = SIMDFunc(PropertyIds::fromUint16x8Bits, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_uint8x16_fromUint16x8Bits, OpCodeAsmJs::Simd128_FromUint16x8Bits_U16, AsmJsRetType::Uint8x16, AsmJsType::Uint16x8)); |
| |
| /* Bool32x4 builtins*/ |
| //------------------- |
| simdFunctions[AsmJsSIMDBuiltin_Bool32x4] = SIMDFunc(PropertyIds::Bool32x4, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 4, AsmJsSIMDBuiltin_Bool32x4, OpCodeAsmJs::Simd128_IntsToB4, AsmJsRetType::Bool32x4, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_bool32x4_check] = SIMDFunc(PropertyIds::check, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool32x4_check, OpCodeAsmJs::Simd128_Ld_B4 /*no dynamic checks*/, AsmJsRetType::Bool32x4, AsmJsType::Bool32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_bool32x4_splat] = SIMDFunc(PropertyIds::splat, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool32x4_splat, OpCodeAsmJs::Simd128_Splat_B4, AsmJsRetType::Bool32x4, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_bool32x4_extractLane] = SIMDFunc(PropertyIds::extractLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_bool32x4_extractLane, OpCodeAsmJs::Simd128_ExtractLane_B4, AsmJsRetType::Signed, AsmJsType::Bool32x4, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_bool32x4_replaceLane] = SIMDFunc(PropertyIds::replaceLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_bool32x4_replaceLane, OpCodeAsmJs::Simd128_ReplaceLane_B4, AsmJsRetType::Bool32x4, AsmJsType::Bool32x4, AsmJsType::Int, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_bool32x4_and] = SIMDFunc(PropertyIds::and, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_bool32x4_and, OpCodeAsmJs::Simd128_And_B4, AsmJsRetType::Bool32x4, AsmJsType::Bool32x4, AsmJsType::Bool32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_bool32x4_or] = SIMDFunc(PropertyIds::or , Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_bool32x4_or, OpCodeAsmJs::Simd128_Or_B4, AsmJsRetType::Bool32x4, AsmJsType::Bool32x4, AsmJsType::Bool32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_bool32x4_xor] = SIMDFunc(PropertyIds::xor, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_bool32x4_xor, OpCodeAsmJs::Simd128_Xor_B4, AsmJsRetType::Bool32x4, AsmJsType::Bool32x4, AsmJsType::Bool32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_bool32x4_not] = SIMDFunc(PropertyIds::not, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool32x4_not, OpCodeAsmJs::Simd128_Not_B4, AsmJsRetType::Bool32x4, AsmJsType::Bool32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_bool32x4_anyTrue] = SIMDFunc(PropertyIds::anyTrue, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool32x4_anyTrue, OpCodeAsmJs::Simd128_AnyTrue_B4, AsmJsRetType::Signed, AsmJsType::Bool32x4)); |
| simdFunctions[AsmJsSIMDBuiltin_bool32x4_allTrue] = SIMDFunc(PropertyIds::allTrue, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool32x4_allTrue, OpCodeAsmJs::Simd128_AllTrue_B4, AsmJsRetType::Signed, AsmJsType::Bool32x4)); |
| |
| /* Bool16x8 builtins*/ |
| //------------------- |
| simdFunctions[AsmJsSIMDBuiltin_Bool16x8] = SIMDFunc(PropertyIds::Bool16x8, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 8, AsmJsSIMDBuiltin_Bool16x8, OpCodeAsmJs::Simd128_IntsToB8, AsmJsRetType::Bool16x8, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_bool16x8_check] = SIMDFunc(PropertyIds::check, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool16x8_check, OpCodeAsmJs::Simd128_Ld_B8 /*no dynamic checks*/, AsmJsRetType::Bool16x8, AsmJsType::Bool16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_bool16x8_splat] = SIMDFunc(PropertyIds::splat, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool16x8_splat, OpCodeAsmJs::Simd128_Splat_B8, AsmJsRetType::Bool16x8, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_bool16x8_extractLane] = SIMDFunc(PropertyIds::extractLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_bool16x8_extractLane, OpCodeAsmJs::Simd128_ExtractLane_B8, AsmJsRetType::Signed, AsmJsType::Bool16x8, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_bool16x8_replaceLane] = SIMDFunc(PropertyIds::replaceLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_bool16x8_replaceLane, OpCodeAsmJs::Simd128_ReplaceLane_B8, AsmJsRetType::Bool16x8, AsmJsType::Bool16x8, AsmJsType::Int, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_bool16x8_and] = SIMDFunc(PropertyIds::and, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_bool16x8_and, OpCodeAsmJs::Simd128_And_B8, AsmJsRetType::Bool16x8, AsmJsType::Bool16x8, AsmJsType::Bool16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_bool16x8_or] = SIMDFunc(PropertyIds::or , Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_bool16x8_or, OpCodeAsmJs::Simd128_Or_B8, AsmJsRetType::Bool16x8, AsmJsType::Bool16x8, AsmJsType::Bool16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_bool16x8_xor] = SIMDFunc(PropertyIds::xor, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_bool16x8_xor, OpCodeAsmJs::Simd128_Xor_B8, AsmJsRetType::Bool16x8, AsmJsType::Bool16x8, AsmJsType::Bool16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_bool16x8_not] = SIMDFunc(PropertyIds::not, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool16x8_not, OpCodeAsmJs::Simd128_Not_B8, AsmJsRetType::Bool16x8, AsmJsType::Bool16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_bool16x8_anyTrue] = SIMDFunc(PropertyIds::anyTrue, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool16x8_anyTrue, OpCodeAsmJs::Simd128_AnyTrue_B8, AsmJsRetType::Signed, AsmJsType::Bool16x8)); |
| simdFunctions[AsmJsSIMDBuiltin_bool16x8_allTrue] = SIMDFunc(PropertyIds::allTrue, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool16x8_allTrue, OpCodeAsmJs::Simd128_AllTrue_B8, AsmJsRetType::Signed, AsmJsType::Bool16x8)); |
| |
| /* Bool8x16 builtins*/ |
| //------------------- |
| simdFunctions[AsmJsSIMDBuiltin_Bool8x16] = SIMDFunc(PropertyIds::Bool8x16, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 16, AsmJsSIMDBuiltin_Bool8x16, OpCodeAsmJs::Simd128_IntsToB16, AsmJsRetType::Bool8x16, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_bool8x16_check] = SIMDFunc(PropertyIds::check, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool8x16_check, OpCodeAsmJs::Simd128_Ld_B16 /*no dynamic checks*/, AsmJsRetType::Bool8x16, AsmJsType::Bool8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_bool8x16_splat] = SIMDFunc(PropertyIds::splat, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool8x16_splat, OpCodeAsmJs::Simd128_Splat_B16, AsmJsRetType::Bool8x16, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_bool8x16_extractLane] = SIMDFunc(PropertyIds::extractLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_bool8x16_extractLane, OpCodeAsmJs::Simd128_ExtractLane_B16, AsmJsRetType::Signed, AsmJsType::Bool8x16, AsmJsType::Int)); |
| simdFunctions[AsmJsSIMDBuiltin_bool8x16_replaceLane] = SIMDFunc(PropertyIds::replaceLane, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 3, AsmJsSIMDBuiltin_bool8x16_replaceLane, OpCodeAsmJs::Simd128_ReplaceLane_B16, AsmJsRetType::Bool8x16, AsmJsType::Bool8x16, AsmJsType::Int, AsmJsType::Intish)); |
| simdFunctions[AsmJsSIMDBuiltin_bool8x16_and] = SIMDFunc(PropertyIds::and, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_bool8x16_and, OpCodeAsmJs::Simd128_And_B16, AsmJsRetType::Bool8x16, AsmJsType::Bool8x16, AsmJsType::Bool8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_bool8x16_or] = SIMDFunc(PropertyIds::or , Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_bool8x16_or, OpCodeAsmJs::Simd128_Or_B16, AsmJsRetType::Bool8x16, AsmJsType::Bool8x16, AsmJsType::Bool8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_bool8x16_xor] = SIMDFunc(PropertyIds::xor, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 2, AsmJsSIMDBuiltin_bool8x16_xor, OpCodeAsmJs::Simd128_Xor_B16, AsmJsRetType::Bool8x16, AsmJsType::Bool8x16, AsmJsType::Bool8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_bool8x16_not] = SIMDFunc(PropertyIds::not, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool8x16_not, OpCodeAsmJs::Simd128_Not_B16, AsmJsRetType::Bool8x16, AsmJsType::Bool8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_bool8x16_anyTrue] = SIMDFunc(PropertyIds::anyTrue, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool8x16_anyTrue, OpCodeAsmJs::Simd128_AnyTrue_B16, AsmJsRetType::Signed, AsmJsType::Bool8x16)); |
| simdFunctions[AsmJsSIMDBuiltin_bool8x16_allTrue] = SIMDFunc(PropertyIds::allTrue, Anew(&mAllocator, AsmJsSIMDFunction, nullptr, &mAllocator, 1, AsmJsSIMDBuiltin_bool8x16_allTrue, OpCodeAsmJs::Simd128_AllTrue_B16, AsmJsRetType::Signed, AsmJsType::Bool8x16)); |
| |
| |
| { |
| SIMDNameMap *map = &mStdLibSIMDInt32x4Map; |
| for (int i = 0; i < AsmJsSIMDBuiltin_COUNT; i++) |
| { |
| switch (i) |
| { |
| case AsmJsSIMDBuiltin_Float32x4: |
| map = &mStdLibSIMDFloat32x4Map; |
| break; |
| case AsmJsSIMDBuiltin_Float64x2: |
| map = &mStdLibSIMDFloat64x2Map; |
| break; |
| case AsmJsSIMDBuiltin_Int16x8: |
| map = &mStdLibSIMDInt16x8Map; |
| break; |
| case AsmJsSIMDBuiltin_Int8x16: |
| map = &mStdLibSIMDInt8x16Map; |
| break; |
| case AsmJsSIMDBuiltin_Uint32x4: |
| map = &mStdLibSIMDUint32x4Map; |
| break; |
| case AsmJsSIMDBuiltin_Uint16x8: |
| map = &mStdLibSIMDUint16x8Map; |
| break; |
| case AsmJsSIMDBuiltin_Uint8x16: |
| map = &mStdLibSIMDUint8x16Map; |
| break; |
| case AsmJsSIMDBuiltin_Bool32x4: |
| map = &mStdLibSIMDBool32x4Map; |
| break; |
| case AsmJsSIMDBuiltin_Bool16x8: |
| map = &mStdLibSIMDBool16x8Map; |
| break; |
| case AsmJsSIMDBuiltin_Bool8x16: |
| map = &mStdLibSIMDBool8x16Map; |
| break; |
| } |
| |
| if (simdFunctions[i].id && simdFunctions[i].val) |
| { |
| if (!AddStandardLibrarySIMDNameInMap(simdFunctions[i].id, simdFunctions[i].val, map)) |
| { |
| AsmJSCompiler::OutputError(GetScriptContext(), _u("Cannot initialize SIMD library")); |
| return false; |
| } |
| } |
| } |
| } |
| return true; |
| } |
| |
| AsmJsModuleCompiler::AsmJsModuleCompiler( ExclusiveContext *cx, AsmJSParser &parser ) : |
| mCx( cx ) |
| , mCurrentParserNode( parser ) |
| , mAllocator( _u("Asmjs"), cx->scriptContext->GetThreadContext()->GetPageAllocator(), Throw::OutOfMemory ) |
| , mModuleFunctionName( nullptr ) |
| , mStandardLibraryMathNames(&mAllocator) |
| , mStandardLibraryArrayNames(&mAllocator) |
| , mFunctionArray( &mAllocator ) |
| , mModuleEnvironment( &mAllocator ) |
| , mFunctionTableArray( &mAllocator ) |
| , mInitialised(false) |
| , mIntVarSpace( ) |
| , mDoubleVarSpace( ) |
| , mExports(&mAllocator) |
| , mExportFuncIndex(Js::Constants::NoRegister) |
| , mVarImportCount(0) |
| , mVarCount(0) |
| , mFuncPtrTableCount(0) |
| , mCompileTime() |
| , mCompileTimeLastTick(GetTick()) |
| , mMaxAstSize(0) |
| , mArrayViews(&mAllocator) |
| , mUsesChangeHeap(false) |
| , mUsesHeapBuffer(false) |
| , mMaxHeapAccess(0) |
| #if DBG |
| , mStdLibArgNameInit(false) |
| , mForeignArgNameInit(false) |
| , mBufferArgNameInit(false) |
| #endif |
| , mStdLibSIMDInt32x4Map(&mAllocator) |
| , mStdLibSIMDInt16x8Map(&mAllocator) |
| , mStdLibSIMDInt8x16Map(&mAllocator) |
| , mStdLibSIMDUint32x4Map(&mAllocator) |
| , mStdLibSIMDUint16x8Map(&mAllocator) |
| , mStdLibSIMDUint8x16Map(&mAllocator) |
| , mStdLibSIMDBool32x4Map(&mAllocator) |
| , mStdLibSIMDBool16x8Map(&mAllocator) |
| , mStdLibSIMDBool8x16Map(&mAllocator) |
| , mStdLibSIMDFloat32x4Map(&mAllocator) |
| , mStdLibSIMDFloat64x2Map(&mAllocator) |
| |
| { |
| InitModuleNode( parser ); |
| } |
| |
| bool AsmJsModuleCompiler::AddStandardLibraryMathName( PropertyId id, const double* cstAddr, AsmJSMathBuiltinFunction mathLibFunctionName ) |
| { |
| // make sure this name is unique |
| if( mStandardLibraryMathNames.ContainsKey( id ) ) |
| { |
| return false; |
| } |
| |
| MathBuiltin mathBuiltin(mathLibFunctionName, cstAddr); |
| int addResult = mStandardLibraryMathNames.AddNew( id, mathBuiltin ); |
| if( addResult == -1 ) |
| { |
| // Error adding the function |
| return false; |
| } |
| return true; |
| } |
| |
| |
| bool AsmJsModuleCompiler::AddStandardLibraryMathName(PropertyId id, AsmJsMathFunction* func, AsmJSMathBuiltinFunction mathLibFunctionName) |
| { |
| // make sure this name is unique |
| if( mStandardLibraryMathNames.ContainsKey( id ) ) |
| { |
| return false; |
| } |
| |
| MathBuiltin mathBuiltin(mathLibFunctionName, func); |
| int addResult = mStandardLibraryMathNames.AddNew( id, mathBuiltin ); |
| if( addResult == -1 ) |
| { |
| // Error adding the function |
| return false; |
| } |
| return true; |
| } |
| |
| bool AsmJsModuleCompiler::AddStandardLibraryArrayName(PropertyId id, AsmJsTypedArrayFunction* func, AsmJSTypedArrayBuiltinFunction arrayLibFunctionName) |
| { |
| // make sure this name is unique |
| if (mStandardLibraryArrayNames.ContainsKey(id)) |
| { |
| return false; |
| } |
| |
| TypedArrayBuiltin arrayBuiltin(arrayLibFunctionName, func); |
| int addResult = mStandardLibraryArrayNames.AddNew(id, arrayBuiltin); |
| if (addResult == -1) |
| { |
| // Error adding the function |
| return false; |
| } |
| return true; |
| } |
| |
| Parser * AsmJsModuleCompiler::GetParser() const |
| { |
| return mCx->byteCodeGenerator->GetParser(); |
| } |
| |
| ByteCodeGenerator* AsmJsModuleCompiler::GetByteCodeGenerator() const |
| { |
| return mCx->byteCodeGenerator; |
| } |
| |
| ScriptContext * AsmJsModuleCompiler::GetScriptContext() const |
| { |
| return mCx->scriptContext; |
| } |
| |
| AsmJsSymbol* AsmJsModuleCompiler::LookupIdentifier( PropertyName name, AsmJsFunc* func /*= nullptr */, AsmJsLookupSource::Source* lookupSource /*= nullptr*/ ) |
| { |
| AsmJsSymbol* lookupResult = nullptr; |
| if (name) |
| { |
| if (func) |
| { |
| lookupResult = func->LookupIdentifier(name, lookupSource); |
| if (lookupResult) |
| { |
| return lookupResult; |
| } |
| } |
| |
| lookupResult = mModuleEnvironment.LookupWithKey(name->GetPropertyId(), nullptr); |
| if (lookupSource) |
| { |
| *lookupSource = AsmJsLookupSource::AsmJsModule; |
| } |
| } |
| return lookupResult; |
| } |
| |
| bool AsmJsModuleCompiler::DefineIdentifier( PropertyName name, AsmJsSymbol* symbol ) |
| { |
| Assert( symbol ); |
| if( symbol ) |
| { |
| // make sure this identifier is unique |
| if(!LookupIdentifier( name )) |
| { |
| int addResult = mModuleEnvironment.AddNew(name->GetPropertyId(), symbol); |
| return addResult != -1; |
| } |
| } |
| return false; |
| } |
| |
| bool AsmJsModuleCompiler::AddNumericVar( PropertyName name, ParseNode* pnode, bool isFloat, bool isMutable /*= true*/ ) |
| { |
| Assert(ParserWrapper::IsNumericLiteral(pnode) || (isFloat && ParserWrapper::IsFroundNumericLiteral(pnode))); |
| AsmJsVar* var = Anew( &mAllocator, AsmJsVar, name, isMutable ); |
| if( !var ) |
| { |
| return false; |
| } |
| if( !DefineIdentifier( name, var ) ) |
| { |
| return false; |
| } |
| |
| ++mVarCount; |
| |
| if (isFloat) |
| { |
| var->SetVarType(AsmJsVarType::Float); |
| var->SetLocation(mFloatVarSpace.AcquireRegister()); |
| if (pnode->nop == knopInt) |
| { |
| var->SetConstInitialiser((float)pnode->sxInt.lw); |
| } |
| else if (ParserWrapper::IsNegativeZero(pnode)) |
| { |
| var->SetConstInitialiser(-0.0f); |
| } |
| else |
| { |
| var->SetConstInitialiser((float)pnode->sxFlt.dbl); |
| } |
| } |
| else if (pnode->nop == knopInt) |
| { |
| var->SetVarType(AsmJsVarType::Int); |
| var->SetLocation(mIntVarSpace.AcquireRegister()); |
| var->SetConstInitialiser(pnode->sxInt.lw); |
| } |
| else |
| { |
| if (ParserWrapper::IsMinInt(pnode)) |
| { |
| var->SetVarType(AsmJsVarType::Int); |
| var->SetLocation(mIntVarSpace.AcquireRegister()); |
| var->SetConstInitialiser(MININT); |
| } |
| else if (ParserWrapper::IsUnsigned(pnode)) |
| { |
| var->SetVarType(AsmJsVarType::Int); |
| var->SetLocation(mIntVarSpace.AcquireRegister()); |
| var->SetConstInitialiser((int)((uint32)pnode->sxFlt.dbl)); |
| } |
| else if (pnode->sxFlt.maybeInt) |
| { |
| // this means there was an int literal not in range [-2^31,3^32) |
| return false; |
| } |
| else |
| { |
| var->SetVarType(AsmJsVarType::Double); |
| var->SetLocation(mDoubleVarSpace.AcquireRegister()); |
| var->SetConstInitialiser(pnode->sxFlt.dbl); |
| } |
| } |
| return true; |
| } |
| |
| bool AsmJsModuleCompiler::AddGlobalVarImport( PropertyName name, PropertyName field, AsmJSCoercion coercion ) |
| { |
| AsmJsConstantImport* var = Anew( &mAllocator, AsmJsConstantImport, name, field ); |
| if( !var ) |
| { |
| return false; |
| } |
| if( !DefineIdentifier( name, var ) ) |
| { |
| return false; |
| } |
| ++mVarImportCount; |
| |
| switch( coercion ) |
| { |
| case Js::AsmJS_ToInt32: |
| var->SetVarType( AsmJsVarType::Int ); |
| var->SetLocation( mIntVarSpace.AcquireRegister() ); |
| break; |
| case Js::AsmJS_ToNumber: |
| var->SetVarType( AsmJsVarType::Double ); |
| var->SetLocation( mDoubleVarSpace.AcquireRegister() ); |
| break; |
| case Js::AsmJS_FRound: |
| var->SetVarType( AsmJsVarType::Float ); |
| var->SetLocation(mFloatVarSpace.AcquireRegister()); |
| break; |
| case Js::AsmJS_Int32x4: |
| if (IsSimdjsEnabled()) |
| { |
| var->SetVarType(AsmJsVarType::Int32x4); |
| var->SetLocation(mSimdVarSpace.AcquireRegister()); |
| break; |
| } |
| Assert(UNREACHED); |
| case Js::AsmJS_Bool32x4: |
| if (IsSimdjsEnabled()) |
| { |
| var->SetVarType(AsmJsVarType::Bool32x4); |
| var->SetLocation(mSimdVarSpace.AcquireRegister()); |
| break; |
| } |
| Assert(UNREACHED); |
| case Js::AsmJS_Bool16x8: |
| if (IsSimdjsEnabled()) |
| { |
| var->SetVarType(AsmJsVarType::Bool16x8); |
| var->SetLocation(mSimdVarSpace.AcquireRegister()); |
| break; |
| } |
| Assert(UNREACHED); |
| case Js::AsmJS_Bool8x16: |
| if (IsSimdjsEnabled()) |
| { |
| var->SetVarType(AsmJsVarType::Bool8x16); |
| var->SetLocation(mSimdVarSpace.AcquireRegister()); |
| break; |
| } |
| Assert(UNREACHED); |
| case AsmJS_Float32x4: |
| if (IsSimdjsEnabled()) |
| { |
| var->SetVarType(AsmJsVarType::Float32x4); |
| var->SetLocation(mSimdVarSpace.AcquireRegister()); |
| break; |
| } |
| Assert(UNREACHED); |
| case AsmJS_Float64x2: |
| if (IsSimdjsEnabled()) |
| { |
| var->SetVarType(AsmJsVarType::Float64x2); |
| var->SetLocation(mSimdVarSpace.AcquireRegister()); |
| break; |
| } |
| Assert(UNREACHED); |
| case Js::AsmJS_Int16x8: |
| if (IsSimdjsEnabled()) |
| { |
| var->SetVarType(AsmJsVarType::Int16x8); |
| var->SetLocation(mSimdVarSpace.AcquireRegister()); |
| break; |
| } |
| Assert(UNREACHED); |
| case Js::AsmJS_Int8x16: |
| if (IsSimdjsEnabled()) |
| { |
| var->SetVarType(AsmJsVarType::Int8x16); |
| var->SetLocation(mSimdVarSpace.AcquireRegister()); |
| break; |
| } |
| Assert(UNREACHED); |
| case Js::AsmJS_Uint32x4: |
| if (IsSimdjsEnabled()) |
| { |
| var->SetVarType(AsmJsVarType::Uint32x4); |
| var->SetLocation(mSimdVarSpace.AcquireRegister()); |
| break; |
| } |
| Assert(UNREACHED); |
| case Js::AsmJS_Uint16x8: |
| if (IsSimdjsEnabled()) |
| { |
| var->SetVarType(AsmJsVarType::Uint16x8); |
| var->SetLocation(mSimdVarSpace.AcquireRegister()); |
| break; |
| } |
| Assert(UNREACHED); |
| case Js::AsmJS_Uint8x16: |
| if (IsSimdjsEnabled()) |
| { |
| var->SetVarType(AsmJsVarType::Uint8x16); |
| var->SetLocation(mSimdVarSpace.AcquireRegister()); |
| break; |
| } |
| Assert(UNREACHED); |
| default: |
| break; |
| } |
| |
| return true; |
| } |
| |
| bool AsmJsModuleCompiler::AddModuleFunctionImport( PropertyName name, PropertyName field ) |
| { |
| AsmJsImportFunction* var = Anew( &mAllocator, AsmJsImportFunction, name, field, &mAllocator ); |
| if( !var ) |
| { |
| return false; |
| } |
| if( !DefineIdentifier( name, var ) ) |
| { |
| return false; |
| } |
| var->SetFunctionIndex( mImportFunctions.AcquireRegister() ); |
| |
| return true; |
| } |
| |
| bool AsmJsModuleCompiler::AddNumericConst( PropertyName name, const double* cst ) |
| { |
| AsmJsMathConst* var = Anew( &mAllocator, AsmJsMathConst, name, cst ); |
| if( !var ) |
| { |
| return false; |
| } |
| if( !DefineIdentifier( name, var ) ) |
| { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| bool AsmJsModuleCompiler::AddArrayView( PropertyName name, ArrayBufferView::ViewType type ) |
| { |
| AsmJsArrayView* view = Anew( &mAllocator, AsmJsArrayView, name, type ); |
| if( !view ) |
| { |
| return false; |
| } |
| if( !DefineIdentifier( name, view ) ) |
| { |
| return false; |
| } |
| mArrayViews.Enqueue(view); |
| |
| return true; |
| } |
| |
| bool AsmJsModuleCompiler::AddFunctionTable( PropertyName name, const int size ) |
| { |
| GetByteCodeGenerator()->AssignPropertyId(name); |
| AsmJsFunctionTable* funcTable = Anew( &mAllocator, AsmJsFunctionTable, name, &mAllocator ); |
| if( !funcTable ) |
| { |
| return false; |
| } |
| if( !DefineIdentifier( name, funcTable ) ) |
| { |
| return false; |
| } |
| funcTable->SetSize( size ); |
| int pos = mFunctionTableArray.Add( funcTable ); |
| funcTable->SetFunctionIndex( pos ); |
| |
| return true; |
| } |
| |
| bool AsmJsModuleCompiler::AddExport( PropertyName name, RegSlot location ) |
| { |
| AsmJsModuleExport ex; |
| ex.id = name->GetPropertyId(); |
| ex.location = location; |
| |
| // return is < 0 if count overflowed 31bits |
| return mExports.Add( ex ) >= 0; |
| } |
| |
| bool AsmJsModuleCompiler::SetExportFunc( AsmJsFunc* func ) |
| { |
| Assert( mExports.Count() == 0 && func); |
| mExportFuncIndex = func->GetFunctionIndex(); |
| return mExports.Count() == 0 && (uint32)mExportFuncIndex < (uint32)mFunctionArray.Count(); |
| } |
| |
| AsmJsFunctionDeclaration* AsmJsModuleCompiler::LookupFunction( PropertyName name ) |
| { |
| if (name) |
| { |
| AsmJsSymbol* sym = LookupIdentifier(name); |
| if (sym) |
| { |
| switch (sym->GetSymbolType()) |
| { |
| case AsmJsSymbol::SIMDBuiltinFunction: |
| case AsmJsSymbol::MathBuiltinFunction: |
| case AsmJsSymbol::ModuleFunction: |
| case AsmJsSymbol::ImportFunction: |
| case AsmJsSymbol::FuncPtrTable: |
| return sym->Cast<AsmJsFunctionDeclaration>(); |
| default: |
| break; |
| } |
| } |
| } |
| return nullptr; |
| } |
| |
| bool AsmJsModuleCompiler::AreAllFuncTableDefined() |
| { |
| const int size = mFunctionTableArray.Count(); |
| for (int i = 0; i < size ; i++) |
| { |
| AsmJsFunctionTable* funcTable = mFunctionTableArray.Item( i ); |
| if( !funcTable->IsDefined() ) |
| { |
| AsmJSCompiler::OutputError(GetScriptContext(), _u("Function table %s was used in a function but does not appear in the module"), funcTable->GetName()->Psz()); |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| void AsmJsModuleCompiler::UpdateMaxHeapAccess(uint index) |
| { |
| if (mMaxHeapAccess < index) |
| { |
| mMaxHeapAccess = index; |
| } |
| } |
| |
| void AsmJsModuleCompiler::InitMemoryOffsets() |
| { |
| mModuleMemory.mArrayBufferOffset = AsmJsModuleMemory::MemoryTableBeginOffset; |
| mModuleMemory.mStdLibOffset = mModuleMemory.mArrayBufferOffset + 1; |
| mModuleMemory.mDoubleOffset = mModuleMemory.mStdLibOffset + 1; |
| mModuleMemory.mFuncOffset = mModuleMemory.mDoubleOffset + (mDoubleVarSpace.GetTotalVarCount() * DOUBLE_SLOTS_SPACE); |
| mModuleMemory.mFFIOffset = mModuleMemory.mFuncOffset + mFunctionArray.Count(); |
| mModuleMemory.mFuncPtrOffset = mModuleMemory.mFFIOffset + mImportFunctions.GetTotalVarCount(); |
| mModuleMemory.mFloatOffset = mModuleMemory.mFuncPtrOffset + GetFuncPtrTableCount(); |
| mModuleMemory.mIntOffset = mModuleMemory.mFloatOffset + (int32)(mFloatVarSpace.GetTotalVarCount() * FLOAT_SLOTS_SPACE + 0.5); |
| mModuleMemory.mMemorySize = mModuleMemory.mIntOffset + (int32)(mIntVarSpace.GetTotalVarCount() * INT_SLOTS_SPACE + 0.5); |
| |
| if (IsSimdjsEnabled()) |
| { |
| // mSimdOffset is in SIMDValues, hence aligned |
| // mMemorySize is in Vars |
| mModuleMemory.mSimdOffset = (int) ::ceil(mModuleMemory.mMemorySize / SIMD_SLOTS_SPACE); |
| if (mSimdVarSpace.GetTotalVarCount()) |
| { |
| mModuleMemory.mMemorySize = (int)((mModuleMemory.mSimdOffset + mSimdVarSpace.GetTotalVarCount()) * SIMD_SLOTS_SPACE); |
| } |
| |
| } |
| } |
| |
| void AsmJsModuleCompiler::AccumulateCompileTime() |
| { |
| Js::TickDelta td; |
| AsmJsCompileTime curTime = GetTick(); |
| td = curTime - mCompileTimeLastTick; |
| mCompileTime = mCompileTime+td; |
| mCompileTimeLastTick = curTime; |
| } |
| |
| void AsmJsModuleCompiler::AccumulateCompileTime(AsmJsCompilation::Phases phase) |
| { |
| Js::TickDelta td; |
| AsmJsCompileTime curTime = GetTick(); |
| td = curTime - mCompileTimeLastTick; |
| mCompileTime = mCompileTime+td; |
| mCompileTimeLastTick = curTime; |
| mPhaseCompileTime[phase] = mPhaseCompileTime[phase] + td; |
| } |
| |
| Js::AsmJsCompileTime AsmJsModuleCompiler::GetTick() |
| { |
| return Js::Tick::Now(); |
| } |
| |
| uint64 AsmJsModuleCompiler::GetCompileTime() const |
| { |
| return mCompileTime.ToMicroseconds(); |
| } |
| |
| static const char16* AsmPhaseNames[AsmJsCompilation::Phases_COUNT] = { |
| _u("Module"), |
| _u("ByteCode"), |
| _u("TemplateJIT"), |
| }; |
| |
| void AsmJsModuleCompiler::PrintCompileTrace() const |
| { |
| // for testtrace, don't print time so that it can be used for baselines |
| if (PHASE_TESTTRACE1(AsmjsPhase)) |
| { |
| AsmJSCompiler::OutputMessage(GetScriptContext(), DEIT_ASMJS_SUCCEEDED, _u("Successfully compiled asm.js code")); |
| } |
| else |
| { |
| uint64 us = GetCompileTime(); |
| uint64 ms = us / 1000; |
| us = us % 1000; |
| AsmJSCompiler::OutputMessage(GetScriptContext(), DEIT_ASMJS_SUCCEEDED, _u("Successfully compiled asm.js code (total compilation time %llu.%llums)"), ms, us); |
| } |
| |
| if (PHASE_TRACE1(AsmjsPhase)) |
| { |
| for (int i = 0; i < AsmJsCompilation::Phases_COUNT; i++) |
| { |
| uint64 us = mPhaseCompileTime[i].ToMicroseconds(); |
| uint64 ms = us / 1000; |
| us = us % 1000; |
| Output::Print(_u("%20s : %llu.%llums\n"), AsmPhaseNames[i], ms, us); |
| } |
| Output::Flush(); |
| } |
| } |
| |
| BVStatic<ASMMATH_BUILTIN_SIZE> AsmJsModuleCompiler::GetAsmMathBuiltinUsedBV() |
| { |
| return mAsmMathBuiltinUsedBV; |
| } |
| |
| BVStatic<ASMARRAY_BUILTIN_SIZE> AsmJsModuleCompiler::GetAsmArrayBuiltinUsedBV() |
| { |
| return mAsmArrayBuiltinUsedBV; |
| } |
| |
| void AsmJsModuleInfo::SetFunctionCount( int val ) |
| { |
| Assert( mFunctions == nullptr ); |
| mFunctionCount = val; |
| mFunctions = RecyclerNewArray( mRecycler, ModuleFunction, val ); |
| } |
| |
| void AsmJsModuleInfo::SetFunctionTableCount( int val ) |
| { |
| Assert( mFunctionTables == nullptr ); |
| mFunctionTableCount = val; |
| mFunctionTables = RecyclerNewArray( mRecycler, ModuleFunctionTable, val ); |
| } |
| |
| void AsmJsModuleInfo::SetFunctionImportCount( int val ) |
| { |
| Assert( mFunctionImports == nullptr ); |
| mFunctionImportCount = val; |
| mFunctionImports = RecyclerNewArray( mRecycler, ModuleFunctionImport, val ); |
| } |
| |
| void AsmJsModuleInfo::SetVarCount( int val ) |
| { |
| Assert( mVars == nullptr ); |
| mVarCount = val; |
| mVars = RecyclerNewArray( mRecycler, ModuleVar, val ); |
| } |
| |
| void AsmJsModuleInfo::SetVarImportCount( int val ) |
| { |
| Assert( mVarImports == nullptr ); |
| mVarImportCount = val; |
| mVarImports = RecyclerNewArray( mRecycler, ModuleVarImport, val ); |
| } |
| |
| void AsmJsModuleInfo::SetExportsCount( int count ) |
| { |
| if( count ) |
| { |
| mExports = RecyclerNewPlus( mRecycler, count * sizeof( PropertyId ), PropertyIdArray, count ); |
| mExportsFunctionLocation = RecyclerNewArray( mRecycler, RegSlot, count ); |
| } |
| mExportsCount = count; |
| } |
| |
| void AsmJsModuleInfo::InitializeSlotMap(int val) |
| { |
| Assert(mSlotMap == nullptr); |
| mSlotsCount = val; |
| mSlotMap = RecyclerNew(mRecycler, AsmJsSlotMap, mRecycler); |
| } |
| |
| void AsmJsModuleInfo::SetFunctionTableSize( int index, uint size ) |
| { |
| Assert( mFunctionTables != nullptr ); |
| Assert( index < mFunctionTableCount ); |
| ModuleFunctionTable& table = mFunctionTables[index]; |
| table.size = size; |
| table.moduleFunctionIndex = RecyclerNewArray( mRecycler, RegSlot, size ); |
| } |
| |
| void AsmJsModuleInfo::EnsureHeapAttached(ScriptFunction * func) |
| { |
| FrameDisplay* frame = func->GetEnvironment(); |
| ArrayBuffer* moduleArrayBuffer = *(ArrayBuffer**)((Var*)frame->GetItem(0) + AsmJsModuleMemory::MemoryTableBeginOffset); |
| if (moduleArrayBuffer && moduleArrayBuffer->IsDetached()) |
| { |
| Throw::OutOfMemory(); |
| } |
| } |
| |
| void * AsmJsModuleInfo::ConvertFrameForJavascript(void * asmMemory, ScriptFunction* func) |
| { |
| FunctionBody * body = func->GetFunctionBody(); |
| AsmJsFunctionInfo * asmFuncInfo = body->GetAsmJsFunctionInfo(); |
| FunctionBody * moduleBody = asmFuncInfo->GetModuleFunctionBody(); |
| AsmJsModuleInfo * asmModuleInfo = moduleBody->GetAsmJsModuleInfo(); |
| Assert(asmModuleInfo); |
| |
| ScriptContext * scriptContext = func->GetScriptContext(); |
| // AsmJsModuleEnvironment is all laid out here |
| Var * asmJsEnvironment = static_cast<Var*>(func->GetEnvironment()->GetItem(0)); |
| Var * asmBufferPtr = asmJsEnvironment + asmModuleInfo->GetModuleMemory().mArrayBufferOffset; |
| ArrayBuffer * asmBuffer = *asmBufferPtr ? ArrayBuffer::FromVar(*asmBufferPtr) : nullptr; |
| |
| Var stdLibObj = *(asmJsEnvironment + asmModuleInfo->GetModuleMemory().mStdLibOffset); |
| Var asmMathObject = stdLibObj ? JavascriptOperators::OP_GetProperty(stdLibObj, PropertyIds::Math, scriptContext) : nullptr; |
| |
| Var * asmFFIs = asmJsEnvironment + asmModuleInfo->GetModuleMemory().mFFIOffset; |
| Var * asmFuncs = asmJsEnvironment + asmModuleInfo->GetModuleMemory().mFuncOffset; |
| Var ** asmFuncPtrs = reinterpret_cast<Var**>(asmJsEnvironment + asmModuleInfo->GetModuleMemory().mFuncPtrOffset); |
| |
| double * asmDoubleVars = reinterpret_cast<double*>(asmJsEnvironment + asmModuleInfo->GetModuleMemory().mDoubleOffset); |
| int * asmIntVars = reinterpret_cast<int*>(asmJsEnvironment + asmModuleInfo->GetModuleMemory().mIntOffset); |
| float * asmFloatVars = reinterpret_cast<float*>(asmJsEnvironment + asmModuleInfo->GetModuleMemory().mFloatOffset); |
| |
| AsmJsSIMDValue * asmSIMDVars = reinterpret_cast<AsmJsSIMDValue*>(asmJsEnvironment + asmModuleInfo->GetModuleMemory().mSimdOffset); |
| |
| |
| #if DEBUG |
| Var * slotArray = RecyclerNewArrayZ(scriptContext->GetRecycler(), Var, moduleBody->scopeSlotArraySize + ScopeSlots::FirstSlotIndex); |
| #else |
| Var * slotArray = RecyclerNewArray(scriptContext->GetRecycler(), Var, moduleBody->scopeSlotArraySize + ScopeSlots::FirstSlotIndex); |
| #endif |
| ScopeSlots scopeSlots(slotArray); |
| scopeSlots.SetCount(moduleBody->scopeSlotArraySize); |
| scopeSlots.SetScopeMetadata(moduleBody); |
| |
| auto asmSlotMap = asmModuleInfo->GetAsmJsSlotMap(); |
| Assert((uint)asmModuleInfo->GetSlotsCount() == moduleBody->scopeSlotArraySize); |
| |
| Js::ActivationObject* activeScopeObject = nullptr; |
| if (moduleBody->GetObjectRegister() != 0) |
| { |
| activeScopeObject = static_cast<ActivationObject*>(scriptContext->GetLibrary()->CreateActivationObject()); |
| } |
| |
| PropertyId* propertyIdArray = moduleBody->GetPropertyIdsForScopeSlotArray(); |
| for (int i = 0; i < asmModuleInfo->GetSlotsCount(); ++i) |
| { |
| AsmJsSlot * asmSlot; |
| bool found = asmSlotMap->TryGetValue(propertyIdArray[i], &asmSlot); |
| // we should have everything we need in the map |
| Assert(found); |
| Var value = nullptr; |
| switch (asmSlot->symType) |
| { |
| case AsmJsSymbol::ConstantImport: |
| case AsmJsSymbol::Variable: |
| { |
| switch (asmSlot->varType) |
| { |
| case AsmJsVarType::Double: |
| value = JavascriptNumber::NewWithCheck(asmDoubleVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Float: |
| value = JavascriptNumber::NewWithCheck(asmFloatVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Int: |
| value = JavascriptNumber::ToVar(asmIntVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Float32x4: |
| value = JavascriptSIMDFloat32x4::New(&asmSIMDVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Float64x2: |
| value = JavascriptSIMDFloat64x2::New(&asmSIMDVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Int32x4: |
| value = JavascriptSIMDInt32x4::New(&asmSIMDVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Int16x8: |
| value = JavascriptSIMDInt16x8::New(&asmSIMDVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Int8x16: |
| value = JavascriptSIMDInt8x16::New(&asmSIMDVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Uint32x4: |
| value = JavascriptSIMDUint32x4::New(&asmSIMDVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Uint16x8: |
| value = JavascriptSIMDUint16x8::New(&asmSIMDVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Uint8x16: |
| value = JavascriptSIMDUint8x16::New(&asmSIMDVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Bool32x4: |
| value = JavascriptSIMDBool32x4::New(&asmSIMDVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Bool16x8: |
| value = JavascriptSIMDBool16x8::New(&asmSIMDVars[asmSlot->location], scriptContext); |
| break; |
| case AsmJsVarType::Bool8x16: |
| value = JavascriptSIMDBool8x16::New(&asmSIMDVars[asmSlot->location], scriptContext); |
| break; |
| default: |
| Assume(UNREACHED); |
| } |
| break; |
| } |
| case AsmJsSymbol::ModuleArgument: |
| { |
| switch (asmSlot->argType) |
| { |
| case AsmJsModuleArg::ArgType::StdLib: |
| value = stdLibObj; |
| break; |
| case AsmJsModuleArg::ArgType::Import: |
| // we can't reference this inside functions (and don't hold onto it), but must set to something, so set it to be undefined |
| value = scriptContext->GetLibrary()->GetUndefined(); |
| break; |
| case AsmJsModuleArg::ArgType::Heap: |
| value = asmBuffer; |
| break; |
| default: |
| Assume(UNREACHED); |
| } |
| break; |
| } |
| case AsmJsSymbol::ImportFunction: |
| value = asmFFIs[asmSlot->location]; |
| break; |
| case AsmJsSymbol::FuncPtrTable: |
| value = JavascriptArray::OP_NewScArrayWithElements(asmSlot->funcTableSize, asmFuncPtrs[asmSlot->location], scriptContext); |
| break; |
| case AsmJsSymbol::ModuleFunction: |
| value = asmFuncs[asmSlot->location]; |
| break; |
| case AsmJsSymbol::MathConstant: |
| value = JavascriptNumber::NewWithCheck(asmSlot->mathConstVal, scriptContext); |
| break; |
| case AsmJsSymbol::ArrayView: |
| { |
| AnalysisAssert(asmBuffer); |
| #ifdef _M_X64 |
| const bool isOptimizedBuffer = true; |
| #elif _M_IX86 |
| const bool isOptimizedBuffer = false; |
| #else |
| Assert(UNREACHED); |
| const bool isOptimizedBuffer = false; |
| #endif |
| Assert(isOptimizedBuffer == asmBuffer->IsValidVirtualBufferLength(asmBuffer->GetByteLength())); |
| switch (asmSlot->viewType) |
| { |
| case ArrayBufferView::TYPE_FLOAT32: |
| value = TypedArray<float, false, isOptimizedBuffer>::Create(asmBuffer, 0, asmBuffer->GetByteLength() >> 2, scriptContext->GetLibrary()); |
| break; |
| case ArrayBufferView::TYPE_FLOAT64: |
| value = TypedArray<double, false, isOptimizedBuffer>::Create(asmBuffer, 0, asmBuffer->GetByteLength() >> 3, scriptContext->GetLibrary()); |
| break; |
| case ArrayBufferView::TYPE_INT8: |
| value = TypedArray<int8, false, isOptimizedBuffer>::Create(asmBuffer, 0, asmBuffer->GetByteLength(), scriptContext->GetLibrary()); |
| break; |
| case ArrayBufferView::TYPE_INT16: |
| value = TypedArray<int16, false, isOptimizedBuffer>::Create(asmBuffer, 0, asmBuffer->GetByteLength() >> 1, scriptContext->GetLibrary()); |
| break; |
| case ArrayBufferView::TYPE_INT32: |
| value = TypedArray<int32, false, isOptimizedBuffer>::Create(asmBuffer, 0, asmBuffer->GetByteLength() >> 2, scriptContext->GetLibrary()); |
| break; |
| case ArrayBufferView::TYPE_UINT8: |
| value = TypedArray<uint8, false, isOptimizedBuffer>::Create(asmBuffer, 0, asmBuffer->GetByteLength(), scriptContext->GetLibrary()); |
| break; |
| case ArrayBufferView::TYPE_UINT16: |
| value = TypedArray<uint16, false, isOptimizedBuffer>::Create(asmBuffer, 0, asmBuffer->GetByteLength() >> 1, scriptContext->GetLibrary()); |
| break; |
| case ArrayBufferView::TYPE_UINT32: |
| value = TypedArray<uint32, false, isOptimizedBuffer>::Create(asmBuffer, 0, asmBuffer->GetByteLength() >> 2, scriptContext->GetLibrary()); |
| break; |
| default: |
| Assume(UNREACHED); |
| } |
| break; |
| } |
| case AsmJsSymbol::MathBuiltinFunction: |
| { |
| switch (asmSlot->builtinMathFunc) |
| { |
| #define ASMJS_MATH_FUNC_NAMES(name, propertyName) \ |
| case AsmJSMathBuiltin_##name: \ |
| value = JavascriptOperators::OP_GetProperty(asmMathObject, PropertyIds::##propertyName, scriptContext); \ |
| break; |
| #include "AsmJsBuiltInNames.h" |
| default: |
| Assume(UNREACHED); |
| } |
| break; |
| } |
| case AsmJsSymbol::TypedArrayBuiltinFunction: |
| switch (asmSlot->builtinArrayFunc) |
| { |
| #define ASMJS_ARRAY_NAMES(name, propertyName) \ |
| case AsmJSTypedArrayBuiltin_##name: \ |
| value = JavascriptOperators::OP_GetProperty(stdLibObj, PropertyIds::##propertyName, scriptContext); \ |
| break; |
| #include "AsmJsBuiltInNames.h" |
| default: |
| Assume(UNREACHED); |
| } |
| break; |
| |
| case AsmJsSymbol::SIMDBuiltinFunction: |
| switch (asmSlot->builtinSIMDFunc) |
| { |
| #define ASMJS_SIMD_NAMES(name, propertyName, libName, entryPoint) \ |
| case AsmJsSIMDBuiltin_##name: \ |
| value = JavascriptOperators::OP_GetProperty(stdLibObj, PropertyIds::##propertyName, scriptContext); \ |
| break; |
| #include "AsmJsBuiltInNames.h" |
| default: |
| Assume(UNREACHED); |
| } |
| break; |
| |
| default: |
| Assume(UNREACHED); |
| } |
| if (activeScopeObject != nullptr) |
| { |
| activeScopeObject->SetPropertyWithAttributes( |
| propertyIdArray[i], |
| value, |
| asmSlot->isConstVar ? PropertyConstDefaults : PropertyDynamicTypeDefaults, |
| nullptr); |
| } |
| else |
| { |
| // ensure we aren't multiply writing to a slot |
| Assert(scopeSlots.Get(i) == nullptr); |
| scopeSlots.Set(i, value); |
| } |
| } |
| |
| if (activeScopeObject != nullptr) |
| { |
| return (void*)activeScopeObject; |
| } |
| else |
| { |
| return (void*)slotArray; |
| } |
| } |
| |
| bool AsmJsModuleCompiler::LookupStdLibSIMDNameInMap(PropertyName name, AsmJsSIMDFunction **simdFunc, SIMDNameMap* map) const |
| { |
| return map->TryGetValue(name->GetPropertyId(), simdFunc); |
| } |
| |
| bool AsmJsModuleCompiler::AddStandardLibrarySIMDNameInMap(PropertyId id, AsmJsSIMDFunction *simdFunc, SIMDNameMap* map) |
| { |
| //SimdBuiltin simdBuiltin(simdFunc->GetSimdBuiltInFunction(), simdFunc); |
| if (map->ContainsKey(id)) |
| { |
| return nullptr; |
| } |
| |
| return map->AddNew(id, simdFunc) == -1 ? false : true; |
| } |
| |
| bool AsmJsModuleCompiler::LookupStdLibSIMDName(PropertyId baseId, PropertyName fieldName, AsmJsSIMDFunction **simdFunc) |
| { |
| switch (baseId) |
| { |
| case PropertyIds::Int32x4: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDInt32x4Map); |
| case PropertyIds::Bool32x4: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDBool32x4Map); |
| case PropertyIds::Bool16x8: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDBool16x8Map); |
| case PropertyIds::Bool8x16: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDBool8x16Map); |
| case PropertyIds::Float32x4: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDFloat32x4Map); |
| case PropertyIds::Float64x2: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDFloat64x2Map); |
| case PropertyIds::Int16x8: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDInt16x8Map); |
| case PropertyIds::Int8x16: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDInt8x16Map); |
| case PropertyIds::Uint32x4: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDUint32x4Map); |
| case PropertyIds::Uint16x8: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDUint16x8Map); |
| case PropertyIds::Uint8x16: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDUint8x16Map); |
| |
| default: |
| AssertMsg(false, "Invalid SIMD type"); |
| return false; |
| } |
| } |
| |
| bool AsmJsModuleCompiler::LookupStdLibSIMDName(AsmJsSIMDBuiltinFunction baseId, PropertyName fieldName, AsmJsSIMDFunction **simdFunc) |
| { |
| switch (baseId) |
| { |
| case AsmJsSIMDBuiltin_Int32x4: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDInt32x4Map); |
| case AsmJsSIMDBuiltin_Bool32x4: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDBool32x4Map); |
| case AsmJsSIMDBuiltin_Bool16x8: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDBool16x8Map); |
| case AsmJsSIMDBuiltin_Bool8x16: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDBool8x16Map); |
| case AsmJsSIMDBuiltin_Float32x4: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDFloat32x4Map); |
| case AsmJsSIMDBuiltin_Float64x2: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDFloat64x2Map); |
| case AsmJsSIMDBuiltin_Int16x8: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDInt16x8Map); |
| case AsmJsSIMDBuiltin_Int8x16: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDInt8x16Map); |
| case AsmJsSIMDBuiltin_Uint32x4: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDUint32x4Map); |
| case AsmJsSIMDBuiltin_Uint16x8: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDUint16x8Map); |
| case AsmJsSIMDBuiltin_Uint8x16: |
| return LookupStdLibSIMDNameInMap(fieldName, simdFunc, &mStdLibSIMDUint8x16Map); |
| default: |
| AssertMsg(false, "Invalid SIMD type"); |
| return false; |
| } |
| } |
| |
| AsmJsSIMDFunction* AsmJsModuleCompiler::LookupSimdConstructor(PropertyName name) |
| { |
| AsmJsFunctionDeclaration *func = LookupFunction(name); |
| if (func == nullptr || func->GetSymbolType() != AsmJsSymbol::SIMDBuiltinFunction) |
| { |
| return nullptr; |
| } |
| AsmJsSIMDFunction *simdFunc = func->Cast<AsmJsSIMDFunction>(); |
| if (simdFunc->IsConstructor()) |
| { |
| return simdFunc; |
| } |
| return nullptr; |
| } |
| |
| AsmJsSIMDFunction* AsmJsModuleCompiler::LookupSimdTypeCheck(PropertyName name) |
| { |
| AsmJsFunctionDeclaration *func = LookupFunction(name); |
| if (func == nullptr || func->GetSymbolType() != AsmJsSymbol::SIMDBuiltinFunction) |
| { |
| return nullptr; |
| } |
| AsmJsSIMDFunction *simdFunc = func->Cast<AsmJsSIMDFunction>(); |
| if (simdFunc->IsTypeCheck()) |
| { |
| return simdFunc; |
| } |
| return nullptr; |
| } |
| |
| AsmJsSIMDFunction* AsmJsModuleCompiler::LookupSimdOperation(PropertyName name) |
| { |
| AsmJsFunctionDeclaration *func = LookupFunction(name); |
| if (func == nullptr || func->GetSymbolType() != AsmJsSymbol::SIMDBuiltinFunction) |
| { |
| return nullptr; |
| } |
| AsmJsSIMDFunction *simdFunc = func->Cast<AsmJsSIMDFunction>(); |
| if (simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Int32x4 && |
| simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Int16x8 && |
| simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Int8x16 && |
| simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Float32x4 && |
| simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Float64x2 && |
| simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Uint32x4 && |
| simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Uint16x8 && |
| simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Uint8x16 && |
| simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Bool32x4 && |
| simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Bool16x8 && |
| simdFunc->GetSimdBuiltInFunction() != AsmJsSIMDBuiltin_Bool8x16 |
| ) |
| { |
| return simdFunc; |
| } |
| return nullptr; |
| } |
| |
| |
| bool AsmJsModuleCompiler::AddSimdValueVar(PropertyName name, ParseNode* pnode, AsmJsSIMDFunction* simdFunc) |
| { |
| AssertMsg(simdFunc->GetSymbolType() == AsmJsSymbol::SIMDBuiltinFunction, "Expecting SIMD builtin"); |
| AssertMsg(simdFunc->IsConstructor(), "Expecting constructor function"); |
| |
| AsmJsSIMDValue value; |
| AsmJsVarType type = simdFunc->GetConstructorVarType(); |
| |
| // e.g. var g1 = f4(1.0, 2.0, 3.0, 4.0); |
| if (!ValidateSimdConstructor(pnode, simdFunc, value)) |
| { |
| return false; |
| } |
| |
| AsmJsVar* var = Anew(&mAllocator, AsmJsVar, name); |
| if (!var || !DefineIdentifier(name, var)) |
| { |
| return false; |
| } |
| |
| ++mVarCount; |
| var->SetVarType(type); |
| var->SetConstInitialiser(value); |
| // acquire register |
| var->SetLocation(mSimdVarSpace.AcquireRegister()); |
| return true; |
| } |
| |
| bool AsmJsModuleCompiler::ValidateSimdConstructor(ParseNode* pnode, AsmJsSIMDFunction* simdFunc, AsmJsSIMDValue& value) |
| { |
| Assert(pnode->nop == knopCall); |
| |
| uint argCount = pnode->sxCall.argCount; |
| ParseNode* argNode = pnode->sxCall.pnodeArgs; |
| ParseNode *arg = argNode; |
| uint nop = 0; |
| AsmJsSIMDBuiltinFunction simdBuiltin = simdFunc->GetSimdBuiltInFunction(); |
| |
| if (!simdFunc->IsConstructor(argCount)) |
| { |
| return Fail(pnode, _u("Invalid SIMD constructor or wrong number of arguments.")); |
| } |
| |
| switch (simdBuiltin) |
| { |
| case AsmJsSIMDBuiltin_Float64x2: |
| case AsmJsSIMDBuiltin_Float32x4: |
| nop = (uint)knopFlt; |
| break; |
| case AsmJsSIMDBuiltin_Int32x4: |
| case AsmJsSIMDBuiltin_Int16x8: |
| case AsmJsSIMDBuiltin_Int8x16: |
| case AsmJsSIMDBuiltin_Uint32x4: |
| case AsmJsSIMDBuiltin_Uint16x8: |
| case AsmJsSIMDBuiltin_Uint8x16: |
| case AsmJsSIMDBuiltin_Bool32x4: |
| case AsmJsSIMDBuiltin_Bool16x8: |
| case AsmJsSIMDBuiltin_Bool8x16: |
| nop = (uint)knopInt; |
| break; |
| default: |
| Assert(UNREACHED); |
| } |
| |
| if (simdFunc->GetArgCount() != argCount) |
| { |
| return Fail(pnode, _u("Invalid number of arguments to SIMD constructor.")); |
| } |
| |
| for (uint i = 0; i < argCount; i++) |
| { |
| arg = argNode; |
| if (argNode->nop == knopList) |
| { |
| arg = ParserWrapper::GetBinaryLeft(argNode); |
| argNode = ParserWrapper::GetBinaryRight(argNode); |
| } |
| Assert(arg); |
| // store to SIMD Value |
| if (arg->nop == nop) |
| { |
| if (nop == (uint)knopInt) |
| { |
| switch (simdBuiltin) |
| { |
| case AsmJsSIMDBuiltin_Int32x4: |
| value.i32[i] = arg->sxInt.lw; |
| break; |
| case AsmJsSIMDBuiltin_Int16x8: |
| value.i16[i] = (int16)arg->sxInt.lw; |
| break; |
| case AsmJsSIMDBuiltin_Int8x16: |
| value.i8[i] = (int8)arg->sxInt.lw; |
| break; |
| case AsmJsSIMDBuiltin_Uint32x4: |
| value.u32[i] = (uint32)arg->sxInt.lw; |
| break; |
| case AsmJsSIMDBuiltin_Uint16x8: |
| value.u16[i] = (uint16)arg->sxInt.lw; |
| break; |
| case AsmJsSIMDBuiltin_Uint8x16: |
| value.u8[i] = (uint8)arg->sxInt.lw; |
| break; |
| case AsmJsSIMDBuiltin_Bool32x4: |
| value.i32[i] = (arg->sxInt.lw) ? -1 : 0; |
| break; |
| case AsmJsSIMDBuiltin_Bool16x8: |
| value.i16[i] = (arg->sxInt.lw) ? -1 : 0; |
| break; |
| case AsmJsSIMDBuiltin_Bool8x16: |
| value.i8[i] = (arg->sxInt.lw) ? -1 : 0; |
| break; |
| default: |
| Assert(UNREACHED); |
| } |
| |
| } |
| else if (nop == (uint)knopFlt) |
| { |
| if (simdBuiltin == AsmJsSIMDBuiltin_Float32x4) |
| { |
| value.f32[i] = (float)arg->sxFlt.dbl; |
| } |
| else // float64x2 |
| { |
| value.f64[i] = arg->sxFlt.dbl; |
| } |
| } |
| } |
| else |
| { |
| return Fail(pnode, _u("Invalid argument type to SIMD constructor.")); |
| } |
| } |
| return true; |
| } |
| }; |
| #endif |