blob: 99564a04dbb2f3ec248386d0a1c759809ccb2dee [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"
Tom Stellardca166212017-01-30 21:56:46 +000019
20namespace llvm {
21
Matt Arsenaultc3fe46b2018-03-08 16:24:16 +000022class GCNTargetMachine;
Tom Stellardca166212017-01-30 21:56:46 +000023class LLVMContext;
Tom Stellard5bfbae52018-07-11 20:59:01 +000024class GCNSubtarget;
Tom Stellardca166212017-01-30 21:56:46 +000025
26/// This class provides the information for the target register banks.
27class AMDGPULegalizerInfo : public LegalizerInfo {
Matt Arsenault9e8e8c62019-07-01 18:49:01 +000028 const GCNSubtarget &ST;
29
Tom Stellardca166212017-01-30 21:56:46 +000030public:
Tom Stellard5bfbae52018-07-11 20:59:01 +000031 AMDGPULegalizerInfo(const GCNSubtarget &ST,
Matt Arsenaultc3fe46b2018-03-08 16:24:16 +000032 const GCNTargetMachine &TM);
Matt Arsenaulta8b43392019-02-08 02:40:47 +000033
34 bool legalizeCustom(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000035 MachineIRBuilder &B,
Matt Arsenaulta8b43392019-02-08 02:40:47 +000036 GISelChangeObserver &Observer) const override;
37
Matt Arsenault1178dc32019-06-28 01:16:46 +000038 Register getSegmentAperture(unsigned AddrSpace,
Matt Arsenaulta8b43392019-02-08 02:40:47 +000039 MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000040 MachineIRBuilder &B) const;
Matt Arsenaulta8b43392019-02-08 02:40:47 +000041
42 bool legalizeAddrSpaceCast(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000043 MachineIRBuilder &B) const;
Matt Arsenault6aafc5e2019-05-17 12:19:57 +000044 bool legalizeFrint(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000045 MachineIRBuilder &B) const;
Matt Arsenaulta510b572019-05-17 12:20:05 +000046 bool legalizeFceil(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000047 MachineIRBuilder &B) const;
Matt Arsenault6aebcd52019-05-17 12:20:01 +000048 bool legalizeIntrinsicTrunc(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000049 MachineIRBuilder &B) const;
Matt Arsenault2f292202019-05-17 23:05:18 +000050 bool legalizeITOFP(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000051 MachineIRBuilder &B, bool Signed) const;
Matt Arsenault6ce1b4f2019-07-10 16:31:19 +000052 bool legalizeMinNumMaxNum(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000053 MachineIRBuilder &B) const;
Matt Arsenaultb0e04c02019-07-15 19:40:59 +000054 bool legalizeExtractVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000055 MachineIRBuilder &B) const;
Matt Arsenault6ed315f2019-07-15 19:43:04 +000056 bool legalizeInsertVectorElt(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000057 MachineIRBuilder &B) const;
Matt Arsenaultcbd17822019-08-29 20:06:48 +000058 bool legalizeSinCos(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000059 MachineIRBuilder &B) const;
Matt Arsenaulte15770a2019-07-01 18:40:23 +000060
Matt Arsenault64ecca92019-09-09 17:13:44 +000061 bool legalizeGlobalValue(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000062 MachineIRBuilder &B) const;
Matt Arsenaultad6a8b832019-09-10 16:42:31 +000063 bool legalizeLoad(MachineInstr &MI, MachineRegisterInfo &MRI,
64 MachineIRBuilder &B,
65 GISelChangeObserver &Observer) const;
Matt Arsenault64ecca92019-09-09 17:13:44 +000066
Matt Arsenault4d339182019-09-13 00:44:35 +000067 bool legalizeFMad(MachineInstr &MI, MachineRegisterInfo &MRI,
68 MachineIRBuilder &B) const;
69
Matt Arsenaulte2c86cc2019-07-01 18:45:36 +000070 Register getLiveInRegister(MachineRegisterInfo &MRI,
71 Register Reg, LLT Ty) const;
72
73 bool loadInputValue(Register DstReg, MachineIRBuilder &B,
74 const ArgDescriptor *Arg) const;
75 bool legalizePreloadedArgIntrin(
76 MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &B,
77 AMDGPUFunctionArgInfo::PreloadedValue ArgType) const;
78
Austin Kerbowc99f62e2019-07-30 18:49:16 +000079 bool legalizeFDIVFast(MachineInstr &MI, MachineRegisterInfo &MRI,
80 MachineIRBuilder &B) const;
81
Matt Arsenault9e8e8c62019-07-01 18:49:01 +000082 bool legalizeImplicitArgPtr(MachineInstr &MI, MachineRegisterInfo &MRI,
83 MachineIRBuilder &B) const;
Matt Arsenaultf581d572019-09-05 02:20:39 +000084 bool legalizeIsAddrSpace(MachineInstr &MI, MachineRegisterInfo &MRI,
85 MachineIRBuilder &B, unsigned AddrSpace) const;
Matt Arsenaulte15770a2019-07-01 18:40:23 +000086 bool legalizeIntrinsic(MachineInstr &MI, MachineRegisterInfo &MRI,
Austin Kerbow06c8cb02019-09-09 23:06:13 +000087 MachineIRBuilder &B) const override;
Matt Arsenaulte15770a2019-07-01 18:40:23 +000088
Tom Stellardca166212017-01-30 21:56:46 +000089};
90} // End llvm namespace.
91#endif