blob: 0a79932dc92699c28e0314bfaf196ad8129a9797 [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
namespace Js
{
class OpCodeUtil
{
public:
static char16 const * GetOpCodeName(OpCode op);
static bool IsCallOp(OpCode op);
static bool IsProfiledCallOp(OpCode op);
static bool IsProfiledCallOpWithICIndex(OpCode op);
static bool IsProfiledConstructorCall(OpCode op);
static bool IsProfiledReturnTypeCallOp(OpCode op);
// OpCode conversion functions
static void ConvertOpToNonProfiled(OpCode& op);
static void ConvertNonCallOpToProfiled(OpCode& op);
static void ConvertNonCallOpToProfiledWithICIndex(OpCode& op);
static void ConvertNonCallOpToNonProfiled(OpCode& op);
static void ConvertNonCallOpToNonProfiledWithICIndex(OpCode& op);
static OpCode ConvertProfiledCallOpToNonProfiled(OpCode op);
static OpCode ConvertProfiledReturnTypeCallOpToNonProfiled(OpCode op);
static OpCode ConvertCallOpToProfiled(OpCode op, bool withICIndex = false);
static OpCode ConvertCallOpToProfiledReturnType(OpCode op);
static bool IsValidByteCodeOpcode(OpCode op);
static bool IsValidOpcode(OpCode op);
static bool IsPrefixOpcode(OpCode op);
static const bool IsSmallEncodedOpcode(OpCode op)
{
return op <= Js::OpCode::MaxByteSizedOpcodes;
}
static const uint EncodedSize(OpCode op, LayoutSize layoutSize)
{
// Simple case, only 1 byte
// Small OpCode with Medium or Large layout: 1 extra byte for the prefix
// Extended OpCode: Prefix + 2 bytes for the opcode
return IsSmallEncodedOpcode(op) ? layoutSize == SmallLayout ? 1 : 2 : 3;
}
static OpLayoutType GetOpCodeLayout(OpCode op);
private:
#if DBG_DUMP || ENABLE_DEBUG_CONFIG_OPTIONS
static char16 const * const OpCodeNames[(int)Js::OpCode::MaxByteSizedOpcodes + 1];
static char16 const * const ExtendedOpCodeNames[];
static char16 const * const BackendOpCodeNames[];
#endif
static OpLayoutType const OpCodeLayouts[];
static OpLayoutType const ExtendedOpCodeLayouts[];
static OpLayoutType const BackendOpCodeLayouts[];
#if DBG
static OpCode DebugConvertProfiledCallToNonProfiled(OpCode op);
static OpCode DebugConvertProfiledReturnTypeCallToNonProfiled(OpCode op);
#endif
};
};