1 //===- ARMLegalizerInfo ------------------------------------------*- C++ -*-==// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// \file 10 /// This file declares the targeting of the Machinelegalizer class for ARM. 11 /// \todo This should be generated by TableGen. 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_LIB_TARGET_ARM_ARMMACHINELEGALIZER_H 15 #define LLVM_LIB_TARGET_ARM_ARMMACHINELEGALIZER_H 16 17 #include "llvm/ADT/IndexedMap.h" 18 #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h" 19 #include "llvm/CodeGen/RuntimeLibcalls.h" 20 #include "llvm/IR/Instructions.h" 21 22 namespace llvm { 23 24 class ARMSubtarget; 25 26 /// This class provides the information for the target register banks. 27 class ARMLegalizerInfo : public LegalizerInfo { 28 public: 29 ARMLegalizerInfo(const ARMSubtarget &ST); 30 31 bool legalizeCustom(MachineInstr &MI, MachineRegisterInfo &MRI, 32 MachineIRBuilder &MIRBuilder) const override; 33 34 private: 35 void setFCmpLibcallsGNU(); 36 void setFCmpLibcallsAEABI(); 37 38 struct FCmpLibcallInfo { 39 // Which libcall this is. 40 RTLIB::Libcall LibcallID; 41 42 // The predicate to be used when comparing the value returned by the 43 // function with a relevant constant (currently hard-coded to zero). This is 44 // necessary because often the libcall will return e.g. a value greater than 45 // 0 to represent 'true' and anything negative to represent 'false', or 46 // maybe 0 to represent 'true' and non-zero for 'false'. If no comparison is 47 // needed, this should be CmpInst::BAD_ICMP_PREDICATE. 48 CmpInst::Predicate Predicate; 49 }; 50 using FCmpLibcallsList = SmallVector<FCmpLibcallInfo, 2>; 51 52 // Map from each FCmp predicate to the corresponding libcall infos. A FCmp 53 // instruction may be lowered to one or two libcalls, which is why we need a 54 // list. If two libcalls are needed, their results will be OR'ed. 55 using FCmpLibcallsMapTy = IndexedMap<FCmpLibcallsList>; 56 57 FCmpLibcallsMapTy FCmp32Libcalls; 58 FCmpLibcallsMapTy FCmp64Libcalls; 59 60 // Get the libcall(s) corresponding to \p Predicate for operands of \p Size 61 // bits. 62 FCmpLibcallsList getFCmpLibcalls(CmpInst::Predicate, unsigned Size) const; 63 }; 64 } // End llvm namespace. 65 #endif 66