summaryrefslogtreecommitdiff
path: root/deps/v8/src/codegen/x64/macro-assembler-x64.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/codegen/x64/macro-assembler-x64.h')
-rw-r--r--deps/v8/src/codegen/x64/macro-assembler-x64.h119
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