| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 1524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1535 // Check (number_of_captures + 1) * 2 <= offsets vector size | 1535 // Check (number_of_captures + 1) * 2 <= offsets vector size |
| 1536 // Or number_of_captures * 2 <= offsets vector size - 2 | 1536 // Or number_of_captures * 2 <= offsets vector size - 2 |
| 1537 // Multiplying by 2 comes for free since edx is smi-tagged. | 1537 // Multiplying by 2 comes for free since edx is smi-tagged. |
| 1538 STATIC_ASSERT(kSmiTag == 0); | 1538 STATIC_ASSERT(kSmiTag == 0); |
| 1539 STATIC_ASSERT(kSmiTagSize + kSmiShiftSize == 1); | 1539 STATIC_ASSERT(kSmiTagSize + kSmiShiftSize == 1); |
| 1540 STATIC_ASSERT(Isolate::kJSRegexpStaticOffsetsVectorSize >= 2); | 1540 STATIC_ASSERT(Isolate::kJSRegexpStaticOffsetsVectorSize >= 2); |
| 1541 __ cmp(edx, Isolate::kJSRegexpStaticOffsetsVectorSize - 2); | 1541 __ cmp(edx, Isolate::kJSRegexpStaticOffsetsVectorSize - 2); |
| 1542 __ j(above, &runtime); | 1542 __ j(above, &runtime); |
| 1543 | 1543 |
| 1544 // Reset offset for possibly sliced string. | 1544 // Reset offset for possibly sliced string. |
| 1545 __ Set(edi, Immediate(0)); | 1545 __ Move(edi, Immediate(0)); |
| 1546 __ mov(eax, Operand(esp, kSubjectOffset)); | 1546 __ mov(eax, Operand(esp, kSubjectOffset)); |
| 1547 __ JumpIfSmi(eax, &runtime); | 1547 __ JumpIfSmi(eax, &runtime); |
| 1548 __ mov(edx, eax); // Make a copy of the original subject string. | 1548 __ mov(edx, eax); // Make a copy of the original subject string. |
| 1549 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); | 1549 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); |
| 1550 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); | 1550 __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); |
| 1551 | 1551 |
| 1552 // eax: subject string | 1552 // eax: subject string |
| 1553 // edx: subject string | 1553 // edx: subject string |
| 1554 // ebx: subject string instance type | 1554 // ebx: subject string instance type |
| 1555 // ecx: RegExp data (FixedArray) | 1555 // ecx: RegExp data (FixedArray) |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1629 // (6) One byte sequential. Load regexp code for one byte. | 1629 // (6) One byte sequential. Load regexp code for one byte. |
| 1630 __ bind(&seq_one_byte_string); | 1630 __ bind(&seq_one_byte_string); |
| 1631 // Load previous index and check range before edx is overwritten. We have | 1631 // Load previous index and check range before edx is overwritten. We have |
| 1632 // to use edx instead of eax here because it might have been only made to | 1632 // to use edx instead of eax here because it might have been only made to |
| 1633 // look like a sequential string when it actually is an external string. | 1633 // look like a sequential string when it actually is an external string. |
| 1634 __ mov(ebx, Operand(esp, kPreviousIndexOffset)); | 1634 __ mov(ebx, Operand(esp, kPreviousIndexOffset)); |
| 1635 __ JumpIfNotSmi(ebx, &runtime); | 1635 __ JumpIfNotSmi(ebx, &runtime); |
| 1636 __ cmp(ebx, FieldOperand(edx, String::kLengthOffset)); | 1636 __ cmp(ebx, FieldOperand(edx, String::kLengthOffset)); |
| 1637 __ j(above_equal, &runtime); | 1637 __ j(above_equal, &runtime); |
| 1638 __ mov(edx, FieldOperand(ecx, JSRegExp::kDataAsciiCodeOffset)); | 1638 __ mov(edx, FieldOperand(ecx, JSRegExp::kDataAsciiCodeOffset)); |
| 1639 __ Set(ecx, Immediate(1)); // Type is one byte. | 1639 __ Move(ecx, Immediate(1)); // Type is one byte. |
| 1640 | 1640 |
| 1641 // (E) Carry on. String handling is done. | 1641 // (E) Carry on. String handling is done. |
| 1642 __ bind(&check_code); | 1642 __ bind(&check_code); |
| 1643 // edx: irregexp code | 1643 // edx: irregexp code |
| 1644 // Check that the irregexp code has been generated for the actual string | 1644 // Check that the irregexp code has been generated for the actual string |
| 1645 // encoding. If it has, the field contains a code object otherwise it contains | 1645 // encoding. If it has, the field contains a code object otherwise it contains |
| 1646 // a smi (code flushing support). | 1646 // a smi (code flushing support). |
| 1647 __ JumpIfSmi(edx, &runtime); | 1647 __ JumpIfSmi(edx, &runtime); |
| 1648 | 1648 |
| 1649 // eax: subject string | 1649 // eax: subject string |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1897 // (9) Two byte sequential. Load regexp code for one byte. Go to (E). | 1897 // (9) Two byte sequential. Load regexp code for one byte. Go to (E). |
| 1898 __ bind(&seq_two_byte_string); | 1898 __ bind(&seq_two_byte_string); |
| 1899 // Load previous index and check range before edx is overwritten. We have | 1899 // Load previous index and check range before edx is overwritten. We have |
| 1900 // to use edx instead of eax here because it might have been only made to | 1900 // to use edx instead of eax here because it might have been only made to |
| 1901 // look like a sequential string when it actually is an external string. | 1901 // look like a sequential string when it actually is an external string. |
| 1902 __ mov(ebx, Operand(esp, kPreviousIndexOffset)); | 1902 __ mov(ebx, Operand(esp, kPreviousIndexOffset)); |
| 1903 __ JumpIfNotSmi(ebx, &runtime); | 1903 __ JumpIfNotSmi(ebx, &runtime); |
| 1904 __ cmp(ebx, FieldOperand(edx, String::kLengthOffset)); | 1904 __ cmp(ebx, FieldOperand(edx, String::kLengthOffset)); |
| 1905 __ j(above_equal, &runtime); | 1905 __ j(above_equal, &runtime); |
| 1906 __ mov(edx, FieldOperand(ecx, JSRegExp::kDataUC16CodeOffset)); | 1906 __ mov(edx, FieldOperand(ecx, JSRegExp::kDataUC16CodeOffset)); |
| 1907 __ Set(ecx, Immediate(0)); // Type is two byte. | 1907 __ Move(ecx, Immediate(0)); // Type is two byte. |
| 1908 __ jmp(&check_code); // Go to (E). | 1908 __ jmp(&check_code); // Go to (E). |
| 1909 | 1909 |
| 1910 // (10) Not a string or a short external string? If yes, bail out to runtime. | 1910 // (10) Not a string or a short external string? If yes, bail out to runtime. |
| 1911 __ bind(¬_long_external); | 1911 __ bind(¬_long_external); |
| 1912 // Catch non-string subject or short external string. | 1912 // Catch non-string subject or short external string. |
| 1913 STATIC_ASSERT(kNotStringTag != 0 && kShortExternalStringTag !=0); | 1913 STATIC_ASSERT(kNotStringTag != 0 && kShortExternalStringTag !=0); |
| 1914 __ test(ebx, Immediate(kIsNotStringMask | kShortExternalStringTag)); | 1914 __ test(ebx, Immediate(kIsNotStringMask | kShortExternalStringTag)); |
| 1915 __ j(not_zero, &runtime); | 1915 __ j(not_zero, &runtime); |
| 1916 | 1916 |
| 1917 // (11) Sliced string. Replace subject with parent. Go to (5a). | 1917 // (11) Sliced string. Replace subject with parent. Go to (5a). |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1994 Label not_identical; | 1994 Label not_identical; |
| 1995 __ cmp(eax, edx); | 1995 __ cmp(eax, edx); |
| 1996 __ j(not_equal, ¬_identical); | 1996 __ j(not_equal, ¬_identical); |
| 1997 | 1997 |
| 1998 if (cc != equal) { | 1998 if (cc != equal) { |
| 1999 // Check for undefined. undefined OP undefined is false even though | 1999 // Check for undefined. undefined OP undefined is false even though |
| 2000 // undefined == undefined. | 2000 // undefined == undefined. |
| 2001 Label check_for_nan; | 2001 Label check_for_nan; |
| 2002 __ cmp(edx, masm->isolate()->factory()->undefined_value()); | 2002 __ cmp(edx, masm->isolate()->factory()->undefined_value()); |
| 2003 __ j(not_equal, &check_for_nan, Label::kNear); | 2003 __ j(not_equal, &check_for_nan, Label::kNear); |
| 2004 __ Set(eax, Immediate(Smi::FromInt(NegativeComparisonResult(cc)))); | 2004 __ Move(eax, Immediate(Smi::FromInt(NegativeComparisonResult(cc)))); |
| 2005 __ ret(0); | 2005 __ ret(0); |
| 2006 __ bind(&check_for_nan); | 2006 __ bind(&check_for_nan); |
| 2007 } | 2007 } |
| 2008 | 2008 |
| 2009 // Test for NaN. Compare heap numbers in a general way, | 2009 // Test for NaN. Compare heap numbers in a general way, |
| 2010 // to hanlde NaNs correctly. | 2010 // to hanlde NaNs correctly. |
| 2011 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), | 2011 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), |
| 2012 Immediate(masm->isolate()->factory()->heap_number_map())); | 2012 Immediate(masm->isolate()->factory()->heap_number_map())); |
| 2013 __ j(equal, &generic_heap_number_comparison, Label::kNear); | 2013 __ j(equal, &generic_heap_number_comparison, Label::kNear); |
| 2014 if (cc != equal) { | 2014 if (cc != equal) { |
| 2015 // Call runtime on identical JSObjects. Otherwise return equal. | 2015 // Call runtime on identical JSObjects. Otherwise return equal. |
| 2016 __ CmpObjectType(eax, FIRST_SPEC_OBJECT_TYPE, ecx); | 2016 __ CmpObjectType(eax, FIRST_SPEC_OBJECT_TYPE, ecx); |
| 2017 __ j(above_equal, ¬_identical); | 2017 __ j(above_equal, ¬_identical); |
| 2018 } | 2018 } |
| 2019 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); | 2019 __ Move(eax, Immediate(Smi::FromInt(EQUAL))); |
| 2020 __ ret(0); | 2020 __ ret(0); |
| 2021 | 2021 |
| 2022 | 2022 |
| 2023 __ bind(¬_identical); | 2023 __ bind(¬_identical); |
| 2024 } | 2024 } |
| 2025 | 2025 |
| 2026 // Strict equality can quickly decide whether objects are equal. | 2026 // Strict equality can quickly decide whether objects are equal. |
| 2027 // Non-strict object equality is slower, so it is handled later in the stub. | 2027 // Non-strict object equality is slower, so it is handled later in the stub. |
| 2028 if (cc == equal && strict()) { | 2028 if (cc == equal && strict()) { |
| 2029 Label slow; // Fallthrough label. | 2029 Label slow; // Fallthrough label. |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2123 __ FCmp(); | 2123 __ FCmp(); |
| 2124 | 2124 |
| 2125 // Don't base result on EFLAGS when a NaN is involved. | 2125 // Don't base result on EFLAGS when a NaN is involved. |
| 2126 __ j(parity_even, &unordered, Label::kNear); | 2126 __ j(parity_even, &unordered, Label::kNear); |
| 2127 | 2127 |
| 2128 Label below_label, above_label; | 2128 Label below_label, above_label; |
| 2129 // Return a result of -1, 0, or 1, based on EFLAGS. | 2129 // Return a result of -1, 0, or 1, based on EFLAGS. |
| 2130 __ j(below, &below_label, Label::kNear); | 2130 __ j(below, &below_label, Label::kNear); |
| 2131 __ j(above, &above_label, Label::kNear); | 2131 __ j(above, &above_label, Label::kNear); |
| 2132 | 2132 |
| 2133 __ Set(eax, Immediate(0)); | 2133 __ Move(eax, Immediate(0)); |
| 2134 __ ret(0); | 2134 __ ret(0); |
| 2135 | 2135 |
| 2136 __ bind(&below_label); | 2136 __ bind(&below_label); |
| 2137 __ mov(eax, Immediate(Smi::FromInt(-1))); | 2137 __ mov(eax, Immediate(Smi::FromInt(-1))); |
| 2138 __ ret(0); | 2138 __ ret(0); |
| 2139 | 2139 |
| 2140 __ bind(&above_label); | 2140 __ bind(&above_label); |
| 2141 __ mov(eax, Immediate(Smi::FromInt(1))); | 2141 __ mov(eax, Immediate(Smi::FromInt(1))); |
| 2142 __ ret(0); | 2142 __ ret(0); |
| 2143 } | 2143 } |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2215 // they are equal if and only if both are undetectable. | 2215 // they are equal if and only if both are undetectable. |
| 2216 // The and of the undetectable flags is 1 if and only if they are equal. | 2216 // The and of the undetectable flags is 1 if and only if they are equal. |
| 2217 __ test_b(FieldOperand(ecx, Map::kBitFieldOffset), | 2217 __ test_b(FieldOperand(ecx, Map::kBitFieldOffset), |
| 2218 1 << Map::kIsUndetectable); | 2218 1 << Map::kIsUndetectable); |
| 2219 __ j(zero, &return_unequal, Label::kNear); | 2219 __ j(zero, &return_unequal, Label::kNear); |
| 2220 __ test_b(FieldOperand(ebx, Map::kBitFieldOffset), | 2220 __ test_b(FieldOperand(ebx, Map::kBitFieldOffset), |
| 2221 1 << Map::kIsUndetectable); | 2221 1 << Map::kIsUndetectable); |
| 2222 __ j(zero, &return_unequal, Label::kNear); | 2222 __ j(zero, &return_unequal, Label::kNear); |
| 2223 // The objects are both undetectable, so they both compare as the value | 2223 // The objects are both undetectable, so they both compare as the value |
| 2224 // undefined, and are equal. | 2224 // undefined, and are equal. |
| 2225 __ Set(eax, Immediate(EQUAL)); | 2225 __ Move(eax, Immediate(EQUAL)); |
| 2226 __ bind(&return_unequal); | 2226 __ bind(&return_unequal); |
| 2227 // Return non-equal by returning the non-zero object pointer in eax, | 2227 // Return non-equal by returning the non-zero object pointer in eax, |
| 2228 // or return equal if we fell through to here. | 2228 // or return equal if we fell through to here. |
| 2229 __ ret(0); // rax, rdx were pushed | 2229 __ ret(0); // rax, rdx were pushed |
| 2230 __ bind(¬_both_objects); | 2230 __ bind(¬_both_objects); |
| 2231 } | 2231 } |
| 2232 | 2232 |
| 2233 // Push arguments below the return address. | 2233 // Push arguments below the return address. |
| 2234 __ pop(ecx); | 2234 __ pop(ecx); |
| 2235 __ push(edx); | 2235 __ push(edx); |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2431 __ mov(FieldOperand(ebx, edx, times_half_pointer_size, | 2431 __ mov(FieldOperand(ebx, edx, times_half_pointer_size, |
| 2432 FixedArray::kHeaderSize), | 2432 FixedArray::kHeaderSize), |
| 2433 Immediate(TypeFeedbackInfo::MegamorphicSentinel(isolate))); | 2433 Immediate(TypeFeedbackInfo::MegamorphicSentinel(isolate))); |
| 2434 } | 2434 } |
| 2435 // Check for function proxy. | 2435 // Check for function proxy. |
| 2436 __ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); | 2436 __ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); |
| 2437 __ j(not_equal, &non_function); | 2437 __ j(not_equal, &non_function); |
| 2438 __ pop(ecx); | 2438 __ pop(ecx); |
| 2439 __ push(edi); // put proxy as additional argument under return address | 2439 __ push(edi); // put proxy as additional argument under return address |
| 2440 __ push(ecx); | 2440 __ push(ecx); |
| 2441 __ Set(eax, Immediate(argc_ + 1)); | 2441 __ Move(eax, Immediate(argc_ + 1)); |
| 2442 __ Set(ebx, Immediate(0)); | 2442 __ Move(ebx, Immediate(0)); |
| 2443 __ GetBuiltinEntry(edx, Builtins::CALL_FUNCTION_PROXY); | 2443 __ GetBuiltinEntry(edx, Builtins::CALL_FUNCTION_PROXY); |
| 2444 { | 2444 { |
| 2445 Handle<Code> adaptor = isolate->builtins()->ArgumentsAdaptorTrampoline(); | 2445 Handle<Code> adaptor = isolate->builtins()->ArgumentsAdaptorTrampoline(); |
| 2446 __ jmp(adaptor, RelocInfo::CODE_TARGET); | 2446 __ jmp(adaptor, RelocInfo::CODE_TARGET); |
| 2447 } | 2447 } |
| 2448 | 2448 |
| 2449 // CALL_NON_FUNCTION expects the non-function callee as receiver (instead | 2449 // CALL_NON_FUNCTION expects the non-function callee as receiver (instead |
| 2450 // of the original receiver from the call site). | 2450 // of the original receiver from the call site). |
| 2451 __ bind(&non_function); | 2451 __ bind(&non_function); |
| 2452 __ mov(Operand(esp, (argc_ + 1) * kPointerSize), edi); | 2452 __ mov(Operand(esp, (argc_ + 1) * kPointerSize), edi); |
| 2453 __ Set(eax, Immediate(argc_)); | 2453 __ Move(eax, Immediate(argc_)); |
| 2454 __ Set(ebx, Immediate(0)); | 2454 __ Move(ebx, Immediate(0)); |
| 2455 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION); | 2455 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION); |
| 2456 Handle<Code> adaptor = isolate->builtins()->ArgumentsAdaptorTrampoline(); | 2456 Handle<Code> adaptor = isolate->builtins()->ArgumentsAdaptorTrampoline(); |
| 2457 __ jmp(adaptor, RelocInfo::CODE_TARGET); | 2457 __ jmp(adaptor, RelocInfo::CODE_TARGET); |
| 2458 } | 2458 } |
| 2459 | 2459 |
| 2460 if (CallAsMethod()) { | 2460 if (CallAsMethod()) { |
| 2461 __ bind(&wrap); | 2461 __ bind(&wrap); |
| 2462 // Wrap the receiver and patch it back onto the stack. | 2462 // Wrap the receiver and patch it back onto the stack. |
| 2463 { FrameScope frame_scope(masm, StackFrame::INTERNAL); | 2463 { FrameScope frame_scope(masm, StackFrame::INTERNAL); |
| 2464 __ push(edi); | 2464 __ push(edi); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2526 __ bind(&slow); | 2526 __ bind(&slow); |
| 2527 __ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); | 2527 __ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); |
| 2528 __ j(not_equal, &non_function_call); | 2528 __ j(not_equal, &non_function_call); |
| 2529 __ GetBuiltinEntry(edx, Builtins::CALL_FUNCTION_PROXY_AS_CONSTRUCTOR); | 2529 __ GetBuiltinEntry(edx, Builtins::CALL_FUNCTION_PROXY_AS_CONSTRUCTOR); |
| 2530 __ jmp(&do_call); | 2530 __ jmp(&do_call); |
| 2531 | 2531 |
| 2532 __ bind(&non_function_call); | 2532 __ bind(&non_function_call); |
| 2533 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION_AS_CONSTRUCTOR); | 2533 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION_AS_CONSTRUCTOR); |
| 2534 __ bind(&do_call); | 2534 __ bind(&do_call); |
| 2535 // Set expected number of arguments to zero (not changing eax). | 2535 // Set expected number of arguments to zero (not changing eax). |
| 2536 __ Set(ebx, Immediate(0)); | 2536 __ Move(ebx, Immediate(0)); |
| 2537 Handle<Code> arguments_adaptor = | 2537 Handle<Code> arguments_adaptor = |
| 2538 masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(); | 2538 masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(); |
| 2539 __ jmp(arguments_adaptor, RelocInfo::CODE_TARGET); | 2539 __ jmp(arguments_adaptor, RelocInfo::CODE_TARGET); |
| 2540 } | 2540 } |
| 2541 | 2541 |
| 2542 | 2542 |
| 2543 bool CEntryStub::NeedsImmovableCode() { | 2543 bool CEntryStub::NeedsImmovableCode() { |
| 2544 return false; | 2544 return false; |
| 2545 } | 2545 } |
| 2546 | 2546 |
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3017 // Get return address and delta to inlined map check. | 3017 // Get return address and delta to inlined map check. |
| 3018 __ mov(eax, factory->true_value()); | 3018 __ mov(eax, factory->true_value()); |
| 3019 __ mov(scratch, Operand(esp, 0 * kPointerSize)); | 3019 __ mov(scratch, Operand(esp, 0 * kPointerSize)); |
| 3020 __ sub(scratch, Operand(esp, 1 * kPointerSize)); | 3020 __ sub(scratch, Operand(esp, 1 * kPointerSize)); |
| 3021 if (FLAG_debug_code) { | 3021 if (FLAG_debug_code) { |
| 3022 __ cmpb(Operand(scratch, kDeltaToMov), kMovEaxImmediateByte); | 3022 __ cmpb(Operand(scratch, kDeltaToMov), kMovEaxImmediateByte); |
| 3023 __ Assert(equal, kInstanceofStubUnexpectedCallSiteCacheMov); | 3023 __ Assert(equal, kInstanceofStubUnexpectedCallSiteCacheMov); |
| 3024 } | 3024 } |
| 3025 __ mov(Operand(scratch, kDeltaToMovImmediate), eax); | 3025 __ mov(Operand(scratch, kDeltaToMovImmediate), eax); |
| 3026 if (!ReturnTrueFalseObject()) { | 3026 if (!ReturnTrueFalseObject()) { |
| 3027 __ Set(eax, Immediate(0)); | 3027 __ Move(eax, Immediate(0)); |
| 3028 } | 3028 } |
| 3029 } | 3029 } |
| 3030 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); | 3030 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); |
| 3031 | 3031 |
| 3032 __ bind(&is_not_instance); | 3032 __ bind(&is_not_instance); |
| 3033 if (!HasCallSiteInlineCheck()) { | 3033 if (!HasCallSiteInlineCheck()) { |
| 3034 __ mov(eax, Immediate(Smi::FromInt(1))); | 3034 __ mov(eax, Immediate(Smi::FromInt(1))); |
| 3035 __ StoreRoot(eax, scratch, Heap::kInstanceofCacheAnswerRootIndex); | 3035 __ StoreRoot(eax, scratch, Heap::kInstanceofCacheAnswerRootIndex); |
| 3036 } else { | 3036 } else { |
| 3037 // Get return address and delta to inlined map check. | 3037 // Get return address and delta to inlined map check. |
| 3038 __ mov(eax, factory->false_value()); | 3038 __ mov(eax, factory->false_value()); |
| 3039 __ mov(scratch, Operand(esp, 0 * kPointerSize)); | 3039 __ mov(scratch, Operand(esp, 0 * kPointerSize)); |
| 3040 __ sub(scratch, Operand(esp, 1 * kPointerSize)); | 3040 __ sub(scratch, Operand(esp, 1 * kPointerSize)); |
| 3041 if (FLAG_debug_code) { | 3041 if (FLAG_debug_code) { |
| 3042 __ cmpb(Operand(scratch, kDeltaToMov), kMovEaxImmediateByte); | 3042 __ cmpb(Operand(scratch, kDeltaToMov), kMovEaxImmediateByte); |
| 3043 __ Assert(equal, kInstanceofStubUnexpectedCallSiteCacheMov); | 3043 __ Assert(equal, kInstanceofStubUnexpectedCallSiteCacheMov); |
| 3044 } | 3044 } |
| 3045 __ mov(Operand(scratch, kDeltaToMovImmediate), eax); | 3045 __ mov(Operand(scratch, kDeltaToMovImmediate), eax); |
| 3046 if (!ReturnTrueFalseObject()) { | 3046 if (!ReturnTrueFalseObject()) { |
| 3047 __ Set(eax, Immediate(Smi::FromInt(1))); | 3047 __ Move(eax, Immediate(Smi::FromInt(1))); |
| 3048 } | 3048 } |
| 3049 } | 3049 } |
| 3050 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); | 3050 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); |
| 3051 | 3051 |
| 3052 Label object_not_null, object_not_null_or_smi; | 3052 Label object_not_null, object_not_null_or_smi; |
| 3053 __ bind(¬_js_object); | 3053 __ bind(¬_js_object); |
| 3054 // Before null, smi and string value checks, check that the rhs is a function | 3054 // Before null, smi and string value checks, check that the rhs is a function |
| 3055 // as for a non-function rhs an exception needs to be thrown. | 3055 // as for a non-function rhs an exception needs to be thrown. |
| 3056 __ JumpIfSmi(function, &slow, Label::kNear); | 3056 __ JumpIfSmi(function, &slow, Label::kNear); |
| 3057 __ CmpObjectType(function, JS_FUNCTION_TYPE, scratch); | 3057 __ CmpObjectType(function, JS_FUNCTION_TYPE, scratch); |
| 3058 __ j(not_equal, &slow, Label::kNear); | 3058 __ j(not_equal, &slow, Label::kNear); |
| 3059 | 3059 |
| 3060 // Null is not instance of anything. | 3060 // Null is not instance of anything. |
| 3061 __ cmp(object, factory->null_value()); | 3061 __ cmp(object, factory->null_value()); |
| 3062 __ j(not_equal, &object_not_null, Label::kNear); | 3062 __ j(not_equal, &object_not_null, Label::kNear); |
| 3063 __ Set(eax, Immediate(Smi::FromInt(1))); | 3063 __ Move(eax, Immediate(Smi::FromInt(1))); |
| 3064 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); | 3064 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); |
| 3065 | 3065 |
| 3066 __ bind(&object_not_null); | 3066 __ bind(&object_not_null); |
| 3067 // Smi values is not instance of anything. | 3067 // Smi values is not instance of anything. |
| 3068 __ JumpIfNotSmi(object, &object_not_null_or_smi, Label::kNear); | 3068 __ JumpIfNotSmi(object, &object_not_null_or_smi, Label::kNear); |
| 3069 __ Set(eax, Immediate(Smi::FromInt(1))); | 3069 __ Move(eax, Immediate(Smi::FromInt(1))); |
| 3070 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); | 3070 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); |
| 3071 | 3071 |
| 3072 __ bind(&object_not_null_or_smi); | 3072 __ bind(&object_not_null_or_smi); |
| 3073 // String values is not instance of anything. | 3073 // String values is not instance of anything. |
| 3074 Condition is_string = masm->IsObjectStringType(object, scratch, scratch); | 3074 Condition is_string = masm->IsObjectStringType(object, scratch, scratch); |
| 3075 __ j(NegateCondition(is_string), &slow, Label::kNear); | 3075 __ j(NegateCondition(is_string), &slow, Label::kNear); |
| 3076 __ Set(eax, Immediate(Smi::FromInt(1))); | 3076 __ Move(eax, Immediate(Smi::FromInt(1))); |
| 3077 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); | 3077 __ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize); |
| 3078 | 3078 |
| 3079 // Slow-case: Go through the JavaScript implementation. | 3079 // Slow-case: Go through the JavaScript implementation. |
| 3080 __ bind(&slow); | 3080 __ bind(&slow); |
| 3081 if (!ReturnTrueFalseObject()) { | 3081 if (!ReturnTrueFalseObject()) { |
| 3082 // Tail call the builtin which returns 0 or 1. | 3082 // Tail call the builtin which returns 0 or 1. |
| 3083 if (HasArgsInRegisters()) { | 3083 if (HasArgsInRegisters()) { |
| 3084 // Push arguments below return address. | 3084 // Push arguments below return address. |
| 3085 __ pop(scratch); | 3085 __ pop(scratch); |
| 3086 __ push(object); | 3086 __ push(object); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3214 // Fast case of Heap::LookupSingleCharacterStringFromCode. | 3214 // Fast case of Heap::LookupSingleCharacterStringFromCode. |
| 3215 STATIC_ASSERT(kSmiTag == 0); | 3215 STATIC_ASSERT(kSmiTag == 0); |
| 3216 STATIC_ASSERT(kSmiShiftSize == 0); | 3216 STATIC_ASSERT(kSmiShiftSize == 0); |
| 3217 ASSERT(IsPowerOf2(String::kMaxOneByteCharCode + 1)); | 3217 ASSERT(IsPowerOf2(String::kMaxOneByteCharCode + 1)); |
| 3218 __ test(code_, | 3218 __ test(code_, |
| 3219 Immediate(kSmiTagMask | | 3219 Immediate(kSmiTagMask | |
| 3220 ((~String::kMaxOneByteCharCode) << kSmiTagSize))); | 3220 ((~String::kMaxOneByteCharCode) << kSmiTagSize))); |
| 3221 __ j(not_zero, &slow_case_); | 3221 __ j(not_zero, &slow_case_); |
| 3222 | 3222 |
| 3223 Factory* factory = masm->isolate()->factory(); | 3223 Factory* factory = masm->isolate()->factory(); |
| 3224 __ Set(result_, Immediate(factory->single_character_string_cache())); | 3224 __ Move(result_, Immediate(factory->single_character_string_cache())); |
| 3225 STATIC_ASSERT(kSmiTag == 0); | 3225 STATIC_ASSERT(kSmiTag == 0); |
| 3226 STATIC_ASSERT(kSmiTagSize == 1); | 3226 STATIC_ASSERT(kSmiTagSize == 1); |
| 3227 STATIC_ASSERT(kSmiShiftSize == 0); | 3227 STATIC_ASSERT(kSmiShiftSize == 0); |
| 3228 // At this point code register contains smi tagged ASCII char code. | 3228 // At this point code register contains smi tagged ASCII char code. |
| 3229 __ mov(result_, FieldOperand(result_, | 3229 __ mov(result_, FieldOperand(result_, |
| 3230 code_, times_half_pointer_size, | 3230 code_, times_half_pointer_size, |
| 3231 FixedArray::kHeaderSize)); | 3231 FixedArray::kHeaderSize)); |
| 3232 __ cmp(result_, factory->undefined_value()); | 3232 __ cmp(result_, factory->undefined_value()); |
| 3233 __ j(equal, &slow_case_); | 3233 __ j(equal, &slow_case_); |
| 3234 __ bind(&exit_); | 3234 __ bind(&exit_); |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3613 Register scratch1, | 3613 Register scratch1, |
| 3614 Register scratch2) { | 3614 Register scratch2) { |
| 3615 Register length = scratch1; | 3615 Register length = scratch1; |
| 3616 | 3616 |
| 3617 // Compare lengths. | 3617 // Compare lengths. |
| 3618 Label strings_not_equal, check_zero_length; | 3618 Label strings_not_equal, check_zero_length; |
| 3619 __ mov(length, FieldOperand(left, String::kLengthOffset)); | 3619 __ mov(length, FieldOperand(left, String::kLengthOffset)); |
| 3620 __ cmp(length, FieldOperand(right, String::kLengthOffset)); | 3620 __ cmp(length, FieldOperand(right, String::kLengthOffset)); |
| 3621 __ j(equal, &check_zero_length, Label::kNear); | 3621 __ j(equal, &check_zero_length, Label::kNear); |
| 3622 __ bind(&strings_not_equal); | 3622 __ bind(&strings_not_equal); |
| 3623 __ Set(eax, Immediate(Smi::FromInt(NOT_EQUAL))); | 3623 __ Move(eax, Immediate(Smi::FromInt(NOT_EQUAL))); |
| 3624 __ ret(0); | 3624 __ ret(0); |
| 3625 | 3625 |
| 3626 // Check if the length is zero. | 3626 // Check if the length is zero. |
| 3627 Label compare_chars; | 3627 Label compare_chars; |
| 3628 __ bind(&check_zero_length); | 3628 __ bind(&check_zero_length); |
| 3629 STATIC_ASSERT(kSmiTag == 0); | 3629 STATIC_ASSERT(kSmiTag == 0); |
| 3630 __ test(length, length); | 3630 __ test(length, length); |
| 3631 __ j(not_zero, &compare_chars, Label::kNear); | 3631 __ j(not_zero, &compare_chars, Label::kNear); |
| 3632 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); | 3632 __ Move(eax, Immediate(Smi::FromInt(EQUAL))); |
| 3633 __ ret(0); | 3633 __ ret(0); |
| 3634 | 3634 |
| 3635 // Compare characters. | 3635 // Compare characters. |
| 3636 __ bind(&compare_chars); | 3636 __ bind(&compare_chars); |
| 3637 GenerateAsciiCharsCompareLoop(masm, left, right, length, scratch2, | 3637 GenerateAsciiCharsCompareLoop(masm, left, right, length, scratch2, |
| 3638 &strings_not_equal, Label::kNear); | 3638 &strings_not_equal, Label::kNear); |
| 3639 | 3639 |
| 3640 // Characters are equal. | 3640 // Characters are equal. |
| 3641 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); | 3641 __ Move(eax, Immediate(Smi::FromInt(EQUAL))); |
| 3642 __ ret(0); | 3642 __ ret(0); |
| 3643 } | 3643 } |
| 3644 | 3644 |
| 3645 | 3645 |
| 3646 void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm, | 3646 void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm, |
| 3647 Register left, | 3647 Register left, |
| 3648 Register right, | 3648 Register right, |
| 3649 Register scratch1, | 3649 Register scratch1, |
| 3650 Register scratch2, | 3650 Register scratch2, |
| 3651 Register scratch3) { | 3651 Register scratch3) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 3679 | 3679 |
| 3680 // Compare lengths - strings up to min-length are equal. | 3680 // Compare lengths - strings up to min-length are equal. |
| 3681 __ bind(&compare_lengths); | 3681 __ bind(&compare_lengths); |
| 3682 __ test(length_delta, length_delta); | 3682 __ test(length_delta, length_delta); |
| 3683 Label length_not_equal; | 3683 Label length_not_equal; |
| 3684 __ j(not_zero, &length_not_equal, Label::kNear); | 3684 __ j(not_zero, &length_not_equal, Label::kNear); |
| 3685 | 3685 |
| 3686 // Result is EQUAL. | 3686 // Result is EQUAL. |
| 3687 STATIC_ASSERT(EQUAL == 0); | 3687 STATIC_ASSERT(EQUAL == 0); |
| 3688 STATIC_ASSERT(kSmiTag == 0); | 3688 STATIC_ASSERT(kSmiTag == 0); |
| 3689 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); | 3689 __ Move(eax, Immediate(Smi::FromInt(EQUAL))); |
| 3690 __ ret(0); | 3690 __ ret(0); |
| 3691 | 3691 |
| 3692 Label result_greater; | 3692 Label result_greater; |
| 3693 Label result_less; | 3693 Label result_less; |
| 3694 __ bind(&length_not_equal); | 3694 __ bind(&length_not_equal); |
| 3695 __ j(greater, &result_greater, Label::kNear); | 3695 __ j(greater, &result_greater, Label::kNear); |
| 3696 __ jmp(&result_less, Label::kNear); | 3696 __ jmp(&result_less, Label::kNear); |
| 3697 __ bind(&result_not_equal); | 3697 __ bind(&result_not_equal); |
| 3698 __ j(above, &result_greater, Label::kNear); | 3698 __ j(above, &result_greater, Label::kNear); |
| 3699 __ bind(&result_less); | 3699 __ bind(&result_less); |
| 3700 | 3700 |
| 3701 // Result is LESS. | 3701 // Result is LESS. |
| 3702 __ Set(eax, Immediate(Smi::FromInt(LESS))); | 3702 __ Move(eax, Immediate(Smi::FromInt(LESS))); |
| 3703 __ ret(0); | 3703 __ ret(0); |
| 3704 | 3704 |
| 3705 // Result is GREATER. | 3705 // Result is GREATER. |
| 3706 __ bind(&result_greater); | 3706 __ bind(&result_greater); |
| 3707 __ Set(eax, Immediate(Smi::FromInt(GREATER))); | 3707 __ Move(eax, Immediate(Smi::FromInt(GREATER))); |
| 3708 __ ret(0); | 3708 __ ret(0); |
| 3709 } | 3709 } |
| 3710 | 3710 |
| 3711 | 3711 |
| 3712 void StringCompareStub::GenerateAsciiCharsCompareLoop( | 3712 void StringCompareStub::GenerateAsciiCharsCompareLoop( |
| 3713 MacroAssembler* masm, | 3713 MacroAssembler* masm, |
| 3714 Register left, | 3714 Register left, |
| 3715 Register right, | 3715 Register right, |
| 3716 Register length, | 3716 Register length, |
| 3717 Register scratch, | 3717 Register scratch, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 3748 // esp[8]: left string | 3748 // esp[8]: left string |
| 3749 | 3749 |
| 3750 __ mov(edx, Operand(esp, 2 * kPointerSize)); // left | 3750 __ mov(edx, Operand(esp, 2 * kPointerSize)); // left |
| 3751 __ mov(eax, Operand(esp, 1 * kPointerSize)); // right | 3751 __ mov(eax, Operand(esp, 1 * kPointerSize)); // right |
| 3752 | 3752 |
| 3753 Label not_same; | 3753 Label not_same; |
| 3754 __ cmp(edx, eax); | 3754 __ cmp(edx, eax); |
| 3755 __ j(not_equal, ¬_same, Label::kNear); | 3755 __ j(not_equal, ¬_same, Label::kNear); |
| 3756 STATIC_ASSERT(EQUAL == 0); | 3756 STATIC_ASSERT(EQUAL == 0); |
| 3757 STATIC_ASSERT(kSmiTag == 0); | 3757 STATIC_ASSERT(kSmiTag == 0); |
| 3758 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); | 3758 __ Move(eax, Immediate(Smi::FromInt(EQUAL))); |
| 3759 __ IncrementCounter(masm->isolate()->counters()->string_compare_native(), 1); | 3759 __ IncrementCounter(masm->isolate()->counters()->string_compare_native(), 1); |
| 3760 __ ret(2 * kPointerSize); | 3760 __ ret(2 * kPointerSize); |
| 3761 | 3761 |
| 3762 __ bind(¬_same); | 3762 __ bind(¬_same); |
| 3763 | 3763 |
| 3764 // Check that both objects are sequential ASCII strings. | 3764 // Check that both objects are sequential ASCII strings. |
| 3765 __ JumpIfNotBothSequentialAsciiStrings(edx, eax, ecx, ebx, &runtime); | 3765 __ JumpIfNotBothSequentialAsciiStrings(edx, eax, ecx, ebx, &runtime); |
| 3766 | 3766 |
| 3767 // Compare flat ASCII strings. | 3767 // Compare flat ASCII strings. |
| 3768 // Drop arguments from the stack. | 3768 // Drop arguments from the stack. |
| (...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4154 | 4154 |
| 4155 // Internalized strings are compared by identity. | 4155 // Internalized strings are compared by identity. |
| 4156 Label done; | 4156 Label done; |
| 4157 __ cmp(left, right); | 4157 __ cmp(left, right); |
| 4158 // Make sure eax is non-zero. At this point input operands are | 4158 // Make sure eax is non-zero. At this point input operands are |
| 4159 // guaranteed to be non-zero. | 4159 // guaranteed to be non-zero. |
| 4160 ASSERT(right.is(eax)); | 4160 ASSERT(right.is(eax)); |
| 4161 __ j(not_equal, &done, Label::kNear); | 4161 __ j(not_equal, &done, Label::kNear); |
| 4162 STATIC_ASSERT(EQUAL == 0); | 4162 STATIC_ASSERT(EQUAL == 0); |
| 4163 STATIC_ASSERT(kSmiTag == 0); | 4163 STATIC_ASSERT(kSmiTag == 0); |
| 4164 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); | 4164 __ Move(eax, Immediate(Smi::FromInt(EQUAL))); |
| 4165 __ bind(&done); | 4165 __ bind(&done); |
| 4166 __ ret(0); | 4166 __ ret(0); |
| 4167 | 4167 |
| 4168 __ bind(&miss); | 4168 __ bind(&miss); |
| 4169 GenerateMiss(masm); | 4169 GenerateMiss(masm); |
| 4170 } | 4170 } |
| 4171 | 4171 |
| 4172 | 4172 |
| 4173 void ICCompareStub::GenerateUniqueNames(MacroAssembler* masm) { | 4173 void ICCompareStub::GenerateUniqueNames(MacroAssembler* masm) { |
| 4174 ASSERT(state_ == CompareIC::UNIQUE_NAME); | 4174 ASSERT(state_ == CompareIC::UNIQUE_NAME); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 4199 | 4199 |
| 4200 // Unique names are compared by identity. | 4200 // Unique names are compared by identity. |
| 4201 Label done; | 4201 Label done; |
| 4202 __ cmp(left, right); | 4202 __ cmp(left, right); |
| 4203 // Make sure eax is non-zero. At this point input operands are | 4203 // Make sure eax is non-zero. At this point input operands are |
| 4204 // guaranteed to be non-zero. | 4204 // guaranteed to be non-zero. |
| 4205 ASSERT(right.is(eax)); | 4205 ASSERT(right.is(eax)); |
| 4206 __ j(not_equal, &done, Label::kNear); | 4206 __ j(not_equal, &done, Label::kNear); |
| 4207 STATIC_ASSERT(EQUAL == 0); | 4207 STATIC_ASSERT(EQUAL == 0); |
| 4208 STATIC_ASSERT(kSmiTag == 0); | 4208 STATIC_ASSERT(kSmiTag == 0); |
| 4209 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); | 4209 __ Move(eax, Immediate(Smi::FromInt(EQUAL))); |
| 4210 __ bind(&done); | 4210 __ bind(&done); |
| 4211 __ ret(0); | 4211 __ ret(0); |
| 4212 | 4212 |
| 4213 __ bind(&miss); | 4213 __ bind(&miss); |
| 4214 GenerateMiss(masm); | 4214 GenerateMiss(masm); |
| 4215 } | 4215 } |
| 4216 | 4216 |
| 4217 | 4217 |
| 4218 void ICCompareStub::GenerateStrings(MacroAssembler* masm) { | 4218 void ICCompareStub::GenerateStrings(MacroAssembler* masm) { |
| 4219 ASSERT(state_ == CompareIC::STRING); | 4219 ASSERT(state_ == CompareIC::STRING); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 4245 __ or_(tmp3, tmp2); | 4245 __ or_(tmp3, tmp2); |
| 4246 __ test(tmp3, Immediate(kIsNotStringMask)); | 4246 __ test(tmp3, Immediate(kIsNotStringMask)); |
| 4247 __ j(not_zero, &miss); | 4247 __ j(not_zero, &miss); |
| 4248 | 4248 |
| 4249 // Fast check for identical strings. | 4249 // Fast check for identical strings. |
| 4250 Label not_same; | 4250 Label not_same; |
| 4251 __ cmp(left, right); | 4251 __ cmp(left, right); |
| 4252 __ j(not_equal, ¬_same, Label::kNear); | 4252 __ j(not_equal, ¬_same, Label::kNear); |
| 4253 STATIC_ASSERT(EQUAL == 0); | 4253 STATIC_ASSERT(EQUAL == 0); |
| 4254 STATIC_ASSERT(kSmiTag == 0); | 4254 STATIC_ASSERT(kSmiTag == 0); |
| 4255 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); | 4255 __ Move(eax, Immediate(Smi::FromInt(EQUAL))); |
| 4256 __ ret(0); | 4256 __ ret(0); |
| 4257 | 4257 |
| 4258 // Handle not identical strings. | 4258 // Handle not identical strings. |
| 4259 __ bind(¬_same); | 4259 __ bind(¬_same); |
| 4260 | 4260 |
| 4261 // Check that both strings are internalized. If they are, we're done | 4261 // Check that both strings are internalized. If they are, we're done |
| 4262 // because we already know they are not identical. But in the case of | 4262 // because we already know they are not identical. But in the case of |
| 4263 // non-equality compare, we still need to determine the order. We | 4263 // non-equality compare, we still need to determine the order. We |
| 4264 // also know they are both strings. | 4264 // also know they are both strings. |
| 4265 if (equality) { | 4265 if (equality) { |
| (...skipping 1058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5324 const int kApiStackSpace = 4; | 5324 const int kApiStackSpace = 4; |
| 5325 | 5325 |
| 5326 __ PrepareCallApiFunction(kApiArgc + kApiStackSpace); | 5326 __ PrepareCallApiFunction(kApiArgc + kApiStackSpace); |
| 5327 | 5327 |
| 5328 // FunctionCallbackInfo::implicit_args_. | 5328 // FunctionCallbackInfo::implicit_args_. |
| 5329 __ mov(ApiParameterOperand(2), scratch); | 5329 __ mov(ApiParameterOperand(2), scratch); |
| 5330 __ add(scratch, Immediate((argc + FCA::kArgsLength - 1) * kPointerSize)); | 5330 __ add(scratch, Immediate((argc + FCA::kArgsLength - 1) * kPointerSize)); |
| 5331 // FunctionCallbackInfo::values_. | 5331 // FunctionCallbackInfo::values_. |
| 5332 __ mov(ApiParameterOperand(3), scratch); | 5332 __ mov(ApiParameterOperand(3), scratch); |
| 5333 // FunctionCallbackInfo::length_. | 5333 // FunctionCallbackInfo::length_. |
| 5334 __ Set(ApiParameterOperand(4), Immediate(argc)); | 5334 __ Move(ApiParameterOperand(4), Immediate(argc)); |
| 5335 // FunctionCallbackInfo::is_construct_call_. | 5335 // FunctionCallbackInfo::is_construct_call_. |
| 5336 __ Set(ApiParameterOperand(5), Immediate(0)); | 5336 __ Move(ApiParameterOperand(5), Immediate(0)); |
| 5337 | 5337 |
| 5338 // v8::InvocationCallback's argument. | 5338 // v8::InvocationCallback's argument. |
| 5339 __ lea(scratch, ApiParameterOperand(2)); | 5339 __ lea(scratch, ApiParameterOperand(2)); |
| 5340 __ mov(ApiParameterOperand(0), scratch); | 5340 __ mov(ApiParameterOperand(0), scratch); |
| 5341 | 5341 |
| 5342 Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback); | 5342 Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback); |
| 5343 | 5343 |
| 5344 Operand context_restore_operand(ebp, | 5344 Operand context_restore_operand(ebp, |
| 5345 (2 + FCA::kContextSaveIndex) * kPointerSize); | 5345 (2 + FCA::kContextSaveIndex) * kPointerSize); |
| 5346 // Stores return the first js argument | 5346 // Stores return the first js argument |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5396 Operand(ebp, 7 * kPointerSize), | 5396 Operand(ebp, 7 * kPointerSize), |
| 5397 NULL); | 5397 NULL); |
| 5398 } | 5398 } |
| 5399 | 5399 |
| 5400 | 5400 |
| 5401 #undef __ | 5401 #undef __ |
| 5402 | 5402 |
| 5403 } } // namespace v8::internal | 5403 } } // namespace v8::internal |
| 5404 | 5404 |
| 5405 #endif // V8_TARGET_ARCH_IA32 | 5405 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |