1 //===- ARMLegalizerInfo ------------------------------------------*- C++ -*-==//
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
7 //===----------------------------------------------------------------------===//
9 /// This file declares the targeting of the Machinelegalizer class for ARM.
10 /// \todo This should be generated by TableGen.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_TARGET_ARM_ARMMACHINELEGALIZER_H
14 #define LLVM_LIB_TARGET_ARM_ARMMACHINELEGALIZER_H
16 #include "llvm/ADT/IndexedMap.h"
17 #include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
18 #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
19 #include "llvm/CodeGen/RuntimeLibcallUtil.h"
20 #include "llvm/IR/Instructions.h"
26 class ARMLegalizerInfo
: public LegalizerInfo
{
28 ARMLegalizerInfo(const ARMSubtarget
&ST
);
30 bool legalizeCustom(LegalizerHelper
&Helper
, MachineInstr
&MI
,
31 LostDebugLocObserver
&LocObserver
) const override
;
34 void setFCmpLibcallsGNU();
35 void setFCmpLibcallsAEABI();
37 struct FCmpLibcallInfo
{
38 // Which libcall this is.
39 RTLIB::Libcall LibcallID
;
41 // The predicate to be used when comparing the value returned by the
42 // function with a relevant constant (currently hard-coded to zero). This is
43 // necessary because often the libcall will return e.g. a value greater than
44 // 0 to represent 'true' and anything negative to represent 'false', or
45 // maybe 0 to represent 'true' and non-zero for 'false'. If no comparison is
46 // needed, this should be CmpInst::BAD_ICMP_PREDICATE.
47 CmpInst::Predicate Predicate
;
49 using FCmpLibcallsList
= SmallVector
<FCmpLibcallInfo
, 2>;
51 // Map from each FCmp predicate to the corresponding libcall infos. A FCmp
52 // instruction may be lowered to one or two libcalls, which is why we need a
53 // list. If two libcalls are needed, their results will be OR'ed.
54 using FCmpLibcallsMapTy
= IndexedMap
<FCmpLibcallsList
>;
56 FCmpLibcallsMapTy FCmp32Libcalls
;
57 FCmpLibcallsMapTy FCmp64Libcalls
;
59 // Get the libcall(s) corresponding to \p Predicate for operands of \p Size
61 FCmpLibcallsList
getFCmpLibcalls(CmpInst::Predicate
, unsigned Size
) const;
63 const ARMSubtarget
&ST
;
65 } // End llvm namespace.