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

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

Issue 1178363002: Vector ICs: Turbofan vector store ic support (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix mips64 compile error. Created 5 years, 6 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 | « src/mips/full-codegen-mips.cc ('k') | src/x64/full-codegen-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_MIPS64 7 #if V8_TARGET_ARCH_MIPS64
8 8
9 // Note on Mips implementation: 9 // Note on Mips implementation:
10 // 10 //
(...skipping 2507 matching lines...) Expand 10 before | Expand all | Expand 10 after
2518 break; 2518 break;
2519 default: 2519 default:
2520 UNREACHABLE(); 2520 UNREACHABLE();
2521 } 2521 }
2522 2522
2523 __ bind(&done); 2523 __ bind(&done);
2524 context()->Plug(v0); 2524 context()->Plug(v0);
2525 } 2525 }
2526 2526
2527 2527
2528 void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) { 2528 void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit,
2529 int* used_store_slots) {
2529 // Constructor is in v0. 2530 // Constructor is in v0.
2530 DCHECK(lit != NULL); 2531 DCHECK(lit != NULL);
2531 __ push(v0); 2532 __ push(v0);
2532 2533
2533 // No access check is needed here since the constructor is created by the 2534 // No access check is needed here since the constructor is created by the
2534 // class literal. 2535 // class literal.
2535 Register scratch = a1; 2536 Register scratch = a1;
2536 __ ld(scratch, 2537 __ ld(scratch,
2537 FieldMemOperand(v0, JSFunction::kPrototypeOrInitialMapOffset)); 2538 FieldMemOperand(v0, JSFunction::kPrototypeOrInitialMapOffset));
2538 __ push(scratch); 2539 __ push(scratch);
2539 2540
2540 // store_slot_index points to the vector IC slot for the next store IC used.
2541 // ClassLiteral::ComputeFeedbackRequirements controls the allocation of slots
2542 // and must be updated if the number of store ICs emitted here changes.
2543 int store_slot_index = 0;
2544 for (int i = 0; i < lit->properties()->length(); i++) { 2541 for (int i = 0; i < lit->properties()->length(); i++) {
2545 ObjectLiteral::Property* property = lit->properties()->at(i); 2542 ObjectLiteral::Property* property = lit->properties()->at(i);
2546 Expression* value = property->value(); 2543 Expression* value = property->value();
2547 2544
2548 if (property->is_static()) { 2545 if (property->is_static()) {
2549 __ ld(scratch, MemOperand(sp, kPointerSize)); // constructor 2546 __ ld(scratch, MemOperand(sp, kPointerSize)); // constructor
2550 } else { 2547 } else {
2551 __ ld(scratch, MemOperand(sp, 0)); // prototype 2548 __ ld(scratch, MemOperand(sp, 0)); // prototype
2552 } 2549 }
2553 __ push(scratch); 2550 __ push(scratch);
2554 EmitPropertyKey(property, lit->GetIdForProperty(i)); 2551 EmitPropertyKey(property, lit->GetIdForProperty(i));
2555 2552
2556 // The static prototype property is read only. We handle the non computed 2553 // The static prototype property is read only. We handle the non computed
2557 // property name case in the parser. Since this is the only case where we 2554 // property name case in the parser. Since this is the only case where we
2558 // need to check for an own read only property we special case this so we do 2555 // need to check for an own read only property we special case this so we do
2559 // not need to do this for every property. 2556 // not need to do this for every property.
2560 if (property->is_static() && property->is_computed_name()) { 2557 if (property->is_static() && property->is_computed_name()) {
2561 __ CallRuntime(Runtime::kThrowIfStaticPrototype, 1); 2558 __ CallRuntime(Runtime::kThrowIfStaticPrototype, 1);
2562 __ push(v0); 2559 __ push(v0);
2563 } 2560 }
2564 2561
2565 VisitForStackValue(value); 2562 VisitForStackValue(value);
2566 EmitSetHomeObjectIfNeeded(value, 2, 2563 EmitSetHomeObjectIfNeeded(value, 2,
2567 lit->SlotForHomeObject(value, &store_slot_index)); 2564 lit->SlotForHomeObject(value, used_store_slots));
2568 2565
2569 switch (property->kind()) { 2566 switch (property->kind()) {
2570 case ObjectLiteral::Property::CONSTANT: 2567 case ObjectLiteral::Property::CONSTANT:
2571 case ObjectLiteral::Property::MATERIALIZED_LITERAL: 2568 case ObjectLiteral::Property::MATERIALIZED_LITERAL:
2572 case ObjectLiteral::Property::PROTOTYPE: 2569 case ObjectLiteral::Property::PROTOTYPE:
2573 UNREACHABLE(); 2570 UNREACHABLE();
2574 case ObjectLiteral::Property::COMPUTED: 2571 case ObjectLiteral::Property::COMPUTED:
2575 __ CallRuntime(Runtime::kDefineClassMethod, 3); 2572 __ CallRuntime(Runtime::kDefineClassMethod, 3);
2576 break; 2573 break;
2577 2574
(...skipping 12 matching lines...) Expand all
2590 default: 2587 default:
2591 UNREACHABLE(); 2588 UNREACHABLE();
2592 } 2589 }
2593 } 2590 }
2594 2591
2595 // prototype 2592 // prototype
2596 __ CallRuntime(Runtime::kToFastProperties, 1); 2593 __ CallRuntime(Runtime::kToFastProperties, 1);
2597 2594
2598 // constructor 2595 // constructor
2599 __ CallRuntime(Runtime::kToFastProperties, 1); 2596 __ CallRuntime(Runtime::kToFastProperties, 1);
2600
2601 // Verify that compilation exactly consumed the number of store ic slots that
2602 // the ClassLiteral node had to offer.
2603 DCHECK(!FLAG_vector_stores || store_slot_index == lit->slot_count());
2604 } 2597 }
2605 2598
2606 2599
2607 void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr, Token::Value op) { 2600 void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr, Token::Value op) {
2608 __ mov(a0, result_register()); 2601 __ mov(a0, result_register());
2609 __ pop(a1); 2602 __ pop(a1);
2610 Handle<Code> code = 2603 Handle<Code> code =
2611 CodeFactory::BinaryOpIC(isolate(), op, strength(language_mode())).code(); 2604 CodeFactory::BinaryOpIC(isolate(), op, strength(language_mode())).code();
2612 JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code. 2605 JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code.
2613 CallIC(code, expr->BinaryOperationFeedbackId()); 2606 CallIC(code, expr->BinaryOperationFeedbackId());
(...skipping 2468 matching lines...) Expand 10 before | Expand all | Expand 10 after
5082 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); 5075 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
5083 context.Plug(v0); 5076 context.Plug(v0);
5084 } 5077 }
5085 // For all contexts except EffectConstant we have the result on 5078 // For all contexts except EffectConstant we have the result on
5086 // top of the stack. 5079 // top of the stack.
5087 if (!context()->IsEffect()) { 5080 if (!context()->IsEffect()) {
5088 context()->PlugTOS(); 5081 context()->PlugTOS();
5089 } 5082 }
5090 } else { 5083 } else {
5091 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), 5084 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(),
5092 Token::ASSIGN); 5085 Token::ASSIGN, expr->CountSlot());
5093 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); 5086 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
5094 context()->Plug(v0); 5087 context()->Plug(v0);
5095 } 5088 }
5096 break; 5089 break;
5097 case NAMED_PROPERTY: { 5090 case NAMED_PROPERTY: {
5098 __ mov(StoreDescriptor::ValueRegister(), result_register()); 5091 __ mov(StoreDescriptor::ValueRegister(), result_register());
5099 __ li(StoreDescriptor::NameRegister(), 5092 __ li(StoreDescriptor::NameRegister(),
5100 Operand(prop->key()->AsLiteral()->value())); 5093 Operand(prop->key()->AsLiteral()->value()));
5101 __ pop(StoreDescriptor::ReceiverRegister()); 5094 __ pop(StoreDescriptor::ReceiverRegister());
5102 if (FLAG_vector_stores) { 5095 if (FLAG_vector_stores) {
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after
5567 reinterpret_cast<uint64_t>( 5560 reinterpret_cast<uint64_t>(
5568 isolate->builtins()->OsrAfterStackCheck()->entry())); 5561 isolate->builtins()->OsrAfterStackCheck()->entry()));
5569 return OSR_AFTER_STACK_CHECK; 5562 return OSR_AFTER_STACK_CHECK;
5570 } 5563 }
5571 5564
5572 5565
5573 } // namespace internal 5566 } // namespace internal
5574 } // namespace v8 5567 } // namespace v8
5575 5568
5576 #endif // V8_TARGET_ARCH_MIPS64 5569 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « src/mips/full-codegen-mips.cc ('k') | src/x64/full-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698