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" |
(...skipping 2828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2839 __ movb(Operand(dest, 0), kScratchRegister); | 2839 __ movb(Operand(dest, 0), kScratchRegister); |
2840 __ incp(src); | 2840 __ incp(src); |
2841 __ incp(dest); | 2841 __ incp(dest); |
2842 __ decl(count); | 2842 __ decl(count); |
2843 __ j(not_zero, &loop); | 2843 __ j(not_zero, &loop); |
2844 | 2844 |
2845 __ bind(&done); | 2845 __ bind(&done); |
2846 } | 2846 } |
2847 | 2847 |
2848 | 2848 |
2849 void StringHelper::GenerateHashInit(MacroAssembler* masm, | |
2850 Register hash, | |
2851 Register character, | |
2852 Register scratch) { | |
2853 // hash = (seed + character) + ((seed + character) << 10); | |
2854 __ LoadRoot(scratch, Heap::kHashSeedRootIndex); | |
2855 __ SmiToInteger32(scratch, scratch); | |
2856 __ addl(scratch, character); | |
2857 __ movl(hash, scratch); | |
2858 __ shll(scratch, Immediate(10)); | |
2859 __ addl(hash, scratch); | |
2860 // hash ^= hash >> 6; | |
2861 __ movl(scratch, hash); | |
2862 __ shrl(scratch, Immediate(6)); | |
2863 __ xorl(hash, scratch); | |
2864 } | |
2865 | |
2866 | |
2867 void StringHelper::GenerateHashAddCharacter(MacroAssembler* masm, | |
2868 Register hash, | |
2869 Register character, | |
2870 Register scratch) { | |
2871 // hash += character; | |
2872 __ addl(hash, character); | |
2873 // hash += hash << 10; | |
2874 __ movl(scratch, hash); | |
2875 __ shll(scratch, Immediate(10)); | |
2876 __ addl(hash, scratch); | |
2877 // hash ^= hash >> 6; | |
2878 __ movl(scratch, hash); | |
2879 __ shrl(scratch, Immediate(6)); | |
2880 __ xorl(hash, scratch); | |
2881 } | |
2882 | |
2883 | |
2884 void StringHelper::GenerateHashGetHash(MacroAssembler* masm, | |
2885 Register hash, | |
2886 Register scratch) { | |
2887 // hash += hash << 3; | |
2888 __ leal(hash, Operand(hash, hash, times_8, 0)); | |
2889 // hash ^= hash >> 11; | |
2890 __ movl(scratch, hash); | |
2891 __ shrl(scratch, Immediate(11)); | |
2892 __ xorl(hash, scratch); | |
2893 // hash += hash << 15; | |
2894 __ movl(scratch, hash); | |
2895 __ shll(scratch, Immediate(15)); | |
2896 __ addl(hash, scratch); | |
2897 | |
2898 __ andl(hash, Immediate(String::kHashBitMask)); | |
2899 | |
2900 // if (hash == 0) hash = 27; | |
2901 Label hash_not_zero; | |
2902 __ j(not_zero, &hash_not_zero); | |
2903 __ Set(hash, StringHasher::kZeroHash); | |
2904 __ bind(&hash_not_zero); | |
2905 } | |
2906 | |
2907 | |
2908 void SubStringStub::Generate(MacroAssembler* masm) { | 2849 void SubStringStub::Generate(MacroAssembler* masm) { |
2909 Label runtime; | 2850 Label runtime; |
2910 | 2851 |
2911 // Stack frame on entry. | 2852 // Stack frame on entry. |
2912 // rsp[0] : return address | 2853 // rsp[0] : return address |
2913 // rsp[8] : to | 2854 // rsp[8] : to |
2914 // rsp[16] : from | 2855 // rsp[16] : from |
2915 // rsp[24] : string | 2856 // rsp[24] : string |
2916 | 2857 |
2917 enum SubStringStubArgumentIndices { | 2858 enum SubStringStubArgumentIndices { |
(...skipping 1789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4707 return_value_operand, | 4648 return_value_operand, |
4708 NULL); | 4649 NULL); |
4709 } | 4650 } |
4710 | 4651 |
4711 | 4652 |
4712 #undef __ | 4653 #undef __ |
4713 | 4654 |
4714 } } // namespace v8::internal | 4655 } } // namespace v8::internal |
4715 | 4656 |
4716 #endif // V8_TARGET_ARCH_X64 | 4657 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |