14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2022 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_ASSEMBLER_AARCH64_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_COMPILER_ASSEMBLER_AARCH64_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include "ecmascript/compiler/assembler/assembler.h"
204514f5e3Sopenharmony_ci#include "ecmascript/compiler/assembler/aarch64/assembler_aarch64_constants.h"
214514f5e3Sopenharmony_ci
224514f5e3Sopenharmony_cinamespace panda::ecmascript::aarch64 {
234514f5e3Sopenharmony_ciclass Register {
244514f5e3Sopenharmony_cipublic:
254514f5e3Sopenharmony_ci    Register(RegisterId reg, RegisterType type = RegisterType::X) : reg_(reg), type_(type) {};
264514f5e3Sopenharmony_ci
274514f5e3Sopenharmony_ci    Register W() const
284514f5e3Sopenharmony_ci    {
294514f5e3Sopenharmony_ci        return Register(reg_, RegisterType::W);
304514f5e3Sopenharmony_ci    }
314514f5e3Sopenharmony_ci
324514f5e3Sopenharmony_ci    Register X() const
334514f5e3Sopenharmony_ci    {
344514f5e3Sopenharmony_ci        return Register(reg_, RegisterType::X);
354514f5e3Sopenharmony_ci    }
364514f5e3Sopenharmony_ci
374514f5e3Sopenharmony_ci    RegisterType GetType() const
384514f5e3Sopenharmony_ci    {
394514f5e3Sopenharmony_ci        return type_;
404514f5e3Sopenharmony_ci    }
414514f5e3Sopenharmony_ci
424514f5e3Sopenharmony_ci    inline bool IsSp() const
434514f5e3Sopenharmony_ci    {
444514f5e3Sopenharmony_ci        return reg_ == RegisterId::SP;
454514f5e3Sopenharmony_ci    }
464514f5e3Sopenharmony_ci
474514f5e3Sopenharmony_ci    inline bool IsW() const
484514f5e3Sopenharmony_ci    {
494514f5e3Sopenharmony_ci        return type_ == RegisterType::W;
504514f5e3Sopenharmony_ci    }
514514f5e3Sopenharmony_ci
524514f5e3Sopenharmony_ci    inline RegisterId GetId() const
534514f5e3Sopenharmony_ci    {
544514f5e3Sopenharmony_ci        return reg_;
554514f5e3Sopenharmony_ci    }
564514f5e3Sopenharmony_ci
574514f5e3Sopenharmony_ci    inline bool IsValid() const
584514f5e3Sopenharmony_ci    {
594514f5e3Sopenharmony_ci        return reg_ != RegisterId::INVALID_REG;
604514f5e3Sopenharmony_ci    }
614514f5e3Sopenharmony_ci
624514f5e3Sopenharmony_ci    inline bool operator !=(const Register &other)
634514f5e3Sopenharmony_ci    {
644514f5e3Sopenharmony_ci        return reg_ != other.GetId() || type_ != other.GetType();
654514f5e3Sopenharmony_ci    }
664514f5e3Sopenharmony_ci
674514f5e3Sopenharmony_ci    inline bool operator ==(const Register &other)
684514f5e3Sopenharmony_ci    {
694514f5e3Sopenharmony_ci        return reg_ == other.GetId() && type_ == other.GetType();
704514f5e3Sopenharmony_ci    }
714514f5e3Sopenharmony_ci
724514f5e3Sopenharmony_ciprivate:
734514f5e3Sopenharmony_ci    RegisterId reg_;
744514f5e3Sopenharmony_ci    RegisterType type_;
754514f5e3Sopenharmony_ci};
764514f5e3Sopenharmony_ci
774514f5e3Sopenharmony_ciclass VectorRegister {
784514f5e3Sopenharmony_cipublic:
794514f5e3Sopenharmony_ci    explicit VectorRegister(VectorRegisterId reg, Scale scale = D) : reg_(reg), scale_(scale) {};
804514f5e3Sopenharmony_ci
814514f5e3Sopenharmony_ci    inline VectorRegisterId GetId() const
824514f5e3Sopenharmony_ci    {
834514f5e3Sopenharmony_ci        return reg_;
844514f5e3Sopenharmony_ci    }
854514f5e3Sopenharmony_ci
864514f5e3Sopenharmony_ci    inline bool IsValid() const
874514f5e3Sopenharmony_ci    {
884514f5e3Sopenharmony_ci        return reg_ != VectorRegisterId::INVALID_VREG;
894514f5e3Sopenharmony_ci    }
904514f5e3Sopenharmony_ci
914514f5e3Sopenharmony_ci    inline Scale GetScale() const
924514f5e3Sopenharmony_ci    {
934514f5e3Sopenharmony_ci        return scale_;
944514f5e3Sopenharmony_ci    }
954514f5e3Sopenharmony_ci
964514f5e3Sopenharmony_ci    inline int GetRegSize() const
974514f5e3Sopenharmony_ci    {
984514f5e3Sopenharmony_ci        if (scale_ == B) {
994514f5e3Sopenharmony_ci            return 8; // 8:Register size
1004514f5e3Sopenharmony_ci        } else if (scale_ == H) {
1014514f5e3Sopenharmony_ci            return 16; // 16:Register size
1024514f5e3Sopenharmony_ci        } else if (scale_ == S) {
1034514f5e3Sopenharmony_ci            return 32; // 32:Register size
1044514f5e3Sopenharmony_ci        } else if (scale_ == D) {
1054514f5e3Sopenharmony_ci            return 64; // 64:Register size
1064514f5e3Sopenharmony_ci        } else if (scale_ == Q) {
1074514f5e3Sopenharmony_ci            return 128; // 128:Register size
1084514f5e3Sopenharmony_ci        }
1094514f5e3Sopenharmony_ci        LOG_ECMA(FATAL) << "this branch is unreachable";
1104514f5e3Sopenharmony_ci        UNREACHABLE();
1114514f5e3Sopenharmony_ci    }
1124514f5e3Sopenharmony_ciprivate:
1134514f5e3Sopenharmony_ci    VectorRegisterId reg_;
1144514f5e3Sopenharmony_ci    Scale scale_;
1154514f5e3Sopenharmony_ci};
1164514f5e3Sopenharmony_ci
1174514f5e3Sopenharmony_ciclass Immediate {
1184514f5e3Sopenharmony_cipublic:
1194514f5e3Sopenharmony_ci    Immediate(int64_t value) : value_(value) {}
1204514f5e3Sopenharmony_ci    ~Immediate() = default;
1214514f5e3Sopenharmony_ci
1224514f5e3Sopenharmony_ci    int64_t Value() const
1234514f5e3Sopenharmony_ci    {
1244514f5e3Sopenharmony_ci        return value_;
1254514f5e3Sopenharmony_ci    }
1264514f5e3Sopenharmony_ciprivate:
1274514f5e3Sopenharmony_ci    int64_t value_;
1284514f5e3Sopenharmony_ci};
1294514f5e3Sopenharmony_ci
1304514f5e3Sopenharmony_ciclass LogicalImmediate {
1314514f5e3Sopenharmony_cipublic:
1324514f5e3Sopenharmony_ci    static LogicalImmediate Create(uint64_t imm, int width);
1334514f5e3Sopenharmony_ci    int Value() const
1344514f5e3Sopenharmony_ci    {
1354514f5e3Sopenharmony_ci        ASSERT(IsValid());
1364514f5e3Sopenharmony_ci        return imm_;
1374514f5e3Sopenharmony_ci    }
1384514f5e3Sopenharmony_ci
1394514f5e3Sopenharmony_ci    bool IsValid() const
1404514f5e3Sopenharmony_ci    {
1414514f5e3Sopenharmony_ci        return imm_ != InvalidLogicalImmediate;
1424514f5e3Sopenharmony_ci    }
1434514f5e3Sopenharmony_ci
1444514f5e3Sopenharmony_ci    bool Is64bit() const
1454514f5e3Sopenharmony_ci    {
1464514f5e3Sopenharmony_ci        return imm_ & BITWISE_OP_N_MASK;
1474514f5e3Sopenharmony_ci    }
1484514f5e3Sopenharmony_ciprivate:
1494514f5e3Sopenharmony_ci    explicit LogicalImmediate(int value)
1504514f5e3Sopenharmony_ci        : imm_(value)
1514514f5e3Sopenharmony_ci    {
1524514f5e3Sopenharmony_ci    }
1534514f5e3Sopenharmony_ci    static const int InvalidLogicalImmediate = -1;
1544514f5e3Sopenharmony_ci    int imm_;
1554514f5e3Sopenharmony_ci};
1564514f5e3Sopenharmony_ci
1574514f5e3Sopenharmony_ciclass Operand {
1584514f5e3Sopenharmony_cipublic:
1594514f5e3Sopenharmony_ci    Operand(Immediate imm)
1604514f5e3Sopenharmony_ci        : reg_(RegisterId::INVALID_REG), extend_(Extend::NO_EXTEND), shift_(Shift::NO_SHIFT),
1614514f5e3Sopenharmony_ci          shiftAmount_(0), immediate_(imm)
1624514f5e3Sopenharmony_ci    {
1634514f5e3Sopenharmony_ci    }
1644514f5e3Sopenharmony_ci    Operand(Register reg, Shift shift = Shift::LSL, uint8_t shift_amount = 0)
1654514f5e3Sopenharmony_ci        : reg_(reg), extend_(Extend::NO_EXTEND), shift_(shift), shiftAmount_(shift_amount), immediate_(0)
1664514f5e3Sopenharmony_ci    {
1674514f5e3Sopenharmony_ci    }
1684514f5e3Sopenharmony_ci    Operand(Register reg, Extend extend, uint8_t shiftAmount = 0)
1694514f5e3Sopenharmony_ci        : reg_(reg), extend_(extend), shift_(Shift::NO_SHIFT), shiftAmount_(shiftAmount), immediate_(0)
1704514f5e3Sopenharmony_ci    {
1714514f5e3Sopenharmony_ci    }
1724514f5e3Sopenharmony_ci    ~Operand() = default;
1734514f5e3Sopenharmony_ci
1744514f5e3Sopenharmony_ci    inline bool IsImmediate() const
1754514f5e3Sopenharmony_ci    {
1764514f5e3Sopenharmony_ci        return !reg_.IsValid();
1774514f5e3Sopenharmony_ci    }
1784514f5e3Sopenharmony_ci
1794514f5e3Sopenharmony_ci    inline bool IsShifted() const
1804514f5e3Sopenharmony_ci    {
1814514f5e3Sopenharmony_ci        return reg_.IsValid() && shift_ != Shift::NO_SHIFT;
1824514f5e3Sopenharmony_ci    }
1834514f5e3Sopenharmony_ci
1844514f5e3Sopenharmony_ci    inline bool IsExtended() const
1854514f5e3Sopenharmony_ci    {
1864514f5e3Sopenharmony_ci        return reg_.IsValid() && extend_ != Extend::NO_EXTEND;
1874514f5e3Sopenharmony_ci    }
1884514f5e3Sopenharmony_ci
1894514f5e3Sopenharmony_ci    inline Register Reg() const
1904514f5e3Sopenharmony_ci    {
1914514f5e3Sopenharmony_ci        return reg_;
1924514f5e3Sopenharmony_ci    }
1934514f5e3Sopenharmony_ci
1944514f5e3Sopenharmony_ci    inline Shift GetShiftOption() const
1954514f5e3Sopenharmony_ci    {
1964514f5e3Sopenharmony_ci        return shift_;
1974514f5e3Sopenharmony_ci    }
1984514f5e3Sopenharmony_ci
1994514f5e3Sopenharmony_ci    inline Extend GetExtendOption() const
2004514f5e3Sopenharmony_ci    {
2014514f5e3Sopenharmony_ci        return extend_;
2024514f5e3Sopenharmony_ci    }
2034514f5e3Sopenharmony_ci
2044514f5e3Sopenharmony_ci    inline uint8_t GetShiftAmount() const
2054514f5e3Sopenharmony_ci    {
2064514f5e3Sopenharmony_ci        return shiftAmount_;
2074514f5e3Sopenharmony_ci    }
2084514f5e3Sopenharmony_ci
2094514f5e3Sopenharmony_ci    inline int64_t ImmediateValue() const
2104514f5e3Sopenharmony_ci    {
2114514f5e3Sopenharmony_ci        return immediate_.Value();
2124514f5e3Sopenharmony_ci    }
2134514f5e3Sopenharmony_ci
2144514f5e3Sopenharmony_ci    inline Immediate GetImmediate() const
2154514f5e3Sopenharmony_ci    {
2164514f5e3Sopenharmony_ci        return immediate_;
2174514f5e3Sopenharmony_ci    }
2184514f5e3Sopenharmony_ciprivate:
2194514f5e3Sopenharmony_ci    Register reg_;
2204514f5e3Sopenharmony_ci    Extend  extend_;
2214514f5e3Sopenharmony_ci    Shift  shift_;
2224514f5e3Sopenharmony_ci    uint8_t  shiftAmount_;
2234514f5e3Sopenharmony_ci    Immediate immediate_;
2244514f5e3Sopenharmony_ci};
2254514f5e3Sopenharmony_ci
2264514f5e3Sopenharmony_ciclass MemoryOperand {
2274514f5e3Sopenharmony_cipublic:
2284514f5e3Sopenharmony_ci    MemoryOperand(Register base, Register offset, Extend extend, uint8_t  shiftAmount = 0)
2294514f5e3Sopenharmony_ci        : base_(base), offsetReg_(offset), offsetImm_(0), addrmod_(AddrMode::OFFSET),
2304514f5e3Sopenharmony_ci          extend_(extend), shift_(Shift::NO_SHIFT), shiftAmount_(shiftAmount)
2314514f5e3Sopenharmony_ci    {
2324514f5e3Sopenharmony_ci    }
2334514f5e3Sopenharmony_ci    MemoryOperand(Register base, Register offset, Shift shift = Shift::NO_SHIFT, uint8_t  shiftAmount = 0)
2344514f5e3Sopenharmony_ci        : base_(base), offsetReg_(offset), offsetImm_(0), addrmod_(AddrMode::OFFSET),
2354514f5e3Sopenharmony_ci          extend_(Extend::NO_EXTEND), shift_(shift), shiftAmount_(shiftAmount)
2364514f5e3Sopenharmony_ci    {
2374514f5e3Sopenharmony_ci    }
2384514f5e3Sopenharmony_ci    MemoryOperand(Register base, int64_t offset, AddrMode addrmod = AddrMode::OFFSET)
2394514f5e3Sopenharmony_ci        : base_(base), offsetReg_(RegisterId::INVALID_REG), offsetImm_(offset), addrmod_(addrmod),
2404514f5e3Sopenharmony_ci          extend_(Extend::NO_EXTEND), shift_(Shift::NO_SHIFT), shiftAmount_(0)
2414514f5e3Sopenharmony_ci    {
2424514f5e3Sopenharmony_ci    }
2434514f5e3Sopenharmony_ci    ~MemoryOperand() = default;
2444514f5e3Sopenharmony_ci
2454514f5e3Sopenharmony_ci    Register GetRegBase() const
2464514f5e3Sopenharmony_ci    {
2474514f5e3Sopenharmony_ci        return base_;
2484514f5e3Sopenharmony_ci    }
2494514f5e3Sopenharmony_ci
2504514f5e3Sopenharmony_ci    bool IsImmediateOffset() const
2514514f5e3Sopenharmony_ci    {
2524514f5e3Sopenharmony_ci        return !offsetReg_.IsValid();
2534514f5e3Sopenharmony_ci    }
2544514f5e3Sopenharmony_ci
2554514f5e3Sopenharmony_ci    Immediate GetImmediate() const
2564514f5e3Sopenharmony_ci    {
2574514f5e3Sopenharmony_ci        return offsetImm_;
2584514f5e3Sopenharmony_ci    }
2594514f5e3Sopenharmony_ci
2604514f5e3Sopenharmony_ci    AddrMode GetAddrMode() const
2614514f5e3Sopenharmony_ci    {
2624514f5e3Sopenharmony_ci        return addrmod_;
2634514f5e3Sopenharmony_ci    }
2644514f5e3Sopenharmony_ci
2654514f5e3Sopenharmony_ci    Extend GetExtendOption() const
2664514f5e3Sopenharmony_ci    {
2674514f5e3Sopenharmony_ci        return extend_;
2684514f5e3Sopenharmony_ci    }
2694514f5e3Sopenharmony_ci
2704514f5e3Sopenharmony_ci    Shift GetShiftOption() const
2714514f5e3Sopenharmony_ci    {
2724514f5e3Sopenharmony_ci        return shift_;
2734514f5e3Sopenharmony_ci    }
2744514f5e3Sopenharmony_ci
2754514f5e3Sopenharmony_ci    uint8_t GetShiftAmount() const
2764514f5e3Sopenharmony_ci    {
2774514f5e3Sopenharmony_ci        return shiftAmount_;
2784514f5e3Sopenharmony_ci    }
2794514f5e3Sopenharmony_ci
2804514f5e3Sopenharmony_ci    Register GetRegisterOffset() const
2814514f5e3Sopenharmony_ci    {
2824514f5e3Sopenharmony_ci        return offsetReg_;
2834514f5e3Sopenharmony_ci    }
2844514f5e3Sopenharmony_ciprivate:
2854514f5e3Sopenharmony_ci    Register base_;
2864514f5e3Sopenharmony_ci    Register offsetReg_;
2874514f5e3Sopenharmony_ci    Immediate offsetImm_;
2884514f5e3Sopenharmony_ci    AddrMode addrmod_;
2894514f5e3Sopenharmony_ci    Extend extend_;
2904514f5e3Sopenharmony_ci    Shift shift_;
2914514f5e3Sopenharmony_ci    uint8_t shiftAmount_;
2924514f5e3Sopenharmony_ci};
2934514f5e3Sopenharmony_ci
2944514f5e3Sopenharmony_ciclass AssemblerAarch64 : public Assembler {
2954514f5e3Sopenharmony_cipublic:
2964514f5e3Sopenharmony_ci    explicit AssemblerAarch64(Chunk *chunk)
2974514f5e3Sopenharmony_ci        : Assembler(chunk)
2984514f5e3Sopenharmony_ci    {
2994514f5e3Sopenharmony_ci    }
3004514f5e3Sopenharmony_ci    void Ldp(const Register &rt, const Register &rt2, const MemoryOperand &operand);
3014514f5e3Sopenharmony_ci    void Stp(const Register &rt, const Register &rt2, const MemoryOperand &operand);
3024514f5e3Sopenharmony_ci    void Ldp(const VectorRegister &vt, const VectorRegister &vt2, const MemoryOperand &operand);
3034514f5e3Sopenharmony_ci    void Stp(const VectorRegister &vt, const VectorRegister &vt2, const MemoryOperand &operand);
3044514f5e3Sopenharmony_ci    void Ldr(const Register &rt, const MemoryOperand &operand);
3054514f5e3Sopenharmony_ci    void Ldrh(const Register &rt, const MemoryOperand &operand);
3064514f5e3Sopenharmony_ci    void Ldrb(const Register &rt, const MemoryOperand &operand);
3074514f5e3Sopenharmony_ci    void Str(const Register &rt, const MemoryOperand &operand);
3084514f5e3Sopenharmony_ci    void Ldur(const Register &rt, const MemoryOperand &operand);
3094514f5e3Sopenharmony_ci    void Stur(const Register &rt, const MemoryOperand &operand);
3104514f5e3Sopenharmony_ci    void Mov(const Register &rd, const Immediate &imm);
3114514f5e3Sopenharmony_ci    void Mov(const Register &rd, const Register &rm);
3124514f5e3Sopenharmony_ci    void Movz(const Register &rd, uint64_t imm, int shift);
3134514f5e3Sopenharmony_ci    void Movk(const Register &rd, uint64_t imm, int shift);
3144514f5e3Sopenharmony_ci    void Movn(const Register &rd, uint64_t imm, int shift);
3154514f5e3Sopenharmony_ci    void Orr(const Register &rd, const Register &rn, const LogicalImmediate &imm);
3164514f5e3Sopenharmony_ci    void Orr(const Register &rd, const Register &rn, const Operand &operand);
3174514f5e3Sopenharmony_ci    void And(const Register &rd, const Register &rn, const Operand &operand);
3184514f5e3Sopenharmony_ci    void Ands(const Register &rd, const Register &rn, const Operand &operand);
3194514f5e3Sopenharmony_ci    void And(const Register &rd, const Register &rn, const LogicalImmediate &imm);
3204514f5e3Sopenharmony_ci    void Ands(const Register &rd, const Register &rn, const LogicalImmediate &imm);
3214514f5e3Sopenharmony_ci    void Lsr(const Register &rd, const Register &rn, unsigned shift);
3224514f5e3Sopenharmony_ci    void Lsl(const Register &rd, const Register &rn, const Register &rm);
3234514f5e3Sopenharmony_ci    void Lsr(const Register &rd, const Register &rn, const Register &rm);
3244514f5e3Sopenharmony_ci    void Ubfm(const Register &rd, const Register &rn, unsigned immr, unsigned imms);
3254514f5e3Sopenharmony_ci    void Bfm(const Register &rd, const Register &rn, unsigned immr, unsigned imms);
3264514f5e3Sopenharmony_ci
3274514f5e3Sopenharmony_ci    void Add(const Register &rd, const Register &rn, const Operand &operand);
3284514f5e3Sopenharmony_ci    void Adds(const Register &rd, const Register &rn, const Operand &operand);
3294514f5e3Sopenharmony_ci    void Sub(const Register &rd, const Register &rn, const Operand &operand);
3304514f5e3Sopenharmony_ci    void Subs(const Register &rd, const Register &rn, const Operand &operand);
3314514f5e3Sopenharmony_ci    void Cmp(const Register &rd, const Operand &operand);
3324514f5e3Sopenharmony_ci    void CMov(const Register &rd, const Register &rn, const Operand &operand, Condition cond);
3334514f5e3Sopenharmony_ci    void B(Label *label);
3344514f5e3Sopenharmony_ci    void B(int32_t imm);
3354514f5e3Sopenharmony_ci    void B(Condition cond, Label *label);
3364514f5e3Sopenharmony_ci    void B(Condition cond, int32_t imm);
3374514f5e3Sopenharmony_ci    void Br(const Register &rn);
3384514f5e3Sopenharmony_ci    void Blr(const Register &rn);
3394514f5e3Sopenharmony_ci    void Bl(Label *label);
3404514f5e3Sopenharmony_ci    void Bl(int32_t imm);
3414514f5e3Sopenharmony_ci    void Cbz(const Register &rt, int32_t imm);
3424514f5e3Sopenharmony_ci    void Cbz(const Register &rt, Label *label);
3434514f5e3Sopenharmony_ci    void Cbnz(const Register &rt, int32_t imm);
3444514f5e3Sopenharmony_ci    void Cbnz(const Register &rt, Label *label);
3454514f5e3Sopenharmony_ci    void Tbz(const Register &rt, int32_t bitPos, Label *label);
3464514f5e3Sopenharmony_ci    void Tbz(const Register &rt, int32_t bitPos, int32_t imm);
3474514f5e3Sopenharmony_ci    void Tbnz(const Register &rt, int32_t bitPos, Label *label);
3484514f5e3Sopenharmony_ci    void Tbnz(const Register &rt, int32_t bitPos, int32_t imm);
3494514f5e3Sopenharmony_ci    void Tst(const Register &rn, const Operand &operand);
3504514f5e3Sopenharmony_ci    void Tst(const Register &rn, const LogicalImmediate &imm);
3514514f5e3Sopenharmony_ci    void Ret();
3524514f5e3Sopenharmony_ci    void Ret(const Register &rn);
3534514f5e3Sopenharmony_ci    void Brk(const Immediate &imm);
3544514f5e3Sopenharmony_ci    void Bind(Label *target);
3554514f5e3Sopenharmony_ciprivate:
3564514f5e3Sopenharmony_ci    // common reg field defines
3574514f5e3Sopenharmony_ci    inline uint32_t Rd(uint32_t id)
3584514f5e3Sopenharmony_ci    {
3594514f5e3Sopenharmony_ci        return (id << COMMON_REG_Rd_LOWBITS) & COMMON_REG_Rd_MASK;
3604514f5e3Sopenharmony_ci    }
3614514f5e3Sopenharmony_ci
3624514f5e3Sopenharmony_ci    inline uint32_t Rn(uint32_t id)
3634514f5e3Sopenharmony_ci    {
3644514f5e3Sopenharmony_ci        return (id << COMMON_REG_Rn_LOWBITS) & COMMON_REG_Rn_MASK;
3654514f5e3Sopenharmony_ci    }
3664514f5e3Sopenharmony_ci
3674514f5e3Sopenharmony_ci    inline uint32_t Rm(uint32_t id)
3684514f5e3Sopenharmony_ci    {
3694514f5e3Sopenharmony_ci        return (id << COMMON_REG_Rm_LOWBITS) & COMMON_REG_Rm_MASK;
3704514f5e3Sopenharmony_ci    }
3714514f5e3Sopenharmony_ci
3724514f5e3Sopenharmony_ci    inline uint32_t Rt(uint32_t id)
3734514f5e3Sopenharmony_ci    {
3744514f5e3Sopenharmony_ci        return (id << COMMON_REG_Rt_LOWBITS) & COMMON_REG_Rt_MASK;
3754514f5e3Sopenharmony_ci    }
3764514f5e3Sopenharmony_ci
3774514f5e3Sopenharmony_ci    inline uint32_t Rt2(uint32_t id)
3784514f5e3Sopenharmony_ci    {
3794514f5e3Sopenharmony_ci        return (id << COMMON_REG_Rt2_LOWBITS) & COMMON_REG_Rt2_MASK;
3804514f5e3Sopenharmony_ci    }
3814514f5e3Sopenharmony_ci
3824514f5e3Sopenharmony_ci    inline uint32_t Sf(uint32_t id)
3834514f5e3Sopenharmony_ci    {
3844514f5e3Sopenharmony_ci        return (id << COMMON_REG_Sf_LOWBITS) & COMMON_REG_Sf_MASK;
3854514f5e3Sopenharmony_ci    }
3864514f5e3Sopenharmony_ci
3874514f5e3Sopenharmony_ci    inline uint32_t LoadAndStorePairImm(uint32_t imm)
3884514f5e3Sopenharmony_ci    {
3894514f5e3Sopenharmony_ci        return (((imm) << LDP_STP_Imm7_LOWBITS) & LDP_STP_Imm7_MASK);
3904514f5e3Sopenharmony_ci    }
3914514f5e3Sopenharmony_ci
3924514f5e3Sopenharmony_ci    inline uint32_t LoadAndStoreImm(uint32_t imm, bool isSigned)
3934514f5e3Sopenharmony_ci    {
3944514f5e3Sopenharmony_ci        if (isSigned) {
3954514f5e3Sopenharmony_ci            return (imm << LDR_STR_Imm9_LOWBITS) & LDR_STR_Imm9_MASK;
3964514f5e3Sopenharmony_ci        } else {
3974514f5e3Sopenharmony_ci            return (imm << LDR_STR_Imm12_LOWBITS) & LDR_STR_Imm12_MASK;
3984514f5e3Sopenharmony_ci        }
3994514f5e3Sopenharmony_ci    }
4004514f5e3Sopenharmony_ci
4014514f5e3Sopenharmony_ci    inline uint32_t BranchImm19(uint32_t imm)
4024514f5e3Sopenharmony_ci    {
4034514f5e3Sopenharmony_ci        return (imm << BRANCH_Imm19_LOWBITS) & BRANCH_Imm19_MASK;
4044514f5e3Sopenharmony_ci    }
4054514f5e3Sopenharmony_ci
4064514f5e3Sopenharmony_ci    uint32_t GetOpcFromScale(Scale scale, bool ispair);
4074514f5e3Sopenharmony_ci    bool IsAddSubImm(uint64_t imm);
4084514f5e3Sopenharmony_ci    void AddSubImm(AddSubOpCode op, const Register &rd, const Register &rn, bool setFlags, uint64_t imm);
4094514f5e3Sopenharmony_ci    void AddSubReg(AddSubOpCode op, const Register &rd, const Register &rn, bool setFlags, const Operand &operand);
4104514f5e3Sopenharmony_ci    void MovWide(uint32_t op, const Register &rd, uint64_t imm, int shift);
4114514f5e3Sopenharmony_ci    void BitWiseOpImm(BitwiseOpCode op, const Register &rd, const Register &rn, uint64_t imm);
4124514f5e3Sopenharmony_ci    void BitWiseOpShift(BitwiseOpCode op, const Register &rd, const Register &rn, const Operand &operand);
4134514f5e3Sopenharmony_ci    bool TrySequenceOfOnes(const Register &rd, uint64_t imm);
4144514f5e3Sopenharmony_ci    bool TryReplicateHWords(const Register &rd, uint64_t imm);
4154514f5e3Sopenharmony_ci    void EmitMovInstruct(const Register &rd, uint64_t imm,
4164514f5e3Sopenharmony_ci                         unsigned int allOneHWords, unsigned int allZeroHWords);
4174514f5e3Sopenharmony_ci    int32_t GetLinkOffsetFromBranchInst(int32_t pos);
4184514f5e3Sopenharmony_ci    int32_t LinkAndGetInstOffsetToLabel(Label *label);
4194514f5e3Sopenharmony_ci    int32_t ImmBranch(uint32_t branchCode);
4204514f5e3Sopenharmony_ci    void SetRealOffsetToBranchInst(uint32_t linkPos, int32_t disp);
4214514f5e3Sopenharmony_ci    void Ldr(const Register &rt, const MemoryOperand &operand, Scale scale);
4224514f5e3Sopenharmony_ci    uint64_t GetImmOfLdr(const MemoryOperand &operand, Scale scale, bool isRegX);
4234514f5e3Sopenharmony_ci    uint64_t GetOpcodeOfLdr(const MemoryOperand &operand, Scale scale);
4244514f5e3Sopenharmony_ci    uint32_t GetShiftOfLdr(const MemoryOperand &operand, Scale scale, bool isRegX);
4254514f5e3Sopenharmony_ci};
4264514f5e3Sopenharmony_ci}  // namespace panda::ecmascript::aarch64
4274514f5e3Sopenharmony_ci#endif
428