| 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" |
| 11 #include "src/code-stubs.h" | 11 #include "src/code-stubs.h" |
| 12 #include "src/codegen.h" | 12 #include "src/codegen.h" |
| 13 #include "src/ic/handler-compiler.h" | 13 #include "src/ic/handler-compiler.h" |
| 14 #include "src/ic/ic.h" |
| 14 #include "src/isolate.h" | 15 #include "src/isolate.h" |
| 15 #include "src/jsregexp.h" | 16 #include "src/jsregexp.h" |
| 16 #include "src/regexp-macro-assembler.h" | 17 #include "src/regexp-macro-assembler.h" |
| 17 #include "src/runtime.h" | 18 #include "src/runtime.h" |
| 18 | 19 |
| 19 namespace v8 { | 20 namespace v8 { |
| 20 namespace internal { | 21 namespace internal { |
| 21 | 22 |
| 22 | 23 |
| 23 static void InitializeArrayConstructorDescriptor( | 24 static void InitializeArrayConstructorDescriptor( |
| (...skipping 1164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1188 | 1189 |
| 1189 | 1190 |
| 1190 static int NegativeComparisonResult(Condition cc) { | 1191 static int NegativeComparisonResult(Condition cc) { |
| 1191 DCHECK(cc != equal); | 1192 DCHECK(cc != equal); |
| 1192 DCHECK((cc == less) || (cc == less_equal) | 1193 DCHECK((cc == less) || (cc == less_equal) |
| 1193 || (cc == greater) || (cc == greater_equal)); | 1194 || (cc == greater) || (cc == greater_equal)); |
| 1194 return (cc == greater || cc == greater_equal) ? LESS : GREATER; | 1195 return (cc == greater || cc == greater_equal) ? LESS : GREATER; |
| 1195 } | 1196 } |
| 1196 | 1197 |
| 1197 | 1198 |
| 1198 static void CheckInputType(MacroAssembler* masm, | 1199 static void CheckInputType(MacroAssembler* masm, Register input, |
| 1199 Register input, | 1200 CompareICState::State expected, Label* fail) { |
| 1200 CompareIC::State expected, | |
| 1201 Label* fail) { | |
| 1202 Label ok; | 1201 Label ok; |
| 1203 if (expected == CompareIC::SMI) { | 1202 if (expected == CompareICState::SMI) { |
| 1204 __ JumpIfNotSmi(input, fail); | 1203 __ JumpIfNotSmi(input, fail); |
| 1205 } else if (expected == CompareIC::NUMBER) { | 1204 } else if (expected == CompareICState::NUMBER) { |
| 1206 __ JumpIfSmi(input, &ok); | 1205 __ JumpIfSmi(input, &ok); |
| 1207 __ cmp(FieldOperand(input, HeapObject::kMapOffset), | 1206 __ cmp(FieldOperand(input, HeapObject::kMapOffset), |
| 1208 Immediate(masm->isolate()->factory()->heap_number_map())); | 1207 Immediate(masm->isolate()->factory()->heap_number_map())); |
| 1209 __ j(not_equal, fail); | 1208 __ j(not_equal, fail); |
| 1210 } | 1209 } |
| 1211 // We could be strict about internalized/non-internalized here, but as long as | 1210 // We could be strict about internalized/non-internalized here, but as long as |
| 1212 // hydrogen doesn't care, the stub doesn't have to care either. | 1211 // hydrogen doesn't care, the stub doesn't have to care either. |
| 1213 __ bind(&ok); | 1212 __ bind(&ok); |
| 1214 } | 1213 } |
| 1215 | 1214 |
| (...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1811 Factory* factory = masm->isolate()->factory(); | 1810 Factory* factory = masm->isolate()->factory(); |
| 1812 __ cmp(FieldOperand(ecx, HeapObject::kMapOffset), | 1811 __ cmp(FieldOperand(ecx, HeapObject::kMapOffset), |
| 1813 factory->allocation_site_map()); | 1812 factory->allocation_site_map()); |
| 1814 __ j(not_equal, &miss); | 1813 __ j(not_equal, &miss); |
| 1815 | 1814 |
| 1816 __ mov(ebx, ecx); | 1815 __ mov(ebx, ecx); |
| 1817 ArrayConstructorStub stub(masm->isolate(), arg_count()); | 1816 ArrayConstructorStub stub(masm->isolate(), arg_count()); |
| 1818 __ TailCallStub(&stub); | 1817 __ TailCallStub(&stub); |
| 1819 | 1818 |
| 1820 __ bind(&miss); | 1819 __ bind(&miss); |
| 1821 GenerateMiss(masm, IC::kCallIC_Customization_Miss); | 1820 GenerateMiss(masm); |
| 1822 | 1821 |
| 1823 // The slow case, we need this no matter what to complete a call after a miss. | 1822 // The slow case, we need this no matter what to complete a call after a miss. |
| 1824 CallFunctionNoFeedback(masm, | 1823 CallFunctionNoFeedback(masm, |
| 1825 arg_count(), | 1824 arg_count(), |
| 1826 true, | 1825 true, |
| 1827 CallAsMethod()); | 1826 CallAsMethod()); |
| 1828 | 1827 |
| 1829 // Unreachable. | 1828 // Unreachable. |
| 1830 __ int3(); | 1829 __ int3(); |
| 1831 } | 1830 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1890 __ CmpObjectType(ecx, JS_FUNCTION_TYPE, ecx); | 1889 __ CmpObjectType(ecx, JS_FUNCTION_TYPE, ecx); |
| 1891 __ j(not_equal, &miss); | 1890 __ j(not_equal, &miss); |
| 1892 __ mov(FieldOperand(ebx, edx, times_half_pointer_size, | 1891 __ mov(FieldOperand(ebx, edx, times_half_pointer_size, |
| 1893 FixedArray::kHeaderSize), | 1892 FixedArray::kHeaderSize), |
| 1894 Immediate(TypeFeedbackInfo::MegamorphicSentinel(isolate))); | 1893 Immediate(TypeFeedbackInfo::MegamorphicSentinel(isolate))); |
| 1895 __ jmp(&slow_start); | 1894 __ jmp(&slow_start); |
| 1896 } | 1895 } |
| 1897 | 1896 |
| 1898 // We are here because tracing is on or we are going monomorphic. | 1897 // We are here because tracing is on or we are going monomorphic. |
| 1899 __ bind(&miss); | 1898 __ bind(&miss); |
| 1900 GenerateMiss(masm, IC::kCallIC_Miss); | 1899 GenerateMiss(masm); |
| 1901 | 1900 |
| 1902 // the slow case | 1901 // the slow case |
| 1903 __ bind(&slow_start); | 1902 __ bind(&slow_start); |
| 1904 | 1903 |
| 1905 // Check that the function really is a JavaScript function. | 1904 // Check that the function really is a JavaScript function. |
| 1906 __ JumpIfSmi(edi, &non_function); | 1905 __ JumpIfSmi(edi, &non_function); |
| 1907 | 1906 |
| 1908 // Goto slow case if we do not have a function. | 1907 // Goto slow case if we do not have a function. |
| 1909 __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); | 1908 __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); |
| 1910 __ j(not_equal, &slow); | 1909 __ j(not_equal, &slow); |
| 1911 __ jmp(&have_js_function); | 1910 __ jmp(&have_js_function); |
| 1912 | 1911 |
| 1913 // Unreachable | 1912 // Unreachable |
| 1914 __ int3(); | 1913 __ int3(); |
| 1915 } | 1914 } |
| 1916 | 1915 |
| 1917 | 1916 |
| 1918 void CallICStub::GenerateMiss(MacroAssembler* masm, IC::UtilityId id) { | 1917 void CallICStub::GenerateMiss(MacroAssembler* masm) { |
| 1919 // Get the receiver of the function from the stack; 1 ~ return address. | 1918 // Get the receiver of the function from the stack; 1 ~ return address. |
| 1920 __ mov(ecx, Operand(esp, (arg_count() + 1) * kPointerSize)); | 1919 __ mov(ecx, Operand(esp, (arg_count() + 1) * kPointerSize)); |
| 1921 | 1920 |
| 1922 { | 1921 { |
| 1923 FrameScope scope(masm, StackFrame::INTERNAL); | 1922 FrameScope scope(masm, StackFrame::INTERNAL); |
| 1924 | 1923 |
| 1925 // Push the receiver and the function and feedback info. | 1924 // Push the receiver and the function and feedback info. |
| 1926 __ push(ecx); | 1925 __ push(ecx); |
| 1927 __ push(edi); | 1926 __ push(edi); |
| 1928 __ push(ebx); | 1927 __ push(ebx); |
| 1929 __ push(edx); | 1928 __ push(edx); |
| 1930 | 1929 |
| 1931 // Call the entry. | 1930 // Call the entry. |
| 1931 IC::UtilityId id = GetICState() == DEFAULT ? IC::kCallIC_Miss |
| 1932 : IC::kCallIC_Customization_Miss; |
| 1933 |
| 1932 ExternalReference miss = ExternalReference(IC_Utility(id), | 1934 ExternalReference miss = ExternalReference(IC_Utility(id), |
| 1933 masm->isolate()); | 1935 masm->isolate()); |
| 1934 __ CallExternalReference(miss, 4); | 1936 __ CallExternalReference(miss, 4); |
| 1935 | 1937 |
| 1936 // Move result to edi and exit the internal frame. | 1938 // Move result to edi and exit the internal frame. |
| 1937 __ mov(edi, eax); | 1939 __ mov(edi, eax); |
| 1938 } | 1940 } |
| 1939 } | 1941 } |
| 1940 | 1942 |
| 1941 | 1943 |
| (...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2966 } | 2968 } |
| 2967 | 2969 |
| 2968 // Tail call into the stub that handles binary operations with allocation | 2970 // Tail call into the stub that handles binary operations with allocation |
| 2969 // sites. | 2971 // sites. |
| 2970 BinaryOpWithAllocationSiteStub stub(isolate(), state()); | 2972 BinaryOpWithAllocationSiteStub stub(isolate(), state()); |
| 2971 __ TailCallStub(&stub); | 2973 __ TailCallStub(&stub); |
| 2972 } | 2974 } |
| 2973 | 2975 |
| 2974 | 2976 |
| 2975 void CompareICStub::GenerateSmis(MacroAssembler* masm) { | 2977 void CompareICStub::GenerateSmis(MacroAssembler* masm) { |
| 2976 DCHECK(state() == CompareIC::SMI); | 2978 DCHECK(state() == CompareICState::SMI); |
| 2977 Label miss; | 2979 Label miss; |
| 2978 __ mov(ecx, edx); | 2980 __ mov(ecx, edx); |
| 2979 __ or_(ecx, eax); | 2981 __ or_(ecx, eax); |
| 2980 __ JumpIfNotSmi(ecx, &miss, Label::kNear); | 2982 __ JumpIfNotSmi(ecx, &miss, Label::kNear); |
| 2981 | 2983 |
| 2982 if (GetCondition() == equal) { | 2984 if (GetCondition() == equal) { |
| 2983 // For equality we do not care about the sign of the result. | 2985 // For equality we do not care about the sign of the result. |
| 2984 __ sub(eax, edx); | 2986 __ sub(eax, edx); |
| 2985 } else { | 2987 } else { |
| 2986 Label done; | 2988 Label done; |
| 2987 __ sub(edx, eax); | 2989 __ sub(edx, eax); |
| 2988 __ j(no_overflow, &done, Label::kNear); | 2990 __ j(no_overflow, &done, Label::kNear); |
| 2989 // Correct sign of result in case of overflow. | 2991 // Correct sign of result in case of overflow. |
| 2990 __ not_(edx); | 2992 __ not_(edx); |
| 2991 __ bind(&done); | 2993 __ bind(&done); |
| 2992 __ mov(eax, edx); | 2994 __ mov(eax, edx); |
| 2993 } | 2995 } |
| 2994 __ ret(0); | 2996 __ ret(0); |
| 2995 | 2997 |
| 2996 __ bind(&miss); | 2998 __ bind(&miss); |
| 2997 GenerateMiss(masm); | 2999 GenerateMiss(masm); |
| 2998 } | 3000 } |
| 2999 | 3001 |
| 3000 | 3002 |
| 3001 void CompareICStub::GenerateNumbers(MacroAssembler* masm) { | 3003 void CompareICStub::GenerateNumbers(MacroAssembler* masm) { |
| 3002 DCHECK(state() == CompareIC::NUMBER); | 3004 DCHECK(state() == CompareICState::NUMBER); |
| 3003 | 3005 |
| 3004 Label generic_stub; | 3006 Label generic_stub; |
| 3005 Label unordered, maybe_undefined1, maybe_undefined2; | 3007 Label unordered, maybe_undefined1, maybe_undefined2; |
| 3006 Label miss; | 3008 Label miss; |
| 3007 | 3009 |
| 3008 if (left() == CompareIC::SMI) { | 3010 if (left() == CompareICState::SMI) { |
| 3009 __ JumpIfNotSmi(edx, &miss); | 3011 __ JumpIfNotSmi(edx, &miss); |
| 3010 } | 3012 } |
| 3011 if (right() == CompareIC::SMI) { | 3013 if (right() == CompareICState::SMI) { |
| 3012 __ JumpIfNotSmi(eax, &miss); | 3014 __ JumpIfNotSmi(eax, &miss); |
| 3013 } | 3015 } |
| 3014 | 3016 |
| 3015 // Inlining the double comparison and falling back to the general compare | 3017 // Inlining the double comparison and falling back to the general compare |
| 3016 // stub if NaN is involved or SSE2 or CMOV is unsupported. | 3018 // stub if NaN is involved or SSE2 or CMOV is unsupported. |
| 3017 __ mov(ecx, edx); | 3019 __ mov(ecx, edx); |
| 3018 __ and_(ecx, eax); | 3020 __ and_(ecx, eax); |
| 3019 __ JumpIfSmi(ecx, &generic_stub, Label::kNear); | 3021 __ JumpIfSmi(ecx, &generic_stub, Label::kNear); |
| 3020 | 3022 |
| 3021 __ cmp(FieldOperand(eax, HeapObject::kMapOffset), | 3023 __ cmp(FieldOperand(eax, HeapObject::kMapOffset), |
| 3022 isolate()->factory()->heap_number_map()); | 3024 isolate()->factory()->heap_number_map()); |
| 3023 __ j(not_equal, &maybe_undefined1, Label::kNear); | 3025 __ j(not_equal, &maybe_undefined1, Label::kNear); |
| 3024 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), | 3026 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), |
| 3025 isolate()->factory()->heap_number_map()); | 3027 isolate()->factory()->heap_number_map()); |
| 3026 __ j(not_equal, &maybe_undefined2, Label::kNear); | 3028 __ j(not_equal, &maybe_undefined2, Label::kNear); |
| 3027 | 3029 |
| 3028 __ bind(&unordered); | 3030 __ bind(&unordered); |
| 3029 __ bind(&generic_stub); | 3031 __ bind(&generic_stub); |
| 3030 CompareICStub stub(isolate(), op(), CompareIC::GENERIC, CompareIC::GENERIC, | 3032 CompareICStub stub(isolate(), op(), CompareICState::GENERIC, |
| 3031 CompareIC::GENERIC); | 3033 CompareICState::GENERIC, CompareICState::GENERIC); |
| 3032 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); | 3034 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); |
| 3033 | 3035 |
| 3034 __ bind(&maybe_undefined1); | 3036 __ bind(&maybe_undefined1); |
| 3035 if (Token::IsOrderedRelationalCompareOp(op())) { | 3037 if (Token::IsOrderedRelationalCompareOp(op())) { |
| 3036 __ cmp(eax, Immediate(isolate()->factory()->undefined_value())); | 3038 __ cmp(eax, Immediate(isolate()->factory()->undefined_value())); |
| 3037 __ j(not_equal, &miss); | 3039 __ j(not_equal, &miss); |
| 3038 __ JumpIfSmi(edx, &unordered); | 3040 __ JumpIfSmi(edx, &unordered); |
| 3039 __ CmpObjectType(edx, HEAP_NUMBER_TYPE, ecx); | 3041 __ CmpObjectType(edx, HEAP_NUMBER_TYPE, ecx); |
| 3040 __ j(not_equal, &maybe_undefined2, Label::kNear); | 3042 __ j(not_equal, &maybe_undefined2, Label::kNear); |
| 3041 __ jmp(&unordered); | 3043 __ jmp(&unordered); |
| 3042 } | 3044 } |
| 3043 | 3045 |
| 3044 __ bind(&maybe_undefined2); | 3046 __ bind(&maybe_undefined2); |
| 3045 if (Token::IsOrderedRelationalCompareOp(op())) { | 3047 if (Token::IsOrderedRelationalCompareOp(op())) { |
| 3046 __ cmp(edx, Immediate(isolate()->factory()->undefined_value())); | 3048 __ cmp(edx, Immediate(isolate()->factory()->undefined_value())); |
| 3047 __ j(equal, &unordered); | 3049 __ j(equal, &unordered); |
| 3048 } | 3050 } |
| 3049 | 3051 |
| 3050 __ bind(&miss); | 3052 __ bind(&miss); |
| 3051 GenerateMiss(masm); | 3053 GenerateMiss(masm); |
| 3052 } | 3054 } |
| 3053 | 3055 |
| 3054 | 3056 |
| 3055 void CompareICStub::GenerateInternalizedStrings(MacroAssembler* masm) { | 3057 void CompareICStub::GenerateInternalizedStrings(MacroAssembler* masm) { |
| 3056 DCHECK(state() == CompareIC::INTERNALIZED_STRING); | 3058 DCHECK(state() == CompareICState::INTERNALIZED_STRING); |
| 3057 DCHECK(GetCondition() == equal); | 3059 DCHECK(GetCondition() == equal); |
| 3058 | 3060 |
| 3059 // Registers containing left and right operands respectively. | 3061 // Registers containing left and right operands respectively. |
| 3060 Register left = edx; | 3062 Register left = edx; |
| 3061 Register right = eax; | 3063 Register right = eax; |
| 3062 Register tmp1 = ecx; | 3064 Register tmp1 = ecx; |
| 3063 Register tmp2 = ebx; | 3065 Register tmp2 = ebx; |
| 3064 | 3066 |
| 3065 // Check that both operands are heap objects. | 3067 // Check that both operands are heap objects. |
| 3066 Label miss; | 3068 Label miss; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 3091 __ Move(eax, Immediate(Smi::FromInt(EQUAL))); | 3093 __ Move(eax, Immediate(Smi::FromInt(EQUAL))); |
| 3092 __ bind(&done); | 3094 __ bind(&done); |
| 3093 __ ret(0); | 3095 __ ret(0); |
| 3094 | 3096 |
| 3095 __ bind(&miss); | 3097 __ bind(&miss); |
| 3096 GenerateMiss(masm); | 3098 GenerateMiss(masm); |
| 3097 } | 3099 } |
| 3098 | 3100 |
| 3099 | 3101 |
| 3100 void CompareICStub::GenerateUniqueNames(MacroAssembler* masm) { | 3102 void CompareICStub::GenerateUniqueNames(MacroAssembler* masm) { |
| 3101 DCHECK(state() == CompareIC::UNIQUE_NAME); | 3103 DCHECK(state() == CompareICState::UNIQUE_NAME); |
| 3102 DCHECK(GetCondition() == equal); | 3104 DCHECK(GetCondition() == equal); |
| 3103 | 3105 |
| 3104 // Registers containing left and right operands respectively. | 3106 // Registers containing left and right operands respectively. |
| 3105 Register left = edx; | 3107 Register left = edx; |
| 3106 Register right = eax; | 3108 Register right = eax; |
| 3107 Register tmp1 = ecx; | 3109 Register tmp1 = ecx; |
| 3108 Register tmp2 = ebx; | 3110 Register tmp2 = ebx; |
| 3109 | 3111 |
| 3110 // Check that both operands are heap objects. | 3112 // Check that both operands are heap objects. |
| 3111 Label miss; | 3113 Label miss; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 3136 __ Move(eax, Immediate(Smi::FromInt(EQUAL))); | 3138 __ Move(eax, Immediate(Smi::FromInt(EQUAL))); |
| 3137 __ bind(&done); | 3139 __ bind(&done); |
| 3138 __ ret(0); | 3140 __ ret(0); |
| 3139 | 3141 |
| 3140 __ bind(&miss); | 3142 __ bind(&miss); |
| 3141 GenerateMiss(masm); | 3143 GenerateMiss(masm); |
| 3142 } | 3144 } |
| 3143 | 3145 |
| 3144 | 3146 |
| 3145 void CompareICStub::GenerateStrings(MacroAssembler* masm) { | 3147 void CompareICStub::GenerateStrings(MacroAssembler* masm) { |
| 3146 DCHECK(state() == CompareIC::STRING); | 3148 DCHECK(state() == CompareICState::STRING); |
| 3147 Label miss; | 3149 Label miss; |
| 3148 | 3150 |
| 3149 bool equality = Token::IsEqualityOp(op()); | 3151 bool equality = Token::IsEqualityOp(op()); |
| 3150 | 3152 |
| 3151 // Registers containing left and right operands respectively. | 3153 // Registers containing left and right operands respectively. |
| 3152 Register left = edx; | 3154 Register left = edx; |
| 3153 Register right = eax; | 3155 Register right = eax; |
| 3154 Register tmp1 = ecx; | 3156 Register tmp1 = ecx; |
| 3155 Register tmp2 = ebx; | 3157 Register tmp2 = ebx; |
| 3156 Register tmp3 = edi; | 3158 Register tmp3 = edi; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3226 } else { | 3228 } else { |
| 3227 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 3229 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
| 3228 } | 3230 } |
| 3229 | 3231 |
| 3230 __ bind(&miss); | 3232 __ bind(&miss); |
| 3231 GenerateMiss(masm); | 3233 GenerateMiss(masm); |
| 3232 } | 3234 } |
| 3233 | 3235 |
| 3234 | 3236 |
| 3235 void CompareICStub::GenerateObjects(MacroAssembler* masm) { | 3237 void CompareICStub::GenerateObjects(MacroAssembler* masm) { |
| 3236 DCHECK(state() == CompareIC::OBJECT); | 3238 DCHECK(state() == CompareICState::OBJECT); |
| 3237 Label miss; | 3239 Label miss; |
| 3238 __ mov(ecx, edx); | 3240 __ mov(ecx, edx); |
| 3239 __ and_(ecx, eax); | 3241 __ and_(ecx, eax); |
| 3240 __ JumpIfSmi(ecx, &miss, Label::kNear); | 3242 __ JumpIfSmi(ecx, &miss, Label::kNear); |
| 3241 | 3243 |
| 3242 __ CmpObjectType(eax, JS_OBJECT_TYPE, ecx); | 3244 __ CmpObjectType(eax, JS_OBJECT_TYPE, ecx); |
| 3243 __ j(not_equal, &miss, Label::kNear); | 3245 __ j(not_equal, &miss, Label::kNear); |
| 3244 __ CmpObjectType(edx, JS_OBJECT_TYPE, ecx); | 3246 __ CmpObjectType(edx, JS_OBJECT_TYPE, ecx); |
| 3245 __ j(not_equal, &miss, Label::kNear); | 3247 __ j(not_equal, &miss, Label::kNear); |
| 3246 | 3248 |
| (...skipping 1068 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4315 Operand(ebp, 7 * kPointerSize), | 4317 Operand(ebp, 7 * kPointerSize), |
| 4316 NULL); | 4318 NULL); |
| 4317 } | 4319 } |
| 4318 | 4320 |
| 4319 | 4321 |
| 4320 #undef __ | 4322 #undef __ |
| 4321 | 4323 |
| 4322 } } // namespace v8::internal | 4324 } } // namespace v8::internal |
| 4323 | 4325 |
| 4324 #endif // V8_TARGET_ARCH_X87 | 4326 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |