blob: 9d08a75b32d7c613806379c108f3970c59f1337e [file]
//-------------------------------------------------------------------------------------------------------
// 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.
//-------------------------------------------------------------------------------------------------------
#pragma once
namespace Js {
typedef uint8 ArgSlot_OneByte;
typedef uint32 CacheId;
typedef uint8 CacheId_OneByte;
typedef uint16 CacheId_TwoByte;
typedef uint32 RootCacheId;
typedef uint16 PropertyIdIndexType_TwoByte;
typedef uint32 PropertyIdIndexType;
#ifdef BYTECODE_BRANCH_ISLAND
typedef int16 JumpOffset;
typedef int32 LongJumpOffset;
#else
typedef int32 JumpOffset;
#endif
// This is used to estimate when we need to emit long branches
uint const MaxLayoutSize = 76; // Increase this when we see larger layout
uint const MaxOpCodeSize = 2;
enum LayoutSize
{
SmallLayout,
MediumLayout,
LargeLayout,
LayoutCount
};
template <LayoutSize layoutSize>
struct LayoutSizePolicy;
template <>
struct LayoutSizePolicy<LargeLayout>
{
typedef RegSlot RegSlotType;
typedef RegSlot RegSlotSType;
typedef ArgSlot ArgSlotType;
typedef CacheId CacheIdType;
typedef PropertyIdIndexType PropertyIdIndexType;
typedef uint32 UnsignedType;
static const LayoutSize LayoutEnum = LargeLayout;
template <typename T>
static bool Assign(T& dst, T src) { dst = src; return true; }
};
typedef LayoutSizePolicy<LargeLayout> LargeLayoutSizePolicy;
template <>
struct LayoutSizePolicy<SmallLayout>
{
typedef RegSlot_OneByte RegSlotType;
typedef RegSlot_OneSByte RegSlotSType;
typedef ArgSlot_OneByte ArgSlotType;
typedef CacheId_OneByte CacheIdType;
typedef PropertyIdIndexType_TwoByte PropertyIdIndexType;
typedef byte UnsignedType;
static const LayoutSize LayoutEnum = SmallLayout;
template <typename T1, typename T2>
static bool Assign(T1& dst, T2 src)
{
#ifdef BYTECODE_TESTING
if (Configuration::Global.flags.LargeByteCodeLayout
|| Configuration::Global.flags.MediumByteCodeLayout)
{
return false;
}
#endif
dst = (T1)src;
return ((T2)dst == src);
}
};
typedef LayoutSizePolicy<SmallLayout> SmallLayoutSizePolicy;
template <>
struct LayoutSizePolicy<MediumLayout>
{
typedef RegSlot_TwoByte RegSlotType;
typedef RegSlot_TwoSByte RegSlotSType;
typedef ArgSlot_OneByte ArgSlotType;
typedef CacheId_TwoByte CacheIdType;
typedef PropertyIdIndexType_TwoByte PropertyIdIndexType;
typedef uint16 UnsignedType;
static const LayoutSize LayoutEnum = MediumLayout;
template <typename T1, typename T2>
static bool Assign(T1& dst, T2 src)
{
#ifdef BYTECODE_TESTING
if (Configuration::Global.flags.LargeByteCodeLayout)
{
return false;
}
#endif
dst = (T1)src;
return ((T2)dst == src);
}
};
typedef LayoutSizePolicy<MediumLayout> MediumLayoutSizePolicy;
struct OpLayoutEmpty
{
// Although empty structs are one byte, the Empty layout are not written out.
};
} // namespace Js