| //===- ARMLegalizerInfo ------------------------------------------*- 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 |
| // |
| //===----------------------------------------------------------------------===// |
| /// \file |
| /// This file declares the targeting of the Machinelegalizer class for ARM. |
| /// \todo This should be generated by TableGen. |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIB_TARGET_ARM_ARMMACHINELEGALIZER_H |
| #define LLVM_LIB_TARGET_ARM_ARMMACHINELEGALIZER_H |
| |
| #include "llvm/ADT/IndexedMap.h" |
| #include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h" |
| #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h" |
| #include "llvm/CodeGen/RuntimeLibcalls.h" |
| #include "llvm/IR/Instructions.h" |
| |
| namespace llvm { |
| |
| class ARMSubtarget; |
| |
| /// This class provides the information for the target register banks. |
| class ARMLegalizerInfo : public LegalizerInfo { |
| public: |
| ARMLegalizerInfo(const ARMSubtarget &ST); |
| |
| bool legalizeCustom(MachineInstr &MI, MachineRegisterInfo &MRI, |
| MachineIRBuilder &MIRBuilder, |
| GISelChangeObserver &Observer) const override; |
| |
| private: |
| void setFCmpLibcallsGNU(); |
| void setFCmpLibcallsAEABI(); |
| |
| struct FCmpLibcallInfo { |
| // Which libcall this is. |
| RTLIB::Libcall LibcallID; |
| |
| // The predicate to be used when comparing the value returned by the |
| // function with a relevant constant (currently hard-coded to zero). This is |
| // necessary because often the libcall will return e.g. a value greater than |
| // 0 to represent 'true' and anything negative to represent 'false', or |
| // maybe 0 to represent 'true' and non-zero for 'false'. If no comparison is |
| // needed, this should be CmpInst::BAD_ICMP_PREDICATE. |
| CmpInst::Predicate Predicate; |
| }; |
| using FCmpLibcallsList = SmallVector<FCmpLibcallInfo, 2>; |
| |
| // Map from each FCmp predicate to the corresponding libcall infos. A FCmp |
| // instruction may be lowered to one or two libcalls, which is why we need a |
| // list. If two libcalls are needed, their results will be OR'ed. |
| using FCmpLibcallsMapTy = IndexedMap<FCmpLibcallsList>; |
| |
| FCmpLibcallsMapTy FCmp32Libcalls; |
| FCmpLibcallsMapTy FCmp64Libcalls; |
| |
| // Get the libcall(s) corresponding to \p Predicate for operands of \p Size |
| // bits. |
| FCmpLibcallsList getFCmpLibcalls(CmpInst::Predicate, unsigned Size) const; |
| }; |
| } // End llvm namespace. |
| #endif |