1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/compiler/graph-builder-tester.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/linkage.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/pipeline.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMachineCallHelper::MachineCallHelper(Zone* zone, MachineSignature* machine_sig)
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : CallHelper(zone->isolate(), machine_sig),
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      parameters_(NULL),
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      graph_(NULL) {}
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MachineCallHelper::InitParameters(GraphBuilder* builder,
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                       CommonOperatorBuilder* common) {
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(NULL, parameters_);
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  graph_ = builder->graph();
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int param_count = static_cast<int>(parameter_count());
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (param_count == 0) return;
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  parameters_ = graph_->zone()->NewArray<Node*>(param_count);
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < param_count; ++i) {
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    parameters_[i] = builder->NewNode(common->Parameter(i), graph_->start());
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbyte* MachineCallHelper::Generate() {
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(parameter_count() == 0 || parameters_ != NULL);
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!Pipeline::SupportedBackend()) return NULL;
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (code_.is_null()) {
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Zone* zone = graph_->zone();
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CompilationInfo info(zone->isolate(), zone);
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Linkage linkage(&info,
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    Linkage::GetSimplifiedCDescriptor(zone, machine_sig_));
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Pipeline pipeline(&info);
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    code_ = pipeline.GenerateCodeForMachineGraph(&linkage, graph_);
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return code_.ToHandleChecked()->entry();
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNode* MachineCallHelper::Parameter(size_t index) {
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_NE(NULL, parameters_);
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index < parameter_count());
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return parameters_[index];
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
57