TargetSelectionDAGInfo.h revision 17c4a621fe61a70b106548d168271f37fce1e89d
18c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman//==-- llvm/Target/TargetSelectionDAGInfo.h - SelectionDAG Info --*- C++ -*-==// 28c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman// 38c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman// The LLVM Compiler Infrastructure 48c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman// 58c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman// This file is distributed under the University of Illinois Open Source 68c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman// License. See LICENSE.TXT for details. 78c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman// 88c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman//===----------------------------------------------------------------------===// 98c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman// 108c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman// This file declares the TargetSelectionDAGInfo class, which targets can 118c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman// subclass to parameterize the SelectionDAG lowering and instruction 128c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman// selection process. 138c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman// 148c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman//===----------------------------------------------------------------------===// 158c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman 168c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman#ifndef LLVM_TARGET_TARGETSELECTIONDAGINFO_H 178c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman#define LLVM_TARGET_TARGETSELECTIONDAGINFO_H 188c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman 19ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman#include "llvm/CodeGen/SelectionDAGNodes.h" 20ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman 218c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohmannamespace llvm { 228c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman 23ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohmanclass TargetData; 24ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohmanclass TargetMachine; 25ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman 268c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman//===----------------------------------------------------------------------===// 2717c4a621fe61a70b106548d168271f37fce1e89dDan Gohman/// TargetSelectionDAGInfo - Targets can subclass this to parameterize the 288c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman/// SelectionDAG lowering and instruction selection process. 298c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman/// 308c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohmanclass TargetSelectionDAGInfo { 318c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman TargetSelectionDAGInfo(const TargetSelectionDAGInfo &); // DO NOT IMPLEMENT 328c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman void operator=(const TargetSelectionDAGInfo &); // DO NOT IMPLEMENT 338c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman 34ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman const TargetData *TD; 35ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman 36ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohmanprotected: 37ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman const TargetData *getTargetData() const { return TD; } 38ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman 398c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohmanpublic: 40ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman explicit TargetSelectionDAGInfo(const TargetMachine &TM); 418c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman virtual ~TargetSelectionDAGInfo(); 42ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman 43ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// EmitTargetCodeForMemcpy - Emit target-specific code that performs a 44ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// memcpy. This can be used by targets to provide code sequences for cases 45ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// that don't fit the target's parameters for simple loads/stores and can be 46ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// more efficient than using a library call. This function can return a null 47ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// SDValue if the target declines to use custom code and a different 48ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// lowering strategy should be used. 49ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// 50ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// If AlwaysInline is true, the size is constant and the target should not 51ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// emit any calls and is strongly encouraged to attempt to emit inline code 52ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// even if it is beyond the usual threshold because this intrinsic is being 53ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// expanded in a place where calls are not feasible (e.g. within the prologue 54ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// for another call). If the target chooses to decline an AlwaysInline 55ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// request here, legalize will resort to using simple loads and stores. 56ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman virtual SDValue 57ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman EmitTargetCodeForMemcpy(SelectionDAG &DAG, DebugLoc dl, 58ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman SDValue Chain, 59ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman SDValue Op1, SDValue Op2, 60ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman SDValue Op3, unsigned Align, bool isVolatile, 61ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman bool AlwaysInline, 62ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman const Value *DstSV, uint64_t DstOff, 63ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman const Value *SrcSV, uint64_t SrcOff) const { 64ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman return SDValue(); 65ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman } 66ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman 67ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// EmitTargetCodeForMemmove - Emit target-specific code that performs a 68ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// memmove. This can be used by targets to provide code sequences for cases 69ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// that don't fit the target's parameters for simple loads/stores and can be 70ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// more efficient than using a library call. This function can return a null 71ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// SDValue if the target declines to use custom code and a different 72ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// lowering strategy should be used. 73ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman virtual SDValue 74ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman EmitTargetCodeForMemmove(SelectionDAG &DAG, DebugLoc dl, 75ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman SDValue Chain, 76ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman SDValue Op1, SDValue Op2, 77ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman SDValue Op3, unsigned Align, bool isVolatile, 78ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman const Value *DstSV, uint64_t DstOff, 79ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman const Value *SrcSV, uint64_t SrcOff) const { 80ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman return SDValue(); 81ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman } 82ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman 83ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// EmitTargetCodeForMemset - Emit target-specific code that performs a 84ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// memset. This can be used by targets to provide code sequences for cases 85ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// that don't fit the target's parameters for simple stores and can be more 86ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// efficient than using a library call. This function can return a null 87ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// SDValue if the target declines to use custom code and a different 88ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman /// lowering strategy should be used. 89ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman virtual SDValue 90ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman EmitTargetCodeForMemset(SelectionDAG &DAG, DebugLoc dl, 91ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman SDValue Chain, 92ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman SDValue Op1, SDValue Op2, 93ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman SDValue Op3, unsigned Align, bool isVolatile, 94ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman const Value *DstSV, uint64_t DstOff) const { 95ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman return SDValue(); 96ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman } 978c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman}; 988c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman 998c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman} // end llvm namespace 1008c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman 1018c0e89925d6b76b7671fe904a97c618d155dea42Dan Gohman#endif 102