|  | //===- ARMLegalizerInfo ------------------------------------------*- C++ -*-==// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | /// \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/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) 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 |