| OLD | NEW |
| 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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 | 101 |
| 102 compiler::Node* HashSeed(); | 102 compiler::Node* HashSeed(); |
| 103 compiler::Node* StaleRegisterConstant(); | 103 compiler::Node* StaleRegisterConstant(); |
| 104 | 104 |
| 105 compiler::Node* IntPtrOrSmiConstant(int value, ParameterMode mode); | 105 compiler::Node* IntPtrOrSmiConstant(int value, ParameterMode mode); |
| 106 | 106 |
| 107 compiler::Node* IntPtrAddFoldConstants(compiler::Node* left, | 107 compiler::Node* IntPtrAddFoldConstants(compiler::Node* left, |
| 108 compiler::Node* right); | 108 compiler::Node* right); |
| 109 compiler::Node* IntPtrSubFoldConstants(compiler::Node* left, | 109 compiler::Node* IntPtrSubFoldConstants(compiler::Node* left, |
| 110 compiler::Node* right); | 110 compiler::Node* right); |
| 111 // Round the 32bits payload of the provided word up to the next power of two. |
| 112 compiler::Node* IntPtrRoundUpToPowerOfTwo32(compiler::Node* value); |
| 113 compiler::Node* IntPtrMax(compiler::Node* left, compiler::Node* right); |
| 111 | 114 |
| 112 // Float64 operations. | 115 // Float64 operations. |
| 113 compiler::Node* Float64Ceil(compiler::Node* x); | 116 compiler::Node* Float64Ceil(compiler::Node* x); |
| 114 compiler::Node* Float64Floor(compiler::Node* x); | 117 compiler::Node* Float64Floor(compiler::Node* x); |
| 115 compiler::Node* Float64Round(compiler::Node* x); | 118 compiler::Node* Float64Round(compiler::Node* x); |
| 116 compiler::Node* Float64Trunc(compiler::Node* x); | 119 compiler::Node* Float64Trunc(compiler::Node* x); |
| 117 | 120 |
| 118 // Tag a Word as a Smi value. | 121 // Tag a Word as a Smi value. |
| 119 compiler::Node* SmiTag(compiler::Node* value); | 122 compiler::Node* SmiTag(compiler::Node* value); |
| 120 // Untag a Smi value as a Word. | 123 // Untag a Smi value as a Word. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 | 163 |
| 161 void Assert(compiler::Node* condition, const char* string = nullptr, | 164 void Assert(compiler::Node* condition, const char* string = nullptr, |
| 162 const char* file = nullptr, int line = 0); | 165 const char* file = nullptr, int line = 0); |
| 163 | 166 |
| 164 // Check a value for smi-ness | 167 // Check a value for smi-ness |
| 165 compiler::Node* TaggedIsSmi(compiler::Node* a); | 168 compiler::Node* TaggedIsSmi(compiler::Node* a); |
| 166 // Check that the value is a non-negative smi. | 169 // Check that the value is a non-negative smi. |
| 167 compiler::Node* WordIsPositiveSmi(compiler::Node* a); | 170 compiler::Node* WordIsPositiveSmi(compiler::Node* a); |
| 168 // Check that a word has a word-aligned address. | 171 // Check that a word has a word-aligned address. |
| 169 compiler::Node* WordIsWordAligned(compiler::Node* word); | 172 compiler::Node* WordIsWordAligned(compiler::Node* word); |
| 173 compiler::Node* WordIsPowerOfTwo(compiler::Node* value); |
| 170 | 174 |
| 171 void BranchIfSmiEqual(compiler::Node* a, compiler::Node* b, Label* if_true, | 175 void BranchIfSmiEqual(compiler::Node* a, compiler::Node* b, Label* if_true, |
| 172 Label* if_false) { | 176 Label* if_false) { |
| 173 Branch(SmiEqual(a, b), if_true, if_false); | 177 Branch(SmiEqual(a, b), if_true, if_false); |
| 174 } | 178 } |
| 175 | 179 |
| 176 void BranchIfSmiLessThan(compiler::Node* a, compiler::Node* b, Label* if_true, | 180 void BranchIfSmiLessThan(compiler::Node* a, compiler::Node* b, Label* if_true, |
| 177 Label* if_false) { | 181 Label* if_false) { |
| 178 Branch(SmiLessThan(a, b), if_true, if_false); | 182 Branch(SmiLessThan(a, b), if_true, if_false); |
| 179 } | 183 } |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 // Load the inobject properties count of a Map (valid only for JSObjects). | 283 // Load the inobject properties count of a Map (valid only for JSObjects). |
| 280 compiler::Node* LoadMapInobjectProperties(compiler::Node* map); | 284 compiler::Node* LoadMapInobjectProperties(compiler::Node* map); |
| 281 // Load the constructor function index of a Map (only for primitive maps). | 285 // Load the constructor function index of a Map (only for primitive maps). |
| 282 compiler::Node* LoadMapConstructorFunctionIndex(compiler::Node* map); | 286 compiler::Node* LoadMapConstructorFunctionIndex(compiler::Node* map); |
| 283 // Load the constructor of a Map (equivalent to Map::GetConstructor()). | 287 // Load the constructor of a Map (equivalent to Map::GetConstructor()). |
| 284 compiler::Node* LoadMapConstructor(compiler::Node* map); | 288 compiler::Node* LoadMapConstructor(compiler::Node* map); |
| 285 // Check whether the map is for an object with special properties, such as a | 289 // Check whether the map is for an object with special properties, such as a |
| 286 // JSProxy or an object with interceptors. | 290 // JSProxy or an object with interceptors. |
| 287 compiler::Node* IsSpecialReceiverMap(compiler::Node* map); | 291 compiler::Node* IsSpecialReceiverMap(compiler::Node* map); |
| 288 compiler::Node* IsSpecialReceiverInstanceType(compiler::Node* instance_type); | 292 compiler::Node* IsSpecialReceiverInstanceType(compiler::Node* instance_type); |
| 293 // Check if the map is set for slow properties. |
| 294 compiler::Node* IsDictionaryMap(compiler::Node* map); |
| 289 | 295 |
| 290 // Load the hash field of a name as an uint32 value. | 296 // Load the hash field of a name as an uint32 value. |
| 291 compiler::Node* LoadNameHashField(compiler::Node* name); | 297 compiler::Node* LoadNameHashField(compiler::Node* name); |
| 292 // Load the hash value of a name as an uint32 value. | 298 // Load the hash value of a name as an uint32 value. |
| 293 // If {if_hash_not_computed} label is specified then it also checks if | 299 // If {if_hash_not_computed} label is specified then it also checks if |
| 294 // hash is actually computed. | 300 // hash is actually computed. |
| 295 compiler::Node* LoadNameHash(compiler::Node* name, | 301 compiler::Node* LoadNameHash(compiler::Node* name, |
| 296 Label* if_hash_not_computed = nullptr); | 302 Label* if_hash_not_computed = nullptr); |
| 297 | 303 |
| 298 // Load length field of a String object. | 304 // Load length field of a String object. |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 compiler::Node* StoreObjectFieldNoWriteBarrier( | 359 compiler::Node* StoreObjectFieldNoWriteBarrier( |
| 354 compiler::Node* object, compiler::Node* offset, compiler::Node* value, | 360 compiler::Node* object, compiler::Node* offset, compiler::Node* value, |
| 355 MachineRepresentation rep = MachineRepresentation::kTagged); | 361 MachineRepresentation rep = MachineRepresentation::kTagged); |
| 356 // Store the Map of an HeapObject. | 362 // Store the Map of an HeapObject. |
| 357 compiler::Node* StoreMapNoWriteBarrier(compiler::Node* object, | 363 compiler::Node* StoreMapNoWriteBarrier(compiler::Node* object, |
| 358 compiler::Node* map); | 364 compiler::Node* map); |
| 359 compiler::Node* StoreObjectFieldRoot(compiler::Node* object, int offset, | 365 compiler::Node* StoreObjectFieldRoot(compiler::Node* object, int offset, |
| 360 Heap::RootListIndex root); | 366 Heap::RootListIndex root); |
| 361 // Store an array element to a FixedArray. | 367 // Store an array element to a FixedArray. |
| 362 compiler::Node* StoreFixedArrayElement( | 368 compiler::Node* StoreFixedArrayElement( |
| 369 compiler::Node* object, int index, compiler::Node* value, |
| 370 WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER, |
| 371 ParameterMode parameter_mode = INTEGER_PARAMETERS) { |
| 372 return StoreFixedArrayElement(object, Int32Constant(index), value, |
| 373 barrier_mode, parameter_mode); |
| 374 } |
| 375 |
| 376 compiler::Node* StoreFixedArrayElement( |
| 363 compiler::Node* object, compiler::Node* index, compiler::Node* value, | 377 compiler::Node* object, compiler::Node* index, compiler::Node* value, |
| 364 WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER, | 378 WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER, |
| 365 ParameterMode parameter_mode = INTEGER_PARAMETERS); | 379 ParameterMode parameter_mode = INTEGER_PARAMETERS); |
| 366 | 380 |
| 367 compiler::Node* StoreFixedDoubleArrayElement( | 381 compiler::Node* StoreFixedDoubleArrayElement( |
| 368 compiler::Node* object, compiler::Node* index, compiler::Node* value, | 382 compiler::Node* object, compiler::Node* index, compiler::Node* value, |
| 369 ParameterMode parameter_mode = INTEGER_PARAMETERS); | 383 ParameterMode parameter_mode = INTEGER_PARAMETERS); |
| 370 | 384 |
| 371 void StoreFieldsNoWriteBarrier(compiler::Node* start_address, | 385 void StoreFieldsNoWriteBarrier(compiler::Node* start_address, |
| 372 compiler::Node* end_address, | 386 compiler::Node* end_address, |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 | 438 |
| 425 // Allocate a RegExpResult with the given length (the number of captures, | 439 // Allocate a RegExpResult with the given length (the number of captures, |
| 426 // including the match itself), index (the index where the match starts), | 440 // including the match itself), index (the index where the match starts), |
| 427 // and input string. |length| and |index| are expected to be tagged, and | 441 // and input string. |length| and |index| are expected to be tagged, and |
| 428 // |input| must be a string. | 442 // |input| must be a string. |
| 429 compiler::Node* AllocateRegExpResult(compiler::Node* context, | 443 compiler::Node* AllocateRegExpResult(compiler::Node* context, |
| 430 compiler::Node* length, | 444 compiler::Node* length, |
| 431 compiler::Node* index, | 445 compiler::Node* index, |
| 432 compiler::Node* input); | 446 compiler::Node* input); |
| 433 | 447 |
| 448 compiler::Node* AllocateNameDictionary(int capacity); |
| 449 compiler::Node* AllocateNameDictionary(compiler::Node* capacity); |
| 450 |
| 434 compiler::Node* AllocateJSObjectFromMap(compiler::Node* map, | 451 compiler::Node* AllocateJSObjectFromMap(compiler::Node* map, |
| 435 compiler::Node* properties = nullptr, | 452 compiler::Node* properties = nullptr, |
| 436 compiler::Node* elements = nullptr); | 453 compiler::Node* elements = nullptr); |
| 437 | 454 |
| 438 void InitializeJSObjectFromMap(compiler::Node* object, compiler::Node* map, | 455 void InitializeJSObjectFromMap(compiler::Node* object, compiler::Node* map, |
| 439 compiler::Node* size, | 456 compiler::Node* size, |
| 440 compiler::Node* properties = nullptr, | 457 compiler::Node* properties = nullptr, |
| 441 compiler::Node* elements = nullptr); | 458 compiler::Node* elements = nullptr); |
| 442 | 459 |
| 443 void InitializeJSObjectBody(compiler::Node* object, compiler::Node* map, | 460 void InitializeJSObjectBody(compiler::Node* object, compiler::Node* map, |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 Label* if_keyisunique, Label* if_bailout); | 732 Label* if_keyisunique, Label* if_bailout); |
| 716 | 733 |
| 717 // Calculates array index for given dictionary entry and entry field. | 734 // Calculates array index for given dictionary entry and entry field. |
| 718 // See Dictionary::EntryToIndex(). | 735 // See Dictionary::EntryToIndex(). |
| 719 template <typename Dictionary> | 736 template <typename Dictionary> |
| 720 compiler::Node* EntryToIndex(compiler::Node* entry, int field_index); | 737 compiler::Node* EntryToIndex(compiler::Node* entry, int field_index); |
| 721 template <typename Dictionary> | 738 template <typename Dictionary> |
| 722 compiler::Node* EntryToIndex(compiler::Node* entry) { | 739 compiler::Node* EntryToIndex(compiler::Node* entry) { |
| 723 return EntryToIndex<Dictionary>(entry, Dictionary::kEntryKeyIndex); | 740 return EntryToIndex<Dictionary>(entry, Dictionary::kEntryKeyIndex); |
| 724 } | 741 } |
| 742 // Calculate a valid size for the a hash table. |
| 743 compiler::Node* HashTableComputeCapacity(compiler::Node* at_least_space_for); |
| 725 | 744 |
| 726 // Looks up an entry in a NameDictionaryBase successor. If the entry is found | 745 // Looks up an entry in a NameDictionaryBase successor. If the entry is found |
| 727 // control goes to {if_found} and {var_name_index} contains an index of the | 746 // control goes to {if_found} and {var_name_index} contains an index of the |
| 728 // key field of the entry found. If the key is not found control goes to | 747 // key field of the entry found. If the key is not found control goes to |
| 729 // {if_not_found}. | 748 // {if_not_found}. |
| 730 static const int kInlinedDictionaryProbes = 4; | 749 static const int kInlinedDictionaryProbes = 4; |
| 731 template <typename Dictionary> | 750 template <typename Dictionary> |
| 732 void NameDictionaryLookup(compiler::Node* dictionary, | 751 void NameDictionaryLookup(compiler::Node* dictionary, |
| 733 compiler::Node* unique_name, Label* if_found, | 752 compiler::Node* unique_name, Label* if_found, |
| 734 Variable* var_name_index, Label* if_not_found, | 753 Variable* var_name_index, Label* if_not_found, |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1125 static const int kElementLoopUnrollThreshold = 8; | 1144 static const int kElementLoopUnrollThreshold = 8; |
| 1126 }; | 1145 }; |
| 1127 | 1146 |
| 1128 #define CSA_ASSERT(x) Assert((x), #x, __FILE__, __LINE__) | 1147 #define CSA_ASSERT(x) Assert((x), #x, __FILE__, __LINE__) |
| 1129 | 1148 |
| 1130 DEFINE_OPERATORS_FOR_FLAGS(CodeStubAssembler::AllocationFlags); | 1149 DEFINE_OPERATORS_FOR_FLAGS(CodeStubAssembler::AllocationFlags); |
| 1131 | 1150 |
| 1132 } // namespace internal | 1151 } // namespace internal |
| 1133 } // namespace v8 | 1152 } // namespace v8 |
| 1134 #endif // V8_CODE_STUB_ASSEMBLER_H_ | 1153 #endif // V8_CODE_STUB_ASSEMBLER_H_ |
| OLD | NEW |