blob: 2fb6ee25caa975100bd24ee2b1fcff1d0a58e0b9 [file] [log] [blame]
Tom Stellard75aadc22012-12-11 21:25:42 +00001//===-- R600ISelLowering.h - R600 DAG Lowering Interface -*- C++ -*--------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10/// \file
11/// \brief R600 DAG Lowering interface definition
12//
13//===----------------------------------------------------------------------===//
14
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000015#ifndef LLVM_LIB_TARGET_AMDGPU_R600ISELLOWERING_H
16#define LLVM_LIB_TARGET_AMDGPU_R600ISELLOWERING_H
Tom Stellard75aadc22012-12-11 21:25:42 +000017
18#include "AMDGPUISelLowering.h"
19
20namespace llvm {
21
22class R600InstrInfo;
Matt Arsenault43e92fe2016-06-24 06:30:11 +000023class R600Subtarget;
Tom Stellard75aadc22012-12-11 21:25:42 +000024
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000025class R600TargetLowering final : public AMDGPUTargetLowering {
Tom Stellard75aadc22012-12-11 21:25:42 +000026public:
Matt Arsenault43e92fe2016-06-24 06:30:11 +000027 R600TargetLowering(const TargetMachine &TM, const R600Subtarget &STI);
28
29 const R600Subtarget *getSubtarget() const;
30
Duncan P. N. Exon Smithe4f5e4f2016-06-30 22:52:52 +000031 MachineBasicBlock *
32 EmitInstrWithCustomInserter(MachineInstr &MI,
33 MachineBasicBlock *BB) const override;
Craig Topper5656db42014-04-29 07:57:24 +000034 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
35 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
36 void ReplaceNodeResults(SDNode * N,
37 SmallVectorImpl<SDValue> &Results,
38 SelectionDAG &DAG) const override;
Benjamin Kramerbdc49562016-06-12 15:39:02 +000039 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
40 bool isVarArg,
41 const SmallVectorImpl<ISD::InputArg> &Ins,
42 const SDLoc &DL, SelectionDAG &DAG,
43 SmallVectorImpl<SDValue> &InVals) const override;
Mehdi Amini44ede332015-07-09 02:09:04 +000044 EVT getSetCCResultType(const DataLayout &DL, LLVMContext &,
45 EVT VT) const override;
46
Matt Arsenaultfa67bdb2016-02-22 21:04:16 +000047 bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS,
48 unsigned Align,
49 bool *IsFast) const override;
50
Tom Stellard75aadc22012-12-11 21:25:42 +000051private:
Vincent Lejeuneb55940c2013-07-09 15:03:11 +000052 unsigned Gen;
Tom Stellard75aadc22012-12-11 21:25:42 +000053 /// Each OpenCL kernel has nine implicit parameters that are stored in the
54 /// first nine dwords of a Vertex Buffer. These implicit parameters are
Alp Tokercb402912014-01-24 17:20:08 +000055 /// lowered to load instructions which retrieve the values from the Vertex
Tom Stellard75aadc22012-12-11 21:25:42 +000056 /// Buffer.
Benjamin Kramerbdc49562016-06-12 15:39:02 +000057 SDValue LowerImplicitParameter(SelectionDAG &DAG, EVT VT, const SDLoc &DL,
58 unsigned DwordOffset) const;
Tom Stellard75aadc22012-12-11 21:25:42 +000059
60 void lowerImplicitParameter(MachineInstr *MI, MachineBasicBlock &BB,
61 MachineRegisterInfo & MRI, unsigned dword_offset) const;
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +000062 SDValue OptimizeSwizzle(SDValue BuildVector, SDValue Swz[], SelectionDAG &DAG,
Benjamin Kramerbdc49562016-06-12 15:39:02 +000063 const SDLoc &DL) const;
Tom Stellard880a80a2014-06-17 16:53:14 +000064 SDValue vectorToVerticalVector(SelectionDAG &DAG, SDValue Vector) const;
Tom Stellard75aadc22012-12-11 21:25:42 +000065
Matt Arsenault81d06012016-03-07 21:10:13 +000066 SDValue lowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
Tom Stellard880a80a2014-06-17 16:53:14 +000067 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
68 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
Tom Stellard27233b72016-05-02 18:05:17 +000069 SDValue LowerGlobalAddress(AMDGPUMachineFunction *MFI, SDValue Op,
Reid Kleckner0549ab62016-05-02 19:45:10 +000070 SelectionDAG &DAG) const override;
Tom Stellard75aadc22012-12-11 21:25:42 +000071 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
Matt Arsenault95245662016-02-11 05:32:46 +000072
73 SDValue lowerPrivateTruncStore(StoreSDNode *Store, SelectionDAG &DAG) const;
Tom Stellard75aadc22012-12-11 21:25:42 +000074 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
75 SDValue LowerFPTOUINT(SDValue Op, SelectionDAG &DAG) const;
Matt Arsenault6dfda962016-02-10 18:21:39 +000076
77 SDValue lowerPrivateExtLoad(SDValue Op, SelectionDAG &DAG) const;
Tom Stellard365366f2013-01-23 02:09:06 +000078 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
Matt Arsenault1d555c42014-06-23 18:00:55 +000079 SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
Vincent Lejeuneb55940c2013-07-09 15:03:11 +000080 SDValue LowerTrig(SDValue Op, SelectionDAG &DAG) const;
Jan Vesely25f36272014-06-18 12:27:13 +000081 SDValue LowerSHLParts(SDValue Op, SelectionDAG &DAG) const;
Jan Vesely900ff2e2014-06-18 12:27:15 +000082 SDValue LowerSRXParts(SDValue Op, SelectionDAG &DAG) const;
Jan Vesely808fff52015-04-30 17:15:56 +000083 SDValue LowerUADDSUBO(SDValue Op, SelectionDAG &DAG,
84 unsigned mainop, unsigned ovf) const;
Tom Stellardf3b2a1e2013-02-06 17:32:29 +000085
86 SDValue stackPtrToRegIndex(SDValue Ptr, unsigned StackWidth,
87 SelectionDAG &DAG) const;
88 void getStackAddress(unsigned StackWidth, unsigned ElemIdx,
89 unsigned &Channel, unsigned &PtrIncr) const;
Tom Stellard75aadc22012-12-11 21:25:42 +000090 bool isZero(SDValue Op) const;
Matt Arsenault6b6a2c32016-03-11 08:00:27 +000091 bool isHWTrueValue(SDValue Op) const;
92 bool isHWFalseValue(SDValue Op) const;
93
Matt Arsenault43e92fe2016-06-24 06:30:11 +000094 bool FoldOperand(SDNode *ParentNode, unsigned SrcIdx, SDValue &Src,
95 SDValue &Neg, SDValue &Abs, SDValue &Sel, SDValue &Imm,
96 SelectionDAG &DAG) const;
97
Craig Topper5656db42014-04-29 07:57:24 +000098 SDNode *PostISelFolding(MachineSDNode *N, SelectionDAG &DAG) const override;
Tom Stellard75aadc22012-12-11 21:25:42 +000099};
100
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000101} // End namespace llvm;
Tom Stellard75aadc22012-12-11 21:25:42 +0000102
Benjamin Kramera7c40ef2014-08-13 16:26:38 +0000103#endif