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/RuntimeLibcallUtil.h" |
20 | #include "llvm/IR/Instructions.h" |
21 | |
22 | namespace llvm { |
23 | |
24 | class ARMSubtarget; |
25 | |
26 | class ARMLegalizerInfo : public LegalizerInfo { |
27 | public: |
28 | ARMLegalizerInfo(const ARMSubtarget &ST); |
29 | |
30 | bool legalizeCustom(LegalizerHelper &Helper, MachineInstr &MI, |
31 | LostDebugLocObserver &LocObserver) const override; |
32 | |
33 | private: |
34 | void setFCmpLibcallsGNU(); |
35 | void setFCmpLibcallsAEABI(); |
36 | |
37 | struct FCmpLibcallInfo { |
38 | // Which libcall this is. |
39 | RTLIB::Libcall LibcallID; |
40 | |
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; |
48 | }; |
49 | using FCmpLibcallsList = SmallVector<FCmpLibcallInfo, 2>; |
50 | |
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>; |
55 | |
56 | FCmpLibcallsMapTy FCmp32Libcalls; |
57 | FCmpLibcallsMapTy FCmp64Libcalls; |
58 | |
59 | // Get the libcall(s) corresponding to \p Predicate for operands of \p Size |
60 | // bits. |
61 | FCmpLibcallsList getFCmpLibcalls(CmpInst::Predicate, unsigned Size) const; |
62 | }; |
63 | } // End llvm namespace. |
64 | #endif |
65 |