17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2012 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#ifndef V8_LITHIUM_INL_H_
67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define V8_LITHIUM_INL_H_
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/lithium.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#if V8_TARGET_ARCH_IA32
117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/ia32/lithium-ia32.h"  // NOLINT
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#elif V8_TARGET_ARCH_X64
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/x64/lithium-x64.h"  // NOLINT
147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#elif V8_TARGET_ARCH_ARM64
157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/arm64/lithium-arm64.h"  // NOLINT
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#elif V8_TARGET_ARCH_ARM
177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/arm/lithium-arm.h"  // NOLINT
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#elif V8_TARGET_ARCH_MIPS
197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/mips/lithium-mips.h"  // NOLINT
207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#elif V8_TARGET_ARCH_MIPS64
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/mips64/lithium-mips64.h"  // NOLINT
227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#elif V8_TARGET_ARCH_X87
237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/x87/lithium-x87.h"  // NOLINT
247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#error "Unknown architecture."
267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 {
297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal {
307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTempIterator::TempIterator(LInstruction* instr)
327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    : instr_(instr), limit_(instr->TempCount()), current_(0) {
337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SkipUninteresting();
347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgbool TempIterator::Done() { return current_ >= limit_; }
387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgLOperand* TempIterator::Current() {
41e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!Done());
427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return instr_->TempAt(current_);
437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid TempIterator::SkipUninteresting() {
477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  while (current_ < limit_ && instr_->TempAt(current_) == NULL) ++current_;
487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid TempIterator::Advance() {
527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ++current_;
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SkipUninteresting();
547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgInputIterator::InputIterator(LInstruction* instr)
587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    : instr_(instr), limit_(instr->InputCount()), current_(0) {
597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SkipUninteresting();
607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgbool InputIterator::Done() { return current_ >= limit_; }
647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgLOperand* InputIterator::Current() {
67e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!Done());
68e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(instr_->InputAt(current_) != NULL);
697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return instr_->InputAt(current_);
707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid InputIterator::Advance() {
747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ++current_;
757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SkipUninteresting();
767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid InputIterator::SkipUninteresting() {
807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  while (current_ < limit_) {
817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    LOperand* current = instr_->InputAt(current_);
827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (current != NULL && !current->IsConstantOperand()) break;
837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    ++current_;
847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgUseIterator::UseIterator(LInstruction* instr)
897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    : input_iterator_(instr), env_iterator_(instr->environment()) {}
907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgbool UseIterator::Done() {
937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return input_iterator_.Done() && env_iterator_.Done();
947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgLOperand* UseIterator::Current() {
98e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!Done());
997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  LOperand* result = input_iterator_.Done() ? env_iterator_.Current()
1007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                            : input_iterator_.Current();
101e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(result != NULL);
1027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return result;
1037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid UseIterator::Advance() {
1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  input_iterator_.Done() ? env_iterator_.Advance() : input_iterator_.Advance();
1087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}  // namespace v8::internal
1117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif  // V8_LITHIUM_INL_H_
113