AMDGPU: Mark test as XFAIL in expensive_checks builds
[llvm-project.git] / llvm / lib / Target / ARM / ARMLegalizerInfo.h
blobf7edf0b1612c53bdca5947d8124023faf0426abe
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 //===----------------------------------------------------------------------===//
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"
22 namespace llvm {
24 class ARMSubtarget;
26 class ARMLegalizerInfo : public LegalizerInfo {
27 public:
28 ARMLegalizerInfo(const ARMSubtarget &ST);
30 bool legalizeCustom(LegalizerHelper &Helper, MachineInstr &MI,
31 LostDebugLocObserver &LocObserver) const override;
33 private:
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
60 // bits.
61 FCmpLibcallsList getFCmpLibcalls(CmpInst::Predicate, unsigned Size) const;
63 const ARMSubtarget &ST;
65 } // End llvm namespace.
66 #endif