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#ifndef V8_COMPILER_SIMPLIFIED_LOWERING_H_
67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define V8_COMPILER_SIMPLIFIED_LOWERING_H_
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/js-graph.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/machine-operator.h"
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node.h"
117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/simplified-operator.h"
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 {
147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal {
157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler {
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
175fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.orgclass SimplifiedLowering {
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public:
196313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org  explicit SimplifiedLowering(JSGraph* jsgraph) : jsgraph_(jsgraph) {}
207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  virtual ~SimplifiedLowering() {}
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
22f50a8b46df04c10a7644112ce4cc73443ec4d281machenbach@chromium.org  void LowerAllNodes();
23f50a8b46df04c10a7644112ce4cc73443ec4d281machenbach@chromium.org
245c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org  // TODO(titzer): These are exposed for direct testing. Use a friend class.
25f50a8b46df04c10a7644112ce4cc73443ec4d281machenbach@chromium.org  void DoLoadField(Node* node);
26f50a8b46df04c10a7644112ce4cc73443ec4d281machenbach@chromium.org  void DoStoreField(Node* node);
27f50a8b46df04c10a7644112ce4cc73443ec4d281machenbach@chromium.org  void DoLoadElement(Node* node);
28f50a8b46df04c10a7644112ce4cc73443ec4d281machenbach@chromium.org  void DoStoreElement(Node* node);
2921d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  void DoStringAdd(Node* node);
3021d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org  void DoStringEqual(Node* node);
319aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  void DoStringLessThan(Node* node);
329aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  void DoStringLessThanOrEqual(Node* node);
335c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org
347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private:
357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  JSGraph* jsgraph_;
367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
375c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org  Node* SmiTag(Node* node);
385c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org  Node* IsTagged(Node* node);
395c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org  Node* Untag(Node* node);
405c0fd9bca25be110d9fb3e332075726b10c8b169machenbach@chromium.org  Node* OffsetMinusTagConstant(int32_t offset);
417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* ComputeIndex(const ElementAccess& access, Node* index);
429aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  Node* StringComparison(Node* node, bool requires_ordering);
437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
44f50a8b46df04c10a7644112ce4cc73443ec4d281machenbach@chromium.org  friend class RepresentationSelector;
45f50a8b46df04c10a7644112ce4cc73443ec4d281machenbach@chromium.org
467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Zone* zone() { return jsgraph_->zone(); }
477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  JSGraph* jsgraph() { return jsgraph_; }
487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph* graph() { return jsgraph()->graph(); }
497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder* common() { return jsgraph()->common(); }
50d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org  MachineOperatorBuilder* machine() { return jsgraph()->machine(); }
517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}  // namespace compiler
547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}  // namespace internal
557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}  // namespace v8
567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif  // V8_COMPILER_SIMPLIFIED_LOWERING_H_
58