| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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_IA32_CODE_STUBS_IA32_H_ | 5 #ifndef V8_IA32_CODE_STUBS_IA32_H_ |
| 6 #define V8_IA32_CODE_STUBS_IA32_H_ | 6 #define V8_IA32_CODE_STUBS_IA32_H_ |
| 7 | 7 |
| 8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 Label::Distance chars_not_equal_near = Label::kFar); | 68 Label::Distance chars_not_equal_near = Label::kFar); |
| 69 | 69 |
| 70 DISALLOW_IMPLICIT_CONSTRUCTORS(StringHelper); | 70 DISALLOW_IMPLICIT_CONSTRUCTORS(StringHelper); |
| 71 }; | 71 }; |
| 72 | 72 |
| 73 | 73 |
| 74 class NameDictionaryLookupStub: public PlatformCodeStub { | 74 class NameDictionaryLookupStub: public PlatformCodeStub { |
| 75 public: | 75 public: |
| 76 enum LookupMode { POSITIVE_LOOKUP, NEGATIVE_LOOKUP }; | 76 enum LookupMode { POSITIVE_LOOKUP, NEGATIVE_LOOKUP }; |
| 77 | 77 |
| 78 NameDictionaryLookupStub(Isolate* isolate, | 78 NameDictionaryLookupStub(Isolate* isolate, Register dictionary, |
| 79 Register dictionary, | 79 Register result, Register index, LookupMode mode) |
| 80 Register result, | 80 : PlatformCodeStub(isolate) { |
| 81 Register index, | 81 minor_key_ = DictionaryBits::encode(dictionary.code()) | |
| 82 LookupMode mode) | 82 ResultBits::encode(result.code()) | |
| 83 : PlatformCodeStub(isolate), | 83 IndexBits::encode(index.code()) | LookupModeBits::encode(mode); |
| 84 dictionary_(dictionary), result_(result), index_(index), mode_(mode) { } | 84 } |
| 85 | 85 |
| 86 void Generate(MacroAssembler* masm); | 86 void Generate(MacroAssembler* masm); |
| 87 | 87 |
| 88 static void GenerateNegativeLookup(MacroAssembler* masm, | 88 static void GenerateNegativeLookup(MacroAssembler* masm, |
| 89 Label* miss, | 89 Label* miss, |
| 90 Label* done, | 90 Label* done, |
| 91 Register properties, | 91 Register properties, |
| 92 Handle<Name> name, | 92 Handle<Name> name, |
| 93 Register r0); | 93 Register r0); |
| 94 | 94 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 109 static const int kCapacityOffset = | 109 static const int kCapacityOffset = |
| 110 NameDictionary::kHeaderSize + | 110 NameDictionary::kHeaderSize + |
| 111 NameDictionary::kCapacityIndex * kPointerSize; | 111 NameDictionary::kCapacityIndex * kPointerSize; |
| 112 | 112 |
| 113 static const int kElementsStartOffset = | 113 static const int kElementsStartOffset = |
| 114 NameDictionary::kHeaderSize + | 114 NameDictionary::kHeaderSize + |
| 115 NameDictionary::kElementsStartIndex * kPointerSize; | 115 NameDictionary::kElementsStartIndex * kPointerSize; |
| 116 | 116 |
| 117 Major MajorKey() const { return NameDictionaryLookup; } | 117 Major MajorKey() const { return NameDictionaryLookup; } |
| 118 | 118 |
| 119 uint32_t MinorKey() const { | 119 Register dictionary() const { |
| 120 return DictionaryBits::encode(dictionary_.code()) | | 120 return Register::from_code(DictionaryBits::decode(minor_key_)); |
| 121 ResultBits::encode(result_.code()) | | |
| 122 IndexBits::encode(index_.code()) | | |
| 123 LookupModeBits::encode(mode_); | |
| 124 } | 121 } |
| 125 | 122 |
| 123 Register result() const { |
| 124 return Register::from_code(ResultBits::decode(minor_key_)); |
| 125 } |
| 126 |
| 127 Register index() const { |
| 128 return Register::from_code(IndexBits::decode(minor_key_)); |
| 129 } |
| 130 |
| 131 LookupMode mode() const { return LookupModeBits::decode(minor_key_); } |
| 132 |
| 126 class DictionaryBits: public BitField<int, 0, 3> {}; | 133 class DictionaryBits: public BitField<int, 0, 3> {}; |
| 127 class ResultBits: public BitField<int, 3, 3> {}; | 134 class ResultBits: public BitField<int, 3, 3> {}; |
| 128 class IndexBits: public BitField<int, 6, 3> {}; | 135 class IndexBits: public BitField<int, 6, 3> {}; |
| 129 class LookupModeBits: public BitField<LookupMode, 9, 1> {}; | 136 class LookupModeBits: public BitField<LookupMode, 9, 1> {}; |
| 130 | 137 |
| 131 Register dictionary_; | 138 DISALLOW_COPY_AND_ASSIGN(NameDictionaryLookupStub); |
| 132 Register result_; | |
| 133 Register index_; | |
| 134 LookupMode mode_; | |
| 135 }; | 139 }; |
| 136 | 140 |
| 137 | 141 |
| 138 class RecordWriteStub: public PlatformCodeStub { | 142 class RecordWriteStub: public PlatformCodeStub { |
| 139 public: | 143 public: |
| 140 RecordWriteStub(Isolate* isolate, | 144 RecordWriteStub(Isolate* isolate, |
| 141 Register object, | 145 Register object, |
| 142 Register value, | 146 Register value, |
| 143 Register address, | 147 Register address, |
| 144 RememberedSetAction remembered_set_action, | 148 RememberedSetAction remembered_set_action, |
| 145 SaveFPRegsMode fp_mode) | 149 SaveFPRegsMode fp_mode) |
| 146 : PlatformCodeStub(isolate), | 150 : PlatformCodeStub(isolate), |
| 147 object_(object), | |
| 148 value_(value), | |
| 149 address_(address), | |
| 150 remembered_set_action_(remembered_set_action), | |
| 151 save_fp_regs_mode_(fp_mode), | |
| 152 regs_(object, // An input reg. | 151 regs_(object, // An input reg. |
| 153 address, // An input reg. | 152 address, // An input reg. |
| 154 value) { // One scratch reg. | 153 value) { // One scratch reg. |
| 154 minor_key_ = ObjectBits::encode(object.code()) | |
| 155 ValueBits::encode(value.code()) | |
| 156 AddressBits::encode(address.code()) | |
| 157 RememberedSetActionBits::encode(remembered_set_action) | |
| 158 SaveFPRegsModeBits::encode(fp_mode); |
| 155 } | 159 } |
| 156 | 160 |
| 157 enum Mode { | 161 enum Mode { |
| 158 STORE_BUFFER_ONLY, | 162 STORE_BUFFER_ONLY, |
| 159 INCREMENTAL, | 163 INCREMENTAL, |
| 160 INCREMENTAL_COMPACTION | 164 INCREMENTAL_COMPACTION |
| 161 }; | 165 }; |
| 162 | 166 |
| 163 virtual bool SometimesSetsUpAFrame() { return false; } | 167 virtual bool SometimesSetsUpAFrame() { return false; } |
| 164 | 168 |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 } | 350 } |
| 347 UNREACHABLE(); | 351 UNREACHABLE(); |
| 348 return no_reg; | 352 return no_reg; |
| 349 } | 353 } |
| 350 friend class RecordWriteStub; | 354 friend class RecordWriteStub; |
| 351 }; | 355 }; |
| 352 | 356 |
| 353 enum OnNoNeedToInformIncrementalMarker { | 357 enum OnNoNeedToInformIncrementalMarker { |
| 354 kReturnOnNoNeedToInformIncrementalMarker, | 358 kReturnOnNoNeedToInformIncrementalMarker, |
| 355 kUpdateRememberedSetOnNoNeedToInformIncrementalMarker | 359 kUpdateRememberedSetOnNoNeedToInformIncrementalMarker |
| 356 } | 360 }; |
| 357 ; | 361 |
| 362 Major MajorKey() const { return RecordWrite; } |
| 363 |
| 358 void Generate(MacroAssembler* masm); | 364 void Generate(MacroAssembler* masm); |
| 359 void GenerateIncremental(MacroAssembler* masm, Mode mode); | 365 void GenerateIncremental(MacroAssembler* masm, Mode mode); |
| 360 void CheckNeedsToInformIncrementalMarker( | 366 void CheckNeedsToInformIncrementalMarker( |
| 361 MacroAssembler* masm, | 367 MacroAssembler* masm, |
| 362 OnNoNeedToInformIncrementalMarker on_no_need, | 368 OnNoNeedToInformIncrementalMarker on_no_need, |
| 363 Mode mode); | 369 Mode mode); |
| 364 void InformIncrementalMarker(MacroAssembler* masm); | 370 void InformIncrementalMarker(MacroAssembler* masm); |
| 365 | 371 |
| 366 Major MajorKey() const { return RecordWrite; } | |
| 367 | |
| 368 uint32_t MinorKey() const { | |
| 369 return ObjectBits::encode(object_.code()) | | |
| 370 ValueBits::encode(value_.code()) | | |
| 371 AddressBits::encode(address_.code()) | | |
| 372 RememberedSetActionBits::encode(remembered_set_action_) | | |
| 373 SaveFPRegsModeBits::encode(save_fp_regs_mode_); | |
| 374 } | |
| 375 | |
| 376 void Activate(Code* code) { | 372 void Activate(Code* code) { |
| 377 code->GetHeap()->incremental_marking()->ActivateGeneratedStub(code); | 373 code->GetHeap()->incremental_marking()->ActivateGeneratedStub(code); |
| 378 } | 374 } |
| 379 | 375 |
| 376 Register object() const { |
| 377 return Register::from_code(ObjectBits::decode(minor_key_)); |
| 378 } |
| 379 |
| 380 Register value() const { |
| 381 return Register::from_code(ValueBits::decode(minor_key_)); |
| 382 } |
| 383 |
| 384 Register address() const { |
| 385 return Register::from_code(AddressBits::decode(minor_key_)); |
| 386 } |
| 387 |
| 388 RememberedSetAction remembered_set_action() const { |
| 389 return RememberedSetActionBits::decode(minor_key_); |
| 390 } |
| 391 |
| 392 SaveFPRegsMode save_fp_regs_mode() const { |
| 393 return SaveFPRegsModeBits::decode(minor_key_); |
| 394 } |
| 395 |
| 380 class ObjectBits: public BitField<int, 0, 3> {}; | 396 class ObjectBits: public BitField<int, 0, 3> {}; |
| 381 class ValueBits: public BitField<int, 3, 3> {}; | 397 class ValueBits: public BitField<int, 3, 3> {}; |
| 382 class AddressBits: public BitField<int, 6, 3> {}; | 398 class AddressBits: public BitField<int, 6, 3> {}; |
| 383 class RememberedSetActionBits: public BitField<RememberedSetAction, 9, 1> {}; | 399 class RememberedSetActionBits: public BitField<RememberedSetAction, 9, 1> {}; |
| 384 class SaveFPRegsModeBits: public BitField<SaveFPRegsMode, 10, 1> {}; | 400 class SaveFPRegsModeBits: public BitField<SaveFPRegsMode, 10, 1> {}; |
| 385 | 401 |
| 386 Register object_; | |
| 387 Register value_; | |
| 388 Register address_; | |
| 389 RememberedSetAction remembered_set_action_; | |
| 390 SaveFPRegsMode save_fp_regs_mode_; | |
| 391 RegisterAllocation regs_; | 402 RegisterAllocation regs_; |
| 403 |
| 404 DISALLOW_COPY_AND_ASSIGN(RecordWriteStub); |
| 392 }; | 405 }; |
| 393 | 406 |
| 394 | 407 |
| 395 } } // namespace v8::internal | 408 } } // namespace v8::internal |
| 396 | 409 |
| 397 #endif // V8_IA32_CODE_STUBS_IA32_H_ | 410 #endif // V8_IA32_CODE_STUBS_IA32_H_ |
| OLD | NEW |