| 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 "src/compiler/code-assembler.h" | 8 #include "src/compiler/code-assembler.h" |
| 9 #include "src/objects.h" | 9 #include "src/objects.h" |
| 10 | 10 |
| 11 namespace v8 { | 11 namespace v8 { |
| 12 namespace internal { | 12 namespace internal { |
| 13 | 13 |
| 14 class CallInterfaceDescriptor; | 14 class CallInterfaceDescriptor; |
| 15 class StatsCounter; |
| 16 class StubCache; |
| 15 | 17 |
| 16 // Provides JavaScript-specific "macro-assembler" functionality on top of the | 18 // Provides JavaScript-specific "macro-assembler" functionality on top of the |
| 17 // CodeAssembler. By factoring the JavaScript-isms out of the CodeAssembler, | 19 // CodeAssembler. By factoring the JavaScript-isms out of the CodeAssembler, |
| 18 // it's possible to add JavaScript-specific useful CodeAssembler "macros" | 20 // it's possible to add JavaScript-specific useful CodeAssembler "macros" |
| 19 // without modifying files in the compiler directory (and requiring a review | 21 // without modifying files in the compiler directory (and requiring a review |
| 20 // from a compiler directory OWNER). | 22 // from a compiler directory OWNER). |
| 21 class CodeStubAssembler : public compiler::CodeAssembler { | 23 class CodeStubAssembler : public compiler::CodeAssembler { |
| 22 public: | 24 public: |
| 23 // Create with CallStub linkage. | 25 // Create with CallStub linkage. |
| 24 // |result_size| specifies the number of results returned by the stub. | 26 // |result_size| specifies the number of results returned by the stub. |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 void BranchIfSmiLessThanOrEqual(compiler::Node* a, compiler::Node* b, | 97 void BranchIfSmiLessThanOrEqual(compiler::Node* a, compiler::Node* b, |
| 96 Label* if_true, Label* if_false) { | 98 Label* if_true, Label* if_false) { |
| 97 BranchIf(SmiLessThanOrEqual(a, b), if_true, if_false); | 99 BranchIf(SmiLessThanOrEqual(a, b), if_true, if_false); |
| 98 } | 100 } |
| 99 | 101 |
| 100 void BranchIfFloat64IsNaN(compiler::Node* value, Label* if_true, | 102 void BranchIfFloat64IsNaN(compiler::Node* value, Label* if_true, |
| 101 Label* if_false) { | 103 Label* if_false) { |
| 102 BranchIfFloat64Equal(value, value, if_false, if_true); | 104 BranchIfFloat64Equal(value, value, if_false, if_true); |
| 103 } | 105 } |
| 104 | 106 |
| 107 // Load value from current frame by given offset in bytes. |
| 108 compiler::Node* LoadFromFrame(int offset, |
| 109 MachineType rep = MachineType::AnyTagged()); |
| 110 // Load value from current parent frame by given offset in bytes. |
| 111 compiler::Node* LoadFromParentFrame( |
| 112 int offset, MachineType rep = MachineType::AnyTagged()); |
| 113 |
| 105 // Load an object pointer from a buffer that isn't in the heap. | 114 // Load an object pointer from a buffer that isn't in the heap. |
| 106 compiler::Node* LoadBufferObject(compiler::Node* buffer, int offset, | 115 compiler::Node* LoadBufferObject(compiler::Node* buffer, int offset, |
| 107 MachineType rep = MachineType::AnyTagged()); | 116 MachineType rep = MachineType::AnyTagged()); |
| 108 // Load a field from an object on the heap. | 117 // Load a field from an object on the heap. |
| 109 compiler::Node* LoadObjectField(compiler::Node* object, int offset, | 118 compiler::Node* LoadObjectField(compiler::Node* object, int offset, |
| 110 MachineType rep = MachineType::AnyTagged()); | 119 MachineType rep = MachineType::AnyTagged()); |
| 111 // Load the floating point value of a HeapNumber. | 120 // Load the floating point value of a HeapNumber. |
| 112 compiler::Node* LoadHeapNumberValue(compiler::Node* object); | 121 compiler::Node* LoadHeapNumberValue(compiler::Node* object); |
| 113 // Load the Map of an HeapObject. | 122 // Load the Map of an HeapObject. |
| 114 compiler::Node* LoadMap(compiler::Node* object); | 123 compiler::Node* LoadMap(compiler::Node* object); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 139 compiler::Node* LoadNameHashField(compiler::Node* name); | 148 compiler::Node* LoadNameHashField(compiler::Node* name); |
| 140 // Load the hash value of a name. If {if_hash_not_computed} label | 149 // Load the hash value of a name. If {if_hash_not_computed} label |
| 141 // is specified then it also checks if hash is actually computed. | 150 // is specified then it also checks if hash is actually computed. |
| 142 compiler::Node* LoadNameHash(compiler::Node* name, | 151 compiler::Node* LoadNameHash(compiler::Node* name, |
| 143 Label* if_hash_not_computed = nullptr); | 152 Label* if_hash_not_computed = nullptr); |
| 144 | 153 |
| 145 // Load length field of a String object. | 154 // Load length field of a String object. |
| 146 compiler::Node* LoadStringLength(compiler::Node* object); | 155 compiler::Node* LoadStringLength(compiler::Node* object); |
| 147 // Load value field of a JSValue object. | 156 // Load value field of a JSValue object. |
| 148 compiler::Node* LoadJSValueValue(compiler::Node* object); | 157 compiler::Node* LoadJSValueValue(compiler::Node* object); |
| 158 // Load value field of a WeakCell object. |
| 159 compiler::Node* LoadWeakCellValue(compiler::Node* weak_cell); |
| 149 | 160 |
| 150 compiler::Node* AllocateUninitializedFixedArray(compiler::Node* length); | 161 compiler::Node* AllocateUninitializedFixedArray(compiler::Node* length); |
| 151 | 162 |
| 152 // Load an array element from a FixedArray. | 163 // Load an array element from a FixedArray. |
| 153 compiler::Node* LoadFixedArrayElement( | 164 compiler::Node* LoadFixedArrayElement( |
| 154 compiler::Node* object, compiler::Node* int32_index, | 165 compiler::Node* object, compiler::Node* int32_index, |
| 155 int additional_offset = 0, | 166 int additional_offset = 0, |
| 156 ParameterMode parameter_mode = INTEGER_PARAMETERS); | 167 ParameterMode parameter_mode = INTEGER_PARAMETERS); |
| 157 // Load an array element from a FixedDoubleArray. | 168 // Load an array element from a FixedDoubleArray. |
| 158 compiler::Node* LoadFixedDoubleArrayElement( | 169 compiler::Node* LoadFixedDoubleArrayElement( |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 compiler::Node* instance_type, compiler::Node* index, | 284 compiler::Node* instance_type, compiler::Node* index, |
| 274 Label* if_found, Label* if_not_found, | 285 Label* if_found, Label* if_not_found, |
| 275 Label* if_bailout); | 286 Label* if_bailout); |
| 276 | 287 |
| 277 // Instanceof helpers. | 288 // Instanceof helpers. |
| 278 // ES6 section 7.3.19 OrdinaryHasInstance (C, O) | 289 // ES6 section 7.3.19 OrdinaryHasInstance (C, O) |
| 279 compiler::Node* OrdinaryHasInstance(compiler::Node* context, | 290 compiler::Node* OrdinaryHasInstance(compiler::Node* context, |
| 280 compiler::Node* callable, | 291 compiler::Node* callable, |
| 281 compiler::Node* object); | 292 compiler::Node* object); |
| 282 | 293 |
| 294 // LoadIC helpers. |
| 295 struct LoadICParameters { |
| 296 LoadICParameters(compiler::Node* context, compiler::Node* receiver, |
| 297 compiler::Node* name, compiler::Node* slot, |
| 298 compiler::Node* vector) |
| 299 : context(context), |
| 300 receiver(receiver), |
| 301 name(name), |
| 302 slot(slot), |
| 303 vector(vector) {} |
| 304 |
| 305 compiler::Node* context; |
| 306 compiler::Node* receiver; |
| 307 compiler::Node* name; |
| 308 compiler::Node* slot; |
| 309 compiler::Node* vector; |
| 310 }; |
| 311 |
| 312 // Load type feedback vector from the stub caller's frame. |
| 313 compiler::Node* LoadTypeFeedbackVectorForStub(); |
| 314 |
| 315 compiler::Node* LoadReceiverMap(compiler::Node* receiver); |
| 316 |
| 317 // Checks monomorphic case. Returns {feedback} entry of the vector. |
| 318 compiler::Node* TryMonomorphicCase(const LoadICParameters* p, |
| 319 compiler::Node* receiver_map, |
| 320 Label* if_handler, Variable* var_handler, |
| 321 Label* if_miss); |
| 322 void HandlePolymorphicCase(const LoadICParameters* p, |
| 323 compiler::Node* receiver_map, |
| 324 compiler::Node* feedback, Label* if_handler, |
| 325 Variable* var_handler, Label* if_miss, |
| 326 int unroll_count); |
| 327 |
| 328 compiler::Node* StubCachePrimaryOffset(compiler::Node* name, |
| 329 Code::Flags flags, |
| 330 compiler::Node* map); |
| 331 |
| 332 compiler::Node* StubCacheSecondaryOffset(compiler::Node* name, |
| 333 Code::Flags flags, |
| 334 compiler::Node* seed); |
| 335 |
| 336 // This enum is used here as a replacement for StubCache::Table to avoid |
| 337 // including stub cache header. |
| 338 enum StubCacheTable : int; |
| 339 |
| 340 void TryProbeStubCacheTable(StubCache* stub_cache, StubCacheTable table_id, |
| 341 compiler::Node* entry_offset, |
| 342 compiler::Node* name, Code::Flags flags, |
| 343 compiler::Node* map, Label* if_handler, |
| 344 Variable* var_handler, Label* if_miss); |
| 345 |
| 346 void TryProbeStubCache(StubCache* stub_cache, Code::Flags flags, |
| 347 compiler::Node* receiver, compiler::Node* name, |
| 348 Label* if_handler, Variable* var_handler, |
| 349 Label* if_miss); |
| 350 |
| 351 void LoadIC(const LoadICParameters* p, Label* if_miss); |
| 352 |
| 283 private: | 353 private: |
| 284 compiler::Node* ElementOffsetFromIndex(compiler::Node* index, | 354 compiler::Node* ElementOffsetFromIndex(compiler::Node* index, |
| 285 ElementsKind kind, ParameterMode mode, | 355 ElementsKind kind, ParameterMode mode, |
| 286 int base_size = 0); | 356 int base_size = 0); |
| 287 | 357 |
| 288 compiler::Node* AllocateRawAligned(compiler::Node* size_in_bytes, | 358 compiler::Node* AllocateRawAligned(compiler::Node* size_in_bytes, |
| 289 AllocationFlags flags, | 359 AllocationFlags flags, |
| 290 compiler::Node* top_address, | 360 compiler::Node* top_address, |
| 291 compiler::Node* limit_address); | 361 compiler::Node* limit_address); |
| 292 compiler::Node* AllocateRawUnaligned(compiler::Node* size_in_bytes, | 362 compiler::Node* AllocateRawUnaligned(compiler::Node* size_in_bytes, |
| 293 AllocationFlags flags, | 363 AllocationFlags flags, |
| 294 compiler::Node* top_adddress, | 364 compiler::Node* top_adddress, |
| 295 compiler::Node* limit_address); | 365 compiler::Node* limit_address); |
| 296 | 366 |
| 297 static const int kElementLoopUnrollThreshold = 8; | 367 static const int kElementLoopUnrollThreshold = 8; |
| 298 }; | 368 }; |
| 299 | 369 |
| 300 } // namespace internal | 370 } // namespace internal |
| 301 } // namespace v8 | 371 } // namespace v8 |
| 302 | |
| 303 #endif // V8_CODE_STUB_ASSEMBLER_H_ | 372 #endif // V8_CODE_STUB_ASSEMBLER_H_ |
| OLD | NEW |