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