| 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 1668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1679 switch (property->kind()) { | 1679 switch (property->kind()) { |
| 1680 case ObjectLiteral::Property::CONSTANT: | 1680 case ObjectLiteral::Property::CONSTANT: |
| 1681 UNREACHABLE(); | 1681 UNREACHABLE(); |
| 1682 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 1682 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
| 1683 ASSERT(!CompileTimeValue::IsCompileTimeValue(property->value())); | 1683 ASSERT(!CompileTimeValue::IsCompileTimeValue(property->value())); |
| 1684 // Fall through. | 1684 // Fall through. |
| 1685 case ObjectLiteral::Property::COMPUTED: | 1685 case ObjectLiteral::Property::COMPUTED: |
| 1686 if (key->value()->IsInternalizedString()) { | 1686 if (key->value()->IsInternalizedString()) { |
| 1687 if (property->emit_store()) { | 1687 if (property->emit_store()) { |
| 1688 VisitForAccumulatorValue(value); | 1688 VisitForAccumulatorValue(value); |
| 1689 __ mov(a0, result_register()); | 1689 __ mov(StoreIC::ValueRegister(), result_register()); |
| 1690 __ li(a2, Operand(key->value())); | 1690 ASSERT(StoreIC::ValueRegister().is(a0)); |
| 1691 __ ld(a1, MemOperand(sp)); | 1691 __ li(StoreIC::NameRegister(), Operand(key->value())); |
| 1692 __ ld(StoreIC::ReceiverRegister(), MemOperand(sp)); |
| 1692 CallStoreIC(key->LiteralFeedbackId()); | 1693 CallStoreIC(key->LiteralFeedbackId()); |
| 1693 PrepareForBailoutForId(key->id(), NO_REGISTERS); | 1694 PrepareForBailoutForId(key->id(), NO_REGISTERS); |
| 1694 } else { | 1695 } else { |
| 1695 VisitForEffect(value); | 1696 VisitForEffect(value); |
| 1696 } | 1697 } |
| 1697 break; | 1698 break; |
| 1698 } | 1699 } |
| 1699 // Duplicate receiver on stack. | 1700 // Duplicate receiver on stack. |
| 1700 __ ld(a0, MemOperand(sp)); | 1701 __ ld(a0, MemOperand(sp)); |
| 1701 __ push(a0); | 1702 __ push(a0); |
| (...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2402 switch (assign_type) { | 2403 switch (assign_type) { |
| 2403 case VARIABLE: { | 2404 case VARIABLE: { |
| 2404 Variable* var = expr->AsVariableProxy()->var(); | 2405 Variable* var = expr->AsVariableProxy()->var(); |
| 2405 EffectContext context(this); | 2406 EffectContext context(this); |
| 2406 EmitVariableAssignment(var, Token::ASSIGN); | 2407 EmitVariableAssignment(var, Token::ASSIGN); |
| 2407 break; | 2408 break; |
| 2408 } | 2409 } |
| 2409 case NAMED_PROPERTY: { | 2410 case NAMED_PROPERTY: { |
| 2410 __ push(result_register()); // Preserve value. | 2411 __ push(result_register()); // Preserve value. |
| 2411 VisitForAccumulatorValue(prop->obj()); | 2412 VisitForAccumulatorValue(prop->obj()); |
| 2412 __ mov(a1, result_register()); | 2413 __ mov(StoreIC::ReceiverRegister(), result_register()); |
| 2413 __ pop(a0); // Restore value. | 2414 __ pop(StoreIC::ValueRegister()); // Restore value. |
| 2414 __ li(a2, Operand(prop->key()->AsLiteral()->value())); | 2415 __ li(StoreIC::NameRegister(), |
| 2416 Operand(prop->key()->AsLiteral()->value())); |
| 2415 CallStoreIC(); | 2417 CallStoreIC(); |
| 2416 break; | 2418 break; |
| 2417 } | 2419 } |
| 2418 case KEYED_PROPERTY: { | 2420 case KEYED_PROPERTY: { |
| 2419 __ push(result_register()); // Preserve value. | 2421 __ push(result_register()); // Preserve value. |
| 2420 VisitForStackValue(prop->obj()); | 2422 VisitForStackValue(prop->obj()); |
| 2421 VisitForAccumulatorValue(prop->key()); | 2423 VisitForAccumulatorValue(prop->key()); |
| 2422 __ mov(a1, result_register()); | 2424 __ Move(KeyedStoreIC::NameRegister(), result_register()); |
| 2423 __ Pop(a0, a2); // a0 = restored value. | 2425 __ Pop(KeyedStoreIC::ValueRegister(), KeyedStoreIC::ReceiverRegister()); |
| 2424 Handle<Code> ic = strict_mode() == SLOPPY | 2426 Handle<Code> ic = strict_mode() == SLOPPY |
| 2425 ? isolate()->builtins()->KeyedStoreIC_Initialize() | 2427 ? isolate()->builtins()->KeyedStoreIC_Initialize() |
| 2426 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); | 2428 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); |
| 2427 CallIC(ic); | 2429 CallIC(ic); |
| 2428 break; | 2430 break; |
| 2429 } | 2431 } |
| 2430 } | 2432 } |
| 2431 context()->Plug(v0); | 2433 context()->Plug(v0); |
| 2432 } | 2434 } |
| 2433 | 2435 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2450 __ li(a1, Operand(name)); | 2452 __ li(a1, Operand(name)); |
| 2451 __ li(a0, Operand(Smi::FromInt(strict_mode))); | 2453 __ li(a0, Operand(Smi::FromInt(strict_mode))); |
| 2452 __ Push(v0, cp, a1, a0); // Value, context, name, strict mode. | 2454 __ Push(v0, cp, a1, a0); // Value, context, name, strict mode. |
| 2453 __ CallRuntime(Runtime::kStoreContextSlot, 4); | 2455 __ CallRuntime(Runtime::kStoreContextSlot, 4); |
| 2454 } | 2456 } |
| 2455 | 2457 |
| 2456 | 2458 |
| 2457 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op) { | 2459 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op) { |
| 2458 if (var->IsUnallocated()) { | 2460 if (var->IsUnallocated()) { |
| 2459 // Global var, const, or let. | 2461 // Global var, const, or let. |
| 2460 __ mov(a0, result_register()); | 2462 __ mov(StoreIC::ValueRegister(), result_register()); |
| 2461 __ li(a2, Operand(var->name())); | 2463 __ li(StoreIC::NameRegister(), Operand(var->name())); |
| 2462 __ ld(a1, GlobalObjectOperand()); | 2464 __ ld(StoreIC::ReceiverRegister(), GlobalObjectOperand()); |
| 2463 CallStoreIC(); | 2465 CallStoreIC(); |
| 2464 } else if (op == Token::INIT_CONST_LEGACY) { | 2466 } else if (op == Token::INIT_CONST_LEGACY) { |
| 2465 // Const initializers need a write barrier. | 2467 // Const initializers need a write barrier. |
| 2466 ASSERT(!var->IsParameter()); // No const parameters. | 2468 ASSERT(!var->IsParameter()); // No const parameters. |
| 2467 if (var->IsLookupSlot()) { | 2469 if (var->IsLookupSlot()) { |
| 2468 __ li(a0, Operand(var->name())); | 2470 __ li(a0, Operand(var->name())); |
| 2469 __ Push(v0, cp, a0); // Context and name. | 2471 __ Push(v0, cp, a0); // Context and name. |
| 2470 __ CallRuntime(Runtime::kInitializeConstContextSlot, 3); | 2472 __ CallRuntime(Runtime::kInitializeConstContextSlot, 3); |
| 2471 } else { | 2473 } else { |
| 2472 ASSERT(var->IsStackAllocated() || var->IsContextSlot()); | 2474 ASSERT(var->IsStackAllocated() || var->IsContextSlot()); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2520 | 2522 |
| 2521 | 2523 |
| 2522 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { | 2524 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { |
| 2523 // Assignment to a property, using a named store IC. | 2525 // Assignment to a property, using a named store IC. |
| 2524 Property* prop = expr->target()->AsProperty(); | 2526 Property* prop = expr->target()->AsProperty(); |
| 2525 ASSERT(prop != NULL); | 2527 ASSERT(prop != NULL); |
| 2526 ASSERT(prop->key()->IsLiteral()); | 2528 ASSERT(prop->key()->IsLiteral()); |
| 2527 | 2529 |
| 2528 // Record source code position before IC call. | 2530 // Record source code position before IC call. |
| 2529 SetSourcePosition(expr->position()); | 2531 SetSourcePosition(expr->position()); |
| 2530 __ mov(a0, result_register()); // Load the value. | 2532 __ mov(StoreIC::ValueRegister(), result_register()); |
| 2531 __ li(a2, Operand(prop->key()->AsLiteral()->value())); | 2533 __ li(StoreIC::NameRegister(), Operand(prop->key()->AsLiteral()->value())); |
| 2532 __ pop(a1); | 2534 __ pop(StoreIC::ReceiverRegister()); |
| 2533 | |
| 2534 CallStoreIC(expr->AssignmentFeedbackId()); | 2535 CallStoreIC(expr->AssignmentFeedbackId()); |
| 2535 | 2536 |
| 2536 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2537 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 2537 context()->Plug(v0); | 2538 context()->Plug(v0); |
| 2538 } | 2539 } |
| 2539 | 2540 |
| 2540 | 2541 |
| 2541 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2542 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
| 2542 // Assignment to a property, using a keyed store IC. | 2543 // Assignment to a property, using a keyed store IC. |
| 2543 | 2544 |
| 2544 // Record source code position before IC call. | 2545 // Record source code position before IC call. |
| 2545 SetSourcePosition(expr->position()); | 2546 SetSourcePosition(expr->position()); |
| 2546 // Call keyed store IC. | 2547 // Call keyed store IC. |
| 2547 // The arguments are: | 2548 // The arguments are: |
| 2548 // - a0 is the value, | 2549 // - a0 is the value, |
| 2549 // - a1 is the key, | 2550 // - a1 is the key, |
| 2550 // - a2 is the receiver. | 2551 // - a2 is the receiver. |
| 2551 __ mov(a0, result_register()); | 2552 __ mov(KeyedStoreIC::ValueRegister(), result_register()); |
| 2552 __ Pop(a2, a1); // a1 = key. | 2553 __ Pop(KeyedStoreIC::ReceiverRegister(), KeyedStoreIC::NameRegister()); |
| 2554 ASSERT(KeyedStoreIC::ValueRegister().is(a0)); |
| 2553 | 2555 |
| 2554 Handle<Code> ic = strict_mode() == SLOPPY | 2556 Handle<Code> ic = strict_mode() == SLOPPY |
| 2555 ? isolate()->builtins()->KeyedStoreIC_Initialize() | 2557 ? isolate()->builtins()->KeyedStoreIC_Initialize() |
| 2556 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); | 2558 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); |
| 2557 CallIC(ic, expr->AssignmentFeedbackId()); | 2559 CallIC(ic, expr->AssignmentFeedbackId()); |
| 2558 | 2560 |
| 2559 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2561 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 2560 context()->Plug(v0); | 2562 context()->Plug(v0); |
| 2561 } | 2563 } |
| 2562 | 2564 |
| (...skipping 1810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4373 context()->PlugTOS(); | 4375 context()->PlugTOS(); |
| 4374 } | 4376 } |
| 4375 } else { | 4377 } else { |
| 4376 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 4378 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), |
| 4377 Token::ASSIGN); | 4379 Token::ASSIGN); |
| 4378 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4380 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4379 context()->Plug(v0); | 4381 context()->Plug(v0); |
| 4380 } | 4382 } |
| 4381 break; | 4383 break; |
| 4382 case NAMED_PROPERTY: { | 4384 case NAMED_PROPERTY: { |
| 4383 __ mov(a0, result_register()); // Value. | 4385 __ mov(StoreIC::ValueRegister(), result_register()); |
| 4384 __ li(a2, Operand(prop->key()->AsLiteral()->value())); // Name. | 4386 __ li(StoreIC::NameRegister(), |
| 4385 __ pop(a1); // Receiver. | 4387 Operand(prop->key()->AsLiteral()->value())); |
| 4388 __ pop(StoreIC::ReceiverRegister()); |
| 4386 CallStoreIC(expr->CountStoreFeedbackId()); | 4389 CallStoreIC(expr->CountStoreFeedbackId()); |
| 4387 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4390 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4388 if (expr->is_postfix()) { | 4391 if (expr->is_postfix()) { |
| 4389 if (!context()->IsEffect()) { | 4392 if (!context()->IsEffect()) { |
| 4390 context()->PlugTOS(); | 4393 context()->PlugTOS(); |
| 4391 } | 4394 } |
| 4392 } else { | 4395 } else { |
| 4393 context()->Plug(v0); | 4396 context()->Plug(v0); |
| 4394 } | 4397 } |
| 4395 break; | 4398 break; |
| 4396 } | 4399 } |
| 4397 case KEYED_PROPERTY: { | 4400 case KEYED_PROPERTY: { |
| 4398 __ mov(a0, result_register()); // Value. | 4401 __ mov(KeyedStoreIC::ValueRegister(), result_register()); |
| 4399 __ Pop(a2, a1); // a1 = key, a2 = receiver. | 4402 __ Pop(KeyedStoreIC::ReceiverRegister(), KeyedStoreIC::NameRegister()); |
| 4400 Handle<Code> ic = strict_mode() == SLOPPY | 4403 Handle<Code> ic = strict_mode() == SLOPPY |
| 4401 ? isolate()->builtins()->KeyedStoreIC_Initialize() | 4404 ? isolate()->builtins()->KeyedStoreIC_Initialize() |
| 4402 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); | 4405 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); |
| 4403 CallIC(ic, expr->CountStoreFeedbackId()); | 4406 CallIC(ic, expr->CountStoreFeedbackId()); |
| 4404 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4407 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4405 if (expr->is_postfix()) { | 4408 if (expr->is_postfix()) { |
| 4406 if (!context()->IsEffect()) { | 4409 if (!context()->IsEffect()) { |
| 4407 context()->PlugTOS(); | 4410 context()->PlugTOS(); |
| 4408 } | 4411 } |
| 4409 } else { | 4412 } else { |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4856 Assembler::target_address_at(pc_immediate_load_address)) == | 4859 Assembler::target_address_at(pc_immediate_load_address)) == |
| 4857 reinterpret_cast<uint64_t>( | 4860 reinterpret_cast<uint64_t>( |
| 4858 isolate->builtins()->OsrAfterStackCheck()->entry())); | 4861 isolate->builtins()->OsrAfterStackCheck()->entry())); |
| 4859 return OSR_AFTER_STACK_CHECK; | 4862 return OSR_AFTER_STACK_CHECK; |
| 4860 } | 4863 } |
| 4861 | 4864 |
| 4862 | 4865 |
| 4863 } } // namespace v8::internal | 4866 } } // namespace v8::internal |
| 4864 | 4867 |
| 4865 #endif // V8_TARGET_ARCH_MIPS64 | 4868 #endif // V8_TARGET_ARCH_MIPS64 |
| OLD | NEW |