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

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

Issue 1129853002: Removing FLAG_vector_ics. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE. Created 5 years, 7 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 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_ARM 7 #if V8_TARGET_ARCH_ARM
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 1316 matching lines...) Expand 10 before | Expand all | Expand 10 after
1327 1327
1328 void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) { 1328 void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) {
1329 Comment cnmt(masm_, "[ SuperReference "); 1329 Comment cnmt(masm_, "[ SuperReference ");
1330 1330
1331 __ ldr(LoadDescriptor::ReceiverRegister(), 1331 __ ldr(LoadDescriptor::ReceiverRegister(),
1332 MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); 1332 MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
1333 1333
1334 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol()); 1334 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol());
1335 __ Move(LoadDescriptor::NameRegister(), home_object_symbol); 1335 __ Move(LoadDescriptor::NameRegister(), home_object_symbol);
1336 1336
1337 if (FLAG_vector_ics) { 1337 __ mov(VectorLoadICDescriptor::SlotRegister(),
1338 __ mov(VectorLoadICDescriptor::SlotRegister(), 1338 Operand(SmiFromSlot(expr->HomeObjectFeedbackSlot())));
1339 Operand(SmiFromSlot(expr->HomeObjectFeedbackSlot()))); 1339 CallLoadIC(NOT_CONTEXTUAL);
1340 CallLoadIC(NOT_CONTEXTUAL);
1341 } else {
1342 CallLoadIC(NOT_CONTEXTUAL, expr->HomeObjectFeedbackId());
1343 }
1344 1340
1345 __ cmp(r0, Operand(isolate()->factory()->undefined_value())); 1341 __ cmp(r0, Operand(isolate()->factory()->undefined_value()));
1346 Label done; 1342 Label done;
1347 __ b(ne, &done); 1343 __ b(ne, &done);
1348 __ CallRuntime(Runtime::kThrowNonMethodError, 0); 1344 __ CallRuntime(Runtime::kThrowNonMethodError, 0);
1349 __ bind(&done); 1345 __ bind(&done);
1350 } 1346 }
1351 1347
1352 1348
1353 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, 1349 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer,
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1406 __ tst(temp, temp); 1402 __ tst(temp, temp);
1407 __ b(ne, slow); 1403 __ b(ne, slow);
1408 // Load next context in chain. 1404 // Load next context in chain.
1409 __ ldr(next, ContextOperand(next, Context::PREVIOUS_INDEX)); 1405 __ ldr(next, ContextOperand(next, Context::PREVIOUS_INDEX));
1410 __ b(&loop); 1406 __ b(&loop);
1411 __ bind(&fast); 1407 __ bind(&fast);
1412 } 1408 }
1413 1409
1414 __ ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); 1410 __ ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
1415 __ mov(LoadDescriptor::NameRegister(), Operand(proxy->var()->name())); 1411 __ mov(LoadDescriptor::NameRegister(), Operand(proxy->var()->name()));
1416 if (FLAG_vector_ics) { 1412 __ mov(VectorLoadICDescriptor::SlotRegister(),
1417 __ mov(VectorLoadICDescriptor::SlotRegister(), 1413 Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
1418 Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
1419 }
1420 1414
1421 ContextualMode mode = (typeof_state == INSIDE_TYPEOF) 1415 ContextualMode mode = (typeof_state == INSIDE_TYPEOF)
1422 ? NOT_CONTEXTUAL 1416 ? NOT_CONTEXTUAL
1423 : CONTEXTUAL; 1417 : CONTEXTUAL;
1424 CallLoadIC(mode); 1418 CallLoadIC(mode);
1425 } 1419 }
1426 1420
1427 1421
1428 MemOperand FullCodeGenerator::ContextSlotOperandCheckExtensions(Variable* var, 1422 MemOperand FullCodeGenerator::ContextSlotOperandCheckExtensions(Variable* var,
1429 Label* slow) { 1423 Label* slow) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1496 PrepareForBailoutForId(proxy->BeforeId(), NO_REGISTERS); 1490 PrepareForBailoutForId(proxy->BeforeId(), NO_REGISTERS);
1497 Variable* var = proxy->var(); 1491 Variable* var = proxy->var();
1498 1492
1499 // Three cases: global variables, lookup variables, and all other types of 1493 // Three cases: global variables, lookup variables, and all other types of
1500 // variables. 1494 // variables.
1501 switch (var->location()) { 1495 switch (var->location()) {
1502 case Variable::UNALLOCATED: { 1496 case Variable::UNALLOCATED: {
1503 Comment cmnt(masm_, "[ Global variable"); 1497 Comment cmnt(masm_, "[ Global variable");
1504 __ ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); 1498 __ ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
1505 __ mov(LoadDescriptor::NameRegister(), Operand(var->name())); 1499 __ mov(LoadDescriptor::NameRegister(), Operand(var->name()));
1506 if (FLAG_vector_ics) { 1500 __ mov(VectorLoadICDescriptor::SlotRegister(),
1507 __ mov(VectorLoadICDescriptor::SlotRegister(), 1501 Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
1508 Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
1509 }
1510 CallGlobalLoadIC(var->name()); 1502 CallGlobalLoadIC(var->name());
1511 context()->Plug(r0); 1503 context()->Plug(r0);
1512 break; 1504 break;
1513 } 1505 }
1514 1506
1515 case Variable::PARAMETER: 1507 case Variable::PARAMETER:
1516 case Variable::LOCAL: 1508 case Variable::LOCAL:
1517 case Variable::CONTEXT: { 1509 case Variable::CONTEXT: {
1518 Comment cmnt(masm_, var->IsContextSlot() ? "[ Context variable" 1510 Comment cmnt(masm_, var->IsContextSlot() ? "[ Context variable"
1519 : "[ Stack variable"); 1511 : "[ Stack variable");
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after
2194 __ bind(&l_next); 2186 __ bind(&l_next);
2195 2187
2196 __ LoadRoot(load_name, Heap::knext_stringRootIndex); // "next" 2188 __ LoadRoot(load_name, Heap::knext_stringRootIndex); // "next"
2197 __ ldr(r3, MemOperand(sp, 1 * kPointerSize)); // iter 2189 __ ldr(r3, MemOperand(sp, 1 * kPointerSize)); // iter
2198 __ Push(load_name, r3, r0); // "next", iter, received 2190 __ Push(load_name, r3, r0); // "next", iter, received
2199 2191
2200 // result = receiver[f](arg); 2192 // result = receiver[f](arg);
2201 __ bind(&l_call); 2193 __ bind(&l_call);
2202 __ ldr(load_receiver, MemOperand(sp, kPointerSize)); 2194 __ ldr(load_receiver, MemOperand(sp, kPointerSize));
2203 __ ldr(load_name, MemOperand(sp, 2 * kPointerSize)); 2195 __ ldr(load_name, MemOperand(sp, 2 * kPointerSize));
2204 if (FLAG_vector_ics) { 2196 __ mov(VectorLoadICDescriptor::SlotRegister(),
2205 __ mov(VectorLoadICDescriptor::SlotRegister(), 2197 Operand(SmiFromSlot(expr->KeyedLoadFeedbackSlot())));
2206 Operand(SmiFromSlot(expr->KeyedLoadFeedbackSlot())));
2207 }
2208 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); 2198 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
2209 CallIC(ic, TypeFeedbackId::None()); 2199 CallIC(ic, TypeFeedbackId::None());
2210 __ mov(r1, r0); 2200 __ mov(r1, r0);
2211 __ str(r1, MemOperand(sp, 2 * kPointerSize)); 2201 __ str(r1, MemOperand(sp, 2 * kPointerSize));
2212 CallFunctionStub stub(isolate(), 1, CALL_AS_METHOD); 2202 CallFunctionStub stub(isolate(), 1, CALL_AS_METHOD);
2213 __ CallStub(&stub); 2203 __ CallStub(&stub);
2214 2204
2215 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 2205 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2216 __ Drop(1); // The function is still on the stack; drop it. 2206 __ Drop(1); // The function is still on the stack; drop it.
2217 2207
2218 // if (!result.done) goto l_try; 2208 // if (!result.done) goto l_try;
2219 __ bind(&l_loop); 2209 __ bind(&l_loop);
2220 __ Move(load_receiver, r0); 2210 __ Move(load_receiver, r0);
2221 2211
2222 __ push(load_receiver); // save result 2212 __ push(load_receiver); // save result
2223 __ LoadRoot(load_name, Heap::kdone_stringRootIndex); // "done" 2213 __ LoadRoot(load_name, Heap::kdone_stringRootIndex); // "done"
2224 if (FLAG_vector_ics) { 2214 __ mov(VectorLoadICDescriptor::SlotRegister(),
2225 __ mov(VectorLoadICDescriptor::SlotRegister(), 2215 Operand(SmiFromSlot(expr->DoneFeedbackSlot())));
2226 Operand(SmiFromSlot(expr->DoneFeedbackSlot())));
2227 }
2228 CallLoadIC(NOT_CONTEXTUAL); // r0=result.done 2216 CallLoadIC(NOT_CONTEXTUAL); // r0=result.done
2229 Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate()); 2217 Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate());
2230 CallIC(bool_ic); 2218 CallIC(bool_ic);
2231 __ cmp(r0, Operand(0)); 2219 __ cmp(r0, Operand(0));
2232 __ b(eq, &l_try); 2220 __ b(eq, &l_try);
2233 2221
2234 // result.value 2222 // result.value
2235 __ pop(load_receiver); // result 2223 __ pop(load_receiver); // result
2236 __ LoadRoot(load_name, Heap::kvalue_stringRootIndex); // "value" 2224 __ LoadRoot(load_name, Heap::kvalue_stringRootIndex); // "value"
2237 if (FLAG_vector_ics) { 2225 __ mov(VectorLoadICDescriptor::SlotRegister(),
2238 __ mov(VectorLoadICDescriptor::SlotRegister(), 2226 Operand(SmiFromSlot(expr->ValueFeedbackSlot())));
2239 Operand(SmiFromSlot(expr->ValueFeedbackSlot())));
2240 }
2241 CallLoadIC(NOT_CONTEXTUAL); // r0=result.value 2227 CallLoadIC(NOT_CONTEXTUAL); // r0=result.value
2242 context()->DropAndPlug(2, r0); // drop iter and g 2228 context()->DropAndPlug(2, r0); // drop iter and g
2243 break; 2229 break;
2244 } 2230 }
2245 } 2231 }
2246 } 2232 }
2247 2233
2248 2234
2249 void FullCodeGenerator::EmitGeneratorResume(Expression *generator, 2235 void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
2250 Expression *value, 2236 Expression *value,
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
2382 r2, r3, kLRHasBeenSaved, kDontSaveFPRegs); 2368 r2, r3, kLRHasBeenSaved, kDontSaveFPRegs);
2383 } 2369 }
2384 2370
2385 2371
2386 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { 2372 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
2387 SetSourcePosition(prop->position()); 2373 SetSourcePosition(prop->position());
2388 Literal* key = prop->key()->AsLiteral(); 2374 Literal* key = prop->key()->AsLiteral();
2389 DCHECK(!prop->IsSuperAccess()); 2375 DCHECK(!prop->IsSuperAccess());
2390 2376
2391 __ mov(LoadDescriptor::NameRegister(), Operand(key->value())); 2377 __ mov(LoadDescriptor::NameRegister(), Operand(key->value()));
2392 if (FLAG_vector_ics) { 2378 __ mov(VectorLoadICDescriptor::SlotRegister(),
2393 __ mov(VectorLoadICDescriptor::SlotRegister(), 2379 Operand(SmiFromSlot(prop->PropertyFeedbackSlot())));
2394 Operand(SmiFromSlot(prop->PropertyFeedbackSlot()))); 2380 CallLoadIC(NOT_CONTEXTUAL);
2395 CallLoadIC(NOT_CONTEXTUAL);
2396 } else {
2397 CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId());
2398 }
2399 } 2381 }
2400 2382
2401 2383
2402 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) { 2384 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) {
2403 // Stack: receiver, home_object. 2385 // Stack: receiver, home_object.
2404 SetSourcePosition(prop->position()); 2386 SetSourcePosition(prop->position());
2405 Literal* key = prop->key()->AsLiteral(); 2387 Literal* key = prop->key()->AsLiteral();
2406 DCHECK(!key->value()->IsSmi()); 2388 DCHECK(!key->value()->IsSmi());
2407 DCHECK(prop->IsSuperAccess()); 2389 DCHECK(prop->IsSuperAccess());
2408 2390
2409 __ Push(key->value()); 2391 __ Push(key->value());
2410 __ CallRuntime(Runtime::kLoadFromSuper, 3); 2392 __ CallRuntime(Runtime::kLoadFromSuper, 3);
2411 } 2393 }
2412 2394
2413 2395
2414 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { 2396 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
2415 SetSourcePosition(prop->position()); 2397 SetSourcePosition(prop->position());
2416 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); 2398 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code();
2417 if (FLAG_vector_ics) { 2399 __ mov(VectorLoadICDescriptor::SlotRegister(),
2418 __ mov(VectorLoadICDescriptor::SlotRegister(), 2400 Operand(SmiFromSlot(prop->PropertyFeedbackSlot())));
2419 Operand(SmiFromSlot(prop->PropertyFeedbackSlot()))); 2401 CallIC(ic);
2420 CallIC(ic);
2421 } else {
2422 CallIC(ic, prop->PropertyFeedbackId());
2423 }
2424 } 2402 }
2425 2403
2426 2404
2427 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) { 2405 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) {
2428 // Stack: receiver, home_object, key. 2406 // Stack: receiver, home_object, key.
2429 SetSourcePosition(prop->position()); 2407 SetSourcePosition(prop->position());
2430 2408
2431 __ CallRuntime(Runtime::kLoadKeyedFromSuper, 3); 2409 __ CallRuntime(Runtime::kLoadKeyedFromSuper, 3);
2432 } 2410 }
2433 2411
(...skipping 2192 matching lines...) Expand 10 before | Expand all | Expand 10 after
4626 4604
4627 void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) { 4605 void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) {
4628 // Push the builtins object as the receiver. 4606 // Push the builtins object as the receiver.
4629 Register receiver = LoadDescriptor::ReceiverRegister(); 4607 Register receiver = LoadDescriptor::ReceiverRegister();
4630 __ ldr(receiver, GlobalObjectOperand()); 4608 __ ldr(receiver, GlobalObjectOperand());
4631 __ ldr(receiver, FieldMemOperand(receiver, GlobalObject::kBuiltinsOffset)); 4609 __ ldr(receiver, FieldMemOperand(receiver, GlobalObject::kBuiltinsOffset));
4632 __ push(receiver); 4610 __ push(receiver);
4633 4611
4634 // Load the function from the receiver. 4612 // Load the function from the receiver.
4635 __ mov(LoadDescriptor::NameRegister(), Operand(expr->name())); 4613 __ mov(LoadDescriptor::NameRegister(), Operand(expr->name()));
4636 if (FLAG_vector_ics) { 4614 __ mov(VectorLoadICDescriptor::SlotRegister(),
4637 __ mov(VectorLoadICDescriptor::SlotRegister(), 4615 Operand(SmiFromSlot(expr->CallRuntimeFeedbackSlot())));
4638 Operand(SmiFromSlot(expr->CallRuntimeFeedbackSlot()))); 4616 CallLoadIC(NOT_CONTEXTUAL);
4639 CallLoadIC(NOT_CONTEXTUAL);
4640 } else {
4641 CallLoadIC(NOT_CONTEXTUAL, expr->CallRuntimeFeedbackId());
4642 }
4643 } 4617 }
4644 4618
4645 4619
4646 void FullCodeGenerator::EmitCallJSRuntimeFunction(CallRuntime* expr) { 4620 void FullCodeGenerator::EmitCallJSRuntimeFunction(CallRuntime* expr) {
4647 ZoneList<Expression*>* args = expr->arguments(); 4621 ZoneList<Expression*>* args = expr->arguments();
4648 int arg_count = args->length(); 4622 int arg_count = args->length();
4649 4623
4650 // Record source position of the IC call. 4624 // Record source position of the IC call.
4651 SetSourcePosition(expr->position()); 4625 SetSourcePosition(expr->position());
4652 CallFunctionStub stub(isolate(), arg_count, NO_CALL_FUNCTION_FLAGS); 4626 CallFunctionStub stub(isolate(), arg_count, NO_CALL_FUNCTION_FLAGS);
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
5065 5039
5066 5040
5067 void FullCodeGenerator::VisitForTypeofValue(Expression* expr) { 5041 void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
5068 DCHECK(!context()->IsEffect()); 5042 DCHECK(!context()->IsEffect());
5069 DCHECK(!context()->IsTest()); 5043 DCHECK(!context()->IsTest());
5070 VariableProxy* proxy = expr->AsVariableProxy(); 5044 VariableProxy* proxy = expr->AsVariableProxy();
5071 if (proxy != NULL && proxy->var()->IsUnallocated()) { 5045 if (proxy != NULL && proxy->var()->IsUnallocated()) {
5072 Comment cmnt(masm_, "[ Global variable"); 5046 Comment cmnt(masm_, "[ Global variable");
5073 __ ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); 5047 __ ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand());
5074 __ mov(LoadDescriptor::NameRegister(), Operand(proxy->name())); 5048 __ mov(LoadDescriptor::NameRegister(), Operand(proxy->name()));
5075 if (FLAG_vector_ics) { 5049 __ mov(VectorLoadICDescriptor::SlotRegister(),
5076 __ mov(VectorLoadICDescriptor::SlotRegister(), 5050 Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
5077 Operand(SmiFromSlot(proxy->VariableFeedbackSlot())));
5078 }
5079 // Use a regular load, not a contextual load, to avoid a reference 5051 // Use a regular load, not a contextual load, to avoid a reference
5080 // error. 5052 // error.
5081 CallLoadIC(NOT_CONTEXTUAL); 5053 CallLoadIC(NOT_CONTEXTUAL);
5082 PrepareForBailout(expr, TOS_REG); 5054 PrepareForBailout(expr, TOS_REG);
5083 context()->Plug(r0); 5055 context()->Plug(r0);
5084 } else if (proxy != NULL && proxy->var()->IsLookupSlot()) { 5056 } else if (proxy != NULL && proxy->var()->IsLookupSlot()) {
5085 Comment cmnt(masm_, "[ Lookup slot"); 5057 Comment cmnt(masm_, "[ Lookup slot");
5086 Label done, slow; 5058 Label done, slow;
5087 5059
5088 // Generate code for loading from variables potentially shadowed 5060 // Generate code for loading from variables potentially shadowed
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after
5511 5483
5512 DCHECK(interrupt_address == 5484 DCHECK(interrupt_address ==
5513 isolate->builtins()->OsrAfterStackCheck()->entry()); 5485 isolate->builtins()->OsrAfterStackCheck()->entry());
5514 return OSR_AFTER_STACK_CHECK; 5486 return OSR_AFTER_STACK_CHECK;
5515 } 5487 }
5516 5488
5517 5489
5518 } } // namespace v8::internal 5490 } } // namespace v8::internal
5519 5491
5520 #endif // V8_TARGET_ARCH_ARM 5492 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/arm/debug-arm.cc ('k') | src/arm/lithium-arm.h » ('j') | src/ic/arm64/ic-arm64.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698