Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(178)

Side by Side Diff: src/full-codegen/ppc/full-codegen-ppc.cc

Issue 1669373002: PPC: [fullcode] Change fullcode to compile finally using the token approach. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #if V8_TARGET_ARCH_PPC 5 #if V8_TARGET_ARCH_PPC
6 6
7 #include "src/ast/scopes.h" 7 #include "src/ast/scopes.h"
8 #include "src/code-factory.h" 8 #include "src/code-factory.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 4524 matching lines...) Expand 10 before | Expand all | Expand 10 after
4535 } 4535 }
4536 __ push(ip); 4536 __ push(ip);
4537 } 4537 }
4538 4538
4539 4539
4540 // ---------------------------------------------------------------------------- 4540 // ----------------------------------------------------------------------------
4541 // Non-local control flow support. 4541 // Non-local control flow support.
4542 4542
4543 void FullCodeGenerator::EnterFinallyBlock() { 4543 void FullCodeGenerator::EnterFinallyBlock() {
4544 DCHECK(!result_register().is(r4)); 4544 DCHECK(!result_register().is(r4));
4545 // Store result register while executing finally block.
4546 __ push(result_register());
4547 // Cook return address in link register to stack (smi encoded Code* delta)
4548 __ mflr(r4);
4549 __ mov(ip, Operand(masm_->CodeObject()));
4550 __ sub(r4, r4, ip);
4551 __ SmiTag(r4);
4552
4553 // Store result register while executing finally block.
4554 __ push(r4);
4555
4556 // Store pending message while executing finally block. 4545 // Store pending message while executing finally block.
4557 ExternalReference pending_message_obj = 4546 ExternalReference pending_message_obj =
4558 ExternalReference::address_of_pending_message_obj(isolate()); 4547 ExternalReference::address_of_pending_message_obj(isolate());
4559 __ mov(ip, Operand(pending_message_obj)); 4548 __ mov(ip, Operand(pending_message_obj));
4560 __ LoadP(r4, MemOperand(ip)); 4549 __ LoadP(r4, MemOperand(ip));
4561 __ push(r4); 4550 __ push(r4);
4562 4551
4563 ClearPendingMessage(); 4552 ClearPendingMessage();
4564 } 4553 }
4565 4554
4566 4555
4567 void FullCodeGenerator::ExitFinallyBlock() { 4556 void FullCodeGenerator::ExitFinallyBlock() {
4568 DCHECK(!result_register().is(r4)); 4557 DCHECK(!result_register().is(r4));
4569 // Restore pending message from stack. 4558 // Restore pending message from stack.
4570 __ pop(r4); 4559 __ pop(r4);
4571 ExternalReference pending_message_obj = 4560 ExternalReference pending_message_obj =
4572 ExternalReference::address_of_pending_message_obj(isolate()); 4561 ExternalReference::address_of_pending_message_obj(isolate());
4573 __ mov(ip, Operand(pending_message_obj)); 4562 __ mov(ip, Operand(pending_message_obj));
4574 __ StoreP(r4, MemOperand(ip)); 4563 __ StoreP(r4, MemOperand(ip));
4575
4576 // Restore result register from stack.
4577 __ pop(r4);
4578
4579 // Uncook return address and return.
4580 __ pop(result_register());
4581 __ SmiUntag(r4);
4582 __ mov(ip, Operand(masm_->CodeObject()));
4583 __ add(ip, ip, r4);
4584 __ mtctr(ip);
4585 __ bctr();
4586 } 4564 }
4587 4565
4588 4566
4589 void FullCodeGenerator::ClearPendingMessage() { 4567 void FullCodeGenerator::ClearPendingMessage() {
4590 DCHECK(!result_register().is(r4)); 4568 DCHECK(!result_register().is(r4));
4591 ExternalReference pending_message_obj = 4569 ExternalReference pending_message_obj =
4592 ExternalReference::address_of_pending_message_obj(isolate()); 4570 ExternalReference::address_of_pending_message_obj(isolate());
4593 __ LoadRoot(r4, Heap::kTheHoleValueRootIndex); 4571 __ LoadRoot(r4, Heap::kTheHoleValueRootIndex);
4594 __ mov(ip, Operand(pending_message_obj)); 4572 __ mov(ip, Operand(pending_message_obj));
4595 __ StoreP(r4, MemOperand(ip)); 4573 __ StoreP(r4, MemOperand(ip));
4596 } 4574 }
4597 4575
4598 4576
4599 void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorSlot slot) { 4577 void FullCodeGenerator::EmitLoadStoreICSlot(FeedbackVectorSlot slot) {
4600 DCHECK(!slot.IsInvalid()); 4578 DCHECK(!slot.IsInvalid());
4601 __ mov(VectorStoreICTrampolineDescriptor::SlotRegister(), 4579 __ mov(VectorStoreICTrampolineDescriptor::SlotRegister(),
4602 Operand(SmiFromSlot(slot))); 4580 Operand(SmiFromSlot(slot)));
4603 } 4581 }
4604 4582
4583 void FullCodeGenerator::DeferredCommands::EmitCommands() {
4584 DCHECK(!result_register().is(r4));
4585 // Restore the accumulator (r3) and token (r4).
4586 __ Pop(r4, result_register());
4587 for (DeferredCommand cmd : commands_) {
4588 Label skip;
4589 __ CmpSmiLiteral(r4, Smi::FromInt(cmd.token), r0);
4590 __ bne(&skip);
4591 switch (cmd.command) {
4592 case kReturn:
4593 codegen_->EmitUnwindAndReturn();
4594 break;
4595 case kThrow:
4596 __ Push(result_register());
4597 __ CallRuntime(Runtime::kReThrow);
4598 break;
4599 case kContinue:
4600 codegen_->EmitContinue(cmd.target);
4601 break;
4602 case kBreak:
4603 codegen_->EmitBreak(cmd.target);
4604 break;
4605 }
4606 __ bind(&skip);
4607 }
4608 }
4605 4609
4606 #undef __ 4610 #undef __
4607 4611
4608 4612
4609 void BackEdgeTable::PatchAt(Code* unoptimized_code, Address pc, 4613 void BackEdgeTable::PatchAt(Code* unoptimized_code, Address pc,
4610 BackEdgeState target_state, 4614 BackEdgeState target_state,
4611 Code* replacement_code) { 4615 Code* replacement_code) {
4612 Address mov_address = Assembler::target_address_from_return_address(pc); 4616 Address mov_address = Assembler::target_address_from_return_address(pc);
4613 Address cmp_address = mov_address - 2 * Assembler::kInstrSize; 4617 Address cmp_address = mov_address - 2 * Assembler::kInstrSize;
4614 Isolate* isolate = unoptimized_code->GetIsolate(); 4618 Isolate* isolate = unoptimized_code->GetIsolate();
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
4671 return ON_STACK_REPLACEMENT; 4675 return ON_STACK_REPLACEMENT;
4672 } 4676 }
4673 4677
4674 DCHECK(interrupt_address == 4678 DCHECK(interrupt_address ==
4675 isolate->builtins()->OsrAfterStackCheck()->entry()); 4679 isolate->builtins()->OsrAfterStackCheck()->entry());
4676 return OSR_AFTER_STACK_CHECK; 4680 return OSR_AFTER_STACK_CHECK;
4677 } 4681 }
4678 } // namespace internal 4682 } // namespace internal
4679 } // namespace v8 4683 } // namespace v8
4680 #endif // V8_TARGET_ARCH_PPC 4684 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698