1*9880d681SAndroid Build Coastguard Worker //===-- ARMSelectionDAGInfo.h - ARM SelectionDAG Info -----------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file defines the ARM subclass for SelectionDAGTargetInfo. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_ARM_ARMSELECTIONDAGINFO_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_ARM_ARMSELECTIONDAGINFO_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/ARMAddressingModes.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/RuntimeLibcalls.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/SelectionDAGTargetInfo.h" 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker namespace llvm { 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker namespace ARM_AM { getShiftOpcForNode(unsigned Opcode)24*9880d681SAndroid Build Coastguard Worker static inline ShiftOpc getShiftOpcForNode(unsigned Opcode) { 25*9880d681SAndroid Build Coastguard Worker switch (Opcode) { 26*9880d681SAndroid Build Coastguard Worker default: return ARM_AM::no_shift; 27*9880d681SAndroid Build Coastguard Worker case ISD::SHL: return ARM_AM::lsl; 28*9880d681SAndroid Build Coastguard Worker case ISD::SRL: return ARM_AM::lsr; 29*9880d681SAndroid Build Coastguard Worker case ISD::SRA: return ARM_AM::asr; 30*9880d681SAndroid Build Coastguard Worker case ISD::ROTR: return ARM_AM::ror; 31*9880d681SAndroid Build Coastguard Worker //case ISD::ROTL: // Only if imm -> turn into ROTR. 32*9880d681SAndroid Build Coastguard Worker // Can't handle RRX here, because it would require folding a flag into 33*9880d681SAndroid Build Coastguard Worker // the addressing mode. :( This causes us to miss certain things. 34*9880d681SAndroid Build Coastguard Worker //case ARMISD::RRX: return ARM_AM::rrx; 35*9880d681SAndroid Build Coastguard Worker } 36*9880d681SAndroid Build Coastguard Worker } 37*9880d681SAndroid Build Coastguard Worker } // end namespace ARM_AM 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker class ARMSelectionDAGInfo : public SelectionDAGTargetInfo { 40*9880d681SAndroid Build Coastguard Worker public: 41*9880d681SAndroid Build Coastguard Worker SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl, 42*9880d681SAndroid Build Coastguard Worker SDValue Chain, SDValue Dst, SDValue Src, 43*9880d681SAndroid Build Coastguard Worker SDValue Size, unsigned Align, bool isVolatile, 44*9880d681SAndroid Build Coastguard Worker bool AlwaysInline, 45*9880d681SAndroid Build Coastguard Worker MachinePointerInfo DstPtrInfo, 46*9880d681SAndroid Build Coastguard Worker MachinePointerInfo SrcPtrInfo) const override; 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker SDValue 49*9880d681SAndroid Build Coastguard Worker EmitTargetCodeForMemmove(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, 50*9880d681SAndroid Build Coastguard Worker SDValue Dst, SDValue Src, SDValue Size, 51*9880d681SAndroid Build Coastguard Worker unsigned Align, bool isVolatile, 52*9880d681SAndroid Build Coastguard Worker MachinePointerInfo DstPtrInfo, 53*9880d681SAndroid Build Coastguard Worker MachinePointerInfo SrcPtrInfo) const override; 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker // Adjust parameters for memset, see RTABI section 4.3.4 56*9880d681SAndroid Build Coastguard Worker SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, const SDLoc &dl, 57*9880d681SAndroid Build Coastguard Worker SDValue Chain, SDValue Op1, SDValue Op2, 58*9880d681SAndroid Build Coastguard Worker SDValue Op3, unsigned Align, bool isVolatile, 59*9880d681SAndroid Build Coastguard Worker MachinePointerInfo DstPtrInfo) const override; 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker SDValue EmitSpecializedLibcall(SelectionDAG &DAG, const SDLoc &dl, 62*9880d681SAndroid Build Coastguard Worker SDValue Chain, SDValue Dst, SDValue Src, 63*9880d681SAndroid Build Coastguard Worker SDValue Size, unsigned Align, 64*9880d681SAndroid Build Coastguard Worker RTLIB::Libcall LC) const; 65*9880d681SAndroid Build Coastguard Worker }; 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker } 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker #endif 70