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

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

Issue 6759025: Version 3.2.6 (Closed) Base URL: https://v8.googlecode.com/svn/trunk
Patch Set: Created 9 years, 8 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/deoptimizer-arm.cc ('k') | src/assembler.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 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 537 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 } 548 }
549 549
550 550
551 static void PushInterceptorArguments(MacroAssembler* masm, 551 static void PushInterceptorArguments(MacroAssembler* masm,
552 Register receiver, 552 Register receiver,
553 Register holder, 553 Register holder,
554 Register name, 554 Register name,
555 JSObject* holder_obj) { 555 JSObject* holder_obj) {
556 __ push(name); 556 __ push(name);
557 InterceptorInfo* interceptor = holder_obj->GetNamedInterceptor(); 557 InterceptorInfo* interceptor = holder_obj->GetNamedInterceptor();
558 ASSERT(!HEAP->InNewSpace(interceptor)); 558 ASSERT(!masm->isolate()->heap()->InNewSpace(interceptor));
559 Register scratch = name; 559 Register scratch = name;
560 __ mov(scratch, Operand(Handle<Object>(interceptor))); 560 __ mov(scratch, Operand(Handle<Object>(interceptor)));
561 __ push(scratch); 561 __ push(scratch);
562 __ push(receiver); 562 __ push(receiver);
563 __ push(holder); 563 __ push(holder);
564 __ ldr(scratch, FieldMemOperand(scratch, InterceptorInfo::kDataOffset)); 564 __ ldr(scratch, FieldMemOperand(scratch, InterceptorInfo::kDataOffset));
565 __ push(scratch); 565 __ push(scratch);
566 } 566 }
567 567
568 568
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 // -- sp[(argc + 4) * 4] : receiver 617 // -- sp[(argc + 4) * 4] : receiver
618 // ----------------------------------- 618 // -----------------------------------
619 // Get the function and setup the context. 619 // Get the function and setup the context.
620 JSFunction* function = optimization.constant_function(); 620 JSFunction* function = optimization.constant_function();
621 __ mov(r5, Operand(Handle<JSFunction>(function))); 621 __ mov(r5, Operand(Handle<JSFunction>(function)));
622 __ ldr(cp, FieldMemOperand(r5, JSFunction::kContextOffset)); 622 __ ldr(cp, FieldMemOperand(r5, JSFunction::kContextOffset));
623 623
624 // Pass the additional arguments FastHandleApiCall expects. 624 // Pass the additional arguments FastHandleApiCall expects.
625 Object* call_data = optimization.api_call_info()->data(); 625 Object* call_data = optimization.api_call_info()->data();
626 Handle<CallHandlerInfo> api_call_info_handle(optimization.api_call_info()); 626 Handle<CallHandlerInfo> api_call_info_handle(optimization.api_call_info());
627 if (HEAP->InNewSpace(call_data)) { 627 if (masm->isolate()->heap()->InNewSpace(call_data)) {
628 __ Move(r0, api_call_info_handle); 628 __ Move(r0, api_call_info_handle);
629 __ ldr(r6, FieldMemOperand(r0, CallHandlerInfo::kDataOffset)); 629 __ ldr(r6, FieldMemOperand(r0, CallHandlerInfo::kDataOffset));
630 } else { 630 } else {
631 __ Move(r6, Handle<Object>(call_data)); 631 __ Move(r6, Handle<Object>(call_data));
632 } 632 }
633 // Store js function and call data. 633 // Store js function and call data.
634 __ stm(ib, sp, r5.bit() | r6.bit()); 634 __ stm(ib, sp, r5.bit() | r6.bit());
635 635
636 // r2 points to call data as expected by Arguments 636 // r2 points to call data as expected by Arguments
637 // (refer to layout above). 637 // (refer to layout above).
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 } else { 712 } else {
713 CompileRegular(masm, 713 CompileRegular(masm,
714 object, 714 object,
715 receiver, 715 receiver,
716 scratch1, 716 scratch1,
717 scratch2, 717 scratch2,
718 scratch3, 718 scratch3,
719 name, 719 name,
720 holder, 720 holder,
721 miss); 721 miss);
722 return HEAP->undefined_value(); 722 return masm->isolate()->heap()->undefined_value();
723 } 723 }
724 } 724 }
725 725
726 private: 726 private:
727 MaybeObject* CompileCacheable(MacroAssembler* masm, 727 MaybeObject* CompileCacheable(MacroAssembler* masm,
728 JSObject* object, 728 JSObject* object,
729 Register receiver, 729 Register receiver,
730 Register scratch1, 730 Register scratch1,
731 Register scratch2, 731 Register scratch2,
732 Register scratch3, 732 Register scratch3,
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
815 FreeSpaceForFastApiCall(masm); 815 FreeSpaceForFastApiCall(masm);
816 __ b(miss_label); 816 __ b(miss_label);
817 } 817 }
818 818
819 // Invoke a regular function. 819 // Invoke a regular function.
820 __ bind(&regular_invoke); 820 __ bind(&regular_invoke);
821 if (can_do_fast_api_call) { 821 if (can_do_fast_api_call) {
822 FreeSpaceForFastApiCall(masm); 822 FreeSpaceForFastApiCall(masm);
823 } 823 }
824 824
825 return HEAP->undefined_value(); 825 return masm->isolate()->heap()->undefined_value();
826 } 826 }
827 827
828 void CompileRegular(MacroAssembler* masm, 828 void CompileRegular(MacroAssembler* masm,
829 JSObject* object, 829 JSObject* object,
830 Register receiver, 830 Register receiver,
831 Register scratch1, 831 Register scratch1,
832 Register scratch2, 832 Register scratch2,
833 Register scratch3, 833 Register scratch3,
834 String* name, 834 String* name,
835 JSObject* interceptor_holder, 835 JSObject* interceptor_holder,
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1084 // Only global objects and objects that do not require access 1084 // Only global objects and objects that do not require access
1085 // checks are allowed in stubs. 1085 // checks are allowed in stubs.
1086 ASSERT(current->IsJSGlobalProxy() || !current->IsAccessCheckNeeded()); 1086 ASSERT(current->IsJSGlobalProxy() || !current->IsAccessCheckNeeded());
1087 1087
1088 ASSERT(current->GetPrototype()->IsJSObject()); 1088 ASSERT(current->GetPrototype()->IsJSObject());
1089 JSObject* prototype = JSObject::cast(current->GetPrototype()); 1089 JSObject* prototype = JSObject::cast(current->GetPrototype());
1090 if (!current->HasFastProperties() && 1090 if (!current->HasFastProperties() &&
1091 !current->IsJSGlobalObject() && 1091 !current->IsJSGlobalObject() &&
1092 !current->IsJSGlobalProxy()) { 1092 !current->IsJSGlobalProxy()) {
1093 if (!name->IsSymbol()) { 1093 if (!name->IsSymbol()) {
1094 MaybeObject* maybe_lookup_result = HEAP->LookupSymbol(name); 1094 MaybeObject* maybe_lookup_result = heap()->LookupSymbol(name);
1095 Object* lookup_result = NULL; // Initialization to please compiler. 1095 Object* lookup_result = NULL; // Initialization to please compiler.
1096 if (!maybe_lookup_result->ToObject(&lookup_result)) { 1096 if (!maybe_lookup_result->ToObject(&lookup_result)) {
1097 set_failure(Failure::cast(maybe_lookup_result)); 1097 set_failure(Failure::cast(maybe_lookup_result));
1098 return reg; 1098 return reg;
1099 } 1099 }
1100 name = String::cast(lookup_result); 1100 name = String::cast(lookup_result);
1101 } 1101 }
1102 ASSERT(current->property_dictionary()->FindEntry(name) == 1102 ASSERT(current->property_dictionary()->FindEntry(name) ==
1103 StringDictionary::kNotFound); 1103 StringDictionary::kNotFound);
1104 1104
1105 GenerateDictionaryNegativeLookup(masm(), 1105 GenerateDictionaryNegativeLookup(masm(),
1106 miss, 1106 miss,
1107 reg, 1107 reg,
1108 name, 1108 name,
1109 scratch1, 1109 scratch1,
1110 scratch2); 1110 scratch2);
1111 __ ldr(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset)); 1111 __ ldr(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset));
1112 reg = holder_reg; // from now the object is in holder_reg 1112 reg = holder_reg; // from now the object is in holder_reg
1113 __ ldr(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset)); 1113 __ ldr(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset));
1114 } else if (HEAP->InNewSpace(prototype)) { 1114 } else if (heap()->InNewSpace(prototype)) {
1115 // Get the map of the current object. 1115 // Get the map of the current object.
1116 __ ldr(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset)); 1116 __ ldr(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset));
1117 __ cmp(scratch1, Operand(Handle<Map>(current->map()))); 1117 __ cmp(scratch1, Operand(Handle<Map>(current->map())));
1118 1118
1119 // Branch on the result of the map check. 1119 // Branch on the result of the map check.
1120 __ b(ne, miss); 1120 __ b(ne, miss);
1121 1121
1122 // Check access rights to the global object. This has to happen 1122 // Check access rights to the global object. This has to happen
1123 // after the map check so that we know that the object is 1123 // after the map check so that we know that the object is
1124 // actually a global object. 1124 // actually a global object.
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1252 // Check that the maps haven't changed. 1252 // Check that the maps haven't changed.
1253 Register reg = 1253 Register reg =
1254 CheckPrototypes(object, receiver, holder, scratch1, scratch2, scratch3, 1254 CheckPrototypes(object, receiver, holder, scratch1, scratch2, scratch3,
1255 name, miss); 1255 name, miss);
1256 1256
1257 // Build AccessorInfo::args_ list on the stack and push property name below 1257 // Build AccessorInfo::args_ list on the stack and push property name below
1258 // the exit frame to make GC aware of them and store pointers to them. 1258 // the exit frame to make GC aware of them and store pointers to them.
1259 __ push(receiver); 1259 __ push(receiver);
1260 __ mov(scratch2, sp); // scratch2 = AccessorInfo::args_ 1260 __ mov(scratch2, sp); // scratch2 = AccessorInfo::args_
1261 Handle<AccessorInfo> callback_handle(callback); 1261 Handle<AccessorInfo> callback_handle(callback);
1262 if (HEAP->InNewSpace(callback_handle->data())) { 1262 if (heap()->InNewSpace(callback_handle->data())) {
1263 __ Move(scratch3, callback_handle); 1263 __ Move(scratch3, callback_handle);
1264 __ ldr(scratch3, FieldMemOperand(scratch3, AccessorInfo::kDataOffset)); 1264 __ ldr(scratch3, FieldMemOperand(scratch3, AccessorInfo::kDataOffset));
1265 } else { 1265 } else {
1266 __ Move(scratch3, Handle<Object>(callback_handle->data())); 1266 __ Move(scratch3, Handle<Object>(callback_handle->data()));
1267 } 1267 }
1268 __ Push(reg, scratch3, name_reg); 1268 __ Push(reg, scratch3, name_reg);
1269 __ mov(r0, sp); // r0 = Handle<String> 1269 __ mov(r0, sp); // r0 = Handle<String>
1270 1270
1271 Address getter_address = v8::ToCData<Address>(callback->getter()); 1271 Address getter_address = v8::ToCData<Address>(callback->getter());
1272 ApiFunction fun(getter_address); 1272 ApiFunction fun(getter_address);
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
1470 1470
1471 1471
1472 void CallStubCompiler::GenerateLoadFunctionFromCell(JSGlobalPropertyCell* cell, 1472 void CallStubCompiler::GenerateLoadFunctionFromCell(JSGlobalPropertyCell* cell,
1473 JSFunction* function, 1473 JSFunction* function,
1474 Label* miss) { 1474 Label* miss) {
1475 // Get the value from the cell. 1475 // Get the value from the cell.
1476 __ mov(r3, Operand(Handle<JSGlobalPropertyCell>(cell))); 1476 __ mov(r3, Operand(Handle<JSGlobalPropertyCell>(cell)));
1477 __ ldr(r1, FieldMemOperand(r3, JSGlobalPropertyCell::kValueOffset)); 1477 __ ldr(r1, FieldMemOperand(r3, JSGlobalPropertyCell::kValueOffset));
1478 1478
1479 // Check that the cell contains the same function. 1479 // Check that the cell contains the same function.
1480 if (HEAP->InNewSpace(function)) { 1480 if (heap()->InNewSpace(function)) {
1481 // We can't embed a pointer to a function in new space so we have 1481 // We can't embed a pointer to a function in new space so we have
1482 // to verify that the shared function info is unchanged. This has 1482 // to verify that the shared function info is unchanged. This has
1483 // the nice side effect that multiple closures based on the same 1483 // the nice side effect that multiple closures based on the same
1484 // function can all use this call IC. Before we load through the 1484 // function can all use this call IC. Before we load through the
1485 // function, we have to verify that it still is a function. 1485 // function, we have to verify that it still is a function.
1486 __ tst(r1, Operand(kSmiTagMask)); 1486 __ tst(r1, Operand(kSmiTagMask));
1487 __ b(eq, miss); 1487 __ b(eq, miss);
1488 __ CompareObjectType(r1, r3, r3, JS_FUNCTION_TYPE); 1488 __ CompareObjectType(r1, r3, r3, JS_FUNCTION_TYPE);
1489 __ b(ne, miss); 1489 __ b(ne, miss);
1490 1490
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1553 String* name) { 1553 String* name) {
1554 // ----------- S t a t e ------------- 1554 // ----------- S t a t e -------------
1555 // -- r2 : name 1555 // -- r2 : name
1556 // -- lr : return address 1556 // -- lr : return address
1557 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) 1557 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based)
1558 // -- ... 1558 // -- ...
1559 // -- sp[argc * 4] : receiver 1559 // -- sp[argc * 4] : receiver
1560 // ----------------------------------- 1560 // -----------------------------------
1561 1561
1562 // If object is not an array, bail out to regular call. 1562 // If object is not an array, bail out to regular call.
1563 if (!object->IsJSArray() || cell != NULL) return HEAP->undefined_value(); 1563 if (!object->IsJSArray() || cell != NULL) return heap()->undefined_value();
1564 1564
1565 Label miss; 1565 Label miss;
1566 1566
1567 GenerateNameCheck(name, &miss); 1567 GenerateNameCheck(name, &miss);
1568 1568
1569 Register receiver = r1; 1569 Register receiver = r1;
1570 1570
1571 // Get the receiver from the stack 1571 // Get the receiver from the stack
1572 const int argc = arguments().immediate(); 1572 const int argc = arguments().immediate();
1573 __ ldr(receiver, MemOperand(sp, argc * kPointerSize)); 1573 __ ldr(receiver, MemOperand(sp, argc * kPointerSize));
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1713 String* name) { 1713 String* name) {
1714 // ----------- S t a t e ------------- 1714 // ----------- S t a t e -------------
1715 // -- r2 : name 1715 // -- r2 : name
1716 // -- lr : return address 1716 // -- lr : return address
1717 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) 1717 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based)
1718 // -- ... 1718 // -- ...
1719 // -- sp[argc * 4] : receiver 1719 // -- sp[argc * 4] : receiver
1720 // ----------------------------------- 1720 // -----------------------------------
1721 1721
1722 // If object is not an array, bail out to regular call. 1722 // If object is not an array, bail out to regular call.
1723 if (!object->IsJSArray() || cell != NULL) return HEAP->undefined_value(); 1723 if (!object->IsJSArray() || cell != NULL) return heap()->undefined_value();
1724 1724
1725 Label miss, return_undefined, call_builtin; 1725 Label miss, return_undefined, call_builtin;
1726 1726
1727 Register receiver = r1; 1727 Register receiver = r1;
1728 Register elements = r3; 1728 Register elements = r3;
1729 1729
1730 GenerateNameCheck(name, &miss); 1730 GenerateNameCheck(name, &miss);
1731 1731
1732 // Get the receiver from the stack 1732 // Get the receiver from the stack
1733 const int argc = arguments().immediate(); 1733 const int argc = arguments().immediate();
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1799 String* name) { 1799 String* name) {
1800 // ----------- S t a t e ------------- 1800 // ----------- S t a t e -------------
1801 // -- r2 : function name 1801 // -- r2 : function name
1802 // -- lr : return address 1802 // -- lr : return address
1803 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) 1803 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based)
1804 // -- ... 1804 // -- ...
1805 // -- sp[argc * 4] : receiver 1805 // -- sp[argc * 4] : receiver
1806 // ----------------------------------- 1806 // -----------------------------------
1807 1807
1808 // If object is not a string, bail out to regular call. 1808 // If object is not a string, bail out to regular call.
1809 if (!object->IsString() || cell != NULL) return HEAP->undefined_value(); 1809 if (!object->IsString() || cell != NULL) return heap()->undefined_value();
1810 1810
1811 const int argc = arguments().immediate(); 1811 const int argc = arguments().immediate();
1812 1812
1813 Label miss; 1813 Label miss;
1814 Label name_miss; 1814 Label name_miss;
1815 Label index_out_of_range; 1815 Label index_out_of_range;
1816 Label* index_out_of_range_label = &index_out_of_range; 1816 Label* index_out_of_range_label = &index_out_of_range;
1817 1817
1818 if (kind_ == Code::CALL_IC && extra_ic_state_ == DEFAULT_STRING_STUB) { 1818 if (kind_ == Code::CALL_IC && extra_ic_state_ == DEFAULT_STRING_STUB) {
1819 index_out_of_range_label = &miss; 1819 index_out_of_range_label = &miss;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1883 String* name) { 1883 String* name) {
1884 // ----------- S t a t e ------------- 1884 // ----------- S t a t e -------------
1885 // -- r2 : function name 1885 // -- r2 : function name
1886 // -- lr : return address 1886 // -- lr : return address
1887 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) 1887 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based)
1888 // -- ... 1888 // -- ...
1889 // -- sp[argc * 4] : receiver 1889 // -- sp[argc * 4] : receiver
1890 // ----------------------------------- 1890 // -----------------------------------
1891 1891
1892 // If object is not a string, bail out to regular call. 1892 // If object is not a string, bail out to regular call.
1893 if (!object->IsString() || cell != NULL) return HEAP->undefined_value(); 1893 if (!object->IsString() || cell != NULL) return heap()->undefined_value();
1894 1894
1895 const int argc = arguments().immediate(); 1895 const int argc = arguments().immediate();
1896 1896
1897 Label miss; 1897 Label miss;
1898 Label name_miss; 1898 Label name_miss;
1899 Label index_out_of_range; 1899 Label index_out_of_range;
1900 Label* index_out_of_range_label = &index_out_of_range; 1900 Label* index_out_of_range_label = &index_out_of_range;
1901 1901
1902 if (kind_ == Code::CALL_IC && extra_ic_state_ == DEFAULT_STRING_STUB) { 1902 if (kind_ == Code::CALL_IC && extra_ic_state_ == DEFAULT_STRING_STUB) {
1903 index_out_of_range_label = &miss; 1903 index_out_of_range_label = &miss;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1972 // -- lr : return address 1972 // -- lr : return address
1973 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) 1973 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based)
1974 // -- ... 1974 // -- ...
1975 // -- sp[argc * 4] : receiver 1975 // -- sp[argc * 4] : receiver
1976 // ----------------------------------- 1976 // -----------------------------------
1977 1977
1978 const int argc = arguments().immediate(); 1978 const int argc = arguments().immediate();
1979 1979
1980 // If the object is not a JSObject or we got an unexpected number of 1980 // If the object is not a JSObject or we got an unexpected number of
1981 // arguments, bail out to the regular call. 1981 // arguments, bail out to the regular call.
1982 if (!object->IsJSObject() || argc != 1) return HEAP->undefined_value(); 1982 if (!object->IsJSObject() || argc != 1) return heap()->undefined_value();
1983 1983
1984 Label miss; 1984 Label miss;
1985 GenerateNameCheck(name, &miss); 1985 GenerateNameCheck(name, &miss);
1986 1986
1987 if (cell == NULL) { 1987 if (cell == NULL) {
1988 __ ldr(r1, MemOperand(sp, 1 * kPointerSize)); 1988 __ ldr(r1, MemOperand(sp, 1 * kPointerSize));
1989 1989
1990 STATIC_ASSERT(kSmiTag == 0); 1990 STATIC_ASSERT(kSmiTag == 0);
1991 __ tst(r1, Operand(kSmiTagMask)); 1991 __ tst(r1, Operand(kSmiTagMask));
1992 __ b(eq, &miss); 1992 __ b(eq, &miss);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
2041 JSFunction* function, 2041 JSFunction* function,
2042 String* name) { 2042 String* name) {
2043 // ----------- S t a t e ------------- 2043 // ----------- S t a t e -------------
2044 // -- r2 : function name 2044 // -- r2 : function name
2045 // -- lr : return address 2045 // -- lr : return address
2046 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) 2046 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based)
2047 // -- ... 2047 // -- ...
2048 // -- sp[argc * 4] : receiver 2048 // -- sp[argc * 4] : receiver
2049 // ----------------------------------- 2049 // -----------------------------------
2050 2050
2051 if (!masm()->isolate()->cpu_features()->IsSupported(VFP3)) 2051 if (!masm()->isolate()->cpu_features()->IsSupported(VFP3)) {
2052 return HEAP->undefined_value(); 2052 return heap()->undefined_value();
2053 }
2053 2054
2054 CpuFeatures::Scope scope_vfp3(VFP3); 2055 CpuFeatures::Scope scope_vfp3(VFP3);
2055 2056
2056 const int argc = arguments().immediate(); 2057 const int argc = arguments().immediate();
2057 2058
2058 // If the object is not a JSObject or we got an unexpected number of 2059 // If the object is not a JSObject or we got an unexpected number of
2059 // arguments, bail out to the regular call. 2060 // arguments, bail out to the regular call.
2060 if (!object->IsJSObject() || argc != 1) return HEAP->undefined_value(); 2061 if (!object->IsJSObject() || argc != 1) return heap()->undefined_value();
2061 2062
2062 Label miss, slow; 2063 Label miss, slow;
2063 GenerateNameCheck(name, &miss); 2064 GenerateNameCheck(name, &miss);
2064 2065
2065 if (cell == NULL) { 2066 if (cell == NULL) {
2066 __ ldr(r1, MemOperand(sp, 1 * kPointerSize)); 2067 __ ldr(r1, MemOperand(sp, 1 * kPointerSize));
2067 2068
2068 STATIC_ASSERT(kSmiTag == 0); 2069 STATIC_ASSERT(kSmiTag == 0);
2069 __ JumpIfSmi(r1, &miss); 2070 __ JumpIfSmi(r1, &miss);
2070 2071
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
2192 // -- lr : return address 2193 // -- lr : return address
2193 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based) 2194 // -- sp[(argc - n - 1) * 4] : arg[n] (zero-based)
2194 // -- ... 2195 // -- ...
2195 // -- sp[argc * 4] : receiver 2196 // -- sp[argc * 4] : receiver
2196 // ----------------------------------- 2197 // -----------------------------------
2197 2198
2198 const int argc = arguments().immediate(); 2199 const int argc = arguments().immediate();
2199 2200
2200 // If the object is not a JSObject or we got an unexpected number of 2201 // If the object is not a JSObject or we got an unexpected number of
2201 // arguments, bail out to the regular call. 2202 // arguments, bail out to the regular call.
2202 if (!object->IsJSObject() || argc != 1) return HEAP->undefined_value(); 2203 if (!object->IsJSObject() || argc != 1) return heap()->undefined_value();
2203 2204
2204 Label miss; 2205 Label miss;
2205 GenerateNameCheck(name, &miss); 2206 GenerateNameCheck(name, &miss);
2206 2207
2207 if (cell == NULL) { 2208 if (cell == NULL) {
2208 __ ldr(r1, MemOperand(sp, 1 * kPointerSize)); 2209 __ ldr(r1, MemOperand(sp, 1 * kPointerSize));
2209 2210
2210 STATIC_ASSERT(kSmiTag == 0); 2211 STATIC_ASSERT(kSmiTag == 0);
2211 __ tst(r1, Operand(kSmiTagMask)); 2212 __ tst(r1, Operand(kSmiTagMask));
2212 __ b(eq, &miss); 2213 __ b(eq, &miss);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2284 } 2285 }
2285 2286
2286 2287
2287 MaybeObject* CallStubCompiler::CompileFastApiCall( 2288 MaybeObject* CallStubCompiler::CompileFastApiCall(
2288 const CallOptimization& optimization, 2289 const CallOptimization& optimization,
2289 Object* object, 2290 Object* object,
2290 JSObject* holder, 2291 JSObject* holder,
2291 JSGlobalPropertyCell* cell, 2292 JSGlobalPropertyCell* cell,
2292 JSFunction* function, 2293 JSFunction* function,
2293 String* name) { 2294 String* name) {
2294 Isolate* isolate = masm()->isolate(); 2295 Counters* counters = isolate()->counters();
2295 Heap* heap = isolate->heap();
2296 Counters* counters = isolate->counters();
2297 2296
2298 ASSERT(optimization.is_simple_api_call()); 2297 ASSERT(optimization.is_simple_api_call());
2299 // Bail out if object is a global object as we don't want to 2298 // Bail out if object is a global object as we don't want to
2300 // repatch it to global receiver. 2299 // repatch it to global receiver.
2301 if (object->IsGlobalObject()) return heap->undefined_value(); 2300 if (object->IsGlobalObject()) return heap()->undefined_value();
2302 if (cell != NULL) return heap->undefined_value(); 2301 if (cell != NULL) return heap()->undefined_value();
2303 int depth = optimization.GetPrototypeDepthOfExpectedType( 2302 int depth = optimization.GetPrototypeDepthOfExpectedType(
2304 JSObject::cast(object), holder); 2303 JSObject::cast(object), holder);
2305 if (depth == kInvalidProtoDepth) return heap->undefined_value(); 2304 if (depth == kInvalidProtoDepth) return heap()->undefined_value();
2306 2305
2307 Label miss, miss_before_stack_reserved; 2306 Label miss, miss_before_stack_reserved;
2308 2307
2309 GenerateNameCheck(name, &miss_before_stack_reserved); 2308 GenerateNameCheck(name, &miss_before_stack_reserved);
2310 2309
2311 // Get the receiver from the stack. 2310 // Get the receiver from the stack.
2312 const int argc = arguments().immediate(); 2311 const int argc = arguments().immediate();
2313 __ ldr(r1, MemOperand(sp, argc * kPointerSize)); 2312 __ ldr(r1, MemOperand(sp, argc * kPointerSize));
2314 2313
2315 // Check that the receiver isn't a smi. 2314 // Check that the receiver isn't a smi.
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
2795 2794
2796 // Return undefined if maps of the full prototype chain are still the 2795 // Return undefined if maps of the full prototype chain are still the
2797 // same and no global property with this name contains a value. 2796 // same and no global property with this name contains a value.
2798 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex); 2797 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex);
2799 __ Ret(); 2798 __ Ret();
2800 2799
2801 __ bind(&miss); 2800 __ bind(&miss);
2802 GenerateLoadMiss(masm(), Code::LOAD_IC); 2801 GenerateLoadMiss(masm(), Code::LOAD_IC);
2803 2802
2804 // Return the generated code. 2803 // Return the generated code.
2805 return GetCode(NONEXISTENT, HEAP->empty_string()); 2804 return GetCode(NONEXISTENT, heap()->empty_string());
2806 } 2805 }
2807 2806
2808 2807
2809 MaybeObject* LoadStubCompiler::CompileLoadField(JSObject* object, 2808 MaybeObject* LoadStubCompiler::CompileLoadField(JSObject* object,
2810 JSObject* holder, 2809 JSObject* holder,
2811 int index, 2810 int index,
2812 String* name) { 2811 String* name) {
2813 // ----------- S t a t e ------------- 2812 // ----------- S t a t e -------------
2814 // -- r0 : receiver 2813 // -- r0 : receiver
2815 // -- r2 : name 2814 // -- r2 : name
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
3244 __ b(ne, &miss); 3243 __ b(ne, &miss);
3245 3244
3246 // Check that the key is a smi. 3245 // Check that the key is a smi.
3247 __ tst(key_reg, Operand(kSmiTagMask)); 3246 __ tst(key_reg, Operand(kSmiTagMask));
3248 __ b(ne, &miss); 3247 __ b(ne, &miss);
3249 3248
3250 // Get the elements array and make sure it is a fast element array, not 'cow'. 3249 // Get the elements array and make sure it is a fast element array, not 'cow'.
3251 __ ldr(elements_reg, 3250 __ ldr(elements_reg,
3252 FieldMemOperand(receiver_reg, JSObject::kElementsOffset)); 3251 FieldMemOperand(receiver_reg, JSObject::kElementsOffset));
3253 __ ldr(scratch, FieldMemOperand(elements_reg, HeapObject::kMapOffset)); 3252 __ ldr(scratch, FieldMemOperand(elements_reg, HeapObject::kMapOffset));
3254 __ cmp(scratch, Operand(Handle<Map>(FACTORY->fixed_array_map()))); 3253 __ cmp(scratch, Operand(Handle<Map>(factory()->fixed_array_map())));
3255 __ b(ne, &miss); 3254 __ b(ne, &miss);
3256 3255
3257 // Check that the key is within bounds. 3256 // Check that the key is within bounds.
3258 if (receiver->IsJSArray()) { 3257 if (receiver->IsJSArray()) {
3259 __ ldr(scratch, FieldMemOperand(receiver_reg, JSArray::kLengthOffset)); 3258 __ ldr(scratch, FieldMemOperand(receiver_reg, JSArray::kLengthOffset));
3260 } else { 3259 } else {
3261 __ ldr(scratch, FieldMemOperand(elements_reg, FixedArray::kLengthOffset)); 3260 __ ldr(scratch, FieldMemOperand(elements_reg, FixedArray::kLengthOffset));
3262 } 3261 }
3263 // Compare smis. 3262 // Compare smis.
3264 __ cmp(key_reg, scratch); 3263 __ cmp(key_reg, scratch);
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after
4026 4025
4027 return GetCode(flags); 4026 return GetCode(flags);
4028 } 4027 }
4029 4028
4030 4029
4031 #undef __ 4030 #undef __
4032 4031
4033 } } // namespace v8::internal 4032 } } // namespace v8::internal
4034 4033
4035 #endif // V8_TARGET_ARCH_ARM 4034 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/arm/deoptimizer-arm.cc ('k') | src/assembler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698