diff options
Diffstat (limited to 'deps/v8/src/x64/code-stubs-x64.h')
-rw-r--r-- | deps/v8/src/x64/code-stubs-x64.h | 300 |
1 files changed, 0 insertions, 300 deletions
diff --git a/deps/v8/src/x64/code-stubs-x64.h b/deps/v8/src/x64/code-stubs-x64.h deleted file mode 100644 index bba64fcb4a..0000000000 --- a/deps/v8/src/x64/code-stubs-x64.h +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright 2011 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8_X64_CODE_STUBS_X64_H_ -#define V8_X64_CODE_STUBS_X64_H_ - -namespace v8 { -namespace internal { - - -class StringHelper : public AllStatic { - public: - // Compares two flat one-byte strings and returns result in rax. - static void GenerateCompareFlatOneByteStrings( - MacroAssembler* masm, Register left, Register right, Register scratch1, - Register scratch2, Register scratch3, Register scratch4); - - // Compares two flat one-byte strings for equality and returns result in rax. - static void GenerateFlatOneByteStringEquals(MacroAssembler* masm, - Register left, Register right, - Register scratch1, - Register scratch2); - - private: - static void GenerateOneByteCharsCompareLoop( - MacroAssembler* masm, Register left, Register right, Register length, - Register scratch, Label* chars_not_equal, - Label::Distance near_jump = Label::kFar); - - DISALLOW_IMPLICIT_CONSTRUCTORS(StringHelper); -}; - - -class NameDictionaryLookupStub: public PlatformCodeStub { - public: - enum LookupMode { POSITIVE_LOOKUP, NEGATIVE_LOOKUP }; - - NameDictionaryLookupStub(Isolate* isolate, Register dictionary, - Register result, Register index, LookupMode mode) - : PlatformCodeStub(isolate) { - minor_key_ = DictionaryBits::encode(dictionary.code()) | - ResultBits::encode(result.code()) | - IndexBits::encode(index.code()) | LookupModeBits::encode(mode); - } - - static void GenerateNegativeLookup(MacroAssembler* masm, - Label* miss, - Label* done, - Register properties, - Handle<Name> name, - Register r0); - - bool SometimesSetsUpAFrame() override { return false; } - - private: - static const int kInlinedProbes = 4; - static const int kTotalProbes = 20; - - static const int kCapacityOffset = - NameDictionary::kHeaderSize + - NameDictionary::kCapacityIndex * kPointerSize; - - static const int kElementsStartOffset = - NameDictionary::kHeaderSize + - NameDictionary::kElementsStartIndex * kPointerSize; - - Register dictionary() const { - return Register::from_code(DictionaryBits::decode(minor_key_)); - } - - Register result() const { - return Register::from_code(ResultBits::decode(minor_key_)); - } - - Register index() const { - return Register::from_code(IndexBits::decode(minor_key_)); - } - - LookupMode mode() const { return LookupModeBits::decode(minor_key_); } - - class DictionaryBits: public BitField<int, 0, 4> {}; - class ResultBits: public BitField<int, 4, 4> {}; - class IndexBits: public BitField<int, 8, 4> {}; - class LookupModeBits: public BitField<LookupMode, 12, 1> {}; - - DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); - DEFINE_PLATFORM_CODE_STUB(NameDictionaryLookup, PlatformCodeStub); -}; - - -class RecordWriteStub: public PlatformCodeStub { - public: - RecordWriteStub(Isolate* isolate, Register object, Register value, - Register address, RememberedSetAction remembered_set_action, - SaveFPRegsMode fp_mode) - : PlatformCodeStub(isolate), - regs_(object, // An input reg. - address, // An input reg. - value) { // One scratch reg. - minor_key_ = ObjectBits::encode(object.code()) | - ValueBits::encode(value.code()) | - AddressBits::encode(address.code()) | - RememberedSetActionBits::encode(remembered_set_action) | - SaveFPRegsModeBits::encode(fp_mode); - } - - RecordWriteStub(uint32_t key, Isolate* isolate) - : PlatformCodeStub(key, isolate), regs_(object(), address(), value()) {} - - enum Mode { - STORE_BUFFER_ONLY, - INCREMENTAL, - INCREMENTAL_COMPACTION - }; - - bool SometimesSetsUpAFrame() override { return false; } - - static const byte kTwoByteNopInstruction = 0x3c; // Cmpb al, #imm8. - static const byte kTwoByteJumpInstruction = 0xeb; // Jmp #imm8. - - static Mode GetMode(Code* stub); - - static void Patch(Code* stub, Mode mode); - - DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); - - private: - // This is a helper class for freeing up 3 scratch registers, where the third - // is always rcx (needed for shift operations). The input is two registers - // that must be preserved and one scratch register provided by the caller. - class RegisterAllocation { - public: - RegisterAllocation(Register object, Register address, Register scratch0) - : object_orig_(object), - address_orig_(address), - scratch0_orig_(scratch0), - object_(object), - address_(address), - scratch0_(scratch0), - scratch1_(no_reg) { - DCHECK(!AreAliased(scratch0, object, address, no_reg)); - scratch1_ = GetRegThatIsNotRcxOr(object_, address_, scratch0_); - if (scratch0 == rcx) { - scratch0_ = GetRegThatIsNotRcxOr(object_, address_, scratch1_); - } - if (object == rcx) { - object_ = GetRegThatIsNotRcxOr(address_, scratch0_, scratch1_); - } - if (address == rcx) { - address_ = GetRegThatIsNotRcxOr(object_, scratch0_, scratch1_); - } - DCHECK(!AreAliased(scratch0_, object_, address_, rcx)); - } - - void Save(MacroAssembler* masm) { - DCHECK(address_orig_ != object_); - DCHECK(object_ == object_orig_ || address_ == address_orig_); - DCHECK(!AreAliased(object_, address_, scratch1_, scratch0_)); - DCHECK(!AreAliased(object_orig_, address_, scratch1_, scratch0_)); - DCHECK(!AreAliased(object_, address_orig_, scratch1_, scratch0_)); - // We don't have to save scratch0_orig_ because it was given to us as - // a scratch register. But if we had to switch to a different reg then - // we should save the new scratch0_. - if (scratch0_ != scratch0_orig_) masm->Push(scratch0_); - if (rcx != scratch0_orig_ && rcx != object_orig_ && - rcx != address_orig_) { - masm->Push(rcx); - } - masm->Push(scratch1_); - if (address_ != address_orig_) { - masm->Push(address_); - masm->movp(address_, address_orig_); - } - if (object_ != object_orig_) { - masm->Push(object_); - masm->movp(object_, object_orig_); - } - } - - void Restore(MacroAssembler* masm) { - // These will have been preserved the entire time, so we just need to move - // them back. Only in one case is the orig_ reg different from the plain - // one, since only one of them can alias with rcx. - if (object_ != object_orig_) { - masm->movp(object_orig_, object_); - masm->Pop(object_); - } - if (address_ != address_orig_) { - masm->movp(address_orig_, address_); - masm->Pop(address_); - } - masm->Pop(scratch1_); - if (rcx != scratch0_orig_ && rcx != object_orig_ && - rcx != address_orig_) { - masm->Pop(rcx); - } - if (scratch0_ != scratch0_orig_) masm->Pop(scratch0_); - } - - // If we have to call into C then we need to save and restore all caller- - // saved registers that were not already preserved. - - // The three scratch registers (incl. rcx) will be restored by other means - // so we don't bother pushing them here. Rbx, rbp and r12-15 are callee - // save and don't need to be preserved. - void SaveCallerSaveRegisters(MacroAssembler* masm, SaveFPRegsMode mode) { - masm->PushCallerSaved(mode, scratch0_, scratch1_, rcx); - } - - inline void RestoreCallerSaveRegisters(MacroAssembler*masm, - SaveFPRegsMode mode) { - masm->PopCallerSaved(mode, scratch0_, scratch1_, rcx); - } - - inline Register object() { return object_; } - inline Register address() { return address_; } - inline Register scratch0() { return scratch0_; } - inline Register scratch1() { return scratch1_; } - - private: - Register object_orig_; - Register address_orig_; - Register scratch0_orig_; - Register object_; - Register address_; - Register scratch0_; - Register scratch1_; - // Third scratch register is always rcx. - - Register GetRegThatIsNotRcxOr(Register r1, - Register r2, - Register r3) { - for (int i = 0; i < Register::kNumRegisters; i++) { - if (RegisterConfiguration::Default()->IsAllocatableGeneralCode(i)) { - Register candidate = Register::from_code(i); - if (candidate != rcx && candidate != r1 && candidate != r2 && - candidate != r3) { - return candidate; - } - } - } - UNREACHABLE(); - } - friend class RecordWriteStub; - }; - - enum OnNoNeedToInformIncrementalMarker { - kReturnOnNoNeedToInformIncrementalMarker, - kUpdateRememberedSetOnNoNeedToInformIncrementalMarker - }; - - Major MajorKey() const final { return RecordWrite; } - - void Generate(MacroAssembler* masm) override; - void GenerateIncremental(MacroAssembler* masm, Label* second_instr); - void CheckNeedsToInformIncrementalMarker( - MacroAssembler* masm, OnNoNeedToInformIncrementalMarker on_no_need, - Label* second_instr); - void InformIncrementalMarker(MacroAssembler* masm); - - void Activate(Code* code) override; - - Register object() const { - return Register::from_code(ObjectBits::decode(minor_key_)); - } - - Register value() const { - return Register::from_code(ValueBits::decode(minor_key_)); - } - - Register address() const { - return Register::from_code(AddressBits::decode(minor_key_)); - } - - RememberedSetAction remembered_set_action() const { - return RememberedSetActionBits::decode(minor_key_); - } - - SaveFPRegsMode save_fp_regs_mode() const { - return SaveFPRegsModeBits::decode(minor_key_); - } - - class ObjectBits: public BitField<int, 0, 4> {}; - class ValueBits: public BitField<int, 4, 4> {}; - class AddressBits: public BitField<int, 8, 4> {}; - class RememberedSetActionBits: public BitField<RememberedSetAction, 12, 1> {}; - class SaveFPRegsModeBits: public BitField<SaveFPRegsMode, 13, 1> {}; - - Label slow_; - RegisterAllocation regs_; - - DISALLOW_COPY_AND_ASSIGN(RecordWriteStub); -}; - - -} // namespace internal -} // namespace v8 - -#endif // V8_X64_CODE_STUBS_X64_H_ |