diff options
author | Ali Ijaz Sheikh <ofrobots@google.com> | 2016-03-01 08:58:05 -0800 |
---|---|---|
committer | Ali Sheikh <ofrobots@lemonhope.roam.corp.google.com> | 2016-03-03 20:35:20 -0800 |
commit | 069e02ab47656b3efd1b6829c65856b2e1c2d1db (patch) | |
tree | eb643e0a2e88fd64bb9fc927423458d2ae96c2db /deps/v8/src/mips/macro-assembler-mips.h | |
parent | 8938355398c79f583a468284b768652d12ba9bc9 (diff) | |
download | node-new-069e02ab47656b3efd1b6829c65856b2e1c2d1db.tar.gz |
deps: upgrade to V8 4.9.385.18
Pick up the current branch head for V8 4.9
https://github.com/v8/v8/commit/1ecba0f
PR-URL: https://github.com/nodejs/node/pull/4722
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Michaƫl Zasso <mic.besace@gmail.com>
Diffstat (limited to 'deps/v8/src/mips/macro-assembler-mips.h')
-rw-r--r-- | deps/v8/src/mips/macro-assembler-mips.h | 209 |
1 files changed, 102 insertions, 107 deletions
diff --git a/deps/v8/src/mips/macro-assembler-mips.h b/deps/v8/src/mips/macro-assembler-mips.h index 8890be8131..4f6a3c868b 100644 --- a/deps/v8/src/mips/macro-assembler-mips.h +++ b/deps/v8/src/mips/macro-assembler-mips.h @@ -23,6 +23,7 @@ const Register kInterpreterBytecodeOffsetRegister = {Register::kCode_t4}; const Register kInterpreterBytecodeArrayRegister = {Register::kCode_t5}; const Register kInterpreterDispatchTableRegister = {Register::kCode_t6}; const Register kJavaScriptCallArgCountRegister = {Register::kCode_a0}; +const Register kJavaScriptCallNewTargetRegister = {Register::kCode_a3}; const Register kRuntimeCallFunctionRegister = {Register::kCode_a1}; const Register kRuntimeCallArgCountRegister = {Register::kCode_a0}; @@ -98,26 +99,23 @@ Register GetRegisterThatIsNotOneOf(Register reg1, Register reg5 = no_reg, Register reg6 = no_reg); -bool AreAliased(Register reg1, - Register reg2, - Register reg3 = no_reg, - Register reg4 = no_reg, - Register reg5 = no_reg, - Register reg6 = no_reg, - Register reg7 = no_reg, - Register reg8 = no_reg); +bool AreAliased(Register reg1, Register reg2, Register reg3 = no_reg, + Register reg4 = no_reg, Register reg5 = no_reg, + Register reg6 = no_reg, Register reg7 = no_reg, + Register reg8 = no_reg, Register reg9 = no_reg, + Register reg10 = no_reg); // ----------------------------------------------------------------------------- // Static helper functions. -inline MemOperand ContextOperand(Register context, int index) { +inline MemOperand ContextMemOperand(Register context, int index) { return MemOperand(context, Context::SlotOffset(index)); } -inline MemOperand GlobalObjectOperand() { - return ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX); +inline MemOperand NativeContextMemOperand() { + return ContextMemOperand(cp, Context::NATIVE_CONTEXT_INDEX); } @@ -140,11 +138,8 @@ inline MemOperand CFunctionArgumentOperand(int index) { // MacroAssembler implements a collection of frequently used macros. class MacroAssembler: public Assembler { public: - // The isolate parameter can be NULL if the macro assembler should - // not use isolate-dependent functionality. In this case, it's the - // responsibility of the caller to never invoke such function on the - // macro assembler. - MacroAssembler(Isolate* isolate, void* buffer, int size); + MacroAssembler(Isolate* isolate, void* buffer, int size, + CodeObjectRequired create_code_object); // Arguments macros. #define COND_TYPED_ARGS Condition cond, Register r1, const Operand& r2 @@ -386,22 +381,10 @@ class MacroAssembler: public Assembler { Register scratch1, Label* on_black); - // Checks the color of an object. If the object is already grey or black - // then we just fall through, since it is already live. If it is white and - // we can determine that it doesn't need to be scanned, then we just mark it - // black and fall through. For the rest we jump to the label so the - // incremental marker can fix its assumptions. - void EnsureNotWhite(Register object, - Register scratch1, - Register scratch2, - Register scratch3, - Label* object_is_white_and_not_data); - - // Detects conservatively whether an object is data-only, i.e. it does need to - // be scanned by the garbage collector. - void JumpIfDataObject(Register value, - Register scratch, - Label* not_data_object); + // Checks the color of an object. If the object is white we jump to the + // incremental marker. + void JumpIfWhite(Register value, Register scratch1, Register scratch2, + Register scratch3, Label* value_is_white); // Notify the garbage collector that we wrote a pointer into an object. // |object| is the object being stored into, |value| is the object being @@ -538,12 +521,8 @@ class MacroAssembler: public Assembler { Label* gc_required, AllocationFlags flags); - void Allocate(Register object_size, - Register result, - Register scratch1, - Register scratch2, - Label* gc_required, - AllocationFlags flags); + void Allocate(Register object_size, Register result, Register result_new, + Register scratch, Label* gc_required, AllocationFlags flags); void AllocateTwoByteString(Register result, Register length, @@ -587,6 +566,12 @@ class MacroAssembler: public Assembler { Register scratch2, Label* gc_required); + // Allocate and initialize a JSValue wrapper with the specified {constructor} + // and {value}. + void AllocateJSValue(Register result, Register constructor, Register value, + Register scratch1, Register scratch2, + Label* gc_required); + // --------------------------------------------------------------------------- // Instruction macros. @@ -648,7 +633,10 @@ class MacroAssembler: public Assembler { #undef DEFINE_INSTRUCTION #undef DEFINE_INSTRUCTION2 +#undef DEFINE_INSTRUCTION3 + void Lsa(Register rd, Register rs, Register rt, uint8_t sa, + Register scratch = at); void Pref(int32_t hint, const MemOperand& rs); @@ -781,7 +769,6 @@ class MacroAssembler: public Assembler { // FPU macros. These do not handle special cases like NaN or +- inf. // Convert unsigned word to double. - void Cvt_d_uw(FPURegister fd, FPURegister fs, FPURegister scratch); void Cvt_d_uw(FPURegister fd, Register rs, FPURegister scratch); // Convert double to unsigned word. @@ -941,8 +928,15 @@ class MacroAssembler: public Assembler { void LoadContext(Register dst, int context_chain_length); + // Load the global object from the current context. + void LoadGlobalObject(Register dst) { + LoadNativeContextSlot(Context::EXTENSION_INDEX, dst); + } + // Load the global proxy from the current context. - void LoadGlobalProxy(Register dst); + void LoadGlobalProxy(Register dst) { + LoadNativeContextSlot(Context::GLOBAL_PROXY_INDEX, dst); + } // Conditionally load the cached Array transitioned map of type // transitioned_kind from the native context if the map in register @@ -955,7 +949,7 @@ class MacroAssembler: public Assembler { Register scratch, Label* no_map_match); - void LoadGlobalFunction(int index, Register function); + void LoadNativeContextSlot(int index, Register dst); // Load the initial map from the global function. The registers // function and map can be the same, function is then overwritten. @@ -973,15 +967,20 @@ class MacroAssembler: public Assembler { // JavaScript invokes. // Invoke the JavaScript function code by either calling or jumping. - void InvokeCode(Register code, - const ParameterCount& expected, - const ParameterCount& actual, - InvokeFlag flag, - const CallWrapper& call_wrapper); + + void InvokeFunctionCode(Register function, Register new_target, + const ParameterCount& expected, + const ParameterCount& actual, InvokeFlag flag, + const CallWrapper& call_wrapper); + + void FloodFunctionIfStepping(Register fun, Register new_target, + const ParameterCount& expected, + const ParameterCount& actual); // Invoke the JavaScript function in the given register. Changes the // current context to the context in the function before invoking. void InvokeFunction(Register function, + Register new_target, const ParameterCount& actual, InvokeFlag flag, const CallWrapper& call_wrapper); @@ -1021,9 +1020,6 @@ class MacroAssembler: public Assembler { // Must preserve the result register. void PopStackHandler(); - // Copies a fixed number of fields of heap objects from src to dst. - void CopyFields(Register dst, Register src, RegList temps, int field_count); - // Copies a number of bytes from src to dst. All registers are clobbered. On // exit src and dst will point to the place just after where the last byte was // read or written and length will be zero. @@ -1032,12 +1028,11 @@ class MacroAssembler: public Assembler { Register length, Register scratch); - // Initialize fields with filler values. Fields starting at |start_offset| - // not including end_offset are overwritten with the value in |filler|. At - // the end the loop, |start_offset| takes the value of |end_offset|. - void InitializeFieldsWithFiller(Register start_offset, - Register end_offset, - Register filler); + // Initialize fields with filler values. Fields starting at |current_address| + // not including |end_address| are overwritten with the value in |filler|. At + // the end the loop, |current_address| takes the value of |end_address|. + void InitializeFieldsWithFiller(Register current_address, + Register end_address, Register filler); // ------------------------------------------------------------------------- // Support functions. @@ -1187,45 +1182,42 @@ class MacroAssembler: public Assembler { // Usage: first call the appropriate arithmetic function, then call one of the // jump functions with the overflow_dst register as the second parameter. - void AdduAndCheckForOverflow(Register dst, - Register left, - Register right, - Register overflow_dst, - Register scratch = at); + inline void AddBranchOvf(Register dst, Register left, const Operand& right, + Label* overflow_label, Register scratch = at) { + AddBranchOvf(dst, left, right, overflow_label, nullptr, scratch); + } - void AdduAndCheckForOverflow(Register dst, Register left, - const Operand& right, Register overflow_dst, - Register scratch = at); + inline void AddBranchNoOvf(Register dst, Register left, const Operand& right, + Label* no_overflow_label, Register scratch = at) { + AddBranchOvf(dst, left, right, nullptr, no_overflow_label, scratch); + } - void SubuAndCheckForOverflow(Register dst, - Register left, - Register right, - Register overflow_dst, - Register scratch = at); + void AddBranchOvf(Register dst, Register left, const Operand& right, + Label* overflow_label, Label* no_overflow_label, + Register scratch = at); - void SubuAndCheckForOverflow(Register dst, Register left, - const Operand& right, Register overflow_dst, - Register scratch = at); + void AddBranchOvf(Register dst, Register left, Register right, + Label* overflow_label, Label* no_overflow_label, + Register scratch = at); - void BranchOnOverflow(Label* label, - Register overflow_check, - BranchDelaySlot bd = PROTECT) { - Branch(label, lt, overflow_check, Operand(zero_reg), bd); - } - void BranchOnNoOverflow(Label* label, - Register overflow_check, - BranchDelaySlot bd = PROTECT) { - Branch(label, ge, overflow_check, Operand(zero_reg), bd); + inline void SubBranchOvf(Register dst, Register left, const Operand& right, + Label* overflow_label, Register scratch = at) { + SubBranchOvf(dst, left, right, overflow_label, nullptr, scratch); } - void RetOnOverflow(Register overflow_check, BranchDelaySlot bd = PROTECT) { - Ret(lt, overflow_check, Operand(zero_reg), bd); + inline void SubBranchNoOvf(Register dst, Register left, const Operand& right, + Label* no_overflow_label, Register scratch = at) { + SubBranchOvf(dst, left, right, nullptr, no_overflow_label, scratch); } - void RetOnNoOverflow(Register overflow_check, BranchDelaySlot bd = PROTECT) { - Ret(ge, overflow_check, Operand(zero_reg), bd); - } + void SubBranchOvf(Register dst, Register left, const Operand& right, + Label* overflow_label, Label* no_overflow_label, + Register scratch = at); + + void SubBranchOvf(Register dst, Register left, Register right, + Label* overflow_label, Label* no_overflow_label, + Register scratch = at); // ------------------------------------------------------------------------- // Runtime calls. @@ -1262,6 +1254,14 @@ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT } // Convenience function: Same as above, but takes the fid instead. + void CallRuntime(Runtime::FunctionId fid, + SaveFPRegsMode save_doubles = kDontSaveFPRegs, + BranchDelaySlot bd = PROTECT) { + const Runtime::Function* function = Runtime::FunctionForId(fid); + CallRuntime(function, function->nargs, save_doubles, bd); + } + + // Convenience function: Same as above, but takes the fid instead. void CallRuntime(Runtime::FunctionId id, int num_arguments, SaveFPRegsMode save_doubles = kDontSaveFPRegs, BranchDelaySlot bd = PROTECT) { @@ -1273,17 +1273,9 @@ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT int num_arguments, BranchDelaySlot bd = PROTECT); - // Tail call of a runtime routine (jump). - // Like JumpToExternalReference, but also takes care of passing the number - // of parameters. - void TailCallExternalReference(const ExternalReference& ext, - int num_arguments, - int result_size); // Convenience function: tail call a runtime routine (jump). - void TailCallRuntime(Runtime::FunctionId fid, - int num_arguments, - int result_size); + void TailCallRuntime(Runtime::FunctionId fid); int CalculateStackPassedWords(int num_reg_arguments, int num_double_arguments); @@ -1339,13 +1331,6 @@ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT void InvokeBuiltin(int native_context_index, InvokeFlag flag, const CallWrapper& call_wrapper = NullCallWrapper()); - // Store the code object for the given builtin in the target register and - // setup the function in a1. - void GetBuiltinEntry(Register target, int native_context_index); - - // Store the function for the given builtin in the target register. - void GetBuiltinFunction(Register target, int native_context_index); - struct Unresolved { int pc; uint32_t flags; // See Bootstrapper::FixupFlags decoders/encoders. @@ -1411,14 +1396,23 @@ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT Addu(reg, reg, reg); } + void SmiTag(Register dst, Register src) { Addu(dst, src, src); } + // Test for overflow < 0: use BranchOnOverflow() or BranchOnNoOverflow(). void SmiTagCheckOverflow(Register reg, Register overflow); void SmiTagCheckOverflow(Register dst, Register src, Register overflow); - void SmiTag(Register dst, Register src) { - Addu(dst, src, src); + void BranchOnOverflow(Label* label, Register overflow_check, + BranchDelaySlot bd = PROTECT) { + Branch(label, lt, overflow_check, Operand(zero_reg), bd); } + void BranchOnNoOverflow(Label* label, Register overflow_check, + BranchDelaySlot bd = PROTECT) { + Branch(label, ge, overflow_check, Operand(zero_reg), bd); + } + + // Try to convert int32 to smi. If the value is to large, preserve // the original value and jump to not_a_smi. Destroys scratch and // sets flags. @@ -1488,6 +1482,10 @@ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT // Abort execution if argument is not a JSFunction, enabled via --debug-code. void AssertFunction(Register object); + // Abort execution if argument is not a JSBoundFunction, + // enabled via --debug-code. + void AssertBoundFunction(Register object); + // Abort execution if argument is not undefined or an AllocationSite, enabled // via --debug-code. void AssertUndefinedOrAllocationSite(Register object, Register scratch); @@ -1674,8 +1672,6 @@ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT // Helper functions for generating invokes. void InvokePrologue(const ParameterCount& expected, const ParameterCount& actual, - Handle<Code> code_constant, - Register code_reg, Label* done, bool* definitely_mismatches, InvokeFlag flag, @@ -1729,8 +1725,7 @@ class CodePatcher { DONT_FLUSH }; - CodePatcher(byte* address, - int instructions, + CodePatcher(Isolate* isolate, byte* address, int instructions, FlushICache flush_cache = FLUSH); ~CodePatcher(); |