| 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_X64_CODE_STUBS_X64_H_ | 5 #ifndef V8_X64_CODE_STUBS_X64_H_ |
| 6 #define V8_X64_CODE_STUBS_X64_H_ | 6 #define V8_X64_CODE_STUBS_X64_H_ |
| 7 | 7 |
| 8 #include "src/code-stubs.h" | |
| 9 | |
| 10 namespace v8 { | 8 namespace v8 { |
| 11 namespace internal { | 9 namespace internal { |
| 12 | 10 |
| 13 | 11 |
| 14 void ArrayNativeCode(MacroAssembler* masm, Label* call_generic_code); | 12 void ArrayNativeCode(MacroAssembler* masm, Label* call_generic_code); |
| 15 | 13 |
| 16 | 14 |
| 17 class StringHelper : public AllStatic { | 15 class StringHelper : public AllStatic { |
| 18 public: | 16 public: |
| 19 // Generate code for copying characters using the rep movs instruction. | 17 // Generate code for copying characters using the rep movs instruction. |
| 20 // Copies rcx characters from rsi to rdi. Copying of overlapping regions is | 18 // Copies rcx characters from rsi to rdi. Copying of overlapping regions is |
| 21 // not supported. | 19 // not supported. |
| 22 static void GenerateCopyCharacters(MacroAssembler* masm, | 20 static void GenerateCopyCharacters(MacroAssembler* masm, |
| 23 Register dest, | 21 Register dest, |
| 24 Register src, | 22 Register src, |
| 25 Register count, | 23 Register count, |
| 26 String::Encoding encoding); | 24 String::Encoding encoding); |
| 27 | 25 |
| 28 | |
| 29 // Generate string hash. | 26 // Generate string hash. |
| 30 static void GenerateHashInit(MacroAssembler* masm, | 27 static void GenerateHashInit(MacroAssembler* masm, |
| 31 Register hash, | 28 Register hash, |
| 32 Register character, | 29 Register character, |
| 33 Register scratch); | 30 Register scratch); |
| 34 | 31 |
| 35 static void GenerateHashAddCharacter(MacroAssembler* masm, | 32 static void GenerateHashAddCharacter(MacroAssembler* masm, |
| 36 Register hash, | 33 Register hash, |
| 37 Register character, | 34 Register character, |
| 38 Register scratch); | 35 Register scratch); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 static const int kTotalProbes = 20; | 100 static const int kTotalProbes = 20; |
| 104 | 101 |
| 105 static const int kCapacityOffset = | 102 static const int kCapacityOffset = |
| 106 NameDictionary::kHeaderSize + | 103 NameDictionary::kHeaderSize + |
| 107 NameDictionary::kCapacityIndex * kPointerSize; | 104 NameDictionary::kCapacityIndex * kPointerSize; |
| 108 | 105 |
| 109 static const int kElementsStartOffset = | 106 static const int kElementsStartOffset = |
| 110 NameDictionary::kHeaderSize + | 107 NameDictionary::kHeaderSize + |
| 111 NameDictionary::kElementsStartIndex * kPointerSize; | 108 NameDictionary::kElementsStartIndex * kPointerSize; |
| 112 | 109 |
| 113 virtual inline Major MajorKey() const FINAL OVERRIDE; | |
| 114 | |
| 115 Register dictionary() const { | 110 Register dictionary() const { |
| 116 return Register::from_code(DictionaryBits::decode(minor_key_)); | 111 return Register::from_code(DictionaryBits::decode(minor_key_)); |
| 117 } | 112 } |
| 118 | 113 |
| 119 Register result() const { | 114 Register result() const { |
| 120 return Register::from_code(ResultBits::decode(minor_key_)); | 115 return Register::from_code(ResultBits::decode(minor_key_)); |
| 121 } | 116 } |
| 122 | 117 |
| 123 Register index() const { | 118 Register index() const { |
| 124 return Register::from_code(IndexBits::decode(minor_key_)); | 119 return Register::from_code(IndexBits::decode(minor_key_)); |
| 125 } | 120 } |
| 126 | 121 |
| 127 LookupMode mode() const { return LookupModeBits::decode(minor_key_); } | 122 LookupMode mode() const { return LookupModeBits::decode(minor_key_); } |
| 128 | 123 |
| 129 class DictionaryBits: public BitField<int, 0, 4> {}; | 124 class DictionaryBits: public BitField<int, 0, 4> {}; |
| 130 class ResultBits: public BitField<int, 4, 4> {}; | 125 class ResultBits: public BitField<int, 4, 4> {}; |
| 131 class IndexBits: public BitField<int, 8, 4> {}; | 126 class IndexBits: public BitField<int, 8, 4> {}; |
| 132 class LookupModeBits: public BitField<LookupMode, 12, 1> {}; | 127 class LookupModeBits: public BitField<LookupMode, 12, 1> {}; |
| 133 | 128 |
| 134 DISALLOW_COPY_AND_ASSIGN(NameDictionaryLookupStub); | 129 DEFINE_CODE_STUB(NameDictionaryLookup, PlatformCodeStub); |
| 135 }; | 130 }; |
| 136 | 131 |
| 137 | 132 |
| 138 class RecordWriteStub: public PlatformCodeStub { | 133 class RecordWriteStub: public PlatformCodeStub { |
| 139 public: | 134 public: |
| 140 RecordWriteStub(Isolate* isolate, Register object, Register value, | 135 RecordWriteStub(Isolate* isolate, Register object, Register value, |
| 141 Register address, RememberedSetAction remembered_set_action, | 136 Register address, RememberedSetAction remembered_set_action, |
| 142 SaveFPRegsMode fp_mode) | 137 SaveFPRegsMode fp_mode) |
| 143 : PlatformCodeStub(isolate), | 138 : PlatformCodeStub(isolate), |
| 144 regs_(object, // An input reg. | 139 regs_(object, // An input reg. |
| 145 address, // An input reg. | 140 address, // An input reg. |
| 146 value) { // One scratch reg. | 141 value) { // One scratch reg. |
| 147 minor_key_ = ObjectBits::encode(object.code()) | | 142 minor_key_ = ObjectBits::encode(object.code()) | |
| 148 ValueBits::encode(value.code()) | | 143 ValueBits::encode(value.code()) | |
| 149 AddressBits::encode(address.code()) | | 144 AddressBits::encode(address.code()) | |
| 150 RememberedSetActionBits::encode(remembered_set_action) | | 145 RememberedSetActionBits::encode(remembered_set_action) | |
| 151 SaveFPRegsModeBits::encode(fp_mode); | 146 SaveFPRegsModeBits::encode(fp_mode); |
| 152 } | 147 } |
| 153 | 148 |
| 149 RecordWriteStub(uint32_t key, Isolate* isolate) |
| 150 : PlatformCodeStub(key, isolate), regs_(object(), address(), value()) {} |
| 151 |
| 154 enum Mode { | 152 enum Mode { |
| 155 STORE_BUFFER_ONLY, | 153 STORE_BUFFER_ONLY, |
| 156 INCREMENTAL, | 154 INCREMENTAL, |
| 157 INCREMENTAL_COMPACTION | 155 INCREMENTAL_COMPACTION |
| 158 }; | 156 }; |
| 159 | 157 |
| 160 virtual bool SometimesSetsUpAFrame() { return false; } | 158 virtual bool SometimesSetsUpAFrame() { return false; } |
| 161 | 159 |
| 162 static const byte kTwoByteNopInstruction = 0x3c; // Cmpb al, #imm8. | 160 static const byte kTwoByteNopInstruction = 0x3c; // Cmpb al, #imm8. |
| 163 static const byte kTwoByteJumpInstruction = 0xeb; // Jmp #imm8. | 161 static const byte kTwoByteJumpInstruction = 0xeb; // Jmp #imm8. |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 return no_reg; | 325 return no_reg; |
| 328 } | 326 } |
| 329 friend class RecordWriteStub; | 327 friend class RecordWriteStub; |
| 330 }; | 328 }; |
| 331 | 329 |
| 332 enum OnNoNeedToInformIncrementalMarker { | 330 enum OnNoNeedToInformIncrementalMarker { |
| 333 kReturnOnNoNeedToInformIncrementalMarker, | 331 kReturnOnNoNeedToInformIncrementalMarker, |
| 334 kUpdateRememberedSetOnNoNeedToInformIncrementalMarker | 332 kUpdateRememberedSetOnNoNeedToInformIncrementalMarker |
| 335 }; | 333 }; |
| 336 | 334 |
| 337 virtual inline Major MajorKey() const FINAL OVERRIDE; | 335 virtual Major MajorKey() const FINAL OVERRIDE { return RecordWrite; } |
| 338 | 336 |
| 339 void Generate(MacroAssembler* masm); | 337 void Generate(MacroAssembler* masm); |
| 340 void GenerateIncremental(MacroAssembler* masm, Mode mode); | 338 void GenerateIncremental(MacroAssembler* masm, Mode mode); |
| 341 void CheckNeedsToInformIncrementalMarker( | 339 void CheckNeedsToInformIncrementalMarker( |
| 342 MacroAssembler* masm, | 340 MacroAssembler* masm, |
| 343 OnNoNeedToInformIncrementalMarker on_no_need, | 341 OnNoNeedToInformIncrementalMarker on_no_need, |
| 344 Mode mode); | 342 Mode mode); |
| 345 void InformIncrementalMarker(MacroAssembler* masm); | 343 void InformIncrementalMarker(MacroAssembler* masm); |
| 346 | 344 |
| 347 void Activate(Code* code) { | 345 void Activate(Code* code) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 377 Label slow_; | 375 Label slow_; |
| 378 RegisterAllocation regs_; | 376 RegisterAllocation regs_; |
| 379 | 377 |
| 380 DISALLOW_COPY_AND_ASSIGN(RecordWriteStub); | 378 DISALLOW_COPY_AND_ASSIGN(RecordWriteStub); |
| 381 }; | 379 }; |
| 382 | 380 |
| 383 | 381 |
| 384 } } // namespace v8::internal | 382 } } // namespace v8::internal |
| 385 | 383 |
| 386 #endif // V8_X64_CODE_STUBS_X64_H_ | 384 #endif // V8_X64_CODE_STUBS_X64_H_ |
| OLD | NEW |