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

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

Issue 649533002: X87: Keyed stores to super where key is a name. (Closed) Base URL: https://chromium.googlesource.com/external/v8.git@bleeding_edge
Patch Set: Created 6 years, 2 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 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_X87 7 #if V8_TARGET_ARCH_X87
8 8
9 #include "src/code-factory.h" 9 #include "src/code-factory.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 1789 matching lines...) Expand 10 before | Expand all | Expand 10 after
1800 context()->Plug(eax); 1800 context()->Plug(eax);
1801 } 1801 }
1802 } 1802 }
1803 1803
1804 1804
1805 void FullCodeGenerator::VisitAssignment(Assignment* expr) { 1805 void FullCodeGenerator::VisitAssignment(Assignment* expr) {
1806 DCHECK(expr->target()->IsValidReferenceExpression()); 1806 DCHECK(expr->target()->IsValidReferenceExpression());
1807 1807
1808 Comment cmnt(masm_, "[ Assignment"); 1808 Comment cmnt(masm_, "[ Assignment");
1809 1809
1810 // Left-hand side can only be a property, a global or a (parameter or local)
1811 // slot.
1812 enum LhsKind {
1813 VARIABLE,
1814 NAMED_PROPERTY,
1815 KEYED_PROPERTY,
1816 NAMED_SUPER_PROPERTY
1817 };
1818 LhsKind assign_type = VARIABLE;
1819 Property* property = expr->target()->AsProperty(); 1810 Property* property = expr->target()->AsProperty();
1820 if (property != NULL) { 1811 LhsKind assign_type = GetAssignType(property);
1821 assign_type = (property->key()->IsPropertyName())
1822 ? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY
1823 : NAMED_PROPERTY)
1824 : KEYED_PROPERTY;
1825 }
1826 1812
1827 // Evaluate LHS expression. 1813 // Evaluate LHS expression.
1828 switch (assign_type) { 1814 switch (assign_type) {
1829 case VARIABLE: 1815 case VARIABLE:
1830 // Nothing to do here. 1816 // Nothing to do here.
1831 break; 1817 break;
1832 case NAMED_SUPER_PROPERTY: 1818 case NAMED_SUPER_PROPERTY:
1833 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); 1819 VisitForStackValue(property->obj()->AsSuperReference()->this_var());
1834 EmitLoadHomeObject(property->obj()->AsSuperReference()); 1820 EmitLoadHomeObject(property->obj()->AsSuperReference());
1835 __ push(result_register()); 1821 __ push(result_register());
1836 if (expr->is_compound()) { 1822 if (expr->is_compound()) {
1837 __ push(MemOperand(esp, kPointerSize)); 1823 __ push(MemOperand(esp, kPointerSize));
1838 __ push(result_register()); 1824 __ push(result_register());
1839 } 1825 }
1840 break; 1826 break;
1841 case NAMED_PROPERTY: 1827 case NAMED_PROPERTY:
1842 if (expr->is_compound()) { 1828 if (expr->is_compound()) {
1843 // We need the receiver both on the stack and in the register. 1829 // We need the receiver both on the stack and in the register.
1844 VisitForStackValue(property->obj()); 1830 VisitForStackValue(property->obj());
1845 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); 1831 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0));
1846 } else { 1832 } else {
1847 VisitForStackValue(property->obj()); 1833 VisitForStackValue(property->obj());
1848 } 1834 }
1849 break; 1835 break;
1836 case KEYED_SUPER_PROPERTY:
1837 VisitForStackValue(property->obj()->AsSuperReference()->this_var());
1838 EmitLoadHomeObject(property->obj()->AsSuperReference());
1839 __ Push(result_register());
1840 VisitForAccumulatorValue(property->key());
1841 __ Push(result_register());
1842 if (expr->is_compound()) {
1843 __ push(MemOperand(esp, 2 * kPointerSize));
1844 __ push(MemOperand(esp, 2 * kPointerSize));
1845 __ push(result_register());
1846 }
1847 break;
1850 case KEYED_PROPERTY: { 1848 case KEYED_PROPERTY: {
1851 if (expr->is_compound()) { 1849 if (expr->is_compound()) {
1852 VisitForStackValue(property->obj()); 1850 VisitForStackValue(property->obj());
1853 VisitForStackValue(property->key()); 1851 VisitForStackValue(property->key());
1854 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, kPointerSize)); 1852 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, kPointerSize));
1855 __ mov(LoadDescriptor::NameRegister(), Operand(esp, 0)); 1853 __ mov(LoadDescriptor::NameRegister(), Operand(esp, 0));
1856 } else { 1854 } else {
1857 VisitForStackValue(property->obj()); 1855 VisitForStackValue(property->obj());
1858 VisitForStackValue(property->key()); 1856 VisitForStackValue(property->key());
1859 } 1857 }
(...skipping 12 matching lines...) Expand all
1872 PrepareForBailout(expr->target(), TOS_REG); 1870 PrepareForBailout(expr->target(), TOS_REG);
1873 break; 1871 break;
1874 case NAMED_SUPER_PROPERTY: 1872 case NAMED_SUPER_PROPERTY:
1875 EmitNamedSuperPropertyLoad(property); 1873 EmitNamedSuperPropertyLoad(property);
1876 PrepareForBailoutForId(property->LoadId(), TOS_REG); 1874 PrepareForBailoutForId(property->LoadId(), TOS_REG);
1877 break; 1875 break;
1878 case NAMED_PROPERTY: 1876 case NAMED_PROPERTY:
1879 EmitNamedPropertyLoad(property); 1877 EmitNamedPropertyLoad(property);
1880 PrepareForBailoutForId(property->LoadId(), TOS_REG); 1878 PrepareForBailoutForId(property->LoadId(), TOS_REG);
1881 break; 1879 break;
1880 case KEYED_SUPER_PROPERTY:
1881 EmitKeyedSuperPropertyLoad(property);
1882 PrepareForBailoutForId(property->LoadId(), TOS_REG);
1883 break;
1882 case KEYED_PROPERTY: 1884 case KEYED_PROPERTY:
1883 EmitKeyedPropertyLoad(property); 1885 EmitKeyedPropertyLoad(property);
1884 PrepareForBailoutForId(property->LoadId(), TOS_REG); 1886 PrepareForBailoutForId(property->LoadId(), TOS_REG);
1885 break; 1887 break;
1886 } 1888 }
1887 } 1889 }
1888 1890
1889 Token::Value op = expr->binary_op(); 1891 Token::Value op = expr->binary_op();
1890 __ push(eax); // Left operand goes on the stack. 1892 __ push(eax); // Left operand goes on the stack.
1891 VisitForAccumulatorValue(expr->value()); 1893 VisitForAccumulatorValue(expr->value());
(...skipping 27 matching lines...) Expand all
1919 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), 1921 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(),
1920 expr->op()); 1922 expr->op());
1921 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); 1923 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
1922 context()->Plug(eax); 1924 context()->Plug(eax);
1923 break; 1925 break;
1924 case NAMED_PROPERTY: 1926 case NAMED_PROPERTY:
1925 EmitNamedPropertyAssignment(expr); 1927 EmitNamedPropertyAssignment(expr);
1926 break; 1928 break;
1927 case NAMED_SUPER_PROPERTY: 1929 case NAMED_SUPER_PROPERTY:
1928 EmitNamedSuperPropertyStore(property); 1930 EmitNamedSuperPropertyStore(property);
1929 context()->Plug(eax); 1931 context()->Plug(result_register());
1932 break;
1933 case KEYED_SUPER_PROPERTY:
1934 EmitKeyedSuperPropertyStore(property);
1935 context()->Plug(result_register());
1930 break; 1936 break;
1931 case KEYED_PROPERTY: 1937 case KEYED_PROPERTY:
1932 EmitKeyedPropertyAssignment(expr); 1938 EmitKeyedPropertyAssignment(expr);
1933 break; 1939 break;
1934 } 1940 }
1935 } 1941 }
1936 1942
1937 1943
1938 void FullCodeGenerator::VisitYield(Yield* expr) { 1944 void FullCodeGenerator::VisitYield(Yield* expr) {
1939 Comment cmnt(masm_, "[ Yield"); 1945 Comment cmnt(masm_, "[ Yield");
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after
2554 2560
2555 2561
2556 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { 2562 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) {
2557 // Assignment to named property of super. 2563 // Assignment to named property of super.
2558 // eax : value 2564 // eax : value
2559 // stack : receiver ('this'), home_object 2565 // stack : receiver ('this'), home_object
2560 DCHECK(prop != NULL); 2566 DCHECK(prop != NULL);
2561 Literal* key = prop->key()->AsLiteral(); 2567 Literal* key = prop->key()->AsLiteral();
2562 DCHECK(key != NULL); 2568 DCHECK(key != NULL);
2563 2569
2570 __ push(Immediate(key->value()));
2564 __ push(eax); 2571 __ push(eax);
2565 __ push(Immediate(key->value()));
2566 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict 2572 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict
2567 : Runtime::kStoreToSuper_Sloppy), 2573 : Runtime::kStoreToSuper_Sloppy),
2568 4); 2574 4);
2569 } 2575 }
2570 2576
2571 2577
2578 void FullCodeGenerator::EmitKeyedSuperPropertyStore(Property* prop) {
2579 // Assignment to named property of super.
2580 // eax : value
2581 // stack : receiver ('this'), home_object, key
2582
2583 __ push(eax);
2584 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreKeyedToSuper_Strict
2585 : Runtime::kStoreKeyedToSuper_Sloppy),
2586 4);
2587 }
2588
2589
2572 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { 2590 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
2573 // Assignment to a property, using a keyed store IC. 2591 // Assignment to a property, using a keyed store IC.
2574 // eax : value 2592 // eax : value
2575 // esp[0] : key 2593 // esp[0] : key
2576 // esp[kPointerSize] : receiver 2594 // esp[kPointerSize] : receiver
2577 2595
2578 __ pop(StoreDescriptor::NameRegister()); // Key. 2596 __ pop(StoreDescriptor::NameRegister()); // Key.
2579 __ pop(StoreDescriptor::ReceiverRegister()); 2597 __ pop(StoreDescriptor::ReceiverRegister());
2580 DCHECK(StoreDescriptor::ValueRegister().is(eax)); 2598 DCHECK(StoreDescriptor::ValueRegister().is(eax));
2581 // Record source code position before IC call. 2599 // Record source code position before IC call.
(...skipping 1788 matching lines...) Expand 10 before | Expand all | Expand 10 after
4370 } 4388 }
4371 } 4389 }
4372 4390
4373 4391
4374 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { 4392 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
4375 DCHECK(expr->expression()->IsValidReferenceExpression()); 4393 DCHECK(expr->expression()->IsValidReferenceExpression());
4376 4394
4377 Comment cmnt(masm_, "[ CountOperation"); 4395 Comment cmnt(masm_, "[ CountOperation");
4378 SetSourcePosition(expr->position()); 4396 SetSourcePosition(expr->position());
4379 4397
4380 // Expression can only be a property, a global or a (parameter or local)
4381 // slot.
4382 enum LhsKind {
4383 VARIABLE,
4384 NAMED_PROPERTY,
4385 KEYED_PROPERTY,
4386 NAMED_SUPER_PROPERTY
4387 };
4388 LhsKind assign_type = VARIABLE;
4389 Property* prop = expr->expression()->AsProperty(); 4398 Property* prop = expr->expression()->AsProperty();
4390 // In case of a property we use the uninitialized expression context 4399 LhsKind assign_type = GetAssignType(prop);
4391 // of the key to detect a named property.
4392 if (prop != NULL) {
4393 assign_type =
4394 (prop->key()->IsPropertyName())
4395 ? (prop->IsSuperAccess() ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY)
4396 : KEYED_PROPERTY;
4397 }
4398 4400
4399 // Evaluate expression and get value. 4401 // Evaluate expression and get value.
4400 if (assign_type == VARIABLE) { 4402 if (assign_type == VARIABLE) {
4401 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); 4403 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL);
4402 AccumulatorValueContext context(this); 4404 AccumulatorValueContext context(this);
4403 EmitVariableLoad(expr->expression()->AsVariableProxy()); 4405 EmitVariableLoad(expr->expression()->AsVariableProxy());
4404 } else { 4406 } else {
4405 // Reserve space for result of postfix operation. 4407 // Reserve space for result of postfix operation.
4406 if (expr->is_postfix() && !context()->IsEffect()) { 4408 if (expr->is_postfix() && !context()->IsEffect()) {
4407 __ push(Immediate(Smi::FromInt(0))); 4409 __ push(Immediate(Smi::FromInt(0)));
4408 } 4410 }
4409 if (assign_type == NAMED_PROPERTY) { 4411 switch (assign_type) {
4410 // Put the object both on the stack and in the register. 4412 case NAMED_PROPERTY: {
4411 VisitForStackValue(prop->obj()); 4413 // Put the object both on the stack and in the register.
4412 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); 4414 VisitForStackValue(prop->obj());
4413 EmitNamedPropertyLoad(prop); 4415 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0));
4414 } else if (assign_type == NAMED_SUPER_PROPERTY) { 4416 EmitNamedPropertyLoad(prop);
4415 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 4417 break;
4416 EmitLoadHomeObject(prop->obj()->AsSuperReference()); 4418 }
4417 __ push(result_register()); 4419
4418 __ push(MemOperand(esp, kPointerSize)); 4420 case NAMED_SUPER_PROPERTY: {
4419 __ push(result_register()); 4421 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
4420 EmitNamedSuperPropertyLoad(prop); 4422 EmitLoadHomeObject(prop->obj()->AsSuperReference());
4421 } else { 4423 __ push(result_register());
4422 VisitForStackValue(prop->obj()); 4424 __ push(MemOperand(esp, kPointerSize));
4423 VisitForStackValue(prop->key()); 4425 __ push(result_register());
4424 __ mov(LoadDescriptor::ReceiverRegister(), 4426 EmitNamedSuperPropertyLoad(prop);
4425 Operand(esp, kPointerSize)); // Object. 4427 break;
4426 __ mov(LoadDescriptor::NameRegister(), Operand(esp, 0)); // Key. 4428 }
4427 EmitKeyedPropertyLoad(prop); 4429
4430 case KEYED_SUPER_PROPERTY: {
4431 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
4432 EmitLoadHomeObject(prop->obj()->AsSuperReference());
4433 __ push(result_register());
4434 VisitForAccumulatorValue(prop->key());
4435 __ push(result_register());
4436 __ push(MemOperand(esp, 2 * kPointerSize));
4437 __ push(MemOperand(esp, 2 * kPointerSize));
4438 __ push(result_register());
4439 EmitKeyedSuperPropertyLoad(prop);
4440 break;
4441 }
4442
4443 case KEYED_PROPERTY: {
4444 VisitForStackValue(prop->obj());
4445 VisitForStackValue(prop->key());
4446 __ mov(LoadDescriptor::ReceiverRegister(),
4447 Operand(esp, kPointerSize)); // Object.
4448 __ mov(LoadDescriptor::NameRegister(), Operand(esp, 0)); // Key.
4449 EmitKeyedPropertyLoad(prop);
4450 break;
4451 }
4452
4453 case VARIABLE:
4454 UNREACHABLE();
4428 } 4455 }
4429 } 4456 }
4430 4457
4431 // We need a second deoptimization point after loading the value 4458 // We need a second deoptimization point after loading the value
4432 // in case evaluating the property load my have a side effect. 4459 // in case evaluating the property load my have a side effect.
4433 if (assign_type == VARIABLE) { 4460 if (assign_type == VARIABLE) {
4434 PrepareForBailout(expr->expression(), TOS_REG); 4461 PrepareForBailout(expr->expression(), TOS_REG);
4435 } else { 4462 } else {
4436 PrepareForBailoutForId(prop->LoadId(), TOS_REG); 4463 PrepareForBailoutForId(prop->LoadId(), TOS_REG);
4437 } 4464 }
(...skipping 17 matching lines...) Expand all
4455 break; 4482 break;
4456 case NAMED_PROPERTY: 4483 case NAMED_PROPERTY:
4457 __ mov(Operand(esp, kPointerSize), eax); 4484 __ mov(Operand(esp, kPointerSize), eax);
4458 break; 4485 break;
4459 case NAMED_SUPER_PROPERTY: 4486 case NAMED_SUPER_PROPERTY:
4460 __ mov(Operand(esp, 2 * kPointerSize), eax); 4487 __ mov(Operand(esp, 2 * kPointerSize), eax);
4461 break; 4488 break;
4462 case KEYED_PROPERTY: 4489 case KEYED_PROPERTY:
4463 __ mov(Operand(esp, 2 * kPointerSize), eax); 4490 __ mov(Operand(esp, 2 * kPointerSize), eax);
4464 break; 4491 break;
4492 case KEYED_SUPER_PROPERTY:
4493 __ mov(Operand(esp, 3 * kPointerSize), eax);
4494 break;
4465 } 4495 }
4466 } 4496 }
4467 } 4497 }
4468 4498
4469 if (expr->op() == Token::INC) { 4499 if (expr->op() == Token::INC) {
4470 __ add(eax, Immediate(Smi::FromInt(1))); 4500 __ add(eax, Immediate(Smi::FromInt(1)));
4471 } else { 4501 } else {
4472 __ sub(eax, Immediate(Smi::FromInt(1))); 4502 __ sub(eax, Immediate(Smi::FromInt(1)));
4473 } 4503 }
4474 __ j(no_overflow, &done, Label::kNear); 4504 __ j(no_overflow, &done, Label::kNear);
(...skipping 21 matching lines...) Expand all
4496 break; 4526 break;
4497 case NAMED_PROPERTY: 4527 case NAMED_PROPERTY:
4498 __ mov(Operand(esp, kPointerSize), eax); 4528 __ mov(Operand(esp, kPointerSize), eax);
4499 break; 4529 break;
4500 case NAMED_SUPER_PROPERTY: 4530 case NAMED_SUPER_PROPERTY:
4501 __ mov(Operand(esp, 2 * kPointerSize), eax); 4531 __ mov(Operand(esp, 2 * kPointerSize), eax);
4502 break; 4532 break;
4503 case KEYED_PROPERTY: 4533 case KEYED_PROPERTY:
4504 __ mov(Operand(esp, 2 * kPointerSize), eax); 4534 __ mov(Operand(esp, 2 * kPointerSize), eax);
4505 break; 4535 break;
4536 case KEYED_SUPER_PROPERTY:
4537 __ mov(Operand(esp, 3 * kPointerSize), eax);
4538 break;
4506 } 4539 }
4507 } 4540 }
4508 } 4541 }
4509 4542
4510 // Record position before stub call. 4543 // Record position before stub call.
4511 SetSourcePosition(expr->position()); 4544 SetSourcePosition(expr->position());
4512 4545
4513 // Call stub for +1/-1. 4546 // Call stub for +1/-1.
4514 __ bind(&stub_call); 4547 __ bind(&stub_call);
4515 __ mov(edx, eax); 4548 __ mov(edx, eax);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
4563 EmitNamedSuperPropertyStore(prop); 4596 EmitNamedSuperPropertyStore(prop);
4564 if (expr->is_postfix()) { 4597 if (expr->is_postfix()) {
4565 if (!context()->IsEffect()) { 4598 if (!context()->IsEffect()) {
4566 context()->PlugTOS(); 4599 context()->PlugTOS();
4567 } 4600 }
4568 } else { 4601 } else {
4569 context()->Plug(eax); 4602 context()->Plug(eax);
4570 } 4603 }
4571 break; 4604 break;
4572 } 4605 }
4606 case KEYED_SUPER_PROPERTY: {
4607 EmitKeyedSuperPropertyStore(prop);
4608 if (expr->is_postfix()) {
4609 if (!context()->IsEffect()) {
4610 context()->PlugTOS();
4611 }
4612 } else {
4613 context()->Plug(eax);
4614 }
4615 break;
4616 }
4573 case KEYED_PROPERTY: { 4617 case KEYED_PROPERTY: {
4574 __ pop(StoreDescriptor::NameRegister()); 4618 __ pop(StoreDescriptor::NameRegister());
4575 __ pop(StoreDescriptor::ReceiverRegister()); 4619 __ pop(StoreDescriptor::ReceiverRegister());
4576 Handle<Code> ic = 4620 Handle<Code> ic =
4577 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); 4621 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code();
4578 CallIC(ic, expr->CountStoreFeedbackId()); 4622 CallIC(ic, expr->CountStoreFeedbackId());
4579 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); 4623 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
4580 if (expr->is_postfix()) { 4624 if (expr->is_postfix()) {
4581 // Result is on the stack 4625 // Result is on the stack
4582 if (!context()->IsEffect()) { 4626 if (!context()->IsEffect()) {
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
5024 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), 5068 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(),
5025 Assembler::target_address_at(call_target_address, 5069 Assembler::target_address_at(call_target_address,
5026 unoptimized_code)); 5070 unoptimized_code));
5027 return OSR_AFTER_STACK_CHECK; 5071 return OSR_AFTER_STACK_CHECK;
5028 } 5072 }
5029 5073
5030 5074
5031 } } // namespace v8::internal 5075 } } // namespace v8::internal
5032 5076
5033 #endif // V8_TARGET_ARCH_X87 5077 #endif // V8_TARGET_ARCH_X87
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