| OLD | NEW |
| 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_X87 | 7 #if V8_TARGET_ARCH_X87 |
| 8 | 8 |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 1933 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1944 __ mov(eax, arg_count()); | 1944 __ mov(eax, arg_count()); |
| 1945 __ mov(ecx, FieldOperand(ebx, edx, times_half_pointer_size, | 1945 __ mov(ecx, FieldOperand(ebx, edx, times_half_pointer_size, |
| 1946 FixedArray::kHeaderSize)); | 1946 FixedArray::kHeaderSize)); |
| 1947 | 1947 |
| 1948 // Verify that ecx contains an AllocationSite | 1948 // Verify that ecx contains an AllocationSite |
| 1949 Factory* factory = masm->isolate()->factory(); | 1949 Factory* factory = masm->isolate()->factory(); |
| 1950 __ cmp(FieldOperand(ecx, HeapObject::kMapOffset), | 1950 __ cmp(FieldOperand(ecx, HeapObject::kMapOffset), |
| 1951 factory->allocation_site_map()); | 1951 factory->allocation_site_map()); |
| 1952 __ j(not_equal, &miss); | 1952 __ j(not_equal, &miss); |
| 1953 | 1953 |
| 1954 // Increment the call count for monomorphic function calls. |
| 1955 __ add(FieldOperand(ebx, edx, times_half_pointer_size, |
| 1956 FixedArray::kHeaderSize + kPointerSize), |
| 1957 Immediate(Smi::FromInt(CallICNexus::kCallCountIncrement))); |
| 1958 |
| 1954 __ mov(ebx, ecx); | 1959 __ mov(ebx, ecx); |
| 1955 __ mov(edx, edi); | 1960 __ mov(edx, edi); |
| 1956 ArrayConstructorStub stub(masm->isolate(), arg_count()); | 1961 ArrayConstructorStub stub(masm->isolate(), arg_count()); |
| 1957 __ TailCallStub(&stub); | 1962 __ TailCallStub(&stub); |
| 1958 | 1963 |
| 1959 __ bind(&miss); | 1964 __ bind(&miss); |
| 1960 GenerateMiss(masm); | 1965 GenerateMiss(masm); |
| 1961 | 1966 |
| 1962 // The slow case, we need this no matter what to complete a call after a miss. | 1967 // The slow case, we need this no matter what to complete a call after a miss. |
| 1963 CallFunctionNoFeedback(masm, | 1968 CallFunctionNoFeedback(masm, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2003 WeakCell::kValueOffset && | 2008 WeakCell::kValueOffset && |
| 2004 WeakCell::kValueOffset == Symbol::kHashFieldSlot); | 2009 WeakCell::kValueOffset == Symbol::kHashFieldSlot); |
| 2005 | 2010 |
| 2006 __ cmp(edi, FieldOperand(ecx, WeakCell::kValueOffset)); | 2011 __ cmp(edi, FieldOperand(ecx, WeakCell::kValueOffset)); |
| 2007 __ j(not_equal, &extra_checks_or_miss); | 2012 __ j(not_equal, &extra_checks_or_miss); |
| 2008 | 2013 |
| 2009 // The compare above could have been a SMI/SMI comparison. Guard against this | 2014 // The compare above could have been a SMI/SMI comparison. Guard against this |
| 2010 // convincing us that we have a monomorphic JSFunction. | 2015 // convincing us that we have a monomorphic JSFunction. |
| 2011 __ JumpIfSmi(edi, &extra_checks_or_miss); | 2016 __ JumpIfSmi(edi, &extra_checks_or_miss); |
| 2012 | 2017 |
| 2018 // Increment the call count for monomorphic function calls. |
| 2019 __ add(FieldOperand(ebx, edx, times_half_pointer_size, |
| 2020 FixedArray::kHeaderSize + kPointerSize), |
| 2021 Immediate(Smi::FromInt(CallICNexus::kCallCountIncrement))); |
| 2022 |
| 2013 __ bind(&have_js_function); | 2023 __ bind(&have_js_function); |
| 2014 if (CallAsMethod()) { | 2024 if (CallAsMethod()) { |
| 2015 EmitContinueIfStrictOrNative(masm, &cont); | 2025 EmitContinueIfStrictOrNative(masm, &cont); |
| 2016 | 2026 |
| 2017 // Load the receiver from the stack. | 2027 // Load the receiver from the stack. |
| 2018 __ mov(eax, Operand(esp, (argc + 1) * kPointerSize)); | 2028 __ mov(eax, Operand(esp, (argc + 1) * kPointerSize)); |
| 2019 | 2029 |
| 2020 __ JumpIfSmi(eax, &wrap); | 2030 __ JumpIfSmi(eax, &wrap); |
| 2021 | 2031 |
| 2022 __ CmpObjectType(eax, FIRST_SPEC_OBJECT_TYPE, ecx); | 2032 __ CmpObjectType(eax, FIRST_SPEC_OBJECT_TYPE, ecx); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2074 | 2084 |
| 2075 // Make sure the function is not the Array() function, which requires special | 2085 // Make sure the function is not the Array() function, which requires special |
| 2076 // behavior on MISS. | 2086 // behavior on MISS. |
| 2077 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, ecx); | 2087 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, ecx); |
| 2078 __ cmp(edi, ecx); | 2088 __ cmp(edi, ecx); |
| 2079 __ j(equal, &miss); | 2089 __ j(equal, &miss); |
| 2080 | 2090 |
| 2081 // Update stats. | 2091 // Update stats. |
| 2082 __ add(FieldOperand(ebx, with_types_offset), Immediate(Smi::FromInt(1))); | 2092 __ add(FieldOperand(ebx, with_types_offset), Immediate(Smi::FromInt(1))); |
| 2083 | 2093 |
| 2094 // Initialize the call counter. |
| 2095 __ mov(FieldOperand(ebx, edx, times_half_pointer_size, |
| 2096 FixedArray::kHeaderSize + kPointerSize), |
| 2097 Immediate(Smi::FromInt(CallICNexus::kCallCountIncrement))); |
| 2098 |
| 2084 // Store the function. Use a stub since we need a frame for allocation. | 2099 // Store the function. Use a stub since we need a frame for allocation. |
| 2085 // ebx - vector | 2100 // ebx - vector |
| 2086 // edx - slot | 2101 // edx - slot |
| 2087 // edi - function | 2102 // edi - function |
| 2088 { | 2103 { |
| 2089 FrameScope scope(masm, StackFrame::INTERNAL); | 2104 FrameScope scope(masm, StackFrame::INTERNAL); |
| 2090 CreateWeakCellStub create_stub(isolate); | 2105 CreateWeakCellStub create_stub(isolate); |
| 2091 __ push(edi); | 2106 __ push(edi); |
| 2092 __ CallStub(&create_stub); | 2107 __ CallStub(&create_stub); |
| 2093 __ pop(edi); | 2108 __ pop(edi); |
| (...skipping 3044 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5138 Operand(ebp, 7 * kPointerSize), NULL); | 5153 Operand(ebp, 7 * kPointerSize), NULL); |
| 5139 } | 5154 } |
| 5140 | 5155 |
| 5141 | 5156 |
| 5142 #undef __ | 5157 #undef __ |
| 5143 | 5158 |
| 5144 } // namespace internal | 5159 } // namespace internal |
| 5145 } // namespace v8 | 5160 } // namespace v8 |
| 5146 | 5161 |
| 5147 #endif // V8_TARGET_ARCH_X87 | 5162 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |