//==-- AArch64ISelLowering.h - AArch64 DAG Lowering Interface ----*- C++ -*-==// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines the interfaces that AArch64 uses to lower LLVM code into a // selection DAG. // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_AARCH64_AARCH64ISELLOWERING_H #define LLVM_LIB_TARGET_AARCH64_AARCH64ISELLOWERING_H #include "AArch64.h" #include "Utils/AArch64SMEAttributes.h" #include "llvm/CodeGen/CallingConvLower.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/CodeGen/TargetLowering.h" #include "llvm/IR/CallingConv.h" #include "llvm/IR/Instruction.h" namespace llvm { namespace AArch64ISD { // For predicated nodes where the result is a vector, the operation is // controlled by a governing predicate and the inactive lanes are explicitly // defined with a value, please stick the following naming convention: // // _MERGE_OP<n> The result value is a vector with inactive lanes equal // to source operand OP<n>. // // _MERGE_ZERO The result value is a vector with inactive lanes // actively zeroed. // // _MERGE_PASSTHRU The result value is a vector with inactive lanes equal // to the last source operand which only purpose is being // a passthru value. // // For other cases where no explicit action is needed to set the inactive lanes, // or when the result is not a vector and it is needed or helpful to // distinguish a node from similar unpredicated nodes, use: // // _PRED // enum NodeType : unsigned { … }; } // end namespace AArch64ISD namespace AArch64 { /// Possible values of current rounding mode, which is specified in bits /// 23:22 of FPCR. enum Rounding { … }; // Bit position of rounding mode bits in FPCR. const unsigned RoundingBitsPos = …; // Reserved bits should be preserved when modifying FPCR. const uint64_t ReservedFPControlBits = …; // Registers used to pass function arguments. ArrayRef<MCPhysReg> getGPRArgRegs(); ArrayRef<MCPhysReg> getFPRArgRegs(); /// Maximum allowed number of unprobed bytes above SP at an ABI /// boundary. const unsigned StackProbeMaxUnprobedStack = …; /// Maximum number of iterations to unroll for a constant size probing loop. const unsigned StackProbeMaxLoopUnroll = …; } // namespace AArch64 class AArch64Subtarget; class AArch64TargetLowering : public TargetLowering { … }; namespace AArch64 { FastISel *createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo); } // end namespace AArch64 } // end namespace llvm #endif