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

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

Issue 1694016: Simplify the use of the stm instruction on ARM. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 10 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 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 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 // Stub never generated for non-global objects that require access 289 // Stub never generated for non-global objects that require access
290 // checks. 290 // checks.
291 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); 291 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
292 292
293 // Perform map transition for the receiver if necessary. 293 // Perform map transition for the receiver if necessary.
294 if ((transition != NULL) && (object->map()->unused_property_fields() == 0)) { 294 if ((transition != NULL) && (object->map()->unused_property_fields() == 0)) {
295 // The properties must be extended before we can store the value. 295 // The properties must be extended before we can store the value.
296 // We jump to a runtime call that extends the properties array. 296 // We jump to a runtime call that extends the properties array.
297 __ push(receiver_reg); 297 __ push(receiver_reg);
298 __ mov(r2, Operand(Handle<Map>(transition))); 298 __ mov(r2, Operand(Handle<Map>(transition)));
299 __ stm(db_w, sp, r2.bit() | r0.bit()); 299 __ Push(r2, r0);
300 __ TailCallExternalReference( 300 __ TailCallExternalReference(
301 ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage)), 301 ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage)),
302 3, 1); 302 3, 1);
303 return; 303 return;
304 } 304 }
305 305
306 if (transition != NULL) { 306 if (transition != NULL) {
307 // Update the map of the object; no write barrier updating is 307 // Update the map of the object; no write barrier updating is
308 // needed because the map is never in new space. 308 // needed because the map is never in new space.
309 __ mov(ip, Operand(Handle<Map>(transition))); 309 __ mov(ip, Operand(Handle<Map>(transition)));
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 457
458 if (!optimize) { 458 if (!optimize) {
459 CompileRegular(masm, receiver, holder, scratch2, holder_obj, miss_label); 459 CompileRegular(masm, receiver, holder, scratch2, holder_obj, miss_label);
460 return; 460 return;
461 } 461 }
462 462
463 // Note: starting a frame here makes GC aware of pointers pushed below. 463 // Note: starting a frame here makes GC aware of pointers pushed below.
464 __ EnterInternalFrame(); 464 __ EnterInternalFrame();
465 465
466 __ push(receiver); 466 __ push(receiver);
467 __ push(holder); 467 __ Push(holder, name_);
468 __ push(name_);
469 468
470 CompileCallLoadPropertyWithInterceptor(masm, 469 CompileCallLoadPropertyWithInterceptor(masm,
471 receiver, 470 receiver,
472 holder, 471 holder,
473 name_, 472 name_,
474 holder_obj); 473 holder_obj);
475 474
476 Label interceptor_failed; 475 Label interceptor_failed;
477 // Compare with no_interceptor_result_sentinel. 476 // Compare with no_interceptor_result_sentinel.
478 __ LoadRoot(scratch1, Heap::kNoInterceptorResultSentinelRootIndex); 477 __ LoadRoot(scratch1, Heap::kNoInterceptorResultSentinelRootIndex);
(...skipping 24 matching lines...) Expand all
503 lookup->GetFieldIndex()); 502 lookup->GetFieldIndex());
504 __ Ret(); 503 __ Ret();
505 } else { 504 } else {
506 ASSERT(lookup->type() == CALLBACKS); 505 ASSERT(lookup->type() == CALLBACKS);
507 ASSERT(lookup->GetCallbackObject()->IsAccessorInfo()); 506 ASSERT(lookup->GetCallbackObject()->IsAccessorInfo());
508 ASSERT(callback != NULL); 507 ASSERT(callback != NULL);
509 ASSERT(callback->getter() != NULL); 508 ASSERT(callback->getter() != NULL);
510 509
511 Label cleanup; 510 Label cleanup;
512 __ pop(scratch2); 511 __ pop(scratch2);
513 __ push(receiver); 512 __ Push(receiver, scratch2);
514 __ push(scratch2);
515 513
516 holder = stub_compiler->CheckPrototypes(holder_obj, holder, 514 holder = stub_compiler->CheckPrototypes(holder_obj, holder,
517 lookup->holder(), scratch1, 515 lookup->holder(), scratch1,
518 scratch2, 516 scratch2,
519 name, 517 name,
520 &cleanup); 518 &cleanup);
521 519
522 __ push(holder); 520 __ push(holder);
523 __ Move(holder, Handle<AccessorInfo>(callback)); 521 __ Move(holder, Handle<AccessorInfo>(callback));
524 __ push(holder); 522 __ push(holder);
525 __ ldr(scratch1, FieldMemOperand(holder, AccessorInfo::kDataOffset)); 523 __ ldr(scratch1, FieldMemOperand(holder, AccessorInfo::kDataOffset));
526 __ push(scratch1); 524 __ Push(scratch1, name_);
527 __ push(name_);
528 525
529 ExternalReference ref = 526 ExternalReference ref =
530 ExternalReference(IC_Utility(IC::kLoadCallbackProperty)); 527 ExternalReference(IC_Utility(IC::kLoadCallbackProperty));
531 __ TailCallExternalReference(ref, 5, 1); 528 __ TailCallExternalReference(ref, 5, 1);
532 529
533 __ bind(&cleanup); 530 __ bind(&cleanup);
534 __ pop(scratch1); 531 __ pop(scratch1);
535 __ pop(scratch2); 532 __ pop(scratch2);
536 __ push(scratch1); 533 __ push(scratch1);
537 } 534 }
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 Failure** failure) { 715 Failure** failure) {
719 // Check that the receiver isn't a smi. 716 // Check that the receiver isn't a smi.
720 __ tst(receiver, Operand(kSmiTagMask)); 717 __ tst(receiver, Operand(kSmiTagMask));
721 __ b(eq, miss); 718 __ b(eq, miss);
722 719
723 // Check that the maps haven't changed. 720 // Check that the maps haven't changed.
724 Register reg = 721 Register reg =
725 CheckPrototypes(object, receiver, holder, scratch1, scratch2, name, miss); 722 CheckPrototypes(object, receiver, holder, scratch1, scratch2, name, miss);
726 723
727 // Push the arguments on the JS stack of the caller. 724 // Push the arguments on the JS stack of the caller.
728 __ push(receiver); // receiver 725 __ push(receiver); // Receiver.
729 __ push(reg); // holder 726 __ push(reg); // Holder.
730 __ mov(ip, Operand(Handle<AccessorInfo>(callback))); // callback data 727 __ mov(ip, Operand(Handle<AccessorInfo>(callback))); // callback data
731 __ push(ip);
732 __ ldr(reg, FieldMemOperand(ip, AccessorInfo::kDataOffset)); 728 __ ldr(reg, FieldMemOperand(ip, AccessorInfo::kDataOffset));
733 __ push(reg); 729 __ Push(ip, reg, name_reg);
734 __ push(name_reg); // name
735 730
736 // Do tail-call to the runtime system. 731 // Do tail-call to the runtime system.
737 ExternalReference load_callback_property = 732 ExternalReference load_callback_property =
738 ExternalReference(IC_Utility(IC::kLoadCallbackProperty)); 733 ExternalReference(IC_Utility(IC::kLoadCallbackProperty));
739 __ TailCallExternalReference(load_callback_property, 5, 1); 734 __ TailCallExternalReference(load_callback_property, 5, 1);
740 735
741 return true; 736 return true;
742 } 737 }
743 738
744 739
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1098 if (lookup.IsProperty() && 1093 if (lookup.IsProperty() &&
1099 lookup.IsCacheable() && 1094 lookup.IsCacheable() &&
1100 lookup.type() == CONSTANT_FUNCTION && 1095 lookup.type() == CONSTANT_FUNCTION &&
1101 lookup.GetConstantFunction()->is_compiled() && 1096 lookup.GetConstantFunction()->is_compiled() &&
1102 !holder->IsJSArray()) { 1097 !holder->IsJSArray()) {
1103 // Constant functions cannot sit on global object. 1098 // Constant functions cannot sit on global object.
1104 ASSERT(!lookup.holder()->IsGlobalObject()); 1099 ASSERT(!lookup.holder()->IsGlobalObject());
1105 1100
1106 // Call the interceptor. 1101 // Call the interceptor.
1107 __ EnterInternalFrame(); 1102 __ EnterInternalFrame();
1108 __ push(holder_reg); 1103 __ Push(holder_reg, name_reg);
1109 __ push(name_reg);
1110 CompileCallLoadPropertyWithInterceptor(masm(), 1104 CompileCallLoadPropertyWithInterceptor(masm(),
1111 receiver, 1105 receiver,
1112 holder_reg, 1106 holder_reg,
1113 name_reg, 1107 name_reg,
1114 holder); 1108 holder);
1115 __ pop(name_reg); 1109 __ pop(name_reg);
1116 __ pop(holder_reg); 1110 __ pop(holder_reg);
1117 __ LeaveInternalFrame(); 1111 __ LeaveInternalFrame();
1118 // r0 no longer contains the receiver. 1112 // r0 no longer contains the receiver.
1119 1113
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1302 if (object->IsJSGlobalProxy()) { 1296 if (object->IsJSGlobalProxy()) {
1303 __ CheckAccessGlobalProxy(r1, r3, &miss); 1297 __ CheckAccessGlobalProxy(r1, r3, &miss);
1304 } 1298 }
1305 1299
1306 // Stub never generated for non-global objects that require access 1300 // Stub never generated for non-global objects that require access
1307 // checks. 1301 // checks.
1308 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); 1302 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
1309 1303
1310 __ push(r1); // receiver 1304 __ push(r1); // receiver
1311 __ mov(ip, Operand(Handle<AccessorInfo>(callback))); // callback info 1305 __ mov(ip, Operand(Handle<AccessorInfo>(callback))); // callback info
1312 __ stm(db_w, sp, ip.bit() | r2.bit() | r0.bit()); 1306 __ Push(ip, r2, r0);
1313 1307
1314 // Do tail-call to the runtime system. 1308 // Do tail-call to the runtime system.
1315 ExternalReference store_callback_property = 1309 ExternalReference store_callback_property =
1316 ExternalReference(IC_Utility(IC::kStoreCallbackProperty)); 1310 ExternalReference(IC_Utility(IC::kStoreCallbackProperty));
1317 __ TailCallExternalReference(store_callback_property, 4, 1); 1311 __ TailCallExternalReference(store_callback_property, 4, 1);
1318 1312
1319 // Handle store cache miss. 1313 // Handle store cache miss.
1320 __ bind(&miss); 1314 __ bind(&miss);
1321 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss)); 1315 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
1322 __ Jump(ic, RelocInfo::CODE_TARGET); 1316 __ Jump(ic, RelocInfo::CODE_TARGET);
(...skipping 24 matching lines...) Expand all
1347 1341
1348 // Perform global security token check if needed. 1342 // Perform global security token check if needed.
1349 if (receiver->IsJSGlobalProxy()) { 1343 if (receiver->IsJSGlobalProxy()) {
1350 __ CheckAccessGlobalProxy(r1, r3, &miss); 1344 __ CheckAccessGlobalProxy(r1, r3, &miss);
1351 } 1345 }
1352 1346
1353 // Stub is never generated for non-global objects that require access 1347 // Stub is never generated for non-global objects that require access
1354 // checks. 1348 // checks.
1355 ASSERT(receiver->IsJSGlobalProxy() || !receiver->IsAccessCheckNeeded()); 1349 ASSERT(receiver->IsJSGlobalProxy() || !receiver->IsAccessCheckNeeded());
1356 1350
1357 __ push(r1); // receiver. 1351 __ Push(r1, r2, r0); // Receiver, name, value.
1358 __ push(r2); // name.
1359 __ push(r0); // value.
1360 1352
1361 // Do tail-call to the runtime system. 1353 // Do tail-call to the runtime system.
1362 ExternalReference store_ic_property = 1354 ExternalReference store_ic_property =
1363 ExternalReference(IC_Utility(IC::kStoreInterceptorProperty)); 1355 ExternalReference(IC_Utility(IC::kStoreInterceptorProperty));
1364 __ TailCallExternalReference(store_ic_property, 3, 1); 1356 __ TailCallExternalReference(store_ic_property, 3, 1);
1365 1357
1366 // Handle store cache miss. 1358 // Handle store cache miss.
1367 __ bind(&miss); 1359 __ bind(&miss);
1368 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss)); 1360 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
1369 __ Jump(ic, RelocInfo::CODE_TARGET); 1361 __ Jump(ic, RelocInfo::CODE_TARGET);
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after
1955 __ Jump(generic_construct_stub, RelocInfo::CODE_TARGET); 1947 __ Jump(generic_construct_stub, RelocInfo::CODE_TARGET);
1956 1948
1957 // Return the generated code. 1949 // Return the generated code.
1958 return GetCode(); 1950 return GetCode();
1959 } 1951 }
1960 1952
1961 1953
1962 #undef __ 1954 #undef __
1963 1955
1964 } } // namespace v8::internal 1956 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698