13af6ab5fSopenharmony_ci/** 23af6ab5fSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License. 53af6ab5fSopenharmony_ci * You may obtain a copy of the License at 63af6ab5fSopenharmony_ci * 73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 83af6ab5fSopenharmony_ci * 93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and 133af6ab5fSopenharmony_ci * limitations under the License. 143af6ab5fSopenharmony_ci */ 153af6ab5fSopenharmony_ci 163af6ab5fSopenharmony_ci#ifndef ES2PANDA_COMPILER_IR_IRNODE_H 173af6ab5fSopenharmony_ci#define ES2PANDA_COMPILER_IR_IRNODE_H 183af6ab5fSopenharmony_ci 193af6ab5fSopenharmony_ci#include <lexer/token/sourceLocation.h> 203af6ab5fSopenharmony_ci#include <macros.h> 213af6ab5fSopenharmony_ci#include <util/ustring.h> 223af6ab5fSopenharmony_ci#include <utils/span.h> 233af6ab5fSopenharmony_ci 243af6ab5fSopenharmony_ci#include <cstdint> 253af6ab5fSopenharmony_ci#include <list> 263af6ab5fSopenharmony_ci#include <sstream> 273af6ab5fSopenharmony_ci#include <utility> 283af6ab5fSopenharmony_ci#include <variant> 293af6ab5fSopenharmony_ci#include <vector> 303af6ab5fSopenharmony_ci 313af6ab5fSopenharmony_cinamespace panda::es2panda::ir { 323af6ab5fSopenharmony_ciclass AstNode; 333af6ab5fSopenharmony_ci} // namespace panda::es2panda::ir 343af6ab5fSopenharmony_ci 353af6ab5fSopenharmony_cinamespace panda::pandasm { 363af6ab5fSopenharmony_cistruct Ins; 373af6ab5fSopenharmony_ci} // namespace panda::pandasm 383af6ab5fSopenharmony_ci 393af6ab5fSopenharmony_cinamespace panda::es2panda::compiler { 403af6ab5fSopenharmony_ci 413af6ab5fSopenharmony_cienum class OperandKind { 423af6ab5fSopenharmony_ci // the least significant bit indicates vreg 433af6ab5fSopenharmony_ci // the second bit indicates src or dst 443af6ab5fSopenharmony_ci SRC_VREG, 453af6ab5fSopenharmony_ci DST_VREG, 463af6ab5fSopenharmony_ci SRC_DST_VREG, 473af6ab5fSopenharmony_ci IMM, 483af6ab5fSopenharmony_ci ID, 493af6ab5fSopenharmony_ci STRING_ID, 503af6ab5fSopenharmony_ci LABEL 513af6ab5fSopenharmony_ci}; 523af6ab5fSopenharmony_ci 533af6ab5fSopenharmony_ciclass FormatItem { 543af6ab5fSopenharmony_cipublic: 553af6ab5fSopenharmony_ci constexpr FormatItem(OperandKind kind, uint32_t bitwidth) : kind_(kind), bitwidth_(bitwidth) {} 563af6ab5fSopenharmony_ci 573af6ab5fSopenharmony_ci OperandKind Kind() const 583af6ab5fSopenharmony_ci { 593af6ab5fSopenharmony_ci return kind_; 603af6ab5fSopenharmony_ci }; 613af6ab5fSopenharmony_ci 623af6ab5fSopenharmony_ci bool constexpr IsVReg() const 633af6ab5fSopenharmony_ci { 643af6ab5fSopenharmony_ci return kind_ == OperandKind::SRC_VREG || kind_ == OperandKind::DST_VREG || kind_ == OperandKind::SRC_DST_VREG; 653af6ab5fSopenharmony_ci } 663af6ab5fSopenharmony_ci 673af6ab5fSopenharmony_ci uint32_t Bitwidth() const 683af6ab5fSopenharmony_ci { 693af6ab5fSopenharmony_ci return bitwidth_; 703af6ab5fSopenharmony_ci }; 713af6ab5fSopenharmony_ci 723af6ab5fSopenharmony_ciprivate: 733af6ab5fSopenharmony_ci OperandKind kind_; 743af6ab5fSopenharmony_ci uint32_t bitwidth_; 753af6ab5fSopenharmony_ci}; 763af6ab5fSopenharmony_ci 773af6ab5fSopenharmony_ciclass Format { 783af6ab5fSopenharmony_cipublic: 793af6ab5fSopenharmony_ci constexpr Format(const FormatItem *item, size_t size) : item_(item), size_(size) {} 803af6ab5fSopenharmony_ci 813af6ab5fSopenharmony_ci panda::Span<const FormatItem> GetFormatItem() const 823af6ab5fSopenharmony_ci { 833af6ab5fSopenharmony_ci return panda::Span<const FormatItem>(item_, size_); 843af6ab5fSopenharmony_ci } 853af6ab5fSopenharmony_ci 863af6ab5fSopenharmony_ciprivate: 873af6ab5fSopenharmony_ci const FormatItem *item_; 883af6ab5fSopenharmony_ci size_t size_; 893af6ab5fSopenharmony_ci}; 903af6ab5fSopenharmony_ci 913af6ab5fSopenharmony_ciusing Formats = panda::Span<const Format>; 923af6ab5fSopenharmony_ciusing VReg = uint16_t; 933af6ab5fSopenharmony_ci 943af6ab5fSopenharmony_ciclass Label; 953af6ab5fSopenharmony_ciclass IRNode; 963af6ab5fSopenharmony_ci 973af6ab5fSopenharmony_ciusing Operand = std::variant<compiler::VReg, double, int64_t, util::StringView, Label *>; 983af6ab5fSopenharmony_ci 993af6ab5fSopenharmony_ci#define FIRST_NODE_OF_FUNCTION (reinterpret_cast<ir::AstNode *>(0x1)) 1003af6ab5fSopenharmony_ci 1013af6ab5fSopenharmony_ciusing ICSlot = uint16_t; 1023af6ab5fSopenharmony_ci 1033af6ab5fSopenharmony_ciusing IcSizeType = uint32_t; 1043af6ab5fSopenharmony_ci 1053af6ab5fSopenharmony_ciclass IRNode { 1063af6ab5fSopenharmony_cipublic: 1073af6ab5fSopenharmony_ci explicit IRNode(const ir::AstNode *node) : node_(node) {}; 1083af6ab5fSopenharmony_ci virtual ~IRNode() = default; 1093af6ab5fSopenharmony_ci 1103af6ab5fSopenharmony_ci NO_COPY_SEMANTIC(IRNode); 1113af6ab5fSopenharmony_ci NO_MOVE_SEMANTIC(IRNode); 1123af6ab5fSopenharmony_ci 1133af6ab5fSopenharmony_ci const ir::AstNode *Node() const 1143af6ab5fSopenharmony_ci { 1153af6ab5fSopenharmony_ci return node_; 1163af6ab5fSopenharmony_ci } 1173af6ab5fSopenharmony_ci 1183af6ab5fSopenharmony_ci static constexpr auto MAX_REG_OPERAND = 5; 1193af6ab5fSopenharmony_ci 1203af6ab5fSopenharmony_ci virtual Formats GetFormats() const = 0; 1213af6ab5fSopenharmony_ci virtual size_t Registers([[maybe_unused]] std::array<VReg *, MAX_REG_OPERAND> *regs) = 0; 1223af6ab5fSopenharmony_ci virtual size_t Registers([[maybe_unused]] std::array<const VReg *, MAX_REG_OPERAND> *regs) const = 0; 1233af6ab5fSopenharmony_ci virtual void Transform(panda::pandasm::Ins *ins) const = 0; 1243af6ab5fSopenharmony_ci virtual ICSlot SetIcSlot(IcSizeType currentSlot) = 0; 1253af6ab5fSopenharmony_ci virtual bool InlineCacheEnabled() = 0; 1263af6ab5fSopenharmony_ci virtual ICSlot GetIcSlot() = 0; 1273af6ab5fSopenharmony_ci virtual bool oneByteSlotOnly() = 0; 1283af6ab5fSopenharmony_ci virtual uint8_t IcSlots() = 0; 1293af6ab5fSopenharmony_ci 1303af6ab5fSopenharmony_ci virtual bool IsRangeInst() const 1313af6ab5fSopenharmony_ci { 1323af6ab5fSopenharmony_ci return false; 1333af6ab5fSopenharmony_ci } 1343af6ab5fSopenharmony_ci 1353af6ab5fSopenharmony_ci virtual int64_t RangeRegsCount() 1363af6ab5fSopenharmony_ci { 1373af6ab5fSopenharmony_ci return 0; 1383af6ab5fSopenharmony_ci } 1393af6ab5fSopenharmony_ci 1403af6ab5fSopenharmony_ciprivate: 1413af6ab5fSopenharmony_ci const ir::AstNode *node_; 1423af6ab5fSopenharmony_ci}; 1433af6ab5fSopenharmony_ci 1443af6ab5fSopenharmony_ci} // namespace panda::es2panda::compiler 1453af6ab5fSopenharmony_ci 1463af6ab5fSopenharmony_ci#endif 147