| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 // | 4 // |
| 5 // The intrinsic code below is executed before a method has built its frame. | 5 // The intrinsic code below is executed before a method has built its frame. |
| 6 // The return address is on the stack and the arguments below it. | 6 // The return address is on the stack and the arguments below it. |
| 7 // Registers EDX (arguments descriptor) and ECX (function) must be preserved. | 7 // Registers EDX (arguments descriptor) and ECX (function) must be preserved. |
| 8 // Each intrinsification method returns true if the corresponding | 8 // Each intrinsification method returns true if the corresponding |
| 9 // Dart method was intrinsified. | 9 // Dart method was intrinsified. |
| 10 | 10 |
| (...skipping 1700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1711 __ movl(EAX, Address(ESP, + 1 * kWordSize)); // String object. | 1711 __ movl(EAX, Address(ESP, + 1 * kWordSize)); // String object. |
| 1712 __ movl(EAX, FieldAddress(EAX, String::hash_offset())); | 1712 __ movl(EAX, FieldAddress(EAX, String::hash_offset())); |
| 1713 __ cmpl(EAX, Immediate(0)); | 1713 __ cmpl(EAX, Immediate(0)); |
| 1714 __ j(EQUAL, &fall_through, Assembler::kNearJump); | 1714 __ j(EQUAL, &fall_through, Assembler::kNearJump); |
| 1715 __ ret(); | 1715 __ ret(); |
| 1716 __ Bind(&fall_through); | 1716 __ Bind(&fall_through); |
| 1717 // Hash not yet computed. | 1717 // Hash not yet computed. |
| 1718 } | 1718 } |
| 1719 | 1719 |
| 1720 | 1720 |
| 1721 void Intrinsifier::StringBaseCodeUnitAt(Assembler* assembler) { | |
| 1722 Label fall_through, try_two_byte_string; | |
| 1723 __ movl(EBX, Address(ESP, + 1 * kWordSize)); // Index. | |
| 1724 __ movl(EAX, Address(ESP, + 2 * kWordSize)); // String. | |
| 1725 __ testl(EBX, Immediate(kSmiTagMask)); | |
| 1726 __ j(NOT_ZERO, &fall_through, Assembler::kNearJump); // Non-smi index. | |
| 1727 // Range check. | |
| 1728 __ cmpl(EBX, FieldAddress(EAX, String::length_offset())); | |
| 1729 // Runtime throws exception. | |
| 1730 __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump); | |
| 1731 __ CompareClassId(EAX, kOneByteStringCid, EDI); | |
| 1732 __ j(NOT_EQUAL, &try_two_byte_string, Assembler::kNearJump); | |
| 1733 __ SmiUntag(EBX); | |
| 1734 __ movzxb(EAX, FieldAddress(EAX, EBX, TIMES_1, OneByteString::data_offset())); | |
| 1735 __ SmiTag(EAX); | |
| 1736 __ ret(); | |
| 1737 | |
| 1738 __ Bind(&try_two_byte_string); | |
| 1739 __ CompareClassId(EAX, kTwoByteStringCid, EDI); | |
| 1740 __ j(NOT_EQUAL, &fall_through, Assembler::kNearJump); | |
| 1741 ASSERT(kSmiTagShift == 1); | |
| 1742 __ movzxw(EAX, FieldAddress(EAX, EBX, TIMES_1, TwoByteString::data_offset())); | |
| 1743 __ SmiTag(EAX); | |
| 1744 __ ret(); | |
| 1745 | |
| 1746 __ Bind(&fall_through); | |
| 1747 } | |
| 1748 | |
| 1749 | |
| 1750 // bool _substringMatches(int start, String other) | 1721 // bool _substringMatches(int start, String other) |
| 1751 void Intrinsifier::StringBaseSubstringMatches(Assembler* assembler) { | 1722 void Intrinsifier::StringBaseSubstringMatches(Assembler* assembler) { |
| 1752 // For precompilation, not implemented on IA32. | 1723 // For precompilation, not implemented on IA32. |
| 1753 } | 1724 } |
| 1754 | 1725 |
| 1755 | 1726 |
| 1756 void Intrinsifier::StringBaseCharAt(Assembler* assembler) { | 1727 void Intrinsifier::StringBaseCharAt(Assembler* assembler) { |
| 1757 Label fall_through, try_two_byte_string; | 1728 Label fall_through, try_two_byte_string; |
| 1758 __ movl(EBX, Address(ESP, + 1 * kWordSize)); // Index. | 1729 __ movl(EBX, Address(ESP, + 1 * kWordSize)); // Index. |
| 1759 __ movl(EAX, Address(ESP, + 2 * kWordSize)); // String. | 1730 __ movl(EAX, Address(ESP, + 2 * kWordSize)); // String. |
| (...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2157 void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) { | 2128 void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) { |
| 2158 __ LoadIsolate(EAX); | 2129 __ LoadIsolate(EAX); |
| 2159 __ movl(EAX, Address(EAX, Isolate::current_tag_offset())); | 2130 __ movl(EAX, Address(EAX, Isolate::current_tag_offset())); |
| 2160 __ ret(); | 2131 __ ret(); |
| 2161 } | 2132 } |
| 2162 | 2133 |
| 2163 #undef __ | 2134 #undef __ |
| 2164 } // namespace dart | 2135 } // namespace dart |
| 2165 | 2136 |
| 2166 #endif // defined TARGET_ARCH_IA32 | 2137 #endif // defined TARGET_ARCH_IA32 |
| OLD | NEW |