Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(739)

Side by Side Diff: src/code-stub-assembler.cc

Issue 2397223002: [stubs] Port NumberToString stub to TF (Closed)
Patch Set: Merge with ToT Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/code-stubs.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 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/code-stub-assembler.h" 5 #include "src/code-stub-assembler.h"
6 #include "src/code-factory.h" 6 #include "src/code-factory.h"
7 #include "src/frames-inl.h" 7 #include "src/frames-inl.h"
8 #include "src/frames.h" 8 #include "src/frames.h"
9 #include "src/ic/handler-configuration.h" 9 #include "src/ic/handler-configuration.h"
10 #include "src/ic/stub-cache.h" 10 #include "src/ic/stub-cache.h"
(...skipping 2813 matching lines...) Expand 10 before | Expand all | Expand 10 after
2824 Bind(&runtime); 2824 Bind(&runtime);
2825 { 2825 {
2826 var_result.Bind(CallRuntime(Runtime::kStringToNumber, context, input)); 2826 var_result.Bind(CallRuntime(Runtime::kStringToNumber, context, input));
2827 Goto(&end); 2827 Goto(&end);
2828 } 2828 }
2829 2829
2830 Bind(&end); 2830 Bind(&end);
2831 return var_result.value(); 2831 return var_result.value();
2832 } 2832 }
2833 2833
2834 Node* CodeStubAssembler::NumberToString(compiler::Node* context,
2835 compiler::Node* argument) {
2836 Variable result(this, MachineRepresentation::kTagged);
2837 Label runtime(this, Label::kDeferred);
2838 Label smi(this);
2839 Label done(this, &result);
2840
2841 // Load the number string cache.
2842 Node* number_string_cache = LoadRoot(Heap::kNumberStringCacheRootIndex);
2843
2844 // Make the hash mask from the length of the number string cache. It
2845 // contains two elements (number and string) for each cache entry.
2846 Node* mask = LoadFixedArrayBaseLength(number_string_cache);
2847 Node* one = IntPtrConstant(1);
2848 mask = IntPtrSub(mask, one);
2849
2850 GotoIf(WordIsSmi(argument), &smi);
2851
2852 // Argument isn't smi, check to see if it's a heap-number.
2853 Node* map = LoadMap(argument);
2854 GotoUnless(WordEqual(map, HeapNumberMapConstant()), &runtime);
2855
2856 // Make a hash from the two 32-bit values of the double.
2857 Node* low =
2858 LoadObjectField(argument, HeapNumber::kValueOffset, MachineType::Int32());
2859 Node* high = LoadObjectField(argument, HeapNumber::kValueOffset + kIntSize,
2860 MachineType::Int32());
2861 Node* hash = Word32Xor(low, high);
2862 if (Is64()) hash = ChangeInt32ToInt64(hash);
2863 hash = WordShl(hash, one);
2864 Node* index = WordAnd(hash, SmiToWord(mask));
2865
2866 // Cache entry's key must be a heap number
2867 Node* number_key =
2868 LoadFixedArrayElement(number_string_cache, index, 0, INTPTR_PARAMETERS);
2869 GotoIf(WordIsSmi(number_key), &runtime);
2870 map = LoadMap(number_key);
2871 GotoUnless(WordEqual(map, HeapNumberMapConstant()), &runtime);
2872
2873 // Cache entry's key must match the heap number value we're looking for.
2874 Node* low_compare = LoadObjectField(number_key, HeapNumber::kValueOffset,
2875 MachineType::Int32());
2876 Node* high_compare = LoadObjectField(
2877 number_key, HeapNumber::kValueOffset + kIntSize, MachineType::Int32());
2878 GotoUnless(WordEqual(low, low_compare), &runtime);
2879 GotoUnless(WordEqual(high, high_compare), &runtime);
2880
2881 // Heap number match, return value fro cache entry.
2882 IncrementCounter(isolate()->counters()->number_to_string_native(), 1);
2883 result.Bind(LoadFixedArrayElement(number_string_cache, index, kPointerSize,
2884 INTPTR_PARAMETERS));
2885 Goto(&done);
2886
2887 Bind(&runtime);
2888 {
2889 // No cache entry, go to the runtime.
2890 result.Bind(CallRuntime(Runtime::kNumberToString, context, argument));
2891 }
2892 Goto(&done);
2893
2894 Bind(&smi);
2895 {
2896 // Load the smi key, make sure it matches the smi we're looking for.
2897 Node* smi_index = WordAnd(WordShl(argument, one), mask);
2898 Node* smi_key = LoadFixedArrayElement(number_string_cache, smi_index, 0,
2899 SMI_PARAMETERS);
2900 GotoIf(WordNotEqual(smi_key, argument), &runtime);
2901
2902 // Smi match, return value from cache entry.
2903 IncrementCounter(isolate()->counters()->number_to_string_native(), 1);
2904 result.Bind(LoadFixedArrayElement(number_string_cache, smi_index,
2905 kPointerSize, SMI_PARAMETERS));
2906 Goto(&done);
2907 }
2908
2909 Bind(&done);
2910 return result.value();
2911 }
2912
2834 Node* CodeStubAssembler::ToName(Node* context, Node* value) { 2913 Node* CodeStubAssembler::ToName(Node* context, Node* value) {
2835 typedef CodeStubAssembler::Label Label; 2914 typedef CodeStubAssembler::Label Label;
2836 typedef CodeStubAssembler::Variable Variable; 2915 typedef CodeStubAssembler::Variable Variable;
2837 2916
2838 Label end(this); 2917 Label end(this);
2839 Variable var_result(this, MachineRepresentation::kTagged); 2918 Variable var_result(this, MachineRepresentation::kTagged);
2840 2919
2841 Label is_number(this); 2920 Label is_number(this);
2842 GotoIf(WordIsSmi(value), &is_number); 2921 GotoIf(WordIsSmi(value), &is_number);
2843 2922
(...skipping 4295 matching lines...) Expand 10 before | Expand all | Expand 10 after
7139 result.Bind(CallRuntime(Runtime::kInstanceOf, context, object, callable)); 7218 result.Bind(CallRuntime(Runtime::kInstanceOf, context, object, callable));
7140 Goto(&end); 7219 Goto(&end);
7141 } 7220 }
7142 7221
7143 Bind(&end); 7222 Bind(&end);
7144 return result.value(); 7223 return result.value();
7145 } 7224 }
7146 7225
7147 } // namespace internal 7226 } // namespace internal
7148 } // namespace v8 7227 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/code-stubs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698