14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 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_ASSEMBLER_AARCH64_MACRO_ASSEMBLER_AARCH64_H 174514f5e3Sopenharmony_ci#define ECMASCRIPT_COMPILER_ASSEMBLER_AARCH64_MACRO_ASSEMBLER_AARCH64_H 184514f5e3Sopenharmony_ci 194514f5e3Sopenharmony_ci#include "ecmascript/compiler/assembler/macro_assembler.h" 204514f5e3Sopenharmony_ci#include "ecmascript/compiler/assembler/aarch64/assembler_aarch64.h" 214514f5e3Sopenharmony_ci 224514f5e3Sopenharmony_cinamespace panda::ecmascript::kungfu { 234514f5e3Sopenharmony_ciclass MacroAssemblerAArch64 : public MacroAssembler { 244514f5e3Sopenharmony_cipublic: 254514f5e3Sopenharmony_ci MacroAssemblerAArch64() : MacroAssembler(), assembler(&chunk) {} 264514f5e3Sopenharmony_ci ~MacroAssemblerAArch64() = default; 274514f5e3Sopenharmony_ci uint8_t *GetBegin() const override 284514f5e3Sopenharmony_ci { 294514f5e3Sopenharmony_ci return assembler.GetBegin(); 304514f5e3Sopenharmony_ci } 314514f5e3Sopenharmony_ci 324514f5e3Sopenharmony_ci size_t GetBufferCurrentSize() const override 334514f5e3Sopenharmony_ci { 344514f5e3Sopenharmony_ci return assembler.GetCurrentPosition(); 354514f5e3Sopenharmony_ci } 364514f5e3Sopenharmony_ci 374514f5e3Sopenharmony_ci void SetBaselineFlag() 384514f5e3Sopenharmony_ci { 394514f5e3Sopenharmony_ci assembler.SetDoCodeSign(); 404514f5e3Sopenharmony_ci } 414514f5e3Sopenharmony_ci 424514f5e3Sopenharmony_ci void Move(const StackSlotOperand &dstStackSlot, Immediate value) override; 434514f5e3Sopenharmony_ci void Move(const StackSlotOperand &dstStackSlot, const StackSlotOperand &srcStackSlot) override; 444514f5e3Sopenharmony_ci void Cmp(const StackSlotOperand &stackSlot, Immediate value) override; 454514f5e3Sopenharmony_ci void Bind(JumpLabel &label) override; 464514f5e3Sopenharmony_ci void Jz(JumpLabel &label) override; 474514f5e3Sopenharmony_ci void Jnz(JumpLabel &label) override; 484514f5e3Sopenharmony_ci void Jump(JumpLabel &label) override; 494514f5e3Sopenharmony_ci void SaveReturnRegister(const StackSlotOperand &dstStackSlot) override; 504514f5e3Sopenharmony_ci void CallBuiltin(Address funcAddress, 514514f5e3Sopenharmony_ci const std::vector<MacroParameter> ¶meters) override; 524514f5e3Sopenharmony_ci 534514f5e3Sopenharmony_ciprivate: 544514f5e3Sopenharmony_ci aarch64::AssemblerAarch64 assembler; 554514f5e3Sopenharmony_ci const uint32_t PARAM_REGISTER_COUNT = 8; 564514f5e3Sopenharmony_ci const std::vector<aarch64::Register> registerParamVec { 574514f5e3Sopenharmony_ci aarch64::Register(aarch64::X0), aarch64::Register(aarch64::X1), aarch64::Register(aarch64::X2), 584514f5e3Sopenharmony_ci aarch64::Register(aarch64::X3), aarch64::Register(aarch64::X4), aarch64::Register(aarch64::X5), 594514f5e3Sopenharmony_ci aarch64::Register(aarch64::X6), aarch64::Register(aarch64::X7) }; 604514f5e3Sopenharmony_ci const aarch64::Register GLUE_REGISTER = aarch64::Register(aarch64::X19); // same with ghc callconv 614514f5e3Sopenharmony_ci const aarch64::Register LOCAL_SCOPE_REGISTER = aarch64::Register(aarch64::X11); 624514f5e3Sopenharmony_ci const aarch64::Register RETURN_REGISTER = aarch64::Register(aarch64::X0); 634514f5e3Sopenharmony_ci void MovParameterIntoParamReg(MacroParameter param, aarch64::Register paramReg); 644514f5e3Sopenharmony_ci void PickLoadStoreInsn(aarch64::Register reg, aarch64::MemoryOperand memOpnd, bool isLoad = true); 654514f5e3Sopenharmony_ci bool IsMoveWidableImmediate(uint64_t val, uint32_t bitLen); 664514f5e3Sopenharmony_ci bool IsBitmaskImmediate(uint64_t val, uint32_t bitLen); 674514f5e3Sopenharmony_ci bool BetterUseMOVZ(uint64_t val); 684514f5e3Sopenharmony_ci bool IsSingleInstructionMovable(uint64_t imm, uint32_t size); 694514f5e3Sopenharmony_ci void CopyImm(aarch64::Register destReg, int64_t imm, uint32_t size); 704514f5e3Sopenharmony_ci void CopyImmSize64(aarch64::Register destReg, uint64_t srcVal); 714514f5e3Sopenharmony_ci}; 724514f5e3Sopenharmony_ci} // namespace panda::ecmascript::kungfu 734514f5e3Sopenharmony_ci#endif // ECMASCRIPT_COMPILER_ASSEMBLER_AARCH64_MACRO_ASSEMBLER_AARCH64_H 74