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

Side by Side Diff: src/mips/stub-cache-mips.cc

Issue 26883007: MIPS: Remove BaseLoad/StoreStub compilers, and the stub-cache interface duplication. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 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 | « 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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 Label* miss) { 418 Label* miss) {
419 Handle<Cell> cell = GlobalObject::EnsurePropertyCell(global, name); 419 Handle<Cell> cell = GlobalObject::EnsurePropertyCell(global, name);
420 ASSERT(cell->value()->IsTheHole()); 420 ASSERT(cell->value()->IsTheHole());
421 __ li(scratch, Operand(cell)); 421 __ li(scratch, Operand(cell));
422 __ lw(scratch, FieldMemOperand(scratch, Cell::kValueOffset)); 422 __ lw(scratch, FieldMemOperand(scratch, Cell::kValueOffset));
423 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); 423 __ LoadRoot(at, Heap::kTheHoleValueRootIndex);
424 __ Branch(miss, ne, scratch, Operand(at)); 424 __ Branch(miss, ne, scratch, Operand(at));
425 } 425 }
426 426
427 427
428 void BaseStoreStubCompiler::GenerateNegativeHolderLookup( 428 void StoreStubCompiler::GenerateNegativeHolderLookup(
429 MacroAssembler* masm, 429 MacroAssembler* masm,
430 Handle<JSObject> holder, 430 Handle<JSObject> holder,
431 Register holder_reg, 431 Register holder_reg,
432 Handle<Name> name, 432 Handle<Name> name,
433 Label* miss) { 433 Label* miss) {
434 if (holder->IsJSGlobalObject()) { 434 if (holder->IsJSGlobalObject()) {
435 GenerateCheckPropertyCell( 435 GenerateCheckPropertyCell(
436 masm, Handle<GlobalObject>::cast(holder), name, scratch1(), miss); 436 masm, Handle<GlobalObject>::cast(holder), name, scratch1(), miss);
437 } else if (!holder->HasFastProperties() && !holder->IsJSGlobalProxy()) { 437 } else if (!holder->HasFastProperties() && !holder->IsJSGlobalProxy()) {
438 GenerateDictionaryNegativeLookup( 438 GenerateDictionaryNegativeLookup(
439 masm, miss, holder_reg, name, scratch1(), scratch2()); 439 masm, miss, holder_reg, name, scratch1(), scratch2());
440 } 440 }
441 } 441 }
442 442
443 443
444 // Generate StoreTransition code, value is passed in a0 register. 444 // Generate StoreTransition code, value is passed in a0 register.
445 // After executing generated code, the receiver_reg and name_reg 445 // After executing generated code, the receiver_reg and name_reg
446 // may be clobbered. 446 // may be clobbered.
447 void BaseStoreStubCompiler::GenerateStoreTransition(MacroAssembler* masm, 447 void StoreStubCompiler::GenerateStoreTransition(MacroAssembler* masm,
448 Handle<JSObject> object, 448 Handle<JSObject> object,
449 LookupResult* lookup, 449 LookupResult* lookup,
450 Handle<Map> transition, 450 Handle<Map> transition,
451 Handle<Name> name, 451 Handle<Name> name,
452 Register receiver_reg, 452 Register receiver_reg,
453 Register storage_reg, 453 Register storage_reg,
454 Register value_reg, 454 Register value_reg,
455 Register scratch1, 455 Register scratch1,
456 Register scratch2, 456 Register scratch2,
457 Register scratch3, 457 Register scratch3,
458 Label* miss_label, 458 Label* miss_label,
459 Label* slow) { 459 Label* slow) {
460 // a0 : value. 460 // a0 : value.
461 Label exit; 461 Label exit;
462 462
463 int descriptor = transition->LastAdded(); 463 int descriptor = transition->LastAdded();
464 DescriptorArray* descriptors = transition->instance_descriptors(); 464 DescriptorArray* descriptors = transition->instance_descriptors();
465 PropertyDetails details = descriptors->GetDetails(descriptor); 465 PropertyDetails details = descriptors->GetDetails(descriptor);
466 Representation representation = details.representation(); 466 Representation representation = details.representation();
467 ASSERT(!representation.IsNone()); 467 ASSERT(!representation.IsNone());
468 468
469 if (details.type() == CONSTANT) { 469 if (details.type() == CONSTANT) {
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 __ bind(&exit); 601 __ bind(&exit);
602 __ Ret(USE_DELAY_SLOT); 602 __ Ret(USE_DELAY_SLOT);
603 __ mov(v0, a0); 603 __ mov(v0, a0);
604 } 604 }
605 605
606 606
607 // Generate StoreField code, value is passed in a0 register. 607 // Generate StoreField code, value is passed in a0 register.
608 // When leaving generated code after success, the receiver_reg and name_reg 608 // When leaving generated code after success, the receiver_reg and name_reg
609 // may be clobbered. Upon branch to miss_label, the receiver and name 609 // may be clobbered. Upon branch to miss_label, the receiver and name
610 // registers have their original values. 610 // registers have their original values.
611 void BaseStoreStubCompiler::GenerateStoreField(MacroAssembler* masm, 611 void StoreStubCompiler::GenerateStoreField(MacroAssembler* masm,
612 Handle<JSObject> object, 612 Handle<JSObject> object,
613 LookupResult* lookup, 613 LookupResult* lookup,
614 Register receiver_reg, 614 Register receiver_reg,
615 Register name_reg, 615 Register name_reg,
616 Register value_reg, 616 Register value_reg,
617 Register scratch1, 617 Register scratch1,
618 Register scratch2, 618 Register scratch2,
619 Label* miss_label) { 619 Label* miss_label) {
620 // a0 : value 620 // a0 : value
621 Label exit; 621 Label exit;
622 622
623 // Stub never generated for non-global objects that require access 623 // Stub never generated for non-global objects that require access
624 // checks. 624 // checks.
625 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); 625 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
626 626
627 int index = lookup->GetFieldIndex().field_index(); 627 int index = lookup->GetFieldIndex().field_index();
628 628
629 // Adjust for the number of properties stored in the object. Even in the 629 // Adjust for the number of properties stored in the object. Even in the
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 } 722 }
723 723
724 // Return the value (register v0). 724 // Return the value (register v0).
725 ASSERT(value_reg.is(a0)); 725 ASSERT(value_reg.is(a0));
726 __ bind(&exit); 726 __ bind(&exit);
727 __ Ret(USE_DELAY_SLOT); 727 __ Ret(USE_DELAY_SLOT);
728 __ mov(v0, a0); 728 __ mov(v0, a0);
729 } 729 }
730 730
731 731
732 void BaseStoreStubCompiler::GenerateRestoreName(MacroAssembler* masm, 732 void StoreStubCompiler::GenerateRestoreName(MacroAssembler* masm,
733 Label* label, 733 Label* label,
734 Handle<Name> name) { 734 Handle<Name> name) {
735 if (!label->is_unused()) { 735 if (!label->is_unused()) {
736 __ bind(label); 736 __ bind(label);
737 __ li(this->name(), Operand(name)); 737 __ li(this->name(), Operand(name));
738 } 738 }
739 } 739 }
740 740
741 741
742 static void GenerateCallFunction(MacroAssembler* masm, 742 static void GenerateCallFunction(MacroAssembler* masm,
743 Handle<Object> object, 743 Handle<Object> object,
744 const ParameterCount& arguments, 744 const ParameterCount& arguments,
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after
1289 // If we've skipped any global objects, it's not enough to verify that 1289 // If we've skipped any global objects, it's not enough to verify that
1290 // their maps haven't changed. We also need to check that the property 1290 // their maps haven't changed. We also need to check that the property
1291 // cell for the property is still empty. 1291 // cell for the property is still empty.
1292 GenerateCheckPropertyCells(masm(), object, holder, name, scratch1, miss); 1292 GenerateCheckPropertyCells(masm(), object, holder, name, scratch1, miss);
1293 1293
1294 // Return the register containing the holder. 1294 // Return the register containing the holder.
1295 return reg; 1295 return reg;
1296 } 1296 }
1297 1297
1298 1298
1299 void BaseLoadStubCompiler::HandlerFrontendFooter(Handle<Name> name, 1299 void LoadStubCompiler::HandlerFrontendFooter(Handle<Name> name,
1300 Label* success, 1300 Label* success,
1301 Label* miss) { 1301 Label* miss) {
1302 if (!miss->is_unused()) { 1302 if (!miss->is_unused()) {
1303 __ Branch(success); 1303 __ Branch(success);
1304 __ bind(miss); 1304 __ bind(miss);
1305 TailCallBuiltin(masm(), MissBuiltin(kind())); 1305 TailCallBuiltin(masm(), MissBuiltin(kind()));
1306 } 1306 }
1307 } 1307 }
1308 1308
1309 1309
1310 void BaseStoreStubCompiler::HandlerFrontendFooter(Handle<Name> name, 1310 void StoreStubCompiler::HandlerFrontendFooter(Handle<Name> name,
1311 Label* success, 1311 Label* success,
1312 Label* miss) { 1312 Label* miss) {
1313 if (!miss->is_unused()) { 1313 if (!miss->is_unused()) {
1314 __ b(success); 1314 __ b(success);
1315 GenerateRestoreName(masm(), miss, name); 1315 GenerateRestoreName(masm(), miss, name);
1316 TailCallBuiltin(masm(), MissBuiltin(kind())); 1316 TailCallBuiltin(masm(), MissBuiltin(kind()));
1317 } 1317 }
1318 } 1318 }
1319 1319
1320 1320
1321 Register BaseLoadStubCompiler::CallbackHandlerFrontend( 1321 Register LoadStubCompiler::CallbackHandlerFrontend(
1322 Handle<JSObject> object, 1322 Handle<JSObject> object,
1323 Register object_reg, 1323 Register object_reg,
1324 Handle<JSObject> holder, 1324 Handle<JSObject> holder,
1325 Handle<Name> name, 1325 Handle<Name> name,
1326 Label* success, 1326 Label* success,
1327 Handle<Object> callback) { 1327 Handle<Object> callback) {
1328 Label miss; 1328 Label miss;
1329 1329
1330 Register reg = HandlerFrontendHeader(object, object_reg, holder, name, &miss); 1330 Register reg = HandlerFrontendHeader(object, object_reg, holder, name, &miss);
1331 1331
(...skipping 25 matching lines...) Expand all
1357 const int kValueOffset = kElementsStartOffset + kPointerSize; 1357 const int kValueOffset = kElementsStartOffset + kPointerSize;
1358 __ lw(scratch2(), FieldMemOperand(pointer, kValueOffset)); 1358 __ lw(scratch2(), FieldMemOperand(pointer, kValueOffset));
1359 __ Branch(&miss, ne, scratch2(), Operand(callback)); 1359 __ Branch(&miss, ne, scratch2(), Operand(callback));
1360 } 1360 }
1361 1361
1362 HandlerFrontendFooter(name, success, &miss); 1362 HandlerFrontendFooter(name, success, &miss);
1363 return reg; 1363 return reg;
1364 } 1364 }
1365 1365
1366 1366
1367 void BaseLoadStubCompiler::NonexistentHandlerFrontend( 1367 void LoadStubCompiler::NonexistentHandlerFrontend(
1368 Handle<JSObject> object, 1368 Handle<JSObject> object,
1369 Handle<JSObject> last, 1369 Handle<JSObject> last,
1370 Handle<Name> name, 1370 Handle<Name> name,
1371 Label* success, 1371 Label* success,
1372 Handle<GlobalObject> global) { 1372 Handle<GlobalObject> global) {
1373 Label miss; 1373 Label miss;
1374 1374
1375 HandlerFrontendHeader(object, receiver(), last, name, &miss); 1375 HandlerFrontendHeader(object, receiver(), last, name, &miss);
1376 1376
1377 // If the last object in the prototype chain is a global object, 1377 // If the last object in the prototype chain is a global object,
1378 // check that the global property cell is empty. 1378 // check that the global property cell is empty.
1379 if (!global.is_null()) { 1379 if (!global.is_null()) {
1380 GenerateCheckPropertyCell(masm(), global, name, scratch2(), &miss); 1380 GenerateCheckPropertyCell(masm(), global, name, scratch2(), &miss);
1381 } 1381 }
1382 1382
1383 HandlerFrontendFooter(name, success, &miss); 1383 HandlerFrontendFooter(name, success, &miss);
1384 } 1384 }
1385 1385
1386 1386
1387 void BaseLoadStubCompiler::GenerateLoadField(Register reg, 1387 void LoadStubCompiler::GenerateLoadField(Register reg,
1388 Handle<JSObject> holder, 1388 Handle<JSObject> holder,
1389 PropertyIndex field, 1389 PropertyIndex field,
1390 Representation representation) { 1390 Representation representation) {
1391 if (!reg.is(receiver())) __ mov(receiver(), reg); 1391 if (!reg.is(receiver())) __ mov(receiver(), reg);
1392 if (kind() == Code::LOAD_IC) { 1392 if (kind() == Code::LOAD_IC) {
1393 LoadFieldStub stub(field.is_inobject(holder), 1393 LoadFieldStub stub(field.is_inobject(holder),
1394 field.translate(holder), 1394 field.translate(holder),
1395 representation); 1395 representation);
1396 GenerateTailCall(masm(), stub.GetCode(isolate())); 1396 GenerateTailCall(masm(), stub.GetCode(isolate()));
1397 } else { 1397 } else {
1398 KeyedLoadFieldStub stub(field.is_inobject(holder), 1398 KeyedLoadFieldStub stub(field.is_inobject(holder),
1399 field.translate(holder), 1399 field.translate(holder),
1400 representation); 1400 representation);
1401 GenerateTailCall(masm(), stub.GetCode(isolate())); 1401 GenerateTailCall(masm(), stub.GetCode(isolate()));
1402 } 1402 }
1403 } 1403 }
1404 1404
1405 1405
1406 void BaseLoadStubCompiler::GenerateLoadConstant(Handle<Object> value) { 1406 void LoadStubCompiler::GenerateLoadConstant(Handle<Object> value) {
1407 // Return the constant value. 1407 // Return the constant value.
1408 __ LoadObject(v0, value); 1408 __ LoadObject(v0, value);
1409 __ Ret(); 1409 __ Ret();
1410 } 1410 }
1411 1411
1412 1412
1413 void BaseLoadStubCompiler::GenerateLoadCallback( 1413 void LoadStubCompiler::GenerateLoadCallback(
1414 const CallOptimization& call_optimization) { 1414 const CallOptimization& call_optimization) {
1415 GenerateFastApiCall( 1415 GenerateFastApiCall(
1416 masm(), call_optimization, receiver(), scratch3(), 0, NULL); 1416 masm(), call_optimization, receiver(), scratch3(), 0, NULL);
1417 } 1417 }
1418 1418
1419 1419
1420 void BaseLoadStubCompiler::GenerateLoadCallback( 1420 void LoadStubCompiler::GenerateLoadCallback(
1421 Register reg, 1421 Register reg,
1422 Handle<ExecutableAccessorInfo> callback) { 1422 Handle<ExecutableAccessorInfo> callback) {
1423 // Build AccessorInfo::args_ list on the stack and push property name below 1423 // Build AccessorInfo::args_ list on the stack and push property name below
1424 // the exit frame to make GC aware of them and store pointers to them. 1424 // the exit frame to make GC aware of them and store pointers to them.
1425 STATIC_ASSERT(PropertyCallbackArguments::kHolderIndex == 0); 1425 STATIC_ASSERT(PropertyCallbackArguments::kHolderIndex == 0);
1426 STATIC_ASSERT(PropertyCallbackArguments::kIsolateIndex == 1); 1426 STATIC_ASSERT(PropertyCallbackArguments::kIsolateIndex == 1);
1427 STATIC_ASSERT(PropertyCallbackArguments::kReturnValueDefaultValueIndex == 2); 1427 STATIC_ASSERT(PropertyCallbackArguments::kReturnValueDefaultValueIndex == 2);
1428 STATIC_ASSERT(PropertyCallbackArguments::kReturnValueOffset == 3); 1428 STATIC_ASSERT(PropertyCallbackArguments::kReturnValueOffset == 3);
1429 STATIC_ASSERT(PropertyCallbackArguments::kDataIndex == 4); 1429 STATIC_ASSERT(PropertyCallbackArguments::kDataIndex == 4);
1430 STATIC_ASSERT(PropertyCallbackArguments::kThisIndex == 5); 1430 STATIC_ASSERT(PropertyCallbackArguments::kThisIndex == 5);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1480 __ CallApiFunctionAndReturn(ref, 1480 __ CallApiFunctionAndReturn(ref,
1481 getter_address, 1481 getter_address,
1482 thunk_ref, 1482 thunk_ref,
1483 a2, 1483 a2,
1484 kStackUnwindSpace, 1484 kStackUnwindSpace,
1485 MemOperand(fp, 6 * kPointerSize), 1485 MemOperand(fp, 6 * kPointerSize),
1486 NULL); 1486 NULL);
1487 } 1487 }
1488 1488
1489 1489
1490 void BaseLoadStubCompiler::GenerateLoadInterceptor( 1490 void LoadStubCompiler::GenerateLoadInterceptor(
1491 Register holder_reg, 1491 Register holder_reg,
1492 Handle<JSObject> object, 1492 Handle<JSObject> object,
1493 Handle<JSObject> interceptor_holder, 1493 Handle<JSObject> interceptor_holder,
1494 LookupResult* lookup, 1494 LookupResult* lookup,
1495 Handle<Name> name) { 1495 Handle<Name> name) {
1496 ASSERT(interceptor_holder->HasNamedInterceptor()); 1496 ASSERT(interceptor_holder->HasNamedInterceptor());
1497 ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined()); 1497 ASSERT(!interceptor_holder->GetNamedInterceptor()->getter()->IsUndefined());
1498 1498
1499 // So far the most popular follow ups for interceptor loads are FIELD 1499 // So far the most popular follow ups for interceptor loads are FIELD
1500 // and CALLBACKS, so inline only them, other cases may be added 1500 // and CALLBACKS, so inline only them, other cases may be added
(...skipping 1511 matching lines...) Expand 10 before | Expand all | Expand 10 after
3012 Label* miss) { 3012 Label* miss) {
3013 __ Branch(miss, ne, name_reg, Operand(name)); 3013 __ Branch(miss, ne, name_reg, Operand(name));
3014 } 3014 }
3015 3015
3016 3016
3017 #undef __ 3017 #undef __
3018 #define __ ACCESS_MASM(masm) 3018 #define __ ACCESS_MASM(masm)
3019 3019
3020 3020
3021 void LoadStubCompiler::GenerateLoadViaGetter(MacroAssembler* masm, 3021 void LoadStubCompiler::GenerateLoadViaGetter(MacroAssembler* masm,
3022 Register receiver,
3022 Handle<JSFunction> getter) { 3023 Handle<JSFunction> getter) {
3023 // ----------- S t a t e ------------- 3024 // ----------- S t a t e -------------
3024 // -- a0 : receiver 3025 // -- a0 : receiver
3025 // -- a2 : name 3026 // -- a2 : name
3026 // -- ra : return address 3027 // -- ra : return address
3027 // ----------------------------------- 3028 // -----------------------------------
3028 { 3029 {
3029 FrameScope scope(masm, StackFrame::INTERNAL); 3030 FrameScope scope(masm, StackFrame::INTERNAL);
3030 3031
3031 if (!getter.is_null()) { 3032 if (!getter.is_null()) {
3032 // Call the JavaScript getter with the receiver on the stack. 3033 // Call the JavaScript getter with the receiver on the stack.
3033 __ push(a0); 3034 __ push(receiver);
3034 ParameterCount actual(0); 3035 ParameterCount actual(0);
3035 ParameterCount expected(getter); 3036 ParameterCount expected(getter);
3036 __ InvokeFunction(getter, expected, actual, 3037 __ InvokeFunction(getter, expected, actual,
3037 CALL_FUNCTION, NullCallWrapper(), CALL_AS_METHOD); 3038 CALL_FUNCTION, NullCallWrapper(), CALL_AS_METHOD);
3038 } else { 3039 } else {
3039 // If we generate a global code snippet for deoptimization only, remember 3040 // If we generate a global code snippet for deoptimization only, remember
3040 // the place to continue after deoptimization. 3041 // the place to continue after deoptimization.
3041 masm->isolate()->heap()->SetGetterStubDeoptPCOffset(masm->pc_offset()); 3042 masm->isolate()->heap()->SetGetterStubDeoptPCOffset(masm->pc_offset());
3042 } 3043 }
3043 3044
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
3202 // ----------------------------------- 3203 // -----------------------------------
3203 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric); 3204 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_MissForceGeneric);
3204 } 3205 }
3205 3206
3206 3207
3207 #undef __ 3208 #undef __
3208 3209
3209 } } // namespace v8::internal 3210 } } // namespace v8::internal
3210 3211
3211 #endif // V8_TARGET_ARCH_MIPS 3212 #endif // V8_TARGET_ARCH_MIPS
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