1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/bytecode-branch-analysis.h"
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/interpreter/bytecode-array-iterator.h"
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/objects-inl.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace compiler {
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochBytecodeBranchAnalysis::BytecodeBranchAnalysis(
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<BytecodeArray> bytecode_array, Zone* zone)
16342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    : bytecode_array_(bytecode_array),
17342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      is_backward_target_(bytecode_array->length(), zone),
18342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      is_forward_target_(bytecode_array->length(), zone),
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      zone_(zone) {}
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BytecodeBranchAnalysis::Analyze() {
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  interpreter::BytecodeArrayIterator iterator(bytecode_array());
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (!iterator.done()) {
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    interpreter::Bytecode bytecode = iterator.current_bytecode();
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int current_offset = iterator.current_offset();
26342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    if (interpreter::Bytecodes::IsJump(bytecode)) {
27342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      AddBranch(current_offset, iterator.GetJumpTargetOffset());
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    iterator.Advance();
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BytecodeBranchAnalysis::AddBranch(int source_offset, int target_offset) {
34342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if (source_offset < target_offset) {
35342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    is_forward_target_.Add(target_offset);
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
37342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    is_backward_target_.Add(target_offset);
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace compiler
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
44