XCoreSelectionDAGInfo.cpp revision cd81d94322a39503e4a3e87b6ee03d4fcb3465fb
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com//===-- XCoreSelectionDAGInfo.cpp - XCore SelectionDAG Info ---------------===// 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// The LLVM Compiler Infrastructure 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// This file is distributed under the University of Illinois Open Source 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// License. See LICENSE.TXT for details. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// 8a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org//===----------------------------------------------------------------------===// 9ce56d965069c1649afe14319cb239e6ad670682acommit-bot@chromium.org// 10a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org// This file implements the XCoreSelectionDAGInfo class. 11a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org// 12a5572e5bb2a2bbeeb59de0741c2527869d365a0ccommit-bot@chromium.org//===----------------------------------------------------------------------===// 13c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org 14c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org#include "XCoreTargetMachine.h" 15d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.orgusing namespace llvm; 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 178fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org#define DEBUG_TYPE "xcore-selectiondag-info" 188b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comXCoreSelectionDAGInfo::XCoreSelectionDAGInfo(const DataLayout &DL) 208fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org : TargetSelectionDAGInfo(&DL) {} 218fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org 228fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.orgXCoreSelectionDAGInfo::~XCoreSelectionDAGInfo() { 238fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org} 248fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org 258fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.orgSDValue XCoreSelectionDAGInfo:: 268fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.orgEmitTargetCodeForMemcpy(SelectionDAG &DAG, SDLoc dl, SDValue Chain, 278fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org SDValue Dst, SDValue Src, SDValue Size, unsigned Align, 288fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org bool isVolatile, bool AlwaysInline, 298fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org MachinePointerInfo DstPtrInfo, 308fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org MachinePointerInfo SrcPtrInfo) const 318fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org{ 328fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org unsigned SizeBitWidth = Size.getValueType().getSizeInBits(); 338fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org // Call __memcpy_4 if the src, dst and size are all 4 byte aligned. 348fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org if (!AlwaysInline && (Align & 3) == 0 && 358fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org DAG.MaskedValueIsZero(Size, APInt(SizeBitWidth, 3))) { 368fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org const TargetLowering &TLI = *DAG.getTarget().getTargetLowering(); 378fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org TargetLowering::ArgListTy Args; 388fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org TargetLowering::ArgListEntry Entry; 399c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org Entry.Ty = TLI.getDataLayout()->getIntPtrType(*DAG.getContext()); 408fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org Entry.Node = Dst; Args.push_back(Entry); 419c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org Entry.Node = Src; Args.push_back(Entry); 429c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org Entry.Node = Size; Args.push_back(Entry); 439c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org 449c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org TargetLowering::CallLoweringInfo CLI(DAG); 459c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org CLI.setDebugLoc(dl).setChain(Chain) 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com .setCallee(TLI.getLibcallCallingConv(RTLIB::MEMCPY), 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Type::getVoidTy(*DAG.getContext()), 488fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org DAG.getExternalSymbol("__memcpy_4", TLI.getPointerTy()), 498fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org std::move(Args), 0) 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com .setDiscardResult(); 51f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com 52f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com std::pair<SDValue,SDValue> CallResult = TLI.LowerCallTo(CLI); 53f94b3a4cebd4adab09c40ebe23c02a615e10c394bsalomon@google.com return CallResult.second; 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // Otherwise have the target-independent code call memcpy. 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return SDValue(); 588fae213590981b8ca37839a4e3cae1dae4e611fdcommit-bot@chromium.org} 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com