17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file.
47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "test/cctest/compiler/graph-builder-tester.h"
6b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org
7b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org#include "src/compiler/linkage.h"
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/pipeline.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 {
117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal {
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler {
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
149aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.orgMachineCallHelper::MachineCallHelper(Zone* zone, MachineSignature* machine_sig)
159aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    : CallHelper(zone->isolate(), machine_sig),
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      parameters_(NULL),
177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      graph_(NULL) {}
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid MachineCallHelper::InitParameters(GraphBuilder* builder,
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                       CommonOperatorBuilder* common) {
22e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK_EQ(NULL, parameters_);
237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  graph_ = builder->graph();
249aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  int param_count = static_cast<int>(parameter_count());
259aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  if (param_count == 0) return;
269aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  parameters_ = graph_->zone()->NewArray<Node*>(param_count);
279aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  for (int i = 0; i < param_count; ++i) {
283e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    parameters_[i] = builder->NewNode(common->Parameter(i), graph_->start());
297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgbyte* MachineCallHelper::Generate() {
34e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(parameter_count() == 0 || parameters_ != NULL);
355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  if (!Pipeline::SupportedBackend()) return NULL;
367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  if (code_.is_null()) {
377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Zone* zone = graph_->zone();
387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CompilationInfo info(zone->isolate(), zone);
399aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    Linkage linkage(&info,
409aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org                    Linkage::GetSimplifiedCDescriptor(zone, machine_sig_));
417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Pipeline pipeline(&info);
427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    code_ = pipeline.GenerateCodeForMachineGraph(&linkage, graph_);
437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return code_.ToHandleChecked()->entry();
457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
489aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.orgNode* MachineCallHelper::Parameter(size_t index) {
49e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK_NE(NULL, parameters_);
509aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  DCHECK(index < parameter_count());
519aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  return parameters_[index];
527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}  // namespace compiler
557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}  // namespace internal
567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}  // namespace v8
57