blob: 09fbc963d9add03bb94d1fa1e32b97e2bd4ae420 [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft Corporation and contributors. All rights reserved.
// Copyright (c) ChakraCore Project 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 ENABLE_WASM
#include "WasmByteCodeWriter.h"
#define WASM_BYTECODE_WRITER
#define AsmJsByteCodeWriter WasmByteCodeWriter
#include "ByteCode/AsmJsByteCodeWriter.cpp"
#undef WASM_BYTECODE_WRITER
#undef AsmJsByteCodeWriter
namespace Js
{
void WasmByteCodeWriter::Create()
{
ByteCodeWriter::Create();
}
void WasmByteCodeWriter::End()
{
ByteCodeWriter::End();
}
void WasmByteCodeWriter::Reset()
{
ByteCodeWriter::Reset();
}
void WasmByteCodeWriter::Begin(FunctionBody* functionWrite, ArenaAllocator* alloc)
{
ByteCodeWriter::Begin(functionWrite, alloc, true, true, false);
}
ByteCodeLabel WasmByteCodeWriter::DefineLabel()
{
return ByteCodeWriter::DefineLabel();
}
void WasmByteCodeWriter::SetCallSiteCount(Js::ProfileId callSiteCount)
{
ByteCodeWriter::SetCallSiteCount(callSiteCount);
}
uint32 WasmByteCodeWriter::WasmLoopStart(ByteCodeLabel loopEntrance, __in_ecount(WAsmJs::LIMIT) RegSlot* curRegs)
{
uint loopId = m_functionWrite->IncrLoopCount();
Assert((uint)m_loopHeaders->Count() == loopId);
m_loopHeaders->Add(LoopHeaderData(m_byteCodeData.GetCurrentOffset(), 0, m_loopNest > 0, false));
m_loopNest++;
this->MarkAsmJsLabel(loopEntrance);
MULTISIZE_LAYOUT_WRITE(WasmLoopStart, Js::OpCodeAsmJs::WasmLoopBodyStart, loopId, curRegs);
return loopId;
}
template <typename SizePolicy>
bool WasmByteCodeWriter::TryWriteWasmLoopStart(OpCodeAsmJs op, uint loopId, __in_ecount(WAsmJs::LIMIT) RegSlot* curRegs)
{
OpLayoutT_WasmLoopStart<SizePolicy> layout;
if (SizePolicy::Assign(layout.loopId, loopId))
{
for (WAsmJs::Types type = WAsmJs::Types(0); type != WAsmJs::LIMIT; type = WAsmJs::Types(type + 1))
{
if (!SizePolicy::Assign(layout.curRegs[type], curRegs[type]))
{
return false;
}
}
m_byteCodeData.EncodeT<SizePolicy::LayoutEnum>(op, &layout, sizeof(layout), this);
return true;
}
return false;
}
}
#endif