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 #ifndef V8_ARM64_CODE_STUBS_ARM64_H_ | 5 #ifndef V8_ARM64_CODE_STUBS_ARM64_H_ |
6 #define V8_ARM64_CODE_STUBS_ARM64_H_ | 6 #define V8_ARM64_CODE_STUBS_ARM64_H_ |
7 | 7 |
8 namespace v8 { | 8 namespace v8 { |
9 namespace internal { | 9 namespace internal { |
10 | 10 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 | 90 |
91 RecordWriteStub(uint32_t key, Isolate* isolate) | 91 RecordWriteStub(uint32_t key, Isolate* isolate) |
92 : PlatformCodeStub(key, isolate), regs_(object(), address(), value()) {} | 92 : PlatformCodeStub(key, isolate), regs_(object(), address(), value()) {} |
93 | 93 |
94 enum Mode { | 94 enum Mode { |
95 STORE_BUFFER_ONLY, | 95 STORE_BUFFER_ONLY, |
96 INCREMENTAL, | 96 INCREMENTAL, |
97 INCREMENTAL_COMPACTION | 97 INCREMENTAL_COMPACTION |
98 }; | 98 }; |
99 | 99 |
100 virtual bool SometimesSetsUpAFrame() { return false; } | 100 bool SometimesSetsUpAFrame() OVERRIDE { return false; } |
101 | 101 |
102 static Mode GetMode(Code* stub) { | 102 static Mode GetMode(Code* stub) { |
103 // Find the mode depending on the first two instructions. | 103 // Find the mode depending on the first two instructions. |
104 Instruction* instr1 = | 104 Instruction* instr1 = |
105 reinterpret_cast<Instruction*>(stub->instruction_start()); | 105 reinterpret_cast<Instruction*>(stub->instruction_start()); |
106 Instruction* instr2 = instr1->following(); | 106 Instruction* instr2 = instr1->following(); |
107 | 107 |
108 if (instr1->IsUncondBranchImm()) { | 108 if (instr1->IsUncondBranchImm()) { |
109 DCHECK(instr2->IsPCRelAddressing() && (instr2->Rd() == xzr.code())); | 109 DCHECK(instr2->IsPCRelAddressing() && (instr2->Rd() == xzr.code())); |
110 return INCREMENTAL; | 110 return INCREMENTAL; |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 } | 268 } |
269 | 269 |
270 friend class RecordWriteStub; | 270 friend class RecordWriteStub; |
271 }; | 271 }; |
272 | 272 |
273 enum OnNoNeedToInformIncrementalMarker { | 273 enum OnNoNeedToInformIncrementalMarker { |
274 kReturnOnNoNeedToInformIncrementalMarker, | 274 kReturnOnNoNeedToInformIncrementalMarker, |
275 kUpdateRememberedSetOnNoNeedToInformIncrementalMarker | 275 kUpdateRememberedSetOnNoNeedToInformIncrementalMarker |
276 }; | 276 }; |
277 | 277 |
278 virtual inline Major MajorKey() const FINAL OVERRIDE { return RecordWrite; } | 278 inline Major MajorKey() const FINAL { return RecordWrite; } |
279 | 279 |
280 virtual void Generate(MacroAssembler* masm) OVERRIDE; | 280 void Generate(MacroAssembler* masm) OVERRIDE; |
281 void GenerateIncremental(MacroAssembler* masm, Mode mode); | 281 void GenerateIncremental(MacroAssembler* masm, Mode mode); |
282 void CheckNeedsToInformIncrementalMarker( | 282 void CheckNeedsToInformIncrementalMarker( |
283 MacroAssembler* masm, | 283 MacroAssembler* masm, |
284 OnNoNeedToInformIncrementalMarker on_no_need, | 284 OnNoNeedToInformIncrementalMarker on_no_need, |
285 Mode mode); | 285 Mode mode); |
286 void InformIncrementalMarker(MacroAssembler* masm); | 286 void InformIncrementalMarker(MacroAssembler* masm); |
287 | 287 |
288 void Activate(Code* code) { | 288 void Activate(Code* code) OVERRIDE { |
289 code->GetHeap()->incremental_marking()->ActivateGeneratedStub(code); | 289 code->GetHeap()->incremental_marking()->ActivateGeneratedStub(code); |
290 } | 290 } |
291 | 291 |
292 Register object() const { | 292 Register object() const { |
293 return Register::from_code(ObjectBits::decode(minor_key_)); | 293 return Register::from_code(ObjectBits::decode(minor_key_)); |
294 } | 294 } |
295 | 295 |
296 Register value() const { | 296 Register value() const { |
297 return Register::from_code(ValueBits::decode(minor_key_)); | 297 return Register::from_code(ValueBits::decode(minor_key_)); |
298 } | 298 } |
(...skipping 22 matching lines...) Expand all Loading... |
321 | 321 |
322 | 322 |
323 // Helper to call C++ functions from generated code. The caller must prepare | 323 // Helper to call C++ functions from generated code. The caller must prepare |
324 // the exit frame before doing the call with GenerateCall. | 324 // the exit frame before doing the call with GenerateCall. |
325 class DirectCEntryStub: public PlatformCodeStub { | 325 class DirectCEntryStub: public PlatformCodeStub { |
326 public: | 326 public: |
327 explicit DirectCEntryStub(Isolate* isolate) : PlatformCodeStub(isolate) {} | 327 explicit DirectCEntryStub(Isolate* isolate) : PlatformCodeStub(isolate) {} |
328 void GenerateCall(MacroAssembler* masm, Register target); | 328 void GenerateCall(MacroAssembler* masm, Register target); |
329 | 329 |
330 private: | 330 private: |
331 bool NeedsImmovableCode() { return true; } | 331 bool NeedsImmovableCode() OVERRIDE { return true; } |
332 | 332 |
333 DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); | 333 DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); |
334 DEFINE_PLATFORM_CODE_STUB(DirectCEntry, PlatformCodeStub); | 334 DEFINE_PLATFORM_CODE_STUB(DirectCEntry, PlatformCodeStub); |
335 }; | 335 }; |
336 | 336 |
337 | 337 |
338 class NameDictionaryLookupStub: public PlatformCodeStub { | 338 class NameDictionaryLookupStub: public PlatformCodeStub { |
339 public: | 339 public: |
340 enum LookupMode { POSITIVE_LOOKUP, NEGATIVE_LOOKUP }; | 340 enum LookupMode { POSITIVE_LOOKUP, NEGATIVE_LOOKUP }; |
341 | 341 |
(...skipping 11 matching lines...) Expand all Loading... |
353 Register scratch0); | 353 Register scratch0); |
354 | 354 |
355 static void GeneratePositiveLookup(MacroAssembler* masm, | 355 static void GeneratePositiveLookup(MacroAssembler* masm, |
356 Label* miss, | 356 Label* miss, |
357 Label* done, | 357 Label* done, |
358 Register elements, | 358 Register elements, |
359 Register name, | 359 Register name, |
360 Register scratch1, | 360 Register scratch1, |
361 Register scratch2); | 361 Register scratch2); |
362 | 362 |
363 virtual bool SometimesSetsUpAFrame() { return false; } | 363 bool SometimesSetsUpAFrame() OVERRIDE { return false; } |
364 | 364 |
365 private: | 365 private: |
366 static const int kInlinedProbes = 4; | 366 static const int kInlinedProbes = 4; |
367 static const int kTotalProbes = 20; | 367 static const int kTotalProbes = 20; |
368 | 368 |
369 static const int kCapacityOffset = | 369 static const int kCapacityOffset = |
370 NameDictionary::kHeaderSize + | 370 NameDictionary::kHeaderSize + |
371 NameDictionary::kCapacityIndex * kPointerSize; | 371 NameDictionary::kCapacityIndex * kPointerSize; |
372 | 372 |
373 static const int kElementsStartOffset = | 373 static const int kElementsStartOffset = |
374 NameDictionary::kHeaderSize + | 374 NameDictionary::kHeaderSize + |
375 NameDictionary::kElementsStartIndex * kPointerSize; | 375 NameDictionary::kElementsStartIndex * kPointerSize; |
376 | 376 |
377 LookupMode mode() const { return LookupModeBits::decode(minor_key_); } | 377 LookupMode mode() const { return LookupModeBits::decode(minor_key_); } |
378 | 378 |
379 class LookupModeBits: public BitField<LookupMode, 0, 1> {}; | 379 class LookupModeBits: public BitField<LookupMode, 0, 1> {}; |
380 | 380 |
381 DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); | 381 DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); |
382 DEFINE_PLATFORM_CODE_STUB(NameDictionaryLookup, PlatformCodeStub); | 382 DEFINE_PLATFORM_CODE_STUB(NameDictionaryLookup, PlatformCodeStub); |
383 }; | 383 }; |
384 | 384 |
385 } } // namespace v8::internal | 385 } } // namespace v8::internal |
386 | 386 |
387 #endif // V8_ARM64_CODE_STUBS_ARM64_H_ | 387 #endif // V8_ARM64_CODE_STUBS_ARM64_H_ |
OLD | NEW |