mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
e38f45effc
AEABI defines aligned variants of memcpy etc. that can be faster than the default version due to not having to do alignment checks. When emitting target code for these functions make use of these aligned variants if possible. Also convert memset to memclr if possible. Differential Revision: http://reviews.llvm.org/D8060 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237127 91177308-0d34-0410-b5e6-96231b3b80d8
76 lines
3.0 KiB
C++
76 lines
3.0 KiB
C++
//===-- ARMSelectionDAGInfo.h - ARM SelectionDAG Info -----------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines the ARM subclass for TargetSelectionDAGInfo.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_ARM_ARMSELECTIONDAGINFO_H
|
|
#define LLVM_LIB_TARGET_ARM_ARMSELECTIONDAGINFO_H
|
|
|
|
#include "MCTargetDesc/ARMAddressingModes.h"
|
|
#include "llvm/Target/TargetSelectionDAGInfo.h"
|
|
|
|
namespace llvm {
|
|
|
|
namespace ARM_AM {
|
|
static inline ShiftOpc getShiftOpcForNode(unsigned Opcode) {
|
|
switch (Opcode) {
|
|
default: return ARM_AM::no_shift;
|
|
case ISD::SHL: return ARM_AM::lsl;
|
|
case ISD::SRL: return ARM_AM::lsr;
|
|
case ISD::SRA: return ARM_AM::asr;
|
|
case ISD::ROTR: return ARM_AM::ror;
|
|
//case ISD::ROTL: // Only if imm -> turn into ROTR.
|
|
// Can't handle RRX here, because it would require folding a flag into
|
|
// the addressing mode. :( This causes us to miss certain things.
|
|
//case ARMISD::RRX: return ARM_AM::rrx;
|
|
}
|
|
}
|
|
} // end namespace ARM_AM
|
|
|
|
class ARMSelectionDAGInfo : public TargetSelectionDAGInfo {
|
|
public:
|
|
explicit ARMSelectionDAGInfo(const DataLayout &DL);
|
|
~ARMSelectionDAGInfo();
|
|
|
|
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, SDLoc dl,
|
|
SDValue Chain,
|
|
SDValue Dst, SDValue Src,
|
|
SDValue Size, unsigned Align,
|
|
bool isVolatile, bool AlwaysInline,
|
|
MachinePointerInfo DstPtrInfo,
|
|
MachinePointerInfo SrcPtrInfo) const override;
|
|
|
|
SDValue EmitTargetCodeForMemmove(SelectionDAG &DAG, SDLoc dl,
|
|
SDValue Chain,
|
|
SDValue Dst, SDValue Src,
|
|
SDValue Size, unsigned Align, bool isVolatile,
|
|
MachinePointerInfo DstPtrInfo,
|
|
MachinePointerInfo SrcPtrInfo) const override;
|
|
|
|
// Adjust parameters for memset, see RTABI section 4.3.4
|
|
SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, SDLoc dl,
|
|
SDValue Chain,
|
|
SDValue Op1, SDValue Op2,
|
|
SDValue Op3, unsigned Align,
|
|
bool isVolatile,
|
|
MachinePointerInfo DstPtrInfo) const override;
|
|
|
|
SDValue EmitSpecializedLibcall(SelectionDAG &DAG, SDLoc dl,
|
|
SDValue Chain,
|
|
SDValue Dst, SDValue Src,
|
|
SDValue Size, unsigned Align,
|
|
RTLIB::Libcall LC) const;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|