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

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

Issue 641373002: Introduce FeedbackVectorSlot type - better than int. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Ports. 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 | Annotate | Revision Log
« no previous file with comments | « src/arm/lithium-codegen-arm.cc ('k') | src/arm64/lithium-codegen-arm64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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_ARM64 7 #if V8_TARGET_ARCH_ARM64
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 1079 matching lines...) Expand 10 before | Expand all | Expand 10 after
1090 } 1090 }
1091 1091
1092 __ Bind(nested_statement.break_label()); 1092 __ Bind(nested_statement.break_label());
1093 PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS); 1093 PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
1094 } 1094 }
1095 1095
1096 1096
1097 void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) { 1097 void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
1098 ASM_LOCATION("FullCodeGenerator::VisitForInStatement"); 1098 ASM_LOCATION("FullCodeGenerator::VisitForInStatement");
1099 Comment cmnt(masm_, "[ ForInStatement"); 1099 Comment cmnt(masm_, "[ ForInStatement");
1100 int slot = stmt->ForInFeedbackSlot(); 1100 FeedbackVectorSlot slot = stmt->ForInFeedbackSlot();
1101 // TODO(all): This visitor probably needs better comments and a revisit. 1101 // TODO(all): This visitor probably needs better comments and a revisit.
1102 SetStatementPosition(stmt); 1102 SetStatementPosition(stmt);
1103 1103
1104 Label loop, exit; 1104 Label loop, exit;
1105 ForIn loop_statement(this, stmt); 1105 ForIn loop_statement(this, stmt);
1106 increment_loop_depth(); 1106 increment_loop_depth();
1107 1107
1108 // Get the object to enumerate over. If the object is null or undefined, skip 1108 // Get the object to enumerate over. If the object is null or undefined, skip
1109 // over the loop. See ECMA-262 version 5, section 12.6.4. 1109 // over the loop. See ECMA-262 version 5, section 12.6.4.
1110 VisitForAccumulatorValue(stmt->enumerable()); 1110 VisitForAccumulatorValue(stmt->enumerable());
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1174 1174
1175 __ Bind(&no_descriptors); 1175 __ Bind(&no_descriptors);
1176 __ Drop(1); 1176 __ Drop(1);
1177 __ B(&exit); 1177 __ B(&exit);
1178 1178
1179 // We got a fixed array in register x0. Iterate through that. 1179 // We got a fixed array in register x0. Iterate through that.
1180 __ Bind(&fixed_array); 1180 __ Bind(&fixed_array);
1181 1181
1182 __ LoadObject(x1, FeedbackVector()); 1182 __ LoadObject(x1, FeedbackVector());
1183 __ Mov(x10, Operand(TypeFeedbackVector::MegamorphicSentinel(isolate()))); 1183 __ Mov(x10, Operand(TypeFeedbackVector::MegamorphicSentinel(isolate())));
1184 __ Str(x10, FieldMemOperand(x1, FixedArray::OffsetOfElementAt(slot))); 1184 __ Str(x10, FieldMemOperand(x1, FixedArray::OffsetOfElementAt(slot.ToInt())));
1185 1185
1186 __ Mov(x1, Smi::FromInt(1)); // Smi indicates slow check. 1186 __ Mov(x1, Smi::FromInt(1)); // Smi indicates slow check.
1187 __ Peek(x10, 0); // Get enumerated object. 1187 __ Peek(x10, 0); // Get enumerated object.
1188 STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_SPEC_OBJECT_TYPE); 1188 STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_SPEC_OBJECT_TYPE);
1189 // TODO(all): similar check was done already. Can we avoid it here? 1189 // TODO(all): similar check was done already. Can we avoid it here?
1190 __ CompareObjectType(x10, x11, x12, LAST_JS_PROXY_TYPE); 1190 __ CompareObjectType(x10, x11, x12, LAST_JS_PROXY_TYPE);
1191 DCHECK(Smi::FromInt(0) == 0); 1191 DCHECK(Smi::FromInt(0) == 0);
1192 __ CzeroX(x1, le); // Zero indicates proxy. 1192 __ CzeroX(x1, le); // Zero indicates proxy.
1193 __ Ldr(x2, FieldMemOperand(x0, FixedArray::kLengthOffset)); 1193 __ Ldr(x2, FieldMemOperand(x0, FixedArray::kLengthOffset));
1194 // Smi and array, fixed array length (as smi) and initial index. 1194 // Smi and array, fixed array length (as smi) and initial index.
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1345 Comment cnmt(masm_, "[ SuperReference "); 1345 Comment cnmt(masm_, "[ SuperReference ");
1346 1346
1347 __ ldr(LoadDescriptor::ReceiverRegister(), 1347 __ ldr(LoadDescriptor::ReceiverRegister(),
1348 MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); 1348 MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
1349 1349
1350 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); 1350 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol());
1351 __ Mov(LoadDescriptor::NameRegister(), Operand(home_object_symbol)); 1351 __ Mov(LoadDescriptor::NameRegister(), Operand(home_object_symbol));
1352 1352
1353 if (FLAG_vector_ics) { 1353 if (FLAG_vector_ics) {
1354 __ Mov(VectorLoadICDescriptor::SlotRegister(), 1354 __ Mov(VectorLoadICDescriptor::SlotRegister(),
1355 Smi::FromInt(expr->HomeObjectFeedbackSlot())); 1355 SmiFromSlot(expr->HomeObjectFeedbackSlot()));
1356 CallLoadIC(NOT_CONTEXTUAL); 1356 CallLoadIC(NOT_CONTEXTUAL);
1357 } else { 1357 } else {
1358 CallLoadIC(NOT_CONTEXTUAL, expr->HomeObjectFeedbackId()); 1358 CallLoadIC(NOT_CONTEXTUAL, expr->HomeObjectFeedbackId());
1359 } 1359 }
1360 1360
1361 __ Mov(x10, Operand(isolate()->factory()->undefined_value())); 1361 __ Mov(x10, Operand(isolate()->factory()->undefined_value()));
1362 __ cmp(x0, x10); 1362 __ cmp(x0, x10);
1363 Label done; 1363 Label done;
1364 __ b(&done, ne); 1364 __ b(&done, ne);
1365 __ CallRuntime(Runtime::kThrowNonMethodError, 0); 1365 __ CallRuntime(Runtime::kThrowNonMethodError, 0);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1407 // Load next context in chain. 1407 // Load next context in chain.
1408 __ Ldr(next, ContextMemOperand(next, Context::PREVIOUS_INDEX)); 1408 __ Ldr(next, ContextMemOperand(next, Context::PREVIOUS_INDEX));
1409 __ B(&loop); 1409 __ B(&loop);
1410 __ Bind(&fast); 1410 __ Bind(&fast);
1411 } 1411 }
1412 1412
1413 __ Ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectMemOperand()); 1413 __ Ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectMemOperand());
1414 __ Mov(LoadDescriptor::NameRegister(), Operand(proxy->var()->name())); 1414 __ Mov(LoadDescriptor::NameRegister(), Operand(proxy->var()->name()));
1415 if (FLAG_vector_ics) { 1415 if (FLAG_vector_ics) {
1416 __ Mov(VectorLoadICDescriptor::SlotRegister(), 1416 __ Mov(VectorLoadICDescriptor::SlotRegister(),
1417 Smi::FromInt(proxy->VariableFeedbackSlot())); 1417 SmiFromSlot(proxy->VariableFeedbackSlot()));
1418 } 1418 }
1419 1419
1420 ContextualMode mode = (typeof_state == INSIDE_TYPEOF) ? NOT_CONTEXTUAL 1420 ContextualMode mode = (typeof_state == INSIDE_TYPEOF) ? NOT_CONTEXTUAL
1421 : CONTEXTUAL; 1421 : CONTEXTUAL;
1422 CallLoadIC(mode); 1422 CallLoadIC(mode);
1423 } 1423 }
1424 1424
1425 1425
1426 MemOperand FullCodeGenerator::ContextSlotOperandCheckExtensions(Variable* var, 1426 MemOperand FullCodeGenerator::ContextSlotOperandCheckExtensions(Variable* var,
1427 Label* slow) { 1427 Label* slow) {
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1492 1492
1493 // Three cases: global variables, lookup variables, and all other types of 1493 // Three cases: global variables, lookup variables, and all other types of
1494 // variables. 1494 // variables.
1495 switch (var->location()) { 1495 switch (var->location()) {
1496 case Variable::UNALLOCATED: { 1496 case Variable::UNALLOCATED: {
1497 Comment cmnt(masm_, "Global variable"); 1497 Comment cmnt(masm_, "Global variable");
1498 __ Ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectMemOperand()); 1498 __ Ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectMemOperand());
1499 __ Mov(LoadDescriptor::NameRegister(), Operand(var->name())); 1499 __ Mov(LoadDescriptor::NameRegister(), Operand(var->name()));
1500 if (FLAG_vector_ics) { 1500 if (FLAG_vector_ics) {
1501 __ Mov(VectorLoadICDescriptor::SlotRegister(), 1501 __ Mov(VectorLoadICDescriptor::SlotRegister(),
1502 Smi::FromInt(proxy->VariableFeedbackSlot())); 1502 SmiFromSlot(proxy->VariableFeedbackSlot()));
1503 } 1503 }
1504 CallLoadIC(CONTEXTUAL); 1504 CallLoadIC(CONTEXTUAL);
1505 context()->Plug(x0); 1505 context()->Plug(x0);
1506 break; 1506 break;
1507 } 1507 }
1508 1508
1509 case Variable::PARAMETER: 1509 case Variable::PARAMETER:
1510 case Variable::LOCAL: 1510 case Variable::LOCAL:
1511 case Variable::CONTEXT: { 1511 case Variable::CONTEXT: {
1512 Comment cmnt(masm_, var->IsContextSlot() 1512 Comment cmnt(masm_, var->IsContextSlot()
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after
2005 2005
2006 2006
2007 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { 2007 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
2008 SetSourcePosition(prop->position()); 2008 SetSourcePosition(prop->position());
2009 Literal* key = prop->key()->AsLiteral(); 2009 Literal* key = prop->key()->AsLiteral();
2010 DCHECK(!prop->IsSuperAccess()); 2010 DCHECK(!prop->IsSuperAccess());
2011 2011
2012 __ Mov(LoadDescriptor::NameRegister(), Operand(key->value())); 2012 __ Mov(LoadDescriptor::NameRegister(), Operand(key->value()));
2013 if (FLAG_vector_ics) { 2013 if (FLAG_vector_ics) {
2014 __ Mov(VectorLoadICDescriptor::SlotRegister(), 2014 __ Mov(VectorLoadICDescriptor::SlotRegister(),
2015 Smi::FromInt(prop->PropertyFeedbackSlot())); 2015 SmiFromSlot(prop->PropertyFeedbackSlot()));
2016 CallLoadIC(NOT_CONTEXTUAL); 2016 CallLoadIC(NOT_CONTEXTUAL);
2017 } else { 2017 } else {
2018 CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId()); 2018 CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId());
2019 } 2019 }
2020 } 2020 }
2021 2021
2022 2022
2023 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) { 2023 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) {
2024 // Stack: receiver, home_object. 2024 // Stack: receiver, home_object.
2025 SetSourcePosition(prop->position()); 2025 SetSourcePosition(prop->position());
2026 Literal* key = prop->key()->AsLiteral(); 2026 Literal* key = prop->key()->AsLiteral();
2027 DCHECK(!key->value()->IsSmi()); 2027 DCHECK(!key->value()->IsSmi());
2028 DCHECK(prop->IsSuperAccess()); 2028 DCHECK(prop->IsSuperAccess());
2029 2029
2030 __ Push(key->value()); 2030 __ Push(key->value());
2031 __ CallRuntime(Runtime::kLoadFromSuper, 3); 2031 __ CallRuntime(Runtime::kLoadFromSuper, 3);
2032 } 2032 }
2033 2033
2034 2034
2035 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { 2035 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
2036 SetSourcePosition(prop->position()); 2036 SetSourcePosition(prop->position());
2037 // Call keyed load IC. It has arguments key and receiver in r0 and r1. 2037 // Call keyed load IC. It has arguments key and receiver in r0 and r1.
2038 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); 2038 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
2039 if (FLAG_vector_ics) { 2039 if (FLAG_vector_ics) {
2040 __ Mov(VectorLoadICDescriptor::SlotRegister(), 2040 __ Mov(VectorLoadICDescriptor::SlotRegister(),
2041 Smi::FromInt(prop->PropertyFeedbackSlot())); 2041 SmiFromSlot(prop->PropertyFeedbackSlot()));
2042 CallIC(ic); 2042 CallIC(ic);
2043 } else { 2043 } else {
2044 CallIC(ic, prop->PropertyFeedbackId()); 2044 CallIC(ic, prop->PropertyFeedbackId());
2045 } 2045 }
2046 } 2046 }
2047 2047
2048 2048
2049 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) { 2049 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) {
2050 // Stack: receiver, home_object, key. 2050 // Stack: receiver, home_object, key.
2051 SetSourcePosition(prop->position()); 2051 SetSourcePosition(prop->position());
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
2550 { PreservePositionScope scope(masm()->positions_recorder()); 2550 { PreservePositionScope scope(masm()->positions_recorder());
2551 for (int i = 0; i < arg_count; i++) { 2551 for (int i = 0; i < arg_count; i++) {
2552 VisitForStackValue(args->at(i)); 2552 VisitForStackValue(args->at(i));
2553 } 2553 }
2554 } 2554 }
2555 // Record source position of the IC call. 2555 // Record source position of the IC call.
2556 SetSourcePosition(expr->position()); 2556 SetSourcePosition(expr->position());
2557 2557
2558 Handle<Code> ic = CallIC::initialize_stub( 2558 Handle<Code> ic = CallIC::initialize_stub(
2559 isolate(), arg_count, call_type); 2559 isolate(), arg_count, call_type);
2560 __ Mov(x3, Smi::FromInt(expr->CallFeedbackSlot())); 2560 __ Mov(x3, SmiFromSlot(expr->CallFeedbackSlot()));
2561 __ Peek(x1, (arg_count + 1) * kXRegSize); 2561 __ Peek(x1, (arg_count + 1) * kXRegSize);
2562 // Don't assign a type feedback id to the IC, since type feedback is provided 2562 // Don't assign a type feedback id to the IC, since type feedback is provided
2563 // by the vector above. 2563 // by the vector above.
2564 CallIC(ic); 2564 CallIC(ic);
2565 2565
2566 RecordJSReturnSite(expr); 2566 RecordJSReturnSite(expr);
2567 // Restore context register. 2567 // Restore context register.
2568 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 2568 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2569 context()->DropAndPlug(1, x0); 2569 context()->DropAndPlug(1, x0);
2570 } 2570 }
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
2754 // constructor invocation. 2754 // constructor invocation.
2755 SetSourcePosition(expr->position()); 2755 SetSourcePosition(expr->position());
2756 2756
2757 // Load function and argument count into x1 and x0. 2757 // Load function and argument count into x1 and x0.
2758 __ Mov(x0, arg_count); 2758 __ Mov(x0, arg_count);
2759 __ Peek(x1, arg_count * kXRegSize); 2759 __ Peek(x1, arg_count * kXRegSize);
2760 2760
2761 // Record call targets in unoptimized code. 2761 // Record call targets in unoptimized code.
2762 if (FLAG_pretenuring_call_new) { 2762 if (FLAG_pretenuring_call_new) {
2763 EnsureSlotContainsAllocationSite(expr->AllocationSiteFeedbackSlot()); 2763 EnsureSlotContainsAllocationSite(expr->AllocationSiteFeedbackSlot());
2764 DCHECK(expr->AllocationSiteFeedbackSlot() == 2764 DCHECK(expr->AllocationSiteFeedbackSlot().ToInt() ==
2765 expr->CallNewFeedbackSlot() + 1); 2765 expr->CallNewFeedbackSlot().ToInt() + 1);
2766 } 2766 }
2767 2767
2768 __ LoadObject(x2, FeedbackVector()); 2768 __ LoadObject(x2, FeedbackVector());
2769 __ Mov(x3, Smi::FromInt(expr->CallNewFeedbackSlot())); 2769 __ Mov(x3, SmiFromSlot(expr->CallNewFeedbackSlot()));
2770 2770
2771 CallConstructStub stub(isolate(), RECORD_CONSTRUCTOR_TARGET); 2771 CallConstructStub stub(isolate(), RECORD_CONSTRUCTOR_TARGET);
2772 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); 2772 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL);
2773 PrepareForBailoutForId(expr->ReturnId(), TOS_REG); 2773 PrepareForBailoutForId(expr->ReturnId(), TOS_REG);
2774 context()->Plug(x0); 2774 context()->Plug(x0);
2775 } 2775 }
2776 2776
2777 2777
2778 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) { 2778 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) {
2779 ZoneList<Expression*>* args = expr->arguments(); 2779 ZoneList<Expression*>* args = expr->arguments();
(...skipping 1181 matching lines...) Expand 10 before | Expand all | Expand 10 after
3961 __ Ldr(x10, GlobalObjectMemOperand()); 3961 __ Ldr(x10, GlobalObjectMemOperand());
3962 __ Ldr(LoadDescriptor::ReceiverRegister(), 3962 __ Ldr(LoadDescriptor::ReceiverRegister(),
3963 FieldMemOperand(x10, GlobalObject::kBuiltinsOffset)); 3963 FieldMemOperand(x10, GlobalObject::kBuiltinsOffset));
3964 __ Push(LoadDescriptor::ReceiverRegister()); 3964 __ Push(LoadDescriptor::ReceiverRegister());
3965 3965
3966 // Load the function from the receiver. 3966 // Load the function from the receiver.
3967 Handle<String> name = expr->name(); 3967 Handle<String> name = expr->name();
3968 __ Mov(LoadDescriptor::NameRegister(), Operand(name)); 3968 __ Mov(LoadDescriptor::NameRegister(), Operand(name));
3969 if (FLAG_vector_ics) { 3969 if (FLAG_vector_ics) {
3970 __ Mov(VectorLoadICDescriptor::SlotRegister(), 3970 __ Mov(VectorLoadICDescriptor::SlotRegister(),
3971 Smi::FromInt(expr->CallRuntimeFeedbackSlot())); 3971 SmiFromSlot(expr->CallRuntimeFeedbackSlot()));
3972 CallLoadIC(NOT_CONTEXTUAL); 3972 CallLoadIC(NOT_CONTEXTUAL);
3973 } else { 3973 } else {
3974 CallLoadIC(NOT_CONTEXTUAL, expr->CallRuntimeFeedbackId()); 3974 CallLoadIC(NOT_CONTEXTUAL, expr->CallRuntimeFeedbackId());
3975 } 3975 }
3976 3976
3977 // Push the target function under the receiver. 3977 // Push the target function under the receiver.
3978 __ Pop(x10); 3978 __ Pop(x10);
3979 __ Push(x0, x10); 3979 __ Push(x0, x10);
3980 3980
3981 int arg_count = args->length(); 3981 int arg_count = args->length();
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
4361 void FullCodeGenerator::VisitForTypeofValue(Expression* expr) { 4361 void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
4362 DCHECK(!context()->IsEffect()); 4362 DCHECK(!context()->IsEffect());
4363 DCHECK(!context()->IsTest()); 4363 DCHECK(!context()->IsTest());
4364 VariableProxy* proxy = expr->AsVariableProxy(); 4364 VariableProxy* proxy = expr->AsVariableProxy();
4365 if (proxy != NULL && proxy->var()->IsUnallocated()) { 4365 if (proxy != NULL && proxy->var()->IsUnallocated()) {
4366 Comment cmnt(masm_, "Global variable"); 4366 Comment cmnt(masm_, "Global variable");
4367 __ Ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectMemOperand()); 4367 __ Ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectMemOperand());
4368 __ Mov(LoadDescriptor::NameRegister(), Operand(proxy->name())); 4368 __ Mov(LoadDescriptor::NameRegister(), Operand(proxy->name()));
4369 if (FLAG_vector_ics) { 4369 if (FLAG_vector_ics) {
4370 __ Mov(VectorLoadICDescriptor::SlotRegister(), 4370 __ Mov(VectorLoadICDescriptor::SlotRegister(),
4371 Smi::FromInt(proxy->VariableFeedbackSlot())); 4371 SmiFromSlot(proxy->VariableFeedbackSlot()));
4372 } 4372 }
4373 // Use a regular load, not a contextual load, to avoid a reference 4373 // Use a regular load, not a contextual load, to avoid a reference
4374 // error. 4374 // error.
4375 CallLoadIC(NOT_CONTEXTUAL); 4375 CallLoadIC(NOT_CONTEXTUAL);
4376 PrepareForBailout(expr, TOS_REG); 4376 PrepareForBailout(expr, TOS_REG);
4377 context()->Plug(x0); 4377 context()->Plug(x0);
4378 } else if (proxy != NULL && proxy->var()->IsLookupSlot()) { 4378 } else if (proxy != NULL && proxy->var()->IsLookupSlot()) {
4379 Label done, slow; 4379 Label done, slow;
4380 4380
4381 // Generate code for loading from variables potentially shadowed 4381 // Generate code for loading from variables potentially shadowed
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
4717 __ LoadRoot(load_name, Heap::knext_stringRootIndex); // "next" 4717 __ LoadRoot(load_name, Heap::knext_stringRootIndex); // "next"
4718 __ Peek(x3, 1 * kPointerSize); // iter 4718 __ Peek(x3, 1 * kPointerSize); // iter
4719 __ Push(load_name, x3, x0); // "next", iter, received 4719 __ Push(load_name, x3, x0); // "next", iter, received
4720 4720
4721 // result = receiver[f](arg); 4721 // result = receiver[f](arg);
4722 __ Bind(&l_call); 4722 __ Bind(&l_call);
4723 __ Peek(load_receiver, 1 * kPointerSize); 4723 __ Peek(load_receiver, 1 * kPointerSize);
4724 __ Peek(load_name, 2 * kPointerSize); 4724 __ Peek(load_name, 2 * kPointerSize);
4725 if (FLAG_vector_ics) { 4725 if (FLAG_vector_ics) {
4726 __ Mov(VectorLoadICDescriptor::SlotRegister(), 4726 __ Mov(VectorLoadICDescriptor::SlotRegister(),
4727 Smi::FromInt(expr->KeyedLoadFeedbackSlot())); 4727 SmiFromSlot(expr->KeyedLoadFeedbackSlot()));
4728 } 4728 }
4729 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); 4729 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
4730 CallIC(ic, TypeFeedbackId::None()); 4730 CallIC(ic, TypeFeedbackId::None());
4731 __ Mov(x1, x0); 4731 __ Mov(x1, x0);
4732 __ Poke(x1, 2 * kPointerSize); 4732 __ Poke(x1, 2 * kPointerSize);
4733 CallFunctionStub stub(isolate(), 1, CALL_AS_METHOD); 4733 CallFunctionStub stub(isolate(), 1, CALL_AS_METHOD);
4734 __ CallStub(&stub); 4734 __ CallStub(&stub);
4735 4735
4736 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 4736 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
4737 __ Drop(1); // The function is still on the stack; drop it. 4737 __ Drop(1); // The function is still on the stack; drop it.
4738 4738
4739 // if (!result.done) goto l_try; 4739 // if (!result.done) goto l_try;
4740 __ Bind(&l_loop); 4740 __ Bind(&l_loop);
4741 __ Move(load_receiver, x0); 4741 __ Move(load_receiver, x0);
4742 4742
4743 __ Push(load_receiver); // save result 4743 __ Push(load_receiver); // save result
4744 __ LoadRoot(load_name, Heap::kdone_stringRootIndex); // "done" 4744 __ LoadRoot(load_name, Heap::kdone_stringRootIndex); // "done"
4745 if (FLAG_vector_ics) { 4745 if (FLAG_vector_ics) {
4746 __ Mov(VectorLoadICDescriptor::SlotRegister(), 4746 __ Mov(VectorLoadICDescriptor::SlotRegister(),
4747 Smi::FromInt(expr->DoneFeedbackSlot())); 4747 SmiFromSlot(expr->DoneFeedbackSlot()));
4748 } 4748 }
4749 CallLoadIC(NOT_CONTEXTUAL); // x0=result.done 4749 CallLoadIC(NOT_CONTEXTUAL); // x0=result.done
4750 // The ToBooleanStub argument (result.done) is in x0. 4750 // The ToBooleanStub argument (result.done) is in x0.
4751 Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate()); 4751 Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate());
4752 CallIC(bool_ic); 4752 CallIC(bool_ic);
4753 __ Cbz(x0, &l_try); 4753 __ Cbz(x0, &l_try);
4754 4754
4755 // result.value 4755 // result.value
4756 __ Pop(load_receiver); // result 4756 __ Pop(load_receiver); // result
4757 __ LoadRoot(load_name, Heap::kvalue_stringRootIndex); // "value" 4757 __ LoadRoot(load_name, Heap::kvalue_stringRootIndex); // "value"
4758 if (FLAG_vector_ics) { 4758 if (FLAG_vector_ics) {
4759 __ Mov(VectorLoadICDescriptor::SlotRegister(), 4759 __ Mov(VectorLoadICDescriptor::SlotRegister(),
4760 Smi::FromInt(expr->ValueFeedbackSlot())); 4760 SmiFromSlot(expr->ValueFeedbackSlot()));
4761 } 4761 }
4762 CallLoadIC(NOT_CONTEXTUAL); // x0=result.value 4762 CallLoadIC(NOT_CONTEXTUAL); // x0=result.value
4763 context()->DropAndPlug(2, x0); // drop iter and g 4763 context()->DropAndPlug(2, x0); // drop iter and g
4764 break; 4764 break;
4765 } 4765 }
4766 } 4766 }
4767 } 4767 }
4768 4768
4769 4769
4770 void FullCodeGenerator::EmitGeneratorResume(Expression *generator, 4770 void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
5181 return previous_; 5181 return previous_;
5182 } 5182 }
5183 5183
5184 5184
5185 #undef __ 5185 #undef __
5186 5186
5187 5187
5188 } } // namespace v8::internal 5188 } } // namespace v8::internal
5189 5189
5190 #endif // V8_TARGET_ARCH_ARM64 5190 #endif // V8_TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « src/arm/lithium-codegen-arm.cc ('k') | src/arm64/lithium-codegen-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698