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/mips64/macro-assembler-mips64.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/mips64/macro-assembler-mips64.h')
-rw-r--r-- | deps/v8/src/mips64/macro-assembler-mips64.h | 254 |
1 files changed, 161 insertions, 93 deletions
diff --git a/deps/v8/src/mips64/macro-assembler-mips64.h b/deps/v8/src/mips64/macro-assembler-mips64.h index fa3808fa74..31ed8a32e1 100644 --- a/deps/v8/src/mips64/macro-assembler-mips64.h +++ b/deps/v8/src/mips64/macro-assembler-mips64.h @@ -23,6 +23,7 @@ const Register kInterpreterBytecodeOffsetRegister = {Register::kCode_t0}; const Register kInterpreterBytecodeArrayRegister = {Register::kCode_t1}; const Register kInterpreterDispatchTableRegister = {Register::kCode_t2}; const Register kJavaScriptCallArgCountRegister = {Register::kCode_a0}; +const Register kJavaScriptCallNewTargetRegister = {Register::kCode_a3}; const Register kRuntimeCallFunctionRegister = {Register::kCode_a1}; const Register kRuntimeCallArgCountRegister = {Register::kCode_a0}; @@ -104,14 +105,11 @@ 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); // ----------------------------------------------------------------------------- @@ -124,13 +122,13 @@ bool AreAliased(Register reg1, #endif -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); } @@ -168,11 +166,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 @@ -193,9 +188,9 @@ class MacroAssembler: public Assembler { Name(target, COND_ARGS, bd); \ } -#define DECLARE_BRANCH_PROTOTYPES(Name) \ +#define DECLARE_BRANCH_PROTOTYPES(Name) \ DECLARE_NORELOC_PROTOTYPE(Name, Label*) \ - DECLARE_NORELOC_PROTOTYPE(Name, int16_t) + DECLARE_NORELOC_PROTOTYPE(Name, int32_t) DECLARE_BRANCH_PROTOTYPES(Branch) DECLARE_BRANCH_PROTOTYPES(BranchAndLink) @@ -232,6 +227,8 @@ class MacroAssembler: public Assembler { Ret(cond, rs, rt, bd); } + bool IsNear(Label* L, Condition cond, int rs_reg); + void Branch(Label* L, Condition cond, Register rs, @@ -412,22 +409,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 @@ -564,12 +549,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_end, + Register scratch, Label* gc_required, AllocationFlags flags); void AllocateTwoByteString(Register result, Register length, @@ -614,6 +595,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. @@ -676,6 +663,12 @@ 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 Dlsa(Register rd, Register rs, Register rt, uint8_t sa, + Register scratch = at); void Pref(int32_t hint, const MemOperand& rs); @@ -811,15 +804,26 @@ class MacroAssembler: public Assembler { // MIPS64 R2 instruction macro. void Ins(Register rt, Register rs, uint16_t pos, uint16_t size); + void Dins(Register rt, Register rs, uint16_t pos, uint16_t size); void Ext(Register rt, Register rs, uint16_t pos, uint16_t size); void Dext(Register rt, Register rs, uint16_t pos, uint16_t size); + void Dextm(Register rt, Register rs, uint16_t pos, uint16_t size); + void Dextu(Register rt, Register rs, uint16_t pos, uint16_t size); // --------------------------------------------------------------------------- // 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); + void Cvt_d_uw(FPURegister fd, FPURegister fs); + void Cvt_d_uw(FPURegister fd, Register rs); + + // Convert unsigned long to double. + void Cvt_d_ul(FPURegister fd, FPURegister fs); + void Cvt_d_ul(FPURegister fd, Register rs); + + // Convert unsigned long to float. + void Cvt_s_ul(FPURegister fd, FPURegister fs); + void Cvt_s_ul(FPURegister fd, Register rs); // Convert double to unsigned long. void Trunc_l_ud(FPURegister fd, FPURegister fs, FPURegister scratch); @@ -833,6 +837,18 @@ class MacroAssembler: public Assembler { void Trunc_uw_d(FPURegister fd, FPURegister fs, FPURegister scratch); void Trunc_uw_d(FPURegister fd, Register rs, FPURegister scratch); + // Convert double to unsigned long. + void Trunc_ul_d(FPURegister fd, FPURegister fs, FPURegister scratch, + Register result = no_reg); + void Trunc_ul_d(FPURegister fd, Register rs, FPURegister scratch, + Register result = no_reg); + + // Convert single to unsigned long. + void Trunc_ul_s(FPURegister fd, FPURegister fs, FPURegister scratch, + Register result = no_reg); + void Trunc_ul_s(FPURegister fd, Register rs, FPURegister scratch, + Register result = no_reg); + void Trunc_w_d(FPURegister fd, FPURegister fs); void Round_w_d(FPURegister fd, FPURegister fs); void Floor_w_d(FPURegister fd, FPURegister fs); @@ -979,8 +995,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 @@ -993,7 +1016,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. @@ -1011,15 +1034,19 @@ 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); @@ -1060,9 +1087,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. @@ -1071,12 +1095,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. @@ -1256,6 +1279,24 @@ class MacroAssembler: public Assembler { const Operand& right, Register overflow_dst, Register scratch); + inline void DaddBranchOvf(Register dst, Register left, const Operand& right, + Label* overflow_label, Register scratch = at) { + DaddBranchOvf(dst, left, right, overflow_label, nullptr, scratch); + } + + inline void DaddBranchNoOvf(Register dst, Register left, const Operand& right, + Label* no_overflow_label, Register scratch = at) { + DaddBranchOvf(dst, left, right, nullptr, no_overflow_label, scratch); + } + + void DaddBranchOvf(Register dst, Register left, const Operand& right, + Label* overflow_label, Label* no_overflow_label, + Register scratch = at); + + void DaddBranchOvf(Register dst, Register left, Register right, + Label* overflow_label, Label* no_overflow_label, + Register scratch = at); + void DsubuAndCheckForOverflow(Register dst, Register left, Register right, Register overflow_dst, Register scratch = at); @@ -1263,6 +1304,24 @@ class MacroAssembler: public Assembler { const Operand& right, Register overflow_dst, Register scratch); + inline void DsubBranchOvf(Register dst, Register left, const Operand& right, + Label* overflow_label, Register scratch = at) { + DsubBranchOvf(dst, left, right, overflow_label, nullptr, scratch); + } + + inline void DsubBranchNoOvf(Register dst, Register left, const Operand& right, + Label* no_overflow_label, Register scratch = at) { + DsubBranchOvf(dst, left, right, nullptr, no_overflow_label, scratch); + } + + void DsubBranchOvf(Register dst, Register left, const Operand& right, + Label* overflow_label, Label* no_overflow_label, + Register scratch = at); + + void DsubBranchOvf(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) { @@ -1312,16 +1371,24 @@ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT void CallRuntime(const Runtime::Function* f, int num_arguments, SaveFPRegsMode save_doubles = kDontSaveFPRegs, BranchDelaySlot bd = PROTECT); - void CallRuntimeSaveDoubles(Runtime::FunctionId id) { - const Runtime::Function* function = Runtime::FunctionForId(id); + void CallRuntimeSaveDoubles(Runtime::FunctionId fid) { + const Runtime::Function* function = Runtime::FunctionForId(fid); CallRuntime(function, function->nargs, kSaveFPRegs); } // Convenience function: Same as above, but takes the fid instead. - void CallRuntime(Runtime::FunctionId id, int num_arguments, + void CallRuntime(Runtime::FunctionId fid, SaveFPRegsMode save_doubles = kDontSaveFPRegs, BranchDelaySlot bd = PROTECT) { - CallRuntime(Runtime::FunctionForId(id), num_arguments, save_doubles, bd); + 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 fid, int num_arguments, + SaveFPRegsMode save_doubles = kDontSaveFPRegs, + BranchDelaySlot bd = PROTECT) { + CallRuntime(Runtime::FunctionForId(fid), num_arguments, save_doubles, bd); } // Convenience function: call an external reference. @@ -1329,17 +1396,8 @@ 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); @@ -1395,13 +1453,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. @@ -1589,6 +1640,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); @@ -1727,16 +1782,32 @@ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT int num_reg_arguments, int num_double_arguments); - void BranchAndLinkShort(int16_t offset, BranchDelaySlot bdslot = PROTECT); - void BranchAndLinkShort(int16_t offset, Condition cond, Register rs, - const Operand& rt, - BranchDelaySlot bdslot = PROTECT); + inline Register GetRtAsRegisterHelper(const Operand& rt, Register scratch); + inline int32_t GetOffset(int32_t offset, Label* L, OffsetSize bits); + void BranchShortHelperR6(int32_t offset, Label* L); + void BranchShortHelper(int16_t offset, Label* L, BranchDelaySlot bdslot); + bool BranchShortHelperR6(int32_t offset, Label* L, Condition cond, + Register rs, const Operand& rt); + bool BranchShortHelper(int16_t offset, Label* L, Condition cond, Register rs, + const Operand& rt, BranchDelaySlot bdslot); + bool BranchShortCheck(int32_t offset, Label* L, Condition cond, Register rs, + const Operand& rt, BranchDelaySlot bdslot); + + void BranchAndLinkShortHelperR6(int32_t offset, Label* L); + void BranchAndLinkShortHelper(int16_t offset, Label* L, + BranchDelaySlot bdslot); + void BranchAndLinkShort(int32_t offset, BranchDelaySlot bdslot = PROTECT); void BranchAndLinkShort(Label* L, BranchDelaySlot bdslot = PROTECT); - void BranchAndLinkShort(Label* L, Condition cond, Register rs, - const Operand& rt, - BranchDelaySlot bdslot = PROTECT); - void J(Label* L, BranchDelaySlot bdslot); - void Jal(Label* L, BranchDelaySlot bdslot); + bool BranchAndLinkShortHelperR6(int32_t offset, Label* L, Condition cond, + Register rs, const Operand& rt); + bool BranchAndLinkShortHelper(int16_t offset, Label* L, Condition cond, + Register rs, const Operand& rt, + BranchDelaySlot bdslot); + bool BranchAndLinkShortCheck(int32_t offset, Label* L, Condition cond, + Register rs, const Operand& rt, + BranchDelaySlot bdslot); + void BranchLong(Label* L, BranchDelaySlot bdslot); + void BranchAndLinkLong(Label* L, BranchDelaySlot bdslot); void Jr(Label* L, BranchDelaySlot bdslot); void Jalr(Label* L, BranchDelaySlot bdslot); @@ -1753,8 +1824,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, @@ -1808,8 +1877,7 @@ class CodePatcher { DONT_FLUSH }; - CodePatcher(byte* address, - int instructions, + CodePatcher(Isolate* isolate, byte* address, int instructions, FlushICache flush_cache = FLUSH); ~CodePatcher(); @@ -1824,7 +1892,7 @@ class CodePatcher { // Change the condition part of an instruction leaving the rest of the current // instruction unchanged. - void ChangeBranchCondition(Condition cond); + void ChangeBranchCondition(Instr current_instr, uint32_t new_opcode); private: byte* address_; // The address of the code being patched. |