| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060 |
- //-------------------------------------------------------------------------------------------------------
- // 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 "RuntimeByteCodePch.h"
- #ifdef ASMJS_PLAT
- #if DBG_DUMP
- #include "Language/AsmJsModule.h"
- #include "ByteCode/AsmJsByteCodeDumper.h"
- namespace Js
- {
- void AsmJsByteCodeDumper::Dump(FunctionBody* body, const WAsmJs::TypedRegisterAllocator* typedRegister, AsmJsFunc* asmFunc)
- {
- ByteCodeReader reader;
- reader.Create(body);
- StatementReader<FunctionBody::StatementMapList> statementReader;
- statementReader.Create(body);
- body->DumpFullFunctionName();
- Output::Print(_u(" Asm.js ("));
- AsmJsFunctionInfo* funcInfo = body->GetAsmJsFunctionInfo();
- const ArgSlot argCount = funcInfo->GetArgCount();
- for (ArgSlot i = 0; i < argCount; i++)
- {
- AsmJsVarType var = funcInfo->GetArgType(i);
- if (i > 0)
- {
- Output::Print(_u(", "));
- }
- if (var.isDouble())
- {
- Output::Print(_u("+In%hu"), i);
- }
- else if (var.isFloat())
- {
- Output::Print(_u("flt(In%hu)"), i);
- }
- else if (var.isInt())
- {
- Output::Print(_u("In%hu|0"), i);
- }
- else if (var.isInt64())
- {
- Output::Print(_u("int64(In%hu)"), i);
- }
- else if (var.isSIMD())
- {
- switch (var.which())
- {
- case AsmJsType::Int32x4:
- Output::Print(_u("I4(In%hu)"), i);
- break;
- case AsmJsType::Int8x16:
- Output::Print(_u("I16(In%hu)"), i);
- break;
- case AsmJsType::Float32x4:
- Output::Print(_u("F4(In%hu)"), i);
- break;
- case AsmJsType::Float64x2:
- Output::Print(_u("D2(In%hu)"), i);
- break;
- }
- }
- else
- {
- Assert(UNREACHED);
- }
- }
- Output::Print(_u(") "));
- Output::Print(_u("(size: %d [%d])\n"), body->GetByteCodeCount(), body->GetByteCodeWithoutLDACount());
- if (!typedRegister && asmFunc)
- {
- typedRegister = &asmFunc->GetTypedRegisterAllocator();
- }
- if (typedRegister)
- {
- typedRegister->DumpLocalsInfo();
- }
- if (asmFunc)
- {
- DumpConstants(asmFunc, body);
- }
- if (typedRegister)
- {
- Output::Print(_u(" Implicit Arg Ins:\n ======== =====\n "));
- uint32 iArgs[WAsmJs::LIMIT];
- typedRegister->GetArgumentStartIndex(iArgs);
- uint32 iArg = iArgs[WAsmJs::INT32];
- uint32 lArg = iArgs[WAsmJs::INT64];
- uint32 dArg = iArgs[WAsmJs::FLOAT64];
- uint32 fArg = iArgs[WAsmJs::FLOAT32];
- uint32 simdArg = iArgs[WAsmJs::SIMD];
- for (ArgSlot i = 0; i < argCount; i++)
- {
- AsmJsVarType var = funcInfo->GetArgType(i);
- if (var.isDouble())
- {
- Output::Print(_u(" D%d In%d"), dArg++, i);
- }
- else if (var.isFloat())
- {
- Output::Print(_u(" F%d In%d"), fArg++, i);
- }
- else if (var.isInt())
- {
- Output::Print(_u(" I%d In%d"), iArg++, i);
- }
- else if (var.isInt64())
- {
- Output::Print(_u(" L%d In%d"), lArg++, i);
- }
- else if (var.isSIMD())
- {
- Output::Print(_u(" SIMD%d In%d"), simdArg++, i);
- }
- else
- {
- Assert(UNREACHED);
- }
- Output::Print(_u("\n "));
- }
- Output::Print(_u("\n"));
- }
- uint32 statementIndex = 0;
- while (true)
- {
- while (statementReader.AtStatementBoundary(&reader))
- {
- body->PrintStatementSourceLine(statementIndex);
- statementIndex = statementReader.MoveNextStatementBoundary();
- }
- int byteOffset = reader.GetCurrentOffset();
- LayoutSize layoutSize;
- OpCodeAsmJs op = reader.ReadAsmJsOp(layoutSize);
- if (op == OpCodeAsmJs::EndOfBlock)
- {
- Assert(reader.GetCurrentOffset() == body->GetByteCode()->GetLength());
- break;
- }
- Output::Print(_u(" %04x %2s"), byteOffset, layoutSize == LargeLayout ? _u("L-") : layoutSize == MediumLayout ? _u("M-") : _u(""));
- DumpOp(op, layoutSize, reader, body);
- if (Js::Configuration::Global.flags.Verbose)
- {
- int layoutStart = byteOffset + 2; // Account for the prefix op
- int endByteOffset = reader.GetCurrentOffset();
- Output::SkipToColumn(70);
- if (layoutSize == LargeLayout)
- {
- Output::Print(_u("%02X "),
- op > Js::OpCodeAsmJs::MaxByteSizedOpcodes ?
- Js::OpCodeAsmJs::ExtendedLargeLayoutPrefix : Js::OpCodeAsmJs::LargeLayoutPrefix);
- }
- else if (layoutSize == MediumLayout)
- {
- Output::Print(_u("%02X "),
- op > Js::OpCodeAsmJs::MaxByteSizedOpcodes ?
- Js::OpCodeAsmJs::ExtendedMediumLayoutPrefix : Js::OpCodeAsmJs::MediumLayoutPrefix);
- }
- else
- {
- Assert(layoutSize == SmallLayout);
- if (op > Js::OpCodeAsmJs::MaxByteSizedOpcodes)
- {
- Output::Print(_u("%02X "), Js::OpCodeAsmJs::ExtendedOpcodePrefix);
- }
- else
- {
- Output::Print(_u(" "));
- layoutStart--; // don't have a prefix
- }
- }
- Output::Print(_u("%02x"), (byte)op);
- for (int i = layoutStart; i < endByteOffset; i++)
- {
- Output::Print(_u(" %02x"), reader.GetRawByte(i));
- }
- }
- Output::Print(_u("\n"));
- }
- if (statementReader.AtStatementBoundary(&reader))
- {
- body->PrintStatementSourceLine(statementIndex);
- statementIndex = statementReader.MoveNextStatementBoundary();
- }
- Output::Print(_u("\n"));
- Output::Flush();
- }
- template<typename T, typename Func>
- void PrintTypedConstants(byte* table, WAsmJs::Types type, uint nConsts, Func printValFunc)
- {
- T* constTable = (T*)table;
- if (nConsts > 0)
- {
- char16 buf[32];
- WAsmJs::RegisterSpace::GetTypeDebugName(type, buf, 32);
- Output::Print(_u(" Constant %s:\n ======== =======\n "), buf);
- WAsmJs::RegisterSpace::GetTypeDebugName(type, buf, 32, true);
- for (uint i = 0; i < nConsts; i++)
- {
- Output::Print(_u(" %s%d "), buf, i);
- printValFunc(*constTable);
- Output::Print(_u("\n "));
- ++constTable;
- }
- }
- }
- void AsmJsByteCodeDumper::DumpConstants(AsmJsFunc* func, FunctionBody* body)
- {
- byte* table = (byte*)body->GetConstTable();
- auto constSrcInfos = func->GetTypedRegisterAllocator().GetConstSourceInfos();
- for (int i = 0; i < WAsmJs::LIMIT; ++i)
- {
- WAsmJs::Types type = (WAsmJs::Types)i;
- if (func->GetTypedRegisterAllocator().IsTypeExcluded(type))
- {
- continue;
- }
- uint constCount = func->GetTypedRegisterAllocator().GetRegisterSpace(type)->GetConstCount();
- if (constCount > 0)
- {
- uint offset = constSrcInfos.srcByteOffsets[i];
- byte* tableOffseted = table + offset;
- switch (type)
- {
- case WAsmJs::INT32: PrintTypedConstants<int>(tableOffseted, type, constCount, [](int v) {Output::Print(_u("%d"), v);}); break;
- case WAsmJs::INT64: PrintTypedConstants<int64>(tableOffseted, type, constCount, [](int64 v) {Output::Print(_u("%lld"), v);}); break;
- case WAsmJs::FLOAT32: PrintTypedConstants<float>(tableOffseted, type, constCount, [](float v) {Output::Print(_u("%.4f"), v);}); break;
- case WAsmJs::FLOAT64: PrintTypedConstants<double>(tableOffseted, type, constCount, [](double v) {Output::Print(_u("%.4f"), v);}); break;
- case WAsmJs::SIMD: PrintTypedConstants<AsmJsSIMDValue>(tableOffseted, type, constCount, [](AsmJsSIMDValue v) {
- Output::Print(_u("\n I32(%d, %d, %d, %d),"), v.i32[SIMD_X], v.i32[SIMD_Y], v.i32[SIMD_Z], v.i32[SIMD_W]);
- Output::Print(_u("\n F32(%.4f, %.4f, %.4f, %.4f),"), v.f32[SIMD_X], v.f32[SIMD_Y], v.f32[SIMD_Z], v.f32[SIMD_W]);
- Output::Print(_u("\n D64(%.4f, %.4f),"), v.f64[SIMD_X], v.f64[SIMD_Y]);
- Output::Print(_u("\n I8(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)"),
- v.i8[0], v.i8[1], v.i8[2], v.i8[3], v.i8[4], v.i8[5], v.i8[6], v.i8[7],
- v.i8[8], v.i8[9], v.i8[10], v.i8[11], v.i8[12], v.i8[13], v.i8[14], v.i8[15]);
- });
- break;
- default:
- Assert(false);
- break;
- }
- }
- Output::Print(_u("\n"));
- }
- }
- void AsmJsByteCodeDumper::DumpOp(OpCodeAsmJs op, LayoutSize layoutSize, ByteCodeReader& reader, FunctionBody* dumpFunction)
- {
- Output::Print(_u("%-20s"), OpCodeUtilAsmJs::GetOpCodeName(op));
- OpLayoutTypeAsmJs nType = OpCodeUtilAsmJs::GetOpCodeLayout(op);
- switch (layoutSize * OpLayoutTypeAsmJs::Count + nType)
- {
- #define LAYOUT_TYPE(layout) \
- case OpLayoutTypeAsmJs::layout: \
- Assert(layoutSize == SmallLayout); \
- Dump##layout(op, reader.layout(), dumpFunction, reader); \
- break;
- #define LAYOUT_TYPE_WMS(layout) \
- case SmallLayout * OpLayoutTypeAsmJs::Count + OpLayoutTypeAsmJs::layout: \
- Dump##layout(op, reader.layout##_Small(), dumpFunction, reader); \
- break; \
- case MediumLayout * OpLayoutTypeAsmJs::Count + OpLayoutTypeAsmJs::layout: \
- Dump##layout(op, reader.layout##_Medium(), dumpFunction, reader); \
- break; \
- case LargeLayout * OpLayoutTypeAsmJs::Count + OpLayoutTypeAsmJs::layout: \
- Dump##layout(op, reader.layout##_Large(), dumpFunction, reader); \
- break;
- #include "LayoutTypesAsmJs.h"
- default:
- AssertMsg(false, "Unknown OpLayout");
- break;
- }
- }
- void AsmJsByteCodeDumper::DumpIntReg(RegSlot reg)
- {
- Output::Print(_u(" I%d "), (int)reg);
- }
- void AsmJsByteCodeDumper::DumpLongReg(RegSlot reg)
- {
- Output::Print(_u(" L%d "), (int)reg);
- }
- void AsmJsByteCodeDumper::DumpDoubleReg(RegSlot reg)
- {
- Output::Print(_u(" D%d "), (int)reg);
- }
- void AsmJsByteCodeDumper::DumpFloatReg(RegSlot reg)
- {
- Output::Print(_u(" F%d "), (int)reg);
- }
- void AsmJsByteCodeDumper::DumpR8Float(float value)
- {
- Output::Print(_u(" float:%f "), value);
- }
- // Float32x4
- void AsmJsByteCodeDumper::DumpFloat32x4Reg(RegSlot reg)
- {
- Output::Print(_u(" F4_%d "), (int)reg);
- }
- // Int32x4
- void AsmJsByteCodeDumper::DumpInt32x4Reg(RegSlot reg)
- {
- Output::Print(_u(" I4_%d "), (int)reg);
- }
- void AsmJsByteCodeDumper::DumpUint32x4Reg(RegSlot reg)
- {
- Output::Print(_u(" U4_%d "), (int)reg);
- }
- void AsmJsByteCodeDumper::DumpInt16x8Reg(RegSlot reg)
- {
- Output::Print(_u(" I8_%d "), (int)reg);
- }
- // Int8x16
- void AsmJsByteCodeDumper::DumpInt8x16Reg(RegSlot reg)
- {
- Output::Print(_u(" I16_%d "), (int)reg);
- }
- void AsmJsByteCodeDumper::DumpUint16x8Reg(RegSlot reg)
- {
- Output::Print(_u(" U8_%d "), (int)reg);
- }
- void AsmJsByteCodeDumper::DumpUint8x16Reg(RegSlot reg)
- {
- Output::Print(_u(" U16_%d "), (int)reg);
- }
- // Bool32x4
- void AsmJsByteCodeDumper::DumpBool32x4Reg(RegSlot reg)
- {
- Output::Print(_u(" B4_%d "), (int)reg);
- }
- // Bool16x8
- void AsmJsByteCodeDumper::DumpBool16x8Reg(RegSlot reg)
- {
- Output::Print(_u(" B8_%d "), (int)reg);
- }
- // Bool32x4
- void AsmJsByteCodeDumper::DumpBool8x16Reg(RegSlot reg)
- {
- Output::Print(_u(" B16_%d "), (int)reg);
- }
- // Float64x2
- void AsmJsByteCodeDumper::DumpFloat64x2Reg(RegSlot reg)
- {
- Output::Print(_u(" D2_%d "), (int)reg);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpElementSlot(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- switch (op)
- {
- case OpCodeAsmJs::LdSlot:
- case OpCodeAsmJs::LdSlotArr:
- {
- #ifdef ENABLE_WASM
- auto asmInfo = dumpFunction->GetAsmJsFunctionInfo();
- auto wasmInfo = asmInfo->GetWasmReaderInfo();
- if (wasmInfo)
- {
- uint index = (uint)data->SlotIndex;
- if (index - wasmInfo->m_module->GetFuncOffset() < wasmInfo->m_module->GetWasmFunctionCount())
- {
- uint funcIndex = data->SlotIndex - wasmInfo->m_module->GetFuncOffset();
- auto loadedFunc = wasmInfo->m_module->GetWasmFunctionInfo(funcIndex);
- Output::Print(_u(" R%d = %s"), data->Value, loadedFunc->GetBody()->GetDisplayName());
- break;
- }
- }
- #endif
- Output::Print(_u(" R%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- }
- case OpCodeAsmJs::LdArr_Func:
- case OpCodeAsmJs::LdArr_WasmFunc:
- Output::Print(_u(" R%d = R%d[I%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::StSlot_Int:
- Output::Print(_u(" R%d[%d] = I%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::StSlot_Long:
- Output::Print(_u(" R%d[%d] = L%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::StSlot_Flt:
- Output::Print(_u(" R%d[%d] = F%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::StSlot_Db:
- Output::Print(_u(" R%d[%d] = D%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::LdSlot_Int:
- Output::Print(_u(" I%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::LdSlot_Long:
- Output::Print(_u(" L%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::LdSlot_Flt:
- Output::Print(_u(" F%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::LdSlot_Db:
- Output::Print(_u(" D%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::Simd128_LdSlot_F4:
- Output::Print(_u(" F4_%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::Simd128_LdSlot_I4:
- Output::Print(_u(" I4_%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::Simd128_LdSlot_I8:
- Output::Print(_u(" I8_%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::Simd128_LdSlot_I16:
- Output::Print(_u(" I16_%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::Simd128_LdSlot_U4:
- Output::Print(_u(" U4_%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::Simd128_LdSlot_U8:
- Output::Print(_u(" U8_%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::Simd128_LdSlot_U16:
- Output::Print(_u(" U16_%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::Simd128_LdSlot_B4:
- Output::Print(_u(" B4_%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::Simd128_LdSlot_B8:
- Output::Print(_u(" B8_%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- case OpCodeAsmJs::Simd128_LdSlot_B16:
- Output::Print(_u(" B16_%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- #if 0
- case OpCodeAsmJs::Simd128_LdSlot_D2:
- Output::Print(_u(" D2_%d = R%d[%d]"), data->Value, data->Instance, data->SlotIndex);
- break;
- #endif // 0
- case OpCodeAsmJs::Simd128_StSlot_F4:
- Output::Print(_u(" R%d[%d] = F4_%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::Simd128_StSlot_I4:
- Output::Print(_u(" R%d[%d] = I4_%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::Simd128_StSlot_I8:
- Output::Print(_u(" R%d[%d] = I8_%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::Simd128_StSlot_I16:
- Output::Print(_u(" R%d[%d] = I16_%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::Simd128_StSlot_U4:
- Output::Print(_u(" R%d[%d] = U4_%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::Simd128_StSlot_U8:
- Output::Print(_u(" R%d[%d] = U8_%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::Simd128_StSlot_U16:
- Output::Print(_u(" R%d[%d] = U16_%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::Simd128_StSlot_B4:
- Output::Print(_u(" R%d[%d] = B4_%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::Simd128_StSlot_B8:
- Output::Print(_u(" R%d[%d] = B8_%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- case OpCodeAsmJs::Simd128_StSlot_B16:
- Output::Print(_u(" R%d[%d] = B16_%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- #if 0
- case OpCodeAsmJs::Simd128_StSlot_D2:
- Output::Print(_u(" R%d[%d] = D2_%d"), data->Instance, data->SlotIndex, data->Value);
- break;
- #endif // 0
- default:
- {
- AssertMsg(false, "Unknown OpCode for OpLayoutElementSlot");
- break;
- }
- }
- }
- void AsmJsByteCodeDumper::InitializeWAsmJsMemTag(ArrayBufferView::ViewType type, _Out_ WAsmJsMemTag * tag)
- {
- switch (type)
- {
- case ArrayBufferView::TYPE_INT8:
- tag->heapTag = _u("HEAP8"); tag->valueTag = 'I'; break;
- case ArrayBufferView::TYPE_UINT8:
- tag->heapTag = _u("HEAPU8"); tag->valueTag = 'U'; break;
- case ArrayBufferView::TYPE_INT16:
- tag->heapTag = _u("HEAP16"); tag->valueTag = 'I'; break;
- case ArrayBufferView::TYPE_UINT16:
- tag->heapTag = _u("HEAPU16"); tag->valueTag = 'U'; break;
- case ArrayBufferView::TYPE_INT32:
- tag->heapTag = _u("HEAP32"); tag->valueTag = 'I'; break;
- case ArrayBufferView::TYPE_UINT32:
- tag->heapTag = _u("HEAPU32"); tag->valueTag = 'U'; break;
- case ArrayBufferView::TYPE_FLOAT32:
- tag->heapTag = _u("HEAPF32"); tag->valueTag = 'F'; break;
- case ArrayBufferView::TYPE_FLOAT64:
- tag->heapTag = _u("HEAPF64"); tag->valueTag = 'D'; break;
- case ArrayBufferView::TYPE_INT64:
- tag->heapTag = _u("HEAPI64"); tag->valueTag = 'L'; break;
- case ArrayBufferView::TYPE_INT8_TO_INT64:
- tag->heapTag = _u("HEAP8"); tag->valueTag = 'L'; break;
- case ArrayBufferView::TYPE_UINT8_TO_INT64:
- tag->heapTag = _u("HEAPU8"); tag->valueTag = 'L'; break;
- case ArrayBufferView::TYPE_INT16_TO_INT64:
- tag->heapTag = _u("HEAP16"); tag->valueTag = 'L'; break;
- case ArrayBufferView::TYPE_UINT16_TO_INT64:
- tag->heapTag = _u("HEAPU16"); tag->valueTag = 'L'; break;
- case ArrayBufferView::TYPE_INT32_TO_INT64:
- tag->heapTag = _u("HEAP32"); tag->valueTag = 'L'; break;
- case ArrayBufferView::TYPE_UINT32_TO_INT64:
- tag->heapTag = _u("HEAPU32"); tag->valueTag = 'L'; break;
- default:
- Assume(UNREACHED);
- }
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmTypedArr(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- WAsmJsMemTag tag;
- InitializeWAsmJsMemTag(data->ViewType, &tag);
- switch (op)
- {
- case OpCodeAsmJs::LdArr:
- Output::Print(_u(" %c%d = %s[I%d]"), tag.valueTag, data->Value, tag.heapTag, data->SlotIndex); break;
- case OpCodeAsmJs::LdArrConst:
- Output::Print(_u(" %c%d = %s[%d]"), tag.valueTag, data->Value, tag.heapTag, data->SlotIndex); break;
- case OpCodeAsmJs::StArr:
- Output::Print(_u(" %s[I%d] = %c%d"), tag.heapTag, data->SlotIndex, tag.valueTag, data->Value); break;
- case OpCodeAsmJs::StArrConst:
- Output::Print(_u(" %s[%d] = %c%d"), tag.heapTag, data->SlotIndex, tag.valueTag, data->Value); break;
- default:
- Assume(UNREACHED);
- }
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpWasmMemAccess(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- WAsmJsMemTag tag;
- InitializeWAsmJsMemTag(data->ViewType, &tag);
- switch (op)
- {
- case OpCodeAsmJs::LdArrWasm:
- Output::Print(_u(" %c%d = %s[I%d + %d]"), tag.valueTag, data->Value, tag.heapTag, data->SlotIndex, data->Offset); break;
- case OpCodeAsmJs::StArrWasm:
- Output::Print(_u(" %s[I%d + %d] = %c%d"), tag.heapTag, data->SlotIndex, data->Offset, tag.valueTag, data->Value); break;
- default:
- Assume(UNREACHED);
- }
- }
- void AsmJsByteCodeDumper::DumpStartCall(OpCodeAsmJs op, const unaligned OpLayoutStartCall* data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- Assert(op == OpCodeAsmJs::StartCall || op == OpCodeAsmJs::I_StartCall);
- Output::Print(_u(" ArgSize: %d"), data->ArgCount);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmCall(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- if (data->Return != Constants::NoRegister)
- {
- DumpReg((RegSlot)data->Return);
- Output::Print(_u("="));
- }
- Output::Print(_u(" R%d(ArgCount: %d)"), data->Function, data->ArgCount);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpProfiledAsmCall(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- if (data->Return != Constants::NoRegister)
- {
- DumpReg((RegSlot)data->Return);
- Output::Print(_u("="));
- }
- Output::Print(_u(" R%d(ArgCount: %d, profileId: %d)"), data->Function, data->ArgCount, data->profileId);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmUnsigned1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpU4(data->C1);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpWasmLoopStart(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpU4(data->loopId);
- }
- void AsmJsByteCodeDumper::DumpEmpty(OpCodeAsmJs op, const unaligned OpLayoutEmpty* data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- // empty
- }
- void AsmJsByteCodeDumper::DumpAsmBr(OpCodeAsmJs op, const unaligned OpLayoutAsmBr* data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpOffset(data->RelativeJumpOffset, reader);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- DumpReg(data->R1);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg3(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- DumpReg(data->R1);
- DumpReg(data->R2);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg4(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- DumpReg(data->R1);
- DumpReg(data->R2);
- DumpReg(data->R3);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg5(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- DumpReg(data->R1);
- DumpReg(data->R2);
- DumpReg(data->R3);
- DumpReg(data->R4);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg6(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- DumpReg(data->R1);
- DumpReg(data->R2);
- DumpReg(data->R3);
- DumpReg(data->R4);
- DumpReg(data->R5);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg7(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- DumpReg(data->R1);
- DumpReg(data->R2);
- DumpReg(data->R3);
- DumpReg(data->R4);
- DumpReg(data->R5);
- DumpReg(data->R6);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg9(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- DumpReg(data->R1);
- DumpReg(data->R2);
- DumpReg(data->R3);
- DumpReg(data->R4);
- DumpReg(data->R5);
- DumpReg(data->R6);
- DumpReg(data->R7);
- DumpReg(data->R8);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg10(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- DumpReg(data->R1);
- DumpReg(data->R2);
- DumpReg(data->R3);
- DumpReg(data->R4);
- DumpReg(data->R5);
- DumpReg(data->R6);
- DumpReg(data->R7);
- DumpReg(data->R8);
- DumpReg(data->R9);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg11(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- DumpReg(data->R1);
- DumpReg(data->R2);
- DumpReg(data->R3);
- DumpReg(data->R4);
- DumpReg(data->R5);
- DumpReg(data->R6);
- DumpReg(data->R7);
- DumpReg(data->R8);
- DumpReg(data->R9);
- DumpReg(data->R10);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg17(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- DumpReg(data->R1);
- DumpReg(data->R2);
- DumpReg(data->R3);
- DumpReg(data->R4);
- DumpReg(data->R5);
- DumpReg(data->R6);
- DumpReg(data->R7);
- DumpReg(data->R8);
- DumpReg(data->R9);
- DumpReg(data->R10);
- DumpReg(data->R11);
- DumpReg(data->R12);
- DumpReg(data->R13);
- DumpReg(data->R14);
- DumpReg(data->R15);
- DumpReg(data->R16);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg18(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- DumpReg(data->R1);
- DumpReg(data->R2);
- DumpReg(data->R3);
- DumpReg(data->R4);
- DumpReg(data->R5);
- DumpReg(data->R6);
- DumpReg(data->R7);
- DumpReg(data->R8);
- DumpReg(data->R9);
- DumpReg(data->R10);
- DumpReg(data->R11);
- DumpReg(data->R12);
- DumpReg(data->R13);
- DumpReg(data->R14);
- DumpReg(data->R15);
- DumpReg(data->R16);
- DumpReg(data->R17);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmReg19(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpReg(data->R0);
- DumpReg(data->R1);
- DumpReg(data->R2);
- DumpReg(data->R3);
- DumpReg(data->R4);
- DumpReg(data->R5);
- DumpReg(data->R6);
- DumpReg(data->R7);
- DumpReg(data->R8);
- DumpReg(data->R9);
- DumpReg(data->R10);
- DumpReg(data->R11);
- DumpReg(data->R12);
- DumpReg(data->R13);
- DumpReg(data->R14);
- DumpReg(data->R15);
- DumpReg(data->R16);
- DumpReg(data->R17);
- DumpReg(data->R18);
- }
- #define LAYOUT_TYPE_WMS_REG2(layout, t0, t1) \
- template <class T> void AsmJsByteCodeDumper::Dump##layout(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)\
- {\
- Dump##t0##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t0(), 0));\
- Dump##t1##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t1(), 1));\
- }
- #define LAYOUT_TYPE_WMS_REG3(layout, t0, t1, t2) \
- template <class T> void AsmJsByteCodeDumper::Dump##layout(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)\
- {\
- Dump##t0##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t0(), 0));\
- Dump##t1##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t1(), 1));\
- Dump##t2##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t2(), 2));\
- }
- #define LAYOUT_TYPE_WMS_REG4(layout, t0, t1, t2, t3)\
- template <class T> void AsmJsByteCodeDumper::Dump##layout(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)\
- {\
- Dump##t0##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t0(), 0));\
- Dump##t1##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t1(), 1));\
- Dump##t2##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t2(), 2));\
- Dump##t3##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t3(), 3));\
- };
- #define LAYOUT_TYPE_WMS_REG5(layout, t0, t1, t2, t3, t4)\
- template <class T> void AsmJsByteCodeDumper::Dump##layout(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)\
- {\
- Dump##t0##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t0(), 0));\
- Dump##t1##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t1(), 1));\
- Dump##t2##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t2(), 2));\
- Dump##t3##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t3(), 3));\
- Dump##t4##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t4(), 4));\
- };
- #define LAYOUT_TYPE_WMS_REG6(layout, t0, t1, t2, t3, t4, t5)\
- template <class T> void AsmJsByteCodeDumper::Dump##layout(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)\
- {\
- Dump##t0##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t0(), 0));\
- Dump##t1##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t1(), 1));\
- Dump##t2##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t2(), 2));\
- Dump##t3##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t3(), 3));\
- Dump##t4##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t4(), 4));\
- Dump##t5##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t5(), 5));\
- };
- #define LAYOUT_TYPE_WMS_REG7(layout, t0, t1, t2, t3, t4, t5, t6)\
- template <class T> void AsmJsByteCodeDumper::Dump##layout(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)\
- {\
- Dump##t0##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t0(), 0));\
- Dump##t1##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t1(), 1));\
- Dump##t2##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t2(), 2));\
- Dump##t3##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t3(), 3));\
- Dump##t4##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t4(), 4));\
- Dump##t5##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t5(), 5));\
- Dump##t6##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t6(), 6));\
- };
- #define LAYOUT_TYPE_WMS_REG9(layout, t0, t1, t2, t3, t4, t5, t6, t7, t8)\
- template <class T> void AsmJsByteCodeDumper::Dump##layout(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)\
- {\
- Dump##t0##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t0(), 0));\
- Dump##t1##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t1(), 1));\
- Dump##t2##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t2(), 2));\
- Dump##t3##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t3(), 3));\
- Dump##t4##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t4(), 4));\
- Dump##t5##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t5(), 5));\
- Dump##t6##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t6(), 6));\
- Dump##t7##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t7(), 7));\
- Dump##t8##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t8(), 8));\
- };
- #define LAYOUT_TYPE_WMS_REG10(layout, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9)\
- template <class T> void AsmJsByteCodeDumper::Dump##layout(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)\
- {\
- Dump##t0##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t0(), 0));\
- Dump##t1##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t1(), 1));\
- Dump##t2##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t2(), 2));\
- Dump##t3##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t3(), 3));\
- Dump##t4##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t4(), 4));\
- Dump##t5##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t5(), 5));\
- Dump##t6##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t6(), 6));\
- Dump##t7##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t7(), 7));\
- Dump##t8##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t8(), 8));\
- Dump##t9##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t9(), 9));\
- };
- #define LAYOUT_TYPE_WMS_REG11(layout, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10)\
- template <class T> void AsmJsByteCodeDumper::Dump##layout(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)\
- {\
- Dump##t0##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t0(), 0));\
- Dump##t1##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t1(), 1));\
- Dump##t2##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t2(), 2));\
- Dump##t3##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t3(), 3));\
- Dump##t4##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t4(), 4));\
- Dump##t5##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t5(), 5));\
- Dump##t6##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t6(), 6));\
- Dump##t7##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t7(), 7));\
- Dump##t8##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t8(), 8));\
- Dump##t9##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t9(), 9));\
- Dump##t10##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t10(), 10));\
- };
- #define LAYOUT_TYPE_WMS_REG17(layout, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16)\
- template <class T> void AsmJsByteCodeDumper::Dump##layout(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)\
- {\
- Dump##t0##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t0(), 0));\
- Dump##t1##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t1(), 1));\
- Dump##t2##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t2(), 2));\
- Dump##t3##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t3(), 3));\
- Dump##t4##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t4(), 4));\
- Dump##t5##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t5(), 5));\
- Dump##t6##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t6(), 6));\
- Dump##t7##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t7(), 7));\
- Dump##t8##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t8(), 8));\
- Dump##t9##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t9(), 9));\
- Dump##t10##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t10(), 10));\
- Dump##t11##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t11(), 11));\
- Dump##t12##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t12(), 12));\
- Dump##t13##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t13(), 13));\
- Dump##t14##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t14(), 14));\
- Dump##t15##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t15(), 15));\
- Dump##t16##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t16(), 16));\
- };
- #define LAYOUT_TYPE_WMS_REG18(layout, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17)\
- template <class T> void AsmJsByteCodeDumper::Dump##layout(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)\
- {\
- Dump##t0##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t0(), 0));\
- Dump##t1##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t1(), 1));\
- Dump##t2##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t2(), 2));\
- Dump##t3##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t3(), 3));\
- Dump##t4##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t4(), 4));\
- Dump##t5##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t5(), 5));\
- Dump##t6##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t6(), 6));\
- Dump##t7##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t7(), 7));\
- Dump##t8##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t8(), 8));\
- Dump##t9##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t9(), 9));\
- Dump##t10##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t10(), 10));\
- Dump##t11##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t11(), 11));\
- Dump##t12##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t12(), 12));\
- Dump##t13##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t13(), 13));\
- Dump##t14##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t14(), 14));\
- Dump##t15##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t15(), 15));\
- Dump##t16##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t16(), 16));\
- Dump##t17##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t17(), 17));\
- };
- #define LAYOUT_TYPE_WMS_REG19(layout, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18)\
- template <class T> void AsmJsByteCodeDumper::Dump##layout(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)\
- {\
- Dump##t0##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t0(), 0));\
- Dump##t1##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t1(), 1));\
- Dump##t2##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t2(), 2));\
- Dump##t3##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t3(), 3));\
- Dump##t4##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t4(), 4));\
- Dump##t5##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t5(), 5));\
- Dump##t6##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t6(), 6));\
- Dump##t7##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t7(), 7));\
- Dump##t8##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t8(), 8));\
- Dump##t9##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t9(), 9));\
- Dump##t10##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t10(), 10));\
- Dump##t11##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t11(), 11));\
- Dump##t12##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t12(), 12));\
- Dump##t13##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t13(), 13));\
- Dump##t14##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t14(), 14));\
- Dump##t15##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t15(), 15));\
- Dump##t16##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t16(), 16));\
- Dump##t17##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t17(), 17));\
- Dump##t18##Reg(data->LAYOUT_FIELDS_DEF(LAYOUT_PREFIX_##t18(), 18));\
- };
- #include "LayoutTypesAsmJs.h"
- template <class T>
- void AsmJsByteCodeDumper::DumpBrInt1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpOffset(data->RelativeJumpOffset, reader);
- DumpIntReg(data->I1);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpBrInt2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpOffset(data->RelativeJumpOffset, reader);
- DumpIntReg(data->I1);
- DumpIntReg(data->I2);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpBrInt1Const1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- DumpOffset(data->RelativeJumpOffset, reader);
- DumpIntReg(data->I1);
- DumpI4(data->C1);
- }
- template <class T>
- void AsmJsByteCodeDumper::DumpAsmSimdTypedArr(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
- {
- const char16* heapTag = nullptr;
- switch (data->ViewType)
- {
- case ArrayBufferView::TYPE_INT8:
- case ArrayBufferView::TYPE_INT8_TO_INT64:
- heapTag = _u("HEAP8"); break;
- case ArrayBufferView::TYPE_UINT8:
- case ArrayBufferView::TYPE_UINT8_TO_INT64:
- heapTag = _u("HEAPU8"); break;
- case ArrayBufferView::TYPE_INT16:
- case ArrayBufferView::TYPE_INT16_TO_INT64:
- heapTag = _u("HEAP16"); break;
- case ArrayBufferView::TYPE_UINT16:
- case ArrayBufferView::TYPE_UINT16_TO_INT64:
- heapTag = _u("HEAPU16"); break;
- case ArrayBufferView::TYPE_INT32:
- case ArrayBufferView::TYPE_INT32_TO_INT64:
- heapTag = _u("HEAP32"); break;
- case ArrayBufferView::TYPE_UINT32:
- case ArrayBufferView::TYPE_UINT32_TO_INT64:
- heapTag = _u("HEAPU32"); break;
- case ArrayBufferView::TYPE_FLOAT32:
- heapTag = _u("HEAPF32"); break;
- case ArrayBufferView::TYPE_FLOAT64:
- heapTag = _u("HEAPF64"); break;
- case ArrayBufferView::TYPE_INT64:
- heapTag = _u("HEAPI64"); break;
- default:
- Assert(false);
- __assume(false);
- break;
- }
- #define SIMD_DUMP_ARR_I4 DumpInt32x4Reg
- #define SIMD_DUMP_ARR_I8 DumpInt16x8Reg
- #define SIMD_DUMP_ARR_I16 DumpInt8x16Reg
- #define SIMD_DUMP_ARR_U4 DumpUint32x4Reg
- #define SIMD_DUMP_ARR_U8 DumpUint16x8Reg
- #define SIMD_DUMP_ARR_U16 DumpUint8x16Reg
- #define SIMD_DUMP_ARR_F4 DumpFloat32x4Reg
- #define SIMD_DUMP_ARR_D2 DumpFloat64x2Reg
- #define SIMD_DUMP_REG(type) SIMD_DUMP_ARR_##type(data->Value)
- #define SIMD_DUMP_ARR_VALUE(type) \
- case OpCodeAsmJs::Simd128_LdArr_##type:\
- SIMD_DUMP_REG(type); Output::Print(_u("= %s[I%d] "), heapTag, data->SlotIndex); break;\
- case OpCodeAsmJs::Simd128_LdArrConst_##type:\
- SIMD_DUMP_REG(type); Output::Print(_u("= %s[%d] "), heapTag, data->SlotIndex); break;\
- case OpCodeAsmJs::Simd128_StArr_##type:\
- Output::Print(_u("%s[I%d] = "), heapTag, data->SlotIndex); SIMD_DUMP_REG(type); break;\
- case OpCodeAsmJs::Simd128_StArrConst_##type:\
- Output::Print(_u("%s[%d] = "), heapTag, data->SlotIndex); SIMD_DUMP_REG(type); break;\
- switch (op)
- {
- SIMD_DUMP_ARR_VALUE(I4)
- SIMD_DUMP_ARR_VALUE(I8)
- SIMD_DUMP_ARR_VALUE(I16)
- SIMD_DUMP_ARR_VALUE(U4)
- SIMD_DUMP_ARR_VALUE(U8)
- SIMD_DUMP_ARR_VALUE(U16)
- SIMD_DUMP_ARR_VALUE(F4)
- //SIMD_DUMP_ARR_VALUE(D2)
- default:
- Assert(false);
- __assume(false);
- break;
- }
- // data width
- Output::Print(_u(" %d bytes "), data->DataWidth);
- }
- }
- #endif
- #endif
|