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

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

Issue 1227893005: TypeofMode replaces TypeofState and ContextualMode. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: minor fix Created 5 years, 5 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
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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_PPC 7 #if V8_TARGET_ARCH_PPC
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 1322 matching lines...) Expand 10 before | Expand all | Expand 10 after
1333 Operand(isolate()->factory()->home_object_symbol())); 1333 Operand(isolate()->factory()->home_object_symbol()));
1334 __ LoadP(StoreDescriptor::ValueRegister(), 1334 __ LoadP(StoreDescriptor::ValueRegister(),
1335 MemOperand(sp, offset * kPointerSize)); 1335 MemOperand(sp, offset * kPointerSize));
1336 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); 1336 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot);
1337 CallStoreIC(); 1337 CallStoreIC();
1338 } 1338 }
1339 } 1339 }
1340 1340
1341 1341
1342 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy, 1342 void FullCodeGenerator::EmitLoadGlobalCheckExtensions(VariableProxy* proxy,
1343 TypeofState typeof_state, 1343 TypeofMode typeof_mode,
1344 Label* slow) { 1344 Label* slow) {
1345 Register current = cp; 1345 Register current = cp;
1346 Register next = r4; 1346 Register next = r4;
1347 Register temp = r5; 1347 Register temp = r5;
1348 1348
1349 Scope* s = scope(); 1349 Scope* s = scope();
1350 while (s != NULL) { 1350 while (s != NULL) {
1351 if (s->num_heap_slots() > 0) { 1351 if (s->num_heap_slots() > 0) {
1352 if (s->calls_sloppy_eval()) { 1352 if (s->calls_sloppy_eval()) {
1353 // Check that extension is NULL. 1353 // Check that extension is NULL.
(...skipping 28 matching lines...) Expand all
1382 __ cmpi(temp, Operand::Zero()); 1382 __ cmpi(temp, Operand::Zero());
1383 __ bne(slow); 1383 __ bne(slow);
1384 // Load next context in chain. 1384 // Load next context in chain.
1385 __ LoadP(next, ContextOperand(next, Context::PREVIOUS_INDEX)); 1385 __ LoadP(next, ContextOperand(next, Context::PREVIOUS_INDEX));
1386 __ b(&loop); 1386 __ b(&loop);
1387 __ bind(&fast); 1387 __ bind(&fast);
1388 } 1388 }
1389 1389
1390 // All extension objects were empty and it is safe to use a normal global 1390 // All extension objects were empty and it is safe to use a normal global
1391 // load machinery. 1391 // load machinery.
1392 EmitGlobalVariableLoad(proxy, typeof_state); 1392 EmitGlobalVariableLoad(proxy, typeof_mode);
1393 } 1393 }
1394 1394
1395 1395
1396 MemOperand FullCodeGenerator::ContextSlotOperandCheckExtensions(Variable* var, 1396 MemOperand FullCodeGenerator::ContextSlotOperandCheckExtensions(Variable* var,
1397 Label* slow) { 1397 Label* slow) {
1398 DCHECK(var->IsContextSlot()); 1398 DCHECK(var->IsContextSlot());
1399 Register context = cp; 1399 Register context = cp;
1400 Register next = r6; 1400 Register next = r6;
1401 Register temp = r7; 1401 Register temp = r7;
1402 1402
(...skipping 16 matching lines...) Expand all
1419 __ bne(slow); 1419 __ bne(slow);
1420 1420
1421 // This function is used only for loads, not stores, so it's safe to 1421 // This function is used only for loads, not stores, so it's safe to
1422 // return an cp-based operand (the write barrier cannot be allowed to 1422 // return an cp-based operand (the write barrier cannot be allowed to
1423 // destroy the cp register). 1423 // destroy the cp register).
1424 return ContextOperand(context, var->index()); 1424 return ContextOperand(context, var->index());
1425 } 1425 }
1426 1426
1427 1427
1428 void FullCodeGenerator::EmitDynamicLookupFastCase(VariableProxy* proxy, 1428 void FullCodeGenerator::EmitDynamicLookupFastCase(VariableProxy* proxy,
1429 TypeofState typeof_state, 1429 TypeofMode typeof_mode,
1430 Label* slow, Label* done) { 1430 Label* slow, Label* done) {
1431 // Generate fast-case code for variables that might be shadowed by 1431 // Generate fast-case code for variables that might be shadowed by
1432 // eval-introduced variables. Eval is used a lot without 1432 // eval-introduced variables. Eval is used a lot without
1433 // introducing variables. In those cases, we do not want to 1433 // introducing variables. In those cases, we do not want to
1434 // perform a runtime call for all variables in the scope 1434 // perform a runtime call for all variables in the scope
1435 // containing the eval. 1435 // containing the eval.
1436 Variable* var = proxy->var(); 1436 Variable* var = proxy->var();
1437 if (var->mode() == DYNAMIC_GLOBAL) { 1437 if (var->mode() == DYNAMIC_GLOBAL) {
1438 EmitLoadGlobalCheckExtensions(proxy, typeof_state, slow); 1438 EmitLoadGlobalCheckExtensions(proxy, typeof_mode, slow);
1439 __ b(done); 1439 __ b(done);
1440 } else if (var->mode() == DYNAMIC_LOCAL) { 1440 } else if (var->mode() == DYNAMIC_LOCAL) {
1441 Variable* local = var->local_if_not_shadowed(); 1441 Variable* local = var->local_if_not_shadowed();
1442 __ LoadP(r3, ContextSlotOperandCheckExtensions(local, slow)); 1442 __ LoadP(r3, ContextSlotOperandCheckExtensions(local, slow));
1443 if (local->mode() == LET || local->mode() == CONST || 1443 if (local->mode() == LET || local->mode() == CONST ||
1444 local->mode() == CONST_LEGACY) { 1444 local->mode() == CONST_LEGACY) {
1445 __ CompareRoot(r3, Heap::kTheHoleValueRootIndex); 1445 __ CompareRoot(r3, Heap::kTheHoleValueRootIndex);
1446 __ bne(done); 1446 __ bne(done);
1447 if (local->mode() == CONST_LEGACY) { 1447 if (local->mode() == CONST_LEGACY) {
1448 __ LoadRoot(r3, Heap::kUndefinedValueRootIndex); 1448 __ LoadRoot(r3, Heap::kUndefinedValueRootIndex);
1449 } else { // LET || CONST 1449 } else { // LET || CONST
1450 __ mov(r3, Operand(var->name())); 1450 __ mov(r3, Operand(var->name()));
1451 __ push(r3); 1451 __ push(r3);
1452 __ CallRuntime(Runtime::kThrowReferenceError, 1); 1452 __ CallRuntime(Runtime::kThrowReferenceError, 1);
1453 } 1453 }
1454 } 1454 }
1455 __ b(done); 1455 __ b(done);
1456 } 1456 }
1457 } 1457 }
1458 1458
1459 1459
1460 void FullCodeGenerator::EmitGlobalVariableLoad(VariableProxy* proxy, 1460 void FullCodeGenerator::EmitGlobalVariableLoad(VariableProxy* proxy,
1461 TypeofState typeof_state) { 1461 TypeofMode typeof_mode) {
1462 Variable* var = proxy->var(); 1462 Variable* var = proxy->var();
1463 DCHECK(var->IsUnallocatedOrGlobalSlot() || 1463 DCHECK(var->IsUnallocatedOrGlobalSlot() ||
1464 (var->IsLookupSlot() && var->mode() == DYNAMIC_GLOBAL)); 1464 (var->IsLookupSlot() && var->mode() == DYNAMIC_GLOBAL));
1465 __ LoadP(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); 1465 __ LoadP(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
1466 __ mov(LoadDescriptor::NameRegister(), Operand(var->name())); 1466 __ mov(LoadDescriptor::NameRegister(), Operand(var->name()));
1467 __ mov(LoadDescriptor::SlotRegister(), 1467 __ mov(LoadDescriptor::SlotRegister(),
1468 Operand(SmiFromSlot(proxy->VariableFeedbackSlot()))); 1468 Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
1469 // Inside typeof use a regular load, not a contextual load, to avoid 1469 CallLoadIC(typeof_mode);
1470 // a reference error.
1471 CallLoadIC(typeof_state == NOT_INSIDE_TYPEOF ? CONTEXTUAL : NOT_CONTEXTUAL);
1472 } 1470 }
1473 1471
1474 1472
1475 void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy, 1473 void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy,
1476 TypeofState typeof_state) { 1474 TypeofMode typeof_mode) {
1477 // Record position before possible IC call. 1475 // Record position before possible IC call.
1478 SetExpressionPosition(proxy); 1476 SetExpressionPosition(proxy);
1479 PrepareForBailoutForId(proxy->BeforeId(), NO_REGISTERS); 1477 PrepareForBailoutForId(proxy->BeforeId(), NO_REGISTERS);
1480 Variable* var = proxy->var(); 1478 Variable* var = proxy->var();
1481 1479
1482 // Three cases: global variables, lookup variables, and all other types of 1480 // Three cases: global variables, lookup variables, and all other types of
1483 // variables. 1481 // variables.
1484 switch (var->location()) { 1482 switch (var->location()) {
1485 case VariableLocation::GLOBAL: 1483 case VariableLocation::GLOBAL:
1486 case VariableLocation::UNALLOCATED: { 1484 case VariableLocation::UNALLOCATED: {
1487 Comment cmnt(masm_, "[ Global variable"); 1485 Comment cmnt(masm_, "[ Global variable");
1488 EmitGlobalVariableLoad(proxy, typeof_state); 1486 EmitGlobalVariableLoad(proxy, typeof_mode);
1489 context()->Plug(r3); 1487 context()->Plug(r3);
1490 break; 1488 break;
1491 } 1489 }
1492 1490
1493 case VariableLocation::PARAMETER: 1491 case VariableLocation::PARAMETER:
1494 case VariableLocation::LOCAL: 1492 case VariableLocation::LOCAL:
1495 case VariableLocation::CONTEXT: { 1493 case VariableLocation::CONTEXT: {
1496 DCHECK_EQ(NOT_INSIDE_TYPEOF, typeof_state); 1494 DCHECK_EQ(NOT_INSIDE_TYPEOF, typeof_mode);
1497 Comment cmnt(masm_, var->IsContextSlot() ? "[ Context variable" 1495 Comment cmnt(masm_, var->IsContextSlot() ? "[ Context variable"
1498 : "[ Stack variable"); 1496 : "[ Stack variable");
1499 if (var->binding_needs_init()) { 1497 if (var->binding_needs_init()) {
1500 // var->scope() may be NULL when the proxy is located in eval code and 1498 // var->scope() may be NULL when the proxy is located in eval code and
1501 // refers to a potential outside binding. Currently those bindings are 1499 // refers to a potential outside binding. Currently those bindings are
1502 // always looked up dynamically, i.e. in that case 1500 // always looked up dynamically, i.e. in that case
1503 // var->location() == LOOKUP. 1501 // var->location() == LOOKUP.
1504 // always holds. 1502 // always holds.
1505 DCHECK(var->scope() != NULL); 1503 DCHECK(var->scope() != NULL);
1506 1504
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1560 } 1558 }
1561 context()->Plug(var); 1559 context()->Plug(var);
1562 break; 1560 break;
1563 } 1561 }
1564 1562
1565 case VariableLocation::LOOKUP: { 1563 case VariableLocation::LOOKUP: {
1566 Comment cmnt(masm_, "[ Lookup variable"); 1564 Comment cmnt(masm_, "[ Lookup variable");
1567 Label done, slow; 1565 Label done, slow;
1568 // Generate code for loading from variables potentially shadowed 1566 // Generate code for loading from variables potentially shadowed
1569 // by eval-introduced variables. 1567 // by eval-introduced variables.
1570 EmitDynamicLookupFastCase(proxy, typeof_state, &slow, &done); 1568 EmitDynamicLookupFastCase(proxy, typeof_mode, &slow, &done);
1571 __ bind(&slow); 1569 __ bind(&slow);
1572 __ mov(r4, Operand(var->name())); 1570 __ mov(r4, Operand(var->name()));
1573 __ Push(cp, r4); // Context and name. 1571 __ Push(cp, r4); // Context and name.
1574 Runtime::FunctionId function_id = 1572 Runtime::FunctionId function_id =
1575 typeof_state == NOT_INSIDE_TYPEOF 1573 typeof_mode == NOT_INSIDE_TYPEOF
1576 ? Runtime::kLoadLookupSlot 1574 ? Runtime::kLoadLookupSlot
1577 : Runtime::kLoadLookupSlotNoReferenceError; 1575 : Runtime::kLoadLookupSlotNoReferenceError;
1578 __ CallRuntime(function_id, 2); 1576 __ CallRuntime(function_id, 2);
1579 __ bind(&done); 1577 __ bind(&done);
1580 context()->Plug(r3); 1578 context()->Plug(r3);
1581 } 1579 }
1582 } 1580 }
1583 } 1581 }
1584 1582
1585 1583
(...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after
2242 __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 2240 __ LoadP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2243 __ Drop(1); // The function is still on the stack; drop it. 2241 __ Drop(1); // The function is still on the stack; drop it.
2244 2242
2245 // if (!result.done) goto l_try; 2243 // if (!result.done) goto l_try;
2246 __ Move(load_receiver, r3); 2244 __ Move(load_receiver, r3);
2247 2245
2248 __ push(load_receiver); // save result 2246 __ push(load_receiver); // save result
2249 __ LoadRoot(load_name, Heap::kdone_stringRootIndex); // "done" 2247 __ LoadRoot(load_name, Heap::kdone_stringRootIndex); // "done"
2250 __ mov(LoadDescriptor::SlotRegister(), 2248 __ mov(LoadDescriptor::SlotRegister(),
2251 Operand(SmiFromSlot(expr->DoneFeedbackSlot()))); 2249 Operand(SmiFromSlot(expr->DoneFeedbackSlot())));
2252 CallLoadIC(NOT_CONTEXTUAL); // r0=result.done 2250 CallLoadIC(INSIDE_TYPEOF); // r0=result.done
2253 Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate()); 2251 Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate());
2254 CallIC(bool_ic); 2252 CallIC(bool_ic);
2255 __ cmpi(r3, Operand::Zero()); 2253 __ cmpi(r3, Operand::Zero());
2256 __ beq(&l_try); 2254 __ beq(&l_try);
2257 2255
2258 // result.value 2256 // result.value
2259 __ pop(load_receiver); // result 2257 __ pop(load_receiver); // result
2260 __ LoadRoot(load_name, Heap::kvalue_stringRootIndex); // "value" 2258 __ LoadRoot(load_name, Heap::kvalue_stringRootIndex); // "value"
2261 __ mov(LoadDescriptor::SlotRegister(), 2259 __ mov(LoadDescriptor::SlotRegister(),
2262 Operand(SmiFromSlot(expr->ValueFeedbackSlot()))); 2260 Operand(SmiFromSlot(expr->ValueFeedbackSlot())));
2263 CallLoadIC(NOT_CONTEXTUAL); // r3=result.value 2261 CallLoadIC(INSIDE_TYPEOF); // r3=result.value
2264 context()->DropAndPlug(2, r3); // drop iter and g 2262 context()->DropAndPlug(2, r3); // drop iter and g
2265 break; 2263 break;
2266 } 2264 }
2267 } 2265 }
2268 } 2266 }
2269 2267
2270 2268
2271 void FullCodeGenerator::EmitGeneratorResume( 2269 void FullCodeGenerator::EmitGeneratorResume(
2272 Expression* generator, Expression* value, 2270 Expression* generator, Expression* value,
2273 JSGeneratorObject::ResumeMode resume_mode) { 2271 JSGeneratorObject::ResumeMode resume_mode) {
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
2414 2412
2415 2413
2416 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { 2414 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
2417 SetExpressionPosition(prop); 2415 SetExpressionPosition(prop);
2418 Literal* key = prop->key()->AsLiteral(); 2416 Literal* key = prop->key()->AsLiteral();
2419 DCHECK(!prop->IsSuperAccess()); 2417 DCHECK(!prop->IsSuperAccess());
2420 2418
2421 __ mov(LoadDescriptor::NameRegister(), Operand(key->value())); 2419 __ mov(LoadDescriptor::NameRegister(), Operand(key->value()));
2422 __ mov(LoadDescriptor::SlotRegister(), 2420 __ mov(LoadDescriptor::SlotRegister(),
2423 Operand(SmiFromSlot(prop->PropertyFeedbackSlot()))); 2421 Operand(SmiFromSlot(prop->PropertyFeedbackSlot())));
2424 CallLoadIC(NOT_CONTEXTUAL, language_mode()); 2422 CallLoadIC(INSIDE_TYPEOF, language_mode());
2425 } 2423 }
2426 2424
2427 2425
2428 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) { 2426 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) {
2429 // Stack: receiver, home_object. 2427 // Stack: receiver, home_object.
2430 SetExpressionPosition(prop); 2428 SetExpressionPosition(prop);
2431 Literal* key = prop->key()->AsLiteral(); 2429 Literal* key = prop->key()->AsLiteral();
2432 DCHECK(!key->value()->IsSmi()); 2430 DCHECK(!key->value()->IsSmi());
2433 DCHECK(prop->IsSuperAccess()); 2431 DCHECK(prop->IsSuperAccess());
2434 2432
(...skipping 2310 matching lines...) Expand 10 before | Expand all | Expand 10 after
4745 // Push the builtins object as the receiver. 4743 // Push the builtins object as the receiver.
4746 Register receiver = LoadDescriptor::ReceiverRegister(); 4744 Register receiver = LoadDescriptor::ReceiverRegister();
4747 __ LoadP(receiver, GlobalObjectOperand()); 4745 __ LoadP(receiver, GlobalObjectOperand());
4748 __ LoadP(receiver, FieldMemOperand(receiver, GlobalObject::kBuiltinsOffset)); 4746 __ LoadP(receiver, FieldMemOperand(receiver, GlobalObject::kBuiltinsOffset));
4749 __ push(receiver); 4747 __ push(receiver);
4750 4748
4751 // Load the function from the receiver. 4749 // Load the function from the receiver.
4752 __ mov(LoadDescriptor::NameRegister(), Operand(expr->name())); 4750 __ mov(LoadDescriptor::NameRegister(), Operand(expr->name()));
4753 __ mov(LoadDescriptor::SlotRegister(), 4751 __ mov(LoadDescriptor::SlotRegister(),
4754 Operand(SmiFromSlot(expr->CallRuntimeFeedbackSlot()))); 4752 Operand(SmiFromSlot(expr->CallRuntimeFeedbackSlot())));
4755 CallLoadIC(NOT_CONTEXTUAL); 4753 CallLoadIC(INSIDE_TYPEOF);
4756 } 4754 }
4757 4755
4758 4756
4759 void FullCodeGenerator::EmitCallJSRuntimeFunction(CallRuntime* expr) { 4757 void FullCodeGenerator::EmitCallJSRuntimeFunction(CallRuntime* expr) {
4760 ZoneList<Expression*>* args = expr->arguments(); 4758 ZoneList<Expression*>* args = expr->arguments();
4761 int arg_count = args->length(); 4759 int arg_count = args->length();
4762 4760
4763 SetExpressionPosition(expr); 4761 SetExpressionPosition(expr);
4764 CallFunctionStub stub(isolate(), arg_count, NO_CALL_FUNCTION_FLAGS); 4762 CallFunctionStub stub(isolate(), arg_count, NO_CALL_FUNCTION_FLAGS);
4765 __ LoadP(r4, MemOperand(sp, (arg_count + 1) * kPointerSize), r0); 4763 __ LoadP(r4, MemOperand(sp, (arg_count + 1) * kPointerSize), r0);
(...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after
5547 return ON_STACK_REPLACEMENT; 5545 return ON_STACK_REPLACEMENT;
5548 } 5546 }
5549 5547
5550 DCHECK(interrupt_address == 5548 DCHECK(interrupt_address ==
5551 isolate->builtins()->OsrAfterStackCheck()->entry()); 5549 isolate->builtins()->OsrAfterStackCheck()->entry());
5552 return OSR_AFTER_STACK_CHECK; 5550 return OSR_AFTER_STACK_CHECK;
5553 } 5551 }
5554 } // namespace internal 5552 } // namespace internal
5555 } // namespace v8 5553 } // namespace v8
5556 #endif // V8_TARGET_ARCH_PPC 5554 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« src/ic/ic.cc ('K') | « src/ppc/codegen-ppc.h ('k') | src/ppc/lithium-codegen-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698