| 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_IA32 | 7 #if V8_TARGET_ARCH_IA32 |
| 8 | 8 |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 1615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1626 switch (property->kind()) { | 1626 switch (property->kind()) { |
| 1627 case ObjectLiteral::Property::CONSTANT: | 1627 case ObjectLiteral::Property::CONSTANT: |
| 1628 UNREACHABLE(); | 1628 UNREACHABLE(); |
| 1629 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 1629 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
| 1630 ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); | 1630 ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); |
| 1631 // Fall through. | 1631 // Fall through. |
| 1632 case ObjectLiteral::Property::COMPUTED: | 1632 case ObjectLiteral::Property::COMPUTED: |
| 1633 if (key->value()->IsInternalizedString()) { | 1633 if (key->value()->IsInternalizedString()) { |
| 1634 if (property->emit_store()) { | 1634 if (property->emit_store()) { |
| 1635 VisitForAccumulatorValue(value); | 1635 VisitForAccumulatorValue(value); |
| 1636 __ mov(ecx, Immediate(key->value())); | 1636 ASSERT(StoreIC::ValueRegister().is(eax)); |
| 1637 __ mov(edx, Operand(esp, 0)); | 1637 __ mov(StoreIC::NameRegister(), Immediate(key->value())); |
| 1638 __ mov(StoreIC::ReceiverRegister(), Operand(esp, 0)); |
| 1638 CallStoreIC(key->LiteralFeedbackId()); | 1639 CallStoreIC(key->LiteralFeedbackId()); |
| 1639 PrepareForBailoutForId(key->id(), NO_REGISTERS); | 1640 PrepareForBailoutForId(key->id(), NO_REGISTERS); |
| 1640 } else { | 1641 } else { |
| 1641 VisitForEffect(value); | 1642 VisitForEffect(value); |
| 1642 } | 1643 } |
| 1643 break; | 1644 break; |
| 1644 } | 1645 } |
| 1645 __ push(Operand(esp, 0)); // Duplicate receiver. | 1646 __ push(Operand(esp, 0)); // Duplicate receiver. |
| 1646 VisitForStackValue(key); | 1647 VisitForStackValue(key); |
| 1647 VisitForStackValue(value); | 1648 VisitForStackValue(value); |
| (...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2342 switch (assign_type) { | 2343 switch (assign_type) { |
| 2343 case VARIABLE: { | 2344 case VARIABLE: { |
| 2344 Variable* var = expr->AsVariableProxy()->var(); | 2345 Variable* var = expr->AsVariableProxy()->var(); |
| 2345 EffectContext context(this); | 2346 EffectContext context(this); |
| 2346 EmitVariableAssignment(var, Token::ASSIGN); | 2347 EmitVariableAssignment(var, Token::ASSIGN); |
| 2347 break; | 2348 break; |
| 2348 } | 2349 } |
| 2349 case NAMED_PROPERTY: { | 2350 case NAMED_PROPERTY: { |
| 2350 __ push(eax); // Preserve value. | 2351 __ push(eax); // Preserve value. |
| 2351 VisitForAccumulatorValue(prop->obj()); | 2352 VisitForAccumulatorValue(prop->obj()); |
| 2352 __ mov(edx, eax); | 2353 __ Move(StoreIC::ReceiverRegister(), eax); |
| 2353 __ pop(eax); // Restore value. | 2354 __ pop(StoreIC::ValueRegister()); // Restore value. |
| 2354 __ mov(ecx, prop->key()->AsLiteral()->value()); | 2355 __ mov(StoreIC::NameRegister(), prop->key()->AsLiteral()->value()); |
| 2355 CallStoreIC(); | 2356 CallStoreIC(); |
| 2356 break; | 2357 break; |
| 2357 } | 2358 } |
| 2358 case KEYED_PROPERTY: { | 2359 case KEYED_PROPERTY: { |
| 2359 __ push(eax); // Preserve value. | 2360 __ push(eax); // Preserve value. |
| 2360 VisitForStackValue(prop->obj()); | 2361 VisitForStackValue(prop->obj()); |
| 2361 VisitForAccumulatorValue(prop->key()); | 2362 VisitForAccumulatorValue(prop->key()); |
| 2362 __ mov(ecx, eax); | 2363 __ Move(KeyedStoreIC::NameRegister(), eax); |
| 2363 __ pop(edx); // Receiver. | 2364 __ pop(KeyedStoreIC::ReceiverRegister()); // Receiver. |
| 2364 __ pop(eax); // Restore value. | 2365 __ pop(KeyedStoreIC::ValueRegister()); // Restore value. |
| 2365 Handle<Code> ic = strict_mode() == SLOPPY | 2366 Handle<Code> ic = strict_mode() == SLOPPY |
| 2366 ? isolate()->builtins()->KeyedStoreIC_Initialize() | 2367 ? isolate()->builtins()->KeyedStoreIC_Initialize() |
| 2367 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); | 2368 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); |
| 2368 CallIC(ic); | 2369 CallIC(ic); |
| 2369 break; | 2370 break; |
| 2370 } | 2371 } |
| 2371 } | 2372 } |
| 2372 context()->Plug(eax); | 2373 context()->Plug(eax); |
| 2373 } | 2374 } |
| 2374 | 2375 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2391 __ push(Immediate(name)); | 2392 __ push(Immediate(name)); |
| 2392 __ push(Immediate(Smi::FromInt(strict_mode))); | 2393 __ push(Immediate(Smi::FromInt(strict_mode))); |
| 2393 __ CallRuntime(Runtime::kStoreContextSlot, 4); | 2394 __ CallRuntime(Runtime::kStoreContextSlot, 4); |
| 2394 } | 2395 } |
| 2395 | 2396 |
| 2396 | 2397 |
| 2397 void FullCodeGenerator::EmitVariableAssignment(Variable* var, | 2398 void FullCodeGenerator::EmitVariableAssignment(Variable* var, |
| 2398 Token::Value op) { | 2399 Token::Value op) { |
| 2399 if (var->IsUnallocated()) { | 2400 if (var->IsUnallocated()) { |
| 2400 // Global var, const, or let. | 2401 // Global var, const, or let. |
| 2401 __ mov(ecx, var->name()); | 2402 __ mov(StoreIC::NameRegister(), var->name()); |
| 2402 __ mov(edx, GlobalObjectOperand()); | 2403 __ mov(StoreIC::ReceiverRegister(), GlobalObjectOperand()); |
| 2403 CallStoreIC(); | 2404 CallStoreIC(); |
| 2404 | 2405 |
| 2405 } else if (op == Token::INIT_CONST_LEGACY) { | 2406 } else if (op == Token::INIT_CONST_LEGACY) { |
| 2406 // Const initializers need a write barrier. | 2407 // Const initializers need a write barrier. |
| 2407 ASSERT(!var->IsParameter()); // No const parameters. | 2408 ASSERT(!var->IsParameter()); // No const parameters. |
| 2408 if (var->IsLookupSlot()) { | 2409 if (var->IsLookupSlot()) { |
| 2409 __ push(eax); | 2410 __ push(eax); |
| 2410 __ push(esi); | 2411 __ push(esi); |
| 2411 __ push(Immediate(var->name())); | 2412 __ push(Immediate(var->name())); |
| 2412 __ CallRuntime(Runtime::kInitializeConstContextSlot, 3); | 2413 __ CallRuntime(Runtime::kInitializeConstContextSlot, 3); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2463 // Assignment to a property, using a named store IC. | 2464 // Assignment to a property, using a named store IC. |
| 2464 // eax : value | 2465 // eax : value |
| 2465 // esp[0] : receiver | 2466 // esp[0] : receiver |
| 2466 | 2467 |
| 2467 Property* prop = expr->target()->AsProperty(); | 2468 Property* prop = expr->target()->AsProperty(); |
| 2468 ASSERT(prop != NULL); | 2469 ASSERT(prop != NULL); |
| 2469 ASSERT(prop->key()->IsLiteral()); | 2470 ASSERT(prop->key()->IsLiteral()); |
| 2470 | 2471 |
| 2471 // Record source code position before IC call. | 2472 // Record source code position before IC call. |
| 2472 SetSourcePosition(expr->position()); | 2473 SetSourcePosition(expr->position()); |
| 2473 __ mov(ecx, prop->key()->AsLiteral()->value()); | 2474 __ mov(StoreIC::NameRegister(), prop->key()->AsLiteral()->value()); |
| 2474 __ pop(edx); | 2475 __ pop(StoreIC::ReceiverRegister()); |
| 2475 CallStoreIC(expr->AssignmentFeedbackId()); | 2476 CallStoreIC(expr->AssignmentFeedbackId()); |
| 2476 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2477 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 2477 context()->Plug(eax); | 2478 context()->Plug(eax); |
| 2478 } | 2479 } |
| 2479 | 2480 |
| 2480 | 2481 |
| 2481 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2482 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
| 2482 // Assignment to a property, using a keyed store IC. | 2483 // Assignment to a property, using a keyed store IC. |
| 2483 // eax : value | 2484 // eax : value |
| 2484 // esp[0] : key | 2485 // esp[0] : key |
| 2485 // esp[kPointerSize] : receiver | 2486 // esp[kPointerSize] : receiver |
| 2486 | 2487 |
| 2487 __ pop(ecx); // Key. | 2488 __ pop(KeyedStoreIC::NameRegister()); // Key. |
| 2488 __ pop(edx); | 2489 __ pop(KeyedStoreIC::ReceiverRegister()); |
| 2490 ASSERT(KeyedStoreIC::ValueRegister().is(eax)); |
| 2489 // Record source code position before IC call. | 2491 // Record source code position before IC call. |
| 2490 SetSourcePosition(expr->position()); | 2492 SetSourcePosition(expr->position()); |
| 2491 Handle<Code> ic = strict_mode() == SLOPPY | 2493 Handle<Code> ic = strict_mode() == SLOPPY |
| 2492 ? isolate()->builtins()->KeyedStoreIC_Initialize() | 2494 ? isolate()->builtins()->KeyedStoreIC_Initialize() |
| 2493 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); | 2495 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); |
| 2494 CallIC(ic, expr->AssignmentFeedbackId()); | 2496 CallIC(ic, expr->AssignmentFeedbackId()); |
| 2495 | 2497 |
| 2496 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2498 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 2497 context()->Plug(eax); | 2499 context()->Plug(eax); |
| 2498 } | 2500 } |
| (...skipping 1826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4325 } | 4327 } |
| 4326 } else { | 4328 } else { |
| 4327 // Perform the assignment as if via '='. | 4329 // Perform the assignment as if via '='. |
| 4328 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 4330 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), |
| 4329 Token::ASSIGN); | 4331 Token::ASSIGN); |
| 4330 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4332 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4331 context()->Plug(eax); | 4333 context()->Plug(eax); |
| 4332 } | 4334 } |
| 4333 break; | 4335 break; |
| 4334 case NAMED_PROPERTY: { | 4336 case NAMED_PROPERTY: { |
| 4335 __ mov(ecx, prop->key()->AsLiteral()->value()); | 4337 __ mov(StoreIC::NameRegister(), prop->key()->AsLiteral()->value()); |
| 4336 __ pop(edx); | 4338 __ pop(StoreIC::ReceiverRegister()); |
| 4337 CallStoreIC(expr->CountStoreFeedbackId()); | 4339 CallStoreIC(expr->CountStoreFeedbackId()); |
| 4338 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4340 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4339 if (expr->is_postfix()) { | 4341 if (expr->is_postfix()) { |
| 4340 if (!context()->IsEffect()) { | 4342 if (!context()->IsEffect()) { |
| 4341 context()->PlugTOS(); | 4343 context()->PlugTOS(); |
| 4342 } | 4344 } |
| 4343 } else { | 4345 } else { |
| 4344 context()->Plug(eax); | 4346 context()->Plug(eax); |
| 4345 } | 4347 } |
| 4346 break; | 4348 break; |
| 4347 } | 4349 } |
| 4348 case KEYED_PROPERTY: { | 4350 case KEYED_PROPERTY: { |
| 4349 __ pop(ecx); | 4351 __ pop(KeyedStoreIC::NameRegister()); |
| 4350 __ pop(edx); | 4352 __ pop(KeyedStoreIC::ReceiverRegister()); |
| 4351 Handle<Code> ic = strict_mode() == SLOPPY | 4353 Handle<Code> ic = strict_mode() == SLOPPY |
| 4352 ? isolate()->builtins()->KeyedStoreIC_Initialize() | 4354 ? isolate()->builtins()->KeyedStoreIC_Initialize() |
| 4353 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); | 4355 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); |
| 4354 CallIC(ic, expr->CountStoreFeedbackId()); | 4356 CallIC(ic, expr->CountStoreFeedbackId()); |
| 4355 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4357 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4356 if (expr->is_postfix()) { | 4358 if (expr->is_postfix()) { |
| 4357 // Result is on the stack | 4359 // Result is on the stack |
| 4358 if (!context()->IsEffect()) { | 4360 if (!context()->IsEffect()) { |
| 4359 context()->PlugTOS(); | 4361 context()->PlugTOS(); |
| 4360 } | 4362 } |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4802 ASSERT_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 4804 ASSERT_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
| 4803 Assembler::target_address_at(call_target_address, | 4805 Assembler::target_address_at(call_target_address, |
| 4804 unoptimized_code)); | 4806 unoptimized_code)); |
| 4805 return OSR_AFTER_STACK_CHECK; | 4807 return OSR_AFTER_STACK_CHECK; |
| 4806 } | 4808 } |
| 4807 | 4809 |
| 4808 | 4810 |
| 4809 } } // namespace v8::internal | 4811 } } // namespace v8::internal |
| 4810 | 4812 |
| 4811 #endif // V8_TARGET_ARCH_IA32 | 4813 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |