Index: src/x64/macro-assembler-x64.h |
diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h |
index 9653e1c94e82da41cafe2ccb6a6af5737bfc7b91..eb1f42d244b35deec43fa8225e2beb9ec4a84150 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 |
@@ -634,9 +675,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; |
@@ -1024,6 +1063,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. |