| Index: src/compiler/change-lowering.cc
|
| diff --git a/src/compiler/change-lowering.cc b/src/compiler/change-lowering.cc
|
| index e80adeca001560dcb218c6bad7fa9d485d23ac13..b07e5489a283d7de08537af67b95fd138249d409 100644
|
| --- a/src/compiler/change-lowering.cc
|
| +++ b/src/compiler/change-lowering.cc
|
| @@ -4,100 +4,58 @@
|
|
|
| #include "src/compiler/change-lowering.h"
|
|
|
| -#include "src/compiler/common-node-cache.h"
|
| -#include "src/compiler/graph.h"
|
| +#include "src/compiler/js-graph.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| namespace compiler {
|
|
|
| -ChangeLoweringBase::ChangeLoweringBase(Graph* graph, Linkage* linkage,
|
| - CommonNodeCache* cache)
|
| - : graph_(graph),
|
| - isolate_(graph->zone()->isolate()),
|
| - linkage_(linkage),
|
| - cache_(cache),
|
| - common_(graph->zone()),
|
| - machine_(graph->zone()) {}
|
| +ChangeLowering::~ChangeLowering() {}
|
|
|
|
|
| -ChangeLoweringBase::~ChangeLoweringBase() {}
|
| -
|
| -
|
| -Node* ChangeLoweringBase::ExternalConstant(ExternalReference reference) {
|
| - Node** loc = cache()->FindExternalConstant(reference);
|
| - if (*loc == NULL) {
|
| - *loc = graph()->NewNode(common()->ExternalConstant(reference));
|
| - }
|
| - return *loc;
|
| -}
|
| -
|
| -
|
| -Node* ChangeLoweringBase::HeapConstant(PrintableUnique<HeapObject> value) {
|
| - // TODO(bmeurer): Use common node cache.
|
| - return graph()->NewNode(common()->HeapConstant(value));
|
| -}
|
| -
|
| -
|
| -Node* ChangeLoweringBase::ImmovableHeapConstant(Handle<HeapObject> value) {
|
| - return HeapConstant(
|
| - PrintableUnique<HeapObject>::CreateImmovable(graph()->zone(), value));
|
| -}
|
| -
|
| -
|
| -Node* ChangeLoweringBase::Int32Constant(int32_t value) {
|
| - Node** loc = cache()->FindInt32Constant(value);
|
| - if (*loc == NULL) {
|
| - *loc = graph()->NewNode(common()->Int32Constant(value));
|
| - }
|
| - return *loc;
|
| -}
|
| -
|
| -
|
| -Node* ChangeLoweringBase::NumberConstant(double value) {
|
| - Node** loc = cache()->FindNumberConstant(value);
|
| - if (*loc == NULL) {
|
| - *loc = graph()->NewNode(common()->NumberConstant(value));
|
| - }
|
| - return *loc;
|
| -}
|
| -
|
| -
|
| -Node* ChangeLoweringBase::CEntryStubConstant() {
|
| - if (!c_entry_stub_constant_.is_set()) {
|
| - c_entry_stub_constant_.set(
|
| - ImmovableHeapConstant(CEntryStub(isolate(), 1).GetCode()));
|
| +Reduction ChangeLowering::Reduce(Node* node) {
|
| + Node* control = graph()->start();
|
| + Node* effect = control;
|
| + switch (node->opcode()) {
|
| + case IrOpcode::kChangeBitToBool:
|
| + return ChangeBitToBool(node->InputAt(0), control);
|
| + case IrOpcode::kChangeBoolToBit:
|
| + return ChangeBoolToBit(node->InputAt(0));
|
| + case IrOpcode::kChangeInt32ToTagged:
|
| + return ChangeInt32ToTagged(node->InputAt(0), effect, control);
|
| + case IrOpcode::kChangeTaggedToFloat64:
|
| + return ChangeTaggedToFloat64(node->InputAt(0), effect, control);
|
| + default:
|
| + return NoChange();
|
| }
|
| - return c_entry_stub_constant_.get();
|
| + UNREACHABLE();
|
| + return NoChange();
|
| }
|
|
|
|
|
| -Node* ChangeLoweringBase::TrueConstant() {
|
| - if (!true_constant_.is_set()) {
|
| - true_constant_.set(
|
| - ImmovableHeapConstant(isolate()->factory()->true_value()));
|
| - }
|
| - return true_constant_.get();
|
| +Node* ChangeLowering::HeapNumberValueIndexConstant() {
|
| + STATIC_ASSERT(HeapNumber::kValueOffset % kPointerSize == 0);
|
| + const int heap_number_value_offset =
|
| + ((HeapNumber::kValueOffset / kPointerSize) * (machine()->is64() ? 8 : 4));
|
| + return jsgraph()->Int32Constant(heap_number_value_offset - kHeapObjectTag);
|
| }
|
|
|
|
|
| -Node* ChangeLoweringBase::FalseConstant() {
|
| - if (!false_constant_.is_set()) {
|
| - false_constant_.set(
|
| - ImmovableHeapConstant(isolate()->factory()->false_value()));
|
| - }
|
| - return false_constant_.get();
|
| +Node* ChangeLowering::SmiShiftBitsConstant() {
|
| + const int smi_shift_size = (machine()->is64() ? SmiTagging<8>::kSmiShiftSize
|
| + : SmiTagging<4>::kSmiShiftSize);
|
| + return jsgraph()->Int32Constant(smi_shift_size + kSmiTagSize);
|
| }
|
|
|
|
|
| -Reduction ChangeLoweringBase::ChangeBitToBool(Node* val, Node* control) {
|
| +Reduction ChangeLowering::ChangeBitToBool(Node* val, Node* control) {
|
| Node* branch = graph()->NewNode(common()->Branch(), val, control);
|
|
|
| Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
|
| - Node* true_value = TrueConstant();
|
| + Node* true_value = jsgraph()->TrueConstant();
|
|
|
| Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
|
| - Node* false_value = FalseConstant();
|
| + Node* false_value = jsgraph()->FalseConstant();
|
|
|
| Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
|
| Node* phi =
|
| @@ -107,51 +65,20 @@ Reduction ChangeLoweringBase::ChangeBitToBool(Node* val, Node* control) {
|
| }
|
|
|
|
|
| -template <size_t kPointerSize>
|
| -ChangeLowering<kPointerSize>::ChangeLowering(Graph* graph, Linkage* linkage)
|
| - : ChangeLoweringBase(graph, linkage,
|
| - new (graph->zone()) CommonNodeCache(graph->zone())) {}
|
| -
|
| -
|
| -template <size_t kPointerSize>
|
| -Reduction ChangeLowering<kPointerSize>::Reduce(Node* node) {
|
| - Node* control = graph()->start();
|
| - Node* effect = control;
|
| - switch (node->opcode()) {
|
| - case IrOpcode::kChangeBitToBool:
|
| - return ChangeBitToBool(node->InputAt(0), control);
|
| - case IrOpcode::kChangeBoolToBit:
|
| - return ChangeBoolToBit(node->InputAt(0));
|
| - case IrOpcode::kChangeInt32ToTagged:
|
| - return ChangeInt32ToTagged(node->InputAt(0), effect, control);
|
| - case IrOpcode::kChangeTaggedToFloat64:
|
| - return ChangeTaggedToFloat64(node->InputAt(0), effect, control);
|
| - default:
|
| - return NoChange();
|
| - }
|
| - UNREACHABLE();
|
| - return NoChange();
|
| -}
|
| -
|
| -
|
| -template <>
|
| -Reduction ChangeLowering<4>::ChangeBoolToBit(Node* val) {
|
| +Reduction ChangeLowering::ChangeBoolToBit(Node* val) {
|
| return Replace(
|
| - graph()->NewNode(machine()->Word32Equal(), val, TrueConstant()));
|
| + graph()->NewNode(machine()->WordEqual(), val, jsgraph()->TrueConstant()));
|
| }
|
|
|
|
|
| -template <>
|
| -Reduction ChangeLowering<8>::ChangeBoolToBit(Node* val) {
|
| - return Replace(
|
| - graph()->NewNode(machine()->Word64Equal(), val, TrueConstant()));
|
| -}
|
| -
|
| +Reduction ChangeLowering::ChangeInt32ToTagged(Node* val, Node* effect,
|
| + Node* control) {
|
| + if (machine()->is64()) {
|
| + return Replace(
|
| + graph()->NewNode(machine()->WordShl(), val, SmiShiftBitsConstant()));
|
| + }
|
|
|
| -template <>
|
| -Reduction ChangeLowering<4>::ChangeInt32ToTagged(Node* val, Node* effect,
|
| - Node* control) {
|
| - Node* context = NumberConstant(0);
|
| + Node* context = jsgraph()->SmiConstant(0);
|
|
|
| Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(), val, val);
|
| Node* ovf = graph()->NewNode(common()->Projection(1), add);
|
| @@ -167,15 +94,14 @@ Reduction ChangeLowering<4>::ChangeInt32ToTagged(Node* val, Node* effect,
|
| DCHECK_EQ(0, fn->nargs);
|
| CallDescriptor* desc = linkage()->GetRuntimeCallDescriptor(
|
| fn->function_id, 0, Operator::kNoProperties);
|
| - Node* heap_number =
|
| - graph()->NewNode(common()->Call(desc), CEntryStubConstant(),
|
| - ExternalConstant(ExternalReference(fn, isolate())),
|
| - Int32Constant(0), context, effect, if_true);
|
| + Node* heap_number = graph()->NewNode(
|
| + common()->Call(desc), jsgraph()->CEntryStubConstant(),
|
| + jsgraph()->ExternalConstant(ExternalReference(fn, isolate())),
|
| + jsgraph()->ZeroConstant(), context, effect, if_true);
|
|
|
| Node* store = graph()->NewNode(
|
| machine()->Store(kMachFloat64, kNoWriteBarrier), heap_number,
|
| - Int32Constant(HeapNumber::kValueOffset - kHeapObjectTag), number, effect,
|
| - heap_number);
|
| + HeapNumberValueIndexConstant(), number, effect, heap_number);
|
|
|
| Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
|
| Node* smi = graph()->NewNode(common()->Projection(0), add);
|
| @@ -187,34 +113,26 @@ Reduction ChangeLowering<4>::ChangeInt32ToTagged(Node* val, Node* effect,
|
| }
|
|
|
|
|
| -template <>
|
| -Reduction ChangeLowering<8>::ChangeInt32ToTagged(Node* val, Node* effect,
|
| - Node* control) {
|
| - return Replace(graph()->NewNode(
|
| - machine()->Word64Shl(), val,
|
| - Int32Constant(SmiTagging<8>::kSmiShiftSize + kSmiTagSize)));
|
| -}
|
| -
|
| +Reduction ChangeLowering::ChangeTaggedToFloat64(Node* val, Node* effect,
|
| + Node* control) {
|
| + STATIC_ASSERT(kSmiTagMask == 1);
|
|
|
| -template <>
|
| -Reduction ChangeLowering<4>::ChangeTaggedToFloat64(Node* val, Node* effect,
|
| - Node* control) {
|
| - Node* branch = graph()->NewNode(
|
| - common()->Branch(),
|
| - graph()->NewNode(machine()->Word32And(), val, Int32Constant(kSmiTagMask)),
|
| - control);
|
| + Node* tag = graph()->NewNode(machine()->WordAnd(), val,
|
| + jsgraph()->Int32Constant(kSmiTagMask));
|
| + Node* branch = graph()->NewNode(common()->Branch(), tag, control);
|
|
|
| Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
|
| - Node* load = graph()->NewNode(
|
| - machine()->Load(kMachFloat64), val,
|
| - Int32Constant(HeapNumber::kValueOffset - kHeapObjectTag), if_true);
|
| + Node* load = graph()->NewNode(machine()->Load(kMachFloat64), val,
|
| + HeapNumberValueIndexConstant(), if_true);
|
|
|
| Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
|
| + Node* integer =
|
| + graph()->NewNode(machine()->WordSar(), val, SmiShiftBitsConstant());
|
| Node* number = graph()->NewNode(
|
| machine()->ChangeInt32ToFloat64(),
|
| - graph()->NewNode(
|
| - machine()->Word32Sar(), val,
|
| - Int32Constant(SmiTagging<4>::kSmiShiftSize + kSmiTagSize)));
|
| + machine()->is64()
|
| + ? graph()->NewNode(machine()->ConvertInt64ToInt32(), integer)
|
| + : integer);
|
|
|
| Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
|
| Node* phi = graph()->NewNode(common()->Phi(2), load, number, merge);
|
| @@ -223,38 +141,16 @@ Reduction ChangeLowering<4>::ChangeTaggedToFloat64(Node* val, Node* effect,
|
| }
|
|
|
|
|
| -template <>
|
| -Reduction ChangeLowering<8>::ChangeTaggedToFloat64(Node* val, Node* effect,
|
| - Node* control) {
|
| - Node* branch = graph()->NewNode(
|
| - common()->Branch(),
|
| - graph()->NewNode(machine()->Word64And(), val, Int32Constant(kSmiTagMask)),
|
| - control);
|
| +Isolate* ChangeLowering::isolate() const { return jsgraph()->isolate(); }
|
|
|
| - Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
|
| - Node* load = graph()->NewNode(
|
| - machine()->Load(kMachFloat64), val,
|
| - Int32Constant(HeapNumber::kValueOffset - kHeapObjectTag), if_true);
|
|
|
| - Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
|
| - Node* number = graph()->NewNode(
|
| - machine()->ChangeInt32ToFloat64(),
|
| - graph()->NewNode(
|
| - machine()->ConvertInt64ToInt32(),
|
| - graph()->NewNode(
|
| - machine()->Word64Sar(), val,
|
| - Int32Constant(SmiTagging<8>::kSmiShiftSize + kSmiTagSize))));
|
| +Graph* ChangeLowering::graph() const { return jsgraph()->graph(); }
|
|
|
| - Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
|
| - Node* phi = graph()->NewNode(common()->Phi(2), load, number, merge);
|
|
|
| - return Replace(phi);
|
| +CommonOperatorBuilder* ChangeLowering::common() const {
|
| + return jsgraph()->common();
|
| }
|
|
|
| -
|
| -template class ChangeLowering<4>;
|
| -template class ChangeLowering<8>;
|
| -
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|