diff options
Diffstat (limited to 'deps/v8/src/codegen/x64/macro-assembler-x64.h')
-rw-r--r-- | deps/v8/src/codegen/x64/macro-assembler-x64.h | 119 |
1 files changed, 74 insertions, 45 deletions
diff --git a/deps/v8/src/codegen/x64/macro-assembler-x64.h b/deps/v8/src/codegen/x64/macro-assembler-x64.h index da5cf7dae3..c303eed9e2 100644 --- a/deps/v8/src/codegen/x64/macro-assembler-x64.h +++ b/deps/v8/src/codegen/x64/macro-assembler-x64.h @@ -123,7 +123,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public SharedTurboAssembler { void Ret(int bytes_dropped, Register scratch); // Operations on roots in the root-array. - void LoadRoot(Register destination, RootIndex index) override; + void LoadRoot(Register destination, RootIndex index) final; void LoadRoot(Operand destination, RootIndex index) { LoadRoot(kScratchRegister, index); movq(destination, kScratchRegister); @@ -251,9 +251,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public SharedTurboAssembler { void Move(Register dst, intptr_t x) { if (x == 0) { xorl(dst, dst); - } else if (is_uint8(x)) { - xorl(dst, dst); - movb(dst, Immediate(static_cast<uint32_t>(x))); + // The following shorter sequence for uint8 causes performance + // regressions: + // xorl(dst, dst); movb(dst, + // Immediate(static_cast<uint32_t>(x))); } else if (is_uint32(x)) { movl(dst, Immediate(static_cast<uint32_t>(x))); } else if (is_int32(x)) { @@ -320,10 +321,9 @@ class V8_EXPORT_PRIVATE TurboAssembler : public SharedTurboAssembler { // register. void LoadAddress(Register destination, ExternalReference source); - void LoadFromConstantsTable(Register destination, - int constant_index) override; - void LoadRootRegisterOffset(Register destination, intptr_t offset) override; - void LoadRootRelative(Register destination, int32_t offset) override; + void LoadFromConstantsTable(Register destination, int constant_index) final; + void LoadRootRegisterOffset(Register destination, intptr_t offset) final; + void LoadRootRelative(Register destination, int32_t offset) final; // Operand pointing to an external reference. // May emit code to set up the scratch register. The operand is @@ -341,42 +341,53 @@ class V8_EXPORT_PRIVATE TurboAssembler : public SharedTurboAssembler { void Call(ExternalReference ext); void Call(Label* target) { call(target); } - Operand EntryFromBuiltinIndexAsOperand(Builtins::Name builtin_index); + Operand EntryFromBuiltinAsOperand(Builtin builtin_index); Operand EntryFromBuiltinIndexAsOperand(Register builtin_index); - void CallBuiltinByIndex(Register builtin_index) override; - void CallBuiltin(Builtins::Name builtin) { - // TODO(11527): drop the int overload in favour of the Builtins::Name one. - return CallBuiltin(static_cast<int>(builtin)); - } - void CallBuiltin(int builtin_index); - void TailCallBuiltin(Builtins::Name builtin) { - // TODO(11527): drop the int overload in favour of the Builtins::Name one. - return TailCallBuiltin(static_cast<int>(builtin)); - } - void TailCallBuiltin(int builtin_index); + void CallBuiltinByIndex(Register builtin_index); + void CallBuiltin(Builtin builtin); + void TailCallBuiltin(Builtin builtin); - void LoadCodeObjectEntry(Register destination, Register code_object) override; - void CallCodeObject(Register code_object) override; + void LoadCodeObjectEntry(Register destination, Register code_object); + void CallCodeObject(Register code_object); void JumpCodeObject(Register code_object, - JumpMode jump_mode = JumpMode::kJump) override; + JumpMode jump_mode = JumpMode::kJump); + + // Load code entry point from the CodeDataContainer object. + void LoadCodeDataContainerEntry(Register destination, + Register code_data_container_object); + // Load code entry point from the CodeDataContainer object and compute + // Code object pointer out of it. Must not be used for CodeDataContainers + // corresponding to builtins, because their entry points values point to + // the embedded instruction stream in .text section. + void LoadCodeDataContainerCodeNonBuiltin(Register destination, + Register code_data_container_object); + void CallCodeDataContainerObject(Register code_data_container_object); + void JumpCodeDataContainerObject(Register code_data_container_object, + JumpMode jump_mode = JumpMode::kJump); + + // Helper functions that dispatch either to Call/JumpCodeObject or to + // Call/JumpCodeDataContainerObject. + void LoadCodeTEntry(Register destination, Register code); + void CallCodeTObject(Register code); + void JumpCodeTObject(Register code, JumpMode jump_mode = JumpMode::kJump); void RetpolineCall(Register reg); void RetpolineCall(Address destination, RelocInfo::Mode rmode); void Jump(Address destination, RelocInfo::Mode rmode); - void Jump(const ExternalReference& reference) override; + void Jump(const ExternalReference& reference); void Jump(Operand op); void Jump(Handle<Code> code_object, RelocInfo::Mode rmode, Condition cc = always); void RetpolineJump(Register reg); - void CallForDeoptimization(Builtins::Name target, int deopt_id, Label* exit, + void CallForDeoptimization(Builtin target, int deopt_id, Label* exit, DeoptimizeKind kind, Label* ret, Label* jump_deoptimization_entry_label); - void Trap() override; - void DebugBreak() override; + void Trap(); + void DebugBreak(); // Will move src1 to dst if dst != src1. void Pmaddwd(XMMRegister dst, XMMRegister src1, Operand src2); @@ -501,18 +512,29 @@ class V8_EXPORT_PRIVATE TurboAssembler : public SharedTurboAssembler { #endif } - void SaveRegisters(RegList registers); - void RestoreRegisters(RegList registers); + void MaybeSaveRegisters(RegList registers); + void MaybeRestoreRegisters(RegList registers); - void CallRecordWriteStub(Register object, Register address, - RememberedSetAction remembered_set_action, - SaveFPRegsMode fp_mode); - void CallRecordWriteStub(Register object, Register address, - RememberedSetAction remembered_set_action, - SaveFPRegsMode fp_mode, Address wasm_target); - void CallEphemeronKeyBarrier(Register object, Register address, + void CallEphemeronKeyBarrier(Register object, Register slot_address, SaveFPRegsMode fp_mode); + void CallRecordWriteStubSaveRegisters( + Register object, Register slot_address, + RememberedSetAction remembered_set_action, SaveFPRegsMode fp_mode, + StubCallMode mode = StubCallMode::kCallBuiltinPointer); + void CallRecordWriteStub( + Register object, Register slot_address, + RememberedSetAction remembered_set_action, SaveFPRegsMode fp_mode, + StubCallMode mode = StubCallMode::kCallBuiltinPointer); + +#ifdef V8_IS_TSAN + void CallTSANRelaxedStoreStub(Register address, Register value, + SaveFPRegsMode fp_mode, int size, + StubCallMode mode); + void CallTSANRelaxedLoadStub(Register address, SaveFPRegsMode fp_mode, + int size, StubCallMode mode); +#endif // V8_IS_TSAN + void MoveNumber(Register dst, double value); void MoveNonSmi(Register dst, double value); @@ -611,11 +633,6 @@ class V8_EXPORT_PRIVATE TurboAssembler : public SharedTurboAssembler { // Returns a register holding the smi value. The register MUST NOT be // modified. It may be the "smi 1 constant" register. Register GetSmiConstant(Smi value); - - void CallRecordWriteStub(Register object, Register address, - RememberedSetAction remembered_set_action, - SaveFPRegsMode fp_mode, int builtin_index, - Address wasm_target); }; // MacroAssembler implements a collection of frequently used macros. @@ -674,7 +691,7 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { // The offset is the offset from the start of the object, not the offset from // the tagged HeapObject pointer. For use with FieldOperand(reg, off). void RecordWriteField( - Register object, int offset, Register value, Register scratch, + Register object, int offset, Register value, Register slot_address, SaveFPRegsMode save_fp, RememberedSetAction remembered_set_action = RememberedSetAction::kEmit, SmiCheck smi_check = SmiCheck::kInline); @@ -685,7 +702,8 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { // operation. RecordWrite filters out smis so it does not update // the write barrier if the value is a smi. void RecordWrite( - Register object, Register address, Register value, SaveFPRegsMode save_fp, + Register object, Register slot_address, Register value, + SaveFPRegsMode save_fp, RememberedSetAction remembered_set_action = RememberedSetAction::kEmit, SmiCheck smi_check = SmiCheck::kInline); @@ -854,6 +872,9 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { void AssertSmi(Register object); void AssertSmi(Operand object); + // Abort execution if argument is not a CodeT, enabled via --debug-code. + void AssertCodeT(Register object); + // Abort execution if argument is not a Constructor, enabled via --debug-code. void AssertConstructor(Register object); @@ -921,8 +942,16 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { // --------------------------------------------------------------------------- // StatsCounter support - void IncrementCounter(StatsCounter* counter, int value); - void DecrementCounter(StatsCounter* counter, int value); + void IncrementCounter(StatsCounter* counter, int value) { + if (!FLAG_native_code_counters) return; + EmitIncrementCounter(counter, value); + } + void EmitIncrementCounter(StatsCounter* counter, int value); + void DecrementCounter(StatsCounter* counter, int value) { + if (!FLAG_native_code_counters) return; + EmitDecrementCounter(counter, value); + } + void EmitDecrementCounter(StatsCounter* counter, int value); // --------------------------------------------------------------------------- // Stack limit utilities |