| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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_X64 | 7 #if V8_TARGET_ARCH_X64 |
| 8 | 8 |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| 11 #include "src/codegen.h" | 11 #include "src/codegen.h" |
| 12 #include "src/ic/handler-compiler.h" | 12 #include "src/ic/handler-compiler.h" |
| 13 #include "src/ic/ic.h" |
| 13 #include "src/isolate.h" | 14 #include "src/isolate.h" |
| 14 #include "src/jsregexp.h" | 15 #include "src/jsregexp.h" |
| 15 #include "src/regexp-macro-assembler.h" | 16 #include "src/regexp-macro-assembler.h" |
| 16 #include "src/runtime.h" | 17 #include "src/runtime.h" |
| 17 | 18 |
| 18 namespace v8 { | 19 namespace v8 { |
| 19 namespace internal { | 20 namespace internal { |
| 20 | 21 |
| 21 | 22 |
| 22 static void InitializeArrayConstructorDescriptor( | 23 static void InitializeArrayConstructorDescriptor( |
| (...skipping 1359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1382 | 1383 |
| 1383 | 1384 |
| 1384 static int NegativeComparisonResult(Condition cc) { | 1385 static int NegativeComparisonResult(Condition cc) { |
| 1385 DCHECK(cc != equal); | 1386 DCHECK(cc != equal); |
| 1386 DCHECK((cc == less) || (cc == less_equal) | 1387 DCHECK((cc == less) || (cc == less_equal) |
| 1387 || (cc == greater) || (cc == greater_equal)); | 1388 || (cc == greater) || (cc == greater_equal)); |
| 1388 return (cc == greater || cc == greater_equal) ? LESS : GREATER; | 1389 return (cc == greater || cc == greater_equal) ? LESS : GREATER; |
| 1389 } | 1390 } |
| 1390 | 1391 |
| 1391 | 1392 |
| 1392 static void CheckInputType(MacroAssembler* masm, | 1393 static void CheckInputType(MacroAssembler* masm, Register input, |
| 1393 Register input, | 1394 CompareICState::State expected, Label* fail) { |
| 1394 CompareIC::State expected, | |
| 1395 Label* fail) { | |
| 1396 Label ok; | 1395 Label ok; |
| 1397 if (expected == CompareIC::SMI) { | 1396 if (expected == CompareICState::SMI) { |
| 1398 __ JumpIfNotSmi(input, fail); | 1397 __ JumpIfNotSmi(input, fail); |
| 1399 } else if (expected == CompareIC::NUMBER) { | 1398 } else if (expected == CompareICState::NUMBER) { |
| 1400 __ JumpIfSmi(input, &ok); | 1399 __ JumpIfSmi(input, &ok); |
| 1401 __ CompareMap(input, masm->isolate()->factory()->heap_number_map()); | 1400 __ CompareMap(input, masm->isolate()->factory()->heap_number_map()); |
| 1402 __ j(not_equal, fail); | 1401 __ j(not_equal, fail); |
| 1403 } | 1402 } |
| 1404 // We could be strict about internalized/non-internalized here, but as long as | 1403 // We could be strict about internalized/non-internalized here, but as long as |
| 1405 // hydrogen doesn't care, the stub doesn't have to care either. | 1404 // hydrogen doesn't care, the stub doesn't have to care either. |
| 1406 __ bind(&ok); | 1405 __ bind(&ok); |
| 1407 } | 1406 } |
| 1408 | 1407 |
| 1409 | 1408 |
| (...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2003 Factory* factory = masm->isolate()->factory(); | 2002 Factory* factory = masm->isolate()->factory(); |
| 2004 __ Cmp(FieldOperand(rcx, HeapObject::kMapOffset), | 2003 __ Cmp(FieldOperand(rcx, HeapObject::kMapOffset), |
| 2005 factory->allocation_site_map()); | 2004 factory->allocation_site_map()); |
| 2006 __ j(not_equal, &miss); | 2005 __ j(not_equal, &miss); |
| 2007 | 2006 |
| 2008 __ movp(rbx, rcx); | 2007 __ movp(rbx, rcx); |
| 2009 ArrayConstructorStub stub(masm->isolate(), arg_count()); | 2008 ArrayConstructorStub stub(masm->isolate(), arg_count()); |
| 2010 __ TailCallStub(&stub); | 2009 __ TailCallStub(&stub); |
| 2011 | 2010 |
| 2012 __ bind(&miss); | 2011 __ bind(&miss); |
| 2013 GenerateMiss(masm, IC::kCallIC_Customization_Miss); | 2012 GenerateMiss(masm); |
| 2014 | 2013 |
| 2015 // The slow case, we need this no matter what to complete a call after a miss. | 2014 // The slow case, we need this no matter what to complete a call after a miss. |
| 2016 CallFunctionNoFeedback(masm, | 2015 CallFunctionNoFeedback(masm, |
| 2017 arg_count(), | 2016 arg_count(), |
| 2018 true, | 2017 true, |
| 2019 CallAsMethod()); | 2018 CallAsMethod()); |
| 2020 | 2019 |
| 2021 // Unreachable. | 2020 // Unreachable. |
| 2022 __ int3(); | 2021 __ int3(); |
| 2023 } | 2022 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2084 __ CmpObjectType(rcx, JS_FUNCTION_TYPE, rcx); | 2083 __ CmpObjectType(rcx, JS_FUNCTION_TYPE, rcx); |
| 2085 __ j(not_equal, &miss); | 2084 __ j(not_equal, &miss); |
| 2086 __ Move(FieldOperand(rbx, rdx, times_pointer_size, | 2085 __ Move(FieldOperand(rbx, rdx, times_pointer_size, |
| 2087 FixedArray::kHeaderSize), | 2086 FixedArray::kHeaderSize), |
| 2088 TypeFeedbackInfo::MegamorphicSentinel(isolate)); | 2087 TypeFeedbackInfo::MegamorphicSentinel(isolate)); |
| 2089 __ jmp(&slow_start); | 2088 __ jmp(&slow_start); |
| 2090 } | 2089 } |
| 2091 | 2090 |
| 2092 // We are here because tracing is on or we are going monomorphic. | 2091 // We are here because tracing is on or we are going monomorphic. |
| 2093 __ bind(&miss); | 2092 __ bind(&miss); |
| 2094 GenerateMiss(masm, IC::kCallIC_Miss); | 2093 GenerateMiss(masm); |
| 2095 | 2094 |
| 2096 // the slow case | 2095 // the slow case |
| 2097 __ bind(&slow_start); | 2096 __ bind(&slow_start); |
| 2098 // Check that function is not a smi. | 2097 // Check that function is not a smi. |
| 2099 __ JumpIfSmi(rdi, &non_function); | 2098 __ JumpIfSmi(rdi, &non_function); |
| 2100 // Check that function is a JSFunction. | 2099 // Check that function is a JSFunction. |
| 2101 __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); | 2100 __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); |
| 2102 __ j(not_equal, &slow); | 2101 __ j(not_equal, &slow); |
| 2103 __ jmp(&have_js_function); | 2102 __ jmp(&have_js_function); |
| 2104 | 2103 |
| 2105 // Unreachable | 2104 // Unreachable |
| 2106 __ int3(); | 2105 __ int3(); |
| 2107 } | 2106 } |
| 2108 | 2107 |
| 2109 | 2108 |
| 2110 void CallICStub::GenerateMiss(MacroAssembler* masm, IC::UtilityId id) { | 2109 void CallICStub::GenerateMiss(MacroAssembler* masm) { |
| 2111 // Get the receiver of the function from the stack; 1 ~ return address. | 2110 // Get the receiver of the function from the stack; 1 ~ return address. |
| 2112 __ movp(rcx, Operand(rsp, (arg_count() + 1) * kPointerSize)); | 2111 __ movp(rcx, Operand(rsp, (arg_count() + 1) * kPointerSize)); |
| 2113 | 2112 |
| 2114 { | 2113 { |
| 2115 FrameScope scope(masm, StackFrame::INTERNAL); | 2114 FrameScope scope(masm, StackFrame::INTERNAL); |
| 2116 | 2115 |
| 2117 // Push the receiver and the function and feedback info. | 2116 // Push the receiver and the function and feedback info. |
| 2118 __ Push(rcx); | 2117 __ Push(rcx); |
| 2119 __ Push(rdi); | 2118 __ Push(rdi); |
| 2120 __ Push(rbx); | 2119 __ Push(rbx); |
| 2121 __ Integer32ToSmi(rdx, rdx); | 2120 __ Integer32ToSmi(rdx, rdx); |
| 2122 __ Push(rdx); | 2121 __ Push(rdx); |
| 2123 | 2122 |
| 2124 // Call the entry. | 2123 // Call the entry. |
| 2124 IC::UtilityId id = GetICState() == DEFAULT ? IC::kCallIC_Miss |
| 2125 : IC::kCallIC_Customization_Miss; |
| 2126 |
| 2125 ExternalReference miss = ExternalReference(IC_Utility(id), | 2127 ExternalReference miss = ExternalReference(IC_Utility(id), |
| 2126 masm->isolate()); | 2128 masm->isolate()); |
| 2127 __ CallExternalReference(miss, 4); | 2129 __ CallExternalReference(miss, 4); |
| 2128 | 2130 |
| 2129 // Move result to edi and exit the internal frame. | 2131 // Move result to edi and exit the internal frame. |
| 2130 __ movp(rdi, rax); | 2132 __ movp(rdi, rax); |
| 2131 } | 2133 } |
| 2132 } | 2134 } |
| 2133 | 2135 |
| 2134 | 2136 |
| (...skipping 1115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3250 } | 3252 } |
| 3251 | 3253 |
| 3252 // Tail call into the stub that handles binary operations with allocation | 3254 // Tail call into the stub that handles binary operations with allocation |
| 3253 // sites. | 3255 // sites. |
| 3254 BinaryOpWithAllocationSiteStub stub(isolate(), state()); | 3256 BinaryOpWithAllocationSiteStub stub(isolate(), state()); |
| 3255 __ TailCallStub(&stub); | 3257 __ TailCallStub(&stub); |
| 3256 } | 3258 } |
| 3257 | 3259 |
| 3258 | 3260 |
| 3259 void CompareICStub::GenerateSmis(MacroAssembler* masm) { | 3261 void CompareICStub::GenerateSmis(MacroAssembler* masm) { |
| 3260 DCHECK(state() == CompareIC::SMI); | 3262 DCHECK(state() == CompareICState::SMI); |
| 3261 Label miss; | 3263 Label miss; |
| 3262 __ JumpIfNotBothSmi(rdx, rax, &miss, Label::kNear); | 3264 __ JumpIfNotBothSmi(rdx, rax, &miss, Label::kNear); |
| 3263 | 3265 |
| 3264 if (GetCondition() == equal) { | 3266 if (GetCondition() == equal) { |
| 3265 // For equality we do not care about the sign of the result. | 3267 // For equality we do not care about the sign of the result. |
| 3266 __ subp(rax, rdx); | 3268 __ subp(rax, rdx); |
| 3267 } else { | 3269 } else { |
| 3268 Label done; | 3270 Label done; |
| 3269 __ subp(rdx, rax); | 3271 __ subp(rdx, rax); |
| 3270 __ j(no_overflow, &done, Label::kNear); | 3272 __ j(no_overflow, &done, Label::kNear); |
| 3271 // Correct sign of result in case of overflow. | 3273 // Correct sign of result in case of overflow. |
| 3272 __ notp(rdx); | 3274 __ notp(rdx); |
| 3273 __ bind(&done); | 3275 __ bind(&done); |
| 3274 __ movp(rax, rdx); | 3276 __ movp(rax, rdx); |
| 3275 } | 3277 } |
| 3276 __ ret(0); | 3278 __ ret(0); |
| 3277 | 3279 |
| 3278 __ bind(&miss); | 3280 __ bind(&miss); |
| 3279 GenerateMiss(masm); | 3281 GenerateMiss(masm); |
| 3280 } | 3282 } |
| 3281 | 3283 |
| 3282 | 3284 |
| 3283 void CompareICStub::GenerateNumbers(MacroAssembler* masm) { | 3285 void CompareICStub::GenerateNumbers(MacroAssembler* masm) { |
| 3284 DCHECK(state() == CompareIC::NUMBER); | 3286 DCHECK(state() == CompareICState::NUMBER); |
| 3285 | 3287 |
| 3286 Label generic_stub; | 3288 Label generic_stub; |
| 3287 Label unordered, maybe_undefined1, maybe_undefined2; | 3289 Label unordered, maybe_undefined1, maybe_undefined2; |
| 3288 Label miss; | 3290 Label miss; |
| 3289 | 3291 |
| 3290 if (left() == CompareIC::SMI) { | 3292 if (left() == CompareICState::SMI) { |
| 3291 __ JumpIfNotSmi(rdx, &miss); | 3293 __ JumpIfNotSmi(rdx, &miss); |
| 3292 } | 3294 } |
| 3293 if (right() == CompareIC::SMI) { | 3295 if (right() == CompareICState::SMI) { |
| 3294 __ JumpIfNotSmi(rax, &miss); | 3296 __ JumpIfNotSmi(rax, &miss); |
| 3295 } | 3297 } |
| 3296 | 3298 |
| 3297 // Load left and right operand. | 3299 // Load left and right operand. |
| 3298 Label done, left, left_smi, right_smi; | 3300 Label done, left, left_smi, right_smi; |
| 3299 __ JumpIfSmi(rax, &right_smi, Label::kNear); | 3301 __ JumpIfSmi(rax, &right_smi, Label::kNear); |
| 3300 __ CompareMap(rax, isolate()->factory()->heap_number_map()); | 3302 __ CompareMap(rax, isolate()->factory()->heap_number_map()); |
| 3301 __ j(not_equal, &maybe_undefined1, Label::kNear); | 3303 __ j(not_equal, &maybe_undefined1, Label::kNear); |
| 3302 __ movsd(xmm1, FieldOperand(rax, HeapNumber::kValueOffset)); | 3304 __ movsd(xmm1, FieldOperand(rax, HeapNumber::kValueOffset)); |
| 3303 __ jmp(&left, Label::kNear); | 3305 __ jmp(&left, Label::kNear); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 3325 // Return a result of -1, 0, or 1, based on EFLAGS. | 3327 // Return a result of -1, 0, or 1, based on EFLAGS. |
| 3326 // Performing mov, because xor would destroy the flag register. | 3328 // Performing mov, because xor would destroy the flag register. |
| 3327 __ movl(rax, Immediate(0)); | 3329 __ movl(rax, Immediate(0)); |
| 3328 __ movl(rcx, Immediate(0)); | 3330 __ movl(rcx, Immediate(0)); |
| 3329 __ setcc(above, rax); // Add one to zero if carry clear and not equal. | 3331 __ setcc(above, rax); // Add one to zero if carry clear and not equal. |
| 3330 __ sbbp(rax, rcx); // Subtract one if below (aka. carry set). | 3332 __ sbbp(rax, rcx); // Subtract one if below (aka. carry set). |
| 3331 __ ret(0); | 3333 __ ret(0); |
| 3332 | 3334 |
| 3333 __ bind(&unordered); | 3335 __ bind(&unordered); |
| 3334 __ bind(&generic_stub); | 3336 __ bind(&generic_stub); |
| 3335 CompareICStub stub(isolate(), op(), CompareIC::GENERIC, CompareIC::GENERIC, | 3337 CompareICStub stub(isolate(), op(), CompareICState::GENERIC, |
| 3336 CompareIC::GENERIC); | 3338 CompareICState::GENERIC, CompareICState::GENERIC); |
| 3337 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); | 3339 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); |
| 3338 | 3340 |
| 3339 __ bind(&maybe_undefined1); | 3341 __ bind(&maybe_undefined1); |
| 3340 if (Token::IsOrderedRelationalCompareOp(op())) { | 3342 if (Token::IsOrderedRelationalCompareOp(op())) { |
| 3341 __ Cmp(rax, isolate()->factory()->undefined_value()); | 3343 __ Cmp(rax, isolate()->factory()->undefined_value()); |
| 3342 __ j(not_equal, &miss); | 3344 __ j(not_equal, &miss); |
| 3343 __ JumpIfSmi(rdx, &unordered); | 3345 __ JumpIfSmi(rdx, &unordered); |
| 3344 __ CmpObjectType(rdx, HEAP_NUMBER_TYPE, rcx); | 3346 __ CmpObjectType(rdx, HEAP_NUMBER_TYPE, rcx); |
| 3345 __ j(not_equal, &maybe_undefined2, Label::kNear); | 3347 __ j(not_equal, &maybe_undefined2, Label::kNear); |
| 3346 __ jmp(&unordered); | 3348 __ jmp(&unordered); |
| 3347 } | 3349 } |
| 3348 | 3350 |
| 3349 __ bind(&maybe_undefined2); | 3351 __ bind(&maybe_undefined2); |
| 3350 if (Token::IsOrderedRelationalCompareOp(op())) { | 3352 if (Token::IsOrderedRelationalCompareOp(op())) { |
| 3351 __ Cmp(rdx, isolate()->factory()->undefined_value()); | 3353 __ Cmp(rdx, isolate()->factory()->undefined_value()); |
| 3352 __ j(equal, &unordered); | 3354 __ j(equal, &unordered); |
| 3353 } | 3355 } |
| 3354 | 3356 |
| 3355 __ bind(&miss); | 3357 __ bind(&miss); |
| 3356 GenerateMiss(masm); | 3358 GenerateMiss(masm); |
| 3357 } | 3359 } |
| 3358 | 3360 |
| 3359 | 3361 |
| 3360 void CompareICStub::GenerateInternalizedStrings(MacroAssembler* masm) { | 3362 void CompareICStub::GenerateInternalizedStrings(MacroAssembler* masm) { |
| 3361 DCHECK(state() == CompareIC::INTERNALIZED_STRING); | 3363 DCHECK(state() == CompareICState::INTERNALIZED_STRING); |
| 3362 DCHECK(GetCondition() == equal); | 3364 DCHECK(GetCondition() == equal); |
| 3363 | 3365 |
| 3364 // Registers containing left and right operands respectively. | 3366 // Registers containing left and right operands respectively. |
| 3365 Register left = rdx; | 3367 Register left = rdx; |
| 3366 Register right = rax; | 3368 Register right = rax; |
| 3367 Register tmp1 = rcx; | 3369 Register tmp1 = rcx; |
| 3368 Register tmp2 = rbx; | 3370 Register tmp2 = rbx; |
| 3369 | 3371 |
| 3370 // Check that both operands are heap objects. | 3372 // Check that both operands are heap objects. |
| 3371 Label miss; | 3373 Label miss; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3394 __ Move(rax, Smi::FromInt(EQUAL)); | 3396 __ Move(rax, Smi::FromInt(EQUAL)); |
| 3395 __ bind(&done); | 3397 __ bind(&done); |
| 3396 __ ret(0); | 3398 __ ret(0); |
| 3397 | 3399 |
| 3398 __ bind(&miss); | 3400 __ bind(&miss); |
| 3399 GenerateMiss(masm); | 3401 GenerateMiss(masm); |
| 3400 } | 3402 } |
| 3401 | 3403 |
| 3402 | 3404 |
| 3403 void CompareICStub::GenerateUniqueNames(MacroAssembler* masm) { | 3405 void CompareICStub::GenerateUniqueNames(MacroAssembler* masm) { |
| 3404 DCHECK(state() == CompareIC::UNIQUE_NAME); | 3406 DCHECK(state() == CompareICState::UNIQUE_NAME); |
| 3405 DCHECK(GetCondition() == equal); | 3407 DCHECK(GetCondition() == equal); |
| 3406 | 3408 |
| 3407 // Registers containing left and right operands respectively. | 3409 // Registers containing left and right operands respectively. |
| 3408 Register left = rdx; | 3410 Register left = rdx; |
| 3409 Register right = rax; | 3411 Register right = rax; |
| 3410 Register tmp1 = rcx; | 3412 Register tmp1 = rcx; |
| 3411 Register tmp2 = rbx; | 3413 Register tmp2 = rbx; |
| 3412 | 3414 |
| 3413 // Check that both operands are heap objects. | 3415 // Check that both operands are heap objects. |
| 3414 Label miss; | 3416 Label miss; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3437 __ Move(rax, Smi::FromInt(EQUAL)); | 3439 __ Move(rax, Smi::FromInt(EQUAL)); |
| 3438 __ bind(&done); | 3440 __ bind(&done); |
| 3439 __ ret(0); | 3441 __ ret(0); |
| 3440 | 3442 |
| 3441 __ bind(&miss); | 3443 __ bind(&miss); |
| 3442 GenerateMiss(masm); | 3444 GenerateMiss(masm); |
| 3443 } | 3445 } |
| 3444 | 3446 |
| 3445 | 3447 |
| 3446 void CompareICStub::GenerateStrings(MacroAssembler* masm) { | 3448 void CompareICStub::GenerateStrings(MacroAssembler* masm) { |
| 3447 DCHECK(state() == CompareIC::STRING); | 3449 DCHECK(state() == CompareICState::STRING); |
| 3448 Label miss; | 3450 Label miss; |
| 3449 | 3451 |
| 3450 bool equality = Token::IsEqualityOp(op()); | 3452 bool equality = Token::IsEqualityOp(op()); |
| 3451 | 3453 |
| 3452 // Registers containing left and right operands respectively. | 3454 // Registers containing left and right operands respectively. |
| 3453 Register left = rdx; | 3455 Register left = rdx; |
| 3454 Register right = rax; | 3456 Register right = rax; |
| 3455 Register tmp1 = rcx; | 3457 Register tmp1 = rcx; |
| 3456 Register tmp2 = rbx; | 3458 Register tmp2 = rbx; |
| 3457 Register tmp3 = rdi; | 3459 Register tmp3 = rdi; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3524 } else { | 3526 } else { |
| 3525 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 3527 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
| 3526 } | 3528 } |
| 3527 | 3529 |
| 3528 __ bind(&miss); | 3530 __ bind(&miss); |
| 3529 GenerateMiss(masm); | 3531 GenerateMiss(masm); |
| 3530 } | 3532 } |
| 3531 | 3533 |
| 3532 | 3534 |
| 3533 void CompareICStub::GenerateObjects(MacroAssembler* masm) { | 3535 void CompareICStub::GenerateObjects(MacroAssembler* masm) { |
| 3534 DCHECK(state() == CompareIC::OBJECT); | 3536 DCHECK(state() == CompareICState::OBJECT); |
| 3535 Label miss; | 3537 Label miss; |
| 3536 Condition either_smi = masm->CheckEitherSmi(rdx, rax); | 3538 Condition either_smi = masm->CheckEitherSmi(rdx, rax); |
| 3537 __ j(either_smi, &miss, Label::kNear); | 3539 __ j(either_smi, &miss, Label::kNear); |
| 3538 | 3540 |
| 3539 __ CmpObjectType(rax, JS_OBJECT_TYPE, rcx); | 3541 __ CmpObjectType(rax, JS_OBJECT_TYPE, rcx); |
| 3540 __ j(not_equal, &miss, Label::kNear); | 3542 __ j(not_equal, &miss, Label::kNear); |
| 3541 __ CmpObjectType(rdx, JS_OBJECT_TYPE, rcx); | 3543 __ CmpObjectType(rdx, JS_OBJECT_TYPE, rcx); |
| 3542 __ j(not_equal, &miss, Label::kNear); | 3544 __ j(not_equal, &miss, Label::kNear); |
| 3543 | 3545 |
| 3544 DCHECK(GetCondition() == equal); | 3546 DCHECK(GetCondition() == equal); |
| (...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4634 return_value_operand, | 4636 return_value_operand, |
| 4635 NULL); | 4637 NULL); |
| 4636 } | 4638 } |
| 4637 | 4639 |
| 4638 | 4640 |
| 4639 #undef __ | 4641 #undef __ |
| 4640 | 4642 |
| 4641 } } // namespace v8::internal | 4643 } } // namespace v8::internal |
| 4642 | 4644 |
| 4643 #endif // V8_TARGET_ARCH_X64 | 4645 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |