OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |