1 //===- ARMLegalizerInfo ------------------------------------------*- C++ -*-==// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// \file 9 /// This file declares the targeting of the Machinelegalizer class for ARM. 10 /// \todo This should be generated by TableGen. 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_LIB_TARGET_ARM_ARMMACHINELEGALIZER_H 14 #define LLVM_LIB_TARGET_ARM_ARMMACHINELEGALIZER_H 15 16 #include "llvm/ADT/IndexedMap.h" 17 #include "llvm/CodeGen/GlobalISel/GISelChangeObserver.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, 33 GISelChangeObserver &Observer) const override; 34 35 private: 36 void setFCmpLibcallsGNU(); 37 void setFCmpLibcallsAEABI(); 38 39 struct FCmpLibcallInfo { 40 // Which libcall this is. 41 RTLIB::Libcall LibcallID; 42 43 // The predicate to be used when comparing the value returned by the 44 // function with a relevant constant (currently hard-coded to zero). This is 45 // necessary because often the libcall will return e.g. a value greater than 46 // 0 to represent 'true' and anything negative to represent 'false', or 47 // maybe 0 to represent 'true' and non-zero for 'false'. If no comparison is 48 // needed, this should be CmpInst::BAD_ICMP_PREDICATE. 49 CmpInst::Predicate Predicate; 50 }; 51 using FCmpLibcallsList = SmallVector<FCmpLibcallInfo, 2>; 52 53 // Map from each FCmp predicate to the corresponding libcall infos. A FCmp 54 // instruction may be lowered to one or two libcalls, which is why we need a 55 // list. If two libcalls are needed, their results will be OR'ed. 56 using FCmpLibcallsMapTy = IndexedMap<FCmpLibcallsList>; 57 58 FCmpLibcallsMapTy FCmp32Libcalls; 59 FCmpLibcallsMapTy FCmp64Libcalls; 60 61 // Get the libcall(s) corresponding to \p Predicate for operands of \p Size 62 // bits. 63 FCmpLibcallsList getFCmpLibcalls(CmpInst::Predicate, unsigned Size) const; 64 }; 65 } // End llvm namespace. 66 #endif 67