| Index: src/x64/macro-assembler-x64.h
|
| diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h
|
| index b7bd0392bbd0fe251132bf6df84734ac8ba129bb..24f90fa1a26a206268303d7dc0140f0241b38daf 100644
|
| --- a/src/x64/macro-assembler-x64.h
|
| +++ b/src/x64/macro-assembler-x64.h
|
| @@ -76,7 +76,49 @@ class MacroAssembler: public Assembler {
|
| public:
|
| MacroAssembler(void* buffer, int size);
|
|
|
| + // Prevent the use of the RootArray during the lifetime of this
|
| + // scope object.
|
| + class NoRootArrayScope BASE_EMBEDDED {
|
| + public:
|
| + explicit NoRootArrayScope(MacroAssembler* assembler)
|
| + : variable_(&assembler->root_array_available_),
|
| + old_value_(assembler->root_array_available_) {
|
| + assembler->root_array_available_ = false;
|
| + }
|
| + ~NoRootArrayScope() {
|
| + *variable_ = old_value_;
|
| + }
|
| + private:
|
| + bool* variable_;
|
| + bool old_value_;
|
| + };
|
| +
|
| + // Operand pointing to an external reference.
|
| + // May emit code to set up the scratch register. The operand is
|
| + // only guaranteed to be correct as long as the scratch register
|
| + // isn't changed.
|
| + // If the operand is used more than once, use a scratch register
|
| + // that is guaranteed not to be clobbered.
|
| + Operand ExternalOperand(ExternalReference reference,
|
| + Register scratch = kScratchRegister);
|
| + // Loads and stores the value of an external reference.
|
| + // Special case code for load and store to take advantage of
|
| + // load_rax/store_rax if possible/necessary.
|
| + // For other operations, just use:
|
| + // Operand operand = ExternalOperand(extref);
|
| + // operation(operand, ..);
|
| + void Load(Register destination, ExternalReference source);
|
| + void Store(ExternalReference destination, Register source);
|
| + // Loads the address of the external reference into the destination
|
| + // register.
|
| + void LoadAddress(Register destination, ExternalReference source);
|
| + // Returns the size of the code generated by LoadAddress.
|
| + // Used by CallSize(ExternalReference) to find the size of a call.
|
| + int LoadAddressSize(ExternalReference source);
|
| +
|
| + // Operations on roots in the root-array.
|
| void LoadRoot(Register destination, Heap::RootListIndex index);
|
| + void StoreRoot(Register source, Heap::RootListIndex index);
|
| // Load a root value where the index (or part of it) is variable.
|
| // The variable_offset register is added to the fixed_offset value
|
| // to get the index into the root-array.
|
| @@ -86,7 +128,6 @@ class MacroAssembler: public Assembler {
|
| void CompareRoot(Register with, Heap::RootListIndex index);
|
| void CompareRoot(const Operand& with, Heap::RootListIndex index);
|
| void PushRoot(Heap::RootListIndex index);
|
| - void StoreRoot(Register source, Heap::RootListIndex index);
|
|
|
| // ---------------------------------------------------------------------------
|
| // GC Support
|
| @@ -633,9 +674,7 @@ class MacroAssembler: public Assembler {
|
| int CallSize(Address destination, RelocInfo::Mode rmode) {
|
| return kCallInstructionLength;
|
| }
|
| - int CallSize(ExternalReference ext) {
|
| - return kCallInstructionLength;
|
| - }
|
| + int CallSize(ExternalReference ext);
|
| int CallSize(Handle<Code> code_object) {
|
| // Code calls use 32-bit relative addressing.
|
| return kShortCallInstructionLength;
|
| @@ -1023,6 +1062,7 @@ class MacroAssembler: public Assembler {
|
|
|
| bool generating_stub_;
|
| bool allow_stub_calls_;
|
| + bool root_array_available_;
|
|
|
| // Returns a register holding the smi value. The register MUST NOT be
|
| // modified. It may be the "smi 1 constant" register.
|
|
|