mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351636 91177308-0d34-0410-b5e6-96231b3b80d8
160 lines
7.5 KiB
C++
160 lines
7.5 KiB
C++
//==- llvm/CodeGen/SelectionDAGTargetInfo.h - SelectionDAG Info --*- C++ -*-==//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file declares the SelectionDAGTargetInfo class, which targets can
|
|
// subclass to parameterize the SelectionDAG lowering and instruction
|
|
// selection process.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CODEGEN_SELECTIONDAGTARGETINFO_H
|
|
#define LLVM_CODEGEN_SELECTIONDAGTARGETINFO_H
|
|
|
|
#include "llvm/CodeGen/MachineMemOperand.h"
|
|
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
|
#include "llvm/Support/CodeGen.h"
|
|
#include <utility>
|
|
|
|
namespace llvm {
|
|
|
|
class SelectionDAG;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
/// Targets can subclass this to parameterize the
|
|
/// SelectionDAG lowering and instruction selection process.
|
|
///
|
|
class SelectionDAGTargetInfo {
|
|
public:
|
|
explicit SelectionDAGTargetInfo() = default;
|
|
SelectionDAGTargetInfo(const SelectionDAGTargetInfo &) = delete;
|
|
SelectionDAGTargetInfo &operator=(const SelectionDAGTargetInfo &) = delete;
|
|
virtual ~SelectionDAGTargetInfo();
|
|
|
|
/// Emit target-specific code that performs a memcpy.
|
|
/// This can be used by targets to provide code sequences for cases
|
|
/// that don't fit the target's parameters for simple loads/stores and can be
|
|
/// more efficient than using a library call. This function can return a null
|
|
/// SDValue if the target declines to use custom code and a different
|
|
/// lowering strategy should be used.
|
|
///
|
|
/// If AlwaysInline is true, the size is constant and the target should not
|
|
/// emit any calls and is strongly encouraged to attempt to emit inline code
|
|
/// even if it is beyond the usual threshold because this intrinsic is being
|
|
/// expanded in a place where calls are not feasible (e.g. within the prologue
|
|
/// for another call). If the target chooses to decline an AlwaysInline
|
|
/// request here, legalize will resort to using simple loads and stores.
|
|
virtual SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
|
|
SDValue Chain, SDValue Op1,
|
|
SDValue Op2, SDValue Op3,
|
|
unsigned Align, bool isVolatile,
|
|
bool AlwaysInline,
|
|
MachinePointerInfo DstPtrInfo,
|
|
MachinePointerInfo SrcPtrInfo) const {
|
|
return SDValue();
|
|
}
|
|
|
|
/// Emit target-specific code that performs a memmove.
|
|
/// This can be used by targets to provide code sequences for cases
|
|
/// that don't fit the target's parameters for simple loads/stores and can be
|
|
/// more efficient than using a library call. This function can return a null
|
|
/// SDValue if the target declines to use custom code and a different
|
|
/// lowering strategy should be used.
|
|
virtual SDValue EmitTargetCodeForMemmove(
|
|
SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1,
|
|
SDValue Op2, SDValue Op3, unsigned Align, bool isVolatile,
|
|
MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
|
|
return SDValue();
|
|
}
|
|
|
|
/// Emit target-specific code that performs a memset.
|
|
/// This can be used by targets to provide code sequences for cases
|
|
/// that don't fit the target's parameters for simple stores and can be more
|
|
/// efficient than using a library call. This function can return a null
|
|
/// SDValue if the target declines to use custom code and a different
|
|
/// lowering strategy should be used.
|
|
virtual SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, const SDLoc &dl,
|
|
SDValue Chain, SDValue Op1,
|
|
SDValue Op2, SDValue Op3,
|
|
unsigned Align, bool isVolatile,
|
|
MachinePointerInfo DstPtrInfo) const {
|
|
return SDValue();
|
|
}
|
|
|
|
/// Emit target-specific code that performs a memcmp, in cases where that is
|
|
/// faster than a libcall. The first returned SDValue is the result of the
|
|
/// memcmp and the second is the chain. Both SDValues can be null if a normal
|
|
/// libcall should be used.
|
|
virtual std::pair<SDValue, SDValue>
|
|
EmitTargetCodeForMemcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain,
|
|
SDValue Op1, SDValue Op2, SDValue Op3,
|
|
MachinePointerInfo Op1PtrInfo,
|
|
MachinePointerInfo Op2PtrInfo) const {
|
|
return std::make_pair(SDValue(), SDValue());
|
|
}
|
|
|
|
/// Emit target-specific code that performs a memchr, in cases where that is
|
|
/// faster than a libcall. The first returned SDValue is the result of the
|
|
/// memchr and the second is the chain. Both SDValues can be null if a normal
|
|
/// libcall should be used.
|
|
virtual std::pair<SDValue, SDValue>
|
|
EmitTargetCodeForMemchr(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain,
|
|
SDValue Src, SDValue Char, SDValue Length,
|
|
MachinePointerInfo SrcPtrInfo) const {
|
|
return std::make_pair(SDValue(), SDValue());
|
|
}
|
|
|
|
/// Emit target-specific code that performs a strcpy or stpcpy, in cases
|
|
/// where that is faster than a libcall.
|
|
/// The first returned SDValue is the result of the copy (the start
|
|
/// of the destination string for strcpy, a pointer to the null terminator
|
|
/// for stpcpy) and the second is the chain. Both SDValues can be null
|
|
/// if a normal libcall should be used.
|
|
virtual std::pair<SDValue, SDValue>
|
|
EmitTargetCodeForStrcpy(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
|
|
SDValue Dest, SDValue Src,
|
|
MachinePointerInfo DestPtrInfo,
|
|
MachinePointerInfo SrcPtrInfo, bool isStpcpy) const {
|
|
return std::make_pair(SDValue(), SDValue());
|
|
}
|
|
|
|
/// Emit target-specific code that performs a strcmp, in cases where that is
|
|
/// faster than a libcall.
|
|
/// The first returned SDValue is the result of the strcmp and the second is
|
|
/// the chain. Both SDValues can be null if a normal libcall should be used.
|
|
virtual std::pair<SDValue, SDValue>
|
|
EmitTargetCodeForStrcmp(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain,
|
|
SDValue Op1, SDValue Op2,
|
|
MachinePointerInfo Op1PtrInfo,
|
|
MachinePointerInfo Op2PtrInfo) const {
|
|
return std::make_pair(SDValue(), SDValue());
|
|
}
|
|
|
|
virtual std::pair<SDValue, SDValue>
|
|
EmitTargetCodeForStrlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
|
|
SDValue Src, MachinePointerInfo SrcPtrInfo) const {
|
|
return std::make_pair(SDValue(), SDValue());
|
|
}
|
|
|
|
virtual std::pair<SDValue, SDValue>
|
|
EmitTargetCodeForStrnlen(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain,
|
|
SDValue Src, SDValue MaxLength,
|
|
MachinePointerInfo SrcPtrInfo) const {
|
|
return std::make_pair(SDValue(), SDValue());
|
|
}
|
|
|
|
// Return true when the decision to generate FMA's (or FMS, FMLA etc) rather
|
|
// than FMUL and ADD is delegated to the machine combiner.
|
|
virtual bool generateFMAsInMachineCombiner(CodeGenOpt::Level OptLevel) const {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_CODEGEN_SELECTIONDAGTARGETINFO_H
|