OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/instruction-selector.h" | 5 #include "src/compiler/instruction-selector.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/base/adapters.h" | 9 #include "src/base/adapters.h" |
10 #include "src/compiler/compiler-source-position-table.h" | 10 #include "src/compiler/compiler-source-position-table.h" |
(...skipping 747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
758 FrameStateType::kArgumentsAdaptor || | 758 FrameStateType::kArgumentsAdaptor || |
759 buffer->frame_state_descriptor->type() == | 759 buffer->frame_state_descriptor->type() == |
760 FrameStateType::kTailCallerFunction)) { | 760 FrameStateType::kTailCallerFunction)) { |
761 frame_state = NodeProperties::GetFrameStateInput(frame_state); | 761 frame_state = NodeProperties::GetFrameStateInput(frame_state); |
762 buffer->frame_state_descriptor = | 762 buffer->frame_state_descriptor = |
763 buffer->frame_state_descriptor->outer_state(); | 763 buffer->frame_state_descriptor->outer_state(); |
764 } | 764 } |
765 } | 765 } |
766 | 766 |
767 int const state_id = sequence()->AddDeoptimizationEntry( | 767 int const state_id = sequence()->AddDeoptimizationEntry( |
768 buffer->frame_state_descriptor, DeoptimizeKind::kEager, | 768 buffer->frame_state_descriptor, DeoptimizeReason::kNoReason); |
769 DeoptimizeReason::kNoReason); | |
770 buffer->instruction_args.push_back(g.TempImmediate(state_id)); | 769 buffer->instruction_args.push_back(g.TempImmediate(state_id)); |
771 | 770 |
772 StateObjectDeduplicator deduplicator(instruction_zone()); | 771 StateObjectDeduplicator deduplicator(instruction_zone()); |
773 | 772 |
774 frame_state_entries = | 773 frame_state_entries = |
775 1 + AddInputsToFrameStateDescriptor( | 774 1 + AddInputsToFrameStateDescriptor( |
776 buffer->frame_state_descriptor, frame_state, &g, &deduplicator, | 775 buffer->frame_state_descriptor, frame_state, &g, &deduplicator, |
777 &buffer->instruction_args, FrameStateInputKind::kStackSlot, | 776 &buffer->instruction_args, FrameStateInputKind::kStackSlot, |
778 instruction_zone()); | 777 instruction_zone()); |
779 | 778 |
(...skipping 1133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1913 | 1912 |
1914 void InstructionSelector::VisitRoundUint64ToFloat32(Node* node) { | 1913 void InstructionSelector::VisitRoundUint64ToFloat32(Node* node) { |
1915 UNIMPLEMENTED(); | 1914 UNIMPLEMENTED(); |
1916 } | 1915 } |
1917 | 1916 |
1918 | 1917 |
1919 void InstructionSelector::VisitRoundUint64ToFloat64(Node* node) { | 1918 void InstructionSelector::VisitRoundUint64ToFloat64(Node* node) { |
1920 UNIMPLEMENTED(); | 1919 UNIMPLEMENTED(); |
1921 } | 1920 } |
1922 | 1921 |
| 1922 |
1923 void InstructionSelector::VisitBitcastFloat64ToInt64(Node* node) { | 1923 void InstructionSelector::VisitBitcastFloat64ToInt64(Node* node) { |
1924 UNIMPLEMENTED(); | 1924 UNIMPLEMENTED(); |
1925 } | 1925 } |
1926 | 1926 |
1927 | 1927 |
1928 void InstructionSelector::VisitBitcastInt64ToFloat64(Node* node) { | 1928 void InstructionSelector::VisitBitcastInt64ToFloat64(Node* node) { |
1929 UNIMPLEMENTED(); | 1929 UNIMPLEMENTED(); |
1930 } | 1930 } |
1931 #endif // V8_TARGET_ARCH_32_BIT | 1931 #endif // V8_TARGET_ARCH_32_BIT |
1932 | 1932 |
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2459 pop_count->opcode() == IrOpcode::kInt64Constant) | 2459 pop_count->opcode() == IrOpcode::kInt64Constant) |
2460 ? g.UseImmediate(pop_count) | 2460 ? g.UseImmediate(pop_count) |
2461 : g.UseRegister(pop_count); | 2461 : g.UseRegister(pop_count); |
2462 for (int i = 1; i < input_count; ++i) { | 2462 for (int i = 1; i < input_count; ++i) { |
2463 value_locations[i] = | 2463 value_locations[i] = |
2464 g.UseLocation(ret->InputAt(i), linkage()->GetReturnLocation(i - 1)); | 2464 g.UseLocation(ret->InputAt(i), linkage()->GetReturnLocation(i - 1)); |
2465 } | 2465 } |
2466 Emit(kArchRet, 0, nullptr, input_count, value_locations); | 2466 Emit(kArchRet, 0, nullptr, input_count, value_locations); |
2467 } | 2467 } |
2468 | 2468 |
| 2469 Instruction* InstructionSelector::EmitDeoptimize(InstructionCode opcode, |
| 2470 InstructionOperand output, |
| 2471 InstructionOperand a, |
| 2472 DeoptimizeReason reason, |
| 2473 Node* frame_state) { |
| 2474 size_t output_count = output.IsInvalid() ? 0 : 1; |
| 2475 InstructionOperand inputs[] = {a}; |
| 2476 size_t input_count = arraysize(inputs); |
| 2477 return EmitDeoptimize(opcode, output_count, &output, input_count, inputs, |
| 2478 reason, frame_state); |
| 2479 } |
| 2480 |
2469 Instruction* InstructionSelector::EmitDeoptimize( | 2481 Instruction* InstructionSelector::EmitDeoptimize( |
2470 InstructionCode opcode, InstructionOperand output, InstructionOperand a, | 2482 InstructionCode opcode, InstructionOperand output, InstructionOperand a, |
2471 DeoptimizeKind kind, DeoptimizeReason reason, Node* frame_state) { | 2483 InstructionOperand b, DeoptimizeReason reason, Node* frame_state) { |
2472 size_t output_count = output.IsInvalid() ? 0 : 1; | |
2473 InstructionOperand inputs[] = {a}; | |
2474 size_t input_count = arraysize(inputs); | |
2475 return EmitDeoptimize(opcode, output_count, &output, input_count, inputs, | |
2476 kind, reason, frame_state); | |
2477 } | |
2478 | |
2479 Instruction* InstructionSelector::EmitDeoptimize( | |
2480 InstructionCode opcode, InstructionOperand output, InstructionOperand a, | |
2481 InstructionOperand b, DeoptimizeKind kind, DeoptimizeReason reason, | |
2482 Node* frame_state) { | |
2483 size_t output_count = output.IsInvalid() ? 0 : 1; | 2484 size_t output_count = output.IsInvalid() ? 0 : 1; |
2484 InstructionOperand inputs[] = {a, b}; | 2485 InstructionOperand inputs[] = {a, b}; |
2485 size_t input_count = arraysize(inputs); | 2486 size_t input_count = arraysize(inputs); |
2486 return EmitDeoptimize(opcode, output_count, &output, input_count, inputs, | 2487 return EmitDeoptimize(opcode, output_count, &output, input_count, inputs, |
2487 kind, reason, frame_state); | 2488 reason, frame_state); |
2488 } | 2489 } |
2489 | 2490 |
2490 Instruction* InstructionSelector::EmitDeoptimize( | 2491 Instruction* InstructionSelector::EmitDeoptimize( |
2491 InstructionCode opcode, size_t output_count, InstructionOperand* outputs, | 2492 InstructionCode opcode, size_t output_count, InstructionOperand* outputs, |
2492 size_t input_count, InstructionOperand* inputs, DeoptimizeKind kind, | 2493 size_t input_count, InstructionOperand* inputs, DeoptimizeReason reason, |
2493 DeoptimizeReason reason, Node* frame_state) { | 2494 Node* frame_state) { |
2494 OperandGenerator g(this); | 2495 OperandGenerator g(this); |
2495 FrameStateDescriptor* const descriptor = GetFrameStateDescriptor(frame_state); | 2496 FrameStateDescriptor* const descriptor = GetFrameStateDescriptor(frame_state); |
2496 InstructionOperandVector args(instruction_zone()); | 2497 InstructionOperandVector args(instruction_zone()); |
2497 args.reserve(input_count + 1 + descriptor->GetTotalSize()); | 2498 args.reserve(input_count + 1 + descriptor->GetTotalSize()); |
2498 for (size_t i = 0; i < input_count; ++i) { | 2499 for (size_t i = 0; i < input_count; ++i) { |
2499 args.push_back(inputs[i]); | 2500 args.push_back(inputs[i]); |
2500 } | 2501 } |
2501 opcode |= MiscField::encode(static_cast<int>(input_count)); | 2502 opcode |= MiscField::encode(static_cast<int>(input_count)); |
2502 int const state_id = | 2503 int const state_id = sequence()->AddDeoptimizationEntry(descriptor, reason); |
2503 sequence()->AddDeoptimizationEntry(descriptor, kind, reason); | |
2504 args.push_back(g.TempImmediate(state_id)); | 2504 args.push_back(g.TempImmediate(state_id)); |
2505 StateObjectDeduplicator deduplicator(instruction_zone()); | 2505 StateObjectDeduplicator deduplicator(instruction_zone()); |
2506 AddInputsToFrameStateDescriptor(descriptor, frame_state, &g, &deduplicator, | 2506 AddInputsToFrameStateDescriptor(descriptor, frame_state, &g, &deduplicator, |
2507 &args, FrameStateInputKind::kAny, | 2507 &args, FrameStateInputKind::kAny, |
2508 instruction_zone()); | 2508 instruction_zone()); |
2509 return Emit(opcode, output_count, outputs, args.size(), &args.front(), 0, | 2509 return Emit(opcode, output_count, outputs, args.size(), &args.front(), 0, |
2510 nullptr); | 2510 nullptr); |
2511 } | 2511 } |
2512 | 2512 |
2513 void InstructionSelector::EmitIdentity(Node* node) { | 2513 void InstructionSelector::EmitIdentity(Node* node) { |
2514 OperandGenerator g(this); | 2514 OperandGenerator g(this); |
2515 MarkAsUsed(node->InputAt(0)); | 2515 MarkAsUsed(node->InputAt(0)); |
2516 SetRename(node, node->InputAt(0)); | 2516 SetRename(node, node->InputAt(0)); |
2517 } | 2517 } |
2518 | 2518 |
2519 void InstructionSelector::VisitDeoptimize(DeoptimizeKind kind, | 2519 void InstructionSelector::VisitDeoptimize(DeoptimizeKind kind, |
2520 DeoptimizeReason reason, | 2520 DeoptimizeReason reason, |
2521 Node* value) { | 2521 Node* value) { |
2522 EmitDeoptimize(kArchDeoptimize, 0, nullptr, 0, nullptr, kind, reason, value); | 2522 InstructionCode opcode = kArchDeoptimize; |
| 2523 switch (kind) { |
| 2524 case DeoptimizeKind::kEager: |
| 2525 opcode |= MiscField::encode(Deoptimizer::EAGER); |
| 2526 break; |
| 2527 case DeoptimizeKind::kSoft: |
| 2528 opcode |= MiscField::encode(Deoptimizer::SOFT); |
| 2529 break; |
| 2530 } |
| 2531 EmitDeoptimize(opcode, 0, nullptr, 0, nullptr, reason, value); |
2523 } | 2532 } |
2524 | 2533 |
2525 | 2534 |
2526 void InstructionSelector::VisitThrow(Node* value) { | 2535 void InstructionSelector::VisitThrow(Node* value) { |
2527 OperandGenerator g(this); | 2536 OperandGenerator g(this); |
2528 Emit(kArchThrowTerminator, g.NoOutput()); | 2537 Emit(kArchThrowTerminator, g.NoOutput()); |
2529 } | 2538 } |
2530 | 2539 |
2531 void InstructionSelector::VisitDebugBreak(Node* node) { | 2540 void InstructionSelector::VisitDebugBreak(Node* node) { |
2532 OperandGenerator g(this); | 2541 OperandGenerator g(this); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2587 return new (instruction_zone()) FrameStateDescriptor( | 2596 return new (instruction_zone()) FrameStateDescriptor( |
2588 instruction_zone(), state_info.type(), state_info.bailout_id(), | 2597 instruction_zone(), state_info.type(), state_info.bailout_id(), |
2589 state_info.state_combine(), parameters, locals, stack, | 2598 state_info.state_combine(), parameters, locals, stack, |
2590 state_info.shared_info(), outer_state); | 2599 state_info.shared_info(), outer_state); |
2591 } | 2600 } |
2592 | 2601 |
2593 | 2602 |
2594 } // namespace compiler | 2603 } // namespace compiler |
2595 } // namespace internal | 2604 } // namespace internal |
2596 } // namespace v8 | 2605 } // namespace v8 |
OLD | NEW |