| Index: src/compiler/simplified-lowering.cc
|
| diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..bf19aec68d28e0e7a3a6fdb6f5fcff8e2caf1ba1
|
| --- /dev/null
|
| +++ b/src/compiler/simplified-lowering.cc
|
| @@ -0,0 +1,217 @@
|
| +// Copyright 2014 the V8 project authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "src/compiler/simplified-lowering.h"
|
| +
|
| +#include "src/compiler/graph-inl.h"
|
| +#include "src/objects.h"
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +namespace compiler {
|
| +
|
| +Node* SimplifiedLowering::DoChangeTaggedToInt32(Node* node, Node* effect,
|
| + Node* control) {
|
| + return node;
|
| +}
|
| +
|
| +
|
| +Node* SimplifiedLowering::DoChangeTaggedToUint32(Node* node, Node* effect,
|
| + Node* control) {
|
| + return node;
|
| +}
|
| +
|
| +
|
| +Node* SimplifiedLowering::DoChangeTaggedToFloat64(Node* node, Node* effect,
|
| + Node* control) {
|
| + return node;
|
| +}
|
| +
|
| +
|
| +Node* SimplifiedLowering::DoChangeInt32ToTagged(Node* node, Node* effect,
|
| + Node* control) {
|
| + return node;
|
| +}
|
| +
|
| +
|
| +Node* SimplifiedLowering::DoChangeUint32ToTagged(Node* node, Node* effect,
|
| + Node* control) {
|
| + return node;
|
| +}
|
| +
|
| +
|
| +Node* SimplifiedLowering::DoChangeFloat64ToTagged(Node* node, Node* effect,
|
| + Node* control) {
|
| + return node;
|
| +}
|
| +
|
| +
|
| +Node* SimplifiedLowering::DoChangeBoolToBit(Node* node, Node* effect,
|
| + Node* control) {
|
| + Node* val = node->InputAt(0);
|
| + Operator* op = machine()->WordEqual();
|
| + return graph()->NewNode(op, val, jsgraph()->TrueConstant());
|
| +}
|
| +
|
| +
|
| +Node* SimplifiedLowering::DoChangeBitToBool(Node* node, Node* effect,
|
| + Node* control) {
|
| + return node;
|
| +}
|
| +
|
| +
|
| +static WriteBarrierKind ComputeWriteBarrierKind(
|
| + MachineRepresentation representation, Type* type) {
|
| + // TODO(turbofan): skip write barriers for Smis, etc.
|
| + if (representation == kMachineTagged) {
|
| + return kFullWriteBarrier;
|
| + }
|
| + return kNoWriteBarrier;
|
| +}
|
| +
|
| +
|
| +Node* SimplifiedLowering::DoLoadField(Node* node, Node* effect, Node* control) {
|
| + const FieldAccess& access = FieldAccessOf(node->op());
|
| + node->set_op(machine_.Load(access.representation));
|
| + Node* offset =
|
| + graph()->NewNode(common()->Int32Constant(access.offset - kHeapObjectTag));
|
| + node->InsertInput(zone(), 1, offset);
|
| + return node;
|
| +}
|
| +
|
| +
|
| +Node* SimplifiedLowering::DoStoreField(Node* node, Node* effect,
|
| + Node* control) {
|
| + const FieldAccess& access = FieldAccessOf(node->op());
|
| + WriteBarrierKind kind =
|
| + ComputeWriteBarrierKind(access.representation, access.type);
|
| + node->set_op(machine_.Store(access.representation, kind));
|
| + Node* offset =
|
| + graph()->NewNode(common()->Int32Constant(access.offset - kHeapObjectTag));
|
| + node->InsertInput(zone(), 1, offset);
|
| + return node;
|
| +}
|
| +
|
| +
|
| +Node* SimplifiedLowering::ComputeIndex(const ElementAccess& access,
|
| + Node* index) {
|
| + int element_size = 0;
|
| + switch (access.representation) {
|
| + case kMachineTagged:
|
| + element_size = kPointerSize;
|
| + break;
|
| + case kMachineWord8:
|
| + element_size = 1;
|
| + break;
|
| + case kMachineWord16:
|
| + element_size = 2;
|
| + break;
|
| + case kMachineWord32:
|
| + element_size = 4;
|
| + break;
|
| + case kMachineWord64:
|
| + case kMachineFloat64:
|
| + element_size = 8;
|
| + break;
|
| + case kMachineLast:
|
| + UNREACHABLE();
|
| + break;
|
| + }
|
| + if (element_size != 1) {
|
| + index = graph()->NewNode(
|
| + machine()->Int32Mul(),
|
| + graph()->NewNode(common()->Int32Constant(element_size)), index);
|
| + }
|
| + int fixed_offset = access.header_size - kHeapObjectTag;
|
| + if (fixed_offset == 0) return index;
|
| + return graph()->NewNode(
|
| + machine()->Int32Add(),
|
| + graph()->NewNode(common()->Int32Constant(fixed_offset)), index);
|
| +}
|
| +
|
| +
|
| +Node* SimplifiedLowering::DoLoadElement(Node* node, Node* effect,
|
| + Node* control) {
|
| + const ElementAccess& access = ElementAccessOf(node->op());
|
| + node->set_op(machine_.Load(access.representation));
|
| + node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1)));
|
| + return node;
|
| +}
|
| +
|
| +
|
| +Node* SimplifiedLowering::DoStoreElement(Node* node, Node* effect,
|
| + Node* control) {
|
| + const ElementAccess& access = ElementAccessOf(node->op());
|
| + WriteBarrierKind kind =
|
| + ComputeWriteBarrierKind(access.representation, access.type);
|
| + node->set_op(machine_.Store(access.representation, kind));
|
| + node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1)));
|
| + return node;
|
| +}
|
| +
|
| +
|
| +void SimplifiedLowering::Lower(Node* node) {
|
| + Node* start = graph()->start();
|
| + switch (node->opcode()) {
|
| + case IrOpcode::kBooleanNot:
|
| + case IrOpcode::kNumberEqual:
|
| + case IrOpcode::kNumberLessThan:
|
| + case IrOpcode::kNumberLessThanOrEqual:
|
| + case IrOpcode::kNumberAdd:
|
| + case IrOpcode::kNumberSubtract:
|
| + case IrOpcode::kNumberMultiply:
|
| + case IrOpcode::kNumberDivide:
|
| + case IrOpcode::kNumberModulus:
|
| + case IrOpcode::kNumberToInt32:
|
| + case IrOpcode::kNumberToUint32:
|
| + case IrOpcode::kReferenceEqual:
|
| + case IrOpcode::kStringEqual:
|
| + case IrOpcode::kStringLessThan:
|
| + case IrOpcode::kStringLessThanOrEqual:
|
| + case IrOpcode::kStringAdd:
|
| + break;
|
| + case IrOpcode::kChangeTaggedToInt32:
|
| + DoChangeTaggedToInt32(node, start, start);
|
| + break;
|
| + case IrOpcode::kChangeTaggedToUint32:
|
| + DoChangeTaggedToUint32(node, start, start);
|
| + break;
|
| + case IrOpcode::kChangeTaggedToFloat64:
|
| + DoChangeTaggedToFloat64(node, start, start);
|
| + break;
|
| + case IrOpcode::kChangeInt32ToTagged:
|
| + DoChangeInt32ToTagged(node, start, start);
|
| + break;
|
| + case IrOpcode::kChangeUint32ToTagged:
|
| + DoChangeUint32ToTagged(node, start, start);
|
| + break;
|
| + case IrOpcode::kChangeFloat64ToTagged:
|
| + DoChangeFloat64ToTagged(node, start, start);
|
| + break;
|
| + case IrOpcode::kChangeBoolToBit:
|
| + node->ReplaceUses(DoChangeBoolToBit(node, start, start));
|
| + break;
|
| + case IrOpcode::kChangeBitToBool:
|
| + DoChangeBitToBool(node, start, start);
|
| + break;
|
| + case IrOpcode::kLoadField:
|
| + DoLoadField(node, start, start);
|
| + break;
|
| + case IrOpcode::kStoreField:
|
| + DoStoreField(node, start, start);
|
| + break;
|
| + case IrOpcode::kLoadElement:
|
| + DoLoadElement(node, start, start);
|
| + break;
|
| + case IrOpcode::kStoreElement:
|
| + DoStoreElement(node, start, start);
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| +}
|
| +
|
| +} // namespace compiler
|
| +} // namespace internal
|
| +} // namespace v8
|
|
|