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