14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_COMPILER_SHARE_GATE_META_DATA_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_COMPILER_SHARE_GATE_META_DATA_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include <string>
204514f5e3Sopenharmony_ci
214514f5e3Sopenharmony_ci#include "ecmascript/compiler/bytecodes.h"
224514f5e3Sopenharmony_ci#include "ecmascript/compiler/share_opcodes.h"
234514f5e3Sopenharmony_ci#include "ecmascript/compiler/type.h"
244514f5e3Sopenharmony_ci#include "ecmascript/elements.h"
254514f5e3Sopenharmony_ci#include "ecmascript/js_thread_hclass_entries.h"
264514f5e3Sopenharmony_ci#include "ecmascript/mem/chunk.h"
274514f5e3Sopenharmony_ci#include "ecmascript/mem/chunk_containers.h"
284514f5e3Sopenharmony_ci#include "ecmascript/mem/region.h"
294514f5e3Sopenharmony_ci#include "ecmascript/pgo_profiler/types/pgo_profiler_type.h"
304514f5e3Sopenharmony_ci#include "libpandabase/macros.h"
314514f5e3Sopenharmony_ci
324514f5e3Sopenharmony_cinamespace panda::ecmascript::kungfu {
334514f5e3Sopenharmony_ciusing ProfileType = pgo::ProfileType;
344514f5e3Sopenharmony_ciusing GateRef = int32_t;
354514f5e3Sopenharmony_ciusing PGOTypeRef = pgo::PGOTypeRef;
364514f5e3Sopenharmony_ciusing PGODefineOpType = pgo::PGODefineOpType;
374514f5e3Sopenharmony_ciusing PGOSampleType = pgo::PGOSampleType;
384514f5e3Sopenharmony_ciusing PGORWOpType = pgo::PGORWOpType;
394514f5e3Sopenharmony_cienum class TypedBinOp : uint8_t;
404514f5e3Sopenharmony_cienum class TypedUnOp : uint8_t;
414514f5e3Sopenharmony_cienum class TypedJumpOp : uint8_t;
424514f5e3Sopenharmony_cienum class TypedLoadOp : uint8_t;
434514f5e3Sopenharmony_cienum class TypedStoreOp : uint8_t;
444514f5e3Sopenharmony_cienum class TypedCallTargetCheckOp : uint8_t;
454514f5e3Sopenharmony_ci
464514f5e3Sopenharmony_cienum GateFlags : uint8_t {
474514f5e3Sopenharmony_ci    NONE_FLAG = 0,
484514f5e3Sopenharmony_ci    NO_WRITE = 1 << 0,
494514f5e3Sopenharmony_ci    HAS_ROOT = 1 << 1,
504514f5e3Sopenharmony_ci    HAS_FRAME_STATE = 1 << 2,
514514f5e3Sopenharmony_ci    CONTROL = NO_WRITE,
524514f5e3Sopenharmony_ci    CONTROL_ROOT = NO_WRITE | HAS_ROOT,
534514f5e3Sopenharmony_ci    CHECKABLE = NO_WRITE | HAS_FRAME_STATE,
544514f5e3Sopenharmony_ci    ROOT = NO_WRITE | HAS_ROOT,
554514f5e3Sopenharmony_ci    FIXED = NO_WRITE,
564514f5e3Sopenharmony_ci};
574514f5e3Sopenharmony_ci
584514f5e3Sopenharmony_ciclass GateMetaData : public ChunkObject {
594514f5e3Sopenharmony_cipublic:
604514f5e3Sopenharmony_ci    enum class Kind : uint8_t {
614514f5e3Sopenharmony_ci        IMMUTABLE = 0,
624514f5e3Sopenharmony_ci        MUTABLE_WITH_SIZE,
634514f5e3Sopenharmony_ci        IMMUTABLE_ONE_PARAMETER,
644514f5e3Sopenharmony_ci        MUTABLE_ONE_PARAMETER,
654514f5e3Sopenharmony_ci        IMMUTABLE_BOOL,
664514f5e3Sopenharmony_ci        MUTABLE_STRING,
674514f5e3Sopenharmony_ci        JSBYTECODE,
684514f5e3Sopenharmony_ci        TYPED_BINARY_OP,
694514f5e3Sopenharmony_ci        TYPED_CALLTARGETCHECK_OP,
704514f5e3Sopenharmony_ci        TYPED_CALL,
714514f5e3Sopenharmony_ci        CALL_NEW,
724514f5e3Sopenharmony_ci    };
734514f5e3Sopenharmony_ci    GateMetaData() = default;
744514f5e3Sopenharmony_ci    GateMetaData(OpCode opcode, GateFlags flags,
754514f5e3Sopenharmony_ci        uint32_t statesIn, uint16_t dependsIn, uint32_t valuesIn)
764514f5e3Sopenharmony_ci        : opcode_(opcode), flags_(flags),
774514f5e3Sopenharmony_ci        statesIn_(statesIn), dependsIn_(dependsIn), valuesIn_(valuesIn) {}
784514f5e3Sopenharmony_ci
794514f5e3Sopenharmony_ci    virtual bool equal(const GateMetaData &other) const
804514f5e3Sopenharmony_ci    {
814514f5e3Sopenharmony_ci        if (opcode_ == other.opcode_ && kind_ == other.kind_ && flags_ == other.flags_ &&
824514f5e3Sopenharmony_ci            statesIn_ == other.statesIn_ && dependsIn_ == other.dependsIn_ && valuesIn_ == other.valuesIn_) {
834514f5e3Sopenharmony_ci            return true;
844514f5e3Sopenharmony_ci        }
854514f5e3Sopenharmony_ci        return false;
864514f5e3Sopenharmony_ci    }
874514f5e3Sopenharmony_ci
884514f5e3Sopenharmony_ci    size_t GetStateCount() const
894514f5e3Sopenharmony_ci    {
904514f5e3Sopenharmony_ci        return statesIn_;
914514f5e3Sopenharmony_ci    }
924514f5e3Sopenharmony_ci
934514f5e3Sopenharmony_ci    size_t GetDependCount() const
944514f5e3Sopenharmony_ci    {
954514f5e3Sopenharmony_ci        return dependsIn_;
964514f5e3Sopenharmony_ci    }
974514f5e3Sopenharmony_ci
984514f5e3Sopenharmony_ci    size_t GetInValueCount() const
994514f5e3Sopenharmony_ci    {
1004514f5e3Sopenharmony_ci        return valuesIn_;
1014514f5e3Sopenharmony_ci    }
1024514f5e3Sopenharmony_ci
1034514f5e3Sopenharmony_ci    size_t GetRootCount() const
1044514f5e3Sopenharmony_ci    {
1054514f5e3Sopenharmony_ci        return HasRoot() ? 1 : 0;
1064514f5e3Sopenharmony_ci    }
1074514f5e3Sopenharmony_ci
1084514f5e3Sopenharmony_ci    size_t GetInFrameStateCount() const
1094514f5e3Sopenharmony_ci    {
1104514f5e3Sopenharmony_ci        return HasFrameState() ? 1 : 0;
1114514f5e3Sopenharmony_ci    }
1124514f5e3Sopenharmony_ci
1134514f5e3Sopenharmony_ci    size_t GetNumIns() const
1144514f5e3Sopenharmony_ci    {
1154514f5e3Sopenharmony_ci        return GetStateCount() + GetDependCount() + GetInValueCount()
1164514f5e3Sopenharmony_ci            + GetInFrameStateCount() + GetRootCount();
1174514f5e3Sopenharmony_ci    }
1184514f5e3Sopenharmony_ci
1194514f5e3Sopenharmony_ci    size_t GetInValueStarts() const
1204514f5e3Sopenharmony_ci    {
1214514f5e3Sopenharmony_ci        return GetStateCount() + GetDependCount();
1224514f5e3Sopenharmony_ci    }
1234514f5e3Sopenharmony_ci
1244514f5e3Sopenharmony_ci    size_t GetInFrameStateStarts() const
1254514f5e3Sopenharmony_ci    {
1264514f5e3Sopenharmony_ci        return GetInValueStarts() + GetInValueCount();
1274514f5e3Sopenharmony_ci    }
1284514f5e3Sopenharmony_ci
1294514f5e3Sopenharmony_ci    OpCode GetOpCode() const
1304514f5e3Sopenharmony_ci    {
1314514f5e3Sopenharmony_ci        return opcode_;
1324514f5e3Sopenharmony_ci    }
1334514f5e3Sopenharmony_ci
1344514f5e3Sopenharmony_ci    Kind GetKind() const
1354514f5e3Sopenharmony_ci    {
1364514f5e3Sopenharmony_ci        return kind_;
1374514f5e3Sopenharmony_ci    }
1384514f5e3Sopenharmony_ci
1394514f5e3Sopenharmony_ci    void AssertKind([[maybe_unused]] Kind kind) const
1404514f5e3Sopenharmony_ci    {
1414514f5e3Sopenharmony_ci        ASSERT(GetKind() == kind);
1424514f5e3Sopenharmony_ci    }
1434514f5e3Sopenharmony_ci
1444514f5e3Sopenharmony_ci    bool IsOneParameterKind() const
1454514f5e3Sopenharmony_ci    {
1464514f5e3Sopenharmony_ci        return GetKind() == Kind::IMMUTABLE_ONE_PARAMETER || GetKind() == Kind::MUTABLE_ONE_PARAMETER ||
1474514f5e3Sopenharmony_ci            GetKind() == Kind::TYPED_BINARY_OP || GetKind() == Kind::TYPED_CALLTARGETCHECK_OP ||
1484514f5e3Sopenharmony_ci            GetKind() == Kind::CALL_NEW;
1494514f5e3Sopenharmony_ci    }
1504514f5e3Sopenharmony_ci
1514514f5e3Sopenharmony_ci    bool IsStringType() const
1524514f5e3Sopenharmony_ci    {
1534514f5e3Sopenharmony_ci        return GetKind() == Kind::MUTABLE_STRING;
1544514f5e3Sopenharmony_ci    }
1554514f5e3Sopenharmony_ci
1564514f5e3Sopenharmony_ci    bool IsRoot() const;
1574514f5e3Sopenharmony_ci    bool IsProlog() const;
1584514f5e3Sopenharmony_ci    bool IsFixed() const;
1594514f5e3Sopenharmony_ci    bool IsSchedulable() const;
1604514f5e3Sopenharmony_ci    bool IsState() const;  // note: IsState(STATE_ENTRY) == false
1614514f5e3Sopenharmony_ci    bool IsGeneralState() const;
1624514f5e3Sopenharmony_ci    bool IsTerminalState() const;
1634514f5e3Sopenharmony_ci    bool IsVirtualState() const;
1644514f5e3Sopenharmony_ci    bool IsCFGMerge() const;
1654514f5e3Sopenharmony_ci    bool IsControlCase() const;
1664514f5e3Sopenharmony_ci    bool IsIfOrSwitchRelated() const;
1674514f5e3Sopenharmony_ci    bool IsLoopHead() const;
1684514f5e3Sopenharmony_ci    bool IsNop() const;
1694514f5e3Sopenharmony_ci    bool IsDead() const;
1704514f5e3Sopenharmony_ci    bool IsConstant() const;
1714514f5e3Sopenharmony_ci    bool IsDependSelector() const;
1724514f5e3Sopenharmony_ci    bool IsTypedOperator() const;
1734514f5e3Sopenharmony_ci    bool IsCheckWithOneIn() const;
1744514f5e3Sopenharmony_ci    bool IsCheckWithTwoIns() const;
1754514f5e3Sopenharmony_ci    bool HasFrameState() const
1764514f5e3Sopenharmony_ci    {
1774514f5e3Sopenharmony_ci        return HasFlag(GateFlags::HAS_FRAME_STATE);
1784514f5e3Sopenharmony_ci    }
1794514f5e3Sopenharmony_ci
1804514f5e3Sopenharmony_ci    bool IsNotWrite() const
1814514f5e3Sopenharmony_ci    {
1824514f5e3Sopenharmony_ci        return HasFlag(GateFlags::NO_WRITE);
1834514f5e3Sopenharmony_ci    }
1844514f5e3Sopenharmony_ci
1854514f5e3Sopenharmony_ci    ~GateMetaData() = default;
1864514f5e3Sopenharmony_ci
1874514f5e3Sopenharmony_ci    static std::string Str(OpCode opcode);
1884514f5e3Sopenharmony_ci    static std::string Str(TypedBinOp op);
1894514f5e3Sopenharmony_ci    static std::string Str(TypedUnOp op);
1904514f5e3Sopenharmony_ci    static std::string Str(TypedJumpOp op);
1914514f5e3Sopenharmony_ci    static std::string Str(TypedLoadOp op);
1924514f5e3Sopenharmony_ci    static std::string Str(TypedStoreOp op);
1934514f5e3Sopenharmony_ci    static std::string Str(TypedCallTargetCheckOp op);
1944514f5e3Sopenharmony_ci    static std::string Str(ValueType type);
1954514f5e3Sopenharmony_ci    std::string Str() const
1964514f5e3Sopenharmony_ci    {
1974514f5e3Sopenharmony_ci        return Str(opcode_);
1984514f5e3Sopenharmony_ci    }
1994514f5e3Sopenharmony_ciprotected:
2004514f5e3Sopenharmony_ci    void SetKind(Kind kind)
2014514f5e3Sopenharmony_ci    {
2024514f5e3Sopenharmony_ci        kind_ = kind;
2034514f5e3Sopenharmony_ci    }
2044514f5e3Sopenharmony_ci
2054514f5e3Sopenharmony_ci    void SetFlags(GateFlags flags)
2064514f5e3Sopenharmony_ci    {
2074514f5e3Sopenharmony_ci        flags_ = flags;
2084514f5e3Sopenharmony_ci    }
2094514f5e3Sopenharmony_ci
2104514f5e3Sopenharmony_ci    void DecreaseIn(size_t idx)
2114514f5e3Sopenharmony_ci    {
2124514f5e3Sopenharmony_ci        ASSERT(GetKind() == Kind::MUTABLE_WITH_SIZE);
2134514f5e3Sopenharmony_ci        if (idx < statesIn_) {
2144514f5e3Sopenharmony_ci            statesIn_--;
2154514f5e3Sopenharmony_ci        } else if (idx < statesIn_ + dependsIn_) {
2164514f5e3Sopenharmony_ci            dependsIn_--;
2174514f5e3Sopenharmony_ci        } else {
2184514f5e3Sopenharmony_ci            valuesIn_--;
2194514f5e3Sopenharmony_ci        }
2204514f5e3Sopenharmony_ci    }
2214514f5e3Sopenharmony_ci
2224514f5e3Sopenharmony_ci    bool HasRoot() const
2234514f5e3Sopenharmony_ci    {
2244514f5e3Sopenharmony_ci        return HasFlag(GateFlags::HAS_ROOT);
2254514f5e3Sopenharmony_ci    }
2264514f5e3Sopenharmony_ci
2274514f5e3Sopenharmony_ci    bool HasFlag(GateFlags flag) const
2284514f5e3Sopenharmony_ci    {
2294514f5e3Sopenharmony_ci        return (GetFlags() & flag) == flag;
2304514f5e3Sopenharmony_ci    }
2314514f5e3Sopenharmony_ci
2324514f5e3Sopenharmony_ci    GateFlags GetFlags() const
2334514f5e3Sopenharmony_ci    {
2344514f5e3Sopenharmony_ci        return flags_;
2354514f5e3Sopenharmony_ci    }
2364514f5e3Sopenharmony_ci
2374514f5e3Sopenharmony_ciprivate:
2384514f5e3Sopenharmony_ci    friend class Gate;
2394514f5e3Sopenharmony_ci    friend class Circuit;
2404514f5e3Sopenharmony_ci    friend class GateMetaBuilder;
2414514f5e3Sopenharmony_ci
2424514f5e3Sopenharmony_ci    OpCode opcode_ { OpCode::NOP };
2434514f5e3Sopenharmony_ci    Kind kind_ { Kind::IMMUTABLE };
2444514f5e3Sopenharmony_ci    GateFlags flags_ { GateFlags::NONE_FLAG };
2454514f5e3Sopenharmony_ci    uint32_t statesIn_ { 0 };
2464514f5e3Sopenharmony_ci    uint32_t dependsIn_ { 0 };
2474514f5e3Sopenharmony_ci    uint32_t valuesIn_ { 0 };
2484514f5e3Sopenharmony_ci};
2494514f5e3Sopenharmony_ci
2504514f5e3Sopenharmony_ciinline std::ostream& operator<<(std::ostream& os, OpCode opcode)
2514514f5e3Sopenharmony_ci{
2524514f5e3Sopenharmony_ci    return os << GateMetaData::Str(opcode);
2534514f5e3Sopenharmony_ci}
2544514f5e3Sopenharmony_ci
2554514f5e3Sopenharmony_ciclass BoolMetaData : public GateMetaData {
2564514f5e3Sopenharmony_cipublic:
2574514f5e3Sopenharmony_ci    BoolMetaData(OpCode opcode, GateFlags flags, uint32_t statesIn,
2584514f5e3Sopenharmony_ci        uint16_t dependsIn, uint32_t valuesIn, bool value)
2594514f5e3Sopenharmony_ci        : GateMetaData(opcode, flags, statesIn, dependsIn, valuesIn), value_(value)
2604514f5e3Sopenharmony_ci    {
2614514f5e3Sopenharmony_ci        SetKind(GateMetaData::Kind::IMMUTABLE_BOOL);
2624514f5e3Sopenharmony_ci    }
2634514f5e3Sopenharmony_ci
2644514f5e3Sopenharmony_ci    bool equal(const GateMetaData &other) const override
2654514f5e3Sopenharmony_ci    {
2664514f5e3Sopenharmony_ci        if (!GateMetaData::equal(other)) {
2674514f5e3Sopenharmony_ci            return false;
2684514f5e3Sopenharmony_ci        }
2694514f5e3Sopenharmony_ci        auto cast_other = static_cast<const BoolMetaData *>(&other);
2704514f5e3Sopenharmony_ci        if (value_ == cast_other->value_) {
2714514f5e3Sopenharmony_ci            return true;
2724514f5e3Sopenharmony_ci        }
2734514f5e3Sopenharmony_ci        return false;
2744514f5e3Sopenharmony_ci    }
2754514f5e3Sopenharmony_ci
2764514f5e3Sopenharmony_ci    static const BoolMetaData* Cast(const GateMetaData* meta)
2774514f5e3Sopenharmony_ci    {
2784514f5e3Sopenharmony_ci        meta->AssertKind(GateMetaData::Kind::IMMUTABLE_BOOL);
2794514f5e3Sopenharmony_ci        return static_cast<const BoolMetaData*>(meta);
2804514f5e3Sopenharmony_ci    }
2814514f5e3Sopenharmony_ci
2824514f5e3Sopenharmony_ci    bool GetBool() const
2834514f5e3Sopenharmony_ci    {
2844514f5e3Sopenharmony_ci        return value_;
2854514f5e3Sopenharmony_ci    }
2864514f5e3Sopenharmony_ci
2874514f5e3Sopenharmony_ci    void SetBool(bool value)
2884514f5e3Sopenharmony_ci    {
2894514f5e3Sopenharmony_ci        value_ = value;
2904514f5e3Sopenharmony_ci    }
2914514f5e3Sopenharmony_ci
2924514f5e3Sopenharmony_ciprivate:
2934514f5e3Sopenharmony_ci    bool value_ { false };
2944514f5e3Sopenharmony_ci};
2954514f5e3Sopenharmony_ci
2964514f5e3Sopenharmony_ciclass OneParameterMetaData : public GateMetaData {
2974514f5e3Sopenharmony_cipublic:
2984514f5e3Sopenharmony_ci    OneParameterMetaData(OpCode opcode, GateFlags flags, uint32_t statesIn,
2994514f5e3Sopenharmony_ci        uint16_t dependsIn, uint32_t valuesIn, uint64_t value)
3004514f5e3Sopenharmony_ci        : GateMetaData(opcode, flags, statesIn, dependsIn, valuesIn), value_(value)
3014514f5e3Sopenharmony_ci    {
3024514f5e3Sopenharmony_ci        SetKind(GateMetaData::Kind::IMMUTABLE_ONE_PARAMETER);
3034514f5e3Sopenharmony_ci    }
3044514f5e3Sopenharmony_ci
3054514f5e3Sopenharmony_ci    bool equal(const GateMetaData &other) const override
3064514f5e3Sopenharmony_ci    {
3074514f5e3Sopenharmony_ci        if (!GateMetaData::equal(other)) {
3084514f5e3Sopenharmony_ci            return false;
3094514f5e3Sopenharmony_ci        }
3104514f5e3Sopenharmony_ci        auto cast_other = static_cast<const OneParameterMetaData *>(&other);
3114514f5e3Sopenharmony_ci        if (value_ == cast_other->value_) {
3124514f5e3Sopenharmony_ci            return true;
3134514f5e3Sopenharmony_ci        }
3144514f5e3Sopenharmony_ci        return false;
3154514f5e3Sopenharmony_ci    }
3164514f5e3Sopenharmony_ci
3174514f5e3Sopenharmony_ci    static const OneParameterMetaData* Cast(const GateMetaData* meta)
3184514f5e3Sopenharmony_ci    {
3194514f5e3Sopenharmony_ci        ASSERT(meta->IsOneParameterKind());
3204514f5e3Sopenharmony_ci        return static_cast<const OneParameterMetaData*>(meta);
3214514f5e3Sopenharmony_ci    }
3224514f5e3Sopenharmony_ci
3234514f5e3Sopenharmony_ci    uint64_t GetValue() const
3244514f5e3Sopenharmony_ci    {
3254514f5e3Sopenharmony_ci        return value_;
3264514f5e3Sopenharmony_ci    }
3274514f5e3Sopenharmony_ci
3284514f5e3Sopenharmony_ci    void SetValue(uint64_t value)
3294514f5e3Sopenharmony_ci    {
3304514f5e3Sopenharmony_ci        value_ = value;
3314514f5e3Sopenharmony_ci    }
3324514f5e3Sopenharmony_ci
3334514f5e3Sopenharmony_ciprivate:
3344514f5e3Sopenharmony_ci    uint64_t value_ { 0 };
3354514f5e3Sopenharmony_ci};
3364514f5e3Sopenharmony_ci
3374514f5e3Sopenharmony_ciclass StringMetaData : public GateMetaData {
3384514f5e3Sopenharmony_cipublic:
3394514f5e3Sopenharmony_ci    StringMetaData(Chunk* chunk, std::string_view str)
3404514f5e3Sopenharmony_ci        : GateMetaData(OpCode::CONSTSTRING, GateFlags::NONE_FLAG, 0, 0, 0),
3414514f5e3Sopenharmony_ci        stringData_(str.size() + 1, chunk)
3424514f5e3Sopenharmony_ci    {
3434514f5e3Sopenharmony_ci        auto srcLength = str.size();
3444514f5e3Sopenharmony_ci        auto destlength = stringData_.size();
3454514f5e3Sopenharmony_ci        auto dest = stringData_.data();
3464514f5e3Sopenharmony_ci        auto src = str.data();
3474514f5e3Sopenharmony_ci        if (destlength <= static_cast<size_t>(srcLength) || strcpy_s(dest, destlength, src) != EOK) {
3484514f5e3Sopenharmony_ci            LOG_COMPILER(FATAL) << "StringMetaData strcpy_s failed";
3494514f5e3Sopenharmony_ci        }
3504514f5e3Sopenharmony_ci        SetKind(GateMetaData::Kind::MUTABLE_STRING);
3514514f5e3Sopenharmony_ci    }
3524514f5e3Sopenharmony_ci    bool equal(const GateMetaData &other) const override
3534514f5e3Sopenharmony_ci    {
3544514f5e3Sopenharmony_ci        if (!GateMetaData::equal(other)) {
3554514f5e3Sopenharmony_ci            return false;
3564514f5e3Sopenharmony_ci        }
3574514f5e3Sopenharmony_ci        auto cast_other = static_cast<const StringMetaData *>(&other);
3584514f5e3Sopenharmony_ci        if (stringData_.size() != cast_other->GetString().size()) {
3594514f5e3Sopenharmony_ci            return false;
3604514f5e3Sopenharmony_ci        }
3614514f5e3Sopenharmony_ci
3624514f5e3Sopenharmony_ci        if (strncmp(stringData_.data(), cast_other->GetString().data(), stringData_.size()) != 0) {
3634514f5e3Sopenharmony_ci            return false;
3644514f5e3Sopenharmony_ci        }
3654514f5e3Sopenharmony_ci
3664514f5e3Sopenharmony_ci        return true;
3674514f5e3Sopenharmony_ci    }
3684514f5e3Sopenharmony_ci
3694514f5e3Sopenharmony_ci    const ChunkVector<char> &GetString() const
3704514f5e3Sopenharmony_ci    {
3714514f5e3Sopenharmony_ci        return stringData_;
3724514f5e3Sopenharmony_ci    }
3734514f5e3Sopenharmony_ci
3744514f5e3Sopenharmony_ciprivate:
3754514f5e3Sopenharmony_ci    ChunkVector<char> stringData_;
3764514f5e3Sopenharmony_ci};
3774514f5e3Sopenharmony_ci
3784514f5e3Sopenharmony_ciclass GateTypeAccessor {
3794514f5e3Sopenharmony_cipublic:
3804514f5e3Sopenharmony_ci    explicit GateTypeAccessor(uint64_t value)
3814514f5e3Sopenharmony_ci        : type_(static_cast<uint32_t>(value)) {}
3824514f5e3Sopenharmony_ci
3834514f5e3Sopenharmony_ci    GateType GetGateType() const
3844514f5e3Sopenharmony_ci    {
3854514f5e3Sopenharmony_ci        return GateType(type_);
3864514f5e3Sopenharmony_ci    }
3874514f5e3Sopenharmony_ci
3884514f5e3Sopenharmony_ci    ParamType GetParamType() const
3894514f5e3Sopenharmony_ci    {
3904514f5e3Sopenharmony_ci        return ParamType(type_);
3914514f5e3Sopenharmony_ci    }
3924514f5e3Sopenharmony_ciprivate:
3934514f5e3Sopenharmony_ci    uint32_t type_;
3944514f5e3Sopenharmony_ci};
3954514f5e3Sopenharmony_ci
3964514f5e3Sopenharmony_ciclass ValuePairTypeAccessor {
3974514f5e3Sopenharmony_cipublic:
3984514f5e3Sopenharmony_ci    // type bits shift
3994514f5e3Sopenharmony_ci    static constexpr int OPRAND_TYPE_BITS = 8;
4004514f5e3Sopenharmony_ci    explicit ValuePairTypeAccessor(uint64_t value) : bitField_(value) {}
4014514f5e3Sopenharmony_ci
4024514f5e3Sopenharmony_ci    ValueType GetSrcType() const
4034514f5e3Sopenharmony_ci    {
4044514f5e3Sopenharmony_ci        return static_cast<ValueType>(LeftBits::Get(bitField_));
4054514f5e3Sopenharmony_ci    }
4064514f5e3Sopenharmony_ci
4074514f5e3Sopenharmony_ci    ValueType GetDstType() const
4084514f5e3Sopenharmony_ci    {
4094514f5e3Sopenharmony_ci        return static_cast<ValueType>(RightBits::Get(bitField_));
4104514f5e3Sopenharmony_ci    }
4114514f5e3Sopenharmony_ci
4124514f5e3Sopenharmony_ci    bool IsConvertSupport() const
4134514f5e3Sopenharmony_ci    {
4144514f5e3Sopenharmony_ci        return ConvertSupportBits::Get(bitField_) == ConvertSupport::ENABLE;
4154514f5e3Sopenharmony_ci    }
4164514f5e3Sopenharmony_ci
4174514f5e3Sopenharmony_ci    static uint64_t ToValue(ValueType srcType, ValueType dstType, ConvertSupport support = ConvertSupport::ENABLE)
4184514f5e3Sopenharmony_ci    {
4194514f5e3Sopenharmony_ci        uint8_t srcVlaue = static_cast<uint8_t>(srcType);
4204514f5e3Sopenharmony_ci        uint8_t dstVlaue = static_cast<uint8_t>(dstType);
4214514f5e3Sopenharmony_ci        return LeftBits::Encode(srcVlaue) | RightBits::Encode(dstVlaue) | ConvertSupportBits::Encode(support);
4224514f5e3Sopenharmony_ci    }
4234514f5e3Sopenharmony_ci
4244514f5e3Sopenharmony_ciprivate:
4254514f5e3Sopenharmony_ci    using LeftBits = panda::BitField<uint8_t, 0, OPRAND_TYPE_BITS>;
4264514f5e3Sopenharmony_ci    using RightBits = LeftBits::NextField<uint8_t, OPRAND_TYPE_BITS>;
4274514f5e3Sopenharmony_ci    using ConvertSupportBits = RightBits::NextField<ConvertSupport, OPRAND_TYPE_BITS>;
4284514f5e3Sopenharmony_ci
4294514f5e3Sopenharmony_ci    uint64_t bitField_;
4304514f5e3Sopenharmony_ci};
4314514f5e3Sopenharmony_ci
4324514f5e3Sopenharmony_ciclass TypeConvertAccessor {
4334514f5e3Sopenharmony_cipublic:
4344514f5e3Sopenharmony_ci    // type bits shift
4354514f5e3Sopenharmony_ci    static constexpr int OPRAND_TYPE_BITS = 32;
4364514f5e3Sopenharmony_ci    explicit TypeConvertAccessor(uint64_t value) : bitField_(value) {}
4374514f5e3Sopenharmony_ci
4384514f5e3Sopenharmony_ci    ParamType GetLeftType() const
4394514f5e3Sopenharmony_ci    {
4404514f5e3Sopenharmony_ci        return ParamType(LeftBits::Get(bitField_));
4414514f5e3Sopenharmony_ci    }
4424514f5e3Sopenharmony_ci
4434514f5e3Sopenharmony_ci    GateType GetRightType() const
4444514f5e3Sopenharmony_ci    {
4454514f5e3Sopenharmony_ci        return GateType(RightBits::Get(bitField_));
4464514f5e3Sopenharmony_ci    }
4474514f5e3Sopenharmony_ci
4484514f5e3Sopenharmony_ci    static uint64_t ToValue(ParamType leftType, GateType rightType)
4494514f5e3Sopenharmony_ci    {
4504514f5e3Sopenharmony_ci        return LeftBits::Encode(leftType.Value()) | RightBits::Encode(rightType.Value());
4514514f5e3Sopenharmony_ci    }
4524514f5e3Sopenharmony_ci
4534514f5e3Sopenharmony_ciprivate:
4544514f5e3Sopenharmony_ci    using LeftBits = panda::BitField<uint32_t, 0, OPRAND_TYPE_BITS>;
4554514f5e3Sopenharmony_ci    using RightBits = LeftBits::NextField<uint32_t, OPRAND_TYPE_BITS>;
4564514f5e3Sopenharmony_ci
4574514f5e3Sopenharmony_ci    uint64_t bitField_;
4584514f5e3Sopenharmony_ci};
4594514f5e3Sopenharmony_ci
4604514f5e3Sopenharmony_ciclass UInt32PairAccessor {
4614514f5e3Sopenharmony_cipublic:
4624514f5e3Sopenharmony_ci    // type bits shift
4634514f5e3Sopenharmony_ci    static constexpr int OPRAND_TYPE_BITS = 32;
4644514f5e3Sopenharmony_ci    explicit UInt32PairAccessor(uint64_t value) : bitField_(value) {}
4654514f5e3Sopenharmony_ci    explicit UInt32PairAccessor(uint32_t first, uint32_t second)
4664514f5e3Sopenharmony_ci    {
4674514f5e3Sopenharmony_ci        bitField_ = FirstBits::Encode(first) | SecondBits::Encode(second);
4684514f5e3Sopenharmony_ci    }
4694514f5e3Sopenharmony_ci
4704514f5e3Sopenharmony_ci    uint32_t GetFirstValue() const
4714514f5e3Sopenharmony_ci    {
4724514f5e3Sopenharmony_ci        return FirstBits::Get(bitField_);
4734514f5e3Sopenharmony_ci    }
4744514f5e3Sopenharmony_ci
4754514f5e3Sopenharmony_ci    uint32_t GetSecondValue() const
4764514f5e3Sopenharmony_ci    {
4774514f5e3Sopenharmony_ci        return SecondBits::Get(bitField_);
4784514f5e3Sopenharmony_ci    }
4794514f5e3Sopenharmony_ci
4804514f5e3Sopenharmony_ci    uint64_t ToValue() const
4814514f5e3Sopenharmony_ci    {
4824514f5e3Sopenharmony_ci        return bitField_;
4834514f5e3Sopenharmony_ci    }
4844514f5e3Sopenharmony_ci
4854514f5e3Sopenharmony_ciprivate:
4864514f5e3Sopenharmony_ci    using FirstBits = panda::BitField<uint32_t, 0, OPRAND_TYPE_BITS>;
4874514f5e3Sopenharmony_ci    using SecondBits = FirstBits::NextField<uint32_t, OPRAND_TYPE_BITS>;
4884514f5e3Sopenharmony_ci
4894514f5e3Sopenharmony_ci    uint64_t bitField_;
4904514f5e3Sopenharmony_ci};
4914514f5e3Sopenharmony_ci
4924514f5e3Sopenharmony_ciclass ArrayMetaDataAccessor {
4934514f5e3Sopenharmony_cipublic:
4944514f5e3Sopenharmony_ci    enum Mode : uint8_t {
4954514f5e3Sopenharmony_ci        CREATE = 0,
4964514f5e3Sopenharmony_ci        LOAD_ELEMENT,
4974514f5e3Sopenharmony_ci        STORE_ELEMENT,
4984514f5e3Sopenharmony_ci        LOAD_LENGTH,
4994514f5e3Sopenharmony_ci        CALL_BUILTIN_METHOD
5004514f5e3Sopenharmony_ci    };
5014514f5e3Sopenharmony_ci
5024514f5e3Sopenharmony_ci    static constexpr int BITS_SIZE = 8;
5034514f5e3Sopenharmony_ci    static constexpr int ARRAY_LENGTH_BITS_SIZE = 32;
5044514f5e3Sopenharmony_ci    explicit ArrayMetaDataAccessor(uint64_t value) : bitField_(value) {}
5054514f5e3Sopenharmony_ci    explicit ArrayMetaDataAccessor(ElementsKind kind, Mode mode,
5064514f5e3Sopenharmony_ci                                   uint32_t length = 0, RegionSpaceFlag flag = RegionSpaceFlag::IN_YOUNG_SPACE)
5074514f5e3Sopenharmony_ci    {
5084514f5e3Sopenharmony_ci        bitField_ = ElementsKindBits::Encode(kind) | ModeBits::Encode(mode) |
5094514f5e3Sopenharmony_ci                    ArrayLengthBits::Encode(length) | RegionSpaceFlagBits::Encode(flag);
5104514f5e3Sopenharmony_ci    }
5114514f5e3Sopenharmony_ci
5124514f5e3Sopenharmony_ci    RegionSpaceFlag GetRegionSpaceFlag() const
5134514f5e3Sopenharmony_ci    {
5144514f5e3Sopenharmony_ci        return RegionSpaceFlagBits::Get(bitField_);
5154514f5e3Sopenharmony_ci    }
5164514f5e3Sopenharmony_ci
5174514f5e3Sopenharmony_ci    ElementsKind GetElementsKind() const
5184514f5e3Sopenharmony_ci    {
5194514f5e3Sopenharmony_ci        return ElementsKindBits::Get(bitField_);
5204514f5e3Sopenharmony_ci    }
5214514f5e3Sopenharmony_ci
5224514f5e3Sopenharmony_ci    Mode GetMode() const
5234514f5e3Sopenharmony_ci    {
5244514f5e3Sopenharmony_ci        return ModeBits::Get(bitField_);
5254514f5e3Sopenharmony_ci    }
5264514f5e3Sopenharmony_ci
5274514f5e3Sopenharmony_ci    void SetElementsKind(ElementsKind kind)
5284514f5e3Sopenharmony_ci    {
5294514f5e3Sopenharmony_ci        bitField_ = ElementsKindBits::Update(bitField_, kind);
5304514f5e3Sopenharmony_ci    }
5314514f5e3Sopenharmony_ci
5324514f5e3Sopenharmony_ci    void SetArrayLength(uint32_t length)
5334514f5e3Sopenharmony_ci    {
5344514f5e3Sopenharmony_ci        bitField_ = ArrayLengthBits::Update(bitField_, length);
5354514f5e3Sopenharmony_ci    }
5364514f5e3Sopenharmony_ci
5374514f5e3Sopenharmony_ci    void SetRegionSpaceFlag(RegionSpaceFlag flag)
5384514f5e3Sopenharmony_ci    {
5394514f5e3Sopenharmony_ci        bitField_ = RegionSpaceFlagBits::Update(bitField_, flag);
5404514f5e3Sopenharmony_ci    }
5414514f5e3Sopenharmony_ci
5424514f5e3Sopenharmony_ci    uint32_t GetArrayLength() const
5434514f5e3Sopenharmony_ci    {
5444514f5e3Sopenharmony_ci        return ArrayLengthBits::Get(bitField_);
5454514f5e3Sopenharmony_ci    }
5464514f5e3Sopenharmony_ci
5474514f5e3Sopenharmony_ci    bool IsLoadElement() const
5484514f5e3Sopenharmony_ci    {
5494514f5e3Sopenharmony_ci        return GetMode() == Mode::LOAD_ELEMENT;
5504514f5e3Sopenharmony_ci    }
5514514f5e3Sopenharmony_ci
5524514f5e3Sopenharmony_ci    bool IsStoreElement() const
5534514f5e3Sopenharmony_ci    {
5544514f5e3Sopenharmony_ci        return GetMode() == Mode::STORE_ELEMENT;
5554514f5e3Sopenharmony_ci    }
5564514f5e3Sopenharmony_ci
5574514f5e3Sopenharmony_ci    uint64_t ToValue() const
5584514f5e3Sopenharmony_ci    {
5594514f5e3Sopenharmony_ci        return bitField_;
5604514f5e3Sopenharmony_ci    }
5614514f5e3Sopenharmony_ci
5624514f5e3Sopenharmony_ciprivate:
5634514f5e3Sopenharmony_ci    using ElementsKindBits = panda::BitField<ElementsKind, 0, BITS_SIZE>;
5644514f5e3Sopenharmony_ci    using ModeBits = ElementsKindBits::NextField<Mode, BITS_SIZE>;
5654514f5e3Sopenharmony_ci    using ArrayLengthBits = ModeBits::NextField<uint32_t, ARRAY_LENGTH_BITS_SIZE>;
5664514f5e3Sopenharmony_ci    using RegionSpaceFlagBits = ArrayLengthBits::NextField<RegionSpaceFlag, BITS_SIZE>;
5674514f5e3Sopenharmony_ci
5684514f5e3Sopenharmony_ci    uint64_t bitField_;
5694514f5e3Sopenharmony_ci};
5704514f5e3Sopenharmony_ci
5714514f5e3Sopenharmony_ciclass CreateArgumentsAccessor {
5724514f5e3Sopenharmony_cipublic:
5734514f5e3Sopenharmony_ci    enum Mode : uint8_t {
5744514f5e3Sopenharmony_ci        REST_ARGUMENTS,
5754514f5e3Sopenharmony_ci        UNMAPPED_ARGUMENTS,
5764514f5e3Sopenharmony_ci        INVALID,
5774514f5e3Sopenharmony_ci    };
5784514f5e3Sopenharmony_ci
5794514f5e3Sopenharmony_ci    static constexpr int BITS_SIZE = 8;
5804514f5e3Sopenharmony_ci    explicit CreateArgumentsAccessor(uint64_t value) : bitField_(value) {}
5814514f5e3Sopenharmony_ci    explicit CreateArgumentsAccessor(ElementsKind kind, Mode mode)
5824514f5e3Sopenharmony_ci    {
5834514f5e3Sopenharmony_ci        bitField_ = ElementsKindBits::Encode(kind) | ModeBits::Encode(mode);
5844514f5e3Sopenharmony_ci    }
5854514f5e3Sopenharmony_ci    Mode GetMode() const
5864514f5e3Sopenharmony_ci    {
5874514f5e3Sopenharmony_ci        return ModeBits::Get(bitField_);
5884514f5e3Sopenharmony_ci    }
5894514f5e3Sopenharmony_ci    uint64_t ToValue() const
5904514f5e3Sopenharmony_ci    {
5914514f5e3Sopenharmony_ci        return bitField_;
5924514f5e3Sopenharmony_ci    }
5934514f5e3Sopenharmony_ciprivate:
5944514f5e3Sopenharmony_ci    using ElementsKindBits = panda::BitField<ElementsKind, 0, BITS_SIZE>;
5954514f5e3Sopenharmony_ci    using ModeBits = ElementsKindBits::NextField<Mode, BITS_SIZE>;
5964514f5e3Sopenharmony_ci
5974514f5e3Sopenharmony_ci    uint64_t bitField_;
5984514f5e3Sopenharmony_ci};
5994514f5e3Sopenharmony_ci
6004514f5e3Sopenharmony_ciclass ObjectTypeAccessor {
6014514f5e3Sopenharmony_cipublic:
6024514f5e3Sopenharmony_ci    static constexpr int IS_HEAP_OBJECT_BIT_SIZE = 1;
6034514f5e3Sopenharmony_ci
6044514f5e3Sopenharmony_ci    explicit ObjectTypeAccessor(uint64_t value) : bitField_(value) {}
6054514f5e3Sopenharmony_ci    explicit ObjectTypeAccessor(bool isHeapObject = false)
6064514f5e3Sopenharmony_ci    {
6074514f5e3Sopenharmony_ci        bitField_ = IsHeapObjectBit::Encode(isHeapObject);
6084514f5e3Sopenharmony_ci    }
6094514f5e3Sopenharmony_ci
6104514f5e3Sopenharmony_ci    bool IsHeapObject() const
6114514f5e3Sopenharmony_ci    {
6124514f5e3Sopenharmony_ci        return IsHeapObjectBit::Get(bitField_);
6134514f5e3Sopenharmony_ci    }
6144514f5e3Sopenharmony_ci
6154514f5e3Sopenharmony_ci    uint64_t ToValue() const
6164514f5e3Sopenharmony_ci    {
6174514f5e3Sopenharmony_ci        return bitField_;
6184514f5e3Sopenharmony_ci    }
6194514f5e3Sopenharmony_ci
6204514f5e3Sopenharmony_ciprivate:
6214514f5e3Sopenharmony_ci    using IsHeapObjectBit = panda::BitField<bool, 0, IS_HEAP_OBJECT_BIT_SIZE>;
6224514f5e3Sopenharmony_ci
6234514f5e3Sopenharmony_ci    uint64_t bitField_;
6244514f5e3Sopenharmony_ci};
6254514f5e3Sopenharmony_ci
6264514f5e3Sopenharmony_ciclass BuiltinPrototypeHClassAccessor {
6274514f5e3Sopenharmony_cipublic:
6284514f5e3Sopenharmony_ci    static constexpr int WORD_BITS_SIZE = 8;
6294514f5e3Sopenharmony_ci    static constexpr int IS_PROTOTYPE_OF_PROTOTYPE_BITS_SIZE = 1;
6304514f5e3Sopenharmony_ci
6314514f5e3Sopenharmony_ci    explicit BuiltinPrototypeHClassAccessor(uint64_t value): type_(value) {}
6324514f5e3Sopenharmony_ci    // Only valid indices accepted
6334514f5e3Sopenharmony_ci    explicit BuiltinPrototypeHClassAccessor(BuiltinTypeId type, ElementsKind kind,
6344514f5e3Sopenharmony_ci                                            bool isPrototypeOfPrototype): type_(0)
6354514f5e3Sopenharmony_ci    {
6364514f5e3Sopenharmony_ci        type_ = BuiltinTypeIdBits::Encode(type) | ElementsKindBits::Encode(kind) |
6374514f5e3Sopenharmony_ci                IsPrototypeOfPrototypeBits::Encode(isPrototypeOfPrototype);
6384514f5e3Sopenharmony_ci        type_ = BuiltinTypeIdBits::Encode(type) | ElementsKindBits::Encode(kind);
6394514f5e3Sopenharmony_ci        ASSERT(BuiltinHClassEntries::GetEntryIndex(type) < BuiltinHClassEntries::N_ENTRIES);
6404514f5e3Sopenharmony_ci    }
6414514f5e3Sopenharmony_ci
6424514f5e3Sopenharmony_ci    ElementsKind GetElementsKind() const
6434514f5e3Sopenharmony_ci    {
6444514f5e3Sopenharmony_ci        return ElementsKindBits::Get(type_);
6454514f5e3Sopenharmony_ci    }
6464514f5e3Sopenharmony_ci
6474514f5e3Sopenharmony_ci    BuiltinTypeId GetBuiltinTypeId() const
6484514f5e3Sopenharmony_ci    {
6494514f5e3Sopenharmony_ci        return BuiltinTypeIdBits::Get(type_);
6504514f5e3Sopenharmony_ci    }
6514514f5e3Sopenharmony_ci
6524514f5e3Sopenharmony_ci    bool IsPrototypeOfPrototype() const
6534514f5e3Sopenharmony_ci    {
6544514f5e3Sopenharmony_ci        return IsPrototypeOfPrototypeBits::Get(type_);
6554514f5e3Sopenharmony_ci    }
6564514f5e3Sopenharmony_ci
6574514f5e3Sopenharmony_ci    uint64_t ToValue() const
6584514f5e3Sopenharmony_ci    {
6594514f5e3Sopenharmony_ci        return type_;
6604514f5e3Sopenharmony_ci    }
6614514f5e3Sopenharmony_ci
6624514f5e3Sopenharmony_ciprivate:
6634514f5e3Sopenharmony_ci    using BuiltinTypeIdBits = panda::BitField<BuiltinTypeId, 0, WORD_BITS_SIZE>;
6644514f5e3Sopenharmony_ci    using ElementsKindBits = BuiltinTypeIdBits::NextField<ElementsKind, WORD_BITS_SIZE>;
6654514f5e3Sopenharmony_ci    using IsPrototypeOfPrototypeBits = ElementsKindBits::NextField<bool, IS_PROTOTYPE_OF_PROTOTYPE_BITS_SIZE>;
6664514f5e3Sopenharmony_ci
6674514f5e3Sopenharmony_ci    uint64_t type_;
6684514f5e3Sopenharmony_ci};
6694514f5e3Sopenharmony_ci
6704514f5e3Sopenharmony_ciclass TypedArrayMetaDataAccessor {
6714514f5e3Sopenharmony_cipublic:
6724514f5e3Sopenharmony_ci    enum Mode : uint8_t {
6734514f5e3Sopenharmony_ci        ACCESS_ELEMENT = 0,
6744514f5e3Sopenharmony_ci        LOAD_LENGTH,
6754514f5e3Sopenharmony_ci    };
6764514f5e3Sopenharmony_ci
6774514f5e3Sopenharmony_ci    static constexpr int TYPE_BITS_SIZE = 32;
6784514f5e3Sopenharmony_ci    static constexpr int MODE_BITS_SIZE = 2;
6794514f5e3Sopenharmony_ci    static constexpr int ON_HEAP_MODE_BITS_SIZE = 2;
6804514f5e3Sopenharmony_ci
6814514f5e3Sopenharmony_ci    explicit TypedArrayMetaDataAccessor(uint64_t value) : bitField_(value) {}
6824514f5e3Sopenharmony_ci
6834514f5e3Sopenharmony_ci    ParamType GetParamType() const
6844514f5e3Sopenharmony_ci    {
6854514f5e3Sopenharmony_ci        return ParamType(TypeBits::Get(bitField_));
6864514f5e3Sopenharmony_ci    }
6874514f5e3Sopenharmony_ci
6884514f5e3Sopenharmony_ci    OnHeapMode GetOnHeapMode() const
6894514f5e3Sopenharmony_ci    {
6904514f5e3Sopenharmony_ci        return OnHeapModeBits::Get(bitField_);
6914514f5e3Sopenharmony_ci    }
6924514f5e3Sopenharmony_ci
6934514f5e3Sopenharmony_ci    bool IsAccessElement() const
6944514f5e3Sopenharmony_ci    {
6954514f5e3Sopenharmony_ci        return ModeBits::Get(bitField_) == Mode::ACCESS_ELEMENT;
6964514f5e3Sopenharmony_ci    }
6974514f5e3Sopenharmony_ci
6984514f5e3Sopenharmony_ci    uint64_t ToValue()
6994514f5e3Sopenharmony_ci    {
7004514f5e3Sopenharmony_ci        return bitField_;
7014514f5e3Sopenharmony_ci    }
7024514f5e3Sopenharmony_ci
7034514f5e3Sopenharmony_ci    static uint64_t ToValue(ParamType paramType, Mode mode, OnHeapMode onHeap)
7044514f5e3Sopenharmony_ci    {
7054514f5e3Sopenharmony_ci        return TypeBits::Encode(paramType.Value()) | ModeBits::Encode(mode) | OnHeapModeBits::Encode(onHeap);
7064514f5e3Sopenharmony_ci    }
7074514f5e3Sopenharmony_ci
7084514f5e3Sopenharmony_ciprivate:
7094514f5e3Sopenharmony_ci    using TypeBits = panda::BitField<uint32_t, 0, TYPE_BITS_SIZE>;
7104514f5e3Sopenharmony_ci    using ModeBits = TypeBits::NextField<Mode, MODE_BITS_SIZE>;
7114514f5e3Sopenharmony_ci    using OnHeapModeBits = ModeBits::NextField<OnHeapMode, ON_HEAP_MODE_BITS_SIZE>;
7124514f5e3Sopenharmony_ci
7134514f5e3Sopenharmony_ci    uint64_t bitField_;
7144514f5e3Sopenharmony_ci};
7154514f5e3Sopenharmony_ci
7164514f5e3Sopenharmony_ciclass LoadElementAccessor {
7174514f5e3Sopenharmony_cipublic:
7184514f5e3Sopenharmony_ci    static constexpr int TYPED_LOAD_OP_BITS_SIZE = 8;
7194514f5e3Sopenharmony_ci    static constexpr int ON_HEAP_MODE_BITS_SIZE = 8;
7204514f5e3Sopenharmony_ci
7214514f5e3Sopenharmony_ci    explicit LoadElementAccessor(uint64_t value): bitField_(value) {}
7224514f5e3Sopenharmony_ci    explicit LoadElementAccessor(TypedLoadOp op, OnHeapMode onHeap)
7234514f5e3Sopenharmony_ci    {
7244514f5e3Sopenharmony_ci        bitField_ = TypedLoadOpBits::Encode(op) | OnHeapModeBits::Encode(onHeap);
7254514f5e3Sopenharmony_ci    }
7264514f5e3Sopenharmony_ci
7274514f5e3Sopenharmony_ci    TypedLoadOp GetTypedLoadOp() const
7284514f5e3Sopenharmony_ci    {
7294514f5e3Sopenharmony_ci        return TypedLoadOpBits::Get(bitField_);
7304514f5e3Sopenharmony_ci    }
7314514f5e3Sopenharmony_ci
7324514f5e3Sopenharmony_ci    OnHeapMode GetOnHeapMode() const
7334514f5e3Sopenharmony_ci    {
7344514f5e3Sopenharmony_ci        return OnHeapModeBits::Get(bitField_);
7354514f5e3Sopenharmony_ci    }
7364514f5e3Sopenharmony_ci
7374514f5e3Sopenharmony_ci    uint64_t ToValue() const
7384514f5e3Sopenharmony_ci    {
7394514f5e3Sopenharmony_ci        return bitField_;
7404514f5e3Sopenharmony_ci    }
7414514f5e3Sopenharmony_ci
7424514f5e3Sopenharmony_ciprivate:
7434514f5e3Sopenharmony_ci    using TypedLoadOpBits = panda::BitField<TypedLoadOp, 0, TYPED_LOAD_OP_BITS_SIZE>;
7444514f5e3Sopenharmony_ci    using OnHeapModeBits = TypedLoadOpBits::NextField<OnHeapMode, ON_HEAP_MODE_BITS_SIZE>;
7454514f5e3Sopenharmony_ci
7464514f5e3Sopenharmony_ci    uint64_t bitField_;
7474514f5e3Sopenharmony_ci};
7484514f5e3Sopenharmony_ci
7494514f5e3Sopenharmony_ciclass StoreElementAccessor {
7504514f5e3Sopenharmony_cipublic:
7514514f5e3Sopenharmony_ci    static constexpr int TYPED_STORE_OP_BITS_SIZE = 8;
7524514f5e3Sopenharmony_ci    static constexpr int ON_HEAP_MODE_BITS_SIZE = 8;
7534514f5e3Sopenharmony_ci
7544514f5e3Sopenharmony_ci    explicit StoreElementAccessor(uint64_t value): bitField_(value) {}
7554514f5e3Sopenharmony_ci    explicit StoreElementAccessor(TypedStoreOp op, OnHeapMode onHeap)
7564514f5e3Sopenharmony_ci    {
7574514f5e3Sopenharmony_ci        bitField_ = TypedStoreOpBits::Encode(op) | OnHeapModeBits::Encode(onHeap);
7584514f5e3Sopenharmony_ci    }
7594514f5e3Sopenharmony_ci
7604514f5e3Sopenharmony_ci    TypedStoreOp GetTypedStoreOp() const
7614514f5e3Sopenharmony_ci    {
7624514f5e3Sopenharmony_ci        return TypedStoreOpBits::Get(bitField_);
7634514f5e3Sopenharmony_ci    }
7644514f5e3Sopenharmony_ci
7654514f5e3Sopenharmony_ci    OnHeapMode GetOnHeapMode() const
7664514f5e3Sopenharmony_ci    {
7674514f5e3Sopenharmony_ci        return OnHeapModeBits::Get(bitField_);
7684514f5e3Sopenharmony_ci    }
7694514f5e3Sopenharmony_ci
7704514f5e3Sopenharmony_ci    uint64_t ToValue() const
7714514f5e3Sopenharmony_ci    {
7724514f5e3Sopenharmony_ci        return bitField_;
7734514f5e3Sopenharmony_ci    }
7744514f5e3Sopenharmony_ci
7754514f5e3Sopenharmony_ciprivate:
7764514f5e3Sopenharmony_ci    using TypedStoreOpBits = panda::BitField<TypedStoreOp, 0, TYPED_STORE_OP_BITS_SIZE>;
7774514f5e3Sopenharmony_ci    using OnHeapModeBits = TypedStoreOpBits::NextField<OnHeapMode, ON_HEAP_MODE_BITS_SIZE>;
7784514f5e3Sopenharmony_ci
7794514f5e3Sopenharmony_ci    uint64_t bitField_;
7804514f5e3Sopenharmony_ci};
7814514f5e3Sopenharmony_ci
7824514f5e3Sopenharmony_ciclass StringStatusAccessor {
7834514f5e3Sopenharmony_cipublic:
7844514f5e3Sopenharmony_ci    explicit StringStatusAccessor(uint64_t value = 0) : type_(value) {}
7854514f5e3Sopenharmony_ci
7864514f5e3Sopenharmony_ci    uint32_t GetStringStatus() const
7874514f5e3Sopenharmony_ci    {
7884514f5e3Sopenharmony_ci        return static_cast<uint32_t>(type_);
7894514f5e3Sopenharmony_ci    }
7904514f5e3Sopenharmony_ci
7914514f5e3Sopenharmony_ci    uint64_t ToValue() const
7924514f5e3Sopenharmony_ci    {
7934514f5e3Sopenharmony_ci        return type_;
7944514f5e3Sopenharmony_ci    }
7954514f5e3Sopenharmony_ci
7964514f5e3Sopenharmony_ciprivate:
7974514f5e3Sopenharmony_ci    uint64_t type_ {0};
7984514f5e3Sopenharmony_ci};
7994514f5e3Sopenharmony_ci} // namespace panda::ecmascript::kungfu
8004514f5e3Sopenharmony_ci
8014514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_COMPILER_SHARE_GATE_META_DATA_H
802