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

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

Issue 2568713002: [stubs] Fixing issues found by machine graph verifier in code stubs. (Closed)
Patch Set: Addressing nits Created 4 years 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/builtins/builtins-number.cc ('k') | src/code-stub-assembler.cc » ('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 #ifndef V8_CODE_STUB_ASSEMBLER_H_ 5 #ifndef V8_CODE_STUB_ASSEMBLER_H_
6 #define V8_CODE_STUB_ASSEMBLER_H_ 6 #define V8_CODE_STUB_ASSEMBLER_H_
7 7
8 #include <functional> 8 #include <functional>
9 9
10 #include "src/compiler/code-assembler.h" 10 #include "src/compiler/code-assembler.h"
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 Node* UntagParameter(Node* value, ParameterMode mode) { 88 Node* UntagParameter(Node* value, ParameterMode mode) {
89 if (mode != SMI_PARAMETERS) value = SmiUntag(value); 89 if (mode != SMI_PARAMETERS) value = SmiUntag(value);
90 return value; 90 return value;
91 } 91 }
92 92
93 Node* TagParameter(Node* value, ParameterMode mode) { 93 Node* TagParameter(Node* value, ParameterMode mode) {
94 if (mode != SMI_PARAMETERS) value = SmiTag(value); 94 if (mode != SMI_PARAMETERS) value = SmiTag(value);
95 return value; 95 return value;
96 } 96 }
97 97
98 #define PARAMETER_BINARY_OPERATION(OpName, IntPtrOpName, SmiOpName, \ 98 #define PARAMETER_BINOP(OpName, IntPtrOpName, SmiOpName, Int32OpName) \
99 Int32OpName) \ 99 Node* OpName(Node* a, Node* b, ParameterMode mode) { \
100 Node* OpName(Node* value1, Node* value2, ParameterMode mode) { \ 100 if (mode == SMI_PARAMETERS) { \
101 if (mode == SMI_PARAMETERS) { \ 101 return SmiOpName(a, b); \
102 return SmiOpName(value1, value2); \ 102 } else if (mode == INTPTR_PARAMETERS) { \
103 } else if (mode == INTPTR_PARAMETERS) { \ 103 return IntPtrOpName(a, b); \
104 return IntPtrOpName(value1, value2); \ 104 } else { \
105 } else { \ 105 DCHECK_EQ(INTEGER_PARAMETERS, mode); \
106 DCHECK_EQ(INTEGER_PARAMETERS, mode); \ 106 return Int32OpName(a, b); \
107 return Int32OpName(value1, value2); \ 107 } \
108 } \
109 } 108 }
110 PARAMETER_BINARY_OPERATION(IntPtrOrSmiAdd, IntPtrAdd, SmiAdd, Int32Add) 109 PARAMETER_BINOP(IntPtrOrSmiAdd, IntPtrAdd, SmiAdd, Int32Add)
111 PARAMETER_BINARY_OPERATION(IntPtrOrSmiLessThan, IntPtrLessThan, SmiLessThan, 110 PARAMETER_BINOP(IntPtrOrSmiLessThan, IntPtrLessThan, SmiLessThan,
112 Int32LessThan) 111 Int32LessThan)
113 PARAMETER_BINARY_OPERATION(IntPtrOrSmiGreaterThan, IntPtrGreaterThan, 112 PARAMETER_BINOP(IntPtrOrSmiGreaterThan, IntPtrGreaterThan, SmiGreaterThan,
114 SmiGreaterThan, Int32GreaterThan) 113 Int32GreaterThan)
115 PARAMETER_BINARY_OPERATION(UintPtrOrSmiLessThan, UintPtrLessThan, SmiBelow, 114 PARAMETER_BINOP(UintPtrOrSmiLessThan, UintPtrLessThan, SmiBelow,
116 Uint32LessThan) 115 Uint32LessThan)
117 116 PARAMETER_BINOP(UintPtrOrSmiGreaterThanOrEqual, UintPtrGreaterThanOrEqual,
118 #undef PARAMETER_BINARY_OPERATION 117 SmiAboveOrEqual, Uint32GreaterThanOrEqual)
118 #undef PARAMETER_BINOP
119 119
120 Node* NoContextConstant(); 120 Node* NoContextConstant();
121 #define HEAP_CONSTANT_ACCESSOR(rootName, name) Node* name##Constant(); 121 #define HEAP_CONSTANT_ACCESSOR(rootName, name) Node* name##Constant();
122 HEAP_CONSTANT_LIST(HEAP_CONSTANT_ACCESSOR) 122 HEAP_CONSTANT_LIST(HEAP_CONSTANT_ACCESSOR)
123 #undef HEAP_CONSTANT_ACCESSOR 123 #undef HEAP_CONSTANT_ACCESSOR
124 124
125 #define HEAP_CONSTANT_TEST(rootName, name) Node* Is##name(Node* value); 125 #define HEAP_CONSTANT_TEST(rootName, name) Node* Is##name(Node* value);
126 HEAP_CONSTANT_LIST(HEAP_CONSTANT_TEST) 126 HEAP_CONSTANT_LIST(HEAP_CONSTANT_TEST)
127 #undef HEAP_CONSTANT_TEST 127 #undef HEAP_CONSTANT_TEST
128 128
(...skipping 21 matching lines...) Expand all
150 Node* SmiUntag(Node* value); 150 Node* SmiUntag(Node* value);
151 151
152 // Smi conversions. 152 // Smi conversions.
153 Node* SmiToFloat64(Node* value); 153 Node* SmiToFloat64(Node* value);
154 Node* SmiFromWord(Node* value) { return SmiTag(value); } 154 Node* SmiFromWord(Node* value) { return SmiTag(value); }
155 Node* SmiFromWord32(Node* value); 155 Node* SmiFromWord32(Node* value);
156 Node* SmiToWord(Node* value) { return SmiUntag(value); } 156 Node* SmiToWord(Node* value) { return SmiUntag(value); }
157 Node* SmiToWord32(Node* value); 157 Node* SmiToWord32(Node* value);
158 158
159 // Smi operations. 159 // Smi operations.
160 Node* SmiAdd(Node* a, Node* b); 160 #define SMI_ARITHMETIC_BINOP(SmiOpName, IntPtrOpName) \
161 Node* SmiSub(Node* a, Node* b); 161 Node* SmiOpName(Node* a, Node* b) { \
162 Node* SmiEqual(Node* a, Node* b); 162 return BitcastWordToTaggedSigned( \
163 Node* SmiAbove(Node* a, Node* b); 163 IntPtrOpName(BitcastTaggedToWord(a), BitcastTaggedToWord(b))); \
164 Node* SmiAboveOrEqual(Node* a, Node* b); 164 }
165 Node* SmiBelow(Node* a, Node* b); 165 SMI_ARITHMETIC_BINOP(SmiAdd, IntPtrAdd)
166 Node* SmiLessThan(Node* a, Node* b); 166 SMI_ARITHMETIC_BINOP(SmiSub, IntPtrSub)
167 Node* SmiLessThanOrEqual(Node* a, Node* b); 167 SMI_ARITHMETIC_BINOP(SmiAnd, WordAnd)
168 Node* SmiGreaterThan(Node* a, Node* b); 168 SMI_ARITHMETIC_BINOP(SmiOr, WordOr)
169
170 #define SMI_SHIFT_OP(SmiOpName, IntPtrOpName) \
171 Node* SmiOpName(Node* a, int shift) { \
172 return BitcastWordToTaggedSigned( \
173 IntPtrOpName(BitcastTaggedToWord(a), shift)); \
174 } \
175 SMI_ARITHMETIC_BINOP(SmiOpName, IntPtrOpName)
176
177 SMI_SHIFT_OP(SmiShl, WordShl)
178 SMI_SHIFT_OP(SmiShr, WordShr)
179 #undef SMI_SHIFT_OP
180 #undef SMI_ARITHMETIC_BINOP
181
182 #define SMI_COMPARISON_OP(SmiOpName, IntPtrOpName) \
183 Node* SmiOpName(Node* a, Node* b) { \
184 return IntPtrOpName(BitcastTaggedToWord(a), BitcastTaggedToWord(b)); \
185 }
186 SMI_COMPARISON_OP(SmiEqual, WordEqual)
187 SMI_COMPARISON_OP(SmiAbove, UintPtrGreaterThan)
188 SMI_COMPARISON_OP(SmiAboveOrEqual, UintPtrGreaterThanOrEqual)
189 SMI_COMPARISON_OP(SmiBelow, UintPtrLessThan)
190 SMI_COMPARISON_OP(SmiLessThan, IntPtrLessThan)
191 SMI_COMPARISON_OP(SmiLessThanOrEqual, IntPtrLessThanOrEqual)
192 SMI_COMPARISON_OP(SmiGreaterThan, IntPtrGreaterThan)
193 #undef SMI_COMPARISON_OP
169 Node* SmiMax(Node* a, Node* b); 194 Node* SmiMax(Node* a, Node* b);
170 Node* SmiMin(Node* a, Node* b); 195 Node* SmiMin(Node* a, Node* b);
171 // Computes a % b for Smi inputs a and b; result is not necessarily a Smi. 196 // Computes a % b for Smi inputs a and b; result is not necessarily a Smi.
172 Node* SmiMod(Node* a, Node* b); 197 Node* SmiMod(Node* a, Node* b);
173 // Computes a * b for Smi inputs a and b; result is not necessarily a Smi. 198 // Computes a * b for Smi inputs a and b; result is not necessarily a Smi.
174 Node* SmiMul(Node* a, Node* b); 199 Node* SmiMul(Node* a, Node* b);
175 Node* SmiOr(Node* a, Node* b) {
176 return BitcastWordToTaggedSigned(
177 WordOr(BitcastTaggedToWord(a), BitcastTaggedToWord(b)));
178 }
179 200
180 // Smi | HeapNumber operations. 201 // Smi | HeapNumber operations.
181 Node* NumberInc(Node* value); 202 Node* NumberInc(Node* value);
182 void GotoIfNotNumber(Node* value, Label* is_not_number); 203 void GotoIfNotNumber(Node* value, Label* is_not_number);
183 void GotoIfNumber(Node* value, Label* is_number); 204 void GotoIfNumber(Node* value, Label* is_number);
184 205
185 // Allocate an object of the given size. 206 // Allocate an object of the given size.
186 Node* Allocate(Node* size, AllocationFlags flags = kNone); 207 Node* Allocate(Node* size, AllocationFlags flags = kNone);
187 Node* Allocate(int size, AllocationFlags flags = kNone); 208 Node* Allocate(int size, AllocationFlags flags = kNone);
188 Node* InnerAllocate(Node* previous, int offset); 209 Node* InnerAllocate(Node* previous, int offset);
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 return DecodeWord(word, T::kShift, T::kMask); 722 return DecodeWord(word, T::kShift, T::kMask);
702 } 723 }
703 724
704 // Returns a node that contains a decoded (unsigned!) value of a bit 725 // Returns a node that contains a decoded (unsigned!) value of a bit
705 // field |T| in |word32|. Returns result as a word-size node. 726 // field |T| in |word32|. Returns result as a word-size node.
706 template <typename T> 727 template <typename T>
707 Node* DecodeWordFromWord32(Node* word32) { 728 Node* DecodeWordFromWord32(Node* word32) {
708 return DecodeWord<T>(ChangeUint32ToWord(word32)); 729 return DecodeWord<T>(ChangeUint32ToWord(word32));
709 } 730 }
710 731
732 // Returns a node that contains a decoded (unsigned!) value of a bit
733 // field |T| in |word|. Returns result as an uint32 node.
734 template <typename T>
735 Node* DecodeWord32FromWord(Node* word) {
736 return TruncateWordToWord32(DecodeWord<T>(word));
737 }
738
711 // Decodes an unsigned (!) value from |word32| to an uint32 node. 739 // Decodes an unsigned (!) value from |word32| to an uint32 node.
712 Node* DecodeWord32(Node* word32, uint32_t shift, uint32_t mask); 740 Node* DecodeWord32(Node* word32, uint32_t shift, uint32_t mask);
713 741
714 // Decodes an unsigned (!) value from |word| to a word-size node. 742 // Decodes an unsigned (!) value from |word| to a word-size node.
715 Node* DecodeWord(Node* word, uint32_t shift, uint32_t mask); 743 Node* DecodeWord(Node* word, uint32_t shift, uint32_t mask);
716 744
717 // Returns true if any of the |T|'s bits in given |word32| are set. 745 // Returns true if any of the |T|'s bits in given |word32| are set.
718 template <typename T> 746 template <typename T>
719 Node* IsSetWord32(Node* word32) { 747 Node* IsSetWord32(Node* word32) {
720 return IsSetWord32(word32, T::kMask); 748 return IsSetWord32(word32, T::kMask);
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
854 Node* unique_name, Label* if_found_fast, 882 Node* unique_name, Label* if_found_fast,
855 Label* if_found_dict, Label* if_found_global, 883 Label* if_found_dict, Label* if_found_global,
856 Variable* var_meta_storage, Variable* var_name_index, 884 Variable* var_meta_storage, Variable* var_name_index,
857 Label* if_not_found, Label* if_bailout); 885 Label* if_not_found, Label* if_bailout);
858 886
859 void TryLookupElement(Node* object, Node* map, Node* instance_type, 887 void TryLookupElement(Node* object, Node* map, Node* instance_type,
860 Node* intptr_index, Label* if_found, 888 Node* intptr_index, Label* if_found,
861 Label* if_not_found, Label* if_bailout); 889 Label* if_not_found, Label* if_bailout);
862 890
863 // This is a type of a lookup in holder generator function. In case of a 891 // This is a type of a lookup in holder generator function. In case of a
864 // property lookup the {key} is guaranteed to be a unique name and in case of 892 // property lookup the {key} is guaranteed to be an unique name and in case of
865 // element lookup the key is an Int32 index. 893 // element lookup the key is an Int32 index.
866 typedef std::function<void(Node* receiver, Node* holder, Node* map, 894 typedef std::function<void(Node* receiver, Node* holder, Node* map,
867 Node* instance_type, Node* key, Label* next_holder, 895 Node* instance_type, Node* key, Label* next_holder,
868 Label* if_bailout)> 896 Label* if_bailout)>
869 LookupInHolder; 897 LookupInHolder;
870 898
871 // Generic property prototype chain lookup generator. 899 // Generic property prototype chain lookup generator.
872 // For properties it generates lookup using given {lookup_property_in_holder} 900 // For properties it generates lookup using given {lookup_property_in_holder}
873 // and for elements it uses {lookup_element_in_holder}. 901 // and for elements it uses {lookup_element_in_holder}.
874 // Upon reaching the end of prototype chain the control goes to {if_end}. 902 // Upon reaching the end of prototype chain the control goes to {if_end}.
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
1155 } 1183 }
1156 #else 1184 #else
1157 #define CSA_SLOW_ASSERT(csa, x) ((void)0) 1185 #define CSA_SLOW_ASSERT(csa, x) ((void)0)
1158 #endif 1186 #endif
1159 1187
1160 DEFINE_OPERATORS_FOR_FLAGS(CodeStubAssembler::AllocationFlags); 1188 DEFINE_OPERATORS_FOR_FLAGS(CodeStubAssembler::AllocationFlags);
1161 1189
1162 } // namespace internal 1190 } // namespace internal
1163 } // namespace v8 1191 } // namespace v8
1164 #endif // V8_CODE_STUB_ASSEMBLER_H_ 1192 #endif // V8_CODE_STUB_ASSEMBLER_H_
OLDNEW
« no previous file with comments | « src/builtins/builtins-number.cc ('k') | src/code-stub-assembler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698