blob: 4b6a971a4fd84461ea6792971cba640faa1c5cfd [file] [log] [blame]
Tom Stellardca166212017-01-30 21:56:46 +00001//===- AMDGPULegalizerInfo ---------------------------------------*- C++ -*-==//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Tom Stellardca166212017-01-30 21:56:46 +00006//
7//===----------------------------------------------------------------------===//
8/// \file
9/// This file declares the targeting of the Machinelegalizer class for
10/// AMDGPU.
11/// \todo This should be generated by TableGen.
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINELEGALIZER_H
15#define LLVM_LIB_TARGET_AMDGPU_AMDGPUMACHINELEGALIZER_H
16
17#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
Matt Arsenaulte2c86cc2019-07-01 18:45:36 +000018#include "AMDGPUArgumentUsageInfo.h"
Matt Arsenault77ac4002019-10-01 01:06:43 +000019#include "SIInstrInfo.h"
Tom Stellardca166212017-01-30 21:56:46 +000020
21namespace llvm {
22
Matt Arsenaultc3fe46b2018-03-08 16:24:16 +000023class GCNTargetMachine;
Tom Stellardca166212017-01-30 21:56:46 +000024class LLVMContext;
Tom Stellard5bfbae52018-07-11 20:59:01 +000025class GCNSubtarget;
Tom Stellardca166212017-01-30 21:56:46 +000026
27/// This class provides the information for the target register banks.
28class AMDGPULegalizerInfo : public LegalizerInfo {
Matt Arsenault9e8e8c62019-07-01 18:49:01 +000029 const GCNSubtarget &ST;
30
Tom Stellardca166212017-01-30 21:56:46 +000031public:
Tom Stellard5bfbae52018-07-11 20:59:01 +000032 AMDGPULegalizerInfo(const GCNSubtarget &ST,
Matt Arsenaultc3fe46b2018-03-08 16:24:16 +000033 const GCNTargetMachine &TM);
Matt Arsenaulta8b43392019-02-08 02:40:47 +000034
35 bool legalizeCustom(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000036 MachineIRBuilder &B,
Matt Arsenaulta8b43392019-02-08 02:40:47 +000037 GISelChangeObserver &Observer) const override;
38
Matt Arsenault1178dc32019-06-28 01:16:46 +000039 Register getSegmentAperture(unsigned AddrSpace,
Matt Arsenaulta8b43392019-02-08 02:40:47 +000040 MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000041 MachineIRBuilder &B) const;
Matt Arsenaulta8b43392019-02-08 02:40:47 +000042
43 bool legalizeAddrSpaceCast(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000044 MachineIRBuilder &B) const;
Matt Arsenault6aafc5e2019-05-17 12:19:57 +000045 bool legalizeFrint(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000046 MachineIRBuilder &B) const;
Matt Arsenaulta510b572019-05-17 12:20:05 +000047 bool legalizeFceil(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000048 MachineIRBuilder &B) const;
Matt Arsenault6aebcd52019-05-17 12:20:01 +000049 bool legalizeIntrinsicTrunc(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000050 MachineIRBuilder &B) const;
Matt Arsenault2f292202019-05-17 23:05:18 +000051 bool legalizeITOFP(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000052 MachineIRBuilder &B, bool Signed) const;
Matt Arsenault6ce1b4f2019-07-10 16:31:19 +000053 bool legalizeMinNumMaxNum(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000054 MachineIRBuilder &B) const;
Matt Arsenaultb0e04c02019-07-15 19:40:59 +000055 bool legalizeExtractVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000056 MachineIRBuilder &B) const;
Matt Arsenault6ed315f2019-07-15 19:43:04 +000057 bool legalizeInsertVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000058 MachineIRBuilder &B) const;
Matt Arsenaultcbd17822019-08-29 20:06:48 +000059 bool legalizeSinCos(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000060 MachineIRBuilder &B) const;
Matt Arsenaulte15770a2019-07-01 18:40:23 +000061
Matt Arsenault77ac4002019-10-01 01:06:43 +000062 bool buildPCRelGlobalAddress(
63 Register DstReg, LLT PtrTy, MachineIRBuilder &B, const GlobalValue *GV,
64 unsigned Offset, unsigned GAFlags = SIInstrInfo::MO_NONE) const;
65
Matt Arsenault64ecca92019-09-09 17:13:44 +000066 bool legalizeGlobalValue(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000067 MachineIRBuilder &B) const;
Matt Arsenaultad6a8b832019-09-10 16:42:31 +000068 bool legalizeLoad(MachineInstr &MI, MachineRegisterInfo &MRI,
69 MachineIRBuilder &B,
70 GISelChangeObserver &Observer) const;
Matt Arsenault64ecca92019-09-09 17:13:44 +000071
Matt Arsenault4d339182019-09-13 00:44:35 +000072 bool legalizeFMad(MachineInstr &MI, MachineRegisterInfo &MRI,
73 MachineIRBuilder &B) const;
74
Matt Arsenault171cf532019-10-08 10:04:41 -070075 bool legalizeAtomicCmpXChg(MachineInstr &MI, MachineRegisterInfo &MRI,
76 MachineIRBuilder &B) const;
77
Matt Arsenaulte2c86cc2019-07-01 18:45:36 +000078 Register getLiveInRegister(MachineRegisterInfo &MRI,
79 Register Reg, LLT Ty) const;
80
81 bool loadInputValue(Register DstReg, MachineIRBuilder &B,
82 const ArgDescriptor *Arg) const;
83 bool legalizePreloadedArgIntrin(
84 MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
85 AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
86
Austin Kerbow97263fa2019-10-21 22:18:26 +000087 bool legalizeFDIV(MachineInstr &MI, MachineRegisterInfo &MRI,
88 MachineIRBuilder &B) const;
Austin Kerbowc35b3582019-10-22 17:39:26 -070089 bool legalizeFDIV16(MachineInstr &MI, MachineRegisterInfo &MRI,
90 MachineIRBuilder &B) const;
Austin Kerbow2b88b342019-10-29 09:55:49 -070091 bool legalizeFDIV32(MachineInstr &MI, MachineRegisterInfo &MRI,
92 MachineIRBuilder &B) const;
Austin Kerbow97263fa2019-10-21 22:18:26 +000093 bool legalizeFastUnsafeFDIV(MachineInstr &MI, MachineRegisterInfo &MRI,
94 MachineIRBuilder &B) const;
95 bool legalizeFDIVFastIntrin(MachineInstr &MI, MachineRegisterInfo &MRI,
96 MachineIRBuilder &B) const;
Austin Kerbowc99f62e2019-07-30 18:49:16 +000097
Matt Arsenault9e8e8c62019-07-01 18:49:01 +000098 bool legalizeImplicitArgPtr(MachineInstr &MI, MachineRegisterInfo &MRI,
99 MachineIRBuilder &B) const;
Matt Arsenaultf581d572019-09-05 02:20:39 +0000100 bool legalizeIsAddrSpace(MachineInstr &MI, MachineRegisterInfo &MRI,
101 MachineIRBuilder &B, unsigned AddrSpace) const;
Matt Arsenault3ecab8e2019-09-19 16:26:14 +0000102
103 Register handleD16VData(MachineIRBuilder &B, MachineRegisterInfo &MRI,
104 Register Reg) const;
105 bool legalizeRawBufferStore(MachineInstr &MI, MachineRegisterInfo &MRI,
106 MachineIRBuilder &B, bool IsFormat) const;
Matt Arsenaulte15770a2019-07-01 18:40:23 +0000107 bool legalizeIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +0000108 MachineIRBuilder &B) const override;
Matt Arsenaulte15770a2019-07-01 18:40:23 +0000109
Tom Stellardca166212017-01-30 21:56:46 +0000110};
111} // End llvm namespace.
112#endif